@capgo/capacitor-sheets 8.0.14 → 8.0.16

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 (38) hide show
  1. package/dist/angular/index.js +68 -12
  2. package/dist/angular/index.js.map +1 -1
  3. package/dist/angular/index.mjs +68 -12
  4. package/dist/angular/index.mjs.map +1 -1
  5. package/dist/{chunk-AXGC7BLW.mjs → chunk-75SRJO4V.mjs} +69 -13
  6. package/dist/chunk-75SRJO4V.mjs.map +1 -0
  7. package/dist/{components-STHKYCFN.mjs → components-6FNKBOX7.mjs} +2 -2
  8. package/dist/index.d.mts +3 -2
  9. package/dist/index.d.ts +3 -2
  10. package/dist/index.js +69 -13
  11. package/dist/index.js.map +1 -1
  12. package/dist/index.mjs +2 -2
  13. package/dist/react/index.js +68 -12
  14. package/dist/react/index.js.map +1 -1
  15. package/dist/react/index.mjs +68 -12
  16. package/dist/react/index.mjs.map +1 -1
  17. package/dist/solid/index.js +68 -12
  18. package/dist/solid/index.js.map +1 -1
  19. package/dist/solid/index.mjs +68 -12
  20. package/dist/solid/index.mjs.map +1 -1
  21. package/dist/svelte/index.js +68 -12
  22. package/dist/svelte/index.js.map +1 -1
  23. package/dist/svelte/index.mjs +68 -12
  24. package/dist/svelte/index.mjs.map +1 -1
  25. package/dist/vue/index.js +68 -12
  26. package/dist/vue/index.js.map +1 -1
  27. package/dist/vue/index.mjs +68 -12
  28. package/dist/vue/index.mjs.map +1 -1
  29. package/docs/screenshots/issue-38-detached-spacing-simulator.webp +0 -0
  30. package/docs/screenshots/issue-38-keyboard-sheet-simulator.webp +0 -0
  31. package/docs/screenshots/issue-38-long-sheet-safe-area-simulator.webp +0 -0
  32. package/docs/screenshots/issue-38-page-from-bottom-simulator.webp +0 -0
  33. package/docs/screenshots/issue-38-page-right-simulator.webp +0 -0
  34. package/docs/screenshots/issue-38-persistent-expanded-simulator.webp +0 -0
  35. package/docs/screenshots/issue-38-persistent-mini-simulator.webp +0 -0
  36. package/package.json +2 -2
  37. package/dist/chunk-AXGC7BLW.mjs.map +0 -1
  38. /package/dist/{components-STHKYCFN.mjs.map → components-6FNKBOX7.mjs.map} +0 -0
@@ -528,6 +528,8 @@ var defaultAnimation = {
528
528
  contentMove: true
529
529
  };
530
530
  var stackRegistry = /* @__PURE__ */ new Map();
531
+ var documentLockDepth = /* @__PURE__ */ new WeakMap();
532
+ var documentLockSnapshot = /* @__PURE__ */ new WeakMap();
531
533
  function parseNumber(value) {
532
534
  if (value === null) return void 0;
533
535
  const parsed = Number.parseInt(value, 10);
@@ -685,8 +687,6 @@ var SheetController = class {
685
687
  pointerTravel = null;
686
688
  connected = false;
687
689
  lockedScroll = false;
688
- previousBodyOverflow = "";
689
- previousBodyTouchAction = "";
690
690
  inertedElements = /* @__PURE__ */ new Map();
691
691
  previousFocus = null;
692
692
  hasThemeDimmer = false;
@@ -699,12 +699,20 @@ var SheetController = class {
699
699
  const visualViewport = this.root.ownerDocument.defaultView?.visualViewport;
700
700
  if (!view) return;
701
701
  if (!visualViewport || this.options.nativeFocusScrollPrevention === false) {
702
- view.style.setProperty("--cap-sheet-keyboard-offset", "0em");
702
+ this.setKeyboardOffset("0em");
703
703
  return;
704
704
  }
705
705
  const layoutHeight = this.root.ownerDocument.documentElement.clientHeight;
706
706
  const keyboardOffset = Math.max(0, layoutHeight - visualViewport.height - visualViewport.offsetTop);
707
- view.style.setProperty("--cap-sheet-keyboard-offset", `${toEm(view, keyboardOffset)}em`);
707
+ this.setKeyboardOffset(`${toEm(view, keyboardOffset)}em`);
708
+ };
709
+ handleFocusIn = (event) => {
710
+ if (!this.presented || this.options.nativeFocusScrollPrevention === false) return;
711
+ const target = event.target;
712
+ const content = this.parts.content;
713
+ if (!(target instanceof HTMLElement) || !content?.contains(target)) return;
714
+ if (!["input", "select", "textarea"].includes(target.localName) && !target.isContentEditable) return;
715
+ requestAnimationFrame(() => target.scrollIntoView({ block: "nearest", inline: "nearest" }));
708
716
  };
709
717
  handleDocumentKeyDown = (event) => {
710
718
  if (!this.presented) return;
@@ -921,6 +929,7 @@ var SheetController = class {
921
929
  this.previousFocus = this.root.ownerDocument.activeElement;
922
930
  this.presented = true;
923
931
  this.activeDetent = clamp(options.detent ?? this.resolveInitialDetent(), 1, this.detentOffsetsPx.length - 1);
932
+ this.updateDetentState();
924
933
  this.updateDomState(true);
925
934
  this.lockPage();
926
935
  this.applyInert();
@@ -944,6 +953,7 @@ var SheetController = class {
944
953
  const previous = this.activeDetent;
945
954
  this.presented = false;
946
955
  this.activeDetent = 0;
956
+ this.updateDetentState();
947
957
  this.setStatus("exiting");
948
958
  dispatch(this.root, "cap-sheet-dismiss", this.getTravelEvent());
949
959
  await this.animateTo(this.detentOffsetsPx[0] || this.hiddenOffsetPx, {
@@ -982,6 +992,7 @@ var SheetController = class {
982
992
  }
983
993
  const previous = this.activeDetent;
984
994
  this.activeDetent = target;
995
+ this.updateDetentState();
985
996
  this.setStatus("settling");
986
997
  await this.animateTo(this.detentOffsetsPx[target] || 0, {
987
998
  ...this.options.steppingAnimationSettings || {},
@@ -1253,6 +1264,7 @@ var SheetController = class {
1253
1264
  view.addEventListener("pointermove", this.handlePointerMove, { passive: false });
1254
1265
  view.addEventListener("pointerup", this.handlePointerUp);
1255
1266
  view.addEventListener("pointercancel", this.handlePointerUp);
1267
+ view.addEventListener("focusin", this.handleFocusIn);
1256
1268
  view.addEventListener("wheel", this.handleWheel, { passive: false });
1257
1269
  this.viewListenersElement = view;
1258
1270
  }
@@ -1264,6 +1276,7 @@ var SheetController = class {
1264
1276
  view.removeEventListener("pointermove", this.handlePointerMove);
1265
1277
  view.removeEventListener("pointerup", this.handlePointerUp);
1266
1278
  view.removeEventListener("pointercancel", this.handlePointerUp);
1279
+ view.removeEventListener("focusin", this.handleFocusIn);
1267
1280
  view.removeEventListener("wheel", this.handleWheel);
1268
1281
  this.viewListenersElement = null;
1269
1282
  }
@@ -1296,6 +1309,7 @@ var SheetController = class {
1296
1309
  content.setAttribute("tabindex", content.getAttribute("tabindex") || "-1");
1297
1310
  }
1298
1311
  this.root.toggleAttribute("presented", presented);
1312
+ this.updateDetentState();
1299
1313
  }
1300
1314
  linkAccessibleNames() {
1301
1315
  if (!this.parts.content) return;
@@ -1344,24 +1358,60 @@ var SheetController = class {
1344
1358
  }
1345
1359
  lockPage() {
1346
1360
  if (this.lockedScroll) return;
1347
- const body = this.root.ownerDocument.body;
1348
- this.previousBodyOverflow = body.style.overflow;
1349
- this.previousBodyTouchAction = body.style.touchAction;
1361
+ const doc = this.root.ownerDocument;
1362
+ const documentElement = doc.documentElement;
1363
+ const body = doc.body;
1364
+ const depth = documentLockDepth.get(doc) ?? 0;
1365
+ if (depth === 0) {
1366
+ documentLockSnapshot.set(doc, {
1367
+ htmlOverflow: documentElement.style.overflow,
1368
+ htmlTouchAction: documentElement.style.touchAction,
1369
+ bodyOverflow: body.style.overflow,
1370
+ bodyTouchAction: body.style.touchAction
1371
+ });
1372
+ }
1373
+ documentElement.style.overflow = "hidden";
1374
+ documentElement.style.touchAction = "none";
1350
1375
  body.dataset.capSheetScrollLocked = "true";
1351
1376
  body.style.overflow = "hidden";
1352
1377
  body.style.touchAction = "none";
1378
+ documentLockDepth.set(doc, depth + 1);
1353
1379
  this.lockedScroll = true;
1354
1380
  }
1355
1381
  unlockPage() {
1356
1382
  if (!this.lockedScroll) return;
1357
- const body = this.root.ownerDocument.body;
1383
+ const doc = this.root.ownerDocument;
1384
+ const documentElement = doc.documentElement;
1385
+ const body = doc.body;
1386
+ const depth = Math.max((documentLockDepth.get(doc) ?? 1) - 1, 0);
1387
+ if (depth > 0) {
1388
+ documentLockDepth.set(doc, depth);
1389
+ this.lockedScroll = false;
1390
+ return;
1391
+ }
1392
+ const snapshot = documentLockSnapshot.get(doc);
1358
1393
  delete body.dataset.capSheetScrollLocked;
1359
- body.style.overflow = this.previousBodyOverflow;
1360
- body.style.touchAction = this.previousBodyTouchAction;
1361
- this.previousBodyOverflow = "";
1362
- this.previousBodyTouchAction = "";
1394
+ documentElement.style.overflow = snapshot?.htmlOverflow ?? "";
1395
+ documentElement.style.touchAction = snapshot?.htmlTouchAction ?? "";
1396
+ body.style.overflow = snapshot?.bodyOverflow ?? "";
1397
+ body.style.touchAction = snapshot?.bodyTouchAction ?? "";
1398
+ documentLockDepth.delete(doc);
1399
+ documentLockSnapshot.delete(doc);
1363
1400
  this.lockedScroll = false;
1364
1401
  }
1402
+ setKeyboardOffset(value) {
1403
+ const view = this.parts.view;
1404
+ if (!view) return;
1405
+ if (view.style.getPropertyValue("--cap-sheet-keyboard-offset") !== value) {
1406
+ view.style.setProperty("--cap-sheet-keyboard-offset", value);
1407
+ }
1408
+ if (!this.presented) return;
1409
+ requestAnimationFrame(() => {
1410
+ if (!this.presented) return;
1411
+ this.remeasure();
1412
+ this.applyOffset(this.detentOffsetsPx[this.activeDetent] || 0, this.status);
1413
+ });
1414
+ }
1365
1415
  applyInert() {
1366
1416
  if (this.options.inertOutside === false || !this.parts.view) return;
1367
1417
  const body = this.root.ownerDocument.body;
@@ -1440,6 +1490,12 @@ var SheetController = class {
1440
1490
  const detail = { activeDetent, previousActiveDetent };
1441
1491
  dispatch(this.root, "cap-sheet-active-detent-change", detail);
1442
1492
  }
1493
+ updateDetentState() {
1494
+ const activeDetent = String(this.activeDetent);
1495
+ this.root.dataset.activeDetent = activeDetent;
1496
+ if (this.parts.view) this.parts.view.dataset.activeDetent = activeDetent;
1497
+ if (this.parts.content) this.parts.content.dataset.activeDetent = activeDetent;
1498
+ }
1443
1499
  registerStack() {
1444
1500
  const nextStack = this.options.stack || this.root.closest("cap-sheet-stack")?.id || null;
1445
1501
  if (this.stackId === nextStack) return;