@checksub_team/peaks_timeline 1.4.32 → 1.4.35

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@checksub_team/peaks_timeline",
3
- "version": "1.4.32",
3
+ "version": "1.4.35",
4
4
  "description": "JavaScript UI component for displaying audio waveforms",
5
5
  "main": "./peaks.js",
6
6
  "types": "./peaks.js.d.ts",
package/peaks.js CHANGED
@@ -14503,22 +14503,57 @@ module.exports = function (Konva, Utils) {
14503
14503
  if (this._peaks.options.enableLineIndicatorContextMenu) {
14504
14504
  this._createContextMenu();
14505
14505
  }
14506
+ this.ICON_SIZE = 18;
14507
+ this._volumeSVGPath = 'M0 6.00001V12H4L9 17V1.00001L4 6.00001H0ZM13.5 9.00001C13.5 7.23001 12.48 5.71001 11 4.97001V13.02C12.48 12.29 13.5 10.77 13.5 9.00001ZM11 0.230011V2.29001C13.89 3.15001 16 5.83001 16 9.00001C16 12.17 13.89 14.85 11 15.71V17.77C15.01 16.86 18 13.28 18 9.00001C18 4.72001 15.01 1.14001 11 0.230011Z';
14508
+ this._noVolumeSVGPath = 'M13.5 9C13.5 7.23 12.48 5.71 11 4.97V7.18L13.45 9.63C13.48 9.43 13.5 9.22 13.5 9ZM16 9C16 9.94 15.8 10.82 15.46 11.64L16.97 13.15C17.63 11.91 18 10.5 18 9C18 4.72 15.01 1.14 11 0.23V2.29C13.89 3.15 16 5.83 16 9ZM1.27 0L0 1.27L4.73 6H0V12H4L9 17V10.27L13.25 14.52C12.58 15.04 11.83 15.45 11 15.7V17.76C12.38 17.45 13.63 16.81 14.69 15.95L16.73 18L18 16.73L9 7.73L1.27 0ZM9 1L6.91 3.09L9 5.18V1Z';
14509
+ this._peaks.on('lineIndicator.setType', this._onSetType.bind(this));
14510
+ this._types = [
14511
+ 'default',
14512
+ 'volume',
14513
+ 'noVolume'
14514
+ ];
14506
14515
  }
14516
+ LineIndicator.prototype._onSetType = function (lineId, type) {
14517
+ this.removeIndicator(lineId, true);
14518
+ type = this._types.includes(type) ? type : 'default';
14519
+ var indicator = this._createIndicator(this._indicators[lineId].line, type);
14520
+ this._layer.add(indicator);
14521
+ this._indicators[lineId].indicator = indicator;
14522
+ this._indicators[lineId].type = type;
14523
+ this.draw();
14524
+ };
14507
14525
  LineIndicator.prototype._showMenu = function (menu) {
14508
14526
  menu.style.display = 'block';
14509
14527
  var containerRect = this._stage.container().getBoundingClientRect();
14510
14528
  menu.style.top = containerRect.top + this._stage.getPointerPosition().y - menu.offsetHeight + 'px';
14511
14529
  menu.style.left = containerRect.left + this._stage.getPointerPosition().x + 6 + 'px';
14512
14530
  };
14513
- LineIndicator.prototype._createIndicator = function (line) {
14514
- var indicator = new Konva.Circle({
14515
- x: this._width / 2,
14516
- y: line.getY() + line.lineHeight() / 2,
14517
- radius: this._indicatorRadius,
14518
- fill: this._peaks.options.lineIndicatorColor,
14519
- strokeWidth: 0,
14520
- lineId: line.getId()
14521
- });
14531
+ LineIndicator.prototype._createIndicator = function (line, type) {
14532
+ var indicator;
14533
+ type = typeof type !== 'undefined' ? type : 'default';
14534
+ if (type === 'default') {
14535
+ indicator = new Konva.Circle({
14536
+ x: this._width / 2,
14537
+ y: line.getY() + line.lineHeight() / 2,
14538
+ radius: this._indicatorRadius,
14539
+ fill: this._peaks.options.lineIndicatorColor,
14540
+ strokeWidth: 0,
14541
+ lineId: line.getId()
14542
+ });
14543
+ } else {
14544
+ var scaleFactor = this._width / 2 / this.ICON_SIZE;
14545
+ indicator = new Konva.Path({
14546
+ x: this._width / 4,
14547
+ y: line.getY() + line.lineHeight() / 2 - this._width / 4,
14548
+ data: type === 'volume' ? this._volumeSVGPath : this._noVolumeSVGPath,
14549
+ fill: this._peaks.options.lineIndicatorColor,
14550
+ scale: {
14551
+ x: scaleFactor,
14552
+ y: scaleFactor
14553
+ },
14554
+ lineId: line.getId()
14555
+ });
14556
+ }
14522
14557
  var self = this;
14523
14558
  indicator.on('mouseover', function () {
14524
14559
  indicator.fill(self._peaks.options.lineIndicatorSelected);
@@ -14528,6 +14563,9 @@ module.exports = function (Konva, Utils) {
14528
14563
  indicator.fill(self._peaks.options.lineIndicatorColor);
14529
14564
  indicator.draw();
14530
14565
  });
14566
+ indicator.on('click', function (e) {
14567
+ self._peaks.emit('lineIndicator.click', self._indicators[line.getId()], e.evt.button);
14568
+ });
14531
14569
  return indicator;
14532
14570
  };
14533
14571
  LineIndicator.prototype.addIndicator = function (line) {
@@ -14536,7 +14574,8 @@ module.exports = function (Konva, Utils) {
14536
14574
  this._layer.add(indicator);
14537
14575
  this._indicators[line.getId()] = {
14538
14576
  indicator: indicator,
14539
- line: line
14577
+ line: line,
14578
+ type: 'default'
14540
14579
  };
14541
14580
  }
14542
14581
  };
@@ -14552,15 +14591,18 @@ module.exports = function (Konva, Utils) {
14552
14591
  }
14553
14592
  }
14554
14593
  };
14594
+ LineIndicator.prototype.getPixelsFromCenter = function (lineId) {
14595
+ return this._indicators[lineId].type === 'default' ? 0 : this._width / 4;
14596
+ };
14555
14597
  LineIndicator.prototype.updateIndicator = function (lineId) {
14556
14598
  if (this._indicators[lineId]) {
14557
14599
  var y = this._indicators[lineId].line.getY() + this._indicators[lineId].line.lineHeight() / 2;
14558
14600
  if (y + this._indicatorRadius > 0 && y - this._indicatorRadius < this._height) {
14559
14601
  if (!this._indicators[lineId].indicator) {
14560
- this._indicators[lineId].indicator = this._createIndicator(this._indicators[lineId].line);
14602
+ this._indicators[lineId].indicator = this._createIndicator(this._indicators[lineId].line, this._indicators[lineId].type);
14561
14603
  this._layer.add(this._indicators[lineId].indicator);
14562
14604
  } else {
14563
- this._indicators[lineId].indicator.y(y);
14605
+ this._indicators[lineId].indicator.y(y - this.getPixelsFromCenter(lineId));
14564
14606
  }
14565
14607
  } else {
14566
14608
  this.removeIndicator(lineId, true);
@@ -15357,6 +15399,9 @@ module.exports = function (SegmentsGroup, Line, LineIndicator, Utils) {
15357
15399
  }
15358
15400
  }
15359
15401
  };
15402
+ Lines.prototype.getLineByPosition = function (pos) {
15403
+ return this._linesByPosition[pos];
15404
+ };
15360
15405
  Lines.prototype.getLineOnPosition = function (y) {
15361
15406
  var height;
15362
15407
  var pos = [
@@ -15503,7 +15548,7 @@ module.exports = function (Colors, EventEmitter, TimelineSegments, TimelineSourc
15503
15548
  segmentMagnetThreshold: 15,
15504
15549
  enableVerticalScrolling: true,
15505
15550
  lineIndicatorWidth: 20,
15506
- lineIndicatorColor: 'gray',
15551
+ lineIndicatorColor: '#8A8F98',
15507
15552
  lineIndicatorSelected: '#ccc',
15508
15553
  autoScrollThreshold: 0.05,
15509
15554
  enableLineIndicatorContextMenu: true,
@@ -15642,6 +15687,10 @@ module.exports = function (Colors, EventEmitter, TimelineSegments, TimelineSourc
15642
15687
  Peaks.prototype.setCutMode = function () {
15643
15688
  this.emit('cut_mode');
15644
15689
  };
15690
+ Peaks.prototype.setIndicatorType = function (linePosition, type) {
15691
+ var lineId = this.view.getLineByPosition(linePosition).getId();
15692
+ this.emit('lineIndicator.setType', lineId, type);
15693
+ };
15645
15694
  Peaks.prototype.getVisibleSegments = function () {
15646
15695
  return this.view.getSegmentsGroup().getVisibleSegments();
15647
15696
  };
@@ -16681,7 +16730,7 @@ module.exports = function (Konva, SegmentMarker) {
16681
16730
  SegmentShape.prototype._onMouseEnter = function () {
16682
16731
  this._view.setCursor('pointer');
16683
16732
  this._view.setHoveredElement(this);
16684
- this._rectangle.fill(this._segment.activeColor + Math.round(this._segment.opacity * 255).toString(16));
16733
+ this._rectangle.fill(this._segment.hoverColor + Math.round(this._segment.opacity * 255).toString(16));
16685
16734
  this._view.drawSourcesLayer();
16686
16735
  this._peaks.emit('segments.mouseenter', this._segment);
16687
16736
  };
@@ -16782,8 +16831,13 @@ module.exports = function (Utils) {
16782
16831
  } else if (!Utils.isBoolean(options.editable)) {
16783
16832
  throw new TypeError('peaks.segments.' + context + ': editable must be a boolean');
16784
16833
  }
16834
+ if (Utils.isNullOrUndefined(options.hoverColor)) {
16835
+ options.hoverColor = Utils.shadeColor(options.color, 20);
16836
+ } else if (!Utils.isValidColor(options.hoverColor)) {
16837
+ throw new TypeError('peaks.segments.' + context + ': hoverColor must be a boolean');
16838
+ }
16785
16839
  }
16786
- function Segment(peaks, id, startTime, endTime, labelText, color, textColor, handleTextColor, opacity, editable, allowDeletion, line) {
16840
+ function Segment(peaks, id, startTime, endTime, labelText, color, textColor, handleTextColor, hoverColor, opacity, editable, allowDeletion, line) {
16787
16841
  var opts = {
16788
16842
  startTime: startTime,
16789
16843
  endTime: endTime,
@@ -16791,6 +16845,7 @@ module.exports = function (Utils) {
16791
16845
  color: color,
16792
16846
  textColor: textColor,
16793
16847
  handleTextColor: handleTextColor,
16848
+ hoverColor: hoverColor,
16794
16849
  opacity: opacity,
16795
16850
  editable: editable,
16796
16851
  allowDeletion: allowDeletion,
@@ -16803,7 +16858,7 @@ module.exports = function (Utils) {
16803
16858
  this._endTime = opts.endTime;
16804
16859
  this._labelText = opts.labelText;
16805
16860
  this._color = opts.color;
16806
- this._activeColor = Utils.shadeColor(color, 20);
16861
+ this._hoverColor = opts.hoverColor;
16807
16862
  this._textColor = opts.textColor;
16808
16863
  this._handleTextColor = opts.handleTextColor;
16809
16864
  this._opacity = opts.opacity;
@@ -16849,10 +16904,10 @@ module.exports = function (Utils) {
16849
16904
  return this._color;
16850
16905
  }
16851
16906
  },
16852
- activeColor: {
16907
+ hoverColor: {
16853
16908
  enumerable: true,
16854
16909
  get: function () {
16855
- return this._activeColor;
16910
+ return this._hoverColor;
16856
16911
  }
16857
16912
  },
16858
16913
  textColor: {
@@ -16906,6 +16961,7 @@ module.exports = function (Utils) {
16906
16961
  color: this.color,
16907
16962
  textColor: this.textColor,
16908
16963
  handleTextColor: this.handleTextColor,
16964
+ hoverColor: this.hoverColor,
16909
16965
  opacity: this.opacity,
16910
16966
  editable: this.editable,
16911
16967
  allowDeletion: this.allowDeletion,
@@ -16919,6 +16975,7 @@ module.exports = function (Utils) {
16919
16975
  this._color = opts.color;
16920
16976
  this._textColor = opts.textColor;
16921
16977
  this._handleTextColor = opts.handleTextColor;
16978
+ this._hoverColor = opts.hoverColor;
16922
16979
  this._opacity = opts.opacity;
16923
16980
  this._editable = opts.editable;
16924
16981
  this._allowDeletion = opts.allowDeletion;
@@ -19014,6 +19071,9 @@ module.exports = function (SourceGroup, Lines, DataRetriever, Utils, Invoker, Ko
19014
19071
  SourcesLayer.prototype.getLength = function () {
19015
19072
  return this._lines.linesLength();
19016
19073
  };
19074
+ SourcesLayer.prototype.getLineByPosition = function (pos) {
19075
+ return this._lines.getLineByPosition(pos);
19076
+ };
19017
19077
  return SourcesLayer;
19018
19078
  }(_dereq_('./source-group'), _dereq_('./lines'), _dereq_('./data-retriever'), _dereq_('./utils'), _dereq_('./invoker'), _dereq_('konva'));
19019
19079
  },{"./data-retriever":85,"./invoker":88,"./lines":92,"./source-group":103,"./utils":110,"konva":43}],106:[function(_dereq_,module,exports){
@@ -19200,7 +19260,7 @@ module.exports = function (Colors, Segment, Utils) {
19200
19260
  if (!Utils.isObject(options)) {
19201
19261
  throw new TypeError('peaks.segments.add(): expected a Segment object parameter');
19202
19262
  }
19203
- var segment = new Segment(this._peaks, Utils.isNullOrUndefined(options.id) ? this._getNextSegmentId() : options.id, options.startTime, options.endTime, options.labelText, options.color || this._getSegmentColor(), options.textColor || '#000000', options.handleTextColor || '#000000', options.opacity || 1, options.editable, options.allowDeletion || false, options.line);
19263
+ var segment = new Segment(this._peaks, Utils.isNullOrUndefined(options.id) ? this._getNextSegmentId() : options.id, options.startTime, options.endTime, options.labelText, options.color || this._getSegmentColor(), options.textColor || '#000000', options.handleTextColor || '#000000', options.hoverColor, options.opacity || 1, options.editable, options.allowDeletion || false, options.line);
19204
19264
  return segment;
19205
19265
  };
19206
19266
  TimelineSegments.prototype.getSegments = function () {
@@ -19885,6 +19945,9 @@ module.exports = function (MouseDragHandler, PlayheadLayer, SourcesLayer, ModeLa
19885
19945
  TimelineZoomView.prototype.getEndTime = function () {
19886
19946
  return this.pixelsToTime(this._frameOffset + this._width);
19887
19947
  };
19948
+ TimelineZoomView.prototype.getLineByPosition = function (pos) {
19949
+ return this._sourcesLayer.getLineByPosition(pos);
19950
+ };
19888
19951
  TimelineZoomView.prototype.setStartTime = function (time) {
19889
19952
  if (time < 0) {
19890
19953
  time = 0;
@@ -58,8 +58,36 @@ define([
58
58
  if (this._peaks.options.enableLineIndicatorContextMenu) {
59
59
  this._createContextMenu();
60
60
  }
61
+
62
+ /* eslint-disable max-len */
63
+ this.ICON_SIZE = 18;
64
+ this._volumeSVGPath = 'M0 6.00001V12H4L9 17V1.00001L4 6.00001H0ZM13.5 9.00001C13.5 7.23001 12.48 5.71001 11 4.97001V13.02C12.48 12.29 13.5 10.77 13.5 9.00001ZM11 0.230011V2.29001C13.89 3.15001 16 5.83001 16 9.00001C16 12.17 13.89 14.85 11 15.71V17.77C15.01 16.86 18 13.28 18 9.00001C18 4.72001 15.01 1.14001 11 0.230011Z';
65
+ this._noVolumeSVGPath = 'M13.5 9C13.5 7.23 12.48 5.71 11 4.97V7.18L13.45 9.63C13.48 9.43 13.5 9.22 13.5 9ZM16 9C16 9.94 15.8 10.82 15.46 11.64L16.97 13.15C17.63 11.91 18 10.5 18 9C18 4.72 15.01 1.14 11 0.23V2.29C13.89 3.15 16 5.83 16 9ZM1.27 0L0 1.27L4.73 6H0V12H4L9 17V10.27L13.25 14.52C12.58 15.04 11.83 15.45 11 15.7V17.76C12.38 17.45 13.63 16.81 14.69 15.95L16.73 18L18 16.73L9 7.73L1.27 0ZM9 1L6.91 3.09L9 5.18V1Z';
66
+ /* eslint-enable max-len */
67
+
68
+ this._peaks.on('lineIndicator.setType', this._onSetType.bind(this));
69
+
70
+ this._types = ['default', 'volume', 'noVolume'];
61
71
  }
62
72
 
73
+ LineIndicator.prototype._onSetType = function(lineId, type) {
74
+ this.removeIndicator(lineId, true);
75
+
76
+ type = this._types.includes(type) ? type : 'default';
77
+
78
+ var indicator = this._createIndicator(
79
+ this._indicators[lineId].line,
80
+ type
81
+ );
82
+
83
+ this._layer.add(indicator);
84
+
85
+ this._indicators[lineId].indicator = indicator;
86
+ this._indicators[lineId].type = type;
87
+
88
+ this.draw();
89
+ };
90
+
63
91
  LineIndicator.prototype._showMenu = function(menu) {
64
92
  menu.style.display = 'block';
65
93
  var containerRect = this._stage.container().getBoundingClientRect();
@@ -70,15 +98,38 @@ define([
70
98
  menu.style.left = containerRect.left + this._stage.getPointerPosition().x + 6 + 'px';
71
99
  };
72
100
 
73
- LineIndicator.prototype._createIndicator = function(line) {
74
- var indicator = new Konva.Circle({
75
- x: this._width / 2,
76
- y: line.getY() + (line.lineHeight() / 2),
77
- radius: this._indicatorRadius,
78
- fill: this._peaks.options.lineIndicatorColor,
79
- strokeWidth: 0,
80
- lineId: line.getId()
81
- });
101
+ LineIndicator.prototype._createIndicator = function(line, type) {
102
+ var indicator;
103
+
104
+ type = typeof type !== 'undefined' ? type : 'default';
105
+
106
+ if (type === 'default') {
107
+ indicator = new Konva.Circle({
108
+ x: this._width / 2,
109
+ y: line.getY() + (line.lineHeight() / 2),
110
+ radius: this._indicatorRadius,
111
+ fill: this._peaks.options.lineIndicatorColor,
112
+ strokeWidth: 0,
113
+ lineId: line.getId()
114
+ });
115
+ }
116
+ else {
117
+ var scaleFactor = (this._width / 2) / this.ICON_SIZE;
118
+
119
+ indicator = new Konva.Path({
120
+ x: this._width / 4,
121
+ y: line.getY() + (line.lineHeight() / 2) - (this._width / 4),
122
+ data: type === 'volume' ?
123
+ this._volumeSVGPath :
124
+ this._noVolumeSVGPath,
125
+ fill: this._peaks.options.lineIndicatorColor,
126
+ scale: {
127
+ x: scaleFactor,
128
+ y: scaleFactor
129
+ },
130
+ lineId: line.getId()
131
+ });
132
+ }
82
133
 
83
134
  var self = this;
84
135
 
@@ -92,6 +143,10 @@ define([
92
143
  indicator.draw();
93
144
  });
94
145
 
146
+ indicator.on('click', function(e) {
147
+ self._peaks.emit('lineIndicator.click', self._indicators[line.getId()], e.evt.button);
148
+ });
149
+
95
150
  return indicator;
96
151
  };
97
152
 
@@ -103,7 +158,8 @@ define([
103
158
 
104
159
  this._indicators[line.getId()] = {
105
160
  indicator: indicator,
106
- line: line
161
+ line: line,
162
+ type: 'default'
107
163
  };
108
164
  }
109
165
  };
@@ -122,6 +178,12 @@ define([
122
178
  }
123
179
  };
124
180
 
181
+ LineIndicator.prototype.getPixelsFromCenter = function(lineId) {
182
+ return this._indicators[lineId].type === 'default' ?
183
+ 0 :
184
+ this._width / 4;
185
+ };
186
+
125
187
  LineIndicator.prototype.updateIndicator = function(lineId) {
126
188
  if (this._indicators[lineId]) {
127
189
  var y = this._indicators[lineId].line.getY()
@@ -130,11 +192,14 @@ define([
130
192
  if (y + this._indicatorRadius > 0 && y - this._indicatorRadius < this._height) {
131
193
  // The indicator is visible
132
194
  if (!this._indicators[lineId].indicator) {
133
- this._indicators[lineId].indicator = this._createIndicator(this._indicators[lineId].line);
195
+ this._indicators[lineId].indicator = this._createIndicator(
196
+ this._indicators[lineId].line,
197
+ this._indicators[lineId].type
198
+ );
134
199
  this._layer.add(this._indicators[lineId].indicator);
135
200
  }
136
201
  else {
137
- this._indicators[lineId].indicator.y(y);
202
+ this._indicators[lineId].indicator.y(y - this.getPixelsFromCenter(lineId));
138
203
  }
139
204
  }
140
205
  else {
package/src/lines.js CHANGED
@@ -286,6 +286,10 @@ define([
286
286
  }
287
287
  };
288
288
 
289
+ Lines.prototype.getLineByPosition = function(pos) {
290
+ return this._linesByPosition[pos];
291
+ };
292
+
289
293
  Lines.prototype.getLineOnPosition = function(y) {
290
294
  var height;
291
295
  var pos = [-1, Number.MAX_VALUE];
package/src/main.js CHANGED
@@ -283,7 +283,7 @@ define([
283
283
  /**
284
284
  * Color of the line indicators
285
285
  */
286
- lineIndicatorColor: 'gray',
286
+ lineIndicatorColor: '#8A8F98',
287
287
 
288
288
  /**
289
289
  * Color for the indicator when selected
@@ -618,6 +618,12 @@ define([
618
618
  this.emit('cut_mode');
619
619
  };
620
620
 
621
+ Peaks.prototype.setIndicatorType = function(linePosition, type) {
622
+ var lineId = this.view.getLineByPosition(linePosition).getId();
623
+
624
+ this.emit('lineIndicator.setType', lineId, type);
625
+ };
626
+
621
627
  Peaks.prototype.getVisibleSegments = function() {
622
628
  return this.view
623
629
  .getSegmentsGroup()
@@ -247,7 +247,7 @@ define([
247
247
 
248
248
  this._view.setHoveredElement(this);
249
249
 
250
- this._rectangle.fill(this._segment.activeColor + Math.round(
250
+ this._rectangle.fill(this._segment.hoverColor + Math.round(
251
251
  this._segment.opacity * 255
252
252
  ).toString(16));
253
253
 
package/src/segment.js CHANGED
@@ -61,6 +61,13 @@ define([
61
61
  else if (!Utils.isBoolean(options.editable)) {
62
62
  throw new TypeError('peaks.segments.' + context + ': editable must be a boolean');
63
63
  }
64
+
65
+ if (Utils.isNullOrUndefined(options.hoverColor)) {
66
+ options.hoverColor = Utils.shadeColor(options.color, 20);
67
+ }
68
+ else if (!Utils.isValidColor(options.hoverColor)) {
69
+ throw new TypeError('peaks.segments.' + context + ': hoverColor must be a boolean');
70
+ }
64
71
  }
65
72
 
66
73
  /**
@@ -81,7 +88,8 @@ define([
81
88
  */
82
89
 
83
90
  function Segment(peaks, id, startTime, endTime, labelText, color,
84
- textColor, handleTextColor, opacity, editable, allowDeletion, line) {
91
+ textColor, handleTextColor, hoverColor, opacity, editable,
92
+ allowDeletion, line) {
85
93
  var opts = {
86
94
  startTime: startTime,
87
95
  endTime: endTime,
@@ -89,6 +97,7 @@ define([
89
97
  color: color,
90
98
  textColor: textColor,
91
99
  handleTextColor: handleTextColor,
100
+ hoverColor: hoverColor,
92
101
  opacity: opacity,
93
102
  editable: editable,
94
103
  allowDeletion: allowDeletion,
@@ -103,7 +112,7 @@ define([
103
112
  this._endTime = opts.endTime;
104
113
  this._labelText = opts.labelText;
105
114
  this._color = opts.color;
106
- this._activeColor = Utils.shadeColor(color, 20);
115
+ this._hoverColor = opts.hoverColor;
107
116
  this._textColor = opts.textColor;
108
117
  this._handleTextColor = opts.handleTextColor;
109
118
  this._opacity = opts.opacity;
@@ -152,10 +161,10 @@ define([
152
161
  return this._color;
153
162
  }
154
163
  },
155
- activeColor: {
164
+ hoverColor: {
156
165
  enumerable: true,
157
166
  get: function() {
158
- return this._activeColor;
167
+ return this._hoverColor;
159
168
  }
160
169
  },
161
170
  textColor: {
@@ -210,6 +219,7 @@ define([
210
219
  color: this.color,
211
220
  textColor: this.textColor,
212
221
  handleTextColor: this.handleTextColor,
222
+ hoverColor: this.hoverColor,
213
223
  opacity: this.opacity,
214
224
  editable: this.editable,
215
225
  allowDeletion: this.allowDeletion,
@@ -226,6 +236,7 @@ define([
226
236
  this._color = opts.color;
227
237
  this._textColor = opts.textColor;
228
238
  this._handleTextColor = opts.handleTextColor;
239
+ this._hoverColor = opts.hoverColor;
229
240
  this._opacity = opts.opacity;
230
241
  this._editable = opts.editable;
231
242
  this._allowDeletion = opts.allowDeletion;
@@ -575,6 +575,10 @@ define([
575
575
  return this._lines.linesLength();
576
576
  };
577
577
 
578
+ SourcesLayer.prototype.getLineByPosition = function(pos) {
579
+ return this._lines.getLineByPosition(pos);
580
+ };
581
+
578
582
  /**
579
583
  * Object for storing data and UI of a source.
580
584
  *
@@ -135,6 +135,7 @@ define([
135
135
  options.color || this._getSegmentColor(),
136
136
  options.textColor || '#000000',
137
137
  options.handleTextColor || '#000000',
138
+ options.hoverColor,
138
139
  options.opacity || 1,
139
140
  options.editable,
140
141
  options.allowDeletion || false,
@@ -638,6 +638,10 @@ define([
638
638
  return this.pixelsToTime(this._frameOffset + this._width);
639
639
  };
640
640
 
641
+ TimelineZoomView.prototype.getLineByPosition = function(pos) {
642
+ return this._sourcesLayer.getLineByPosition(pos);
643
+ };
644
+
641
645
  TimelineZoomView.prototype.setStartTime = function(time) {
642
646
  if (time < 0) {
643
647
  time = 0;
package/CHANGELOG.md DELETED
@@ -1,530 +0,0 @@
1
- # Peaks.js
2
-
3
- ## 0.19.0 (2020/02/06)
4
-
5
- * (#309) Fixed rendering of non-editable segment marker handles (@chrisn)
6
-
7
- * Reduced size of npm and Bower installs by removing unnecessary files
8
- (@chrisn)
9
-
10
- * Refactored to simplify code structure. All source files are now placed
11
- in a single 'src' directory, and several files have been renamed for
12
- consistency (@chrisn)
13
-
14
- ## 0.18.1 (2020/02/02)
15
-
16
- * (#306) Updated TypeScript declarations (@tscz)
17
-
18
- * Documented zoomview.setStartTime() (@chrisn)
19
-
20
- ## 0.18.0 (2020/02/02)
21
-
22
- * (#300) Redesigned the marker customization API. Refer to customizing.md
23
- for detailed documentation on how to customize the appearance of point
24
- and segment marker handles (@chrisn)
25
-
26
- * Added a view.fitToContainer() method that resizes the waveform and point and
27
- segment marker handles to fit the available space (@chrisn)
28
-
29
- * Added zoomview.setStartTime() method (@chrisn)
30
-
31
- * The `inMarkerColor` and `outMarkerColor` configuration options have been
32
- renamed to `segmentStartMarkerColor` and `segmentEndMarkerColor` (@chrisn)
33
-
34
- * (#305) Added a zoomview.setZoom() method that gives applications greater
35
- flexibility in setting the zoom level. The zoom level can be set to (a)
36
- a number of samples per pixel, as per the existing peaks.zoom.setZoom() API,
37
- (b) a number of seconds fit to the available width, or (c) the entire audio
38
- duration fit to the available width (@chrisn)
39
-
40
- ## 0.17.0 (2020/01/16)
41
-
42
- * (#302) Fixed segment handle dragging so that dragging the start marker does
43
- not change the segment end time, and vice versa (@chrisn)
44
-
45
- * Added view.enableMarkerEditing() method (@chrisn)
46
-
47
- * Updated Typescript definitions (@is343, @chrisn)
48
-
49
- ## 0.16.0 (2019/12/16)
50
-
51
- * (#262) Increased hit region for segment mouseenter and mouseleave events,
52
- no longer requires placing the mouse directly over the waveform image
53
- (@chrisn)
54
-
55
- * (#263, #283) Added destroyZoomview() and destroyOverview() methods (@chrisn)
56
-
57
- ## 0.15.0 (2019/12/04)
58
-
59
- * (#293) Added overview.dblclick and zoomview.dblclick events (@chrisn)
60
-
61
- * Fixed Typescript definitions (@tscz, @chrisn)
62
-
63
- ## 0.14.5 (2019/11/10)
64
-
65
- * (#290) Fixed setAmplitudeScale() to update all waveform segments (@chrisn)
66
-
67
- * Disabled warnings from Konva.js
68
-
69
- * Fixed demo pages for Webkit
70
-
71
- ## 0.14.4 (2019/11/06)
72
-
73
- * (#289) Fixed overlapHighlightOffset behaviour when value too large
74
- (@jodonnell)
75
-
76
- ## 0.14.3 (2019/11/06)
77
-
78
- * (#288) Added overviewHighlightOffset option, and renamed the
79
- overviewHighlightRectangleColor option to overviewHighlightColor
80
- (@jodonnell)
81
-
82
- ## 0.14.2 (2019/11/05)
83
-
84
- * (#285) The axis labels are now correctly rendered on top of the waveform
85
- (@chrisn)
86
-
87
- * (#286) Fixed point/segment marker creation function options, and updated
88
- documentation (@chrisn)
89
-
90
- ## 0.14.1 (2019/10/31)
91
-
92
- * (#284) Fixed `peaks.destroy()` (@chrisn)
93
-
94
- * Updated waveform-data.js to v3.1.0 (@chrisn)
95
-
96
- ## 0.14.0 (2019/10/23)
97
-
98
- * (#287) Added `segment.dragstart` and `segment.dragend` events.
99
- The `segment.dragged` event now receives a boolean parameter that indicates
100
- whether the start or end marker is being dragged (@Spidy88)
101
-
102
- ## 0.13.1 (2019/10/22)
103
-
104
- * (#281) Fixed TypeScript definitions (@tscz)
105
-
106
- * Updated demo pages to use updated `Peaks.init()` API options (@chrisn)
107
-
108
- ## 0.13.0 (2019/09/11)
109
-
110
- * (#228, #240) Added ability to intialise a Peaks instance given an
111
- AudioBuffer
112
-
113
- * The API for creating waveforms using the Web Audio API has changed.
114
- Instead of passing an `audioContext` option to `Peaks.init()` or
115
- `peaksInstance.setSource()`, you shoud now pass a `webAudio` object,
116
- for example:
117
-
118
- ```javascript
119
- const options = {
120
- // ... etc
121
- webAudio: {
122
- audioContext: new AudioContext(),
123
- multiChannel: true
124
- }
125
- }
126
-
127
- Peaks.init(options, function(err, peaksInstance) { ... });
128
- ```
129
-
130
- * The (undocumented) `waveformBuilderOptions` option has also been removed.
131
- If you were using `amplitude_scale`, please use `view.setAmplitudeScale()`
132
- instead. The `scale` option is now determined by the lowest `zoomLevels`
133
- setting
134
-
135
- * Added `view.enableAutoScroll()` method
136
-
137
- ## 0.12.0 (2019/08/24)
138
-
139
- * (#194) Added multi-channel waveform support (@chrisn)
140
-
141
- ## 0.11.1 (2019/08/23)
142
-
143
- * Updated waveform-data.js to v3.0.0 (@chrisn)
144
-
145
- ## 0.11.0 (2019/08/11)
146
-
147
- * (#243, #268) Added emitCueEvents option that causes Peaks.js to emit
148
- 'points.enter', 'segments.enter', and 'segments.exit' events during playback
149
- or on seeking (@gmarinov, @chrisn)
150
-
151
- * (#92) Added setSource() method to change the media element's source URL
152
- and update the waveform (@chrisn)
153
-
154
- ## 0.10.1 (2019/07/10)
155
-
156
- * (#211) Added view.setAmplitudeScale() method, and documented new API methods
157
- for creating and accessing the waveform views (@chrisn)
158
-
159
- * (#270) Fixed segment rendering after updating startTime or endTime (@chrisn)
160
-
161
- * (#267) Added option to run specific test files by glob pattern (@gmarinov)
162
-
163
- ## 0.10.0 (2019/06/22)
164
-
165
- * (#247) Added update() methods to allow changes to segment and point
166
- properties (@zachsa)
167
-
168
- * (#250) Added 'segments.mouseenter', 'segments.mouseleave', and
169
- 'segments.click' events (@zachsa)
170
-
171
- * (#258) Added new 'containers' option, to allow creation of zoomable
172
- and non-zoomable ('overview') waveform views. Added example pages,
173
- in the 'demo' folder (@chrisn)
174
-
175
- * Updated to Konva 3.3.3 (@chrisn)
176
-
177
- ## 0.9.14 (2019/03/05)
178
-
179
- * (#249, #251, #252) Enabled touch events for waveform container
180
- and point and segment markers (@rfrei)
181
-
182
- * Updated to Konva 3.1.6 and waveform-data.js 2.1.2, and updated
183
- development dependencies (@chrisn)
184
-
185
- * Updated TypeScript declarations (@evanlouie)
186
-
187
- ## 0.9.13 (2018/09/04)
188
-
189
- * Added TypeScript declarations (@evanlouie)
190
-
191
- ## 0.9.12 (2018/07/27)
192
-
193
- * Version bump after updating npm access token (@chrisn)
194
-
195
- ## 0.9.11 (2018/07/27)
196
-
197
- * Refactored waveform rendering code, added WaveformShape class (@chrisn)
198
-
199
- * Removed background layer, to reduce the number of Konva layers used (@chrisn)
200
-
201
- * Avoid building waveform data multiple times when using the Web Audio API
202
- (@cky917)
203
-
204
- ## 0.9.10 (2018/06/23)
205
-
206
- * Fixed use of Web Audio API in Safari (@ibobobo)
207
-
208
- * Fixed point drag event handling (@anthonytex, @chrisn)
209
-
210
- ## 0.9.9 (2018/05/21)
211
-
212
- * Allow Peaks objects to be created using the new operator (@chrisn)
213
-
214
- * The points.add() and segments.add() methods now operate atomically. This
215
- change ensures that the input point/segment objects are validated before
216
- storing, so that if an exception is thrown, we leave the state of the
217
- points/segments array as it was before the function was called (@chrisn)
218
-
219
- * Added 'points.mouseenter' and 'points.mouseleave' events. Also added
220
- 'points.dblclick', which replaces the (previously undocumented)
221
- pointDblClickHandler config option (@markjongkind, @chrisn)
222
-
223
- * Added 'points.dragstart' and 'points.dragend' events, and renamed
224
- 'points.dragged' to 'points.dragmove'. The (also undocumented)
225
- pointDragEndHandler config option is deprecated (@chrisn)
226
-
227
- ## 0.9.8 (2018/02/10)
228
-
229
- * Ensure resources used by Player object are released on calling
230
- peaks.destroy() (@chrisn)
231
-
232
- * points.remove() and segments.remove() no longer throw an exception
233
- if multiple matching markers are found. The removed markers are returned
234
- in an array (@chrisn)
235
-
236
- * Updated to eventemitter2 v5.0.1, also updated development dependencies
237
- (@chrisn)
238
-
239
- ## 0.9.7 (2018/01/25)
240
-
241
- * (#104) Prevent "zoom level too low" exception when using the Web Audio API
242
- to compute the waveform data (@chrisn)
243
-
244
- * (#213) Added withCredentials option to allow users to send credentials
245
- when requesting waveform data files using XHR (@bennypowers)
246
-
247
- * (#212) Fixed points.removeAll() and segments.removeAll() (@chrisn)
248
-
249
- * Fixed a bug where the time axis would show the wrong times next to the
250
- axis markers (@chrisn)
251
-
252
- * Peaks.js is now available via cdnjs. Added a link to the ReadMe
253
- (@extend1994)
254
-
255
- ## 0.9.6 (2018/01/13)
256
-
257
- * (#112) Fixed a race condition where an audio element that contains
258
- one or more source elements is added to a page, and Peaks.init()
259
- is called before the audio element has selected which source
260
- to use. Also improved error reporting, to avoid a misleading "Unable to
261
- determine a compatible dataUri format for this browser" error (@chrisn)
262
-
263
- ## 0.9.5 (2017/12/11)
264
-
265
- * (#207) Prevent jump in playhead motion after starting playback
266
- (@chrisn, @jdelStrother)
267
-
268
- ## 0.9.4 (2017/11/24)
269
-
270
- * Version bump to refresh npm and browserify cached releases (@chrisn)
271
-
272
- ## 0.9.3 (2017/11/24)
273
-
274
- * (#201) Added showPlayheadTime option to control display of the current time
275
- position next to the playhead marker (@chrisn)
276
-
277
- * (#202) Keep playhead layer in sync with timeupdate events (@jdelStrother)
278
-
279
- ## 0.9.2 (2017/09/27)
280
-
281
- * (#199) The playhead position is now correctly updated in the zoomable
282
- view after calling player.seek() (@chrisn)
283
- * Added parameter validation to player.seek() (@chrisn)
284
- * Show the time when dragging point markers (@chrisn)
285
- * Use a fixed set of default colors instead of random colors for segments
286
- (@chrisn)
287
- * Simplified createSegmentMarker, createSegmentLabel, and createPointMarker
288
- functions (@chrisn)
289
- * Refactored WaveformPoints and WaveformSegments classes (@chrisn)
290
- * Refactored PointsLayer and SegmentsLayer _removeInvisiblePoints methods
291
- (@chrisn)
292
-
293
- ## 0.9.1 (2017/08/29)
294
-
295
- * Fixed bug in IE11 which caused adding segment objects to fail (@chrisn)
296
-
297
- ## 0.9.0 (2017/08/16)
298
-
299
- * (#184, #116) Fixed waveform zoom and scrolling behaviour. Note that the
300
- animated zoom feature no longer works, and so static zoom is now always used,
301
- regardless of the 'zoomAdapter' option (@chrisn)
302
- * Refactored WaveformSegments and WaveformPoints to separate the UI code into
303
- new SegmentsLayer and PointsLayer classes (@chrisn)
304
- * Points and segments are now represented by Point and Segment objects, rather
305
- than plain JavaScript objects (@chrisn)
306
- * (#117) Improved rendering speed of points and segments (@chrisn)
307
- * Points and segments with duplicate ids are no longer allowed (@chrisn)
308
- * The 'segments.ready' event is deprecated, use 'peaks.ready' instead (@chrisn)
309
- * Added 'add', 'remove', 'remove_all', and 'dragged' events for points
310
- and segments (@chrisn)
311
- * The demo page now allows points and segments to be removed (@chrisn)
312
- * Added ZoomController and TimeController classes to simplify main.js (@chrisn)
313
- * Added PlayheadLayer class and refactored WaveformOverview and
314
- WaveformZoomView so that the playhead update code is reused between both
315
- (@chrisn)
316
- * Added peaks.points.getPoint() method (@chrisn)
317
- * Changed the keyboard interface so that the left/right arrow keys scroll the
318
- waveform by 1 second, and shift+left/right by one screen width (@chrisn)
319
- * Improved error messages (@chrisn)
320
- * Removed Node.js v4 and added v8 in Travis CI builds. Please use v6.0 or later
321
- to build Peaks.js (@chrisn)
322
- * Many other refactorings and code improvements (@chrisn)
323
-
324
- ## 0.8.1 (2017/07/03)
325
-
326
- * Fixed deprecation logging from time API functions (@chrisn)
327
- * Added parameter validation to Player.playSegment (@chrisn)
328
-
329
- ## 0.8.0 (2017/07/01)
330
-
331
- * (#192) Added Player.playSegment() method (@craigharvi3)
332
- * Deprecated the time API; use the player API instead (@chrisn)
333
- * Display optional point label text (@chrisn)
334
- * Added documentation for the points API (@chrisn)
335
- * Build ChangeLog manually (@chrisn)
336
-
337
- ## 0.7.0 (2017/05/03)
338
-
339
- * Updated to waveform-data.js v2.0.1 (@chrisn)
340
- * (#182) Modified build to output a single UMD module; supporting installation with
341
- package managers or the script-tag (@craigjohnwright)
342
- * Another fix to mouse dragging behaviour (@chrisn)
343
- * (#187) Fixed segment handle rendering (@chrisn)
344
-
345
- ## v0.6.0 (2016/12/19)
346
-
347
- * (#167) Added audioContext config option (@chrisn, @oncletom, @dodds-cc)
348
- * (#165) Fixed mouse dragging behaviour (@chrisn)
349
- * (#161) More reliable clicking behaviour, don't turn seek click off on
350
- vertical mouse movement (@Develliot)
351
- * (#159) Added JSDoc comments (@chrisn)
352
- * (#157) Register mouse up/move events to the window rather than the waveform
353
- stages (@jdelStrother)
354
- * (#156) Refactored player and keyboard handler objects (@chrisn)
355
- * (#155) Refactored WaveformPoints and WaveformSegments (@chrisn)
356
-
357
- ## v0.5.0 (2016/08/25)
358
-
359
- * (#150) Add Peaks.destroy method (@jdelStrother)
360
-
361
- ## v0.4.9 (2016/08/24)
362
-
363
- * (#151) Report XHR errors (@jdelStrother)
364
- * (#152) Use the npm version of waveform-data.js (@oncletom)
365
-
366
- ## v0.4.8 (2016/08/18)
367
-
368
- * Fixed bug in defaultInMarker() which caused the wrong colour to be used for
369
- left-hand segment markers (@chrisn)
370
- * Renamed keyboard events (@chrisn)
371
- * Updated to EventEmitter v1.0.x (@chrisn)
372
- * Updated to Konva v1.0.x (@chrisn)
373
- * Fixed adding points from Peaks.init() (@chrisn)
374
- * (#144) Use Konva.FastLayer for drawing waveforms (@jdelStrother)
375
- * (#143) Improve addSegment() method signature (@jdelStrother)
376
- * (#142) Serve media from Karma during tests (@jdelStrother)
377
- * (#141) Add/remove points and segments by ID (@jdelStrother)
378
- * (#140) Expose browserified version as package.json "main" property
379
- (@oncletom)
380
- * (#139) Fixed keyboard right-shift bug (@chrisn)
381
- * Numerous other refactorings (@chrisn)
382
-
383
- ## v0.4.6 (2015/09/29)
384
-
385
- * (#127) Don't add waveform layer to the overview stage twice and ensure
386
- the UI layer is on top (@johvet)
387
- * (#125) Node 0.12 and iojs compability (@oncletom)
388
- * (#120) Explicit segment draw on drag resize (@oncletom)
389
- * (#121) Make more colors configurable (@ziggythehamster)
390
-
391
- ## v0.4.5 (2015/07/02)
392
-
393
- * (#123) Allow alternate zoom adapters, add a static (non-animated) zoom
394
- adapter, add more safety checks (@johvet, @ziggythehamster)
395
-
396
- ## v0.4.4 (2015/06/30)
397
-
398
- * (#122) Fix typo, seeking instead of seaking (@johvet)
399
- * (#113) Make the axis label and gridline colors configurable
400
- (@ziggythehamster)
401
- * (#111) Initial error logging function for async errors (@oncletom)
402
- * (#108) fix for bug #105 (@un-chein-andalou)
403
-
404
- ## 0.4.3 (2014/10/15)
405
-
406
- * (#101) deamdify and browserify back to optionalDependencies (@oncletom)
407
-
408
- ## 0.4.2 (2014/10/09)
409
-
410
- * Replaced example image in README.md
411
- * Fixed time-out errors in Travis CI builds
412
-
413
- ## 0.4.1 (2014/10/09)
414
-
415
- * (#86) Fix Kinetic bower path in README (@oncletom)
416
-
417
- ## 0.4.0 (2014/09/24)
418
-
419
- * (#72) Upgrade to Kinetic 5.10 (@oncletom)
420
- * (#84) Switch from SauceLabs to BrowserStack (@oncletom)
421
- * (#81) beforeEach -> before, afterEach -> after (@oncletom)
422
- * (#78) Added peaks.points.removeAll() method (@oncletom)
423
-
424
- ## 0.3.2 (2014/09/10)
425
-
426
- * (#79) EventEmitter2 prototype workaround (@oncletom)
427
- * (#75) Fixed Travis + IE9 tests (@oncletom)
428
-
429
- ## 0.3.1 (2014/09/08)
430
-
431
- * (#74) 0.3 Build System Fix (@oncletom)
432
-
433
- ## 0.3.0 (2014/08/21)
434
-
435
- * (#71) Replaced eventEmitter with eventemitter2 (@oncletom)
436
-
437
- ## 0.3.0-beta.5 (2014/07/10)
438
-
439
- * (#62) Added waveformZoomReady event (after segments and points initialized)
440
- (@chainlink)
441
-
442
- ## 0.3.0-beta.4 (2014/07/10)
443
-
444
- * Automatically deamdify files with browserify
445
-
446
- ## 0.3.0-beta.3 (2014/07/10)
447
-
448
- * (#66) Simplified build system (@oncletom)
449
- * (#63) Fixed bug when using grunt build for vanilla JS (Kinetic Not Found)
450
- (@chainlink)
451
- * (#52) Custom height for each container (@bbcrd)
452
- * Refactored waveform rendering code (@oncletom)
453
- * View height can be set through CSS (@oncletom)
454
- * Added smooth zoom animation (@mgrewal, @oncletom)
455
- * Use waveform-data.js v1.2.0 (@chainlink)
456
- * Added Points interface (@chainlink)
457
-
458
- ## 0.3.0-beta.2 (2014/06/28)
459
-
460
- * (#51) Added functions to delete segments (@oncletom)
461
- * Aliased segments.addSegment as segments.add (@oncletom)
462
-
463
- ## 0.3.0-beta.1 (2014/06/27)
464
-
465
- * (#50) Peaks build system (@oncletom)
466
- * Added Web Audio builder from waveform-data.js
467
-
468
- ## 0.2.1 (2014/03/24)
469
-
470
- * (#43) Fixed "SYNTAX_ERR: DOM Exception 12" error in Safari (@oncletom)
471
- * (#28) Segment improvement (@oncletom)
472
-
473
- ## 0.2.0 (2014/03/13)
474
-
475
- * (#36) Ability to work with a video element as well (@oncletom)
476
- * (#39) Fixing the `FAILED Peaks.segments "before each" hook` breaking CI
477
- (@oncletom)
478
- * (#38) Removing the requirejs builder (@oncletom)
479
- * (#37) Added "segments.ready" event (@oncletom)
480
- * (#35) Simplifying the AMD tree (@oncletom)
481
- * (#32) Resize event is assigned to window and not the Peaks instance
482
- (@oncletom)
483
- * (#33) Enforcing strict mode (@oncletom)
484
-
485
- ## 0.1.0 (2014/02/25)
486
-
487
- * (#26) Removed sass dependency (@oncletom)
488
- * (#20) Removed JST/Underscore dependencies (@oncletom)
489
- * (#19) Added tests for each element of the public API (@oncletom)
490
- * (#15) Partially removed jQuery dependency (@oncletom)
491
- * (#14) Fixed {zoom,over}view mouseup is not releasing document.addEventListener("mouseup") (@oncletom)
492
- * (#11) Handling multiple Peaks instances (@oncletom)
493
- * (#10) Added peaks.time.setCurrentTime() (@oncletom)
494
- * Rewrote the README and added screenshot (@oncletom)
495
- * Fixed playhead positioning after click/drag etc (@oncletom)
496
- * Removed dependency on underscore (@oncletom)
497
- * Added parameter validation (@oncletom)
498
- * Added test cases for segments API and zoom levels (@oncletom)
499
- * Removed bootstrap module (@oncletom)
500
-
501
- ## 0.0.6 (2014/02/19)
502
-
503
- * (#30) Clicking in the zoomview should just change the playhead position
504
- (@oncletom)
505
-
506
- ## 0.0.5 (2014/02/17)
507
-
508
- * (#25) Dragging zoomview bug (low priority) (@oncletom)
509
- * (#24) Out of Range bug (@oncletom)
510
-
511
- ## 0.0.4 (2014/02/06)
512
-
513
- * (#22) Seeking not working (@oncletom)
514
-
515
- ## 0.0.3 (2014/01/30)
516
-
517
- * (#17) Moving the playhead in views now updates the audio element
518
- currentTime (@oncletom)
519
- * (#16) Fixed IE9 bug with createSegment (@oncletom)
520
- * (#3) Added TravisCI + Saucelabs (@oncletom)
521
- * (#13) Migrated to Mocha+Chai for tests (@oncletom)
522
-
523
- ## 0.0.2 (2014/01/28)
524
-
525
- * (#12) `element.currentTime` side-effect (@oncletom)
526
- * (#5) Segments performance boost (@oncletom)
527
-
528
- ## 0.0.1 (2013/12/14 09:42 +00:00)
529
-
530
- * (#1) bower install failing for me (@oncletom)