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