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