wavesurfer.js 5.2.0 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGES.md +22 -0
- package/README.md +10 -0
- package/dist/plugin/wavesurfer.cursor.js +52 -50
- package/dist/plugin/wavesurfer.cursor.js.map +1 -1
- package/dist/plugin/wavesurfer.cursor.min.js +2 -2
- package/dist/plugin/wavesurfer.cursor.min.js.map +1 -1
- package/dist/plugin/wavesurfer.elan.js +9 -6
- package/dist/plugin/wavesurfer.elan.js.map +1 -1
- package/dist/plugin/wavesurfer.elan.min.js +2 -2
- package/dist/plugin/wavesurfer.elan.min.js.map +1 -1
- package/dist/plugin/wavesurfer.markers.js +141 -25
- package/dist/plugin/wavesurfer.markers.js.map +1 -1
- package/dist/plugin/wavesurfer.markers.min.js +2 -2
- package/dist/plugin/wavesurfer.markers.min.js.map +1 -1
- package/dist/plugin/wavesurfer.mediasession.js +5 -5
- package/dist/plugin/wavesurfer.mediasession.min.js +2 -2
- package/dist/plugin/wavesurfer.mediasession.min.js.map +1 -1
- package/dist/plugin/wavesurfer.microphone.js +4 -4
- package/dist/plugin/wavesurfer.microphone.min.js +2 -2
- package/dist/plugin/wavesurfer.microphone.min.js.map +1 -1
- package/dist/plugin/wavesurfer.minimap.js +25 -22
- package/dist/plugin/wavesurfer.minimap.js.map +1 -1
- package/dist/plugin/wavesurfer.minimap.min.js +2 -2
- package/dist/plugin/wavesurfer.minimap.min.js.map +1 -1
- package/dist/plugin/wavesurfer.playhead.js +4 -4
- package/dist/plugin/wavesurfer.playhead.min.js +2 -2
- package/dist/plugin/wavesurfer.playhead.min.js.map +1 -1
- package/dist/plugin/wavesurfer.regions.js +53 -16
- package/dist/plugin/wavesurfer.regions.js.map +1 -1
- package/dist/plugin/wavesurfer.regions.min.js +2 -2
- package/dist/plugin/wavesurfer.regions.min.js.map +1 -1
- package/dist/plugin/wavesurfer.spectrogram.js +70 -57
- package/dist/plugin/wavesurfer.spectrogram.js.map +1 -1
- package/dist/plugin/wavesurfer.spectrogram.min.js +2 -2
- package/dist/plugin/wavesurfer.spectrogram.min.js.map +1 -1
- package/dist/plugin/wavesurfer.timeline.js +39 -44
- package/dist/plugin/wavesurfer.timeline.js.map +1 -1
- package/dist/plugin/wavesurfer.timeline.min.js +2 -2
- package/dist/plugin/wavesurfer.timeline.min.js.map +1 -1
- package/dist/wavesurfer-html-init.js +5 -5
- package/dist/wavesurfer-html-init.min.js +2 -2
- package/dist/wavesurfer-html-init.min.js.map +1 -1
- package/dist/wavesurfer.js +209 -121
- package/dist/wavesurfer.js.map +1 -1
- package/dist/wavesurfer.min.js +2 -2
- package/dist/wavesurfer.min.js.map +1 -1
- package/package.json +23 -23
- package/src/drawer.canvasentry.js +30 -6
- package/src/drawer.js +1 -0
- package/src/drawer.multicanvas.js +19 -8
- package/src/mediaelement.js +1 -1
- package/src/plugin/cursor/index.js +68 -70
- package/src/plugin/markers/index.js +112 -23
- package/src/plugin/minimap/index.js +24 -21
- package/src/plugin/regions/index.js +30 -3
- package/src/plugin/regions/region.js +13 -4
- package/src/plugin/spectrogram/index.js +65 -50
- package/src/wavesurfer.js +31 -10
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* wavesurfer.js regions plugin
|
|
2
|
+
* wavesurfer.js regions plugin 6.0.0 (2022-02-07)
|
|
3
3
|
* https://wavesurfer-js.org
|
|
4
4
|
* @license BSD-3-Clause
|
|
5
5
|
*/
|
|
@@ -28,13 +28,13 @@ return /******/ (() => { // webpackBootstrap
|
|
|
28
28
|
Object.defineProperty(exports, "__esModule", ({
|
|
29
29
|
value: true
|
|
30
30
|
}));
|
|
31
|
-
exports
|
|
31
|
+
exports["default"] = void 0;
|
|
32
32
|
|
|
33
33
|
var _region = __webpack_require__(/*! ./region.js */ "./src/plugin/regions/region.js");
|
|
34
34
|
|
|
35
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object);
|
|
35
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
36
36
|
|
|
37
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]
|
|
37
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
38
38
|
|
|
39
39
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
40
40
|
|
|
@@ -42,7 +42,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
|
|
|
42
42
|
|
|
43
43
|
function _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); } }
|
|
44
44
|
|
|
45
|
-
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
|
45
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
46
46
|
|
|
47
47
|
/**
|
|
48
48
|
* Regions are visual overlays on waveform that can be used to play and loop
|
|
@@ -95,18 +95,17 @@ var RegionsPlugin = /*#__PURE__*/function () {
|
|
|
95
95
|
_region.Region.prototype[key] = _this.util.Observer.prototype[key];
|
|
96
96
|
});
|
|
97
97
|
this.wavesurfer.Region = _region.Region; // By default, scroll the container if the user drags a region
|
|
98
|
-
// within 5% of its edge
|
|
98
|
+
// within 5% (based on its initial size) of its edge
|
|
99
99
|
|
|
100
100
|
var scrollWidthProportion = 0.05;
|
|
101
101
|
|
|
102
102
|
this._onBackendCreated = function () {
|
|
103
103
|
_this.wrapper = _this.wavesurfer.drawer.wrapper;
|
|
104
104
|
_this.orientation = _this.wavesurfer.drawer.orientation;
|
|
105
|
+
_this.defaultEdgeScrollWidth = _this.wrapper.clientWidth * scrollWidthProportion;
|
|
105
106
|
|
|
106
107
|
if (_this.params.regions) {
|
|
107
108
|
_this.params.regions.forEach(function (region) {
|
|
108
|
-
region.edgeScrollWidth = _this.params.edgeScrollWidth || _this.wrapper.clientWidth * scrollWidthProportion;
|
|
109
|
-
|
|
110
109
|
_this.add(region);
|
|
111
110
|
});
|
|
112
111
|
}
|
|
@@ -146,7 +145,12 @@ var RegionsPlugin = /*#__PURE__*/function () {
|
|
|
146
145
|
key: "destroy",
|
|
147
146
|
value: function destroy() {
|
|
148
147
|
this.wavesurfer.un('ready', this._onReady);
|
|
149
|
-
this.wavesurfer.un('backend-created', this._onBackendCreated);
|
|
148
|
+
this.wavesurfer.un('backend-created', this._onBackendCreated); // Disabling `region-removed' because destroying the plugin calls
|
|
149
|
+
// the Region.remove() method that is also used to remove regions based
|
|
150
|
+
// on user input. This can cause confusion since teardown is not a
|
|
151
|
+
// user event, but would emit `region-removed` as if it was.
|
|
152
|
+
|
|
153
|
+
this.wavesurfer.setDisabledEventEmissions(['region-removed']);
|
|
150
154
|
this.disableDragSelection();
|
|
151
155
|
this.clear();
|
|
152
156
|
}
|
|
@@ -177,6 +181,16 @@ var RegionsPlugin = /*#__PURE__*/function () {
|
|
|
177
181
|
return null;
|
|
178
182
|
}
|
|
179
183
|
|
|
184
|
+
params = _objectSpread({
|
|
185
|
+
edgeScrollWidth: this.params.edgeScrollWidth || this.defaultEdgeScrollWidth
|
|
186
|
+
}, params); // Take formatTimeCallback from plugin params if not already set
|
|
187
|
+
|
|
188
|
+
if (!params.formatTimeCallback && this.params.formatTimeCallback) {
|
|
189
|
+
params = _objectSpread(_objectSpread({}, params), {}, {
|
|
190
|
+
formatTimeCallback: this.params.formatTimeCallback
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
180
194
|
if (!params.minLength && this.regionsMinLength) {
|
|
181
195
|
params = _objectSpread(_objectSpread({}, params), {}, {
|
|
182
196
|
minLength: this.regionsMinLength
|
|
@@ -256,7 +270,21 @@ var RegionsPlugin = /*#__PURE__*/function () {
|
|
|
256
270
|
touchId = e.targetTouches ? e.targetTouches[0].identifier : null; // Store for scroll calculations
|
|
257
271
|
|
|
258
272
|
maxScroll = _this4.wrapper.scrollWidth - _this4.wrapper.clientWidth;
|
|
259
|
-
wrapperRect = _this4.util.withOrientation(_this4.wrapper.getBoundingClientRect(), _this4.vertical);
|
|
273
|
+
wrapperRect = _this4.util.withOrientation(_this4.wrapper.getBoundingClientRect(), _this4.vertical); // set the region channel index based on the clicked area
|
|
274
|
+
|
|
275
|
+
if (_this4.wavesurfer.params.splitChannels) {
|
|
276
|
+
var y = (e.touches ? e.touches[0].clientY : e.clientY) - wrapperRect.top;
|
|
277
|
+
var channelCount = _this4.wavesurfer.backend.buffer != null ? _this4.wavesurfer.backend.buffer.numberOfChannels : 1;
|
|
278
|
+
var channelHeight = _this4.wrapper.clientHeight / channelCount;
|
|
279
|
+
var channelIdx = Math.floor(y / channelHeight);
|
|
280
|
+
params.channelIdx = channelIdx;
|
|
281
|
+
var channelColors = _this4.wavesurfer.params.splitChannelsOptions.channelColors[channelIdx];
|
|
282
|
+
|
|
283
|
+
if (channelColors && channelColors.dragColor) {
|
|
284
|
+
params.color = channelColors.dragColor;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
260
288
|
drag = true;
|
|
261
289
|
start = _this4.wavesurfer.drawer.handleEvent(e, true);
|
|
262
290
|
region = null;
|
|
@@ -479,7 +507,7 @@ var RegionsPlugin = /*#__PURE__*/function () {
|
|
|
479
507
|
return RegionsPlugin;
|
|
480
508
|
}();
|
|
481
509
|
|
|
482
|
-
exports
|
|
510
|
+
exports["default"] = RegionsPlugin;
|
|
483
511
|
module.exports = exports.default;
|
|
484
512
|
|
|
485
513
|
/***/ }),
|
|
@@ -501,7 +529,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
|
|
|
501
529
|
|
|
502
530
|
function _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); } }
|
|
503
531
|
|
|
504
|
-
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
|
532
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
505
533
|
|
|
506
534
|
/**
|
|
507
535
|
* @since 4.0.0
|
|
@@ -563,6 +591,7 @@ var Region = /*#__PURE__*/function () {
|
|
|
563
591
|
this.preventContextMenu = params.preventContextMenu === undefined ? false : Boolean(params.preventContextMenu); // select channel ID to set region
|
|
564
592
|
|
|
565
593
|
var channelIdx = params.channelIdx == null ? -1 : parseInt(params.channelIdx);
|
|
594
|
+
this.channelIdx = channelIdx;
|
|
566
595
|
this.regionHeight = '100%';
|
|
567
596
|
this.marginTop = '0px';
|
|
568
597
|
|
|
@@ -706,7 +735,7 @@ var Region = /*#__PURE__*/function () {
|
|
|
706
735
|
|
|
707
736
|
this.style(this.element, {
|
|
708
737
|
position: 'absolute',
|
|
709
|
-
zIndex:
|
|
738
|
+
zIndex: 3,
|
|
710
739
|
height: this.regionHeight,
|
|
711
740
|
top: this.marginTop
|
|
712
741
|
});
|
|
@@ -1260,14 +1289,18 @@ var Region = /*#__PURE__*/function () {
|
|
|
1260
1289
|
var duration = this.wavesurfer.getDuration();
|
|
1261
1290
|
var eventParams = {
|
|
1262
1291
|
action: 'resize',
|
|
1263
|
-
direction: direction === 'start' ? '
|
|
1292
|
+
direction: direction === 'start' ? 'left' : 'right'
|
|
1264
1293
|
};
|
|
1265
1294
|
|
|
1266
1295
|
if (direction === 'start') {
|
|
1267
1296
|
// Check if changing the start by the given delta would result in the region being smaller than minLength
|
|
1268
|
-
// Ignore cases where we are making the region wider rather than shrinking it
|
|
1269
1297
|
if (delta > 0 && this.end - (this.start + delta) < this.minLength) {
|
|
1270
1298
|
delta = this.end - this.minLength - this.start;
|
|
1299
|
+
} // Check if changing the start by the given delta would result in the region being larger than maxLength
|
|
1300
|
+
|
|
1301
|
+
|
|
1302
|
+
if (delta < 0 && this.end - (this.start + delta) > this.maxLength) {
|
|
1303
|
+
delta = this.end - this.start - this.maxLength;
|
|
1271
1304
|
}
|
|
1272
1305
|
|
|
1273
1306
|
if (delta < 0 && this.start + delta < 0) {
|
|
@@ -1280,9 +1313,13 @@ var Region = /*#__PURE__*/function () {
|
|
|
1280
1313
|
}, eventParams);
|
|
1281
1314
|
} else {
|
|
1282
1315
|
// Check if changing the end by the given delta would result in the region being smaller than minLength
|
|
1283
|
-
// Ignore cases where we are making the region wider rather than shrinking it
|
|
1284
1316
|
if (delta < 0 && this.end + delta - this.start < this.minLength) {
|
|
1285
1317
|
delta = this.start + this.minLength - this.end;
|
|
1318
|
+
} // Check if changing the end by the given delta would result in the region being larger than maxLength
|
|
1319
|
+
|
|
1320
|
+
|
|
1321
|
+
if (delta > 0 && this.end + delta - this.start > this.maxLength) {
|
|
1322
|
+
delta = this.maxLength - (this.end - this.start);
|
|
1286
1323
|
}
|
|
1287
1324
|
|
|
1288
1325
|
if (delta > 0 && this.end + delta > duration) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wavesurfer.regions.js","mappings":"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","sources":["webpack://WaveSurfer.[name]/webpack/universalModuleDefinition","webpack://WaveSurfer.[name]/./src/plugin/regions/index.js","webpack://WaveSurfer.[name]/./src/plugin/regions/region.js","webpack://WaveSurfer.[name]/webpack/bootstrap","webpack://WaveSurfer.[name]/webpack/before-startup","webpack://WaveSurfer.[name]/webpack/startup","webpack://WaveSurfer.[name]/webpack/after-startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"WaveSurfer\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"WaveSurfer\"] = factory();\n\telse\n\t\troot[\"WaveSurfer\"] = root[\"WaveSurfer\"] || {}, root[\"WaveSurfer\"][\"regions\"] = factory();\n})(self, function() {\nreturn ","/**\n * @since 4.0.0 This class has been split\n *\n * @typedef {Object} RegionsPluginParams\n * @property {?boolean} dragSelection Enable creating regions by dragging with\n * the mouse\n * @property {?RegionParams[]} regions Regions that should be added upon\n * initialisation\n * @property {number} slop=2 The sensitivity of the mouse dragging\n * @property {?number} snapToGridInterval Snap the regions to a grid of the specified multiples in seconds\n * @property {?number} snapToGridOffset Shift the snap-to-grid by the specified seconds. May also be negative.\n * @property {?boolean} deferInit Set to true to manually call\n * @property {number[]} maxRegions Maximum number of regions that may be created by the user at one time.\n * `initPlugin('regions')`\n * @property {function} formatTimeCallback Allows custom formating for region tooltip.\n * @property {?number} edgeScrollWidth='5% from container edges' Optional width for edgeScroll to start\n */\n\n/**\n * @typedef {Object} RegionParams\n * @desc The parameters used to describe a region.\n * @example wavesurfer.addRegion(regionParams);\n * @property {string} id=→random The id of the region\n * @property {number} start=0 The start position of the region (in seconds).\n * @property {number} end=0 The end position of the region (in seconds).\n * @property {?boolean} loop Whether to loop the region when played back.\n * @property {boolean} drag=true Allow/disallow dragging the region.\n * @property {boolean} resize=true Allow/disallow resizing the region.\n * @property {string} [color='rgba(0, 0, 0, 0.1)'] HTML color code.\n * @property {?number} channelIdx Select channel to draw the region on (if there are multiple channel waveforms).\n * @property {?object} handleStyle A set of CSS properties used to style the left and right handle.\n * @property {?boolean} preventContextMenu=false Determines whether the context menu is prevented from being opened.\n * @property {boolean} showTooltip=true Enable/disable tooltip displaying start and end times when hovering over region.\n */\n\nimport {Region} from \"./region.js\";\n\n/**\n * Regions are visual overlays on waveform that can be used to play and loop\n * portions of audio. Regions can be dragged and resized.\n *\n * Visual customization is possible via CSS (using the selectors\n * `.wavesurfer-region` and `.wavesurfer-handle`).\n *\n * @implements {PluginClass}\n * @extends {Observer}\n *\n * @example\n * // es6\n * import RegionsPlugin from 'wavesurfer.regions.js';\n *\n * // commonjs\n * var RegionsPlugin = require('wavesurfer.regions.js');\n *\n * // if you are using <script> tags\n * var RegionsPlugin = window.WaveSurfer.regions;\n *\n * // ... initialising wavesurfer with the plugin\n * var wavesurfer = WaveSurfer.create({\n * // wavesurfer options ...\n * plugins: [\n * RegionsPlugin.create({\n * // plugin options ...\n * })\n * ]\n * });\n */\nexport default class RegionsPlugin {\n /**\n * Regions plugin definition factory\n *\n * This function must be used to create a plugin definition which can be\n * used by wavesurfer to correctly instantiate the plugin.\n *\n * @param {RegionsPluginParams} params parameters use to initialise the plugin\n * @return {PluginDefinition} an object representing the plugin\n */\n static create(params) {\n return {\n name: 'regions',\n deferInit: params && params.deferInit ? params.deferInit : false,\n params: params,\n staticProps: {\n addRegion(options) {\n if (!this.initialisedPluginList.regions) {\n this.initPlugin('regions');\n }\n return this.regions.add(options);\n },\n\n clearRegions() {\n this.regions && this.regions.clear();\n },\n\n enableDragSelection(options) {\n if (!this.initialisedPluginList.regions) {\n this.initPlugin('regions');\n }\n this.regions.enableDragSelection(options);\n },\n\n disableDragSelection() {\n this.regions.disableDragSelection();\n }\n },\n instance: RegionsPlugin\n };\n }\n\n constructor(params, ws) {\n this.params = params;\n this.wavesurfer = ws;\n this.util = {\n ...ws.util,\n getRegionSnapToGridValue: value => {\n return this.getRegionSnapToGridValue(value, params);\n }\n };\n this.maxRegions = params.maxRegions;\n this.regionsMinLength = params.regionsMinLength || null;\n\n // turn the plugin instance into an observer\n const observerPrototypeKeys = Object.getOwnPropertyNames(\n this.util.Observer.prototype\n );\n observerPrototypeKeys.forEach(key => {\n Region.prototype[key] = this.util.Observer.prototype[key];\n });\n this.wavesurfer.Region = Region;\n\n // By default, scroll the container if the user drags a region\n // within 5% of its edge\n const scrollWidthProportion = 0.05;\n this._onBackendCreated = () => {\n this.wrapper = this.wavesurfer.drawer.wrapper;\n this.orientation = this.wavesurfer.drawer.orientation;\n if (this.params.regions) {\n this.params.regions.forEach(region => {\n region.edgeScrollWidth = this.params.edgeScrollWidth ||\n this.wrapper.clientWidth * scrollWidthProportion;\n this.add(region);\n });\n }\n };\n\n // Id-based hash of regions\n this.list = {};\n this._onReady = () => {\n this.wrapper = this.wavesurfer.drawer.wrapper;\n this.vertical = this.wavesurfer.drawer.params.vertical;\n if (this.params.dragSelection) {\n this.enableDragSelection(this.params);\n }\n Object.keys(this.list).forEach(id => {\n this.list[id].updateRender();\n });\n };\n }\n\n init() {\n // Check if ws is ready\n if (this.wavesurfer.isReady) {\n this._onBackendCreated();\n this._onReady();\n } else {\n this.wavesurfer.once('ready', this._onReady);\n this.wavesurfer.once('backend-created', this._onBackendCreated);\n }\n }\n\n destroy() {\n this.wavesurfer.un('ready', this._onReady);\n this.wavesurfer.un('backend-created', this._onBackendCreated);\n this.disableDragSelection();\n this.clear();\n }\n\n /**\n * check to see if adding a new region would exceed maxRegions\n * @return {boolean} whether we should proceed and create a region\n * @private\n */\n wouldExceedMaxRegions() {\n return (\n this.maxRegions && Object.keys(this.list).length >= this.maxRegions\n );\n }\n\n /**\n * Add a region\n *\n * @param {object} params Region parameters\n * @return {Region} The created region\n */\n add(params) {\n if (this.wouldExceedMaxRegions()) {\n return null;\n }\n\n if (!params.minLength && this.regionsMinLength) {\n params = {...params, minLength: this.regionsMinLength};\n }\n\n const region = new this.wavesurfer.Region(params, this.util, this.wavesurfer);\n\n this.list[region.id] = region;\n\n region.on('remove', () => {\n delete this.list[region.id];\n });\n\n return region;\n }\n\n /**\n * Remove all regions\n */\n clear() {\n Object.keys(this.list).forEach(id => {\n this.list[id].remove();\n });\n }\n\n enableDragSelection(params) {\n this.disableDragSelection();\n\n const slop = params.slop || 2;\n const container = this.wavesurfer.drawer.container;\n const scroll =\n params.scroll !== false && this.wavesurfer.params.scrollParent;\n const scrollSpeed = params.scrollSpeed || 1;\n const scrollThreshold = params.scrollThreshold || 10;\n let drag;\n let duration = this.wavesurfer.getDuration();\n let maxScroll;\n let start;\n let region;\n let touchId;\n let pxMove = 0;\n let scrollDirection;\n let wrapperRect;\n\n // Scroll when the user is dragging within the threshold\n const edgeScroll = e => {\n if (!region || !scrollDirection) {\n return;\n }\n\n // Update scroll position\n let scrollLeft =\n this.wrapper.scrollLeft + scrollSpeed * scrollDirection;\n this.wrapper.scrollLeft = scrollLeft = Math.min(\n maxScroll,\n Math.max(0, scrollLeft)\n );\n\n // Update range\n const end = this.wavesurfer.drawer.handleEvent(e);\n region.update({\n start: Math.min(end * duration, start * duration),\n end: Math.max(end * duration, start * duration)\n });\n\n // Check that there is more to scroll and repeat\n if (scrollLeft < maxScroll && scrollLeft > 0) {\n window.requestAnimationFrame(() => {\n edgeScroll(e);\n });\n }\n };\n\n const eventDown = e => {\n if (e.touches && e.touches.length > 1) {\n return;\n }\n duration = this.wavesurfer.getDuration();\n touchId = e.targetTouches ? e.targetTouches[0].identifier : null;\n\n // Store for scroll calculations\n maxScroll = this.wrapper.scrollWidth -\n this.wrapper.clientWidth;\n wrapperRect = this.util.withOrientation(\n this.wrapper.getBoundingClientRect(),\n this.vertical\n );\n\n drag = true;\n start = this.wavesurfer.drawer.handleEvent(e, true);\n region = null;\n scrollDirection = null;\n };\n this.wrapper.addEventListener('mousedown', eventDown);\n this.wrapper.addEventListener('touchstart', eventDown);\n this.on('disable-drag-selection', () => {\n this.wrapper.removeEventListener('touchstart', eventDown);\n this.wrapper.removeEventListener('mousedown', eventDown);\n });\n\n const eventUp = e => {\n if (e.touches && e.touches.length > 1) {\n return;\n }\n\n drag = false;\n pxMove = 0;\n scrollDirection = null;\n\n if (region) {\n this.util.preventClick();\n region.fireEvent('update-end', e);\n this.wavesurfer.fireEvent('region-update-end', region, e);\n }\n\n region = null;\n };\n this.wrapper.addEventListener('mouseleave', eventUp);\n this.wrapper.addEventListener('mouseup', eventUp);\n this.wrapper.addEventListener('touchend', eventUp);\n\n document.body.addEventListener('mouseup', eventUp);\n document.body.addEventListener('touchend', eventUp);\n this.on('disable-drag-selection', () => {\n document.body.removeEventListener('mouseup', eventUp);\n document.body.removeEventListener('touchend', eventUp);\n this.wrapper.removeEventListener('touchend', eventUp);\n this.wrapper.removeEventListener('mouseup', eventUp);\n this.wrapper.removeEventListener('mouseleave', eventUp);\n });\n\n const eventMove = event => {\n if (!drag) {\n return;\n }\n if (++pxMove <= slop) {\n return;\n }\n\n if (event.touches && event.touches.length > 1) {\n return;\n }\n if (event.targetTouches && event.targetTouches[0].identifier != touchId) {\n return;\n }\n\n // auto-create a region during mouse drag, unless region-count would exceed \"maxRegions\"\n if (!region) {\n region = this.add(params || {});\n if (!region) {\n return;\n }\n }\n\n const end = this.wavesurfer.drawer.handleEvent(event);\n const startUpdate = this.wavesurfer.regions.util.getRegionSnapToGridValue(\n start * duration\n );\n const endUpdate = this.wavesurfer.regions.util.getRegionSnapToGridValue(\n end * duration\n );\n region.update({\n start: Math.min(endUpdate, startUpdate),\n end: Math.max(endUpdate, startUpdate)\n });\n\n let orientedEvent = this.util.withOrientation(event, this.vertical);\n\n // If scrolling is enabled\n if (scroll && container.clientWidth < this.wrapper.scrollWidth) {\n // Check threshold based on mouse\n const x = orientedEvent.clientX - wrapperRect.left;\n if (x <= scrollThreshold) {\n scrollDirection = -1;\n } else if (x >= wrapperRect.right - scrollThreshold) {\n scrollDirection = 1;\n } else {\n scrollDirection = null;\n }\n scrollDirection && edgeScroll(event);\n }\n };\n this.wrapper.addEventListener('mousemove', eventMove);\n this.wrapper.addEventListener('touchmove', eventMove);\n this.on('disable-drag-selection', () => {\n this.wrapper.removeEventListener('touchmove', eventMove);\n this.wrapper.removeEventListener('mousemove', eventMove);\n });\n\n this.wavesurfer.on('region-created', region => {\n if (this.regionsMinLength) {\n region.minLength = this.regionsMinLength;\n }\n });\n }\n\n disableDragSelection() {\n this.fireEvent('disable-drag-selection');\n }\n\n /**\n * Get current region\n *\n * The smallest region that contains the current time. If several such\n * regions exist, take the first. Return `null` if none exist.\n *\n * @returns {Region} The current region\n */\n getCurrentRegion() {\n const time = this.wavesurfer.getCurrentTime();\n let min = null;\n Object.keys(this.list).forEach(id => {\n const cur = this.list[id];\n if (cur.start <= time && cur.end >= time) {\n if (!min || cur.end - cur.start < min.end - min.start) {\n min = cur;\n }\n }\n });\n\n return min;\n }\n\n /**\n * Match the value to the grid, if required\n *\n * If the regions plugin params have a snapToGridInterval set, return the\n * value matching the nearest grid interval. If no snapToGridInterval is set,\n * the passed value will be returned without modification.\n *\n * @param {number} value the value to snap to the grid, if needed\n * @param {Object} params the regions plugin params\n * @returns {number} value\n */\n getRegionSnapToGridValue(value, params) {\n if (params.snapToGridInterval) {\n // the regions should snap to a grid\n const offset = params.snapToGridOffset || 0;\n return (\n Math.round((value - offset) / params.snapToGridInterval) *\n params.snapToGridInterval +\n offset\n );\n }\n\n // no snap-to-grid\n return value;\n }\n}\n","/**\n * @since 4.0.0\n *\n * (Single) Region plugin class\n *\n * Must be turned into an observer before instantiating. This is done in\n * `RegionsPlugin` (main plugin class).\n *\n * @extends {Observer}\n */\nexport class Region {\n constructor(params, regionsUtils, ws) {\n this.wavesurfer = ws;\n this.wrapper = ws.drawer.wrapper;\n this.util = ws.util;\n this.style = this.util.style;\n this.regionsUtil = regionsUtils;\n this.vertical = ws.drawer.params.vertical;\n\n this.id = params.id == null ? ws.util.getId() : params.id;\n this.start = Number(params.start) || 0;\n this.end =\n params.end == null\n ? // small marker-like region\n this.start +\n (4 / this.wrapper.scrollWidth) * this.wavesurfer.getDuration()\n : Number(params.end);\n this.resize =\n params.resize === undefined ? true : Boolean(params.resize);\n this.drag = params.drag === undefined ? true : Boolean(params.drag);\n // reflect resize and drag state of region for region-updated listener\n this.isResizing = false;\n this.isDragging = false;\n this.loop = Boolean(params.loop);\n this.color = params.color || 'rgba(0, 0, 0, 0.1)';\n // The left and right handleStyle properties can be set to 'none' for\n // no styling or can be assigned an object containing CSS properties.\n this.handleStyle = params.handleStyle || {\n left: {},\n right: {}\n };\n this.handleLeftEl = null;\n this.handleRightEl = null;\n this.data = params.data || {};\n this.attributes = params.attributes || {};\n this.showTooltip = params.showTooltip ?? true;\n\n this.maxLength = params.maxLength;\n // It assumes the minLength parameter value, or the regionsMinLength parameter value, if the first one not provided\n this.minLength = params.minLength;\n this._onRedraw = () => this.updateRender();\n\n this.scroll = params.scroll !== false && ws.params.scrollParent;\n this.scrollSpeed = params.scrollSpeed || 1;\n this.scrollThreshold = params.scrollThreshold || 10;\n // Determines whether the context menu is prevented from being opened.\n this.preventContextMenu =\n params.preventContextMenu === undefined\n ? false\n : Boolean(params.preventContextMenu);\n\n // select channel ID to set region\n let channelIdx =\n params.channelIdx == null ? -1 : parseInt(params.channelIdx);\n this.regionHeight = '100%';\n this.marginTop = '0px';\n\n if (channelIdx !== -1) {\n let channelCount =\n this.wavesurfer.backend.buffer != null\n ? this.wavesurfer.backend.buffer.numberOfChannels\n : -1;\n if (channelCount >= 0 && channelIdx < channelCount) {\n this.regionHeight = Math.floor((1 / channelCount) * 100) + '%';\n this.marginTop =\n this.wavesurfer.getHeight() * channelIdx + 'px';\n }\n }\n\n this.formatTimeCallback = params.formatTimeCallback;\n this.edgeScrollWidth = params.edgeScrollWidth;\n this.bindInOut();\n this.render();\n this.wavesurfer.on('zoom', this._onRedraw);\n this.wavesurfer.on('redraw', this._onRedraw);\n this.wavesurfer.fireEvent('region-created', this);\n }\n\n /* Update region params. */\n update(params, eventParams) {\n if (params.start != null) {\n this.start = Number(params.start);\n }\n if (params.end != null) {\n this.end = Number(params.end);\n }\n if (params.loop != null) {\n this.loop = Boolean(params.loop);\n }\n if (params.color != null) {\n this.color = params.color;\n }\n if (params.handleStyle != null) {\n this.handleStyle = params.handleStyle;\n }\n if (params.data != null) {\n this.data = params.data;\n }\n if (params.resize != null) {\n this.resize = Boolean(params.resize);\n this.updateHandlesResize(this.resize);\n }\n if (params.drag != null) {\n this.drag = Boolean(params.drag);\n }\n if (params.maxLength != null) {\n this.maxLength = Number(params.maxLength);\n }\n if (params.minLength != null) {\n this.minLength = Number(params.minLength);\n }\n if (params.attributes != null) {\n this.attributes = params.attributes;\n }\n\n this.updateRender();\n this.fireEvent('update');\n this.wavesurfer.fireEvent('region-updated', this, eventParams);\n }\n\n /* Remove a single region. */\n remove() {\n if (this.element) {\n this.wrapper.removeChild(this.element.domElement);\n this.element = null;\n this.fireEvent('remove');\n this.wavesurfer.un('zoom', this._onRedraw);\n this.wavesurfer.un('redraw', this._onRedraw);\n this.wavesurfer.fireEvent('region-removed', this);\n }\n }\n\n /**\n * Play the audio region.\n * @param {number} start Optional offset to start playing at\n */\n play(start) {\n const s = start || this.start;\n this.wavesurfer.play(s, this.end);\n this.fireEvent('play');\n this.wavesurfer.fireEvent('region-play', this);\n }\n\n /**\n * Play the audio region in a loop.\n * @param {number} start Optional offset to start playing at\n * */\n playLoop(start) {\n this.loop = true;\n this.play(start);\n }\n\n /**\n * Set looping on/off.\n * @param {boolean} loop True if should play in loop\n */\n setLoop(loop) {\n this.loop = loop;\n }\n\n /* Render a region as a DOM element. */\n render() {\n this.element = this.util.withOrientation(\n this.wrapper.appendChild(document.createElement('region')),\n this.vertical\n );\n\n this.element.className = 'wavesurfer-region';\n if (this.showTooltip) {\n this.element.title = this.formatTime(this.start, this.end);\n }\n this.element.setAttribute('data-id', this.id);\n\n for (const attrname in this.attributes) {\n this.element.setAttribute(\n 'data-region-' + attrname,\n this.attributes[attrname]\n );\n }\n\n this.style(this.element, {\n position: 'absolute',\n zIndex: 2,\n height: this.regionHeight,\n top: this.marginTop\n });\n\n /* Resize handles */\n if (this.resize) {\n this.handleLeftEl = this.util.withOrientation(\n this.element.appendChild(document.createElement('handle')),\n this.vertical\n );\n this.handleRightEl = this.util.withOrientation(\n this.element.appendChild(document.createElement('handle')),\n this.vertical\n );\n\n this.handleLeftEl.className = 'wavesurfer-handle wavesurfer-handle-start';\n this.handleRightEl.className = 'wavesurfer-handle wavesurfer-handle-end';\n\n // Default CSS properties for both handles.\n const css = {\n cursor: this.vertical ? 'row-resize' : 'col-resize',\n position: 'absolute',\n top: '0px',\n width: '2px',\n height: '100%',\n backgroundColor: 'rgba(0, 0, 0, 1)'\n };\n\n // Merge CSS properties per handle.\n const handleLeftCss =\n this.handleStyle.left !== 'none'\n ? Object.assign(\n { left: '0px' },\n css,\n this.handleStyle.left\n )\n : null;\n const handleRightCss =\n this.handleStyle.right !== 'none'\n ? Object.assign(\n { right: '0px' },\n css,\n this.handleStyle.right\n )\n : null;\n\n if (handleLeftCss) {\n this.style(this.handleLeftEl, handleLeftCss);\n }\n\n if (handleRightCss) {\n this.style(this.handleRightEl, handleRightCss);\n }\n }\n\n this.updateRender();\n this.bindEvents();\n }\n\n formatTime(start, end) {\n if (this.formatTimeCallback) {\n return this.formatTimeCallback(start, end);\n }\n return (start == end ? [start] : [start, end])\n .map((time) =>\n [\n Math.floor((time % 3600) / 60), // minutes\n ('00' + Math.floor(time % 60)).slice(-2) // seconds\n ].join(':')\n )\n .join('-');\n }\n\n getWidth() {\n return this.wavesurfer.drawer.width / this.wavesurfer.params.pixelRatio;\n }\n\n /* Update element's position, width, color. */\n updateRender() {\n // duration varies during loading process, so don't overwrite important data\n const dur = this.wavesurfer.getDuration();\n const width = this.getWidth();\n\n let startLimited = this.start;\n let endLimited = this.end;\n if (startLimited < 0) {\n startLimited = 0;\n endLimited = endLimited - startLimited;\n }\n if (endLimited > dur) {\n endLimited = dur;\n startLimited = dur - (endLimited - startLimited);\n }\n\n if (this.minLength != null) {\n endLimited = Math.max(startLimited + this.minLength, endLimited);\n }\n\n if (this.maxLength != null) {\n endLimited = Math.min(startLimited + this.maxLength, endLimited);\n }\n\n if (this.element != null) {\n // Calculate the left and width values of the region such that\n // no gaps appear between regions.\n const left = Math.round((startLimited / dur) * width);\n const regionWidth = Math.round((endLimited / dur) * width) - left;\n\n this.style(this.element, {\n left: left + 'px',\n width: regionWidth + 'px',\n backgroundColor: this.color,\n cursor: this.drag ? 'move' : 'default'\n });\n\n for (const attrname in this.attributes) {\n this.element.setAttribute(\n 'data-region-' + attrname,\n this.attributes[attrname]\n );\n }\n\n if (this.showTooltip) {\n this.element.title = this.formatTime(this.start, this.end);\n }\n }\n }\n\n /* Bind audio events. */\n bindInOut() {\n this.firedIn = false;\n this.firedOut = false;\n\n const onProcess = (time) => {\n let start = Math.round(this.start * 10) / 10;\n let end = Math.round(this.end * 10) / 10;\n time = Math.round(time * 10) / 10;\n\n if (\n !this.firedOut &&\n this.firedIn &&\n (start > time || end <= time)\n ) {\n this.firedOut = true;\n this.firedIn = false;\n this.fireEvent('out');\n this.wavesurfer.fireEvent('region-out', this);\n }\n if (!this.firedIn && start <= time && end > time) {\n this.firedIn = true;\n this.firedOut = false;\n this.fireEvent('in');\n this.wavesurfer.fireEvent('region-in', this);\n }\n };\n\n this.wavesurfer.backend.on('audioprocess', onProcess);\n\n this.on('remove', () => {\n this.wavesurfer.backend.un('audioprocess', onProcess);\n });\n\n /* Loop playback. */\n this.on('out', () => {\n if (this.loop) {\n const realTime = this.wavesurfer.getCurrentTime();\n if (realTime >= this.start && realTime <= this.end) {\n this.wavesurfer.play(this.start);\n }\n }\n });\n }\n\n /* Bind DOM events. */\n bindEvents() {\n const preventContextMenu = this.preventContextMenu;\n\n this.element.addEventListener('mouseenter', (e) => {\n this.fireEvent('mouseenter', e);\n this.wavesurfer.fireEvent('region-mouseenter', this, e);\n });\n\n this.element.addEventListener('mouseleave', (e) => {\n this.fireEvent('mouseleave', e);\n this.wavesurfer.fireEvent('region-mouseleave', this, e);\n });\n\n this.element.addEventListener('click', (e) => {\n e.preventDefault();\n this.fireEvent('click', e);\n this.wavesurfer.fireEvent('region-click', this, e);\n });\n\n this.element.addEventListener('dblclick', (e) => {\n e.stopPropagation();\n e.preventDefault();\n this.fireEvent('dblclick', e);\n this.wavesurfer.fireEvent('region-dblclick', this, e);\n });\n\n this.element.addEventListener('contextmenu', (e) => {\n if (preventContextMenu) {\n e.preventDefault();\n }\n this.fireEvent('contextmenu', e);\n this.wavesurfer.fireEvent('region-contextmenu', this, e);\n });\n\n /* Drag or resize on mousemove. */\n if (this.drag || this.resize) {\n this.bindDragEvents();\n }\n }\n\n bindDragEvents() {\n const container = this.wavesurfer.drawer.container;\n const scrollSpeed = this.scrollSpeed;\n const scrollThreshold = this.scrollThreshold;\n let startTime;\n let touchId;\n let drag;\n let maxScroll;\n let resize;\n let updated = false;\n let scrollDirection;\n let wrapperRect;\n let regionLeftHalfTime;\n let regionRightHalfTime;\n\n // Scroll when the user is dragging within the threshold\n const edgeScroll = (event) => {\n let orientedEvent = this.util.withOrientation(event, this.vertical);\n const duration = this.wavesurfer.getDuration();\n if (!scrollDirection || (!drag && !resize)) {\n return;\n }\n\n const x = orientedEvent.clientX;\n let distanceBetweenCursorAndWrapperEdge = 0;\n let regionHalfTimeWidth = 0;\n let adjustment = 0;\n\n // Get the currently selected time according to the mouse position\n let time = this.regionsUtil.getRegionSnapToGridValue(\n this.wavesurfer.drawer.handleEvent(event) * duration\n );\n\n if (drag) {\n // Considering the point of contact with the region while edgescrolling\n if (scrollDirection === -1) {\n regionHalfTimeWidth = regionLeftHalfTime * this.wavesurfer.params.minPxPerSec;\n distanceBetweenCursorAndWrapperEdge = x - wrapperRect.left;\n } else {\n regionHalfTimeWidth = regionRightHalfTime * this.wavesurfer.params.minPxPerSec;\n distanceBetweenCursorAndWrapperEdge = wrapperRect.right - x;\n }\n } else {\n // Considering minLength while edgescroll\n let minLength = this.minLength;\n if (!minLength) {\n minLength = 0;\n }\n\n if (resize === 'start') {\n if (time > this.end - minLength) {\n time = this.end - minLength;\n adjustment = scrollSpeed * scrollDirection;\n }\n\n if (time < 0) {\n time = 0;\n }\n } else if (resize === 'end') {\n if (time < this.start + minLength) {\n time = this.start + minLength;\n adjustment = scrollSpeed * scrollDirection;\n }\n\n if (time > duration) {\n time = duration;\n }\n }\n }\n\n // Don't edgescroll if region has reached min or max limit\n const wrapperScrollLeft = this.wrapper.scrollLeft;\n\n if (scrollDirection === -1) {\n if (Math.round(wrapperScrollLeft) === 0) {\n return;\n }\n\n if (Math.round(wrapperScrollLeft - regionHalfTimeWidth + distanceBetweenCursorAndWrapperEdge) <= 0) {\n return;\n }\n } else {\n if (Math.round(wrapperScrollLeft) === maxScroll) {\n return;\n }\n\n if (Math.round(wrapperScrollLeft + regionHalfTimeWidth - distanceBetweenCursorAndWrapperEdge) >= maxScroll) {\n return;\n }\n }\n\n // Update scroll position\n let scrollLeft = wrapperScrollLeft - adjustment + scrollSpeed * scrollDirection;\n\n if (scrollDirection === -1) {\n const calculatedLeft = Math.max(0 + regionHalfTimeWidth - distanceBetweenCursorAndWrapperEdge, scrollLeft);\n this.wrapper.scrollLeft = scrollLeft = calculatedLeft;\n } else {\n const calculatedRight = Math.min(maxScroll - regionHalfTimeWidth + distanceBetweenCursorAndWrapperEdge, scrollLeft);\n this.wrapper.scrollLeft = scrollLeft = calculatedRight;\n }\n\n const delta = time - startTime;\n startTime = time;\n\n // Continue dragging or resizing\n drag ? this.onDrag(delta) : this.onResize(delta, resize);\n\n // Repeat\n window.requestAnimationFrame(() => {\n edgeScroll(event);\n });\n };\n\n const onDown = (event) => {\n const duration = this.wavesurfer.getDuration();\n if (event.touches && event.touches.length > 1) {\n return;\n }\n touchId = event.targetTouches ? event.targetTouches[0].identifier : null;\n\n // stop the event propagation, if this region is resizable or draggable\n // and the event is therefore handled here.\n if (this.drag || this.resize) {\n event.stopPropagation();\n }\n\n // Store the selected startTime we begun dragging or resizing\n startTime = this.regionsUtil.getRegionSnapToGridValue(\n this.wavesurfer.drawer.handleEvent(event, true) * duration\n );\n\n // Store the selected point of contact when we begin dragging\n regionLeftHalfTime = startTime - this.start;\n regionRightHalfTime = this.end - startTime;\n\n // Store for scroll calculations\n maxScroll = this.wrapper.scrollWidth - this.wrapper.clientWidth;\n\n wrapperRect = this.util.withOrientation(\n this.wrapper.getBoundingClientRect(),\n this.vertical\n );\n\n this.isResizing = false;\n this.isDragging = false;\n if (event.target.tagName.toLowerCase() === 'handle') {\n this.isResizing = true;\n resize = event.target.classList.contains('wavesurfer-handle-start')\n ? 'start'\n : 'end';\n } else {\n this.isDragging = true;\n drag = true;\n resize = false;\n }\n };\n const onUp = (event) => {\n if (event.touches && event.touches.length > 1) {\n return;\n }\n\n if (drag || resize) {\n this.isDragging = false;\n this.isResizing = false;\n drag = false;\n scrollDirection = null;\n resize = false;\n }\n\n if (updated) {\n updated = false;\n this.util.preventClick();\n this.fireEvent('update-end', event);\n this.wavesurfer.fireEvent('region-update-end', this, event);\n }\n };\n const onMove = (event) => {\n const duration = this.wavesurfer.getDuration();\n let orientedEvent = this.util.withOrientation(event, this.vertical);\n\n if (event.touches && event.touches.length > 1) {\n return;\n }\n if (event.targetTouches && event.targetTouches[0].identifier != touchId) {\n return;\n }\n if (!drag && !resize) {\n return;\n }\n\n const oldTime = startTime;\n let time = this.regionsUtil.getRegionSnapToGridValue(\n this.wavesurfer.drawer.handleEvent(event) * duration\n );\n\n if (drag) {\n // To maintain relative cursor start point while dragging\n const maxEnd = this.wavesurfer.getDuration();\n if (time > maxEnd - regionRightHalfTime) {\n time = maxEnd - regionRightHalfTime;\n }\n\n if (time - regionLeftHalfTime < 0) {\n time = regionLeftHalfTime;\n }\n }\n\n if (resize) {\n // To maintain relative cursor start point while resizing\n // we have to handle for minLength\n let minLength = this.minLength;\n if (!minLength) {\n minLength = 0;\n }\n\n if (resize === 'start') {\n if (time > this.end - minLength) {\n time = this.end - minLength;\n }\n\n if (time < 0) {\n time = 0;\n }\n } else if (resize === 'end') {\n if (time < this.start + minLength) {\n time = this.start + minLength;\n }\n\n if (time > duration) {\n time = duration;\n }\n }\n }\n\n let delta = time - startTime;\n startTime = time;\n\n // Drag\n if (this.drag && drag) {\n updated = updated || !!delta;\n this.onDrag(delta);\n }\n\n // Resize\n if (this.resize && resize) {\n updated = updated || !!delta;\n this.onResize(delta, resize);\n }\n\n if (\n this.scroll && container.clientWidth < this.wrapper.scrollWidth\n ) {\n // Triggering edgescroll from within edgeScrollWidth\n let x = orientedEvent.clientX;\n\n // Check direction\n if (x < wrapperRect.left + this.edgeScrollWidth) {\n scrollDirection = -1;\n } else if (x > wrapperRect.right - this.edgeScrollWidth) {\n scrollDirection = 1;\n } else {\n scrollDirection = null;\n }\n\n if (scrollDirection) {\n edgeScroll(event);\n }\n }\n };\n\n this.element.addEventListener('mousedown', onDown);\n this.element.addEventListener('touchstart', onDown);\n\n document.body.addEventListener('mousemove', onMove);\n document.body.addEventListener('touchmove', onMove, {passive: false});\n\n document.addEventListener('mouseup', onUp);\n document.body.addEventListener('touchend', onUp);\n\n this.on('remove', () => {\n document.removeEventListener('mouseup', onUp);\n document.body.removeEventListener('touchend', onUp);\n document.body.removeEventListener('mousemove', onMove);\n document.body.removeEventListener('touchmove', onMove);\n });\n\n this.wavesurfer.on('destroy', () => {\n document.removeEventListener('mouseup', onUp);\n document.body.removeEventListener('touchend', onUp);\n });\n }\n\n onDrag(delta) {\n const maxEnd = this.wavesurfer.getDuration();\n if (this.end + delta > maxEnd) {\n delta = maxEnd - this.end;\n }\n\n if (this.start + delta < 0) {\n delta = this.start * -1;\n }\n\n const eventParams = {\n direction: this._getDragDirection(delta),\n action: 'drag'\n };\n\n this.update({\n start: this.start + delta,\n end: this.end + delta\n }, eventParams);\n }\n\n /**\n * Returns the direction of dragging region based on delta\n * Negative delta means region is moving to the left\n * Positive - to the right\n * For zero delta the direction is not defined\n * @param {number} delta Drag offset\n * @returns {string|null} Direction 'left', 'right' or null\n */\n _getDragDirection(delta) {\n if (delta < 0) {\n return 'left';\n }\n if (delta > 0) {\n return 'right';\n }\n return null;\n }\n\n /**\n * @example\n * onResize(-5, 'start') // Moves the start point 5 seconds back\n * onResize(0.5, 'end') // Moves the end point 0.5 seconds forward\n *\n * @param {number} delta How much to add or subtract, given in seconds\n * @param {string} direction 'start 'or 'end'\n */\n onResize(delta, direction) {\n const duration = this.wavesurfer.getDuration();\n const eventParams = {\n action: 'resize',\n direction: direction === 'start' ? 'right' : 'left'\n };\n\n if (direction === 'start') {\n // Check if changing the start by the given delta would result in the region being smaller than minLength\n // Ignore cases where we are making the region wider rather than shrinking it\n if (delta > 0 && this.end - (this.start + delta) < this.minLength) {\n delta = this.end - this.minLength - this.start;\n }\n\n if (delta < 0 && (this.start + delta) < 0) {\n delta = this.start * -1;\n }\n\n this.update({\n start: Math.min(this.start + delta, this.end),\n end: Math.max(this.start + delta, this.end)\n }, eventParams);\n } else {\n // Check if changing the end by the given delta would result in the region being smaller than minLength\n // Ignore cases where we are making the region wider rather than shrinking it\n if (delta < 0 && this.end + delta - this.start < this.minLength) {\n delta = this.start + this.minLength - this.end;\n }\n\n if (delta > 0 && (this.end + delta) > duration) {\n delta = duration - this.end;\n }\n\n this.update({\n start: Math.min(this.end + delta, this.start),\n end: Math.max(this.end + delta, this.start)\n }, eventParams);\n }\n }\n\n updateHandlesResize(resize) {\n let cursorStyle;\n if (resize) {\n cursorStyle = this.vertical ? 'row-resize' : 'col-resize';\n } else {\n cursorStyle = 'auto';\n }\n\n this.handleLeftEl && this.style(this.handleLeftEl, { cursor: cursorStyle });\n this.handleRightEl && this.style(this.handleRightEl, { cursor: cursorStyle });\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(\"./src/plugin/regions/index.js\");\n",""],"names":["RegionsPlugin","params","ws","wavesurfer","util","getRegionSnapToGridValue","value","maxRegions","regionsMinLength","observerPrototypeKeys","Object","getOwnPropertyNames","Observer","prototype","forEach","key","Region","scrollWidthProportion","_onBackendCreated","wrapper","drawer","orientation","regions","region","edgeScrollWidth","clientWidth","add","list","_onReady","vertical","dragSelection","enableDragSelection","keys","id","updateRender","isReady","once","un","disableDragSelection","clear","length","wouldExceedMaxRegions","minLength","on","remove","slop","container","scroll","scrollParent","scrollSpeed","scrollThreshold","drag","duration","getDuration","maxScroll","start","touchId","pxMove","scrollDirection","wrapperRect","edgeScroll","e","scrollLeft","Math","min","max","end","handleEvent","update","window","requestAnimationFrame","eventDown","touches","targetTouches","identifier","scrollWidth","withOrientation","getBoundingClientRect","addEventListener","removeEventListener","eventUp","preventClick","fireEvent","document","body","eventMove","event","startUpdate","endUpdate","orientedEvent","x","clientX","left","right","time","getCurrentTime","cur","snapToGridInterval","offset","snapToGridOffset","round","name","deferInit","staticProps","addRegion","options","initialisedPluginList","initPlugin","clearRegions","instance","regionsUtils","style","regionsUtil","getId","Number","resize","undefined","Boolean","isResizing","isDragging","loop","color","handleStyle","handleLeftEl","handleRightEl","data","attributes","showTooltip","maxLength","_onRedraw","preventContextMenu","channelIdx","parseInt","regionHeight","marginTop","channelCount","backend","buffer","numberOfChannels","floor","getHeight","formatTimeCallback","bindInOut","render","eventParams","updateHandlesResize","element","removeChild","domElement","s","play","appendChild","createElement","className","title","formatTime","setAttribute","attrname","position","zIndex","height","top","css","cursor","width","backgroundColor","handleLeftCss","assign","handleRightCss","bindEvents","map","slice","join","pixelRatio","dur","getWidth","startLimited","endLimited","regionWidth","firedIn","firedOut","onProcess","realTime","preventDefault","stopPropagation","bindDragEvents","startTime","updated","regionLeftHalfTime","regionRightHalfTime","distanceBetweenCursorAndWrapperEdge","regionHalfTimeWidth","adjustment","minPxPerSec","wrapperScrollLeft","calculatedLeft","calculatedRight","delta","onDrag","onResize","onDown","target","tagName","toLowerCase","classList","contains","onUp","onMove","oldTime","maxEnd","passive","direction","_getDragDirection","action","cursorStyle"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"wavesurfer.regions.js","mappings":"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","sources":["webpack://WaveSurfer.[name]/webpack/universalModuleDefinition","webpack://WaveSurfer.[name]/./src/plugin/regions/index.js","webpack://WaveSurfer.[name]/./src/plugin/regions/region.js","webpack://WaveSurfer.[name]/webpack/bootstrap","webpack://WaveSurfer.[name]/webpack/before-startup","webpack://WaveSurfer.[name]/webpack/startup","webpack://WaveSurfer.[name]/webpack/after-startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"WaveSurfer\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"WaveSurfer\"] = factory();\n\telse\n\t\troot[\"WaveSurfer\"] = root[\"WaveSurfer\"] || {}, root[\"WaveSurfer\"][\"regions\"] = factory();\n})(self, function() {\nreturn ","/**\n * @since 4.0.0 This class has been split\n *\n * @typedef {Object} RegionsPluginParams\n * @property {?boolean} dragSelection Enable creating regions by dragging with\n * the mouse\n * @property {?RegionParams[]} regions Regions that should be added upon\n * initialisation\n * @property {number} slop=2 The sensitivity of the mouse dragging\n * @property {?number} snapToGridInterval Snap the regions to a grid of the specified multiples in seconds\n * @property {?number} snapToGridOffset Shift the snap-to-grid by the specified seconds. May also be negative.\n * @property {?boolean} deferInit Set to true to manually call\n * @property {number[]} maxRegions Maximum number of regions that may be created by the user at one time.\n * `initPlugin('regions')`\n * @property {function} formatTimeCallback Allows custom formating for region tooltip.\n * @property {?number} edgeScrollWidth='5% from container edges' Optional width for edgeScroll to start\n */\n\n/**\n * @typedef {Object} RegionParams\n * @desc The parameters used to describe a region.\n * @example wavesurfer.addRegion(regionParams);\n * @property {string} id=→random The id of the region\n * @property {number} start=0 The start position of the region (in seconds).\n * @property {number} end=0 The end position of the region (in seconds).\n * @property {?boolean} loop Whether to loop the region when played back.\n * @property {boolean} drag=true Allow/disallow dragging the region.\n * @property {boolean} resize=true Allow/disallow resizing the region.\n * @property {string} [color='rgba(0, 0, 0, 0.1)'] HTML color code.\n * @property {?number} channelIdx Select channel to draw the region on (if there are multiple channel waveforms).\n * @property {?object} handleStyle A set of CSS properties used to style the left and right handle.\n * @property {?boolean} preventContextMenu=false Determines whether the context menu is prevented from being opened.\n * @property {boolean} showTooltip=true Enable/disable tooltip displaying start and end times when hovering over region.\n */\n\nimport {Region} from \"./region.js\";\n\n/**\n * Regions are visual overlays on waveform that can be used to play and loop\n * portions of audio. Regions can be dragged and resized.\n *\n * Visual customization is possible via CSS (using the selectors\n * `.wavesurfer-region` and `.wavesurfer-handle`).\n *\n * @implements {PluginClass}\n * @extends {Observer}\n *\n * @example\n * // es6\n * import RegionsPlugin from 'wavesurfer.regions.js';\n *\n * // commonjs\n * var RegionsPlugin = require('wavesurfer.regions.js');\n *\n * // if you are using <script> tags\n * var RegionsPlugin = window.WaveSurfer.regions;\n *\n * // ... initialising wavesurfer with the plugin\n * var wavesurfer = WaveSurfer.create({\n * // wavesurfer options ...\n * plugins: [\n * RegionsPlugin.create({\n * // plugin options ...\n * })\n * ]\n * });\n */\nexport default class RegionsPlugin {\n /**\n * Regions plugin definition factory\n *\n * This function must be used to create a plugin definition which can be\n * used by wavesurfer to correctly instantiate the plugin.\n *\n * @param {RegionsPluginParams} params parameters use to initialise the plugin\n * @return {PluginDefinition} an object representing the plugin\n */\n static create(params) {\n return {\n name: 'regions',\n deferInit: params && params.deferInit ? params.deferInit : false,\n params: params,\n staticProps: {\n addRegion(options) {\n if (!this.initialisedPluginList.regions) {\n this.initPlugin('regions');\n }\n return this.regions.add(options);\n },\n\n clearRegions() {\n this.regions && this.regions.clear();\n },\n\n enableDragSelection(options) {\n if (!this.initialisedPluginList.regions) {\n this.initPlugin('regions');\n }\n this.regions.enableDragSelection(options);\n },\n\n disableDragSelection() {\n this.regions.disableDragSelection();\n }\n },\n instance: RegionsPlugin\n };\n }\n\n constructor(params, ws) {\n this.params = params;\n this.wavesurfer = ws;\n this.util = {\n ...ws.util,\n getRegionSnapToGridValue: value => {\n return this.getRegionSnapToGridValue(value, params);\n }\n };\n this.maxRegions = params.maxRegions;\n this.regionsMinLength = params.regionsMinLength || null;\n\n // turn the plugin instance into an observer\n const observerPrototypeKeys = Object.getOwnPropertyNames(\n this.util.Observer.prototype\n );\n observerPrototypeKeys.forEach(key => {\n Region.prototype[key] = this.util.Observer.prototype[key];\n });\n this.wavesurfer.Region = Region;\n\n // By default, scroll the container if the user drags a region\n // within 5% (based on its initial size) of its edge\n const scrollWidthProportion = 0.05;\n this._onBackendCreated = () => {\n this.wrapper = this.wavesurfer.drawer.wrapper;\n this.orientation = this.wavesurfer.drawer.orientation;\n this.defaultEdgeScrollWidth = this.wrapper.clientWidth * scrollWidthProportion;\n if (this.params.regions) {\n this.params.regions.forEach(region => {\n this.add(region);\n });\n }\n };\n\n // Id-based hash of regions\n this.list = {};\n this._onReady = () => {\n this.wrapper = this.wavesurfer.drawer.wrapper;\n this.vertical = this.wavesurfer.drawer.params.vertical;\n if (this.params.dragSelection) {\n this.enableDragSelection(this.params);\n }\n Object.keys(this.list).forEach(id => {\n this.list[id].updateRender();\n });\n };\n }\n\n init() {\n // Check if ws is ready\n if (this.wavesurfer.isReady) {\n this._onBackendCreated();\n this._onReady();\n } else {\n this.wavesurfer.once('ready', this._onReady);\n this.wavesurfer.once('backend-created', this._onBackendCreated);\n }\n }\n\n destroy() {\n this.wavesurfer.un('ready', this._onReady);\n this.wavesurfer.un('backend-created', this._onBackendCreated);\n // Disabling `region-removed' because destroying the plugin calls\n // the Region.remove() method that is also used to remove regions based\n // on user input. This can cause confusion since teardown is not a\n // user event, but would emit `region-removed` as if it was.\n this.wavesurfer.setDisabledEventEmissions(['region-removed']);\n this.disableDragSelection();\n this.clear();\n }\n\n /**\n * check to see if adding a new region would exceed maxRegions\n * @return {boolean} whether we should proceed and create a region\n * @private\n */\n wouldExceedMaxRegions() {\n return (\n this.maxRegions && Object.keys(this.list).length >= this.maxRegions\n );\n }\n\n /**\n * Add a region\n *\n * @param {object} params Region parameters\n * @return {Region} The created region\n */\n add(params) {\n if (this.wouldExceedMaxRegions()) {\n return null;\n }\n\n params = {\n edgeScrollWidth: this.params.edgeScrollWidth || this.defaultEdgeScrollWidth,\n ...params\n };\n\n // Take formatTimeCallback from plugin params if not already set\n if (!params.formatTimeCallback && this.params.formatTimeCallback) {\n params = {...params, formatTimeCallback: this.params.formatTimeCallback};\n }\n\n if (!params.minLength && this.regionsMinLength) {\n params = {...params, minLength: this.regionsMinLength};\n }\n\n const region = new this.wavesurfer.Region(params, this.util, this.wavesurfer);\n\n this.list[region.id] = region;\n\n region.on('remove', () => {\n delete this.list[region.id];\n });\n\n return region;\n }\n\n /**\n * Remove all regions\n */\n clear() {\n Object.keys(this.list).forEach(id => {\n this.list[id].remove();\n });\n }\n\n enableDragSelection(params) {\n this.disableDragSelection();\n\n const slop = params.slop || 2;\n const container = this.wavesurfer.drawer.container;\n const scroll =\n params.scroll !== false && this.wavesurfer.params.scrollParent;\n const scrollSpeed = params.scrollSpeed || 1;\n const scrollThreshold = params.scrollThreshold || 10;\n let drag;\n let duration = this.wavesurfer.getDuration();\n let maxScroll;\n let start;\n let region;\n let touchId;\n let pxMove = 0;\n let scrollDirection;\n let wrapperRect;\n\n // Scroll when the user is dragging within the threshold\n const edgeScroll = e => {\n if (!region || !scrollDirection) {\n return;\n }\n\n // Update scroll position\n let scrollLeft =\n this.wrapper.scrollLeft + scrollSpeed * scrollDirection;\n this.wrapper.scrollLeft = scrollLeft = Math.min(\n maxScroll,\n Math.max(0, scrollLeft)\n );\n\n // Update range\n const end = this.wavesurfer.drawer.handleEvent(e);\n region.update({\n start: Math.min(end * duration, start * duration),\n end: Math.max(end * duration, start * duration)\n });\n\n // Check that there is more to scroll and repeat\n if (scrollLeft < maxScroll && scrollLeft > 0) {\n window.requestAnimationFrame(() => {\n edgeScroll(e);\n });\n }\n };\n\n const eventDown = e => {\n if (e.touches && e.touches.length > 1) {\n return;\n }\n duration = this.wavesurfer.getDuration();\n touchId = e.targetTouches ? e.targetTouches[0].identifier : null;\n\n // Store for scroll calculations\n maxScroll = this.wrapper.scrollWidth -\n this.wrapper.clientWidth;\n wrapperRect = this.util.withOrientation(\n this.wrapper.getBoundingClientRect(),\n this.vertical\n );\n\n // set the region channel index based on the clicked area\n if (this.wavesurfer.params.splitChannels) {\n const y = (e.touches ? e.touches[0].clientY : e.clientY) - wrapperRect.top;\n const channelCount = this.wavesurfer.backend.buffer != null ? this.wavesurfer.backend.buffer.numberOfChannels : 1;\n const channelHeight = this.wrapper.clientHeight / channelCount;\n const channelIdx = Math.floor(y / channelHeight);\n params.channelIdx = channelIdx;\n const channelColors = this.wavesurfer.params.splitChannelsOptions.channelColors[channelIdx];\n if (channelColors && channelColors.dragColor) {\n params.color = channelColors.dragColor;\n }\n }\n\n drag = true;\n start = this.wavesurfer.drawer.handleEvent(e, true);\n region = null;\n scrollDirection = null;\n };\n this.wrapper.addEventListener('mousedown', eventDown);\n this.wrapper.addEventListener('touchstart', eventDown);\n this.on('disable-drag-selection', () => {\n this.wrapper.removeEventListener('touchstart', eventDown);\n this.wrapper.removeEventListener('mousedown', eventDown);\n });\n\n const eventUp = e => {\n if (e.touches && e.touches.length > 1) {\n return;\n }\n\n drag = false;\n pxMove = 0;\n scrollDirection = null;\n\n if (region) {\n this.util.preventClick();\n region.fireEvent('update-end', e);\n this.wavesurfer.fireEvent('region-update-end', region, e);\n }\n\n region = null;\n };\n this.wrapper.addEventListener('mouseleave', eventUp);\n this.wrapper.addEventListener('mouseup', eventUp);\n this.wrapper.addEventListener('touchend', eventUp);\n\n document.body.addEventListener('mouseup', eventUp);\n document.body.addEventListener('touchend', eventUp);\n this.on('disable-drag-selection', () => {\n document.body.removeEventListener('mouseup', eventUp);\n document.body.removeEventListener('touchend', eventUp);\n this.wrapper.removeEventListener('touchend', eventUp);\n this.wrapper.removeEventListener('mouseup', eventUp);\n this.wrapper.removeEventListener('mouseleave', eventUp);\n });\n\n const eventMove = event => {\n if (!drag) {\n return;\n }\n if (++pxMove <= slop) {\n return;\n }\n\n if (event.touches && event.touches.length > 1) {\n return;\n }\n if (event.targetTouches && event.targetTouches[0].identifier != touchId) {\n return;\n }\n\n // auto-create a region during mouse drag, unless region-count would exceed \"maxRegions\"\n if (!region) {\n region = this.add(params || {});\n if (!region) {\n return;\n }\n }\n\n const end = this.wavesurfer.drawer.handleEvent(event);\n const startUpdate = this.wavesurfer.regions.util.getRegionSnapToGridValue(\n start * duration\n );\n const endUpdate = this.wavesurfer.regions.util.getRegionSnapToGridValue(\n end * duration\n );\n region.update({\n start: Math.min(endUpdate, startUpdate),\n end: Math.max(endUpdate, startUpdate)\n });\n\n let orientedEvent = this.util.withOrientation(event, this.vertical);\n\n // If scrolling is enabled\n if (scroll && container.clientWidth < this.wrapper.scrollWidth) {\n // Check threshold based on mouse\n const x = orientedEvent.clientX - wrapperRect.left;\n if (x <= scrollThreshold) {\n scrollDirection = -1;\n } else if (x >= wrapperRect.right - scrollThreshold) {\n scrollDirection = 1;\n } else {\n scrollDirection = null;\n }\n scrollDirection && edgeScroll(event);\n }\n };\n this.wrapper.addEventListener('mousemove', eventMove);\n this.wrapper.addEventListener('touchmove', eventMove);\n this.on('disable-drag-selection', () => {\n this.wrapper.removeEventListener('touchmove', eventMove);\n this.wrapper.removeEventListener('mousemove', eventMove);\n });\n\n this.wavesurfer.on('region-created', region => {\n if (this.regionsMinLength) {\n region.minLength = this.regionsMinLength;\n }\n });\n }\n\n disableDragSelection() {\n this.fireEvent('disable-drag-selection');\n }\n\n /**\n * Get current region\n *\n * The smallest region that contains the current time. If several such\n * regions exist, take the first. Return `null` if none exist.\n *\n * @returns {Region} The current region\n */\n getCurrentRegion() {\n const time = this.wavesurfer.getCurrentTime();\n let min = null;\n Object.keys(this.list).forEach(id => {\n const cur = this.list[id];\n if (cur.start <= time && cur.end >= time) {\n if (!min || cur.end - cur.start < min.end - min.start) {\n min = cur;\n }\n }\n });\n\n return min;\n }\n\n /**\n * Match the value to the grid, if required\n *\n * If the regions plugin params have a snapToGridInterval set, return the\n * value matching the nearest grid interval. If no snapToGridInterval is set,\n * the passed value will be returned without modification.\n *\n * @param {number} value the value to snap to the grid, if needed\n * @param {Object} params the regions plugin params\n * @returns {number} value\n */\n getRegionSnapToGridValue(value, params) {\n if (params.snapToGridInterval) {\n // the regions should snap to a grid\n const offset = params.snapToGridOffset || 0;\n return (\n Math.round((value - offset) / params.snapToGridInterval) *\n params.snapToGridInterval +\n offset\n );\n }\n\n // no snap-to-grid\n return value;\n }\n}\n","/**\n * @since 4.0.0\n *\n * (Single) Region plugin class\n *\n * Must be turned into an observer before instantiating. This is done in\n * `RegionsPlugin` (main plugin class).\n *\n * @extends {Observer}\n */\nexport class Region {\n constructor(params, regionsUtils, ws) {\n this.wavesurfer = ws;\n this.wrapper = ws.drawer.wrapper;\n this.util = ws.util;\n this.style = this.util.style;\n this.regionsUtil = regionsUtils;\n this.vertical = ws.drawer.params.vertical;\n\n this.id = params.id == null ? ws.util.getId() : params.id;\n this.start = Number(params.start) || 0;\n this.end =\n params.end == null\n ? // small marker-like region\n this.start +\n (4 / this.wrapper.scrollWidth) * this.wavesurfer.getDuration()\n : Number(params.end);\n this.resize =\n params.resize === undefined ? true : Boolean(params.resize);\n this.drag = params.drag === undefined ? true : Boolean(params.drag);\n // reflect resize and drag state of region for region-updated listener\n this.isResizing = false;\n this.isDragging = false;\n this.loop = Boolean(params.loop);\n this.color = params.color || 'rgba(0, 0, 0, 0.1)';\n // The left and right handleStyle properties can be set to 'none' for\n // no styling or can be assigned an object containing CSS properties.\n this.handleStyle = params.handleStyle || {\n left: {},\n right: {}\n };\n this.handleLeftEl = null;\n this.handleRightEl = null;\n this.data = params.data || {};\n this.attributes = params.attributes || {};\n this.showTooltip = params.showTooltip ?? true;\n\n this.maxLength = params.maxLength;\n // It assumes the minLength parameter value, or the regionsMinLength parameter value, if the first one not provided\n this.minLength = params.minLength;\n this._onRedraw = () => this.updateRender();\n\n this.scroll = params.scroll !== false && ws.params.scrollParent;\n this.scrollSpeed = params.scrollSpeed || 1;\n this.scrollThreshold = params.scrollThreshold || 10;\n // Determines whether the context menu is prevented from being opened.\n this.preventContextMenu =\n params.preventContextMenu === undefined\n ? false\n : Boolean(params.preventContextMenu);\n\n // select channel ID to set region\n let channelIdx =\n params.channelIdx == null ? -1 : parseInt(params.channelIdx);\n this.channelIdx = channelIdx;\n this.regionHeight = '100%';\n this.marginTop = '0px';\n\n if (channelIdx !== -1) {\n let channelCount =\n this.wavesurfer.backend.buffer != null\n ? this.wavesurfer.backend.buffer.numberOfChannels\n : -1;\n if (channelCount >= 0 && channelIdx < channelCount) {\n this.regionHeight = Math.floor((1 / channelCount) * 100) + '%';\n this.marginTop =\n this.wavesurfer.getHeight() * channelIdx + 'px';\n }\n }\n\n this.formatTimeCallback = params.formatTimeCallback;\n this.edgeScrollWidth = params.edgeScrollWidth;\n this.bindInOut();\n this.render();\n this.wavesurfer.on('zoom', this._onRedraw);\n this.wavesurfer.on('redraw', this._onRedraw);\n this.wavesurfer.fireEvent('region-created', this);\n }\n\n /* Update region params. */\n update(params, eventParams) {\n if (params.start != null) {\n this.start = Number(params.start);\n }\n if (params.end != null) {\n this.end = Number(params.end);\n }\n if (params.loop != null) {\n this.loop = Boolean(params.loop);\n }\n if (params.color != null) {\n this.color = params.color;\n }\n if (params.handleStyle != null) {\n this.handleStyle = params.handleStyle;\n }\n if (params.data != null) {\n this.data = params.data;\n }\n if (params.resize != null) {\n this.resize = Boolean(params.resize);\n this.updateHandlesResize(this.resize);\n }\n if (params.drag != null) {\n this.drag = Boolean(params.drag);\n }\n if (params.maxLength != null) {\n this.maxLength = Number(params.maxLength);\n }\n if (params.minLength != null) {\n this.minLength = Number(params.minLength);\n }\n if (params.attributes != null) {\n this.attributes = params.attributes;\n }\n\n this.updateRender();\n this.fireEvent('update');\n this.wavesurfer.fireEvent('region-updated', this, eventParams);\n }\n\n /* Remove a single region. */\n remove() {\n if (this.element) {\n this.wrapper.removeChild(this.element.domElement);\n this.element = null;\n this.fireEvent('remove');\n this.wavesurfer.un('zoom', this._onRedraw);\n this.wavesurfer.un('redraw', this._onRedraw);\n this.wavesurfer.fireEvent('region-removed', this);\n }\n }\n\n /**\n * Play the audio region.\n * @param {number} start Optional offset to start playing at\n */\n play(start) {\n const s = start || this.start;\n this.wavesurfer.play(s, this.end);\n this.fireEvent('play');\n this.wavesurfer.fireEvent('region-play', this);\n }\n\n /**\n * Play the audio region in a loop.\n * @param {number} start Optional offset to start playing at\n * */\n playLoop(start) {\n this.loop = true;\n this.play(start);\n }\n\n /**\n * Set looping on/off.\n * @param {boolean} loop True if should play in loop\n */\n setLoop(loop) {\n this.loop = loop;\n }\n\n /* Render a region as a DOM element. */\n render() {\n this.element = this.util.withOrientation(\n this.wrapper.appendChild(document.createElement('region')),\n this.vertical\n );\n\n this.element.className = 'wavesurfer-region';\n if (this.showTooltip) {\n this.element.title = this.formatTime(this.start, this.end);\n }\n this.element.setAttribute('data-id', this.id);\n\n for (const attrname in this.attributes) {\n this.element.setAttribute(\n 'data-region-' + attrname,\n this.attributes[attrname]\n );\n }\n\n this.style(this.element, {\n position: 'absolute',\n zIndex: 3,\n height: this.regionHeight,\n top: this.marginTop\n });\n\n /* Resize handles */\n if (this.resize) {\n this.handleLeftEl = this.util.withOrientation(\n this.element.appendChild(document.createElement('handle')),\n this.vertical\n );\n this.handleRightEl = this.util.withOrientation(\n this.element.appendChild(document.createElement('handle')),\n this.vertical\n );\n\n this.handleLeftEl.className = 'wavesurfer-handle wavesurfer-handle-start';\n this.handleRightEl.className = 'wavesurfer-handle wavesurfer-handle-end';\n\n // Default CSS properties for both handles.\n const css = {\n cursor: this.vertical ? 'row-resize' : 'col-resize',\n position: 'absolute',\n top: '0px',\n width: '2px',\n height: '100%',\n backgroundColor: 'rgba(0, 0, 0, 1)'\n };\n\n // Merge CSS properties per handle.\n const handleLeftCss =\n this.handleStyle.left !== 'none'\n ? Object.assign(\n { left: '0px' },\n css,\n this.handleStyle.left\n )\n : null;\n const handleRightCss =\n this.handleStyle.right !== 'none'\n ? Object.assign(\n { right: '0px' },\n css,\n this.handleStyle.right\n )\n : null;\n\n if (handleLeftCss) {\n this.style(this.handleLeftEl, handleLeftCss);\n }\n\n if (handleRightCss) {\n this.style(this.handleRightEl, handleRightCss);\n }\n }\n\n this.updateRender();\n this.bindEvents();\n }\n\n formatTime(start, end) {\n if (this.formatTimeCallback) {\n return this.formatTimeCallback(start, end);\n }\n return (start == end ? [start] : [start, end])\n .map((time) =>\n [\n Math.floor((time % 3600) / 60), // minutes\n ('00' + Math.floor(time % 60)).slice(-2) // seconds\n ].join(':')\n )\n .join('-');\n }\n\n getWidth() {\n return this.wavesurfer.drawer.width / this.wavesurfer.params.pixelRatio;\n }\n\n /* Update element's position, width, color. */\n updateRender() {\n // duration varies during loading process, so don't overwrite important data\n const dur = this.wavesurfer.getDuration();\n const width = this.getWidth();\n\n let startLimited = this.start;\n let endLimited = this.end;\n if (startLimited < 0) {\n startLimited = 0;\n endLimited = endLimited - startLimited;\n }\n if (endLimited > dur) {\n endLimited = dur;\n startLimited = dur - (endLimited - startLimited);\n }\n\n if (this.minLength != null) {\n endLimited = Math.max(startLimited + this.minLength, endLimited);\n }\n\n if (this.maxLength != null) {\n endLimited = Math.min(startLimited + this.maxLength, endLimited);\n }\n\n if (this.element != null) {\n // Calculate the left and width values of the region such that\n // no gaps appear between regions.\n const left = Math.round((startLimited / dur) * width);\n const regionWidth = Math.round((endLimited / dur) * width) - left;\n\n this.style(this.element, {\n left: left + 'px',\n width: regionWidth + 'px',\n backgroundColor: this.color,\n cursor: this.drag ? 'move' : 'default'\n });\n\n for (const attrname in this.attributes) {\n this.element.setAttribute(\n 'data-region-' + attrname,\n this.attributes[attrname]\n );\n }\n\n if (this.showTooltip) {\n this.element.title = this.formatTime(this.start, this.end);\n }\n }\n }\n\n /* Bind audio events. */\n bindInOut() {\n this.firedIn = false;\n this.firedOut = false;\n\n const onProcess = (time) => {\n let start = Math.round(this.start * 10) / 10;\n let end = Math.round(this.end * 10) / 10;\n time = Math.round(time * 10) / 10;\n\n if (\n !this.firedOut &&\n this.firedIn &&\n (start > time || end <= time)\n ) {\n this.firedOut = true;\n this.firedIn = false;\n this.fireEvent('out');\n this.wavesurfer.fireEvent('region-out', this);\n }\n if (!this.firedIn && start <= time && end > time) {\n this.firedIn = true;\n this.firedOut = false;\n this.fireEvent('in');\n this.wavesurfer.fireEvent('region-in', this);\n }\n };\n\n this.wavesurfer.backend.on('audioprocess', onProcess);\n\n this.on('remove', () => {\n this.wavesurfer.backend.un('audioprocess', onProcess);\n });\n\n /* Loop playback. */\n this.on('out', () => {\n if (this.loop) {\n const realTime = this.wavesurfer.getCurrentTime();\n if (realTime >= this.start && realTime <= this.end) {\n this.wavesurfer.play(this.start);\n }\n }\n });\n }\n\n /* Bind DOM events. */\n bindEvents() {\n const preventContextMenu = this.preventContextMenu;\n\n this.element.addEventListener('mouseenter', (e) => {\n this.fireEvent('mouseenter', e);\n this.wavesurfer.fireEvent('region-mouseenter', this, e);\n });\n\n this.element.addEventListener('mouseleave', (e) => {\n this.fireEvent('mouseleave', e);\n this.wavesurfer.fireEvent('region-mouseleave', this, e);\n });\n\n this.element.addEventListener('click', (e) => {\n e.preventDefault();\n this.fireEvent('click', e);\n this.wavesurfer.fireEvent('region-click', this, e);\n });\n\n this.element.addEventListener('dblclick', (e) => {\n e.stopPropagation();\n e.preventDefault();\n this.fireEvent('dblclick', e);\n this.wavesurfer.fireEvent('region-dblclick', this, e);\n });\n\n this.element.addEventListener('contextmenu', (e) => {\n if (preventContextMenu) {\n e.preventDefault();\n }\n this.fireEvent('contextmenu', e);\n this.wavesurfer.fireEvent('region-contextmenu', this, e);\n });\n\n /* Drag or resize on mousemove. */\n if (this.drag || this.resize) {\n this.bindDragEvents();\n }\n }\n\n bindDragEvents() {\n const container = this.wavesurfer.drawer.container;\n const scrollSpeed = this.scrollSpeed;\n const scrollThreshold = this.scrollThreshold;\n let startTime;\n let touchId;\n let drag;\n let maxScroll;\n let resize;\n let updated = false;\n let scrollDirection;\n let wrapperRect;\n let regionLeftHalfTime;\n let regionRightHalfTime;\n\n // Scroll when the user is dragging within the threshold\n const edgeScroll = (event) => {\n let orientedEvent = this.util.withOrientation(event, this.vertical);\n const duration = this.wavesurfer.getDuration();\n if (!scrollDirection || (!drag && !resize)) {\n return;\n }\n\n const x = orientedEvent.clientX;\n let distanceBetweenCursorAndWrapperEdge = 0;\n let regionHalfTimeWidth = 0;\n let adjustment = 0;\n\n // Get the currently selected time according to the mouse position\n let time = this.regionsUtil.getRegionSnapToGridValue(\n this.wavesurfer.drawer.handleEvent(event) * duration\n );\n\n if (drag) {\n // Considering the point of contact with the region while edgescrolling\n if (scrollDirection === -1) {\n regionHalfTimeWidth = regionLeftHalfTime * this.wavesurfer.params.minPxPerSec;\n distanceBetweenCursorAndWrapperEdge = x - wrapperRect.left;\n } else {\n regionHalfTimeWidth = regionRightHalfTime * this.wavesurfer.params.minPxPerSec;\n distanceBetweenCursorAndWrapperEdge = wrapperRect.right - x;\n }\n } else {\n // Considering minLength while edgescroll\n let minLength = this.minLength;\n if (!minLength) {\n minLength = 0;\n }\n\n if (resize === 'start') {\n if (time > this.end - minLength) {\n time = this.end - minLength;\n adjustment = scrollSpeed * scrollDirection;\n }\n\n if (time < 0) {\n time = 0;\n }\n } else if (resize === 'end') {\n if (time < this.start + minLength) {\n time = this.start + minLength;\n adjustment = scrollSpeed * scrollDirection;\n }\n\n if (time > duration) {\n time = duration;\n }\n }\n }\n\n // Don't edgescroll if region has reached min or max limit\n const wrapperScrollLeft = this.wrapper.scrollLeft;\n\n if (scrollDirection === -1) {\n if (Math.round(wrapperScrollLeft) === 0) {\n return;\n }\n\n if (Math.round(wrapperScrollLeft - regionHalfTimeWidth + distanceBetweenCursorAndWrapperEdge) <= 0) {\n return;\n }\n } else {\n if (Math.round(wrapperScrollLeft) === maxScroll) {\n return;\n }\n\n if (Math.round(wrapperScrollLeft + regionHalfTimeWidth - distanceBetweenCursorAndWrapperEdge) >= maxScroll) {\n return;\n }\n }\n\n // Update scroll position\n let scrollLeft = wrapperScrollLeft - adjustment + scrollSpeed * scrollDirection;\n\n if (scrollDirection === -1) {\n const calculatedLeft = Math.max(0 + regionHalfTimeWidth - distanceBetweenCursorAndWrapperEdge, scrollLeft);\n this.wrapper.scrollLeft = scrollLeft = calculatedLeft;\n } else {\n const calculatedRight = Math.min(maxScroll - regionHalfTimeWidth + distanceBetweenCursorAndWrapperEdge, scrollLeft);\n this.wrapper.scrollLeft = scrollLeft = calculatedRight;\n }\n\n const delta = time - startTime;\n startTime = time;\n\n // Continue dragging or resizing\n drag ? this.onDrag(delta) : this.onResize(delta, resize);\n\n // Repeat\n window.requestAnimationFrame(() => {\n edgeScroll(event);\n });\n };\n\n const onDown = (event) => {\n const duration = this.wavesurfer.getDuration();\n if (event.touches && event.touches.length > 1) {\n return;\n }\n touchId = event.targetTouches ? event.targetTouches[0].identifier : null;\n\n // stop the event propagation, if this region is resizable or draggable\n // and the event is therefore handled here.\n if (this.drag || this.resize) {\n event.stopPropagation();\n }\n\n // Store the selected startTime we begun dragging or resizing\n startTime = this.regionsUtil.getRegionSnapToGridValue(\n this.wavesurfer.drawer.handleEvent(event, true) * duration\n );\n\n // Store the selected point of contact when we begin dragging\n regionLeftHalfTime = startTime - this.start;\n regionRightHalfTime = this.end - startTime;\n\n // Store for scroll calculations\n maxScroll = this.wrapper.scrollWidth - this.wrapper.clientWidth;\n\n wrapperRect = this.util.withOrientation(\n this.wrapper.getBoundingClientRect(),\n this.vertical\n );\n\n this.isResizing = false;\n this.isDragging = false;\n if (event.target.tagName.toLowerCase() === 'handle') {\n this.isResizing = true;\n resize = event.target.classList.contains('wavesurfer-handle-start')\n ? 'start'\n : 'end';\n } else {\n this.isDragging = true;\n drag = true;\n resize = false;\n }\n };\n const onUp = (event) => {\n if (event.touches && event.touches.length > 1) {\n return;\n }\n\n if (drag || resize) {\n this.isDragging = false;\n this.isResizing = false;\n drag = false;\n scrollDirection = null;\n resize = false;\n }\n\n if (updated) {\n updated = false;\n this.util.preventClick();\n this.fireEvent('update-end', event);\n this.wavesurfer.fireEvent('region-update-end', this, event);\n }\n };\n const onMove = (event) => {\n const duration = this.wavesurfer.getDuration();\n let orientedEvent = this.util.withOrientation(event, this.vertical);\n\n if (event.touches && event.touches.length > 1) {\n return;\n }\n if (event.targetTouches && event.targetTouches[0].identifier != touchId) {\n return;\n }\n if (!drag && !resize) {\n return;\n }\n\n const oldTime = startTime;\n let time = this.regionsUtil.getRegionSnapToGridValue(\n this.wavesurfer.drawer.handleEvent(event) * duration\n );\n\n if (drag) {\n // To maintain relative cursor start point while dragging\n const maxEnd = this.wavesurfer.getDuration();\n if (time > maxEnd - regionRightHalfTime) {\n time = maxEnd - regionRightHalfTime;\n }\n\n if (time - regionLeftHalfTime < 0) {\n time = regionLeftHalfTime;\n }\n }\n\n if (resize) {\n // To maintain relative cursor start point while resizing\n // we have to handle for minLength\n let minLength = this.minLength;\n if (!minLength) {\n minLength = 0;\n }\n\n if (resize === 'start') {\n if (time > this.end - minLength) {\n time = this.end - minLength;\n }\n\n if (time < 0) {\n time = 0;\n }\n } else if (resize === 'end') {\n if (time < this.start + minLength) {\n time = this.start + minLength;\n }\n\n if (time > duration) {\n time = duration;\n }\n }\n }\n\n let delta = time - startTime;\n startTime = time;\n\n // Drag\n if (this.drag && drag) {\n updated = updated || !!delta;\n this.onDrag(delta);\n }\n\n // Resize\n if (this.resize && resize) {\n updated = updated || !!delta;\n this.onResize(delta, resize);\n }\n\n if (\n this.scroll && container.clientWidth < this.wrapper.scrollWidth\n ) {\n // Triggering edgescroll from within edgeScrollWidth\n let x = orientedEvent.clientX;\n\n // Check direction\n if (x < wrapperRect.left + this.edgeScrollWidth) {\n scrollDirection = -1;\n } else if (x > wrapperRect.right - this.edgeScrollWidth) {\n scrollDirection = 1;\n } else {\n scrollDirection = null;\n }\n\n if (scrollDirection) {\n edgeScroll(event);\n }\n }\n };\n\n this.element.addEventListener('mousedown', onDown);\n this.element.addEventListener('touchstart', onDown);\n\n document.body.addEventListener('mousemove', onMove);\n document.body.addEventListener('touchmove', onMove, {passive: false});\n\n document.addEventListener('mouseup', onUp);\n document.body.addEventListener('touchend', onUp);\n\n this.on('remove', () => {\n document.removeEventListener('mouseup', onUp);\n document.body.removeEventListener('touchend', onUp);\n document.body.removeEventListener('mousemove', onMove);\n document.body.removeEventListener('touchmove', onMove);\n });\n\n this.wavesurfer.on('destroy', () => {\n document.removeEventListener('mouseup', onUp);\n document.body.removeEventListener('touchend', onUp);\n });\n }\n\n onDrag(delta) {\n const maxEnd = this.wavesurfer.getDuration();\n if (this.end + delta > maxEnd) {\n delta = maxEnd - this.end;\n }\n\n if (this.start + delta < 0) {\n delta = this.start * -1;\n }\n\n const eventParams = {\n direction: this._getDragDirection(delta),\n action: 'drag'\n };\n\n this.update({\n start: this.start + delta,\n end: this.end + delta\n }, eventParams);\n }\n\n /**\n * Returns the direction of dragging region based on delta\n * Negative delta means region is moving to the left\n * Positive - to the right\n * For zero delta the direction is not defined\n * @param {number} delta Drag offset\n * @returns {string|null} Direction 'left', 'right' or null\n */\n _getDragDirection(delta) {\n if (delta < 0) {\n return 'left';\n }\n if (delta > 0) {\n return 'right';\n }\n return null;\n }\n\n /**\n * @example\n * onResize(-5, 'start') // Moves the start point 5 seconds back\n * onResize(0.5, 'end') // Moves the end point 0.5 seconds forward\n *\n * @param {number} delta How much to add or subtract, given in seconds\n * @param {string} direction 'start 'or 'end'\n */\n onResize(delta, direction) {\n const duration = this.wavesurfer.getDuration();\n const eventParams = {\n action: 'resize',\n direction: direction === 'start' ? 'left' : 'right'\n };\n\n if (direction === 'start') {\n // Check if changing the start by the given delta would result in the region being smaller than minLength\n if (delta > 0 && this.end - (this.start + delta) < this.minLength) {\n delta = this.end - this.minLength - this.start;\n }\n\n // Check if changing the start by the given delta would result in the region being larger than maxLength\n if (delta < 0 && this.end - (this.start + delta) > this.maxLength) {\n delta = this.end - this.start - this.maxLength;\n }\n\n if (delta < 0 && (this.start + delta) < 0) {\n delta = this.start * -1;\n }\n\n this.update({\n start: Math.min(this.start + delta, this.end),\n end: Math.max(this.start + delta, this.end)\n }, eventParams);\n } else {\n // Check if changing the end by the given delta would result in the region being smaller than minLength\n if (delta < 0 && this.end + delta - this.start < this.minLength) {\n delta = this.start + this.minLength - this.end;\n }\n\n // Check if changing the end by the given delta would result in the region being larger than maxLength\n if (delta > 0 && this.end + delta - this.start > this.maxLength) {\n delta = this.maxLength - (this.end - this.start);\n }\n\n if (delta > 0 && (this.end + delta) > duration) {\n delta = duration - this.end;\n }\n\n this.update({\n start: Math.min(this.end + delta, this.start),\n end: Math.max(this.end + delta, this.start)\n }, eventParams);\n }\n }\n\n updateHandlesResize(resize) {\n let cursorStyle;\n if (resize) {\n cursorStyle = this.vertical ? 'row-resize' : 'col-resize';\n } else {\n cursorStyle = 'auto';\n }\n\n this.handleLeftEl && this.style(this.handleLeftEl, { cursor: cursorStyle });\n this.handleRightEl && this.style(this.handleRightEl, { cursor: cursorStyle });\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(\"./src/plugin/regions/index.js\");\n",""],"names":["RegionsPlugin","params","ws","wavesurfer","util","getRegionSnapToGridValue","value","maxRegions","regionsMinLength","observerPrototypeKeys","Object","getOwnPropertyNames","Observer","prototype","forEach","key","Region","scrollWidthProportion","_onBackendCreated","wrapper","drawer","orientation","defaultEdgeScrollWidth","clientWidth","regions","region","add","list","_onReady","vertical","dragSelection","enableDragSelection","keys","id","updateRender","isReady","once","un","setDisabledEventEmissions","disableDragSelection","clear","length","wouldExceedMaxRegions","edgeScrollWidth","formatTimeCallback","minLength","on","remove","slop","container","scroll","scrollParent","scrollSpeed","scrollThreshold","drag","duration","getDuration","maxScroll","start","touchId","pxMove","scrollDirection","wrapperRect","edgeScroll","e","scrollLeft","Math","min","max","end","handleEvent","update","window","requestAnimationFrame","eventDown","touches","targetTouches","identifier","scrollWidth","withOrientation","getBoundingClientRect","splitChannels","y","clientY","top","channelCount","backend","buffer","numberOfChannels","channelHeight","clientHeight","channelIdx","floor","channelColors","splitChannelsOptions","dragColor","color","addEventListener","removeEventListener","eventUp","preventClick","fireEvent","document","body","eventMove","event","startUpdate","endUpdate","orientedEvent","x","clientX","left","right","time","getCurrentTime","cur","snapToGridInterval","offset","snapToGridOffset","round","name","deferInit","staticProps","addRegion","options","initialisedPluginList","initPlugin","clearRegions","instance","regionsUtils","style","regionsUtil","getId","Number","resize","undefined","Boolean","isResizing","isDragging","loop","handleStyle","handleLeftEl","handleRightEl","data","attributes","showTooltip","maxLength","_onRedraw","preventContextMenu","parseInt","regionHeight","marginTop","getHeight","bindInOut","render","eventParams","updateHandlesResize","element","removeChild","domElement","s","play","appendChild","createElement","className","title","formatTime","setAttribute","attrname","position","zIndex","height","css","cursor","width","backgroundColor","handleLeftCss","assign","handleRightCss","bindEvents","map","slice","join","pixelRatio","dur","getWidth","startLimited","endLimited","regionWidth","firedIn","firedOut","onProcess","realTime","preventDefault","stopPropagation","bindDragEvents","startTime","updated","regionLeftHalfTime","regionRightHalfTime","distanceBetweenCursorAndWrapperEdge","regionHalfTimeWidth","adjustment","minPxPerSec","wrapperScrollLeft","calculatedLeft","calculatedRight","delta","onDrag","onResize","onDown","target","tagName","toLowerCase","classList","contains","onUp","onMove","oldTime","maxEnd","passive","direction","_getDragDirection","action","cursorStyle"],"sourceRoot":""}
|