@opendaw/lib-dom 0.0.76 → 0.0.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/browser.d.ts CHANGED
@@ -4,6 +4,7 @@ export declare namespace Browser {
4
4
  const isWindows: () => boolean;
5
5
  const isChrome: () => boolean;
6
6
  const isFirefox: () => boolean;
7
+ const isMobile: () => boolean;
7
8
  const isWeb: () => boolean;
8
9
  const isVitest: boolean;
9
10
  const isTauriApp: () => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAIA,yBAAiB,OAAO,CAAC;IAGd,MAAM,WAAW,eAA2D,CAAA;IAC5E,MAAM,OAAO,eAAiE,CAAA;IAC9E,MAAM,SAAS,eAAgE,CAAA;IAC/E,MAAM,QAAQ,eAAoJ,CAAA;IAClK,MAAM,SAAS,eAA8E,CAAA;IAC7F,MAAM,KAAK,eAAsB,CAAA;IACjC,MAAM,QAAQ,SAAmE,CAAA;IACjF,MAAM,UAAU,eAA8B,CAAA;IAC9C,MAAM,SAAS,QAMH,CAAA;IACZ,MAAM,EAAE,cAQd,CAAA;CACJ"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAIA,yBAAiB,OAAO,CAAC;IAGd,MAAM,WAAW,eAA2D,CAAA;IAC5E,MAAM,OAAO,eAAiE,CAAA;IAC9E,MAAM,SAAS,eAAgE,CAAA;IAC/E,MAAM,QAAQ,eAAoJ,CAAA;IAClK,MAAM,SAAS,eAA8E,CAAA;IAC7F,MAAM,QAAQ,QAAO,OAI3B,CAAA;IACM,MAAM,KAAK,eAAsB,CAAA;IACjC,MAAM,QAAQ,SAAmE,CAAA;IACjF,MAAM,UAAU,eAA8B,CAAA;IAC9C,MAAM,SAAS,QAMH,CAAA;IACZ,MAAM,EAAE,cAQd,CAAA;CACJ"}
package/dist/browser.js CHANGED
@@ -9,6 +9,15 @@ export var Browser;
9
9
  Browser.isWindows = () => hasNavigator && navigator.userAgent.includes("Windows");
10
10
  Browser.isChrome = () => hasNavigator && /chrome|chromium|crios/.test(navigator.userAgent.toLowerCase()) && !/edg|opera|opr/.test(navigator.userAgent.toLowerCase());
11
11
  Browser.isFirefox = () => hasNavigator && navigator.userAgent.toLowerCase().includes("firefox");
12
+ Browser.isMobile = () => {
13
+ if (!hasNavigator) {
14
+ return false;
15
+ }
16
+ if (navigator.userAgentData?.mobile === true) {
17
+ return true;
18
+ }
19
+ return /iPhone|iPod|Android.*Mobile|webOS|BlackBerry|Opera Mini|IEMobile/i.test(navigator.userAgent);
20
+ };
12
21
  Browser.isWeb = () => !Browser.isTauriApp();
13
22
  Browser.isVitest = typeof process !== "undefined" && process.env?.VITEST === "true";
14
23
  Browser.isTauriApp = () => "__TAURI__" in window;
@@ -20,7 +29,7 @@ export var Browser;
20
29
  .replace(/\s+/g, " ")
21
30
  .trim() : "N/A";
22
31
  Browser.id = () => {
23
- if (!hasLocation) {
32
+ if (!hasLocation || typeof localStorage === "undefined") {
24
33
  return "";
25
34
  }
26
35
  const key = "__id__";
@@ -0,0 +1,5 @@
1
+ export declare namespace Clipboard {
2
+ const writeText: (text: string) => Promise<void>;
3
+ const readText: () => Promise<string>;
4
+ }
5
+ //# sourceMappingURL=clipboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../src/clipboard.ts"],"names":[],"mappings":"AAGA,yBAAiB,SAAS,CAAC;IAChB,MAAM,SAAS,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAQ1D,CAAA;IACM,MAAM,QAAQ,QAAa,OAAO,CAAC,MAAM,CAQ/C,CAAA;CACJ"}
@@ -0,0 +1,25 @@
1
+ import { RuntimeNotifier } from "@opendaw/lib-std";
2
+ import { Promises } from "@opendaw/lib-runtime";
3
+ export var Clipboard;
4
+ (function (Clipboard) {
5
+ Clipboard.writeText = async (text) => {
6
+ const result = await Promises.tryCatch(navigator.clipboard.writeText(text));
7
+ if (result.status === "rejected") {
8
+ await RuntimeNotifier.info({
9
+ headline: "Clipboard Error",
10
+ message: "Could not write to clipboard. Please check your browser permissions."
11
+ });
12
+ }
13
+ };
14
+ Clipboard.readText = async () => {
15
+ const result = await Promises.tryCatch(navigator.clipboard.readText());
16
+ if (result.status === "resolved") {
17
+ return result.value;
18
+ }
19
+ await RuntimeNotifier.info({
20
+ headline: "Clipboard Error",
21
+ message: "Could not read from clipboard. Please check your browser permissions."
22
+ });
23
+ return "";
24
+ };
25
+ })(Clipboard || (Clipboard = {}));
@@ -1 +1 @@
1
- {"version":3,"file":"dragging.d.ts","sourceRoot":"","sources":["../src/dragging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,IAAI,EAAkB,MAAM,EAAY,UAAU,EAAa,MAAM,kBAAkB,CAAA;AAG1G,OAAO,EAAS,oBAAoB,EAAC,MAAM,UAAU,CAAA;AAGrD,yBAAiB,QAAQ,CAAC;IACtB,UAAiB,OAAO;QACpB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;QAC1B,MAAM,CAAC,IAAI,IAAI,CAAA;QACf,OAAO,CAAC,IAAI,IAAI,CAAA;QAChB,OAAO,CAAC,IAAI,IAAI,CAAA;QAChB,WAAW,CAAC,EAAE,WAAW,CAAA;KAC5B;IAED,UAAiB,KAAK;QAClB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;QACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;QAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAC5B;IAED,UAAiB,cAAc;QAC3B,UAAU,CAAC,EAAE,OAAO,CAAA;QACpB,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,gBAAgB,CAAC,EAAE,OAAO,CAAA;QAC1B,WAAW,CAAC,EAAE,OAAO,CAAA;QACrB,oBAAoB,CAAC,EAAE,MAAM,CAAA;KAChC;IAEM,IAAI,cAAc,SAAQ,CAAA;IAE1B,MAAM,MAAM,GAAI,CAAC,SAAS,oBAAoB,EAAE,QAAQ,CAAC,EACT,SAAS,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,EAC5C,UAAU,cAAc,KAAG,UAsIjF,CAAA;CACJ"}
1
+ {"version":3,"file":"dragging.d.ts","sourceRoot":"","sources":["../src/dragging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,IAAI,EAAkB,MAAM,EAAY,UAAU,EAAa,MAAM,kBAAkB,CAAA;AAGhH,OAAO,EAAS,oBAAoB,EAAC,MAAM,UAAU,CAAA;AAGrD,yBAAiB,QAAQ,CAAC;IACtB,UAAiB,OAAO;QACpB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;QAC1B,MAAM,CAAC,IAAI,IAAI,CAAA;QACf,OAAO,CAAC,IAAI,IAAI,CAAA;QAChB,OAAO,CAAC,IAAI,IAAI,CAAA;QAChB,WAAW,CAAC,EAAE,WAAW,CAAA;KAC5B;IAED,UAAiB,KAAK;QAClB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;QACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;QAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAC5B;IAED,UAAiB,cAAc;QAC3B,UAAU,CAAC,EAAE,OAAO,CAAA;QACpB,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,gBAAgB,CAAC,EAAE,OAAO,CAAA;QAC1B,WAAW,CAAC,EAAE,OAAO,CAAA;QACrB,oBAAoB,CAAC,EAAE,MAAM,CAAA;KAChC;IAEM,IAAI,cAAc,SAAQ,CAAA;IAE1B,MAAM,MAAM,GAAI,CAAC,SAAS,oBAAoB,EAAE,QAAQ,CAAC,EACT,SAAS,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,EAC5C,UAAU,cAAc,KAAG,UA+IjF,CAAA;CACJ"}
package/dist/dragging.js CHANGED
@@ -8,21 +8,29 @@ export var Dragging;
8
8
  Dragging.usePointerLock = false;
9
9
  Dragging.attach = (target, factory, options) => {
10
10
  const processCycle = new Terminator();
11
+ // Cancel any active drag when a new one starts. On some platforms (e.g., ChromeOS),
12
+ // isPrimary may be true for multiple simultaneous touchpoints, bypassing the
13
+ // multitouch guard above. Without this, listeners from the previous drag accumulate
14
+ // and can reference stale state.
15
+ let cancelActive = EmptyExec;
11
16
  return Terminable.many(processCycle, Events.subscribe(target, "pointerdown", (event) => {
17
+ if (event.defaultPrevented) {
18
+ return;
19
+ }
12
20
  if (options?.multiTouch !== true && !event.isPrimary) {
13
21
  return;
14
22
  }
15
23
  if (event.buttons !== 1 || (Browser.isMacOS() && event.ctrlKey)) {
16
24
  return;
17
25
  }
26
+ cancelActive();
18
27
  const option = factory(event);
19
28
  if (option.isEmpty()) {
20
29
  return;
21
30
  }
22
31
  const process = option.unwrap();
23
32
  const pointerId = event.pointerId;
24
- event.stopPropagation();
25
- event.stopImmediatePropagation();
33
+ event.preventDefault();
26
34
  try {
27
35
  target.setPointerCapture(pointerId);
28
36
  }
@@ -98,6 +106,7 @@ export var Dragging;
98
106
  }));
99
107
  }
100
108
  const cancel = () => {
109
+ cancelActive = EmptyExec;
101
110
  if (pointerLockActive && targetElement !== null && document.pointerLockElement === targetElement) {
102
111
  document.exitPointerLock();
103
112
  }
@@ -105,9 +114,11 @@ export var Dragging;
105
114
  process.finally?.call(process);
106
115
  processCycle.terminate();
107
116
  };
117
+ cancelActive = cancel;
108
118
  const owner = safeRead(target, "ownerDocument", "defaultView") ?? self;
109
119
  processCycle.ownAll(Events.subscribe(target, "pointerup", (event) => {
110
120
  if (event.pointerId === pointerId) {
121
+ cancelActive = EmptyExec;
111
122
  if (pointerLockActive && targetElement !== null && document.pointerLockElement === targetElement) {
112
123
  document.exitPointerLock();
113
124
  }
@@ -1 +1 @@
1
- {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAGA,yBAAiB,KAAK,CAAC;IACZ,MAAM,IAAI,GAAU,aAAa,WAAW,EAAE,UAAU,qBAAqB,KAAG,OAAO,CAAC,MAAM,CAwBpG,CAAA;IAEM,MAAM,IAAI,GAAU,UAAU,qBAAqB,KAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAgCvF,CAAA;CACJ"}
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAGA,yBAAiB,KAAK,CAAC;IACZ,MAAM,IAAI,GAAU,aAAa,WAAW,EAAE,UAAU,qBAAqB,KAAG,OAAO,CAAC,MAAM,CA8BpG,CAAA;IAaM,MAAM,IAAI,GAAU,UAAU,qBAAqB,KAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAgCvF,CAAA;CACJ"}
package/dist/files.js CHANGED
@@ -1,4 +1,4 @@
1
- import { Arrays, asDefined, isDefined, RuntimeNotifier } from "@opendaw/lib-std";
1
+ import { Arrays, asDefined, Errors, isDefined, RuntimeNotifier } from "@opendaw/lib-std";
2
2
  import { Promises } from "@opendaw/lib-runtime";
3
3
  export var Files;
4
4
  (function (Files) {
@@ -6,28 +6,44 @@ export var Files;
6
6
  if (isDefined(window.showSaveFilePicker)) {
7
7
  const { status, error, value: handle } = await Promises.tryCatch(window.showSaveFilePicker(options));
8
8
  if (status === "rejected") {
9
+ if (Errors.isNotAllowed(error)) {
10
+ return saveBlobFallback(arrayBuffer, options);
11
+ }
9
12
  return RuntimeNotifier.info({
10
13
  headline: "Could not show file picker",
11
14
  message: String(error)
12
15
  }).then(() => Promise.reject(error));
13
16
  }
14
- const writable = await handle.createWritable();
15
- await writable.truncate(0);
16
- await writable.write(arrayBuffer);
17
- await writable.close();
17
+ const writeFile = async () => {
18
+ const writable = await handle.createWritable();
19
+ await writable.truncate(0);
20
+ await writable.write(arrayBuffer);
21
+ await writable.close();
22
+ };
23
+ const { status: writeStatus, error: writeError } = await Promises.tryCatch(writeFile());
24
+ if (writeStatus === "rejected") {
25
+ await RuntimeNotifier.info({
26
+ headline: "Could not save file",
27
+ message: String(writeError)
28
+ });
29
+ return Promise.reject(writeError);
30
+ }
18
31
  return handle.name ?? "unknown";
19
32
  }
20
33
  else {
21
- const blob = new Blob([arrayBuffer]);
22
- const url = URL.createObjectURL(blob);
23
- const anchor = document.createElement("a");
24
- anchor.href = url;
25
- anchor.download = options?.suggestedName ?? `unknown`;
26
- anchor.click();
27
- URL.revokeObjectURL(url);
28
- return options?.suggestedName ?? "Unknown";
34
+ return saveBlobFallback(arrayBuffer, options);
29
35
  }
30
36
  };
37
+ const saveBlobFallback = (arrayBuffer, options) => {
38
+ const blob = new Blob([arrayBuffer]);
39
+ const url = URL.createObjectURL(blob);
40
+ const anchor = document.createElement("a");
41
+ anchor.href = url;
42
+ anchor.download = options?.suggestedName ?? `unknown`;
43
+ anchor.click();
44
+ URL.revokeObjectURL(url);
45
+ return options?.suggestedName ?? "Unknown";
46
+ };
31
47
  Files.open = async (options) => {
32
48
  if (isDefined(window.showOpenFilePicker)) {
33
49
  const { status, value: fileHandles, error } = await Promises.tryCatch(window.showOpenFilePicker(options));
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from "./browser";
2
+ export * from "./clipboard";
2
3
  export * from "./compression";
3
4
  export * from "./console-commands";
4
5
  export * from "./constraint";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,QAAQ,CAAA;AACtB,cAAc,OAAO,CAAA;AACrB,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,wBAAwB,CAAA;AACtC,cAAc,oBAAoB,CAAA;AAClC,cAAc,UAAU,CAAA;AACxB,cAAc,OAAO,CAAA;AACrB,cAAc,SAAS,CAAA;AACvB,cAAc,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,cAAc,WAAW,CAAA;AACzB,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,QAAQ,CAAA;AACtB,cAAc,OAAO,CAAA;AACrB,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,wBAAwB,CAAA;AACtC,cAAc,oBAAoB,CAAA;AAClC,cAAc,UAAU,CAAA;AACxB,cAAc,OAAO,CAAA;AACrB,cAAc,SAAS,CAAA;AACvB,cAAc,cAAc,CAAA"}
package/dist/index.js CHANGED
@@ -7,6 +7,7 @@ else {
7
7
  console.debug(`%c${key.description}%c is now available in ${globalThis.constructor.name}.`, "color: hsl(200, 83%, 60%)", "color: inherit");
8
8
  }
9
9
  export * from "./browser";
10
+ export * from "./clipboard";
10
11
  export * from "./compression";
11
12
  export * from "./console-commands";
12
13
  export * from "./constraint";
@@ -28,6 +28,7 @@ export declare class Shortcut {
28
28
  alt?: boolean;
29
29
  }): Shortcut;
30
30
  static fromJSON(value: JSONValue): Option<Shortcut>;
31
+ static resolveCode(event: KeyboardEvent): string;
31
32
  static fromEvent(event: KeyboardEvent): Option<Shortcut>;
32
33
  private constructor();
33
34
  get code(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"shortcut-manager.d.ts","sourceRoot":"","sources":["../src/shortcut-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shortcut-manager.d.ts","sourceRoot":"","sources":["../src/shortcut-manager.ts"],"names":[],"mappings":"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"}
@@ -120,6 +120,9 @@ export class Shortcut {
120
120
  }
121
121
  return Option.wrap(new Shortcut(code, ctrl, shift, alt));
122
122
  }
123
+ static resolveCode(event) {
124
+ return event.code.startsWith("Key") ? `Key${event.key.toUpperCase()}` : event.code;
125
+ }
123
126
  static fromEvent(event) {
124
127
  if (Events.isAutofillEvent(event)) {
125
128
  return Option.None;
@@ -135,10 +138,7 @@ export class Shortcut {
135
138
  || code === Key.Enter) {
136
139
  return Option.None;
137
140
  }
138
- // For letters, use event.key to get the layout-independent character
139
- const effectiveCode = code.startsWith("Key")
140
- ? `Key${event.key.toUpperCase()}`
141
- : code;
141
+ const effectiveCode = Shortcut.resolveCode(event);
142
142
  const shortcut = new Shortcut(effectiveCode, Keyboard.isControlKey(event), event.shiftKey, event.altKey);
143
143
  if (ReservedShortcuts.isReserved(shortcut)) {
144
144
  return Option.None;
@@ -212,16 +212,9 @@ export class Shortcut {
212
212
  if (Events.isAutofillEvent(event)) {
213
213
  return false;
214
214
  }
215
- let codeMatches;
216
- if (this.#code.startsWith("Key")) {
217
- // For letters, use event.key to respect keyboard layout (e.g. QWERTZ)
218
- const expectedLetter = this.#code.slice(3).toLowerCase();
219
- codeMatches = event.key.toLowerCase() === expectedLetter;
220
- }
221
- else {
222
- codeMatches = event.code === this.#code
223
- || (this.#code === Key.DeleteAction && Keyboard.isDelete(event));
224
- }
215
+ const resolvedCode = Shortcut.resolveCode(event);
216
+ const codeMatches = resolvedCode === this.#code
217
+ || (this.#code === Key.DeleteAction && Keyboard.isDelete(event));
225
218
  return codeMatches
226
219
  && this.#ctrl === Keyboard.isControlKey(event)
227
220
  && this.#shift === event.shiftKey
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opendaw/lib-dom",
3
- "version": "0.0.76",
3
+ "version": "0.0.78",
4
4
  "sideEffects": false,
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -23,13 +23,13 @@
23
23
  "test": "vitest run"
24
24
  },
25
25
  "dependencies": {
26
- "@opendaw/lib-runtime": "^0.0.72",
27
- "@opendaw/lib-std": "^0.0.71",
26
+ "@opendaw/lib-runtime": "^0.0.74",
27
+ "@opendaw/lib-std": "^0.0.73",
28
28
  "@types/wicg-file-system-access": "^2023.10.6"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@opendaw/eslint-config": "^0.0.27",
32
32
  "@opendaw/typescript-config": "^0.0.29"
33
33
  },
34
- "gitHead": "0b25229f66de4a59f75484d363b396dc1953b91c"
34
+ "gitHead": "0de255fcdacefee9ab663ceeb0d4424a278c5dc4"
35
35
  }