voyager-ionic-core 8.8.5 → 8.8.8

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 (62) hide show
  1. package/components/ion-action-sheet.js +1 -1
  2. package/components/ion-alert.js +1 -1
  3. package/components/ion-app.js +1 -1
  4. package/components/ion-content.js +1 -1
  5. package/components/ion-datetime.js +1 -1
  6. package/components/ion-modal.js +1 -1
  7. package/components/ion-segment.js +1 -1
  8. package/components/ion-select-modal.js +1 -1
  9. package/components/ion-select.js +1 -1
  10. package/components/{p-0z8QSI5b.js → p-BeXMwcl5.js} +1 -1
  11. package/components/p-CEmXdzGo.js +4 -0
  12. package/components/{p-BlNv564p.js → p-Cf6Z1pmL.js} +1 -1
  13. package/components/{p-D3Ti70Hx.js → p-DZhbcvo5.js} +1 -1
  14. package/components/{p-BGHGpkPX.js → p-Q1-Xy3As.js} +1 -1
  15. package/components/p-ZuZOauwD.js +4 -0
  16. package/dist/cjs/{input-shims-Dl5cnc_e.js → input-shims-CPL2J8F-.js} +0 -6
  17. package/dist/cjs/ion-action-sheet.cjs.entry.js +3 -3
  18. package/dist/cjs/ion-alert.cjs.entry.js +66 -4
  19. package/dist/cjs/ion-app_8.cjs.entry.js +2 -2
  20. package/dist/cjs/ion-datetime_3.cjs.entry.js +30 -14
  21. package/dist/cjs/ion-modal.cjs.entry.js +9 -9
  22. package/dist/cjs/ion-segment_2.cjs.entry.js +6 -2
  23. package/dist/cjs/ionic.cjs.js +1 -1
  24. package/dist/cjs/loader.cjs.js +1 -1
  25. package/dist/collection/components/action-sheet/action-sheet.js +3 -3
  26. package/dist/collection/components/alert/alert.js +71 -4
  27. package/dist/collection/components/content/content.css +1 -1
  28. package/dist/collection/components/datetime/datetime.js +30 -14
  29. package/dist/collection/components/modal/modal.js +9 -9
  30. package/dist/collection/components/segment/segment.js +6 -2
  31. package/dist/collection/utils/input-shims/hacks/scroll-assist.js +0 -7
  32. package/dist/docs.json +1 -1
  33. package/dist/esm/{input-shims-AaDhOpKN.js → input-shims-DbrgeeNb.js} +1 -7
  34. package/dist/esm/ion-action-sheet.entry.js +3 -3
  35. package/dist/esm/ion-alert.entry.js +66 -4
  36. package/dist/esm/ion-app_8.entry.js +2 -2
  37. package/dist/esm/ion-datetime_3.entry.js +30 -14
  38. package/dist/esm/ion-modal.entry.js +9 -9
  39. package/dist/esm/ion-segment_2.entry.js +6 -2
  40. package/dist/esm/ionic.js +1 -1
  41. package/dist/esm/loader.js +1 -1
  42. package/dist/ionic/ionic.esm.js +1 -1
  43. package/dist/ionic/{p-cb27fe68.entry.js → p-050873ec.entry.js} +1 -1
  44. package/dist/ionic/p-164f79c4.entry.js +4 -0
  45. package/dist/ionic/p-1ca9c36b.entry.js +4 -0
  46. package/dist/ionic/{p-268a3397.entry.js → p-7761ef65.entry.js} +1 -1
  47. package/dist/ionic/p-DcSNwXfb.js +4 -0
  48. package/dist/ionic/p-a893c61c.entry.js +4 -0
  49. package/dist/ionic/p-f3e7b155.entry.js +4 -0
  50. package/dist/types/components/alert/alert.d.ts +5 -0
  51. package/dist/types/components/datetime/datetime.d.ts +7 -0
  52. package/dist/types/components/modal/modal.d.ts +3 -3
  53. package/hydrate/index.js +116 -33
  54. package/hydrate/index.mjs +116 -33
  55. package/package.json +4 -4
  56. package/components/p-CH0NYjKq.js +0 -4
  57. package/components/p-Cwv-vmkN.js +0 -4
  58. package/dist/ionic/p-1b02923f.entry.js +0 -4
  59. package/dist/ionic/p-4c67ce4c.entry.js +0 -4
  60. package/dist/ionic/p-9cdbabbb.entry.js +0 -4
  61. package/dist/ionic/p-CYvM5g3q.js +0 -4
  62. package/dist/ionic/p-ce2edb36.entry.js +0 -4
@@ -28,6 +28,7 @@ export class Alert {
28
28
  this.customHTMLEnabled = config.get('innerHTMLTemplatesEnabled', ENABLE_HTML_CONTENT_DEFAULT);
29
29
  this.processedInputs = [];
30
30
  this.processedButtons = [];
31
+ this.isButtonGroupWrapped = false;
31
32
  this.presented = false;
32
33
  /** @internal */
33
34
  this.hasController = false;
@@ -152,6 +153,13 @@ export class Alert {
152
153
  this.processedButtons = buttons.map((btn) => {
153
154
  return typeof btn === 'string' ? { text: btn, role: btn.toLowerCase() === 'cancel' ? 'cancel' : undefined } : btn;
154
155
  });
156
+ /**
157
+ * Reset wrap state so the new button set can be re-evaluated. Without this,
158
+ * a previously-latched vertical layout would persist even if the new buttons
159
+ * fit horizontally.
160
+ */
161
+ this.isButtonGroupWrapped = false;
162
+ this.checkButtonGroupWrap();
155
163
  }
156
164
  inputsChanged() {
157
165
  const inputs = this.inputs;
@@ -192,6 +200,12 @@ export class Alert {
192
200
  connectedCallback() {
193
201
  prepareOverlay(this.el);
194
202
  this.triggerChanged();
203
+ /**
204
+ * If the alert was previously connected and is being reattached, the
205
+ * ResizeObserver was disconnected. componentDidLoad only fires once per
206
+ * instance, so re-establish the observer here on reconnect.
207
+ */
208
+ this.setupButtonGroupResizeObserver();
195
209
  }
196
210
  componentWillLoad() {
197
211
  var _a;
@@ -202,11 +216,14 @@ export class Alert {
202
216
  this.buttonsChanged();
203
217
  }
204
218
  disconnectedCallback() {
219
+ var _a;
205
220
  this.triggerController.removeClickListener();
206
221
  if (this.gesture) {
207
222
  this.gesture.destroy();
208
223
  this.gesture = undefined;
209
224
  }
225
+ (_a = this.buttonGroupResizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
226
+ this.buttonGroupResizeObserver = undefined;
210
227
  }
211
228
  componentDidLoad() {
212
229
  /**
@@ -219,6 +236,7 @@ export class Alert {
219
236
  this.gesture = createButtonActiveGesture(this.wrapperEl, (refEl) => refEl.classList.contains('alert-button'));
220
237
  this.gesture.enable(true);
221
238
  }
239
+ this.setupButtonGroupResizeObserver();
222
240
  /**
223
241
  * If alert was rendered with isOpen="true"
224
242
  * then we should open alert immediately.
@@ -410,14 +428,58 @@ export class Alert {
410
428
  }
411
429
  })));
412
430
  }
431
+ setupButtonGroupResizeObserver() {
432
+ var _a;
433
+ /**
434
+ * Re-evaluate vertical layout when the button group resizes so a 2-button
435
+ * group with long text wraps cleanly instead of leaving a stray right-edge
436
+ * border on the first button.
437
+ */
438
+ if (!this.buttonGroupEl || typeof ResizeObserver === 'undefined') {
439
+ return;
440
+ }
441
+ (_a = this.buttonGroupResizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
442
+ this.buttonGroupResizeObserver = new ResizeObserver(() => this.checkButtonGroupWrap());
443
+ this.buttonGroupResizeObserver.observe(this.buttonGroupEl);
444
+ this.checkButtonGroupWrap();
445
+ }
446
+ checkButtonGroupWrap() {
447
+ /**
448
+ * Defer the layout read out of the ResizeObserver callback so we don't
449
+ * force synchronous layout and avoid "ResizeObserver loop" warnings when
450
+ * applying the vertical-layout class itself triggers another resize.
451
+ */
452
+ raf(() => {
453
+ /**
454
+ * Bail if the alert was disconnected after this raf was queued.
455
+ * `buttonGroupEl` persists across disconnect so the observer can be
456
+ * re-attached on reconnect; the observer reference is the disconnect
457
+ * sentinel.
458
+ */
459
+ if (!this.buttonGroupResizeObserver) {
460
+ return;
461
+ }
462
+ const groupEl = this.buttonGroupEl;
463
+ if (!groupEl) {
464
+ return;
465
+ }
466
+ const buttons = Array.from(groupEl.querySelectorAll('.alert-button'));
467
+ if (buttons.length < 2) {
468
+ this.isButtonGroupWrapped = false;
469
+ return;
470
+ }
471
+ const firstTop = buttons[0].offsetTop;
472
+ this.isButtonGroupWrapped = buttons.some((btn) => btn.offsetTop !== firstTop);
473
+ });
474
+ }
413
475
  renderAlertButtons() {
414
476
  const buttons = this.processedButtons;
415
477
  const mode = getIonMode(this);
416
478
  const alertButtonGroupClass = {
417
479
  'alert-button-group': true,
418
- 'alert-button-group-vertical': buttons.length > 2,
480
+ 'alert-button-group-vertical': buttons.length > 2 || this.isButtonGroupWrapped,
419
481
  };
420
- return (h("div", { class: alertButtonGroupClass }, buttons.map((button) => (h("button", Object.assign({}, button.htmlAttributes, { type: "button", id: button.id, class: buttonClass(button), tabIndex: 0, onClick: () => this.buttonClick(button) }), h("span", { class: "alert-button-inner" }, button.text), mode === 'md' && h("ion-ripple-effect", null))))));
482
+ return (h("div", { class: alertButtonGroupClass, ref: (el) => (this.buttonGroupEl = el) }, buttons.map((button) => (h("button", Object.assign({}, button.htmlAttributes, { type: "button", id: button.id, class: buttonClass(button), tabIndex: 0, onClick: () => this.buttonClick(button) }), h("span", { class: "alert-button-inner" }, button.text), mode === 'md' && h("ion-ripple-effect", null))))));
421
483
  }
422
484
  renderAlertMessage(msgId) {
423
485
  const { customHTMLEnabled, message } = this;
@@ -440,9 +502,9 @@ export class Alert {
440
502
  * If neither are defined, do not set aria-labelledby.
441
503
  */
442
504
  const ariaLabelledBy = header && subHeader ? `${hdrId} ${subHdrId}` : header ? hdrId : subHeader ? subHdrId : null;
443
- return (h(Host, { key: '6025440b9cd369d4fac89e7e4296c84a10a0b8e0', tabindex: "-1", style: {
505
+ return (h(Host, { key: '8d54ccd725ea634be080e67b56fa5efe498f496c', tabindex: "-1", style: {
444
506
  zIndex: `${20000 + overlayIndex}`,
445
- }, 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" })));
507
+ }, 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: '05a238583342285545587de9dce144a82d779193', tappable: this.backdropDismiss }), h("div", { key: 'e52c53fd9845e66781af01b2a788a291b45a927c', tabindex: "0", "aria-hidden": "true" }), h("div", Object.assign({ key: '8417e52eebca24ff436fab0703666db51072f980', 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: '5c560d4800b24d41961423718108b54be6cd6f91', class: "alert-head" }, header && (h("h2", { key: '8637b64cd5125b2258115d1c11f3743113658608', id: hdrId, class: "alert-title" }, header)), subHeader && !header && (h("h2", { key: '7a4e61a02c29b16b336d8acaf6569b30de6fe71e', id: subHdrId, class: "alert-sub-title" }, subHeader)), subHeader && header && (h("h3", { key: '30844b6a0a7e3dab46514cd548ecffa86dcd59cb', id: subHdrId, class: "alert-sub-title" }, subHeader))), this.renderAlertMessage(msgId), this.renderAlertInputs(), this.renderAlertButtons()), h("div", { key: '39c824fee1e60ad8d6234c79d22ceb8bba8004af', tabindex: "0", "aria-hidden": "true" })));
446
508
  }
447
509
  static get is() { return "ion-alert"; }
448
510
  static get encapsulation() { return "scoped"; }
@@ -851,6 +913,11 @@ export class Alert {
851
913
  }
852
914
  };
853
915
  }
916
+ static get states() {
917
+ return {
918
+ "isButtonGroupWrapped": {}
919
+ };
920
+ }
854
921
  static get events() {
855
922
  return [{
856
923
  "method": "didPresent",
@@ -116,7 +116,7 @@
116
116
  -webkit-padding-end: var(--padding-end);
117
117
  padding-inline-end: var(--padding-end);
118
118
  padding-top: calc(var(--padding-top) + var(--offset-top));
119
- padding-bottom: calc(var(--padding-bottom) + var(--keyboard-offset) + var(--offset-bottom) + var(--ion-content-safe-area-padding-bottom, 0px));
119
+ padding-bottom: calc(var(--padding-bottom) + var(--keyboard-offset) + var(--offset-bottom) + var(--internal-content-safe-area-padding-bottom, 0px));
120
120
  position: absolute;
121
121
  color: var(--color);
122
122
  box-sizing: border-box;
@@ -55,6 +55,12 @@ import { checkForPresentationFormatMismatch, warnIfTimeZoneProvided } from "./ut
55
55
  export class Datetime {
56
56
  constructor() {
57
57
  this.inputId = `ion-dt-${datetimeIds++}`;
58
+ /**
59
+ * Set true only by `visibleCallback`. Lets `hiddenCallback` ignore the
60
+ * synthetic "not intersecting" entry IntersectionObserver fires on
61
+ * `observe()` when the host mounts offscreen.
62
+ */
63
+ this.hasBeenIntersecting = false;
58
64
  this.prevPresentation = null;
59
65
  this.showMonthAndYear = false;
60
66
  this.activeParts = [];
@@ -617,7 +623,21 @@ export class Datetime {
617
623
  if (rect.width === 0 || rect.height === 0) {
618
624
  return;
619
625
  }
626
+ this.markReady();
627
+ };
628
+ this.markReady = () => {
629
+ if (this.el.classList.contains('datetime-ready')) {
630
+ return;
631
+ }
620
632
  this.initializeListeners();
633
+ /**
634
+ * TODO FW-2793: Datetime needs a frame to ensure that it
635
+ * can properly scroll contents into view. As a result
636
+ * we hide the scrollable content until after that frame
637
+ * so users do not see the content quickly shifting. The downside
638
+ * is that the content will pop into view a frame after. Maybe there
639
+ * is a better way to handle this?
640
+ */
621
641
  writeTask(() => {
622
642
  this.el.classList.add('datetime-ready');
623
643
  });
@@ -910,6 +930,7 @@ export class Datetime {
910
930
  this.clearFocusVisible = undefined;
911
931
  }
912
932
  this.loadTimeoutCleanup();
933
+ this.hasBeenIntersecting = false;
913
934
  }
914
935
  initializeListeners() {
915
936
  this.initializeCalendarListener();
@@ -929,18 +950,8 @@ export class Datetime {
929
950
  if (!ev.isIntersecting) {
930
951
  return;
931
952
  }
932
- this.initializeListeners();
933
- /**
934
- * TODO FW-2793: Datetime needs a frame to ensure that it
935
- * can properly scroll contents into view. As a result
936
- * we hide the scrollable content until after that frame
937
- * so users do not see the content quickly shifting. The downside
938
- * is that the content will pop into view a frame after. Maybe there
939
- * is a better way to handle this?
940
- */
941
- writeTask(() => {
942
- this.el.classList.add('datetime-ready');
943
- });
953
+ this.hasBeenIntersecting = true;
954
+ this.markReady();
944
955
  };
945
956
  const visibleIO = new IntersectionObserver(visibleCallback, { threshold: 0.01, root: el });
946
957
  /**
@@ -976,6 +987,11 @@ export class Datetime {
976
987
  if (ev.isIntersecting) {
977
988
  return;
978
989
  }
990
+ // Ignore the initial "not intersecting" entry IntersectionObserver fires on observe().
991
+ if (!this.hasBeenIntersecting) {
992
+ return;
993
+ }
994
+ this.hasBeenIntersecting = false;
979
995
  this.destroyInteractionListeners();
980
996
  /**
981
997
  * When datetime is hidden, we need to make sure that
@@ -1719,7 +1735,7 @@ export class Datetime {
1719
1735
  const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
1720
1736
  const hasWheelVariant = hasDatePresentation && preferWheel;
1721
1737
  renderHiddenInput(true, el, name, formatValue(value), disabled);
1722
- return (h(Host, { key: '59e0811aa273e88dfb8e4b703e6824088a457380', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: Object.assign({}, createColorClasses(color, {
1738
+ return (h(Host, { key: '323c8c2327088f00934b8c93c3306538cb9b5677', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: Object.assign({}, createColorClasses(color, {
1723
1739
  [mode]: true,
1724
1740
  ['datetime-readonly']: readonly,
1725
1741
  ['datetime-disabled']: disabled,
@@ -1729,7 +1745,7 @@ export class Datetime {
1729
1745
  [`datetime-size-${size}`]: true,
1730
1746
  [`datetime-prefer-wheel`]: hasWheelVariant,
1731
1747
  [`datetime-grid`]: isGridStyle,
1732
- })) }, h("div", { key: '3753ff3dde3085070916c3de83687a219a49e553', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
1748
+ })) }, h("div", { key: '1e0855c8909bc3f1e48a21ad68159fa782060691', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
1733
1749
  }
1734
1750
  static get is() { return "ion-datetime"; }
1735
1751
  static get encapsulation() { return "shadow"; }
@@ -1088,12 +1088,12 @@ export class Modal {
1088
1088
  this.applyFullscreenSafeAreaTo(contentEl, hasFooter);
1089
1089
  }
1090
1090
  /**
1091
- * Sets --ion-content-safe-area-padding-bottom on the given ion-content
1091
+ * Sets --internal-content-safe-area-padding-bottom on the given ion-content
1092
1092
  * when no footer is present, so ion-content's .inner-scroll includes
1093
1093
  * safe-area-bottom in its scroll padding. This keeps the modal background
1094
1094
  * edge-to-edge while ensuring content scrolls clear of the system nav bar.
1095
1095
  *
1096
- * --ion-content-safe-area-padding-bottom is an internal CSS property used
1096
+ * --internal-content-safe-area-padding-bottom is an internal CSS property used
1097
1097
  * only by this code path. It is not part of ion-content's public API and
1098
1098
  * should not be set by consumers. The default of 0px makes it a no-op
1099
1099
  * when unset, which is the expected state for ion-content used outside of
@@ -1105,17 +1105,17 @@ export class Modal {
1105
1105
  // padding. Custom modals with raw HTML are developer-controlled.
1106
1106
  if (!contentEl || hasFooter)
1107
1107
  return;
1108
- contentEl.style.setProperty('--ion-content-safe-area-padding-bottom', 'var(--ion-safe-area-bottom, 0px)');
1108
+ contentEl.style.setProperty('--internal-content-safe-area-padding-bottom', 'var(--ion-safe-area-bottom, 0px)');
1109
1109
  }
1110
1110
  /**
1111
- * Removes the internal --ion-content-safe-area-padding-bottom property
1111
+ * Removes the internal --internal-content-safe-area-padding-bottom property
1112
1112
  * from an already-located ion-content. Callers do their own
1113
1113
  * findContentAndFooter() so they can also read hasFooter if needed.
1114
1114
  */
1115
1115
  clearContentSafeAreaPadding(contentEl) {
1116
1116
  if (!contentEl)
1117
1117
  return;
1118
- contentEl.style.removeProperty('--ion-content-safe-area-padding-bottom');
1118
+ contentEl.style.removeProperty('--internal-content-safe-area-padding-bottom');
1119
1119
  }
1120
1120
  /**
1121
1121
  * Finds ion-content and ion-footer among direct children and one level of
@@ -1162,20 +1162,20 @@ export class Modal {
1162
1162
  const isCardModal = presentingElement !== undefined && mode === 'ios';
1163
1163
  const isHandleCycle = handleBehavior === 'cycle';
1164
1164
  const isSheetModalWithHandle = isSheetModal && showHandle;
1165
- return (h(Host, Object.assign({ key: '4bf38aa67df9a3f977163bba5423960bbafd16de', "no-router": true,
1165
+ return (h(Host, Object.assign({ key: 'd6a271ace939c33703966a1425ab32b7a30bf246', "no-router": true,
1166
1166
  // Allow the modal to be navigable when the handle is focusable
1167
1167
  tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1 }, htmlAttributes, { style: {
1168
1168
  zIndex: `${20000 + this.overlayIndex}`,
1169
- }, 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: '866da40cc5fc8d3e36637098fb3066a5bc9f4e0f', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: '5a2a05514ea8592c8feb0465e504aa7c7af17963', class: "modal-shadow" }), h("div", Object.assign({ key: '4d327115306451f57d190b06ab8cbb6191a6f1d7',
1169
+ }, 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: '51e29823c1444059edc1299e2f8509dda4c39008', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: '4292a849e82b83570b18b95e3cbdf05af0a4e170', class: "modal-shadow" }), h("div", Object.assign({ key: 'd3131150733c13cd6658545207e4ab49094672b7',
1170
1170
  /*
1171
1171
  role and aria-modal must be used on the
1172
1172
  same element. They must also be set inside the
1173
1173
  shadow DOM otherwise ion-button will not be highlighted
1174
1174
  when using VoiceOver: https://bugs.webkit.org/show_bug.cgi?id=247134
1175
1175
  */
1176
- role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: 'd1882835cc049232c0d957e3ba1e79676a07d179', class: "modal-handle",
1176
+ role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: '3da13bff87602c8c0aa8e3db54375b40d96d3b83', class: "modal-handle",
1177
1177
  // Prevents the handle from receiving keyboard focus when it does not cycle
1178
- 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: '81dc58b09cf7d7022b04cd170f53113604364d5e', onSlotchange: this.onSlotChange }))));
1178
+ 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: '73b22a4eb7ca2e499b9f843b66751a1dbfef69a9', onSlotchange: this.onSlotChange }))));
1179
1179
  }
1180
1180
  static get is() { return "ion-modal"; }
1181
1181
  static get encapsulation() { return "shadow"; }
@@ -315,6 +315,7 @@ export class Segment {
315
315
  return segmentContent === null || segmentContent === void 0 ? void 0 : segmentContent.closest('ion-segment-view');
316
316
  }
317
317
  handleSegmentViewScroll(ev) {
318
+ var _a;
318
319
  const { scrollRatio, isManualScroll } = ev.detail;
319
320
  if (!isManualScroll) {
320
321
  return;
@@ -331,6 +332,9 @@ export class Segment {
331
332
  const index = buttons.findIndex((button) => button.value === this.value);
332
333
  const current = buttons[index];
333
334
  const nextIndex = Math.round(scrollRatio * (buttons.length - 1));
335
+ if ((_a = buttons[nextIndex]) === null || _a === void 0 ? void 0 : _a.disabled) {
336
+ return;
337
+ }
334
338
  if (this.lastNextIndex === undefined || this.lastNextIndex !== nextIndex) {
335
339
  this.lastNextIndex = nextIndex;
336
340
  this.triggerScrollOnValueChange = false;
@@ -543,14 +547,14 @@ export class Segment {
543
547
  }
544
548
  render() {
545
549
  const mode = getIonMode(this);
546
- return (h(Host, { key: '725cc37b25c539fa5e3ae8d90530ae33ededc3de', role: "tablist", onClick: this.onClick, class: createColorClasses(this.color, {
550
+ return (h(Host, { key: 'eda6b7b88b7967b55cf9098c59b655b348a42224', role: "tablist", onClick: this.onClick, class: createColorClasses(this.color, {
547
551
  [mode]: true,
548
552
  'in-toolbar': hostContext('ion-toolbar', this.el),
549
553
  'in-toolbar-color': hostContext('ion-toolbar[color]', this.el),
550
554
  'segment-activated': this.activated,
551
555
  'segment-disabled': this.disabled,
552
556
  'segment-scrollable': this.scrollable,
553
- }) }, h("slot", { key: 'c51cf7ea50325866a9367d214e12bc3754870335', onSlotchange: this.onSlottedItemsChange })));
557
+ }) }, h("slot", { key: 'fdb451f235ce59c5bb50c61a13c69160ece2d5df', onSlotchange: this.onSlottedItemsChange })));
554
558
  }
555
559
  static get is() { return "ion-segment"; }
556
560
  static get encapsulation() { return "shadow"; }
@@ -3,7 +3,6 @@
3
3
  */
4
4
  import { win } from "../../browser/index";
5
5
  import { getScrollElement, scrollByPoint } from "../../content";
6
- import { raf } from "../../helpers";
7
6
  import { KeyboardResize } from "../../native/keyboard";
8
7
  import { relocateInput, SCROLL_AMOUNT_PADDING } from "./common";
9
8
  import { getScrollData } from "./scroll-data";
@@ -193,12 +192,6 @@ const jsSetFocus = async (componentEl, inputEl, contentEl, footerEl, keyboardHei
193
192
  // at this point the native text input still does not have focus
194
193
  relocateInput(componentEl, inputEl, true, scrollData.inputSafeY, disableClonedInput);
195
194
  setManualFocus(inputEl);
196
- /**
197
- * Relocating/Focusing input causes the
198
- * click event to be cancelled, so
199
- * manually fire one here.
200
- */
201
- raf(() => componentEl.click());
202
195
  /**
203
196
  * If enabled, we can add scroll padding to
204
197
  * the bottom of the content so that scroll assist
package/dist/docs.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "timestamp": "2026-05-01T03:59:54",
2
+ "timestamp": "2026-06-01T03:46:08",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
5
  "version": "4.43.0",
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { w as win, d as doc } from './index-ZjP4CjeZ.js';
5
5
  import { g as getScrollElement, c as scrollByPoint, f as findClosestIonContent } from './index-hW6eNZ3o.js';
6
- import { f as addEventListener, m as removeEventListener, r as raf, c as componentOnReady } from './helpers-Tl8jw6S2.js';
6
+ import { f as addEventListener, m as removeEventListener, c as componentOnReady } from './helpers-Tl8jw6S2.js';
7
7
  import { a as KeyboardResize, K as Keyboard } from './keyboard-CUw4ekVy.js';
8
8
  import './index-IGIE5vDm.js';
9
9
  import './capacitor-CFERIeaU.js';
@@ -448,12 +448,6 @@ const jsSetFocus = async (componentEl, inputEl, contentEl, footerEl, keyboardHei
448
448
  // at this point the native text input still does not have focus
449
449
  relocateInput(componentEl, inputEl, true, scrollData.inputSafeY, disableClonedInput);
450
450
  setManualFocus(inputEl);
451
- /**
452
- * Relocating/Focusing input causes the
453
- * click event to be cancelled, so
454
- * manually fire one here.
455
- */
456
- raf(() => componentEl.click());
457
451
  /**
458
452
  * If enabled, we can add scroll padding to
459
453
  * the bottom of the content so that scroll assist
@@ -486,12 +486,12 @@ const ActionSheet = class {
486
486
  const cancelButton = allButtons.find((b) => b.role === 'cancel');
487
487
  const buttons = allButtons.filter((b) => b.role !== 'cancel');
488
488
  const headerID = `action-sheet-${overlayIndex}-header`;
489
- return (h(Host, Object.assign({ key: 'a56ee2ab59c763036140dbd10306a708c26e3c17', role: "dialog", "aria-modal": "true", "aria-labelledby": header !== undefined ? headerID : null, tabindex: "-1" }, htmlAttributes, { style: {
489
+ return (h(Host, Object.assign({ key: '48b63b870f2816b4cad3c606f3d9956854cee79a', role: "dialog", "aria-modal": "true", "aria-labelledby": header !== undefined ? headerID : null, tabindex: "-1" }, htmlAttributes, { style: {
490
490
  zIndex: `${20000 + this.overlayIndex}`,
491
- }, 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: 'c32eb4281fd6348c7d3989a3f509c211263048e6', tappable: this.backdropDismiss }), h("div", { key: '7f0123114a876fc7cfff3cfb564aded4a7017797', tabindex: "0", "aria-hidden": "true" }), h("div", { key: '645b1d5fde39a8907f21983d66e6ecb7a99aa05d', class: "action-sheet-wrapper ion-overlay-wrapper", ref: (el) => (this.wrapperEl = el) }, h("div", { key: 'a78fb02848462d1a4f9356ac4fa1c43a2e5d90e4', class: "action-sheet-container" }, h("div", { key: '5e846f53e067b211b985d6e1512b72b9d7c1a3aa', class: "action-sheet-group", ref: (el) => (this.groupEl = el), role: hasRadioButtons ? 'radiogroup' : undefined }, header !== undefined && (h("div", { key: 'a90a0e096e1b2fa78b9adb9253c0a517f16e62cb', id: headerID, class: {
491
+ }, 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: '41dd5781f139d26b3feea33ab387451aeafacd51', tappable: this.backdropDismiss }), h("div", { key: 'f797c2657782e4e83adf90d2d796108e857a1fc0', tabindex: "0", "aria-hidden": "true" }), h("div", { key: '8e74209321fc5e8712e3e293c91a6fa036ea45ab', class: "action-sheet-wrapper ion-overlay-wrapper", ref: (el) => (this.wrapperEl = el) }, h("div", { key: 'c811860be2eed0b6c73fc2cc5a59cb94db2e8912', class: "action-sheet-container" }, h("div", { key: 'd36ee14b70d73eb5cd69e0c57bc5cc31daf86ab3', class: "action-sheet-group", ref: (el) => (this.groupEl = el), role: hasRadioButtons ? 'radiogroup' : undefined }, header !== undefined && (h("div", { key: '922695de191edc86451eed2552acc4f54993ea52', id: headerID, class: {
492
492
  'action-sheet-title': true,
493
493
  'action-sheet-has-sub-title': this.subHeader !== undefined,
494
- } }, header, this.subHeader && h("div", { key: '40f00b12341625c548546de1885b9c9d93bc169c', class: "action-sheet-sub-title" }, this.subHeader))), this.renderActionSheetButtons(buttons)), cancelButton && (h("div", { key: 'ef6974cb63089623df08087274b82745443cee8c', class: "action-sheet-group action-sheet-group-cancel" }, h("button", Object.assign({ key: 'b02911a6491d60f9dcb5da7d942392a9e96552c1' }, cancelButton.htmlAttributes, { type: "button", class: buttonClass(cancelButton), onClick: () => this.buttonClick(cancelButton) }), h("span", { key: '1187433e676eda55e52b5ae328a8e68bba22deb6', class: "action-sheet-button-inner" }, cancelButton.icon && (h("ion-icon", { key: '079ab2a6bd40b996950053617f1c1c8207ecb1f1', icon: cancelButton.icon, "aria-hidden": "true", lazy: false, class: "action-sheet-icon" })), cancelButton.text), mode === 'md' && h("ion-ripple-effect", { key: '3bc473add8ac299f202f8c359d26708872c02f52' })))))), h("div", { key: '9b1ae7b4e3649e9b85632f0d65627ca81499e68d', tabindex: "0", "aria-hidden": "true" })));
494
+ } }, header, this.subHeader && h("div", { key: 'a119d4a93668e829f7106f11cbbdd437310f3e80', class: "action-sheet-sub-title" }, this.subHeader))), this.renderActionSheetButtons(buttons)), cancelButton && (h("div", { key: '1d27f36d09bedd2e4c61fea9dd9d05f8f9271aef', class: "action-sheet-group action-sheet-group-cancel" }, h("button", Object.assign({ key: 'ed13658176c54cc45808a54a0331c297430d9bc6' }, cancelButton.htmlAttributes, { type: "button", class: buttonClass(cancelButton), onClick: () => this.buttonClick(cancelButton) }), h("span", { key: '5208e3e3535b775a443cef6fb1decd790db69b0c', class: "action-sheet-button-inner" }, cancelButton.icon && (h("ion-icon", { key: 'b7ba489e1ee50524a5b4af670eef787844a16286', icon: cancelButton.icon, "aria-hidden": "true", lazy: false, class: "action-sheet-icon" })), cancelButton.text), mode === 'md' && h("ion-ripple-effect", { key: 'b3f88898114855853259f0001def26b4bd6e4a98' })))))), h("div", { key: '0dfd0fcdc633bf565990eaa06679608e749cf8f9', tabindex: "0", "aria-hidden": "true" })));
495
495
  }
496
496
  get el() { return getElement(this); }
497
497
  static get watchers() { return {
@@ -124,6 +124,7 @@ const Alert = class {
124
124
  this.customHTMLEnabled = config.get('innerHTMLTemplatesEnabled', ENABLE_HTML_CONTENT_DEFAULT);
125
125
  this.processedInputs = [];
126
126
  this.processedButtons = [];
127
+ this.isButtonGroupWrapped = false;
127
128
  this.presented = false;
128
129
  /** @internal */
129
130
  this.hasController = false;
@@ -248,6 +249,13 @@ const Alert = class {
248
249
  this.processedButtons = buttons.map((btn) => {
249
250
  return typeof btn === 'string' ? { text: btn, role: btn.toLowerCase() === 'cancel' ? 'cancel' : undefined } : btn;
250
251
  });
252
+ /**
253
+ * Reset wrap state so the new button set can be re-evaluated. Without this,
254
+ * a previously-latched vertical layout would persist even if the new buttons
255
+ * fit horizontally.
256
+ */
257
+ this.isButtonGroupWrapped = false;
258
+ this.checkButtonGroupWrap();
251
259
  }
252
260
  inputsChanged() {
253
261
  const inputs = this.inputs;
@@ -288,6 +296,12 @@ const Alert = class {
288
296
  connectedCallback() {
289
297
  prepareOverlay(this.el);
290
298
  this.triggerChanged();
299
+ /**
300
+ * If the alert was previously connected and is being reattached, the
301
+ * ResizeObserver was disconnected. componentDidLoad only fires once per
302
+ * instance, so re-establish the observer here on reconnect.
303
+ */
304
+ this.setupButtonGroupResizeObserver();
291
305
  }
292
306
  componentWillLoad() {
293
307
  var _a;
@@ -298,11 +312,14 @@ const Alert = class {
298
312
  this.buttonsChanged();
299
313
  }
300
314
  disconnectedCallback() {
315
+ var _a;
301
316
  this.triggerController.removeClickListener();
302
317
  if (this.gesture) {
303
318
  this.gesture.destroy();
304
319
  this.gesture = undefined;
305
320
  }
321
+ (_a = this.buttonGroupResizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
322
+ this.buttonGroupResizeObserver = undefined;
306
323
  }
307
324
  componentDidLoad() {
308
325
  /**
@@ -315,6 +332,7 @@ const Alert = class {
315
332
  this.gesture = createButtonActiveGesture(this.wrapperEl, (refEl) => refEl.classList.contains('alert-button'));
316
333
  this.gesture.enable(true);
317
334
  }
335
+ this.setupButtonGroupResizeObserver();
318
336
  /**
319
337
  * If alert was rendered with isOpen="true"
320
338
  * then we should open alert immediately.
@@ -506,14 +524,58 @@ const Alert = class {
506
524
  }
507
525
  })));
508
526
  }
527
+ setupButtonGroupResizeObserver() {
528
+ var _a;
529
+ /**
530
+ * Re-evaluate vertical layout when the button group resizes so a 2-button
531
+ * group with long text wraps cleanly instead of leaving a stray right-edge
532
+ * border on the first button.
533
+ */
534
+ if (!this.buttonGroupEl || typeof ResizeObserver === 'undefined') {
535
+ return;
536
+ }
537
+ (_a = this.buttonGroupResizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
538
+ this.buttonGroupResizeObserver = new ResizeObserver(() => this.checkButtonGroupWrap());
539
+ this.buttonGroupResizeObserver.observe(this.buttonGroupEl);
540
+ this.checkButtonGroupWrap();
541
+ }
542
+ checkButtonGroupWrap() {
543
+ /**
544
+ * Defer the layout read out of the ResizeObserver callback so we don't
545
+ * force synchronous layout and avoid "ResizeObserver loop" warnings when
546
+ * applying the vertical-layout class itself triggers another resize.
547
+ */
548
+ raf(() => {
549
+ /**
550
+ * Bail if the alert was disconnected after this raf was queued.
551
+ * `buttonGroupEl` persists across disconnect so the observer can be
552
+ * re-attached on reconnect; the observer reference is the disconnect
553
+ * sentinel.
554
+ */
555
+ if (!this.buttonGroupResizeObserver) {
556
+ return;
557
+ }
558
+ const groupEl = this.buttonGroupEl;
559
+ if (!groupEl) {
560
+ return;
561
+ }
562
+ const buttons = Array.from(groupEl.querySelectorAll('.alert-button'));
563
+ if (buttons.length < 2) {
564
+ this.isButtonGroupWrapped = false;
565
+ return;
566
+ }
567
+ const firstTop = buttons[0].offsetTop;
568
+ this.isButtonGroupWrapped = buttons.some((btn) => btn.offsetTop !== firstTop);
569
+ });
570
+ }
509
571
  renderAlertButtons() {
510
572
  const buttons = this.processedButtons;
511
573
  const mode = getIonMode(this);
512
574
  const alertButtonGroupClass = {
513
575
  'alert-button-group': true,
514
- 'alert-button-group-vertical': buttons.length > 2,
576
+ 'alert-button-group-vertical': buttons.length > 2 || this.isButtonGroupWrapped,
515
577
  };
516
- return (h("div", { class: alertButtonGroupClass }, buttons.map((button) => (h("button", Object.assign({}, button.htmlAttributes, { type: "button", id: button.id, class: buttonClass(button), tabIndex: 0, onClick: () => this.buttonClick(button) }), h("span", { class: "alert-button-inner" }, button.text), mode === 'md' && h("ion-ripple-effect", null))))));
578
+ return (h("div", { class: alertButtonGroupClass, ref: (el) => (this.buttonGroupEl = el) }, buttons.map((button) => (h("button", Object.assign({}, button.htmlAttributes, { type: "button", id: button.id, class: buttonClass(button), tabIndex: 0, onClick: () => this.buttonClick(button) }), h("span", { class: "alert-button-inner" }, button.text), mode === 'md' && h("ion-ripple-effect", null))))));
517
579
  }
518
580
  renderAlertMessage(msgId) {
519
581
  const { customHTMLEnabled, message } = this;
@@ -536,9 +598,9 @@ const Alert = class {
536
598
  * If neither are defined, do not set aria-labelledby.
537
599
  */
538
600
  const ariaLabelledBy = header && subHeader ? `${hdrId} ${subHdrId}` : header ? hdrId : subHeader ? subHdrId : null;
539
- return (h(Host, { key: '6025440b9cd369d4fac89e7e4296c84a10a0b8e0', tabindex: "-1", style: {
601
+ return (h(Host, { key: '8d54ccd725ea634be080e67b56fa5efe498f496c', tabindex: "-1", style: {
540
602
  zIndex: `${20000 + overlayIndex}`,
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: '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" })));
603
+ }, 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: '05a238583342285545587de9dce144a82d779193', tappable: this.backdropDismiss }), h("div", { key: 'e52c53fd9845e66781af01b2a788a291b45a927c', tabindex: "0", "aria-hidden": "true" }), h("div", Object.assign({ key: '8417e52eebca24ff436fab0703666db51072f980', 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: '5c560d4800b24d41961423718108b54be6cd6f91', class: "alert-head" }, header && (h("h2", { key: '8637b64cd5125b2258115d1c11f3743113658608', id: hdrId, class: "alert-title" }, header)), subHeader && !header && (h("h2", { key: '7a4e61a02c29b16b336d8acaf6569b30de6fe71e', id: subHdrId, class: "alert-sub-title" }, subHeader)), subHeader && header && (h("h3", { key: '30844b6a0a7e3dab46514cd548ecffa86dcd59cb', id: subHdrId, class: "alert-sub-title" }, subHeader))), this.renderAlertMessage(msgId), this.renderAlertInputs(), this.renderAlertButtons()), h("div", { key: '39c824fee1e60ad8d6234c79d22ceb8bba8004af', tabindex: "0", "aria-hidden": "true" })));
542
604
  }
543
605
  get el() { return getElement(this); }
544
606
  static get watchers() { return {
@@ -39,7 +39,7 @@ const App = class {
39
39
  * platforms proceed into this block.
40
40
  */
41
41
  const platform = isPlatform(window, 'ios') ? 'ios' : 'android';
42
- import('./input-shims-AaDhOpKN.js').then((module) => module.startInputShims(config, platform));
42
+ import('./input-shims-DbrgeeNb.js').then((module) => module.startInputShims(config, platform));
43
43
  }
44
44
  const hardwareBackButtonModule = await import('./hardware-back-button-CTe4XmL7.js');
45
45
  const supportsHardwareBackButtonEvents = isHybrid || shouldUseCloseWatcher();
@@ -157,7 +157,7 @@ Buttons.style = {
157
157
  md: buttonsMdCss()
158
158
  };
159
159
 
160
- const contentCss = () => `:host{--background:var(--ion-background-color, #fff);--color:var(--ion-text-color, #000);--padding-top:0px;--padding-bottom:0px;--padding-start:0px;--padding-end:0px;--keyboard-offset:0px;--offset-top:0px;--offset-bottom:0px;--overflow:auto;display:block;position:relative;-ms-flex:1;flex:1;width:100%;height:100%;margin:0 !important;padding:0 !important;font-family:var(--ion-font-family, inherit);contain:size style}:host(.ion-color) .inner-scroll{background:var(--ion-color-base);color:var(--ion-color-contrast)}#background-content{left:0px;right:0px;top:calc(var(--offset-top) * -1);bottom:calc(var(--offset-bottom) * -1);position:absolute;background:var(--background)}.inner-scroll{left:0px;right:0px;top:calc(var(--offset-top) * -1);bottom:calc(var(--offset-bottom) * -1);-webkit-padding-start:var(--padding-start);padding-inline-start:var(--padding-start);-webkit-padding-end:var(--padding-end);padding-inline-end:var(--padding-end);padding-top:calc(var(--padding-top) + var(--offset-top));padding-bottom:calc(var(--padding-bottom) + var(--keyboard-offset) + var(--offset-bottom) + var(--ion-content-safe-area-padding-bottom, 0px));position:absolute;color:var(--color);-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;-ms-touch-action:pan-x pan-y pinch-zoom;touch-action:pan-x pan-y pinch-zoom}.scroll-y,.scroll-x{-webkit-overflow-scrolling:touch;z-index:0;will-change:scroll-position}.scroll-y{overflow-y:var(--overflow);overscroll-behavior-y:contain}.scroll-x{overflow-x:var(--overflow);overscroll-behavior-x:contain}.overscroll::before,.overscroll::after{position:absolute;width:1px;height:1px;content:""}.overscroll::before{bottom:-1px}.overscroll::after{top:-1px}:host(.content-sizing){display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-height:0;contain:none}:host(.content-sizing) .inner-scroll{position:relative;top:0;bottom:0;margin-top:calc(var(--offset-top) * -1);margin-bottom:calc(var(--offset-bottom) * -1)}.transition-effect{display:none;position:absolute;width:100%;height:100vh;opacity:0;pointer-events:none}:host(.content-ltr) .transition-effect{left:-100%;}:host(.content-rtl) .transition-effect{right:-100%;}.transition-cover{position:absolute;right:0;width:100%;height:100%;background:black;opacity:0.1}.transition-shadow{display:block;position:absolute;width:100%;height:100%;-webkit-box-shadow:inset -9px 0 9px 0 rgba(0, 0, 100, 0.03);box-shadow:inset -9px 0 9px 0 rgba(0, 0, 100, 0.03)}:host(.content-ltr) .transition-shadow{right:0;}:host(.content-rtl) .transition-shadow{left:0;-webkit-transform:scaleX(-1);transform:scaleX(-1)}::slotted([slot=fixed]){position:absolute;-webkit-transform:translateZ(0);transform:translateZ(0)}`;
160
+ const contentCss = () => `:host{--background:var(--ion-background-color, #fff);--color:var(--ion-text-color, #000);--padding-top:0px;--padding-bottom:0px;--padding-start:0px;--padding-end:0px;--keyboard-offset:0px;--offset-top:0px;--offset-bottom:0px;--overflow:auto;display:block;position:relative;-ms-flex:1;flex:1;width:100%;height:100%;margin:0 !important;padding:0 !important;font-family:var(--ion-font-family, inherit);contain:size style}:host(.ion-color) .inner-scroll{background:var(--ion-color-base);color:var(--ion-color-contrast)}#background-content{left:0px;right:0px;top:calc(var(--offset-top) * -1);bottom:calc(var(--offset-bottom) * -1);position:absolute;background:var(--background)}.inner-scroll{left:0px;right:0px;top:calc(var(--offset-top) * -1);bottom:calc(var(--offset-bottom) * -1);-webkit-padding-start:var(--padding-start);padding-inline-start:var(--padding-start);-webkit-padding-end:var(--padding-end);padding-inline-end:var(--padding-end);padding-top:calc(var(--padding-top) + var(--offset-top));padding-bottom:calc(var(--padding-bottom) + var(--keyboard-offset) + var(--offset-bottom) + var(--internal-content-safe-area-padding-bottom, 0px));position:absolute;color:var(--color);-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;-ms-touch-action:pan-x pan-y pinch-zoom;touch-action:pan-x pan-y pinch-zoom}.scroll-y,.scroll-x{-webkit-overflow-scrolling:touch;z-index:0;will-change:scroll-position}.scroll-y{overflow-y:var(--overflow);overscroll-behavior-y:contain}.scroll-x{overflow-x:var(--overflow);overscroll-behavior-x:contain}.overscroll::before,.overscroll::after{position:absolute;width:1px;height:1px;content:""}.overscroll::before{bottom:-1px}.overscroll::after{top:-1px}:host(.content-sizing){display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-height:0;contain:none}:host(.content-sizing) .inner-scroll{position:relative;top:0;bottom:0;margin-top:calc(var(--offset-top) * -1);margin-bottom:calc(var(--offset-bottom) * -1)}.transition-effect{display:none;position:absolute;width:100%;height:100vh;opacity:0;pointer-events:none}:host(.content-ltr) .transition-effect{left:-100%;}:host(.content-rtl) .transition-effect{right:-100%;}.transition-cover{position:absolute;right:0;width:100%;height:100%;background:black;opacity:0.1}.transition-shadow{display:block;position:absolute;width:100%;height:100%;-webkit-box-shadow:inset -9px 0 9px 0 rgba(0, 0, 100, 0.03);box-shadow:inset -9px 0 9px 0 rgba(0, 0, 100, 0.03)}:host(.content-ltr) .transition-shadow{right:0;}:host(.content-rtl) .transition-shadow{left:0;-webkit-transform:scaleX(-1);transform:scaleX(-1)}::slotted([slot=fixed]){position:absolute;-webkit-transform:translateZ(0);transform:translateZ(0)}`;
161
161
 
162
162
  const Content = class {
163
163
  constructor(hostRef) {