@ionic/core 8.4.1-dev.11732305980.19d90e1c → 8.4.1-dev.11732646949.1aaebad5

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 (87) hide show
  1. package/components/focus-visible.js +2 -0
  2. package/components/ion-menu.js +3 -30
  3. package/components/overlays.js +5 -6
  4. package/dist/cjs/{focus-visible-7a0ce04f.js → focus-visible-2578eb30.js} +2 -0
  5. package/dist/cjs/index.cjs.js +1 -1
  6. package/dist/cjs/ion-action-sheet.cjs.entry.js +1 -1
  7. package/dist/cjs/ion-alert.cjs.entry.js +1 -1
  8. package/dist/cjs/ion-app_8.cjs.entry.js +1 -1
  9. package/dist/cjs/ion-datetime_3.cjs.entry.js +2 -2
  10. package/dist/cjs/ion-loading.cjs.entry.js +1 -1
  11. package/dist/cjs/ion-menu_3.cjs.entry.js +4 -31
  12. package/dist/cjs/ion-modal.cjs.entry.js +1 -1
  13. package/dist/cjs/ion-popover.cjs.entry.js +1 -1
  14. package/dist/cjs/ion-select-modal.cjs.entry.js +1 -1
  15. package/dist/cjs/ion-select_3.cjs.entry.js +1 -1
  16. package/dist/cjs/ion-toast.cjs.entry.js +1 -1
  17. package/dist/cjs/{overlays-aa669eb8.js → overlays-a6b4fa63.js} +5 -6
  18. package/dist/collection/components/menu/menu.js +2 -30
  19. package/dist/collection/utils/focus-visible.js +2 -0
  20. package/dist/collection/utils/overlays.js +5 -6
  21. package/dist/docs.json +1 -1
  22. package/dist/esm/{focus-visible-dd40d69f.js → focus-visible-ab389174.js} +2 -0
  23. package/dist/esm/index.js +1 -1
  24. package/dist/esm/ion-action-sheet.entry.js +1 -1
  25. package/dist/esm/ion-alert.entry.js +1 -1
  26. package/dist/esm/ion-app_8.entry.js +1 -1
  27. package/dist/esm/ion-datetime_3.entry.js +2 -2
  28. package/dist/esm/ion-loading.entry.js +1 -1
  29. package/dist/esm/ion-menu_3.entry.js +4 -31
  30. package/dist/esm/ion-modal.entry.js +1 -1
  31. package/dist/esm/ion-popover.entry.js +1 -1
  32. package/dist/esm/ion-select-modal.entry.js +1 -1
  33. package/dist/esm/ion-select_3.entry.js +1 -1
  34. package/dist/esm/ion-toast.entry.js +1 -1
  35. package/dist/esm/{overlays-e7b9d6d9.js → overlays-dcc93658.js} +5 -6
  36. package/dist/esm-es5/focus-visible-ab389174.js +4 -0
  37. package/dist/esm-es5/index.js +1 -1
  38. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  39. package/dist/esm-es5/ion-alert.entry.js +1 -1
  40. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  41. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  42. package/dist/esm-es5/ion-loading.entry.js +1 -1
  43. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  44. package/dist/esm-es5/ion-modal.entry.js +1 -1
  45. package/dist/esm-es5/ion-popover.entry.js +1 -1
  46. package/dist/esm-es5/ion-select-modal.entry.js +1 -1
  47. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  48. package/dist/esm-es5/ion-toast.entry.js +1 -1
  49. package/dist/ionic/index.esm.js +1 -1
  50. package/dist/ionic/ionic.esm.js +1 -1
  51. package/dist/ionic/p-05efd326.system.js +4 -0
  52. package/dist/ionic/{p-9e33104d.entry.js → p-0af1adf2.entry.js} +1 -1
  53. package/dist/ionic/{p-b2272f51.system.entry.js → p-0cccca18.system.entry.js} +1 -1
  54. package/dist/ionic/{p-2b9b78c7.entry.js → p-0ce9d0a6.entry.js} +1 -1
  55. package/dist/ionic/{p-1fe02220.system.entry.js → p-14f084bc.system.entry.js} +1 -1
  56. package/dist/ionic/{p-e85d901b.system.entry.js → p-20e70007.system.entry.js} +1 -1
  57. package/dist/ionic/{p-ddaa748a.system.entry.js → p-2b65e30a.system.entry.js} +1 -1
  58. package/dist/ionic/p-322c5fb4.system.js +1 -1
  59. package/dist/ionic/p-33df3f1f.entry.js +4 -0
  60. package/dist/ionic/{p-982315a6.entry.js → p-33fa7400.entry.js} +1 -1
  61. package/dist/ionic/{p-14e159ea.system.entry.js → p-3974e3c3.system.entry.js} +1 -1
  62. package/dist/ionic/{p-e4f69534.system.entry.js → p-3b13af78.system.entry.js} +1 -1
  63. package/dist/ionic/{p-b79ba17c.entry.js → p-3c186721.entry.js} +1 -1
  64. package/dist/ionic/p-475d32bd.system.entry.js +4 -0
  65. package/dist/ionic/{p-a43467d8.entry.js → p-5dcd3d43.entry.js} +1 -1
  66. package/dist/ionic/{p-fec61c32.entry.js → p-5e074501.entry.js} +1 -1
  67. package/dist/ionic/{p-626fd66d.system.entry.js → p-63ad99b8.system.entry.js} +1 -1
  68. package/dist/ionic/{p-6b280620.entry.js → p-73747722.entry.js} +1 -1
  69. package/dist/ionic/{p-2bd0ae94.system.entry.js → p-7e3faa44.system.entry.js} +2 -2
  70. package/dist/ionic/{p-8b8be2fd.entry.js → p-9318ed44.entry.js} +1 -1
  71. package/dist/ionic/{p-c449820c.system.js → p-a696e441.system.js} +1 -1
  72. package/dist/ionic/{p-19a5be0a.entry.js → p-bbae699e.entry.js} +1 -1
  73. package/dist/ionic/{p-6499df44.system.entry.js → p-c7c0c9d2.system.entry.js} +1 -1
  74. package/dist/ionic/{p-1046866e.system.entry.js → p-cd8bd2e1.system.entry.js} +1 -1
  75. package/dist/ionic/{p-942b5e13.entry.js → p-de5ed31e.entry.js} +1 -1
  76. package/dist/ionic/p-f4f05cb7.js +4 -0
  77. package/hydrate/index.js +9 -35
  78. package/hydrate/index.mjs +9 -35
  79. package/package.json +1 -1
  80. package/dist/esm-es5/focus-visible-dd40d69f.js +0 -4
  81. package/dist/ionic/p-12a722b8.system.entry.js +0 -4
  82. package/dist/ionic/p-508d024a.entry.js +0 -4
  83. package/dist/ionic/p-c468af8a.system.js +0 -4
  84. package/dist/ionic/p-d47265c8.js +0 -4
  85. /package/dist/esm-es5/{overlays-e7b9d6d9.js → overlays-dcc93658.js} +0 -0
  86. /package/dist/ionic/{p-0aa833fb.system.js → p-5e01fc7f.system.js} +0 -0
  87. /package/dist/ionic/{p-e6635685.js → p-96573065.js} +0 -0
@@ -16,6 +16,7 @@ const FOCUS_KEYS = [
16
16
  'ArrowUp',
17
17
  'Home',
18
18
  'End',
19
+ 'Meta',
19
20
  ];
20
21
  const startFocusVisible = (rootEl) => {
21
22
  let currentFocus = [];
@@ -48,6 +49,7 @@ const startFocusVisible = (rootEl) => {
48
49
  });
49
50
  setFocus(toFocus);
50
51
  }
52
+ keyboardMode = true;
51
53
  };
52
54
  const onFocusout = () => {
53
55
  if (ref.activeElement === root) {
@@ -8,8 +8,8 @@ import { G as GESTURE_CONTROLLER } from './gesture-controller.js';
8
8
  import { shouldUseCloseWatcher } from './hardware-back-button.js';
9
9
  import { m as isEndSide, i as inheritAriaAttributes, n as assert, k as clamp } from './helpers.js';
10
10
  import { m as menuController } from './index4.js';
11
- import { c as config, b as getIonMode, a as isPlatform } from './ionic-global.js';
12
11
  import { h as hostContext } from './theme.js';
12
+ import { c as config, b as getIonMode } from './ionic-global.js';
13
13
  import { d as defineCustomElement$2 } from './backdrop.js';
14
14
 
15
15
  const menuIosCss = ":host{--width:304px;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--background:var(--ion-background-color, #fff);left:0;right:0;top:0;bottom:0;display:none;position:absolute;contain:strict}:host(.show-menu){display:block}.menu-inner{-webkit-transform:translateX(-9999px);transform:translateX(-9999px);display:-ms-flexbox;display:flex;position:absolute;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:justify;justify-content:space-between;width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);background:var(--background);contain:strict}:host(.menu-side-start) .menu-inner{--ion-safe-area-right:0px;top:0;bottom:0}:host(.menu-side-start) .menu-inner{inset-inline-start:0;inset-inline-end:auto}:host-context([dir=rtl]):host(.menu-side-start) .menu-inner,:host-context([dir=rtl]).menu-side-start .menu-inner{--ion-safe-area-right:unset;--ion-safe-area-left:0px}@supports selector(:dir(rtl)){:host(.menu-side-start:dir(rtl)) .menu-inner{--ion-safe-area-right:unset;--ion-safe-area-left:0px}}:host(.menu-side-end) .menu-inner{--ion-safe-area-left:0px;top:0;bottom:0}:host(.menu-side-end) .menu-inner{inset-inline-start:auto;inset-inline-end:0}:host-context([dir=rtl]):host(.menu-side-end) .menu-inner,:host-context([dir=rtl]).menu-side-end .menu-inner{--ion-safe-area-left:unset;--ion-safe-area-right:0px}@supports selector(:dir(rtl)){:host(.menu-side-end:dir(rtl)) .menu-inner{--ion-safe-area-left:unset;--ion-safe-area-right:0px}}ion-backdrop{display:none;opacity:0.01;z-index:-1}@media (max-width: 340px){.menu-inner{--width:264px}}:host(.menu-type-reveal){z-index:0}:host(.menu-type-reveal.show-menu) .menu-inner{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}:host(.menu-type-overlay){z-index:1000}:host(.menu-type-overlay) .show-backdrop{display:block;cursor:pointer}:host(.menu-pane-visible){-ms-flex:0 1 auto;flex:0 1 auto;width:var(--side-width, var(--width));min-width:var(--side-min-width, var(--min-width));max-width:var(--side-max-width, var(--max-width))}:host(.menu-pane-visible.split-pane-side){left:0;right:0;top:0;bottom:0;position:relative;-webkit-box-shadow:none;box-shadow:none;z-index:0}:host(.menu-pane-visible.split-pane-side.menu-enabled){display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0}:host(.menu-pane-visible.split-pane-side){-ms-flex-order:-1;order:-1}:host(.menu-pane-visible.split-pane-side[side=end]){-ms-flex-order:1;order:1}:host(.menu-pane-visible) .menu-inner{left:0;right:0;width:auto;-webkit-transform:none;transform:none;-webkit-box-shadow:none;box-shadow:none}:host(.menu-pane-visible) ion-backdrop{display:hidden !important}:host(.menu-pane-visible.split-pane-side){-webkit-border-start:0;border-inline-start:0;-webkit-border-end:var(--border);border-inline-end:var(--border);border-top:0;border-bottom:0;min-width:var(--side-min-width);max-width:var(--side-max-width)}:host(.menu-pane-visible.split-pane-side[side=end]){-webkit-border-start:var(--border);border-inline-start:var(--border);-webkit-border-end:0;border-inline-end:0;border-top:0;border-bottom:0;min-width:var(--side-min-width);max-width:var(--side-max-width)}:host(.menu-type-push){z-index:1000}:host(.menu-type-push) .show-backdrop{display:block}";
@@ -463,22 +463,6 @@ const Menu = /*@__PURE__*/ proxyCustomElement(class Menu extends HTMLElement {
463
463
  }
464
464
  beforeAnimation(shouldOpen, role) {
465
465
  assert(!this.isAnimating, '_before() should not be called while animating');
466
- /**
467
- * When the menu is presented on an Android device, TalkBack's focus rings
468
- * may appear in the wrong position due to the transition (specifically
469
- * `transform` styles). This occurs because the focus rings are initially
470
- * displayed at the starting position of the elements before the transition
471
- * begins. This workaround ensures the focus rings do not appear in the
472
- * incorrect location.
473
- *
474
- * If this solution is applied to iOS devices, then it leads to a bug where
475
- * the overlays cannot be accessed by screen readers. This is due to
476
- * VoiceOver not being able to update the accessibility tree when the
477
- * `aria-hidden` is removed.
478
- */
479
- if (isPlatform('android')) {
480
- this.el.setAttribute('aria-hidden', 'true');
481
- }
482
466
  // this places the menu into the correct location before it animates in
483
467
  // this css class doesn't actually kick off any animations
484
468
  this.el.classList.add(SHOW_MENU);
@@ -531,16 +515,6 @@ const Menu = /*@__PURE__*/ proxyCustomElement(class Menu extends HTMLElement {
531
515
  this.blocker.unblock();
532
516
  }
533
517
  if (isOpen) {
534
- /**
535
- * When the menu is presented on an Android device, TalkBack's focus rings
536
- * may appear in the wrong position due to the transition (specifically
537
- * `transform` styles). The menu is hidden from screen readers during the
538
- * transition to prevent this. Once the transition is complete, the menu
539
- * is shown again.
540
- */
541
- if (isPlatform('android')) {
542
- this.el.removeAttribute('aria-hidden');
543
- }
544
518
  // emit open event
545
519
  this.ionDidOpen.emit();
546
520
  /**
@@ -556,7 +530,6 @@ const Menu = /*@__PURE__*/ proxyCustomElement(class Menu extends HTMLElement {
556
530
  document.addEventListener('focus', this.handleFocus, true);
557
531
  }
558
532
  else {
559
- this.el.removeAttribute('aria-hidden');
560
533
  // remove css classes and unhide content from screen readers
561
534
  this.el.classList.remove(SHOW_MENU);
562
535
  /**
@@ -623,14 +596,14 @@ const Menu = /*@__PURE__*/ proxyCustomElement(class Menu extends HTMLElement {
623
596
  * the ionBackButton listener in the menu controller
624
597
  * will handle closing the menu when Escape is pressed.
625
598
  */
626
- return (h(Host, { key: 'da96fdb4c5ddf60e615cc4cdda7ccdb3fd7e089b', onKeyDown: shouldUseCloseWatcher() ? null : this.onKeydown, role: "navigation", "aria-label": inheritedAttributes['aria-label'] || 'menu', class: {
599
+ return (h(Host, { key: '5aaea91873d0885b97304372223b2a6ed16ca28b', onKeyDown: shouldUseCloseWatcher() ? null : this.onKeydown, role: "navigation", "aria-label": inheritedAttributes['aria-label'] || 'menu', class: {
627
600
  [mode]: true,
628
601
  [`menu-type-${type}`]: true,
629
602
  'menu-enabled': !disabled,
630
603
  [`menu-side-${side}`]: true,
631
604
  'menu-pane-visible': isPaneVisible,
632
605
  'split-pane-side': hostContext('ion-split-pane', el),
633
- } }, h("div", { key: '894e680fe227534711128c7aca980964ddb5a08a', class: "menu-inner", part: "container", ref: (el) => (this.menuInnerEl = el) }, h("slot", { key: 'e9f5934518dc0cceaeadf1f2820614595fec6bc9' })), h("ion-backdrop", { key: '7282077817657b1bb6c155f1404c0a519fece993', ref: (el) => (this.backdropEl = el), class: "menu-backdrop", tappable: false, stopPropagation: false, part: "backdrop" })));
606
+ } }, h("div", { key: '3ba822411ad11eff52c518fecf1b2a5b47e0b678', class: "menu-inner", part: "container", ref: (el) => (this.menuInnerEl = el) }, h("slot", { key: 'd28a78e98493b21d43ea8b19e96b21547adf1916' })), h("ion-backdrop", { key: '0468c15d111737f5cb646918dcfacedadf907a8f', ref: (el) => (this.backdropEl = el), class: "menu-backdrop", tappable: false, stopPropagation: false, part: "backdrop" })));
634
607
  }
635
608
  get el() { return this; }
636
609
  static get watchers() { return {
@@ -889,12 +889,11 @@ const createTriggerController = () => {
889
889
  * like TalkBack do not announce or interact with the content until the
890
890
  * animation is complete, avoiding confusion for users.
891
891
  *
892
- * When the overlay is presented on an Android device, TalkBack's focus rings
893
- * may appear in the wrong position due to the transition (specifically
894
- * `transform` styles). This occurs because the focus rings are initially
895
- * displayed at the starting position of the elements before the transition
896
- * begins. This workaround ensures the focus rings do not appear in the
897
- * incorrect location.
892
+ * If the overlay is being presented, it prevents focus rings from appearing
893
+ * in incorrect positions due to the transition (specifically `transform`
894
+ * styles), ensuring that when aria-hidden is removed, the focus rings are
895
+ * correctly displayed in the final location of the elements. This only
896
+ * applies to Android devices.
898
897
  *
899
898
  * If this solution is applied to iOS devices, then it leads to a bug where
900
899
  * the overlays cannot be accessed by screen readers. This is due to
@@ -18,6 +18,7 @@ const FOCUS_KEYS = [
18
18
  'ArrowUp',
19
19
  'Home',
20
20
  'End',
21
+ 'Meta',
21
22
  ];
22
23
  const startFocusVisible = (rootEl) => {
23
24
  let currentFocus = [];
@@ -50,6 +51,7 @@ const startFocusVisible = (rootEl) => {
50
51
  });
51
52
  setFocus(toFocus);
52
53
  }
54
+ keyboardMode = true;
53
55
  };
54
56
  const onFocusout = () => {
55
57
  if (ref.activeElement === root) {
@@ -16,7 +16,7 @@ const helpers = require('./helpers-afaa9001.js');
16
16
  const config = require('./config-4f60b98a.js');
17
17
  const theme = require('./theme-d1c573d2.js');
18
18
  const index$2 = require('./index-8e789962.js');
19
- const overlays = require('./overlays-aa669eb8.js');
19
+ const overlays = require('./overlays-a6b4fa63.js');
20
20
  require('./index-c8d52405.js');
21
21
  require('./index-73f75efb.js');
22
22
  require('./index-5915f9b3.js');
@@ -9,7 +9,7 @@ const index = require('./index-73f75efb.js');
9
9
  const buttonActive = require('./button-active-3f2f60b4.js');
10
10
  const helpers = require('./helpers-afaa9001.js');
11
11
  const lockController = require('./lock-controller-6585a42a.js');
12
- const overlays = require('./overlays-aa669eb8.js');
12
+ const overlays = require('./overlays-a6b4fa63.js');
13
13
  const theme = require('./theme-d1c573d2.js');
14
14
  const ionicGlobal = require('./ionic-global-d9a8bb5b.js');
15
15
  const animation = require('./animation-b4fdf128.js');
@@ -10,7 +10,7 @@ const config = require('./config-4f60b98a.js');
10
10
  const buttonActive = require('./button-active-3f2f60b4.js');
11
11
  const helpers = require('./helpers-afaa9001.js');
12
12
  const lockController = require('./lock-controller-6585a42a.js');
13
- const overlays = require('./overlays-aa669eb8.js');
13
+ const overlays = require('./overlays-a6b4fa63.js');
14
14
  const theme = require('./theme-d1c573d2.js');
15
15
  const ionicGlobal = require('./ionic-global-d9a8bb5b.js');
16
16
  const animation = require('./animation-b4fdf128.js');
@@ -65,7 +65,7 @@ const App = class {
65
65
  if (typeof window !== 'undefined') {
66
66
  Promise.resolve().then(function () { return require('./keyboard-af1bb365.js'); }).then((module) => module.startKeyboardAssist(window));
67
67
  }
68
- Promise.resolve().then(function () { return require('./focus-visible-7a0ce04f.js'); }).then((module) => (this.focusVisible = module.startFocusVisible()));
68
+ Promise.resolve().then(function () { return require('./focus-visible-2578eb30.js'); }).then((module) => (this.focusVisible = module.startFocusVisible()));
69
69
  });
70
70
  }
71
71
  }
@@ -6,7 +6,7 @@
6
6
  Object.defineProperty(exports, '__esModule', { value: true });
7
7
 
8
8
  const index$1 = require('./index-73f75efb.js');
9
- const focusVisible = require('./focus-visible-7a0ce04f.js');
9
+ const focusVisible = require('./focus-visible-2578eb30.js');
10
10
  const helpers = require('./helpers-afaa9001.js');
11
11
  const index = require('./index-5915f9b3.js');
12
12
  const dir = require('./dir-94c21456.js');
@@ -15,7 +15,7 @@ const index$2 = require('./index-073c7cdc.js');
15
15
  const ionicGlobal = require('./ionic-global-d9a8bb5b.js');
16
16
  const data = require('./data-21dc0f81.js');
17
17
  const lockController = require('./lock-controller-6585a42a.js');
18
- const overlays = require('./overlays-aa669eb8.js');
18
+ const overlays = require('./overlays-a6b4fa63.js');
19
19
  const animation = require('./animation-b4fdf128.js');
20
20
  const haptic = require('./haptic-f6b37aa3.js');
21
21
  require('./index-c8d52405.js');
@@ -9,7 +9,7 @@ const index = require('./index-73f75efb.js');
9
9
  const config = require('./config-4f60b98a.js');
10
10
  const helpers = require('./helpers-afaa9001.js');
11
11
  const lockController = require('./lock-controller-6585a42a.js');
12
- const overlays = require('./overlays-aa669eb8.js');
12
+ const overlays = require('./overlays-a6b4fa63.js');
13
13
  const theme = require('./theme-d1c573d2.js');
14
14
  const ionicGlobal = require('./ionic-global-d9a8bb5b.js');
15
15
  const animation = require('./animation-b4fdf128.js');
@@ -7,13 +7,13 @@ Object.defineProperty(exports, '__esModule', { value: true });
7
7
 
8
8
  const index = require('./index-73f75efb.js');
9
9
  const cubicBezier = require('./cubic-bezier-f2dccc53.js');
10
- const overlays = require('./overlays-aa669eb8.js');
10
+ const overlays = require('./overlays-a6b4fa63.js');
11
11
  const gestureController = require('./gesture-controller-9436f482.js');
12
12
  const hardwareBackButton = require('./hardware-back-button-9e8a2c4f.js');
13
13
  const helpers = require('./helpers-afaa9001.js');
14
14
  const index$1 = require('./index-8e789962.js');
15
- const ionicGlobal = require('./ionic-global-d9a8bb5b.js');
16
15
  const theme = require('./theme-d1c573d2.js');
16
+ const ionicGlobal = require('./ionic-global-d9a8bb5b.js');
17
17
  const index$2 = require('./index-073c7cdc.js');
18
18
  require('./index-c8d52405.js');
19
19
  require('./framework-delegate-55f5683a.js');
@@ -466,22 +466,6 @@ const Menu = class {
466
466
  }
467
467
  beforeAnimation(shouldOpen, role) {
468
468
  helpers.assert(!this.isAnimating, '_before() should not be called while animating');
469
- /**
470
- * When the menu is presented on an Android device, TalkBack's focus rings
471
- * may appear in the wrong position due to the transition (specifically
472
- * `transform` styles). This occurs because the focus rings are initially
473
- * displayed at the starting position of the elements before the transition
474
- * begins. This workaround ensures the focus rings do not appear in the
475
- * incorrect location.
476
- *
477
- * If this solution is applied to iOS devices, then it leads to a bug where
478
- * the overlays cannot be accessed by screen readers. This is due to
479
- * VoiceOver not being able to update the accessibility tree when the
480
- * `aria-hidden` is removed.
481
- */
482
- if (ionicGlobal.isPlatform('android')) {
483
- this.el.setAttribute('aria-hidden', 'true');
484
- }
485
469
  // this places the menu into the correct location before it animates in
486
470
  // this css class doesn't actually kick off any animations
487
471
  this.el.classList.add(SHOW_MENU);
@@ -534,16 +518,6 @@ const Menu = class {
534
518
  this.blocker.unblock();
535
519
  }
536
520
  if (isOpen) {
537
- /**
538
- * When the menu is presented on an Android device, TalkBack's focus rings
539
- * may appear in the wrong position due to the transition (specifically
540
- * `transform` styles). The menu is hidden from screen readers during the
541
- * transition to prevent this. Once the transition is complete, the menu
542
- * is shown again.
543
- */
544
- if (ionicGlobal.isPlatform('android')) {
545
- this.el.removeAttribute('aria-hidden');
546
- }
547
521
  // emit open event
548
522
  this.ionDidOpen.emit();
549
523
  /**
@@ -559,7 +533,6 @@ const Menu = class {
559
533
  document.addEventListener('focus', this.handleFocus, true);
560
534
  }
561
535
  else {
562
- this.el.removeAttribute('aria-hidden');
563
536
  // remove css classes and unhide content from screen readers
564
537
  this.el.classList.remove(SHOW_MENU);
565
538
  /**
@@ -626,14 +599,14 @@ const Menu = class {
626
599
  * the ionBackButton listener in the menu controller
627
600
  * will handle closing the menu when Escape is pressed.
628
601
  */
629
- return (index.h(index.Host, { key: 'da96fdb4c5ddf60e615cc4cdda7ccdb3fd7e089b', onKeyDown: hardwareBackButton.shouldUseCloseWatcher() ? null : this.onKeydown, role: "navigation", "aria-label": inheritedAttributes['aria-label'] || 'menu', class: {
602
+ return (index.h(index.Host, { key: '5aaea91873d0885b97304372223b2a6ed16ca28b', onKeyDown: hardwareBackButton.shouldUseCloseWatcher() ? null : this.onKeydown, role: "navigation", "aria-label": inheritedAttributes['aria-label'] || 'menu', class: {
630
603
  [mode]: true,
631
604
  [`menu-type-${type}`]: true,
632
605
  'menu-enabled': !disabled,
633
606
  [`menu-side-${side}`]: true,
634
607
  'menu-pane-visible': isPaneVisible,
635
608
  'split-pane-side': theme.hostContext('ion-split-pane', el),
636
- } }, index.h("div", { key: '894e680fe227534711128c7aca980964ddb5a08a', class: "menu-inner", part: "container", ref: (el) => (this.menuInnerEl = el) }, index.h("slot", { key: 'e9f5934518dc0cceaeadf1f2820614595fec6bc9' })), index.h("ion-backdrop", { key: '7282077817657b1bb6c155f1404c0a519fece993', ref: (el) => (this.backdropEl = el), class: "menu-backdrop", tappable: false, stopPropagation: false, part: "backdrop" })));
609
+ } }, index.h("div", { key: '3ba822411ad11eff52c518fecf1b2a5b47e0b678', class: "menu-inner", part: "container", ref: (el) => (this.menuInnerEl = el) }, index.h("slot", { key: 'd28a78e98493b21d43ea8b19e96b21547adf1916' })), index.h("ion-backdrop", { key: '0468c15d111737f5cb646918dcfacedadf907a8f', ref: (el) => (this.backdropEl = el), class: "menu-backdrop", tappable: false, stopPropagation: false, part: "backdrop" })));
637
610
  }
638
611
  get el() { return index.getElement(this); }
639
612
  static get watchers() { return {
@@ -12,7 +12,7 @@ const helpers = require('./helpers-afaa9001.js');
12
12
  const lockController = require('./lock-controller-6585a42a.js');
13
13
  const index$4 = require('./index-5915f9b3.js');
14
14
  const capacitor = require('./capacitor-c04564bf.js');
15
- const overlays = require('./overlays-aa669eb8.js');
15
+ const overlays = require('./overlays-a6b4fa63.js');
16
16
  const theme = require('./theme-d1c573d2.js');
17
17
  const index$5 = require('./index-f05acd21.js');
18
18
  const ionicGlobal = require('./ionic-global-d9a8bb5b.js');
@@ -6,7 +6,7 @@
6
6
  Object.defineProperty(exports, '__esModule', { value: true });
7
7
 
8
8
  const index = require('./index-73f75efb.js');
9
- const overlays = require('./overlays-aa669eb8.js');
9
+ const overlays = require('./overlays-a6b4fa63.js');
10
10
  const frameworkDelegate = require('./framework-delegate-55f5683a.js');
11
11
  const helpers = require('./helpers-afaa9001.js');
12
12
  const lockController = require('./lock-controller-6585a42a.js');
@@ -7,7 +7,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
7
7
 
8
8
  const index = require('./index-73f75efb.js');
9
9
  const ionicGlobal = require('./ionic-global-d9a8bb5b.js');
10
- const overlays = require('./overlays-aa669eb8.js');
10
+ const overlays = require('./overlays-a6b4fa63.js');
11
11
  const theme = require('./theme-d1c573d2.js');
12
12
  require('./index-c8d52405.js');
13
13
  require('./helpers-afaa9001.js');
@@ -9,7 +9,7 @@ const index = require('./index-73f75efb.js');
9
9
  const notchController = require('./notch-controller-d69150f5.js');
10
10
  const compareWithUtils = require('./compare-with-utils-df1001d7.js');
11
11
  const helpers = require('./helpers-afaa9001.js');
12
- const overlays = require('./overlays-aa669eb8.js');
12
+ const overlays = require('./overlays-a6b4fa63.js');
13
13
  const dir = require('./dir-94c21456.js');
14
14
  const theme = require('./theme-d1c573d2.js');
15
15
  const watchOptions = require('./watch-options-f5f3e158.js');
@@ -10,7 +10,7 @@ const config = require('./config-4f60b98a.js');
10
10
  const helpers = require('./helpers-afaa9001.js');
11
11
  const lockController = require('./lock-controller-6585a42a.js');
12
12
  const index$1 = require('./index-5915f9b3.js');
13
- const overlays = require('./overlays-aa669eb8.js');
13
+ const overlays = require('./overlays-a6b4fa63.js');
14
14
  const theme = require('./theme-d1c573d2.js');
15
15
  const ionicGlobal = require('./ionic-global-d9a8bb5b.js');
16
16
  const animation = require('./animation-b4fdf128.js');
@@ -891,12 +891,11 @@ const createTriggerController = () => {
891
891
  * like TalkBack do not announce or interact with the content until the
892
892
  * animation is complete, avoiding confusion for users.
893
893
  *
894
- * When the overlay is presented on an Android device, TalkBack's focus rings
895
- * may appear in the wrong position due to the transition (specifically
896
- * `transform` styles). This occurs because the focus rings are initially
897
- * displayed at the starting position of the elements before the transition
898
- * begins. This workaround ensures the focus rings do not appear in the
899
- * incorrect location.
894
+ * If the overlay is being presented, it prevents focus rings from appearing
895
+ * in incorrect positions due to the transition (specifically `transform`
896
+ * styles), ensuring that when aria-hidden is removed, the focus rings are
897
+ * correctly displayed in the final location of the elements. This only
898
+ * applies to Android devices.
900
899
  *
901
900
  * If this solution is applied to iOS devices, then it leads to a bug where
902
901
  * the overlays cannot be accessed by screen readers. This is due to
@@ -9,7 +9,6 @@ import { shouldUseCloseWatcher } from "../../utils/hardware-back-button";
9
9
  import { inheritAriaAttributes, assert, clamp, isEndSide as isEnd } from "../../utils/helpers";
10
10
  import { menuController } from "../../utils/menu-controller/index";
11
11
  import { BACKDROP, GESTURE, getPresentedOverlay } from "../../utils/overlays";
12
- import { isPlatform } from "../../utils/platform";
13
12
  import { hostContext } from "../../utils/theme";
14
13
  import { config } from "../../global/config";
15
14
  import { getIonMode } from "../../global/ionic-global";
@@ -454,22 +453,6 @@ export class Menu {
454
453
  }
455
454
  beforeAnimation(shouldOpen, role) {
456
455
  assert(!this.isAnimating, '_before() should not be called while animating');
457
- /**
458
- * When the menu is presented on an Android device, TalkBack's focus rings
459
- * may appear in the wrong position due to the transition (specifically
460
- * `transform` styles). This occurs because the focus rings are initially
461
- * displayed at the starting position of the elements before the transition
462
- * begins. This workaround ensures the focus rings do not appear in the
463
- * incorrect location.
464
- *
465
- * If this solution is applied to iOS devices, then it leads to a bug where
466
- * the overlays cannot be accessed by screen readers. This is due to
467
- * VoiceOver not being able to update the accessibility tree when the
468
- * `aria-hidden` is removed.
469
- */
470
- if (isPlatform('android')) {
471
- this.el.setAttribute('aria-hidden', 'true');
472
- }
473
456
  // this places the menu into the correct location before it animates in
474
457
  // this css class doesn't actually kick off any animations
475
458
  this.el.classList.add(SHOW_MENU);
@@ -522,16 +505,6 @@ export class Menu {
522
505
  this.blocker.unblock();
523
506
  }
524
507
  if (isOpen) {
525
- /**
526
- * When the menu is presented on an Android device, TalkBack's focus rings
527
- * may appear in the wrong position due to the transition (specifically
528
- * `transform` styles). The menu is hidden from screen readers during the
529
- * transition to prevent this. Once the transition is complete, the menu
530
- * is shown again.
531
- */
532
- if (isPlatform('android')) {
533
- this.el.removeAttribute('aria-hidden');
534
- }
535
508
  // emit open event
536
509
  this.ionDidOpen.emit();
537
510
  /**
@@ -547,7 +520,6 @@ export class Menu {
547
520
  document.addEventListener('focus', this.handleFocus, true);
548
521
  }
549
522
  else {
550
- this.el.removeAttribute('aria-hidden');
551
523
  // remove css classes and unhide content from screen readers
552
524
  this.el.classList.remove(SHOW_MENU);
553
525
  /**
@@ -614,14 +586,14 @@ export class Menu {
614
586
  * the ionBackButton listener in the menu controller
615
587
  * will handle closing the menu when Escape is pressed.
616
588
  */
617
- return (h(Host, { key: 'da96fdb4c5ddf60e615cc4cdda7ccdb3fd7e089b', onKeyDown: shouldUseCloseWatcher() ? null : this.onKeydown, role: "navigation", "aria-label": inheritedAttributes['aria-label'] || 'menu', class: {
589
+ return (h(Host, { key: '5aaea91873d0885b97304372223b2a6ed16ca28b', onKeyDown: shouldUseCloseWatcher() ? null : this.onKeydown, role: "navigation", "aria-label": inheritedAttributes['aria-label'] || 'menu', class: {
618
590
  [mode]: true,
619
591
  [`menu-type-${type}`]: true,
620
592
  'menu-enabled': !disabled,
621
593
  [`menu-side-${side}`]: true,
622
594
  'menu-pane-visible': isPaneVisible,
623
595
  'split-pane-side': hostContext('ion-split-pane', el),
624
- } }, h("div", { key: '894e680fe227534711128c7aca980964ddb5a08a', class: "menu-inner", part: "container", ref: (el) => (this.menuInnerEl = el) }, h("slot", { key: 'e9f5934518dc0cceaeadf1f2820614595fec6bc9' })), h("ion-backdrop", { key: '7282077817657b1bb6c155f1404c0a519fece993', ref: (el) => (this.backdropEl = el), class: "menu-backdrop", tappable: false, stopPropagation: false, part: "backdrop" })));
596
+ } }, h("div", { key: '3ba822411ad11eff52c518fecf1b2a5b47e0b678', class: "menu-inner", part: "container", ref: (el) => (this.menuInnerEl = el) }, h("slot", { key: 'd28a78e98493b21d43ea8b19e96b21547adf1916' })), h("ion-backdrop", { key: '0468c15d111737f5cb646918dcfacedadf907a8f', ref: (el) => (this.backdropEl = el), class: "menu-backdrop", tappable: false, stopPropagation: false, part: "backdrop" })));
625
597
  }
626
598
  static get is() { return "ion-menu"; }
627
599
  static get encapsulation() { return "shadow"; }
@@ -16,6 +16,7 @@ const FOCUS_KEYS = [
16
16
  'ArrowUp',
17
17
  'Home',
18
18
  'End',
19
+ 'Meta',
19
20
  ];
20
21
  export const startFocusVisible = (rootEl) => {
21
22
  let currentFocus = [];
@@ -48,6 +49,7 @@ export const startFocusVisible = (rootEl) => {
48
49
  });
49
50
  setFocus(toFocus);
50
51
  }
52
+ keyboardMode = true;
51
53
  };
52
54
  const onFocusout = () => {
53
55
  if (ref.activeElement === root) {
@@ -811,12 +811,11 @@ export const createTriggerController = () => {
811
811
  * like TalkBack do not announce or interact with the content until the
812
812
  * animation is complete, avoiding confusion for users.
813
813
  *
814
- * When the overlay is presented on an Android device, TalkBack's focus rings
815
- * may appear in the wrong position due to the transition (specifically
816
- * `transform` styles). This occurs because the focus rings are initially
817
- * displayed at the starting position of the elements before the transition
818
- * begins. This workaround ensures the focus rings do not appear in the
819
- * incorrect location.
814
+ * If the overlay is being presented, it prevents focus rings from appearing
815
+ * in incorrect positions due to the transition (specifically `transform`
816
+ * styles), ensuring that when aria-hidden is removed, the focus rings are
817
+ * correctly displayed in the final location of the elements. This only
818
+ * applies to Android devices.
820
819
  *
821
820
  * If this solution is applied to iOS devices, then it leads to a bug where
822
821
  * the overlays cannot be accessed by screen readers. This is due to
package/dist/docs.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "timestamp": "2024-11-22T20:08:22",
2
+ "timestamp": "2024-11-26T18:51:14",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
5
  "version": "4.20.0",
@@ -16,6 +16,7 @@ const FOCUS_KEYS = [
16
16
  'ArrowUp',
17
17
  'Home',
18
18
  'End',
19
+ 'Meta',
19
20
  ];
20
21
  const startFocusVisible = (rootEl) => {
21
22
  let currentFocus = [];
@@ -48,6 +49,7 @@ const startFocusVisible = (rootEl) => {
48
49
  });
49
50
  setFocus(toFocus);
50
51
  }
52
+ keyboardMode = true;
51
53
  };
52
54
  const onFocusout = () => {
53
55
  if (ref.activeElement === root) {
package/dist/esm/index.js CHANGED
@@ -12,7 +12,7 @@ export { c as componentOnReady } from './helpers-da915de8.js';
12
12
  export { I as IonicSafeString, g as getMode, s as setupConfig } from './config-49c88215.js';
13
13
  export { o as openURL } from './theme-01f3f29c.js';
14
14
  export { m as menuController } from './index-24b48b06.js';
15
- export { b as actionSheetController, a as alertController, l as loadingController, m as modalController, p as pickerController, c as popoverController, t as toastController } from './overlays-e7b9d6d9.js';
15
+ export { b as actionSheetController, a as alertController, l as loadingController, m as modalController, p as pickerController, c as popoverController, t as toastController } from './overlays-dcc93658.js';
16
16
  import './index-a5d50daf.js';
17
17
  import './index-28849c61.js';
18
18
  import './index-9b0d46f4.js';
@@ -5,7 +5,7 @@ import { r as registerInstance, d as createEvent, e as readTask, h, f as Host, i
5
5
  import { c as createButtonActiveGesture } from './button-active-f6503382.js';
6
6
  import { r as raf } from './helpers-da915de8.js';
7
7
  import { c as createLockController } from './lock-controller-316928be.js';
8
- import { d as createDelegateController, e as createTriggerController, B as BACKDROP, i as isCancel, f as present, g as dismiss, h as eventMethod, s as safeCall, j as prepareOverlay, k as setOverlayId } from './overlays-e7b9d6d9.js';
8
+ import { d as createDelegateController, e as createTriggerController, B as BACKDROP, i as isCancel, f as present, g as dismiss, h as eventMethod, s as safeCall, j as prepareOverlay, k as setOverlayId } from './overlays-dcc93658.js';
9
9
  import { g as getClassMap } from './theme-01f3f29c.js';
10
10
  import { b as getIonMode } from './ionic-global-c81d82ab.js';
11
11
  import { c as createAnimation } from './animation-eab5a4ca.js';
@@ -6,7 +6,7 @@ import { E as ENABLE_HTML_CONTENT_DEFAULT, a as sanitizeDOMString } from './conf
6
6
  import { c as createButtonActiveGesture } from './button-active-f6503382.js';
7
7
  import { r as raf } from './helpers-da915de8.js';
8
8
  import { c as createLockController } from './lock-controller-316928be.js';
9
- import { d as createDelegateController, e as createTriggerController, B as BACKDROP, i as isCancel, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod, s as safeCall } from './overlays-e7b9d6d9.js';
9
+ import { d as createDelegateController, e as createTriggerController, B as BACKDROP, i as isCancel, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod, s as safeCall } from './overlays-dcc93658.js';
10
10
  import { g as getClassMap } from './theme-01f3f29c.js';
11
11
  import { c as config, b as getIonMode } from './ionic-global-c81d82ab.js';
12
12
  import { c as createAnimation } from './animation-eab5a4ca.js';
@@ -61,7 +61,7 @@ const App = class {
61
61
  if (typeof window !== 'undefined') {
62
62
  import('./keyboard-52278bd7.js').then((module) => module.startKeyboardAssist(window));
63
63
  }
64
- import('./focus-visible-dd40d69f.js').then((module) => (this.focusVisible = module.startFocusVisible()));
64
+ import('./focus-visible-ab389174.js').then((module) => (this.focusVisible = module.startFocusVisible()));
65
65
  });
66
66
  }
67
67
  }
@@ -2,7 +2,7 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { r as registerInstance, d as createEvent, w as writeTask, h, f as Host, i as getElement } from './index-28849c61.js';
5
- import { startFocusVisible } from './focus-visible-dd40d69f.js';
5
+ import { startFocusVisible } from './focus-visible-ab389174.js';
6
6
  import { r as raf, d as renderHiddenInput, g as getElementRoot, j as clamp } from './helpers-da915de8.js';
7
7
  import { a as printIonError, p as printIonWarning } from './index-9b0d46f4.js';
8
8
  import { i as isRTL } from './dir-babeabeb.js';
@@ -11,7 +11,7 @@ import { c as chevronBack, o as chevronForward, l as chevronDown, p as caretUpSh
11
11
  import { b as getIonMode } from './ionic-global-c81d82ab.js';
12
12
  import { g as generateDayAriaLabel, a as getDay, i as isBefore, b as isAfter, c as isSameDay, d as getPreviousMonth, e as getNextMonth, v as validateParts, f as getPartsFromCalendarDay, h as getNextYear, j as getPreviousYear, k as getEndOfWeek, l as getStartOfWeek, m as getPreviousDay, n as getNextDay, o as getPreviousWeek, p as getNextWeek, q as parseMinParts, r as parseMaxParts, s as parseDate, w as warnIfValueOutOfBounds, t as convertToArrayOfNumbers, u as convertDataToISO, x as getToday, y as getClosestValidDate, z as generateMonths, A as getNumDaysInMonth, B as getCombinedDateColumnData, C as getMonthColumnData, D as getDayColumnData, E as getYearColumnData, F as isMonthFirstLocale, G as getTimeColumnsData, H as isLocaleDayPeriodRTL, I as getDaysOfWeek, J as getMonthAndYear, K as getDaysOfMonth, L as getHourCycle, M as getLocalizedTime, N as getLocalizedDateTime, O as formatValue, P as clampDate, Q as parseAmPm, R as calculateHourFromAMPM } from './data-ae11fd43.js';
13
13
  import { c as createLockController } from './lock-controller-316928be.js';
14
- import { d as createDelegateController, e as createTriggerController, B as BACKDROP, i as isCancel, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod, s as safeCall } from './overlays-e7b9d6d9.js';
14
+ import { d as createDelegateController, e as createTriggerController, B as BACKDROP, i as isCancel, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod, s as safeCall } from './overlays-dcc93658.js';
15
15
  import { c as createAnimation } from './animation-eab5a4ca.js';
16
16
  import { b as hapticSelectionChanged, h as hapticSelectionEnd, a as hapticSelectionStart } from './haptic-ac164e4c.js';
17
17
  import './index-a5d50daf.js';
@@ -5,7 +5,7 @@ import { r as registerInstance, d as createEvent, h, f as Host, i as getElement
5
5
  import { E as ENABLE_HTML_CONTENT_DEFAULT, a as sanitizeDOMString } from './config-49c88215.js';
6
6
  import { r as raf } from './helpers-da915de8.js';
7
7
  import { c as createLockController } from './lock-controller-316928be.js';
8
- import { d as createDelegateController, e as createTriggerController, B as BACKDROP, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod } from './overlays-e7b9d6d9.js';
8
+ import { d as createDelegateController, e as createTriggerController, B as BACKDROP, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod } from './overlays-dcc93658.js';
9
9
  import { g as getClassMap } from './theme-01f3f29c.js';
10
10
  import { c as config, b as getIonMode } from './ionic-global-c81d82ab.js';
11
11
  import { c as createAnimation } from './animation-eab5a4ca.js';