@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.
Files changed (2) hide show
  1. package/dist/bridge.js +64 -4
  2. 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 (!options.canReplacePage()) return;
388
- replacePageBody(options.document, html);
389
- options.onRendered();
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seamlet/astro",
3
- "version": "0.11.2",
3
+ "version": "0.11.3",
4
4
  "description": "Connects an Astro site to the Seamlet CMS: the schema of its content, the preview the editor frames, and its published content.",
5
5
  "license": "MIT",
6
6
  "type": "module",