solid-pianoroll 0.0.23 → 0.0.25

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 (54) hide show
  1. package/dist/{cjs/index.js → dev.cjs} +446 -426
  2. package/dist/dev.css +212 -0
  3. package/dist/dev.js +1330 -0
  4. package/dist/dev.jsx +1130 -0
  5. package/dist/index.cjs +1330 -0
  6. package/dist/index.css +212 -0
  7. package/dist/index.d.ts +105 -0
  8. package/dist/{esm/index.js → index.js} +450 -425
  9. package/dist/index.jsx +1130 -0
  10. package/package.json +43 -34
  11. package/dist/cjs/index.js.map +0 -1
  12. package/dist/esm/index.js.map +0 -1
  13. package/dist/source/PianoRoll.jsx +0 -78
  14. package/dist/source/PianoRollContext.jsx +0 -11
  15. package/dist/source/PianoRollGrid.jsx +0 -64
  16. package/dist/source/PianoRollKeys.jsx +0 -72
  17. package/dist/source/PianoRollNotes.jsx +0 -162
  18. package/dist/source/PianoRollNotesScroller.jsx +0 -16
  19. package/dist/source/PianoRollScale.jsx +0 -29
  20. package/dist/source/PianoRollScrollZoomViewPort.jsx +0 -49
  21. package/dist/source/PianoRollTrackList.jsx +0 -27
  22. package/dist/source/PianoRollTrackListScroller.jsx +0 -16
  23. package/dist/source/index.jsx +0 -5
  24. package/dist/source/types.js +0 -1
  25. package/dist/source/useBoundingClientRect.js +0 -29
  26. package/dist/source/useNotes.js +0 -23
  27. package/dist/source/usePianoRollGrid.js +0 -45
  28. package/dist/source/usePianoRollState.js +0 -106
  29. package/dist/source/viewport/PlayHead.jsx +0 -43
  30. package/dist/source/viewport/ScrollZoomContainer.jsx +0 -104
  31. package/dist/source/viewport/ScrollZoomViewPort.jsx +0 -31
  32. package/dist/source/viewport/ZoomSliderControl.jsx +0 -29
  33. package/dist/source/viewport/createViewPortDimension.js +0 -51
  34. package/dist/types/PianoRoll.d.ts +0 -9
  35. package/dist/types/PianoRollContext.d.ts +0 -122
  36. package/dist/types/PianoRollGrid.d.ts +0 -2
  37. package/dist/types/PianoRollKeys.d.ts +0 -9
  38. package/dist/types/PianoRollNotes.d.ts +0 -5
  39. package/dist/types/PianoRollNotesScroller.d.ts +0 -3
  40. package/dist/types/PianoRollScale.d.ts +0 -2
  41. package/dist/types/PianoRollScrollZoomViewPort.d.ts +0 -3
  42. package/dist/types/PianoRollTrackList.d.ts +0 -2
  43. package/dist/types/PianoRollTrackListScroller.d.ts +0 -3
  44. package/dist/types/index.d.ts +0 -5
  45. package/dist/types/types.d.ts +0 -6
  46. package/dist/types/useBoundingClientRect.d.ts +0 -3
  47. package/dist/types/useNotes.d.ts +0 -9
  48. package/dist/types/usePianoRollGrid.d.ts +0 -13
  49. package/dist/types/usePianoRollState.d.ts +0 -63
  50. package/dist/types/viewport/PlayHead.d.ts +0 -8
  51. package/dist/types/viewport/ScrollZoomContainer.d.ts +0 -8
  52. package/dist/types/viewport/ScrollZoomViewPort.d.ts +0 -39
  53. package/dist/types/viewport/ZoomSliderControl.d.ts +0 -6
  54. package/dist/types/viewport/createViewPortDimension.d.ts +0 -40
@@ -4,36 +4,12 @@ var web = require('solid-js/web');
4
4
  var solidJs = require('solid-js');
5
5
  var store = require('solid-js/store');
6
6
 
7
- function styleInject(css, ref) {
8
- if (ref === void 0) ref = {};
9
- var insertAt = ref.insertAt;
10
- if (!css || typeof document === 'undefined') {
11
- return;
12
- }
13
- var head = document.head || document.getElementsByTagName('head')[0];
14
- var style = document.createElement('style');
15
- style.type = 'text/css';
16
- if (insertAt === 'top') {
17
- if (head.firstChild) {
18
- head.insertBefore(style, head.firstChild);
19
- } else {
20
- head.appendChild(style);
21
- }
22
- } else {
23
- head.appendChild(style);
24
- }
25
- if (style.styleSheet) {
26
- style.styleSheet.cssText = css;
27
- } else {
28
- style.appendChild(document.createTextNode(css));
29
- }
30
- }
7
+ var __defProp = Object.defineProperty;
8
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
31
9
 
32
- var css_248z$6 = ".PianoRoll-module_PianoRoll__rkRYx {\n box-sizing: border-box;\n display: flex;\n overflow: hidden;\n flex-direction: column;\n height: 100%;\n user-select: none;\n}\n\n.PianoRoll-module_PianoRollContainer__Oyxr7 {\n overflow: hidden;\n height: 100%;\n display: flex;\n flex-direction: row;\n}\n\n.PianoRoll-module_PianoRollLeftColumn__S6SZQ {\n display: flex;\n overflow: hidden;\n flex-direction: column;\n max-width: 250px;\n margin-top: 30px;\n}\n.PianoRoll-module_PianoRollLeftColumn__S6SZQ.PianoRoll-module_showTrackList__mqsrT {\n width: 30%;\n margin-top: 0;\n}\n\n.PianoRoll-module_PianoRollRightColumn__V98HV {\n display: flex;\n position: relative;\n flex-direction: column;\n flex: 1;\n height: 100%;\n}\n";
33
- var styles$6 = {"PianoRoll":"PianoRoll-module_PianoRoll__rkRYx","PianoRollContainer":"PianoRoll-module_PianoRollContainer__Oyxr7","PianoRollLeftColumn":"PianoRoll-module_PianoRollLeftColumn__S6SZQ","showTrackList":"PianoRoll-module_showTrackList__mqsrT","PianoRollRightColumn":"PianoRoll-module_PianoRollRightColumn__V98HV"};
34
- styleInject(css_248z$6);
35
-
36
- const defaultState = {
10
+ // src/PianoRoll.module.css
11
+ var _default = {};
12
+ var defaultState = {
37
13
  ppq: 0,
38
14
  mode: "keys",
39
15
  position: 0,
@@ -42,61 +18,94 @@ const defaultState = {
42
18
  verticalPosition: 44,
43
19
  verticalTrackZoom: 0.5,
44
20
  verticalTrackPosition: 0,
21
+ playHeadPosition: 0,
45
22
  gridDivision: 4,
46
23
  snapToGrid: true,
47
24
  duration: 0,
48
25
  tracks: [],
49
26
  selectedTrackIndex: 0,
50
27
  pressedKeys: {},
51
- notesScrollerClientRect: {
52
- left: 0,
53
- width: 0,
54
- top: 0,
55
- height: 0
56
- },
57
- tracksScrollerClientRect: {
58
- left: 0,
59
- width: 0,
60
- top: 0,
61
- height: 0
62
- }
28
+ notesScrollerClientRect: { left: 0, width: 0, top: 0, height: 0 },
29
+ tracksScrollerClientRect: { left: 0, width: 0, top: 0, height: 0 }
63
30
  };
64
- const propNameToHandlerName = name => `on${name[0]?.toUpperCase()}${name.slice(1)}Change`;
65
- const pianoRollStatePropNames = [...Object.keys(defaultState), ...Object.keys(defaultState).map(propNameToHandlerName), "onNoteChange", "onInsertNote", "onRemoveNote", "onNoteDown", "onNoteUp", "isKeyDown"];
66
- const createPianoRollstate = initialState => {
31
+ var propNameToHandlerName = /* @__PURE__ */ __name((name) => `on${name[0]?.toUpperCase()}${name.slice(1)}Change`, "propNameToHandlerName");
32
+ var pianoRollStatePropNames = [
33
+ ...Object.keys(defaultState),
34
+ ...Object.keys(defaultState).map(propNameToHandlerName),
35
+ "onNoteChange",
36
+ "onInsertNote",
37
+ "onRemoveNote",
38
+ "onNoteDown",
39
+ "onNoteUp",
40
+ "isKeyDown",
41
+ "snapValueToGridIfEnabled"
42
+ ];
43
+ var createPianoRollstate = /* @__PURE__ */ __name((initialState) => {
67
44
  const [state, setState] = store.createStore({
68
45
  ...defaultState,
69
46
  ...initialState
70
47
  });
71
- const handlers = Object.fromEntries(Object.entries(state).map(entry => {
72
- return [propNameToHandlerName(entry[0]), value => setState(entry[0], value)];
73
- }));
74
- const updateNotes = async (trackIndex, getNotes) => {
48
+ const handlers = Object.fromEntries(
49
+ Object.entries(state).map((entry) => {
50
+ const handlerName = propNameToHandlerName(entry[0]);
51
+ return [
52
+ handlerName,
53
+ (value, originalEvent) => {
54
+ const handler = initialState?.[handlerName];
55
+ setState(entry[0], value);
56
+ if (handler) {
57
+ handler(value, originalEvent);
58
+ }
59
+ }
60
+ ];
61
+ })
62
+ );
63
+ const onPlayheadPositionChange = /* @__PURE__ */ __name((playheadPosition, originalEvent) => {
64
+ handlers.onPlayHeadPositionChange(
65
+ snapValueToGridIfEnabled(playheadPosition, !!originalEvent?.altKey)
66
+ );
67
+ }, "onPlayheadPositionChange");
68
+ const updateNotes = /* @__PURE__ */ __name(async (trackIndex, getNotes) => {
75
69
  const track = state.tracks[trackIndex];
76
- if (!track) return;
70
+ if (!track)
71
+ return;
77
72
  const notes = track.notes;
78
- handlers.onTracksChange([...state.tracks.slice(0, trackIndex), {
79
- ...track,
80
- notes: getNotes(notes)
81
- }, ...state.tracks.slice(trackIndex + 1)]);
82
- };
83
- const onNoteChange = (trackIndex, noteIndex, note) => {
84
- updateNotes(trackIndex, notes => [...notes.slice(0, noteIndex), note, ...notes.slice(noteIndex + 1)]);
85
- };
86
- const onInsertNote = (trackIndex, note) => {
73
+ handlers.onTracksChange([
74
+ ...state.tracks.slice(0, trackIndex),
75
+ { ...track, notes: getNotes(notes) },
76
+ ...state.tracks.slice(trackIndex + 1)
77
+ ]);
78
+ }, "updateNotes");
79
+ const onNoteChange = /* @__PURE__ */ __name((trackIndex, noteIndex, note) => {
80
+ updateNotes(trackIndex, (notes) => [
81
+ ...notes.slice(0, noteIndex),
82
+ note,
83
+ ...notes.slice(noteIndex + 1)
84
+ ]);
85
+ }, "onNoteChange");
86
+ const onInsertNote = /* @__PURE__ */ __name((trackIndex, note) => {
87
87
  const track = state.tracks[trackIndex];
88
- if (!track) return -1;
88
+ if (!track)
89
+ return -1;
89
90
  const notes = track.notes;
90
- const newNoteIndex = Math.max(notes.findIndex(({
91
- ticks
92
- }) => ticks > note.ticks), 0);
93
- updateNotes(trackIndex, notes => [...notes.slice(0, newNoteIndex), note, ...notes.slice(newNoteIndex)]);
91
+ const newNoteIndex = Math.max(
92
+ notes.findIndex(({ ticks }) => ticks > note.ticks),
93
+ 0
94
+ );
95
+ updateNotes(trackIndex, (notes2) => [
96
+ ...notes2.slice(0, newNoteIndex),
97
+ note,
98
+ ...notes2.slice(newNoteIndex)
99
+ ]);
94
100
  return newNoteIndex;
95
- };
96
- const onRemoveNote = (trackIndex, noteIndex) => {
97
- updateNotes(trackIndex, notes => [...notes.slice(0, noteIndex), ...notes.slice(noteIndex + 1)]);
98
- };
99
- const updateKeyPressedState = (trackIndex, keyNumber, value) => {
101
+ }, "onInsertNote");
102
+ const onRemoveNote = /* @__PURE__ */ __name((trackIndex, noteIndex) => {
103
+ updateNotes(trackIndex, (notes) => [
104
+ ...notes.slice(0, noteIndex),
105
+ ...notes.slice(noteIndex + 1)
106
+ ]);
107
+ }, "onRemoveNote");
108
+ const updateKeyPressedState = /* @__PURE__ */ __name((trackIndex, keyNumber, value) => {
100
109
  handlers.onPressedKeysChange?.({
101
110
  ...state.pressedKeys,
102
111
  [trackIndex]: {
@@ -104,14 +113,18 @@ const createPianoRollstate = initialState => {
104
113
  [keyNumber]: value
105
114
  }
106
115
  });
107
- };
108
- const onNoteDown = (trackIndex, keyNumber) => {
116
+ }, "updateKeyPressedState");
117
+ const onNoteDown = /* @__PURE__ */ __name((trackIndex, keyNumber) => {
109
118
  updateKeyPressedState(trackIndex, keyNumber, true);
110
- };
111
- const onNoteUp = (trackIndex, keyNumber) => {
119
+ }, "onNoteDown");
120
+ const onNoteUp = /* @__PURE__ */ __name((trackIndex, keyNumber) => {
112
121
  updateKeyPressedState(trackIndex, keyNumber, false);
113
- };
114
- const isKeyDown = (trackIndex, keyNumber) => !!state.pressedKeys[trackIndex]?.[keyNumber];
122
+ }, "onNoteUp");
123
+ const isKeyDown = /* @__PURE__ */ __name((trackIndex, keyNumber) => !!state.pressedKeys[trackIndex]?.[keyNumber], "isKeyDown");
124
+ const snapValueToGridIfEnabled = /* @__PURE__ */ __name((value, altKey) => {
125
+ const gridDivisionTicks = state.ppq * 4 / state.gridDivision;
126
+ return state.snapToGrid && !altKey ? Math.round(value / gridDivisionTicks) * gridDivisionTicks : value;
127
+ }, "snapValueToGridIfEnabled");
115
128
  return solidJs.mergeProps(state, {
116
129
  ...handlers,
117
130
  onNoteChange,
@@ -119,30 +132,33 @@ const createPianoRollstate = initialState => {
119
132
  onRemoveNote,
120
133
  onNoteDown,
121
134
  onNoteUp,
122
- isKeyDown
135
+ isKeyDown,
136
+ snapValueToGridIfEnabled,
137
+ onPlayheadPositionChange
123
138
  });
124
- };
139
+ }, "createPianoRollstate");
140
+ exports.createPianoRollstate = createPianoRollstate;
125
141
 
126
- const PianoRollContext = solidJs.createContext();
127
- const PianoRollContextProvider = PianoRollContext.Provider;
128
- const usePianoRollContext = () => {
142
+ // src/PianoRollContext.tsx
143
+ var PianoRollContext = solidJs.createContext();
144
+ var PianoRollContextProvider = PianoRollContext.Provider;
145
+ var usePianoRollContext = /* @__PURE__ */ __name(() => {
129
146
  const context = solidJs.useContext(PianoRollContext);
130
- if (!context) throw new Error("No PianoRollContext found");
147
+ if (!context)
148
+ throw new Error("No PianoRollContext found");
131
149
  return context;
132
- };
133
- const splitContextProps = allProps => solidJs.splitProps(allProps, [...pianoRollStatePropNames, "showAllTracks", "showTrackList"]);
134
-
135
- var css_248z$5 = ".PianoRollKeys-module_PianoRollKeys__5vnQ0 {\n position: relative;\n height: 100%;\n border-width: 0;\n border-color: #000;\n border-style: solid;\n border-right-width: 1px;\n border-left-width: 1px;\n background: white;\n cursor: pointer;\n}\n\n.PianoRollKeys-module_Key__jybNC {\n transition-property: background-color, box-shadow;\n transition-duration: 200ms;\n transition-timing-function: ease-out;\n border-width: 0px;\n position: absolute;\n box-sizing: border-box;\n width: 120%;\n left: -20%;\n border-color: #000;\n border-style: solid;\n transform: rotateX(0deg);\n perspective: 100px;\n}\n\n.PianoRollKeys-module_black__7rncB {\n background: black;\n border-top-right-radius: 12%;\n border-bottom-right-radius: 12%;\n margin-left: -20%;\n z-index: 1;\n border: 1px black outset;\n}\n\n.PianoRollKeys-module_white__fR2Lm {\n background: white;\n border-top-width: 0.5px;\n border-bottom-width: 0.5px;\n border-top-right-radius: 4%;\n border-bottom-right-radius: 4%;\n}\n\n.PianoRollKeys-module_down__GcNeZ {\n transition: none;\n background: red;\n transform: rotateX(0deg) rotateY(20deg);\n}\n";
136
- var styles$5 = {"PianoRollKeys":"PianoRollKeys-module_PianoRollKeys__5vnQ0","Key":"PianoRollKeys-module_Key__jybNC","black":"PianoRollKeys-module_black__7rncB","white":"PianoRollKeys-module_white__fR2Lm","down":"PianoRollKeys-module_down__GcNeZ"};
137
- styleInject(css_248z$5);
150
+ }, "usePianoRollContext");
151
+ var splitContextProps = /* @__PURE__ */ __name((allProps) => solidJs.splitProps(allProps, [...pianoRollStatePropNames, "showAllTracks", "showTrackList"]), "splitContextProps");
138
152
 
153
+ // src/PianoRollKeys.module.css
154
+ var _default2 = {};
139
155
  function createViewPortDimension(getState) {
140
- const getStateWithFunctions = () => {
141
- const state = getState();
142
- const onZoomChange = zoom => state.onZoomChange?.(clamp(zoom, state.minZoom, state.maxZoom));
143
- const onPositionChange = position => state.onPositionChange?.(position);
156
+ const getStateWithFunctions = /* @__PURE__ */ __name(() => {
157
+ const state2 = getState();
158
+ const onZoomChange = /* @__PURE__ */ __name((zoom) => state2.onZoomChange?.(clamp(zoom, state2.minZoom, state2.maxZoom)), "onZoomChange");
159
+ const onPositionChange = /* @__PURE__ */ __name((position) => state2.onPositionChange?.(position), "onPositionChange");
144
160
  return {
145
- ...state,
161
+ ...state2,
146
162
  onZoomChange,
147
163
  onPositionChange,
148
164
  calculatePixelOffset,
@@ -153,46 +169,49 @@ function createViewPortDimension(getState) {
153
169
  calculateMaxPosition,
154
170
  isVisible
155
171
  };
156
- };
172
+ }, "getStateWithFunctions");
157
173
  const [state, setState] = store.createStore(getStateWithFunctions());
158
174
  solidJs.createEffect(() => setState(getStateWithFunctions()));
159
175
  function calculatePixelValue(position = state.position) {
160
176
  const virtualSize = state.pixelSize * state.zoom;
161
177
  return position / state.range * virtualSize;
162
178
  }
179
+ __name(calculatePixelValue, "calculatePixelValue");
163
180
  function calculatePixelOffset(position) {
164
181
  return calculatePixelValue(position) - calculatePixelValue(state.position);
165
182
  }
183
+ __name(calculatePixelOffset, "calculatePixelOffset");
166
184
  function calculatePosition(offset) {
167
185
  const percentX = (offset - state.pixelOffset) / state.pixelSize;
168
186
  const position = state.position + percentX * calculateVisibleRange();
169
187
  return position;
170
188
  }
189
+ __name(calculatePosition, "calculatePosition");
171
190
  function calculateVisibleRange() {
172
191
  return state.range / state.zoom;
173
192
  }
193
+ __name(calculateVisibleRange, "calculateVisibleRange");
174
194
  function calculateMaxPosition() {
175
195
  return state.range - state.range / state.zoom;
176
196
  }
197
+ __name(calculateMaxPosition, "calculateMaxPosition");
177
198
  function calculatePixelDimensions(position, length) {
178
199
  const offset = calculatePixelOffset(position);
179
200
  const size = calculatePixelValue(length);
180
- return {
181
- offset,
182
- size
183
- };
201
+ return { offset, size };
184
202
  }
185
- function isVisible({
186
- offset,
187
- size
188
- }) {
203
+ __name(calculatePixelDimensions, "calculatePixelDimensions");
204
+ function isVisible({ offset, size }) {
189
205
  return offset + size > 0 && offset < state.pixelSize;
190
206
  }
207
+ __name(isVisible, "isVisible");
191
208
  return state;
192
209
  }
193
- const clamp = (value, min, max) => Math.max(min, Math.min(max, value));
210
+ __name(createViewPortDimension, "createViewPortDimension");
211
+ var clamp = /* @__PURE__ */ __name((value, min, max) => Math.max(min, Math.min(max, value)), "clamp");
194
212
 
195
- const defaultViewPortProps = {
213
+ // src/viewport/ScrollZoomViewPort.tsx
214
+ var defaultViewPortProps = {
196
215
  pixelOffset: 0,
197
216
  position: 0,
198
217
  range: 1,
@@ -200,9 +219,9 @@ const defaultViewPortProps = {
200
219
  minZoom: 1,
201
220
  maxZoom: Infinity
202
221
  };
203
- const ScrollZoomViewPort = props => {
222
+ var ScrollZoomViewPort = /* @__PURE__ */ __name((props) => {
204
223
  const viewPorts = Object.entries(props.dimensions).map(([name, viewPortProps]) => createViewPortDimension(() => ({
205
- name: name,
224
+ name,
206
225
  ...defaultViewPortProps,
207
226
  ...viewPortProps()
208
227
  })));
@@ -215,21 +234,22 @@ const ScrollZoomViewPort = props => {
215
234
  return props.children;
216
235
  }
217
236
  });
218
- };
219
- const ScrollZoomViewPortContext = solidJs.createContext([]);
220
- const useViewPortDimension = name => {
237
+ }, "ScrollZoomViewPort");
238
+ var ScrollZoomViewPortContext = solidJs.createContext([]);
239
+ var useViewPortDimension = /* @__PURE__ */ __name((name) => {
221
240
  const viewPorts = solidJs.useContext(ScrollZoomViewPortContext);
222
- const viewPort = name ? viewPorts.find(viewPort => viewPort.name === name) : viewPorts[viewPorts.length - 1];
223
- if (!viewPort) throw new Error(`ViewPort dimension "${name}" not found.`);
241
+ const viewPort = name ? viewPorts.find((viewPort2) => viewPort2.name === name) : viewPorts[viewPorts.length - 1];
242
+ if (!viewPort)
243
+ throw new Error(`ViewPort dimension "${name}" not found.`);
224
244
  return viewPort;
225
- };
245
+ }, "useViewPortDimension");
226
246
 
227
- var css_248z$4 = ".ScrollZoomContainer-module_ScrollZoomContainer__o2bRt {\n height: 100%;\n width: 100%;\n z-index: 4;\n}\n";
228
- var styles$4 = {"ScrollZoomContainer":"ScrollZoomContainer-module_ScrollZoomContainer__o2bRt"};
229
- styleInject(css_248z$4);
247
+ // src/viewport/ScrollZoomContainer.module.css
248
+ var _default3 = {};
230
249
 
231
- const _tmpl$$8 = /*#__PURE__*/web.template(`<div><div><div><div></div></div></div></div>`, 8);
232
- const ScrollZoomContainer = props => {
250
+ // src/viewport/ScrollZoomContainer.tsx
251
+ var _tmpl$ = /* @__PURE__ */ web.template(`<div><div><div><div></div></div></div></div>`, 8);
252
+ var ScrollZoomContainer = /* @__PURE__ */ __name((props) => {
233
253
  let scrollContentRef;
234
254
  const [ownProps, divProps] = solidJs.splitProps(props, ["ref", "verticalDimensionName", "horizontalDimensionName", "showScrollbar"]);
235
255
  const propsWithDefaults = solidJs.mergeProps({
@@ -239,7 +259,7 @@ const ScrollZoomContainer = props => {
239
259
  }, ownProps);
240
260
  const verticalViewPort = solidJs.createMemo(() => useViewPortDimension(propsWithDefaults.verticalDimensionName));
241
261
  const horizontalViewPort = solidJs.createMemo(() => useViewPortDimension(propsWithDefaults.horizontalDimensionName));
242
- const handleScroll = event => {
262
+ const handleScroll = /* @__PURE__ */ __name((event) => {
243
263
  event.preventDefault();
244
264
  if (didUpdateScroll) {
245
265
  didUpdateScroll = false;
@@ -259,8 +279,8 @@ const ScrollZoomContainer = props => {
259
279
  const scrollLeftAmount = scrollLeft / (scrollWidth - width);
260
280
  verticalViewPort().onPositionChange?.(maxVerticalPosition * scrollTopAmount);
261
281
  horizontalViewPort().onPositionChange?.(maxPosition * scrollLeftAmount);
262
- };
263
- const handleWheel = event => {
282
+ }, "handleScroll");
283
+ const handleWheel = /* @__PURE__ */ __name((event) => {
264
284
  if (event.altKey) {
265
285
  event.preventDefault();
266
286
  if (Math.abs(event.deltaX) > Math.abs(event.deltaY)) {
@@ -277,7 +297,7 @@ const ScrollZoomContainer = props => {
277
297
  event.currentTarget.scrollLeft += event.deltaX;
278
298
  event.currentTarget.scrollTop += event.deltaY;
279
299
  }
280
- };
300
+ }, "handleWheel");
281
301
  let didUpdateScroll = false;
282
302
  solidJs.createEffect(() => {
283
303
  const maxVerticalPosition = verticalViewPort().calculateMaxPosition();
@@ -286,7 +306,8 @@ const ScrollZoomContainer = props => {
286
306
  const scrollLeftAmount = maxPosition > 0 ? horizontalViewPort().position / maxPosition : 0;
287
307
  const height = verticalViewPort().pixelSize;
288
308
  const width = horizontalViewPort().pixelSize;
289
- if (!scrollContentRef?.parentElement) return;
309
+ if (!scrollContentRef?.parentElement)
310
+ return;
290
311
  const scrollDivHeight = verticalViewPort().zoom * verticalViewPort().pixelSize;
291
312
  const scrollTop = scrollTopAmount * (scrollDivHeight - height);
292
313
  const scrollDivWidth = horizontalViewPort().zoom * horizontalViewPort().pixelSize;
@@ -300,10 +321,7 @@ const ScrollZoomContainer = props => {
300
321
  });
301
322
  });
302
323
  return (() => {
303
- const _el$ = _tmpl$$8.cloneNode(true),
304
- _el$2 = _el$.firstChild,
305
- _el$3 = _el$2.firstChild,
306
- _el$4 = _el$3.firstChild;
324
+ const _el$ = _tmpl$.cloneNode(true), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild;
307
325
  _el$.addEventListener("wheel", handleWheel);
308
326
  _el$.addEventListener("scroll", handleScroll);
309
327
  const _ref$ = props.ref;
@@ -312,12 +330,12 @@ const ScrollZoomContainer = props => {
312
330
  get style() {
313
331
  return {
314
332
  overflow: propsWithDefaults.showScrollbar ? "scroll" : "hidden",
315
- ...(typeof divProps.style === "object" && divProps.style)
333
+ ...typeof divProps.style === "object" && divProps.style
316
334
  };
317
335
  },
318
336
  get classList() {
319
337
  return {
320
- [styles$4.ScrollZoomContainer]: true,
338
+ [_default3.ScrollZoomContainer]: true,
321
339
  ...divProps.classList
322
340
  };
323
341
  }
@@ -330,35 +348,34 @@ const ScrollZoomContainer = props => {
330
348
  _el$3.style.setProperty("display", "flex");
331
349
  _el$4.style.setProperty("position", "relative");
332
350
  web.insert(_el$4, () => props.children);
333
- web.effect(_p$ => {
334
- const _v$ = `${verticalViewPort().pixelSize}px`,
335
- _v$2 = `${horizontalViewPort().pixelSize}px`,
336
- _v$3 = `${verticalViewPort().pixelSize}px`,
337
- _v$4 = `${horizontalViewPort().pixelSize}px`;
351
+ web.effect((_p$) => {
352
+ const _v$ = `${verticalViewPort().pixelSize}px`, _v$2 = `${horizontalViewPort().pixelSize}px`, _v$3 = `${verticalViewPort().pixelSize}px`, _v$4 = `${horizontalViewPort().pixelSize}px`;
338
353
  _v$ !== _p$._v$ && _el$3.style.setProperty("height", _p$._v$ = _v$);
339
354
  _v$2 !== _p$._v$2 && _el$3.style.setProperty("width", _p$._v$2 = _v$2);
340
355
  _v$3 !== _p$._v$3 && _el$4.style.setProperty("height", _p$._v$3 = _v$3);
341
356
  _v$4 !== _p$._v$4 && _el$4.style.setProperty("width", _p$._v$4 = _v$4);
342
357
  return _p$;
343
358
  }, {
344
- _v$: undefined,
345
- _v$2: undefined,
346
- _v$3: undefined,
347
- _v$4: undefined
359
+ _v$: void 0,
360
+ _v$2: void 0,
361
+ _v$3: void 0,
362
+ _v$4: void 0
348
363
  });
349
364
  return _el$;
350
365
  })();
351
- };
366
+ }, "ScrollZoomContainer");
367
+ var ScrollZoomContainer_default = ScrollZoomContainer;
352
368
 
353
- const _tmpl$$7 = /*#__PURE__*/web.template(`<div></div>`, 2);
354
- const PianoRollKeys = () => {
369
+ // src/PianoRollKeys.tsx
370
+ var _tmpl$2 = /* @__PURE__ */ web.template(`<div></div>`, 2);
371
+ var PianoRollKeys = /* @__PURE__ */ __name(() => {
355
372
  const verticalViewPort = solidJs.createMemo(() => useViewPortDimension("vertical"));
356
373
  const horizontalViewPort = solidJs.createMemo(() => useViewPortDimension("horizontalKeys"));
357
374
  const [isMouseDown, setIsMouseDown] = solidJs.createSignal(false);
358
375
  const context = usePianoRollContext();
359
- const handleMouseUp = () => {
376
+ const handleMouseUp = /* @__PURE__ */ __name(() => {
360
377
  setIsMouseDown(false);
361
- };
378
+ }, "handleMouseUp");
362
379
  solidJs.createEffect(() => {
363
380
  if (isMouseDown()) {
364
381
  window.addEventListener("mouseup", handleMouseUp);
@@ -367,14 +384,14 @@ const PianoRollKeys = () => {
367
384
  }
368
385
  });
369
386
  return (() => {
370
- const _el$ = _tmpl$$7.cloneNode(true);
371
- web.insert(_el$, web.createComponent(ScrollZoomContainer, {
387
+ const _el$ = _tmpl$2.cloneNode(true);
388
+ web.insert(_el$, web.createComponent(ScrollZoomContainer_default, {
372
389
  horizontalDimensionName: "horizontalKeys",
373
390
  showScrollbar: false,
374
391
  get children() {
375
392
  return web.createComponent(solidJs.Index, {
376
393
  each: keys,
377
- children: key => {
394
+ children: (key) => {
378
395
  const isDown = solidJs.createMemo(() => context.isKeyDown(context.selectedTrackIndex, key().number));
379
396
  const virtualDimensions = solidJs.createMemo(() => verticalViewPort().calculatePixelDimensions(127 - key().number, 1));
380
397
  const previousIsBlack = blackKeys.includes((key().number - 1) % 12);
@@ -384,7 +401,7 @@ const PianoRollKeys = () => {
384
401
  return verticalViewPort().isVisible(virtualDimensions());
385
402
  },
386
403
  get children() {
387
- const _el$2 = _tmpl$$7.cloneNode(true);
404
+ const _el$2 = _tmpl$2.cloneNode(true);
388
405
  _el$2.addEventListener("mouseleave", () => {
389
406
  if (isMouseDown()) {
390
407
  context.onNoteUp(context.selectedTrackIndex, key().number);
@@ -402,18 +419,13 @@ const PianoRollKeys = () => {
402
419
  setIsMouseDown(true);
403
420
  context.onNoteDown(context.selectedTrackIndex, key().number);
404
421
  };
405
- web.effect(_p$ => {
422
+ web.effect((_p$) => {
406
423
  const _v$3 = {
407
- [styles$5["Key"]]: true,
408
- [styles$5["black"]]: key().isBlack,
409
- [styles$5["white"]]: !key().isBlack,
410
- [styles$5["down"]]: isDown()
411
- },
412
- _v$4 = key().name,
413
- _v$5 = key().number % 12,
414
- _v$6 = `${virtualDimensions().offset - virtualDimensions().size * (!key().isBlack ? nextIsBlack ? 1 / 2 : 0 : 0)}px`,
415
- _v$7 = `${virtualDimensions().size + (!key().isBlack && nextIsBlack ? virtualDimensions().size / 2 : 0) + (!key().isBlack && previousIsBlack ? virtualDimensions().size / 2 : 0)}px`,
416
- _v$8 = `0px 0px ${Math.min(virtualDimensions().size / 20, 1)}px ${Math.min(virtualDimensions().size / 50, 1)}px rgba(0, 0, 0, 0.5) ${key().isBlack ? "" : "inset"}` + isDown() ? `0px 0px ${Math.min(virtualDimensions().size / 8, 2)}px ${Math.min(virtualDimensions().size / 20, 2)}px rgba(0, 0, 0, 0.5) inset` : "";
424
+ [_default2["Key"]]: true,
425
+ [_default2["black"]]: key().isBlack,
426
+ [_default2["white"]]: !key().isBlack,
427
+ [_default2["down"]]: isDown()
428
+ }, _v$4 = key().name, _v$5 = key().number % 12, _v$6 = `${virtualDimensions().offset - virtualDimensions().size * (!key().isBlack ? nextIsBlack ? 1 / 2 : 0 : 0)}px`, _v$7 = `${virtualDimensions().size + (!key().isBlack && nextIsBlack ? virtualDimensions().size / 2 : 0) + (!key().isBlack && previousIsBlack ? virtualDimensions().size / 2 : 0)}px`, _v$8 = `0px 0px ${Math.min(virtualDimensions().size / 20, 1)}px ${Math.min(virtualDimensions().size / 50, 1)}px rgba(0, 0, 0, 0.5) ${key().isBlack ? "" : "inset"}` + isDown() ? `0px 0px ${Math.min(virtualDimensions().size / 8, 2)}px ${Math.min(virtualDimensions().size / 20, 2)}px rgba(0, 0, 0, 0.5) inset` : "";
417
429
  _p$._v$3 = web.classList(_el$2, _v$3, _p$._v$3);
418
430
  _v$4 !== _p$._v$4 && web.setAttribute(_el$2, "title", _p$._v$4 = _v$4);
419
431
  _v$5 !== _p$._v$5 && web.setAttribute(_el$2, "data-index", _p$._v$5 = _v$5);
@@ -422,12 +434,12 @@ const PianoRollKeys = () => {
422
434
  _v$8 !== _p$._v$8 && _el$2.style.setProperty("box-shadow", _p$._v$8 = _v$8);
423
435
  return _p$;
424
436
  }, {
425
- _v$3: undefined,
426
- _v$4: undefined,
427
- _v$5: undefined,
428
- _v$6: undefined,
429
- _v$7: undefined,
430
- _v$8: undefined
437
+ _v$3: void 0,
438
+ _v$4: void 0,
439
+ _v$5: void 0,
440
+ _v$6: void 0,
441
+ _v$7: void 0,
442
+ _v$8: void 0
431
443
  });
432
444
  return _el$2;
433
445
  }
@@ -436,36 +448,36 @@ const PianoRollKeys = () => {
436
448
  });
437
449
  }
438
450
  }));
439
- web.effect(_p$ => {
440
- const _v$ = styles$5.PianoRollKeys,
441
- _v$2 = `${horizontalViewPort().pixelSize}px`;
451
+ web.effect((_p$) => {
452
+ const _v$ = _default2.PianoRollKeys, _v$2 = `${horizontalViewPort().pixelSize}px`;
442
453
  _v$ !== _p$._v$ && web.className(_el$, _p$._v$ = _v$);
443
454
  _v$2 !== _p$._v$2 && _el$.style.setProperty("width", _p$._v$2 = _v$2);
444
455
  return _p$;
445
456
  }, {
446
- _v$: undefined,
447
- _v$2: undefined
457
+ _v$: void 0,
458
+ _v$2: void 0
448
459
  });
449
460
  return _el$;
450
461
  })();
451
- };
452
- const blackKeys = [1, 3, 6, 8, 10];
453
- const keyNames = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];
454
- const keys = Array.from({
462
+ }, "PianoRollKeys");
463
+ var blackKeys = [1, 3, 6, 8, 10];
464
+ var keyNames = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];
465
+ var keys = Array.from({
455
466
  length: 128
456
467
  }).map((_, index) => ({
457
468
  number: index,
458
469
  name: `${keyNames[index % 12]} ${Math.floor(index / 12) - 2}`,
459
470
  isBlack: blackKeys.includes(index % 12)
460
471
  }));
472
+ var PianoRollKeys_default = PianoRollKeys;
461
473
  web.delegateEvents(["mousedown", "mouseup"]);
462
474
 
463
- var css_248z$3 = ".PianoRollNotes-module_PianoRollNotes__6pF-y {\n position: absolute;\n flex: 1;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 1;\n cursor: grab;\n}\n.PianoRollNotes-module_PianoRollNotes__6pF-y .PianoRollNotes-module_Note__-jxLb {\n position: absolute;\n box-sizing: border-box;\n border-width: 0.5px;\n border-style: solid;\n border-color: #a00;\n cursor: move;\n}\n.PianoRollNotes-module_PianoRollNotes__6pF-y .PianoRollNotes-module_Note__-jxLb.PianoRollNotes-module_trimStart__vuBlj {\n cursor: w-resize;\n}\n.PianoRollNotes-module_PianoRollNotes__6pF-y .PianoRollNotes-module_Note__-jxLb.PianoRollNotes-module_trimEnd__zPdjr {\n cursor: e-resize;\n}";
464
- var styles$3 = {"PianoRollNotes":"PianoRollNotes-module_PianoRollNotes__6pF-y","Note":"PianoRollNotes-module_Note__-jxLb","trimStart":"PianoRollNotes-module_trimStart__vuBlj","trimEnd":"PianoRollNotes-module_trimEnd__zPdjr"};
465
- styleInject(css_248z$3);
475
+ // src/PianoRollNotes.module.css
476
+ var _default4 = {};
466
477
 
467
- const _tmpl$$6 = /*#__PURE__*/web.template(`<div></div>`, 2);
468
- const PianoRollNotes = props => {
478
+ // src/PianoRollNotes.tsx
479
+ var _tmpl$3 = /* @__PURE__ */ web.template(`<div></div>`, 2);
480
+ var PianoRollNotes = /* @__PURE__ */ __name((props) => {
469
481
  const context = usePianoRollContext();
470
482
  const verticalViewPort = solidJs.createMemo(() => useViewPortDimension(context.mode === "keys" ? "vertical" : "verticalTracks"));
471
483
  const horizontalViewPort = solidJs.createMemo(() => useViewPortDimension("horizontal"));
@@ -476,8 +488,7 @@ const PianoRollNotes = props => {
476
488
  const [currentNoteTrackIndex, setCurrentNoteTrackIndex] = solidJs.createSignal(-1);
477
489
  const [diffPosition, setDiffPosition] = solidJs.createSignal(0);
478
490
  const [getInitialNote, setInitialNote] = solidJs.createSignal();
479
- const snapValueToGridIfEnabled = (value, altKey) => context.snapToGrid && !altKey ? Math.round(value / gridDivisionTicks()) * gridDivisionTicks() : value;
480
- const calculateNoteDragValues = event => {
491
+ const calculateNoteDragValues = /* @__PURE__ */ __name((event) => {
481
492
  const targetTrackIndex = context.mode === "tracks" ? clamp(Math.floor(verticalViewPort().calculatePosition(event.clientY)), 0, context.tracks.length - 1) : currentNoteTrackIndex() > -1 ? currentNoteTrackIndex() : context.selectedTrackIndex;
482
493
  const midi = context.mode === "keys" ? Math.floor(128 - verticalViewPort().calculatePosition(event.clientY)) : getInitialNote()?.midi ?? 60;
483
494
  const horiontalPosition = horizontalViewPort().calculatePosition(event.clientX);
@@ -486,32 +497,33 @@ const PianoRollNotes = props => {
486
497
  midi,
487
498
  horiontalPosition
488
499
  };
489
- };
490
- const handleMouseMove = mouseMoveEvent => {
500
+ }, "calculateNoteDragValues");
501
+ const handleMouseMove = /* @__PURE__ */ __name((mouseMoveEvent) => {
491
502
  mouseMoveEvent.preventDefault();
492
503
  mouseMoveEvent.stopPropagation();
493
504
  const note = getInitialNote();
494
- if (!note) return;
505
+ if (!note)
506
+ return;
495
507
  const {
496
508
  targetTrackIndex,
497
509
  midi,
498
510
  horiontalPosition
499
511
  } = calculateNoteDragValues(mouseMoveEvent);
500
- const ticks = snapValueToGridIfEnabled(horiontalPosition - diffPosition(), mouseMoveEvent.altKey);
512
+ const ticks = context.snapValueToGridIfEnabled(horiontalPosition - diffPosition(), mouseMoveEvent.altKey);
501
513
  const updatedNote = {
502
514
  ...note,
503
515
  midi,
504
- ...(noteDragMode() === "move" && {
516
+ ...noteDragMode() === "move" && {
505
517
  ticks
506
- }),
507
- ...(noteDragMode() === "trimStart" && {
518
+ },
519
+ ...noteDragMode() === "trimStart" && {
508
520
  ticks: ticks < note.ticks + note.durationTicks ? ticks : note.ticks + note.durationTicks,
509
- durationTicks: ticks < note.ticks + note.durationTicks ? note.ticks + note.durationTicks - ticks : snapValueToGridIfEnabled(horiontalPosition - note.ticks, mouseMoveEvent.altKey)
510
- }),
511
- ...(noteDragMode() === "trimEnd" && {
521
+ durationTicks: ticks < note.ticks + note.durationTicks ? note.ticks + note.durationTicks - ticks : context.snapValueToGridIfEnabled(horiontalPosition - note.ticks, mouseMoveEvent.altKey)
522
+ },
523
+ ...noteDragMode() === "trimEnd" && {
512
524
  ticks: ticks < note.ticks ? ticks : note.ticks,
513
- durationTicks: ticks < note.ticks ? note.ticks - ticks : snapValueToGridIfEnabled(horiontalPosition - note.ticks, mouseMoveEvent.altKey)
514
- })
525
+ durationTicks: ticks < note.ticks ? note.ticks - ticks : context.snapValueToGridIfEnabled(horiontalPosition - note.ticks, mouseMoveEvent.altKey)
526
+ }
515
527
  };
516
528
  const previousTrackIndex = currentNoteTrackIndex();
517
529
  const previousNoteIndex = currentNoteIndex();
@@ -525,24 +537,24 @@ const PianoRollNotes = props => {
525
537
  setCurrentNoteIndex(newNoteIndex);
526
538
  }
527
539
  }
528
- };
529
- const stopDragging = () => {
540
+ }, "handleMouseMove");
541
+ const stopDragging = /* @__PURE__ */ __name(() => {
530
542
  window.removeEventListener("mousemove", handleMouseMove);
531
543
  window.removeEventListener("mouseup", stopDragging);
532
544
  setIsDragging(false);
533
545
  setCurrentNoteIndex(-1);
534
546
  setCurrentNoteTrackIndex(-1);
535
- };
536
- const startDragging = () => {
547
+ }, "stopDragging");
548
+ const startDragging = /* @__PURE__ */ __name(() => {
537
549
  window.addEventListener("mousemove", handleMouseMove);
538
550
  window.addEventListener("mouseup", stopDragging);
539
- };
540
- const getClasses = noteDragMode => {
541
- return noteDragMode ? [styles$3.Note, styles$3[noteDragMode]] : [styles$3.Note];
542
- };
551
+ }, "startDragging");
552
+ const getClasses = /* @__PURE__ */ __name((noteDragMode2) => {
553
+ return noteDragMode2 ? [_default4.Note, _default4[noteDragMode2]] : [_default4.Note];
554
+ }, "getClasses");
543
555
  return (() => {
544
- const _el$ = _tmpl$$6.cloneNode(true);
545
- _el$.$$mousedown = mouseDownEvent => {
556
+ const _el$ = _tmpl$3.cloneNode(true);
557
+ _el$.$$mousedown = (mouseDownEvent) => {
546
558
  mouseDownEvent.preventDefault();
547
559
  mouseDownEvent.stopPropagation();
548
560
  const {
@@ -550,7 +562,7 @@ const PianoRollNotes = props => {
550
562
  midi,
551
563
  horiontalPosition
552
564
  } = calculateNoteDragValues(mouseDownEvent);
553
- const ticks = snapValueToGridIfEnabled(horiontalPosition, mouseDownEvent.altKey);
565
+ const ticks = context.snapValueToGridIfEnabled(horiontalPosition, mouseDownEvent.altKey, context);
554
566
  const durationTicks = gridDivisionTicks();
555
567
  const newNote = {
556
568
  midi,
@@ -591,8 +603,8 @@ const PianoRollNotes = props => {
591
603
  return web.memo(() => !!verticalViewPort().isVisible(verticalVirtualDimensions()))() && horizontalViewPort().isVisible(horizontalDimensions());
592
604
  },
593
605
  get children() {
594
- const _el$2 = _tmpl$$6.cloneNode(true);
595
- _el$2.$$mousedown = event => {
606
+ const _el$2 = _tmpl$3.cloneNode(true);
607
+ _el$2.$$mousedown = (event) => {
596
608
  event.stopPropagation();
597
609
  const initialPosition = horizontalViewPort().calculatePosition(event.clientX);
598
610
  setDiffPosition(noteDragMode() === "trimEnd" ? -(note.ticks + note.durationTicks - initialPosition) : initialPosition - note.ticks);
@@ -602,12 +614,13 @@ const PianoRollNotes = props => {
602
614
  setInitialNote(note);
603
615
  startDragging();
604
616
  };
605
- _el$2.$$dblclick = event => {
617
+ _el$2.$$dblclick = (event) => {
606
618
  event.stopPropagation();
607
619
  context.onRemoveNote?.(trackIndex(), noteIndex());
608
620
  };
609
- _el$2.$$mousemove = event => {
610
- if (isDragging()) return;
621
+ _el$2.$$mousemove = (event) => {
622
+ if (isDragging())
623
+ return;
611
624
  event.stopPropagation();
612
625
  const relativeX = horizontalViewPort().calculatePixelValue(horizontalViewPort().calculatePosition(event.clientX));
613
626
  const noteStartX = horizontalViewPort().calculatePixelValue(note.ticks);
@@ -615,27 +628,24 @@ const PianoRollNotes = props => {
615
628
  setNoteDragMode(relativeX - noteStartX < 3 ? "trimStart" : noteEndX - relativeX < 3 ? "trimEnd" : "move");
616
629
  };
617
630
  web.setAttribute(_el$2, "draggable", false);
618
- web.effect(_p$ => {
619
- const _v$ = getClasses(noteDragMode()).join(" "),
620
- _v$2 = `rgba(255,0,0, ${(128 + note.velocity) / 256})`,
621
- _v$3 = `${verticalVirtualDimensions().offset}px`,
622
- _v$4 = `${verticalVirtualDimensions().size}px`,
623
- _v$5 = `${horizontalDimensions().offset}px`,
624
- _v$6 = `${horizontalDimensions().size}px`;
631
+ web.effect((_p$) => {
632
+ const _v$ = getClasses(noteDragMode()).join(" "), _v$2 = `${track.color}`, _v$3 = (note.velocity / 128 + 2) / 3, _v$4 = `${verticalVirtualDimensions().offset}px`, _v$5 = `${verticalVirtualDimensions().size}px`, _v$6 = `${horizontalDimensions().offset}px`, _v$7 = `${horizontalDimensions().size}px`;
625
633
  _v$ !== _p$._v$ && web.className(_el$2, _p$._v$ = _v$);
626
634
  _v$2 !== _p$._v$2 && _el$2.style.setProperty("background-color", _p$._v$2 = _v$2);
627
- _v$3 !== _p$._v$3 && _el$2.style.setProperty("top", _p$._v$3 = _v$3);
628
- _v$4 !== _p$._v$4 && _el$2.style.setProperty("height", _p$._v$4 = _v$4);
629
- _v$5 !== _p$._v$5 && _el$2.style.setProperty("left", _p$._v$5 = _v$5);
630
- _v$6 !== _p$._v$6 && _el$2.style.setProperty("width", _p$._v$6 = _v$6);
635
+ _v$3 !== _p$._v$3 && _el$2.style.setProperty("opacity", _p$._v$3 = _v$3);
636
+ _v$4 !== _p$._v$4 && _el$2.style.setProperty("top", _p$._v$4 = _v$4);
637
+ _v$5 !== _p$._v$5 && _el$2.style.setProperty("height", _p$._v$5 = _v$5);
638
+ _v$6 !== _p$._v$6 && _el$2.style.setProperty("left", _p$._v$6 = _v$6);
639
+ _v$7 !== _p$._v$7 && _el$2.style.setProperty("width", _p$._v$7 = _v$7);
631
640
  return _p$;
632
641
  }, {
633
- _v$: undefined,
634
- _v$2: undefined,
635
- _v$3: undefined,
636
- _v$4: undefined,
637
- _v$5: undefined,
638
- _v$6: undefined
642
+ _v$: void 0,
643
+ _v$2: void 0,
644
+ _v$3: void 0,
645
+ _v$4: void 0,
646
+ _v$5: void 0,
647
+ _v$6: void 0,
648
+ _v$7: void 0
639
649
  });
640
650
  return _el$2;
641
651
  }
@@ -646,26 +656,26 @@ const PianoRollNotes = props => {
646
656
  });
647
657
  }
648
658
  }));
649
- web.effect(_$p => web.classList(_el$, {
650
- [styles$3.PianoRollNotes]: true
659
+ web.effect((_$p) => web.classList(_el$, {
660
+ [_default4.PianoRollNotes]: true
651
661
  }, _$p));
652
662
  return _el$;
653
663
  })();
654
- };
664
+ }, "PianoRollNotes");
665
+ var PianoRollNotes_default = PianoRollNotes;
655
666
  web.delegateEvents(["mousedown", "mousemove", "dblclick"]);
656
667
 
657
- var css_248z$2 = ".PianoRollGrid-module_PianoRollGrid__tG119 {\n position: relative;\n width: 100%;\n height: 100%;\n}\n\n.PianoRollGrid-module_PianoRollGrid-Row__nRMCs {\n position: absolute;\n border-style: solid;\n border-color: gray;\n width: 100%;\n border-width: 0;\n}\n.PianoRollGrid-module_PianoRollGrid-Row__nRMCs.PianoRollGrid-module_IsDark__jRyyy {\n background-color: rgba(0, 0, 0, 0.2);\n}\n\n.PianoRollGrid-module_PianoRollGrid-Row__nRMCs.PianoRollGrid-module_Key__8ZwPN {\n border-width: 0px 1px 0px 0;\n}\n.PianoRollGrid-module_PianoRollGrid-Row__nRMCs.PianoRollGrid-module_IsBlackAndNextIsWhite__UF8O2 {\n background-color: rgba(0, 0, 0, 0.2);\n border-width: 0.1px 1px 0.1px 0;\n}\n\n.PianoRollGrid-module_PianoRollGrid-Time__jLz3E {\n position: absolute;\n box-sizing: border-box;\n top: 0px;\n height: 100%;\n border-left-style: solid;\n border-left-width: 0.5px;\n border-left-color: #bbb;\n background: #ccc;\n}\n\n.PianoRollGrid-module_PianoRollGrid-Time__jLz3E.PianoRollGrid-module_Highlighted__N1J6q {\n background: #ddd;\n}\n\n.PianoRollGrid-module_PianoRollGrid-Time__jLz3E.PianoRollGrid-module_HighlightedBorder__Vnrff {\n border-left-color: gray;\n}\n";
658
- var styles$2 = {"PianoRollGrid":"PianoRollGrid-module_PianoRollGrid__tG119","PianoRollGrid-Row":"PianoRollGrid-module_PianoRollGrid-Row__nRMCs","IsDark":"PianoRollGrid-module_IsDark__jRyyy","Key":"PianoRollGrid-module_Key__8ZwPN","IsBlackAndNextIsWhite":"PianoRollGrid-module_IsBlackAndNextIsWhite__UF8O2","PianoRollGrid-Time":"PianoRollGrid-module_PianoRollGrid-Time__jLz3E","Highlighted":"PianoRollGrid-module_Highlighted__N1J6q","HighlightedBorder":"PianoRollGrid-module_HighlightedBorder__Vnrff"};
659
- styleInject(css_248z$2);
660
-
661
- const usePianoRollGrid = () => {
668
+ // src/PianoRollGrid.module.css
669
+ var _default5 = {};
670
+ var usePianoRollGrid = /* @__PURE__ */ __name(() => {
662
671
  const context = usePianoRollContext();
663
672
  const horizontalViewPort = solidJs.createMemo(() => useViewPortDimension("horizontal"));
664
673
  const measureTicks = solidJs.createMemo(() => context.ppq * 4);
665
674
  const selectedGridDivisorTicks = solidJs.createMemo(() => measureTicks() / context.gridDivision);
666
675
  function calculateVisibleGridDivisorTicks(value) {
667
676
  const visibleRange = horizontalViewPort().calculateVisibleRange();
668
- if (visibleRange <= 0) return 0;
677
+ if (visibleRange <= 0)
678
+ return 0;
669
679
  if (visibleRange / value > 100) {
670
680
  return calculateVisibleGridDivisorTicks(value * 2);
671
681
  }
@@ -674,13 +684,16 @@ const usePianoRollGrid = () => {
674
684
  }
675
685
  return value;
676
686
  }
677
- const gridDivisorTicks = solidJs.createMemo(() => calculateVisibleGridDivisorTicks(selectedGridDivisorTicks()));
687
+ __name(calculateVisibleGridDivisorTicks, "calculateVisibleGridDivisorTicks");
688
+ const gridDivisorTicks = solidJs.createMemo(
689
+ () => calculateVisibleGridDivisorTicks(selectedGridDivisorTicks())
690
+ );
678
691
  const gridArray = solidJs.createMemo(() => {
679
- const numberOfLines = Math.ceil(horizontalViewPort().calculateVisibleRange() / gridDivisorTicks() + 1);
692
+ const numberOfLines = Math.ceil(
693
+ horizontalViewPort().calculateVisibleRange() / gridDivisorTicks() + 1
694
+ );
680
695
  const startIndex = Math.floor(context.position / gridDivisorTicks());
681
- return Array.from({
682
- length: numberOfLines
683
- }).map((_, i) => {
696
+ return Array.from({ length: numberOfLines }).map((_, i) => {
684
697
  const index = i + startIndex;
685
698
  const ticks = index * gridDivisorTicks();
686
699
  const measurePosition = ticks / context.ppq / 4 + 1;
@@ -699,43 +712,43 @@ const usePianoRollGrid = () => {
699
712
  });
700
713
  });
701
714
  return gridArray;
702
- };
715
+ }, "usePianoRollGrid");
716
+ var usePianoRollGrid_default = usePianoRollGrid;
703
717
 
704
- const _tmpl$$5 = /*#__PURE__*/web.template(`<div></div>`, 2);
705
- const PianoRollGrid = () => {
718
+ // src/PianoRollGrid.tsx
719
+ var _tmpl$4 = /* @__PURE__ */ web.template(`<div></div>`, 2);
720
+ var PianoRollGrid = /* @__PURE__ */ __name(() => {
706
721
  const context = usePianoRollContext();
707
722
  const verticalViewPort = solidJs.createMemo(() => useViewPortDimension(context.mode === "keys" ? "vertical" : "verticalTracks"));
708
723
  const horizontalViewPort = solidJs.createMemo(() => useViewPortDimension("horizontal"));
709
- const gridArray = usePianoRollGrid();
724
+ const gridArray = usePianoRollGrid_default();
710
725
  return (() => {
711
- const _el$ = _tmpl$$5.cloneNode(true);
726
+ const _el$ = _tmpl$4.cloneNode(true);
712
727
  web.insert(_el$, web.createComponent(solidJs.Index, {
713
728
  get each() {
714
729
  return gridArray();
715
730
  },
716
- children: entry => {
731
+ children: (entry) => {
717
732
  return web.createComponent(solidJs.Show, {
718
733
  get when() {
719
734
  return horizontalViewPort().isVisible(entry().virtualDimensions);
720
735
  },
721
736
  get children() {
722
- const _el$2 = _tmpl$$5.cloneNode(true);
723
- web.effect(_p$ => {
737
+ const _el$2 = _tmpl$4.cloneNode(true);
738
+ web.effect((_p$) => {
724
739
  const _v$ = {
725
- [styles$2["PianoRollGrid-Time"]]: true,
726
- [styles$2["Highlighted"]]: entry().isHighlighted,
727
- [styles$2["HighlightedBorder"]]: entry().hasHighlightedBorder
728
- },
729
- _v$2 = `${entry().virtualDimensions.offset}px`,
730
- _v$3 = `${entry().virtualDimensions.size}px`;
740
+ [_default5["PianoRollGrid-Time"]]: true,
741
+ [_default5["Highlighted"]]: entry().isHighlighted,
742
+ [_default5["HighlightedBorder"]]: entry().hasHighlightedBorder
743
+ }, _v$2 = `${entry().virtualDimensions.offset}px`, _v$3 = `${entry().virtualDimensions.size}px`;
731
744
  _p$._v$ = web.classList(_el$2, _v$, _p$._v$);
732
745
  _v$2 !== _p$._v$2 && _el$2.style.setProperty("left", _p$._v$2 = _v$2);
733
746
  _v$3 !== _p$._v$3 && _el$2.style.setProperty("width", _p$._v$3 = _v$3);
734
747
  return _p$;
735
748
  }, {
736
- _v$: undefined,
737
- _v$2: undefined,
738
- _v$3: undefined
749
+ _v$: void 0,
750
+ _v$2: void 0,
751
+ _v$3: void 0
739
752
  });
740
753
  return _el$2;
741
754
  }
@@ -749,31 +762,29 @@ const PianoRollGrid = () => {
749
762
  get children() {
750
763
  return web.createComponent(solidJs.Index, {
751
764
  each: keys,
752
- children: key => {
765
+ children: (key) => {
753
766
  const virtualDimensions = solidJs.createMemo(() => verticalViewPort().calculatePixelDimensions(127 - key().number, 1));
754
767
  return web.createComponent(solidJs.Show, {
755
768
  get when() {
756
769
  return verticalViewPort().isVisible(virtualDimensions());
757
770
  },
758
771
  get children() {
759
- const _el$3 = _tmpl$$5.cloneNode(true);
760
- web.effect(_p$ => {
772
+ const _el$3 = _tmpl$4.cloneNode(true);
773
+ web.effect((_p$) => {
761
774
  const _v$4 = {
762
- [styles$2["PianoRollGrid-Row"]]: true,
763
- [styles$2["Key"]]: true,
764
- [styles$2["IsDark"]]: key().isBlack,
765
- [styles$2["IsBlackAndNextIsWhite"]]: !key().isBlack && !blackKeys.includes((key().number + 1) % 12)
766
- },
767
- _v$5 = `${virtualDimensions().offset}px`,
768
- _v$6 = `${virtualDimensions().size}px`;
775
+ [_default5["PianoRollGrid-Row"]]: true,
776
+ [_default5["Key"]]: true,
777
+ [_default5["IsDark"]]: key().isBlack,
778
+ [_default5["IsBlackAndNextIsWhite"]]: !key().isBlack && !blackKeys.includes((key().number + 1) % 12)
779
+ }, _v$5 = `${virtualDimensions().offset}px`, _v$6 = `${virtualDimensions().size}px`;
769
780
  _p$._v$4 = web.classList(_el$3, _v$4, _p$._v$4);
770
781
  _v$5 !== _p$._v$5 && _el$3.style.setProperty("top", _p$._v$5 = _v$5);
771
782
  _v$6 !== _p$._v$6 && _el$3.style.setProperty("height", _p$._v$6 = _v$6);
772
783
  return _p$;
773
784
  }, {
774
- _v$4: undefined,
775
- _v$5: undefined,
776
- _v$6: undefined
785
+ _v$4: void 0,
786
+ _v$5: void 0,
787
+ _v$6: void 0
777
788
  });
778
789
  return _el$3;
779
790
  }
@@ -798,22 +809,20 @@ const PianoRollGrid = () => {
798
809
  return verticalViewPort().isVisible(virtualDimensions());
799
810
  },
800
811
  get children() {
801
- const _el$4 = _tmpl$$5.cloneNode(true);
802
- web.effect(_p$ => {
812
+ const _el$4 = _tmpl$4.cloneNode(true);
813
+ web.effect((_p$) => {
803
814
  const _v$7 = {
804
- [styles$2["PianoRollGrid-Row"]]: true,
805
- [styles$2["IsDark"]]: index() % 2 === 0
806
- },
807
- _v$8 = `${virtualDimensions().offset}px`,
808
- _v$9 = `${virtualDimensions().size}px`;
815
+ [_default5["PianoRollGrid-Row"]]: true,
816
+ [_default5["IsDark"]]: index() % 2 === 0
817
+ }, _v$8 = `${virtualDimensions().offset}px`, _v$9 = `${virtualDimensions().size}px`;
809
818
  _p$._v$7 = web.classList(_el$4, _v$7, _p$._v$7);
810
819
  _v$8 !== _p$._v$8 && _el$4.style.setProperty("top", _p$._v$8 = _v$8);
811
820
  _v$9 !== _p$._v$9 && _el$4.style.setProperty("height", _p$._v$9 = _v$9);
812
821
  return _p$;
813
822
  }, {
814
- _v$7: undefined,
815
- _v$8: undefined,
816
- _v$9: undefined
823
+ _v$7: void 0,
824
+ _v$8: void 0,
825
+ _v$9: void 0
817
826
  });
818
827
  return _el$4;
819
828
  }
@@ -822,19 +831,19 @@ const PianoRollGrid = () => {
822
831
  });
823
832
  }
824
833
  }), null);
825
- web.effect(() => web.className(_el$, styles$2.PianoRollGrid));
834
+ web.effect(() => web.className(_el$, _default5.PianoRollGrid));
826
835
  return _el$;
827
836
  })();
828
- };
829
-
830
- const _tmpl$$4 = /*#__PURE__*/web.template(`<input step="0.01">`, 1);
831
- const ZoomSliderControl = props => {
837
+ }, "PianoRollGrid");
838
+ var PianoRollGrid_default = PianoRollGrid;
839
+ var _tmpl$5 = /* @__PURE__ */ web.template(`<input step="0.01">`, 1);
840
+ var ZoomSliderControl = /* @__PURE__ */ __name((props) => {
832
841
  const propsWithDefaults = solidJs.mergeProps({
833
842
  orientation: "horizontal"
834
843
  }, props);
835
844
  const dimension = solidJs.createMemo(() => useViewPortDimension(props.dimensionName ?? propsWithDefaults.orientation));
836
845
  return (() => {
837
- const _el$ = _tmpl$$4.cloneNode(true);
846
+ const _el$ = _tmpl$5.cloneNode(true);
838
847
  web.spread(_el$, web.mergeProps({
839
848
  get min() {
840
849
  return dimension().minZoom;
@@ -846,7 +855,7 @@ const ZoomSliderControl = props => {
846
855
  get value() {
847
856
  return dimension().zoom;
848
857
  },
849
- "onInput": event => {
858
+ "onInput": (event) => {
850
859
  const value = event.currentTarget.valueAsNumber;
851
860
  dimension().onZoomChange?.(value);
852
861
  },
@@ -862,34 +871,32 @@ const ZoomSliderControl = props => {
862
871
  width: "16px",
863
872
  transform: "rotate(180deg)",
864
873
  ...{
865
- "writing-mode": "bt-lr" /* IE */,
866
- "-webkit-appearance": "slider-vertical" /* WebKit */
874
+ "writing-mode": "bt-lr",
875
+ "-webkit-appearance": "slider-vertical"
867
876
  },
868
-
869
- ...(typeof props.style === "object" && props.style)
877
+ ...typeof props.style === "object" && props.style
870
878
  } : {
871
879
  margin: 0,
872
880
  "margin-top": "4px",
873
881
  "margin-bottom": "4px",
874
- ...(typeof props.style === "object" && props.style)
882
+ ...typeof props.style === "object" && props.style
875
883
  };
876
884
  }
877
885
  }), false, false);
878
886
  return _el$;
879
887
  })();
880
- };
888
+ }, "ZoomSliderControl");
889
+ var ZoomSliderControl_default = ZoomSliderControl;
881
890
 
882
- var css_248z$1 = ".PianoRollTrackList-module_PianoRollTrackList__-sDf0 {\n position: relative;\n height: 100%;\n flex: 1;\n}\n\n.PianoRollTrackList-module_Track__mZP1K {\n border-width: 0px;\n position: absolute;\n box-sizing: border-box;\n width: 100%;\n border-color: #000;\n border-style: solid;\n border-right-width: 1px;\n border-bottom-width: 1px;\n padding: 2px;\n cursor: pointer;\n background: lightgrey;\n}\n.PianoRollTrackList-module_Track__mZP1K.PianoRollTrackList-module_selected__0b-mf {\n background: gray;\n}";
883
- var styles$1 = {"PianoRollTrackList":"PianoRollTrackList-module_PianoRollTrackList__-sDf0","Track":"PianoRollTrackList-module_Track__mZP1K","selected":"PianoRollTrackList-module_selected__0b-mf"};
884
- styleInject(css_248z$1);
885
-
886
- const _tmpl$$3 = /*#__PURE__*/web.template(`<div></div>`, 2),
887
- _tmpl$2$1 = /*#__PURE__*/web.template(`<div> </div>`, 2);
888
- const PianoRollTrackList = () => {
891
+ // src/PianoRollTrackList.module.css
892
+ var _default6 = {};
893
+ var _tmpl$6 = /* @__PURE__ */ web.template(`<div></div>`, 2);
894
+ var _tmpl$22 = /* @__PURE__ */ web.template(`<div> </div>`, 2);
895
+ var PianoRollTrackList = /* @__PURE__ */ __name(() => {
889
896
  const viewPort = solidJs.createMemo(() => useViewPortDimension("verticalTracks"));
890
897
  const context = usePianoRollContext();
891
898
  return (() => {
892
- const _el$ = _tmpl$$3.cloneNode(true);
899
+ const _el$ = _tmpl$6.cloneNode(true);
893
900
  web.insert(_el$, web.createComponent(solidJs.Index, {
894
901
  get each() {
895
902
  return context.tracks;
@@ -901,42 +908,38 @@ const PianoRollTrackList = () => {
901
908
  return virtualDimensions().size > 0;
902
909
  },
903
910
  get children() {
904
- const _el$2 = _tmpl$2$1.cloneNode(true),
905
- _el$3 = _el$2.firstChild;
911
+ const _el$2 = _tmpl$22.cloneNode(true), _el$3 = _el$2.firstChild;
906
912
  _el$2.$$click = () => context.onSelectedTrackIndexChange?.(index);
907
913
  web.insert(_el$2, index, _el$3);
908
914
  web.insert(_el$2, () => track().name || "[unnamed track]", null);
909
- web.effect(_p$ => {
915
+ web.effect((_p$) => {
910
916
  const _v$ = {
911
- [styles$1["Track"]]: true,
912
- [styles$1["selected"]]: index === context.selectedTrackIndex
913
- },
914
- _v$2 = track().name,
915
- _v$3 = `${virtualDimensions().offset}px`,
916
- _v$4 = `${virtualDimensions().size}px`;
917
+ [_default6["Track"]]: true,
918
+ [_default6["selected"]]: index === context.selectedTrackIndex
919
+ }, _v$2 = track().name, _v$3 = `${virtualDimensions().offset}px`, _v$4 = `${virtualDimensions().size}px`;
917
920
  _p$._v$ = web.classList(_el$2, _v$, _p$._v$);
918
921
  _v$2 !== _p$._v$2 && web.setAttribute(_el$2, "title", _p$._v$2 = _v$2);
919
922
  _v$3 !== _p$._v$3 && _el$2.style.setProperty("top", _p$._v$3 = _v$3);
920
923
  _v$4 !== _p$._v$4 && _el$2.style.setProperty("height", _p$._v$4 = _v$4);
921
924
  return _p$;
922
925
  }, {
923
- _v$: undefined,
924
- _v$2: undefined,
925
- _v$3: undefined,
926
- _v$4: undefined
926
+ _v$: void 0,
927
+ _v$2: void 0,
928
+ _v$3: void 0,
929
+ _v$4: void 0
927
930
  });
928
931
  return _el$2;
929
932
  }
930
933
  });
931
934
  }
932
935
  }));
933
- web.effect(() => web.className(_el$, styles$1.PianoRollTrackList));
936
+ web.effect(() => web.className(_el$, _default6.PianoRollTrackList));
934
937
  return _el$;
935
938
  })();
936
- };
939
+ }, "PianoRollTrackList");
940
+ var PianoRollTrackList_default = PianoRollTrackList;
937
941
  web.delegateEvents(["click"]);
938
-
939
- const PianoRollScrollZoomViewPort = props => {
942
+ var PianoRollScrollZoomViewPort = /* @__PURE__ */ __name((props) => {
940
943
  const zoomFactor = 500;
941
944
  const context = usePianoRollContext();
942
945
  return web.createComponent(ScrollZoomViewPort, {
@@ -948,7 +951,7 @@ const PianoRollScrollZoomViewPort = props => {
948
951
  range: context.duration,
949
952
  zoom: context.zoom * (zoomFactor / context.notesScrollerClientRect.width),
950
953
  onPositionChange: context.onPositionChange,
951
- onZoomChange: zoom => context.onZoomChange?.(zoom / (zoomFactor / context.notesScrollerClientRect.width)),
954
+ onZoomChange: (zoom) => context.onZoomChange?.(zoom / (zoomFactor / context.notesScrollerClientRect.width)),
952
955
  minZoom: 1,
953
956
  maxZoom: 500
954
957
  }),
@@ -959,7 +962,7 @@ const PianoRollScrollZoomViewPort = props => {
959
962
  range: 128,
960
963
  zoom: context.verticalZoom * (zoomFactor / context.notesScrollerClientRect.height),
961
964
  onPositionChange: context.onVerticalPositionChange,
962
- onZoomChange: verticalZoom => context.onVerticalZoomChange?.(verticalZoom / (zoomFactor / context.notesScrollerClientRect.height)),
965
+ onZoomChange: (verticalZoom) => context.onVerticalZoomChange?.(verticalZoom / (zoomFactor / context.notesScrollerClientRect.height)),
963
966
  minZoom: 1,
964
967
  maxZoom: 10
965
968
  }),
@@ -974,7 +977,7 @@ const PianoRollScrollZoomViewPort = props => {
974
977
  range: context.tracks.length,
975
978
  zoom: context.verticalTrackZoom * (zoomFactor / context.tracksScrollerClientRect.height),
976
979
  onPositionChange: context.onVerticalTrackPositionChange,
977
- onZoomChange: verticalTrackZoom => context.onVerticalTrackZoomChange?.(verticalTrackZoom / (zoomFactor / context.tracksScrollerClientRect.height)),
980
+ onZoomChange: (verticalTrackZoom) => context.onVerticalTrackZoomChange?.(verticalTrackZoom / (zoomFactor / context.tracksScrollerClientRect.height)),
978
981
  minZoom: 0.8,
979
982
  maxZoom: 3
980
983
  }),
@@ -986,9 +989,9 @@ const PianoRollScrollZoomViewPort = props => {
986
989
  return props.children;
987
990
  }
988
991
  });
989
- };
990
-
991
- const defaultRect = {
992
+ }, "PianoRollScrollZoomViewPort");
993
+ var PianoRollScrollZoomViewPort_default = PianoRollScrollZoomViewPort;
994
+ var defaultRect = {
992
995
  left: 0,
993
996
  width: 0,
994
997
  top: 0,
@@ -1002,10 +1005,11 @@ function useBoundingClientRect(containerRef) {
1002
1005
  const [boundingClientRect, setBoundingClientRect] = solidJs.createSignal(defaultRect);
1003
1006
  solidJs.createEffect(() => {
1004
1007
  const container = containerRef();
1005
- if (!container) return;
1006
- const updateBoundingClientRect = () => {
1008
+ if (!container)
1009
+ return;
1010
+ const updateBoundingClientRect = /* @__PURE__ */ __name(() => {
1007
1011
  setBoundingClientRect(container.getBoundingClientRect() ?? defaultRect);
1008
- };
1012
+ }, "updateBoundingClientRect");
1009
1013
  const resizeObserver = new ResizeObserver(updateBoundingClientRect);
1010
1014
  resizeObserver.observe(container);
1011
1015
  updateBoundingClientRect();
@@ -1015,15 +1019,17 @@ function useBoundingClientRect(containerRef) {
1015
1019
  });
1016
1020
  return boundingClientRect;
1017
1021
  }
1022
+ __name(useBoundingClientRect, "useBoundingClientRect");
1018
1023
 
1019
- const PianoRollNotesScroller = props => {
1024
+ // src/PianoRollNotesScroller.tsx
1025
+ var PianoRollNotesScroller = /* @__PURE__ */ __name((props) => {
1020
1026
  const context = usePianoRollContext();
1021
1027
  const [ref, setRef] = solidJs.createSignal();
1022
1028
  const clientRect = useBoundingClientRect(ref);
1023
1029
  solidJs.createEffect(() => {
1024
1030
  context.onNotesScrollerClientRectChange(clientRect());
1025
1031
  });
1026
- return web.createComponent(ScrollZoomContainer, {
1032
+ return web.createComponent(ScrollZoomContainer_default, {
1027
1033
  ref: setRef,
1028
1034
  get verticalDimensionName() {
1029
1035
  return context.mode === "keys" ? "vertical" : "verticalTracks";
@@ -1032,16 +1038,16 @@ const PianoRollNotesScroller = props => {
1032
1038
  return props.children;
1033
1039
  }
1034
1040
  });
1035
- };
1036
-
1037
- const PianoRollTrackListScroller = props => {
1041
+ }, "PianoRollNotesScroller");
1042
+ var PianoRollNotesScroller_default = PianoRollNotesScroller;
1043
+ var PianoRollTrackListScroller = /* @__PURE__ */ __name((props) => {
1038
1044
  const context = usePianoRollContext();
1039
1045
  const [ref, setRef] = solidJs.createSignal();
1040
1046
  const clientRect = useBoundingClientRect(ref);
1041
1047
  solidJs.createEffect(() => {
1042
1048
  context.onTracksScrollerClientRectChange(clientRect());
1043
1049
  });
1044
- return web.createComponent(ScrollZoomContainer, {
1050
+ return web.createComponent(ScrollZoomContainer_default, {
1045
1051
  ref: setRef,
1046
1052
  horizontalDimensionName: "horizontalTracks",
1047
1053
  verticalDimensionName: "verticalTracks",
@@ -1052,71 +1058,88 @@ const PianoRollTrackListScroller = props => {
1052
1058
  return props.children;
1053
1059
  }
1054
1060
  });
1055
- };
1061
+ }, "PianoRollTrackListScroller");
1062
+ var PianoRollTrackListScroller_default = PianoRollTrackListScroller;
1056
1063
 
1057
- var css_248z = ".PianoRollScale-module_PianoRollScale__5wGRm {\n position: relative;\n width: 100%;\n height: 100%;\n}\n\n.PianoRollScale-module_PianoRollScale-Time__03hGQ {\n position: absolute;\n box-sizing: border-box;\n top: 0px;\n height: 100%;\n border-left-style: solid;\n border-left-width: 0.5px;\n border-left-color: x#666;\n border-bottom-color: #333;\n border-bottom-style: solid;\n border-bottom-width: 0.5px;\n background: #777;\n display: flex;\n align-items: center;\n}\n\n.PianoRollScale-module_PianoRollScale-Label__aoRi6 {\n position: absolute;\n z-index: 1;\n color: #ccc;\n margin-left: 3px;\n font-size: 0.8em;\n}\n\n.PianoRollScale-module_PianoRollScale-Time__03hGQ.PianoRollScale-module_Highlighted__ziWn5 {\n background: #666;\n}\n\n.PianoRollScale-module_PianoRollScale-Time__03hGQ.PianoRollScale-module_HighlightedBorder__-OoZE {\n border-left-color: #111;\n}\n";
1058
- var styles = {"PianoRollScale":"PianoRollScale-module_PianoRollScale__5wGRm","PianoRollScale-Time":"PianoRollScale-module_PianoRollScale-Time__03hGQ","PianoRollScale-Label":"PianoRollScale-module_PianoRollScale-Label__aoRi6","Highlighted":"PianoRollScale-module_Highlighted__ziWn5","HighlightedBorder":"PianoRollScale-module_HighlightedBorder__-OoZE"};
1059
- styleInject(css_248z);
1064
+ // src/PianoRollScale.module.css
1065
+ var _default7 = {};
1060
1066
 
1061
- const _tmpl$$2 = /*#__PURE__*/web.template(`<div></div>`, 2);
1062
- const PianoRollScale = () => {
1067
+ // src/PianoRollScale.tsx
1068
+ var _tmpl$7 = /* @__PURE__ */ web.template(`<div></div>`, 2);
1069
+ var PianoRollScale = /* @__PURE__ */ __name(() => {
1063
1070
  const horizontalViewPort = solidJs.createMemo(() => useViewPortDimension("horizontal"));
1064
- const grid = usePianoRollGrid();
1071
+ const grid = usePianoRollGrid_default();
1072
+ const context = usePianoRollContext();
1073
+ const updatePlayheadPosition = /* @__PURE__ */ __name((event) => {
1074
+ const position = horizontalViewPort().calculatePosition(event.clientX);
1075
+ context.onPlayHeadPositionChange(position, event);
1076
+ }, "updatePlayheadPosition");
1065
1077
  return (() => {
1066
- const _el$ = _tmpl$$2.cloneNode(true);
1078
+ const _el$ = _tmpl$7.cloneNode(true);
1079
+ _el$.$$mousedown = (event) => {
1080
+ updatePlayheadPosition(event);
1081
+ const handleMouseUp = /* @__PURE__ */ __name(() => {
1082
+ window.removeEventListener("mousemove", updatePlayheadPosition);
1083
+ window.removeEventListener("mouseup", handleMouseUp);
1084
+ }, "handleMouseUp");
1085
+ window.addEventListener("mousemove", updatePlayheadPosition);
1086
+ window.addEventListener("mouseup", handleMouseUp);
1087
+ };
1067
1088
  web.insert(_el$, web.createComponent(solidJs.Index, {
1068
1089
  get each() {
1069
1090
  return grid();
1070
1091
  },
1071
- children: entry => {
1092
+ children: (entry) => {
1072
1093
  return web.createComponent(solidJs.Show, {
1073
1094
  get when() {
1074
1095
  return horizontalViewPort().isVisible(entry().virtualDimensions);
1075
1096
  },
1076
1097
  get children() {
1077
- const _el$2 = _tmpl$$2.cloneNode(true);
1098
+ const _el$2 = _tmpl$7.cloneNode(true);
1078
1099
  web.insert(_el$2, web.createComponent(solidJs.Show, {
1079
1100
  get when() {
1080
1101
  return entry().showLabel;
1081
1102
  },
1082
1103
  get children() {
1083
- const _el$3 = _tmpl$$2.cloneNode(true);
1104
+ const _el$3 = _tmpl$7.cloneNode(true);
1084
1105
  web.insert(_el$3, () => entry().label);
1085
- web.effect(() => web.className(_el$3, styles["PianoRollScale-Label"]));
1106
+ web.effect(() => web.className(_el$3, _default7["PianoRollScale-Label"]));
1086
1107
  return _el$3;
1087
1108
  }
1088
1109
  }));
1089
- web.effect(_p$ => {
1110
+ web.effect((_p$) => {
1090
1111
  const _v$ = {
1091
- [styles["PianoRollScale-Time"]]: true,
1092
- [styles["Highlighted"]]: entry().isHighlighted,
1093
- [styles["HighlightedBorder"]]: entry().hasHighlightedBorder
1094
- },
1095
- _v$2 = `${entry().virtualDimensions.offset}px`,
1096
- _v$3 = `${entry().virtualDimensions.size}px`;
1112
+ [_default7["PianoRollScale-Time"]]: true,
1113
+ [_default7["Highlighted"]]: entry().isHighlighted,
1114
+ [_default7["HighlightedBorder"]]: entry().hasHighlightedBorder
1115
+ }, _v$2 = `${entry().virtualDimensions.offset}px`, _v$3 = `${entry().virtualDimensions.size}px`;
1097
1116
  _p$._v$ = web.classList(_el$2, _v$, _p$._v$);
1098
1117
  _v$2 !== _p$._v$2 && _el$2.style.setProperty("left", _p$._v$2 = _v$2);
1099
1118
  _v$3 !== _p$._v$3 && _el$2.style.setProperty("width", _p$._v$3 = _v$3);
1100
1119
  return _p$;
1101
1120
  }, {
1102
- _v$: undefined,
1103
- _v$2: undefined,
1104
- _v$3: undefined
1121
+ _v$: void 0,
1122
+ _v$2: void 0,
1123
+ _v$3: void 0
1105
1124
  });
1106
1125
  return _el$2;
1107
1126
  }
1108
1127
  });
1109
1128
  }
1110
1129
  }));
1111
- web.effect(() => web.className(_el$, styles.PianoRollScale));
1130
+ web.effect(() => web.className(_el$, _default7.PianoRollScale));
1112
1131
  return _el$;
1113
1132
  })();
1114
- };
1133
+ }, "PianoRollScale");
1134
+ var PianoRollScale_default = PianoRollScale;
1135
+ web.delegateEvents(["mousedown"]);
1115
1136
 
1116
- const _tmpl$$1 = /*#__PURE__*/web.template(`<div><button><div></div></button></div>`, 6),
1117
- _tmpl$2 = /*#__PURE__*/web.template(`<div><div><div></div></div><div><div></div></div></div>`, 10),
1118
- _tmpl$3 = /*#__PURE__*/web.template(`<div></div>`, 2);
1119
- const PianoRoll = allProps => {
1137
+ // src/PianoRoll.tsx
1138
+ var _tmpl$8 = /* @__PURE__ */ web.template(`<div><button><div></div></button></div>`, 6);
1139
+ var _tmpl$23 = /* @__PURE__ */ web.template(`<div><div></div><div></div></div>`, 6);
1140
+ var _tmpl$32 = /* @__PURE__ */ web.template(`<div><div><div></div></div></div>`, 6);
1141
+ var _tmpl$42 = /* @__PURE__ */ web.template(`<div></div>`, 2);
1142
+ var PianoRoll = /* @__PURE__ */ __name((allProps) => {
1120
1143
  const propsWithDefaults = solidJs.mergeProps({
1121
1144
  showAllTracks: false
1122
1145
  }, allProps);
@@ -1124,21 +1147,17 @@ const PianoRoll = allProps => {
1124
1147
  return web.createComponent(PianoRollContextProvider, {
1125
1148
  value: context,
1126
1149
  get children() {
1127
- const _el$ = _tmpl$3.cloneNode(true);
1150
+ const _el$ = _tmpl$42.cloneNode(true);
1128
1151
  web.spread(_el$, web.mergeProps(divProps, {
1129
1152
  get ["class"]() {
1130
- return styles$6.PianoRoll;
1153
+ return _default.PianoRoll;
1131
1154
  }
1132
1155
  }), false, true);
1133
- web.insert(_el$, web.createComponent(PianoRollScrollZoomViewPort, {
1156
+ web.insert(_el$, web.createComponent(PianoRollScrollZoomViewPort_default, {
1134
1157
  get children() {
1135
1158
  return [(() => {
1136
- const _el$2 = _tmpl$2.cloneNode(true),
1137
- _el$3 = _el$2.firstChild,
1138
- _el$7 = _el$3.firstChild,
1139
- _el$8 = _el$3.nextSibling,
1140
- _el$9 = _el$8.firstChild;
1141
- web.insert(_el$2, web.createComponent(ZoomSliderControl, {
1159
+ const _el$2 = _tmpl$32.cloneNode(true), _el$3 = _el$2.firstChild, _el$7 = _el$3.firstChild;
1160
+ web.insert(_el$2, web.createComponent(ZoomSliderControl_default, {
1142
1161
  orientation: "vertical",
1143
1162
  dimensionName: "verticalTracks"
1144
1163
  }), _el$3);
@@ -1147,16 +1166,15 @@ const PianoRoll = allProps => {
1147
1166
  return context.showTrackList;
1148
1167
  },
1149
1168
  get children() {
1150
- const _el$4 = _tmpl$$1.cloneNode(true),
1151
- _el$5 = _el$4.firstChild,
1152
- _el$6 = _el$5.firstChild;
1169
+ const _el$4 = _tmpl$8.cloneNode(true), _el$5 = _el$4.firstChild, _el$6 = _el$5.firstChild;
1153
1170
  _el$4.style.setProperty("height", "30px");
1171
+ _el$4.style.setProperty("border-right", "1px black solid");
1154
1172
  _el$5.$$click = () => context.onModeChange(context.mode === "keys" ? "tracks" : "keys");
1155
1173
  _el$5.style.setProperty("font-size", "16px");
1156
1174
  _el$5.style.setProperty("line-height", "16px");
1157
1175
  _el$5.style.setProperty("cursor", "pointer");
1158
1176
  _el$5.style.setProperty("overflow", "hidden");
1159
- web.insert(_el$6, () => context.mode === "keys" ? "" : "🎹");
1177
+ web.insert(_el$6, () => context.mode === "keys" ? "\u2261" : "\u{1F3B9}");
1160
1178
  web.effect(() => web.setAttribute(_el$5, "title", context.mode === "keys" ? "Tracks Mode" : "Keys Mode"));
1161
1179
  return _el$4;
1162
1180
  }
@@ -1169,9 +1187,9 @@ const PianoRoll = allProps => {
1169
1187
  return context.showTrackList;
1170
1188
  },
1171
1189
  get children() {
1172
- return web.createComponent(PianoRollTrackListScroller, {
1190
+ return web.createComponent(PianoRollTrackListScroller_default, {
1173
1191
  get children() {
1174
- return web.createComponent(PianoRollTrackList, {});
1192
+ return web.createComponent(PianoRollTrackList_default, {});
1175
1193
  }
1176
1194
  });
1177
1195
  }
@@ -1181,42 +1199,49 @@ const PianoRoll = allProps => {
1181
1199
  return context.mode === "keys";
1182
1200
  },
1183
1201
  get children() {
1184
- return web.createComponent(PianoRollKeys, {});
1202
+ return web.createComponent(PianoRollKeys_default, {});
1185
1203
  }
1186
1204
  }), null);
1187
- _el$8.style.setProperty("width", "100%");
1188
- _el$8.style.setProperty("display", "flex");
1189
- _el$8.style.setProperty("height", "100%");
1190
- _el$8.style.setProperty("flex-direction", "column");
1191
- _el$8.style.setProperty("overflow", "hidden");
1192
- _el$9.style.setProperty("height", "30px");
1193
- web.insert(_el$9, web.createComponent(PianoRollScale, {}));
1194
- web.insert(_el$8, web.createComponent(PianoRollNotesScroller, {
1205
+ web.insert(_el$2, web.createComponent(PianoRollNotesScroller_default, {
1195
1206
  get children() {
1196
- return [web.memo(() => allProps.children), web.createComponent(PianoRollGrid, {}), web.createComponent(PianoRollNotes, {})];
1207
+ return [web.memo(() => allProps.children), (() => {
1208
+ const _el$8 = _tmpl$23.cloneNode(true), _el$9 = _el$8.firstChild, _el$10 = _el$9.nextSibling;
1209
+ _el$8.style.setProperty("width", "100%");
1210
+ _el$8.style.setProperty("display", "flex");
1211
+ _el$8.style.setProperty("height", "100%");
1212
+ _el$8.style.setProperty("flex-direction", "column");
1213
+ _el$8.style.setProperty("overflow", "hidden");
1214
+ _el$9.style.setProperty("height", "30px");
1215
+ web.insert(_el$9, web.createComponent(PianoRollScale_default, {}));
1216
+ _el$10.style.setProperty("flex", "1");
1217
+ _el$10.style.setProperty("position", "relative");
1218
+ _el$10.style.setProperty("overflow", "hidden");
1219
+ web.insert(_el$10, web.createComponent(PianoRollGrid_default, {}), null);
1220
+ web.insert(_el$10, web.createComponent(PianoRollNotes_default, {}), null);
1221
+ return _el$8;
1222
+ })()];
1197
1223
  }
1198
1224
  }), null);
1199
- web.insert(_el$2, web.createComponent(ZoomSliderControl, {
1225
+ web.insert(_el$2, web.createComponent(ZoomSliderControl_default, {
1200
1226
  orientation: "vertical",
1201
1227
  get disabled() {
1202
1228
  return context.mode !== "keys";
1203
1229
  }
1204
1230
  }), null);
1205
- web.effect(_p$ => {
1206
- const _v$ = styles$6.PianoRollContainer,
1207
- _v$2 = {
1208
- [styles$6.PianoRollLeftColumn]: true,
1209
- [styles$6.showTrackList]: context.showTrackList
1210
- };
1231
+ web.effect((_p$) => {
1232
+ const _v$ = _default.PianoRollContainer, _v$2 = {
1233
+ [_default.PianoRollLeftColumn]: true,
1234
+ [_default.showTrackList]: context.showTrackList
1235
+ };
1211
1236
  _v$ !== _p$._v$ && web.className(_el$2, _p$._v$ = _v$);
1212
1237
  _p$._v$2 = web.classList(_el$3, _v$2, _p$._v$2);
1213
1238
  return _p$;
1214
1239
  }, {
1215
- _v$: undefined,
1216
- _v$2: undefined
1240
+ _v$: void 0,
1241
+ _v$2: void 0
1217
1242
  });
1218
1243
  return _el$2;
1219
- })(), web.createComponent(ZoomSliderControl, {
1244
+ })(), web.createComponent(ZoomSliderControl_default, {
1220
1245
  orientation: "horizontal",
1221
1246
  get style() {
1222
1247
  return {
@@ -1230,22 +1255,23 @@ const PianoRoll = allProps => {
1230
1255
  return _el$;
1231
1256
  }
1232
1257
  });
1233
- };
1258
+ }, "PianoRoll");
1259
+ exports.PianoRoll = PianoRoll;
1234
1260
  web.delegateEvents(["click"]);
1235
-
1236
- const _tmpl$ = /*#__PURE__*/web.template(`<div class="PlayHead"></div>`, 2);
1237
- const PlayHead = allProps => {
1261
+ var _tmpl$9 = /* @__PURE__ */ web.template(`<div class="PlayHead"></div>`, 2);
1262
+ var PlayHead = /* @__PURE__ */ __name((allProps) => {
1238
1263
  const [props, divProps] = solidJs.splitProps(allProps, ["position", "sync", "onPositionChange", "dimensionName"]);
1239
1264
  const viewPort = useViewPortDimension(props.dimensionName ?? "horizontal");
1240
1265
  solidJs.createEffect(() => {
1241
- if (!props.sync) return;
1266
+ if (!props.sync)
1267
+ return;
1242
1268
  const maxPosition = viewPort.range;
1243
1269
  const newPosition = clamp(props.position - viewPort.range / viewPort.zoom / 2, 0, maxPosition);
1244
1270
  viewPort.onPositionChange?.(newPosition);
1245
1271
  });
1246
1272
  const leftPosition = solidJs.createMemo(() => viewPort.calculatePixelOffset(props.position));
1247
1273
  return (() => {
1248
- const _el$ = _tmpl$.cloneNode(true);
1274
+ const _el$ = _tmpl$9.cloneNode(true);
1249
1275
  web.spread(_el$, web.mergeProps(divProps, {
1250
1276
  get style() {
1251
1277
  return {
@@ -1255,45 +1281,44 @@ const PlayHead = allProps => {
1255
1281
  left: `${leftPosition()}px`,
1256
1282
  "background-color": "green",
1257
1283
  cursor: "pointer",
1258
- ...(typeof divProps.style === "object" && divProps.style)
1284
+ ...typeof divProps.style === "object" && divProps.style
1259
1285
  };
1260
1286
  },
1261
- "onMouseDown": event => {
1287
+ "onMouseDown": (event) => {
1262
1288
  event.preventDefault();
1263
1289
  event.stopPropagation();
1264
- const handleMouseMove = ({
1265
- clientX
1266
- }) => {
1267
- const newPosition = viewPort.calculatePosition(clientX);
1268
- props.onPositionChange?.(newPosition);
1269
- };
1270
- const handleMouseUp = () => {
1290
+ const handleMouseMove = /* @__PURE__ */ __name((event2) => {
1291
+ const newPosition = viewPort.calculatePosition(event2.clientX);
1292
+ props.onPositionChange?.(newPosition, event2);
1293
+ }, "handleMouseMove");
1294
+ const handleMouseUp = /* @__PURE__ */ __name(() => {
1271
1295
  window.removeEventListener("mousemove", handleMouseMove);
1272
1296
  window.removeEventListener("mouseup", handleMouseUp);
1273
- };
1297
+ }, "handleMouseUp");
1274
1298
  window.addEventListener("mousemove", handleMouseMove);
1275
1299
  window.addEventListener("mouseup", handleMouseUp);
1276
1300
  }
1277
1301
  }), false, false);
1278
1302
  return _el$;
1279
1303
  })();
1280
- };
1281
-
1282
- const useNotes = () => {
1304
+ }, "PlayHead");
1305
+ exports.PlayHead = PlayHead;
1306
+ var useNotes = /* @__PURE__ */ __name(() => {
1283
1307
  const [notes, onNotesChange] = solidJs.createSignal([]);
1284
- const onNoteChange = (index, note) => {
1308
+ const onNoteChange = /* @__PURE__ */ __name((index, note) => {
1285
1309
  onNotesChange([...notes().slice(0, index), note, ...notes().splice(index + 1)]);
1286
- };
1287
- const onInsertNote = note => {
1288
- const index = Math.max(notes().findIndex(({
1289
- ticks
1290
- }) => ticks > note.ticks), 0);
1310
+ }, "onNoteChange");
1311
+ const onInsertNote = /* @__PURE__ */ __name((note) => {
1312
+ const index = Math.max(
1313
+ notes().findIndex(({ ticks }) => ticks > note.ticks),
1314
+ 0
1315
+ );
1291
1316
  onNotesChange([...notes().slice(0, index), note, ...notes().splice(index)]);
1292
1317
  return index;
1293
- };
1294
- const onRemoveNote = index => {
1318
+ }, "onInsertNote");
1319
+ const onRemoveNote = /* @__PURE__ */ __name((index) => {
1295
1320
  onNotesChange([...notes().slice(0, index), ...notes().splice(index + 1)]);
1296
- };
1321
+ }, "onRemoveNote");
1297
1322
  return {
1298
1323
  notes,
1299
1324
  onNotesChange,
@@ -1301,10 +1326,5 @@ const useNotes = () => {
1301
1326
  onInsertNote,
1302
1327
  onRemoveNote
1303
1328
  };
1304
- };
1305
-
1306
- exports.PianoRoll = PianoRoll;
1307
- exports.PlayHead = PlayHead;
1308
- exports.createPianoRollstate = createPianoRollstate;
1329
+ }, "useNotes");
1309
1330
  exports.useNotes = useNotes;
1310
- //# sourceMappingURL=index.js.map