vibe-editor 0.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.
Files changed (132) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +51 -0
  3. package/package.json +56 -0
  4. package/src/fonts/bravura/FONTLOG.txt +243 -0
  5. package/src/fonts/bravura/OFL-FAQ.txt +369 -0
  6. package/src/fonts/bravura/OFL.txt +94 -0
  7. package/src/fonts/bravura/bravura-text.md +153 -0
  8. package/src/fonts/bravura/bravura_metadata.json +34718 -0
  9. package/src/fonts/bravura/eot/Bravura.eot +0 -0
  10. package/src/fonts/bravura/eot/BravuraText.eot +0 -0
  11. package/src/fonts/bravura/otf/Bravura.otf +0 -0
  12. package/src/fonts/bravura/otf/BravuraText.otf +0 -0
  13. package/src/fonts/bravura/svg/Bravura.svg +3517 -0
  14. package/src/fonts/bravura/svg/BravuraText.svg +18879 -0
  15. package/src/fonts/bravura/woff/Bravura.woff +0 -0
  16. package/src/fonts/bravura/woff/BravuraText.woff +0 -0
  17. package/src/fonts/colaborate/ColabBol-webfont.eot +0 -0
  18. package/src/fonts/colaborate/ColabBol-webfont.svg +976 -0
  19. package/src/fonts/colaborate/ColabBol-webfont.ttf +0 -0
  20. package/src/fonts/colaborate/ColabBol-webfont.woff +0 -0
  21. package/src/fonts/colaborate/ColabLig-webfont.eot +0 -0
  22. package/src/fonts/colaborate/ColabLig-webfont.svg +976 -0
  23. package/src/fonts/colaborate/ColabLig-webfont.ttf +0 -0
  24. package/src/fonts/colaborate/ColabLig-webfont.woff +0 -0
  25. package/src/fonts/colaborate/ColabMed-webfont.eot +0 -0
  26. package/src/fonts/colaborate/ColabMed-webfont.svg +976 -0
  27. package/src/fonts/colaborate/ColabMed-webfont.ttf +0 -0
  28. package/src/fonts/colaborate/ColabMed-webfont.woff +0 -0
  29. package/src/fonts/colaborate/ColabReg-webfont.eot +0 -0
  30. package/src/fonts/colaborate/ColabReg-webfont.svg +976 -0
  31. package/src/fonts/colaborate/ColabReg-webfont.ttf +0 -0
  32. package/src/fonts/colaborate/ColabReg-webfont.woff +0 -0
  33. package/src/fonts/colaborate/ColabThi-webfont.eot +0 -0
  34. package/src/fonts/colaborate/ColabThi-webfont.svg +970 -0
  35. package/src/fonts/colaborate/ColabThi-webfont.ttf +0 -0
  36. package/src/fonts/colaborate/ColabThi-webfont.woff +0 -0
  37. package/src/images/GUI/.DS_Store +0 -0
  38. package/src/images/GUI/backward-fast-solid.svg +1 -0
  39. package/src/images/GUI/bars-solid.svg +1 -0
  40. package/src/images/GUI/caret-left-solid.svg +1 -0
  41. package/src/images/GUI/caret-right-solid.svg +1 -0
  42. package/src/images/GUI/edit-solid.svg +1 -0
  43. package/src/images/GUI/pause-solid.svg +1 -0
  44. package/src/images/GUI/play-solid.svg +1 -0
  45. package/src/images/GUI/triplet.svg +21 -0
  46. package/src/images/GUI/zoomin.svg +1 -0
  47. package/src/images/GUI/zoomout.svg +1 -0
  48. package/src/images/bravura_notes/.DS_Store +0 -0
  49. package/src/images/bravura_notes/16th.svg +1 -0
  50. package/src/images/bravura_notes/32th.svg +1 -0
  51. package/src/images/bravura_notes/alterDDown.svg +1 -0
  52. package/src/images/bravura_notes/alterDUp.svg +1 -0
  53. package/src/images/bravura_notes/alterDown.svg +1 -0
  54. package/src/images/bravura_notes/alterNeutral.svg +1 -0
  55. package/src/images/bravura_notes/alterUp.svg +1 -0
  56. package/src/images/bravura_notes/beams.svg +1 -0
  57. package/src/images/bravura_notes/eigth.svg +1 -0
  58. package/src/images/bravura_notes/full.svg +1 -0
  59. package/src/images/bravura_notes/half.svg +1 -0
  60. package/src/images/bravura_notes/oneDot.svg +1 -0
  61. package/src/images/bravura_notes/pauseNote.svg +1 -0
  62. package/src/images/bravura_notes/quarter.svg +1 -0
  63. package/src/images/bravura_notes/tie.svg +1 -0
  64. package/src/images/bravura_notes/twoDot.svg +1 -0
  65. package/src/scripts/js/.DS_Store +0 -0
  66. package/src/scripts/js/Core.js +887 -0
  67. package/src/scripts/js/MusicPlayer.js +572 -0
  68. package/src/scripts/js/MusicProcessor.js +652 -0
  69. package/src/scripts/js/VerovioScoreEditor.js +183 -0
  70. package/src/scripts/js/assets/mei_template.js +161 -0
  71. package/src/scripts/js/constants.js +20 -0
  72. package/src/scripts/js/datastructures/MeasureMatrix.js +235 -0
  73. package/src/scripts/js/datastructures/ScoreGraph.js +432 -0
  74. package/src/scripts/js/datastructures/ScoreNode.js +78 -0
  75. package/src/scripts/js/entry.js +4 -0
  76. package/src/scripts/js/gui/Annotations.js +456 -0
  77. package/src/scripts/js/gui/Cursor.js +203 -0
  78. package/src/scripts/js/gui/CustomAnnotationDrawer.js +114 -0
  79. package/src/scripts/js/gui/CustomAnnotationShapeDrawer.js +114 -0
  80. package/src/scripts/js/gui/HarmonyLabel.js +104 -0
  81. package/src/scripts/js/gui/Label.js +2 -0
  82. package/src/scripts/js/gui/PhantomElement.js +132 -0
  83. package/src/scripts/js/gui/ScoreManipulator.js +156 -0
  84. package/src/scripts/js/gui/Tabbar.js +675 -0
  85. package/src/scripts/js/gui/TempoLabel.js +60 -0
  86. package/src/scripts/js/gui/Toolbar copy.js +614 -0
  87. package/src/scripts/js/gui/Toolbar.js +618 -0
  88. package/src/scripts/js/handlers/AnnotationChangeHandler.js +567 -0
  89. package/src/scripts/js/handlers/AnnotationDragHandler.js +113 -0
  90. package/src/scripts/js/handlers/AnnotationLineHandler.js +113 -0
  91. package/src/scripts/js/handlers/ArticulationHandler.js +20 -0
  92. package/src/scripts/js/handlers/ClickModeHandler.js +265 -0
  93. package/src/scripts/js/handlers/CustomAnnotationShapeDrawer.js +131 -0
  94. package/src/scripts/js/handlers/CustomToolbarHandler.js +297 -0
  95. package/src/scripts/js/handlers/DeleteHandler.js +102 -0
  96. package/src/scripts/js/handlers/GlobalKeyboardHandler.js +367 -0
  97. package/src/scripts/js/handlers/Handler.js +2 -0
  98. package/src/scripts/js/handlers/HarmonyHandler.js +282 -0
  99. package/src/scripts/js/handlers/InsertModeHandler copy.js +423 -0
  100. package/src/scripts/js/handlers/InsertModeHandler.js +380 -0
  101. package/src/scripts/js/handlers/InsertModeHandler_deprecated.js +424 -0
  102. package/src/scripts/js/handlers/KeyModeHandler copy.js +407 -0
  103. package/src/scripts/js/handlers/KeyModeHandler.js +456 -0
  104. package/src/scripts/js/handlers/KeyModeHandler_deprecated.js +411 -0
  105. package/src/scripts/js/handlers/LabelHandler.js +461 -0
  106. package/src/scripts/js/handlers/ModHandler.js +311 -0
  107. package/src/scripts/js/handlers/NoteDragHandler copy.js +148 -0
  108. package/src/scripts/js/handlers/NoteDragHandler.js +97 -0
  109. package/src/scripts/js/handlers/NoteDragHandler_deprecated.js +150 -0
  110. package/src/scripts/js/handlers/PhantomElementHandler.js +168 -0
  111. package/src/scripts/js/handlers/ScoreManipulatorHandler.js +135 -0
  112. package/src/scripts/js/handlers/SelectionHandler.js +218 -0
  113. package/src/scripts/js/handlers/SideBarHandler.js +499 -0
  114. package/src/scripts/js/handlers/TooltipHandler.js +132 -0
  115. package/src/scripts/js/handlers/WindowHandler.js +257 -0
  116. package/src/scripts/js/utils/DOMCreator.js +174 -0
  117. package/src/scripts/js/utils/MEIConverter.js +64 -0
  118. package/src/scripts/js/utils/MEIOperations.js +2112 -0
  119. package/src/scripts/js/utils/Mouse2MEI.js +735 -0
  120. package/src/scripts/js/utils/Mouse2SVG.js +737 -0
  121. package/src/scripts/js/utils/SVGEditor.js +352 -0
  122. package/src/scripts/js/utils/SVGFiller.js +245 -0
  123. package/src/scripts/js/utils/Types.js +2 -0
  124. package/src/scripts/js/utils/VerovioWrapper copy.js +156 -0
  125. package/src/scripts/js/utils/VerovioWrapper.js +165 -0
  126. package/src/scripts/js/utils/VerovioWrapperLocal.js +156 -0
  127. package/src/scripts/js/utils/convenienceQueries.js +37 -0
  128. package/src/scripts/js/utils/coordinates.js +54 -0
  129. package/src/scripts/js/utils/firefoxBBoxes.js +143 -0
  130. package/src/scripts/js/utils/mappings.js +332 -0
  131. package/src/scripts/js/utils/random.js +45 -0
  132. package/src/styles/VerovioScoreEditor.css +694 -0
@@ -0,0 +1,675 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const dc = require("../utils/DOMCreator");
4
+ const bootstrap_1 = require("bootstrap");
5
+ //import Toggle from "bootstrap5-toggle"
6
+ const interactjs_1 = require("interactjs");
7
+ const constants_1 = require("../constants");
8
+ const meioperations = require("../utils/MEIOperations");
9
+ const cq = require("../utils/convenienceQueries");
10
+ const buttonStyleDarkOutline = "btn btn-outline-dark btn-sm";
11
+ const buttonStyleDark = "btn btn-dark btn-md";
12
+ const smuflFont = "smufl";
13
+ const alterBtn = "alterBtn";
14
+ const selectedFlag = "selected";
15
+ const tabFlag = "tabBtn";
16
+ class Tabbar {
17
+ //private task: Evaluation
18
+ constructor(options = null, containerId) {
19
+ this.createAnnotListFunction = (function (e) {
20
+ var t = e.target;
21
+ if (t.closest(".vse-container").id !== this.containerId)
22
+ return;
23
+ this.createAnnotList(e);
24
+ }).bind(this);
25
+ this.closeHandlerMouse = (function closeHandlerMouse(e) {
26
+ e.preventDefault();
27
+ Array.from(cq.getContainer(this.containerId).querySelectorAll(".dropdown-toggle")).forEach(dd => {
28
+ //this.closeDropdown(dd)
29
+ });
30
+ }).bind(this);
31
+ // Macht momentan nix
32
+ this.closeHandlerKey = (function closeHandlerMouse(e) {
33
+ if (!cq.hasActiveElement(this.containerId))
34
+ return;
35
+ if (e.key === "Escape") {
36
+ //e.preventDefault()
37
+ Array.from(cq.getContainer(this.containerId).querySelectorAll(".dropdown-toggle")).forEach(dd => {
38
+ //this.closeDropdown(dd)
39
+ });
40
+ }
41
+ }).bind(this);
42
+ /**
43
+ * MAke Buttons in Toolbar selectable exclusively
44
+ */
45
+ this.exclusiveSelectHandler = (function exclusiveSelectHandler(e) {
46
+ this.exclusiveSelect(e);
47
+ }).bind(this);
48
+ this.styleCache = new Map();
49
+ this.sidebarHandler = (function sidebarHandler(e) {
50
+ var _a, _b;
51
+ //toggle
52
+ var that = this;
53
+ var elParent;
54
+ if (this.sidebar.classList.contains("closedSidebar")) {
55
+ Array.from(cq.getContainer(this.containerId).querySelectorAll(".closedSidebar")).forEach(el => {
56
+ elParent = el.parentElement;
57
+ el.classList.remove("closedSidebar");
58
+ el.classList.add("openSidebar");
59
+ });
60
+ if (that.styleCache.size > 0) {
61
+ for (const [key, value] of that.styleCache.entries()) {
62
+ (_b = (_a = document.getElementById(that.containerId)) === null || _a === void 0 ? void 0 : _a.querySelector("#" + key)) === null || _b === void 0 ? void 0 : _b.setAttribute("style", value);
63
+ }
64
+ }
65
+ that.styleCache = new Map();
66
+ }
67
+ else {
68
+ //document.getElementById("sidebarContainer").style.width = "0"
69
+ Array.from(cq.getContainer(this.containerId).querySelectorAll(".openSidebar")).forEach(el => {
70
+ elParent = el.parentElement;
71
+ elParent.querySelectorAll(":scope > div").forEach(d => {
72
+ that.styleCache.set(d.id, d.getAttribute("style"));
73
+ d.removeAttribute("style");
74
+ });
75
+ el.classList.add("closedSidebar");
76
+ el.classList.remove("openSidebar");
77
+ });
78
+ }
79
+ }).bind(this);
80
+ /**
81
+ * Creates second toolbar depending on selected option
82
+ */
83
+ this.customToolbarHandler = (function customToolbarHandler(e) {
84
+ var cont = cq.getContainer(this.containerId);
85
+ cont.querySelectorAll(["#insertDropdown a", "." + tabFlag].join(",")).forEach(a => {
86
+ a.classList.remove("selected");
87
+ });
88
+ var target = e.target;
89
+ var tID = target.id;
90
+ cont.querySelector("#" + tID).classList.add("selected");
91
+ this.removeAllCustomGroups();
92
+ switch (tID) {
93
+ case "notationTabBtn":
94
+ case "clickInsert":
95
+ this.clickInsertHandler();
96
+ break;
97
+ case "keyMode":
98
+ this.keyModeHandler();
99
+ break;
100
+ case "annotationTabBtn":
101
+ case "activateAnnot":
102
+ this.annotHandler();
103
+ break;
104
+ case "activateHarm":
105
+ this.harmHandler();
106
+ case "articulationTabBtn":
107
+ this.articulationHandler();
108
+ break;
109
+ }
110
+ }).bind(this);
111
+ this.containerId = containerId;
112
+ if (options !== null) {
113
+ this.options = options;
114
+ }
115
+ }
116
+ createToolbars() {
117
+ this.sideBarGroup = cq.getContainer(this.containerId).querySelector("#sideBarGroup");
118
+ var toggleBtn = dc.makeNewButton("", "toggleSidebar", buttonStyleDarkOutline + " closedSidebar");
119
+ this.sideBarGroup.append(toggleBtn);
120
+ this.createSideBar();
121
+ this.createMainToolbar();
122
+ this.createCustomToolbar();
123
+ this.addElementsToBootstrap();
124
+ this.setListeners();
125
+ }
126
+ createSideBar() {
127
+ this.createModList();
128
+ cq.getContainer(this.containerId).querySelectorAll("#sidebarList a, #timeDiv, #tempoDiv").forEach(sa => {
129
+ sa.setAttribute("draggable", "true");
130
+ });
131
+ this.createAnnotList();
132
+ this.optionalButtons();
133
+ }
134
+ createModList() {
135
+ this.sidebar = cq.getContainer(this.containerId).querySelector("#sidebarContainer");
136
+ var accordeon = dc.makeNewDiv("sidebarList", "accordion");
137
+ this.sidebar.appendChild(accordeon);
138
+ //Keysignatures
139
+ accordeon.appendChild(this.createKeySigAccItem());
140
+ //Music Key
141
+ accordeon.appendChild(this.createClefAccItem());
142
+ //Time Signature
143
+ accordeon.appendChild(this.createTimeSigAccItem());
144
+ //Tempo
145
+ //accordeon.appendChild(this.createTempoAccItem())
146
+ //midiSelect
147
+ accordeon.append(this.createMidiSelect());
148
+ }
149
+ createKeySigAccItem() {
150
+ var keySelectItem = dc.makeNewAccordionItem("sidebarList", "selectKey", "selectKeyHeader", "selectKeyBtn", "Key", buttonStyleDark, "selectKeyDiv");
151
+ var keyListCMajRow = dc.makeNewDiv("keyListCDIV", "row");
152
+ var keyListCMaj = dc.makeNewDiv("keyListC", "list-group flex-fill col");
153
+ keySelectItem.querySelector("#selectKeyDiv").appendChild(keyListCMajRow);
154
+ keyListCMajRow.appendChild(keyListCMaj);
155
+ keyListCMaj.appendChild(dc.makeNewAElement("=", "KeyCMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
156
+ var keyListSignedRow = dc.makeNewDiv("keyListCrossDIV", "col row g-0");
157
+ var keyListCross = dc.makeNewDiv("keyListCross", "list-group flex-fill col");
158
+ keySelectItem.querySelector("#selectKeyDiv").appendChild(keyListSignedRow);
159
+ keyListSignedRow.appendChild(keyListCross);
160
+ keyListCross.appendChild(dc.makeNewAElement("-", "KeyGMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
161
+ keyListCross.appendChild(dc.makeNewAElement("--", "KeyDMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
162
+ keyListCross.appendChild(dc.makeNewAElement("---", "KeyAMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
163
+ keyListCross.appendChild(dc.makeNewAElement("----", "KeyEMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
164
+ keyListCross.appendChild(dc.makeNewAElement("-----", "KeyBMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
165
+ keyListCross.appendChild(dc.makeNewAElement("------", "KeyF#Maj", "list-group-item list-group-item-action " + smuflFont, "#", true));
166
+ var keyListB = dc.makeNewDiv("keyListB", "list-group flex-fill col");
167
+ keyListSignedRow.appendChild(keyListB);
168
+ keyListB.appendChild(dc.makeNewAElement("", "KeyFMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
169
+ keyListB.appendChild(dc.makeNewAElement("-", "KeyBbMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
170
+ keyListB.appendChild(dc.makeNewAElement("--", "KeyEbMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
171
+ keyListB.appendChild(dc.makeNewAElement("---", "KeyAbMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
172
+ keyListB.appendChild(dc.makeNewAElement("----", "KeyDbMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
173
+ keyListB.appendChild(dc.makeNewAElement("-----", "KeyGbMaj", "list-group-item list-group-item-action " + smuflFont, "#", true));
174
+ return keySelectItem;
175
+ }
176
+ createClefAccItem() {
177
+ //Music Key
178
+ var clefSelectItem = dc.makeNewAccordionItem("sidebarList", "selectClef", "selectClefHeader", "selectClefBtn", "Clef", buttonStyleDark, "selectClefDiv");
179
+ var clefList = dc.makeNewDiv("clefList", "list-group flex-fill");
180
+ clefSelectItem.querySelector("#selectClefDiv").appendChild(clefList);
181
+ clefList.appendChild(dc.makeNewAElement("&#xE050", "GClef", "list-group-item list-group-item-action " + smuflFont, "#", true));
182
+ clefList.appendChild(dc.makeNewAElement("&#xE05C", "CClef", "list-group-item list-group-item-action " + smuflFont, "#", true));
183
+ clefList.appendChild(dc.makeNewAElement("&#xE062", "FClef", "list-group-item list-group-item-action " + smuflFont, "#", true));
184
+ return clefSelectItem;
185
+ }
186
+ createTimeSigAccItem() {
187
+ //Time Signature
188
+ var timeSelectItem = dc.makeNewAccordionItem("sidebarList", "selectTime", "selectTimeHeader", "selectTimeBtn", "Time", buttonStyleDark, "selectTimeDiv");
189
+ var timeDiv = dc.makeNewDiv("timeDiv", "row align-items-start");
190
+ var countDiv = dc.makeNewDiv("countDiv", "col");
191
+ var tcdatalistname = "timeCountDatalist";
192
+ var timeCount = dc.makeNewInput("timeCount", "text", "", null, tcdatalistname);
193
+ //create list for time code select
194
+ var tcOptionValues = new Array();
195
+ for (var i = 0; i < 16; i++) {
196
+ tcOptionValues.push((i + 1).toString());
197
+ }
198
+ var tcDatalist = dc.makeNewSelect("timeCount", tcOptionValues);
199
+ //countDiv.appendChild(timeCount)
200
+ countDiv.appendChild(tcDatalist);
201
+ var slashDiv = dc.makeNewDiv("slash", "col");
202
+ slashDiv.textContent = "/";
203
+ var unitDiv = dc.makeNewDiv("unitDiv", "col");
204
+ var tudatalistname = "timeUnitDatalist";
205
+ var timeUnit = dc.makeNewInput("timeUnit", "text", "", null, tudatalistname);
206
+ //create list for time units select
207
+ var tuOptionValues = new Array();
208
+ for (var i = 0; i <= 16; i++) {
209
+ if (Number.isInteger(Math.log2(i))) {
210
+ tuOptionValues.push(i.toString());
211
+ }
212
+ }
213
+ var tuDataList = dc.makeNewSelect("timeUnit", tuOptionValues);
214
+ unitDiv.appendChild(tuDataList);
215
+ timeSelectItem.querySelector("#selectTimeDiv").appendChild(timeDiv);
216
+ timeDiv.appendChild(countDiv);
217
+ timeDiv.appendChild(slashDiv);
218
+ timeDiv.appendChild(unitDiv);
219
+ return timeSelectItem;
220
+ }
221
+ createTempoAccItem() {
222
+ var tempoItem = dc.makeNewAccordionItem("sidebarList", "selectTempo", "selectTempoHeader", "selectTempoBtn", "Tempo", buttonStyleDark, "selectTempoDiv");
223
+ var tempoDiv = dc.makeNewDiv("tempoDiv", "row align-items-start");
224
+ var tempoRefDurDiv = dc.makeNewDiv("tempoRefDurDif", "col");
225
+ var tcdatalistname = "timeCountDatalist";
226
+ var timeCount = dc.makeNewInput("timeCount", "text", "", null, tcdatalistname);
227
+ //create list for time code select
228
+ var tcOptionValues = new Array();
229
+ for (var i = 0; i <= 16; i++) {
230
+ if (Number.isInteger(Math.log2(i))) {
231
+ tcOptionValues.push(i.toString());
232
+ tcOptionValues.push(i.toString() + ".");
233
+ }
234
+ }
235
+ var tcDatalist = dc.makeNewSelect("timeCount", tcOptionValues);
236
+ tempoRefDurDiv.appendChild(tcDatalist);
237
+ var equal = dc.makeNewDiv("equal", "col");
238
+ equal.textContent = "=";
239
+ var unitDiv = dc.makeNewDiv("unitDiv", "col");
240
+ var timeUnit = dc.makeNewInput("timeUnit", "text", "", null);
241
+ unitDiv.appendChild(timeUnit);
242
+ tempoItem.querySelector("#selectTempoDiv").appendChild(tempoDiv);
243
+ tempoDiv.appendChild(tempoRefDurDiv);
244
+ tempoDiv.appendChild(equal);
245
+ tempoDiv.appendChild(unitDiv);
246
+ return tempoItem;
247
+ }
248
+ createMidiSelect() {
249
+ var selectItem = dc.makeNewSelect("midiDeviceSelect", [], "MIDI Input Device");
250
+ // buttonStyleDark.split(" ").forEach(c => selectItem.classList.add(c))
251
+ selectItem.classList.add("accordion-header");
252
+ return selectItem;
253
+ }
254
+ optionalButtons() {
255
+ if (typeof this.sidebar === "undefined") {
256
+ return;
257
+ }
258
+ }
259
+ createAnnotList() {
260
+ var _a, _b;
261
+ (_a = cq.getContainer(this.containerId).querySelector("#annotList")) === null || _a === void 0 ? void 0 : _a.remove();
262
+ var annotList = document.createElement("div");
263
+ annotList.setAttribute("id", "annotList");
264
+ annotList.classList.add("list-group");
265
+ var that = this;
266
+ (_b = cq.getContainer(this.containerId).querySelectorAll("#annotationCanvas > g")) === null || _b === void 0 ? void 0 : _b.forEach(c => {
267
+ var text = c.querySelector(".annotDiv").textContent || c.querySelector(".annotDiv").getAttribute("data-text");
268
+ var a = dc.makeNewAElement(text, "", "list-group-item list-group-item-action list-group-item-primary", "#");
269
+ a.setAttribute("refId", c.id);
270
+ //a.setAttribute("contenteditable", "true")
271
+ a.addEventListener("click", function () {
272
+ var _a;
273
+ a.setAttribute("contenteditable", "true");
274
+ Array.from(cq.getContainer(that.containerId).querySelectorAll(".selected")).forEach(s => s.classList.remove(selectedFlag));
275
+ cq.getContainer(that.containerId).querySelector("#" + c.id).focus();
276
+ (_a = cq.getContainer(that.containerId).querySelector("#" + c.id).querySelector(".annotLinkedText, .annotStaticText")) === null || _a === void 0 ? void 0 : _a.classList.add(selectedFlag);
277
+ });
278
+ a.addEventListener("blur", function (e) {
279
+ var t = e.target;
280
+ a.setAttribute("contenteditable", "false");
281
+ cq.getContainer(that.containerId).querySelector("#" + t.getAttribute("refid")).querySelector(".annotDiv").textContent = t.textContent;
282
+ });
283
+ a.addEventListener("keydown", function (e) {
284
+ var t = e.target;
285
+ if (e.code === "Enter") {
286
+ t.blur();
287
+ }
288
+ else if (e.code === "Space") {
289
+ e.preventDefault();
290
+ document.execCommand("insertText", false, ' ');
291
+ }
292
+ });
293
+ annotList.appendChild(a);
294
+ });
295
+ this.sidebar.appendChild(annotList);
296
+ }
297
+ createButtons() {
298
+ var that = this;
299
+ // and now the tabs
300
+ this.notationTab = cq.getContainer(this.containerId).querySelector("#notationTabGroup");
301
+ this.notationTab.append(dc.makeNewButton("Notation", "notationTabBtn", buttonStyleDarkOutline + " " + tabFlag));
302
+ //this.articulationTab = cq.getContainer(this.containerId).querySelector("#articulationTabGroup")
303
+ //this.articulationTab.append(dc.makeNewButton("Articulation", "articulationTabBtn", buttonStyleDarkOutline + " " + tabFlag))
304
+ //this.melismaTab = cq.getContainer(this.containerId).querySelector("#melismaTabGroup")
305
+ //this.melismaTab.append(dc.makeNewButton("Melisma", "melismaTabBtn", buttonStyleDarkOutline + " " + tabFlag))
306
+ this.annotationTab = cq.getContainer(this.containerId).querySelector("#annotationTabGroup");
307
+ this.annotationTab.append(dc.makeNewButton("Annotation", "annotationTabBtn", buttonStyleDarkOutline + " " + tabFlag));
308
+ this.noteButtonGroup = cq.getContainer(this.containerId).querySelector("#noteGroup");
309
+ this.noteButtonGroup.append(dc.makeNewButton("&#x1D15D", "fullNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
310
+ this.noteButtonGroup.append(dc.makeNewButton("&#x1D15E", "halfNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
311
+ this.noteButtonGroup.append(dc.makeNewButton("&#x1D15F", "quarterNote", buttonStyleDarkOutline + " " + smuflFont + " selected", "", true));
312
+ this.noteButtonGroup.append(dc.makeNewButton("&#x1D160", "eigthNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
313
+ this.noteButtonGroup.append(dc.makeNewButton("&#x1D161", "sixteenthNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
314
+ this.noteButtonGroup.append(dc.makeNewButton("&#x1D162", "thirtysecondNote", buttonStyleDarkOutline + " " + smuflFont, "", true));
315
+ this.dotButtonGroup = cq.getContainer(this.containerId).querySelector("#dotGroup");
316
+ this.dotButtonGroup.append(dc.makeNewButton(".", "oneDot", buttonStyleDarkOutline + " " + smuflFont, "", true));
317
+ this.dotButtonGroup.append(dc.makeNewButton(". .", "twoDot", buttonStyleDarkOutline + " " + smuflFont, "", true));
318
+ // mods for phrasing and rhythm
319
+ this.modButtonGroup = cq.getContainer(this.containerId).querySelector("#modGroup");
320
+ this.modButtonGroup.appendChild(dc.makeNewButton("____", "tupletBtn", buttonStyleDarkOutline + " " + smuflFont, "", true));
321
+ //this.modButtonGroup.appendChild(dc.makeNewButton("&#x1D13D;&#x1D13E;", "pauseNote", buttonStyleDarkOutline + " " + smuflFont, "", true))
322
+ this.modButtonGroup.appendChild(dc.makeNewButton("&#8256", "tieNotes", buttonStyleDarkOutline + " " + smuflFont, "", true));
323
+ this.modButtonGroup.appendChild(dc.makeNewButton("&#9835;", "organizeBeams", buttonStyleDarkOutline + " " + smuflFont, "", true));
324
+ //accidentals
325
+ this.accidButtonGroup = cq.getContainer(this.containerId).querySelector("#accidGroup");
326
+ this.accidButtonGroup.appendChild(dc.makeNewButton("&#x266D;", "alterDown", buttonStyleDarkOutline + " " + smuflFont + " " + alterBtn, "", true));
327
+ this.accidButtonGroup.appendChild(dc.makeNewButton("&#x266F;", "alterUp", buttonStyleDarkOutline + " " + smuflFont + " " + alterBtn, "", true));
328
+ this.accidButtonGroup.appendChild(dc.makeNewButton("&#x266E;", "alterNeutral", buttonStyleDarkOutline + " " + smuflFont + " " + alterBtn, "", true));
329
+ this.accidButtonGroup.appendChild(dc.makeNewButton("&#x1D12B", "alterDDown", buttonStyleDarkOutline + " " + smuflFont + " " + alterBtn, "", true));
330
+ this.accidButtonGroup.appendChild(dc.makeNewButton("&#x1D12A", "alterDUp", buttonStyleDarkOutline + " " + smuflFont + " " + alterBtn, "", true));
331
+ this.accidButtonGroup.addEventListener("click", this.exclusiveSelectHandler);
332
+ this.soundGroup = cq.getContainer(this.containerId).querySelector("#soundGroup");
333
+ this.soundGroup.appendChild(dc.makeNewButton("", "playBtn", buttonStyleDarkOutline));
334
+ //this.soundGroup.appendChild(dc.makeNewButton("", "pauseBtn", buttonStyleDarkOutline))
335
+ this.soundGroup.appendChild(dc.makeNewButton("", "rewindBtn", buttonStyleDarkOutline));
336
+ this.zoomGroup = cq.getContainer(this.containerId).querySelector("#zoomGroup");
337
+ this.zoomGroup.append(dc.makeNewButton("", "zoomOutBtn", buttonStyleDarkOutline));
338
+ this.zoomGroup.append(dc.makeNewButton("", "zoomInBtn", buttonStyleDarkOutline));
339
+ // this.midiSelectGroup = cq.getContainer(this.containerId).querySelector("#midiSelectGroup")
340
+ // this.midiSelectGroup.append(dc.makeNewSelect("midiDeviceSelect", [], "MIDI Input Device"))
341
+ this.fileSelectGroup = cq.getContainer(this.containerId).querySelector("#fileSelectGroup");
342
+ this.fileSelectGroup.append(dc.makeNewInput("importAudioFile", "file", ""));
343
+ this.fileSelectGroup.append(dc.makeNewButton("Import Audiofile", "importAudioFileBtn", buttonStyleDarkOutline));
344
+ this.fileSelectGroup.append(dc.makeNewInput("importXML", "file", ""));
345
+ this.fileSelectGroup.append(dc.makeNewButton("Import Data", "importXMLBtn", buttonStyleDarkOutline));
346
+ this.fileSelectGroup.append(dc.makeNewButton("Export MEI", "exportFileBtn", buttonStyleDarkOutline));
347
+ var showBBToggle = dc.makeNewToggle("showBB", buttonStyleDark, "BBoxes", "showBBDiv");
348
+ this.setToggleLogic(showBBToggle, function () { cq.getContainer(that.containerId).classList.add("debug"); }, function () { cq.getContainer(that.containerId).classList.remove("debug"); });
349
+ this.fileSelectGroup.append(showBBToggle);
350
+ }
351
+ /**
352
+ *
353
+ * @param el element to set logic for
354
+ * @param callBackChecked additional code to execute when toggle is checked
355
+ * @param callBackUnchecked additional code to execute when toggle is unchecked
356
+ * @param switchPair pair of words to change between when toggled
357
+ */
358
+ setToggleLogic(el, callbackChecked = null, callbackUnchecked = null, switchPair = new Array()) {
359
+ if (switchPair.length > 2 || switchPair.length === 1) {
360
+ throw new Error("switchPair Array must have exaclty 2 strings");
361
+ }
362
+ el.addEventListener("click", function (e) {
363
+ e.preventDefault();
364
+ var target = e.target;
365
+ if (target.tagName.toLowerCase() !== "label")
366
+ return;
367
+ var label = e.target;
368
+ var input = label.previousElementSibling;
369
+ if (input.checked === true) {
370
+ if (switchPair.length > 0)
371
+ label.textContent = switchPair[0];
372
+ input.checked = false;
373
+ callbackUnchecked();
374
+ }
375
+ else {
376
+ if (switchPair.length > 0)
377
+ label.textContent = switchPair[1];
378
+ input.checked = true;
379
+ callbackChecked();
380
+ }
381
+ });
382
+ }
383
+ createInsertSelect() {
384
+ //InsertSelect DropdownMenu
385
+ this.insertSelectGroup = dc.makeNewDiv("insertGroup", "customGroup btn-group-sm me-2 h-100", { role: "group" });
386
+ var toggle = dc.makeNewToggle("insertToggle", buttonStyleDarkOutline, "Replace", "insertToggleDiv");
387
+ toggle.addEventListener("click", function (e) {
388
+ e.preventDefault();
389
+ var target = e.target;
390
+ if (target.tagName.toLowerCase() !== "label")
391
+ return;
392
+ var label = e.target;
393
+ var input = label.previousElementSibling;
394
+ if (label.textContent === "Replace") {
395
+ label.textContent = "Insert";
396
+ input.checked = false;
397
+ }
398
+ else {
399
+ label.textContent = "Replace";
400
+ input.checked = true;
401
+ }
402
+ });
403
+ this.insertSelectGroup.append(toggle);
404
+ }
405
+ createButtonsAnnotationMode() {
406
+ this.annotGroupKM = dc.makeNewDiv("annotGroupKM", "customGroup btn-group-sm me-2 h-100", { role: "group" });
407
+ this.annotGroupKM.append(dc.makeNewButton("Text", "staticTextButton", buttonStyleDarkOutline));
408
+ this.annotGroupKM.append(dc.makeNewButton("Linked Text", "linkedAnnotButton", buttonStyleDarkOutline + " selected"));
409
+ this.annotGroupKM.append(dc.makeNewButton("Harmony", "harmonyAnnotButton", buttonStyleDarkOutline));
410
+ this.annotGroupKM.addEventListener("click", this.exclusiveSelectHandler);
411
+ }
412
+ createArticualtionButtons() {
413
+ this.articGroup = dc.makeNewDiv("articGroup", "customGroup btn-group-sm me-2 h-100", { role: "group" });
414
+ this.articGroup.append(dc.makeNewButton(".", "staccatoBtn", buttonStyleDarkOutline));
415
+ this.articGroup.append(dc.makeNewButton("_", "tenutoBtn", buttonStyleDarkOutline));
416
+ this.articGroup.append(dc.makeNewButton("&#x1D17F;", "marcatoBtn", buttonStyleDarkOutline + " " + smuflFont, "", true));
417
+ this.articGroup.append(dc.makeNewButton("&#x1D17B;", "accentBtn", buttonStyleDarkOutline + " " + smuflFont, "", true));
418
+ this.articGroup.addEventListener("click", this.exclusiveSelectHandler);
419
+ }
420
+ createMainToolbar() {
421
+ this.createButtons();
422
+ var btnToolbar = cq.getContainer(this.containerId).querySelector("#btnToolbar");
423
+ btnToolbar.appendChild(this.sideBarGroup);
424
+ btnToolbar.parentElement.insertBefore(this.sidebar, btnToolbar.parentElement.firstChild); // important for ~ selector
425
+ //btnToolbar.appendChild(this.handlerGroup) // invisible
426
+ //tabs
427
+ btnToolbar.appendChild(this.notationTab);
428
+ //btnToolbar.appendChild(this.articulationTab)
429
+ //btnToolbar.appendChild(this.melismaTab)
430
+ btnToolbar.appendChild(this.annotationTab);
431
+ //further utils
432
+ btnToolbar.appendChild(this.soundGroup);
433
+ btnToolbar.appendChild(this.zoomGroup);
434
+ //btnToolbar.appendChild(this.midiSelectGroup)
435
+ btnToolbar.appendChild(this.fileSelectGroup);
436
+ }
437
+ createCustomToolbar() {
438
+ this.customToolbar = cq.getContainer(this.containerId).querySelector("#customToolbar");
439
+ //this.createInsertSelect()
440
+ this.createButtonsAnnotationMode();
441
+ this.createArticualtionButtons();
442
+ }
443
+ removeAllCustomGroups() {
444
+ Array.from(this.customToolbar.children).forEach(c => {
445
+ c.remove();
446
+ });
447
+ }
448
+ addElementsToBootstrap() {
449
+ //attach bootstrap functionality to Elements
450
+ Array.from(cq.getContainer(this.containerId).querySelectorAll(".dropdown-toggle")).forEach(dd => {
451
+ new bootstrap_1.Dropdown(dd);
452
+ });
453
+ Array.from(cq.getContainer(this.containerId).querySelectorAll(".collapsed")).forEach(c => {
454
+ new bootstrap_1.Collapse(c);
455
+ });
456
+ }
457
+ setListeners() {
458
+ cq.getContainer(this.containerId).querySelectorAll("#handlerGroup *").forEach(el => {
459
+ el.addEventListener("click", this.closeHandlerMouse);
460
+ });
461
+ // achtung: nie preventDefault in einem Document anwenden
462
+ document.addEventListener("keydown", this.closeHandlerKey);
463
+ //document.getElementsByClassName("vse-container")[0]?.addEventListener("click", this.closeHandlerMouse)
464
+ cq.getContainer(this.containerId).querySelectorAll("#dotGroup button, #noteGroup button, #modGroup button, #accidGroup Button").forEach(el => {
465
+ el.addEventListener("click", this.exclusiveSelectHandler);
466
+ });
467
+ cq.getContainer(this.containerId).querySelector("#toggleSidebar").addEventListener("click", this.sidebarHandler);
468
+ cq.getContainer(this.containerId).querySelectorAll(["#insertDropdown a", "." + tabFlag].join(",")).forEach(a => {
469
+ a.addEventListener("click", this.customToolbarHandler);
470
+ });
471
+ // Why do I have to control this manually???
472
+ cq.getContainer(this.containerId).querySelectorAll(".accordion-button").forEach(ac => {
473
+ ac.addEventListener("hidden.bs.collapse", () => {
474
+ ac.classList.add("show");
475
+ });
476
+ ac.addEventListener("hide.bs.collapse", () => {
477
+ ac.classList.add("show");
478
+ });
479
+ });
480
+ cq.getContainer(this.containerId).addEventListener("annotChanged", this.createAnnotListFunction, true);
481
+ //Markup/ XML FileSelection
482
+ cq.getContainer(this.containerId).querySelector("#importXMLBtn").addEventListener("click", function () {
483
+ var impF = this.parentElement.querySelector("#importXML");
484
+ impF.setAttribute("accept", [".musicxml", ".mei"].join(", "));
485
+ impF.click();
486
+ });
487
+ var that = this;
488
+ cq.getContainer(this.containerId).querySelector("#importXML").addEventListener("input", function (e) {
489
+ var fr = new FileReader();
490
+ fr.onload = function () {
491
+ that.importCallback("", fr.result, false, constants_1.constants._TARGETDIVID_).then(mei => {
492
+ var meiXml = meioperations.mergeSectionScoreDefToLayer(mei);
493
+ meiXml = meioperations.mergeArticToParent(meiXml);
494
+ that.importCallback("", meiXml, false, constants_1.constants._TARGETDIVID_);
495
+ that.align(null, null);
496
+ });
497
+ };
498
+ fr.readAsText(this.files[0]);
499
+ }, false);
500
+ /**
501
+ * Import Audio File for alignment
502
+ */
503
+ cq.getContainer(this.containerId).querySelector("#importAudioFileBtn").addEventListener("click", function () {
504
+ var impF = this.parentElement.querySelector("#importAudioFile");
505
+ impF.setAttribute("accept", [".mp3", ".wav"].join(", "));
506
+ impF.click();
507
+ });
508
+ cq.getContainer(this.containerId).querySelector("#importAudioFile").addEventListener("input", function (e) {
509
+ var fr = new FileReader();
510
+ fr.onload = function () {
511
+ var arrayBuffer = new Blob([fr.result]);
512
+ that.align(arrayBuffer, f);
513
+ };
514
+ var f = this.files[0];
515
+ fr.readAsArrayBuffer(f);
516
+ }, false);
517
+ /**
518
+ * Download settings
519
+ */
520
+ cq.getContainer(this.containerId).querySelector("#exportFileBtn").addEventListener("click", function () {
521
+ that.getMEICallback("").then(mei => {
522
+ var d = new Date();
523
+ var fileName = d.getUTCFullYear()
524
+ + ("0" + d.getDate()).slice(-2)
525
+ + ("0" + d.getMonth()).slice(-2)
526
+ + "_"
527
+ + ("0" + d.getHours()).slice(-2)
528
+ + ("0" + d.getMinutes()).slice(-2)
529
+ + ("0" + d.getSeconds()).slice(-2)
530
+ + "_"
531
+ + "vseScore_" + that.containerId + ".mei";
532
+ that.download(fileName, mei);
533
+ });
534
+ });
535
+ }
536
+ /**
537
+ * Call the alignCallback with parameters. Only when the audioBlob and audioFile are defined, an alignment can take place.
538
+ * This is called when either an audiofile or xml data is loaded. In the case of XML Data an audio file must be loaded prevously
539
+ * @param blob
540
+ * @param file
541
+ * @returns
542
+ */
543
+ align(blob, file) {
544
+ var _a;
545
+ this.audioBlob = blob;
546
+ this.audioFile = file;
547
+ if (!(this.audioFile && this.audioFile))
548
+ return;
549
+ this.alignCallback(this.audioBlob);
550
+ (_a = this.fileSelectGroup.querySelector("#audioSlider")) === null || _a === void 0 ? void 0 : _a.remove();
551
+ var audioSlider = dc.makeNewAudioSlider("audioSlider", "", URL.createObjectURL(this.audioFile));
552
+ this.fileSelectGroup.prepend(audioSlider);
553
+ // audioSlider event will be catched during bubble phase in MusicProcessor
554
+ }
555
+ download(file, text) {
556
+ //creating an invisible element
557
+ var element = document.createElement('a');
558
+ element.setAttribute('href', 'data:text/plain;charset=utf-8, '
559
+ + encodeURIComponent(text));
560
+ element.setAttribute('download', file);
561
+ document.body.appendChild(element);
562
+ element.click();
563
+ document.body.removeChild(element);
564
+ }
565
+ removeListeners() {
566
+ cq.getContainer(this.containerId).querySelectorAll("#handlerGroup *").forEach(el => {
567
+ el.removeEventListener("click", this.closeHandlerMouse);
568
+ });
569
+ document.removeEventListener("keydown", this.closeHandlerKey);
570
+ cq.getContainer(this.containerId).querySelectorAll(".btn-group-sm button").forEach(el => {
571
+ el.removeEventListener("click", this.exclusiveSelectHandler);
572
+ });
573
+ cq.getContainer(this.containerId).querySelector("#toggleSidebar").removeEventListener("click", this.sidebarHandler);
574
+ cq.getContainer(this.containerId).querySelectorAll(["#insertDropdown a", "." + tabFlag].join(",")).forEach(a => {
575
+ a.removeEventListener("click", this.customToolbarHandler);
576
+ });
577
+ cq.getContainer(this.containerId).removeEventListener("annotChanged", this.createAnnotListFunction);
578
+ interactjs_1.default("#annotList").unset();
579
+ }
580
+ closeDropdown(ddButton) {
581
+ if (ddButton.classList.contains("show")) {
582
+ ddButton.classList.remove("show");
583
+ ddButton.removeAttribute("data-popper-placement");
584
+ ddButton.setAttribute("aria-expanded", "false");
585
+ ddButton.nextElementSibling.classList.remove("show");
586
+ ddButton.nextElementSibling.removeAttribute("data-popper-placement");
587
+ }
588
+ }
589
+ resizeListListener(event) {
590
+ event.stopImmediatePropagation();
591
+ var target = event.target;
592
+ var y = (parseFloat(target.getAttribute('data-y')) || 0);
593
+ target.style.height = event.rect.height + 'px';
594
+ y += event.deltaRect.top;
595
+ target.style.transform = 'translate(0px,' + y + 'px)';
596
+ target.setAttribute('data-y', y.toString());
597
+ var sibling = target.previousElementSibling;
598
+ var sbb = sibling.getBoundingClientRect();
599
+ sbb.height = sbb.height + y;
600
+ }
601
+ exclusiveSelect(e) {
602
+ 1;
603
+ var target = e.target;
604
+ var tagname = "button";
605
+ if (target.tagName.toLowerCase() === tagname) {
606
+ Array.from(target.parentElement.children).forEach(btn => {
607
+ if (btn.tagName.toLowerCase() === tagname && btn !== target) {
608
+ btn.classList.remove(selectedFlag);
609
+ }
610
+ });
611
+ if (!target.classList.contains(selectedFlag)) {
612
+ target.classList.add(selectedFlag);
613
+ }
614
+ else if (["modGroup", "dotGroup", "chordGroupKM", "articGroup", "accidGroup"].some(id => id === target.parentElement.id) && target.classList.contains(selectedFlag)) {
615
+ target.classList.remove(selectedFlag);
616
+ }
617
+ }
618
+ }
619
+ clickInsertHandler() {
620
+ //this.customToolbar.appendChild(this.insertSelectGroup)
621
+ this.customToolbar.appendChild(this.noteButtonGroup);
622
+ this.customToolbar.appendChild(this.dotButtonGroup);
623
+ this.customToolbar.appendChild(this.accidButtonGroup);
624
+ this.customToolbar.append(this.articGroup);
625
+ this.customToolbar.appendChild(this.modButtonGroup);
626
+ }
627
+ keyModeHandler() {
628
+ //this.customToolbar.appendChild(this.insertSelectGroup)
629
+ this.customToolbar.appendChild(this.chordGroupKM);
630
+ this.customToolbar.appendChild(this.octaveGroupKM);
631
+ }
632
+ harmHandler() {
633
+ this.removeAllCustomGroups();
634
+ }
635
+ annotHandler() {
636
+ //this.removeAllCustomGroups()
637
+ this.customToolbar.append(this.annotGroupKM);
638
+ }
639
+ articulationHandler() {
640
+ this.customToolbar.append(this.articGroup);
641
+ }
642
+ /**
643
+ * Callback from Core, so that imported mei or musicxml can be loaded in the editor
644
+ * @param importCallback
645
+ */
646
+ setImportCallback(importCallback) {
647
+ this.importCallback = importCallback;
648
+ return this;
649
+ }
650
+ setAlignCallback(alignCallback) {
651
+ this.alignCallback = alignCallback;
652
+ return this;
653
+ }
654
+ setGetMEICallback(getMEICallback) {
655
+ this.getMEICallback = getMEICallback;
656
+ return this;
657
+ }
658
+ /**
659
+ * Set audio File and directly computes alignment
660
+ * @param file
661
+ * @returns
662
+ */
663
+ setAudioFile(file) {
664
+ this.audioFile = file;
665
+ var fr = new FileReader();
666
+ var that = this;
667
+ fr.readAsArrayBuffer(file);
668
+ fr.onload = function () {
669
+ var arrayBuffer = new Blob([fr.result]);
670
+ that.align(arrayBuffer, file);
671
+ };
672
+ return this;
673
+ }
674
+ }
675
+ exports.default = Tabbar;