@ionic/core 7.4.4-nightly.20231009 → 7.4.4-nightly.20231010

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 (139) hide show
  1. package/components/animation.js +60 -1
  2. package/components/checkbox.js +3 -0
  3. package/components/ion-menu.js +51 -19
  4. package/components/ion-toggle.js +3 -0
  5. package/components/radio-group.js +1 -1
  6. package/components/radio.js +4 -1
  7. package/components/swipe-back.js +5 -1
  8. package/dist/cjs/{animation-2bb33618.js → animation-c8bdd3c7.js} +60 -1
  9. package/dist/cjs/{index-97a3eade.js → index-1f1ea05f.js} +1 -1
  10. package/dist/cjs/{index-acf6bdf0.js → index-fa649bd8.js} +2 -2
  11. package/dist/cjs/index.cjs.js +5 -5
  12. package/dist/cjs/ion-action-sheet.cjs.entry.js +1 -1
  13. package/dist/cjs/ion-alert.cjs.entry.js +1 -1
  14. package/dist/cjs/ion-app_8.cjs.entry.js +2 -2
  15. package/dist/cjs/ion-checkbox.cjs.entry.js +3 -0
  16. package/dist/cjs/ion-datetime_3.cjs.entry.js +1 -1
  17. package/dist/cjs/ion-loading.cjs.entry.js +1 -1
  18. package/dist/cjs/ion-menu_3.cjs.entry.js +53 -21
  19. package/dist/cjs/ion-modal.cjs.entry.js +2 -2
  20. package/dist/cjs/ion-nav_2.cjs.entry.js +2 -2
  21. package/dist/cjs/ion-popover.cjs.entry.js +2 -2
  22. package/dist/cjs/ion-radio_2.cjs.entry.js +5 -2
  23. package/dist/cjs/ion-refresher_2.cjs.entry.js +1 -1
  24. package/dist/cjs/ion-toast.cjs.entry.js +1 -1
  25. package/dist/cjs/ion-toggle.cjs.entry.js +3 -0
  26. package/dist/cjs/{ios.transition-e31445c2.js → ios.transition-4195d10d.js} +2 -2
  27. package/dist/cjs/{md.transition-fb13ac79.js → md.transition-0713f667.js} +2 -2
  28. package/dist/cjs/{swipe-back-6c57d1df.js → swipe-back-d0412fb6.js} +5 -1
  29. package/dist/collection/components/checkbox/checkbox.js +3 -0
  30. package/dist/collection/components/menu/menu.js +51 -19
  31. package/dist/collection/components/menu/test/disable/menu.e2e.js +55 -0
  32. package/dist/collection/components/radio/radio.js +4 -1
  33. package/dist/collection/components/radio-group/radio-group.js +1 -1
  34. package/dist/collection/components/toggle/toggle.js +3 -0
  35. package/dist/collection/utils/animation/animation.js +60 -1
  36. package/dist/collection/utils/gesture/swipe-back.js +5 -1
  37. package/dist/docs.json +1 -1
  38. package/dist/esm/{animation-a1d9e088.js → animation-92066c62.js} +60 -1
  39. package/dist/esm/{index-32c6828b.js → index-0b0dd67c.js} +2 -2
  40. package/dist/esm/{index-3d6aefa2.js → index-97a2bb98.js} +1 -1
  41. package/dist/esm/index.js +5 -5
  42. package/dist/esm/ion-action-sheet.entry.js +1 -1
  43. package/dist/esm/ion-alert.entry.js +1 -1
  44. package/dist/esm/ion-app_8.entry.js +2 -2
  45. package/dist/esm/ion-checkbox.entry.js +3 -0
  46. package/dist/esm/ion-datetime_3.entry.js +1 -1
  47. package/dist/esm/ion-loading.entry.js +1 -1
  48. package/dist/esm/ion-menu_3.entry.js +53 -21
  49. package/dist/esm/ion-modal.entry.js +2 -2
  50. package/dist/esm/ion-nav_2.entry.js +2 -2
  51. package/dist/esm/ion-popover.entry.js +2 -2
  52. package/dist/esm/ion-radio_2.entry.js +5 -2
  53. package/dist/esm/ion-refresher_2.entry.js +1 -1
  54. package/dist/esm/ion-toast.entry.js +1 -1
  55. package/dist/esm/ion-toggle.entry.js +3 -0
  56. package/dist/esm/{ios.transition-d8223b18.js → ios.transition-875ba2ea.js} +2 -2
  57. package/dist/esm/{md.transition-caed184e.js → md.transition-54c79f72.js} +2 -2
  58. package/dist/esm/{swipe-back-6d4c0a4e.js → swipe-back-0f3bfc8e.js} +5 -1
  59. package/dist/esm-es5/animation-92066c62.js +4 -0
  60. package/dist/esm-es5/{index-32c6828b.js → index-0b0dd67c.js} +1 -1
  61. package/dist/esm-es5/{index-3d6aefa2.js → index-97a2bb98.js} +1 -1
  62. package/dist/esm-es5/index.js +1 -1
  63. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  64. package/dist/esm-es5/ion-alert.entry.js +1 -1
  65. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  66. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  67. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  68. package/dist/esm-es5/ion-loading.entry.js +1 -1
  69. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  70. package/dist/esm-es5/ion-modal.entry.js +1 -1
  71. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  72. package/dist/esm-es5/ion-popover.entry.js +1 -1
  73. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  74. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  75. package/dist/esm-es5/ion-toast.entry.js +1 -1
  76. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  77. package/dist/esm-es5/{ios.transition-d8223b18.js → ios.transition-875ba2ea.js} +1 -1
  78. package/dist/esm-es5/{md.transition-caed184e.js → md.transition-54c79f72.js} +1 -1
  79. package/dist/esm-es5/{swipe-back-6d4c0a4e.js → swipe-back-0f3bfc8e.js} +1 -1
  80. package/dist/ionic/index.esm.js +1 -1
  81. package/dist/ionic/ionic.esm.js +1 -1
  82. package/dist/ionic/{p-6d5c54f2.system.entry.js → p-00d3814a.system.entry.js} +1 -1
  83. package/dist/ionic/p-015187e5.system.js +4 -0
  84. package/dist/ionic/{p-96ad49f1.entry.js → p-07c816fb.entry.js} +1 -1
  85. package/dist/ionic/{p-1d2d1ab5.system.entry.js → p-0c7d0167.system.entry.js} +1 -1
  86. package/dist/ionic/{p-95e44641.system.entry.js → p-0dcdf480.system.entry.js} +1 -1
  87. package/dist/ionic/{p-8957b1de.system.entry.js → p-0fc8a522.system.entry.js} +1 -1
  88. package/dist/ionic/{p-57c5eca2.system.js → p-15041a8c.system.js} +1 -1
  89. package/dist/ionic/{p-30b04d8d.js → p-2062958e.js} +1 -1
  90. package/dist/ionic/{p-4b23f472.entry.js → p-2134558d.entry.js} +1 -1
  91. package/dist/ionic/{p-037e2738.system.entry.js → p-2330af92.system.entry.js} +1 -1
  92. package/dist/ionic/{p-e88ed929.system.entry.js → p-24952f8a.system.entry.js} +1 -1
  93. package/dist/ionic/{p-1caf1ec6.entry.js → p-32eaa293.entry.js} +1 -1
  94. package/dist/ionic/{p-fb18f74b.system.entry.js → p-3d278648.system.entry.js} +1 -1
  95. package/dist/ionic/p-446230d7.js +4 -0
  96. package/dist/ionic/p-4c274938.entry.js +4 -0
  97. package/dist/ionic/{p-58565369.system.entry.js → p-52e5f8f0.system.entry.js} +1 -1
  98. package/dist/ionic/{p-c6f41736.entry.js → p-53d4606a.entry.js} +1 -1
  99. package/dist/ionic/{p-d580cbb7.system.entry.js → p-63b4ef44.system.entry.js} +1 -1
  100. package/dist/ionic/{p-7cad90ed.entry.js → p-678f37d7.entry.js} +1 -1
  101. package/dist/ionic/{p-c381a9a9.system.entry.js → p-7061fa75.system.entry.js} +1 -1
  102. package/dist/ionic/p-73eba881.system.js +1 -1
  103. package/dist/ionic/p-775f3749.entry.js +4 -0
  104. package/dist/ionic/p-77872abc.entry.js +4 -0
  105. package/dist/ionic/p-77b9d68a.system.entry.js +4 -0
  106. package/dist/ionic/p-8b33cfef.entry.js +4 -0
  107. package/dist/ionic/{p-c57cde35.system.js → p-8dbdb163.system.js} +1 -1
  108. package/dist/ionic/{p-9e727d1d.entry.js → p-979dc719.entry.js} +1 -1
  109. package/dist/ionic/{p-9d0916cb.system.js → p-9e6bf328.system.js} +1 -1
  110. package/dist/ionic/{p-e7d69cad.entry.js → p-a1528344.entry.js} +1 -1
  111. package/dist/ionic/p-a1e2f98c.js +4 -0
  112. package/dist/ionic/{p-c2d6b2fb.entry.js → p-ab37db48.entry.js} +1 -1
  113. package/dist/ionic/p-af39c1c5.js +4 -0
  114. package/dist/ionic/{p-a760fd9a.system.js → p-b7258ddb.system.js} +1 -1
  115. package/dist/ionic/p-c5395981.js +4 -0
  116. package/dist/ionic/{p-043e8328.system.js → p-c9524896.system.js} +1 -1
  117. package/dist/ionic/{p-6db9035a.system.entry.js → p-cd075e75.system.entry.js} +1 -1
  118. package/dist/ionic/{p-a0e2f6d8.entry.js → p-d055bba9.entry.js} +1 -1
  119. package/dist/ionic/p-d17638e9.system.js +4 -0
  120. package/dist/ionic/{p-6b3784a2.system.entry.js → p-df951755.system.entry.js} +1 -1
  121. package/dist/ionic/p-e627ed84.js +4 -0
  122. package/dist/ionic/{p-ab7edc16.system.entry.js → p-e92068d4.system.entry.js} +1 -1
  123. package/dist/ionic/{p-e3272ed8.entry.js → p-eaa58d23.entry.js} +1 -1
  124. package/dist/types/components/menu/menu.d.ts +8 -1
  125. package/hydrate/index.js +127 -23
  126. package/package.json +1 -1
  127. package/dist/esm-es5/animation-a1d9e088.js +0 -4
  128. package/dist/ionic/p-1c59608c.system.entry.js +0 -4
  129. package/dist/ionic/p-469d6a98.entry.js +0 -4
  130. package/dist/ionic/p-4af11953.entry.js +0 -4
  131. package/dist/ionic/p-6641d7fa.js +0 -4
  132. package/dist/ionic/p-68b405cc.entry.js +0 -4
  133. package/dist/ionic/p-6b2641f6.system.js +0 -4
  134. package/dist/ionic/p-90ebbca0.entry.js +0 -4
  135. package/dist/ionic/p-94a4ce40.js +0 -4
  136. package/dist/ionic/p-9649c54e.js +0 -4
  137. package/dist/ionic/p-a732cfec.system.js +0 -4
  138. package/dist/ionic/p-b370d1b4.js +0 -4
  139. package/dist/ionic/p-df7357c5.js +0 -4
@@ -32,7 +32,10 @@ const Radio = class {
32
32
  }
33
33
  };
34
34
  this.onClick = () => {
35
- const { radioGroup, checked } = this;
35
+ const { radioGroup, checked, disabled } = this;
36
+ if (disabled) {
37
+ return;
38
+ }
36
39
  /**
37
40
  * The legacy control uses a native input inside
38
41
  * of the radio host, so we can set this.checked
@@ -232,7 +235,7 @@ const RadioGroup = class {
232
235
  * using the `name` attribute.
233
236
  */
234
237
  const selectedRadio = ev.target && ev.target.closest('ion-radio');
235
- if (selectedRadio) {
238
+ if (selectedRadio && selectedRadio.disabled === false) {
236
239
  const currentValue = this.value;
237
240
  const newValue = selectedRadio.value;
238
241
  if (newValue !== currentValue) {
@@ -11,7 +11,7 @@ const index$1 = require('./index-10873539.js');
11
11
  const helpers = require('./helpers-ea4ccbcb.js');
12
12
  const haptic = require('./haptic-c5f6b4d5.js');
13
13
  const ionicGlobal = require('./ionic-global-a71608df.js');
14
- const animation = require('./animation-2bb33618.js');
14
+ const animation = require('./animation-c8bdd3c7.js');
15
15
  const config = require('./config-d5882735.js');
16
16
  const index$2 = require('./index-d8d1fc0b.js');
17
17
  const spinnerConfigs = require('./spinner-configs-f7b5105b.js');
@@ -13,7 +13,7 @@ const index$1 = require('./index-cc7dfb7c.js');
13
13
  const overlays = require('./overlays-efc9d511.js');
14
14
  const theme = require('./theme-fbc56b3b.js');
15
15
  const ionicGlobal = require('./ionic-global-a71608df.js');
16
- const animation = require('./animation-2bb33618.js');
16
+ const animation = require('./animation-c8bdd3c7.js');
17
17
  require('./index-306a7476.js');
18
18
  require('./framework-delegate-c0873a6f.js');
19
19
  require('./hardware-back-button-b67c8e75.js');
@@ -51,6 +51,9 @@ const Toggle = class {
51
51
  }
52
52
  };
53
53
  this.onClick = (ev) => {
54
+ if (this.disabled) {
55
+ return;
56
+ }
54
57
  ev.preventDefault();
55
58
  if (this.lastDrag + 300 < Date.now()) {
56
59
  this.toggleChecked();
@@ -3,8 +3,8 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- const animation = require('./animation-2bb33618.js');
7
- const index = require('./index-acf6bdf0.js');
6
+ const animation = require('./animation-c8bdd3c7.js');
7
+ const index = require('./index-fa649bd8.js');
8
8
  require('./index-306a7476.js');
9
9
  require('./helpers-ea4ccbcb.js');
10
10
  require('./index-14a4821e.js');
@@ -3,8 +3,8 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- const animation = require('./animation-2bb33618.js');
7
- const index = require('./index-acf6bdf0.js');
6
+ const animation = require('./animation-c8bdd3c7.js');
7
+ const index = require('./index-fa649bd8.js');
8
8
  require('./index-306a7476.js');
9
9
  require('./helpers-ea4ccbcb.js');
10
10
  require('./index-14a4821e.js');
@@ -65,7 +65,11 @@ const createSwipeBackGesture = (el, canStartHandler, onStartHandler, onMoveHandl
65
65
  return index.createGesture({
66
66
  el,
67
67
  gestureName: 'goback-swipe',
68
- gesturePriority: 40,
68
+ /**
69
+ * Swipe to go back should have priority over other horizontal swipe
70
+ * gestures. These gestures have a priority of 100 which is why 101 was chosen here.
71
+ */
72
+ gesturePriority: 101,
69
73
  threshold: 10,
70
74
  canStart,
71
75
  onStart: onStartHandler,
@@ -48,6 +48,9 @@ export class Checkbox {
48
48
  this.ionBlur.emit();
49
49
  };
50
50
  this.onClick = (ev) => {
51
+ if (this.disabled) {
52
+ return;
53
+ }
51
54
  this.toggleChecked(ev);
52
55
  };
53
56
  this.color = undefined;
@@ -24,6 +24,14 @@ export class Menu {
24
24
  this.lastOnEnd = 0;
25
25
  this.blocker = GESTURE_CONTROLLER.createBlocker({ disableScroll: true });
26
26
  this.didLoad = false;
27
+ /**
28
+ * Flag used to determine if an open/close
29
+ * operation was cancelled. For example, if
30
+ * an app calls "menu.open" then disables the menu
31
+ * part way through the animation, then this would
32
+ * be considered a cancelled operation.
33
+ */
34
+ this.operationCancelled = false;
27
35
  this.isAnimating = false;
28
36
  this._isOpen = false;
29
37
  this.inheritedAttributes = {};
@@ -292,6 +300,15 @@ export class Menu {
292
300
  this.beforeAnimation(shouldOpen);
293
301
  await this.loadAnimation();
294
302
  await this.startAnimation(shouldOpen, animated);
303
+ /**
304
+ * If the animation was cancelled then
305
+ * return false because the operation
306
+ * did not succeed.
307
+ */
308
+ if (this.operationCancelled) {
309
+ this.operationCancelled = false;
310
+ return false;
311
+ }
295
312
  this.afterAnimation(shouldOpen);
296
313
  return true;
297
314
  }
@@ -328,18 +345,23 @@ export class Menu {
328
345
  const easingReverse = mode === 'ios' ? iosEasingReverse : mdEasingReverse;
329
346
  const ani = this.animation
330
347
  .direction(isReversed ? 'reverse' : 'normal')
331
- .easing(isReversed ? easingReverse : easing)
332
- .onFinish(() => {
333
- if (ani.getDirection() === 'reverse') {
334
- ani.direction('normal');
335
- }
336
- });
348
+ .easing(isReversed ? easingReverse : easing);
337
349
  if (animated) {
338
350
  await ani.play();
339
351
  }
340
352
  else {
341
353
  ani.play({ sync: true });
342
354
  }
355
+ /**
356
+ * We run this after the play invocation
357
+ * instead of using ani.onFinish so that
358
+ * multiple onFinish callbacks do not get
359
+ * run if an animation is played, stopped,
360
+ * and then played again.
361
+ */
362
+ if (ani.getDirection() === 'reverse') {
363
+ ani.direction('normal');
364
+ }
343
365
  }
344
366
  _isActive() {
345
367
  return !this.disabled && !this.isPaneVisible;
@@ -476,7 +498,6 @@ export class Menu {
476
498
  }
477
499
  afterAnimation(isOpen) {
478
500
  var _a;
479
- assert(this.isAnimating, '_before() should be called while animating');
480
501
  // keep opening/closing the menu disabled for a touch more yet
481
502
  // only add listeners/css if it's enabled and isOpen
482
503
  // and only remove listeners/css if it's not open
@@ -535,10 +556,29 @@ export class Menu {
535
556
  if (this.gesture) {
536
557
  this.gesture.enable(isActive && this.swipeGesture);
537
558
  }
538
- // Close menu immediately
539
- if (!isActive && this._isOpen) {
540
- // close if this menu is open, and should not be enabled
541
- this.forceClosing();
559
+ /**
560
+ * If the menu is disabled but it is still open
561
+ * then we should close the menu immediately.
562
+ * Additionally, if the menu is in the process
563
+ * of animating {open, close} and the menu is disabled
564
+ * then it should still be closed immediately.
565
+ */
566
+ if (!isActive) {
567
+ /**
568
+ * It is possible to disable the menu while
569
+ * it is mid-animation. When this happens, we
570
+ * need to set the operationCancelled flag
571
+ * so that this._setOpen knows to return false
572
+ * and not run the "afterAnimation" callback.
573
+ */
574
+ if (this.isAnimating) {
575
+ this.operationCancelled = true;
576
+ }
577
+ /**
578
+ * If the menu is disabled then we should
579
+ * forcibly close the menu even if it is open.
580
+ */
581
+ this.afterAnimation(false);
542
582
  }
543
583
  if (doc === null || doc === void 0 ? void 0 : doc.contains(this.el)) {
544
584
  /**
@@ -551,14 +591,6 @@ export class Menu {
551
591
  menuController._setActiveMenu(this);
552
592
  }
553
593
  }
554
- assert(!this.isAnimating, 'can not be animating');
555
- }
556
- forceClosing() {
557
- assert(this._isOpen, 'menu cannot be closed');
558
- this.isAnimating = true;
559
- const ani = this.animation.direction('reverse');
560
- ani.play({ sync: true });
561
- this.afterAnimation(false);
562
594
  }
563
595
  render() {
564
596
  const { type, disabled, isPaneVisible, inheritedAttributes, side } = this;
@@ -0,0 +1,55 @@
1
+ /*!
2
+ * (C) Ionic http://ionicframework.com - MIT License
3
+ */
4
+ import { expect } from "@playwright/test";
5
+ import { configs, test } from "../../../../utils/test/playwright/index";
6
+ /**
7
+ * This behavior does not vary across modes/directions
8
+ */
9
+ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) => {
10
+ test.describe(title('menu: disable'), () => {
11
+ test.beforeEach(async ({ page }) => {
12
+ await page.goto(`/src/components/menu/test/disable`, config);
13
+ });
14
+ test('should disable when menu is fully open', async ({ page }) => {
15
+ const logs = [];
16
+ page.on('console', (msg) => {
17
+ if (msg.type() === 'error') {
18
+ logs.push(msg.text());
19
+ }
20
+ });
21
+ const menu = page.locator('ion-menu');
22
+ // Should be visible on initial presentation
23
+ await menu.evaluate((el) => el.open());
24
+ await expect(menu).toBeVisible();
25
+ // Disabling menu should hide it
26
+ await menu.evaluate((el) => (el.disabled = true));
27
+ await expect(menu).toBeHidden();
28
+ // Re-enabling menu and opening it show make it visible
29
+ await menu.evaluate((el) => (el.disabled = false));
30
+ await menu.evaluate((el) => el.open());
31
+ await expect(menu).toBeVisible();
32
+ expect(logs.length).toBe(0);
33
+ });
34
+ test('should disable when menu is animating', async ({ page }) => {
35
+ const logs = [];
36
+ page.on('console', (msg) => {
37
+ if (msg.type() === 'error') {
38
+ logs.push(msg.text());
39
+ }
40
+ });
41
+ const menu = page.locator('ion-menu');
42
+ // Opening and quickly disabling menu should hide it
43
+ menu.evaluate((el) => {
44
+ el.open();
45
+ setTimeout(() => (el.disabled = true), 0);
46
+ });
47
+ await expect(menu).toBeHidden();
48
+ // Re-enabling menu and opening it show make it visible
49
+ await menu.evaluate((el) => (el.disabled = false));
50
+ await menu.evaluate((el) => el.open());
51
+ await expect(menu).toBeVisible();
52
+ expect(logs.length).toBe(0);
53
+ });
54
+ });
55
+ });
@@ -27,7 +27,10 @@ export class Radio {
27
27
  }
28
28
  };
29
29
  this.onClick = () => {
30
- const { radioGroup, checked } = this;
30
+ const { radioGroup, checked, disabled } = this;
31
+ if (disabled) {
32
+ return;
33
+ }
31
34
  /**
32
35
  * The legacy control uses a native input inside
33
36
  * of the radio host, so we can set this.checked
@@ -33,7 +33,7 @@ export class RadioGroup {
33
33
  * using the `name` attribute.
34
34
  */
35
35
  const selectedRadio = ev.target && ev.target.closest('ion-radio');
36
- if (selectedRadio) {
36
+ if (selectedRadio && selectedRadio.disabled === false) {
37
37
  const currentValue = this.value;
38
38
  const newValue = selectedRadio.value;
39
39
  if (newValue !== currentValue) {
@@ -44,6 +44,9 @@ export class Toggle {
44
44
  }
45
45
  };
46
46
  this.onClick = (ev) => {
47
+ if (this.disabled) {
48
+ return;
49
+ }
47
50
  ev.preventDefault();
48
51
  if (this.lastDrag + 300 < Date.now()) {
49
52
  this.toggleChecked();
@@ -36,6 +36,7 @@ export const createAnimation = (animationId) => {
36
36
  const id = animationId;
37
37
  const onFinishCallbacks = [];
38
38
  const onFinishOneTimeCallbacks = [];
39
+ const onStopOneTimeCallbacks = [];
39
40
  const elements = [];
40
41
  const childAnimations = [];
41
42
  const stylesheets = [];
@@ -93,6 +94,28 @@ export const createAnimation = (animationId) => {
93
94
  const isRunning = () => {
94
95
  return numAnimationsRunning !== 0 && !paused;
95
96
  };
97
+ /**
98
+ * @internal
99
+ * Remove a callback from a chosen callback array
100
+ * @param callbackToRemove: A reference to the callback that should be removed
101
+ * @param callbackObjects: An array of callbacks that callbackToRemove should be removed from.
102
+ */
103
+ const clearCallback = (callbackToRemove, callbackObjects) => {
104
+ const index = callbackObjects.findIndex((callbackObject) => callbackObject.c === callbackToRemove);
105
+ if (index > -1) {
106
+ callbackObjects.splice(index, 1);
107
+ }
108
+ };
109
+ /**
110
+ * @internal
111
+ * Add a callback to be fired when an animation is stopped/cancelled.
112
+ * @param callback: A reference to the callback that should be fired
113
+ * @param opts: Any options associated with this particular callback
114
+ */
115
+ const onStop = (callback, opts) => {
116
+ onStopOneTimeCallbacks.push({ c: callback, o: opts });
117
+ return ani;
118
+ };
96
119
  const onFinish = (callback, opts) => {
97
120
  const callbacks = (opts === null || opts === void 0 ? void 0 : opts.oneTimeCallback) ? onFinishOneTimeCallbacks : onFinishCallbacks;
98
121
  callbacks.push({ c: callback, o: opts });
@@ -761,7 +784,33 @@ export const createAnimation = (animationId) => {
761
784
  numAnimationsRunning = childAnimations.length + 1;
762
785
  shouldCalculateNumAnimations = false;
763
786
  }
764
- onFinish(() => resolve(), { oneTimeCallback: true });
787
+ /**
788
+ * When one of these callbacks fires we
789
+ * need to clear the other's callback otherwise
790
+ * you can potentially get these callbacks
791
+ * firing multiple times if the play method
792
+ * is subsequently called.
793
+ * Example:
794
+ * animation.play() (onStop and onFinish callbacks are registered)
795
+ * animation.stop() (onStop callback is fired, onFinish is not)
796
+ * animation.play() (onStop and onFinish callbacks are registered)
797
+ * Total onStop callbacks: 1
798
+ * Total onFinish callbacks: 2
799
+ */
800
+ const onStopCallback = () => {
801
+ clearCallback(onFinishCallback, onFinishOneTimeCallbacks);
802
+ resolve();
803
+ };
804
+ const onFinishCallback = () => {
805
+ clearCallback(onStopCallback, onStopOneTimeCallbacks);
806
+ resolve();
807
+ };
808
+ /**
809
+ * The play method resolves when an animation
810
+ * run either finishes or is cancelled.
811
+ */
812
+ onFinish(onFinishCallback, { oneTimeCallback: true });
813
+ onStop(onStopCallback, { oneTimeCallback: true });
765
814
  childAnimations.forEach((animation) => {
766
815
  animation.play();
767
816
  });
@@ -774,6 +823,14 @@ export const createAnimation = (animationId) => {
774
823
  paused = false;
775
824
  });
776
825
  };
826
+ /**
827
+ * Stops an animation and resets it state to the
828
+ * beginning. This does not fire any onFinish
829
+ * callbacks because the animation did not finish.
830
+ * However, since the animation was not destroyed
831
+ * (i.e. the animation could run again) we do not
832
+ * clear the onFinish callbacks.
833
+ */
777
834
  const stop = () => {
778
835
  childAnimations.forEach((animation) => {
779
836
  animation.stop();
@@ -783,6 +840,8 @@ export const createAnimation = (animationId) => {
783
840
  initialized = false;
784
841
  }
785
842
  resetFlags();
843
+ onStopOneTimeCallbacks.forEach((onStopCallback) => onStopCallback.c(0, ani));
844
+ onStopOneTimeCallbacks.length = 0;
786
845
  };
787
846
  const from = (property, value) => {
788
847
  const firstFrame = _keyframes[0];
@@ -61,7 +61,11 @@ export const createSwipeBackGesture = (el, canStartHandler, onStartHandler, onMo
61
61
  return createGesture({
62
62
  el,
63
63
  gestureName: 'goback-swipe',
64
- gesturePriority: 40,
64
+ /**
65
+ * Swipe to go back should have priority over other horizontal swipe
66
+ * gestures. These gestures have a priority of 100 which is why 101 was chosen here.
67
+ */
68
+ gesturePriority: 101,
65
69
  threshold: 10,
66
70
  canStart,
67
71
  onStart: onStartHandler,
package/dist/docs.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "timestamp": "2023-10-09T06:04:18",
2
+ "timestamp": "2023-10-10T06:04:31",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
5
  "version": "4.4.0",
@@ -159,6 +159,7 @@ const createAnimation = (animationId) => {
159
159
  const id = animationId;
160
160
  const onFinishCallbacks = [];
161
161
  const onFinishOneTimeCallbacks = [];
162
+ const onStopOneTimeCallbacks = [];
162
163
  const elements = [];
163
164
  const childAnimations = [];
164
165
  const stylesheets = [];
@@ -216,6 +217,28 @@ const createAnimation = (animationId) => {
216
217
  const isRunning = () => {
217
218
  return numAnimationsRunning !== 0 && !paused;
218
219
  };
220
+ /**
221
+ * @internal
222
+ * Remove a callback from a chosen callback array
223
+ * @param callbackToRemove: A reference to the callback that should be removed
224
+ * @param callbackObjects: An array of callbacks that callbackToRemove should be removed from.
225
+ */
226
+ const clearCallback = (callbackToRemove, callbackObjects) => {
227
+ const index = callbackObjects.findIndex((callbackObject) => callbackObject.c === callbackToRemove);
228
+ if (index > -1) {
229
+ callbackObjects.splice(index, 1);
230
+ }
231
+ };
232
+ /**
233
+ * @internal
234
+ * Add a callback to be fired when an animation is stopped/cancelled.
235
+ * @param callback: A reference to the callback that should be fired
236
+ * @param opts: Any options associated with this particular callback
237
+ */
238
+ const onStop = (callback, opts) => {
239
+ onStopOneTimeCallbacks.push({ c: callback, o: opts });
240
+ return ani;
241
+ };
219
242
  const onFinish = (callback, opts) => {
220
243
  const callbacks = (opts === null || opts === void 0 ? void 0 : opts.oneTimeCallback) ? onFinishOneTimeCallbacks : onFinishCallbacks;
221
244
  callbacks.push({ c: callback, o: opts });
@@ -884,7 +907,33 @@ const createAnimation = (animationId) => {
884
907
  numAnimationsRunning = childAnimations.length + 1;
885
908
  shouldCalculateNumAnimations = false;
886
909
  }
887
- onFinish(() => resolve(), { oneTimeCallback: true });
910
+ /**
911
+ * When one of these callbacks fires we
912
+ * need to clear the other's callback otherwise
913
+ * you can potentially get these callbacks
914
+ * firing multiple times if the play method
915
+ * is subsequently called.
916
+ * Example:
917
+ * animation.play() (onStop and onFinish callbacks are registered)
918
+ * animation.stop() (onStop callback is fired, onFinish is not)
919
+ * animation.play() (onStop and onFinish callbacks are registered)
920
+ * Total onStop callbacks: 1
921
+ * Total onFinish callbacks: 2
922
+ */
923
+ const onStopCallback = () => {
924
+ clearCallback(onFinishCallback, onFinishOneTimeCallbacks);
925
+ resolve();
926
+ };
927
+ const onFinishCallback = () => {
928
+ clearCallback(onStopCallback, onStopOneTimeCallbacks);
929
+ resolve();
930
+ };
931
+ /**
932
+ * The play method resolves when an animation
933
+ * run either finishes or is cancelled.
934
+ */
935
+ onFinish(onFinishCallback, { oneTimeCallback: true });
936
+ onStop(onStopCallback, { oneTimeCallback: true });
888
937
  childAnimations.forEach((animation) => {
889
938
  animation.play();
890
939
  });
@@ -897,6 +946,14 @@ const createAnimation = (animationId) => {
897
946
  paused = false;
898
947
  });
899
948
  };
949
+ /**
950
+ * Stops an animation and resets it state to the
951
+ * beginning. This does not fire any onFinish
952
+ * callbacks because the animation did not finish.
953
+ * However, since the animation was not destroyed
954
+ * (i.e. the animation could run again) we do not
955
+ * clear the onFinish callbacks.
956
+ */
900
957
  const stop = () => {
901
958
  childAnimations.forEach((animation) => {
902
959
  animation.stop();
@@ -906,6 +963,8 @@ const createAnimation = (animationId) => {
906
963
  initialized = false;
907
964
  }
908
965
  resetFlags();
966
+ onStopOneTimeCallbacks.forEach((onStopCallback) => onStopCallback.c(0, ani));
967
+ onStopOneTimeCallbacks.length = 0;
909
968
  };
910
969
  const from = (property, value) => {
911
970
  const firstFrame = _keyframes[0];
@@ -10,8 +10,8 @@ const LIFECYCLE_WILL_LEAVE = 'ionViewWillLeave';
10
10
  const LIFECYCLE_DID_LEAVE = 'ionViewDidLeave';
11
11
  const LIFECYCLE_WILL_UNLOAD = 'ionViewWillUnload';
12
12
 
13
- const iosTransitionAnimation = () => import('./ios.transition-d8223b18.js');
14
- const mdTransitionAnimation = () => import('./md.transition-caed184e.js');
13
+ const iosTransitionAnimation = () => import('./ios.transition-875ba2ea.js');
14
+ const mdTransitionAnimation = () => import('./md.transition-54c79f72.js');
15
15
  // TODO(FW-2832): types
16
16
  const transition = (opts) => {
17
17
  return new Promise((resolve, reject) => {
@@ -4,7 +4,7 @@
4
4
  import { MENU_BACK_BUTTON_PRIORITY } from './hardware-back-button-39299f84.js';
5
5
  import { c as componentOnReady } from './helpers-3379ba19.js';
6
6
  import { b as getIonMode } from './ionic-global-63a8d8c9.js';
7
- import { c as createAnimation } from './animation-a1d9e088.js';
7
+ import { c as createAnimation } from './animation-92066c62.js';
8
8
 
9
9
  /**
10
10
  * baseAnimation
package/dist/esm/index.js CHANGED
@@ -1,16 +1,16 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- export { c as createAnimation } from './animation-a1d9e088.js';
5
- export { a as LIFECYCLE_DID_ENTER, c as LIFECYCLE_DID_LEAVE, L as LIFECYCLE_WILL_ENTER, b as LIFECYCLE_WILL_LEAVE, d as LIFECYCLE_WILL_UNLOAD, g as getIonPageElement } from './index-32c6828b.js';
6
- export { iosTransitionAnimation } from './ios.transition-d8223b18.js';
7
- export { mdTransitionAnimation } from './md.transition-caed184e.js';
4
+ export { c as createAnimation } from './animation-92066c62.js';
5
+ export { a as LIFECYCLE_DID_ENTER, c as LIFECYCLE_DID_LEAVE, L as LIFECYCLE_WILL_ENTER, b as LIFECYCLE_WILL_LEAVE, d as LIFECYCLE_WILL_UNLOAD, g as getIonPageElement } from './index-0b0dd67c.js';
6
+ export { iosTransitionAnimation } from './ios.transition-875ba2ea.js';
7
+ export { mdTransitionAnimation } from './md.transition-54c79f72.js';
8
8
  export { g as getTimeGivenProgression } from './cubic-bezier-66542bc5.js';
9
9
  export { createGesture } from './index-ff313b19.js';
10
10
  export { g as getPlatforms, i as initialize, a as isPlatform } from './ionic-global-63a8d8c9.js';
11
11
  export { c as componentOnReady } from './helpers-3379ba19.js';
12
12
  export { I as IonicSafeString, g as getMode, s as setupConfig } from './config-96c9ace3.js';
13
- export { m as menuController } from './index-3d6aefa2.js';
13
+ export { m as menuController } from './index-97a2bb98.js';
14
14
  export { b as actionSheetController, a as alertController, l as loadingController, m as modalController, p as pickerController, c as popoverController, t as toastController } from './overlays-84621c0a.js';
15
15
  import './index-7a14ecec.js';
16
16
  import './index-cb894020.js';
@@ -8,7 +8,7 @@ import { c as createLockController } from './lock-controller-e8c6c051.js';
8
8
  import { d as createDelegateController, e as createTriggerController, B as BACKDROP, i as isCancel, f as present, g as dismiss, h as eventMethod, s as safeCall, j as prepareOverlay, k as setOverlayId } from './overlays-84621c0a.js';
9
9
  import { g as getClassMap } from './theme-17531cdf.js';
10
10
  import { b as getIonMode } from './ionic-global-63a8d8c9.js';
11
- import { c as createAnimation } from './animation-a1d9e088.js';
11
+ import { c as createAnimation } from './animation-92066c62.js';
12
12
  import './haptic-6447af60.js';
13
13
  import './capacitor-b4979570.js';
14
14
  import './index-7a14ecec.js';
@@ -9,7 +9,7 @@ import { c as createLockController } from './lock-controller-e8c6c051.js';
9
9
  import { d as createDelegateController, e as createTriggerController, B as BACKDROP, i as isCancel, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod, s as safeCall } from './overlays-84621c0a.js';
10
10
  import { g as getClassMap } from './theme-17531cdf.js';
11
11
  import { c as config, b as getIonMode } from './ionic-global-63a8d8c9.js';
12
- import { c as createAnimation } from './animation-a1d9e088.js';
12
+ import { c as createAnimation } from './animation-92066c62.js';
13
13
  import './haptic-6447af60.js';
14
14
  import './capacitor-b4979570.js';
15
15
  import './index-7a14ecec.js';
@@ -11,7 +11,7 @@ import { c as createKeyboardController } from './keyboard-controller-0c2dce71.js
11
11
  import { g as getTimeGivenProgression } from './cubic-bezier-66542bc5.js';
12
12
  import { a as attachComponent, d as detachComponent } from './framework-delegate-aa433dea.js';
13
13
  import { c as createLockController } from './lock-controller-e8c6c051.js';
14
- import { t as transition } from './index-32c6828b.js';
14
+ import { t as transition } from './index-0b0dd67c.js';
15
15
  import './index-595d62c9.js';
16
16
  import './index-7a14ecec.js';
17
17
  import './keyboard-b063f012.js';
@@ -1010,7 +1010,7 @@ const RouterOutlet = class {
1010
1010
  this.swipeHandler.onStart();
1011
1011
  }
1012
1012
  };
1013
- this.gesture = (await import('./swipe-back-6d4c0a4e.js')).createSwipeBackGesture(this.el, () => !this.gestureOrAnimationInProgress && !!this.swipeHandler && this.swipeHandler.canStart(), () => onStart(), (step) => { var _a; return (_a = this.ani) === null || _a === void 0 ? void 0 : _a.progressStep(step); }, (shouldComplete, step, dur) => {
1013
+ this.gesture = (await import('./swipe-back-0f3bfc8e.js')).createSwipeBackGesture(this.el, () => !this.gestureOrAnimationInProgress && !!this.swipeHandler && this.swipeHandler.canStart(), () => onStart(), (step) => { var _a; return (_a = this.ani) === null || _a === void 0 ? void 0 : _a.progressStep(step); }, (shouldComplete, step, dur) => {
1014
1014
  if (this.ani) {
1015
1015
  this.ani.onFinish(() => {
1016
1016
  this.gestureOrAnimationInProgress = false;
@@ -50,6 +50,9 @@ const Checkbox = class {
50
50
  this.ionBlur.emit();
51
51
  };
52
52
  this.onClick = (ev) => {
53
+ if (this.disabled) {
54
+ return;
55
+ }
53
56
  this.toggleChecked(ev);
54
57
  };
55
58
  this.color = undefined;
@@ -12,7 +12,7 @@ import { b as getIonMode } from './ionic-global-63a8d8c9.js';
12
12
  import { g as generateDayAriaLabel, a as getDay, i as isBefore, b as isAfter, c as isSameDay, d as getPreviousMonth, e as getNextMonth, v as validateParts, f as getPartsFromCalendarDay, h as getEndOfWeek, j as getStartOfWeek, k as getPreviousDay, l as getNextDay, m as getPreviousWeek, n as getNextWeek, p as parseMinParts, o as parseMaxParts, q as parseDate, w as warnIfValueOutOfBounds, r as convertToArrayOfNumbers, s as convertDataToISO, t as getToday, u as getClosestValidDate, x as getNumDaysInMonth, y as getCombinedDateColumnData, z as getMonthColumnData, A as getDayColumnData, B as getYearColumnData, C as isMonthFirstLocale, D as getTimeColumnsData, E as isLocaleDayPeriodRTL, F as getDaysOfWeek, G as getMonthAndYear, H as getDaysOfMonth, I as generateMonths, J as is24Hour, K as getLocalizedTime, L as getMonthAndDay, M as formatValue, N as getNextYear, O as getPreviousYear, P as clampDate, Q as parseAmPm, R as calculateHourFromAMPM } from './data-009dbf15.js';
13
13
  import { c as createLockController } from './lock-controller-e8c6c051.js';
14
14
  import { d as createDelegateController, e as createTriggerController, B as BACKDROP, i as isCancel, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod, s as safeCall } from './overlays-84621c0a.js';
15
- import { c as createAnimation } from './animation-a1d9e088.js';
15
+ import { c as createAnimation } from './animation-92066c62.js';
16
16
  import { b as hapticSelectionChanged, h as hapticSelectionEnd, a as hapticSelectionStart } from './haptic-6447af60.js';
17
17
  import './index-7a14ecec.js';
18
18
  import './framework-delegate-aa433dea.js';
@@ -8,7 +8,7 @@ import { c as createLockController } from './lock-controller-e8c6c051.js';
8
8
  import { d as createDelegateController, e as createTriggerController, B as BACKDROP, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod } from './overlays-84621c0a.js';
9
9
  import { g as getClassMap } from './theme-17531cdf.js';
10
10
  import { c as config, b as getIonMode } from './ionic-global-63a8d8c9.js';
11
- import { c as createAnimation } from './animation-a1d9e088.js';
11
+ import { c as createAnimation } from './animation-92066c62.js';
12
12
  import './index-7a14ecec.js';
13
13
  import './framework-delegate-aa433dea.js';
14
14
  import './hardware-back-button-39299f84.js';