@ionic/core 8.7.3-dev.11755622775.1fc05815 → 8.7.3-dev.11755697669.1be2024b

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 (80) hide show
  1. package/components/ion-datetime.js +4 -3
  2. package/components/ion-input.js +5 -36
  3. package/components/ion-textarea.js +4 -35
  4. package/components/overlays.js +15 -6
  5. package/components/picker-column-option.js +3 -3
  6. package/components/picker-column.js +3 -39
  7. package/dist/cjs/index.cjs.js +1 -1
  8. package/dist/cjs/ion-action-sheet.cjs.entry.js +1 -1
  9. package/dist/cjs/ion-alert.cjs.entry.js +1 -1
  10. package/dist/cjs/ion-datetime_3.cjs.entry.js +4 -4
  11. package/dist/cjs/ion-input.cjs.entry.js +5 -35
  12. package/dist/cjs/ion-loading.cjs.entry.js +1 -1
  13. package/dist/cjs/ion-menu_3.cjs.entry.js +1 -1
  14. package/dist/cjs/ion-modal.cjs.entry.js +1 -1
  15. package/dist/cjs/ion-picker-column-option.cjs.entry.js +3 -3
  16. package/dist/cjs/ion-picker-column.cjs.entry.js +3 -39
  17. package/dist/cjs/ion-popover.cjs.entry.js +1 -1
  18. package/dist/cjs/ion-select-modal.cjs.entry.js +1 -1
  19. package/dist/cjs/ion-select_3.cjs.entry.js +1 -1
  20. package/dist/cjs/ion-textarea.cjs.entry.js +4 -34
  21. package/dist/cjs/ion-toast.cjs.entry.js +1 -1
  22. package/dist/cjs/ionic.cjs.js +1 -1
  23. package/dist/cjs/loader.cjs.js +1 -1
  24. package/dist/cjs/{overlays-CglR7j-u.js → overlays-Ca4z9krz.js} +15 -6
  25. package/dist/collection/components/datetime/datetime.js +4 -3
  26. package/dist/collection/components/input/input.js +6 -37
  27. package/dist/collection/components/picker-column/picker-column.js +3 -39
  28. package/dist/collection/components/picker-column-option/picker-column-option.ios.css +2 -2
  29. package/dist/collection/components/picker-column-option/picker-column-option.js +1 -1
  30. package/dist/collection/components/picker-column-option/picker-column-option.md.css +2 -2
  31. package/dist/collection/components/textarea/textarea.js +5 -36
  32. package/dist/collection/utils/overlays.js +15 -6
  33. package/dist/docs.json +1 -1
  34. package/dist/esm/index.js +1 -1
  35. package/dist/esm/ion-action-sheet.entry.js +1 -1
  36. package/dist/esm/ion-alert.entry.js +1 -1
  37. package/dist/esm/ion-datetime_3.entry.js +4 -4
  38. package/dist/esm/ion-input.entry.js +5 -35
  39. package/dist/esm/ion-loading.entry.js +1 -1
  40. package/dist/esm/ion-menu_3.entry.js +1 -1
  41. package/dist/esm/ion-modal.entry.js +1 -1
  42. package/dist/esm/ion-picker-column-option.entry.js +3 -3
  43. package/dist/esm/ion-picker-column.entry.js +3 -39
  44. package/dist/esm/ion-popover.entry.js +1 -1
  45. package/dist/esm/ion-select-modal.entry.js +1 -1
  46. package/dist/esm/ion-select_3.entry.js +1 -1
  47. package/dist/esm/ion-textarea.entry.js +4 -34
  48. package/dist/esm/ion-toast.entry.js +1 -1
  49. package/dist/esm/ionic.js +1 -1
  50. package/dist/esm/loader.js +1 -1
  51. package/dist/esm/{overlays-ZX_4-t_r.js → overlays-C14Rvrme.js} +15 -6
  52. package/dist/ionic/index.esm.js +1 -1
  53. package/dist/ionic/ionic.esm.js +1 -1
  54. package/dist/ionic/{p-91d6ccb0.entry.js → p-05baca9e.entry.js} +1 -1
  55. package/dist/ionic/p-1488b7cc.entry.js +4 -0
  56. package/dist/ionic/{p-7bac2c5f.entry.js → p-1be8ffce.entry.js} +1 -1
  57. package/dist/ionic/p-2e296f4a.entry.js +4 -0
  58. package/dist/ionic/{p-ac434970.entry.js → p-31393988.entry.js} +1 -1
  59. package/dist/ionic/{p-982fe1c4.entry.js → p-3c51f2cd.entry.js} +1 -1
  60. package/dist/ionic/{p-92e8f208.entry.js → p-5b64a786.entry.js} +1 -1
  61. package/dist/ionic/{p-8d96a0cd.entry.js → p-6d655180.entry.js} +1 -1
  62. package/dist/ionic/p-8888efe4.entry.js +4 -0
  63. package/dist/ionic/p-DMk_cMN9.js +4 -0
  64. package/dist/ionic/{p-c575e7ce.entry.js → p-a67512ba.entry.js} +1 -1
  65. package/dist/ionic/{p-ab33ef20.entry.js → p-b1c70f1c.entry.js} +1 -1
  66. package/dist/ionic/p-b292804d.entry.js +4 -0
  67. package/dist/ionic/{p-f2884bc2.entry.js → p-b6432111.entry.js} +1 -1
  68. package/dist/ionic/p-c5210d3e.entry.js +4 -0
  69. package/dist/types/components/input/input.d.ts +0 -9
  70. package/dist/types/components/picker-column/picker-column.d.ts +0 -7
  71. package/dist/types/components/textarea/textarea.d.ts +0 -9
  72. package/hydrate/index.js +33 -96
  73. package/hydrate/index.mjs +33 -96
  74. package/package.json +1 -1
  75. package/dist/ionic/p-187aaf4a.entry.js +0 -4
  76. package/dist/ionic/p-1d5b934a.entry.js +0 -4
  77. package/dist/ionic/p-1e34d434.entry.js +0 -4
  78. package/dist/ionic/p-29032e49.entry.js +0 -4
  79. package/dist/ionic/p-CSwZyt05.js +0 -4
  80. package/dist/ionic/p-f456d176.entry.js +0 -4
package/hydrate/index.js CHANGED
@@ -6167,16 +6167,20 @@ const setRootAriaHidden = (hidden = false) => {
6167
6167
  }
6168
6168
  if (hidden) {
6169
6169
  viewContainer.setAttribute('aria-hidden', 'true');
6170
+ viewContainer.setAttribute('inert', '');
6170
6171
  }
6171
6172
  else {
6172
6173
  viewContainer.removeAttribute('aria-hidden');
6174
+ viewContainer.removeAttribute('inert');
6173
6175
  }
6174
6176
  };
6175
6177
  const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts) => {
6176
- var _a, _b;
6178
+ var _a, _b, _c;
6177
6179
  if (overlay.presented) {
6178
6180
  return;
6179
6181
  }
6182
+ console.log("presenting overlay...");
6183
+ (_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.blur();
6180
6184
  /**
6181
6185
  * Due to accessibility guidelines, toasts do not have
6182
6186
  * focus traps.
@@ -6192,7 +6196,7 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
6192
6196
  hideAnimatingOverlayFromScreenReaders(overlay.el);
6193
6197
  overlay.presented = true;
6194
6198
  overlay.willPresent.emit();
6195
- (_a = overlay.willPresentShorthand) === null || _a === void 0 ? void 0 : _a.emit();
6199
+ (_b = overlay.willPresentShorthand) === null || _b === void 0 ? void 0 : _b.emit();
6196
6200
  const mode = getIonMode$1(overlay);
6197
6201
  // get the user's animation fn if one was provided
6198
6202
  const animationBuilder = overlay.enterAnimation
@@ -6201,7 +6205,7 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
6201
6205
  const completed = await overlayAnimation(overlay, animationBuilder, overlay.el, opts);
6202
6206
  if (completed) {
6203
6207
  overlay.didPresent.emit();
6204
- (_b = overlay.didPresentShorthand) === null || _b === void 0 ? void 0 : _b.emit();
6208
+ (_c = overlay.didPresentShorthand) === null || _c === void 0 ? void 0 : _c.emit();
6205
6209
  }
6206
6210
  /**
6207
6211
  * When an overlay that steals focus
@@ -6236,6 +6240,7 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
6236
6240
  * screen readers.
6237
6241
  */
6238
6242
  overlay.el.removeAttribute('aria-hidden');
6243
+ overlay.el.removeAttribute('inert');
6239
6244
  };
6240
6245
  /**
6241
6246
  * When an overlay component is dismissed,
@@ -6287,10 +6292,11 @@ const restoreElementFocus = async (overlayEl) => {
6287
6292
  }
6288
6293
  };
6289
6294
  const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnimation, opts) => {
6290
- var _a, _b;
6295
+ var _a, _b, _c;
6291
6296
  if (!overlay.presented) {
6292
6297
  return false;
6293
6298
  }
6299
+ (_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.blur();
6294
6300
  const presentedOverlays = doc !== undefined ? getPresentedOverlays(doc) : [];
6295
6301
  /**
6296
6302
  * For accessibility, toasts lack focus traps and don't receive
@@ -6324,7 +6330,7 @@ const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnim
6324
6330
  // Overlay contents should not be clickable during dismiss
6325
6331
  overlay.el.style.setProperty('pointer-events', 'none');
6326
6332
  overlay.willDismiss.emit({ data, role });
6327
- (_a = overlay.willDismissShorthand) === null || _a === void 0 ? void 0 : _a.emit({ data, role });
6333
+ (_b = overlay.willDismissShorthand) === null || _b === void 0 ? void 0 : _b.emit({ data, role });
6328
6334
  const mode = getIonMode$1(overlay);
6329
6335
  const animationBuilder = overlay.leaveAnimation
6330
6336
  ? overlay.leaveAnimation
@@ -6334,7 +6340,7 @@ const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnim
6334
6340
  await overlayAnimation(overlay, animationBuilder, overlay.el, opts);
6335
6341
  }
6336
6342
  overlay.didDismiss.emit({ data, role });
6337
- (_b = overlay.didDismissShorthand) === null || _b === void 0 ? void 0 : _b.emit({ data, role });
6343
+ (_c = overlay.didDismissShorthand) === null || _c === void 0 ? void 0 : _c.emit({ data, role });
6338
6344
  // Get a reference to all animations currently assigned to this overlay
6339
6345
  // Then tear them down to return the overlay to its initial visual state
6340
6346
  const animations = activeAnimations.get(overlay) || [];
@@ -6584,6 +6590,7 @@ const hideAnimatingOverlayFromScreenReaders = (overlay) => {
6584
6590
  * This is done at the end of the `present` method.
6585
6591
  */
6586
6592
  overlay.setAttribute('aria-hidden', 'true');
6593
+ overlay.setAttribute('inert', '');
6587
6594
  }
6588
6595
  };
6589
6596
  /**
@@ -6611,6 +6618,7 @@ const hideUnderlyingOverlaysFromScreenReaders = (newTopMostOverlay) => {
6611
6618
  */
6612
6619
  if (nextPresentedOverlay.hasAttribute('aria-hidden') || nextPresentedOverlay.tagName !== 'ION-TOAST') {
6613
6620
  presentedOverlay.setAttribute('aria-hidden', 'true');
6621
+ presentedOverlay.setAttribute('inert', '');
6614
6622
  }
6615
6623
  }
6616
6624
  };
@@ -6632,6 +6640,7 @@ const revealOverlaysToScreenReaders = () => {
6632
6640
  * overlay too so focus can move there since focus is never automatically moved to the Toast.
6633
6641
  */
6634
6642
  currentOverlay.removeAttribute('aria-hidden');
6643
+ currentOverlay.removeAttribute('inert');
6635
6644
  /**
6636
6645
  * If we found a non-Toast element then we can just remove aria-hidden and stop searching entirely
6637
6646
  * since this overlay should always receive focus. As a result, all underlying overlays should still
@@ -13531,7 +13540,7 @@ class Datetime {
13531
13540
  const renderArray = forcePresentation === 'time-date'
13532
13541
  ? [this.renderTimePickerColumns(forcePresentation), this.renderDatePickerColumns(forcePresentation)]
13533
13542
  : [this.renderDatePickerColumns(forcePresentation), this.renderTimePickerColumns(forcePresentation)];
13534
- return hAsync("ion-picker", null, renderArray);
13543
+ return hAsync("ion-picker", { class: FOCUS_TRAP_DISABLE_CLASS }, renderArray);
13535
13544
  }
13536
13545
  renderDatePickerColumns(forcePresentation) {
13537
13546
  return forcePresentation === 'date-time' || forcePresentation === 'time-date'
@@ -14088,7 +14097,7 @@ class Datetime {
14088
14097
  const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
14089
14098
  const hasWheelVariant = hasDatePresentation && preferWheel;
14090
14099
  renderHiddenInput(true, el, name, formatValue(value), disabled);
14091
- return (hAsync(Host, { key: 'f35cf200ff05d33074576e3d2754d3b2a0735b96', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: Object.assign({}, createColorClasses$1(color, {
14100
+ return (hAsync(Host, { key: '57492534800ea059a7c2bbd9f0059cc0b75ae8d2', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: Object.assign({}, createColorClasses$1(color, {
14092
14101
  [mode]: true,
14093
14102
  ['datetime-readonly']: readonly,
14094
14103
  ['datetime-disabled']: disabled,
@@ -14098,7 +14107,7 @@ class Datetime {
14098
14107
  [`datetime-size-${size}`]: true,
14099
14108
  [`datetime-prefer-wheel`]: hasWheelVariant,
14100
14109
  [`datetime-grid`]: isGridStyle,
14101
- })) }, hAsync("div", { key: '859e9354a12bfa58ac3f964c2e66839f17071c00', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
14110
+ })) }, hAsync("div", { key: '97dac5e5195635ac0bc5fb472b9d09e5c3c6bbc3', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
14102
14111
  }
14103
14112
  get el() { return getElement(this); }
14104
14113
  static get watchers() { return {
@@ -16629,10 +16638,6 @@ class Input {
16629
16638
  * is applied in both cases.
16630
16639
  */
16631
16640
  this.hasFocus = false;
16632
- /**
16633
- * Track validation state for proper aria-live announcements
16634
- */
16635
- this.isInvalid = false;
16636
16641
  /**
16637
16642
  * Indicates whether and how the text value should be automatically capitalized as it is entered/edited by the user.
16638
16643
  * Available options: `"off"`, `"none"`, `"on"`, `"sentences"`, `"words"`, `"characters"`.
@@ -16816,18 +16821,10 @@ class Input {
16816
16821
  componentWillLoad() {
16817
16822
  this.inheritedAttributes = Object.assign(Object.assign({}, inheritAriaAttributes(this.el)), inheritAttributes$1(this.el, ['tabindex', 'title', 'data-form-type', 'dir']));
16818
16823
  }
16819
- /**
16820
- * Checks if the input is in an invalid state based on validation classes
16821
- */
16822
- checkValidationState() {
16823
- return this.el.classList.contains('ion-touched') && this.el.classList.contains('ion-invalid');
16824
- }
16825
16824
  connectedCallback() {
16826
16825
  const { el } = this;
16827
16826
  this.slotMutationController = createSlotMutationController(el, ['label', 'start', 'end'], () => forceUpdate());
16828
16827
  this.notchController = createNotchController(el, () => this.notchSpacerEl, () => this.labelSlot);
16829
- // Always set initial state
16830
- this.isInvalid = this.checkValidationState();
16831
16828
  this.debounceChanged();
16832
16829
  }
16833
16830
  componentDidLoad() {
@@ -16854,11 +16851,6 @@ class Input {
16854
16851
  this.notchController.destroy();
16855
16852
  this.notchController = undefined;
16856
16853
  }
16857
- // Clean up validation observer to prevent memory leaks
16858
- if (this.validationObserver) {
16859
- this.validationObserver.disconnect();
16860
- this.validationObserver = undefined;
16861
- }
16862
16854
  }
16863
16855
  /**
16864
16856
  * Sets focus on the native `input` in `ion-input`. Use this method instead of the global
@@ -16967,8 +16959,8 @@ class Input {
16967
16959
  ];
16968
16960
  }
16969
16961
  getHintTextID() {
16970
- const { isInvalid, helperText, errorText, helperTextId, errorTextId } = this;
16971
- if (isInvalid && errorText) {
16962
+ const { el, helperText, errorText, helperTextId, errorTextId } = this;
16963
+ if (el.classList.contains('ion-touched') && el.classList.contains('ion-invalid') && errorText) {
16972
16964
  return errorTextId;
16973
16965
  }
16974
16966
  if (helperText) {
@@ -17081,7 +17073,7 @@ class Input {
17081
17073
  * TODO(FW-5592): Remove hasStartEndSlots condition
17082
17074
  */
17083
17075
  const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || hasStartEndSlots));
17084
- return (hAsync(Host, { key: '1b0cffa910aef4eac24438bf3158e51905e70788', class: createColorClasses$1(this.color, {
17076
+ return (hAsync(Host, { key: '41b2526627e7d2773a80f011b123284203a71ca0', class: createColorClasses$1(this.color, {
17085
17077
  [mode]: true,
17086
17078
  'has-value': hasValue,
17087
17079
  'has-focus': hasFocus,
@@ -17092,14 +17084,14 @@ class Input {
17092
17084
  'in-item': inItem,
17093
17085
  'in-item-color': hostContext('ion-item.ion-color', this.el),
17094
17086
  'input-disabled': disabled,
17095
- }) }, hAsync("label", { key: '24411a6cc190e2054015bca5e2827b96c65bba17', class: "input-wrapper", htmlFor: inputId, onClick: this.onLabelClick }, this.renderLabelContainer(), hAsync("div", { key: '7fa7a7f6d2778e6efbebc6f2671d8a63048f76a8', class: "native-wrapper", onClick: this.onLabelClick }, hAsync("slot", { key: '14f489e6026967ee1b2eee1519bad4230f028489', name: "start" }), hAsync("input", Object.assign({ key: 'd0f5b756394aced0831e80e91313a417bda37e6f', class: "native-input", ref: (input) => (this.nativeInput = input), id: inputId, disabled: disabled, autoCapitalize: this.autocapitalize, autoComplete: this.autocomplete, autoCorrect: this.autocorrect, autoFocus: this.autofocus, enterKeyHint: this.enterkeyhint, inputMode: this.inputmode, min: this.min, max: this.max, minLength: this.minlength, maxLength: this.maxlength, multiple: this.multiple, name: this.name, pattern: this.pattern, placeholder: this.placeholder || '', readOnly: readonly, required: this.required, spellcheck: this.spellcheck, step: this.step, type: this.type, value: value, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, onKeyDown: this.onKeydown, onCompositionstart: this.onCompositionStart, onCompositionend: this.onCompositionEnd, "aria-describedby": this.getHintTextID(), "aria-invalid": this.isInvalid ? 'true' : undefined }, this.inheritedAttributes)), this.clearInput && !readonly && !disabled && (hAsync("button", { key: '3e37003927082bbbfce4b3396a263969aa2289fc', "aria-label": "reset", type: "button", class: "input-clear-icon", onPointerDown: (ev) => {
17087
+ }) }, hAsync("label", { key: '9ab078363e32528102b441ad1791d83f86fdcbdc', class: "input-wrapper", htmlFor: inputId, onClick: this.onLabelClick }, this.renderLabelContainer(), hAsync("div", { key: 'e34b594980ec62e4c618e827fadf7669a39ad0d8', class: "native-wrapper", onClick: this.onLabelClick }, hAsync("slot", { key: '12dc04ead5502e9e5736240e918bf9331bf7b5d9', name: "start" }), hAsync("input", Object.assign({ key: 'df356eb4ced23109b2c0242f36dc043aba8782d6', class: "native-input", ref: (input) => (this.nativeInput = input), id: inputId, disabled: disabled, autoCapitalize: this.autocapitalize, autoComplete: this.autocomplete, autoCorrect: this.autocorrect, autoFocus: this.autofocus, enterKeyHint: this.enterkeyhint, inputMode: this.inputmode, min: this.min, max: this.max, minLength: this.minlength, maxLength: this.maxlength, multiple: this.multiple, name: this.name, pattern: this.pattern, placeholder: this.placeholder || '', readOnly: readonly, required: this.required, spellcheck: this.spellcheck, step: this.step, type: this.type, value: value, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, onKeyDown: this.onKeydown, onCompositionstart: this.onCompositionStart, onCompositionend: this.onCompositionEnd, "aria-describedby": this.getHintTextID(), "aria-invalid": this.getHintTextID() === this.errorTextId }, this.inheritedAttributes)), this.clearInput && !readonly && !disabled && (hAsync("button", { key: 'f79f68cabcd4ea99419331174a377827db0c0741', "aria-label": "reset", type: "button", class: "input-clear-icon", onPointerDown: (ev) => {
17096
17088
  /**
17097
17089
  * This prevents mobile browsers from
17098
17090
  * blurring the input when the clear
17099
17091
  * button is activated.
17100
17092
  */
17101
17093
  ev.preventDefault();
17102
- }, onClick: this.clearTextInput }, hAsync("ion-icon", { key: '269ccdfd95a8a5b39bf0587b1494b4badd5c65b3', "aria-hidden": "true", icon: clearIconData }))), hAsync("slot", { key: '5d93a350194c4197c01c5d54f50060e7f527f065', name: "end" })), shouldRenderHighlight && hAsync("div", { key: 'fbdd13d41b37aa1e4608ba2535f7b833748eae3f', class: "input-highlight" })), this.renderBottomContent()));
17094
+ }, onClick: this.clearTextInput }, hAsync("ion-icon", { key: '237ec07ec2e10f08818a332bb596578c2c49f770', "aria-hidden": "true", icon: clearIconData }))), hAsync("slot", { key: '1f0a3624aa3e8dc3c307a6762230ab698768a5e5', name: "end" })), shouldRenderHighlight && hAsync("div", { key: '8a8cbb82695a722a0010b53dd0b1f1f97534a20b', class: "input-highlight" })), this.renderBottomContent()));
17103
17095
  }
17104
17096
  get el() { return getElement(this); }
17105
17097
  static get watchers() { return {
@@ -17151,7 +17143,6 @@ class Input {
17151
17143
  "type": [1],
17152
17144
  "value": [1032],
17153
17145
  "hasFocus": [32],
17154
- "isInvalid": [32],
17155
17146
  "setFocus": [64],
17156
17147
  "getInputElement": [64]
17157
17148
  },
@@ -25522,23 +25513,6 @@ class PickerColumn {
25522
25513
  var _a;
25523
25514
  return el ? (_a = el.getAttribute('aria-label')) !== null && _a !== void 0 ? _a : el.innerText : '';
25524
25515
  };
25525
- /**
25526
- * Render an element that overlays the column. This element is for assistive
25527
- * tech to allow users to navigate the column up/down. This element should receive
25528
- * focus as it listens for synthesized keyboard events as required by the
25529
- * slider role: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/slider_role
25530
- */
25531
- this.renderAssistiveFocusable = () => {
25532
- const { activeItem } = this;
25533
- const valueText = this.getOptionValueText(activeItem);
25534
- /**
25535
- * When using the picker, the valuetext provides important context that valuenow
25536
- * does not. Additionally, using non-zero valuemin/valuemax values can cause
25537
- * WebKit to incorrectly announce numeric valuetext values (such as a year
25538
- * like "2024") as percentages: https://bugs.webkit.org/show_bug.cgi?id=273126
25539
- */
25540
- return (hAsync("div", { ref: (el) => (this.assistiveFocusable = el), class: "assistive-focusable", role: "slider", tabindex: this.disabled ? undefined : 0, "aria-label": this.ariaLabel, "aria-valuemin": 0, "aria-valuemax": 0, "aria-valuenow": 0, "aria-valuetext": valueText, "aria-orientation": "vertical", onKeyDown: (ev) => this.onKeyDown(ev) }));
25541
- };
25542
25516
  }
25543
25517
  ariaLabelChanged(newValue) {
25544
25518
  this.ariaLabel = newValue;
@@ -25679,33 +25653,14 @@ class PickerColumn {
25679
25653
  render() {
25680
25654
  const { color, disabled, isActive, numericInput } = this;
25681
25655
  const mode = getIonMode$1(this);
25682
- return (hAsync(Host, { key: 'ea0280355b2f87895bf7dddd289ccf473aa759f3', class: createColorClasses$1(color, {
25656
+ return (hAsync(Host, { key: 'db903fd415f8a2d91994dececca481c1af8ba6a9', class: createColorClasses$1(color, {
25683
25657
  [mode]: true,
25684
25658
  ['picker-column-active']: isActive,
25685
25659
  ['picker-column-numeric-input']: numericInput,
25686
25660
  ['picker-column-disabled']: disabled,
25687
- }) }, this.renderAssistiveFocusable(), hAsync("slot", { key: '482992131cdeb85b1f61430d7fe1322a16345769', name: "prefix" }), hAsync("div", { key: '43f7f80d621d411ef366b3ca1396299e8c9a0c97', "aria-hidden": "true", class: "picker-opts", ref: (el) => {
25661
+ }) }, hAsync("slot", { key: '02ce9e1dd7df91afcd50b06416552bcffb5dec98', name: "prefix" }), hAsync("div", { key: '6dfd7d2429bec19244a6b1afb4448121963a031b', class: "picker-opts", ref: (el) => {
25688
25662
  this.scrollEl = el;
25689
- },
25690
- /**
25691
- * When an element has an overlay scroll style and
25692
- * a fixed height, Firefox will focus the scrollable
25693
- * container if the content exceeds the container's
25694
- * dimensions.
25695
- *
25696
- * This causes keyboard navigation to focus to this
25697
- * element instead of going to the next element in
25698
- * the tab order.
25699
- *
25700
- * The desired behavior is for the user to be able to
25701
- * focus the assistive focusable element and tab to
25702
- * the next element in the tab order. Instead of tabbing
25703
- * to this element.
25704
- *
25705
- * To prevent this, we set the tabIndex to -1. This
25706
- * will match the behavior of the other browsers.
25707
- */
25708
- tabIndex: -1 }, hAsync("div", { key: '13a9ee686132af32240710730765de4c0003a9e8', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), hAsync("div", { key: 'dbccba4920833cfcebe9b0fc763458ec3053705a', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), hAsync("div", { key: '682b43f83a5ea2e46067457f3af118535e111edb', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), hAsync("slot", { key: 'd27e1e1dc0504b2f4627a29912a05bb91e8e413a' }), hAsync("div", { key: '61c948dbb9cf7469aed3018542bc0954211585ba', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), hAsync("div", { key: 'cf46c277fbee65e35ff44ce0d53ce12aa9cbf9db', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), hAsync("div", { key: 'bbc0e2d491d3f836ab849493ade2f7fa6ad9244e', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0")), hAsync("slot", { key: 'd25cbbe14b2914fe7b878d43b4e3f4a8c8177d24', name: "suffix" })));
25663
+ }, role: "slider", tabindex: this.disabled ? undefined : 0, "aria-label": this.ariaLabel, "aria-valuemin": 0, "aria-valuemax": 0, "aria-valuenow": 0, "aria-valuetext": this.getOptionValueText(this.activeItem), "aria-orientation": "vertical", onKeyDown: (ev) => this.onKeyDown(ev) }, hAsync("div", { key: 'e30ce0b9cefbfe4d4441fa33acf595da31855c3f', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), hAsync("div", { key: '8be2bd293c12c6ba720d9b31d0d561a96f42e97d', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), hAsync("div", { key: '8afdcddddabbf646fbb55cb0ba4448309a2c1dd9', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), hAsync("slot", { key: '6aa0dacc34d6848575ad5b122b9046982308ca43' }), hAsync("div", { key: '92ec8a357414c1b779b11d1dd18fb87a7ee63982', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), hAsync("div", { key: 'b89457cb74b5907c25594ff6720ac54ca537e933', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), hAsync("div", { key: '5bbc92e6bc24de08e39873bf08c5b668373ac0f8', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0")), hAsync("slot", { key: 'd7bf2b519214f0f3576a4ca79844ad97827dd97f', name: "suffix" })));
25709
25664
  }
25710
25665
  get el() { return getElement(this); }
25711
25666
  static get watchers() { return {
@@ -26097,9 +26052,9 @@ const DECELERATION_FRICTION = 0.97;
26097
26052
  const MAX_PICKER_SPEED = 90;
26098
26053
  const TRANSITION_DURATION = 150;
26099
26054
 
26100
- const pickerColumnOptionIosCss = "button{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;width:100%;height:34px;border:0px;outline:none;background:transparent;color:inherit;font-family:var(--ion-font-family, inherit);font-size:inherit;line-height:34px;text-align:inherit;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;overflow:hidden}:host(.option-disabled){opacity:0.4}:host(.option-disabled) button{cursor:default}";
26055
+ const pickerColumnOptionIosCss = ".picker-column-option-button{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;width:100%;height:34px;border:0px;outline:none;background:transparent;color:inherit;font-family:var(--ion-font-family, inherit);font-size:inherit;line-height:34px;text-align:inherit;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;overflow:hidden}:host(.option-disabled){opacity:0.4}:host(.option-disabled) .picker-column-option-button{cursor:default}";
26101
26056
 
26102
- const pickerColumnOptionMdCss = "button{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;width:100%;height:34px;border:0px;outline:none;background:transparent;color:inherit;font-family:var(--ion-font-family, inherit);font-size:inherit;line-height:34px;text-align:inherit;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;overflow:hidden}:host(.option-disabled){opacity:0.4}:host(.option-disabled) button{cursor:default}:host(.option-active){color:var(--ion-color-base)}";
26057
+ const pickerColumnOptionMdCss = ".picker-column-option-button{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;width:100%;height:34px;border:0px;outline:none;background:transparent;color:inherit;font-family:var(--ion-font-family, inherit);font-size:inherit;line-height:34px;text-align:inherit;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;overflow:hidden}:host(.option-disabled){opacity:0.4}:host(.option-disabled) .picker-column-option-button{cursor:default}:host(.option-active){color:var(--ion-color-base)}";
26103
26058
 
26104
26059
  class PickerColumnOption {
26105
26060
  constructor(hostRef) {
@@ -26191,7 +26146,7 @@ class PickerColumnOption {
26191
26146
  return (hAsync(Host, { key: 'f816729941aabcb31ddfdce3ffe2e2139030d715', class: createColorClasses$1(color, {
26192
26147
  [mode]: true,
26193
26148
  ['option-disabled']: disabled,
26194
- }) }, hAsync("button", { key: '48dff7833bb60fc8331cd353a0885e6affa683d1', tabindex: "-1", "aria-label": ariaLabel, disabled: disabled, onClick: () => this.onClick() }, hAsync("slot", { key: 'f9224d0e7b7aa6c05b29abfdcfe0f30ad6ee3141' }))));
26149
+ }) }, hAsync("div", { key: 'd942de84fd14d7dc06b1e5cf4f7920d1dc3c6371', class: 'picker-column-option-button', role: "button", "aria-label": ariaLabel, onClick: () => this.onClick() }, hAsync("slot", { key: 'b0df5717b42209e649097209a01476e1a66f5c5c' }))));
26195
26150
  }
26196
26151
  get el() { return getElement(this); }
26197
26152
  static get watchers() { return {
@@ -34911,10 +34866,6 @@ class Textarea {
34911
34866
  * is applied in both cases.
34912
34867
  */
34913
34868
  this.hasFocus = false;
34914
- /**
34915
- * Track validation state for proper aria-live announcements
34916
- */
34917
- this.isInvalid = false;
34918
34869
  /**
34919
34870
  * Indicates whether and how the text value should be automatically capitalized as it is entered/edited by the user.
34920
34871
  * Available options: `"off"`, `"none"`, `"on"`, `"sentences"`, `"words"`, `"characters"`.
@@ -35060,18 +35011,10 @@ class Textarea {
35060
35011
  this.el.click();
35061
35012
  }
35062
35013
  }
35063
- /**
35064
- * Checks if the textarea is in an invalid state based on validation classes
35065
- */
35066
- checkValidationState() {
35067
- return this.el.classList.contains('ion-touched') && this.el.classList.contains('ion-invalid');
35068
- }
35069
35014
  connectedCallback() {
35070
35015
  const { el } = this;
35071
35016
  this.slotMutationController = createSlotMutationController(el, ['label', 'start', 'end'], () => forceUpdate());
35072
35017
  this.notchController = createNotchController(el, () => this.notchSpacerEl, () => this.labelSlot);
35073
- // Always set initial state
35074
- this.isInvalid = this.checkValidationState();
35075
35018
  this.debounceChanged();
35076
35019
  }
35077
35020
  disconnectedCallback() {
@@ -35083,11 +35026,6 @@ class Textarea {
35083
35026
  this.notchController.destroy();
35084
35027
  this.notchController = undefined;
35085
35028
  }
35086
- // Clean up validation observer to prevent memory leaks
35087
- if (this.validationObserver) {
35088
- this.validationObserver.disconnect();
35089
- this.validationObserver = undefined;
35090
- }
35091
35029
  }
35092
35030
  componentWillLoad() {
35093
35031
  this.inheritedAttributes = Object.assign(Object.assign({}, inheritAriaAttributes(this.el)), inheritAttributes$1(this.el, ['data-form-type', 'title', 'tabindex', 'dir']));
@@ -35265,8 +35203,8 @@ class Textarea {
35265
35203
  ];
35266
35204
  }
35267
35205
  getHintTextID() {
35268
- const { isInvalid, helperText, errorText, helperTextId, errorTextId } = this;
35269
- if (isInvalid && errorText) {
35206
+ const { el, helperText, errorText, helperTextId, errorTextId } = this;
35207
+ if (el.classList.contains('ion-touched') && el.classList.contains('ion-invalid') && errorText) {
35270
35208
  return errorTextId;
35271
35209
  }
35272
35210
  if (helperText) {
@@ -35325,7 +35263,7 @@ class Textarea {
35325
35263
  * TODO(FW-5592): Remove hasStartEndSlots condition
35326
35264
  */
35327
35265
  const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || hasStartEndSlots));
35328
- return (hAsync(Host, { key: 'de258335fde7fa934cf3bd58c469525440457468', class: createColorClasses$1(this.color, {
35266
+ return (hAsync(Host, { key: 'd9f2ede0107987fc42c99e310cd2336bad5a5755', class: createColorClasses$1(this.color, {
35329
35267
  [mode]: true,
35330
35268
  'has-value': hasValue,
35331
35269
  'has-focus': hasFocus,
@@ -35334,7 +35272,7 @@ class Textarea {
35334
35272
  [`textarea-shape-${shape}`]: shape !== undefined,
35335
35273
  [`textarea-label-placement-${labelPlacement}`]: true,
35336
35274
  'textarea-disabled': disabled,
35337
- }) }, hAsync("label", { key: '79fc87122871d45316b1c5fd0a467bf85351e804', class: "textarea-wrapper", htmlFor: inputId, onClick: this.onLabelClick }, this.renderLabelContainer(), hAsync("div", { key: '2375888a47557b41ea3b3bf8eae1fd3f2a4032bd', class: "textarea-wrapper-inner" }, hAsync("div", { key: 'c5af683527a870bd85256b6de8a7d216283403dd', class: "start-slot-wrapper" }, hAsync("slot", { key: 'd972e5784403c5cc6ed067ae578ce23ff8303e1e', name: "start" })), hAsync("div", { key: '1092067609d912a76a8679767611e4ca3e071c6f', class: "native-wrapper", ref: (el) => (this.textareaWrapper = el) }, hAsync("textarea", Object.assign({ key: 'cd23a4bad4d5b460830340009d24d0618f14fd73', class: "native-textarea", ref: (el) => (this.nativeInput = el), id: inputId, disabled: disabled, autoCapitalize: this.autocapitalize, autoFocus: this.autofocus, enterKeyHint: this.enterkeyhint, inputMode: this.inputmode, minLength: this.minlength, maxLength: this.maxlength, name: this.name, placeholder: this.placeholder || '', readOnly: this.readonly, required: this.required, spellcheck: this.spellcheck, cols: this.cols, rows: this.rows, wrap: this.wrap, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, onKeyDown: this.onKeyDown, "aria-describedby": this.getHintTextID(), "aria-invalid": this.isInvalid ? 'true' : undefined }, this.inheritedAttributes), value)), hAsync("div", { key: 'c91a5456f4490ef8699f2e44b4a6c64f6084f5fd', class: "end-slot-wrapper" }, hAsync("slot", { key: 'b71ba7ba0d74091e81784432dcffa832b66f3f25', name: "end" }))), shouldRenderHighlight && hAsync("div", { key: '757c3287e1cea5ee851227407685a437f8408c54', class: "textarea-highlight" })), this.renderBottomContent()));
35275
+ }) }, hAsync("label", { key: '9de598b95237462bb3bccffaefe83afbb43554b8', class: "textarea-wrapper", htmlFor: inputId, onClick: this.onLabelClick }, this.renderLabelContainer(), hAsync("div", { key: 'e33c426c6541d723ccc246bb404c03687726ff83', class: "textarea-wrapper-inner" }, hAsync("div", { key: '521e11af9d54d281b0a2b1c25bcfc6f742c18296', class: "start-slot-wrapper" }, hAsync("slot", { key: '515523f6ca3ce0e5dd08f3275c21a190fb1ca177', name: "start" })), hAsync("div", { key: '916e01e00de8400ae00ef06bc1fb62d8be2eee08', class: "native-wrapper", ref: (el) => (this.textareaWrapper = el) }, hAsync("textarea", Object.assign({ key: '810271e6532d90e27dab1fcb26546113c1ce9cb0', class: "native-textarea", ref: (el) => (this.nativeInput = el), id: inputId, disabled: disabled, autoCapitalize: this.autocapitalize, autoFocus: this.autofocus, enterKeyHint: this.enterkeyhint, inputMode: this.inputmode, minLength: this.minlength, maxLength: this.maxlength, name: this.name, placeholder: this.placeholder || '', readOnly: this.readonly, required: this.required, spellcheck: this.spellcheck, cols: this.cols, rows: this.rows, wrap: this.wrap, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, onKeyDown: this.onKeyDown, "aria-describedby": this.getHintTextID(), "aria-invalid": this.getHintTextID() === this.errorTextId }, this.inheritedAttributes), value)), hAsync("div", { key: '80aca9ea9546dca9d38efd291a6b0be384bb6978', class: "end-slot-wrapper" }, hAsync("slot", { key: '407fab16c66a9f4a542369bfecc0d9afa0065977', name: "end" }))), shouldRenderHighlight && hAsync("div", { key: 'f00523a6698fac8a1996e04303487bef01d10f25', class: "textarea-highlight" })), this.renderBottomContent()));
35338
35276
  }
35339
35277
  get el() { return getElement(this); }
35340
35278
  static get watchers() { return {
@@ -35379,7 +35317,6 @@ class Textarea {
35379
35317
  "labelPlacement": [1, "label-placement"],
35380
35318
  "shape": [1],
35381
35319
  "hasFocus": [32],
35382
- "isInvalid": [32],
35383
35320
  "setFocus": [64],
35384
35321
  "getInputElement": [64]
35385
35322
  },