@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
@@ -555,6 +555,8 @@ var defaultAnimation = {
555
555
  contentMove: true
556
556
  };
557
557
  var stackRegistry = /* @__PURE__ */ new Map();
558
+ var documentLockDepth = /* @__PURE__ */ new WeakMap();
559
+ var documentLockSnapshot = /* @__PURE__ */ new WeakMap();
558
560
  function parseNumber(value) {
559
561
  if (value === null) return void 0;
560
562
  const parsed = Number.parseInt(value, 10);
@@ -712,8 +714,6 @@ var SheetController = class {
712
714
  pointerTravel = null;
713
715
  connected = false;
714
716
  lockedScroll = false;
715
- previousBodyOverflow = "";
716
- previousBodyTouchAction = "";
717
717
  inertedElements = /* @__PURE__ */ new Map();
718
718
  previousFocus = null;
719
719
  hasThemeDimmer = false;
@@ -726,12 +726,20 @@ var SheetController = class {
726
726
  const visualViewport = this.root.ownerDocument.defaultView?.visualViewport;
727
727
  if (!view) return;
728
728
  if (!visualViewport || this.options.nativeFocusScrollPrevention === false) {
729
- view.style.setProperty("--cap-sheet-keyboard-offset", "0em");
729
+ this.setKeyboardOffset("0em");
730
730
  return;
731
731
  }
732
732
  const layoutHeight = this.root.ownerDocument.documentElement.clientHeight;
733
733
  const keyboardOffset = Math.max(0, layoutHeight - visualViewport.height - visualViewport.offsetTop);
734
- view.style.setProperty("--cap-sheet-keyboard-offset", `${toEm(view, keyboardOffset)}em`);
734
+ this.setKeyboardOffset(`${toEm(view, keyboardOffset)}em`);
735
+ };
736
+ handleFocusIn = (event) => {
737
+ if (!this.presented || this.options.nativeFocusScrollPrevention === false) return;
738
+ const target = event.target;
739
+ const content = this.parts.content;
740
+ if (!(target instanceof HTMLElement) || !content?.contains(target)) return;
741
+ if (!["input", "select", "textarea"].includes(target.localName) && !target.isContentEditable) return;
742
+ requestAnimationFrame(() => target.scrollIntoView({ block: "nearest", inline: "nearest" }));
735
743
  };
736
744
  handleDocumentKeyDown = (event) => {
737
745
  if (!this.presented) return;
@@ -948,6 +956,7 @@ var SheetController = class {
948
956
  this.previousFocus = this.root.ownerDocument.activeElement;
949
957
  this.presented = true;
950
958
  this.activeDetent = clamp(options.detent ?? this.resolveInitialDetent(), 1, this.detentOffsetsPx.length - 1);
959
+ this.updateDetentState();
951
960
  this.updateDomState(true);
952
961
  this.lockPage();
953
962
  this.applyInert();
@@ -971,6 +980,7 @@ var SheetController = class {
971
980
  const previous = this.activeDetent;
972
981
  this.presented = false;
973
982
  this.activeDetent = 0;
983
+ this.updateDetentState();
974
984
  this.setStatus("exiting");
975
985
  dispatch(this.root, "cap-sheet-dismiss", this.getTravelEvent());
976
986
  await this.animateTo(this.detentOffsetsPx[0] || this.hiddenOffsetPx, {
@@ -1009,6 +1019,7 @@ var SheetController = class {
1009
1019
  }
1010
1020
  const previous = this.activeDetent;
1011
1021
  this.activeDetent = target;
1022
+ this.updateDetentState();
1012
1023
  this.setStatus("settling");
1013
1024
  await this.animateTo(this.detentOffsetsPx[target] || 0, {
1014
1025
  ...this.options.steppingAnimationSettings || {},
@@ -1280,6 +1291,7 @@ var SheetController = class {
1280
1291
  view.addEventListener("pointermove", this.handlePointerMove, { passive: false });
1281
1292
  view.addEventListener("pointerup", this.handlePointerUp);
1282
1293
  view.addEventListener("pointercancel", this.handlePointerUp);
1294
+ view.addEventListener("focusin", this.handleFocusIn);
1283
1295
  view.addEventListener("wheel", this.handleWheel, { passive: false });
1284
1296
  this.viewListenersElement = view;
1285
1297
  }
@@ -1291,6 +1303,7 @@ var SheetController = class {
1291
1303
  view.removeEventListener("pointermove", this.handlePointerMove);
1292
1304
  view.removeEventListener("pointerup", this.handlePointerUp);
1293
1305
  view.removeEventListener("pointercancel", this.handlePointerUp);
1306
+ view.removeEventListener("focusin", this.handleFocusIn);
1294
1307
  view.removeEventListener("wheel", this.handleWheel);
1295
1308
  this.viewListenersElement = null;
1296
1309
  }
@@ -1323,6 +1336,7 @@ var SheetController = class {
1323
1336
  content.setAttribute("tabindex", content.getAttribute("tabindex") || "-1");
1324
1337
  }
1325
1338
  this.root.toggleAttribute("presented", presented);
1339
+ this.updateDetentState();
1326
1340
  }
1327
1341
  linkAccessibleNames() {
1328
1342
  if (!this.parts.content) return;
@@ -1371,24 +1385,60 @@ var SheetController = class {
1371
1385
  }
1372
1386
  lockPage() {
1373
1387
  if (this.lockedScroll) return;
1374
- const body = this.root.ownerDocument.body;
1375
- this.previousBodyOverflow = body.style.overflow;
1376
- this.previousBodyTouchAction = body.style.touchAction;
1388
+ const doc = this.root.ownerDocument;
1389
+ const documentElement = doc.documentElement;
1390
+ const body = doc.body;
1391
+ const depth = documentLockDepth.get(doc) ?? 0;
1392
+ if (depth === 0) {
1393
+ documentLockSnapshot.set(doc, {
1394
+ htmlOverflow: documentElement.style.overflow,
1395
+ htmlTouchAction: documentElement.style.touchAction,
1396
+ bodyOverflow: body.style.overflow,
1397
+ bodyTouchAction: body.style.touchAction
1398
+ });
1399
+ }
1400
+ documentElement.style.overflow = "hidden";
1401
+ documentElement.style.touchAction = "none";
1377
1402
  body.dataset.capSheetScrollLocked = "true";
1378
1403
  body.style.overflow = "hidden";
1379
1404
  body.style.touchAction = "none";
1405
+ documentLockDepth.set(doc, depth + 1);
1380
1406
  this.lockedScroll = true;
1381
1407
  }
1382
1408
  unlockPage() {
1383
1409
  if (!this.lockedScroll) return;
1384
- const body = this.root.ownerDocument.body;
1410
+ const doc = this.root.ownerDocument;
1411
+ const documentElement = doc.documentElement;
1412
+ const body = doc.body;
1413
+ const depth = Math.max((documentLockDepth.get(doc) ?? 1) - 1, 0);
1414
+ if (depth > 0) {
1415
+ documentLockDepth.set(doc, depth);
1416
+ this.lockedScroll = false;
1417
+ return;
1418
+ }
1419
+ const snapshot = documentLockSnapshot.get(doc);
1385
1420
  delete body.dataset.capSheetScrollLocked;
1386
- body.style.overflow = this.previousBodyOverflow;
1387
- body.style.touchAction = this.previousBodyTouchAction;
1388
- this.previousBodyOverflow = "";
1389
- this.previousBodyTouchAction = "";
1421
+ documentElement.style.overflow = snapshot?.htmlOverflow ?? "";
1422
+ documentElement.style.touchAction = snapshot?.htmlTouchAction ?? "";
1423
+ body.style.overflow = snapshot?.bodyOverflow ?? "";
1424
+ body.style.touchAction = snapshot?.bodyTouchAction ?? "";
1425
+ documentLockDepth.delete(doc);
1426
+ documentLockSnapshot.delete(doc);
1390
1427
  this.lockedScroll = false;
1391
1428
  }
1429
+ setKeyboardOffset(value) {
1430
+ const view = this.parts.view;
1431
+ if (!view) return;
1432
+ if (view.style.getPropertyValue("--cap-sheet-keyboard-offset") !== value) {
1433
+ view.style.setProperty("--cap-sheet-keyboard-offset", value);
1434
+ }
1435
+ if (!this.presented) return;
1436
+ requestAnimationFrame(() => {
1437
+ if (!this.presented) return;
1438
+ this.remeasure();
1439
+ this.applyOffset(this.detentOffsetsPx[this.activeDetent] || 0, this.status);
1440
+ });
1441
+ }
1392
1442
  applyInert() {
1393
1443
  if (this.options.inertOutside === false || !this.parts.view) return;
1394
1444
  const body = this.root.ownerDocument.body;
@@ -1467,6 +1517,12 @@ var SheetController = class {
1467
1517
  const detail = { activeDetent, previousActiveDetent };
1468
1518
  dispatch(this.root, "cap-sheet-active-detent-change", detail);
1469
1519
  }
1520
+ updateDetentState() {
1521
+ const activeDetent = String(this.activeDetent);
1522
+ this.root.dataset.activeDetent = activeDetent;
1523
+ if (this.parts.view) this.parts.view.dataset.activeDetent = activeDetent;
1524
+ if (this.parts.content) this.parts.content.dataset.activeDetent = activeDetent;
1525
+ }
1470
1526
  registerStack() {
1471
1527
  const nextStack = this.options.stack || this.root.closest("cap-sheet-stack")?.id || null;
1472
1528
  if (this.stackId === nextStack) return;