@ionic/core 8.7.4-dev.11756220757.185b8cbf → 8.7.4-dev.11756388042.1a103a79

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 (84) hide show
  1. package/components/ion-datetime.js +4 -3
  2. package/components/ion-input.js +8 -63
  3. package/components/ion-menu.js +5 -2
  4. package/components/ion-textarea.js +7 -62
  5. package/components/overlays.js +18 -109
  6. package/components/picker-column-option.js +3 -3
  7. package/components/picker-column.js +3 -39
  8. package/dist/cjs/index.cjs.js +1 -1
  9. package/dist/cjs/ion-action-sheet.cjs.entry.js +1 -1
  10. package/dist/cjs/ion-alert.cjs.entry.js +1 -1
  11. package/dist/cjs/ion-datetime_3.cjs.entry.js +4 -4
  12. package/dist/cjs/ion-input.cjs.entry.js +8 -62
  13. package/dist/cjs/ion-loading.cjs.entry.js +1 -1
  14. package/dist/cjs/ion-menu_3.cjs.entry.js +6 -3
  15. package/dist/cjs/ion-modal.cjs.entry.js +1 -1
  16. package/dist/cjs/ion-picker-column-option.cjs.entry.js +3 -3
  17. package/dist/cjs/ion-picker-column.cjs.entry.js +3 -39
  18. package/dist/cjs/ion-popover.cjs.entry.js +1 -1
  19. package/dist/cjs/ion-select-modal.cjs.entry.js +1 -1
  20. package/dist/cjs/ion-select_3.cjs.entry.js +1 -1
  21. package/dist/cjs/ion-textarea.cjs.entry.js +7 -61
  22. package/dist/cjs/ion-toast.cjs.entry.js +1 -1
  23. package/dist/cjs/ionic.cjs.js +1 -1
  24. package/dist/cjs/loader.cjs.js +1 -1
  25. package/dist/cjs/{overlays-CglR7j-u.js → overlays-v_jc1Hok.js} +17 -108
  26. package/dist/collection/components/datetime/datetime.js +4 -3
  27. package/dist/collection/components/input/input.js +9 -64
  28. package/dist/collection/components/menu/menu.js +9 -2
  29. package/dist/collection/components/picker-column/picker-column.js +3 -39
  30. package/dist/collection/components/picker-column-option/picker-column-option.ios.css +2 -2
  31. package/dist/collection/components/picker-column-option/picker-column-option.js +1 -1
  32. package/dist/collection/components/picker-column-option/picker-column-option.md.css +2 -2
  33. package/dist/collection/components/textarea/textarea.js +8 -63
  34. package/dist/collection/utils/overlays.js +17 -109
  35. package/dist/docs.json +5 -1
  36. package/dist/esm/index.js +1 -1
  37. package/dist/esm/ion-action-sheet.entry.js +1 -1
  38. package/dist/esm/ion-alert.entry.js +1 -1
  39. package/dist/esm/ion-datetime_3.entry.js +4 -4
  40. package/dist/esm/ion-input.entry.js +8 -62
  41. package/dist/esm/ion-loading.entry.js +1 -1
  42. package/dist/esm/ion-menu_3.entry.js +6 -3
  43. package/dist/esm/ion-modal.entry.js +1 -1
  44. package/dist/esm/ion-picker-column-option.entry.js +3 -3
  45. package/dist/esm/ion-picker-column.entry.js +3 -39
  46. package/dist/esm/ion-popover.entry.js +1 -1
  47. package/dist/esm/ion-select-modal.entry.js +1 -1
  48. package/dist/esm/ion-select_3.entry.js +1 -1
  49. package/dist/esm/ion-textarea.entry.js +7 -61
  50. package/dist/esm/ion-toast.entry.js +1 -1
  51. package/dist/esm/ionic.js +1 -1
  52. package/dist/esm/loader.js +1 -1
  53. package/dist/esm/{overlays-ZX_4-t_r.js → overlays-BJaRj3Rj.js} +18 -109
  54. package/dist/ionic/index.esm.js +1 -1
  55. package/dist/ionic/ionic.esm.js +1 -1
  56. package/dist/ionic/{p-f2884bc2.entry.js → p-095073c6.entry.js} +1 -1
  57. package/dist/ionic/p-1488b7cc.entry.js +4 -0
  58. package/dist/ionic/p-1ab0fc21.entry.js +4 -0
  59. package/dist/ionic/{p-92e8f208.entry.js → p-2060feb1.entry.js} +1 -1
  60. package/dist/ionic/p-22a0f820.entry.js +4 -0
  61. package/dist/ionic/{p-c575e7ce.entry.js → p-5a9be5a3.entry.js} +1 -1
  62. package/dist/ionic/{p-7bac2c5f.entry.js → p-60ff6bf6.entry.js} +1 -1
  63. package/dist/ionic/p-8888efe4.entry.js +4 -0
  64. package/dist/ionic/{p-ab33ef20.entry.js → p-89c2e0a3.entry.js} +1 -1
  65. package/dist/ionic/p-CoDfkBuk.js +4 -0
  66. package/dist/ionic/{p-91d6ccb0.entry.js → p-b17f0554.entry.js} +1 -1
  67. package/dist/ionic/p-b292804d.entry.js +4 -0
  68. package/dist/ionic/p-c5210d3e.entry.js +4 -0
  69. package/dist/ionic/{p-ac434970.entry.js → p-cd93c119.entry.js} +1 -1
  70. package/dist/ionic/p-dc8d0bb9.entry.js +4 -0
  71. package/dist/types/components/input/input.d.ts +0 -9
  72. package/dist/types/components/picker-column/picker-column.d.ts +0 -7
  73. package/dist/types/components/textarea/textarea.d.ts +0 -9
  74. package/hydrate/index.js +46 -248
  75. package/hydrate/index.mjs +46 -248
  76. package/package.json +2 -2
  77. package/dist/ionic/p-0816f67c.entry.js +0 -4
  78. package/dist/ionic/p-1d5b934a.entry.js +0 -4
  79. package/dist/ionic/p-29032e49.entry.js +0 -4
  80. package/dist/ionic/p-8d96a0cd.entry.js +0 -4
  81. package/dist/ionic/p-8e2de06f.entry.js +0 -4
  82. package/dist/ionic/p-982fe1c4.entry.js +0 -4
  83. package/dist/ionic/p-CSwZyt05.js +0 -4
  84. package/dist/ionic/p-f456d176.entry.js +0 -4
package/hydrate/index.js CHANGED
@@ -6161,15 +6161,17 @@ const getPresentedOverlay = (doc, overlayTag, id) => {
6161
6161
  */
6162
6162
  const setRootAriaHidden = (hidden = false) => {
6163
6163
  const root = getAppRoot(document);
6164
- const viewContainer = root.querySelector('ion-router-outlet, ion-nav, #ion-view-container-root');
6164
+ const viewContainer = root.querySelector('ion-router-outlet, #ion-view-container-root');
6165
6165
  if (!viewContainer) {
6166
6166
  return;
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) => {
@@ -6177,6 +6179,17 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
6177
6179
  if (overlay.presented) {
6178
6180
  return;
6179
6181
  }
6182
+ /**
6183
+ * When an overlay that steals focus
6184
+ * is dismissed, focus should be returned
6185
+ * to the element that was focused
6186
+ * prior to the overlay opening. Toast
6187
+ * does not steal focus and is excluded
6188
+ * from returning focus as a result.
6189
+ */
6190
+ if (overlay.el.tagName !== 'ION-TOAST') {
6191
+ restoreElementFocus(overlay.el);
6192
+ }
6180
6193
  /**
6181
6194
  * Due to accessibility guidelines, toasts do not have
6182
6195
  * focus traps.
@@ -6188,8 +6201,6 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
6188
6201
  setRootAriaHidden(true);
6189
6202
  document.body.classList.add(BACKDROP_NO_SCROLL);
6190
6203
  }
6191
- hideUnderlyingOverlaysFromScreenReaders(overlay.el);
6192
- hideAnimatingOverlayFromScreenReaders(overlay.el);
6193
6204
  overlay.presented = true;
6194
6205
  overlay.willPresent.emit();
6195
6206
  (_a = overlay.willPresentShorthand) === null || _a === void 0 ? void 0 : _a.emit();
@@ -6203,17 +6214,6 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
6203
6214
  overlay.didPresent.emit();
6204
6215
  (_b = overlay.didPresentShorthand) === null || _b === void 0 ? void 0 : _b.emit();
6205
6216
  }
6206
- /**
6207
- * When an overlay that steals focus
6208
- * is dismissed, focus should be returned
6209
- * to the element that was focused
6210
- * prior to the overlay opening. Toast
6211
- * does not steal focus and is excluded
6212
- * from returning focus as a result.
6213
- */
6214
- if (overlay.el.tagName !== 'ION-TOAST') {
6215
- restoreElementFocus(overlay.el);
6216
- }
6217
6217
  /**
6218
6218
  * If the focused element is already
6219
6219
  * inside the overlay component then
@@ -6236,6 +6236,7 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
6236
6236
  * screen readers.
6237
6237
  */
6238
6238
  overlay.el.removeAttribute('aria-hidden');
6239
+ overlay.el.removeAttribute('inert');
6239
6240
  };
6240
6241
  /**
6241
6242
  * When an overlay component is dismissed,
@@ -6252,6 +6253,8 @@ const restoreElementFocus = async (overlayEl) => {
6252
6253
  if (!previousElement) {
6253
6254
  return;
6254
6255
  }
6256
+ // Ensure active element is blurred to prevent a11y warning issues
6257
+ previousElement.blur();
6255
6258
  const shadowRoot = previousElement === null || previousElement === void 0 ? void 0 : previousElement.shadowRoot;
6256
6259
  if (shadowRoot) {
6257
6260
  // If there are no inner focusable elements, just focus the host element.
@@ -6315,12 +6318,6 @@ const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnim
6315
6318
  }
6316
6319
  overlay.presented = false;
6317
6320
  try {
6318
- /**
6319
- * There is no need to show the overlay to screen readers during
6320
- * the dismiss animation. This is because the overlay will be removed
6321
- * from the DOM after the animation is complete.
6322
- */
6323
- hideAnimatingOverlayFromScreenReaders(overlay.el);
6324
6321
  // Overlay contents should not be clickable during dismiss
6325
6322
  overlay.el.style.setProperty('pointer-events', 'none');
6326
6323
  overlay.willDismiss.emit({ data, role });
@@ -6359,7 +6356,6 @@ const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnim
6359
6356
  printIonError(`[${overlay.el.tagName.toLowerCase()}] - `, err);
6360
6357
  }
6361
6358
  overlay.el.remove();
6362
- revealOverlaysToScreenReaders();
6363
6359
  return true;
6364
6360
  };
6365
6361
  const getAppRoot = (doc) => {
@@ -6555,93 +6551,6 @@ const createTriggerController = () => {
6555
6551
  removeClickListener,
6556
6552
  };
6557
6553
  };
6558
- /**
6559
- * The overlay that is being animated also needs to hide from screen
6560
- * readers during its animation. This ensures that assistive technologies
6561
- * like TalkBack do not announce or interact with the content until the
6562
- * animation is complete, avoiding confusion for users.
6563
- *
6564
- * When the overlay is presented on an Android device, TalkBack's focus rings
6565
- * may appear in the wrong position due to the transition (specifically
6566
- * `transform` styles). This occurs because the focus rings are initially
6567
- * displayed at the starting position of the elements before the transition
6568
- * begins. This workaround ensures the focus rings do not appear in the
6569
- * incorrect location.
6570
- *
6571
- * If this solution is applied to iOS devices, then it leads to a bug where
6572
- * the overlays cannot be accessed by screen readers. This is due to
6573
- * VoiceOver not being able to update the accessibility tree when the
6574
- * `aria-hidden` is removed.
6575
- *
6576
- * @param overlay - The overlay that is being animated.
6577
- */
6578
- const hideAnimatingOverlayFromScreenReaders = (overlay) => {
6579
- if (doc === undefined)
6580
- return;
6581
- if (isPlatform('android')) {
6582
- /**
6583
- * Once the animation is complete, this attribute will be removed.
6584
- * This is done at the end of the `present` method.
6585
- */
6586
- overlay.setAttribute('aria-hidden', 'true');
6587
- }
6588
- };
6589
- /**
6590
- * Ensure that underlying overlays have aria-hidden if necessary so that screen readers
6591
- * cannot move focus to these elements. Note that we cannot rely on focus/focusin/focusout
6592
- * events here because those events do not fire when the screen readers moves to a non-focusable
6593
- * element such as text.
6594
- * Without this logic screen readers would be able to move focus outside of the top focus-trapped overlay.
6595
- *
6596
- * @param newTopMostOverlay - The overlay that is being presented. Since the overlay has not been
6597
- * fully presented yet at the time this function is called it will not be included in the getPresentedOverlays result.
6598
- */
6599
- const hideUnderlyingOverlaysFromScreenReaders = (newTopMostOverlay) => {
6600
- var _a;
6601
- if (doc === undefined)
6602
- return;
6603
- const overlays = getPresentedOverlays(doc);
6604
- for (let i = overlays.length - 1; i >= 0; i--) {
6605
- const presentedOverlay = overlays[i];
6606
- const nextPresentedOverlay = (_a = overlays[i + 1]) !== null && _a !== void 0 ? _a : newTopMostOverlay;
6607
- /**
6608
- * If next overlay has aria-hidden then all remaining overlays will have it too.
6609
- * Or, if the next overlay is a Toast that does not have aria-hidden then current overlay
6610
- * should not have aria-hidden either so focus can remain in the current overlay.
6611
- */
6612
- if (nextPresentedOverlay.hasAttribute('aria-hidden') || nextPresentedOverlay.tagName !== 'ION-TOAST') {
6613
- presentedOverlay.setAttribute('aria-hidden', 'true');
6614
- }
6615
- }
6616
- };
6617
- /**
6618
- * When dismissing an overlay we need to reveal the new top-most overlay to screen readers.
6619
- * If the top-most overlay is a Toast we potentially need to reveal more overlays since
6620
- * focus is never automatically moved to the Toast.
6621
- */
6622
- const revealOverlaysToScreenReaders = () => {
6623
- if (doc === undefined)
6624
- return;
6625
- const overlays = getPresentedOverlays(doc);
6626
- for (let i = overlays.length - 1; i >= 0; i--) {
6627
- const currentOverlay = overlays[i];
6628
- /**
6629
- * If the current we are looking at is a Toast then we can remove aria-hidden.
6630
- * However, we potentially need to keep looking at the overlay stack because there
6631
- * could be more Toasts underneath. Additionally, we need to unhide the closest non-Toast
6632
- * overlay too so focus can move there since focus is never automatically moved to the Toast.
6633
- */
6634
- currentOverlay.removeAttribute('aria-hidden');
6635
- /**
6636
- * If we found a non-Toast element then we can just remove aria-hidden and stop searching entirely
6637
- * since this overlay should always receive focus. As a result, all underlying overlays should still
6638
- * be hidden from screen readers.
6639
- */
6640
- if (currentOverlay.tagName !== 'ION-TOAST') {
6641
- break;
6642
- }
6643
- }
6644
- };
6645
6554
  const FOCUS_TRAP_DISABLE_CLASS = 'ion-disable-focus-trap';
6646
6555
 
6647
6556
  const hostContext = (selector, el) => {
@@ -13531,7 +13440,7 @@ class Datetime {
13531
13440
  const renderArray = forcePresentation === 'time-date'
13532
13441
  ? [this.renderTimePickerColumns(forcePresentation), this.renderDatePickerColumns(forcePresentation)]
13533
13442
  : [this.renderDatePickerColumns(forcePresentation), this.renderTimePickerColumns(forcePresentation)];
13534
- return hAsync("ion-picker", null, renderArray);
13443
+ return hAsync("ion-picker", { class: FOCUS_TRAP_DISABLE_CLASS }, renderArray);
13535
13444
  }
13536
13445
  renderDatePickerColumns(forcePresentation) {
13537
13446
  return forcePresentation === 'date-time' || forcePresentation === 'time-date'
@@ -14088,7 +13997,7 @@ class Datetime {
14088
13997
  const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
14089
13998
  const hasWheelVariant = hasDatePresentation && preferWheel;
14090
13999
  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, {
14000
+ return (hAsync(Host, { key: '57492534800ea059a7c2bbd9f0059cc0b75ae8d2', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: Object.assign({}, createColorClasses$1(color, {
14092
14001
  [mode]: true,
14093
14002
  ['datetime-readonly']: readonly,
14094
14003
  ['datetime-disabled']: disabled,
@@ -14098,7 +14007,7 @@ class Datetime {
14098
14007
  [`datetime-size-${size}`]: true,
14099
14008
  [`datetime-prefer-wheel`]: hasWheelVariant,
14100
14009
  [`datetime-grid`]: isGridStyle,
14101
- })) }, hAsync("div", { key: '859e9354a12bfa58ac3f964c2e66839f17071c00', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
14010
+ })) }, hAsync("div", { key: '97dac5e5195635ac0bc5fb472b9d09e5c3c6bbc3', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
14102
14011
  }
14103
14012
  get el() { return getElement(this); }
14104
14013
  static get watchers() { return {
@@ -16629,10 +16538,6 @@ class Input {
16629
16538
  * is applied in both cases.
16630
16539
  */
16631
16540
  this.hasFocus = false;
16632
- /**
16633
- * Track validation state for proper aria-live announcements
16634
- */
16635
- this.isInvalid = false;
16636
16541
  /**
16637
16542
  * Indicates whether and how the text value should be automatically capitalized as it is entered/edited by the user.
16638
16543
  * Available options: `"off"`, `"none"`, `"on"`, `"sentences"`, `"words"`, `"characters"`.
@@ -16718,18 +16623,6 @@ class Input {
16718
16623
  }
16719
16624
  this.didInputClearOnEdit = false;
16720
16625
  this.ionBlur.emit(ev);
16721
- /**
16722
- * Check validation state after blur to handle framework-managed classes.
16723
- * Frameworks like Angular update classes asynchronously, often using
16724
- * requestAnimationFrame or promises. Using setTimeout ensures we check
16725
- * after all microtasks and animation frames have completed.
16726
- */
16727
- setTimeout(() => {
16728
- const newIsInvalid = this.checkValidationState();
16729
- if (this.isInvalid !== newIsInvalid) {
16730
- this.isInvalid = newIsInvalid;
16731
- }
16732
- }, 100);
16733
16626
  };
16734
16627
  this.onFocus = (ev) => {
16735
16628
  this.hasFocus = true;
@@ -16828,27 +16721,10 @@ class Input {
16828
16721
  componentWillLoad() {
16829
16722
  this.inheritedAttributes = Object.assign(Object.assign({}, inheritAriaAttributes(this.el)), inheritAttributes$1(this.el, ['tabindex', 'title', 'data-form-type', 'dir']));
16830
16723
  }
16831
- /**
16832
- * Checks if the input is in an invalid state based on validation classes
16833
- */
16834
- checkValidationState() {
16835
- // Check for both Ionic and Angular validation classes on the element itself
16836
- // Angular applies ng-touched/ng-invalid directly to the host element with ngModel
16837
- const hasIonTouched = this.el.classList.contains('ion-touched');
16838
- const hasIonInvalid = this.el.classList.contains('ion-invalid');
16839
- const hasNgTouched = this.el.classList.contains('ng-touched');
16840
- const hasNgInvalid = this.el.classList.contains('ng-invalid');
16841
- // Return true if we have both touched and invalid states from either framework
16842
- const isTouched = hasIonTouched || hasNgTouched;
16843
- const isInvalid = hasIonInvalid || hasNgInvalid;
16844
- return isTouched && isInvalid;
16845
- }
16846
16724
  connectedCallback() {
16847
16725
  const { el } = this;
16848
16726
  this.slotMutationController = createSlotMutationController(el, ['label', 'start', 'end'], () => forceUpdate());
16849
16727
  this.notchController = createNotchController(el, () => this.notchSpacerEl, () => this.labelSlot);
16850
- // Always set initial state
16851
- this.isInvalid = this.checkValidationState();
16852
16728
  this.debounceChanged();
16853
16729
  }
16854
16730
  componentDidLoad() {
@@ -16875,11 +16751,6 @@ class Input {
16875
16751
  this.notchController.destroy();
16876
16752
  this.notchController = undefined;
16877
16753
  }
16878
- // Clean up validation observer to prevent memory leaks
16879
- if (this.validationObserver) {
16880
- this.validationObserver.disconnect();
16881
- this.validationObserver = undefined;
16882
- }
16883
16754
  }
16884
16755
  /**
16885
16756
  * Sets focus on the native `input` in `ion-input`. Use this method instead of the global
@@ -16981,15 +16852,15 @@ class Input {
16981
16852
  * Renders the helper text or error text values
16982
16853
  */
16983
16854
  renderHintText() {
16984
- const { helperText, errorText, helperTextId, errorTextId, isInvalid } = this;
16855
+ const { helperText, errorText, helperTextId, errorTextId } = this;
16985
16856
  return [
16986
- hAsync("div", { id: helperTextId, class: "helper-text", "aria-live": "polite" }, !isInvalid ? helperText : null),
16987
- hAsync("div", { id: errorTextId, class: "error-text", role: "alert" }, isInvalid ? errorText : null),
16857
+ hAsync("div", { id: helperTextId, class: "helper-text" }, helperText),
16858
+ hAsync("div", { id: errorTextId, class: "error-text" }, errorText),
16988
16859
  ];
16989
16860
  }
16990
16861
  getHintTextID() {
16991
- const { isInvalid, helperText, errorText, helperTextId, errorTextId } = this;
16992
- if (isInvalid && errorText) {
16862
+ const { el, helperText, errorText, helperTextId, errorTextId } = this;
16863
+ if (el.classList.contains('ion-touched') && el.classList.contains('ion-invalid') && errorText) {
16993
16864
  return errorTextId;
16994
16865
  }
16995
16866
  if (helperText) {
@@ -17102,7 +16973,7 @@ class Input {
17102
16973
  * TODO(FW-5592): Remove hasStartEndSlots condition
17103
16974
  */
17104
16975
  const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || hasStartEndSlots));
17105
- return (hAsync(Host, { key: '7b7a7ffdf1b3528b2d6dff693beea2ae7553fd8c', class: createColorClasses$1(this.color, {
16976
+ return (hAsync(Host, { key: '41b2526627e7d2773a80f011b123284203a71ca0', class: createColorClasses$1(this.color, {
17106
16977
  [mode]: true,
17107
16978
  'has-value': hasValue,
17108
16979
  'has-focus': hasFocus,
@@ -17113,14 +16984,14 @@ class Input {
17113
16984
  'in-item': inItem,
17114
16985
  'in-item-color': hostContext('ion-item.ion-color', this.el),
17115
16986
  'input-disabled': disabled,
17116
- }) }, hAsync("label", { key: 'd8c75416ad9cc7623bcc68acd718cc1f71b56a31', class: "input-wrapper", htmlFor: inputId, onClick: this.onLabelClick }, this.renderLabelContainer(), hAsync("div", { key: 'cfd382a5aa284e8248c6c4eb658ee3a97df73fdf', class: "native-wrapper", onClick: this.onLabelClick }, hAsync("slot", { key: '03237fe5befc1c6f6f54a751613a8f8cdee0106b', name: "start" }), hAsync("input", Object.assign({ key: 'cfb1a1fa653e9b6c91702f134adbef42568feab1', 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: '446a5575018472bb2d916ce301c7faa92f7e0ffc', "aria-label": "reset", type: "button", class: "input-clear-icon", onPointerDown: (ev) => {
16987
+ }) }, 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) => {
17117
16988
  /**
17118
16989
  * This prevents mobile browsers from
17119
16990
  * blurring the input when the clear
17120
16991
  * button is activated.
17121
16992
  */
17122
16993
  ev.preventDefault();
17123
- }, onClick: this.clearTextInput }, hAsync("ion-icon", { key: '2c3e12a424cba56b03eb0f0c2d1dca58ba1c81a8', "aria-hidden": "true", icon: clearIconData }))), hAsync("slot", { key: '5c01c0549264f08ac05bbca6caba7597bb435c9c', name: "end" })), shouldRenderHighlight && hAsync("div", { key: '3f26a10f86971a1e07ca7a9cb2b53989b51e0bca', class: "input-highlight" })), this.renderBottomContent()));
16994
+ }, 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()));
17124
16995
  }
17125
16996
  get el() { return getElement(this); }
17126
16997
  static get watchers() { return {
@@ -17172,7 +17043,6 @@ class Input {
17172
17043
  "type": [1],
17173
17044
  "value": [1032],
17174
17045
  "hasFocus": [32],
17175
- "isInvalid": [32],
17176
17046
  "setFocus": [64],
17177
17047
  "getInputElement": [64]
17178
17048
  },
@@ -20048,6 +19918,9 @@ class Menu {
20048
19918
  * @param role The role of the element that is closing the menu.
20049
19919
  */
20050
19920
  setOpen(shouldOpen, animated = true, role) {
19921
+ var _a;
19922
+ // Blur the active element to prevent it from being kept focused inside an element that will be set with aria-hidden="true"
19923
+ (_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.blur();
20051
19924
  return menuController._setOpen(this, shouldOpen, animated, role);
20052
19925
  }
20053
19926
  trapKeyboardFocus(ev, doc) {
@@ -20410,14 +20283,14 @@ class Menu {
20410
20283
  * the ionBackButton listener in the menu controller
20411
20284
  * will handle closing the menu when Escape is pressed.
20412
20285
  */
20413
- return (hAsync(Host, { key: 'a5c75aa40a34530b56ee3b98d706a5ac5ae300de', onKeyDown: shouldUseCloseWatcher() ? null : this.onKeydown, role: "navigation", "aria-label": inheritedAttributes['aria-label'] || 'menu', class: {
20286
+ return (hAsync(Host, { key: '70a427f3414a476414c3386efe6c8723fd37eccf', onKeyDown: shouldUseCloseWatcher() ? null : this.onKeydown, role: "navigation", "aria-label": inheritedAttributes['aria-label'] || 'menu', class: {
20414
20287
  [mode]: true,
20415
20288
  [`menu-type-${type}`]: true,
20416
20289
  'menu-enabled': !disabled,
20417
20290
  [`menu-side-${side}`]: true,
20418
20291
  'menu-pane-visible': isPaneVisible,
20419
20292
  'split-pane-side': hostContext('ion-split-pane', el),
20420
- } }, hAsync("div", { key: '3f5f70acd4d3ed6bb445122f4f01d73db738a75f', class: "menu-inner", part: "container", ref: (el) => (this.menuInnerEl = el) }, hAsync("slot", { key: '3161326c9330e7f7441299c428b87a91b31a83e9' })), hAsync("ion-backdrop", { key: '917b50f38489bdf03d0c642af8b4e4e172c7dc4c', ref: (el) => (this.backdropEl = el), class: "menu-backdrop", tappable: false, stopPropagation: false, part: "backdrop" })));
20293
+ } }, hAsync("div", { key: '83af04e5a47d5a92caafaf06088a7114ae61984b', class: "menu-inner", part: "container", ref: (el) => (this.menuInnerEl = el) }, hAsync("slot", { key: '7b35048642864bd0f30de9f6b61c949c1b601692' })), hAsync("ion-backdrop", { key: '347af516c7970d80dd11c6d1ed61e9a040ceb5fb', ref: (el) => (this.backdropEl = el), class: "menu-backdrop", tappable: false, stopPropagation: false, part: "backdrop" })));
20421
20294
  }
20422
20295
  get el() { return getElement(this); }
20423
20296
  static get watchers() { return {
@@ -25543,23 +25416,6 @@ class PickerColumn {
25543
25416
  var _a;
25544
25417
  return el ? (_a = el.getAttribute('aria-label')) !== null && _a !== void 0 ? _a : el.innerText : '';
25545
25418
  };
25546
- /**
25547
- * Render an element that overlays the column. This element is for assistive
25548
- * tech to allow users to navigate the column up/down. This element should receive
25549
- * focus as it listens for synthesized keyboard events as required by the
25550
- * slider role: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/slider_role
25551
- */
25552
- this.renderAssistiveFocusable = () => {
25553
- const { activeItem } = this;
25554
- const valueText = this.getOptionValueText(activeItem);
25555
- /**
25556
- * When using the picker, the valuetext provides important context that valuenow
25557
- * does not. Additionally, using non-zero valuemin/valuemax values can cause
25558
- * WebKit to incorrectly announce numeric valuetext values (such as a year
25559
- * like "2024") as percentages: https://bugs.webkit.org/show_bug.cgi?id=273126
25560
- */
25561
- 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) }));
25562
- };
25563
25419
  }
25564
25420
  ariaLabelChanged(newValue) {
25565
25421
  this.ariaLabel = newValue;
@@ -25700,33 +25556,14 @@ class PickerColumn {
25700
25556
  render() {
25701
25557
  const { color, disabled, isActive, numericInput } = this;
25702
25558
  const mode = getIonMode$1(this);
25703
- return (hAsync(Host, { key: 'ea0280355b2f87895bf7dddd289ccf473aa759f3', class: createColorClasses$1(color, {
25559
+ return (hAsync(Host, { key: 'db903fd415f8a2d91994dececca481c1af8ba6a9', class: createColorClasses$1(color, {
25704
25560
  [mode]: true,
25705
25561
  ['picker-column-active']: isActive,
25706
25562
  ['picker-column-numeric-input']: numericInput,
25707
25563
  ['picker-column-disabled']: disabled,
25708
- }) }, this.renderAssistiveFocusable(), hAsync("slot", { key: '482992131cdeb85b1f61430d7fe1322a16345769', name: "prefix" }), hAsync("div", { key: '43f7f80d621d411ef366b3ca1396299e8c9a0c97', "aria-hidden": "true", class: "picker-opts", ref: (el) => {
25564
+ }) }, hAsync("slot", { key: '02ce9e1dd7df91afcd50b06416552bcffb5dec98', name: "prefix" }), hAsync("div", { key: '6dfd7d2429bec19244a6b1afb4448121963a031b', class: "picker-opts", ref: (el) => {
25709
25565
  this.scrollEl = el;
25710
- },
25711
- /**
25712
- * When an element has an overlay scroll style and
25713
- * a fixed height, Firefox will focus the scrollable
25714
- * container if the content exceeds the container's
25715
- * dimensions.
25716
- *
25717
- * This causes keyboard navigation to focus to this
25718
- * element instead of going to the next element in
25719
- * the tab order.
25720
- *
25721
- * The desired behavior is for the user to be able to
25722
- * focus the assistive focusable element and tab to
25723
- * the next element in the tab order. Instead of tabbing
25724
- * to this element.
25725
- *
25726
- * To prevent this, we set the tabIndex to -1. This
25727
- * will match the behavior of the other browsers.
25728
- */
25729
- 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" })));
25566
+ }, 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" })));
25730
25567
  }
25731
25568
  get el() { return getElement(this); }
25732
25569
  static get watchers() { return {
@@ -26118,9 +25955,9 @@ const DECELERATION_FRICTION = 0.97;
26118
25955
  const MAX_PICKER_SPEED = 90;
26119
25956
  const TRANSITION_DURATION = 150;
26120
25957
 
26121
- 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}";
25958
+ 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}";
26122
25959
 
26123
- 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)}";
25960
+ 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)}";
26124
25961
 
26125
25962
  class PickerColumnOption {
26126
25963
  constructor(hostRef) {
@@ -26212,7 +26049,7 @@ class PickerColumnOption {
26212
26049
  return (hAsync(Host, { key: 'f816729941aabcb31ddfdce3ffe2e2139030d715', class: createColorClasses$1(color, {
26213
26050
  [mode]: true,
26214
26051
  ['option-disabled']: disabled,
26215
- }) }, hAsync("button", { key: '48dff7833bb60fc8331cd353a0885e6affa683d1', tabindex: "-1", "aria-label": ariaLabel, disabled: disabled, onClick: () => this.onClick() }, hAsync("slot", { key: 'f9224d0e7b7aa6c05b29abfdcfe0f30ad6ee3141' }))));
26052
+ }) }, hAsync("div", { key: 'd942de84fd14d7dc06b1e5cf4f7920d1dc3c6371', class: 'picker-column-option-button', role: "button", "aria-label": ariaLabel, onClick: () => this.onClick() }, hAsync("slot", { key: 'b0df5717b42209e649097209a01476e1a66f5c5c' }))));
26216
26053
  }
26217
26054
  get el() { return getElement(this); }
26218
26055
  static get watchers() { return {
@@ -34932,10 +34769,6 @@ class Textarea {
34932
34769
  * is applied in both cases.
34933
34770
  */
34934
34771
  this.hasFocus = false;
34935
- /**
34936
- * Track validation state for proper aria-live announcements
34937
- */
34938
- this.isInvalid = false;
34939
34772
  /**
34940
34773
  * Indicates whether and how the text value should be automatically capitalized as it is entered/edited by the user.
34941
34774
  * Available options: `"off"`, `"none"`, `"on"`, `"sentences"`, `"words"`, `"characters"`.
@@ -35025,18 +34858,6 @@ class Textarea {
35025
34858
  }
35026
34859
  this.didTextareaClearOnEdit = false;
35027
34860
  this.ionBlur.emit(ev);
35028
- /**
35029
- * Check validation state after blur to handle framework-managed classes.
35030
- * Frameworks like Angular update classes asynchronously, often using
35031
- * requestAnimationFrame or promises. Using setTimeout ensures we check
35032
- * after all microtasks and animation frames have completed.
35033
- */
35034
- setTimeout(() => {
35035
- const newIsInvalid = this.checkValidationState();
35036
- if (this.isInvalid !== newIsInvalid) {
35037
- this.isInvalid = newIsInvalid;
35038
- }
35039
- }, 100);
35040
34861
  };
35041
34862
  this.onKeyDown = (ev) => {
35042
34863
  this.checkClearOnEdit(ev);
@@ -35093,27 +34914,10 @@ class Textarea {
35093
34914
  this.el.click();
35094
34915
  }
35095
34916
  }
35096
- /**
35097
- * Checks if the textarea is in an invalid state based on validation classes
35098
- */
35099
- checkValidationState() {
35100
- // Check for both Ionic and Angular validation classes on the element itself
35101
- // Angular applies ng-touched/ng-invalid directly to the host element with ngModel
35102
- const hasIonTouched = this.el.classList.contains('ion-touched');
35103
- const hasIonInvalid = this.el.classList.contains('ion-invalid');
35104
- const hasNgTouched = this.el.classList.contains('ng-touched');
35105
- const hasNgInvalid = this.el.classList.contains('ng-invalid');
35106
- // Return true if we have both touched and invalid states from either framework
35107
- const isTouched = hasIonTouched || hasNgTouched;
35108
- const isInvalid = hasIonInvalid || hasNgInvalid;
35109
- return isTouched && isInvalid;
35110
- }
35111
34917
  connectedCallback() {
35112
34918
  const { el } = this;
35113
34919
  this.slotMutationController = createSlotMutationController(el, ['label', 'start', 'end'], () => forceUpdate());
35114
34920
  this.notchController = createNotchController(el, () => this.notchSpacerEl, () => this.labelSlot);
35115
- // Always set initial state
35116
- this.isInvalid = this.checkValidationState();
35117
34921
  this.debounceChanged();
35118
34922
  }
35119
34923
  disconnectedCallback() {
@@ -35125,11 +34929,6 @@ class Textarea {
35125
34929
  this.notchController.destroy();
35126
34930
  this.notchController = undefined;
35127
34931
  }
35128
- // Clean up validation observer to prevent memory leaks
35129
- if (this.validationObserver) {
35130
- this.validationObserver.disconnect();
35131
- this.validationObserver = undefined;
35132
- }
35133
34932
  }
35134
34933
  componentWillLoad() {
35135
34934
  this.inheritedAttributes = Object.assign(Object.assign({}, inheritAriaAttributes(this.el)), inheritAttributes$1(this.el, ['data-form-type', 'title', 'tabindex', 'dir']));
@@ -35300,15 +35099,15 @@ class Textarea {
35300
35099
  * Renders the helper text or error text values
35301
35100
  */
35302
35101
  renderHintText() {
35303
- const { helperText, errorText, helperTextId, errorTextId, isInvalid } = this;
35102
+ const { helperText, errorText, helperTextId, errorTextId } = this;
35304
35103
  return [
35305
- hAsync("div", { id: helperTextId, class: "helper-text", "aria-live": "polite" }, !isInvalid ? helperText : null),
35306
- hAsync("div", { id: errorTextId, class: "error-text", role: "alert" }, isInvalid ? errorText : null),
35104
+ hAsync("div", { id: helperTextId, class: "helper-text" }, helperText),
35105
+ hAsync("div", { id: errorTextId, class: "error-text" }, errorText),
35307
35106
  ];
35308
35107
  }
35309
35108
  getHintTextID() {
35310
- const { isInvalid, helperText, errorText, helperTextId, errorTextId } = this;
35311
- if (isInvalid && errorText) {
35109
+ const { el, helperText, errorText, helperTextId, errorTextId } = this;
35110
+ if (el.classList.contains('ion-touched') && el.classList.contains('ion-invalid') && errorText) {
35312
35111
  return errorTextId;
35313
35112
  }
35314
35113
  if (helperText) {
@@ -35367,7 +35166,7 @@ class Textarea {
35367
35166
  * TODO(FW-5592): Remove hasStartEndSlots condition
35368
35167
  */
35369
35168
  const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || hasStartEndSlots));
35370
- return (hAsync(Host, { key: 'e7e09574df34c1b51b97b3ed89c2af2747c32308', class: createColorClasses$1(this.color, {
35169
+ return (hAsync(Host, { key: 'd9f2ede0107987fc42c99e310cd2336bad5a5755', class: createColorClasses$1(this.color, {
35371
35170
  [mode]: true,
35372
35171
  'has-value': hasValue,
35373
35172
  'has-focus': hasFocus,
@@ -35376,7 +35175,7 @@ class Textarea {
35376
35175
  [`textarea-shape-${shape}`]: shape !== undefined,
35377
35176
  [`textarea-label-placement-${labelPlacement}`]: true,
35378
35177
  'textarea-disabled': disabled,
35379
- }) }, hAsync("label", { key: '8a8809ea9b9b39241adc38fbb0cdb23048f35eea', class: "textarea-wrapper", htmlFor: inputId, onClick: this.onLabelClick }, this.renderLabelContainer(), hAsync("div", { key: '206f75a83d3177c9de4ba22ca5e826406c989de6', class: "textarea-wrapper-inner" }, hAsync("div", { key: '43bca68664d9abe3e397bd27cd4439fa8d4311db', class: "start-slot-wrapper" }, hAsync("slot", { key: 'f1eb97f407bdb000431f736243650f38858046f8', name: "start" })), hAsync("div", { key: '788d344ef9be934a1e83e29216cf23bede42f160', class: "native-wrapper", ref: (el) => (this.textareaWrapper = el) }, hAsync("textarea", Object.assign({ key: '5ef713d4781f7c49e2f66002ae0d9feb69b3bddb', 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: '775d7866f86709904d0a57fc47e9ba94e5b052e9', class: "end-slot-wrapper" }, hAsync("slot", { key: 'cdb98adb014a3bf02579a729c33d8ee18731f692', name: "end" }))), shouldRenderHighlight && hAsync("div", { key: '4c319ec9615a125b3cef774c73f55a23a938d6d9', class: "textarea-highlight" })), this.renderBottomContent()));
35178
+ }) }, 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()));
35380
35179
  }
35381
35180
  get el() { return getElement(this); }
35382
35181
  static get watchers() { return {
@@ -35421,7 +35220,6 @@ class Textarea {
35421
35220
  "labelPlacement": [1, "label-placement"],
35422
35221
  "shape": [1],
35423
35222
  "hasFocus": [32],
35424
- "isInvalid": [32],
35425
35223
  "setFocus": [64],
35426
35224
  "getInputElement": [64]
35427
35225
  },