@seamlet/astro 0.11.2 → 0.11.3
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/bridge.js +64 -4
- package/package.json +1 -1
package/dist/bridge.js
CHANGED
|
@@ -372,11 +372,57 @@ function createLayoutReports(document2, report) {
|
|
|
372
372
|
};
|
|
373
373
|
}
|
|
374
374
|
|
|
375
|
+
// src/bridge/page-presses.ts
|
|
376
|
+
function followPresses(document2, onRelease) {
|
|
377
|
+
const view = document2.defaultView;
|
|
378
|
+
let isPressed = false;
|
|
379
|
+
let releaseTimer;
|
|
380
|
+
const press = () => {
|
|
381
|
+
clearTimeout(releaseTimer);
|
|
382
|
+
isPressed = true;
|
|
383
|
+
};
|
|
384
|
+
const release = () => {
|
|
385
|
+
if (!isPressed) return;
|
|
386
|
+
isPressed = false;
|
|
387
|
+
releaseTimer = setTimeout(onRelease, 0);
|
|
388
|
+
};
|
|
389
|
+
const releaseOnMove = (event) => {
|
|
390
|
+
if (event.buttons === 0) release();
|
|
391
|
+
};
|
|
392
|
+
const listeners = [
|
|
393
|
+
["pointerdown", press],
|
|
394
|
+
["pointerup", release],
|
|
395
|
+
["pointercancel", release],
|
|
396
|
+
["pointermove", releaseOnMove]
|
|
397
|
+
];
|
|
398
|
+
for (const [type, listener] of listeners) {
|
|
399
|
+
document2.addEventListener(type, listener, true);
|
|
400
|
+
}
|
|
401
|
+
view?.addEventListener("blur", release);
|
|
402
|
+
return {
|
|
403
|
+
isPressed: () => isPressed,
|
|
404
|
+
stop: () => {
|
|
405
|
+
clearTimeout(releaseTimer);
|
|
406
|
+
for (const [type, listener] of listeners) {
|
|
407
|
+
document2.removeEventListener(type, listener, true);
|
|
408
|
+
}
|
|
409
|
+
view?.removeEventListener("blur", release);
|
|
410
|
+
}
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
|
|
375
414
|
// src/bridge/page-rendering.ts
|
|
376
415
|
function createPageRenderer(options) {
|
|
377
416
|
let request;
|
|
417
|
+
let heldPage;
|
|
418
|
+
const show = (html) => {
|
|
419
|
+
if (!options.canReplacePage()) return;
|
|
420
|
+
replacePageBody(options.document, html);
|
|
421
|
+
options.onRendered();
|
|
422
|
+
};
|
|
378
423
|
const render2 = (content) => {
|
|
379
424
|
request?.abort();
|
|
425
|
+
heldPage = void 0;
|
|
380
426
|
const currentRequest = new AbortController();
|
|
381
427
|
request = currentRequest;
|
|
382
428
|
fetchRenderedPage(
|
|
@@ -384,18 +430,27 @@ function createPageRenderer(options) {
|
|
|
384
430
|
content,
|
|
385
431
|
currentRequest.signal
|
|
386
432
|
).then((html) => {
|
|
387
|
-
if (
|
|
388
|
-
|
|
389
|
-
|
|
433
|
+
if (options.isPagePressed()) {
|
|
434
|
+
heldPage = html;
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
show(html);
|
|
390
438
|
}).catch((error) => {
|
|
391
439
|
if (currentRequest.signal.aborted) return;
|
|
392
440
|
options.onFailed(error);
|
|
393
441
|
});
|
|
394
442
|
};
|
|
443
|
+
const showHeldPage = () => {
|
|
444
|
+
const html = heldPage;
|
|
445
|
+
heldPage = void 0;
|
|
446
|
+
if (html !== void 0) show(html);
|
|
447
|
+
};
|
|
395
448
|
return {
|
|
396
449
|
render: render2,
|
|
450
|
+
showHeldPage,
|
|
397
451
|
stop: () => {
|
|
398
452
|
request?.abort();
|
|
453
|
+
heldPage = void 0;
|
|
399
454
|
}
|
|
400
455
|
};
|
|
401
456
|
}
|
|
@@ -855,7 +910,7 @@ function createPageTyping(options) {
|
|
|
855
910
|
};
|
|
856
911
|
return {
|
|
857
912
|
prepare,
|
|
858
|
-
isTyping: () => stopEditing !== void 0,
|
|
913
|
+
isTyping: () => stopEditing !== void 0 || prepared !== void 0,
|
|
859
914
|
start,
|
|
860
915
|
startRich,
|
|
861
916
|
format: (format) => richEditing?.format(format),
|
|
@@ -896,10 +951,14 @@ function connectPage(document2, schema, send) {
|
|
|
896
951
|
send({ type: "layout", layout: measured });
|
|
897
952
|
});
|
|
898
953
|
const typing = createPageTyping({ document: document2, send, onInput: layout.schedule });
|
|
954
|
+
const presses = followPresses(document2, () => {
|
|
955
|
+
renderer.showHeldPage();
|
|
956
|
+
});
|
|
899
957
|
const renderer = createPageRenderer({
|
|
900
958
|
document: document2,
|
|
901
959
|
// Replacing the page under a text being typed would throw the typing away.
|
|
902
960
|
canReplacePage: () => !typing.isTyping(),
|
|
961
|
+
isPagePressed: presses.isPressed,
|
|
903
962
|
onRendered: () => {
|
|
904
963
|
layout.reportNow();
|
|
905
964
|
send({ type: "rendered" });
|
|
@@ -981,6 +1040,7 @@ function connectPage(document2, schema, send) {
|
|
|
981
1040
|
stop: () => {
|
|
982
1041
|
typing.stop();
|
|
983
1042
|
renderer.stop();
|
|
1043
|
+
presses.stop();
|
|
984
1044
|
layout.stop();
|
|
985
1045
|
stopListening();
|
|
986
1046
|
}
|
package/package.json
CHANGED