@basthon/gui-base 0.70.2 → 0.71.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/main.d.ts CHANGED
@@ -34,6 +34,9 @@ export declare class GUIBase {
34
34
  * Kernel getter.
35
35
  */
36
36
  get kernel(): KernelBase | undefined;
37
+ /**
38
+ * Get the kernel or null if it's not ready.
39
+ */
37
40
  get kernelSafe(): KernelBase | null;
38
41
  /**
39
42
  * KernelLoader getter.
@@ -212,4 +215,10 @@ export declare class GUIBase {
212
215
  * Reverse version of deflate.
213
216
  */
214
217
  inflate(content: string): Promise<string>;
218
+ /**
219
+ * Handle communication between dynamic iframe and main thread
220
+ * (mainly for auto-resize in height). Iframe comes from a display event,
221
+ * like in tutor.
222
+ */
223
+ handleDynamicIFrame(iframe: HTMLIFrameElement): Promise<void>;
215
224
  }
package/lib/main.js CHANGED
@@ -35,6 +35,9 @@ export class GUIBase {
35
35
  get kernel() {
36
36
  return this._loader.kernel;
37
37
  }
38
+ /**
39
+ * Get the kernel or null if it's not ready.
40
+ */
38
41
  get kernelSafe() {
39
42
  return this._loader.kernelSafe;
40
43
  }
@@ -533,6 +536,40 @@ Un lien permanant vers le contenu actuel a été créé.
533
536
  const { Base64 } = await import("js-base64");
534
537
  return pako.inflate(Base64.toUint8Array(content), { to: "string" });
535
538
  }
539
+ /**
540
+ * Handle communication between dynamic iframe and main thread
541
+ * (mainly for auto-resize in height). Iframe comes from a display event,
542
+ * like in tutor.
543
+ */
544
+ async handleDynamicIFrame(iframe) {
545
+ const { port1, port2 } = new MessageChannel();
546
+ port1.onmessage = (event) => {
547
+ const data = event.data;
548
+ const type = data?.type;
549
+ switch (type) {
550
+ case "height":
551
+ const height = data?.content;
552
+ if (height != null)
553
+ iframe.style.height = `${height + 20}px`;
554
+ default:
555
+ break;
556
+ }
557
+ };
558
+ // wait for iframe to be ready
559
+ await new Promise((resolve, reject) => {
560
+ iframe.onload = () => resolve();
561
+ iframe.onerror = reject;
562
+ });
563
+ iframe.contentWindow.postMessage(port2, "*", [port2]);
564
+ // refresh drawing at first display
565
+ const observer = new IntersectionObserver((entries) => {
566
+ if (entries[0].intersectionRatio > 0) {
567
+ port1.postMessage({ type: "refresh" });
568
+ observer.disconnect(); // refresh only once
569
+ }
570
+ }, { root: document.documentElement });
571
+ observer.observe(iframe);
572
+ }
536
573
  }
537
574
  /**
538
575
  * Copy a text to clipboard.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@basthon/gui-base",
3
- "version": "0.70.2",
3
+ "version": "0.71.0",
4
4
  "description": "Basthon - Base GUI",
5
5
  "homepage": "https://basthon.fr",
6
6
  "bugs": {
@@ -25,9 +25,9 @@
25
25
  "clean": "rm -rf lib/"
26
26
  },
27
27
  "dependencies": {
28
- "@basthon/checkpoints": "0.70.2",
29
- "@basthon/kernel-base": "0.70.2",
30
- "@basthon/kernel-loader": "0.70.2",
28
+ "@basthon/checkpoints": "0.71.0",
29
+ "@basthon/kernel-base": "0.71.0",
30
+ "@basthon/kernel-loader": "0.71.0",
31
31
  "js-base64": "^3.7.7",
32
32
  "pako": "^2.1.0",
33
33
  "promise-delegate": "^1.0.1"
@@ -39,5 +39,5 @@
39
39
  "publishConfig": {
40
40
  "access": "public"
41
41
  },
42
- "gitHead": "b63e9c7e37f0b583ee39e81918d638c2104470e6"
42
+ "gitHead": "669f1f0bb86e4829ddfd4064845f981901cf870d"
43
43
  }