@capgo/capacitor-sheets 8.0.14 → 8.0.15

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 +1 -1
  37. package/dist/chunk-AXGC7BLW.mjs.map +0 -1
  38. /package/dist/{components-STHKYCFN.mjs.map → components-6FNKBOX7.mjs.map} +0 -0
package/dist/index.js CHANGED
@@ -711,7 +711,7 @@ function tween(start, end, progress) {
711
711
  const next = startValue + (endValue - startValue) * progress;
712
712
  return `${next}${unit}`;
713
713
  }
714
- var defaultOptions, defaultAnimation, stackRegistry, unitlessInsetPattern, safeAreaEdges, SheetController;
714
+ var defaultOptions, defaultAnimation, stackRegistry, documentLockDepth, documentLockSnapshot, unitlessInsetPattern, safeAreaEdges, SheetController;
715
715
  var init_sheet_controller = __esm({
716
716
  "src/core/sheet-controller.ts"() {
717
717
  "use strict";
@@ -742,6 +742,8 @@ var init_sheet_controller = __esm({
742
742
  contentMove: true
743
743
  };
744
744
  stackRegistry = /* @__PURE__ */ new Map();
745
+ documentLockDepth = /* @__PURE__ */ new WeakMap();
746
+ documentLockSnapshot = /* @__PURE__ */ new WeakMap();
745
747
  unitlessInsetPattern = /^-?(?:\d+(?:\.\d+)?|\.\d+)$/;
746
748
  safeAreaEdges = ["top", "bottom", "left", "right"];
747
749
  SheetController = class {
@@ -763,8 +765,6 @@ var init_sheet_controller = __esm({
763
765
  pointerTravel = null;
764
766
  connected = false;
765
767
  lockedScroll = false;
766
- previousBodyOverflow = "";
767
- previousBodyTouchAction = "";
768
768
  inertedElements = /* @__PURE__ */ new Map();
769
769
  previousFocus = null;
770
770
  hasThemeDimmer = false;
@@ -777,12 +777,20 @@ var init_sheet_controller = __esm({
777
777
  const visualViewport = this.root.ownerDocument.defaultView?.visualViewport;
778
778
  if (!view) return;
779
779
  if (!visualViewport || this.options.nativeFocusScrollPrevention === false) {
780
- view.style.setProperty("--cap-sheet-keyboard-offset", "0em");
780
+ this.setKeyboardOffset("0em");
781
781
  return;
782
782
  }
783
783
  const layoutHeight = this.root.ownerDocument.documentElement.clientHeight;
784
784
  const keyboardOffset = Math.max(0, layoutHeight - visualViewport.height - visualViewport.offsetTop);
785
- view.style.setProperty("--cap-sheet-keyboard-offset", `${toEm(view, keyboardOffset)}em`);
785
+ this.setKeyboardOffset(`${toEm(view, keyboardOffset)}em`);
786
+ };
787
+ handleFocusIn = (event) => {
788
+ if (!this.presented || this.options.nativeFocusScrollPrevention === false) return;
789
+ const target = event.target;
790
+ const content = this.parts.content;
791
+ if (!(target instanceof HTMLElement) || !content?.contains(target)) return;
792
+ if (!["input", "select", "textarea"].includes(target.localName) && !target.isContentEditable) return;
793
+ requestAnimationFrame(() => target.scrollIntoView({ block: "nearest", inline: "nearest" }));
786
794
  };
787
795
  handleDocumentKeyDown = (event) => {
788
796
  if (!this.presented) return;
@@ -999,6 +1007,7 @@ var init_sheet_controller = __esm({
999
1007
  this.previousFocus = this.root.ownerDocument.activeElement;
1000
1008
  this.presented = true;
1001
1009
  this.activeDetent = clamp(options.detent ?? this.resolveInitialDetent(), 1, this.detentOffsetsPx.length - 1);
1010
+ this.updateDetentState();
1002
1011
  this.updateDomState(true);
1003
1012
  this.lockPage();
1004
1013
  this.applyInert();
@@ -1022,6 +1031,7 @@ var init_sheet_controller = __esm({
1022
1031
  const previous = this.activeDetent;
1023
1032
  this.presented = false;
1024
1033
  this.activeDetent = 0;
1034
+ this.updateDetentState();
1025
1035
  this.setStatus("exiting");
1026
1036
  dispatch(this.root, "cap-sheet-dismiss", this.getTravelEvent());
1027
1037
  await this.animateTo(this.detentOffsetsPx[0] || this.hiddenOffsetPx, {
@@ -1060,6 +1070,7 @@ var init_sheet_controller = __esm({
1060
1070
  }
1061
1071
  const previous = this.activeDetent;
1062
1072
  this.activeDetent = target;
1073
+ this.updateDetentState();
1063
1074
  this.setStatus("settling");
1064
1075
  await this.animateTo(this.detentOffsetsPx[target] || 0, {
1065
1076
  ...this.options.steppingAnimationSettings || {},
@@ -1331,6 +1342,7 @@ var init_sheet_controller = __esm({
1331
1342
  view.addEventListener("pointermove", this.handlePointerMove, { passive: false });
1332
1343
  view.addEventListener("pointerup", this.handlePointerUp);
1333
1344
  view.addEventListener("pointercancel", this.handlePointerUp);
1345
+ view.addEventListener("focusin", this.handleFocusIn);
1334
1346
  view.addEventListener("wheel", this.handleWheel, { passive: false });
1335
1347
  this.viewListenersElement = view;
1336
1348
  }
@@ -1342,6 +1354,7 @@ var init_sheet_controller = __esm({
1342
1354
  view.removeEventListener("pointermove", this.handlePointerMove);
1343
1355
  view.removeEventListener("pointerup", this.handlePointerUp);
1344
1356
  view.removeEventListener("pointercancel", this.handlePointerUp);
1357
+ view.removeEventListener("focusin", this.handleFocusIn);
1345
1358
  view.removeEventListener("wheel", this.handleWheel);
1346
1359
  this.viewListenersElement = null;
1347
1360
  }
@@ -1374,6 +1387,7 @@ var init_sheet_controller = __esm({
1374
1387
  content.setAttribute("tabindex", content.getAttribute("tabindex") || "-1");
1375
1388
  }
1376
1389
  this.root.toggleAttribute("presented", presented);
1390
+ this.updateDetentState();
1377
1391
  }
1378
1392
  linkAccessibleNames() {
1379
1393
  if (!this.parts.content) return;
@@ -1422,24 +1436,60 @@ var init_sheet_controller = __esm({
1422
1436
  }
1423
1437
  lockPage() {
1424
1438
  if (this.lockedScroll) return;
1425
- const body = this.root.ownerDocument.body;
1426
- this.previousBodyOverflow = body.style.overflow;
1427
- this.previousBodyTouchAction = body.style.touchAction;
1439
+ const doc = this.root.ownerDocument;
1440
+ const documentElement = doc.documentElement;
1441
+ const body = doc.body;
1442
+ const depth = documentLockDepth.get(doc) ?? 0;
1443
+ if (depth === 0) {
1444
+ documentLockSnapshot.set(doc, {
1445
+ htmlOverflow: documentElement.style.overflow,
1446
+ htmlTouchAction: documentElement.style.touchAction,
1447
+ bodyOverflow: body.style.overflow,
1448
+ bodyTouchAction: body.style.touchAction
1449
+ });
1450
+ }
1451
+ documentElement.style.overflow = "hidden";
1452
+ documentElement.style.touchAction = "none";
1428
1453
  body.dataset.capSheetScrollLocked = "true";
1429
1454
  body.style.overflow = "hidden";
1430
1455
  body.style.touchAction = "none";
1456
+ documentLockDepth.set(doc, depth + 1);
1431
1457
  this.lockedScroll = true;
1432
1458
  }
1433
1459
  unlockPage() {
1434
1460
  if (!this.lockedScroll) return;
1435
- const body = this.root.ownerDocument.body;
1461
+ const doc = this.root.ownerDocument;
1462
+ const documentElement = doc.documentElement;
1463
+ const body = doc.body;
1464
+ const depth = Math.max((documentLockDepth.get(doc) ?? 1) - 1, 0);
1465
+ if (depth > 0) {
1466
+ documentLockDepth.set(doc, depth);
1467
+ this.lockedScroll = false;
1468
+ return;
1469
+ }
1470
+ const snapshot = documentLockSnapshot.get(doc);
1436
1471
  delete body.dataset.capSheetScrollLocked;
1437
- body.style.overflow = this.previousBodyOverflow;
1438
- body.style.touchAction = this.previousBodyTouchAction;
1439
- this.previousBodyOverflow = "";
1440
- this.previousBodyTouchAction = "";
1472
+ documentElement.style.overflow = snapshot?.htmlOverflow ?? "";
1473
+ documentElement.style.touchAction = snapshot?.htmlTouchAction ?? "";
1474
+ body.style.overflow = snapshot?.bodyOverflow ?? "";
1475
+ body.style.touchAction = snapshot?.bodyTouchAction ?? "";
1476
+ documentLockDepth.delete(doc);
1477
+ documentLockSnapshot.delete(doc);
1441
1478
  this.lockedScroll = false;
1442
1479
  }
1480
+ setKeyboardOffset(value) {
1481
+ const view = this.parts.view;
1482
+ if (!view) return;
1483
+ if (view.style.getPropertyValue("--cap-sheet-keyboard-offset") !== value) {
1484
+ view.style.setProperty("--cap-sheet-keyboard-offset", value);
1485
+ }
1486
+ if (!this.presented) return;
1487
+ requestAnimationFrame(() => {
1488
+ if (!this.presented) return;
1489
+ this.remeasure();
1490
+ this.applyOffset(this.detentOffsetsPx[this.activeDetent] || 0, this.status);
1491
+ });
1492
+ }
1443
1493
  applyInert() {
1444
1494
  if (this.options.inertOutside === false || !this.parts.view) return;
1445
1495
  const body = this.root.ownerDocument.body;
@@ -1518,6 +1568,12 @@ var init_sheet_controller = __esm({
1518
1568
  const detail = { activeDetent, previousActiveDetent };
1519
1569
  dispatch(this.root, "cap-sheet-active-detent-change", detail);
1520
1570
  }
1571
+ updateDetentState() {
1572
+ const activeDetent = String(this.activeDetent);
1573
+ this.root.dataset.activeDetent = activeDetent;
1574
+ if (this.parts.view) this.parts.view.dataset.activeDetent = activeDetent;
1575
+ if (this.parts.content) this.parts.content.dataset.activeDetent = activeDetent;
1576
+ }
1521
1577
  registerStack() {
1522
1578
  const nextStack = this.options.stack || this.root.closest("cap-sheet-stack")?.id || null;
1523
1579
  if (this.stackId === nextStack) return;