markdown-flow-ui 0.1.124 → 0.1.125

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 (45) hide show
  1. package/dist/_virtual/index.cjs8.js +1 -1
  2. package/dist/_virtual/index.cjs9.js +1 -1
  3. package/dist/_virtual/index.es8.js +2 -2
  4. package/dist/_virtual/index.es9.js +2 -2
  5. package/dist/components/Slide/MobilePlayerSettingsSheet.cjs.js +1 -1
  6. package/dist/components/Slide/MobilePlayerSettingsSheet.cjs.js.map +1 -1
  7. package/dist/components/Slide/MobilePlayerSettingsSheet.d.ts +2 -0
  8. package/dist/components/Slide/MobilePlayerSettingsSheet.es.js +7 -6
  9. package/dist/components/Slide/MobilePlayerSettingsSheet.es.js.map +1 -1
  10. package/dist/components/Slide/Player.cjs.js +1 -1
  11. package/dist/components/Slide/Player.cjs.js.map +1 -1
  12. package/dist/components/Slide/Player.d.ts +37 -1
  13. package/dist/components/Slide/Player.es.js +594 -469
  14. package/dist/components/Slide/Player.es.js.map +1 -1
  15. package/dist/components/Slide/Slide.cjs.js +1 -1
  16. package/dist/components/Slide/Slide.cjs.js.map +1 -1
  17. package/dist/components/Slide/Slide.d.ts +13 -0
  18. package/dist/components/Slide/Slide.es.js +528 -501
  19. package/dist/components/Slide/Slide.es.js.map +1 -1
  20. package/dist/components/Slide/constants.cjs.js +1 -1
  21. package/dist/components/Slide/constants.cjs.js.map +1 -1
  22. package/dist/components/Slide/constants.d.ts +13 -0
  23. package/dist/components/Slide/constants.es.js +13 -0
  24. package/dist/components/Slide/constants.es.js.map +1 -1
  25. package/dist/components/Slide/useWakePlayerFromIframe.cjs.js +1 -1
  26. package/dist/components/Slide/useWakePlayerFromIframe.cjs.js.map +1 -1
  27. package/dist/components/Slide/useWakePlayerFromIframe.d.ts +12 -1
  28. package/dist/components/Slide/useWakePlayerFromIframe.es.js +70 -39
  29. package/dist/components/Slide/useWakePlayerFromIframe.es.js.map +1 -1
  30. package/dist/components/Slide/utils/playerKeyboardShortcutContext.cjs.js +2 -0
  31. package/dist/components/Slide/utils/playerKeyboardShortcutContext.cjs.js.map +1 -0
  32. package/dist/components/Slide/utils/playerKeyboardShortcutContext.d.ts +5 -0
  33. package/dist/components/Slide/utils/playerKeyboardShortcutContext.es.js +6 -0
  34. package/dist/components/Slide/utils/playerKeyboardShortcutContext.es.js.map +1 -0
  35. package/dist/components/Slide/utils/playerKeyboardShortcuts.cjs.js +2 -0
  36. package/dist/components/Slide/utils/playerKeyboardShortcuts.cjs.js.map +1 -0
  37. package/dist/components/Slide/utils/playerKeyboardShortcuts.d.ts +19 -0
  38. package/dist/components/Slide/utils/playerKeyboardShortcuts.es.js +58 -0
  39. package/dist/components/Slide/utils/playerKeyboardShortcuts.es.js.map +1 -0
  40. package/dist/components/Slide/utils/playerKeyboardShortcuts.test.d.ts +1 -0
  41. package/dist/node_modules/@braintree/sanitize-url/dist/index.cjs.js +1 -1
  42. package/dist/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
  43. package/dist/node_modules/classnames/index.cjs.js +1 -1
  44. package/dist/node_modules/classnames/index.es.js +1 -1
  45. package/package.json +2 -1
@@ -1,73 +1,104 @@
1
- import { useRef as h, useEffect as u } from "react";
2
- const I = ({
3
- sectionRef: a,
4
- enabled: c,
5
- onWake: o
1
+ import { useRef as l, useEffect as u } from "react";
2
+ import { getPlayerKeyboardShortcutAction as k, shouldIgnorePlayerKeyboardShortcutEvent as E } from "./utils/playerKeyboardShortcuts.es.js";
3
+ const A = ({
4
+ sectionRef: f,
5
+ enabled: s,
6
+ keyboardShortcutsEnabled: a = !0,
7
+ onWake: d
6
8
  }) => {
7
- const d = h(c), i = h(o);
9
+ const i = l(s), y = l(a), p = l(d);
8
10
  u(() => {
9
- d.current = c;
10
- }, [c]), u(() => {
11
- i.current = o;
12
- }, [o]), u(() => {
13
- const s = a.current;
14
- if (!s)
11
+ i.current = s;
12
+ }, [s]), u(() => {
13
+ y.current = a;
14
+ }, [a]), u(() => {
15
+ p.current = d;
16
+ }, [d]), u(() => {
17
+ const o = f.current;
18
+ if (!o)
15
19
  return;
16
- const r = /* @__PURE__ */ new Map(), L = () => {
17
- d.current && i.current();
18
- }, l = (e) => {
20
+ const r = /* @__PURE__ */ new Map(), h = () => {
21
+ i.current && p.current();
22
+ }, K = (e) => {
19
23
  if (r.has(e))
20
24
  return;
21
- const n = () => {
22
- r.get(e)?.cleanup(), r.delete(e), l(e);
25
+ const c = () => {
26
+ r.get(e)?.cleanup(), r.delete(e), K(e);
23
27
  };
24
- e.addEventListener("load", n);
25
- const t = e.contentDocument;
26
- if (!t) {
28
+ e.addEventListener("load", c);
29
+ const n = e.contentDocument;
30
+ if (!n) {
27
31
  r.set(e, {
28
32
  cleanup: () => {
29
- e.removeEventListener("load", n);
33
+ e.removeEventListener("load", c);
30
34
  }
31
35
  });
32
36
  return;
33
37
  }
34
- const p = () => {
35
- L();
38
+ const v = () => {
39
+ h();
40
+ }, w = (t) => {
41
+ if (!i.current || !y.current)
42
+ return;
43
+ const I = k(t);
44
+ if (E(t, I))
45
+ return;
46
+ h();
47
+ const L = o.ownerDocument.defaultView;
48
+ if (!L)
49
+ return;
50
+ const D = new L.KeyboardEvent("keydown", {
51
+ altKey: t.altKey,
52
+ bubbles: !0,
53
+ cancelable: !0,
54
+ code: t.code,
55
+ composed: !0,
56
+ ctrlKey: t.ctrlKey,
57
+ key: t.key,
58
+ location: t.location,
59
+ metaKey: t.metaKey,
60
+ repeat: t.repeat,
61
+ shiftKey: t.shiftKey
62
+ });
63
+ o.dispatchEvent(D), D.defaultPrevented && t.preventDefault();
36
64
  };
37
- t.addEventListener(
65
+ n.addEventListener(
38
66
  "click",
39
- p,
67
+ v,
40
68
  !0
41
- ), r.set(e, {
69
+ ), n.addEventListener("keydown", w), r.set(e, {
42
70
  cleanup: () => {
43
- t.removeEventListener(
71
+ n.removeEventListener(
44
72
  "click",
45
- p,
73
+ v,
46
74
  !0
47
- ), e.removeEventListener("load", n);
75
+ ), n.removeEventListener(
76
+ "keydown",
77
+ w
78
+ ), e.removeEventListener("load", c);
48
79
  }
49
80
  });
50
- }, f = () => {
81
+ }, m = () => {
51
82
  const e = Array.from(
52
- s.querySelectorAll(
83
+ o.querySelectorAll(
53
84
  "iframe.content-render-iframe"
54
85
  )
55
86
  );
56
- e.forEach(l), r.forEach((n, t) => {
57
- e.includes(t) || (n.cleanup(), r.delete(t));
87
+ e.forEach(K), r.forEach((c, n) => {
88
+ e.includes(n) || (c.cleanup(), r.delete(n));
58
89
  });
59
- }, v = new MutationObserver(() => {
60
- f();
90
+ }, b = new MutationObserver(() => {
91
+ m();
61
92
  });
62
- return f(), v.observe(s, {
93
+ return m(), b.observe(o, {
63
94
  childList: !0,
64
95
  subtree: !0
65
96
  }), () => {
66
- v.disconnect(), r.forEach((e) => e.cleanup()), r.clear();
97
+ b.disconnect(), r.forEach((e) => e.cleanup()), r.clear();
67
98
  };
68
- }, [a]);
99
+ }, [f]);
69
100
  };
70
101
  export {
71
- I as default
102
+ A as default
72
103
  };
73
104
  //# sourceMappingURL=useWakePlayerFromIframe.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useWakePlayerFromIframe.es.js","sources":["../../../src/components/Slide/useWakePlayerFromIframe.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\n\ntype UseWakePlayerFromIframeParams = {\n sectionRef: React.RefObject<HTMLElement | null>;\n enabled: boolean;\n onWake: () => void;\n};\n\nconst useWakePlayerFromIframe = ({\n sectionRef,\n enabled,\n onWake,\n}: UseWakePlayerFromIframeParams) => {\n const enabledRef = useRef(enabled);\n const onWakeRef = useRef(onWake);\n\n useEffect(() => {\n enabledRef.current = enabled;\n }, [enabled]);\n\n useEffect(() => {\n onWakeRef.current = onWake;\n }, [onWake]);\n\n useEffect(() => {\n const sectionElement = sectionRef.current;\n\n if (!sectionElement) {\n return;\n }\n\n const cleanupMap = new Map<\n HTMLIFrameElement,\n {\n cleanup: () => void;\n }\n >();\n\n const restorePlayerControls = () => {\n if (!enabledRef.current) {\n return;\n }\n\n onWakeRef.current();\n };\n\n const bindIframeDocument = (iframeElement: HTMLIFrameElement) => {\n if (cleanupMap.has(iframeElement)) {\n return;\n }\n\n const handleLoad = () => {\n cleanupMap.get(iframeElement)?.cleanup();\n cleanupMap.delete(iframeElement);\n bindIframeDocument(iframeElement);\n };\n\n iframeElement.addEventListener(\"load\", handleLoad);\n\n const iframeDocument = iframeElement.contentDocument;\n\n if (!iframeDocument) {\n cleanupMap.set(iframeElement, {\n cleanup: () => {\n iframeElement.removeEventListener(\"load\", handleLoad);\n },\n });\n return;\n }\n\n const handleIframeDocumentInteraction = () => {\n restorePlayerControls();\n };\n\n iframeDocument.addEventListener(\n \"click\",\n handleIframeDocumentInteraction,\n true\n );\n\n cleanupMap.set(iframeElement, {\n cleanup: () => {\n iframeDocument.removeEventListener(\n \"click\",\n handleIframeDocumentInteraction,\n true\n );\n iframeElement.removeEventListener(\"load\", handleLoad);\n },\n });\n };\n\n const syncIframeBindings = () => {\n const iframeElements = Array.from(\n sectionElement.querySelectorAll<HTMLIFrameElement>(\n \"iframe.content-render-iframe\"\n )\n );\n\n iframeElements.forEach(bindIframeDocument);\n\n cleanupMap.forEach((value, iframeElement) => {\n if (iframeElements.includes(iframeElement)) {\n return;\n }\n\n value.cleanup();\n cleanupMap.delete(iframeElement);\n });\n };\n\n const mutationObserver = new MutationObserver(() => {\n syncIframeBindings();\n });\n\n syncIframeBindings();\n mutationObserver.observe(sectionElement, {\n childList: true,\n subtree: true,\n });\n\n return () => {\n mutationObserver.disconnect();\n cleanupMap.forEach((value) => value.cleanup());\n cleanupMap.clear();\n };\n }, [sectionRef]);\n};\n\nexport default useWakePlayerFromIframe;\n"],"names":["useWakePlayerFromIframe","sectionRef","enabled","onWake","enabledRef","useRef","onWakeRef","useEffect","sectionElement","cleanupMap","restorePlayerControls","bindIframeDocument","iframeElement","handleLoad","iframeDocument","handleIframeDocumentInteraction","syncIframeBindings","iframeElements","value","mutationObserver"],"mappings":";AAQA,MAAMA,IAA0B,CAAC;AAAA,EAC/B,YAAAC;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AACF,MAAqC;AACnC,QAAMC,IAAaC,EAAOH,CAAO,GAC3BI,IAAYD,EAAOF,CAAM;AAE/B,EAAAI,EAAU,MAAM;AACd,IAAAH,EAAW,UAAUF;AAAA,EACvB,GAAG,CAACA,CAAO,CAAC,GAEZK,EAAU,MAAM;AACd,IAAAD,EAAU,UAAUH;AAAA,EACtB,GAAG,CAACA,CAAM,CAAC,GAEXI,EAAU,MAAM;AACd,UAAMC,IAAiBP,EAAW;AAElC,QAAI,CAACO;AACH;AAGF,UAAMC,wBAAiB,IAAA,GAOjBC,IAAwB,MAAM;AAClC,MAAKN,EAAW,WAIhBE,EAAU,QAAA;AAAA,IACZ,GAEMK,IAAqB,CAACC,MAAqC;AAC/D,UAAIH,EAAW,IAAIG,CAAa;AAC9B;AAGF,YAAMC,IAAa,MAAM;AACvB,QAAAJ,EAAW,IAAIG,CAAa,GAAG,QAAA,GAC/BH,EAAW,OAAOG,CAAa,GAC/BD,EAAmBC,CAAa;AAAA,MAClC;AAEA,MAAAA,EAAc,iBAAiB,QAAQC,CAAU;AAEjD,YAAMC,IAAiBF,EAAc;AAErC,UAAI,CAACE,GAAgB;AACnB,QAAAL,EAAW,IAAIG,GAAe;AAAA,UAC5B,SAAS,MAAM;AACb,YAAAA,EAAc,oBAAoB,QAAQC,CAAU;AAAA,UACtD;AAAA,QAAA,CACD;AACD;AAAA,MACF;AAEA,YAAME,IAAkC,MAAM;AAC5C,QAAAL,EAAA;AAAA,MACF;AAEA,MAAAI,EAAe;AAAA,QACb;AAAA,QACAC;AAAA,QACA;AAAA,MAAA,GAGFN,EAAW,IAAIG,GAAe;AAAA,QAC5B,SAAS,MAAM;AACb,UAAAE,EAAe;AAAA,YACb;AAAA,YACAC;AAAA,YACA;AAAA,UAAA,GAEFH,EAAc,oBAAoB,QAAQC,CAAU;AAAA,QACtD;AAAA,MAAA,CACD;AAAA,IACH,GAEMG,IAAqB,MAAM;AAC/B,YAAMC,IAAiB,MAAM;AAAA,QAC3BT,EAAe;AAAA,UACb;AAAA,QAAA;AAAA,MACF;AAGF,MAAAS,EAAe,QAAQN,CAAkB,GAEzCF,EAAW,QAAQ,CAACS,GAAON,MAAkB;AAC3C,QAAIK,EAAe,SAASL,CAAa,MAIzCM,EAAM,QAAA,GACNT,EAAW,OAAOG,CAAa;AAAA,MACjC,CAAC;AAAA,IACH,GAEMO,IAAmB,IAAI,iBAAiB,MAAM;AAClD,MAAAH,EAAA;AAAA,IACF,CAAC;AAED,WAAAA,EAAA,GACAG,EAAiB,QAAQX,GAAgB;AAAA,MACvC,WAAW;AAAA,MACX,SAAS;AAAA,IAAA,CACV,GAEM,MAAM;AACX,MAAAW,EAAiB,WAAA,GACjBV,EAAW,QAAQ,CAACS,MAAUA,EAAM,SAAS,GAC7CT,EAAW,MAAA;AAAA,IACb;AAAA,EACF,GAAG,CAACR,CAAU,CAAC;AACjB;"}
1
+ {"version":3,"file":"useWakePlayerFromIframe.es.js","sources":["../../../src/components/Slide/useWakePlayerFromIframe.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\n\nimport {\n getPlayerKeyboardShortcutAction,\n shouldIgnorePlayerKeyboardShortcutEvent,\n} from \"./utils/playerKeyboardShortcuts\";\n\ntype UseWakePlayerFromIframeParams = {\n sectionRef: React.RefObject<HTMLElement | null>;\n enabled: boolean;\n keyboardShortcutsEnabled?: boolean;\n onWake: () => void;\n};\n\n/**\n * Restores player controls when users interact inside slide iframes and forwards supported keyboard shortcuts to the host document.\n *\n * @param params - Hook options.\n * @param params.sectionRef - Section element used to scope iframe wake events and host shortcut dispatch.\n * @param params.enabled - Enables or disables iframe wake handling.\n * @param params.keyboardShortcutsEnabled - Enables or disables iframe keyboard shortcut forwarding. Defaults to true.\n * @param params.onWake - Callback invoked when iframe interaction should restore player controls.\n * @returns void\n */\nconst useWakePlayerFromIframe = ({\n sectionRef,\n enabled,\n keyboardShortcutsEnabled = true,\n onWake,\n}: UseWakePlayerFromIframeParams) => {\n const enabledRef = useRef(enabled);\n const keyboardShortcutsEnabledRef = useRef(keyboardShortcutsEnabled);\n const onWakeRef = useRef(onWake);\n\n useEffect(() => {\n enabledRef.current = enabled;\n }, [enabled]);\n\n useEffect(() => {\n keyboardShortcutsEnabledRef.current = keyboardShortcutsEnabled;\n }, [keyboardShortcutsEnabled]);\n\n useEffect(() => {\n onWakeRef.current = onWake;\n }, [onWake]);\n\n useEffect(() => {\n const sectionElement = sectionRef.current;\n\n if (!sectionElement) {\n return;\n }\n\n const cleanupMap = new Map<\n HTMLIFrameElement,\n {\n cleanup: () => void;\n }\n >();\n\n const restorePlayerControls = () => {\n if (!enabledRef.current) {\n return;\n }\n\n onWakeRef.current();\n };\n\n const bindIframeDocument = (iframeElement: HTMLIFrameElement) => {\n if (cleanupMap.has(iframeElement)) {\n return;\n }\n\n const handleLoad = () => {\n cleanupMap.get(iframeElement)?.cleanup();\n cleanupMap.delete(iframeElement);\n bindIframeDocument(iframeElement);\n };\n\n iframeElement.addEventListener(\"load\", handleLoad);\n\n const iframeDocument = iframeElement.contentDocument;\n\n if (!iframeDocument) {\n cleanupMap.set(iframeElement, {\n cleanup: () => {\n iframeElement.removeEventListener(\"load\", handleLoad);\n },\n });\n return;\n }\n\n const handleIframeDocumentInteraction = () => {\n restorePlayerControls();\n };\n\n const handleIframeDocumentKeyDown = (event: KeyboardEvent) => {\n if (!enabledRef.current || !keyboardShortcutsEnabledRef.current) {\n return;\n }\n\n const action = getPlayerKeyboardShortcutAction(event);\n\n if (shouldIgnorePlayerKeyboardShortcutEvent(event, action)) {\n return;\n }\n\n restorePlayerControls();\n\n const hostWindow = sectionElement.ownerDocument.defaultView;\n\n if (!hostWindow) {\n return;\n }\n\n const hostKeyboardEvent = new hostWindow.KeyboardEvent(\"keydown\", {\n altKey: event.altKey,\n bubbles: true,\n cancelable: true,\n code: event.code,\n composed: true,\n ctrlKey: event.ctrlKey,\n key: event.key,\n location: event.location,\n metaKey: event.metaKey,\n repeat: event.repeat,\n shiftKey: event.shiftKey,\n });\n\n sectionElement.dispatchEvent(hostKeyboardEvent);\n\n if (hostKeyboardEvent.defaultPrevented) {\n event.preventDefault();\n }\n };\n\n iframeDocument.addEventListener(\n \"click\",\n handleIframeDocumentInteraction,\n true\n );\n iframeDocument.addEventListener(\"keydown\", handleIframeDocumentKeyDown);\n\n cleanupMap.set(iframeElement, {\n cleanup: () => {\n iframeDocument.removeEventListener(\n \"click\",\n handleIframeDocumentInteraction,\n true\n );\n iframeDocument.removeEventListener(\n \"keydown\",\n handleIframeDocumentKeyDown\n );\n iframeElement.removeEventListener(\"load\", handleLoad);\n },\n });\n };\n\n const syncIframeBindings = () => {\n const iframeElements = Array.from(\n sectionElement.querySelectorAll<HTMLIFrameElement>(\n \"iframe.content-render-iframe\"\n )\n );\n\n iframeElements.forEach(bindIframeDocument);\n\n cleanupMap.forEach((value, iframeElement) => {\n if (iframeElements.includes(iframeElement)) {\n return;\n }\n\n value.cleanup();\n cleanupMap.delete(iframeElement);\n });\n };\n\n const mutationObserver = new MutationObserver(() => {\n syncIframeBindings();\n });\n\n syncIframeBindings();\n mutationObserver.observe(sectionElement, {\n childList: true,\n subtree: true,\n });\n\n return () => {\n mutationObserver.disconnect();\n cleanupMap.forEach((value) => value.cleanup());\n cleanupMap.clear();\n };\n }, [sectionRef]);\n};\n\nexport default useWakePlayerFromIframe;\n"],"names":["useWakePlayerFromIframe","sectionRef","enabled","keyboardShortcutsEnabled","onWake","enabledRef","useRef","keyboardShortcutsEnabledRef","onWakeRef","useEffect","sectionElement","cleanupMap","restorePlayerControls","bindIframeDocument","iframeElement","handleLoad","iframeDocument","handleIframeDocumentInteraction","handleIframeDocumentKeyDown","event","action","getPlayerKeyboardShortcutAction","shouldIgnorePlayerKeyboardShortcutEvent","hostWindow","hostKeyboardEvent","syncIframeBindings","iframeElements","value","mutationObserver"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),e=t.createContext(null);exports.PlayerKeyboardShortcutContext=e;
2
+ //# sourceMappingURL=playerKeyboardShortcutContext.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playerKeyboardShortcutContext.cjs.js","sources":["../../../../src/components/Slide/utils/playerKeyboardShortcutContext.ts"],"sourcesContent":["import { createContext } from \"react\";\n\nexport interface PlayerKeyboardShortcutContextValue {\n enabled: boolean;\n ownerId: string;\n}\n\nexport const PlayerKeyboardShortcutContext =\n createContext<PlayerKeyboardShortcutContextValue | null>(null);\n"],"names":["PlayerKeyboardShortcutContext","createContext"],"mappings":"yGAOaA,EACXC,EAAAA,cAAyD,IAAI"}
@@ -0,0 +1,5 @@
1
+ export interface PlayerKeyboardShortcutContextValue {
2
+ enabled: boolean;
3
+ ownerId: string;
4
+ }
5
+ export declare const PlayerKeyboardShortcutContext: import('react').Context<PlayerKeyboardShortcutContextValue | null>;
@@ -0,0 +1,6 @@
1
+ import { createContext as t } from "react";
2
+ const e = t(null);
3
+ export {
4
+ e as PlayerKeyboardShortcutContext
5
+ };
6
+ //# sourceMappingURL=playerKeyboardShortcutContext.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playerKeyboardShortcutContext.es.js","sources":["../../../../src/components/Slide/utils/playerKeyboardShortcutContext.ts"],"sourcesContent":["import { createContext } from \"react\";\n\nexport interface PlayerKeyboardShortcutContextValue {\n enabled: boolean;\n ownerId: string;\n}\n\nexport const PlayerKeyboardShortcutContext =\n createContext<PlayerKeyboardShortcutContextValue | null>(null);\n"],"names":["PlayerKeyboardShortcutContext","createContext"],"mappings":";AAOO,MAAMA,IACXC,EAAyD,IAAI;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s='input, textarea, select, [contenteditable]:not([contenteditable="false"]), [role="textbox"], [role="slider"], [role="listbox"], [role="combobox"], [role="tablist"], [role="menu"], [role="tree"], [role="grid"], [data-player-keyboard-shortcuts-ignore="true"]',i="button, [role='button']",a=new Set;let r=null;const l=e=>{if(!e||typeof e!="object")return null;const t=e;return t.nodeType===3?t.parentElement??null:t},y=e=>{if(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)return null;const t=e.key.toLowerCase();if(e.code==="Space"||t===" "||t==="spacebar")return"togglePlayback";switch(t){case"arrowleft":return"previous";case"arrowright":return"next";case"f":return"fullscreen";case"c":return"subtitle";case"n":return"interaction";default:return null}},u=e=>{const t=l(e);if(!t)return!1;const o=t.tagName?.toLowerCase();if(o==="input"||o==="textarea"||o==="select"||t.isContentEditable)return!0;const n=t.getAttribute?.("contenteditable");return n!=null?n.toLowerCase()!=="false":!!t.closest?.(s)},c=e=>{const t=l(e);return t?t.tagName?.toLowerCase()==="button"?!0:!!t.closest?.(i):!1},d=(e,t)=>e.defaultPrevented||!t||u(e.target)?!0:t==="togglePlayback"&&c(e.target),b=e=>(a.add(e),(!r||!a.has(r))&&(r=e),()=>{a.delete(e),r===e&&(r=a.values().next().value??null)}),f=e=>{if(a.size===0){r=e;return}a.has(e)&&(r=e)},g=e=>r===e;exports.activatePlayerKeyboardShortcutOwner=f;exports.getPlayerKeyboardShortcutAction=y;exports.isActivePlayerKeyboardShortcutOwner=g;exports.isPlayerKeyboardShortcutEditableTarget=u;exports.isPlayerKeyboardShortcutNativeSpaceTarget=c;exports.registerPlayerKeyboardShortcutOwner=b;exports.shouldIgnorePlayerKeyboardShortcutEvent=d;
2
+ //# sourceMappingURL=playerKeyboardShortcuts.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playerKeyboardShortcuts.cjs.js","sources":["../../../../src/components/Slide/utils/playerKeyboardShortcuts.ts"],"sourcesContent":["export type PlayerKeyboardShortcutAction =\n | \"togglePlayback\"\n | \"previous\"\n | \"next\"\n | \"fullscreen\"\n | \"subtitle\"\n | \"interaction\";\n\nexport interface PlayerKeyboardShortcutEventLike {\n altKey?: boolean;\n code?: string;\n ctrlKey?: boolean;\n defaultPrevented?: boolean;\n key: string;\n metaKey?: boolean;\n shiftKey?: boolean;\n target?: EventTarget | null;\n}\n\ntype KeyboardShortcutTarget = EventTarget & {\n closest?: (selectors: string) => unknown;\n getAttribute?: (qualifiedName: string) => string | null;\n isContentEditable?: boolean;\n nodeType?: number;\n parentElement?: Element | null;\n tagName?: string;\n};\n\nconst EDITABLE_SELECTOR =\n 'input, textarea, select, [contenteditable]:not([contenteditable=\"false\"]), [role=\"textbox\"], [role=\"slider\"], [role=\"listbox\"], [role=\"combobox\"], [role=\"tablist\"], [role=\"menu\"], [role=\"tree\"], [role=\"grid\"], [data-player-keyboard-shortcuts-ignore=\"true\"]';\n\nconst NATIVE_SPACE_TARGET_SELECTOR = \"button, [role='button']\";\n\nconst playerKeyboardShortcutOwners = new Set<string>();\nlet activePlayerKeyboardShortcutOwnerId: string | null = null;\n\nconst getTargetCandidate = (\n target: EventTarget | null | undefined\n): KeyboardShortcutTarget | null => {\n if (!target || typeof target !== \"object\") {\n return null;\n }\n\n const candidate = target as KeyboardShortcutTarget;\n\n if (candidate.nodeType === 3) {\n return (candidate.parentElement as KeyboardShortcutTarget | null) ?? null;\n }\n\n return candidate;\n};\n\nexport const getPlayerKeyboardShortcutAction = (\n event: PlayerKeyboardShortcutEventLike\n): PlayerKeyboardShortcutAction | null => {\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return null;\n }\n\n const normalizedKey = event.key.toLowerCase();\n\n if (\n event.code === \"Space\" ||\n normalizedKey === \" \" ||\n normalizedKey === \"spacebar\"\n ) {\n return \"togglePlayback\";\n }\n\n switch (normalizedKey) {\n case \"arrowleft\":\n return \"previous\";\n case \"arrowright\":\n return \"next\";\n case \"f\":\n return \"fullscreen\";\n case \"c\":\n return \"subtitle\";\n case \"n\":\n return \"interaction\";\n default:\n return null;\n }\n};\n\nexport const isPlayerKeyboardShortcutEditableTarget = (\n target: EventTarget | null | undefined\n) => {\n const candidate = getTargetCandidate(target);\n\n if (!candidate) {\n return false;\n }\n\n const tagName = candidate.tagName?.toLowerCase();\n\n if (tagName === \"input\" || tagName === \"textarea\" || tagName === \"select\") {\n return true;\n }\n\n if (candidate.isContentEditable) {\n return true;\n }\n\n const contentEditable = candidate.getAttribute?.(\"contenteditable\");\n\n if (contentEditable !== undefined && contentEditable !== null) {\n return contentEditable.toLowerCase() !== \"false\";\n }\n\n return Boolean(candidate.closest?.(EDITABLE_SELECTOR));\n};\n\nexport const isPlayerKeyboardShortcutNativeSpaceTarget = (\n target: EventTarget | null | undefined\n) => {\n const candidate = getTargetCandidate(target);\n\n if (!candidate) {\n return false;\n }\n\n const tagName = candidate.tagName?.toLowerCase();\n\n if (tagName === \"button\") {\n return true;\n }\n\n return Boolean(candidate.closest?.(NATIVE_SPACE_TARGET_SELECTOR));\n};\n\nexport const shouldIgnorePlayerKeyboardShortcutEvent = (\n event: PlayerKeyboardShortcutEventLike,\n action: PlayerKeyboardShortcutAction | null\n) => {\n if (event.defaultPrevented || !action) {\n return true;\n }\n\n if (isPlayerKeyboardShortcutEditableTarget(event.target)) {\n return true;\n }\n\n return (\n action === \"togglePlayback\" &&\n isPlayerKeyboardShortcutNativeSpaceTarget(event.target)\n );\n};\n\nexport const registerPlayerKeyboardShortcutOwner = (ownerId: string) => {\n playerKeyboardShortcutOwners.add(ownerId);\n\n if (\n !activePlayerKeyboardShortcutOwnerId ||\n !playerKeyboardShortcutOwners.has(activePlayerKeyboardShortcutOwnerId)\n ) {\n activePlayerKeyboardShortcutOwnerId = ownerId;\n }\n\n return () => {\n playerKeyboardShortcutOwners.delete(ownerId);\n\n if (activePlayerKeyboardShortcutOwnerId !== ownerId) {\n return;\n }\n\n activePlayerKeyboardShortcutOwnerId =\n playerKeyboardShortcutOwners.values().next().value ?? null;\n };\n};\n\nexport const activatePlayerKeyboardShortcutOwner = (ownerId: string) => {\n if (playerKeyboardShortcutOwners.size === 0) {\n activePlayerKeyboardShortcutOwnerId = ownerId;\n return;\n }\n\n if (playerKeyboardShortcutOwners.has(ownerId)) {\n activePlayerKeyboardShortcutOwnerId = ownerId;\n }\n};\n\nexport const isActivePlayerKeyboardShortcutOwner = (ownerId: string) =>\n activePlayerKeyboardShortcutOwnerId === ownerId;\n\nexport const resetPlayerKeyboardShortcutOwnersForTest = () => {\n playerKeyboardShortcutOwners.clear();\n activePlayerKeyboardShortcutOwnerId = null;\n};\n"],"names":["EDITABLE_SELECTOR","NATIVE_SPACE_TARGET_SELECTOR","playerKeyboardShortcutOwners","activePlayerKeyboardShortcutOwnerId","getTargetCandidate","target","candidate","getPlayerKeyboardShortcutAction","event","normalizedKey","isPlayerKeyboardShortcutEditableTarget","tagName","contentEditable","isPlayerKeyboardShortcutNativeSpaceTarget","shouldIgnorePlayerKeyboardShortcutEvent","action","registerPlayerKeyboardShortcutOwner","ownerId","activatePlayerKeyboardShortcutOwner","isActivePlayerKeyboardShortcutOwner"],"mappings":"gFA4BA,MAAMA,EACJ,mQAEIC,EAA+B,0BAE/BC,MAAmC,IACzC,IAAIC,EAAqD,KAEzD,MAAMC,EACJC,GACkC,CAClC,GAAI,CAACA,GAAU,OAAOA,GAAW,SAC/B,OAAO,KAGT,MAAMC,EAAYD,EAElB,OAAIC,EAAU,WAAa,EACjBA,EAAU,eAAmD,KAGhEA,CACT,EAEaC,EACXC,GACwC,CACxC,GAAIA,EAAM,QAAUA,EAAM,SAAWA,EAAM,SAAWA,EAAM,SAC1D,OAAO,KAGT,MAAMC,EAAgBD,EAAM,IAAI,YAAA,EAEhC,GACEA,EAAM,OAAS,SACfC,IAAkB,KAClBA,IAAkB,WAElB,MAAO,iBAGT,OAAQA,EAAA,CACN,IAAK,YACH,MAAO,WACT,IAAK,aACH,MAAO,OACT,IAAK,IACH,MAAO,aACT,IAAK,IACH,MAAO,WACT,IAAK,IACH,MAAO,cACT,QACE,OAAO,IAAA,CAEb,EAEaC,EACXL,GACG,CACH,MAAMC,EAAYF,EAAmBC,CAAM,EAE3C,GAAI,CAACC,EACH,MAAO,GAGT,MAAMK,EAAUL,EAAU,SAAS,YAAA,EAMnC,GAJIK,IAAY,SAAWA,IAAY,YAAcA,IAAY,UAI7DL,EAAU,kBACZ,MAAO,GAGT,MAAMM,EAAkBN,EAAU,eAAe,iBAAiB,EAElE,OAAqCM,GAAoB,KAChDA,EAAgB,gBAAkB,QAGpC,EAAQN,EAAU,UAAUN,CAAiB,CACtD,EAEaa,EACXR,GACG,CACH,MAAMC,EAAYF,EAAmBC,CAAM,EAE3C,OAAKC,EAIWA,EAAU,SAAS,YAAA,IAEnB,SACP,GAGF,EAAQA,EAAU,UAAUL,CAA4B,EATtD,EAUX,EAEaa,EAA0C,CACrDN,EACAO,IAEIP,EAAM,kBAAoB,CAACO,GAI3BL,EAAuCF,EAAM,MAAM,EAC9C,GAIPO,IAAW,kBACXF,EAA0CL,EAAM,MAAM,EAI7CQ,EAAuCC,IAClDf,EAA6B,IAAIe,CAAO,GAGtC,CAACd,GACD,CAACD,EAA6B,IAAIC,CAAmC,KAErEA,EAAsCc,GAGjC,IAAM,CACXf,EAA6B,OAAOe,CAAO,EAEvCd,IAAwCc,IAI5Cd,EACED,EAA6B,OAAA,EAAS,KAAA,EAAO,OAAS,KAC1D,GAGWgB,EAAuCD,GAAoB,CACtE,GAAIf,EAA6B,OAAS,EAAG,CAC3CC,EAAsCc,EACtC,MACF,CAEIf,EAA6B,IAAIe,CAAO,IAC1Cd,EAAsCc,EAE1C,EAEaE,EAAuCF,GAClDd,IAAwCc"}
@@ -0,0 +1,19 @@
1
+ export type PlayerKeyboardShortcutAction = "togglePlayback" | "previous" | "next" | "fullscreen" | "subtitle" | "interaction";
2
+ export interface PlayerKeyboardShortcutEventLike {
3
+ altKey?: boolean;
4
+ code?: string;
5
+ ctrlKey?: boolean;
6
+ defaultPrevented?: boolean;
7
+ key: string;
8
+ metaKey?: boolean;
9
+ shiftKey?: boolean;
10
+ target?: EventTarget | null;
11
+ }
12
+ export declare const getPlayerKeyboardShortcutAction: (event: PlayerKeyboardShortcutEventLike) => PlayerKeyboardShortcutAction | null;
13
+ export declare const isPlayerKeyboardShortcutEditableTarget: (target: EventTarget | null | undefined) => boolean;
14
+ export declare const isPlayerKeyboardShortcutNativeSpaceTarget: (target: EventTarget | null | undefined) => boolean;
15
+ export declare const shouldIgnorePlayerKeyboardShortcutEvent: (event: PlayerKeyboardShortcutEventLike, action: PlayerKeyboardShortcutAction | null) => boolean;
16
+ export declare const registerPlayerKeyboardShortcutOwner: (ownerId: string) => () => void;
17
+ export declare const activatePlayerKeyboardShortcutOwner: (ownerId: string) => void;
18
+ export declare const isActivePlayerKeyboardShortcutOwner: (ownerId: string) => boolean;
19
+ export declare const resetPlayerKeyboardShortcutOwnersForTest: () => void;
@@ -0,0 +1,58 @@
1
+ const u = 'input, textarea, select, [contenteditable]:not([contenteditable="false"]), [role="textbox"], [role="slider"], [role="listbox"], [role="combobox"], [role="tablist"], [role="menu"], [role="tree"], [role="grid"], [data-player-keyboard-shortcuts-ignore="true"]', c = "button, [role='button']", a = /* @__PURE__ */ new Set();
2
+ let r = null;
3
+ const l = (e) => {
4
+ if (!e || typeof e != "object")
5
+ return null;
6
+ const t = e;
7
+ return t.nodeType === 3 ? t.parentElement ?? null : t;
8
+ }, d = (e) => {
9
+ if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey)
10
+ return null;
11
+ const t = e.key.toLowerCase();
12
+ if (e.code === "Space" || t === " " || t === "spacebar")
13
+ return "togglePlayback";
14
+ switch (t) {
15
+ case "arrowleft":
16
+ return "previous";
17
+ case "arrowright":
18
+ return "next";
19
+ case "f":
20
+ return "fullscreen";
21
+ case "c":
22
+ return "subtitle";
23
+ case "n":
24
+ return "interaction";
25
+ default:
26
+ return null;
27
+ }
28
+ }, s = (e) => {
29
+ const t = l(e);
30
+ if (!t)
31
+ return !1;
32
+ const o = t.tagName?.toLowerCase();
33
+ if (o === "input" || o === "textarea" || o === "select" || t.isContentEditable)
34
+ return !0;
35
+ const n = t.getAttribute?.("contenteditable");
36
+ return n != null ? n.toLowerCase() !== "false" : !!t.closest?.(u);
37
+ }, i = (e) => {
38
+ const t = l(e);
39
+ return t ? t.tagName?.toLowerCase() === "button" ? !0 : !!t.closest?.(c) : !1;
40
+ }, b = (e, t) => e.defaultPrevented || !t || s(e.target) ? !0 : t === "togglePlayback" && i(e.target), y = (e) => (a.add(e), (!r || !a.has(r)) && (r = e), () => {
41
+ a.delete(e), r === e && (r = a.values().next().value ?? null);
42
+ }), f = (e) => {
43
+ if (a.size === 0) {
44
+ r = e;
45
+ return;
46
+ }
47
+ a.has(e) && (r = e);
48
+ }, g = (e) => r === e;
49
+ export {
50
+ f as activatePlayerKeyboardShortcutOwner,
51
+ d as getPlayerKeyboardShortcutAction,
52
+ g as isActivePlayerKeyboardShortcutOwner,
53
+ s as isPlayerKeyboardShortcutEditableTarget,
54
+ i as isPlayerKeyboardShortcutNativeSpaceTarget,
55
+ y as registerPlayerKeyboardShortcutOwner,
56
+ b as shouldIgnorePlayerKeyboardShortcutEvent
57
+ };
58
+ //# sourceMappingURL=playerKeyboardShortcuts.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playerKeyboardShortcuts.es.js","sources":["../../../../src/components/Slide/utils/playerKeyboardShortcuts.ts"],"sourcesContent":["export type PlayerKeyboardShortcutAction =\n | \"togglePlayback\"\n | \"previous\"\n | \"next\"\n | \"fullscreen\"\n | \"subtitle\"\n | \"interaction\";\n\nexport interface PlayerKeyboardShortcutEventLike {\n altKey?: boolean;\n code?: string;\n ctrlKey?: boolean;\n defaultPrevented?: boolean;\n key: string;\n metaKey?: boolean;\n shiftKey?: boolean;\n target?: EventTarget | null;\n}\n\ntype KeyboardShortcutTarget = EventTarget & {\n closest?: (selectors: string) => unknown;\n getAttribute?: (qualifiedName: string) => string | null;\n isContentEditable?: boolean;\n nodeType?: number;\n parentElement?: Element | null;\n tagName?: string;\n};\n\nconst EDITABLE_SELECTOR =\n 'input, textarea, select, [contenteditable]:not([contenteditable=\"false\"]), [role=\"textbox\"], [role=\"slider\"], [role=\"listbox\"], [role=\"combobox\"], [role=\"tablist\"], [role=\"menu\"], [role=\"tree\"], [role=\"grid\"], [data-player-keyboard-shortcuts-ignore=\"true\"]';\n\nconst NATIVE_SPACE_TARGET_SELECTOR = \"button, [role='button']\";\n\nconst playerKeyboardShortcutOwners = new Set<string>();\nlet activePlayerKeyboardShortcutOwnerId: string | null = null;\n\nconst getTargetCandidate = (\n target: EventTarget | null | undefined\n): KeyboardShortcutTarget | null => {\n if (!target || typeof target !== \"object\") {\n return null;\n }\n\n const candidate = target as KeyboardShortcutTarget;\n\n if (candidate.nodeType === 3) {\n return (candidate.parentElement as KeyboardShortcutTarget | null) ?? null;\n }\n\n return candidate;\n};\n\nexport const getPlayerKeyboardShortcutAction = (\n event: PlayerKeyboardShortcutEventLike\n): PlayerKeyboardShortcutAction | null => {\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return null;\n }\n\n const normalizedKey = event.key.toLowerCase();\n\n if (\n event.code === \"Space\" ||\n normalizedKey === \" \" ||\n normalizedKey === \"spacebar\"\n ) {\n return \"togglePlayback\";\n }\n\n switch (normalizedKey) {\n case \"arrowleft\":\n return \"previous\";\n case \"arrowright\":\n return \"next\";\n case \"f\":\n return \"fullscreen\";\n case \"c\":\n return \"subtitle\";\n case \"n\":\n return \"interaction\";\n default:\n return null;\n }\n};\n\nexport const isPlayerKeyboardShortcutEditableTarget = (\n target: EventTarget | null | undefined\n) => {\n const candidate = getTargetCandidate(target);\n\n if (!candidate) {\n return false;\n }\n\n const tagName = candidate.tagName?.toLowerCase();\n\n if (tagName === \"input\" || tagName === \"textarea\" || tagName === \"select\") {\n return true;\n }\n\n if (candidate.isContentEditable) {\n return true;\n }\n\n const contentEditable = candidate.getAttribute?.(\"contenteditable\");\n\n if (contentEditable !== undefined && contentEditable !== null) {\n return contentEditable.toLowerCase() !== \"false\";\n }\n\n return Boolean(candidate.closest?.(EDITABLE_SELECTOR));\n};\n\nexport const isPlayerKeyboardShortcutNativeSpaceTarget = (\n target: EventTarget | null | undefined\n) => {\n const candidate = getTargetCandidate(target);\n\n if (!candidate) {\n return false;\n }\n\n const tagName = candidate.tagName?.toLowerCase();\n\n if (tagName === \"button\") {\n return true;\n }\n\n return Boolean(candidate.closest?.(NATIVE_SPACE_TARGET_SELECTOR));\n};\n\nexport const shouldIgnorePlayerKeyboardShortcutEvent = (\n event: PlayerKeyboardShortcutEventLike,\n action: PlayerKeyboardShortcutAction | null\n) => {\n if (event.defaultPrevented || !action) {\n return true;\n }\n\n if (isPlayerKeyboardShortcutEditableTarget(event.target)) {\n return true;\n }\n\n return (\n action === \"togglePlayback\" &&\n isPlayerKeyboardShortcutNativeSpaceTarget(event.target)\n );\n};\n\nexport const registerPlayerKeyboardShortcutOwner = (ownerId: string) => {\n playerKeyboardShortcutOwners.add(ownerId);\n\n if (\n !activePlayerKeyboardShortcutOwnerId ||\n !playerKeyboardShortcutOwners.has(activePlayerKeyboardShortcutOwnerId)\n ) {\n activePlayerKeyboardShortcutOwnerId = ownerId;\n }\n\n return () => {\n playerKeyboardShortcutOwners.delete(ownerId);\n\n if (activePlayerKeyboardShortcutOwnerId !== ownerId) {\n return;\n }\n\n activePlayerKeyboardShortcutOwnerId =\n playerKeyboardShortcutOwners.values().next().value ?? null;\n };\n};\n\nexport const activatePlayerKeyboardShortcutOwner = (ownerId: string) => {\n if (playerKeyboardShortcutOwners.size === 0) {\n activePlayerKeyboardShortcutOwnerId = ownerId;\n return;\n }\n\n if (playerKeyboardShortcutOwners.has(ownerId)) {\n activePlayerKeyboardShortcutOwnerId = ownerId;\n }\n};\n\nexport const isActivePlayerKeyboardShortcutOwner = (ownerId: string) =>\n activePlayerKeyboardShortcutOwnerId === ownerId;\n\nexport const resetPlayerKeyboardShortcutOwnersForTest = () => {\n playerKeyboardShortcutOwners.clear();\n activePlayerKeyboardShortcutOwnerId = null;\n};\n"],"names":["EDITABLE_SELECTOR","NATIVE_SPACE_TARGET_SELECTOR","playerKeyboardShortcutOwners","activePlayerKeyboardShortcutOwnerId","getTargetCandidate","target","candidate","getPlayerKeyboardShortcutAction","event","normalizedKey","isPlayerKeyboardShortcutEditableTarget","tagName","contentEditable","isPlayerKeyboardShortcutNativeSpaceTarget","shouldIgnorePlayerKeyboardShortcutEvent","action","registerPlayerKeyboardShortcutOwner","ownerId","activatePlayerKeyboardShortcutOwner","isActivePlayerKeyboardShortcutOwner"],"mappings":"AA4BA,MAAMA,IACJ,oQAEIC,IAA+B,2BAE/BC,wBAAmC,IAAA;AACzC,IAAIC,IAAqD;AAEzD,MAAMC,IAAqB,CACzBC,MACkC;AAClC,MAAI,CAACA,KAAU,OAAOA,KAAW;AAC/B,WAAO;AAGT,QAAMC,IAAYD;AAElB,SAAIC,EAAU,aAAa,IACjBA,EAAU,iBAAmD,OAGhEA;AACT,GAEaC,IAAkC,CAC7CC,MACwC;AACxC,MAAIA,EAAM,UAAUA,EAAM,WAAWA,EAAM,WAAWA,EAAM;AAC1D,WAAO;AAGT,QAAMC,IAAgBD,EAAM,IAAI,YAAA;AAEhC,MACEA,EAAM,SAAS,WACfC,MAAkB,OAClBA,MAAkB;AAElB,WAAO;AAGT,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb,GAEaC,IAAyC,CACpDL,MACG;AACH,QAAMC,IAAYF,EAAmBC,CAAM;AAE3C,MAAI,CAACC;AACH,WAAO;AAGT,QAAMK,IAAUL,EAAU,SAAS,YAAA;AAMnC,MAJIK,MAAY,WAAWA,MAAY,cAAcA,MAAY,YAI7DL,EAAU;AACZ,WAAO;AAGT,QAAMM,IAAkBN,EAAU,eAAe,iBAAiB;AAElE,SAAqCM,KAAoB,OAChDA,EAAgB,kBAAkB,UAGpC,EAAQN,EAAU,UAAUN,CAAiB;AACtD,GAEaa,IAA4C,CACvDR,MACG;AACH,QAAMC,IAAYF,EAAmBC,CAAM;AAE3C,SAAKC,IAIWA,EAAU,SAAS,YAAA,MAEnB,WACP,KAGF,EAAQA,EAAU,UAAUL,CAA4B,IATtD;AAUX,GAEaa,IAA0C,CACrDN,GACAO,MAEIP,EAAM,oBAAoB,CAACO,KAI3BL,EAAuCF,EAAM,MAAM,IAC9C,KAIPO,MAAW,oBACXF,EAA0CL,EAAM,MAAM,GAI7CQ,IAAsC,CAACC,OAClDf,EAA6B,IAAIe,CAAO,IAGtC,CAACd,KACD,CAACD,EAA6B,IAAIC,CAAmC,OAErEA,IAAsCc,IAGjC,MAAM;AAGX,EAFAf,EAA6B,OAAOe,CAAO,GAEvCd,MAAwCc,MAI5Cd,IACED,EAA6B,OAAA,EAAS,KAAA,EAAO,SAAS;AAC1D,IAGWgB,IAAsC,CAACD,MAAoB;AACtE,MAAIf,EAA6B,SAAS,GAAG;AAC3C,IAAAC,IAAsCc;AACtC;AAAA,EACF;AAEA,EAAIf,EAA6B,IAAIe,CAAO,MAC1Cd,IAAsCc;AAE1C,GAEaE,IAAsC,CAACF,MAClDd,MAAwCc;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("../../../../_virtual/index.cjs9.js"),v=require("./constants.cjs.js");var d;function x(){if(d)return c.__exports;d=1,Object.defineProperty(c.__exports,"__esModule",{value:!0}),c.__exports.sanitizeUrl=void 0;var e=v.__require();function m(r){return e.relativeFirstCharacters.indexOf(r[0])>-1}function p(r){var i=r.replace(e.ctrlCharactersRegex,"");return i.replace(e.htmlEntitiesRegex,function(t,a){return String.fromCharCode(a)})}function R(r){return URL.canParse(r)}function l(r){try{return decodeURIComponent(r)}catch{return r}}function f(r){if(!r)return e.BLANK_URL;var i,t=l(r.trim());do t=p(t).replace(e.htmlCtrlEntityRegex,"").replace(e.ctrlCharactersRegex,"").replace(e.whitespaceEscapeCharsRegex,"").trim(),t=l(t),i=t.match(e.ctrlCharactersRegex)||t.match(e.htmlEntitiesRegex)||t.match(e.htmlCtrlEntityRegex)||t.match(e.whitespaceEscapeCharsRegex);while(i&&i.length>0);var a=t;if(!a)return e.BLANK_URL;if(m(a))return a;var u=a.trimStart(),h=u.match(e.urlSchemeRegex);if(!h)return a;var n=h[0].toLowerCase().trim();if(e.invalidProtocolRegex.test(n))return e.BLANK_URL;var s=u.replace(/\\/g,"/");if(n==="mailto:"||n.includes("://"))return s;if(n==="http:"||n==="https:"){if(!R(s))return e.BLANK_URL;var o=new URL(s);return o.protocol=o.protocol.toLowerCase(),o.hostname=o.hostname.toLowerCase(),o.toString()}return s}return c.__exports.sanitizeUrl=f,c.__exports}exports.__require=x;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("../../../../_virtual/index.cjs8.js"),v=require("./constants.cjs.js");var d;function x(){if(d)return c.__exports;d=1,Object.defineProperty(c.__exports,"__esModule",{value:!0}),c.__exports.sanitizeUrl=void 0;var e=v.__require();function m(r){return e.relativeFirstCharacters.indexOf(r[0])>-1}function p(r){var i=r.replace(e.ctrlCharactersRegex,"");return i.replace(e.htmlEntitiesRegex,function(t,a){return String.fromCharCode(a)})}function R(r){return URL.canParse(r)}function l(r){try{return decodeURIComponent(r)}catch{return r}}function f(r){if(!r)return e.BLANK_URL;var i,t=l(r.trim());do t=p(t).replace(e.htmlCtrlEntityRegex,"").replace(e.ctrlCharactersRegex,"").replace(e.whitespaceEscapeCharsRegex,"").trim(),t=l(t),i=t.match(e.ctrlCharactersRegex)||t.match(e.htmlEntitiesRegex)||t.match(e.htmlCtrlEntityRegex)||t.match(e.whitespaceEscapeCharsRegex);while(i&&i.length>0);var a=t;if(!a)return e.BLANK_URL;if(m(a))return a;var u=a.trimStart(),h=u.match(e.urlSchemeRegex);if(!h)return a;var n=h[0].toLowerCase().trim();if(e.invalidProtocolRegex.test(n))return e.BLANK_URL;var s=u.replace(/\\/g,"/");if(n==="mailto:"||n.includes("://"))return s;if(n==="http:"||n==="https:"){if(!R(s))return e.BLANK_URL;var o=new URL(s);return o.protocol=o.protocol.toLowerCase(),o.hostname=o.hostname.toLowerCase(),o.toString()}return s}return c.__exports.sanitizeUrl=f,c.__exports}exports.__require=x;
2
2
  //# sourceMappingURL=index.cjs.js.map
@@ -1,4 +1,4 @@
1
- import { __exports as c } from "../../../../_virtual/index.es9.js";
1
+ import { __exports as c } from "../../../../_virtual/index.es8.js";
2
2
  import { __require as v } from "./constants.es.js";
3
3
  var m;
4
4
  function g() {
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../../_virtual/index.cjs8.js");/*!
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../../_virtual/index.cjs9.js");/*!
2
2
  Copyright (c) 2018 Jed Watson.
3
3
  Licensed under the MIT License (MIT), see
4
4
  http://jedwatson.github.io/classnames
@@ -1,4 +1,4 @@
1
- import { __module as s } from "../../_virtual/index.es8.js";
1
+ import { __module as s } from "../../_virtual/index.es9.js";
2
2
  /*!
3
3
  Copyright (c) 2018 Jed Watson.
4
4
  Licensed under the MIT License (MIT), see
package/package.json CHANGED
@@ -13,6 +13,7 @@
13
13
  "@codemirror/lang-markdown": "^6.3.3",
14
14
  "@codemirror/language": "^6.11.3",
15
15
  "@codemirror/language-data": "^6.5.1",
16
+ "@codemirror/state": "^6.5.2",
16
17
  "@codemirror/view": "^6.38.1",
17
18
  "@fontsource/inter": "^5.2.8",
18
19
  "@microsoft/fetch-event-source": "^2.0.1",
@@ -173,7 +174,7 @@
173
174
  ]
174
175
  }
175
176
  },
176
- "version": "0.1.124",
177
+ "version": "0.1.125",
177
178
  "type": "module",
178
179
  "exports": {
179
180
  ".": {