vendor: 18,040 bytes, lines 1-361
1(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.GreenAudioPlayer = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ 2"use strict"; 3 4module.exports = require('./src/js/main').default; 5 6},{"./src/js/main":2}],2:[function(require,module,exports){ 7"use strict"; 8 9Object.defineProperty(exports, "__esModule", { 10 value: true 11}); 12exports.default = void 0; 13 14function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } 15 16function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } 17 18function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } 19 20function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } 21 22function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 23 24function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 25 26function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 27 28var GreenAudioPlayer = 29/*#__PURE__*/ 30function () { 31 function GreenAudioPlayer(player, options) { 32 _classCallCheck(this, GreenAudioPlayer); 33 34 this.audioPlayer = typeof player === 'string' ? document.querySelector(player) : player; 35 var opts = options || {}; 36 var audioElement = this.audioPlayer.innerHTML; 37 this.audioPlayer.classList.add('green-audio-player'); 38 this.audioPlayer.innerHTML = GreenAudioPlayer.getTemplate() + audioElement; 39 this.playPauseBtn = this.audioPlayer.querySelector('.play-pause-btn'); 40 this.loading = this.audioPlayer.querySelector('.loading'); 41 this.sliders = this.audioPlayer.querySelectorAll('.slider'); 42 this.progress = this.audioPlayer.querySelector('.controls__progress'); 43 this.volumeBtn = this.audioPlayer.querySelector('.volume__button'); 44 this.volumeControls = this.audioPlayer.querySelector('.volume__controls'); 45 this.volumeProgress = this.volumeControls.querySelector('.volume__progress'); 46 this.player = this.audioPlayer.querySelector('audio'); 47 this.currentTime = this.audioPlayer.querySelector('.controls__current-time'); 48 this.totalTime = this.audioPlayer.querySelector('.controls__total-time'); 49 this.speaker = this.audioPlayer.querySelector('.volume__speaker'); 50 this.download = this.audioPlayer.querySelector('.download'); 51 this.downloadLink = this.audioPlayer.querySelector('.download__link'); 52 this.draggableClasses = ['pin']; 53 this.currentlyDragged = null; 54 this.stopOthersOnPlay = opts.stopOthersOnPlay || false; 55 56 if (opts.showDownloadButton || false) { 57 this.showDownload(); 58 } 59 60 this.initEvents(); 61 this.directionAware(); 62 this.overcomeIosLimitations(); 63 } 64 65 _createClass(GreenAudioPlayer, [{ 66 key: "initEvents", 67 value: function initEvents() { 68 var _this = this; 69 70 var self = this; 71 self.audioPlayer.addEventListener('mousedown', function (event) { 72 if (self.isDraggable(event.target)) { 73 self.currentlyDragged = event.target; 74 var handleMethod = self.currentlyDragged.dataset.method; 75 var listener = self[handleMethod].bind(self); 76 window.addEventListener('mousemove', listener, false); 77 window.addEventListener('mouseup', function () { 78 self.currentlyDragged = false; 79 window.removeEventListener('mousemove', listener, false); 80 }, false); 81 } 82 }); // for mobile touches 83 84 self.audioPlayer.addEventListener('touchstart', function (event) { 85 if (self.isDraggable(event.target)) { 86 var _event$targetTouches = _slicedToArray(event.targetTouches, 1); 87 88 self.currentlyDragged = _event$targetTouches[0]; 89 var handleMethod = self.currentlyDragged.target.dataset.method; 90 var listener = self[handleMethod].bind(self); 91 window.addEventListener('touchmove', listener, false); 92 window.addEventListener('touchend', function () { 93 self.currentlyDragged = false; 94 window.removeEventListener('touchmove', listener, false); 95 }, false); 96 event.preventDefault(); 97 } 98 }); 99 this.playPauseBtn.addEventListener('click', this.togglePlay.bind(self)); 100 this.player.addEventListener('timeupdate', this.updateProgress.bind(self)); 101 this.player.addEventListener('volumechange', this.updateVolume.bind(self)); 102 this.player.addEventListener('loadedmetadata', function () { 103 _this.totalTime.textContent = GreenAudioPlayer.formatTime(self.player.duration); 104 }); 105 this.player.addEventListener('seeking', this.showLoadingIndicator.bind(self)); 106 this.player.addEventListener('seeked', this.hideLoadingIndicator.bind(self)); 107 this.player.addEventListener('canplay', this.hideLoadingIndicator.bind(self)); 108 this.player.addEventListener('ended', function () { 109 GreenAudioPlayer.pausePlayer(self.player); 110 self.player.currentTime = 0; 111 }); 112 this.volumeBtn.addEventListener('click', function () { 113 self.volumeBtn.classList.toggle('open'); 114 self.volumeControls.classList.toggle('hidden'); 115 }); 116 window.addEventListener('resize', self.directionAware.bind(self)); 117 window.addEventListener('scroll', self.directionAware.bind(self)); 118 119 for (var i = 0; i < this.sliders.length; i++) { 120 var pin = this.sliders[i].querySelector('.pin'); 121 this.sliders[i].addEventListener('click', self[pin.dataset.method].bind(self)); 122 } 123 124 this.downloadLink.addEventListener('click', this.downloadAudio.bind(self)); 125 } 126 }, { 127 key: "overcomeIosLimitations", 128 value: function overcomeIosLimitations() { 129 var self = this; 130 131 if (window.navigator.userAgent.match(/iPad/i) || window.navigator.userAgent.match(/iPhone/i)) { 132 // iOS does not support "canplay" event 133 this.player.addEventListener('loadedmetadata', this.hideLoadingIndicator.bind(self)); // iOS does not let "volume" property be set programmatically 134 135 this.audioPlayer.querySelector('.volume').style.display = 'none'; 136 this.audioPlayer.querySelector('.controls').style.marginRight = '0'; 137 } 138 } 139 }, { 140 key: "isDraggable", 141 value: function isDraggable(el) { 142 var canDrag = false; 143 if (typeof el.classList === 'undefined') return false; // fix for IE 11 not supporting classList on SVG elements 144 145 for (var i = 0; i < this.draggableClasses.length; i++) { 146 if (el.classList.contains(this.draggableClasses[i])) { 147 canDrag = true; 148 } 149 } 150 151 return canDrag; 152 } 153 }, { 154 key: "inRange", 155 value: function inRange(event) { 156 var touch = 'touches' in event; // instanceof TouchEvent may also be used 157 158 var rangeBox = this.getRangeBox(event); 159 var sliderPositionAndDimensions = rangeBox.getBoundingClientRect(); 160 var direction = rangeBox.dataset.direction; 161 var min = null; 162 var max = null; 163 164 if (direction === 'horizontal') { 165 min = sliderPositionAndDimensions.x; 166 max = min + sliderPositionAndDimensions.width; 167 var clientX = touch ? event.touches[0].clientX : event.clientX; 168 if (clientX < min || clientX > max) return false; 169 } else { 170 min = sliderPositionAndDimensions.top; 171 max = min + sliderPositionAndDimensions.height; 172 var clientY = touch ? event.touches[0].clientY : event.clientY; 173 if (clientY < min || clientY > max) return false; 174 } 175 176 return true; 177 } 178 }, { 179 key: "updateProgress", 180 value: function updateProgress() { 181 var current = this.player.currentTime; 182 var percent = current / this.player.duration * 100; 183 this.progress.style.width = "".concat(percent, "%"); 184 this.currentTime.textContent = GreenAudioPlayer.formatTime(current); 185 } 186 }, { 187 key: "updateVolume", 188 value: function updateVolume() { 189 this.volumeProgress.style.height = "".concat(this.player.volume * 100, "%"); 190 191 if (this.player.volume >= 0.5) { 192 this.speaker.attributes.d.value = 'M14.667 0v2.747c3.853 1.146 6.666 4.72 6.666 8.946 0 4.227-2.813 7.787-6.666 8.934v2.76C20 22.173 24 17.4 24 11.693 24 5.987 20 1.213 14.667 0zM18 11.693c0-2.36-1.333-4.386-3.333-5.373v10.707c2-.947 3.333-2.987 3.333-5.334zm-18-4v8h5.333L12 22.36V1.027L5.333 7.693H0z'; 193 } else if (this.player.volume < 0.5 && this.player.volume > 0.05) { 194 this.speaker.attributes.d.value = 'M0 7.667v8h5.333L12 22.333V1L5.333 7.667M17.333 11.373C17.333 9.013 16 6.987 14 6v10.707c2-.947 3.333-2.987 3.333-5.334z'; 195 } else if (this.player.volume <= 0.05) { 196 this.speaker.attributes.d.value = 'M0 7.667v8h5.333L12 22.333V1L5.333 7.667'; 197 } 198 } 199 }, { 200 key: "getRangeBox", 201 value: function getRangeBox(event) { 202 var rangeBox = event.target; 203 var el = this.currentlyDragged; 204 205 if (event.type === 'click' && this.isDraggable(event.target)) { 206 rangeBox = event.target.parentElement.parentElement; 207 } 208 209 if (event.type === 'mousemove') { 210 rangeBox = el.parentElement.parentElement; 211 } 212 213 if (event.type === 'touchmove') { 214 rangeBox = el.target.parentElement.parentElement; 215 } 216 217 return rangeBox; 218 } 219 }, { 220 key: "getCoefficient", 221 value: function getCoefficient(event) { 222 var touch = 'touches' in event; // instanceof TouchEvent may also be used 223 224 var slider = this.getRangeBox(event); 225 var sliderPositionAndDimensions = slider.getBoundingClientRect(); 226 var K = 0; 227 228 if (slider.dataset.direction === 'horizontal') { 229 // if event is touch 230 var clientX = touch ? event.touches[0].clientX : event.clientX; 231 var offsetX = clientX - sliderPositionAndDimensions.left; 232 var width = sliderPositionAndDimensions.width; 233 K = offsetX / width; 234 } else if (slider.dataset.direction === 'vertical') { 235 var height = sliderPositionAndDimensions.height; 236 var clientY = touch ? event.touches[0].clientY : event.clientY; 237 var offsetY = clientY - sliderPositionAndDimensions.top; 238 K = 1 - offsetY / height; 239 } 240 241 return K; 242 } 243 }, { 244 key: "rewind", 245 value: function rewind(event) { 246 if (this.inRange(event)) { 247 this.player.currentTime = this.player.duration * this.getCoefficient(event); 248 } 249 } 250 }, { 251 key: "changeVolume", 252 value: function changeVolume(event) { 253 if (this.inRange(event)) { 254 this.player.volume = Math.round(this.getCoefficient(event) * 10) / 10; 255 } 256 } 257 }, { 258 key: "togglePlay", 259 value: function togglePlay() { 260 if (this.player.paused) { 261 if (this.stopOthersOnPlay) { 262 GreenAudioPlayer.stopOtherPlayers(); 263 } 264 265 GreenAudioPlayer.playPlayer(this.player); 266 } else { 267 GreenAudioPlayer.pausePlayer(this.player); 268 } 269 } 270 }, { 271 key: "showLoadingIndicator", 272 value: function showLoadingIndicator() { 273 this.playPauseBtn.style.display = 'none'; 274 this.loading.style.display = 'block'; 275 } 276 }, { 277 key: "hideLoadingIndicator", 278 value: function hideLoadingIndicator() { 279 this.playPauseBtn.style.display = 'block'; 280 this.loading.style.display = 'none'; 281 } 282 }, { 283 key: "showDownload", 284 value: function showDownload() { 285 this.download.style.display = 'block'; 286 } 287 }, { 288 key: "downloadAudio", 289 value: function downloadAudio() { 290 var src = this.player.currentSrc; 291 var name = src.split('/').reverse()[0]; 292 this.downloadLink.setAttribute('href', src); 293 this.downloadLink.setAttribute('download', name); 294 } 295 }, { 296 key: "directionAware", 297 value: function directionAware() { 298 this.volumeControls.classList.remove('top', 'middle', 'bottom'); 299 300 if (window.innerHeight < 250) { 301 this.volumeControls.classList.add('middle'); 302 } else if (this.audioPlayer.getBoundingClientRect().top < 180) { 303 this.volumeControls.classList.add('bottom'); 304 } else { 305 this.volumeControls.classList.add('top'); 306 } 307 } 308 }], [{ 309 key: "init", 310 value: function init(options) { 311 var players = document.querySelectorAll(options.selector); 312 players.forEach(function (player) { 313 /* eslint-disable no-new */ 314 new GreenAudioPlayer(player, options); 315 }); 316 } 317 }, { 318 key: "getTemplate", 319 value: function getTemplate() { 320 return "\n <div class=\"loading\">\n <div class=\"loading__spinner\"></div>\n </div>\n \n <div class=\"play-pause-btn\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"24\" viewBox=\"0 0 18 24\">\n <path fill=\"#566574\" fill-rule=\"evenodd\" d=\"M18 12L0 24V0\" class=\"play-pause-btn__icon\"/>\n </svg>\n </div>\n \n <div class=\"controls\">\n <span class=\"controls__current-time\">0:00</span>\n <div class=\"controls__slider slider\" data-direction=\"horizontal\">\n <div class=\"controls__progress gap-progress\">\n <div class=\"pin progress__pin\" data-method=\"rewind\"></div>\n </div>\n </div>\n <span class=\"controls__total-time\">0:00</span>\n </div>\n \n <div class=\"volume\">\n <div class=\"volume__button\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path class=\"volume__speaker\" fill=\"#566574\" fill-rule=\"evenodd\" d=\"M14.667 0v2.747c3.853 1.146 6.666 4.72 6.666 8.946 0 4.227-2.813 7.787-6.666 8.934v2.76C20 22.173 24 17.4 24 11.693 24 5.987 20 1.213 14.667 0zM18 11.693c0-2.36-1.333-4.386-3.333-5.373v10.707c2-.947 3.333-2.987 3.333-5.334zm-18-4v8h5.333L12 22.36V1.027L5.333 7.693H0z\"/>\n </svg>\n </div>\n <div class=\"volume__controls hidden\">\n <div class=\"volume__slider slider\" data-direction=\"vertical\">\n <div class=\"volume__progress gap-progress\">\n <div class=\"pin volume__pin\" data-method=\"changeVolume\"></div>\n </div>\n </div>\n </div>\n </div>\n \n <div class=\"download\" >\n <a class=\"download__link\" href=\"\" download=\"\">\n <svg width=\"24\" height=\"24\" fill=\"#566574\" enable-background=\"new 0 0 29.978 29.978\" version=\"1.1\" viewBox=\"0 0 29.978 29.978\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"m25.462 19.105v6.848h-20.947v-6.848h-4.026v8.861c0 1.111 0.9 2.012 2.016 2.012h24.967c1.115 0 2.016-0.9 2.016-2.012v-8.861h-4.026z\"/>\n <path d=\"m14.62 18.426l-5.764-6.965s-0.877-0.828 0.074-0.828 3.248 0 3.248 0 0-0.557 0-1.416v-8.723s-0.129-0.494 0.615-0.494h4.572c0.536 0 0.524 0.416 0.524 0.416v8.742 1.266s1.842 0 2.998 0c1.154 0 0.285 0.867 0.285 0.867s-4.904 6.51-5.588 7.193c-0.492 0.495-0.964-0.058-0.964-0.058z\"/>\n </svg>\n </a>\n </div>\n "; 321 } 322 }, { 323 key: "formatTime", 324 value: function formatTime(time) { 325 var min = Math.floor(time / 60); 326 var sec = Math.floor(time % 60); 327 return "".concat(min, ":").concat(sec < 10 ? "0".concat(sec) : sec); 328 } 329 }, { 330 key: "pausePlayer", 331 value: function pausePlayer(player) { 332 var playPauseButton = player.parentElement.querySelector('.play-pause-btn__icon'); 333 playPauseButton.attributes.d.value = 'M18 12L0 24V0'; 334 player.pause(); 335 } 336 }, { 337 key: "playPlayer", 338 value: function playPlayer(player) { 339 var playPauseButton = player.parentElement.querySelector('.play-pause-btn__icon'); 340 playPauseButton.attributes.d.value = 'M0 0h6v24H0zM12 0h6v24h-6z'; 341 player.play(); 342 } 343 }, { 344 key: "stopOtherPlayers", 345 value: function stopOtherPlayers() { 346 var players = document.querySelectorAll('.green-audio-player audio'); 347 348 for (var i = 0; i < players.length; i++) { 349 GreenAudioPlayer.pausePlayer(players[i]); 350 } 351 } 352 }]); 353 354 return GreenAudioPlayer; 355}(); 356 357var _default = GreenAudioPlayer; 358exports.default = _default; 359 360},{}]},{},[1])(1) 361});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.