diff --git a/demos/javascript/vue-component.php b/demos/javascript/vue-component.php index aaa83e5704..51302758ed 100644 --- a/demos/javascript/vue-component.php +++ b/demos/javascript/vue-component.php @@ -75,9 +75,7 @@ Header::addTo($app, ['External Component', 'subHeader' => 'Creating component using an external component definition.']); -// same as $app->requireJs('https://unpkg.com/vue-clock2@1.1.5/dist/vue-clock.min.js'); -// for Behat testing without internet access -$app->requireJs('data:application/javascript;base64,IWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoIkNsb2NrIixbXSxlKToib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0cy5DbG9jaz1lKCk6dC5DbG9jaz1lKCl9KHRoaXMsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShyKXtpZihvW3JdKXJldHVybiBvW3JdLmV4cG9ydHM7dmFyIG49b1tyXT17aTpyLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIHRbcl0uY2FsbChuLmV4cG9ydHMsbixuLmV4cG9ydHMsZSksbi5sPSEwLG4uZXhwb3J0c312YXIgbz17fTtyZXR1cm4gZS5tPXQsZS5jPW8sZS5pPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxlLmQ9ZnVuY3Rpb24odCxvLHIpe2Uubyh0LG8pfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxlLm49ZnVuY3Rpb24odCl7dmFyIG89dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIGUuZChvLCJhIixvKSxvfSxlLm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9LGUucD0iL2Rpc3QvIixlKGUucz0yKX0oW2Z1bmN0aW9uKHQsZSxvKXtvKDUpO3ZhciByPW8oOCkobygxKSxvKDkpLCJkYXRhLXYtN2UzZjcxMjYiLG51bGwpO3QuZXhwb3J0cz1yLmV4cG9ydHN9LGZ1bmN0aW9uKHQsZSxvKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD17ZGF0YTpmdW5jdGlvbigpe3JldHVybnt0aW1lTGlzdDpbMTIsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTFdLHRyYW5zZm9ybToic2NhbGUoMSkiLGhvdXJSb3RhdGU6InJvdGF0ZXooMGRlZykiLG1pbnV0ZVJvdGF0ZToicm90YXRleigwZGVnKSIsc2Vjb25kUm90YXRlOiJyb3RhdGV6KDBkZWcpIn19LHByb3BzOlsidGltZSIsImNvbG9yIiwiYm9yZGVyIiwiYmciLCJzaXplIl0sY29tcHV0ZWQ6e2Nsb2NrU3R5bGU6ZnVuY3Rpb24oKXtyZXR1cm57aGVpZ2h0OnRoaXMuc2l6ZSx3aWR0aDp0aGlzLnNpemUsY29sb3I6dGhpcy5jb2xvcixib3JkZXI6dGhpcy5ib3JkZXIsYmFja2dyb3VuZDp0aGlzLmJnfX19LHdhdGNoOnt0aW1lOmZ1bmN0aW9uKCl7dGhpcy5zaG93KCl9fSxtZXRob2RzOntzaG93OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLnNob3dUaW1lKCksdGhpcy5fdGltZXImJmNsZWFySW50ZXJ2YWwodGhpcy5fdGltZXIpLHRoaXMudGltZXx8KHRoaXMuX3RpbWVyPXNldEludGVydmFsKGZ1bmN0aW9uKCl7dC5zaG93VGltZSgpfSwxZTMpKX0sc2hvd1RpbWU6ZnVuY3Rpb24oKXt2YXIgdD12b2lkIDA7aWYodGhpcy50aW1lKXQ9dGhpcy50aW1lLnNwbGl0KCI6Iik7ZWxzZXt2YXIgZT1uZXcgRGF0ZTt0PVtlLmdldEhvdXJzKCksZS5nZXRNaW51dGVzKCksZS5nZXRTZWNvbmRzKCldfXZhciBvPSt0WzBdO289bz4xMT9vLTEyOm87dmFyIHI9K3RbMV0sbj0rdFsyXXx8MCxhPTMwKm8rNipyLzM2MCozMCxpPTYqcixzPTYqbjt0aGlzLmhvdXJSb3RhdGU9InJvdGF0ZXooIithKyJkZWcpIix0aGlzLm1pbnV0ZVJvdGF0ZT0icm90YXRleigiK2krImRlZykiLHRoaXMuc2Vjb25kUm90YXRlPSJyb3RhdGV6KCIrcysiZGVnKSJ9fSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy4kZWwuY2xpZW50V2lkdGgvMTIwO3Q9dD4zPzM6dCx0aGlzLnRyYW5zZm9ybT0ic2NhbGUoIit0KyIpIix0aGlzLnNob3coKX0sZGVzdHJveWVkOmZ1bmN0aW9uKCl7dGhpcy5fdGltZXImJmNsZWFySW50ZXJ2YWwodGhpcy5fdGltZXIpfX19LGZ1bmN0aW9uKHQsZSxvKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPW8oMCksbj1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KHIpO2UuZGVmYXVsdD1uLmRlZmF1bHQsInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5WdWUmJndpbmRvdy5WdWUuY29tcG9uZW50KCJjbG9jayIsbi5kZWZhdWx0KX0sZnVuY3Rpb24odCxlLG8pe2U9dC5leHBvcnRzPW8oNCkoKSxlLnB1c2goW3QuaSwnLmNsb2NrW2RhdGEtdi03ZTNmNzEyNl17cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlO3dpZHRoOjE1MHB4O2hlaWdodDoxNTBweDtib3JkZXI6MnB4IHNvbGlkO2JvcmRlci1yYWRpdXM6MTAwJTt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MTRweH0uY2xvY2sgLmhvdXJbZGF0YS12LTdlM2Y3MTI2XXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjUwJTtkaXNwbGF5OmJsb2NrO3dpZHRoOjIwcHg7aGVpZ2h0OjUwJTttYXJnaW4tbGVmdDotMTBweDtwYWRkaW5nLXRvcDo0JTtmb250LXdlaWdodDo0MDA7dHJhbnNmb3JtLW9yaWdpbjpib3R0b207dXNlci1zZWxlY3Q6bm9uZTtib3gtc2l6aW5nOmJvcmRlci1ib3h9LmNsb2NrIC5ob3VyPnNwYW5bZGF0YS12LTdlM2Y3MTI2XXtkaXNwbGF5OmJsb2NrfS5jbG9jayAuaG91cj5zcGFuPmlbZGF0YS12LTdlM2Y3MTI2XXtkaXNwbGF5OmJsb2NrO2ZvbnQtc3R5bGU6bm9ybWFsfS5jbG9jayAuaG91cltkYXRhLXYtN2UzZjcxMjZdOm50aC1vZi10eXBlKDIpe3RyYW5zZm9ybTpyb3RhdGV6KDMwZGVnKX0uY2xvY2sgLmhvdXI6bnRoLW9mLXR5cGUoMik+c3BhbltkYXRhLXYtN2UzZjcxMjZde3RyYW5zZm9ybTpyb3RhdGV6KC0zMGRlZyl9LmNsb2NrIC5ob3VyW2RhdGEtdi03ZTNmNzEyNl06bnRoLW9mLXR5cGUoMyl7dHJhbnNmb3JtOnJvdGF0ZXooNjBkZWcpfS5jbG9jayAuaG91cjpudGgtb2YtdHlwZSgzKT5zcGFuW2RhdGEtdi03ZTNmNzEyNl17dHJhbnNmb3JtOnJvdGF0ZXooLTYwZGVnKX0uY2xvY2sgLmhvdXJbZGF0YS12LTdlM2Y3MTI2XTpudGgtb2YtdHlwZSg0KXt0cmFuc2Zvcm06cm90YXRleig5MGRlZyl9LmNsb2NrIC5ob3VyOm50aC1vZi10eXBlKDQpPnNwYW5bZGF0YS12LTdlM2Y3MTI2XXt0cmFuc2Zvcm06cm90YXRleigtOTBkZWcpfS5jbG9jayAuaG91cltkYXRhLXYtN2UzZjcxMjZdOm50aC1vZi10eXBlKDUpe3RyYW5zZm9ybTpyb3RhdGV6KDEyMGRlZyl9LmNsb2NrIC5ob3VyOm50aC1vZi10eXBlKDUpPnNwYW5bZGF0YS12LTdlM2Y3MTI2XXt0cmFuc2Zvcm06cm90YXRleigtMTIwZGVnKX0uY2xvY2sgLmhvdXJbZGF0YS12LTdlM2Y3MTI2XTpudGgtb2YtdHlwZSg2KXt0cmFuc2Zvcm06cm90YXRleigxNTBkZWcpfS5jbG9jayAuaG91cjpudGgtb2YtdHlwZSg2KT5zcGFuW2RhdGEtdi03ZTNmNzEyNl17dHJhbnNmb3JtOnJvdGF0ZXooLTE1MGRlZyl9LmNsb2NrIC5ob3VyW2RhdGEtdi03ZTNmNzEyNl06bnRoLW9mLXR5cGUoNyl7dHJhbnNmb3JtOnJvdGF0ZXooMTgwZGVnKX0uY2xvY2sgLmhvdXI6bnRoLW9mLXR5cGUoNyk+c3BhbltkYXRhLXYtN2UzZjcxMjZde3RyYW5zZm9ybTpyb3RhdGV6KC0xODBkZWcpfS5jbG9jayAuaG91cltkYXRhLXYtN2UzZjcxMjZdOm50aC1vZi10eXBlKDgpe3RyYW5zZm9ybTpyb3RhdGV6KDIxMGRlZyl9LmNsb2NrIC5ob3VyOm50aC1vZi10eXBlKDgpPnNwYW5bZGF0YS12LTdlM2Y3MTI2XXt0cmFuc2Zvcm06cm90YXRleigtMjEwZGVnKX0uY2xvY2sgLmhvdXJbZGF0YS12LTdlM2Y3MTI2XTpudGgtb2YtdHlwZSg5KXt0cmFuc2Zvcm06cm90YXRleigyNDBkZWcpfS5jbG9jayAuaG91cjpudGgtb2YtdHlwZSg5KT5zcGFuW2RhdGEtdi03ZTNmNzEyNl17dHJhbnNmb3JtOnJvdGF0ZXooLTI0MGRlZyl9LmNsb2NrIC5ob3VyW2RhdGEtdi03ZTNmNzEyNl06bnRoLW9mLXR5cGUoMTApe3RyYW5zZm9ybTpyb3RhdGV6KDI3MGRlZyl9LmNsb2NrIC5ob3VyOm50aC1vZi10eXBlKDEwKT5zcGFuW2RhdGEtdi03ZTNmNzEyNl17dHJhbnNmb3JtOnJvdGF0ZXooLTI3MGRlZyl9LmNsb2NrIC5ob3VyW2RhdGEtdi03ZTNmNzEyNl06bnRoLW9mLXR5cGUoMTEpe3RyYW5zZm9ybTpyb3RhdGV6KDMwMGRlZyl9LmNsb2NrIC5ob3VyOm50aC1vZi10eXBlKDExKT5zcGFuW2RhdGEtdi03ZTNmNzEyNl17dHJhbnNmb3JtOnJvdGF0ZXooLTMwMGRlZyl9LmNsb2NrIC5ob3VyW2RhdGEtdi03ZTNmNzEyNl06bnRoLW9mLXR5cGUoMTIpe3RyYW5zZm9ybTpyb3RhdGV6KDMzMGRlZyl9LmNsb2NrIC5ob3VyOm50aC1vZi10eXBlKDEyKT5zcGFuW2RhdGEtdi03ZTNmNzEyNl17dHJhbnNmb3JtOnJvdGF0ZXooLTMzMGRlZyl9LmNsb2NrIC5jbG9jay1jaXJjbGVbZGF0YS12LTdlM2Y3MTI2XXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO2xlZnQ6NTAlO3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpO2JvcmRlcjoycHggc29saWQgIzY2Njtib3JkZXItcmFkaXVzOjEwMCU7YmFja2dyb3VuZC1jb2xvcjojZmZmO3otaW5kZXg6MTtib3gtc2l6aW5nOmJvcmRlci1ib3h9LmNsb2NrIC5jbG9jay1jaXJjbGVbZGF0YS12LTdlM2Y3MTI2XTpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsLTUwJSk7ZGlzcGxheTpibG9jaztjb250ZW50OiIiO3dpZHRoOjRweDtoZWlnaHQ6NHB4O2JvcmRlci1yYWRpdXM6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOiM2NjZ9LmNsb2NrIC5jbG9jay1ob3VyW2RhdGEtdi03ZTNmNzEyNl0sLmNsb2NrIC5jbG9jay1taW51dGVbZGF0YS12LTdlM2Y3MTI2XSwuY2xvY2sgLmNsb2NrLXNlY29uZFtkYXRhLXYtN2UzZjcxMjZde3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxNSU7bGVmdDo1MCU7ZGlzcGxheTpibG9jazt3aWR0aDoycHg7aGVpZ2h0OjM1JTttYXJnaW4tbGVmdDotMXB4O2JvcmRlci1yYWRpdXM6NXB4O3RyYW5zZm9ybS1vcmlnaW46Ym90dG9tO2JhY2tncm91bmQtY29sb3I6IzY2Nn0uY2xvY2sgLmNsb2NrLWhvdXJbZGF0YS12LTdlM2Y3MTI2XXt0b3A6MzAlO3dpZHRoOjRweDtoZWlnaHQ6MjAlO21hcmdpbi1sZWZ0Oi0ycHh9LmNsb2NrIC5jbG9jay1zZWNvbmRbZGF0YS12LTdlM2Y3MTI2XXt3aWR0aDoxcHh9LmNsb2NrLmlzLXNtYWxsW2RhdGEtdi03ZTNmNzEyNl17d2lkdGg6ODBweDtoZWlnaHQ6ODBweDtib3JkZXItd2lkdGg6MXB4O2ZvbnQtc2l6ZToxMnB4fS5jbG9jay5pcy1zbWFsbCAuY2xvY2stY2lyY2xlW2RhdGEtdi03ZTNmNzEyNl17d2lkdGg6MTBweDtoZWlnaHQ6MTBweDtib3JkZXItd2lkdGg6MXB4fS5jbG9jay5pcy1zbWFsbCAuY2xvY2stY2lyY2xlW2RhdGEtdi03ZTNmNzEyNl06YmVmb3Jle3dpZHRoOjJweDtoZWlnaHQ6MnB4fScsIiJdKX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdC50b1N0cmluZz1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTx0aGlzLmxlbmd0aDtlKyspe3ZhciBvPXRoaXNbZV07b1syXT90LnB1c2goIkBtZWRpYSAiK29bMl0rInsiK29bMV0rIn0iKTp0LnB1c2gob1sxXSl9cmV0dXJuIHQuam9pbigiIil9LHQuaT1mdW5jdGlvbihlLG8peyJzdHJpbmciPT10eXBlb2YgZSYmKGU9W1tudWxsLGUsIiJdXSk7Zm9yKHZhciByPXt9LG49MDtuPHRoaXMubGVuZ3RoO24rKyl7dmFyIGE9dGhpc1tuXVswXTsibnVtYmVyIj09dHlwZW9mIGEmJihyW2FdPSEwKX1mb3Iobj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaT1lW25dOyJudW1iZXIiPT10eXBlb2YgaVswXSYmcltpWzBdXXx8KG8mJiFpWzJdP2lbMl09bzpvJiYoaVsyXT0iKCIraVsyXSsiKSBhbmQgKCIrbysiKSIpLHQucHVzaChpKSl9fSx0fX0sZnVuY3Rpb24odCxlLG8pe3ZhciByPW8oMyk7InN0cmluZyI9PXR5cGVvZiByJiYocj1bW3QuaSxyLCIiXV0pO3ZhciBuPXtobXI6ITB9O24udHJhbnNmb3JtPXZvaWQgMCxuLmluc2VydEludG89dm9pZCAwO28oNikocixuKTtyLmxvY2FscyYmKHQuZXhwb3J0cz1yLmxvY2Fscyl9LGZ1bmN0aW9uKHQsZSxvKXtmdW5jdGlvbiByKHQsZSl7Zm9yKHZhciBvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciByPXRbb10sbj12W3IuaWRdO2lmKG4pe24ucmVmcysrO2Zvcih2YXIgYT0wO2E8bi5wYXJ0cy5sZW5ndGg7YSsrKW4ucGFydHNbYV0oci5wYXJ0c1thXSk7Zm9yKDthPHIucGFydHMubGVuZ3RoO2ErKyluLnBhcnRzLnB1c2godShyLnBhcnRzW2FdLGUpKX1lbHNle2Zvcih2YXIgaT1bXSxhPTA7YTxyLnBhcnRzLmxlbmd0aDthKyspaS5wdXNoKHUoci5wYXJ0c1thXSxlKSk7dltyLmlkXT17aWQ6ci5pZCxyZWZzOjEscGFydHM6aX19fX1mdW5jdGlvbiBuKHQsZSl7Zm9yKHZhciBvPVtdLHI9e30sbj0wO248dC5sZW5ndGg7bisrKXt2YXIgYT10W25dLGk9ZS5iYXNlP2FbMF0rZS5iYXNlOmFbMF0scz1hWzFdLGM9YVsyXSxmPWFbM10sbD17Y3NzOnMsbWVkaWE6Yyxzb3VyY2VNYXA6Zn07cltpXT9yW2ldLnBhcnRzLnB1c2gobCk6by5wdXNoKHJbaV09e2lkOmkscGFydHM6W2xdfSl9cmV0dXJuIG99ZnVuY3Rpb24gYSh0LGUpe3ZhciBvPXkodC5pbnNlcnRJbnRvKTtpZighbyl0aHJvdyBuZXcgRXJyb3IoIkNvdWxkbid0IGZpbmQgYSBzdHlsZSB0YXJnZXQuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSAnaW5zZXJ0SW50bycgcGFyYW1ldGVyIGlzIGludmFsaWQuIik7dmFyIHI9eFt4Lmxlbmd0aC0xXTtpZigidG9wIj09PXQuaW5zZXJ0QXQpcj9yLm5leHRTaWJsaW5nP28uaW5zZXJ0QmVmb3JlKGUsci5uZXh0U2libGluZyk6by5hcHBlbmRDaGlsZChlKTpvLmluc2VydEJlZm9yZShlLG8uZmlyc3RDaGlsZCkseC5wdXNoKGUpO2Vsc2UgaWYoImJvdHRvbSI9PT10Lmluc2VydEF0KW8uYXBwZW5kQ2hpbGQoZSk7ZWxzZXtpZigib2JqZWN0IiE9dHlwZW9mIHQuaW5zZXJ0QXR8fCF0Lmluc2VydEF0LmJlZm9yZSl0aHJvdyBuZXcgRXJyb3IoIltTdHlsZSBMb2FkZXJdXG5cbiBJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgJ2luc2VydEF0JyAoJ29wdGlvbnMuaW5zZXJ0QXQnKSBmb3VuZC5cbiBNdXN0IGJlICd0b3AnLCAnYm90dG9tJywgb3IgT2JqZWN0LlxuIChodHRwczovL2dpdGh1Yi5jb20vd2VicGFjay1jb250cmliL3N0eWxlLWxvYWRlciNpbnNlcnRhdClcbiIpO3ZhciBuPXkodC5pbnNlcnRBdC5iZWZvcmUsbyk7by5pbnNlcnRCZWZvcmUoZSxuKX19ZnVuY3Rpb24gaSh0KXtpZihudWxsPT09dC5wYXJlbnROb2RlKXJldHVybiExO3QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KTt2YXIgZT14LmluZGV4T2YodCk7ZT49MCYmeC5zcGxpY2UoZSwxKX1mdW5jdGlvbiBzKHQpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7aWYodm9pZCAwPT09dC5hdHRycy50eXBlJiYodC5hdHRycy50eXBlPSJ0ZXh0L2NzcyIpLHZvaWQgMD09PXQuYXR0cnMubm9uY2Upe3ZhciBvPWwoKTtvJiYodC5hdHRycy5ub25jZT1vKX1yZXR1cm4gZihlLHQuYXR0cnMpLGEodCxlKSxlfWZ1bmN0aW9uIGModCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpO3JldHVybiB2b2lkIDA9PT10LmF0dHJzLnR5cGUmJih0LmF0dHJzLnR5cGU9InRleHQvY3NzIiksdC5hdHRycy5yZWw9InN0eWxlc2hlZXQiLGYoZSx0LmF0dHJzKSxhKHQsZSksZX1mdW5jdGlvbiBmKHQsZSl7T2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbihvKXt0LnNldEF0dHJpYnV0ZShvLGVbb10pfSl9ZnVuY3Rpb24gbCgpe3JldHVybiBvLm5jfWZ1bmN0aW9uIHUodCxlKXt2YXIgbyxyLG4sYTtpZihlLnRyYW5zZm9ybSYmdC5jc3Mpe2lmKCEoYT0iZnVuY3Rpb24iPT10eXBlb2YgZS50cmFuc2Zvcm0/ZS50cmFuc2Zvcm0odC5jc3MpOmUudHJhbnNmb3JtLmRlZmF1bHQodC5jc3MpKSlyZXR1cm4gZnVuY3Rpb24oKXt9O3QuY3NzPWF9aWYoZS5zaW5nbGV0b24pe3ZhciBmPWsrKztvPWd8fChnPXMoZSkpLHI9ZC5iaW5kKG51bGwsbyxmLCExKSxuPWQuYmluZChudWxsLG8sZiwhMCl9ZWxzZSB0LnNvdXJjZU1hcCYmImZ1bmN0aW9uIj09dHlwZW9mIFVSTCYmImZ1bmN0aW9uIj09dHlwZW9mIFVSTC5jcmVhdGVPYmplY3RVUkwmJiJmdW5jdGlvbiI9PXR5cGVvZiBVUkwucmV2b2tlT2JqZWN0VVJMJiYiZnVuY3Rpb24iPT10eXBlb2YgQmxvYiYmImZ1bmN0aW9uIj09dHlwZW9mIGJ0b2E/KG89YyhlKSxyPWguYmluZChudWxsLG8sZSksbj1mdW5jdGlvbigpe2kobyksby5ocmVmJiZVUkwucmV2b2tlT2JqZWN0VVJMKG8uaHJlZil9KToobz1zKGUpLHI9cC5iaW5kKG51bGwsbyksbj1mdW5jdGlvbigpe2kobyl9KTtyZXR1cm4gcih0KSxmdW5jdGlvbihlKXtpZihlKXtpZihlLmNzcz09PXQuY3NzJiZlLm1lZGlhPT09dC5tZWRpYSYmZS5zb3VyY2VNYXA9PT10LnNvdXJjZU1hcClyZXR1cm47cih0PWUpfWVsc2UgbigpfX1mdW5jdGlvbiBkKHQsZSxvLHIpe3ZhciBuPW8/IiI6ci5jc3M7aWYodC5zdHlsZVNoZWV0KXQuc3R5bGVTaGVldC5jc3NUZXh0PXooZSxuKTtlbHNle3ZhciBhPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG4pLGk9dC5jaGlsZE5vZGVzO2lbZV0mJnQucmVtb3ZlQ2hpbGQoaVtlXSksaS5sZW5ndGg/dC5pbnNlcnRCZWZvcmUoYSxpW2VdKTp0LmFwcGVuZENoaWxkKGEpfX1mdW5jdGlvbiBwKHQsZSl7dmFyIG89ZS5jc3Mscj1lLm1lZGlhO2lmKHImJnQuc2V0QXR0cmlidXRlKCJtZWRpYSIsciksdC5zdHlsZVNoZWV0KXQuc3R5bGVTaGVldC5jc3NUZXh0PW87ZWxzZXtmb3IoO3QuZmlyc3RDaGlsZDspdC5yZW1vdmVDaGlsZCh0LmZpcnN0Q2hpbGQpO3QuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobykpfX1mdW5jdGlvbiBoKHQsZSxvKXt2YXIgcj1vLmNzcyxuPW8uc291cmNlTWFwLGE9dm9pZCAwPT09ZS5jb252ZXJ0VG9BYnNvbHV0ZVVybHMmJm47KGUuY29udmVydFRvQWJzb2x1dGVVcmxzfHxhKSYmKHI9dyhyKSksbiYmKHIrPSJcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsIitidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShuKSkpKSsiICovIik7dmFyIGk9bmV3IEJsb2IoW3JdLHt0eXBlOiJ0ZXh0L2NzcyJ9KSxzPXQuaHJlZjt0LmhyZWY9VVJMLmNyZWF0ZU9iamVjdFVSTChpKSxzJiZVUkwucmV2b2tlT2JqZWN0VVJMKHMpfXZhciB2PXt9LG09ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxlfX0oZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93JiZkb2N1bWVudCYmZG9jdW1lbnQuYWxsJiYhd2luZG93LmF0b2J9KSxiPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU/ZS5xdWVyeVNlbGVjdG9yKHQpOmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCl9LHk9ZnVuY3Rpb24odCl7dmFyIGU9e307cmV0dXJuIGZ1bmN0aW9uKHQsbyl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQpcmV0dXJuIHQoKTtpZih2b2lkIDA9PT1lW3RdKXt2YXIgcj1iLmNhbGwodGhpcyx0LG8pO2lmKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCYmciBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCl0cnl7cj1yLmNvbnRlbnREb2N1bWVudC5oZWFkfWNhdGNoKHQpe3I9bnVsbH1lW3RdPXJ9cmV0dXJuIGVbdF19fSgpLGc9bnVsbCxrPTAseD1bXSx3PW8oNyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBERUJVRyYmREVCVUcmJiJvYmplY3QiIT10eXBlb2YgZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJUaGUgc3R5bGUtbG9hZGVyIGNhbm5vdCBiZSB1c2VkIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnQiKTtlPWV8fHt9LGUuYXR0cnM9Im9iamVjdCI9PXR5cGVvZiBlLmF0dHJzP2UuYXR0cnM6e30sZS5zaW5nbGV0b258fCJib29sZWFuIj09dHlwZW9mIGUuc2luZ2xldG9ufHwoZS5zaW5nbGV0b249bSgpKSxlLmluc2VydEludG98fChlLmluc2VydEludG89ImhlYWQiKSxlLmluc2VydEF0fHwoZS5pbnNlcnRBdD0iYm90dG9tIik7dmFyIG89bih0LGUpO3JldHVybiByKG8sZSksZnVuY3Rpb24odCl7Zm9yKHZhciBhPVtdLGk9MDtpPG8ubGVuZ3RoO2krKyl7dmFyIHM9b1tpXSxjPXZbcy5pZF07Yy5yZWZzLS0sYS5wdXNoKGMpfWlmKHQpe3Iobih0LGUpLGUpfWZvcih2YXIgaT0wO2k8YS5sZW5ndGg7aSsrKXt2YXIgYz1hW2ldO2lmKDA9PT1jLnJlZnMpe2Zvcih2YXIgZj0wO2Y8Yy5wYXJ0cy5sZW5ndGg7ZisrKWMucGFydHNbZl0oKTtkZWxldGUgdltjLmlkXX19fX07dmFyIHo9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gZnVuY3Rpb24oZSxvKXtyZXR1cm4gdFtlXT1vLHQuZmlsdGVyKEJvb2xlYW4pLmpvaW4oIlxuIil9fSgpfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93LmxvY2F0aW9uO2lmKCFlKXRocm93IG5ldyBFcnJvcigiZml4VXJscyByZXF1aXJlcyB3aW5kb3cubG9jYXRpb24iKTtpZighdHx8InN0cmluZyIhPXR5cGVvZiB0KXJldHVybiB0O3ZhciBvPWUucHJvdG9jb2wrIi8vIitlLmhvc3Qscj1vK2UucGF0aG5hbWUucmVwbGFjZSgvXC9bXlwvXSokLywiLyIpO3JldHVybiB0LnJlcGxhY2UoL3VybFxzKlwoKCg/OlteKShdfFwoKD86W14pKF0rfFwoW14pKF0qXCkpKlwpKSopXCkvZ2ksZnVuY3Rpb24odCxlKXt2YXIgbj1lLnRyaW0oKS5yZXBsYWNlKC9eIiguKikiJC8sZnVuY3Rpb24odCxlKXtyZXR1cm4gZX0pLnJlcGxhY2UoL14nKC4qKSckLyxmdW5jdGlvbih0LGUpe3JldHVybiBlfSk7aWYoL14oI3xkYXRhOnxodHRwOlwvXC98aHR0cHM6XC9cL3xmaWxlOlwvXC9cL3xccyokKS9pLnRlc3QobikpcmV0dXJuIHQ7dmFyIGE7cmV0dXJuIGE9MD09PW4uaW5kZXhPZigiLy8iKT9uOjA9PT1uLmluZGV4T2YoIi8iKT9vK246cituLnJlcGxhY2UoL15cLlwvLywiIiksInVybCgiK0pTT04uc3RyaW5naWZ5KGEpKyIpIn0pfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG8scil7dmFyIG4sYT10PXR8fHt9LGk9dHlwZW9mIHQuZGVmYXVsdDsib2JqZWN0IiE9PWkmJiJmdW5jdGlvbiIhPT1pfHwobj10LGE9dC5kZWZhdWx0KTt2YXIgcz0iZnVuY3Rpb24iPT10eXBlb2YgYT9hLm9wdGlvbnM6YTtpZihlJiYocy5yZW5kZXI9ZS5yZW5kZXIscy5zdGF0aWNSZW5kZXJGbnM9ZS5zdGF0aWNSZW5kZXJGbnMpLG8mJihzLl9zY29wZUlkPW8pLHIpe3ZhciBjPU9iamVjdC5jcmVhdGUocy5jb21wdXRlZHx8bnVsbCk7T2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT1yW3RdO2NbdF09ZnVuY3Rpb24oKXtyZXR1cm4gZX19KSxzLmNvbXB1dGVkPWN9cmV0dXJue2VzTW9kdWxlOm4sZXhwb3J0czphLG9wdGlvbnM6c319fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXQuJGNyZWF0ZUVsZW1lbnQsbz10Ll9zZWxmLl9jfHxlO3JldHVybiBvKCJkaXYiLHtzdGF0aWNDbGFzczoiY2xvY2siLHN0eWxlOnQuY2xvY2tTdHlsZX0sW28oImRpdiIse3N0YXRpY0NsYXNzOiJjbG9jay1jaXJjbGUifSksdC5fdigiICIpLG8oImRpdiIse3N0YXRpY0NsYXNzOiJjbG9jay1ob3VyIixzdHlsZTp7dHJhbnNmb3JtOnQuaG91clJvdGF0ZX19KSx0Ll92KCIgIiksbygiZGl2Iix7c3RhdGljQ2xhc3M6ImNsb2NrLW1pbnV0ZSIsc3R5bGU6e3RyYW5zZm9ybTp0Lm1pbnV0ZVJvdGF0ZX19KSx0Ll92KCIgIiksbygiZGl2Iix7c3RhdGljQ2xhc3M6ImNsb2NrLXNlY29uZCIsc3R5bGU6e3RyYW5zZm9ybTp0LnNlY29uZFJvdGF0ZX19KSx0Ll92KCIgIiksdC5fbCh0LnRpbWVMaXN0LGZ1bmN0aW9uKGUpe3JldHVybiBvKCJiIix7a2V5OmUsc3RhdGljQ2xhc3M6ImhvdXIifSxbbygic3BhbiIsW28oImkiLHtzdHlsZTp7dHJhbnNmb3JtOnQudHJhbnNmb3JtfX0sW3QuX3YodC5fcyhlKSldKV0pXSl9KV0sMil9LHN0YXRpY1JlbmRlckZuczpbXX19XSl9KTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9dnVlLWNsb2NrLm1pbi5qcy5tYXA='); +$app->requireJs($app->cdn['atk'] . '/external/vue-clock2/dist/vue-clock.min.js'); // Injecting template but normally you would create a template file. $clock_template = new HtmlTemplate(<<<'EOF' diff --git a/public/external/.gitignore b/public/external/.gitignore index c3f9c188cd..77f1843583 100644 --- a/public/external/.gitignore +++ b/public/external/.gitignore @@ -1,8 +1,23 @@ /* !/.gitignore +!/package.json +!/package-lock.json +!/postinstall.js !/*/ /*/* +!/@shopify/draggable/ +/@shopify/draggable/* +!/@shopify/draggable/LICENS* +!/@shopify/draggable/lib/ +/@shopify/draggable/lib/* +!/@shopify/draggable/lib/*.bundle.js + +!/chart.js/LICENS* +!/chart.js/dist/ +/chart.js/dist/* +!/chart.js/dist/*.min.js + !/flatpickr/LICENS* !/flatpickr/dist/ /flatpickr/dist/* @@ -52,264 +67,16 @@ /twemoji/assets/svg/* # bundle country flags only and wait until https://github.com/fomantic/Fomantic-UI/issues/2363 # is implemented or pack all svg images in one phar -!/twemoji/assets/svg/1f1e6-1f1e8.svg -!/twemoji/assets/svg/1f1e6-1f1e9.svg -!/twemoji/assets/svg/1f1e6-1f1ea.svg -!/twemoji/assets/svg/1f1e6-1f1eb.svg -!/twemoji/assets/svg/1f1e6-1f1ec.svg -!/twemoji/assets/svg/1f1e6-1f1ee.svg -!/twemoji/assets/svg/1f1e6-1f1f1.svg -!/twemoji/assets/svg/1f1e6-1f1f2.svg -!/twemoji/assets/svg/1f1e6-1f1f4.svg -!/twemoji/assets/svg/1f1e6-1f1f6.svg -!/twemoji/assets/svg/1f1e6-1f1f7.svg -!/twemoji/assets/svg/1f1e6-1f1f8.svg -!/twemoji/assets/svg/1f1e6-1f1f9.svg -!/twemoji/assets/svg/1f1e6-1f1fa.svg -!/twemoji/assets/svg/1f1e6-1f1fc.svg -!/twemoji/assets/svg/1f1e6-1f1fd.svg -!/twemoji/assets/svg/1f1e6-1f1ff.svg -!/twemoji/assets/svg/1f1e7-1f1e6.svg -!/twemoji/assets/svg/1f1e7-1f1e7.svg -!/twemoji/assets/svg/1f1e7-1f1e9.svg -!/twemoji/assets/svg/1f1e7-1f1ea.svg -!/twemoji/assets/svg/1f1e7-1f1eb.svg -!/twemoji/assets/svg/1f1e7-1f1ec.svg -!/twemoji/assets/svg/1f1e7-1f1ed.svg -!/twemoji/assets/svg/1f1e7-1f1ee.svg -!/twemoji/assets/svg/1f1e7-1f1ef.svg -!/twemoji/assets/svg/1f1e7-1f1f1.svg -!/twemoji/assets/svg/1f1e7-1f1f2.svg -!/twemoji/assets/svg/1f1e7-1f1f3.svg -!/twemoji/assets/svg/1f1e7-1f1f4.svg -!/twemoji/assets/svg/1f1e7-1f1f6.svg -!/twemoji/assets/svg/1f1e7-1f1f7.svg -!/twemoji/assets/svg/1f1e7-1f1f8.svg -!/twemoji/assets/svg/1f1e7-1f1f9.svg -!/twemoji/assets/svg/1f1e7-1f1fb.svg -!/twemoji/assets/svg/1f1e7-1f1fc.svg -!/twemoji/assets/svg/1f1e7-1f1fe.svg -!/twemoji/assets/svg/1f1e7-1f1ff.svg -!/twemoji/assets/svg/1f1e8-1f1e6.svg -!/twemoji/assets/svg/1f1e8-1f1e8.svg -!/twemoji/assets/svg/1f1e8-1f1e9.svg -!/twemoji/assets/svg/1f1e8-1f1eb.svg -!/twemoji/assets/svg/1f1e8-1f1ec.svg -!/twemoji/assets/svg/1f1e8-1f1ed.svg -!/twemoji/assets/svg/1f1e8-1f1ee.svg -!/twemoji/assets/svg/1f1e8-1f1f0.svg -!/twemoji/assets/svg/1f1e8-1f1f1.svg -!/twemoji/assets/svg/1f1e8-1f1f2.svg -!/twemoji/assets/svg/1f1e8-1f1f3.svg -!/twemoji/assets/svg/1f1e8-1f1f4.svg -!/twemoji/assets/svg/1f1e8-1f1f5.svg -!/twemoji/assets/svg/1f1e8-1f1f7.svg -!/twemoji/assets/svg/1f1e8-1f1fa.svg -!/twemoji/assets/svg/1f1e8-1f1fb.svg -!/twemoji/assets/svg/1f1e8-1f1fc.svg -!/twemoji/assets/svg/1f1e8-1f1fd.svg -!/twemoji/assets/svg/1f1e8-1f1fe.svg -!/twemoji/assets/svg/1f1e8-1f1ff.svg -!/twemoji/assets/svg/1f1e9-1f1ea.svg -!/twemoji/assets/svg/1f1e9-1f1ec.svg -!/twemoji/assets/svg/1f1e9-1f1ef.svg -!/twemoji/assets/svg/1f1e9-1f1f0.svg -!/twemoji/assets/svg/1f1e9-1f1f2.svg -!/twemoji/assets/svg/1f1e9-1f1f4.svg -!/twemoji/assets/svg/1f1e9-1f1ff.svg -!/twemoji/assets/svg/1f1ea-1f1e6.svg -!/twemoji/assets/svg/1f1ea-1f1e8.svg -!/twemoji/assets/svg/1f1ea-1f1ea.svg -!/twemoji/assets/svg/1f1ea-1f1ec.svg -!/twemoji/assets/svg/1f1ea-1f1ed.svg -!/twemoji/assets/svg/1f1ea-1f1f7.svg -!/twemoji/assets/svg/1f1ea-1f1f8.svg -!/twemoji/assets/svg/1f1ea-1f1f9.svg -!/twemoji/assets/svg/1f1ea-1f1fa.svg -!/twemoji/assets/svg/1f1eb-1f1ee.svg -!/twemoji/assets/svg/1f1eb-1f1ef.svg -!/twemoji/assets/svg/1f1eb-1f1f0.svg -!/twemoji/assets/svg/1f1eb-1f1f2.svg -!/twemoji/assets/svg/1f1eb-1f1f4.svg -!/twemoji/assets/svg/1f1eb-1f1f7.svg -!/twemoji/assets/svg/1f1ec-1f1e6.svg -!/twemoji/assets/svg/1f1ec-1f1e7.svg -!/twemoji/assets/svg/1f1ec-1f1e9.svg -!/twemoji/assets/svg/1f1ec-1f1ea.svg -!/twemoji/assets/svg/1f1ec-1f1eb.svg -!/twemoji/assets/svg/1f1ec-1f1ec.svg -!/twemoji/assets/svg/1f1ec-1f1ed.svg -!/twemoji/assets/svg/1f1ec-1f1ee.svg -!/twemoji/assets/svg/1f1ec-1f1f1.svg -!/twemoji/assets/svg/1f1ec-1f1f2.svg -!/twemoji/assets/svg/1f1ec-1f1f3.svg -!/twemoji/assets/svg/1f1ec-1f1f5.svg -!/twemoji/assets/svg/1f1ec-1f1f6.svg -!/twemoji/assets/svg/1f1ec-1f1f7.svg -!/twemoji/assets/svg/1f1ec-1f1f8.svg -!/twemoji/assets/svg/1f1ec-1f1f9.svg -!/twemoji/assets/svg/1f1ec-1f1fa.svg -!/twemoji/assets/svg/1f1ec-1f1fc.svg -!/twemoji/assets/svg/1f1ec-1f1fe.svg -!/twemoji/assets/svg/1f1ed-1f1f0.svg -!/twemoji/assets/svg/1f1ed-1f1f2.svg -!/twemoji/assets/svg/1f1ed-1f1f3.svg -!/twemoji/assets/svg/1f1ed-1f1f7.svg -!/twemoji/assets/svg/1f1ed-1f1f9.svg -!/twemoji/assets/svg/1f1ed-1f1fa.svg -!/twemoji/assets/svg/1f1ee-1f1e8.svg -!/twemoji/assets/svg/1f1ee-1f1e9.svg -!/twemoji/assets/svg/1f1ee-1f1ea.svg -!/twemoji/assets/svg/1f1ee-1f1f1.svg -!/twemoji/assets/svg/1f1ee-1f1f2.svg -!/twemoji/assets/svg/1f1ee-1f1f3.svg -!/twemoji/assets/svg/1f1ee-1f1f4.svg -!/twemoji/assets/svg/1f1ee-1f1f6.svg -!/twemoji/assets/svg/1f1ee-1f1f7.svg -!/twemoji/assets/svg/1f1ee-1f1f8.svg -!/twemoji/assets/svg/1f1ee-1f1f9.svg -!/twemoji/assets/svg/1f1ef-1f1ea.svg -!/twemoji/assets/svg/1f1ef-1f1f2.svg -!/twemoji/assets/svg/1f1ef-1f1f4.svg -!/twemoji/assets/svg/1f1ef-1f1f5.svg -!/twemoji/assets/svg/1f1f0-1f1ea.svg -!/twemoji/assets/svg/1f1f0-1f1ec.svg -!/twemoji/assets/svg/1f1f0-1f1ed.svg -!/twemoji/assets/svg/1f1f0-1f1ee.svg -!/twemoji/assets/svg/1f1f0-1f1f2.svg -!/twemoji/assets/svg/1f1f0-1f1f3.svg -!/twemoji/assets/svg/1f1f0-1f1f5.svg -!/twemoji/assets/svg/1f1f0-1f1f7.svg -!/twemoji/assets/svg/1f1f0-1f1fc.svg -!/twemoji/assets/svg/1f1f0-1f1fe.svg -!/twemoji/assets/svg/1f1f0-1f1ff.svg -!/twemoji/assets/svg/1f1f1-1f1e6.svg -!/twemoji/assets/svg/1f1f1-1f1e7.svg -!/twemoji/assets/svg/1f1f1-1f1e8.svg -!/twemoji/assets/svg/1f1f1-1f1ee.svg -!/twemoji/assets/svg/1f1f1-1f1f0.svg -!/twemoji/assets/svg/1f1f1-1f1f7.svg -!/twemoji/assets/svg/1f1f1-1f1f8.svg -!/twemoji/assets/svg/1f1f1-1f1f9.svg -!/twemoji/assets/svg/1f1f1-1f1fa.svg -!/twemoji/assets/svg/1f1f1-1f1fb.svg -!/twemoji/assets/svg/1f1f1-1f1fe.svg -!/twemoji/assets/svg/1f1f2-1f1e6.svg -!/twemoji/assets/svg/1f1f2-1f1e8.svg -!/twemoji/assets/svg/1f1f2-1f1e9.svg -!/twemoji/assets/svg/1f1f2-1f1ea.svg -!/twemoji/assets/svg/1f1f2-1f1eb.svg -!/twemoji/assets/svg/1f1f2-1f1ec.svg -!/twemoji/assets/svg/1f1f2-1f1ed.svg -!/twemoji/assets/svg/1f1f2-1f1f0.svg -!/twemoji/assets/svg/1f1f2-1f1f1.svg -!/twemoji/assets/svg/1f1f2-1f1f2.svg -!/twemoji/assets/svg/1f1f2-1f1f3.svg -!/twemoji/assets/svg/1f1f2-1f1f4.svg -!/twemoji/assets/svg/1f1f2-1f1f5.svg -!/twemoji/assets/svg/1f1f2-1f1f6.svg -!/twemoji/assets/svg/1f1f2-1f1f7.svg -!/twemoji/assets/svg/1f1f2-1f1f8.svg -!/twemoji/assets/svg/1f1f2-1f1f9.svg -!/twemoji/assets/svg/1f1f2-1f1fa.svg -!/twemoji/assets/svg/1f1f2-1f1fb.svg -!/twemoji/assets/svg/1f1f2-1f1fc.svg -!/twemoji/assets/svg/1f1f2-1f1fd.svg -!/twemoji/assets/svg/1f1f2-1f1fe.svg -!/twemoji/assets/svg/1f1f2-1f1ff.svg -!/twemoji/assets/svg/1f1f3-1f1e6.svg -!/twemoji/assets/svg/1f1f3-1f1e8.svg -!/twemoji/assets/svg/1f1f3-1f1ea.svg -!/twemoji/assets/svg/1f1f3-1f1eb.svg -!/twemoji/assets/svg/1f1f3-1f1ec.svg -!/twemoji/assets/svg/1f1f3-1f1ee.svg -!/twemoji/assets/svg/1f1f3-1f1f1.svg -!/twemoji/assets/svg/1f1f3-1f1f4.svg -!/twemoji/assets/svg/1f1f3-1f1f5.svg -!/twemoji/assets/svg/1f1f3-1f1f7.svg -!/twemoji/assets/svg/1f1f3-1f1fa.svg -!/twemoji/assets/svg/1f1f3-1f1ff.svg -!/twemoji/assets/svg/1f1f4-1f1f2.svg -!/twemoji/assets/svg/1f1f5-1f1e6.svg -!/twemoji/assets/svg/1f1f5-1f1ea.svg -!/twemoji/assets/svg/1f1f5-1f1eb.svg -!/twemoji/assets/svg/1f1f5-1f1ec.svg -!/twemoji/assets/svg/1f1f5-1f1ed.svg -!/twemoji/assets/svg/1f1f5-1f1f0.svg -!/twemoji/assets/svg/1f1f5-1f1f1.svg -!/twemoji/assets/svg/1f1f5-1f1f2.svg -!/twemoji/assets/svg/1f1f5-1f1f3.svg -!/twemoji/assets/svg/1f1f5-1f1f7.svg -!/twemoji/assets/svg/1f1f5-1f1f8.svg -!/twemoji/assets/svg/1f1f5-1f1f9.svg -!/twemoji/assets/svg/1f1f5-1f1fc.svg -!/twemoji/assets/svg/1f1f5-1f1fe.svg -!/twemoji/assets/svg/1f1f6-1f1e6.svg -!/twemoji/assets/svg/1f1f7-1f1ea.svg -!/twemoji/assets/svg/1f1f7-1f1f4.svg -!/twemoji/assets/svg/1f1f7-1f1f8.svg -!/twemoji/assets/svg/1f1f7-1f1fa.svg -!/twemoji/assets/svg/1f1f7-1f1fc.svg -!/twemoji/assets/svg/1f1f8-1f1e6.svg -!/twemoji/assets/svg/1f1f8-1f1e7.svg -!/twemoji/assets/svg/1f1f8-1f1e8.svg -!/twemoji/assets/svg/1f1f8-1f1e9.svg -!/twemoji/assets/svg/1f1f8-1f1ea.svg -!/twemoji/assets/svg/1f1f8-1f1ec.svg -!/twemoji/assets/svg/1f1f8-1f1ed.svg -!/twemoji/assets/svg/1f1f8-1f1ee.svg -!/twemoji/assets/svg/1f1f8-1f1ef.svg -!/twemoji/assets/svg/1f1f8-1f1f0.svg -!/twemoji/assets/svg/1f1f8-1f1f1.svg -!/twemoji/assets/svg/1f1f8-1f1f2.svg -!/twemoji/assets/svg/1f1f8-1f1f3.svg -!/twemoji/assets/svg/1f1f8-1f1f4.svg -!/twemoji/assets/svg/1f1f8-1f1f7.svg -!/twemoji/assets/svg/1f1f8-1f1f8.svg -!/twemoji/assets/svg/1f1f8-1f1f9.svg -!/twemoji/assets/svg/1f1f8-1f1fb.svg -!/twemoji/assets/svg/1f1f8-1f1fd.svg -!/twemoji/assets/svg/1f1f8-1f1fe.svg -!/twemoji/assets/svg/1f1f8-1f1ff.svg -!/twemoji/assets/svg/1f1f9-1f1e6.svg -!/twemoji/assets/svg/1f1f9-1f1e8.svg -!/twemoji/assets/svg/1f1f9-1f1e9.svg -!/twemoji/assets/svg/1f1f9-1f1eb.svg -!/twemoji/assets/svg/1f1f9-1f1ec.svg -!/twemoji/assets/svg/1f1f9-1f1ed.svg -!/twemoji/assets/svg/1f1f9-1f1ef.svg -!/twemoji/assets/svg/1f1f9-1f1f0.svg -!/twemoji/assets/svg/1f1f9-1f1f1.svg -!/twemoji/assets/svg/1f1f9-1f1f2.svg -!/twemoji/assets/svg/1f1f9-1f1f3.svg -!/twemoji/assets/svg/1f1f9-1f1f4.svg -!/twemoji/assets/svg/1f1f9-1f1f7.svg -!/twemoji/assets/svg/1f1f9-1f1f9.svg -!/twemoji/assets/svg/1f1f9-1f1fb.svg -!/twemoji/assets/svg/1f1f9-1f1fc.svg -!/twemoji/assets/svg/1f1f9-1f1ff.svg -!/twemoji/assets/svg/1f1fa-1f1e6.svg -!/twemoji/assets/svg/1f1fa-1f1ec.svg -!/twemoji/assets/svg/1f1fa-1f1f2.svg -!/twemoji/assets/svg/1f1fa-1f1f3.svg -!/twemoji/assets/svg/1f1fa-1f1f8.svg -!/twemoji/assets/svg/1f1fa-1f1fe.svg -!/twemoji/assets/svg/1f1fa-1f1ff.svg -!/twemoji/assets/svg/1f1fb-1f1e6.svg -!/twemoji/assets/svg/1f1fb-1f1e8.svg -!/twemoji/assets/svg/1f1fb-1f1ea.svg -!/twemoji/assets/svg/1f1fb-1f1ec.svg -!/twemoji/assets/svg/1f1fb-1f1ee.svg -!/twemoji/assets/svg/1f1fb-1f1f3.svg -!/twemoji/assets/svg/1f1fb-1f1fa.svg -!/twemoji/assets/svg/1f1fc-1f1eb.svg -!/twemoji/assets/svg/1f1fc-1f1f8.svg -!/twemoji/assets/svg/1f1fd-1f1f0.svg -!/twemoji/assets/svg/1f1fe-1f1ea.svg -!/twemoji/assets/svg/1f1fe-1f1f9.svg -!/twemoji/assets/svg/1f1ff-1f1e6.svg -!/twemoji/assets/svg/1f1ff-1f1f2.svg -!/twemoji/assets/svg/1f1ff-1f1fc.svg +!/twemoji/assets/svg/1f1e[6-9a-f]-1f1[e-f][0-9a-f].svg +!/twemoji/assets/svg/1f1f[0-9a-f]-1f1[e-f][0-9a-f].svg +!/twemoji/assets/svg/1f3f3-fe0f-200d-1f308.svg +!/twemoji/assets/svg/1f3f3-fe0f-200d-26a7-fe0f.svg +!/twemoji/assets/svg/1f3f4-200d-2620-fe0f.svg !/twemoji/assets/svg/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.svg !/twemoji/assets/svg/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.svg !/twemoji/assets/svg/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.svg + +!/vue-clock2/LICENS* +!/vue-clock2/dist/ +/vue-clock2/dist/* +!/vue-clock2/dist/*.js diff --git a/public/external/@shopify/draggable/LICENSE.md b/public/external/@shopify/draggable/LICENSE.md new file mode 100644 index 0000000000..8cf8f6df37 --- /dev/null +++ b/public/external/@shopify/draggable/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Shopify + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/public/external/@shopify/draggable/lib/draggable.bundle.js b/public/external/@shopify/draggable/lib/draggable.bundle.js new file mode 100644 index 0000000000..0af92e4b6b --- /dev/null +++ b/public/external/@shopify/draggable/lib/draggable.bundle.js @@ -0,0 +1,7657 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define("Draggable", [], factory); + else if(typeof exports === 'object') + exports["Draggable"] = factory(); + else + root["Draggable"] = factory(); +})(window, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 72); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _AbstractPlugin = __webpack_require__(66); + +var _AbstractPlugin2 = _interopRequireDefault(_AbstractPlugin); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _AbstractPlugin2.default; + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _AbstractEvent = __webpack_require__(70); + +var _AbstractEvent2 = _interopRequireDefault(_AbstractEvent); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _AbstractEvent2.default; + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _closest = __webpack_require__(57); + +Object.defineProperty(exports, 'closest', { + enumerable: true, + get: function () { + return _interopRequireDefault(_closest).default; + } +}); + +var _requestNextAnimationFrame = __webpack_require__(55); + +Object.defineProperty(exports, 'requestNextAnimationFrame', { + enumerable: true, + get: function () { + return _interopRequireDefault(_requestNextAnimationFrame).default; + } +}); + +var _distance = __webpack_require__(53); + +Object.defineProperty(exports, 'distance', { + enumerable: true, + get: function () { + return _interopRequireDefault(_distance).default; + } +}); + +var _touchCoords = __webpack_require__(51); + +Object.defineProperty(exports, 'touchCoords', { + enumerable: true, + get: function () { + return _interopRequireDefault(_touchCoords).default; + } +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }), +/* 3 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _SensorEvent = __webpack_require__(46); + +Object.keys(_SensorEvent).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _SensorEvent[key]; + } + }); +}); + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _Sensor = __webpack_require__(49); + +var _Sensor2 = _interopRequireDefault(_Sensor); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _Sensor2.default; + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _DragEvent = __webpack_require__(14); + +Object.keys(_DragEvent).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _DragEvent[key]; + } + }); +}); + +var _DraggableEvent = __webpack_require__(13); + +Object.keys(_DraggableEvent).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _DraggableEvent[key]; + } + }); +}); + +var _Plugins = __webpack_require__(12); + +Object.keys(_Plugins).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _Plugins[key]; + } + }); +}); + +var _Sensors = __webpack_require__(6); + +Object.keys(_Sensors).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _Sensors[key]; + } + }); +}); + +var _Draggable = __webpack_require__(39); + +var _Draggable2 = _interopRequireDefault(_Draggable); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _Draggable2.default; + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _Sensor = __webpack_require__(4); + +Object.defineProperty(exports, 'Sensor', { + enumerable: true, + get: function () { + return _interopRequireDefault(_Sensor).default; + } +}); + +var _MouseSensor = __webpack_require__(48); + +Object.defineProperty(exports, 'MouseSensor', { + enumerable: true, + get: function () { + return _interopRequireDefault(_MouseSensor).default; + } +}); + +var _TouchSensor = __webpack_require__(45); + +Object.defineProperty(exports, 'TouchSensor', { + enumerable: true, + get: function () { + return _interopRequireDefault(_TouchSensor).default; + } +}); + +var _DragSensor = __webpack_require__(43); + +Object.defineProperty(exports, 'DragSensor', { + enumerable: true, + get: function () { + return _interopRequireDefault(_DragSensor).default; + } +}); + +var _ForceTouchSensor = __webpack_require__(41); + +Object.defineProperty(exports, 'ForceTouchSensor', { + enumerable: true, + get: function () { + return _interopRequireDefault(_ForceTouchSensor).default; + } +}); + +var _SensorEvent = __webpack_require__(3); + +Object.keys(_SensorEvent).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _SensorEvent[key]; + } + }); +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _SnappableEvent = __webpack_require__(20); + +Object.keys(_SnappableEvent).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _SnappableEvent[key]; + } + }); +}); + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _CollidableEvent = __webpack_require__(25); + +Object.keys(_CollidableEvent).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _CollidableEvent[key]; + } + }); +}); + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _SortableEvent = __webpack_require__(29); + +Object.keys(_SortableEvent).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _SortableEvent[key]; + } + }); +}); + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _SwappableEvent = __webpack_require__(32); + +Object.keys(_SwappableEvent).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _SwappableEvent[key]; + } + }); +}); + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _DroppableEvent = __webpack_require__(35); + +Object.keys(_DroppableEvent).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _DroppableEvent[key]; + } + }); +}); + +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _Announcement = __webpack_require__(68); + +Object.defineProperty(exports, 'Announcement', { + enumerable: true, + get: function () { + return _interopRequireDefault(_Announcement).default; + } +}); +Object.defineProperty(exports, 'defaultAnnouncementOptions', { + enumerable: true, + get: function () { + return _Announcement.defaultOptions; + } +}); + +var _Focusable = __webpack_require__(65); + +Object.defineProperty(exports, 'Focusable', { + enumerable: true, + get: function () { + return _interopRequireDefault(_Focusable).default; + } +}); + +var _Mirror = __webpack_require__(63); + +Object.defineProperty(exports, 'Mirror', { + enumerable: true, + get: function () { + return _interopRequireDefault(_Mirror).default; + } +}); +Object.defineProperty(exports, 'defaultMirrorOptions', { + enumerable: true, + get: function () { + return _Mirror.defaultOptions; + } +}); + +var _Scrollable = __webpack_require__(59); + +Object.defineProperty(exports, 'Scrollable', { + enumerable: true, + get: function () { + return _interopRequireDefault(_Scrollable).default; + } +}); +Object.defineProperty(exports, 'defaultScrollableOptions', { + enumerable: true, + get: function () { + return _Scrollable.defaultOptions; + } +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _DraggableEvent = __webpack_require__(69); + +Object.keys(_DraggableEvent).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _DraggableEvent[key]; + } + }); +}); + +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _DragEvent = __webpack_require__(71); + +Object.keys(_DragEvent).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _DragEvent[key]; + } + }); +}); + +/***/ }), +/* 15 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.defaultOptions = undefined; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _AbstractPlugin = __webpack_require__(0); + +var _AbstractPlugin2 = _interopRequireDefault(_AbstractPlugin); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const onSortableSorted = Symbol('onSortableSorted'); +const onSortableSort = Symbol('onSortableSort'); + +/** + * SortAnimation default options + * @property {Object} defaultOptions + * @property {Number} defaultOptions.duration + * @property {String} defaultOptions.easingFunction + * @type {Object} + */ +const defaultOptions = exports.defaultOptions = { + duration: 150, + easingFunction: 'ease-in-out' +}; + +/** + * SortAnimation plugin adds sort animation for sortable + * @class SortAnimation + * @module SortAnimation + * @extends AbstractPlugin + */ +class SortAnimation extends _AbstractPlugin2.default { + /** + * SortAnimation constructor. + * @constructs SortAnimation + * @param {Draggable} draggable - Draggable instance + */ + constructor(draggable) { + super(draggable); + + /** + * SortAnimation options + * @property {Object} options + * @property {Number} defaultOptions.duration + * @property {String} defaultOptions.easingFunction + * @type {Object} + */ + this.options = _extends({}, defaultOptions, this.getOptions()); + + /** + * Last animation frame + * @property {Number} lastAnimationFrame + * @type {Number} + */ + this.lastAnimationFrame = null; + this.lastElements = []; + + this[onSortableSorted] = this[onSortableSorted].bind(this); + this[onSortableSort] = this[onSortableSort].bind(this); + } + + /** + * Attaches plugins event listeners + */ + attach() { + this.draggable.on('sortable:sort', this[onSortableSort]); + this.draggable.on('sortable:sorted', this[onSortableSorted]); + } + + /** + * Detaches plugins event listeners + */ + detach() { + this.draggable.off('sortable:sort', this[onSortableSort]); + this.draggable.off('sortable:sorted', this[onSortableSorted]); + } + + /** + * Returns options passed through draggable + * @return {Object} + */ + getOptions() { + return this.draggable.options.sortAnimation || {}; + } + + /** + * Sortable sort handler + * @param {SortableSortEvent} sortableEvent + * @private + */ + [onSortableSort]({ dragEvent }) { + const { sourceContainer } = dragEvent; + const elements = this.draggable.getDraggableElementsForContainer(sourceContainer); + this.lastElements = Array.from(elements).map(el => { + return { + domEl: el, + offsetTop: el.offsetTop, + offsetLeft: el.offsetLeft + }; + }); + } + + /** + * Sortable sorted handler + * @param {SortableSortedEvent} sortableEvent + * @private + */ + [onSortableSorted]({ oldIndex, newIndex }) { + if (oldIndex === newIndex) { + return; + } + + const effectedElements = []; + let start; + let end; + let num; + if (oldIndex > newIndex) { + start = newIndex; + end = oldIndex - 1; + num = 1; + } else { + start = oldIndex + 1; + end = newIndex; + num = -1; + } + + for (let i = start; i <= end; i++) { + const from = this.lastElements[i]; + const to = this.lastElements[i + num]; + effectedElements.push({ from, to }); + } + cancelAnimationFrame(this.lastAnimationFrame); + + // Can be done in a separate frame + this.lastAnimationFrame = requestAnimationFrame(() => { + effectedElements.forEach(element => animate(element, this.options)); + }); + } +} + +exports.default = SortAnimation; /** + * Animates two elements + * @param {Object} element + * @param {Object} element.from + * @param {Object} element.to + * @param {Object} options + * @param {Number} options.duration + * @param {String} options.easingFunction + * @private + */ + +function animate({ from, to }, { duration, easingFunction }) { + const domEl = from.domEl; + const x = from.offsetLeft - to.offsetLeft; + const y = from.offsetTop - to.offsetTop; + + domEl.style.pointerEvents = 'none'; + domEl.style.transform = `translate3d(${x}px, ${y}px, 0)`; + + requestAnimationFrame(() => { + domEl.addEventListener('transitionend', resetElementOnTransitionEnd); + domEl.style.transition = `transform ${duration}ms ${easingFunction}`; + domEl.style.transform = ''; + }); +} + +/** + * Resets animation style properties after animation has completed + * @param {Event} event + * @private + */ +function resetElementOnTransitionEnd(event) { + event.target.style.transition = ''; + event.target.style.pointerEvents = ''; + event.target.removeEventListener('transitionend', resetElementOnTransitionEnd); +} + +/***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.defaultOptions = undefined; + +var _SortAnimation = __webpack_require__(15); + +var _SortAnimation2 = _interopRequireDefault(_SortAnimation); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _SortAnimation2.default; +exports.defaultOptions = _SortAnimation.defaultOptions; + +/***/ }), +/* 17 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.defaultOptions = undefined; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _AbstractPlugin = __webpack_require__(0); + +var _AbstractPlugin2 = _interopRequireDefault(_AbstractPlugin); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const onSortableSorted = Symbol('onSortableSorted'); + +/** + * SwapAnimation default options + * @property {Object} defaultOptions + * @property {Number} defaultOptions.duration + * @property {String} defaultOptions.easingFunction + * @property {Boolean} defaultOptions.horizontal + * @type {Object} + */ +const defaultOptions = exports.defaultOptions = { + duration: 150, + easingFunction: 'ease-in-out', + horizontal: false +}; + +/** + * SwapAnimation plugin adds swap animations for sortable + * @class SwapAnimation + * @module SwapAnimation + * @extends AbstractPlugin + */ +class SwapAnimation extends _AbstractPlugin2.default { + /** + * SwapAnimation constructor. + * @constructs SwapAnimation + * @param {Draggable} draggable - Draggable instance + */ + constructor(draggable) { + super(draggable); + + /** + * SwapAnimation options + * @property {Object} options + * @property {Number} defaultOptions.duration + * @property {String} defaultOptions.easingFunction + * @type {Object} + */ + this.options = _extends({}, defaultOptions, this.getOptions()); + + /** + * Last animation frame + * @property {Number} lastAnimationFrame + * @type {Number} + */ + this.lastAnimationFrame = null; + + this[onSortableSorted] = this[onSortableSorted].bind(this); + } + + /** + * Attaches plugins event listeners + */ + attach() { + this.draggable.on('sortable:sorted', this[onSortableSorted]); + } + + /** + * Detaches plugins event listeners + */ + detach() { + this.draggable.off('sortable:sorted', this[onSortableSorted]); + } + + /** + * Returns options passed through draggable + * @return {Object} + */ + getOptions() { + return this.draggable.options.swapAnimation || {}; + } + + /** + * Sortable sorted handler + * @param {SortableSortedEvent} sortableEvent + * @private + */ + [onSortableSorted]({ oldIndex, newIndex, dragEvent }) { + const { source, over } = dragEvent; + + cancelAnimationFrame(this.lastAnimationFrame); + + // Can be done in a separate frame + this.lastAnimationFrame = requestAnimationFrame(() => { + if (oldIndex >= newIndex) { + animate(source, over, this.options); + } else { + animate(over, source, this.options); + } + }); + } +} + +exports.default = SwapAnimation; /** + * Animates two elements + * @param {HTMLElement} from + * @param {HTMLElement} to + * @param {Object} options + * @param {Number} options.duration + * @param {String} options.easingFunction + * @param {String} options.horizontal + * @private + */ + +function animate(from, to, { duration, easingFunction, horizontal }) { + for (const element of [from, to]) { + element.style.pointerEvents = 'none'; + } + + if (horizontal) { + const width = from.offsetWidth; + from.style.transform = `translate3d(${width}px, 0, 0)`; + to.style.transform = `translate3d(-${width}px, 0, 0)`; + } else { + const height = from.offsetHeight; + from.style.transform = `translate3d(0, ${height}px, 0)`; + to.style.transform = `translate3d(0, -${height}px, 0)`; + } + + requestAnimationFrame(() => { + for (const element of [from, to]) { + element.addEventListener('transitionend', resetElementOnTransitionEnd); + element.style.transition = `transform ${duration}ms ${easingFunction}`; + element.style.transform = ''; + } + }); +} + +/** + * Resets animation style properties after animation has completed + * @param {Event} event + * @private + */ +function resetElementOnTransitionEnd(event) { + event.target.style.transition = ''; + event.target.style.pointerEvents = ''; + event.target.removeEventListener('transitionend', resetElementOnTransitionEnd); +} + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.defaultOptions = undefined; + +var _SwapAnimation = __webpack_require__(17); + +var _SwapAnimation2 = _interopRequireDefault(_SwapAnimation); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _SwapAnimation2.default; +exports.defaultOptions = _SwapAnimation.defaultOptions; + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _AbstractPlugin = __webpack_require__(0); + +var _AbstractPlugin2 = _interopRequireDefault(_AbstractPlugin); + +var _SnappableEvent = __webpack_require__(7); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const onDragStart = Symbol('onDragStart'); +const onDragStop = Symbol('onDragStop'); +const onDragOver = Symbol('onDragOver'); +const onDragOut = Symbol('onDragOut'); +const onMirrorCreated = Symbol('onMirrorCreated'); +const onMirrorDestroy = Symbol('onMirrorDestroy'); + +/** + * Snappable plugin which snaps draggable elements into place + * @class Snappable + * @module Snappable + * @extends AbstractPlugin + */ +class Snappable extends _AbstractPlugin2.default { + /** + * Snappable constructor. + * @constructs Snappable + * @param {Draggable} draggable - Draggable instance + */ + constructor(draggable) { + super(draggable); + + /** + * Keeps track of the first source element + * @property {HTMLElement|null} firstSource + */ + this.firstSource = null; + + /** + * Keeps track of the mirror element + * @property {HTMLElement} mirror + */ + this.mirror = null; + + this[onDragStart] = this[onDragStart].bind(this); + this[onDragStop] = this[onDragStop].bind(this); + this[onDragOver] = this[onDragOver].bind(this); + this[onDragOut] = this[onDragOut].bind(this); + this[onMirrorCreated] = this[onMirrorCreated].bind(this); + this[onMirrorDestroy] = this[onMirrorDestroy].bind(this); + } + + /** + * Attaches plugins event listeners + */ + attach() { + this.draggable.on('drag:start', this[onDragStart]).on('drag:stop', this[onDragStop]).on('drag:over', this[onDragOver]).on('drag:out', this[onDragOut]).on('droppable:over', this[onDragOver]).on('droppable:out', this[onDragOut]).on('mirror:created', this[onMirrorCreated]).on('mirror:destroy', this[onMirrorDestroy]); + } + + /** + * Detaches plugins event listeners + */ + detach() { + this.draggable.off('drag:start', this[onDragStart]).off('drag:stop', this[onDragStop]).off('drag:over', this[onDragOver]).off('drag:out', this[onDragOut]).off('droppable:over', this[onDragOver]).off('droppable:out', this[onDragOut]).off('mirror:created', this[onMirrorCreated]).off('mirror:destroy', this[onMirrorDestroy]); + } + + /** + * Drag start handler + * @private + * @param {DragStartEvent} event - Drag start event + */ + [onDragStart](event) { + if (event.canceled()) { + return; + } + + this.firstSource = event.source; + } + + /** + * Drag stop handler + * @private + * @param {DragStopEvent} event - Drag stop event + */ + [onDragStop]() { + this.firstSource = null; + } + + /** + * Drag over handler + * @private + * @param {DragOverEvent|DroppableOverEvent} event - Drag over event + */ + [onDragOver](event) { + if (event.canceled()) { + return; + } + + const source = event.source || event.dragEvent.source; + + if (source === this.firstSource) { + this.firstSource = null; + return; + } + + const snapInEvent = new _SnappableEvent.SnapInEvent({ + dragEvent: event, + snappable: event.over || event.droppable + }); + + this.draggable.trigger(snapInEvent); + + if (snapInEvent.canceled()) { + return; + } + + if (this.mirror) { + this.mirror.style.display = 'none'; + } + + source.classList.remove(...this.draggable.getClassNamesFor('source:dragging')); + source.classList.add(...this.draggable.getClassNamesFor('source:placed')); + + // Need to cancel this in drag out + setTimeout(() => { + source.classList.remove(...this.draggable.getClassNamesFor('source:placed')); + }, this.draggable.options.placedTimeout); + } + + /** + * Drag out handler + * @private + * @param {DragOutEvent|DroppableOutEvent} event - Drag out event + */ + [onDragOut](event) { + if (event.canceled()) { + return; + } + + const source = event.source || event.dragEvent.source; + + const snapOutEvent = new _SnappableEvent.SnapOutEvent({ + dragEvent: event, + snappable: event.over || event.droppable + }); + + this.draggable.trigger(snapOutEvent); + + if (snapOutEvent.canceled()) { + return; + } + + if (this.mirror) { + this.mirror.style.display = ''; + } + + source.classList.add(...this.draggable.getClassNamesFor('source:dragging')); + } + + /** + * Mirror created handler + * @param {MirrorCreatedEvent} mirrorEvent + * @private + */ + [onMirrorCreated]({ mirror }) { + this.mirror = mirror; + } + + /** + * Mirror destroy handler + * @param {MirrorDestroyEvent} mirrorEvent + * @private + */ + [onMirrorDestroy]() { + this.mirror = null; + } +} +exports.default = Snappable; + +/***/ }), +/* 20 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.SnapOutEvent = exports.SnapInEvent = exports.SnapEvent = undefined; + +var _AbstractEvent = __webpack_require__(1); + +var _AbstractEvent2 = _interopRequireDefault(_AbstractEvent); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Base snap event + * @class SnapEvent + * @module SnapEvent + * @extends AbstractEvent + */ +class SnapEvent extends _AbstractEvent2.default { + + /** + * Drag event that triggered this snap event + * @property dragEvent + * @type {DragEvent} + * @readonly + */ + get dragEvent() { + return this.data.dragEvent; + } + + /** + * Snappable element + * @property snappable + * @type {HTMLElement} + * @readonly + */ + get snappable() { + return this.data.snappable; + } +} + +exports.SnapEvent = SnapEvent; /** + * Snap in event + * @class SnapInEvent + * @module SnapInEvent + * @extends SnapEvent + */ + +SnapEvent.type = 'snap'; +class SnapInEvent extends SnapEvent {} + +exports.SnapInEvent = SnapInEvent; /** + * Snap out event + * @class SnapOutEvent + * @module SnapOutEvent + * @extends SnapEvent + */ + +SnapInEvent.type = 'snap:in'; +SnapInEvent.cancelable = true; +class SnapOutEvent extends SnapEvent {} +exports.SnapOutEvent = SnapOutEvent; +SnapOutEvent.type = 'snap:out'; +SnapOutEvent.cancelable = true; + +/***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _SnappableEvent = __webpack_require__(7); + +Object.keys(_SnappableEvent).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _SnappableEvent[key]; + } + }); +}); + +var _Snappable = __webpack_require__(19); + +var _Snappable2 = _interopRequireDefault(_Snappable); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _Snappable2.default; + +/***/ }), +/* 22 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.defaultOptions = undefined; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _AbstractPlugin = __webpack_require__(0); + +var _AbstractPlugin2 = _interopRequireDefault(_AbstractPlugin); + +var _utils = __webpack_require__(2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const onMirrorCreated = Symbol('onMirrorCreated'); +const onMirrorDestroy = Symbol('onMirrorDestroy'); +const onDragOver = Symbol('onDragOver'); +const resize = Symbol('resize'); + +/** + * ResizeMirror default options + * @property {Object} defaultOptions + * @type {Object} + */ +const defaultOptions = exports.defaultOptions = {}; + +/** + * The ResizeMirror plugin resizes the mirror element to the dimensions of the draggable element that the mirror is hovering over + * @class ResizeMirror + * @module ResizeMirror + * @extends AbstractPlugin + */ +class ResizeMirror extends _AbstractPlugin2.default { + /** + * ResizeMirror constructor. + * @constructs ResizeMirror + * @param {Draggable} draggable - Draggable instance + */ + constructor(draggable) { + super(draggable); + + /** + * ResizeMirror options + * @property {Object} options + * @type {Object} + */ + this.options = _extends({}, defaultOptions, this.getOptions()); + + /** + * ResizeMirror remembers the last width when resizing the mirror + * to avoid additional writes to the DOM + * @property {number} lastWidth + */ + this.lastWidth = 0; + + /** + * ResizeMirror remembers the last height when resizing the mirror + * to avoid additional writes to the DOM + * @property {number} lastHeight + */ + this.lastHeight = 0; + + /** + * Keeps track of the mirror element + * @property {HTMLElement} mirror + */ + this.mirror = null; + + this[onMirrorCreated] = this[onMirrorCreated].bind(this); + this[onMirrorDestroy] = this[onMirrorDestroy].bind(this); + this[onDragOver] = this[onDragOver].bind(this); + } + + /** + * Attaches plugins event listeners + */ + attach() { + this.draggable.on('mirror:created', this[onMirrorCreated]).on('drag:over', this[onDragOver]).on('drag:over:container', this[onDragOver]); + } + + /** + * Detaches plugins event listeners + */ + detach() { + this.draggable.off('mirror:created', this[onMirrorCreated]).off('mirror:destroy', this[onMirrorDestroy]).off('drag:over', this[onDragOver]).off('drag:over:container', this[onDragOver]); + } + + /** + * Returns options passed through draggable + * @return {Object} + */ + getOptions() { + return this.draggable.options.resizeMirror || {}; + } + + /** + * Mirror created handler + * @param {MirrorCreatedEvent} mirrorEvent + * @private + */ + [onMirrorCreated]({ mirror }) { + this.mirror = mirror; + } + + /** + * Mirror destroy handler + * @param {MirrorDestroyEvent} mirrorEvent + * @private + */ + [onMirrorDestroy]() { + this.mirror = null; + } + + /** + * Drag over handler + * @param {DragOverEvent | DragOverContainer} dragEvent + * @private + */ + [onDragOver](dragEvent) { + this[resize](dragEvent); + } + + /** + * Resize function for + * @param {DragOverEvent | DragOverContainer} dragEvent + * @private + */ + [resize]({ overContainer, over }) { + requestAnimationFrame(() => { + if (!this.mirror.parentNode) { + return; + } + + if (this.mirror.parentNode !== overContainer) { + overContainer.appendChild(this.mirror); + } + + const overElement = over || this.draggable.getDraggableElementsForContainer(overContainer)[0]; + + if (!overElement) { + return; + } + + (0, _utils.requestNextAnimationFrame)(() => { + const overRect = overElement.getBoundingClientRect(); + + if (this.lastHeight === overRect.height && this.lastWidth === overRect.width) { + return; + } + + this.mirror.style.width = `${overRect.width}px`; + this.mirror.style.height = `${overRect.height}px`; + + this.lastWidth = overRect.width; + this.lastHeight = overRect.height; + }); + }); + } +} +exports.default = ResizeMirror; + +/***/ }), +/* 23 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.defaultOptions = undefined; + +var _ResizeMirror = __webpack_require__(22); + +var _ResizeMirror2 = _interopRequireDefault(_ResizeMirror); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _ResizeMirror2.default; +exports.defaultOptions = _ResizeMirror.defaultOptions; + +/***/ }), +/* 24 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _AbstractPlugin = __webpack_require__(0); + +var _AbstractPlugin2 = _interopRequireDefault(_AbstractPlugin); + +var _utils = __webpack_require__(2); + +var _CollidableEvent = __webpack_require__(8); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const onDragMove = Symbol('onDragMove'); +const onDragStop = Symbol('onDragStop'); +const onRequestAnimationFrame = Symbol('onRequestAnimationFrame'); + +/** + * Collidable plugin which detects colliding elements while dragging + * @class Collidable + * @module Collidable + * @extends AbstractPlugin + */ +class Collidable extends _AbstractPlugin2.default { + /** + * Collidable constructor. + * @constructs Collidable + * @param {Draggable} draggable - Draggable instance + */ + constructor(draggable) { + super(draggable); + + /** + * Keeps track of currently colliding elements + * @property {HTMLElement|null} currentlyCollidingElement + * @type {HTMLElement|null} + */ + this.currentlyCollidingElement = null; + + /** + * Keeps track of currently colliding elements + * @property {HTMLElement|null} lastCollidingElement + * @type {HTMLElement|null} + */ + this.lastCollidingElement = null; + + /** + * Animation frame for finding colliding elements + * @property {Number|null} currentAnimationFrame + * @type {Number|null} + */ + this.currentAnimationFrame = null; + + this[onDragMove] = this[onDragMove].bind(this); + this[onDragStop] = this[onDragStop].bind(this); + this[onRequestAnimationFrame] = this[onRequestAnimationFrame].bind(this); + } + + /** + * Attaches plugins event listeners + */ + attach() { + this.draggable.on('drag:move', this[onDragMove]).on('drag:stop', this[onDragStop]); + } + + /** + * Detaches plugins event listeners + */ + detach() { + this.draggable.off('drag:move', this[onDragMove]).off('drag:stop', this[onDragStop]); + } + + /** + * Returns current collidables based on `collidables` option + * @return {HTMLElement[]} + */ + getCollidables() { + const collidables = this.draggable.options.collidables; + + if (typeof collidables === 'string') { + return Array.prototype.slice.call(document.querySelectorAll(collidables)); + } else if (collidables instanceof NodeList || collidables instanceof Array) { + return Array.prototype.slice.call(collidables); + } else if (collidables instanceof HTMLElement) { + return [collidables]; + } else if (typeof collidables === 'function') { + return collidables(); + } else { + return []; + } + } + + /** + * Drag move handler + * @private + * @param {DragMoveEvent} event - Drag move event + */ + [onDragMove](event) { + const target = event.sensorEvent.target; + + this.currentAnimationFrame = requestAnimationFrame(this[onRequestAnimationFrame](target)); + + if (this.currentlyCollidingElement) { + event.cancel(); + } + + const collidableInEvent = new _CollidableEvent.CollidableInEvent({ + dragEvent: event, + collidingElement: this.currentlyCollidingElement + }); + + const collidableOutEvent = new _CollidableEvent.CollidableOutEvent({ + dragEvent: event, + collidingElement: this.lastCollidingElement + }); + + const enteringCollidable = Boolean(this.currentlyCollidingElement && this.lastCollidingElement !== this.currentlyCollidingElement); + const leavingCollidable = Boolean(!this.currentlyCollidingElement && this.lastCollidingElement); + + if (enteringCollidable) { + if (this.lastCollidingElement) { + this.draggable.trigger(collidableOutEvent); + } + + this.draggable.trigger(collidableInEvent); + } else if (leavingCollidable) { + this.draggable.trigger(collidableOutEvent); + } + + this.lastCollidingElement = this.currentlyCollidingElement; + } + + /** + * Drag stop handler + * @private + * @param {DragStopEvent} event - Drag stop event + */ + [onDragStop](event) { + const lastCollidingElement = this.currentlyCollidingElement || this.lastCollidingElement; + const collidableOutEvent = new _CollidableEvent.CollidableOutEvent({ + dragEvent: event, + collidingElement: lastCollidingElement + }); + + if (lastCollidingElement) { + this.draggable.trigger(collidableOutEvent); + } + + this.lastCollidingElement = null; + this.currentlyCollidingElement = null; + } + + /** + * Animation frame function + * @private + * @param {HTMLElement} target - Current move target + * @return {Function} + */ + [onRequestAnimationFrame](target) { + return () => { + const collidables = this.getCollidables(); + this.currentlyCollidingElement = (0, _utils.closest)(target, element => collidables.includes(element)); + }; + } +} +exports.default = Collidable; + +/***/ }), +/* 25 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.CollidableOutEvent = exports.CollidableInEvent = exports.CollidableEvent = undefined; + +var _AbstractEvent = __webpack_require__(1); + +var _AbstractEvent2 = _interopRequireDefault(_AbstractEvent); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Base collidable event + * @class CollidableEvent + * @module CollidableEvent + * @extends AbstractEvent + */ +class CollidableEvent extends _AbstractEvent2.default { + + /** + * Drag event that triggered this colliable event + * @property dragEvent + * @type {DragEvent} + * @readonly + */ + get dragEvent() { + return this.data.dragEvent; + } +} + +exports.CollidableEvent = CollidableEvent; /** + * Collidable in event + * @class CollidableInEvent + * @module CollidableInEvent + * @extends CollidableEvent + */ + +CollidableEvent.type = 'collidable'; +class CollidableInEvent extends CollidableEvent { + + /** + * Element you are currently colliding with + * @property collidingElement + * @type {HTMLElement} + * @readonly + */ + get collidingElement() { + return this.data.collidingElement; + } +} + +exports.CollidableInEvent = CollidableInEvent; /** + * Collidable out event + * @class CollidableOutEvent + * @module CollidableOutEvent + * @extends CollidableEvent + */ + +CollidableInEvent.type = 'collidable:in'; +class CollidableOutEvent extends CollidableEvent { + + /** + * Element you were previously colliding with + * @property collidingElement + * @type {HTMLElement} + * @readonly + */ + get collidingElement() { + return this.data.collidingElement; + } +} +exports.CollidableOutEvent = CollidableOutEvent; +CollidableOutEvent.type = 'collidable:out'; + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _CollidableEvent = __webpack_require__(8); + +Object.keys(_CollidableEvent).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _CollidableEvent[key]; + } + }); +}); + +var _Collidable = __webpack_require__(24); + +var _Collidable2 = _interopRequireDefault(_Collidable); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _Collidable2.default; + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _Collidable = __webpack_require__(26); + +Object.defineProperty(exports, 'Collidable', { + enumerable: true, + get: function () { + return _interopRequireDefault(_Collidable).default; + } +}); + +var _ResizeMirror = __webpack_require__(23); + +Object.defineProperty(exports, 'ResizeMirror', { + enumerable: true, + get: function () { + return _interopRequireDefault(_ResizeMirror).default; + } +}); +Object.defineProperty(exports, 'defaultResizeMirrorOptions', { + enumerable: true, + get: function () { + return _ResizeMirror.defaultOptions; + } +}); + +var _Snappable = __webpack_require__(21); + +Object.defineProperty(exports, 'Snappable', { + enumerable: true, + get: function () { + return _interopRequireDefault(_Snappable).default; + } +}); + +var _SwapAnimation = __webpack_require__(18); + +Object.defineProperty(exports, 'SwapAnimation', { + enumerable: true, + get: function () { + return _interopRequireDefault(_SwapAnimation).default; + } +}); +Object.defineProperty(exports, 'defaultSwapAnimationOptions', { + enumerable: true, + get: function () { + return _SwapAnimation.defaultOptions; + } +}); + +var _SortAnimation = __webpack_require__(16); + +Object.defineProperty(exports, 'SortAnimation', { + enumerable: true, + get: function () { + return _interopRequireDefault(_SortAnimation).default; + } +}); +Object.defineProperty(exports, 'defaultSortAnimationOptions', { + enumerable: true, + get: function () { + return _SortAnimation.defaultOptions; + } +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }), +/* 28 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _Draggable = __webpack_require__(5); + +var _Draggable2 = _interopRequireDefault(_Draggable); + +var _SortableEvent = __webpack_require__(9); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const onDragStart = Symbol('onDragStart'); +const onDragOverContainer = Symbol('onDragOverContainer'); +const onDragOver = Symbol('onDragOver'); +const onDragStop = Symbol('onDragStop'); + +/** + * Returns announcement message when a Draggable element has been sorted with another Draggable element + * or moved into a new container + * @param {SortableSortedEvent} sortableEvent + * @return {String} + */ +function onSortableSortedDefaultAnnouncement({ dragEvent }) { + const sourceText = dragEvent.source.textContent.trim() || dragEvent.source.id || 'sortable element'; + + if (dragEvent.over) { + const overText = dragEvent.over.textContent.trim() || dragEvent.over.id || 'sortable element'; + const isFollowing = dragEvent.source.compareDocumentPosition(dragEvent.over) & Node.DOCUMENT_POSITION_FOLLOWING; + + if (isFollowing) { + return `Placed ${sourceText} after ${overText}`; + } else { + return `Placed ${sourceText} before ${overText}`; + } + } else { + // need to figure out how to compute container name + return `Placed ${sourceText} into a different container`; + } +} + +/** + * @const {Object} defaultAnnouncements + * @const {Function} defaultAnnouncements['sortable:sorted'] + */ +const defaultAnnouncements = { + 'sortable:sorted': onSortableSortedDefaultAnnouncement +}; + +/** + * Sortable is built on top of Draggable and allows sorting of draggable elements. Sortable will keep + * track of the original index and emits the new index as you drag over draggable elements. + * @class Sortable + * @module Sortable + * @extends Draggable + */ +class Sortable extends _Draggable2.default { + /** + * Sortable constructor. + * @constructs Sortable + * @param {HTMLElement[]|NodeList|HTMLElement} containers - Sortable containers + * @param {Object} options - Options for Sortable + */ + constructor(containers = [], options = {}) { + super(containers, _extends({}, options, { + announcements: _extends({}, defaultAnnouncements, options.announcements || {}) + })); + + /** + * start index of source on drag start + * @property startIndex + * @type {Number} + */ + this.startIndex = null; + + /** + * start container on drag start + * @property startContainer + * @type {HTMLElement} + * @default null + */ + this.startContainer = null; + + this[onDragStart] = this[onDragStart].bind(this); + this[onDragOverContainer] = this[onDragOverContainer].bind(this); + this[onDragOver] = this[onDragOver].bind(this); + this[onDragStop] = this[onDragStop].bind(this); + + this.on('drag:start', this[onDragStart]).on('drag:over:container', this[onDragOverContainer]).on('drag:over', this[onDragOver]).on('drag:stop', this[onDragStop]); + } + + /** + * Destroys Sortable instance. + */ + destroy() { + super.destroy(); + + this.off('drag:start', this[onDragStart]).off('drag:over:container', this[onDragOverContainer]).off('drag:over', this[onDragOver]).off('drag:stop', this[onDragStop]); + } + + /** + * Returns true index of element within its container during drag operation, i.e. excluding mirror and original source + * @param {HTMLElement} element - An element + * @return {Number} + */ + index(element) { + return this.getSortableElementsForContainer(element.parentNode).indexOf(element); + } + + /** + * Returns sortable elements for a given container, excluding the mirror and + * original source element if present + * @param {HTMLElement} container + * @return {HTMLElement[]} + */ + getSortableElementsForContainer(container) { + const allSortableElements = container.querySelectorAll(this.options.draggable); + + return [...allSortableElements].filter(childElement => { + return childElement !== this.originalSource && childElement !== this.mirror && childElement.parentNode === container; + }); + } + + /** + * Drag start handler + * @private + * @param {DragStartEvent} event - Drag start event + */ + [onDragStart](event) { + this.startContainer = event.source.parentNode; + this.startIndex = this.index(event.source); + + const sortableStartEvent = new _SortableEvent.SortableStartEvent({ + dragEvent: event, + startIndex: this.startIndex, + startContainer: this.startContainer + }); + + this.trigger(sortableStartEvent); + + if (sortableStartEvent.canceled()) { + event.cancel(); + } + } + + /** + * Drag over container handler + * @private + * @param {DragOverContainerEvent} event - Drag over container event + */ + [onDragOverContainer](event) { + if (event.canceled()) { + return; + } + + const { source, over, overContainer } = event; + const oldIndex = this.index(source); + + const sortableSortEvent = new _SortableEvent.SortableSortEvent({ + dragEvent: event, + currentIndex: oldIndex, + source, + over + }); + + this.trigger(sortableSortEvent); + + if (sortableSortEvent.canceled()) { + return; + } + + const children = this.getSortableElementsForContainer(overContainer); + const moves = move({ source, over, overContainer, children }); + + if (!moves) { + return; + } + + const { oldContainer, newContainer } = moves; + const newIndex = this.index(event.source); + + const sortableSortedEvent = new _SortableEvent.SortableSortedEvent({ + dragEvent: event, + oldIndex, + newIndex, + oldContainer, + newContainer + }); + + this.trigger(sortableSortedEvent); + } + + /** + * Drag over handler + * @private + * @param {DragOverEvent} event - Drag over event + */ + [onDragOver](event) { + if (event.over === event.originalSource || event.over === event.source) { + return; + } + + const { source, over, overContainer } = event; + const oldIndex = this.index(source); + + const sortableSortEvent = new _SortableEvent.SortableSortEvent({ + dragEvent: event, + currentIndex: oldIndex, + source, + over + }); + + this.trigger(sortableSortEvent); + + if (sortableSortEvent.canceled()) { + return; + } + + const children = this.getDraggableElementsForContainer(overContainer); + const moves = move({ source, over, overContainer, children }); + + if (!moves) { + return; + } + + const { oldContainer, newContainer } = moves; + const newIndex = this.index(source); + + const sortableSortedEvent = new _SortableEvent.SortableSortedEvent({ + dragEvent: event, + oldIndex, + newIndex, + oldContainer, + newContainer + }); + + this.trigger(sortableSortedEvent); + } + + /** + * Drag stop handler + * @private + * @param {DragStopEvent} event - Drag stop event + */ + [onDragStop](event) { + const sortableStopEvent = new _SortableEvent.SortableStopEvent({ + dragEvent: event, + oldIndex: this.startIndex, + newIndex: this.index(event.source), + oldContainer: this.startContainer, + newContainer: event.source.parentNode + }); + + this.trigger(sortableStopEvent); + + this.startIndex = null; + this.startContainer = null; + } +} + +exports.default = Sortable; +function index(element) { + return Array.prototype.indexOf.call(element.parentNode.children, element); +} + +function move({ source, over, overContainer, children }) { + const emptyOverContainer = !children.length; + const differentContainer = source.parentNode !== overContainer; + const sameContainer = over && source.parentNode === over.parentNode; + + if (emptyOverContainer) { + return moveInsideEmptyContainer(source, overContainer); + } else if (sameContainer) { + return moveWithinContainer(source, over); + } else if (differentContainer) { + return moveOutsideContainer(source, over, overContainer); + } else { + return null; + } +} + +function moveInsideEmptyContainer(source, overContainer) { + const oldContainer = source.parentNode; + + overContainer.appendChild(source); + + return { oldContainer, newContainer: overContainer }; +} + +function moveWithinContainer(source, over) { + const oldIndex = index(source); + const newIndex = index(over); + + if (oldIndex < newIndex) { + source.parentNode.insertBefore(source, over.nextElementSibling); + } else { + source.parentNode.insertBefore(source, over); + } + + return { oldContainer: source.parentNode, newContainer: source.parentNode }; +} + +function moveOutsideContainer(source, over, overContainer) { + const oldContainer = source.parentNode; + + if (over) { + over.parentNode.insertBefore(source, over); + } else { + // need to figure out proper position + overContainer.appendChild(source); + } + + return { oldContainer, newContainer: source.parentNode }; +} + +/***/ }), +/* 29 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.SortableStopEvent = exports.SortableSortedEvent = exports.SortableSortEvent = exports.SortableStartEvent = exports.SortableEvent = undefined; + +var _AbstractEvent = __webpack_require__(1); + +var _AbstractEvent2 = _interopRequireDefault(_AbstractEvent); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Base sortable event + * @class SortableEvent + * @module SortableEvent + * @extends AbstractEvent + */ +class SortableEvent extends _AbstractEvent2.default { + + /** + * Original drag event that triggered this sortable event + * @property dragEvent + * @type {DragEvent} + * @readonly + */ + get dragEvent() { + return this.data.dragEvent; + } +} + +exports.SortableEvent = SortableEvent; /** + * Sortable start event + * @class SortableStartEvent + * @module SortableStartEvent + * @extends SortableEvent + */ + +SortableEvent.type = 'sortable'; +class SortableStartEvent extends SortableEvent { + + /** + * Start index of source on sortable start + * @property startIndex + * @type {Number} + * @readonly + */ + get startIndex() { + return this.data.startIndex; + } + + /** + * Start container on sortable start + * @property startContainer + * @type {HTMLElement} + * @readonly + */ + get startContainer() { + return this.data.startContainer; + } +} + +exports.SortableStartEvent = SortableStartEvent; /** + * Sortable sort event + * @class SortableSortEvent + * @module SortableSortEvent + * @extends SortableEvent + */ + +SortableStartEvent.type = 'sortable:start'; +SortableStartEvent.cancelable = true; +class SortableSortEvent extends SortableEvent { + + /** + * Index of current draggable element + * @property currentIndex + * @type {Number} + * @readonly + */ + get currentIndex() { + return this.data.currentIndex; + } + + /** + * Draggable element you are hovering over + * @property over + * @type {HTMLElement} + * @readonly + */ + get over() { + return this.data.over; + } + + /** + * Draggable container element you are hovering over + * @property overContainer + * @type {HTMLElement} + * @readonly + */ + get overContainer() { + return this.data.dragEvent.overContainer; + } +} + +exports.SortableSortEvent = SortableSortEvent; /** + * Sortable sorted event + * @class SortableSortedEvent + * @module SortableSortedEvent + * @extends SortableEvent + */ + +SortableSortEvent.type = 'sortable:sort'; +SortableSortEvent.cancelable = true; +class SortableSortedEvent extends SortableEvent { + + /** + * Index of last sorted event + * @property oldIndex + * @type {Number} + * @readonly + */ + get oldIndex() { + return this.data.oldIndex; + } + + /** + * New index of this sorted event + * @property newIndex + * @type {Number} + * @readonly + */ + get newIndex() { + return this.data.newIndex; + } + + /** + * Old container of draggable element + * @property oldContainer + * @type {HTMLElement} + * @readonly + */ + get oldContainer() { + return this.data.oldContainer; + } + + /** + * New container of draggable element + * @property newContainer + * @type {HTMLElement} + * @readonly + */ + get newContainer() { + return this.data.newContainer; + } +} + +exports.SortableSortedEvent = SortableSortedEvent; /** + * Sortable stop event + * @class SortableStopEvent + * @module SortableStopEvent + * @extends SortableEvent + */ + +SortableSortedEvent.type = 'sortable:sorted'; +class SortableStopEvent extends SortableEvent { + + /** + * Original index on sortable start + * @property oldIndex + * @type {Number} + * @readonly + */ + get oldIndex() { + return this.data.oldIndex; + } + + /** + * New index of draggable element + * @property newIndex + * @type {Number} + * @readonly + */ + get newIndex() { + return this.data.newIndex; + } + + /** + * Original container of draggable element + * @property oldContainer + * @type {HTMLElement} + * @readonly + */ + get oldContainer() { + return this.data.oldContainer; + } + + /** + * New container of draggable element + * @property newContainer + * @type {HTMLElement} + * @readonly + */ + get newContainer() { + return this.data.newContainer; + } +} +exports.SortableStopEvent = SortableStopEvent; +SortableStopEvent.type = 'sortable:stop'; + +/***/ }), +/* 30 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _SortableEvent = __webpack_require__(9); + +Object.keys(_SortableEvent).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _SortableEvent[key]; + } + }); +}); + +var _Sortable = __webpack_require__(28); + +var _Sortable2 = _interopRequireDefault(_Sortable); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _Sortable2.default; + +/***/ }), +/* 31 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _Draggable = __webpack_require__(5); + +var _Draggable2 = _interopRequireDefault(_Draggable); + +var _SwappableEvent = __webpack_require__(10); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const onDragStart = Symbol('onDragStart'); +const onDragOver = Symbol('onDragOver'); +const onDragStop = Symbol('onDragStop'); + +/** + * Returns an announcement message when the Draggable element is swapped with another draggable element + * @param {SwappableSwappedEvent} swappableEvent + * @return {String} + */ +function onSwappableSwappedDefaultAnnouncement({ dragEvent, swappedElement }) { + const sourceText = dragEvent.source.textContent.trim() || dragEvent.source.id || 'swappable element'; + const overText = swappedElement.textContent.trim() || swappedElement.id || 'swappable element'; + + return `Swapped ${sourceText} with ${overText}`; +} + +/** + * @const {Object} defaultAnnouncements + * @const {Function} defaultAnnouncements['swappabled:swapped'] + */ +const defaultAnnouncements = { + 'swappabled:swapped': onSwappableSwappedDefaultAnnouncement +}; + +/** + * Swappable is built on top of Draggable and allows swapping of draggable elements. + * Order is irrelevant to Swappable. + * @class Swappable + * @module Swappable + * @extends Draggable + */ +class Swappable extends _Draggable2.default { + /** + * Swappable constructor. + * @constructs Swappable + * @param {HTMLElement[]|NodeList|HTMLElement} containers - Swappable containers + * @param {Object} options - Options for Swappable + */ + constructor(containers = [], options = {}) { + super(containers, _extends({}, options, { + announcements: _extends({}, defaultAnnouncements, options.announcements || {}) + })); + + /** + * Last draggable element that was dragged over + * @property lastOver + * @type {HTMLElement} + */ + this.lastOver = null; + + this[onDragStart] = this[onDragStart].bind(this); + this[onDragOver] = this[onDragOver].bind(this); + this[onDragStop] = this[onDragStop].bind(this); + + this.on('drag:start', this[onDragStart]).on('drag:over', this[onDragOver]).on('drag:stop', this[onDragStop]); + } + + /** + * Destroys Swappable instance. + */ + destroy() { + super.destroy(); + + this.off('drag:start', this._onDragStart).off('drag:over', this._onDragOver).off('drag:stop', this._onDragStop); + } + + /** + * Drag start handler + * @private + * @param {DragStartEvent} event - Drag start event + */ + [onDragStart](event) { + const swappableStartEvent = new _SwappableEvent.SwappableStartEvent({ + dragEvent: event + }); + + this.trigger(swappableStartEvent); + + if (swappableStartEvent.canceled()) { + event.cancel(); + } + } + + /** + * Drag over handler + * @private + * @param {DragOverEvent} event - Drag over event + */ + [onDragOver](event) { + if (event.over === event.originalSource || event.over === event.source || event.canceled()) { + return; + } + + const swappableSwapEvent = new _SwappableEvent.SwappableSwapEvent({ + dragEvent: event, + over: event.over, + overContainer: event.overContainer + }); + + this.trigger(swappableSwapEvent); + + if (swappableSwapEvent.canceled()) { + return; + } + + // swap originally swapped element back + if (this.lastOver && this.lastOver !== event.over) { + swap(this.lastOver, event.source); + } + + if (this.lastOver === event.over) { + this.lastOver = null; + } else { + this.lastOver = event.over; + } + + swap(event.source, event.over); + + const swappableSwappedEvent = new _SwappableEvent.SwappableSwappedEvent({ + dragEvent: event, + swappedElement: event.over + }); + + this.trigger(swappableSwappedEvent); + } + + /** + * Drag stop handler + * @private + * @param {DragStopEvent} event - Drag stop event + */ + [onDragStop](event) { + const swappableStopEvent = new _SwappableEvent.SwappableStopEvent({ + dragEvent: event + }); + + this.trigger(swappableStopEvent); + this.lastOver = null; + } +} + +exports.default = Swappable; +function withTempElement(callback) { + const tmpElement = document.createElement('div'); + callback(tmpElement); + tmpElement.parentNode.removeChild(tmpElement); +} + +function swap(source, over) { + const overParent = over.parentNode; + const sourceParent = source.parentNode; + + withTempElement(tmpElement => { + sourceParent.insertBefore(tmpElement, source); + overParent.insertBefore(source, over); + sourceParent.insertBefore(over, tmpElement); + }); +} + +/***/ }), +/* 32 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.SwappableStopEvent = exports.SwappableSwappedEvent = exports.SwappableSwapEvent = exports.SwappableStartEvent = exports.SwappableEvent = undefined; + +var _AbstractEvent = __webpack_require__(1); + +var _AbstractEvent2 = _interopRequireDefault(_AbstractEvent); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Base swappable event + * @class SwappableEvent + * @module SwappableEvent + * @extends AbstractEvent + */ +class SwappableEvent extends _AbstractEvent2.default { + + /** + * Original drag event that triggered this swappable event + * @property dragEvent + * @type {DragEvent} + * @readonly + */ + get dragEvent() { + return this.data.dragEvent; + } +} + +exports.SwappableEvent = SwappableEvent; /** + * Swappable start event + * @class SwappableStartEvent + * @module SwappableStartEvent + * @extends SwappableEvent + */ + +SwappableEvent.type = 'swappable'; +class SwappableStartEvent extends SwappableEvent {} + +exports.SwappableStartEvent = SwappableStartEvent; /** + * Swappable swap event + * @class SwappableSwapEvent + * @module SwappableSwapEvent + * @extends SwappableEvent + */ + +SwappableStartEvent.type = 'swappable:start'; +SwappableStartEvent.cancelable = true; +class SwappableSwapEvent extends SwappableEvent { + + /** + * Draggable element you are over + * @property over + * @type {HTMLElement} + * @readonly + */ + get over() { + return this.data.over; + } + + /** + * Draggable container you are over + * @property overContainer + * @type {HTMLElement} + * @readonly + */ + get overContainer() { + return this.data.overContainer; + } +} + +exports.SwappableSwapEvent = SwappableSwapEvent; /** + * Swappable swapped event + * @class SwappableSwappedEvent + * @module SwappableSwappedEvent + * @extends SwappableEvent + */ + +SwappableSwapEvent.type = 'swappable:swap'; +SwappableSwapEvent.cancelable = true; +class SwappableSwappedEvent extends SwappableEvent { + + /** + * The draggable element that you swapped with + * @property swappedElement + * @type {HTMLElement} + * @readonly + */ + get swappedElement() { + return this.data.swappedElement; + } +} + +exports.SwappableSwappedEvent = SwappableSwappedEvent; /** + * Swappable stop event + * @class SwappableStopEvent + * @module SwappableStopEvent + * @extends SwappableEvent + */ + +SwappableSwappedEvent.type = 'swappable:swapped'; +class SwappableStopEvent extends SwappableEvent {} +exports.SwappableStopEvent = SwappableStopEvent; +SwappableStopEvent.type = 'swappable:stop'; + +/***/ }), +/* 33 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _SwappableEvent = __webpack_require__(10); + +Object.keys(_SwappableEvent).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _SwappableEvent[key]; + } + }); +}); + +var _Swappable = __webpack_require__(31); + +var _Swappable2 = _interopRequireDefault(_Swappable); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _Swappable2.default; + +/***/ }), +/* 34 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _utils = __webpack_require__(2); + +var _Draggable = __webpack_require__(5); + +var _Draggable2 = _interopRequireDefault(_Draggable); + +var _DroppableEvent = __webpack_require__(11); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const onDragStart = Symbol('onDragStart'); +const onDragMove = Symbol('onDragMove'); +const onDragStop = Symbol('onDragStop'); +const dropInDropzone = Symbol('dropInDropZone'); +const returnToOriginalDropzone = Symbol('returnToOriginalDropzone'); +const closestDropzone = Symbol('closestDropzone'); +const getDropzones = Symbol('getDropzones'); + +/** + * Returns an announcement message when the Draggable element is dropped into a dropzone element + * @param {DroppableDroppedEvent} droppableEvent + * @return {String} + */ +function onDroppableDroppedDefaultAnnouncement({ dragEvent, dropzone }) { + const sourceText = dragEvent.source.textContent.trim() || dragEvent.source.id || 'draggable element'; + const dropzoneText = dropzone.textContent.trim() || dropzone.id || 'droppable element'; + + return `Dropped ${sourceText} into ${dropzoneText}`; +} + +/** + * Returns an announcement message when the Draggable element has returned to its original dropzone element + * @param {DroppableReturnedEvent} droppableEvent + * @return {String} + */ +function onDroppableReturnedDefaultAnnouncement({ dragEvent, dropzone }) { + const sourceText = dragEvent.source.textContent.trim() || dragEvent.source.id || 'draggable element'; + const dropzoneText = dropzone.textContent.trim() || dropzone.id || 'droppable element'; + + return `Returned ${sourceText} from ${dropzoneText}`; +} + +/** + * @const {Object} defaultAnnouncements + * @const {Function} defaultAnnouncements['droppable:dropped'] + * @const {Function} defaultAnnouncements['droppable:returned'] + */ +const defaultAnnouncements = { + 'droppable:dropped': onDroppableDroppedDefaultAnnouncement, + 'droppable:returned': onDroppableReturnedDefaultAnnouncement +}; + +const defaultClasses = { + 'droppable:active': 'draggable-dropzone--active', + 'droppable:occupied': 'draggable-dropzone--occupied' +}; + +const defaultOptions = { + dropzone: '.draggable-droppable' +}; + +/** + * Droppable is built on top of Draggable and allows dropping draggable elements + * into dropzone element + * @class Droppable + * @module Droppable + * @extends Draggable + */ +class Droppable extends _Draggable2.default { + /** + * Droppable constructor. + * @constructs Droppable + * @param {HTMLElement[]|NodeList|HTMLElement} containers - Droppable containers + * @param {Object} options - Options for Droppable + */ + constructor(containers = [], options = {}) { + super(containers, _extends({}, defaultOptions, options, { + classes: _extends({}, defaultClasses, options.classes || {}), + announcements: _extends({}, defaultAnnouncements, options.announcements || {}) + })); + + /** + * All dropzone elements on drag start + * @property dropzones + * @type {HTMLElement[]} + */ + this.dropzones = null; + + /** + * Last dropzone element that the source was dropped into + * @property lastDropzone + * @type {HTMLElement} + */ + this.lastDropzone = null; + + /** + * Initial dropzone element that the source was drag from + * @property initialDropzone + * @type {HTMLElement} + */ + this.initialDropzone = null; + + this[onDragStart] = this[onDragStart].bind(this); + this[onDragMove] = this[onDragMove].bind(this); + this[onDragStop] = this[onDragStop].bind(this); + + this.on('drag:start', this[onDragStart]).on('drag:move', this[onDragMove]).on('drag:stop', this[onDragStop]); + } + + /** + * Destroys Droppable instance. + */ + destroy() { + super.destroy(); + + this.off('drag:start', this[onDragStart]).off('drag:move', this[onDragMove]).off('drag:stop', this[onDragStop]); + } + + /** + * Drag start handler + * @private + * @param {DragStartEvent} event - Drag start event + */ + [onDragStart](event) { + if (event.canceled()) { + return; + } + + this.dropzones = [...this[getDropzones]()]; + const dropzone = (0, _utils.closest)(event.sensorEvent.target, this.options.dropzone); + + if (!dropzone) { + event.cancel(); + return; + } + + const droppableStartEvent = new _DroppableEvent.DroppableStartEvent({ + dragEvent: event, + dropzone + }); + + this.trigger(droppableStartEvent); + + if (droppableStartEvent.canceled()) { + event.cancel(); + return; + } + + this.initialDropzone = dropzone; + + for (const dropzoneElement of this.dropzones) { + if (dropzoneElement.classList.contains(this.getClassNameFor('droppable:occupied'))) { + continue; + } + + dropzoneElement.classList.add(...this.getClassNamesFor('droppable:active')); + } + } + + /** + * Drag move handler + * @private + * @param {DragMoveEvent} event - Drag move event + */ + [onDragMove](event) { + if (event.canceled()) { + return; + } + + const dropzone = this[closestDropzone](event.sensorEvent.target); + const overEmptyDropzone = dropzone && !dropzone.classList.contains(this.getClassNameFor('droppable:occupied')); + + if (overEmptyDropzone && this[dropInDropzone](event, dropzone)) { + this.lastDropzone = dropzone; + } else if ((!dropzone || dropzone === this.initialDropzone) && this.lastDropzone) { + this[returnToOriginalDropzone](event); + this.lastDropzone = null; + } + } + + /** + * Drag stop handler + * @private + * @param {DragStopEvent} event - Drag stop event + */ + [onDragStop](event) { + const droppableStopEvent = new _DroppableEvent.DroppableStopEvent({ + dragEvent: event, + dropzone: this.lastDropzone || this.initialDropzone + }); + + this.trigger(droppableStopEvent); + + const occupiedClasses = this.getClassNamesFor('droppable:occupied'); + + for (const dropzone of this.dropzones) { + dropzone.classList.remove(...this.getClassNamesFor('droppable:active')); + } + + if (this.lastDropzone && this.lastDropzone !== this.initialDropzone) { + this.initialDropzone.classList.remove(...occupiedClasses); + } + + this.dropzones = null; + this.lastDropzone = null; + this.initialDropzone = null; + } + + /** + * Drops a draggable element into a dropzone element + * @private + * @param {DragMoveEvent} event - Drag move event + * @param {HTMLElement} dropzone - Dropzone element to drop draggable into + */ + [dropInDropzone](event, dropzone) { + const droppableDroppedEvent = new _DroppableEvent.DroppableDroppedEvent({ + dragEvent: event, + dropzone + }); + + this.trigger(droppableDroppedEvent); + + if (droppableDroppedEvent.canceled()) { + return false; + } + + const occupiedClasses = this.getClassNamesFor('droppable:occupied'); + + if (this.lastDropzone) { + this.lastDropzone.classList.remove(...occupiedClasses); + } + + dropzone.appendChild(event.source); + dropzone.classList.add(...occupiedClasses); + + return true; + } + + /** + * Moves the previously dropped element back into its original dropzone + * @private + * @param {DragMoveEvent} event - Drag move event + */ + [returnToOriginalDropzone](event) { + const droppableReturnedEvent = new _DroppableEvent.DroppableReturnedEvent({ + dragEvent: event, + dropzone: this.lastDropzone + }); + + this.trigger(droppableReturnedEvent); + + if (droppableReturnedEvent.canceled()) { + return; + } + + this.initialDropzone.appendChild(event.source); + this.lastDropzone.classList.remove(...this.getClassNamesFor('droppable:occupied')); + } + + /** + * Returns closest dropzone element for even target + * @private + * @param {HTMLElement} target - Event target + * @return {HTMLElement|null} + */ + [closestDropzone](target) { + if (!this.dropzones) { + return null; + } + + return (0, _utils.closest)(target, this.dropzones); + } + + /** + * Returns all current dropzone elements for this draggable instance + * @private + * @return {NodeList|HTMLElement[]|Array} + */ + [getDropzones]() { + const dropzone = this.options.dropzone; + + if (typeof dropzone === 'string') { + return document.querySelectorAll(dropzone); + } else if (dropzone instanceof NodeList || dropzone instanceof Array) { + return dropzone; + } else if (typeof dropzone === 'function') { + return dropzone(); + } else { + return []; + } + } +} +exports.default = Droppable; + +/***/ }), +/* 35 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.DroppableStopEvent = exports.DroppableReturnedEvent = exports.DroppableDroppedEvent = exports.DroppableStartEvent = exports.DroppableEvent = undefined; + +var _AbstractEvent = __webpack_require__(1); + +var _AbstractEvent2 = _interopRequireDefault(_AbstractEvent); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Base droppable event + * @class DroppableEvent + * @module DroppableEvent + * @extends AbstractEvent + */ +class DroppableEvent extends _AbstractEvent2.default { + + /** + * Original drag event that triggered this droppable event + * @property dragEvent + * @type {DragEvent} + * @readonly + */ + get dragEvent() { + return this.data.dragEvent; + } +} + +exports.DroppableEvent = DroppableEvent; /** + * Droppable start event + * @class DroppableStartEvent + * @module DroppableStartEvent + * @extends DroppableEvent + */ + +DroppableEvent.type = 'droppable'; +class DroppableStartEvent extends DroppableEvent { + + /** + * The initial dropzone element of the currently dragging draggable element + * @property dropzone + * @type {HTMLElement} + * @readonly + */ + get dropzone() { + return this.data.dropzone; + } +} + +exports.DroppableStartEvent = DroppableStartEvent; /** + * Droppable dropped event + * @class DroppableDroppedEvent + * @module DroppableDroppedEvent + * @extends DroppableEvent + */ + +DroppableStartEvent.type = 'droppable:start'; +DroppableStartEvent.cancelable = true; +class DroppableDroppedEvent extends DroppableEvent { + + /** + * The dropzone element you dropped the draggable element into + * @property dropzone + * @type {HTMLElement} + * @readonly + */ + get dropzone() { + return this.data.dropzone; + } +} + +exports.DroppableDroppedEvent = DroppableDroppedEvent; /** + * Droppable returned event + * @class DroppableReturnedEvent + * @module DroppableReturnedEvent + * @extends DroppableEvent + */ + +DroppableDroppedEvent.type = 'droppable:dropped'; +DroppableDroppedEvent.cancelable = true; +class DroppableReturnedEvent extends DroppableEvent { + + /** + * The dropzone element you dragged away from + * @property dropzone + * @type {HTMLElement} + * @readonly + */ + get dropzone() { + return this.data.dropzone; + } +} + +exports.DroppableReturnedEvent = DroppableReturnedEvent; /** + * Droppable stop event + * @class DroppableStopEvent + * @module DroppableStopEvent + * @extends DroppableEvent + */ + +DroppableReturnedEvent.type = 'droppable:returned'; +DroppableReturnedEvent.cancelable = true; +class DroppableStopEvent extends DroppableEvent { + + /** + * The final dropzone element of the draggable element + * @property dropzone + * @type {HTMLElement} + * @readonly + */ + get dropzone() { + return this.data.dropzone; + } +} +exports.DroppableStopEvent = DroppableStopEvent; +DroppableStopEvent.type = 'droppable:stop'; +DroppableStopEvent.cancelable = true; + +/***/ }), +/* 36 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _DroppableEvent = __webpack_require__(11); + +Object.keys(_DroppableEvent).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _DroppableEvent[key]; + } + }); +}); + +var _Droppable = __webpack_require__(34); + +var _Droppable2 = _interopRequireDefault(_Droppable); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _Droppable2.default; + +/***/ }), +/* 37 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +/** + * The Emitter is a simple emitter class that provides you with `on()`, `off()` and `trigger()` methods + * @class Emitter + * @module Emitter + */ +class Emitter { + constructor() { + this.callbacks = {}; + } + + /** + * Registers callbacks by event name + * @param {String} type + * @param {...Function} callbacks + */ + on(type, ...callbacks) { + if (!this.callbacks[type]) { + this.callbacks[type] = []; + } + + this.callbacks[type].push(...callbacks); + + return this; + } + + /** + * Unregisters callbacks by event name + * @param {String} type + * @param {Function} callback + */ + off(type, callback) { + if (!this.callbacks[type]) { + return null; + } + + const copy = this.callbacks[type].slice(0); + + for (let i = 0; i < copy.length; i++) { + if (callback === copy[i]) { + this.callbacks[type].splice(i, 1); + } + } + + return this; + } + + /** + * Triggers event callbacks by event object + * @param {AbstractEvent} event + */ + trigger(event) { + if (!this.callbacks[event.type]) { + return null; + } + + const callbacks = [...this.callbacks[event.type]]; + const caughtErrors = []; + + for (let i = callbacks.length - 1; i >= 0; i--) { + const callback = callbacks[i]; + + try { + callback(event); + } catch (error) { + caughtErrors.push(error); + } + } + + if (caughtErrors.length) { + /* eslint-disable no-console */ + console.error(`Draggable caught errors while triggering '${event.type}'`, caughtErrors); + /* eslint-disable no-console */ + } + + return this; + } +} +exports.default = Emitter; + +/***/ }), +/* 38 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _Emitter = __webpack_require__(37); + +var _Emitter2 = _interopRequireDefault(_Emitter); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _Emitter2.default; + +/***/ }), +/* 39 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.defaultOptions = undefined; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _utils = __webpack_require__(2); + +var _Plugins = __webpack_require__(12); + +var _Emitter = __webpack_require__(38); + +var _Emitter2 = _interopRequireDefault(_Emitter); + +var _Sensors = __webpack_require__(6); + +var _DraggableEvent = __webpack_require__(13); + +var _DragEvent = __webpack_require__(14); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const onDragStart = Symbol('onDragStart'); +const onDragMove = Symbol('onDragMove'); +const onDragStop = Symbol('onDragStop'); +const onDragPressure = Symbol('onDragPressure'); + +/** + * @const {Object} defaultAnnouncements + * @const {Function} defaultAnnouncements['drag:start'] + * @const {Function} defaultAnnouncements['drag:stop'] + */ +const defaultAnnouncements = { + 'drag:start': event => `Picked up ${event.source.textContent.trim() || event.source.id || 'draggable element'}`, + 'drag:stop': event => `Released ${event.source.textContent.trim() || event.source.id || 'draggable element'}` +}; + +const defaultClasses = { + 'container:dragging': 'draggable-container--is-dragging', + 'source:dragging': 'draggable-source--is-dragging', + 'source:placed': 'draggable-source--placed', + 'container:placed': 'draggable-container--placed', + 'body:dragging': 'draggable--is-dragging', + 'draggable:over': 'draggable--over', + 'container:over': 'draggable-container--over', + 'source:original': 'draggable--original', + mirror: 'draggable-mirror' +}; + +const defaultOptions = exports.defaultOptions = { + draggable: '.draggable-source', + handle: null, + delay: {}, + distance: 0, + placedTimeout: 800, + plugins: [], + sensors: [], + exclude: { + plugins: [], + sensors: [] + } +}; + +/** + * This is the core draggable library that does the heavy lifting + * @class Draggable + * @module Draggable + */ +class Draggable { + + /** + * Draggable constructor. + * @constructs Draggable + * @param {HTMLElement[]|NodeList|HTMLElement} containers - Draggable containers + * @param {Object} options - Options for draggable + */ + + /** + * Default plugins draggable uses + * @static + * @property {Object} Plugins + * @property {Announcement} Plugins.Announcement + * @property {Focusable} Plugins.Focusable + * @property {Mirror} Plugins.Mirror + * @property {Scrollable} Plugins.Scrollable + * @type {Object} + */ + constructor(containers = [document.body], options = {}) { + /** + * Draggable containers + * @property containers + * @type {HTMLElement[]} + */ + if (containers instanceof NodeList || containers instanceof Array) { + this.containers = [...containers]; + } else if (containers instanceof HTMLElement) { + this.containers = [containers]; + } else { + throw new Error('Draggable containers are expected to be of type `NodeList`, `HTMLElement[]` or `HTMLElement`'); + } + + this.options = _extends({}, defaultOptions, options, { + classes: _extends({}, defaultClasses, options.classes || {}), + announcements: _extends({}, defaultAnnouncements, options.announcements || {}), + exclude: { + plugins: options.exclude && options.exclude.plugins || [], + sensors: options.exclude && options.exclude.sensors || [] + } + }); + + /** + * Draggables event emitter + * @property emitter + * @type {Emitter} + */ + this.emitter = new _Emitter2.default(); + + /** + * Current drag state + * @property dragging + * @type {Boolean} + */ + this.dragging = false; + + /** + * Active plugins + * @property plugins + * @type {Plugin[]} + */ + this.plugins = []; + + /** + * Active sensors + * @property sensors + * @type {Sensor[]} + */ + this.sensors = []; + + this[onDragStart] = this[onDragStart].bind(this); + this[onDragMove] = this[onDragMove].bind(this); + this[onDragStop] = this[onDragStop].bind(this); + this[onDragPressure] = this[onDragPressure].bind(this); + + document.addEventListener('drag:start', this[onDragStart], true); + document.addEventListener('drag:move', this[onDragMove], true); + document.addEventListener('drag:stop', this[onDragStop], true); + document.addEventListener('drag:pressure', this[onDragPressure], true); + + const defaultPlugins = Object.values(Draggable.Plugins).filter(Plugin => !this.options.exclude.plugins.includes(Plugin)); + const defaultSensors = Object.values(Draggable.Sensors).filter(sensor => !this.options.exclude.sensors.includes(sensor)); + + this.addPlugin(...[...defaultPlugins, ...this.options.plugins]); + this.addSensor(...[...defaultSensors, ...this.options.sensors]); + + const draggableInitializedEvent = new _DraggableEvent.DraggableInitializedEvent({ + draggable: this + }); + + this.on('mirror:created', ({ mirror }) => this.mirror = mirror); + this.on('mirror:destroy', () => this.mirror = null); + + this.trigger(draggableInitializedEvent); + } + + /** + * Destroys Draggable instance. This removes all internal event listeners and + * deactivates sensors and plugins + */ + + + /** + * Default sensors draggable uses + * @static + * @property {Object} Sensors + * @property {MouseSensor} Sensors.MouseSensor + * @property {TouchSensor} Sensors.TouchSensor + * @type {Object} + */ + destroy() { + document.removeEventListener('drag:start', this[onDragStart], true); + document.removeEventListener('drag:move', this[onDragMove], true); + document.removeEventListener('drag:stop', this[onDragStop], true); + document.removeEventListener('drag:pressure', this[onDragPressure], true); + + const draggableDestroyEvent = new _DraggableEvent.DraggableDestroyEvent({ + draggable: this + }); + + this.trigger(draggableDestroyEvent); + + this.removePlugin(...this.plugins.map(plugin => plugin.constructor)); + this.removeSensor(...this.sensors.map(sensor => sensor.constructor)); + } + + /** + * Adds plugin to this draggable instance. This will end up calling the attach method of the plugin + * @param {...typeof Plugin} plugins - Plugins that you want attached to draggable + * @return {Draggable} + * @example draggable.addPlugin(CustomA11yPlugin, CustomMirrorPlugin) + */ + addPlugin(...plugins) { + const activePlugins = plugins.map(Plugin => new Plugin(this)); + + activePlugins.forEach(plugin => plugin.attach()); + this.plugins = [...this.plugins, ...activePlugins]; + + return this; + } + + /** + * Removes plugins that are already attached to this draggable instance. This will end up calling + * the detach method of the plugin + * @param {...typeof Plugin} plugins - Plugins that you want detached from draggable + * @return {Draggable} + * @example draggable.removePlugin(MirrorPlugin, CustomMirrorPlugin) + */ + removePlugin(...plugins) { + const removedPlugins = this.plugins.filter(plugin => plugins.includes(plugin.constructor)); + + removedPlugins.forEach(plugin => plugin.detach()); + this.plugins = this.plugins.filter(plugin => !plugins.includes(plugin.constructor)); + + return this; + } + + /** + * Adds sensors to this draggable instance. This will end up calling the attach method of the sensor + * @param {...typeof Sensor} sensors - Sensors that you want attached to draggable + * @return {Draggable} + * @example draggable.addSensor(ForceTouchSensor, CustomSensor) + */ + addSensor(...sensors) { + const activeSensors = sensors.map(Sensor => new Sensor(this.containers, this.options)); + + activeSensors.forEach(sensor => sensor.attach()); + this.sensors = [...this.sensors, ...activeSensors]; + + return this; + } + + /** + * Removes sensors that are already attached to this draggable instance. This will end up calling + * the detach method of the sensor + * @param {...typeof Sensor} sensors - Sensors that you want attached to draggable + * @return {Draggable} + * @example draggable.removeSensor(TouchSensor, DragSensor) + */ + removeSensor(...sensors) { + const removedSensors = this.sensors.filter(sensor => sensors.includes(sensor.constructor)); + + removedSensors.forEach(sensor => sensor.detach()); + this.sensors = this.sensors.filter(sensor => !sensors.includes(sensor.constructor)); + + return this; + } + + /** + * Adds container to this draggable instance + * @param {...HTMLElement} containers - Containers you want to add to draggable + * @return {Draggable} + * @example draggable.addContainer(document.body) + */ + addContainer(...containers) { + this.containers = [...this.containers, ...containers]; + this.sensors.forEach(sensor => sensor.addContainer(...containers)); + return this; + } + + /** + * Removes container from this draggable instance + * @param {...HTMLElement} containers - Containers you want to remove from draggable + * @return {Draggable} + * @example draggable.removeContainer(document.body) + */ + removeContainer(...containers) { + this.containers = this.containers.filter(container => !containers.includes(container)); + this.sensors.forEach(sensor => sensor.removeContainer(...containers)); + return this; + } + + /** + * Adds listener for draggable events + * @param {String} type - Event name + * @param {...Function} callbacks - Event callbacks + * @return {Draggable} + * @example draggable.on('drag:start', (dragEvent) => dragEvent.cancel()); + */ + on(type, ...callbacks) { + this.emitter.on(type, ...callbacks); + return this; + } + + /** + * Removes listener from draggable + * @param {String} type - Event name + * @param {Function} callback - Event callback + * @return {Draggable} + * @example draggable.off('drag:start', handlerFunction); + */ + off(type, callback) { + this.emitter.off(type, callback); + return this; + } + + /** + * Triggers draggable event + * @param {AbstractEvent} event - Event instance + * @return {Draggable} + * @example draggable.trigger(event); + */ + trigger(event) { + this.emitter.trigger(event); + return this; + } + + /** + * Returns class name for class identifier + * @param {String} name - Name of class identifier + * @return {String|null} + */ + getClassNameFor(name) { + return this.getClassNamesFor(name)[0]; + } + + /** + * Returns class names for class identifier + * @return {String[]} + */ + getClassNamesFor(name) { + const classNames = this.options.classes[name]; + + if (classNames instanceof Array) { + return classNames; + } else if (typeof classNames === 'string' || classNames instanceof String) { + return [classNames]; + } else { + return []; + } + } + + /** + * Returns true if this draggable instance is currently dragging + * @return {Boolean} + */ + isDragging() { + return Boolean(this.dragging); + } + + /** + * Returns all draggable elements + * @return {HTMLElement[]} + */ + getDraggableElements() { + return this.containers.reduce((current, container) => { + return [...current, ...this.getDraggableElementsForContainer(container)]; + }, []); + } + + /** + * Returns draggable elements for a given container, excluding the mirror and + * original source element if present + * @param {HTMLElement} container + * @return {HTMLElement[]} + */ + getDraggableElementsForContainer(container) { + const allDraggableElements = container.querySelectorAll(this.options.draggable); + + return [...allDraggableElements].filter(childElement => { + return childElement !== this.originalSource && childElement !== this.mirror; + }); + } + + /** + * Drag start handler + * @private + * @param {Event} event - DOM Drag event + */ + [onDragStart](event) { + const sensorEvent = getSensorEvent(event); + const { target, container } = sensorEvent; + + if (!this.containers.includes(container)) { + return; + } + + if (this.options.handle && target && !(0, _utils.closest)(target, this.options.handle)) { + sensorEvent.cancel(); + return; + } + + // Find draggable source element + this.originalSource = (0, _utils.closest)(target, this.options.draggable); + this.sourceContainer = container; + + if (!this.originalSource) { + sensorEvent.cancel(); + return; + } + + if (this.lastPlacedSource && this.lastPlacedContainer) { + clearTimeout(this.placedTimeoutID); + this.lastPlacedSource.classList.remove(...this.getClassNamesFor('source:placed')); + this.lastPlacedContainer.classList.remove(...this.getClassNamesFor('container:placed')); + } + + this.source = this.originalSource.cloneNode(true); + this.originalSource.parentNode.insertBefore(this.source, this.originalSource); + this.originalSource.style.display = 'none'; + + const dragEvent = new _DragEvent.DragStartEvent({ + source: this.source, + originalSource: this.originalSource, + sourceContainer: container, + sensorEvent + }); + + this.trigger(dragEvent); + + this.dragging = !dragEvent.canceled(); + + if (dragEvent.canceled()) { + this.source.parentNode.removeChild(this.source); + this.originalSource.style.display = null; + return; + } + + this.originalSource.classList.add(...this.getClassNamesFor('source:original')); + this.source.classList.add(...this.getClassNamesFor('source:dragging')); + this.sourceContainer.classList.add(...this.getClassNamesFor('container:dragging')); + document.body.classList.add(...this.getClassNamesFor('body:dragging')); + applyUserSelect(document.body, 'none'); + + requestAnimationFrame(() => { + const oldSensorEvent = getSensorEvent(event); + const newSensorEvent = oldSensorEvent.clone({ target: this.source }); + + this[onDragMove](_extends({}, event, { + detail: newSensorEvent + })); + }); + } + + /** + * Drag move handler + * @private + * @param {Event} event - DOM Drag event + */ + [onDragMove](event) { + if (!this.dragging) { + return; + } + + const sensorEvent = getSensorEvent(event); + const { container } = sensorEvent; + let target = sensorEvent.target; + + const dragMoveEvent = new _DragEvent.DragMoveEvent({ + source: this.source, + originalSource: this.originalSource, + sourceContainer: container, + sensorEvent + }); + + this.trigger(dragMoveEvent); + + if (dragMoveEvent.canceled()) { + sensorEvent.cancel(); + } + + target = (0, _utils.closest)(target, this.options.draggable); + const withinCorrectContainer = (0, _utils.closest)(sensorEvent.target, this.containers); + const overContainer = sensorEvent.overContainer || withinCorrectContainer; + const isLeavingContainer = this.currentOverContainer && overContainer !== this.currentOverContainer; + const isLeavingDraggable = this.currentOver && target !== this.currentOver; + const isOverContainer = overContainer && this.currentOverContainer !== overContainer; + const isOverDraggable = withinCorrectContainer && target && this.currentOver !== target; + + if (isLeavingDraggable) { + const dragOutEvent = new _DragEvent.DragOutEvent({ + source: this.source, + originalSource: this.originalSource, + sourceContainer: container, + sensorEvent, + over: this.currentOver, + overContainer: this.currentOverContainer + }); + + this.currentOver.classList.remove(...this.getClassNamesFor('draggable:over')); + this.currentOver = null; + + this.trigger(dragOutEvent); + } + + if (isLeavingContainer) { + const dragOutContainerEvent = new _DragEvent.DragOutContainerEvent({ + source: this.source, + originalSource: this.originalSource, + sourceContainer: container, + sensorEvent, + overContainer: this.currentOverContainer + }); + + this.currentOverContainer.classList.remove(...this.getClassNamesFor('container:over')); + this.currentOverContainer = null; + + this.trigger(dragOutContainerEvent); + } + + if (isOverContainer) { + overContainer.classList.add(...this.getClassNamesFor('container:over')); + + const dragOverContainerEvent = new _DragEvent.DragOverContainerEvent({ + source: this.source, + originalSource: this.originalSource, + sourceContainer: container, + sensorEvent, + overContainer + }); + + this.currentOverContainer = overContainer; + + this.trigger(dragOverContainerEvent); + } + + if (isOverDraggable) { + target.classList.add(...this.getClassNamesFor('draggable:over')); + + const dragOverEvent = new _DragEvent.DragOverEvent({ + source: this.source, + originalSource: this.originalSource, + sourceContainer: container, + sensorEvent, + overContainer, + over: target + }); + + this.currentOver = target; + + this.trigger(dragOverEvent); + } + } + + /** + * Drag stop handler + * @private + * @param {Event} event - DOM Drag event + */ + [onDragStop](event) { + if (!this.dragging) { + return; + } + + this.dragging = false; + + const dragStopEvent = new _DragEvent.DragStopEvent({ + source: this.source, + originalSource: this.originalSource, + sensorEvent: event.sensorEvent, + sourceContainer: this.sourceContainer + }); + + this.trigger(dragStopEvent); + + this.source.parentNode.insertBefore(this.originalSource, this.source); + this.source.parentNode.removeChild(this.source); + this.originalSource.style.display = ''; + + this.source.classList.remove(...this.getClassNamesFor('source:dragging')); + this.originalSource.classList.remove(...this.getClassNamesFor('source:original')); + this.originalSource.classList.add(...this.getClassNamesFor('source:placed')); + this.sourceContainer.classList.add(...this.getClassNamesFor('container:placed')); + this.sourceContainer.classList.remove(...this.getClassNamesFor('container:dragging')); + document.body.classList.remove(...this.getClassNamesFor('body:dragging')); + applyUserSelect(document.body, ''); + + if (this.currentOver) { + this.currentOver.classList.remove(...this.getClassNamesFor('draggable:over')); + } + + if (this.currentOverContainer) { + this.currentOverContainer.classList.remove(...this.getClassNamesFor('container:over')); + } + + this.lastPlacedSource = this.originalSource; + this.lastPlacedContainer = this.sourceContainer; + + this.placedTimeoutID = setTimeout(() => { + if (this.lastPlacedSource) { + this.lastPlacedSource.classList.remove(...this.getClassNamesFor('source:placed')); + } + + if (this.lastPlacedContainer) { + this.lastPlacedContainer.classList.remove(...this.getClassNamesFor('container:placed')); + } + + this.lastPlacedSource = null; + this.lastPlacedContainer = null; + }, this.options.placedTimeout); + + const dragStoppedEvent = new _DragEvent.DragStoppedEvent({ + source: this.source, + originalSource: this.originalSource, + sensorEvent: event.sensorEvent, + sourceContainer: this.sourceContainer + }); + + this.trigger(dragStoppedEvent); + + this.source = null; + this.originalSource = null; + this.currentOverContainer = null; + this.currentOver = null; + this.sourceContainer = null; + } + + /** + * Drag pressure handler + * @private + * @param {Event} event - DOM Drag event + */ + [onDragPressure](event) { + if (!this.dragging) { + return; + } + + const sensorEvent = getSensorEvent(event); + const source = this.source || (0, _utils.closest)(sensorEvent.originalEvent.target, this.options.draggable); + + const dragPressureEvent = new _DragEvent.DragPressureEvent({ + sensorEvent, + source, + pressure: sensorEvent.pressure + }); + + this.trigger(dragPressureEvent); + } +} + +exports.default = Draggable; +Draggable.Plugins = { Announcement: _Plugins.Announcement, Focusable: _Plugins.Focusable, Mirror: _Plugins.Mirror, Scrollable: _Plugins.Scrollable }; +Draggable.Sensors = { MouseSensor: _Sensors.MouseSensor, TouchSensor: _Sensors.TouchSensor }; +function getSensorEvent(event) { + return event.detail; +} + +function applyUserSelect(element, value) { + element.style.webkitUserSelect = value; + element.style.mozUserSelect = value; + element.style.msUserSelect = value; + element.style.oUserSelect = value; + element.style.userSelect = value; +} + +/***/ }), +/* 40 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _Sensor = __webpack_require__(4); + +var _Sensor2 = _interopRequireDefault(_Sensor); + +var _SensorEvent = __webpack_require__(3); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const onMouseForceWillBegin = Symbol('onMouseForceWillBegin'); +const onMouseForceDown = Symbol('onMouseForceDown'); +const onMouseDown = Symbol('onMouseDown'); +const onMouseForceChange = Symbol('onMouseForceChange'); +const onMouseMove = Symbol('onMouseMove'); +const onMouseUp = Symbol('onMouseUp'); +const onMouseForceGlobalChange = Symbol('onMouseForceGlobalChange'); + +/** + * This sensor picks up native force touch events and dictates drag operations + * @class ForceTouchSensor + * @module ForceTouchSensor + * @extends Sensor + */ +class ForceTouchSensor extends _Sensor2.default { + /** + * ForceTouchSensor constructor. + * @constructs ForceTouchSensor + * @param {HTMLElement[]|NodeList|HTMLElement} containers - Containers + * @param {Object} options - Options + */ + constructor(containers = [], options = {}) { + super(containers, options); + + /** + * Draggable element needs to be remembered to unset the draggable attribute after drag operation has completed + * @property mightDrag + * @type {Boolean} + */ + this.mightDrag = false; + + this[onMouseForceWillBegin] = this[onMouseForceWillBegin].bind(this); + this[onMouseForceDown] = this[onMouseForceDown].bind(this); + this[onMouseDown] = this[onMouseDown].bind(this); + this[onMouseForceChange] = this[onMouseForceChange].bind(this); + this[onMouseMove] = this[onMouseMove].bind(this); + this[onMouseUp] = this[onMouseUp].bind(this); + } + + /** + * Attaches sensors event listeners to the DOM + */ + attach() { + for (const container of this.containers) { + container.addEventListener('webkitmouseforcewillbegin', this[onMouseForceWillBegin], false); + container.addEventListener('webkitmouseforcedown', this[onMouseForceDown], false); + container.addEventListener('mousedown', this[onMouseDown], true); + container.addEventListener('webkitmouseforcechanged', this[onMouseForceChange], false); + } + + document.addEventListener('mousemove', this[onMouseMove]); + document.addEventListener('mouseup', this[onMouseUp]); + } + + /** + * Detaches sensors event listeners to the DOM + */ + detach() { + for (const container of this.containers) { + container.removeEventListener('webkitmouseforcewillbegin', this[onMouseForceWillBegin], false); + container.removeEventListener('webkitmouseforcedown', this[onMouseForceDown], false); + container.removeEventListener('mousedown', this[onMouseDown], true); + container.removeEventListener('webkitmouseforcechanged', this[onMouseForceChange], false); + } + + document.removeEventListener('mousemove', this[onMouseMove]); + document.removeEventListener('mouseup', this[onMouseUp]); + } + + /** + * Mouse force will begin handler + * @private + * @param {Event} event - Mouse force will begin event + */ + [onMouseForceWillBegin](event) { + event.preventDefault(); + this.mightDrag = true; + } + + /** + * Mouse force down handler + * @private + * @param {Event} event - Mouse force down event + */ + [onMouseForceDown](event) { + if (this.dragging) { + return; + } + + const target = document.elementFromPoint(event.clientX, event.clientY); + const container = event.currentTarget; + + const dragStartEvent = new _SensorEvent.DragStartSensorEvent({ + clientX: event.clientX, + clientY: event.clientY, + target, + container, + originalEvent: event + }); + + this.trigger(container, dragStartEvent); + + this.currentContainer = container; + this.dragging = !dragStartEvent.canceled(); + this.mightDrag = false; + } + + /** + * Mouse up handler + * @private + * @param {Event} event - Mouse up event + */ + [onMouseUp](event) { + if (!this.dragging) { + return; + } + + const dragStopEvent = new _SensorEvent.DragStopSensorEvent({ + clientX: event.clientX, + clientY: event.clientY, + target: null, + container: this.currentContainer, + originalEvent: event + }); + + this.trigger(this.currentContainer, dragStopEvent); + + this.currentContainer = null; + this.dragging = false; + this.mightDrag = false; + } + + /** + * Mouse down handler + * @private + * @param {Event} event - Mouse down event + */ + [onMouseDown](event) { + if (!this.mightDrag) { + return; + } + + // Need workaround for real click + // Cancel potential drag events + event.stopPropagation(); + event.stopImmediatePropagation(); + event.preventDefault(); + } + + /** + * Mouse move handler + * @private + * @param {Event} event - Mouse force will begin event + */ + [onMouseMove](event) { + if (!this.dragging) { + return; + } + + const target = document.elementFromPoint(event.clientX, event.clientY); + + const dragMoveEvent = new _SensorEvent.DragMoveSensorEvent({ + clientX: event.clientX, + clientY: event.clientY, + target, + container: this.currentContainer, + originalEvent: event + }); + + this.trigger(this.currentContainer, dragMoveEvent); + } + + /** + * Mouse force change handler + * @private + * @param {Event} event - Mouse force change event + */ + [onMouseForceChange](event) { + if (this.dragging) { + return; + } + + const target = event.target; + const container = event.currentTarget; + + const dragPressureEvent = new _SensorEvent.DragPressureSensorEvent({ + pressure: event.webkitForce, + clientX: event.clientX, + clientY: event.clientY, + target, + container, + originalEvent: event + }); + + this.trigger(container, dragPressureEvent); + } + + /** + * Mouse force global change handler + * @private + * @param {Event} event - Mouse force global change event + */ + [onMouseForceGlobalChange](event) { + if (!this.dragging) { + return; + } + + const target = event.target; + + const dragPressureEvent = new _SensorEvent.DragPressureSensorEvent({ + pressure: event.webkitForce, + clientX: event.clientX, + clientY: event.clientY, + target, + container: this.currentContainer, + originalEvent: event + }); + + this.trigger(this.currentContainer, dragPressureEvent); + } +} +exports.default = ForceTouchSensor; + +/***/ }), +/* 41 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _ForceTouchSensor = __webpack_require__(40); + +var _ForceTouchSensor2 = _interopRequireDefault(_ForceTouchSensor); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _ForceTouchSensor2.default; + +/***/ }), +/* 42 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _utils = __webpack_require__(2); + +var _Sensor = __webpack_require__(4); + +var _Sensor2 = _interopRequireDefault(_Sensor); + +var _SensorEvent = __webpack_require__(3); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const onMouseDown = Symbol('onMouseDown'); +const onMouseUp = Symbol('onMouseUp'); +const onDragStart = Symbol('onDragStart'); +const onDragOver = Symbol('onDragOver'); +const onDragEnd = Symbol('onDragEnd'); +const onDrop = Symbol('onDrop'); +const reset = Symbol('reset'); + +/** + * This sensor picks up native browser drag events and dictates drag operations + * @class DragSensor + * @module DragSensor + * @extends Sensor + */ +class DragSensor extends _Sensor2.default { + /** + * DragSensor constructor. + * @constructs DragSensor + * @param {HTMLElement[]|NodeList|HTMLElement} containers - Containers + * @param {Object} options - Options + */ + constructor(containers = [], options = {}) { + super(containers, options); + + /** + * Mouse down timer which will end up setting the draggable attribute, unless canceled + * @property mouseDownTimeout + * @type {Number} + */ + this.mouseDownTimeout = null; + + /** + * Draggable element needs to be remembered to unset the draggable attribute after drag operation has completed + * @property draggableElement + * @type {HTMLElement} + */ + this.draggableElement = null; + + /** + * Native draggable element could be links or images, their draggable state will be disabled during drag operation + * @property nativeDraggableElement + * @type {HTMLElement} + */ + this.nativeDraggableElement = null; + + this[onMouseDown] = this[onMouseDown].bind(this); + this[onMouseUp] = this[onMouseUp].bind(this); + this[onDragStart] = this[onDragStart].bind(this); + this[onDragOver] = this[onDragOver].bind(this); + this[onDragEnd] = this[onDragEnd].bind(this); + this[onDrop] = this[onDrop].bind(this); + } + + /** + * Attaches sensors event listeners to the DOM + */ + attach() { + document.addEventListener('mousedown', this[onMouseDown], true); + } + + /** + * Detaches sensors event listeners to the DOM + */ + detach() { + document.removeEventListener('mousedown', this[onMouseDown], true); + } + + /** + * Drag start handler + * @private + * @param {Event} event - Drag start event + */ + [onDragStart](event) { + // Need for firefox. "text" key is needed for IE + event.dataTransfer.setData('text', ''); + event.dataTransfer.effectAllowed = this.options.type; + + const target = document.elementFromPoint(event.clientX, event.clientY); + this.currentContainer = (0, _utils.closest)(event.target, this.containers); + + if (!this.currentContainer) { + return; + } + + const dragStartEvent = new _SensorEvent.DragStartSensorEvent({ + clientX: event.clientX, + clientY: event.clientY, + target, + container: this.currentContainer, + originalEvent: event + }); + + // Workaround + setTimeout(() => { + this.trigger(this.currentContainer, dragStartEvent); + + if (dragStartEvent.canceled()) { + this.dragging = false; + } else { + this.dragging = true; + } + }, 0); + } + + /** + * Drag over handler + * @private + * @param {Event} event - Drag over event + */ + [onDragOver](event) { + if (!this.dragging) { + return; + } + + const target = document.elementFromPoint(event.clientX, event.clientY); + const container = this.currentContainer; + + const dragMoveEvent = new _SensorEvent.DragMoveSensorEvent({ + clientX: event.clientX, + clientY: event.clientY, + target, + container, + originalEvent: event + }); + + this.trigger(container, dragMoveEvent); + + if (!dragMoveEvent.canceled()) { + event.preventDefault(); + event.dataTransfer.dropEffect = this.options.type; + } + } + + /** + * Drag end handler + * @private + * @param {Event} event - Drag end event + */ + [onDragEnd](event) { + if (!this.dragging) { + return; + } + + document.removeEventListener('mouseup', this[onMouseUp], true); + + const target = document.elementFromPoint(event.clientX, event.clientY); + const container = this.currentContainer; + + const dragStopEvent = new _SensorEvent.DragStopSensorEvent({ + clientX: event.clientX, + clientY: event.clientY, + target, + container, + originalEvent: event + }); + + this.trigger(container, dragStopEvent); + + this.dragging = false; + this.startEvent = null; + + this[reset](); + } + + /** + * Drop handler + * @private + * @param {Event} event - Drop event + */ + [onDrop](event) { + // eslint-disable-line class-methods-use-this + event.preventDefault(); + } + + /** + * Mouse down handler + * @private + * @param {Event} event - Mouse down event + */ + [onMouseDown](event) { + // Firefox bug for inputs within draggables https://bugzilla.mozilla.org/show_bug.cgi?id=739071 + if (event.target && (event.target.form || event.target.contenteditable)) { + return; + } + + const nativeDraggableElement = (0, _utils.closest)(event.target, element => element.draggable); + + if (nativeDraggableElement) { + nativeDraggableElement.draggable = false; + this.nativeDraggableElement = nativeDraggableElement; + } + + document.addEventListener('mouseup', this[onMouseUp], true); + document.addEventListener('dragstart', this[onDragStart], false); + document.addEventListener('dragover', this[onDragOver], false); + document.addEventListener('dragend', this[onDragEnd], false); + document.addEventListener('drop', this[onDrop], false); + + const target = (0, _utils.closest)(event.target, this.options.draggable); + + if (!target) { + return; + } + + this.startEvent = event; + + this.mouseDownTimeout = setTimeout(() => { + target.draggable = true; + this.draggableElement = target; + }, this.delay.drag); + } + + /** + * Mouse up handler + * @private + * @param {Event} event - Mouse up event + */ + [onMouseUp]() { + this[reset](); + } + + /** + * Mouse up handler + * @private + * @param {Event} event - Mouse up event + */ + [reset]() { + clearTimeout(this.mouseDownTimeout); + + document.removeEventListener('mouseup', this[onMouseUp], true); + document.removeEventListener('dragstart', this[onDragStart], false); + document.removeEventListener('dragover', this[onDragOver], false); + document.removeEventListener('dragend', this[onDragEnd], false); + document.removeEventListener('drop', this[onDrop], false); + + if (this.nativeDraggableElement) { + this.nativeDraggableElement.draggable = true; + this.nativeDraggableElement = null; + } + + if (this.draggableElement) { + this.draggableElement.draggable = false; + this.draggableElement = null; + } + } +} +exports.default = DragSensor; + +/***/ }), +/* 43 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _DragSensor = __webpack_require__(42); + +var _DragSensor2 = _interopRequireDefault(_DragSensor); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _DragSensor2.default; + +/***/ }), +/* 44 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _utils = __webpack_require__(2); + +var _Sensor = __webpack_require__(4); + +var _Sensor2 = _interopRequireDefault(_Sensor); + +var _SensorEvent = __webpack_require__(3); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const onTouchStart = Symbol('onTouchStart'); +const onTouchEnd = Symbol('onTouchEnd'); +const onTouchMove = Symbol('onTouchMove'); +const startDrag = Symbol('startDrag'); +const onDistanceChange = Symbol('onDistanceChange'); + +/** + * Prevents scrolling when set to true + * @var {Boolean} preventScrolling + */ +let preventScrolling = false; + +// WebKit requires cancelable `touchmove` events to be added as early as possible +window.addEventListener('touchmove', event => { + if (!preventScrolling) { + return; + } + + // Prevent scrolling + event.preventDefault(); +}, { passive: false }); + +/** + * This sensor picks up native browser touch events and dictates drag operations + * @class TouchSensor + * @module TouchSensor + * @extends Sensor + */ +class TouchSensor extends _Sensor2.default { + /** + * TouchSensor constructor. + * @constructs TouchSensor + * @param {HTMLElement[]|NodeList|HTMLElement} containers - Containers + * @param {Object} options - Options + */ + constructor(containers = [], options = {}) { + super(containers, options); + + /** + * Closest scrollable container so accidental scroll can cancel long touch + * @property currentScrollableParent + * @type {HTMLElement} + */ + this.currentScrollableParent = null; + + /** + * TimeoutID for managing delay + * @property tapTimeout + * @type {Number} + */ + this.tapTimeout = null; + + /** + * touchMoved indicates if touch has moved during tapTimeout + * @property touchMoved + * @type {Boolean} + */ + this.touchMoved = false; + + /** + * Save pageX coordinates for delay drag + * @property {Numbre} pageX + * @private + */ + this.pageX = null; + + /** + * Save pageY coordinates for delay drag + * @property {Numbre} pageY + * @private + */ + this.pageY = null; + + this[onTouchStart] = this[onTouchStart].bind(this); + this[onTouchEnd] = this[onTouchEnd].bind(this); + this[onTouchMove] = this[onTouchMove].bind(this); + this[startDrag] = this[startDrag].bind(this); + this[onDistanceChange] = this[onDistanceChange].bind(this); + } + + /** + * Attaches sensors event listeners to the DOM + */ + attach() { + document.addEventListener('touchstart', this[onTouchStart]); + } + + /** + * Detaches sensors event listeners to the DOM + */ + detach() { + document.removeEventListener('touchstart', this[onTouchStart]); + } + + /** + * Touch start handler + * @private + * @param {Event} event - Touch start event + */ + [onTouchStart](event) { + const container = (0, _utils.closest)(event.target, this.containers); + + if (!container) { + return; + } + const { distance = 0 } = this.options; + const { delay } = this; + const { pageX, pageY } = (0, _utils.touchCoords)(event); + + Object.assign(this, { pageX, pageY }); + this.onTouchStartAt = Date.now(); + this.startEvent = event; + this.currentContainer = container; + + document.addEventListener('touchend', this[onTouchEnd]); + document.addEventListener('touchcancel', this[onTouchEnd]); + document.addEventListener('touchmove', this[onDistanceChange]); + container.addEventListener('contextmenu', onContextMenu); + + if (distance) { + preventScrolling = true; + } + + this.tapTimeout = window.setTimeout(() => { + this[onDistanceChange]({ touches: [{ pageX: this.pageX, pageY: this.pageY }] }); + }, delay.touch); + } + + /** + * Start the drag + * @private + */ + [startDrag]() { + const startEvent = this.startEvent; + const container = this.currentContainer; + const touch = (0, _utils.touchCoords)(startEvent); + + const dragStartEvent = new _SensorEvent.DragStartSensorEvent({ + clientX: touch.pageX, + clientY: touch.pageY, + target: startEvent.target, + container, + originalEvent: startEvent + }); + + this.trigger(this.currentContainer, dragStartEvent); + + this.dragging = !dragStartEvent.canceled(); + + if (this.dragging) { + document.addEventListener('touchmove', this[onTouchMove]); + } + preventScrolling = this.dragging; + } + + /** + * Touch move handler prior to drag start. + * @private + * @param {Event} event - Touch move event + */ + [onDistanceChange](event) { + const { distance } = this.options; + const { startEvent, delay } = this; + const start = (0, _utils.touchCoords)(startEvent); + const current = (0, _utils.touchCoords)(event); + const timeElapsed = Date.now() - this.onTouchStartAt; + const distanceTravelled = (0, _utils.distance)(start.pageX, start.pageY, current.pageX, current.pageY); + + Object.assign(this, current); + + clearTimeout(this.tapTimeout); + + if (timeElapsed < delay.touch) { + // moved during delay + document.removeEventListener('touchmove', this[onDistanceChange]); + } else if (distanceTravelled >= distance) { + document.removeEventListener('touchmove', this[onDistanceChange]); + this[startDrag](); + } + } + + /** + * Mouse move handler while dragging + * @private + * @param {Event} event - Touch move event + */ + [onTouchMove](event) { + if (!this.dragging) { + return; + } + const { pageX, pageY } = (0, _utils.touchCoords)(event); + const target = document.elementFromPoint(pageX - window.scrollX, pageY - window.scrollY); + + const dragMoveEvent = new _SensorEvent.DragMoveSensorEvent({ + clientX: pageX, + clientY: pageY, + target, + container: this.currentContainer, + originalEvent: event + }); + + this.trigger(this.currentContainer, dragMoveEvent); + } + + /** + * Touch end handler + * @private + * @param {Event} event - Touch end event + */ + [onTouchEnd](event) { + clearTimeout(this.tapTimeout); + preventScrolling = false; + + document.removeEventListener('touchend', this[onTouchEnd]); + document.removeEventListener('touchcancel', this[onTouchEnd]); + document.removeEventListener('touchmove', this[onDistanceChange]); + + if (this.currentContainer) { + this.currentContainer.removeEventListener('contextmenu', onContextMenu); + } + + if (!this.dragging) { + return; + } + + document.removeEventListener('touchmove', this[onTouchMove]); + + const { pageX, pageY } = (0, _utils.touchCoords)(event); + const target = document.elementFromPoint(pageX - window.scrollX, pageY - window.scrollY); + + event.preventDefault(); + + const dragStopEvent = new _SensorEvent.DragStopSensorEvent({ + clientX: pageX, + clientY: pageY, + target, + container: this.currentContainer, + originalEvent: event + }); + + this.trigger(this.currentContainer, dragStopEvent); + + this.currentContainer = null; + this.dragging = false; + this.startEvent = null; + } +} + +exports.default = TouchSensor; +function onContextMenu(event) { + event.preventDefault(); + event.stopPropagation(); +} + +/***/ }), +/* 45 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _TouchSensor = __webpack_require__(44); + +var _TouchSensor2 = _interopRequireDefault(_TouchSensor); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _TouchSensor2.default; + +/***/ }), +/* 46 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.DragPressureSensorEvent = exports.DragStopSensorEvent = exports.DragMoveSensorEvent = exports.DragStartSensorEvent = exports.SensorEvent = undefined; + +var _AbstractEvent = __webpack_require__(1); + +var _AbstractEvent2 = _interopRequireDefault(_AbstractEvent); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Base sensor event + * @class SensorEvent + * @module SensorEvent + * @extends AbstractEvent + */ +class SensorEvent extends _AbstractEvent2.default { + /** + * Original browser event that triggered a sensor + * @property originalEvent + * @type {Event} + * @readonly + */ + get originalEvent() { + return this.data.originalEvent; + } + + /** + * Normalized clientX for both touch and mouse events + * @property clientX + * @type {Number} + * @readonly + */ + get clientX() { + return this.data.clientX; + } + + /** + * Normalized clientY for both touch and mouse events + * @property clientY + * @type {Number} + * @readonly + */ + get clientY() { + return this.data.clientY; + } + + /** + * Normalized target for both touch and mouse events + * Returns the element that is behind cursor or touch pointer + * @property target + * @type {HTMLElement} + * @readonly + */ + get target() { + return this.data.target; + } + + /** + * Container that initiated the sensor + * @property container + * @type {HTMLElement} + * @readonly + */ + get container() { + return this.data.container; + } + + /** + * Trackpad pressure + * @property pressure + * @type {Number} + * @readonly + */ + get pressure() { + return this.data.pressure; + } +} + +exports.SensorEvent = SensorEvent; /** + * Drag start sensor event + * @class DragStartSensorEvent + * @module DragStartSensorEvent + * @extends SensorEvent + */ + +class DragStartSensorEvent extends SensorEvent {} + +exports.DragStartSensorEvent = DragStartSensorEvent; /** + * Drag move sensor event + * @class DragMoveSensorEvent + * @module DragMoveSensorEvent + * @extends SensorEvent + */ + +DragStartSensorEvent.type = 'drag:start'; +class DragMoveSensorEvent extends SensorEvent {} + +exports.DragMoveSensorEvent = DragMoveSensorEvent; /** + * Drag stop sensor event + * @class DragStopSensorEvent + * @module DragStopSensorEvent + * @extends SensorEvent + */ + +DragMoveSensorEvent.type = 'drag:move'; +class DragStopSensorEvent extends SensorEvent {} + +exports.DragStopSensorEvent = DragStopSensorEvent; /** + * Drag pressure sensor event + * @class DragPressureSensorEvent + * @module DragPressureSensorEvent + * @extends SensorEvent + */ + +DragStopSensorEvent.type = 'drag:stop'; +class DragPressureSensorEvent extends SensorEvent {} +exports.DragPressureSensorEvent = DragPressureSensorEvent; +DragPressureSensorEvent.type = 'drag:pressure'; + +/***/ }), +/* 47 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _utils = __webpack_require__(2); + +var _Sensor = __webpack_require__(4); + +var _Sensor2 = _interopRequireDefault(_Sensor); + +var _SensorEvent = __webpack_require__(3); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const onContextMenuWhileDragging = Symbol('onContextMenuWhileDragging'); +const onMouseDown = Symbol('onMouseDown'); +const onMouseMove = Symbol('onMouseMove'); +const onMouseUp = Symbol('onMouseUp'); +const startDrag = Symbol('startDrag'); +const onDistanceChange = Symbol('onDistanceChange'); + +/** + * This sensor picks up native browser mouse events and dictates drag operations + * @class MouseSensor + * @module MouseSensor + * @extends Sensor + */ +class MouseSensor extends _Sensor2.default { + /** + * MouseSensor constructor. + * @constructs MouseSensor + * @param {HTMLElement[]|NodeList|HTMLElement} containers - Containers + * @param {Object} options - Options + */ + constructor(containers = [], options = {}) { + super(containers, options); + + /** + * Mouse down timer which will end up triggering the drag start operation + * @property mouseDownTimeout + * @type {Number} + */ + this.mouseDownTimeout = null; + + /** + * Save pageX coordinates for delay drag + * @property {Numbre} pageX + * @private + */ + this.pageX = null; + + /** + * Save pageY coordinates for delay drag + * @property {Numbre} pageY + * @private + */ + this.pageY = null; + + this[onContextMenuWhileDragging] = this[onContextMenuWhileDragging].bind(this); + this[onMouseDown] = this[onMouseDown].bind(this); + this[onMouseMove] = this[onMouseMove].bind(this); + this[onMouseUp] = this[onMouseUp].bind(this); + this[startDrag] = this[startDrag].bind(this); + this[onDistanceChange] = this[onDistanceChange].bind(this); + } + + /** + * Attaches sensors event listeners to the DOM + */ + attach() { + document.addEventListener('mousedown', this[onMouseDown], true); + } + + /** + * Detaches sensors event listeners to the DOM + */ + detach() { + document.removeEventListener('mousedown', this[onMouseDown], true); + } + + /** + * Mouse down handler + * @private + * @param {Event} event - Mouse down event + */ + [onMouseDown](event) { + if (event.button !== 0 || event.ctrlKey || event.metaKey) { + return; + } + const container = (0, _utils.closest)(event.target, this.containers); + + if (!container) { + return; + } + + const { delay } = this; + const { pageX, pageY } = event; + + Object.assign(this, { pageX, pageY }); + this.onMouseDownAt = Date.now(); + this.startEvent = event; + + this.currentContainer = container; + document.addEventListener('mouseup', this[onMouseUp]); + document.addEventListener('dragstart', preventNativeDragStart); + document.addEventListener('mousemove', this[onDistanceChange]); + + this.mouseDownTimeout = window.setTimeout(() => { + this[onDistanceChange]({ pageX: this.pageX, pageY: this.pageY }); + }, delay.mouse); + } + + /** + * Start the drag + * @private + */ + [startDrag]() { + const startEvent = this.startEvent; + const container = this.currentContainer; + + const dragStartEvent = new _SensorEvent.DragStartSensorEvent({ + clientX: startEvent.clientX, + clientY: startEvent.clientY, + target: startEvent.target, + container, + originalEvent: startEvent + }); + + this.trigger(this.currentContainer, dragStartEvent); + + this.dragging = !dragStartEvent.canceled(); + + if (this.dragging) { + document.addEventListener('contextmenu', this[onContextMenuWhileDragging], true); + document.addEventListener('mousemove', this[onMouseMove]); + } + } + + /** + * Detect change in distance, starting drag when both + * delay and distance requirements are met + * @private + * @param {Event} event - Mouse move event + */ + [onDistanceChange](event) { + const { pageX, pageY } = event; + const { distance } = this.options; + const { startEvent, delay } = this; + + Object.assign(this, { pageX, pageY }); + + if (!this.currentContainer) { + return; + } + + const timeElapsed = Date.now() - this.onMouseDownAt; + const distanceTravelled = (0, _utils.distance)(startEvent.pageX, startEvent.pageY, pageX, pageY) || 0; + + clearTimeout(this.mouseDownTimeout); + + if (timeElapsed < delay.mouse) { + // moved during delay + document.removeEventListener('mousemove', this[onDistanceChange]); + } else if (distanceTravelled >= distance) { + document.removeEventListener('mousemove', this[onDistanceChange]); + this[startDrag](); + } + } + + /** + * Mouse move handler + * @private + * @param {Event} event - Mouse move event + */ + [onMouseMove](event) { + if (!this.dragging) { + return; + } + + const target = document.elementFromPoint(event.clientX, event.clientY); + + const dragMoveEvent = new _SensorEvent.DragMoveSensorEvent({ + clientX: event.clientX, + clientY: event.clientY, + target, + container: this.currentContainer, + originalEvent: event + }); + + this.trigger(this.currentContainer, dragMoveEvent); + } + + /** + * Mouse up handler + * @private + * @param {Event} event - Mouse up event + */ + [onMouseUp](event) { + clearTimeout(this.mouseDownTimeout); + + if (event.button !== 0) { + return; + } + + document.removeEventListener('mouseup', this[onMouseUp]); + document.removeEventListener('dragstart', preventNativeDragStart); + document.removeEventListener('mousemove', this[onDistanceChange]); + + if (!this.dragging) { + return; + } + + const target = document.elementFromPoint(event.clientX, event.clientY); + + const dragStopEvent = new _SensorEvent.DragStopSensorEvent({ + clientX: event.clientX, + clientY: event.clientY, + target, + container: this.currentContainer, + originalEvent: event + }); + + this.trigger(this.currentContainer, dragStopEvent); + + document.removeEventListener('contextmenu', this[onContextMenuWhileDragging], true); + document.removeEventListener('mousemove', this[onMouseMove]); + + this.currentContainer = null; + this.dragging = false; + this.startEvent = null; + } + + /** + * Context menu handler + * @private + * @param {Event} event - Context menu event + */ + [onContextMenuWhileDragging](event) { + event.preventDefault(); + } +} + +exports.default = MouseSensor; +function preventNativeDragStart(event) { + event.preventDefault(); +} + +/***/ }), +/* 48 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _MouseSensor = __webpack_require__(47); + +var _MouseSensor2 = _interopRequireDefault(_MouseSensor); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _MouseSensor2.default; + +/***/ }), +/* 49 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +const defaultDealy = { + mouse: 0, + drag: 0, + touch: 100 +}; + +/** + * Base sensor class. Extend from this class to create a new or custom sensor + * @class Sensor + * @module Sensor + */ +class Sensor { + /** + * Sensor constructor. + * @constructs Sensor + * @param {HTMLElement[]|NodeList|HTMLElement} containers - Containers + * @param {Object} options - Options + */ + constructor(containers = [], options = {}) { + /** + * Current containers + * @property containers + * @type {HTMLElement[]} + */ + this.containers = [...containers]; + + /** + * Current options + * @property options + * @type {Object} + */ + this.options = _extends({}, options); + + /** + * Current drag state + * @property dragging + * @type {Boolean} + */ + this.dragging = false; + + /** + * Current container + * @property currentContainer + * @type {HTMLElement} + */ + this.currentContainer = null; + + /** + * The event of the initial sensor down + * @property startEvent + * @type {Event} + */ + this.startEvent = null; + + /** + * The delay of each sensor + * @property delay + * @type {Object} + */ + this.delay = calcDelay(options.delay); + } + + /** + * Attaches sensors event listeners to the DOM + * @return {Sensor} + */ + attach() { + return this; + } + + /** + * Detaches sensors event listeners to the DOM + * @return {Sensor} + */ + detach() { + return this; + } + + /** + * Adds container to this sensor instance + * @param {...HTMLElement} containers - Containers you want to add to this sensor + * @example draggable.addContainer(document.body) + */ + addContainer(...containers) { + this.containers = [...this.containers, ...containers]; + } + + /** + * Removes container from this sensor instance + * @param {...HTMLElement} containers - Containers you want to remove from this sensor + * @example draggable.removeContainer(document.body) + */ + removeContainer(...containers) { + this.containers = this.containers.filter(container => !containers.includes(container)); + } + + /** + * Triggers event on target element + * @param {HTMLElement} element - Element to trigger event on + * @param {SensorEvent} sensorEvent - Sensor event to trigger + */ + trigger(element, sensorEvent) { + const event = document.createEvent('Event'); + event.detail = sensorEvent; + event.initEvent(sensorEvent.type, true, true); + element.dispatchEvent(event); + this.lastEvent = sensorEvent; + + return sensorEvent; + } +} + +exports.default = Sensor; /** + * Calculate the delay of each sensor through the delay in the options + * @param {undefined|Number|Object} optionsDelay - the delay in the options + * @return {Object} + */ + +function calcDelay(optionsDelay) { + const delay = {}; + + if (optionsDelay === undefined) { + return _extends({}, defaultDealy); + } + + if (typeof optionsDelay === 'number') { + for (const key in defaultDealy) { + if (defaultDealy.hasOwnProperty(key)) { + delay[key] = optionsDelay; + } + } + return delay; + } + + for (const key in defaultDealy) { + if (defaultDealy.hasOwnProperty(key)) { + if (optionsDelay[key] === undefined) { + delay[key] = defaultDealy[key]; + } else { + delay[key] = optionsDelay[key]; + } + } + } + + return delay; +} + +/***/ }), +/* 50 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = touchCoords; +/** + * Returns the first touch event found in touches or changedTouches of a touch events. + * @param {TouchEvent} event a touch event + * @return {Touch} a touch object + */ +function touchCoords(event = {}) { + const { touches, changedTouches } = event; + return touches && touches[0] || changedTouches && changedTouches[0]; +} + +/***/ }), +/* 51 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _touchCoords = __webpack_require__(50); + +var _touchCoords2 = _interopRequireDefault(_touchCoords); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _touchCoords2.default; + +/***/ }), +/* 52 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = distance; +/** + * Returns the distance between two points + * @param {Number} x1 The X position of the first point + * @param {Number} y1 The Y position of the first point + * @param {Number} x2 The X position of the second point + * @param {Number} y2 The Y position of the second point + * @return {Number} + */ +function distance(x1, y1, x2, y2) { + return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); +} + +/***/ }), +/* 53 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _distance = __webpack_require__(52); + +var _distance2 = _interopRequireDefault(_distance); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _distance2.default; + +/***/ }), +/* 54 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = requestNextAnimationFrame; +function requestNextAnimationFrame(callback) { + return requestAnimationFrame(() => { + requestAnimationFrame(callback); + }); +} + +/***/ }), +/* 55 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _requestNextAnimationFrame = __webpack_require__(54); + +var _requestNextAnimationFrame2 = _interopRequireDefault(_requestNextAnimationFrame); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _requestNextAnimationFrame2.default; + +/***/ }), +/* 56 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = closest; +const matchFunction = Element.prototype.matches || Element.prototype.webkitMatchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector; + +/** + * Get the closest parent element of a given element that matches the given + * selector string or matching function + * + * @param {Element} element The child element to find a parent of + * @param {String|Function} selector The string or function to use to match + * the parent element + * @return {Element|null} + */ +function closest(element, value) { + if (!element) { + return null; + } + + const selector = value; + const callback = value; + const nodeList = value; + const singleElement = value; + + const isSelector = Boolean(typeof value === 'string'); + const isFunction = Boolean(typeof value === 'function'); + const isNodeList = Boolean(value instanceof NodeList || value instanceof Array); + const isElement = Boolean(value instanceof HTMLElement); + + function conditionFn(currentElement) { + if (!currentElement) { + return currentElement; + } else if (isSelector) { + return matchFunction.call(currentElement, selector); + } else if (isNodeList) { + return [...nodeList].includes(currentElement); + } else if (isElement) { + return singleElement === currentElement; + } else if (isFunction) { + return callback(currentElement); + } else { + return null; + } + } + + let current = element; + + do { + current = current.correspondingUseElement || current.correspondingElement || current; + + if (conditionFn(current)) { + return current; + } + + current = current.parentNode; + } while (current && current !== document.body && current !== document); + + return null; +} + +/***/ }), +/* 57 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _closest = __webpack_require__(56); + +var _closest2 = _interopRequireDefault(_closest); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _closest2.default; + +/***/ }), +/* 58 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.defaultOptions = exports.scroll = exports.onDragStop = exports.onDragMove = exports.onDragStart = undefined; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _AbstractPlugin = __webpack_require__(0); + +var _AbstractPlugin2 = _interopRequireDefault(_AbstractPlugin); + +var _utils = __webpack_require__(2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const onDragStart = exports.onDragStart = Symbol('onDragStart'); +const onDragMove = exports.onDragMove = Symbol('onDragMove'); +const onDragStop = exports.onDragStop = Symbol('onDragStop'); +const scroll = exports.scroll = Symbol('scroll'); + +/** + * Scrollable default options + * @property {Object} defaultOptions + * @property {Number} defaultOptions.speed + * @property {Number} defaultOptions.sensitivity + * @property {HTMLElement[]} defaultOptions.scrollableElements + * @type {Object} + */ +const defaultOptions = exports.defaultOptions = { + speed: 6, + sensitivity: 50, + scrollableElements: [] +}; + +/** + * Scrollable plugin which scrolls the closest scrollable parent + * @class Scrollable + * @module Scrollable + * @extends AbstractPlugin + */ +class Scrollable extends _AbstractPlugin2.default { + /** + * Scrollable constructor. + * @constructs Scrollable + * @param {Draggable} draggable - Draggable instance + */ + constructor(draggable) { + super(draggable); + + /** + * Scrollable options + * @property {Object} options + * @property {Number} options.speed + * @property {Number} options.sensitivity + * @property {HTMLElement[]} options.scrollableElements + * @type {Object} + */ + this.options = _extends({}, defaultOptions, this.getOptions()); + + /** + * Keeps current mouse position + * @property {Object} currentMousePosition + * @property {Number} currentMousePosition.clientX + * @property {Number} currentMousePosition.clientY + * @type {Object|null} + */ + this.currentMousePosition = null; + + /** + * Scroll animation frame + * @property scrollAnimationFrame + * @type {Number|null} + */ + this.scrollAnimationFrame = null; + + /** + * Closest scrollable element + * @property scrollableElement + * @type {HTMLElement|null} + */ + this.scrollableElement = null; + + /** + * Animation frame looking for the closest scrollable element + * @property findScrollableElementFrame + * @type {Number|null} + */ + this.findScrollableElementFrame = null; + + this[onDragStart] = this[onDragStart].bind(this); + this[onDragMove] = this[onDragMove].bind(this); + this[onDragStop] = this[onDragStop].bind(this); + this[scroll] = this[scroll].bind(this); + } + + /** + * Attaches plugins event listeners + */ + attach() { + this.draggable.on('drag:start', this[onDragStart]).on('drag:move', this[onDragMove]).on('drag:stop', this[onDragStop]); + } + + /** + * Detaches plugins event listeners + */ + detach() { + this.draggable.off('drag:start', this[onDragStart]).off('drag:move', this[onDragMove]).off('drag:stop', this[onDragStop]); + } + + /** + * Returns options passed through draggable + * @return {Object} + */ + getOptions() { + return this.draggable.options.scrollable || {}; + } + + /** + * Returns closest scrollable elements by element + * @param {HTMLElement} target + * @return {HTMLElement} + */ + getScrollableElement(target) { + if (this.hasDefinedScrollableElements()) { + return (0, _utils.closest)(target, this.options.scrollableElements) || document.documentElement; + } else { + return closestScrollableElement(target); + } + } + + /** + * Returns true if at least one scrollable element have been defined via options + * @param {HTMLElement} target + * @return {Boolean} + */ + hasDefinedScrollableElements() { + return Boolean(this.options.scrollableElements.length !== 0); + } + + /** + * Drag start handler. Finds closest scrollable parent in separate frame + * @param {DragStartEvent} dragEvent + * @private + */ + [onDragStart](dragEvent) { + this.findScrollableElementFrame = requestAnimationFrame(() => { + this.scrollableElement = this.getScrollableElement(dragEvent.source); + }); + } + + /** + * Drag move handler. Remembers mouse position and initiates scrolling + * @param {DragMoveEvent} dragEvent + * @private + */ + [onDragMove](dragEvent) { + this.findScrollableElementFrame = requestAnimationFrame(() => { + this.scrollableElement = this.getScrollableElement(dragEvent.sensorEvent.target); + }); + + if (!this.scrollableElement) { + return; + } + + const sensorEvent = dragEvent.sensorEvent; + const scrollOffset = { x: 0, y: 0 }; + + if ('ontouchstart' in window) { + scrollOffset.y = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; + scrollOffset.x = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0; + } + + this.currentMousePosition = { + clientX: sensorEvent.clientX - scrollOffset.x, + clientY: sensorEvent.clientY - scrollOffset.y + }; + + this.scrollAnimationFrame = requestAnimationFrame(this[scroll]); + } + + /** + * Drag stop handler. Cancels scroll animations and resets state + * @private + */ + [onDragStop]() { + cancelAnimationFrame(this.scrollAnimationFrame); + cancelAnimationFrame(this.findScrollableElementFrame); + + this.scrollableElement = null; + this.scrollAnimationFrame = null; + this.findScrollableElementFrame = null; + this.currentMousePosition = null; + } + + /** + * Scroll function that does the heavylifting + * @private + */ + [scroll]() { + if (!this.scrollableElement || !this.currentMousePosition) { + return; + } + + cancelAnimationFrame(this.scrollAnimationFrame); + + const { speed, sensitivity } = this.options; + + const rect = this.scrollableElement.getBoundingClientRect(); + const bottomCutOff = rect.bottom > window.innerHeight; + const topCutOff = rect.top < 0; + const cutOff = topCutOff || bottomCutOff; + + const documentScrollingElement = getDocumentScrollingElement(); + const scrollableElement = this.scrollableElement; + const clientX = this.currentMousePosition.clientX; + const clientY = this.currentMousePosition.clientY; + + if (scrollableElement !== document.body && scrollableElement !== document.documentElement && !cutOff) { + const { offsetHeight, offsetWidth } = scrollableElement; + + if (rect.top + offsetHeight - clientY < sensitivity) { + scrollableElement.scrollTop += speed; + } else if (clientY - rect.top < sensitivity) { + scrollableElement.scrollTop -= speed; + } + + if (rect.left + offsetWidth - clientX < sensitivity) { + scrollableElement.scrollLeft += speed; + } else if (clientX - rect.left < sensitivity) { + scrollableElement.scrollLeft -= speed; + } + } else { + const { innerHeight, innerWidth } = window; + + if (clientY < sensitivity) { + documentScrollingElement.scrollTop -= speed; + } else if (innerHeight - clientY < sensitivity) { + documentScrollingElement.scrollTop += speed; + } + + if (clientX < sensitivity) { + documentScrollingElement.scrollLeft -= speed; + } else if (innerWidth - clientX < sensitivity) { + documentScrollingElement.scrollLeft += speed; + } + } + + this.scrollAnimationFrame = requestAnimationFrame(this[scroll]); + } +} + +exports.default = Scrollable; /** + * Returns true if the passed element has overflow + * @param {HTMLElement} element + * @return {Boolean} + * @private + */ + +function hasOverflow(element) { + const overflowRegex = /(auto|scroll)/; + const computedStyles = getComputedStyle(element, null); + + const overflow = computedStyles.getPropertyValue('overflow') + computedStyles.getPropertyValue('overflow-y') + computedStyles.getPropertyValue('overflow-x'); + + return overflowRegex.test(overflow); +} + +/** + * Returns true if the passed element is statically positioned + * @param {HTMLElement} element + * @return {Boolean} + * @private + */ +function isStaticallyPositioned(element) { + const position = getComputedStyle(element).getPropertyValue('position'); + return position === 'static'; +} + +/** + * Finds closest scrollable element + * @param {HTMLElement} element + * @return {HTMLElement} + * @private + */ +function closestScrollableElement(element) { + if (!element) { + return getDocumentScrollingElement(); + } + + const position = getComputedStyle(element).getPropertyValue('position'); + const excludeStaticParents = position === 'absolute'; + + const scrollableElement = (0, _utils.closest)(element, parent => { + if (excludeStaticParents && isStaticallyPositioned(parent)) { + return false; + } + return hasOverflow(parent); + }); + + if (position === 'fixed' || !scrollableElement) { + return getDocumentScrollingElement(); + } else { + return scrollableElement; + } +} + +/** + * Returns element that scrolls document + * @return {HTMLElement} + * @private + */ +function getDocumentScrollingElement() { + return document.scrollingElement || document.documentElement; +} + +/***/ }), +/* 59 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.defaultOptions = undefined; + +var _Scrollable = __webpack_require__(58); + +var _Scrollable2 = _interopRequireDefault(_Scrollable); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _Scrollable2.default; +exports.defaultOptions = _Scrollable.defaultOptions; + +/***/ }), +/* 60 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.MirrorDestroyEvent = exports.MirrorMoveEvent = exports.MirrorAttachedEvent = exports.MirrorCreatedEvent = exports.MirrorCreateEvent = exports.MirrorEvent = undefined; + +var _AbstractEvent = __webpack_require__(1); + +var _AbstractEvent2 = _interopRequireDefault(_AbstractEvent); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Base mirror event + * @class MirrorEvent + * @module MirrorEvent + * @extends AbstractEvent + */ +class MirrorEvent extends _AbstractEvent2.default { + /** + * Draggables source element + * @property source + * @type {HTMLElement} + * @readonly + */ + get source() { + return this.data.source; + } + + /** + * Draggables original source element + * @property originalSource + * @type {HTMLElement} + * @readonly + */ + get originalSource() { + return this.data.originalSource; + } + + /** + * Draggables source container element + * @property sourceContainer + * @type {HTMLElement} + * @readonly + */ + get sourceContainer() { + return this.data.sourceContainer; + } + + /** + * Sensor event + * @property sensorEvent + * @type {SensorEvent} + * @readonly + */ + get sensorEvent() { + return this.data.sensorEvent; + } + + /** + * Drag event + * @property dragEvent + * @type {DragEvent} + * @readonly + */ + get dragEvent() { + return this.data.dragEvent; + } + + /** + * Original event that triggered sensor event + * @property originalEvent + * @type {Event} + * @readonly + */ + get originalEvent() { + if (this.sensorEvent) { + return this.sensorEvent.originalEvent; + } + + return null; + } +} + +exports.MirrorEvent = MirrorEvent; /** + * Mirror create event + * @class MirrorCreateEvent + * @module MirrorCreateEvent + * @extends MirrorEvent + */ + +class MirrorCreateEvent extends MirrorEvent {} + +exports.MirrorCreateEvent = MirrorCreateEvent; /** + * Mirror created event + * @class MirrorCreatedEvent + * @module MirrorCreatedEvent + * @extends MirrorEvent + */ + +MirrorCreateEvent.type = 'mirror:create'; +class MirrorCreatedEvent extends MirrorEvent { + + /** + * Draggables mirror element + * @property mirror + * @type {HTMLElement} + * @readonly + */ + get mirror() { + return this.data.mirror; + } +} + +exports.MirrorCreatedEvent = MirrorCreatedEvent; /** + * Mirror attached event + * @class MirrorAttachedEvent + * @module MirrorAttachedEvent + * @extends MirrorEvent + */ + +MirrorCreatedEvent.type = 'mirror:created'; +class MirrorAttachedEvent extends MirrorEvent { + + /** + * Draggables mirror element + * @property mirror + * @type {HTMLElement} + * @readonly + */ + get mirror() { + return this.data.mirror; + } +} + +exports.MirrorAttachedEvent = MirrorAttachedEvent; /** + * Mirror move event + * @class MirrorMoveEvent + * @module MirrorMoveEvent + * @extends MirrorEvent + */ + +MirrorAttachedEvent.type = 'mirror:attached'; +class MirrorMoveEvent extends MirrorEvent { + + /** + * Draggables mirror element + * @property mirror + * @type {HTMLElement} + * @readonly + */ + get mirror() { + return this.data.mirror; + } + + /** + * Sensor has exceeded mirror's threshold on x axis + * @type {Boolean} + * @readonly + */ + get passedThreshX() { + return this.data.passedThreshX; + } + + /** + * Sensor has exceeded mirror's threshold on y axis + * @type {Boolean} + * @readonly + */ + get passedThreshY() { + return this.data.passedThreshY; + } +} + +exports.MirrorMoveEvent = MirrorMoveEvent; /** + * Mirror destroy event + * @class MirrorDestroyEvent + * @module MirrorDestroyEvent + * @extends MirrorEvent + */ + +MirrorMoveEvent.type = 'mirror:move'; +MirrorMoveEvent.cancelable = true; +class MirrorDestroyEvent extends MirrorEvent { + + /** + * Draggables mirror element + * @property mirror + * @type {HTMLElement} + * @readonly + */ + get mirror() { + return this.data.mirror; + } +} +exports.MirrorDestroyEvent = MirrorDestroyEvent; +MirrorDestroyEvent.type = 'mirror:destroy'; +MirrorDestroyEvent.cancelable = true; + +/***/ }), +/* 61 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _MirrorEvent = __webpack_require__(60); + +Object.keys(_MirrorEvent).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _MirrorEvent[key]; + } + }); +}); + +/***/ }), +/* 62 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.defaultOptions = exports.getAppendableContainer = exports.onScroll = exports.onMirrorMove = exports.onMirrorCreated = exports.onDragStop = exports.onDragMove = exports.onDragStart = undefined; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _AbstractPlugin = __webpack_require__(0); + +var _AbstractPlugin2 = _interopRequireDefault(_AbstractPlugin); + +var _MirrorEvent = __webpack_require__(61); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } + +const onDragStart = exports.onDragStart = Symbol('onDragStart'); +const onDragMove = exports.onDragMove = Symbol('onDragMove'); +const onDragStop = exports.onDragStop = Symbol('onDragStop'); +const onMirrorCreated = exports.onMirrorCreated = Symbol('onMirrorCreated'); +const onMirrorMove = exports.onMirrorMove = Symbol('onMirrorMove'); +const onScroll = exports.onScroll = Symbol('onScroll'); +const getAppendableContainer = exports.getAppendableContainer = Symbol('getAppendableContainer'); + +/** + * Mirror default options + * @property {Object} defaultOptions + * @property {Boolean} defaultOptions.constrainDimensions + * @property {Boolean} defaultOptions.xAxis + * @property {Boolean} defaultOptions.yAxis + * @property {null} defaultOptions.cursorOffsetX + * @property {null} defaultOptions.cursorOffsetY + * @type {Object} + */ +const defaultOptions = exports.defaultOptions = { + constrainDimensions: false, + xAxis: true, + yAxis: true, + cursorOffsetX: null, + cursorOffsetY: null, + thresholdX: null, + thresholdY: null +}; + +/** + * Mirror plugin which controls the mirror positioning while dragging + * @class Mirror + * @module Mirror + * @extends AbstractPlugin + */ +class Mirror extends _AbstractPlugin2.default { + /** + * Mirror constructor. + * @constructs Mirror + * @param {Draggable} draggable - Draggable instance + */ + constructor(draggable) { + super(draggable); + + /** + * Mirror options + * @property {Object} options + * @property {Boolean} options.constrainDimensions + * @property {Boolean} options.xAxis + * @property {Boolean} options.yAxis + * @property {Number|null} options.cursorOffsetX + * @property {Number|null} options.cursorOffsetY + * @property {String|HTMLElement|Function} options.appendTo + * @type {Object} + */ + this.options = _extends({}, defaultOptions, this.getOptions()); + + /** + * Scroll offset for touch devices because the mirror is positioned fixed + * @property {Object} scrollOffset + * @property {Number} scrollOffset.x + * @property {Number} scrollOffset.y + */ + this.scrollOffset = { x: 0, y: 0 }; + + /** + * Initial scroll offset for touch devices because the mirror is positioned fixed + * @property {Object} scrollOffset + * @property {Number} scrollOffset.x + * @property {Number} scrollOffset.y + */ + this.initialScrollOffset = { + x: window.scrollX, + y: window.scrollY + }; + + this[onDragStart] = this[onDragStart].bind(this); + this[onDragMove] = this[onDragMove].bind(this); + this[onDragStop] = this[onDragStop].bind(this); + this[onMirrorCreated] = this[onMirrorCreated].bind(this); + this[onMirrorMove] = this[onMirrorMove].bind(this); + this[onScroll] = this[onScroll].bind(this); + } + + /** + * Attaches plugins event listeners + */ + attach() { + this.draggable.on('drag:start', this[onDragStart]).on('drag:move', this[onDragMove]).on('drag:stop', this[onDragStop]).on('mirror:created', this[onMirrorCreated]).on('mirror:move', this[onMirrorMove]); + } + + /** + * Detaches plugins event listeners + */ + detach() { + this.draggable.off('drag:start', this[onDragStart]).off('drag:move', this[onDragMove]).off('drag:stop', this[onDragStop]).off('mirror:created', this[onMirrorCreated]).off('mirror:move', this[onMirrorMove]); + } + + /** + * Returns options passed through draggable + * @return {Object} + */ + getOptions() { + return this.draggable.options.mirror || {}; + } + + [onDragStart](dragEvent) { + if (dragEvent.canceled()) { + return; + } + + if ('ontouchstart' in window) { + document.addEventListener('scroll', this[onScroll], true); + } + + this.initialScrollOffset = { + x: window.scrollX, + y: window.scrollY + }; + + const { source, originalSource, sourceContainer, sensorEvent } = dragEvent; + + // Last sensor position of mirror move + this.lastMirrorMovedClient = { + x: sensorEvent.clientX, + y: sensorEvent.clientY + }; + + const mirrorCreateEvent = new _MirrorEvent.MirrorCreateEvent({ + source, + originalSource, + sourceContainer, + sensorEvent, + dragEvent + }); + + this.draggable.trigger(mirrorCreateEvent); + + if (isNativeDragEvent(sensorEvent) || mirrorCreateEvent.canceled()) { + return; + } + + const appendableContainer = this[getAppendableContainer](source) || sourceContainer; + this.mirror = source.cloneNode(true); + + const mirrorCreatedEvent = new _MirrorEvent.MirrorCreatedEvent({ + source, + originalSource, + sourceContainer, + sensorEvent, + dragEvent, + mirror: this.mirror + }); + + const mirrorAttachedEvent = new _MirrorEvent.MirrorAttachedEvent({ + source, + originalSource, + sourceContainer, + sensorEvent, + dragEvent, + mirror: this.mirror + }); + + this.draggable.trigger(mirrorCreatedEvent); + appendableContainer.appendChild(this.mirror); + this.draggable.trigger(mirrorAttachedEvent); + } + + [onDragMove](dragEvent) { + if (!this.mirror || dragEvent.canceled()) { + return; + } + + const { source, originalSource, sourceContainer, sensorEvent } = dragEvent; + + let passedThreshX = true; + let passedThreshY = true; + + if (this.options.thresholdX || this.options.thresholdY) { + const { x: lastX, y: lastY } = this.lastMirrorMovedClient; + + if (Math.abs(lastX - sensorEvent.clientX) < this.options.thresholdX) { + passedThreshX = false; + } else { + this.lastMirrorMovedClient.x = sensorEvent.clientX; + } + + if (Math.abs(lastY - sensorEvent.clientY) < this.options.thresholdY) { + passedThreshY = false; + } else { + this.lastMirrorMovedClient.y = sensorEvent.clientY; + } + + if (!passedThreshX && !passedThreshY) { + return; + } + } + + const mirrorMoveEvent = new _MirrorEvent.MirrorMoveEvent({ + source, + originalSource, + sourceContainer, + sensorEvent, + dragEvent, + mirror: this.mirror, + passedThreshX, + passedThreshY + }); + + this.draggable.trigger(mirrorMoveEvent); + } + + [onDragStop](dragEvent) { + if ('ontouchstart' in window) { + document.removeEventListener('scroll', this[onScroll], true); + } + + this.initialScrollOffset = { x: 0, y: 0 }; + this.scrollOffset = { x: 0, y: 0 }; + + if (!this.mirror) { + return; + } + + const { source, sourceContainer, sensorEvent } = dragEvent; + + const mirrorDestroyEvent = new _MirrorEvent.MirrorDestroyEvent({ + source, + mirror: this.mirror, + sourceContainer, + sensorEvent, + dragEvent + }); + + this.draggable.trigger(mirrorDestroyEvent); + + if (!mirrorDestroyEvent.canceled()) { + this.mirror.parentNode.removeChild(this.mirror); + } + } + + [onScroll]() { + this.scrollOffset = { + x: window.scrollX - this.initialScrollOffset.x, + y: window.scrollY - this.initialScrollOffset.y + }; + } + + /** + * Mirror created handler + * @param {MirrorCreatedEvent} mirrorEvent + * @return {Promise} + * @private + */ + [onMirrorCreated]({ mirror, source, sensorEvent }) { + const mirrorClasses = this.draggable.getClassNamesFor('mirror'); + + const setState = (_ref) => { + let { mirrorOffset, initialX, initialY } = _ref, + args = _objectWithoutProperties(_ref, ['mirrorOffset', 'initialX', 'initialY']); + + this.mirrorOffset = mirrorOffset; + this.initialX = initialX; + this.initialY = initialY; + this.lastMovedX = initialX; + this.lastMovedY = initialY; + return _extends({ mirrorOffset, initialX, initialY }, args); + }; + + mirror.style.display = 'none'; + + const initialState = { + mirror, + source, + sensorEvent, + mirrorClasses, + scrollOffset: this.scrollOffset, + options: this.options, + passedThreshX: true, + passedThreshY: true + }; + + return Promise.resolve(initialState) + // Fix reflow here + .then(computeMirrorDimensions).then(calculateMirrorOffset).then(resetMirror).then(addMirrorClasses).then(positionMirror({ initial: true })).then(removeMirrorID).then(setState); + } + + /** + * Mirror move handler + * @param {MirrorMoveEvent} mirrorEvent + * @return {Promise|null} + * @private + */ + [onMirrorMove](mirrorEvent) { + if (mirrorEvent.canceled()) { + return null; + } + + const setState = (_ref2) => { + let { lastMovedX, lastMovedY } = _ref2, + args = _objectWithoutProperties(_ref2, ['lastMovedX', 'lastMovedY']); + + this.lastMovedX = lastMovedX; + this.lastMovedY = lastMovedY; + + return _extends({ lastMovedX, lastMovedY }, args); + }; + + const initialState = { + mirror: mirrorEvent.mirror, + sensorEvent: mirrorEvent.sensorEvent, + mirrorOffset: this.mirrorOffset, + options: this.options, + initialX: this.initialX, + initialY: this.initialY, + scrollOffset: this.scrollOffset, + passedThreshX: mirrorEvent.passedThreshX, + passedThreshY: mirrorEvent.passedThreshY, + lastMovedX: this.lastMovedX, + lastMovedY: this.lastMovedY + }; + + return Promise.resolve(initialState).then(positionMirror({ raf: true })).then(setState); + } + + /** + * Returns appendable container for mirror based on the appendTo option + * @private + * @param {Object} options + * @param {HTMLElement} options.source - Current source + * @return {HTMLElement} + */ + [getAppendableContainer](source) { + const appendTo = this.options.appendTo; + + if (typeof appendTo === 'string') { + return document.querySelector(appendTo); + } else if (appendTo instanceof HTMLElement) { + return appendTo; + } else if (typeof appendTo === 'function') { + return appendTo(source); + } else { + return source.parentNode; + } + } +} + +exports.default = Mirror; /** + * Computes mirror dimensions based on the source element + * Adds sourceRect to state + * @param {Object} state + * @param {HTMLElement} state.source + * @return {Promise} + * @private + */ + +function computeMirrorDimensions(_ref3) { + let { source } = _ref3, + args = _objectWithoutProperties(_ref3, ['source']); + + return withPromise(resolve => { + const sourceRect = source.getBoundingClientRect(); + resolve(_extends({ source, sourceRect }, args)); + }); +} + +/** + * Calculates mirror offset + * Adds mirrorOffset to state + * @param {Object} state + * @param {SensorEvent} state.sensorEvent + * @param {DOMRect} state.sourceRect + * @return {Promise} + * @private + */ +function calculateMirrorOffset(_ref4) { + let { sensorEvent, sourceRect, options } = _ref4, + args = _objectWithoutProperties(_ref4, ['sensorEvent', 'sourceRect', 'options']); + + return withPromise(resolve => { + const top = options.cursorOffsetY === null ? sensorEvent.clientY - sourceRect.top : options.cursorOffsetY; + const left = options.cursorOffsetX === null ? sensorEvent.clientX - sourceRect.left : options.cursorOffsetX; + + const mirrorOffset = { top, left }; + + resolve(_extends({ sensorEvent, sourceRect, mirrorOffset, options }, args)); + }); +} + +/** + * Applys mirror styles + * @param {Object} state + * @param {HTMLElement} state.mirror + * @param {HTMLElement} state.source + * @param {Object} state.options + * @return {Promise} + * @private + */ +function resetMirror(_ref5) { + let { mirror, source, options } = _ref5, + args = _objectWithoutProperties(_ref5, ['mirror', 'source', 'options']); + + return withPromise(resolve => { + let offsetHeight; + let offsetWidth; + + if (options.constrainDimensions) { + const computedSourceStyles = getComputedStyle(source); + offsetHeight = computedSourceStyles.getPropertyValue('height'); + offsetWidth = computedSourceStyles.getPropertyValue('width'); + } + + mirror.style.display = null; + mirror.style.position = 'fixed'; + mirror.style.pointerEvents = 'none'; + mirror.style.top = 0; + mirror.style.left = 0; + mirror.style.margin = 0; + + if (options.constrainDimensions) { + mirror.style.height = offsetHeight; + mirror.style.width = offsetWidth; + } + + resolve(_extends({ mirror, source, options }, args)); + }); +} + +/** + * Applys mirror class on mirror element + * @param {Object} state + * @param {HTMLElement} state.mirror + * @param {String[]} state.mirrorClasses + * @return {Promise} + * @private + */ +function addMirrorClasses(_ref6) { + let { mirror, mirrorClasses } = _ref6, + args = _objectWithoutProperties(_ref6, ['mirror', 'mirrorClasses']); + + return withPromise(resolve => { + mirror.classList.add(...mirrorClasses); + resolve(_extends({ mirror, mirrorClasses }, args)); + }); +} + +/** + * Removes source ID from cloned mirror element + * @param {Object} state + * @param {HTMLElement} state.mirror + * @return {Promise} + * @private + */ +function removeMirrorID(_ref7) { + let { mirror } = _ref7, + args = _objectWithoutProperties(_ref7, ['mirror']); + + return withPromise(resolve => { + mirror.removeAttribute('id'); + delete mirror.id; + resolve(_extends({ mirror }, args)); + }); +} + +/** + * Positions mirror with translate3d + * @param {Object} state + * @param {HTMLElement} state.mirror + * @param {SensorEvent} state.sensorEvent + * @param {Object} state.mirrorOffset + * @param {Number} state.initialY + * @param {Number} state.initialX + * @param {Object} state.options + * @return {Promise} + * @private + */ +function positionMirror({ withFrame = false, initial = false } = {}) { + return (_ref8) => { + let { + mirror, + sensorEvent, + mirrorOffset, + initialY, + initialX, + scrollOffset, + options, + passedThreshX, + passedThreshY, + lastMovedX, + lastMovedY + } = _ref8, + args = _objectWithoutProperties(_ref8, ['mirror', 'sensorEvent', 'mirrorOffset', 'initialY', 'initialX', 'scrollOffset', 'options', 'passedThreshX', 'passedThreshY', 'lastMovedX', 'lastMovedY']); + + return withPromise(resolve => { + const result = _extends({ + mirror, + sensorEvent, + mirrorOffset, + options + }, args); + + if (mirrorOffset) { + const x = passedThreshX ? Math.round((sensorEvent.clientX - mirrorOffset.left - scrollOffset.x) / (options.thresholdX || 1)) * (options.thresholdX || 1) : Math.round(lastMovedX); + const y = passedThreshY ? Math.round((sensorEvent.clientY - mirrorOffset.top - scrollOffset.y) / (options.thresholdY || 1)) * (options.thresholdY || 1) : Math.round(lastMovedY); + + if (options.xAxis && options.yAxis || initial) { + mirror.style.transform = `translate3d(${x}px, ${y}px, 0)`; + } else if (options.xAxis && !options.yAxis) { + mirror.style.transform = `translate3d(${x}px, ${initialY}px, 0)`; + } else if (options.yAxis && !options.xAxis) { + mirror.style.transform = `translate3d(${initialX}px, ${y}px, 0)`; + } + + if (initial) { + result.initialX = x; + result.initialY = y; + } + + result.lastMovedX = x; + result.lastMovedY = y; + } + + resolve(result); + }, { frame: withFrame }); + }; +} + +/** + * Wraps functions in promise with potential animation frame option + * @param {Function} callback + * @param {Object} options + * @param {Boolean} options.raf + * @return {Promise} + * @private + */ +function withPromise(callback, { raf = false } = {}) { + return new Promise((resolve, reject) => { + if (raf) { + requestAnimationFrame(() => { + callback(resolve, reject); + }); + } else { + callback(resolve, reject); + } + }); +} + +/** + * Returns true if the sensor event was triggered by a native browser drag event + * @param {SensorEvent} sensorEvent + */ +function isNativeDragEvent(sensorEvent) { + return (/^drag/.test(sensorEvent.originalEvent.type) + ); +} + +/***/ }), +/* 63 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.defaultOptions = undefined; + +var _Mirror = __webpack_require__(62); + +var _Mirror2 = _interopRequireDefault(_Mirror); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _Mirror2.default; +exports.defaultOptions = _Mirror.defaultOptions; + +/***/ }), +/* 64 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _AbstractPlugin = __webpack_require__(0); + +var _AbstractPlugin2 = _interopRequireDefault(_AbstractPlugin); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const onInitialize = Symbol('onInitialize'); +const onDestroy = Symbol('onDestroy'); + +/** + * Focusable default options + * @property {Object} defaultOptions + * @type {Object} + */ +const defaultOptions = {}; + +/** + * Focusable plugin + * @class Focusable + * @module Focusable + * @extends AbstractPlugin + */ +class Focusable extends _AbstractPlugin2.default { + /** + * Focusable constructor. + * @constructs Focusable + * @param {Draggable} draggable - Draggable instance + */ + constructor(draggable) { + super(draggable); + + /** + * Focusable options + * @property {Object} options + * @type {Object} + */ + this.options = _extends({}, defaultOptions, this.getOptions()); + + this[onInitialize] = this[onInitialize].bind(this); + this[onDestroy] = this[onDestroy].bind(this); + } + + /** + * Attaches listeners to draggable + */ + attach() { + this.draggable.on('draggable:initialize', this[onInitialize]).on('draggable:destroy', this[onDestroy]); + } + + /** + * Detaches listeners from draggable + */ + detach() { + this.draggable.off('draggable:initialize', this[onInitialize]).off('draggable:destroy', this[onDestroy]); + + // Remove modified elements when detach + this[onDestroy](); + } + + /** + * Returns options passed through draggable + * @return {Object} + */ + getOptions() { + return this.draggable.options.focusable || {}; + } + + /** + * Returns draggable containers and elements + * @return {HTMLElement[]} + */ + getElements() { + return [...this.draggable.containers, ...this.draggable.getDraggableElements()]; + } + + /** + * Intialize handler + * @private + */ + [onInitialize]() { + // Can wait until the next best frame is available + requestAnimationFrame(() => { + this.getElements().forEach(element => decorateElement(element)); + }); + } + + /** + * Destroy handler + * @private + */ + [onDestroy]() { + // Can wait until the next best frame is available + requestAnimationFrame(() => { + this.getElements().forEach(element => stripElement(element)); + }); + } +} + +exports.default = Focusable; /** + * Keeps track of all the elements that are missing tabindex attributes + * so they can be reset when draggable gets destroyed + * @const {HTMLElement[]} elementsWithMissingTabIndex + */ + +const elementsWithMissingTabIndex = []; + +/** + * Decorates element with tabindex attributes + * @param {HTMLElement} element + * @return {Object} + * @private + */ +function decorateElement(element) { + const hasMissingTabIndex = Boolean(!element.getAttribute('tabindex') && element.tabIndex === -1); + + if (hasMissingTabIndex) { + elementsWithMissingTabIndex.push(element); + element.tabIndex = 0; + } +} + +/** + * Removes elements tabindex attributes + * @param {HTMLElement} element + * @private + */ +function stripElement(element) { + const tabIndexElementPosition = elementsWithMissingTabIndex.indexOf(element); + + if (tabIndexElementPosition !== -1) { + element.tabIndex = -1; + elementsWithMissingTabIndex.splice(tabIndexElementPosition, 1); + } +} + +/***/ }), +/* 65 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _Focusable = __webpack_require__(64); + +var _Focusable2 = _interopRequireDefault(_Focusable); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _Focusable2.default; + +/***/ }), +/* 66 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +/** + * All draggable plugins inherit from this class. + * @abstract + * @class AbstractPlugin + * @module AbstractPlugin + */ +class AbstractPlugin { + /** + * AbstractPlugin constructor. + * @constructs AbstractPlugin + * @param {Draggable} draggable - Draggable instance + */ + constructor(draggable) { + /** + * Draggable instance + * @property draggable + * @type {Draggable} + */ + this.draggable = draggable; + } + + /** + * Override to add listeners + * @abstract + */ + attach() { + throw new Error('Not Implemented'); + } + + /** + * Override to remove listeners + * @abstract + */ + detach() { + throw new Error('Not Implemented'); + } +} +exports.default = AbstractPlugin; + +/***/ }), +/* 67 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.defaultOptions = undefined; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _AbstractPlugin = __webpack_require__(0); + +var _AbstractPlugin2 = _interopRequireDefault(_AbstractPlugin); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const onInitialize = Symbol('onInitialize'); +const onDestroy = Symbol('onDestroy'); +const announceEvent = Symbol('announceEvent'); +const announceMessage = Symbol('announceMessage'); + +const ARIA_RELEVANT = 'aria-relevant'; +const ARIA_ATOMIC = 'aria-atomic'; +const ARIA_LIVE = 'aria-live'; +const ROLE = 'role'; + +/** + * Announcement default options + * @property {Object} defaultOptions + * @property {Number} defaultOptions.expire + * @type {Object} + */ +const defaultOptions = exports.defaultOptions = { + expire: 7000 +}; + +/** + * Announcement plugin + * @class Announcement + * @module Announcement + * @extends AbstractPlugin + */ +class Announcement extends _AbstractPlugin2.default { + /** + * Announcement constructor. + * @constructs Announcement + * @param {Draggable} draggable - Draggable instance + */ + constructor(draggable) { + super(draggable); + + /** + * Plugin options + * @property options + * @type {Object} + */ + this.options = _extends({}, defaultOptions, this.getOptions()); + + /** + * Original draggable trigger method. Hack until we have onAll or on('all') + * @property originalTriggerMethod + * @type {Function} + */ + this.originalTriggerMethod = this.draggable.trigger; + + this[onInitialize] = this[onInitialize].bind(this); + this[onDestroy] = this[onDestroy].bind(this); + } + + /** + * Attaches listeners to draggable + */ + attach() { + this.draggable.on('draggable:initialize', this[onInitialize]); + } + + /** + * Detaches listeners from draggable + */ + detach() { + this.draggable.off('draggable:destroy', this[onDestroy]); + } + + /** + * Returns passed in options + */ + getOptions() { + return this.draggable.options.announcements || {}; + } + + /** + * Announces event + * @private + * @param {AbstractEvent} event + */ + [announceEvent](event) { + const message = this.options[event.type]; + + if (message && typeof message === 'string') { + this[announceMessage](message); + } + + if (message && typeof message === 'function') { + this[announceMessage](message(event)); + } + } + + /** + * Announces message to screen reader + * @private + * @param {String} message + */ + [announceMessage](message) { + announce(message, { expire: this.options.expire }); + } + + /** + * Initialize hander + * @private + */ + [onInitialize]() { + // Hack until there is an api for listening for all events + this.draggable.trigger = event => { + try { + this[announceEvent](event); + } finally { + // Ensure that original trigger is called + this.originalTriggerMethod.call(this.draggable, event); + } + }; + } + + /** + * Destroy hander + * @private + */ + [onDestroy]() { + this.draggable.trigger = this.originalTriggerMethod; + } +} + +exports.default = Announcement; /** + * @const {HTMLElement} liveRegion + */ + +const liveRegion = createRegion(); + +/** + * Announces message via live region + * @param {String} message + * @param {Object} options + * @param {Number} options.expire + */ +function announce(message, { expire }) { + const element = document.createElement('div'); + + element.textContent = message; + liveRegion.appendChild(element); + + return setTimeout(() => { + liveRegion.removeChild(element); + }, expire); +} + +/** + * Creates region element + * @return {HTMLElement} + */ +function createRegion() { + const element = document.createElement('div'); + + element.setAttribute('id', 'draggable-live-region'); + element.setAttribute(ARIA_RELEVANT, 'additions'); + element.setAttribute(ARIA_ATOMIC, 'true'); + element.setAttribute(ARIA_LIVE, 'assertive'); + element.setAttribute(ROLE, 'log'); + + element.style.position = 'fixed'; + element.style.width = '1px'; + element.style.height = '1px'; + element.style.top = '-1px'; + element.style.overflow = 'hidden'; + + return element; +} + +// Append live region element as early as possible +document.addEventListener('DOMContentLoaded', () => { + document.body.appendChild(liveRegion); +}); + +/***/ }), +/* 68 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.defaultOptions = undefined; + +var _Announcement = __webpack_require__(67); + +var _Announcement2 = _interopRequireDefault(_Announcement); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _Announcement2.default; +exports.defaultOptions = _Announcement.defaultOptions; + +/***/ }), +/* 69 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.DraggableDestroyEvent = exports.DraggableInitializedEvent = exports.DraggableEvent = undefined; + +var _AbstractEvent = __webpack_require__(1); + +var _AbstractEvent2 = _interopRequireDefault(_AbstractEvent); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Base draggable event + * @class DraggableEvent + * @module DraggableEvent + * @extends AbstractEvent + */ +class DraggableEvent extends _AbstractEvent2.default { + + /** + * Draggable instance + * @property draggable + * @type {Draggable} + * @readonly + */ + get draggable() { + return this.data.draggable; + } +} + +exports.DraggableEvent = DraggableEvent; /** + * Draggable initialized event + * @class DraggableInitializedEvent + * @module DraggableInitializedEvent + * @extends DraggableEvent + */ + +DraggableEvent.type = 'draggable'; +class DraggableInitializedEvent extends DraggableEvent {} + +exports.DraggableInitializedEvent = DraggableInitializedEvent; /** + * Draggable destory event + * @class DraggableInitializedEvent + * @module DraggableDestroyEvent + * @extends DraggableDestroyEvent + */ + +DraggableInitializedEvent.type = 'draggable:initialize'; +class DraggableDestroyEvent extends DraggableEvent {} +exports.DraggableDestroyEvent = DraggableDestroyEvent; +DraggableDestroyEvent.type = 'draggable:destroy'; + +/***/ }), +/* 70 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +const canceled = Symbol('canceled'); + +/** + * All events fired by draggable inherit this class. You can call `cancel()` to + * cancel a specific event or you can check if an event has been canceled by + * calling `canceled()`. + * @abstract + * @class AbstractEvent + * @module AbstractEvent + */ +class AbstractEvent { + + /** + * AbstractEvent constructor. + * @constructs AbstractEvent + * @param {object} data - Event data + */ + + /** + * Event type + * @static + * @abstract + * @property type + * @type {String} + */ + constructor(data) { + this[canceled] = false; + this.data = data; + } + + /** + * Read-only type + * @abstract + * @return {String} + */ + + + /** + * Event cancelable + * @static + * @abstract + * @property cancelable + * @type {Boolean} + */ + get type() { + return this.constructor.type; + } + + /** + * Read-only cancelable + * @abstract + * @return {Boolean} + */ + get cancelable() { + return this.constructor.cancelable; + } + + /** + * Cancels the event instance + * @abstract + */ + cancel() { + this[canceled] = true; + } + + /** + * Check if event has been canceled + * @abstract + * @return {Boolean} + */ + canceled() { + return Boolean(this[canceled]); + } + + /** + * Returns new event instance with existing event data. + * This method allows for overriding of event data. + * @param {Object} data + * @return {AbstractEvent} + */ + clone(data) { + return new this.constructor(_extends({}, this.data, data)); + } +} +exports.default = AbstractEvent; +AbstractEvent.type = 'event'; +AbstractEvent.cancelable = false; + +/***/ }), +/* 71 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.DragStoppedEvent = exports.DragStopEvent = exports.DragPressureEvent = exports.DragOutContainerEvent = exports.DragOverContainerEvent = exports.DragOutEvent = exports.DragOverEvent = exports.DragMoveEvent = exports.DragStartEvent = exports.DragEvent = undefined; + +var _AbstractEvent = __webpack_require__(1); + +var _AbstractEvent2 = _interopRequireDefault(_AbstractEvent); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Base drag event + * @class DragEvent + * @module DragEvent + * @extends AbstractEvent + */ +class DragEvent extends _AbstractEvent2.default { + + /** + * Draggables source element + * @property source + * @type {HTMLElement} + * @readonly + */ + get source() { + return this.data.source; + } + + /** + * Draggables original source element + * @property originalSource + * @type {HTMLElement} + * @readonly + */ + get originalSource() { + return this.data.originalSource; + } + + /** + * Draggables mirror element + * @property mirror + * @type {HTMLElement} + * @readonly + */ + get mirror() { + return this.data.mirror; + } + + /** + * Draggables source container element + * @property sourceContainer + * @type {HTMLElement} + * @readonly + */ + get sourceContainer() { + return this.data.sourceContainer; + } + + /** + * Sensor event + * @property sensorEvent + * @type {SensorEvent} + * @readonly + */ + get sensorEvent() { + return this.data.sensorEvent; + } + + /** + * Original event that triggered sensor event + * @property originalEvent + * @type {Event} + * @readonly + */ + get originalEvent() { + if (this.sensorEvent) { + return this.sensorEvent.originalEvent; + } + + return null; + } +} + +exports.DragEvent = DragEvent; /** + * Drag start event + * @class DragStartEvent + * @module DragStartEvent + * @extends DragEvent + */ + +DragEvent.type = 'drag'; +class DragStartEvent extends DragEvent {} + +exports.DragStartEvent = DragStartEvent; /** + * Drag move event + * @class DragMoveEvent + * @module DragMoveEvent + * @extends DragEvent + */ + +DragStartEvent.type = 'drag:start'; +DragStartEvent.cancelable = true; +class DragMoveEvent extends DragEvent {} + +exports.DragMoveEvent = DragMoveEvent; /** + * Drag over event + * @class DragOverEvent + * @module DragOverEvent + * @extends DragEvent + */ + +DragMoveEvent.type = 'drag:move'; +class DragOverEvent extends DragEvent { + + /** + * Draggable container you are over + * @property overContainer + * @type {HTMLElement} + * @readonly + */ + get overContainer() { + return this.data.overContainer; + } + + /** + * Draggable element you are over + * @property over + * @type {HTMLElement} + * @readonly + */ + get over() { + return this.data.over; + } +} + +exports.DragOverEvent = DragOverEvent; /** + * Drag out event + * @class DragOutEvent + * @module DragOutEvent + * @extends DragEvent + */ + +DragOverEvent.type = 'drag:over'; +DragOverEvent.cancelable = true; +class DragOutEvent extends DragEvent { + + /** + * Draggable container you are over + * @property overContainer + * @type {HTMLElement} + * @readonly + */ + get overContainer() { + return this.data.overContainer; + } + + /** + * Draggable element you left + * @property over + * @type {HTMLElement} + * @readonly + */ + get over() { + return this.data.over; + } +} + +exports.DragOutEvent = DragOutEvent; /** + * Drag over container event + * @class DragOverContainerEvent + * @module DragOverContainerEvent + * @extends DragEvent + */ + +DragOutEvent.type = 'drag:out'; +class DragOverContainerEvent extends DragEvent { + + /** + * Draggable container you are over + * @property overContainer + * @type {HTMLElement} + * @readonly + */ + get overContainer() { + return this.data.overContainer; + } +} + +exports.DragOverContainerEvent = DragOverContainerEvent; /** + * Drag out container event + * @class DragOutContainerEvent + * @module DragOutContainerEvent + * @extends DragEvent + */ + +DragOverContainerEvent.type = 'drag:over:container'; +class DragOutContainerEvent extends DragEvent { + + /** + * Draggable container you left + * @property overContainer + * @type {HTMLElement} + * @readonly + */ + get overContainer() { + return this.data.overContainer; + } +} + +exports.DragOutContainerEvent = DragOutContainerEvent; /** + * Drag pressure event + * @class DragPressureEvent + * @module DragPressureEvent + * @extends DragEvent + */ + +DragOutContainerEvent.type = 'drag:out:container'; +class DragPressureEvent extends DragEvent { + + /** + * Pressure applied on draggable element + * @property pressure + * @type {Number} + * @readonly + */ + get pressure() { + return this.data.pressure; + } +} + +exports.DragPressureEvent = DragPressureEvent; /** + * Drag stop event + * @class DragStopEvent + * @module DragStopEvent + * @extends DragEvent + */ + +DragPressureEvent.type = 'drag:pressure'; +class DragStopEvent extends DragEvent {} + +exports.DragStopEvent = DragStopEvent; /** + * Drag stopped event + * @class DragStoppedEvent + * @module DragStoppedEvent + * @extends DragEvent + */ + +DragStopEvent.type = 'drag:stop'; +class DragStoppedEvent extends DragEvent {} +exports.DragStoppedEvent = DragStoppedEvent; +DragStoppedEvent.type = 'drag:stopped'; + +/***/ }), +/* 72 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Plugins = exports.Sensors = exports.Sortable = exports.Swappable = exports.Droppable = exports.Draggable = exports.BasePlugin = exports.BaseEvent = undefined; + +var _Draggable = __webpack_require__(5); + +Object.defineProperty(exports, 'Draggable', { + enumerable: true, + get: function () { + return _interopRequireDefault(_Draggable).default; + } +}); + +var _Droppable = __webpack_require__(36); + +Object.defineProperty(exports, 'Droppable', { + enumerable: true, + get: function () { + return _interopRequireDefault(_Droppable).default; + } +}); + +var _Swappable = __webpack_require__(33); + +Object.defineProperty(exports, 'Swappable', { + enumerable: true, + get: function () { + return _interopRequireDefault(_Swappable).default; + } +}); + +var _Sortable = __webpack_require__(30); + +Object.defineProperty(exports, 'Sortable', { + enumerable: true, + get: function () { + return _interopRequireDefault(_Sortable).default; + } +}); + +var _AbstractEvent = __webpack_require__(1); + +var _AbstractEvent2 = _interopRequireDefault(_AbstractEvent); + +var _AbstractPlugin = __webpack_require__(0); + +var _AbstractPlugin2 = _interopRequireDefault(_AbstractPlugin); + +var _Sensors = __webpack_require__(6); + +var Sensors = _interopRequireWildcard(_Sensors); + +var _Plugins = __webpack_require__(27); + +var Plugins = _interopRequireWildcard(_Plugins); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.BaseEvent = _AbstractEvent2.default; +exports.BasePlugin = _AbstractPlugin2.default; +exports.Sensors = Sensors; +exports.Plugins = Plugins; + +/***/ }) +/******/ ]); +}); diff --git a/public/external/chart.js/LICENSE.md b/public/external/chart.js/LICENSE.md new file mode 100644 index 0000000000..9182b8e81d --- /dev/null +++ b/public/external/chart.js/LICENSE.md @@ -0,0 +1,9 @@ +The MIT License (MIT) + +Copyright (c) 2014-2022 Chart.js Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/public/external/chart.js/dist/chart.min.js b/public/external/chart.js/dist/chart.min.js new file mode 100644 index 0000000000..8f69759e05 --- /dev/null +++ b/public/external/chart.js/dist/chart.min.js @@ -0,0 +1,13 @@ +/*! + * Chart.js v3.9.1 + * https://www.chartjs.org + * (c) 2022 Chart.js Contributors + * Released under the MIT License + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chart=e()}(this,(function(){"use strict";function t(){}const e=function(){let t=0;return function(){return t++}}();function i(t){return null==t}function s(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function n(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}const o=t=>("number"==typeof t||t instanceof Number)&&isFinite(+t);function a(t,e){return o(t)?t:e}function r(t,e){return void 0===t?e:t}const l=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:t/e,h=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function c(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function d(t,e,i,o){let a,r,l;if(s(t))if(r=t.length,o)for(a=r-1;a>=0;a--)e.call(i,t[a],a);else for(a=0;at,x:t=>t.x,y:t=>t.y};function y(t,e){const i=_[e]||(_[e]=function(t){const e=v(t);return t=>{for(const i of e){if(""===i)break;t=t&&t[i]}return t}}(e));return i(t)}function v(t){const e=t.split("."),i=[];let s="";for(const t of e)s+=t,s.endsWith("\\")?s=s.slice(0,-1)+".":(i.push(s),s="");return i}function w(t){return t.charAt(0).toUpperCase()+t.slice(1)}const M=t=>void 0!==t,k=t=>"function"==typeof t,S=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0};function P(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const D=Math.PI,O=2*D,C=O+D,A=Number.POSITIVE_INFINITY,T=D/180,L=D/2,E=D/4,R=2*D/3,I=Math.log10,z=Math.sign;function F(t){const e=Math.round(t);t=N(t,e,t/1e3)?e:t;const i=Math.pow(10,Math.floor(I(t))),s=t/i;return(s<=1?1:s<=2?2:s<=5?5:10)*i}function V(t){const e=[],i=Math.sqrt(t);let s;for(s=1;st-e)).pop(),e}function B(t){return!isNaN(parseFloat(t))&&isFinite(t)}function N(t,e,i){return Math.abs(t-e)=t}function j(t,e,i){let s,n,o;for(s=0,n=t.length;sl&&h=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function tt(t,e,i){i=i||(i=>t[i]1;)s=o+n>>1,i(s)?o=s:n=s;return{lo:o,hi:n}}const et=(t,e,i,s)=>tt(t,i,s?s=>t[s][e]<=i:s=>t[s][e]tt(t,i,(s=>t[s][e]>=i));function st(t,e,i){let s=0,n=t.length;for(;ss&&t[n-1]>i;)n--;return s>0||n{const i="_onData"+w(e),s=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const n=s.apply(this,e);return t._chartjs.listeners.forEach((t=>{"function"==typeof t[i]&&t[i](...e)})),n}})})))}function at(t,e){const i=t._chartjs;if(!i)return;const s=i.listeners,n=s.indexOf(e);-1!==n&&s.splice(n,1),s.length>0||(nt.forEach((e=>{delete t[e]})),delete t._chartjs)}function rt(t){const e=new Set;let i,s;for(i=0,s=t.length;iArray.prototype.slice.call(t));let n=!1,o=[];return function(...i){o=s(i),n||(n=!0,lt.call(window,(()=>{n=!1,t.apply(e,o)})))}}function ct(t,e){let i;return function(...s){return e?(clearTimeout(i),i=setTimeout(t,e,s)):t.apply(this,s),e}}const dt=t=>"start"===t?"left":"end"===t?"right":"center",ut=(t,e,i)=>"start"===t?e:"end"===t?i:(e+i)/2,ft=(t,e,i,s)=>t===(s?"left":"right")?i:"center"===t?(e+i)/2:e;function gt(t,e,i){const s=e.length;let n=0,o=s;if(t._sorted){const{iScale:a,_parsed:r}=t,l=a.axis,{min:h,max:c,minDefined:d,maxDefined:u}=a.getUserBounds();d&&(n=Z(Math.min(et(r,a.axis,h).lo,i?s:et(e,l,a.getPixelForValue(h)).lo),0,s-1)),o=u?Z(Math.max(et(r,a.axis,c,!0).hi+1,i?0:et(e,l,a.getPixelForValue(c),!0).hi+1),n,s)-n:s-n}return{start:n,count:o}}function pt(t){const{xScale:e,yScale:i,_scaleRanges:s}=t,n={xmin:e.min,xmax:e.max,ymin:i.min,ymax:i.max};if(!s)return t._scaleRanges=n,!0;const o=s.xmin!==e.min||s.xmax!==e.max||s.ymin!==i.min||s.ymax!==i.max;return Object.assign(s,n),o}var mt=new class{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,s){const n=e.listeners[s],o=e.duration;n.forEach((s=>s({chart:t,initial:e.initial,numSteps:o,currentStep:Math.min(i-e.start,o)})))}_refresh(){this._request||(this._running=!0,this._request=lt.call(window,(()=>{this._update(),this._request=null,this._running&&this._refresh()})))}_update(t=Date.now()){let e=0;this._charts.forEach(((i,s)=>{if(!i.running||!i.items.length)return;const n=i.items;let o,a=n.length-1,r=!1;for(;a>=0;--a)o=n[a],o._active?(o._total>i.duration&&(i.duration=o._total),o.tick(t),r=!0):(n[a]=n[n.length-1],n.pop());r&&(s.draw(),this._notify(s,i,t,"progress")),n.length||(i.running=!1,this._notify(s,i,t,"complete"),i.initial=!1),e+=n.length})),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce(((t,e)=>Math.max(t,e._duration)),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let s=i.length-1;for(;s>=0;--s)i[s].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}; +/*! + * @kurkle/color v0.2.1 + * https://github.com/kurkle/color#readme + * (c) 2022 Jukka Kurkela + * Released under the MIT License + */function bt(t){return t+.5|0}const xt=(t,e,i)=>Math.max(Math.min(t,i),e);function _t(t){return xt(bt(2.55*t),0,255)}function yt(t){return xt(bt(255*t),0,255)}function vt(t){return xt(bt(t/2.55)/100,0,1)}function wt(t){return xt(bt(100*t),0,100)}const Mt={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},kt=[..."0123456789ABCDEF"],St=t=>kt[15&t],Pt=t=>kt[(240&t)>>4]+kt[15&t],Dt=t=>(240&t)>>4==(15&t);function Ot(t){var e=(t=>Dt(t.r)&&Dt(t.g)&&Dt(t.b)&&Dt(t.a))(t)?St:Pt;return t?"#"+e(t.r)+e(t.g)+e(t.b)+((t,e)=>t<255?e(t):"")(t.a,e):void 0}const Ct=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function At(t,e,i){const s=e*Math.min(i,1-i),n=(e,n=(e+t/30)%12)=>i-s*Math.max(Math.min(n-3,9-n,1),-1);return[n(0),n(8),n(4)]}function Tt(t,e,i){const s=(s,n=(s+t/60)%6)=>i-i*e*Math.max(Math.min(n,4-n,1),0);return[s(5),s(3),s(1)]}function Lt(t,e,i){const s=At(t,1,.5);let n;for(e+i>1&&(n=1/(e+i),e*=n,i*=n),n=0;n<3;n++)s[n]*=1-e-i,s[n]+=e;return s}function Et(t){const e=t.r/255,i=t.g/255,s=t.b/255,n=Math.max(e,i,s),o=Math.min(e,i,s),a=(n+o)/2;let r,l,h;return n!==o&&(h=n-o,l=a>.5?h/(2-n-o):h/(n+o),r=function(t,e,i,s,n){return t===n?(e-i)/s+(e>16&255,o>>8&255,255&o]}return t}(),Nt.transparent=[0,0,0,0]);const e=Nt[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}const jt=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;const Ht=t=>t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055,$t=t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4);function Yt(t,e,i){if(t){let s=Et(t);s[e]=Math.max(0,Math.min(s[e]+s[e]*i,0===e?360:1)),s=It(s),t.r=s[0],t.g=s[1],t.b=s[2]}}function Ut(t,e){return t?Object.assign(e||{},t):t}function Xt(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=yt(t[3]))):(e=Ut(t,{r:0,g:0,b:0,a:1})).a=yt(e.a),e}function qt(t){return"r"===t.charAt(0)?function(t){const e=jt.exec(t);let i,s,n,o=255;if(e){if(e[7]!==i){const t=+e[7];o=e[8]?_t(t):xt(255*t,0,255)}return i=+e[1],s=+e[3],n=+e[5],i=255&(e[2]?_t(i):xt(i,0,255)),s=255&(e[4]?_t(s):xt(s,0,255)),n=255&(e[6]?_t(n):xt(n,0,255)),{r:i,g:s,b:n,a:o}}}(t):Ft(t)}class Kt{constructor(t){if(t instanceof Kt)return t;const e=typeof t;let i;var s,n,o;"object"===e?i=Xt(t):"string"===e&&(o=(s=t).length,"#"===s[0]&&(4===o||5===o?n={r:255&17*Mt[s[1]],g:255&17*Mt[s[2]],b:255&17*Mt[s[3]],a:5===o?17*Mt[s[4]]:255}:7!==o&&9!==o||(n={r:Mt[s[1]]<<4|Mt[s[2]],g:Mt[s[3]]<<4|Mt[s[4]],b:Mt[s[5]]<<4|Mt[s[6]],a:9===o?Mt[s[7]]<<4|Mt[s[8]]:255})),i=n||Wt(t)||qt(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=Ut(this._rgb);return t&&(t.a=vt(t.a)),t}set rgb(t){this._rgb=Xt(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${vt(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):void 0;var t}hexString(){return this._valid?Ot(this._rgb):void 0}hslString(){return this._valid?function(t){if(!t)return;const e=Et(t),i=e[0],s=wt(e[1]),n=wt(e[2]);return t.a<255?`hsla(${i}, ${s}%, ${n}%, ${vt(t.a)})`:`hsl(${i}, ${s}%, ${n}%)`}(this._rgb):void 0}mix(t,e){if(t){const i=this.rgb,s=t.rgb;let n;const o=e===n?.5:e,a=2*o-1,r=i.a-s.a,l=((a*r==-1?a:(a+r)/(1+a*r))+1)/2;n=1-l,i.r=255&l*i.r+n*s.r+.5,i.g=255&l*i.g+n*s.g+.5,i.b=255&l*i.b+n*s.b+.5,i.a=o*i.a+(1-o)*s.a,this.rgb=i}return this}interpolate(t,e){return t&&(this._rgb=function(t,e,i){const s=$t(vt(t.r)),n=$t(vt(t.g)),o=$t(vt(t.b));return{r:yt(Ht(s+i*($t(vt(e.r))-s))),g:yt(Ht(n+i*($t(vt(e.g))-n))),b:yt(Ht(o+i*($t(vt(e.b))-o))),a:t.a+i*(e.a-t.a)}}(this._rgb,t._rgb,e)),this}clone(){return new Kt(this.rgb)}alpha(t){return this._rgb.a=yt(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=bt(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return Yt(this._rgb,2,t),this}darken(t){return Yt(this._rgb,2,-t),this}saturate(t){return Yt(this._rgb,1,t),this}desaturate(t){return Yt(this._rgb,1,-t),this}rotate(t){return function(t,e){var i=Et(t);i[0]=zt(i[0]+e),i=It(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}function Gt(t){return new Kt(t)}function Zt(t){if(t&&"object"==typeof t){const e=t.toString();return"[object CanvasPattern]"===e||"[object CanvasGradient]"===e}return!1}function Jt(t){return Zt(t)?t:Gt(t)}function Qt(t){return Zt(t)?t:Gt(t).saturate(.5).darken(.1).hexString()}const te=Object.create(null),ee=Object.create(null);function ie(t,e){if(!e)return t;const i=e.split(".");for(let e=0,s=i.length;et.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>Qt(e.backgroundColor),this.hoverBorderColor=(t,e)=>Qt(e.borderColor),this.hoverColor=(t,e)=>Qt(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t)}set(t,e){return se(this,t,e)}get(t){return ie(this,t)}describe(t,e){return se(ee,t,e)}override(t,e){return se(te,t,e)}route(t,e,i,s){const o=ie(this,t),a=ie(this,i),l="_"+e;Object.defineProperties(o,{[l]:{value:o[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[l],e=a[s];return n(t)?Object.assign({},e,t):r(t,e)},set(t){this[l]=t}}})}}({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}});function oe(){return"undefined"!=typeof window&&"undefined"!=typeof document}function ae(t){let e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e}function re(t,e,i){let s;return"string"==typeof t?(s=parseInt(t,10),-1!==t.indexOf("%")&&(s=s/100*e.parentNode[i])):s=t,s}const le=t=>window.getComputedStyle(t,null);function he(t,e){return le(t).getPropertyValue(e)}const ce=["top","right","bottom","left"];function de(t,e,i){const s={};i=i?"-"+i:"";for(let n=0;n<4;n++){const o=ce[n];s[o]=parseFloat(t[e+"-"+o+i])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}function ue(t,e){if("native"in t)return t;const{canvas:i,currentDevicePixelRatio:s}=e,n=le(i),o="border-box"===n.boxSizing,a=de(n,"padding"),r=de(n,"border","width"),{x:l,y:h,box:c}=function(t,e){const i=t.touches,s=i&&i.length?i[0]:t,{offsetX:n,offsetY:o}=s;let a,r,l=!1;if(((t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot))(n,o,t.target))a=n,r=o;else{const t=e.getBoundingClientRect();a=s.clientX-t.left,r=s.clientY-t.top,l=!0}return{x:a,y:r,box:l}}(t,i),d=a.left+(c&&r.left),u=a.top+(c&&r.top);let{width:f,height:g}=e;return o&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*i.width/s),y:Math.round((h-u)/g*i.height/s)}}const fe=t=>Math.round(10*t)/10;function ge(t,e,i,s){const n=le(t),o=de(n,"margin"),a=re(n.maxWidth,t,"clientWidth")||A,r=re(n.maxHeight,t,"clientHeight")||A,l=function(t,e,i){let s,n;if(void 0===e||void 0===i){const o=ae(t);if(o){const t=o.getBoundingClientRect(),a=le(o),r=de(a,"border","width"),l=de(a,"padding");e=t.width-l.width-r.width,i=t.height-l.height-r.height,s=re(a.maxWidth,o,"clientWidth"),n=re(a.maxHeight,o,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:s||A,maxHeight:n||A}}(t,e,i);let{width:h,height:c}=l;if("content-box"===n.boxSizing){const t=de(n,"border","width"),e=de(n,"padding");h-=e.width+t.width,c-=e.height+t.height}return h=Math.max(0,h-o.width),c=Math.max(0,s?Math.floor(h/s):c-o.height),h=fe(Math.min(h,a,l.maxWidth)),c=fe(Math.min(c,r,l.maxHeight)),h&&!c&&(c=fe(h/2)),{width:h,height:c}}function pe(t,e,i){const s=e||1,n=Math.floor(t.height*s),o=Math.floor(t.width*s);t.height=n/s,t.width=o/s;const a=t.canvas;return a.style&&(i||!a.style.height&&!a.style.width)&&(a.style.height=`${t.height}px`,a.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==s||a.height!==n||a.width!==o)&&(t.currentDevicePixelRatio=s,a.height=n,a.width=o,t.ctx.setTransform(s,0,0,s,0,0),!0)}const me=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};window.addEventListener("test",null,e),window.removeEventListener("test",null,e)}catch(t){}return t}();function be(t,e){const i=he(t,e),s=i&&i.match(/^(\d+)(\.\d+)?px$/);return s?+s[1]:void 0}function xe(t){return!t||i(t.size)||i(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}function _e(t,e,i,s,n){let o=e[n];return o||(o=e[n]=t.measureText(n).width,i.push(n)),o>s&&(s=o),s}function ye(t,e,i,n){let o=(n=n||{}).data=n.data||{},a=n.garbageCollect=n.garbageCollect||[];n.font!==e&&(o=n.data={},a=n.garbageCollect=[],n.font=e),t.save(),t.font=e;let r=0;const l=i.length;let h,c,d,u,f;for(h=0;hi.length){for(h=0;h0&&t.stroke()}}function Se(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.xe.top-i&&t.y0&&""!==r.strokeColor;let c,d;for(t.save(),t.font=a.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]);i(e.rotation)||t.rotate(e.rotation);e.color&&(t.fillStyle=e.color);e.textAlign&&(t.textAlign=e.textAlign);e.textBaseline&&(t.textBaseline=e.textBaseline)}(t,r),c=0;ct[0])){M(s)||(s=$e("_fallback",t));const o={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:i,_fallback:s,_getTarget:n,override:n=>Ee([n,...t],e,i,s)};return new Proxy(o,{deleteProperty:(e,i)=>(delete e[i],delete e._keys,delete t[0][i],!0),get:(i,s)=>Ve(i,s,(()=>function(t,e,i,s){let n;for(const o of e)if(n=$e(ze(o,t),i),M(n))return Fe(t,n)?je(i,s,t,n):n}(s,e,t,i))),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(t._scopes[0],e),getPrototypeOf:()=>Reflect.getPrototypeOf(t[0]),has:(t,e)=>Ye(t).includes(e),ownKeys:t=>Ye(t),set(t,e,i){const s=t._storage||(t._storage=n());return t[e]=s[e]=i,delete t._keys,!0}})}function Re(t,e,i,o){const a={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:Ie(t,o),setContext:e=>Re(t,e,i,o),override:s=>Re(t.override(s),e,i,o)};return new Proxy(a,{deleteProperty:(e,i)=>(delete e[i],delete t[i],!0),get:(t,e,i)=>Ve(t,e,(()=>function(t,e,i){const{_proxy:o,_context:a,_subProxy:r,_descriptors:l}=t;let h=o[e];k(h)&&l.isScriptable(e)&&(h=function(t,e,i,s){const{_proxy:n,_context:o,_subProxy:a,_stack:r}=i;if(r.has(t))throw new Error("Recursion detected: "+Array.from(r).join("->")+"->"+t);r.add(t),e=e(o,a||s),r.delete(t),Fe(t,e)&&(e=je(n._scopes,n,t,e));return e}(e,h,t,i));s(h)&&h.length&&(h=function(t,e,i,s){const{_proxy:o,_context:a,_subProxy:r,_descriptors:l}=i;if(M(a.index)&&s(t))e=e[a.index%e.length];else if(n(e[0])){const i=e,s=o._scopes.filter((t=>t!==i));e=[];for(const n of i){const i=je(s,o,t,n);e.push(Re(i,a,r&&r[t],l))}}return e}(e,h,t,l.isIndexable));Fe(e,h)&&(h=Re(h,a,r&&r[e],l));return h}(t,e,i))),getOwnPropertyDescriptor:(e,i)=>e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i),getPrototypeOf:()=>Reflect.getPrototypeOf(t),has:(e,i)=>Reflect.has(t,i),ownKeys:()=>Reflect.ownKeys(t),set:(e,i,s)=>(t[i]=s,delete e[i],!0)})}function Ie(t,e={scriptable:!0,indexable:!0}){const{_scriptable:i=e.scriptable,_indexable:s=e.indexable,_allKeys:n=e.allKeys}=t;return{allKeys:n,scriptable:i,indexable:s,isScriptable:k(i)?i:()=>i,isIndexable:k(s)?s:()=>s}}const ze=(t,e)=>t?t+w(e):e,Fe=(t,e)=>n(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function Ve(t,e,i){if(Object.prototype.hasOwnProperty.call(t,e))return t[e];const s=i();return t[e]=s,s}function Be(t,e,i){return k(t)?t(e,i):t}const Ne=(t,e)=>!0===t?e:"string"==typeof t?y(e,t):void 0;function We(t,e,i,s,n){for(const o of e){const e=Ne(i,o);if(e){t.add(e);const o=Be(e._fallback,i,n);if(M(o)&&o!==i&&o!==s)return o}else if(!1===e&&M(s)&&i!==s)return null}return!1}function je(t,e,i,o){const a=e._rootScopes,r=Be(e._fallback,i,o),l=[...t,...a],h=new Set;h.add(o);let c=He(h,l,i,r||i,o);return null!==c&&((!M(r)||r===i||(c=He(h,l,r,c,o),null!==c))&&Ee(Array.from(h),[""],a,r,(()=>function(t,e,i){const o=t._getTarget();e in o||(o[e]={});const a=o[e];if(s(a)&&n(i))return i;return a}(e,i,o))))}function He(t,e,i,s,n){for(;i;)i=We(t,e,i,s,n);return i}function $e(t,e){for(const i of e){if(!i)continue;const e=i[t];if(M(e))return e}}function Ye(t){let e=t._keys;return e||(e=t._keys=function(t){const e=new Set;for(const i of t)for(const t of Object.keys(i).filter((t=>!t.startsWith("_"))))e.add(t);return Array.from(e)}(t._scopes)),e}function Ue(t,e,i,s){const{iScale:n}=t,{key:o="r"}=this._parsing,a=new Array(s);let r,l,h,c;for(r=0,l=s;re"x"===t?"y":"x";function Ge(t,e,i,s){const n=t.skip?e:t,o=e,a=i.skip?e:i,r=X(o,n),l=X(a,o);let h=r/(r+l),c=l/(r+l);h=isNaN(h)?0:h,c=isNaN(c)?0:c;const d=s*h,u=s*c;return{previous:{x:o.x-d*(a.x-n.x),y:o.y-d*(a.y-n.y)},next:{x:o.x+u*(a.x-n.x),y:o.y+u*(a.y-n.y)}}}function Ze(t,e="x"){const i=Ke(e),s=t.length,n=Array(s).fill(0),o=Array(s);let a,r,l,h=qe(t,0);for(a=0;a!t.skip))),"monotone"===e.cubicInterpolationMode)Ze(t,n);else{let i=s?t[t.length-1]:t[0];for(o=0,a=t.length;o0===t||1===t,ei=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*O/i),ii=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*O/i)+1,si={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*L),easeOutSine:t=>Math.sin(t*L),easeInOutSine:t=>-.5*(Math.cos(D*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>ti(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>ti(t)?t:ei(t,.075,.3),easeOutElastic:t=>ti(t)?t:ii(t,.075,.3),easeInOutElastic(t){const e=.1125;return ti(t)?t:t<.5?.5*ei(2*t,e,.45):.5+.5*ii(2*t-1,e,.45)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-si.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,i=2.75;return t<1/i?e*t*t:t<2/i?e*(t-=1.5/i)*t+.75:t<2.5/i?e*(t-=2.25/i)*t+.9375:e*(t-=2.625/i)*t+.984375},easeInOutBounce:t=>t<.5?.5*si.easeInBounce(2*t):.5*si.easeOutBounce(2*t-1)+.5};function ni(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function oi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:"middle"===s?i<.5?t.y:e.y:"after"===s?i<1?t.y:e.y:i>0?e.y:t.y}}function ai(t,e,i,s){const n={x:t.cp2x,y:t.cp2y},o={x:e.cp1x,y:e.cp1y},a=ni(t,n,i),r=ni(n,o,i),l=ni(o,e,i),h=ni(a,r,i),c=ni(r,l,i);return ni(h,c,i)}const ri=new Map;function li(t,e,i){return function(t,e){e=e||{};const i=t+JSON.stringify(e);let s=ri.get(i);return s||(s=new Intl.NumberFormat(t,e),ri.set(i,s)),s}(e,i).format(t)}const hi=new RegExp(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/),ci=new RegExp(/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/);function di(t,e){const i=(""+t).match(hi);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t}function ui(t,e){const i={},s=n(e),o=s?Object.keys(e):e,a=n(t)?s?i=>r(t[i],t[e[i]]):e=>t[e]:()=>t;for(const t of o)i[t]=+a(t)||0;return i}function fi(t){return ui(t,{top:"y",right:"x",bottom:"y",left:"x"})}function gi(t){return ui(t,["topLeft","topRight","bottomLeft","bottomRight"])}function pi(t){const e=fi(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function mi(t,e){t=t||{},e=e||ne.font;let i=r(t.size,e.size);"string"==typeof i&&(i=parseInt(i,10));let s=r(t.style,e.style);s&&!(""+s).match(ci)&&(console.warn('Invalid font style specified: "'+s+'"'),s="");const n={family:r(t.family,e.family),lineHeight:di(r(t.lineHeight,e.lineHeight),i),size:i,style:s,weight:r(t.weight,e.weight),string:""};return n.string=xe(n),n}function bi(t,e,i,n){let o,a,r,l=!0;for(o=0,a=t.length;oi&&0===t?0:t+e;return{min:a(s,-Math.abs(o)),max:a(n,o)}}function _i(t,e){return Object.assign(Object.create(t),e)}function yi(t,e,i){return t?function(t,e){return{x:i=>t+t+e-i,setWidth(t){e=t},textAlign:t=>"center"===t?t:"right"===t?"left":"right",xPlus:(t,e)=>t-e,leftForLtr:(t,e)=>t-e}}(e,i):{x:t=>t,setWidth(t){},textAlign:t=>t,xPlus:(t,e)=>t+e,leftForLtr:(t,e)=>t}}function vi(t,e){let i,s;"ltr"!==e&&"rtl"!==e||(i=t.canvas.style,s=[i.getPropertyValue("direction"),i.getPropertyPriority("direction")],i.setProperty("direction",e,"important"),t.prevTextDirection=s)}function wi(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function Mi(t){return"angle"===t?{between:G,compare:q,normalize:K}:{between:Q,compare:(t,e)=>t-e,normalize:t=>t}}function ki({start:t,end:e,count:i,loop:s,style:n}){return{start:t%i,end:e%i,loop:s&&(e-t+1)%i==0,style:n}}function Si(t,e,i){if(!i)return[t];const{property:s,start:n,end:o}=i,a=e.length,{compare:r,between:l,normalize:h}=Mi(s),{start:c,end:d,loop:u,style:f}=function(t,e,i){const{property:s,start:n,end:o}=i,{between:a,normalize:r}=Mi(s),l=e.length;let h,c,{start:d,end:u,loop:f}=t;if(f){for(d+=l,u+=l,h=0,c=l;hx||l(n,b,p)&&0!==r(n,b),v=()=>!x||0===r(o,p)||l(o,b,p);for(let t=c,i=c;t<=d;++t)m=e[t%a],m.skip||(p=h(m[s]),p!==b&&(x=l(p,n,o),null===_&&y()&&(_=0===r(p,n)?t:i),null!==_&&v()&&(g.push(ki({start:_,end:t,loop:u,count:a,style:f})),_=null),i=t,b=p));return null!==_&&g.push(ki({start:_,end:d,loop:u,count:a,style:f})),g}function Pi(t,e){const i=[],s=t.segments;for(let n=0;nn&&t[o%e].skip;)o--;return o%=e,{start:n,end:o}}(i,n,o,s);if(!0===s)return Oi(t,[{start:a,end:r,loop:o}],i,e);return Oi(t,function(t,e,i,s){const n=t.length,o=[];let a,r=e,l=t[e];for(a=e+1;a<=i;++a){const i=t[a%n];i.skip||i.stop?l.skip||(s=!1,o.push({start:e%n,end:(a-1)%n,loop:s}),e=r=i.stop?a:null):(r=a,l.skip&&(e=a)),l=i}return null!==r&&o.push({start:e%n,end:r%n,loop:s}),o}(i,a,r{t[a](e[i],n)&&(o.push({element:t,datasetIndex:s,index:l}),r=r||t.inRange(e.x,e.y,n))})),s&&!r?[]:o}var Vi={evaluateInteractionItems:Ei,modes:{index(t,e,i,s){const n=ue(e,t),o=i.axis||"x",a=i.includeInvisible||!1,r=i.intersect?Ri(t,n,o,s,a):zi(t,n,o,!1,s,a),l=[];return r.length?(t.getSortedVisibleDatasetMetas().forEach((t=>{const e=r[0].index,i=t.data[e];i&&!i.skip&&l.push({element:i,datasetIndex:t.index,index:e})})),l):[]},dataset(t,e,i,s){const n=ue(e,t),o=i.axis||"xy",a=i.includeInvisible||!1;let r=i.intersect?Ri(t,n,o,s,a):zi(t,n,o,!1,s,a);if(r.length>0){const e=r[0].datasetIndex,i=t.getDatasetMeta(e).data;r=[];for(let t=0;tRi(t,ue(e,t),i.axis||"xy",s,i.includeInvisible||!1),nearest(t,e,i,s){const n=ue(e,t),o=i.axis||"xy",a=i.includeInvisible||!1;return zi(t,n,o,i.intersect,s,a)},x:(t,e,i,s)=>Fi(t,ue(e,t),"x",i.intersect,s),y:(t,e,i,s)=>Fi(t,ue(e,t),"y",i.intersect,s)}};const Bi=["left","top","right","bottom"];function Ni(t,e){return t.filter((t=>t.pos===e))}function Wi(t,e){return t.filter((t=>-1===Bi.indexOf(t.pos)&&t.box.axis===e))}function ji(t,e){return t.sort(((t,i)=>{const s=e?i:t,n=e?t:i;return s.weight===n.weight?s.index-n.index:s.weight-n.weight}))}function Hi(t,e){const i=function(t){const e={};for(const i of t){const{stack:t,pos:s,stackWeight:n}=i;if(!t||!Bi.includes(s))continue;const o=e[t]||(e[t]={count:0,placed:0,weight:0,size:0});o.count++,o.weight+=n}return e}(t),{vBoxMaxWidth:s,hBoxMaxHeight:n}=e;let o,a,r;for(o=0,a=t.length;o{s[t]=Math.max(e[t],i[t])})),s}return s(t?["left","right"]:["top","bottom"])}function qi(t,e,i,s){const n=[];let o,a,r,l,h,c;for(o=0,a=t.length,h=0;ot.box.fullSize)),!0),s=ji(Ni(e,"left"),!0),n=ji(Ni(e,"right")),o=ji(Ni(e,"top"),!0),a=ji(Ni(e,"bottom")),r=Wi(e,"x"),l=Wi(e,"y");return{fullSize:i,leftAndTop:s.concat(o),rightAndBottom:n.concat(l).concat(a).concat(r),chartArea:Ni(e,"chartArea"),vertical:s.concat(n).concat(l),horizontal:o.concat(a).concat(r)}}(t.boxes),l=r.vertical,h=r.horizontal;d(t.boxes,(t=>{"function"==typeof t.beforeLayout&&t.beforeLayout()}));const c=l.reduce(((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1),0)||1,u=Object.freeze({outerWidth:e,outerHeight:i,padding:n,availableWidth:o,availableHeight:a,vBoxMaxWidth:o/2/c,hBoxMaxHeight:a/2}),f=Object.assign({},n);Yi(f,pi(s));const g=Object.assign({maxPadding:f,w:o,h:a,x:n.left,y:n.top},n),p=Hi(l.concat(h),u);qi(r.fullSize,g,u,p),qi(l,g,u,p),qi(h,g,u,p)&&qi(l,g,u,p),function(t){const e=t.maxPadding;function i(i){const s=Math.max(e[i]-t[i],0);return t[i]+=s,s}t.y+=i("top"),t.x+=i("left"),i("right"),i("bottom")}(g),Gi(r.leftAndTop,g,u,p),g.x+=g.w,g.y+=g.h,Gi(r.rightAndBottom,g,u,p),t.chartArea={left:g.left,top:g.top,right:g.left+g.w,bottom:g.top+g.h,height:g.h,width:g.w},d(r.chartArea,(e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(g.w,g.h,{left:0,top:0,right:0,bottom:0})}))}};class Ji{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,s){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,s?Math.floor(e/s):i)}}isAttached(t){return!0}updateConfig(t){}}class Qi extends Ji{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const ts={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},es=t=>null===t||""===t;const is=!!me&&{passive:!0};function ss(t,e,i){t.canvas.removeEventListener(e,i,is)}function ns(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function os(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||ns(i.addedNodes,s),e=e&&!ns(i.removedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}function as(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||ns(i.removedNodes,s),e=e&&!ns(i.addedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}const rs=new Map;let ls=0;function hs(){const t=window.devicePixelRatio;t!==ls&&(ls=t,rs.forEach(((e,i)=>{i.currentDevicePixelRatio!==t&&e()})))}function cs(t,e,i){const s=t.canvas,n=s&&ae(s);if(!n)return;const o=ht(((t,e)=>{const s=n.clientWidth;i(t,e),s{const e=t[0],i=e.contentRect.width,s=e.contentRect.height;0===i&&0===s||o(i,s)}));return a.observe(n),function(t,e){rs.size||window.addEventListener("resize",hs),rs.set(t,e)}(t,o),a}function ds(t,e,i){i&&i.disconnect(),"resize"===e&&function(t){rs.delete(t),rs.size||window.removeEventListener("resize",hs)}(t)}function us(t,e,i){const s=t.canvas,n=ht((e=>{null!==t.ctx&&i(function(t,e){const i=ts[t.type]||t.type,{x:s,y:n}=ue(t,e);return{type:i,chart:e,native:t,x:void 0!==s?s:null,y:void 0!==n?n:null}}(e,t))}),t,(t=>{const e=t[0];return[e,e.offsetX,e.offsetY]}));return function(t,e,i){t.addEventListener(e,i,is)}(s,e,n),n}class fs extends Ji{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(function(t,e){const i=t.style,s=t.getAttribute("height"),n=t.getAttribute("width");if(t.$chartjs={initial:{height:s,width:n,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",i.boxSizing=i.boxSizing||"border-box",es(n)){const e=be(t,"width");void 0!==e&&(t.width=e)}if(es(s))if(""===t.style.height)t.height=t.width/(e||2);else{const e=be(t,"height");void 0!==e&&(t.height=e)}}(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e.$chartjs)return!1;const s=e.$chartjs.initial;["height","width"].forEach((t=>{const n=s[t];i(n)?e.removeAttribute(t):e.setAttribute(t,n)}));const n=s.style||{};return Object.keys(n).forEach((t=>{e.style[t]=n[t]})),e.width=e.width,delete e.$chartjs,!0}addEventListener(t,e,i){this.removeEventListener(t,e);const s=t.$proxies||(t.$proxies={}),n={attach:os,detach:as,resize:cs}[e]||us;s[e]=n(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),s=i[e];if(!s)return;({attach:ds,detach:ds,resize:ds}[e]||ss)(t,e,s),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return ge(t,e,i,s)}isAttached(t){const e=ae(t);return!(!e||!e.isConnected)}}function gs(t){return!oe()||"undefined"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas?Qi:fs}var ps=Object.freeze({__proto__:null,_detectPlatform:gs,BasePlatform:Ji,BasicPlatform:Qi,DomPlatform:fs});const ms="transparent",bs={boolean:(t,e,i)=>i>.5?e:t,color(t,e,i){const s=Jt(t||ms),n=s.valid&&Jt(e||ms);return n&&n.valid?n.mix(s,i).hexString():e},number:(t,e,i)=>t+(e-t)*i};class xs{constructor(t,e,i,s){const n=e[i];s=bi([t.to,s,n,t.from]);const o=bi([t.from,n,s]);this._active=!0,this._fn=t.fn||bs[t.type||typeof o],this._easing=si[t.easing]||si.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=o,this._to=s,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);const s=this._target[this._prop],n=i-this._start,o=this._duration-n;this._start=i,this._duration=Math.floor(Math.max(o,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=bi([t.to,e,s,t.from]),this._from=bi([t.from,s,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,i=this._duration,s=this._prop,n=this._from,o=this._loop,a=this._to;let r;if(this._active=n!==a&&(o||e1?2-r:r,r=this._easing(Math.min(1,Math.max(0,r))),this._target[s]=this._fn(n,a,r))}wait(){const t=this._promises||(this._promises=[]);return new Promise(((e,i)=>{t.push({res:e,rej:i})}))}_notify(t){const e=t?"res":"rej",i=this._promises||[];for(let t=0;t"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),ne.set("animations",{colors:{type:"color",properties:["color","borderColor","backgroundColor"]},numbers:{type:"number",properties:["x","y","borderWidth","radius","tension"]}}),ne.describe("animations",{_fallback:"animation"}),ne.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>0|t}}}});class ys{constructor(t,e){this._chart=t,this._properties=new Map,this.configure(e)}configure(t){if(!n(t))return;const e=this._properties;Object.getOwnPropertyNames(t).forEach((i=>{const o=t[i];if(!n(o))return;const a={};for(const t of _s)a[t]=o[t];(s(o.properties)&&o.properties||[i]).forEach((t=>{t!==i&&e.has(t)||e.set(t,a)}))}))}_animateOptions(t,e){const i=e.options,s=function(t,e){if(!e)return;let i=t.options;if(!i)return void(t.options=e);i.$shared&&(t.options=i=Object.assign({},i,{$shared:!1,$animations:{}}));return i}(t,i);if(!s)return[];const n=this._createAnimations(s,i);return i.$shared&&function(t,e){const i=[],s=Object.keys(e);for(let e=0;e{t.options=i}),(()=>{})),n}_createAnimations(t,e){const i=this._properties,s=[],n=t.$animations||(t.$animations={}),o=Object.keys(e),a=Date.now();let r;for(r=o.length-1;r>=0;--r){const l=o[r];if("$"===l.charAt(0))continue;if("options"===l){s.push(...this._animateOptions(t,e));continue}const h=e[l];let c=n[l];const d=i.get(l);if(c){if(d&&c.active()){c.update(d,h,a);continue}c.cancel()}d&&d.duration?(n[l]=c=new xs(d,t,l,h),s.push(c)):t[l]=h}return s}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(mt.add(this._chart,i),!0):void 0}}function vs(t,e){const i=t&&t.options||{},s=i.reverse,n=void 0===i.min?e:0,o=void 0===i.max?e:0;return{start:s?o:n,end:s?n:o}}function ws(t,e){const i=[],s=t._getSortedDatasetMetas(e);let n,o;for(n=0,o=s.length;n0||!i&&e<0)return n.index}return null}function Ds(t,e){const{chart:i,_cachedMeta:s}=t,n=i._stacks||(i._stacks={}),{iScale:o,vScale:a,index:r}=s,l=o.axis,h=a.axis,c=function(t,e,i){return`${t.id}.${e.id}.${i.stack||i.type}`}(o,a,s),d=e.length;let u;for(let t=0;ti[t].axis===e)).shift()}function Cs(t,e){const i=t.controller.index,s=t.vScale&&t.vScale.axis;if(s){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[s]||void 0===e[s][i])return;delete e[s][i]}}}const As=t=>"reset"===t||"none"===t,Ts=(t,e)=>e?t:Object.assign({},t);class Ls{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=ks(t.vScale,t),this.addElements()}updateIndex(t){this.index!==t&&Cs(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,i=this.getDataset(),s=(t,e,i,s)=>"x"===t?e:"r"===t?s:i,n=e.xAxisID=r(i.xAxisID,Os(t,"x")),o=e.yAxisID=r(i.yAxisID,Os(t,"y")),a=e.rAxisID=r(i.rAxisID,Os(t,"r")),l=e.indexAxis,h=e.iAxisID=s(l,n,o,a),c=e.vAxisID=s(l,o,n,a);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(o),e.rScale=this.getScaleForId(a),e.iScale=this.getScaleForId(h),e.vScale=this.getScaleForId(c)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&at(this._data,this),t._stacked&&Cs(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(n(e))this._data=function(t){const e=Object.keys(t),i=new Array(e.length);let s,n,o;for(s=0,n=e.length;s0&&i._parsed[t-1];if(!1===this._parsing)i._parsed=o,i._sorted=!0,d=o;else{d=s(o[t])?this.parseArrayData(i,o,t,e):n(o[t])?this.parseObjectData(i,o,t,e):this.parsePrimitiveData(i,o,t,e);const a=()=>null===c[l]||f&&c[l]t&&!e.hidden&&e._stacked&&{keys:ws(i,!0),values:null})(e,i,this.chart),h={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:c,max:d}=function(t){const{min:e,max:i,minDefined:s,maxDefined:n}=t.getUserBounds();return{min:s?e:Number.NEGATIVE_INFINITY,max:n?i:Number.POSITIVE_INFINITY}}(r);let u,f;function g(){f=s[u];const e=f[r.axis];return!o(f[t.axis])||c>e||d=0;--u)if(!g()){this.updateRangeFromParsed(h,t,f,l);break}return h}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let s,n,a;for(s=0,n=e.length;s=0&&tthis.getContext(i,s)),c);return f.$shared&&(f.$shared=r,n[o]=Object.freeze(Ts(f,r))),f}_resolveAnimations(t,e,i){const s=this.chart,n=this._cachedDataOpts,o=`animation-${e}`,a=n[o];if(a)return a;let r;if(!1!==s.options.animation){const s=this.chart.config,n=s.datasetAnimationScopeKeys(this._type,e),o=s.getOptionScopes(this.getDataset(),n);r=s.createResolver(o,this.getContext(t,i,e))}const l=new ys(s,r&&r.animations);return r&&r._cacheable&&(n[o]=Object.freeze(l)),l}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||As(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const i=this.resolveDataElementOptions(t,e),s=this._sharedOptions,n=this.getSharedOptions(i),o=this.includeOptions(e,n)||n!==s;return this.updateSharedOptions(n,e,i),{sharedOptions:n,includeOptions:o}}updateElement(t,e,i,s){As(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!As(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,s){t.active=s;const n=this.getStyle(e,s);this._resolveAnimations(e,i,s).update(t,{options:!s&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,i=this._cachedMeta.data;for(const[t,e,i]of this._syncList)this[t](e,i);this._syncList=[];const s=i.length,n=e.length,o=Math.min(n,s);o&&this.parse(0,o),n>s?this._insertElements(s,n-s,t):n{for(t.length+=e,a=t.length-1;a>=o;a--)t[a]=t[a-e]};for(r(n),a=t;a{s[t]=i[t]&&i[t].active()?i[t]._to:this[t]})),s}}Es.defaults={},Es.defaultRoutes=void 0;const Rs={values:t=>s(t)?t:""+t,numeric(t,e,i){if(0===t)return"0";const s=this.chart.options.locale;let n,o=t;if(i.length>1){const e=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(e<1e-4||e>1e15)&&(n="scientific"),o=function(t,e){let i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t));return i}(t,i)}const a=I(Math.abs(o)),r=Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),li(t,s,l)},logarithmic(t,e,i){if(0===t)return"0";const s=t/Math.pow(10,Math.floor(I(t)));return 1===s||2===s||5===s?Rs.numeric.call(this,t,e,i):""}};var Is={formatters:Rs};function zs(t,e){const s=t.options.ticks,n=s.maxTicksLimit||function(t){const e=t.options.offset,i=t._tickSize(),s=t._length/i+(e?0:1),n=t._maxLength/i;return Math.floor(Math.min(s,n))}(t),o=s.major.enabled?function(t){const e=[];let i,s;for(i=0,s=t.length;in)return function(t,e,i,s){let n,o=0,a=i[0];for(s=Math.ceil(s),n=0;nn)return e}return Math.max(n,1)}(o,e,n);if(a>0){let t,s;const n=a>1?Math.round((l-r)/(a-1)):null;for(Fs(e,h,c,i(n)?0:r-n,r),t=0,s=a-1;te.lineWidth,tickColor:(t,e)=>e.color,offset:!1,borderDash:[],borderDashOffset:0,borderWidth:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Is.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),ne.route("scale.ticks","color","","color"),ne.route("scale.grid","color","","borderColor"),ne.route("scale.grid","borderColor","","borderColor"),ne.route("scale.title","color","","color"),ne.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t}),ne.describe("scales",{_fallback:"scale"}),ne.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t});const Vs=(t,e,i)=>"top"===e||"left"===e?t[e]+i:t[e]-i;function Bs(t,e){const i=[],s=t.length/e,n=t.length;let o=0;for(;oa+r)))return h}function Ws(t){return t.drawTicks?t.tickLength:0}function js(t,e){if(!t.display)return 0;const i=mi(t.font,e),n=pi(t.padding);return(s(t.text)?t.text.length:1)*i.lineHeight+n.height}function Hs(t,e,i){let s=dt(t);return(i&&"right"!==e||!i&&"right"===e)&&(s=(t=>"left"===t?"right":"right"===t?"left":t)(s)),s}class $s extends Es{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(t){this.options=t.setContext(this.getContext()),this.axis=t.axis,this._userMin=this.parse(t.min),this._userMax=this.parse(t.max),this._suggestedMin=this.parse(t.suggestedMin),this._suggestedMax=this.parse(t.suggestedMax)}parse(t,e){return t}getUserBounds(){let{_userMin:t,_userMax:e,_suggestedMin:i,_suggestedMax:s}=this;return t=a(t,Number.POSITIVE_INFINITY),e=a(e,Number.NEGATIVE_INFINITY),i=a(i,Number.POSITIVE_INFINITY),s=a(s,Number.NEGATIVE_INFINITY),{min:a(t,i),max:a(e,s),minDefined:o(t),maxDefined:o(e)}}getMinMax(t){let e,{min:i,max:s,minDefined:n,maxDefined:o}=this.getUserBounds();if(n&&o)return{min:i,max:s};const r=this.getMatchingVisibleMetas();for(let a=0,l=r.length;as?s:i,s=n&&i>s?i:s,{min:a(i,a(s,i)),max:a(s,a(i,s))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){c(this.options.beforeUpdate,[this])}update(t,e,i){const{beginAtZero:s,grace:n,ticks:o}=this.options,a=o.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=xi(this,n,s),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const r=a=n||i<=1||!this.isHorizontal())return void(this.labelRotation=s);const h=this._getLabelSizes(),c=h.widest.width,d=h.highest.height,u=Z(this.chart.width-c,0,this.maxWidth);o=t.offset?this.maxWidth/i:u/(i-1),c+6>o&&(o=u/(i-(t.offset?.5:1)),a=this.maxHeight-Ws(t.grid)-e.padding-js(t.title,this.chart.options.font),r=Math.sqrt(c*c+d*d),l=$(Math.min(Math.asin(Z((h.highest.height+6)/o,-1,1)),Math.asin(Z(a/r,-1,1))-Math.asin(Z(d/r,-1,1)))),l=Math.max(s,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){c(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){c(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:i,title:s,grid:n}}=this,o=this._isVisible(),a=this.isHorizontal();if(o){const o=js(s,e.options.font);if(a?(t.width=this.maxWidth,t.height=Ws(n)+o):(t.height=this.maxHeight,t.width=Ws(n)+o),i.display&&this.ticks.length){const{first:e,last:s,widest:n,highest:o}=this._getLabelSizes(),r=2*i.padding,l=H(this.labelRotation),h=Math.cos(l),c=Math.sin(l);if(a){const e=i.mirror?0:c*n.width+h*o.height;t.height=Math.min(this.maxHeight,t.height+e+r)}else{const e=i.mirror?0:h*n.width+c*o.height;t.width=Math.min(this.maxWidth,t.width+e+r)}this._calculatePadding(e,s,c,h)}}this._handleMargins(),a?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,s){const{ticks:{align:n,padding:o},position:a}=this.options,r=0!==this.labelRotation,l="top"!==a&&"x"===this.axis;if(this.isHorizontal()){const a=this.getPixelForTick(0)-this.left,h=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,d=0;r?l?(c=s*t.width,d=i*e.height):(c=i*t.height,d=s*e.width):"start"===n?d=e.width:"end"===n?c=t.width:"inner"!==n&&(c=t.width/2,d=e.width/2),this.paddingLeft=Math.max((c-a+o)*this.width/(this.width-a),0),this.paddingRight=Math.max((d-h+o)*this.width/(this.width-h),0)}else{let i=e.height/2,s=t.height/2;"start"===n?(i=0,s=t.height):"end"===n&&(i=e.height,s=0),this.paddingTop=i+o,this.paddingBottom=s+o}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){c(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,s;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,s=t.length;e{const i=t.gc,s=i.length/2;let n;if(s>e){for(n=0;n({width:a[t]||0,height:r[t]||0});return{first:k(0),last:k(e-1),widest:k(w),highest:k(M),widths:a,heights:r}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return J(this._alignToPixels?ve(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&ta*s?a/i:r/s:r*s0}_computeGridLineItems(t){const e=this.axis,i=this.chart,s=this.options,{grid:o,position:a}=s,l=o.offset,h=this.isHorizontal(),c=this.ticks.length+(l?1:0),d=Ws(o),u=[],f=o.setContext(this.getContext()),g=f.drawBorder?f.borderWidth:0,p=g/2,m=function(t){return ve(i,t,g)};let b,x,_,y,v,w,M,k,S,P,D,O;if("top"===a)b=m(this.bottom),w=this.bottom-d,k=b-p,P=m(t.top)+p,O=t.bottom;else if("bottom"===a)b=m(this.top),P=t.top,O=m(t.bottom)-p,w=b+p,k=this.top+d;else if("left"===a)b=m(this.right),v=this.right-d,M=b-p,S=m(t.left)+p,D=t.right;else if("right"===a)b=m(this.left),S=t.left,D=m(t.right)-p,v=b+p,M=this.left+d;else if("x"===e){if("center"===a)b=m((t.top+t.bottom)/2+.5);else if(n(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}P=t.top,O=t.bottom,w=b+p,k=w+d}else if("y"===e){if("center"===a)b=m((t.left+t.right)/2);else if(n(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}v=b-p,M=v-d,S=t.left,D=t.right}const C=r(s.ticks.maxTicksLimit,c),A=Math.max(1,Math.ceil(c/C));for(x=0;xe.value===t));if(i>=0){return e.setContext(this.getContext(i)).lineWidth}return 0}drawGrid(t){const e=this.options.grid,i=this.ctx,s=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,o;const a=(t,e,s)=>{s.width&&s.color&&(i.save(),i.lineWidth=s.width,i.strokeStyle=s.color,i.setLineDash(s.borderDash||[]),i.lineDashOffset=s.borderDashOffset,i.beginPath(),i.moveTo(t.x,t.y),i.lineTo(e.x,e.y),i.stroke(),i.restore())};if(e.display)for(n=0,o=s.length;n{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:i+1,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",s=[];let n,o;for(n=0,o=e.length;n{const s=i.split("."),n=s.pop(),o=[t].concat(s).join("."),a=e[i].split("."),r=a.pop(),l=a.join(".");ne.route(o,n,l,r)}))}(e,t.defaultRoutes);t.descriptors&&ne.describe(e,t.descriptors)}(t,o,i),this.override&&ne.override(t.id,t.overrides)),o}get(t){return this.items[t]}unregister(t){const e=this.items,i=t.id,s=this.scope;i in e&&delete e[i],s&&i in ne[s]&&(delete ne[s][i],this.override&&delete te[i])}}var Us=new class{constructor(){this.controllers=new Ys(Ls,"datasets",!0),this.elements=new Ys(Es,"elements"),this.plugins=new Ys(Object,"plugins"),this.scales=new Ys($s,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach((e=>{const s=i||this._getRegistryForType(e);i||s.isForType(e)||s===this.plugins&&e.id?this._exec(t,s,e):d(e,(e=>{const s=i||this._getRegistryForType(e);this._exec(t,s,e)}))}))}_exec(t,e,i){const s=w(t);c(i["before"+s],[],i),e[t](i),c(i["after"+s],[],i)}_getRegistryForType(t){for(let e=0;et.filter((t=>!e.some((e=>t.plugin.id===e.plugin.id))));this._notify(s(e,i),t,"stop"),this._notify(s(i,e),t,"start")}}function qs(t,e){return e||!1!==t?!0===t?{}:t:null}function Ks(t,{plugin:e,local:i},s,n){const o=t.pluginScopeKeys(e),a=t.getOptionScopes(s,o);return i&&e.defaults&&a.push(e.defaults),t.createResolver(a,n,[""],{scriptable:!1,indexable:!1,allKeys:!0})}function Gs(t,e){const i=ne.datasets[t]||{};return((e.datasets||{})[t]||{}).indexAxis||e.indexAxis||i.indexAxis||"x"}function Zs(t,e){return"x"===t||"y"===t?t:e.axis||("top"===(i=e.position)||"bottom"===i?"x":"left"===i||"right"===i?"y":void 0)||t.charAt(0).toLowerCase();var i}function Js(t){const e=t.options||(t.options={});e.plugins=r(e.plugins,{}),e.scales=function(t,e){const i=te[t.type]||{scales:{}},s=e.scales||{},o=Gs(t.type,e),a=Object.create(null),r=Object.create(null);return Object.keys(s).forEach((t=>{const e=s[t];if(!n(e))return console.error(`Invalid scale configuration for scale: ${t}`);if(e._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${t}`);const l=Zs(t,e),h=function(t,e){return t===e?"_index_":"_value_"}(l,o),c=i.scales||{};a[l]=a[l]||t,r[t]=b(Object.create(null),[{axis:l},e,c[l],c[h]])})),t.data.datasets.forEach((i=>{const n=i.type||t.type,o=i.indexAxis||Gs(n,e),l=(te[n]||{}).scales||{};Object.keys(l).forEach((t=>{const e=function(t,e){let i=t;return"_index_"===t?i=e:"_value_"===t&&(i="x"===e?"y":"x"),i}(t,o),n=i[e+"AxisID"]||a[e]||e;r[n]=r[n]||Object.create(null),b(r[n],[{axis:e},s[n],l[t]])}))})),Object.keys(r).forEach((t=>{const e=r[t];b(e,[ne.scales[e.type],ne.scale])})),r}(t,e)}function Qs(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}const tn=new Map,en=new Set;function sn(t,e){let i=tn.get(t);return i||(i=e(),tn.set(t,i),en.add(i)),i}const nn=(t,e,i)=>{const s=y(e,i);void 0!==s&&t.add(s)};class on{constructor(t){this._config=function(t){return(t=t||{}).data=Qs(t.data),Js(t),t}(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=Qs(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),Js(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return sn(t,(()=>[[`datasets.${t}`,""]]))}datasetAnimationScopeKeys(t,e){return sn(`${t}.transition.${e}`,(()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]]))}datasetElementScopeKeys(t,e){return sn(`${t}-${e}`,(()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]]))}pluginScopeKeys(t){const e=t.id;return sn(`${this.type}-plugin-${e}`,(()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]]))}_cachedScopes(t,e){const i=this._scopeCache;let s=i.get(t);return s&&!e||(s=new Map,i.set(t,s)),s}getOptionScopes(t,e,i){const{options:s,type:n}=this,o=this._cachedScopes(t,i),a=o.get(e);if(a)return a;const r=new Set;e.forEach((e=>{t&&(r.add(t),e.forEach((e=>nn(r,t,e)))),e.forEach((t=>nn(r,s,t))),e.forEach((t=>nn(r,te[n]||{},t))),e.forEach((t=>nn(r,ne,t))),e.forEach((t=>nn(r,ee,t)))}));const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),en.has(e)&&o.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,te[e]||{},ne.datasets[e]||{},{type:e},ne,ee]}resolveNamedOptions(t,e,i,n=[""]){const o={$shared:!0},{resolver:a,subPrefixes:r}=an(this._resolverCache,t,n);let l=a;if(function(t,e){const{isScriptable:i,isIndexable:n}=Ie(t);for(const o of e){const e=i(o),a=n(o),r=(a||e)&&t[o];if(e&&(k(r)||rn(r))||a&&s(r))return!0}return!1}(a,e)){o.$shared=!1;l=Re(a,i=k(i)?i():i,this.createResolver(t,i,r))}for(const t of e)o[t]=l[t];return o}createResolver(t,e,i=[""],s){const{resolver:o}=an(this._resolverCache,t,i);return n(e)?Re(o,e,void 0,s):o}}function an(t,e,i){let s=t.get(e);s||(s=new Map,t.set(e,s));const n=i.join();let o=s.get(n);if(!o){o={resolver:Ee(e,i),subPrefixes:i.filter((t=>!t.toLowerCase().includes("hover")))},s.set(n,o)}return o}const rn=t=>n(t)&&Object.getOwnPropertyNames(t).reduce(((e,i)=>e||k(t[i])),!1);const ln=["top","bottom","left","right","chartArea"];function hn(t,e){return"top"===t||"bottom"===t||-1===ln.indexOf(t)&&"x"===e}function cn(t,e){return function(i,s){return i[t]===s[t]?i[e]-s[e]:i[t]-s[t]}}function dn(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),c(i&&i.onComplete,[t],e)}function un(t){const e=t.chart,i=e.options.animation;c(i&&i.onProgress,[t],e)}function fn(t){return oe()&&"string"==typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const gn={},pn=t=>{const e=fn(t);return Object.values(gn).filter((t=>t.canvas===e)).pop()};function mn(t,e,i){const s=Object.keys(t);for(const n of s){const s=+n;if(s>=e){const o=t[n];delete t[n],(i>0||s>e)&&(t[s+i]=o)}}}class bn{constructor(t,i){const s=this.config=new on(i),n=fn(t),o=pn(n);if(o)throw new Error("Canvas is already in use. Chart with ID '"+o.id+"' must be destroyed before the canvas with ID '"+o.canvas.id+"' can be reused.");const a=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||gs(n)),this.platform.updateConfig(s);const r=this.platform.acquireContext(n,a.aspectRatio),l=r&&r.canvas,h=l&&l.height,c=l&&l.width;this.id=e(),this.ctx=r,this.canvas=l,this.width=c,this.height=h,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Xs,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=ct((t=>this.update(t)),a.resizeDelay||0),this._dataChanges=[],gn[this.id]=this,r&&l?(mt.listen(this,"complete",dn),mt.listen(this,"progress",un),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:s,height:n,_aspectRatio:o}=this;return i(t)?e&&o?o:n?s/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():pe(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return we(this.canvas,this.ctx),this}stop(){return mt.stop(this),this}resize(t,e){mt.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this.options,s=this.canvas,n=i.maintainAspectRatio&&this.aspectRatio,o=this.platform.getMaximumSize(s,t,e,n),a=i.devicePixelRatio||this.platform.getDevicePixelRatio(),r=this.width?"resize":"attach";this.width=o.width,this.height=o.height,this._aspectRatio=this.aspectRatio,pe(this,a,!0)&&(this.notifyPlugins("resize",{size:o}),c(i.onResize,[this,o],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){d(this.options.scales||{},((t,e)=>{t.id=e}))}buildOrUpdateScales(){const t=this.options,e=t.scales,i=this.scales,s=Object.keys(i).reduce(((t,e)=>(t[e]=!1,t)),{});let n=[];e&&(n=n.concat(Object.keys(e).map((t=>{const i=e[t],s=Zs(t,i),n="r"===s,o="x"===s;return{options:i,dposition:n?"chartArea":o?"bottom":"left",dtype:n?"radialLinear":o?"category":"linear"}})))),d(n,(e=>{const n=e.options,o=n.id,a=Zs(o,n),l=r(n.type,e.dtype);void 0!==n.position&&hn(n.position,a)===hn(e.dposition)||(n.position=e.dposition),s[o]=!0;let h=null;if(o in i&&i[o].type===l)h=i[o];else{h=new(Us.getScale(l))({id:o,type:l,ctx:this.ctx,chart:this}),i[h.id]=h}h.init(n,t)})),d(s,((t,e)=>{t||delete i[e]})),d(i,(t=>{Zi.configure(this,t,t.options),Zi.addBox(this,t)}))}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort(((t,e)=>t.index-e.index)),i>e){for(let t=e;te.length&&delete this._stacks,t.forEach(((t,i)=>{0===e.filter((e=>e===t._dataset)).length&&this._destroyDatasetMeta(i)}))}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let i,s;for(this._removeUnreferencedMetasets(),i=0,s=e.length;i{this.getDatasetMeta(e).controller.reset()}),this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),s=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let o=0;for(let t=0,e=this.data.datasets.length;t{t.reset()})),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(cn("z","_idx"));const{_active:a,_lastEvent:r}=this;r?this._eventHandler(r,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){d(this.scales,(t=>{Zi.removeBox(this,t)})),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);S(e,i)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:i,start:s,count:n}of e){mn(t,s,"_removeElements"===i?-n:n)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,i=e=>new Set(t.filter((t=>t[0]===e)).map(((t,e)=>e+","+t.splice(1).join(",")))),s=i(0);for(let t=1;tt.split(","))).map((t=>({method:t[1],start:+t[2],count:+t[3]})))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;Zi.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],d(this.boxes,(t=>{i&&"chartArea"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))}),this),this._layers.forEach(((t,e)=>{t._idx=e})),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,i=t._clip,s=!i.disabled,n=this.chartArea,o={meta:t,index:t.index,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetDraw",o)&&(s&&Pe(e,{left:!1===i.left?0:n.left-i.left,right:!1===i.right?this.width:n.right+i.right,top:!1===i.top?0:n.top-i.top,bottom:!1===i.bottom?this.height:n.bottom+i.bottom}),t.controller.draw(),s&&De(e),o.cancelable=!1,this.notifyPlugins("afterDatasetDraw",o))}isPointInArea(t){return Se(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,s){const n=Vi.modes[e];return"function"==typeof n?n(this,t,i,s):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let s=i.filter((t=>t&&t._dataset===e)).pop();return s||(s={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(s)),s}getContext(){return this.$context||(this.$context=_i(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return"boolean"==typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){this.getDatasetMeta(t).hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){const s=i?"show":"hide",n=this.getDatasetMeta(t),o=n.controller._resolveAnimations(void 0,s);M(e)?(n.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),o.update(n,{visible:i}),this.update((e=>e.datasetIndex===t?s:void 0)))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),mt.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,i,s),t[i]=s},s=(t,e,i)=>{t.offsetX=e,t.offsetY=i,this._eventHandler(t)};d(this.options.events,(t=>i(t,s)))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(i,s)=>{t[i]&&(e.removeEventListener(this,i,s),delete t[i])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let o;const a=()=>{s("attach",a),this.attached=!0,this.resize(),i("resize",n),i("detach",o)};o=()=>{this.attached=!1,s("resize",n),this._stop(),this._resize(0,0),i("attach",a)},e.isAttached(this.canvas)?a():o()}unbindEvents(){d(this._listeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._listeners={},d(this._responsiveListeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){const s=i?"set":"remove";let n,o,a,r;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+s+"DatasetHoverStyle"]()),a=0,r=t.length;a{const i=this.getDatasetMeta(t);if(!i)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:i.data[e],index:e}}));!u(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}_updateHoverStyles(t,e,i){const s=this.options.hover,n=(t,e)=>t.filter((t=>!e.some((e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)))),o=n(e,t),a=i?t:n(t,e);o.length&&this.updateHoverStyle(o,s.mode,!1),a.length&&s.mode&&this.updateHoverStyle(a,s.mode,!0)}_eventHandler(t,e){const i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},s=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",i,s))return;const n=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,s),(n||i.changed)&&this.render(),this}_handleEvent(t,e,i){const{_active:s=[],options:n}=this,o=e,a=this._getActiveElements(t,s,i,o),r=P(t),l=function(t,e,i,s){return i&&"mouseout"!==t.type?s?e:t:null}(t,this._lastEvent,i,r);i&&(this._lastEvent=null,c(n.onHover,[t,a,this],this),r&&c(n.onClick,[t,a,this],this));const h=!u(a,s);return(h||e)&&(this._active=a,this._updateHoverStyles(a,s,e)),this._lastEvent=l,h}_getActiveElements(t,e,i,s){if("mouseout"===t.type)return[];if(!i)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,s)}}const xn=()=>d(bn.instances,(t=>t._plugins.invalidate())),_n=!0;function yn(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}Object.defineProperties(bn,{defaults:{enumerable:_n,value:ne},instances:{enumerable:_n,value:gn},overrides:{enumerable:_n,value:te},registry:{enumerable:_n,value:Us},version:{enumerable:_n,value:"3.9.1"},getChart:{enumerable:_n,value:pn},register:{enumerable:_n,value:(...t)=>{Us.add(...t),xn()}},unregister:{enumerable:_n,value:(...t)=>{Us.remove(...t),xn()}}});class vn{constructor(t){this.options=t||{}}init(t){}formats(){return yn()}parse(t,e){return yn()}format(t,e){return yn()}add(t,e,i){return yn()}diff(t,e,i){return yn()}startOf(t,e,i){return yn()}endOf(t,e){return yn()}}vn.override=function(t){Object.assign(vn.prototype,t)};var wn={_date:vn};function Mn(t){const e=t.iScale,i=function(t,e){if(!t._cache.$bar){const i=t.getMatchingVisibleMetas(e);let s=[];for(let e=0,n=i.length;et-e)))}return t._cache.$bar}(e,t.type);let s,n,o,a,r=e._length;const l=()=>{32767!==o&&-32768!==o&&(M(a)&&(r=Math.min(r,Math.abs(o-a)||r)),a=o)};for(s=0,n=i.length;sMath.abs(r)&&(l=r,h=a),e[i.axis]=h,e._custom={barStart:l,barEnd:h,start:n,end:o,min:a,max:r}}(t,e,i,n):e[i.axis]=i.parse(t,n),e}function Sn(t,e,i,s){const n=t.iScale,o=t.vScale,a=n.getLabels(),r=n===o,l=[];let h,c,d,u;for(h=i,c=i+s;ht.x,i="left",s="right"):(e=t.baset.controller.options.grouped)),o=s.options.stacked,a=[],r=t=>{const s=t.controller.getParsed(e),n=s&&s[t.vScale.axis];if(i(n)||isNaN(n))return!0};for(const i of n)if((void 0===e||!r(i))&&((!1===o||-1===a.indexOf(i.stack)||void 0===o&&void 0===i.stack)&&a.push(i.stack),i.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getStackIndex(t,e,i){const s=this._getStacks(t,i),n=void 0!==e?s.indexOf(e):-1;return-1===n?s.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,i=e.iScale,s=[];let n,o;for(n=0,o=e.data.length;n=i?1:-1)}(d,e,a)*o,u===a&&(m-=d/2);const t=e.getPixelForDecimal(0),i=e.getPixelForDecimal(1),s=Math.min(t,i),n=Math.max(t,i);m=Math.max(Math.min(m,n),s),c=m+d}if(m===e.getPixelForValue(a)){const t=z(d)*e.getLineWidthForValue(a)/2;m+=t,d-=t}return{size:d,base:m,head:c,center:c+d/2}}_calculateBarIndexPixels(t,e){const s=e.scale,n=this.options,o=n.skipNull,a=r(n.maxBarThickness,1/0);let l,h;if(e.grouped){const s=o?this._getStackCount(t):e.stackCount,r="flex"===n.barThickness?function(t,e,i,s){const n=e.pixels,o=n[t];let a=t>0?n[t-1]:null,r=t=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,{xScale:i,yScale:s}=e,n=this.getParsed(t),o=i.getLabelForValue(n.x),a=s.getLabelForValue(n.y),r=n._custom;return{label:e.label,value:"("+o+", "+a+(r?", "+r:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:o,vScale:a}=this._cachedMeta,{sharedOptions:r,includeOptions:l}=this._getSharedOptions(e,s),h=o.axis,c=a.axis;for(let d=e;d""}}}};class En extends Ls{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,s=this._cachedMeta;if(!1===this._parsing)s._parsed=i;else{let o,a,r=t=>+i[t];if(n(i[t])){const{key:t="value"}=this._parsing;r=e=>+y(i[e],t)}for(o=t,a=t+e;oG(t,r,l,!0)?1:Math.max(e,e*i,s,s*i),g=(t,e,s)=>G(t,r,l,!0)?-1:Math.min(e,e*i,s,s*i),p=f(0,h,d),m=f(L,c,u),b=g(D,h,d),x=g(D+L,c,u);s=(p-b)/2,n=(m-x)/2,o=-(p+b)/2,a=-(m+x)/2}return{ratioX:s,ratioY:n,offsetX:o,offsetY:a}}(u,d,r),b=(i.width-o)/f,x=(i.height-o)/g,_=Math.max(Math.min(b,x)/2,0),y=h(this.options.radius,_),v=(y-Math.max(y*r,0))/this._getVisibleDatasetWeightTotal();this.offsetX=p*y,this.offsetY=m*y,s.total=this.calculateTotal(),this.outerRadius=y-v*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-v*c,0),this.updateElements(n,0,n.length,t)}_circumference(t,e){const i=this.options,s=this._cachedMeta,n=this._getCircumference();return e&&i.animation.animateRotate||!this.chart.getDataVisibility(t)||null===s._parsed[t]||s.data[t].hidden?0:this.calculateCircumference(s._parsed[t]*n/O)}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.chartArea,r=o.options.animation,l=(a.left+a.right)/2,h=(a.top+a.bottom)/2,c=n&&r.animateScale,d=c?0:this.innerRadius,u=c?0:this.outerRadius,{sharedOptions:f,includeOptions:g}=this._getSharedOptions(e,s);let p,m=this._getRotation();for(p=0;p0&&!isNaN(t)?O*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=li(e._parsed[t],i.options.locale);return{label:s[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const i=this.chart;let s,n,o,a,r;if(!t)for(s=0,n=i.data.datasets.length;s"spacing"!==t,_indexable:t=>"spacing"!==t},En.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i}}=t.legend.options;return e.labels.map(((e,s)=>{const n=t.getDatasetMeta(0).controller.getStyle(s);return{text:e,fillStyle:n.backgroundColor,strokeStyle:n.borderColor,lineWidth:n.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(s),index:s}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}},tooltip:{callbacks:{title:()=>"",label(t){let e=t.label;const i=": "+t.formattedValue;return s(e)?(e=e.slice(),e[0]+=i):e+=i,e}}}}};class Rn extends Ls{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){const e=this._cachedMeta,{dataset:i,data:s=[],_dataset:n}=e,o=this.chart._animationsDisabled;let{start:a,count:r}=gt(e,s,o);this._drawStart=a,this._drawCount=r,pt(e)&&(a=0,r=s.length),i._chart=this.chart,i._datasetIndex=this.index,i._decimated=!!n._decimated,i.points=s;const l=this.resolveDatasetElementOptions(t);this.options.showLine||(l.borderWidth=0),l.segment=this.options.segment,this.updateElement(i,void 0,{animated:!o,options:l},t),this.updateElements(s,a,r,t)}updateElements(t,e,s,n){const o="reset"===n,{iScale:a,vScale:r,_stacked:l,_dataset:h}=this._cachedMeta,{sharedOptions:c,includeOptions:d}=this._getSharedOptions(e,n),u=a.axis,f=r.axis,{spanGaps:g,segment:p}=this.options,m=B(g)?g:Number.POSITIVE_INFINITY,b=this.chart._animationsDisabled||o||"none"===n;let x=e>0&&this.getParsed(e-1);for(let g=e;g0&&Math.abs(s[u]-x[u])>m,p&&(_.parsed=s,_.raw=h.data[g]),d&&(_.options=c||this.resolveDataElementOptions(g,e.active?"active":n)),b||this.updateElement(e,g,_,n),x=s}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,s=t.data||[];if(!s.length)return i;const n=s[0].size(this.resolveDataElementOptions(0)),o=s[s.length-1].size(this.resolveDataElementOptions(s.length-1));return Math.max(i,n,o)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}}Rn.id="line",Rn.defaults={datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1},Rn.overrides={scales:{_index_:{type:"category"},_value_:{type:"linear"}}};class In extends Ls{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=li(e._parsed[t].r,i.options.locale);return{label:s[t]||"",value:n}}parseObjectData(t,e,i,s){return Ue.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach(((t,i)=>{const s=this.getParsed(i).r;!isNaN(s)&&this.chart.getDataVisibility(i)&&(se.max&&(e.max=s))})),e}_updateRadius(){const t=this.chart,e=t.chartArea,i=t.options,s=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(s/2,0),o=(n-Math.max(i.cutoutPercentage?n/100*i.cutoutPercentage:1,0))/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.options.animation,r=this._cachedMeta.rScale,l=r.xCenter,h=r.yCenter,c=r.getIndexAngle(0)-.5*D;let d,u=c;const f=360/this.countVisibleElements();for(d=0;d{!isNaN(this.getParsed(i).r)&&this.chart.getDataVisibility(i)&&e++})),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?H(this.resolveDataElementOptions(t,e).angle||i):0}}In.id="polarArea",In.defaults={dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0},In.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i}}=t.legend.options;return e.labels.map(((e,s)=>{const n=t.getDatasetMeta(0).controller.getStyle(s);return{text:e,fillStyle:n.backgroundColor,strokeStyle:n.borderColor,lineWidth:n.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(s),index:s}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}},tooltip:{callbacks:{title:()=>"",label:t=>t.chart.data.labels[t.dataIndex]+": "+t.formattedValue}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};class zn extends En{}zn.id="pie",zn.defaults={cutout:0,rotation:0,circumference:360,radius:"100%"};class Fn extends Ls{getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,s){return Ue.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta,i=e.dataset,s=e.data||[],n=e.iScale.getLabels();if(i.points=s,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const o={_loop:!0,_fullLoop:n.length===s.length,options:e};this.updateElement(i,void 0,o,t)}this.updateElements(s,0,s.length,t)}updateElements(t,e,i,s){const n=this._cachedMeta.rScale,o="reset"===s;for(let a=e;a0&&this.getParsed(e-1);for(let c=e;c0&&Math.abs(s[f]-_[f])>b,m&&(p.parsed=s,p.raw=h.data[c]),u&&(p.options=d||this.resolveDataElementOptions(c,e.active?"active":n)),x||this.updateElement(e,c,p,n),_=s}this.updateSharedOptions(d,n,c)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let i=e.length-1;i>=0;--i)t=Math.max(t,e[i].size(this.resolveDataElementOptions(i))/2);return t>0&&t}const i=t.dataset,s=i.options&&i.options.borderWidth||0;if(!e.length)return s;const n=e[0].size(this.resolveDataElementOptions(0)),o=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(s,n,o)/2}}Vn.id="scatter",Vn.defaults={datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1},Vn.overrides={interaction:{mode:"point"},plugins:{tooltip:{callbacks:{title:()=>"",label:t=>"("+t.label+", "+t.formattedValue+")"}}},scales:{x:{type:"linear"},y:{type:"linear"}}};var Bn=Object.freeze({__proto__:null,BarController:Tn,BubbleController:Ln,DoughnutController:En,LineController:Rn,PolarAreaController:In,PieController:zn,RadarController:Fn,ScatterController:Vn});function Nn(t,e,i){const{startAngle:s,pixelMargin:n,x:o,y:a,outerRadius:r,innerRadius:l}=e;let h=n/r;t.beginPath(),t.arc(o,a,r,s-h,i+h),l>n?(h=n/l,t.arc(o,a,l,i+h,s-h,!0)):t.arc(o,a,n,i+L,s-L),t.closePath(),t.clip()}function Wn(t,e,i,s){const n=ui(t.options.borderRadius,["outerStart","outerEnd","innerStart","innerEnd"]);const o=(i-e)/2,a=Math.min(o,s*e/2),r=t=>{const e=(i-Math.min(o,t))*s/2;return Z(t,0,Math.min(o,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:Z(n.innerStart,0,a),innerEnd:Z(n.innerEnd,0,a)}}function jn(t,e,i,s){return{x:i+t*Math.cos(e),y:s+t*Math.sin(e)}}function Hn(t,e,i,s,n,o){const{x:a,y:r,startAngle:l,pixelMargin:h,innerRadius:c}=e,d=Math.max(e.outerRadius+s+i-h,0),u=c>0?c+s+i+h:0;let f=0;const g=n-l;if(s){const t=((c>0?c-s:0)+(d>0?d-s:0))/2;f=(g-(0!==t?g*t/(t+s):g))/2}const p=(g-Math.max(.001,g*d-i/D)/d)/2,m=l+p+f,b=n-p-f,{outerStart:x,outerEnd:_,innerStart:y,innerEnd:v}=Wn(e,u,d,b-m),w=d-x,M=d-_,k=m+x/w,S=b-_/M,P=u+y,O=u+v,C=m+y/P,A=b-v/O;if(t.beginPath(),o){if(t.arc(a,r,d,k,S),_>0){const e=jn(M,S,a,r);t.arc(e.x,e.y,_,S,b+L)}const e=jn(O,b,a,r);if(t.lineTo(e.x,e.y),v>0){const e=jn(O,A,a,r);t.arc(e.x,e.y,v,b+L,A+Math.PI)}if(t.arc(a,r,u,b-v/u,m+y/u,!0),y>0){const e=jn(P,C,a,r);t.arc(e.x,e.y,y,C+Math.PI,m-L)}const i=jn(w,m,a,r);if(t.lineTo(i.x,i.y),x>0){const e=jn(w,k,a,r);t.arc(e.x,e.y,x,m-L,k)}}else{t.moveTo(a,r);const e=Math.cos(k)*d+a,i=Math.sin(k)*d+r;t.lineTo(e,i);const s=Math.cos(S)*d+a,n=Math.sin(S)*d+r;t.lineTo(s,n)}t.closePath()}function $n(t,e,i,s,n,o){const{options:a}=e,{borderWidth:r,borderJoinStyle:l}=a,h="inner"===a.borderAlign;r&&(h?(t.lineWidth=2*r,t.lineJoin=l||"round"):(t.lineWidth=r,t.lineJoin=l||"bevel"),e.fullCircles&&function(t,e,i){const{x:s,y:n,startAngle:o,pixelMargin:a,fullCircles:r}=e,l=Math.max(e.outerRadius-a,0),h=e.innerRadius+a;let c;for(i&&Nn(t,e,o+O),t.beginPath(),t.arc(s,n,h,o+O,o,!0),c=0;c=O||G(n,a,l),g=Q(o,h+u,c+u);return f&&g}getCenterPoint(t){const{x:e,y:i,startAngle:s,endAngle:n,innerRadius:o,outerRadius:a}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius","circumference"],t),{offset:r,spacing:l}=this.options,h=(s+n)/2,c=(o+a+l+r)/2;return{x:e+Math.cos(h)*c,y:i+Math.sin(h)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:i}=this,s=(e.offset||0)/2,n=(e.spacing||0)/2,o=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=i>O?Math.floor(i/O):0,0===i||this.innerRadius<0||this.outerRadius<0)return;t.save();let a=0;if(s){a=s/2;const e=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(e)*a,Math.sin(e)*a),this.circumference>=D&&(a=s)}t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor;const r=function(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r}=e;let l=e.endAngle;if(o){Hn(t,e,i,s,a+O,n);for(let e=0;er&&o>r;return{count:s,start:l,loop:e.loop,ilen:h(a+(h?r-t:t))%o,_=()=>{f!==g&&(t.lineTo(m,g),t.lineTo(m,f),t.lineTo(m,p))};for(l&&(d=n[x(0)],t.moveTo(d.x,d.y)),c=0;c<=r;++c){if(d=n[x(c)],d.skip)continue;const e=d.x,i=d.y,s=0|e;s===u?(ig&&(g=i),m=(b*m+e)/++b):(_(),t.lineTo(e,i),u=s,b=0,f=g=i),p=i}_()}function Zn(t){const e=t.options,i=e.borderDash&&e.borderDash.length;return!(t._decimated||t._loop||e.tension||"monotone"===e.cubicInterpolationMode||e.stepped||i)?Gn:Kn}Yn.id="arc",Yn.defaults={borderAlign:"center",borderColor:"#fff",borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0},Yn.defaultRoutes={backgroundColor:"backgroundColor"};const Jn="function"==typeof Path2D;function Qn(t,e,i,s){Jn&&!e.options.segment?function(t,e,i,s){let n=e._path;n||(n=e._path=new Path2D,e.path(n,i,s)&&n.closePath()),Un(t,e.options),t.stroke(n)}(t,e,i,s):function(t,e,i,s){const{segments:n,options:o}=e,a=Zn(e);for(const r of n)Un(t,o,r.style),t.beginPath(),a(t,e,r,{start:i,end:i+s-1})&&t.closePath(),t.stroke()}(t,e,i,s)}class to extends Es{constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this.options;if((i.tension||"monotone"===i.cubicInterpolationMode)&&!i.stepped&&!this._pointsUpdated){const s=i.spanGaps?this._loop:this._fullLoop;Qe(this._points,i,t,s,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Di(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this.options,s=t[e],n=this.points,o=Pi(this,{property:e,start:s,end:s});if(!o.length)return;const a=[],r=function(t){return t.stepped?oi:t.tension||"monotone"===t.cubicInterpolationMode?ai:ni}(i);let l,h;for(l=0,h=o.length;l"borderDash"!==t&&"fill"!==t};class io extends Es{constructor(t){super(),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.options,{x:n,y:o}=this.getProps(["x","y"],i);return Math.pow(t-n,2)+Math.pow(e-o,2){uo(t)}))}var go={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(t,e,s)=>{if(!s.enabled)return void fo(t);const n=t.width;t.data.datasets.forEach(((e,o)=>{const{_data:a,indexAxis:r}=e,l=t.getDatasetMeta(o),h=a||e.data;if("y"===bi([r,t.options.indexAxis]))return;if(!l.controller.supportsDecimation)return;const c=t.scales[l.xAxisID];if("linear"!==c.type&&"time"!==c.type)return;if(t.options.parsing)return;let{start:d,count:u}=function(t,e){const i=e.length;let s,n=0;const{iScale:o}=t,{min:a,max:r,minDefined:l,maxDefined:h}=o.getUserBounds();return l&&(n=Z(et(e,o.axis,a).lo,0,i-1)),s=h?Z(et(e,o.axis,r).hi+1,n,i)-n:i-n,{start:n,count:s}}(l,h);if(u<=(s.threshold||4*n))return void uo(e);let f;switch(i(a)&&(e._data=h,delete e.data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(t){this._data=t}})),s.algorithm){case"lttb":f=function(t,e,i,s,n){const o=n.samples||s;if(o>=i)return t.slice(e,e+i);const a=[],r=(i-2)/(o-2);let l=0;const h=e+i-1;let c,d,u,f,g,p=e;for(a[l++]=t[p],c=0;cu&&(u=f,d=t[s],g=s);a[l++]=d,p=g}return a[l++]=t[h],a}(h,d,u,n,s);break;case"min-max":f=function(t,e,s,n){let o,a,r,l,h,c,d,u,f,g,p=0,m=0;const b=[],x=e+s-1,_=t[e].x,y=t[x].x-_;for(o=e;og&&(g=l,d=o),p=(m*p+a.x)/++m;else{const s=o-1;if(!i(c)&&!i(d)){const e=Math.min(c,d),i=Math.max(c,d);e!==u&&e!==s&&b.push({...t[e],x:p}),i!==u&&i!==s&&b.push({...t[i],x:p})}o>0&&s!==u&&b.push(t[s]),b.push(a),h=e,m=0,f=g=l,c=d=u=o}}return b}(h,d,u,n);break;default:throw new Error(`Unsupported decimation algorithm '${s.algorithm}'`)}e._decimated=f}))},destroy(t){fo(t)}};function po(t,e,i,s){if(s)return;let n=e[t],o=i[t];return"angle"===t&&(n=K(n),o=K(o)),{property:t,start:n,end:o}}function mo(t,e,i){for(;e>t;e--){const t=i[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function bo(t,e,i,s){return t&&e?s(t[i],e[i]):t?t[i]:e?e[i]:0}function xo(t,e){let i=[],n=!1;return s(t)?(n=!0,i=t):i=function(t,e){const{x:i=null,y:s=null}=t||{},n=e.points,o=[];return e.segments.forEach((({start:t,end:e})=>{e=mo(t,e,n);const a=n[t],r=n[e];null!==s?(o.push({x:a.x,y:s}),o.push({x:r.x,y:s})):null!==i&&(o.push({x:i,y:a.y}),o.push({x:i,y:r.y}))})),o}(t,e),i.length?new to({points:i,options:{tension:0},_loop:n,_fullLoop:n}):null}function _o(t){return t&&!1!==t.fill}function yo(t,e,i){let s=t[e].fill;const n=[e];let a;if(!i)return s;for(;!1!==s&&-1===n.indexOf(s);){if(!o(s))return s;if(a=t[s],!a)return!1;if(a.visible)return s;n.push(s),s=a.fill}return!1}function vo(t,e,i){const s=function(t){const e=t.options,i=e.fill;let s=r(i&&i.target,i);void 0===s&&(s=!!e.backgroundColor);if(!1===s||null===s)return!1;if(!0===s)return"origin";return s}(t);if(n(s))return!isNaN(s.value)&&s;let a=parseFloat(s);return o(a)&&Math.floor(a)===a?function(t,e,i,s){"-"!==t&&"+"!==t||(i=e+i);if(i===e||i<0||i>=s)return!1;return i}(s[0],e,a,i):["origin","start","end","stack","shape"].indexOf(s)>=0&&s}function wo(t,e,i){const s=[];for(let n=0;n=0;--e){const i=n[e].$filler;i&&(i.line.updateControlPoints(o,i.axis),s&&i.fill&&Po(t.ctx,i,o))}},beforeDatasetsDraw(t,e,i){if("beforeDatasetsDraw"!==i.drawTime)return;const s=t.getSortedVisibleDatasetMetas();for(let e=s.length-1;e>=0;--e){const i=s[e].$filler;_o(i)&&Po(t.ctx,i,t.chartArea)}},beforeDatasetDraw(t,e,i){const s=e.meta.$filler;_o(s)&&"beforeDatasetDraw"===i.drawTime&&Po(t.ctx,s,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const Lo=(t,e)=>{let{boxHeight:i=e,boxWidth:s=e}=t;return t.usePointStyle&&(i=Math.min(i,e),s=t.pointStyleWidth||Math.min(s,e)),{boxWidth:s,boxHeight:i,itemHeight:Math.max(e,i)}};class Eo extends Es{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=c(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter((e=>t.filter(e,this.chart.data)))),t.sort&&(e=e.sort(((e,i)=>t.sort(e,i,this.chart.data)))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const i=t.labels,s=mi(i.font),n=s.size,o=this._computeTitleHeight(),{boxWidth:a,itemHeight:r}=Lo(i,n);let l,h;e.font=s.string,this.isHorizontal()?(l=this.maxWidth,h=this._fitRows(o,n,a,r)+10):(h=this.maxHeight,l=this._fitCols(o,n,a,r)+10),this.width=Math.min(l,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,s){const{ctx:n,maxWidth:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.lineWidths=[0],h=s+a;let c=t;n.textAlign="left",n.textBaseline="middle";let d=-1,u=-h;return this.legendItems.forEach(((t,f)=>{const g=i+e/2+n.measureText(t.text).width;(0===f||l[l.length-1]+g+2*a>o)&&(c+=h,l[l.length-(f>0?0:1)]=0,u+=h,d++),r[f]={left:0,top:u,row:d,width:g,height:s},l[l.length-1]+=g+a})),c}_fitCols(t,e,i,s){const{ctx:n,maxHeight:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.columnSizes=[],h=o-t;let c=a,d=0,u=0,f=0,g=0;return this.legendItems.forEach(((t,o)=>{const p=i+e/2+n.measureText(t.text).width;o>0&&u+s+2*a>h&&(c+=d+a,l.push({width:d,height:u}),f+=d+a,g++,d=u=0),r[o]={left:f,top:u,col:g,width:p,height:s},d=Math.max(d,p),u+=s+a})),c+=d,l.push({width:d,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:s},rtl:n}}=this,o=yi(n,this.left,this.width);if(this.isHorizontal()){let n=0,a=ut(i,this.left+s,this.right-this.lineWidths[n]);for(const r of e)n!==r.row&&(n=r.row,a=ut(i,this.left+s,this.right-this.lineWidths[n])),r.top+=this.top+t+s,r.left=o.leftForLtr(o.x(a),r.width),a+=r.width+s}else{let n=0,a=ut(i,this.top+t+s,this.bottom-this.columnSizes[n].height);for(const r of e)r.col!==n&&(n=r.col,a=ut(i,this.top+t+s,this.bottom-this.columnSizes[n].height)),r.top=a,r.left+=this.left+s,r.left=o.leftForLtr(o.x(r.left),r.width),a+=r.height+s}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;Pe(t,this),this._draw(),De(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:n,labels:o}=t,a=ne.color,l=yi(t.rtl,this.left,this.width),h=mi(o.font),{color:c,padding:d}=o,u=h.size,f=u/2;let g;this.drawTitle(),s.textAlign=l.textAlign("left"),s.textBaseline="middle",s.lineWidth=.5,s.font=h.string;const{boxWidth:p,boxHeight:m,itemHeight:b}=Lo(o,u),x=this.isHorizontal(),_=this._computeTitleHeight();g=x?{x:ut(n,this.left+d,this.right-i[0]),y:this.top+d+_,line:0}:{x:this.left+d,y:ut(n,this.top+_+d,this.bottom-e[0].height),line:0},vi(this.ctx,t.textDirection);const y=b+d;this.legendItems.forEach(((v,w)=>{s.strokeStyle=v.fontColor||c,s.fillStyle=v.fontColor||c;const M=s.measureText(v.text).width,k=l.textAlign(v.textAlign||(v.textAlign=o.textAlign)),S=p+f+M;let P=g.x,D=g.y;l.setWidth(this.width),x?w>0&&P+S+d>this.right&&(D=g.y+=y,g.line++,P=g.x=ut(n,this.left+d,this.right-i[g.line])):w>0&&D+y>this.bottom&&(P=g.x=P+e[g.line].width+d,g.line++,D=g.y=ut(n,this.top+_+d,this.bottom-e[g.line].height));!function(t,e,i){if(isNaN(p)||p<=0||isNaN(m)||m<0)return;s.save();const n=r(i.lineWidth,1);if(s.fillStyle=r(i.fillStyle,a),s.lineCap=r(i.lineCap,"butt"),s.lineDashOffset=r(i.lineDashOffset,0),s.lineJoin=r(i.lineJoin,"miter"),s.lineWidth=n,s.strokeStyle=r(i.strokeStyle,a),s.setLineDash(r(i.lineDash,[])),o.usePointStyle){const a={radius:m*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},r=l.xPlus(t,p/2);ke(s,a,r,e+f,o.pointStyleWidth&&p)}else{const o=e+Math.max((u-m)/2,0),a=l.leftForLtr(t,p),r=gi(i.borderRadius);s.beginPath(),Object.values(r).some((t=>0!==t))?Le(s,{x:a,y:o,w:p,h:m,radius:r}):s.rect(a,o,p,m),s.fill(),0!==n&&s.stroke()}s.restore()}(l.x(P),D,v),P=ft(k,P+p+f,x?P+S:this.right,t.rtl),function(t,e,i){Ae(s,i.text,t,e+b/2,h,{strikethrough:i.hidden,textAlign:l.textAlign(i.textAlign)})}(l.x(P),D,v),x?g.x+=S+d:g.y+=y})),wi(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=mi(e.font),s=pi(e.padding);if(!e.display)return;const n=yi(t.rtl,this.left,this.width),o=this.ctx,a=e.position,r=i.size/2,l=s.top+r;let h,c=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),h=this.top+l,c=ut(t.align,c,this.right-d);else{const e=this.columnSizes.reduce(((t,e)=>Math.max(t,e.height)),0);h=l+ut(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=ut(a,c,c+d);o.textAlign=n.textAlign(dt(a)),o.textBaseline="middle",o.strokeStyle=e.color,o.fillStyle=e.color,o.font=i.string,Ae(o,e.text,u,h,i)}_computeTitleHeight(){const t=this.options.title,e=mi(t.font),i=pi(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,n;if(Q(t,this.left,this.right)&&Q(e,this.top,this.bottom))for(n=this.legendHitBoxes,i=0;it.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:s,textAlign:n,color:o}}=t.legend.options;return t._getSortedDatasetMetas().map((t=>{const a=t.controller.getStyle(i?0:void 0),r=pi(a.borderWidth);return{text:e[t.index].label,fillStyle:a.backgroundColor,fontColor:o,hidden:!t.visible,lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:(r.width+r.height)/4,strokeStyle:a.borderColor,pointStyle:s||a.pointStyle,rotation:a.rotation,textAlign:n||a.textAlign,borderRadius:0,datasetIndex:t.index}}),this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};class Io extends Es{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const i=this.options;if(this.left=0,this.top=0,!i.display)return void(this.width=this.height=this.right=this.bottom=0);this.width=this.right=t,this.height=this.bottom=e;const n=s(i.text)?i.text.length:1;this._padding=pi(i.padding);const o=n*mi(i.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=o:this.width=o}isHorizontal(){const t=this.options.position;return"top"===t||"bottom"===t}_drawArgs(t){const{top:e,left:i,bottom:s,right:n,options:o}=this,a=o.align;let r,l,h,c=0;return this.isHorizontal()?(l=ut(a,i,n),h=e+t,r=n-i):("left"===o.position?(l=i+t,h=ut(a,s,e),c=-.5*D):(l=n-t,h=ut(a,e,s),c=.5*D),r=s-e),{titleX:l,titleY:h,maxWidth:r,rotation:c}}draw(){const t=this.ctx,e=this.options;if(!e.display)return;const i=mi(e.font),s=i.lineHeight/2+this._padding.top,{titleX:n,titleY:o,maxWidth:a,rotation:r}=this._drawArgs(s);Ae(t,e.text,0,0,i,{color:e.color,maxWidth:a,rotation:r,textAlign:dt(e.align),textBaseline:"middle",translation:[n,o]})}}var zo={id:"title",_element:Io,start(t,e,i){!function(t,e){const i=new Io({ctx:t.ctx,options:e,chart:t});Zi.configure(t,i,e),Zi.addBox(t,i),t.titleBlock=i}(t,i)},stop(t){const e=t.titleBlock;Zi.removeBox(t,e),delete t.titleBlock},beforeUpdate(t,e,i){const s=t.titleBlock;Zi.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const Fo=new WeakMap;var Vo={id:"subtitle",start(t,e,i){const s=new Io({ctx:t.ctx,options:i,chart:t});Zi.configure(t,s,i),Zi.addBox(t,s),Fo.set(t,s)},stop(t){Zi.removeBox(t,Fo.get(t)),Fo.delete(t)},beforeUpdate(t,e,i){const s=Fo.get(t);Zi.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const Bo={average(t){if(!t.length)return!1;let e,i,s=0,n=0,o=0;for(e=0,i=t.length;e-1?t.split("\n"):t}function jo(t,e){const{element:i,datasetIndex:s,index:n}=e,o=t.getDatasetMeta(s).controller,{label:a,value:r}=o.getLabelAndValue(n);return{chart:t,label:a,parsed:o.getParsed(n),raw:t.data.datasets[s].data[n],formattedValue:r,dataset:o.getDataset(),dataIndex:n,datasetIndex:s,element:i}}function Ho(t,e){const i=t.chart.ctx,{body:s,footer:n,title:o}=t,{boxWidth:a,boxHeight:r}=e,l=mi(e.bodyFont),h=mi(e.titleFont),c=mi(e.footerFont),u=o.length,f=n.length,g=s.length,p=pi(e.padding);let m=p.height,b=0,x=s.reduce(((t,e)=>t+e.before.length+e.lines.length+e.after.length),0);if(x+=t.beforeBody.length+t.afterBody.length,u&&(m+=u*h.lineHeight+(u-1)*e.titleSpacing+e.titleMarginBottom),x){m+=g*(e.displayColors?Math.max(r,l.lineHeight):l.lineHeight)+(x-g)*l.lineHeight+(x-1)*e.bodySpacing}f&&(m+=e.footerMarginTop+f*c.lineHeight+(f-1)*e.footerSpacing);let _=0;const y=function(t){b=Math.max(b,i.measureText(t).width+_)};return i.save(),i.font=h.string,d(t.title,y),i.font=l.string,d(t.beforeBody.concat(t.afterBody),y),_=e.displayColors?a+2+e.boxPadding:0,d(s,(t=>{d(t.before,y),d(t.lines,y),d(t.after,y)})),_=0,i.font=c.string,d(t.footer,y),i.restore(),b+=p.width,{width:b,height:m}}function $o(t,e,i,s){const{x:n,width:o}=i,{width:a,chartArea:{left:r,right:l}}=t;let h="center";return"center"===s?h=n<=(r+l)/2?"left":"right":n<=o/2?h="left":n>=a-o/2&&(h="right"),function(t,e,i,s){const{x:n,width:o}=s,a=i.caretSize+i.caretPadding;return"left"===t&&n+o+a>e.width||"right"===t&&n-o-a<0||void 0}(h,t,e,i)&&(h="center"),h}function Yo(t,e,i){const s=i.yAlign||e.yAlign||function(t,e){const{y:i,height:s}=e;return it.height-s/2?"bottom":"center"}(t,i);return{xAlign:i.xAlign||e.xAlign||$o(t,e,i,s),yAlign:s}}function Uo(t,e,i,s){const{caretSize:n,caretPadding:o,cornerRadius:a}=t,{xAlign:r,yAlign:l}=i,h=n+o,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:f}=gi(a);let g=function(t,e){let{x:i,width:s}=t;return"right"===e?i-=s:"center"===e&&(i-=s/2),i}(e,r);const p=function(t,e,i){let{y:s,height:n}=t;return"top"===e?s+=i:s-="bottom"===e?n+i:n/2,s}(e,l,h);return"center"===l?"left"===r?g+=h:"right"===r&&(g-=h):"left"===r?g-=Math.max(c,u)+n:"right"===r&&(g+=Math.max(d,f)+n),{x:Z(g,0,s.width-e.width),y:Z(p,0,s.height-e.height)}}function Xo(t,e,i){const s=pi(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-s.right:t.x+s.left}function qo(t){return No([],Wo(t))}function Ko(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}class Go extends Es{constructor(t){super(),this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart||t._chart,this._chart=this.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){const t=this._cachedAnimations;if(t)return t;const e=this.chart,i=this.options.setContext(this.getContext()),s=i.enabled&&e.options.animation&&i.animations,n=new ys(this.chart,s);return s._cacheable&&(this._cachedAnimations=Object.freeze(n)),n}getContext(){return this.$context||(this.$context=(t=this.chart.getContext(),e=this,i=this._tooltipItems,_i(t,{tooltip:e,tooltipItems:i,type:"tooltip"})));var t,e,i}getTitle(t,e){const{callbacks:i}=e,s=i.beforeTitle.apply(this,[t]),n=i.title.apply(this,[t]),o=i.afterTitle.apply(this,[t]);let a=[];return a=No(a,Wo(s)),a=No(a,Wo(n)),a=No(a,Wo(o)),a}getBeforeBody(t,e){return qo(e.callbacks.beforeBody.apply(this,[t]))}getBody(t,e){const{callbacks:i}=e,s=[];return d(t,(t=>{const e={before:[],lines:[],after:[]},n=Ko(i,t);No(e.before,Wo(n.beforeLabel.call(this,t))),No(e.lines,n.label.call(this,t)),No(e.after,Wo(n.afterLabel.call(this,t))),s.push(e)})),s}getAfterBody(t,e){return qo(e.callbacks.afterBody.apply(this,[t]))}getFooter(t,e){const{callbacks:i}=e,s=i.beforeFooter.apply(this,[t]),n=i.footer.apply(this,[t]),o=i.afterFooter.apply(this,[t]);let a=[];return a=No(a,Wo(s)),a=No(a,Wo(n)),a=No(a,Wo(o)),a}_createItems(t){const e=this._active,i=this.chart.data,s=[],n=[],o=[];let a,r,l=[];for(a=0,r=e.length;at.filter(e,s,n,i)))),t.itemSort&&(l=l.sort(((e,s)=>t.itemSort(e,s,i)))),d(l,(e=>{const i=Ko(t.callbacks,e);s.push(i.labelColor.call(this,e)),n.push(i.labelPointStyle.call(this,e)),o.push(i.labelTextColor.call(this,e))})),this.labelColors=s,this.labelPointStyles=n,this.labelTextColors=o,this.dataPoints=l,l}update(t,e){const i=this.options.setContext(this.getContext()),s=this._active;let n,o=[];if(s.length){const t=Bo[i.position].call(this,s,this._eventPosition);o=this._createItems(i),this.title=this.getTitle(o,i),this.beforeBody=this.getBeforeBody(o,i),this.body=this.getBody(o,i),this.afterBody=this.getAfterBody(o,i),this.footer=this.getFooter(o,i);const e=this._size=Ho(this,i),a=Object.assign({},t,e),r=Yo(this.chart,i,a),l=Uo(i,a,r,this.chart);this.xAlign=r.xAlign,this.yAlign=r.yAlign,n={opacity:1,x:l.x,y:l.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=o,this.$context=void 0,n&&this._resolveAnimations().update(this,n),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,s){const n=this.getCaretPosition(t,i,s);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,i){const{xAlign:s,yAlign:n}=this,{caretSize:o,cornerRadius:a}=i,{topLeft:r,topRight:l,bottomLeft:h,bottomRight:c}=gi(a),{x:d,y:u}=t,{width:f,height:g}=e;let p,m,b,x,_,y;return"center"===n?(_=u+g/2,"left"===s?(p=d,m=p-o,x=_+o,y=_-o):(p=d+f,m=p+o,x=_-o,y=_+o),b=p):(m="left"===s?d+Math.max(r,h)+o:"right"===s?d+f-Math.max(l,c)-o:this.caretX,"top"===n?(x=u,_=x-o,p=m-o,b=m+o):(x=u+g,_=x+o,p=m+o,b=m-o),y=x),{x1:p,x2:m,x3:b,y1:x,y2:_,y3:y}}drawTitle(t,e,i){const s=this.title,n=s.length;let o,a,r;if(n){const l=yi(i.rtl,this.x,this.width);for(t.x=Xo(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline="middle",o=mi(i.titleFont),a=i.titleSpacing,e.fillStyle=i.titleColor,e.font=o.string,r=0;r0!==t))?(t.beginPath(),t.fillStyle=o.multiKeyBackground,Le(t,{x:e,y:p,w:h,h:l,radius:r}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),Le(t,{x:i,y:p+1,w:h-2,h:l-2,radius:r}),t.fill()):(t.fillStyle=o.multiKeyBackground,t.fillRect(e,p,h,l),t.strokeRect(e,p,h,l),t.fillStyle=a.backgroundColor,t.fillRect(i,p+1,h-2,l-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){const{body:s}=this,{bodySpacing:n,bodyAlign:o,displayColors:a,boxHeight:r,boxWidth:l,boxPadding:h}=i,c=mi(i.bodyFont);let u=c.lineHeight,f=0;const g=yi(i.rtl,this.x,this.width),p=function(i){e.fillText(i,g.x(t.x+f),t.y+u/2),t.y+=u+n},m=g.textAlign(o);let b,x,_,y,v,w,M;for(e.textAlign=o,e.textBaseline="middle",e.font=c.string,t.x=Xo(this,m,i),e.fillStyle=i.bodyColor,d(this.beforeBody,p),f=a&&"right"!==m?"center"===o?l/2+h:l+2+h:0,y=0,w=s.length;y0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,s=i&&i.x,n=i&&i.y;if(s||n){const i=Bo[t.position].call(this,this._active,this._eventPosition);if(!i)return;const o=this._size=Ho(this,t),a=Object.assign({},i,this._size),r=Yo(e,t,a),l=Uo(t,a,r,e);s._to===l.x&&n._to===l.y||(this.xAlign=r.xAlign,this.yAlign=r.yAlign,this.width=o.width,this.height=o.height,this.caretX=i.x,this.caretY=i.y,this._resolveAnimations().update(this,l))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let i=this.opacity;if(!i)return;this._updateAnimationTarget(e);const s={width:this.width,height:this.height},n={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;const o=pi(e.padding),a=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&a&&(t.save(),t.globalAlpha=i,this.drawBackground(n,t,s,e),vi(t,e.textDirection),n.y+=o.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),wi(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this._active,s=t.map((({datasetIndex:t,index:e})=>{const i=this.chart.getDatasetMeta(t);if(!i)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:i.data[e],index:e}})),n=!u(i,s),o=this._positionChanged(s,e);(n||o)&&(this._active=s,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const s=this.options,n=this._active||[],o=this._getActiveElements(t,n,e,i),a=this._positionChanged(o,t),r=e||!u(o,n)||a;return r&&(this._active=o,(s.enabled||s.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),r}_getActiveElements(t,e,i,s){const n=this.options;if("mouseout"===t.type)return[];if(!s)return e;const o=this.chart.getElementsAtEventForMode(t,n.mode,n,i);return n.reverse&&o.reverse(),o}_positionChanged(t,e){const{caretX:i,caretY:s,options:n}=this,o=Bo[n.position].call(this,t,e);return!1!==o&&(i!==o.x||s!==o.y)}}Go.positioners=Bo;var Zo={id:"tooltip",_element:Go,positioners:Bo,afterInit(t,e,i){i&&(t.tooltip=new Go({chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const i={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",i))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i)}},afterEvent(t,e){if(t.tooltip){const i=e.replay;t.tooltip.handleEvent(e.event,i,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:{beforeTitle:t,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,s=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(s>0&&e.dataIndex"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]},Jo=Object.freeze({__proto__:null,Decimation:go,Filler:To,Legend:Ro,SubTitle:Vo,Title:zo,Tooltip:Zo});function Qo(t,e,i,s){const n=t.indexOf(e);if(-1===n)return((t,e,i,s)=>("string"==typeof e?(i=t.push(e)-1,s.unshift({index:i,label:e})):isNaN(e)&&(i=null),i))(t,e,i,s);return n!==t.lastIndexOf(e)?i:n}class ta extends $s{constructor(t){super(t),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(t){const e=this._addedLabels;if(e.length){const t=this.getLabels();for(const{index:i,label:s}of e)t[i]===s&&t.splice(i,1);this._addedLabels=[]}super.init(t)}parse(t,e){if(i(t))return null;const s=this.getLabels();return((t,e)=>null===t?null:Z(Math.round(t),0,e))(e=isFinite(e)&&s[e]===t?e:Qo(s,t,r(e,t),this._addedLabels),s.length-1)}determineDataLimits(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let{min:i,max:s}=this.getMinMax(!0);"ticks"===this.options.bounds&&(t||(i=0),e||(s=this.getLabels().length-1)),this.min=i,this.max=s}buildTicks(){const t=this.min,e=this.max,i=this.options.offset,s=[];let n=this.getLabels();n=0===t&&e===n.length-1?n:n.slice(t,e+1),this._valueRange=Math.max(n.length-(i?0:1),1),this._startValue=this.min-(i?.5:0);for(let i=t;i<=e;i++)s.push({value:i});return s}getLabelForValue(t){const e=this.getLabels();return t>=0&&te.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}}function ea(t,e,{horizontal:i,minRotation:s}){const n=H(s),o=(i?Math.sin(n):Math.cos(n))||.001,a=.75*e*(""+t).length;return Math.min(e/o,a)}ta.id="category",ta.defaults={ticks:{callback:ta.prototype.getLabelForValue}};class ia extends $s{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return i(t)||("number"==typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:e,maxDefined:i}=this.getUserBounds();let{min:s,max:n}=this;const o=t=>s=e?s:t,a=t=>n=i?n:t;if(t){const t=z(s),e=z(n);t<0&&e<0?a(0):t>0&&e>0&&o(0)}if(s===n){let e=1;(n>=Number.MAX_SAFE_INTEGER||s<=Number.MIN_SAFE_INTEGER)&&(e=Math.abs(.05*n)),a(n+e),t||o(s-e)}this.min=s,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:i,stepSize:s}=t;return s?(e=Math.ceil(this.max/s)-Math.floor(this.min/s)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),i=i||11),i&&(e=Math.min(i,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let s=this.getTickLimit();s=Math.max(2,s);const n=function(t,e){const s=[],{bounds:n,step:o,min:a,max:r,precision:l,count:h,maxTicks:c,maxDigits:d,includeBounds:u}=t,f=o||1,g=c-1,{min:p,max:m}=e,b=!i(a),x=!i(r),_=!i(h),y=(m-p)/(d+1);let v,w,M,k,S=F((m-p)/g/f)*f;if(S<1e-14&&!b&&!x)return[{value:p},{value:m}];k=Math.ceil(m/S)-Math.floor(p/S),k>g&&(S=F(k*S/g/f)*f),i(l)||(v=Math.pow(10,l),S=Math.ceil(S*v)/v),"ticks"===n?(w=Math.floor(p/S)*S,M=Math.ceil(m/S)*S):(w=p,M=m),b&&x&&o&&W((r-a)/o,S/1e3)?(k=Math.round(Math.min((r-a)/S,c)),S=(r-a)/k,w=a,M=r):_?(w=b?a:w,M=x?r:M,k=h-1,S=(M-w)/k):(k=(M-w)/S,k=N(k,Math.round(k),S/1e3)?Math.round(k):Math.ceil(k));const P=Math.max(Y(S),Y(w));v=Math.pow(10,i(l)?P:l),w=Math.round(w*v)/v,M=Math.round(M*v)/v;let D=0;for(b&&(u&&w!==a?(s.push({value:a}),w0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=o(t)?Math.max(0,t):null,this.max=o(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let i=this.min,s=this.max;const n=e=>i=t?i:e,o=t=>s=e?s:t,a=(t,e)=>Math.pow(10,Math.floor(I(t))+e);i===s&&(i<=0?(n(1),o(10)):(n(a(i,-1)),o(a(s,1)))),i<=0&&n(a(s,-1)),s<=0&&o(a(i,1)),this._zero&&this.min!==this._suggestedMin&&i===a(this.min,0)&&n(a(i,-1)),this.min=i,this.max=s}buildTicks(){const t=this.options,e=function(t,e){const i=Math.floor(I(e.max)),s=Math.ceil(e.max/Math.pow(10,i)),n=[];let o=a(t.min,Math.pow(10,Math.floor(I(e.min)))),r=Math.floor(I(o)),l=Math.floor(o/Math.pow(10,r)),h=r<0?Math.pow(10,Math.abs(r)):1;do{n.push({value:o,major:na(o)}),++l,10===l&&(l=1,++r,h=r>=0?1:h),o=Math.round(l*Math.pow(10,r)*h)/h}while(rn?{start:e-i,end:e}:{start:e,end:e+i}}function la(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},i=Object.assign({},e),n=[],o=[],a=t._pointLabels.length,r=t.options.pointLabels,l=r.centerPointLabels?D/a:0;for(let u=0;ue.r&&(r=(s.end-e.r)/o,t.r=Math.max(t.r,e.r+r)),n.starte.b&&(l=(n.end-e.b)/a,t.b=Math.max(t.b,e.b+l))}function ca(t){return 0===t||180===t?"center":t<180?"left":"right"}function da(t,e,i){return"right"===i?t-=e:"center"===i&&(t-=e/2),t}function ua(t,e,i){return 90===i||270===i?t-=e/2:(i>270||i<90)&&(t-=e),t}function fa(t,e,i,s){const{ctx:n}=t;if(i)n.arc(t.xCenter,t.yCenter,e,0,O);else{let i=t.getPointPosition(0,e);n.moveTo(i.x,i.y);for(let o=1;o{const i=c(this.options.pointLabels.callback,[t,e],this);return i||0===i?i:""})).filter(((t,e)=>this.chart.getDataVisibility(e)))}fit(){const t=this.options;t.display&&t.pointLabels.display?la(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,s){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-s)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,s))}getIndexAngle(t){return K(t*(O/(this._pointLabels.length||1))+H(this.options.startAngle||0))}getDistanceFromCenterForValue(t){if(i(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(i(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t=0;o--){const e=n.setContext(t.getPointLabelContext(o)),a=mi(e.font),{x:r,y:l,textAlign:h,left:c,top:d,right:u,bottom:f}=t._pointLabelItems[o],{backdropColor:g}=e;if(!i(g)){const t=gi(e.borderRadius),i=pi(e.backdropPadding);s.fillStyle=g;const n=c-i.left,o=d-i.top,a=u-c+i.width,r=f-d+i.height;Object.values(t).some((t=>0!==t))?(s.beginPath(),Le(s,{x:n,y:o,w:a,h:r,radius:t}),s.fill()):s.fillRect(n,o,a,r)}Ae(s,t._pointLabels[o],r,l+a.lineHeight/2,a,{color:e.color,textAlign:h,textBaseline:"middle"})}}(this,o),n.display&&this.ticks.forEach(((t,e)=>{if(0!==e){r=this.getDistanceFromCenterForValue(t.value);!function(t,e,i,s){const n=t.ctx,o=e.circular,{color:a,lineWidth:r}=e;!o&&!s||!a||!r||i<0||(n.save(),n.strokeStyle=a,n.lineWidth=r,n.setLineDash(e.borderDash),n.lineDashOffset=e.borderDashOffset,n.beginPath(),fa(t,i,o,s),n.closePath(),n.stroke(),n.restore())}(this,n.setContext(this.getContext(e-1)),r,o)}})),s.display){for(t.save(),a=o-1;a>=0;a--){const i=s.setContext(this.getPointLabelContext(a)),{color:n,lineWidth:o}=i;o&&n&&(t.lineWidth=o,t.strokeStyle=n,t.setLineDash(i.borderDash),t.lineDashOffset=i.borderDashOffset,r=this.getDistanceFromCenterForValue(e.ticks.reverse?this.min:this.max),l=this.getPointPosition(a,r),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(l.x,l.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;const s=this.getIndexAngle(0);let n,o;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(s),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach(((s,a)=>{if(0===a&&!e.reverse)return;const r=i.setContext(this.getContext(a)),l=mi(r.font);if(n=this.getDistanceFromCenterForValue(this.ticks[a].value),r.showLabelBackdrop){t.font=l.string,o=t.measureText(s.label).width,t.fillStyle=r.backdropColor;const e=pi(r.backdropPadding);t.fillRect(-o/2-e.left,-n-l.size/2-e.top,o+e.width,l.size+e.height)}Ae(t,s.label,0,-n,l,{color:r.color})})),t.restore()}drawTitle(){}}ga.id="radialLinear",ga.defaults={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:Is.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback:t=>t,padding:5,centerPointLabels:!1}},ga.defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"},ga.descriptors={angleLines:{_fallback:"grid"}};const pa={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},ma=Object.keys(pa);function ba(t,e){return t-e}function xa(t,e){if(i(e))return null;const s=t._adapter,{parser:n,round:a,isoWeekday:r}=t._parseOpts;let l=e;return"function"==typeof n&&(l=n(l)),o(l)||(l="string"==typeof n?s.parse(l,n):s.parse(l)),null===l?null:(a&&(l="week"!==a||!B(r)&&!0!==r?s.startOf(l,a):s.startOf(l,"isoWeek",r)),+l)}function _a(t,e,i,s){const n=ma.length;for(let o=ma.indexOf(t);o=e?i[s]:i[n]]=!0}}else t[e]=!0}function va(t,e,i){const s=[],n={},o=e.length;let a,r;for(a=0;a=0&&(e[l].major=!0);return e}(t,s,n,i):s}class wa extends $s{constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit="day",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,e){const i=t.time||(t.time={}),s=this._adapter=new wn._date(t.adapters.date);s.init(e),b(i.displayFormats,s.formats()),this._parseOpts={parser:i.parser,round:i.round,isoWeekday:i.isoWeekday},super.init(t),this._normalized=e.normalized}parse(t,e){return void 0===t?null:xa(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this.options,e=this._adapter,i=t.time.unit||"day";let{min:s,max:n,minDefined:a,maxDefined:r}=this.getUserBounds();function l(t){a||isNaN(t.min)||(s=Math.min(s,t.min)),r||isNaN(t.max)||(n=Math.max(n,t.max))}a&&r||(l(this._getLabelBounds()),"ticks"===t.bounds&&"labels"===t.ticks.source||l(this.getMinMax(!1))),s=o(s)&&!isNaN(s)?s:+e.startOf(Date.now(),i),n=o(n)&&!isNaN(n)?n:+e.endOf(Date.now(),i)+1,this.min=Math.min(s,n-1),this.max=Math.max(s+1,n)}_getLabelBounds(){const t=this.getLabelTimestamps();let e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}buildTicks(){const t=this.options,e=t.time,i=t.ticks,s="labels"===i.source?this.getLabelTimestamps():this._generate();"ticks"===t.bounds&&s.length&&(this.min=this._userMin||s[0],this.max=this._userMax||s[s.length-1]);const n=this.min,o=st(s,n,this.max);return this._unit=e.unit||(i.autoSkip?_a(e.minUnit,this.min,this.max,this._getLabelCapacity(n)):function(t,e,i,s,n){for(let o=ma.length-1;o>=ma.indexOf(i);o--){const i=ma[o];if(pa[i].common&&t._adapter.diff(n,s,i)>=e-1)return i}return ma[i?ma.indexOf(i):0]}(this,o.length,e.minUnit,this.min,this.max)),this._majorUnit=i.major.enabled&&"year"!==this._unit?function(t){for(let e=ma.indexOf(t)+1,i=ma.length;e+t.value)))}initOffsets(t){let e,i,s=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),s=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,i=this.getDecimalForValue(t[t.length-1]),n=1===t.length?i:(i-this.getDecimalForValue(t[t.length-2]))/2);const o=t.length<3?.5:.25;s=Z(s,0,o),n=Z(n,0,o),this._offsets={start:s,end:n,factor:1/(s+1+n)}}_generate(){const t=this._adapter,e=this.min,i=this.max,s=this.options,n=s.time,o=n.unit||_a(n.minUnit,e,i,this._getLabelCapacity(e)),a=r(n.stepSize,1),l="week"===o&&n.isoWeekday,h=B(l)||!0===l,c={};let d,u,f=e;if(h&&(f=+t.startOf(f,"isoWeek",l)),f=+t.startOf(f,h?"day":o),t.diff(i,e,o)>1e5*a)throw new Error(e+" and "+i+" are too far apart with stepSize of "+a+" "+o);const g="data"===s.ticks.source&&this.getDataTimestamps();for(d=f,u=0;dt-e)).map((t=>+t))}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}_tickFormatFunction(t,e,i,s){const n=this.options,o=n.time.displayFormats,a=this._unit,r=this._majorUnit,l=a&&o[a],h=r&&o[r],d=i[e],u=r&&h&&d&&d.major,f=this._adapter.format(t,s||(u?h:l)),g=n.ticks.callback;return g?c(g,[f,e,i],this):f}generateTickLabels(t){let e,i,s;for(e=0,i=t.length;e0?a:1}getDataTimestamps(){let t,e,i=this._cache.data||[];if(i.length)return i;const s=this.getMatchingVisibleMetas();if(this._normalized&&s.length)return this._cache.data=s[0].controller.getAllParsedValues(this);for(t=0,e=s.length;t=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=et(t,"pos",e)),({pos:s,time:o}=t[r]),({pos:n,time:a}=t[l])):(e>=t[r].time&&e<=t[l].time&&({lo:r,hi:l}=et(t,"time",e)),({time:s,pos:o}=t[r]),({time:n,pos:a}=t[l]));const h=n-s;return h?o+(a-o)*(e-s)/h:o}wa.id="time",wa.defaults={bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",major:{enabled:!1}}};class ka extends wa{constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=Ma(e,this.min),this._tableRange=Ma(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:i}=this,s=[],n=[];let o,a,r,l,h;for(o=0,a=t.length;o=e&&l<=i&&s.push(l);if(s.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(o=0,a=s.length;o=0.10.0" } }, + "node_modules/vue-clock2": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/vue-clock2/-/vue-clock2-1.1.5.tgz", + "integrity": "sha512-C7Da8jTxJFHIt4SaA4/Js/rNSLmypRstOjhbyl5F5x2hD7JyaSy0NSHcYgCb+ZS4ROv1b8xV7Vf24UEDb/bgCA==" + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -7863,6 +7881,11 @@ "@octokit/openapi-types": "^12.11.0" } }, + "@shopify/draggable": { + "version": "1.0.0-beta.12", + "resolved": "https://registry.npmjs.org/@shopify/draggable/-/draggable-1.0.0-beta.12.tgz", + "integrity": "sha512-Un/Dn61sv2er9yjDXLGWMauCOWBb0BMbm0yzmmrD+oUX2/x50yhNJASTsCRdndUCpWlqYfZH8jEfaOgTPsKc/g==" + }, "@types/expect": { "version": "1.20.4", "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", @@ -8334,6 +8357,11 @@ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, + "chart.js": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.9.1.tgz", + "integrity": "sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w==" + }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -13517,6 +13545,11 @@ } } }, + "vue-clock2": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/vue-clock2/-/vue-clock2-1.1.5.tgz", + "integrity": "sha512-C7Da8jTxJFHIt4SaA4/Js/rNSLmypRstOjhbyl5F5x2hD7JyaSy0NSHcYgCb+ZS4ROv1b8xV7Vf24UEDb/bgCA==" + }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/public/external/package.json b/public/external/package.json index 695dff1aec..35f8b39ff2 100644 --- a/public/external/package.json +++ b/public/external/package.json @@ -2,11 +2,14 @@ "name": "atk-external", "private": true, "dependencies": { + "@shopify/draggable": "^1.0.0-beta.12", + "chart.js": "^3.9.1", "flatpickr": "^4.6.11", "fomantic-ui": "^2.8.8", "form-serializer": "^2.5.0", "jquery": "^3.6.0", - "twemoji": "https://github.com/twitter/twemoji/archive/refs/tags/v14.0.2.tar.gz" + "twemoji": "https://github.com/twitter/twemoji/archive/refs/tags/v14.0.2.tar.gz", + "vue-clock2": "^1.1.5" }, "scripts": { "postinstall": "node postinstall.js" diff --git a/public/external/postinstall.js b/public/external/postinstall.js index 5f9e24ffc8..27e2c3e03d 100644 --- a/public/external/postinstall.js +++ b/public/external/postinstall.js @@ -141,6 +141,7 @@ walkFilesSync(path.join(__dirname, 'fomantic-ui'), (f) => { walkFilesSync(__dirname, (f) => { updateFileSync(f, (data) => { if (!f.endsWith('.css') + || f.startsWith(path.join(__dirname, 'chart.js/dist/docs/')) || f.startsWith(path.join(__dirname, 'gulp-concat-css/')) || f.startsWith(path.join(__dirname, 'less/')) || f.startsWith(path.join(__dirname, 'rtlcss/')) diff --git a/public/external/twemoji/assets/svg/1f3f3-fe0f-200d-1f308.svg b/public/external/twemoji/assets/svg/1f3f3-fe0f-200d-1f308.svg new file mode 100644 index 0000000000..a56110f2f6 --- /dev/null +++ b/public/external/twemoji/assets/svg/1f3f3-fe0f-200d-1f308.svg @@ -0,0 +1 @@ + diff --git a/public/external/twemoji/assets/svg/1f3f3-fe0f-200d-26a7-fe0f.svg b/public/external/twemoji/assets/svg/1f3f3-fe0f-200d-26a7-fe0f.svg new file mode 100644 index 0000000000..b5a796007f --- /dev/null +++ b/public/external/twemoji/assets/svg/1f3f3-fe0f-200d-26a7-fe0f.svg @@ -0,0 +1 @@ + diff --git a/public/external/twemoji/assets/svg/1f3f4-200d-2620-fe0f.svg b/public/external/twemoji/assets/svg/1f3f4-200d-2620-fe0f.svg new file mode 100644 index 0000000000..c2d9704dc5 --- /dev/null +++ b/public/external/twemoji/assets/svg/1f3f4-200d-2620-fe0f.svg @@ -0,0 +1 @@ + diff --git a/public/external/vue-clock2/LICENSE b/public/external/vue-clock2/LICENSE new file mode 100644 index 0000000000..1f134a0ea4 --- /dev/null +++ b/public/external/vue-clock2/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 vist + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/public/external/vue-clock2/dist/vue-clock.min.js b/public/external/vue-clock2/dist/vue-clock.min.js new file mode 100644 index 0000000000..57e3b75d15 --- /dev/null +++ b/public/external/vue-clock2/dist/vue-clock.min.js @@ -0,0 +1,2 @@ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("Clock",[],e):"object"==typeof exports?exports.Clock=e():t.Clock=e()}(this,function(){return function(t){function e(r){if(o[r])return o[r].exports;var n=o[r]={i:r,l:!1,exports:{}};return t[r].call(n.exports,n,n.exports,e),n.l=!0,n.exports}var o={};return e.m=t,e.c=o,e.i=function(t){return t},e.d=function(t,o,r){e.o(t,o)||Object.defineProperty(t,o,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var o=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(o,"a",o),o},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="/dist/",e(e.s=2)}([function(t,e,o){o(5);var r=o(8)(o(1),o(9),"data-v-7e3f7126",null);t.exports=r.exports},function(t,e,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default={data:function(){return{timeList:[12,1,2,3,4,5,6,7,8,9,10,11],transform:"scale(1)",hourRotate:"rotatez(0deg)",minuteRotate:"rotatez(0deg)",secondRotate:"rotatez(0deg)"}},props:["time","color","border","bg","size"],computed:{clockStyle:function(){return{height:this.size,width:this.size,color:this.color,border:this.border,background:this.bg}}},watch:{time:function(){this.show()}},methods:{show:function(){var t=this;this.showTime(),this._timer&&clearInterval(this._timer),this.time||(this._timer=setInterval(function(){t.showTime()},1e3))},showTime:function(){var t=void 0;if(this.time)t=this.time.split(":");else{var e=new Date;t=[e.getHours(),e.getMinutes(),e.getSeconds()]}var o=+t[0];o=o>11?o-12:o;var r=+t[1],n=+t[2]||0,a=30*o+6*r/360*30,i=6*r,s=6*n;this.hourRotate="rotatez("+a+"deg)",this.minuteRotate="rotatez("+i+"deg)",this.secondRotate="rotatez("+s+"deg)"}},mounted:function(){var t=this.$el.clientWidth/120;t=t>3?3:t,this.transform="scale("+t+")",this.show()},destroyed:function(){this._timer&&clearInterval(this._timer)}}},function(t,e,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=o(0),n=function(t){return t&&t.__esModule?t:{default:t}}(r);e.default=n.default,"undefined"!=typeof window&&window.Vue&&window.Vue.component("clock",n.default)},function(t,e,o){e=t.exports=o(4)(),e.push([t.i,'.clock[data-v-7e3f7126]{position:relative;display:inline-block;vertical-align:middle;width:150px;height:150px;border:2px solid;border-radius:100%;text-align:center;font-size:14px}.clock .hour[data-v-7e3f7126]{position:absolute;top:0;left:50%;display:block;width:20px;height:50%;margin-left:-10px;padding-top:4%;font-weight:400;transform-origin:bottom;user-select:none;box-sizing:border-box}.clock .hour>span[data-v-7e3f7126]{display:block}.clock .hour>span>i[data-v-7e3f7126]{display:block;font-style:normal}.clock .hour[data-v-7e3f7126]:nth-of-type(2){transform:rotatez(30deg)}.clock .hour:nth-of-type(2)>span[data-v-7e3f7126]{transform:rotatez(-30deg)}.clock .hour[data-v-7e3f7126]:nth-of-type(3){transform:rotatez(60deg)}.clock .hour:nth-of-type(3)>span[data-v-7e3f7126]{transform:rotatez(-60deg)}.clock .hour[data-v-7e3f7126]:nth-of-type(4){transform:rotatez(90deg)}.clock .hour:nth-of-type(4)>span[data-v-7e3f7126]{transform:rotatez(-90deg)}.clock .hour[data-v-7e3f7126]:nth-of-type(5){transform:rotatez(120deg)}.clock .hour:nth-of-type(5)>span[data-v-7e3f7126]{transform:rotatez(-120deg)}.clock .hour[data-v-7e3f7126]:nth-of-type(6){transform:rotatez(150deg)}.clock .hour:nth-of-type(6)>span[data-v-7e3f7126]{transform:rotatez(-150deg)}.clock .hour[data-v-7e3f7126]:nth-of-type(7){transform:rotatez(180deg)}.clock .hour:nth-of-type(7)>span[data-v-7e3f7126]{transform:rotatez(-180deg)}.clock .hour[data-v-7e3f7126]:nth-of-type(8){transform:rotatez(210deg)}.clock .hour:nth-of-type(8)>span[data-v-7e3f7126]{transform:rotatez(-210deg)}.clock .hour[data-v-7e3f7126]:nth-of-type(9){transform:rotatez(240deg)}.clock .hour:nth-of-type(9)>span[data-v-7e3f7126]{transform:rotatez(-240deg)}.clock .hour[data-v-7e3f7126]:nth-of-type(10){transform:rotatez(270deg)}.clock .hour:nth-of-type(10)>span[data-v-7e3f7126]{transform:rotatez(-270deg)}.clock .hour[data-v-7e3f7126]:nth-of-type(11){transform:rotatez(300deg)}.clock .hour:nth-of-type(11)>span[data-v-7e3f7126]{transform:rotatez(-300deg)}.clock .hour[data-v-7e3f7126]:nth-of-type(12){transform:rotatez(330deg)}.clock .hour:nth-of-type(12)>span[data-v-7e3f7126]{transform:rotatez(-330deg)}.clock .clock-circle[data-v-7e3f7126]{position:absolute;top:50%;left:50%;width:16px;height:16px;transform:translate(-50%,-50%);border:2px solid #666;border-radius:100%;background-color:#fff;z-index:1;box-sizing:border-box}.clock .clock-circle[data-v-7e3f7126]:before{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);display:block;content:"";width:4px;height:4px;border-radius:100%;background-color:#666}.clock .clock-hour[data-v-7e3f7126],.clock .clock-minute[data-v-7e3f7126],.clock .clock-second[data-v-7e3f7126]{position:absolute;top:15%;left:50%;display:block;width:2px;height:35%;margin-left:-1px;border-radius:5px;transform-origin:bottom;background-color:#666}.clock .clock-hour[data-v-7e3f7126]{top:30%;width:4px;height:20%;margin-left:-2px}.clock .clock-second[data-v-7e3f7126]{width:1px}.clock.is-small[data-v-7e3f7126]{width:80px;height:80px;border-width:1px;font-size:12px}.clock.is-small .clock-circle[data-v-7e3f7126]{width:10px;height:10px;border-width:1px}.clock.is-small .clock-circle[data-v-7e3f7126]:before{width:2px;height:2px}',""])},function(t,e){t.exports=function(){var t=[];return t.toString=function(){for(var t=[],e=0;e=0&&x.splice(e,1)}function s(t){var e=document.createElement("style");if(void 0===t.attrs.type&&(t.attrs.type="text/css"),void 0===t.attrs.nonce){var o=l();o&&(t.attrs.nonce=o)}return f(e,t.attrs),a(t,e),e}function c(t){var e=document.createElement("link");return void 0===t.attrs.type&&(t.attrs.type="text/css"),t.attrs.rel="stylesheet",f(e,t.attrs),a(t,e),e}function f(t,e){Object.keys(e).forEach(function(o){t.setAttribute(o,e[o])})}function l(){return o.nc}function u(t,e){var o,r,n,a;if(e.transform&&t.css){if(!(a="function"==typeof e.transform?e.transform(t.css):e.transform.default(t.css)))return function(){};t.css=a}if(e.singleton){var f=k++;o=g||(g=s(e)),r=d.bind(null,o,f,!1),n=d.bind(null,o,f,!0)}else t.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(o=c(e),r=h.bind(null,o,e),n=function(){i(o),o.href&&URL.revokeObjectURL(o.href)}):(o=s(e),r=p.bind(null,o),n=function(){i(o)});return r(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap)return;r(t=e)}else n()}}function d(t,e,o,r){var n=o?"":r.css;if(t.styleSheet)t.styleSheet.cssText=z(e,n);else{var a=document.createTextNode(n),i=t.childNodes;i[e]&&t.removeChild(i[e]),i.length?t.insertBefore(a,i[e]):t.appendChild(a)}}function p(t,e){var o=e.css,r=e.media;if(r&&t.setAttribute("media",r),t.styleSheet)t.styleSheet.cssText=o;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(o))}}function h(t,e,o){var r=o.css,n=o.sourceMap,a=void 0===e.convertToAbsoluteUrls&&n;(e.convertToAbsoluteUrls||a)&&(r=w(r)),n&&(r+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(n))))+" */");var i=new Blob([r],{type:"text/css"}),s=t.href;t.href=URL.createObjectURL(i),s&&URL.revokeObjectURL(s)}var v={},m=function(t){var e;return function(){return void 0===e&&(e=t.apply(this,arguments)),e}}(function(){return window&&document&&document.all&&!window.atob}),b=function(t,e){return e?e.querySelector(t):document.querySelector(t)},y=function(t){var e={};return function(t,o){if("function"==typeof t)return t();if(void 0===e[t]){var r=b.call(this,t,o);if(window.HTMLIFrameElement&&r instanceof window.HTMLIFrameElement)try{r=r.contentDocument.head}catch(t){r=null}e[t]=r}return e[t]}}(),g=null,k=0,x=[],w=o(7);t.exports=function(t,e){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");e=e||{},e.attrs="object"==typeof e.attrs?e.attrs:{},e.singleton||"boolean"==typeof e.singleton||(e.singleton=m()),e.insertInto||(e.insertInto="head"),e.insertAt||(e.insertAt="bottom");var o=n(t,e);return r(o,e),function(t){for(var a=[],i=0;i '/public', 'jquery' => '/public/external/jquery/dist', - 'serialize-object' => '/public/external/form-serializer/dist', 'fomantic-ui' => '/public/external/fomantic-ui/dist', 'flatpickr' => '/public/external/flatpickr/dist', + 'chart.js' => '/public/external/chart.js/dist', // for atk4/chart ]; /** @var ExecutorFactory App wide executor factory object for Model user action. */ @@ -486,7 +486,7 @@ public function initIncludes(): void $this->requireCss($this->cdn['fomantic-ui'] . '/semantic.min.css'); // Serialize Object - $this->requireJs($this->cdn['serialize-object'] . '/jquery.serialize-object.min.js'); + $this->requireJs($this->cdn['atk'] . '/external/form-serializer/dist/jquery.serialize-object.min.js'); // flatpickr $this->requireJs($this->cdn['flatpickr'] . '/flatpickr.min.js');