@ionic/core 8.6.3-dev.11751478001.1cb7436f → 8.6.3-nightly.20250620

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 (92) hide show
  1. package/components/action-sheet.js +9 -8
  2. package/components/alert.js +8 -7
  3. package/components/focus-visible.js +18 -27
  4. package/components/ion-app.js +1 -3
  5. package/components/ion-datetime.js +2 -8
  6. package/components/ion-loading.js +8 -7
  7. package/components/ion-menu.js +5 -27
  8. package/components/ion-reorder-group.js +2 -1
  9. package/components/ion-router.js +0 -1
  10. package/components/ion-searchbar.js +6 -4
  11. package/components/ion-select.js +3 -3
  12. package/components/ion-toast.js +7 -6
  13. package/components/modal.js +10 -26
  14. package/components/popover.js +7 -8
  15. package/dist/cjs/{focus-visible-ZV7jHMPt.js → focus-visible-CCvKiLh3.js} +18 -27
  16. package/dist/cjs/ion-action-sheet.cjs.entry.js +9 -8
  17. package/dist/cjs/ion-alert.cjs.entry.js +8 -7
  18. package/dist/cjs/ion-app_8.cjs.entry.js +2 -4
  19. package/dist/cjs/ion-datetime_3.cjs.entry.js +3 -9
  20. package/dist/cjs/ion-loading.cjs.entry.js +8 -7
  21. package/dist/cjs/ion-menu_3.cjs.entry.js +5 -27
  22. package/dist/cjs/ion-modal.cjs.entry.js +10 -26
  23. package/dist/cjs/ion-popover.cjs.entry.js +7 -8
  24. package/dist/cjs/ion-reorder_2.cjs.entry.js +2 -1
  25. package/dist/cjs/ion-route_4.cjs.entry.js +0 -1
  26. package/dist/cjs/ion-searchbar.cjs.entry.js +6 -4
  27. package/dist/cjs/ion-select_3.cjs.entry.js +3 -3
  28. package/dist/cjs/ion-toast.cjs.entry.js +7 -6
  29. package/dist/collection/components/action-sheet/action-sheet.js +12 -11
  30. package/dist/collection/components/alert/alert.js +11 -10
  31. package/dist/collection/components/app/app.js +3 -8
  32. package/dist/collection/components/datetime/datetime.js +8 -23
  33. package/dist/collection/components/loading/loading.js +11 -10
  34. package/dist/collection/components/menu/menu.js +19 -62
  35. package/dist/collection/components/modal/modal.js +16 -35
  36. package/dist/collection/components/popover/popover.js +14 -18
  37. package/dist/collection/components/reorder-group/reorder-group.js +3 -2
  38. package/dist/collection/components/router/router.js +1 -5
  39. package/dist/collection/components/searchbar/searchbar.js +7 -5
  40. package/dist/collection/components/select/select.js +3 -3
  41. package/dist/collection/components/toast/toast.js +10 -9
  42. package/dist/collection/utils/focus-visible.js +18 -27
  43. package/dist/docs.json +72 -138
  44. package/dist/esm/{focus-visible-DZ2gZBzK.js → focus-visible-BmVRXR1y.js} +18 -27
  45. package/dist/esm/ion-action-sheet.entry.js +9 -8
  46. package/dist/esm/ion-alert.entry.js +8 -7
  47. package/dist/esm/ion-app_8.entry.js +2 -4
  48. package/dist/esm/ion-datetime_3.entry.js +3 -9
  49. package/dist/esm/ion-loading.entry.js +8 -7
  50. package/dist/esm/ion-menu_3.entry.js +5 -27
  51. package/dist/esm/ion-modal.entry.js +10 -26
  52. package/dist/esm/ion-popover.entry.js +7 -8
  53. package/dist/esm/ion-reorder_2.entry.js +2 -1
  54. package/dist/esm/ion-route_4.entry.js +0 -1
  55. package/dist/esm/ion-searchbar.entry.js +6 -4
  56. package/dist/esm/ion-select_3.entry.js +3 -3
  57. package/dist/esm/ion-toast.entry.js +7 -6
  58. package/dist/ionic/ionic.esm.js +1 -1
  59. package/dist/ionic/{p-b758a177.entry.js → p-2020aa51.entry.js} +1 -1
  60. package/dist/ionic/p-29759454.entry.js +4 -0
  61. package/dist/ionic/{p-e37d6c67.entry.js → p-3a4feac2.entry.js} +1 -1
  62. package/dist/ionic/p-4ddc10ef.entry.js +4 -0
  63. package/dist/ionic/{p-2d0eccfb.entry.js → p-6b666996.entry.js} +1 -1
  64. package/dist/ionic/p-7149db7e.entry.js +4 -0
  65. package/dist/ionic/{p-2d46fbe7.entry.js → p-96389029.entry.js} +1 -1
  66. package/dist/ionic/{p-0d131a02.entry.js → p-9e699d4a.entry.js} +1 -1
  67. package/dist/ionic/p-BmVRXR1y.js +4 -0
  68. package/dist/ionic/p-bec79123.entry.js +4 -0
  69. package/dist/ionic/{p-03d21728.entry.js → p-cb787a4b.entry.js} +1 -1
  70. package/dist/ionic/{p-d8429eb4.entry.js → p-cd12ed1c.entry.js} +1 -1
  71. package/dist/ionic/{p-78a61b3f.entry.js → p-ead42a37.entry.js} +1 -1
  72. package/dist/types/components/action-sheet/action-sheet.d.ts +6 -5
  73. package/dist/types/components/alert/alert.d.ts +6 -5
  74. package/dist/types/components/app/app.d.ts +0 -2
  75. package/dist/types/components/datetime/datetime.d.ts +0 -6
  76. package/dist/types/components/loading/loading.d.ts +6 -5
  77. package/dist/types/components/menu/menu.d.ts +3 -25
  78. package/dist/types/components/modal/modal.d.ts +6 -14
  79. package/dist/types/components/popover/popover.d.ts +5 -6
  80. package/dist/types/components/reorder-group/reorder-group.d.ts +1 -0
  81. package/dist/types/components/router/router.d.ts +0 -1
  82. package/dist/types/components/searchbar/searchbar.d.ts +2 -0
  83. package/dist/types/components/toast/toast.d.ts +5 -4
  84. package/dist/types/components.d.ts +18 -32
  85. package/hydrate/index.js +86 -136
  86. package/hydrate/index.mjs +86 -136
  87. package/package.json +3 -3
  88. package/dist/ionic/p-69f91268.entry.js +0 -4
  89. package/dist/ionic/p-7d5cf8c1.entry.js +0 -4
  90. package/dist/ionic/p-9e32212d.entry.js +0 -4
  91. package/dist/ionic/p-DZ2gZBzK.js +0 -4
  92. package/dist/ionic/p-b9ba04ca.entry.js +0 -4
@@ -19,44 +19,33 @@ const FOCUS_KEYS = [
19
19
  ];
20
20
  const startFocusVisible = (rootEl) => {
21
21
  let currentFocus = [];
22
- // Tracks if the last interaction was a pointer event (mouse, touch, pen)
23
- // Used to distinguish between pointer and keyboard navigation for focus styling
24
- let hadPointerEvent = false;
22
+ let keyboardMode = true;
25
23
  const ref = rootEl ? rootEl.shadowRoot : document;
26
24
  const root = rootEl ? rootEl : document.body;
27
- // Adds or removes the focused class for styling
28
25
  const setFocus = (elements) => {
29
26
  currentFocus.forEach((el) => el.classList.remove(ION_FOCUSED));
30
27
  elements.forEach((el) => el.classList.add(ION_FOCUSED));
31
28
  currentFocus = elements;
32
29
  };
33
- // Do not set focus on pointer interactions
34
- const pointerDown = (ev) => {
35
- if (ev instanceof PointerEvent && ev.pointerType !== '') {
36
- hadPointerEvent = true;
37
- // Reset after the event loop so only the immediate focusin is suppressed
38
- setTimeout(() => {
39
- hadPointerEvent = false;
40
- }, 0);
41
- }
30
+ const pointerDown = () => {
31
+ keyboardMode = false;
32
+ setFocus([]);
42
33
  };
43
- // Clear hadPointerEvent so keyboard navigation shows focus
44
- // Also, clear focus if the key is not a navigation key
45
34
  const onKeydown = (ev) => {
46
- hadPointerEvent = false;
47
- const keyboardEvent = ev;
48
- if (!FOCUS_KEYS.includes(keyboardEvent.key)) {
35
+ keyboardMode = FOCUS_KEYS.includes(ev.key);
36
+ if (!keyboardMode) {
49
37
  setFocus([]);
50
38
  }
51
39
  };
52
- // Set focus if the last interaction was NOT a pointer event
53
- // This works around iOS/Safari bugs where keydown is not fired for Tab
54
40
  const onFocusin = (ev) => {
55
- const target = ev.target;
56
- if (target.classList.contains(ION_FOCUSABLE) && !hadPointerEvent) {
57
- const toFocus = ev
58
- .composedPath()
59
- .filter((el) => el instanceof HTMLElement && el.classList.contains(ION_FOCUSABLE));
41
+ if (keyboardMode && ev.composedPath !== undefined) {
42
+ const toFocus = ev.composedPath().filter((el) => {
43
+ // TODO(FW-2832): type
44
+ if (el.classList) {
45
+ return el.classList.contains(ION_FOCUSABLE);
46
+ }
47
+ return false;
48
+ });
60
49
  setFocus(toFocus);
61
50
  }
62
51
  };
@@ -68,12 +57,14 @@ const startFocusVisible = (rootEl) => {
68
57
  ref.addEventListener('keydown', onKeydown);
69
58
  ref.addEventListener('focusin', onFocusin);
70
59
  ref.addEventListener('focusout', onFocusout);
71
- ref.addEventListener('pointerdown', pointerDown, { passive: true });
60
+ ref.addEventListener('touchstart', pointerDown, { passive: true });
61
+ ref.addEventListener('mousedown', pointerDown);
72
62
  const destroy = () => {
73
63
  ref.removeEventListener('keydown', onKeydown);
74
64
  ref.removeEventListener('focusin', onFocusin);
75
65
  ref.removeEventListener('focusout', onFocusout);
76
- ref.removeEventListener('pointerdown', pointerDown);
66
+ ref.removeEventListener('touchstart', pointerDown);
67
+ ref.removeEventListener('mousedown', pointerDown);
77
68
  };
78
69
  return {
79
70
  destroy,
@@ -187,15 +187,16 @@ const ActionSheet = class {
187
187
  }
188
188
  /**
189
189
  * Dismiss the action sheet overlay after it has been presented.
190
- * This is a no-op if the overlay has not been presented yet. If you want
191
- * to remove an overlay from the DOM that was never presented, use the
192
- * [remove](https://developer.mozilla.org/en-US/docs/Web/API/Element/remove) method.
193
190
  *
194
191
  * @param data Any data to emit in the dismiss events.
195
192
  * @param role The role of the element that is dismissing the action sheet.
196
193
  * This can be useful in a button handler for determining which button was
197
- * clicked to dismiss the action sheet. Some examples include:
198
- * `"cancel"`, `"destructive"`, `"selected"`, and `"backdrop"`.
194
+ * clicked to dismiss the action sheet.
195
+ * Some examples include: ``"cancel"`, `"destructive"`, "selected"`, and `"backdrop"`.
196
+ *
197
+ * This is a no-op if the overlay has not been presented yet. If you want
198
+ * to remove an overlay from the DOM that was never presented, use the
199
+ * [remove](https://developer.mozilla.org/en-US/docs/Web/API/Element/remove) method.
199
200
  */
200
201
  async dismiss(data, role) {
201
202
  const unlock = await this.lockController.lock();
@@ -307,12 +308,12 @@ const ActionSheet = class {
307
308
  const cancelButton = allButtons.find((b) => b.role === 'cancel');
308
309
  const buttons = allButtons.filter((b) => b.role !== 'cancel');
309
310
  const headerID = `action-sheet-${overlayIndex}-header`;
310
- return (h(Host, Object.assign({ key: '9fef156b2a1f09ca4a6c1fe1f37c374139bde03c', role: "dialog", "aria-modal": "true", "aria-labelledby": header !== undefined ? headerID : null, tabindex: "-1" }, htmlAttributes, { style: {
311
+ return (h(Host, Object.assign({ key: '7bbd202ca9e19727e7514abbe073687d982f80c3', role: "dialog", "aria-modal": "true", "aria-labelledby": header !== undefined ? headerID : null, tabindex: "-1" }, htmlAttributes, { style: {
311
312
  zIndex: `${20000 + this.overlayIndex}`,
312
- }, class: Object.assign(Object.assign({ [mode]: true }, getClassMap(this.cssClass)), { 'overlay-hidden': true, 'action-sheet-translucent': this.translucent }), onIonActionSheetWillDismiss: this.dispatchCancelHandler, onIonBackdropTap: this.onBackdropTap }), h("ion-backdrop", { key: '81cf3f7d19864e041813987b46d2d115b8466819', tappable: this.backdropDismiss }), h("div", { key: '791c6a976683646fc306a42c15c5078b6f06a45f', tabindex: "0", "aria-hidden": "true" }), h("div", { key: 'a350b489ef7852eab9dc2227ce6d92da27dd9bf9', class: "action-sheet-wrapper ion-overlay-wrapper", ref: (el) => (this.wrapperEl = el) }, h("div", { key: '69ba51ee13510c1a411d87cb4845b11b7302a36f', class: "action-sheet-container" }, h("div", { key: 'bded15b8306c36591e526f0f99e1eeabcbab3915', class: "action-sheet-group", ref: (el) => (this.groupEl = el) }, header !== undefined && (h("div", { key: '06b5147c0f6d9180fe8f12e75c9b4a0310226adc', id: headerID, class: {
313
+ }, class: Object.assign(Object.assign({ [mode]: true }, getClassMap(this.cssClass)), { 'overlay-hidden': true, 'action-sheet-translucent': this.translucent }), onIonActionSheetWillDismiss: this.dispatchCancelHandler, onIonBackdropTap: this.onBackdropTap }), h("ion-backdrop", { key: '23344a9221a2e6720d7b9de5249dc37256cafa7b', tappable: this.backdropDismiss }), h("div", { key: 'fbc2ba15549c2ab04e759e82df6e177fd80cc0a6', tabindex: "0", "aria-hidden": "true" }), h("div", { key: '748ee5235d0b4cb26d6f1b7589f77af2e37ad28a', class: "action-sheet-wrapper ion-overlay-wrapper", ref: (el) => (this.wrapperEl = el) }, h("div", { key: '7ce5fa236cf75e9b1e49c4725c9a811078706554', class: "action-sheet-container" }, h("div", { key: 'dc2251f3bcee4a93e3449f09621cbd2b65d329e9', class: "action-sheet-group", ref: (el) => (this.groupEl = el) }, header !== undefined && (h("div", { key: '48d325c8a852f56ed57a9ada1a6709d05ba32ee2', id: headerID, class: {
313
314
  'action-sheet-title': true,
314
315
  'action-sheet-has-sub-title': this.subHeader !== undefined,
315
- } }, header, this.subHeader && h("div", { key: '54874362a75c679aba803bf4f8768f5404d2dd28', class: "action-sheet-sub-title" }, this.subHeader))), buttons.map((b) => (h("button", Object.assign({}, b.htmlAttributes, { type: "button", id: b.id, class: buttonClass(b), onClick: () => this.buttonClick(b), disabled: b.disabled }), h("span", { class: "action-sheet-button-inner" }, b.icon && h("ion-icon", { icon: b.icon, "aria-hidden": "true", lazy: false, class: "action-sheet-icon" }), b.text), mode === 'md' && h("ion-ripple-effect", null))))), cancelButton && (h("div", { key: '67b0de298eb424f3dea846a841b7a06d70e3930d', class: "action-sheet-group action-sheet-group-cancel" }, h("button", Object.assign({ key: 'e7e3f9a5495eea9b97dbf885ef36944f2e420eff' }, cancelButton.htmlAttributes, { type: "button", class: buttonClass(cancelButton), onClick: () => this.buttonClick(cancelButton) }), h("span", { key: 'f889d29ed6c3d14bbc1d805888351d87f5122377', class: "action-sheet-button-inner" }, cancelButton.icon && (h("ion-icon", { key: '7c05cf424b38c37fd40aaeb42a494387291571fb', icon: cancelButton.icon, "aria-hidden": "true", lazy: false, class: "action-sheet-icon" })), cancelButton.text), mode === 'md' && h("ion-ripple-effect", { key: 'bed927b477dc2708a5123ef560274fca9819b3d6' })))))), h("div", { key: 'c5df1b11dc15a93892d57065d3dd5fbe02e43b39', tabindex: "0", "aria-hidden": "true" })));
316
+ } }, header, this.subHeader && h("div", { key: '66093728052eb67f37a35f3232761ce4a08896f3', class: "action-sheet-sub-title" }, this.subHeader))), buttons.map((b) => (h("button", Object.assign({}, b.htmlAttributes, { type: "button", id: b.id, class: buttonClass(b), onClick: () => this.buttonClick(b), disabled: b.disabled }), h("span", { class: "action-sheet-button-inner" }, b.icon && h("ion-icon", { icon: b.icon, "aria-hidden": "true", lazy: false, class: "action-sheet-icon" }), b.text), mode === 'md' && h("ion-ripple-effect", null))))), cancelButton && (h("div", { key: 'f4eb8e3e2885b85af5080df18d0de0bdd1d719de', class: "action-sheet-group action-sheet-group-cancel" }, h("button", Object.assign({ key: '169f4eb09255aba85062baad49ceb151239fbfb7' }, cancelButton.htmlAttributes, { type: "button", class: buttonClass(cancelButton), onClick: () => this.buttonClick(cancelButton) }), h("span", { key: '25fb8a466dd67ea94c79cfb4f9965527e1ce6d42', class: "action-sheet-button-inner" }, cancelButton.icon && (h("ion-icon", { key: 'eb5b071e120a2c86afdf967af6a763a43044d1ca', icon: cancelButton.icon, "aria-hidden": "true", lazy: false, class: "action-sheet-icon" })), cancelButton.text), mode === 'md' && h("ion-ripple-effect", { key: '452ad7e1052b2c681e2d98de8193949755ad4d54' })))))), h("div", { key: 'e1cecf280c987c050d9445e2c458b903f153089b', tabindex: "0", "aria-hidden": "true" })));
316
317
  }
317
318
  get el() { return getElement(this); }
318
319
  static get watchers() { return {
@@ -357,15 +357,16 @@ const Alert = class {
357
357
  }
358
358
  /**
359
359
  * Dismiss the alert overlay after it has been presented.
360
- * This is a no-op if the overlay has not been presented yet. If you want
361
- * to remove an overlay from the DOM that was never presented, use the
362
- * [remove](https://developer.mozilla.org/en-US/docs/Web/API/Element/remove) method.
363
360
  *
364
361
  * @param data Any data to emit in the dismiss events.
365
362
  * @param role The role of the element that is dismissing the alert.
366
363
  * This can be useful in a button handler for determining which button was
367
- * clicked to dismiss the alert. Some examples include:
368
- * `"cancel"`, `"destructive"`, `"selected"`, and `"backdrop"`.
364
+ * clicked to dismiss the alert.
365
+ * Some examples include: ``"cancel"`, `"destructive"`, "selected"`, and `"backdrop"`.
366
+ *
367
+ * This is a no-op if the overlay has not been presented yet. If you want
368
+ * to remove an overlay from the DOM that was never presented, use the
369
+ * [remove](https://developer.mozilla.org/en-US/docs/Web/API/Element/remove) method.
369
370
  */
370
371
  async dismiss(data, role) {
371
372
  const unlock = await this.lockController.lock();
@@ -535,9 +536,9 @@ const Alert = class {
535
536
  * If neither are defined, do not set aria-labelledby.
536
537
  */
537
538
  const ariaLabelledBy = header && subHeader ? `${hdrId} ${subHdrId}` : header ? hdrId : subHeader ? subHdrId : null;
538
- return (h(Host, { key: '6025440b9cd369d4fac89e7e4296c84a10a0b8e0', tabindex: "-1", style: {
539
+ return (h(Host, { key: 'f8ee04fe6a97a2585b302c8e1a9eea3b122e3479', tabindex: "-1", style: {
539
540
  zIndex: `${20000 + overlayIndex}`,
540
- }, class: Object.assign(Object.assign({}, getClassMap(this.cssClass)), { [mode]: true, 'overlay-hidden': true, 'alert-translucent': this.translucent }), onIonAlertWillDismiss: this.dispatchCancelHandler, onIonBackdropTap: this.onBackdropTap }, h("ion-backdrop", { key: '3cd5ca8b99cb95b11dd22ab41a820d841142896f', tappable: this.backdropDismiss }), h("div", { key: '4cc62ae6e21424057d22aeef1e8fc77011e77cd5', tabindex: "0", "aria-hidden": "true" }), h("div", Object.assign({ key: '364057a69f25aa88904df17bdcf7e5bf714e7830', class: "alert-wrapper ion-overlay-wrapper", role: role, "aria-modal": "true", "aria-labelledby": ariaLabelledBy, "aria-describedby": message !== undefined ? msgId : null, tabindex: "0", ref: (el) => (this.wrapperEl = el) }, htmlAttributes), h("div", { key: '78694e3c0db2d408df3899fb1a90859bcc8d14cc', class: "alert-head" }, header && (h("h2", { key: 'ec88ff3e4e1ea871b5975133fdcf4cac38b05e0f', id: hdrId, class: "alert-title" }, header)), subHeader && !header && (h("h2", { key: '9b09bc8bb68af255ef8b7d22587acc946148e544', id: subHdrId, class: "alert-sub-title" }, subHeader)), subHeader && header && (h("h3", { key: '99abe815f75d2df7f1b77c0df9f3436724fea76f', id: subHdrId, class: "alert-sub-title" }, subHeader))), this.renderAlertMessage(msgId), this.renderAlertInputs(), this.renderAlertButtons()), h("div", { key: 'a43d0c22c0e46b1ef911f92ffeb253d7911b85f7', tabindex: "0", "aria-hidden": "true" })));
541
+ }, class: Object.assign(Object.assign({}, getClassMap(this.cssClass)), { [mode]: true, 'overlay-hidden': true, 'alert-translucent': this.translucent }), onIonAlertWillDismiss: this.dispatchCancelHandler, onIonBackdropTap: this.onBackdropTap }, h("ion-backdrop", { key: 'e9592e879f51c27ef20016beec12c986be632cf3', tappable: this.backdropDismiss }), h("div", { key: '5e9425c3c8acdea6f8006389689c73220e2ce423', tabindex: "0", "aria-hidden": "true" }), h("div", Object.assign({ key: '615465703e357619681fc36ed7276591a6fe3787', class: "alert-wrapper ion-overlay-wrapper", role: role, "aria-modal": "true", "aria-labelledby": ariaLabelledBy, "aria-describedby": message !== undefined ? msgId : null, tabindex: "0", ref: (el) => (this.wrapperEl = el) }, htmlAttributes), h("div", { key: '934eba3759456cd4660e10f274edc7859f908461', class: "alert-head" }, header && (h("h2", { key: '7d5d98d71f81f59a2cba227121b6fa01e6cc53b6', id: hdrId, class: "alert-title" }, header)), subHeader && !header && (h("h2", { key: 'e5f5d35748c58a98ee933eb15cb1dcaf8113e9a7', id: subHdrId, class: "alert-sub-title" }, subHeader)), subHeader && header && (h("h3", { key: 'a5cb89ca02bfa9c4828e694cb0835493a9088b05', id: subHdrId, class: "alert-sub-title" }, subHeader))), this.renderAlertMessage(msgId), this.renderAlertInputs(), this.renderAlertButtons()), h("div", { key: 'cacffc31c911882df73e6845d15c8bb2d4acab56', tabindex: "0", "aria-hidden": "true" })));
541
542
  }
542
543
  get el() { return getElement(this); }
543
544
  static get watchers() { return {
@@ -58,7 +58,7 @@ const App = class {
58
58
  if (typeof window !== 'undefined') {
59
59
  import('./keyboard-ywgs5efA.js').then((module) => module.startKeyboardAssist(window));
60
60
  }
61
- import('./focus-visible-DZ2gZBzK.js').then((module) => (this.focusVisible = module.startFocusVisible()));
61
+ import('./focus-visible-BmVRXR1y.js').then((module) => (this.focusVisible = module.startFocusVisible()));
62
62
  });
63
63
  }
64
64
  }
@@ -70,8 +70,6 @@ const App = class {
70
70
  * a result of another user action. (Ex: We focus the first element
71
71
  * inside of a popover when the user presents it, but the popover is not always
72
72
  * presented as a result of keyboard action.)
73
- *
74
- * @param elements An array of HTML elements to set focus on.
75
73
  */
76
74
  async setFocus(elements) {
77
75
  if (this.focusVisible) {
@@ -80,7 +78,7 @@ const App = class {
80
78
  }
81
79
  render() {
82
80
  const mode = getIonMode(this);
83
- return (h(Host, { key: '9be440c65819e4fa67c2c3c6477ab40b3ad3eed3', class: {
81
+ return (h(Host, { key: '03aa892f986330078d112b1e8b010df98fa7e39e', class: {
84
82
  [mode]: true,
85
83
  'ion-page': true,
86
84
  'force-statusbar-padding': config.getBoolean('_forceStatusbarPadding'),
@@ -2,7 +2,7 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { o as printIonError, m as printIonWarning, r as registerInstance, d as createEvent, e as getIonMode, w as writeTask, h, j as Host, k as getElement } from './index-B_U9CtaY.js';
5
- import { startFocusVisible } from './focus-visible-DZ2gZBzK.js';
5
+ import { startFocusVisible } from './focus-visible-BmVRXR1y.js';
6
6
  import { r as raf, g as getElementRoot, a as renderHiddenInput, e as clamp } from './helpers-1O4D2b7y.js';
7
7
  import { i as isRTL } from './dir-C53feagD.js';
8
8
  import { c as createColorClasses, g as getClassMap } from './theme-DiVJyqlX.js';
@@ -992,8 +992,6 @@ const Datetime = class {
992
992
  * Confirms the selected datetime value, updates the
993
993
  * `value` property, and optionally closes the popover
994
994
  * or modal that the datetime was presented in.
995
- *
996
- * @param closeOverlay If `true`, closes the parent overlay. Defaults to `false`.
997
995
  */
998
996
  async confirm(closeOverlay = false) {
999
997
  const { isCalendarPicker, activeParts, preferWheel, workingParts } = this;
@@ -1027,8 +1025,6 @@ const Datetime = class {
1027
1025
  * Resets the internal state of the datetime but does not update the value.
1028
1026
  * Passing a valid ISO-8601 string will reset the state of the component to the provided date.
1029
1027
  * If no value is provided, the internal state will be reset to the clamped value of the min, max and today.
1030
- *
1031
- * @param startDate A valid [ISO-8601 string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#date_time_string_format) to reset the datetime state to.
1032
1028
  */
1033
1029
  async reset(startDate) {
1034
1030
  this.processValue(startDate);
@@ -1038,8 +1034,6 @@ const Datetime = class {
1038
1034
  * optionally closes the popover
1039
1035
  * or modal that the datetime was
1040
1036
  * presented in.
1041
- *
1042
- * @param closeOverlay If `true`, closes the parent overlay. Defaults to `false`.
1043
1037
  */
1044
1038
  async cancel(closeOverlay = false) {
1045
1039
  this.ionCancel.emit();
@@ -1853,7 +1847,7 @@ const Datetime = class {
1853
1847
  const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
1854
1848
  const hasWheelVariant = hasDatePresentation && preferWheel;
1855
1849
  renderHiddenInput(true, el, name, formatValue(value), disabled);
1856
- return (h(Host, { key: '79677f5bc0fb32fb68569636bd76e68238e62eb8', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: Object.assign({}, createColorClasses(color, {
1850
+ return (h(Host, { key: '7ea46c27aa5fb01b748dd4d6eb2340ad13f65175', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: Object.assign({}, createColorClasses(color, {
1857
1851
  [mode]: true,
1858
1852
  ['datetime-readonly']: readonly,
1859
1853
  ['datetime-disabled']: disabled,
@@ -1863,7 +1857,7 @@ const Datetime = class {
1863
1857
  [`datetime-size-${size}`]: true,
1864
1858
  [`datetime-prefer-wheel`]: hasWheelVariant,
1865
1859
  [`datetime-grid`]: isGridStyle,
1866
- })) }, h("div", { key: 'bf07b1e3c64af6e837663ff470bea93787a6e86f', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
1860
+ })) }, h("div", { key: '6964378424c58b053e23279d08eaedf28dfcc315', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
1867
1861
  }
1868
1862
  get el() { return getElement(this); }
1869
1863
  static get watchers() { return {
@@ -225,15 +225,16 @@ const Loading = class {
225
225
  }
226
226
  /**
227
227
  * Dismiss the loading overlay after it has been presented.
228
- * This is a no-op if the overlay has not been presented yet. If you want
229
- * to remove an overlay from the DOM that was never presented, use the
230
- * [remove](https://developer.mozilla.org/en-US/docs/Web/API/Element/remove) method.
231
228
  *
232
229
  * @param data Any data to emit in the dismiss events.
233
230
  * @param role The role of the element that is dismissing the loading.
234
231
  * This can be useful in a button handler for determining which button was
235
- * clicked to dismiss the loading. Some examples include:
236
- * `"cancel"`, `"destructive"`, `"selected"`, and `"backdrop"`.
232
+ * clicked to dismiss the loading.
233
+ * Some examples include: ``"cancel"`, `"destructive"`, "selected"`, and `"backdrop"`.
234
+ *
235
+ * This is a no-op if the overlay has not been presented yet. If you want
236
+ * to remove an overlay from the DOM that was never presented, use the
237
+ * [remove](https://developer.mozilla.org/en-US/docs/Web/API/Element/remove) method.
237
238
  */
238
239
  async dismiss(data, role) {
239
240
  const unlock = await this.lockController.lock();
@@ -275,9 +276,9 @@ const Loading = class {
275
276
  * Otherwise, don't set aria-labelledby.
276
277
  */
277
278
  const ariaLabelledBy = message !== undefined ? msgId : null;
278
- return (h(Host, Object.assign({ key: '4497183ce220242abe19ae15f328f9a92ccafbbc', role: "dialog", "aria-modal": "true", "aria-labelledby": ariaLabelledBy, tabindex: "-1" }, htmlAttributes, { style: {
279
+ return (h(Host, Object.assign({ key: '6369ed244c06c39aa338141bffacf7a861d7da1a', role: "dialog", "aria-modal": "true", "aria-labelledby": ariaLabelledBy, tabindex: "-1" }, htmlAttributes, { style: {
279
280
  zIndex: `${40000 + this.overlayIndex}`,
280
- }, onIonBackdropTap: this.onBackdropTap, class: Object.assign(Object.assign({}, getClassMap(this.cssClass)), { [mode]: true, 'overlay-hidden': true, 'loading-translucent': this.translucent }) }), h("ion-backdrop", { key: '231dec84e424a2dc358ce95b84d6035cf43e4dea', visible: this.showBackdrop, tappable: this.backdropDismiss }), h("div", { key: 'c9af29b6e6bb49a217396a5c874bbfb8835a926c', tabindex: "0", "aria-hidden": "true" }), h("div", { key: 'a8659863743cdeccbe1ba810eaabfd3ebfcb86f3', class: "loading-wrapper ion-overlay-wrapper" }, spinner && (h("div", { key: '3b346f39bc71691bd8686556a1e142198a7b12fa', class: "loading-spinner" }, h("ion-spinner", { key: '8dc2bf1556e5138e262827f1516c59ecd09f3520', name: spinner, "aria-hidden": "true" }))), message !== undefined && this.renderLoadingMessage(msgId)), h("div", { key: '054164c0dbae9a0e0973dd3c8e28f5b771820310', tabindex: "0", "aria-hidden": "true" })));
281
+ }, onIonBackdropTap: this.onBackdropTap, class: Object.assign(Object.assign({}, getClassMap(this.cssClass)), { [mode]: true, 'overlay-hidden': true, 'loading-translucent': this.translucent }) }), h("ion-backdrop", { key: '1fd5fd8581d59eec321e534f9116f3ec0501010a', visible: this.showBackdrop, tappable: this.backdropDismiss }), h("div", { key: 'b4028045b0c8fbb9946136d85d939d55120b867c', tabindex: "0", "aria-hidden": "true" }), h("div", { key: 'b045fb0e61cc28e8163d45be18b431918dc27c80', class: "loading-wrapper ion-overlay-wrapper" }, spinner && (h("div", { key: '2cf9df796f987d1251b3599d10a48ed87a1d0eb9', class: "loading-spinner" }, h("ion-spinner", { key: '371cd41655402326adcb1e2fe1481009a83243b2', name: spinner, "aria-hidden": "true" }))), message !== undefined && this.renderLoadingMessage(msgId)), h("div", { key: '2a5e5e66d22ee4c1cef0c93815ef023d47e7a8eb', tabindex: "0", "aria-hidden": "true" })));
281
282
  }
282
283
  get el() { return getElement(this); }
283
284
  static get watchers() { return {
@@ -240,7 +240,7 @@ const Menu = class {
240
240
  return Promise.resolve(this._isOpen);
241
241
  }
242
242
  /**
243
- * Returns `true` if the menu is active.
243
+ * Returns `true` is the menu is active.
244
244
  *
245
245
  * A menu is active when it can be opened or closed, meaning it's enabled
246
246
  * and it's not part of a `ion-split-pane`.
@@ -251,10 +251,6 @@ const Menu = class {
251
251
  /**
252
252
  * Opens the menu. If the menu is already open or it can't be opened,
253
253
  * it returns `false`.
254
- *
255
- * @param animated If `true`, the menu will animate when opening.
256
- * If `false`, the menu will open instantly without animation.
257
- * Defaults to `true`.
258
254
  */
259
255
  open(animated = true) {
260
256
  return this.setOpen(true, animated);
@@ -262,38 +258,20 @@ const Menu = class {
262
258
  /**
263
259
  * Closes the menu. If the menu is already closed or it can't be closed,
264
260
  * it returns `false`.
265
- *
266
- * @param animated If `true`, the menu will animate when closing. If `false`,
267
- * the menu will close instantly without animation. Defaults to `true`.
268
- * @param role The role of the element that is closing the menu.
269
- * This can be useful in a button handler for determining which button was
270
- * clicked to close the menu. Some examples include:
271
- * `"cancel"`, `"destructive"`, `"selected"`, and `"backdrop"`.
272
261
  */
273
262
  close(animated = true, role) {
274
263
  return this.setOpen(false, animated, role);
275
264
  }
276
265
  /**
277
- * Toggles the menu. If the menu is already open, it will try to close,
278
- * otherwise it will try to open it.
266
+ * Toggles the menu. If the menu is already open, it will try to close, otherwise it will try to open it.
279
267
  * If the operation can't be completed successfully, it returns `false`.
280
- *
281
- * @param animated If `true`, the menu will animate when opening/closing.
282
- * If `false`, the menu will open/close instantly without animation.
283
- * Defaults to `true`.
284
268
  */
285
269
  toggle(animated = true) {
286
270
  return this.setOpen(!this._isOpen, animated);
287
271
  }
288
272
  /**
289
- * Opens or closes the menu.
273
+ * Opens or closes the button.
290
274
  * If the operation can't be completed successfully, it returns `false`.
291
- *
292
- * @param shouldOpen If `true`, the menu will open. If `false`, the menu
293
- * will close.
294
- * @param animated If `true`, the menu will animate when opening/closing.
295
- * If `false`, the menu will open/close instantly without animation.
296
- * @param role The role of the element that is closing the menu.
297
275
  */
298
276
  setOpen(shouldOpen, animated = true, role) {
299
277
  return menuController._setOpen(this, shouldOpen, animated, role);
@@ -658,14 +636,14 @@ const Menu = class {
658
636
  * the ionBackButton listener in the menu controller
659
637
  * will handle closing the menu when Escape is pressed.
660
638
  */
661
- return (h(Host, { key: 'a5c75aa40a34530b56ee3b98d706a5ac5ae300de', onKeyDown: shouldUseCloseWatcher() ? null : this.onKeydown, role: "navigation", "aria-label": inheritedAttributes['aria-label'] || 'menu', class: {
639
+ return (h(Host, { key: '9e4ae9476a76781f1d228395c9af9e1c39ec82bb', onKeyDown: shouldUseCloseWatcher() ? null : this.onKeydown, role: "navigation", "aria-label": inheritedAttributes['aria-label'] || 'menu', class: {
662
640
  [mode]: true,
663
641
  [`menu-type-${type}`]: true,
664
642
  'menu-enabled': !disabled,
665
643
  [`menu-side-${side}`]: true,
666
644
  'menu-pane-visible': isPaneVisible,
667
645
  'split-pane-side': hostContext('ion-split-pane', el),
668
- } }, h("div", { key: '3f5f70acd4d3ed6bb445122f4f01d73db738a75f', class: "menu-inner", part: "container", ref: (el) => (this.menuInnerEl = el) }, h("slot", { key: '3161326c9330e7f7441299c428b87a91b31a83e9' })), h("ion-backdrop", { key: '917b50f38489bdf03d0c642af8b4e4e172c7dc4c', ref: (el) => (this.backdropEl = el), class: "menu-backdrop", tappable: false, stopPropagation: false, part: "backdrop" })));
646
+ } }, h("div", { key: 'c6153589d872ac7e3fdf5eedfdb858eb64ccd713', class: "menu-inner", part: "container", ref: (el) => (this.menuInnerEl = el) }, h("slot", { key: '9994aac4b22f17db34c9b8b2aa56b8710b9df645' })), h("ion-backdrop", { key: 'f09ac30cc4dd2dcb10628965e659dae5a23baf98', ref: (el) => (this.backdropEl = el), class: "menu-backdrop", tappable: false, stopPropagation: false, part: "backdrop" })));
669
647
  }
670
648
  get el() { return getElement(this); }
671
649
  static get watchers() { return {
@@ -1482,17 +1482,6 @@ const Modal = class {
1482
1482
  el.dispatchEvent(ev);
1483
1483
  }
1484
1484
  };
1485
- /**
1486
- * When the modal receives focus directly, pass focus to the handle
1487
- * if it exists and is focusable, otherwise let the focus trap handle it.
1488
- */
1489
- this.onModalFocus = (ev) => {
1490
- const { dragHandleEl, el } = this;
1491
- // Only handle focus if the modal itself was focused (not a child element)
1492
- if (ev.target === el && dragHandleEl && dragHandleEl.tabIndex !== -1) {
1493
- dragHandleEl.focus();
1494
- }
1495
- };
1496
1485
  }
1497
1486
  onIsOpenChange(newValue, oldValue) {
1498
1487
  if (newValue === true && oldValue === false) {
@@ -1824,13 +1813,13 @@ const Modal = class {
1824
1813
  }
1825
1814
  /**
1826
1815
  * Dismiss the modal overlay after it has been presented.
1816
+ *
1817
+ * @param data Any data to emit in the dismiss events.
1818
+ * @param role The role of the element that is dismissing the modal. For example, 'cancel' or 'backdrop'.
1819
+ *
1827
1820
  * This is a no-op if the overlay has not been presented yet. If you want
1828
1821
  * to remove an overlay from the DOM that was never presented, use the
1829
1822
  * [remove](https://developer.mozilla.org/en-US/docs/Web/API/Element/remove) method.
1830
- *
1831
- * @param data Any data to emit in the dismiss events.
1832
- * @param role The role of the element that is dismissing the modal.
1833
- * For example, `cancel` or `backdrop`.
1834
1823
  */
1835
1824
  async dismiss(data, role) {
1836
1825
  var _a;
@@ -1902,10 +1891,8 @@ const Modal = class {
1902
1891
  return eventMethod(this.el, 'ionModalWillDismiss');
1903
1892
  }
1904
1893
  /**
1905
- * Move a sheet style modal to a specific breakpoint.
1906
- *
1907
- * @param breakpoint The breakpoint value to move the sheet modal to.
1908
- * Must be a value defined in your `breakpoints` array.
1894
+ * Move a sheet style modal to a specific breakpoint. The breakpoint value must
1895
+ * be a value defined in your `breakpoints` array.
1909
1896
  */
1910
1897
  async setCurrentBreakpoint(breakpoint) {
1911
1898
  if (!this.isSheetModal) {
@@ -1964,21 +1951,18 @@ const Modal = class {
1964
1951
  const mode = getIonMode(this);
1965
1952
  const isCardModal = presentingElement !== undefined && mode === 'ios';
1966
1953
  const isHandleCycle = handleBehavior === 'cycle';
1967
- const isSheetModalWithHandle = isSheetModal && showHandle;
1968
- return (h(Host, Object.assign({ key: '8add05bb43a2cdb5e3cf180147d31eb85a018fe0', "no-router": true,
1969
- // Allow the modal to be navigable when the handle is focusable
1970
- tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1 }, htmlAttributes, { style: {
1954
+ return (h(Host, Object.assign({ key: '0bcbdcfcd7d890eb599da3f97f21c317d34f8e0e', "no-router": true, tabindex: "-1" }, htmlAttributes, { style: {
1971
1955
  zIndex: `${20000 + this.overlayIndex}`,
1972
- }, class: Object.assign({ [mode]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }), h("ion-backdrop", { key: '90a6605a9564a699d6f66cf71cf6b506796a2963', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: 'a97d071395333bf803c0a9347bda000cf7500d8d', class: "modal-shadow" }), h("div", Object.assign({ key: 'e7b7985c7414a13e3ba8dcecf497b76e92edf53e',
1956
+ }, class: Object.assign({ [mode]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle }), h("ion-backdrop", { key: 'd72159e73daa5af7349aa9e8f695aa435eb43069', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: 'fd2d9b13676ae72473881649a397b6eacde03a03', class: "modal-shadow" }), h("div", Object.assign({ key: '908eccb1ad982dcde2dbcff0cbb18b6e60f8ba74',
1973
1957
  /*
1974
1958
  role and aria-modal must be used on the
1975
1959
  same element. They must also be set inside the
1976
1960
  shadow DOM otherwise ion-button will not be highlighted
1977
1961
  when using VoiceOver: https://bugs.webkit.org/show_bug.cgi?id=247134
1978
1962
  */
1979
- role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: '8258b65570b11a8ee9c9df2537d6419cd2e34536', class: "modal-handle",
1963
+ role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: '332dc0b40363a77c7be62331d9f26def91c790e9', class: "modal-handle",
1980
1964
  // Prevents the handle from receiving keyboard focus when it does not cycle
1981
- tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), h("slot", { key: '394370d0ed03ee03152f8f8abae7ff7664ca5c13' }))));
1965
+ tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle" })), h("slot", { key: 'c32698350193c450327e97049daf8b8d1fda0d0e' }))));
1982
1966
  }
1983
1967
  get el() { return getElement(this); }
1984
1968
  static get watchers() { return {
@@ -1261,8 +1261,6 @@ const Popover = class {
1261
1261
  * Developers can pass a mouse, touch, or pointer event
1262
1262
  * to position the popover relative to where that event
1263
1263
  * was dispatched.
1264
- *
1265
- * @param event The event to position the popover relative to.
1266
1264
  */
1267
1265
  async present(event) {
1268
1266
  const unlock = await this.lockController.lock();
@@ -1326,14 +1324,15 @@ const Popover = class {
1326
1324
  }
1327
1325
  /**
1328
1326
  * Dismiss the popover overlay after it has been presented.
1329
- * This is a no-op if the overlay has not been presented yet. If you want
1330
- * to remove an overlay from the DOM that was never presented, use the
1331
- * [remove](https://developer.mozilla.org/en-US/docs/Web/API/Element/remove) method.
1332
1327
  *
1333
1328
  * @param data Any data to emit in the dismiss events.
1334
- * @param role The role of the element that is dismissing the popover. For example, `cancel` or `backdrop`.
1329
+ * @param role The role of the element that is dismissing the popover. For example, 'cancel' or 'backdrop'.
1335
1330
  * @param dismissParentPopover If `true`, dismissing this popover will also dismiss
1336
1331
  * a parent popover if this popover is nested. Defaults to `true`.
1332
+ *
1333
+ * This is a no-op if the overlay has not been presented yet. If you want
1334
+ * to remove an overlay from the DOM that was never presented, use the
1335
+ * [remove](https://developer.mozilla.org/en-US/docs/Web/API/Element/remove) method.
1337
1336
  */
1338
1337
  async dismiss(data, role, dismissParentPopover = true) {
1339
1338
  const unlock = await this.lockController.lock();
@@ -1385,9 +1384,9 @@ const Popover = class {
1385
1384
  const { onLifecycle, parentPopover, dismissOnSelect, side, arrow, htmlAttributes, focusTrap } = this;
1386
1385
  const desktop = isPlatform('desktop');
1387
1386
  const enableArrow = arrow && !parentPopover;
1388
- return (h(Host, Object.assign({ key: '16866c02534968c982cf4730d2936d03a5107c8b', "aria-modal": "true", "no-router": true, tabindex: "-1" }, htmlAttributes, { style: {
1387
+ return (h(Host, Object.assign({ key: '1de4862099cfcb5035e78008e6dc7c1371846f9a', "aria-modal": "true", "no-router": true, tabindex: "-1" }, htmlAttributes, { style: {
1389
1388
  zIndex: `${20000 + this.overlayIndex}`,
1390
- }, class: Object.assign(Object.assign({}, getClassMap(this.cssClass)), { [mode]: true, 'popover-translucent': this.translucent, 'overlay-hidden': true, 'popover-desktop': desktop, [`popover-side-${side}`]: true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false, 'popover-nested': !!parentPopover }), onIonPopoverDidPresent: onLifecycle, onIonPopoverWillPresent: onLifecycle, onIonPopoverWillDismiss: onLifecycle, onIonPopoverDidDismiss: onLifecycle, onIonBackdropTap: this.onBackdropTap }), !parentPopover && h("ion-backdrop", { key: '0df258601a4d30df3c27aa8234a7d5e056c3ecbb', tappable: this.backdropDismiss, visible: this.showBackdrop, part: "backdrop" }), h("div", { key: 'f94e80ed996b957b5cd09b826472b4f60e8fcc78', class: "popover-wrapper ion-overlay-wrapper", onClick: dismissOnSelect ? () => this.dismiss() : undefined }, enableArrow && h("div", { key: '185ce22f6386e8444a9cc7b8818dbfc16c463c99', class: "popover-arrow", part: "arrow" }), h("div", { key: '206202b299404e110de5397b229678cca18568d3', class: "popover-content", part: "content" }, h("slot", { key: 'ee543a0b92d6e35a837c0a0e4617c7b0fc4ad0b0' })))));
1389
+ }, class: Object.assign(Object.assign({}, getClassMap(this.cssClass)), { [mode]: true, 'popover-translucent': this.translucent, 'overlay-hidden': true, 'popover-desktop': desktop, [`popover-side-${side}`]: true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false, 'popover-nested': !!parentPopover }), onIonPopoverDidPresent: onLifecycle, onIonPopoverWillPresent: onLifecycle, onIonPopoverWillDismiss: onLifecycle, onIonPopoverDidDismiss: onLifecycle, onIonBackdropTap: this.onBackdropTap }), !parentPopover && h("ion-backdrop", { key: '981aa4e0102cb93312ffbd8243cdf2a0cdc60469', tappable: this.backdropDismiss, visible: this.showBackdrop, part: "backdrop" }), h("div", { key: '1a28ed55e9d34ef78cf0eb0178643301fd2dd75d', class: "popover-wrapper ion-overlay-wrapper", onClick: dismissOnSelect ? () => this.dismiss() : undefined }, enableArrow && h("div", { key: '1c206ea5eb3c0b5883a3d45c34cd22dd5ffe4b65', class: "popover-arrow", part: "arrow" }), h("div", { key: '5ba561486a328c0c7ab825995fdbfb7a196429a4', class: "popover-content", part: "content" }, h("slot", { key: '00fc244ce9dcc2dfc677e6c34b7c8e7a330b2b03' })))));
1391
1390
  }
1392
1391
  get el() { return getElement(this); }
1393
1392
  static get watchers() { return {
@@ -90,6 +90,7 @@ const ReorderGroup = class {
90
90
  }
91
91
  /**
92
92
  * Completes the reorder operation. Must be called by the `ionItemReorder` event.
93
+ *
93
94
  * If a list of items is passed, the list will be reordered and returned in the
94
95
  * proper order.
95
96
  *
@@ -276,7 +277,7 @@ const ReorderGroup = class {
276
277
  }
277
278
  render() {
278
279
  const mode = getIonMode(this);
279
- return (h(Host, { key: 'dfcdc3a6aa1b2fba15f861ec868d6a11e667c9de', class: {
280
+ return (h(Host, { key: 'f30613b361c5c3095b7928a92fb4b1e8d6eff600', class: {
280
281
  [mode]: true,
281
282
  'reorder-enabled': !this.disabled,
282
283
  'reorder-list-active': this.state !== 0 /* ReorderGroupState.Idle */,
@@ -674,7 +674,6 @@ const Router = class {
674
674
  *
675
675
  * @param path The path to navigate to.
676
676
  * @param direction The direction of the animation. Defaults to `"forward"`.
677
- * @param animation A custom animation to use for the transition.
678
677
  */
679
678
  async push(path, direction = 'forward', animation) {
680
679
  var _a;
@@ -255,8 +255,10 @@ const Searchbar = class {
255
255
  /**
256
256
  * Sets focus on the native `input` in `ion-searchbar`. Use this method instead of the global
257
257
  * `input.focus()`.
258
+ *
258
259
  * Developers who wish to focus an input when a page enters
259
260
  * should call `setFocus()` in the `ionViewDidEnter()` lifecycle method.
261
+ *
260
262
  * Developers who wish to focus an input when an overlay is presented
261
263
  * should call `setFocus` after `didPresent` has resolved.
262
264
  *
@@ -435,8 +437,8 @@ const Searchbar = class {
435
437
  const clearIcon = this.clearIcon || (mode === 'ios' ? closeCircle : closeSharp);
436
438
  const searchIcon = this.searchIcon || (mode === 'ios' ? searchOutline : searchSharp);
437
439
  const shouldShowCancelButton = this.shouldShowCancelButton();
438
- const cancelButton = this.showCancelButton !== 'never' && (h("button", { key: '19e18775856db87daeb4b9e3d7bca0461915a0df', "aria-label": cancelButtonText, "aria-hidden": shouldShowCancelButton ? undefined : 'true', type: "button", tabIndex: mode === 'ios' && !shouldShowCancelButton ? -1 : undefined, onMouseDown: this.onCancelSearchbar, onTouchStart: this.onCancelSearchbar, class: "searchbar-cancel-button" }, h("div", { key: 'b3bbdcc033f3bd3441d619e4a252cef0dad4d07e', "aria-hidden": "true" }, mode === 'md' ? (h("ion-icon", { "aria-hidden": "true", mode: mode, icon: this.cancelButtonIcon, lazy: false })) : (cancelButtonText))));
439
- return (h(Host, { key: '074aa60e051bfb3225e87d44bbb6346c59c73574', role: "search", "aria-disabled": this.disabled ? 'true' : null, class: createColorClasses(this.color, {
440
+ const cancelButton = this.showCancelButton !== 'never' && (h("button", { key: '5835c36fcb0b52aec956538202a783f6c194d853', "aria-label": cancelButtonText, "aria-hidden": shouldShowCancelButton ? undefined : 'true', type: "button", tabIndex: mode === 'ios' && !shouldShowCancelButton ? -1 : undefined, onMouseDown: this.onCancelSearchbar, onTouchStart: this.onCancelSearchbar, class: "searchbar-cancel-button" }, h("div", { key: '85df41676bed611467bd4df0002b08baee4f539c', "aria-hidden": "true" }, mode === 'md' ? (h("ion-icon", { "aria-hidden": "true", mode: mode, icon: this.cancelButtonIcon, lazy: false })) : (cancelButtonText))));
441
+ return (h(Host, { key: 'e1e30cdd79f9f54d5f2d27501012358bc46880e5', role: "search", "aria-disabled": this.disabled ? 'true' : null, class: createColorClasses(this.color, {
440
442
  [mode]: true,
441
443
  'searchbar-animated': animated,
442
444
  'searchbar-disabled': this.disabled,
@@ -446,14 +448,14 @@ const Searchbar = class {
446
448
  'searchbar-has-focus': this.focused,
447
449
  'searchbar-should-show-clear': this.shouldShowClearButton(),
448
450
  'searchbar-should-show-cancel': this.shouldShowCancelButton(),
449
- }) }, h("div", { key: '54f58a79fe36e85d9295157303f1be89c98bbdaf', class: "searchbar-input-container" }, h("input", Object.assign({ key: 'f991a37fcf54d26b7ad10d89084764e03d97b9de', "aria-label": "search text", disabled: this.disabled, ref: (el) => (this.nativeInput = el), class: "searchbar-input", inputMode: this.inputmode, enterKeyHint: this.enterkeyhint, name: this.name, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, minLength: this.minlength, maxLength: this.maxlength, placeholder: this.placeholder, type: this.type, value: this.getValue(), autoCapitalize: autocapitalize === 'default' ? undefined : autocapitalize, autoComplete: this.autocomplete, autoCorrect: this.autocorrect, spellcheck: this.spellcheck }, this.inheritedAttributes)), mode === 'md' && cancelButton, h("ion-icon", { key: '8b44dd90a3292c5cf872ef16a8520675f5673494', "aria-hidden": "true", mode: mode, icon: searchIcon, lazy: false, class: "searchbar-search-icon" }), h("button", { key: '79d9cfed8f01268044f82811a35d323a12dca749', "aria-label": "reset", type: "button", "no-blur": true, class: "searchbar-clear-button", onPointerDown: (ev) => {
451
+ }) }, h("div", { key: '7e9db147282a35bb1e3c9c6125b9a044e81ddde5', class: "searchbar-input-container" }, h("input", Object.assign({ key: '02f08da21326b78d6cd249d54deab96fd8472ba8', "aria-label": "search text", disabled: this.disabled, ref: (el) => (this.nativeInput = el), class: "searchbar-input", inputMode: this.inputmode, enterKeyHint: this.enterkeyhint, name: this.name, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, minLength: this.minlength, maxLength: this.maxlength, placeholder: this.placeholder, type: this.type, value: this.getValue(), autoCapitalize: autocapitalize === 'default' ? undefined : autocapitalize, autoComplete: this.autocomplete, autoCorrect: this.autocorrect, spellcheck: this.spellcheck }, this.inheritedAttributes)), mode === 'md' && cancelButton, h("ion-icon", { key: '048b00348456bd827ae734491c46a67bfb146227', "aria-hidden": "true", mode: mode, icon: searchIcon, lazy: false, class: "searchbar-search-icon" }), h("button", { key: '71f64339bbfd54ebd26a0946c8ee9d726cd89c04', "aria-label": "reset", type: "button", "no-blur": true, class: "searchbar-clear-button", onPointerDown: (ev) => {
450
452
  /**
451
453
  * This prevents mobile browsers from
452
454
  * blurring the input when the clear
453
455
  * button is activated.
454
456
  */
455
457
  ev.preventDefault();
456
- }, onClick: () => this.onClearInput(true) }, h("ion-icon", { key: 'aa3b9fa8a61f853236783ac7bcd0b113ea65ece2', "aria-hidden": "true", mode: mode, icon: clearIcon, lazy: false, class: "searchbar-clear-icon" }))), mode === 'ios' && cancelButton));
458
+ }, onClick: () => this.onClearInput(true) }, h("ion-icon", { key: '9b1a177b21951c1c95897a468b34bb7bbd63d137', "aria-hidden": "true", mode: mode, icon: clearIcon, lazy: false, class: "searchbar-clear-icon" }))), mode === 'ios' && cancelButton));
457
459
  }
458
460
  get el() { return getElement(this); }
459
461
  static get watchers() { return {
@@ -214,7 +214,7 @@ const Select = class {
214
214
  const scrollSelectedIntoView = () => {
215
215
  const indexOfSelected = this.childOpts.findIndex((o) => o.value === this.value);
216
216
  if (indexOfSelected > -1) {
217
- const selectedItem = overlay.querySelector(`.select-interface-option:nth-of-type(${indexOfSelected + 1})`);
217
+ const selectedItem = overlay.querySelector(`.select-interface-option:nth-child(${indexOfSelected + 1})`);
218
218
  if (selectedItem) {
219
219
  /**
220
220
  * Browsers such as Firefox do not
@@ -734,7 +734,7 @@ const Select = class {
734
734
  * TODO(FW-5592): Remove hasStartEndSlots condition
735
735
  */
736
736
  const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || isExpanded || hasStartEndSlots));
737
- return (h(Host, { key: 'c03fb65e8fc9f9aab295e07b282377d57d910519', onClick: this.onClick, class: createColorClasses(this.color, {
737
+ return (h(Host, { key: 'e33253af9b9daa14460c7c259fb138b4d2b875ae', onClick: this.onClick, class: createColorClasses(this.color, {
738
738
  [mode]: true,
739
739
  'in-item': inItem,
740
740
  'in-item-color': hostContext('ion-item.ion-color', el),
@@ -752,7 +752,7 @@ const Select = class {
752
752
  [`select-justify-${justify}`]: justifyEnabled,
753
753
  [`select-shape-${shape}`]: shape !== undefined,
754
754
  [`select-label-placement-${labelPlacement}`]: true,
755
- }) }, h("label", { key: '0d0c8ec55269adcac625f2899a547f4e7f3e3741', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick }, this.renderLabelContainer(), h("div", { key: 'f6dfc93c0e23cbe75a2947abde67d842db2dad78', class: "select-wrapper-inner" }, h("slot", { key: '957bfadf9f101f519091419a362d3abdc2be66f6', name: "start" }), h("div", { key: 'ca349202a484e7f2e884533fd330f0b136754f7d', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), h("slot", { key: 'f0e62a6533ff1c8f62bd2d27f60b23385c4fa9ed', name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && h("div", { key: 'fb840d46bafafb09898ebeebbe8c181906a3d8a2', class: "select-highlight" })), this.renderBottomContent()));
755
+ }) }, h("label", { key: '03303b7131c77a78a933e8e496e7251b6b5c485b', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick }, this.renderLabelContainer(), h("div", { key: '9037674db6a0adc189e887c9048f817d5afdf635', class: "select-wrapper-inner" }, h("slot", { key: '7c9226c838ba4bcf5bc0b234fa1613ce335cf73d', name: "start" }), h("div", { key: 'a7432c3efb5c65f88a5e4b0d35c5a433fa4e949d', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), h("slot", { key: '028e683df26a8f573d7670da76e0ad26d21c83e0', name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && h("div", { key: '20341bcae3753048ce905d2aceffa5351a0db125', class: "select-highlight" })), this.renderBottomContent()));
756
756
  }
757
757
  get el() { return getElement(this); }
758
758
  static get watchers() { return {