voyager-ionic-core 8.8.12 → 8.8.17

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 (237) hide show
  1. package/components/index.js +1 -1
  2. package/components/ion-accordion.js +1 -1
  3. package/components/ion-action-sheet.js +1 -1
  4. package/components/ion-alert.js +1 -1
  5. package/components/ion-app.js +1 -1
  6. package/components/ion-back-button.js +1 -1
  7. package/components/ion-breadcrumb.js +1 -1
  8. package/components/ion-button.js +1 -1
  9. package/components/ion-card.js +1 -1
  10. package/components/ion-checkbox.js +1 -1
  11. package/components/ion-content.js +1 -1
  12. package/components/ion-datetime-button.js +1 -1
  13. package/components/ion-datetime.js +1 -1
  14. package/components/ion-fab-button.js +1 -1
  15. package/components/ion-footer.js +1 -1
  16. package/components/ion-header.js +1 -1
  17. package/components/ion-img.js +1 -1
  18. package/components/ion-infinite-scroll.js +1 -1
  19. package/components/ion-input-otp.js +1 -1
  20. package/components/ion-input-password-toggle.js +1 -1
  21. package/components/ion-input.js +1 -1
  22. package/components/ion-item-options.js +1 -1
  23. package/components/ion-item-sliding.js +1 -1
  24. package/components/ion-item.js +1 -1
  25. package/components/ion-loading.js +1 -1
  26. package/components/ion-menu-button.js +1 -1
  27. package/components/ion-menu-toggle.js +1 -1
  28. package/components/ion-menu.js +1 -1
  29. package/components/ion-modal.js +1 -1
  30. package/components/ion-nav.js +1 -1
  31. package/components/ion-picker-column-option.js +1 -1
  32. package/components/ion-picker-column.js +1 -1
  33. package/components/ion-picker-legacy-column.js +1 -1
  34. package/components/ion-picker-legacy.js +1 -1
  35. package/components/ion-picker.js +1 -1
  36. package/components/ion-popover.js +1 -1
  37. package/components/ion-progress-bar.js +1 -1
  38. package/components/ion-radio-group.js +1 -1
  39. package/components/ion-radio.js +1 -1
  40. package/components/ion-range.js +1 -1
  41. package/components/ion-refresher-content.js +1 -1
  42. package/components/ion-refresher.js +1 -1
  43. package/components/ion-reorder-group.js +1 -1
  44. package/components/ion-router-outlet.js +1 -1
  45. package/components/ion-router.js +1 -1
  46. package/components/ion-searchbar.js +1 -1
  47. package/components/ion-segment-button.js +1 -1
  48. package/components/ion-segment.js +1 -1
  49. package/components/ion-select-modal.js +1 -1
  50. package/components/ion-select-popover.js +1 -1
  51. package/components/ion-select.js +1 -1
  52. package/components/ion-tab-button.js +1 -1
  53. package/components/ion-tab.js +1 -1
  54. package/components/ion-textarea.js +1 -1
  55. package/components/ion-toast.js +1 -1
  56. package/components/ion-toggle.js +1 -1
  57. package/components/{p-CtukzcyX.js → p-A3O24YmY.js} +1 -1
  58. package/components/{p-CU5rbWAW.js → p-ABkNVeU9.js} +1 -1
  59. package/components/{p-BT_5jSqG.js → p-B-JJgYSG.js} +1 -1
  60. package/components/p-BB42Mlnr.js +4 -0
  61. package/components/{p-lE_JGpHD.js → p-BMI53wYL.js} +1 -1
  62. package/components/p-BkKAANMJ.js +4 -0
  63. package/components/p-BlIAuGv2.js +4 -0
  64. package/components/{p-Bth-EzJ0.js → p-Bnsn6KaP.js} +1 -1
  65. package/components/p-BsBCoGa-.js +4 -0
  66. package/components/{p-BnqQlm7c.js → p-CQGnMY3n.js} +1 -1
  67. package/components/{p-DNQI6d-L.js → p-C_hpsif8.js} +1 -1
  68. package/components/p-Cf2jSDS8.js +4 -0
  69. package/components/{p-C4t5ymfq.js → p-ChIZKXUu.js} +1 -1
  70. package/components/p-CkMSOsFF.js +4 -0
  71. package/components/p-CsNJ1ULL.js +4 -0
  72. package/components/{p-BsPelv04.js → p-CzCbeKys.js} +1 -1
  73. package/components/{p-BjfgFSSR.js → p-D-aHdMxW.js} +1 -1
  74. package/components/p-D0d8qTwj.js +4 -0
  75. package/components/{p-Baq1XyAy.js → p-D3xo7hqU.js} +1 -1
  76. package/components/{p-nQi4oKcG.js → p-DCnGU1fF.js} +1 -1
  77. package/components/p-DGZpx6KJ.js +4 -0
  78. package/components/p-DGvrK8dD.js +4 -0
  79. package/components/p-DHTSTb52.js +4 -0
  80. package/components/{p-BirPFsRD.js → p-DJZp0KTQ.js} +1 -1
  81. package/components/{p-ijF0iCrA.js → p-DRugphUN.js} +1 -1
  82. package/components/{p-0NRupjzW.js → p-DV5mPYQS.js} +1 -1
  83. package/components/{p-C1aScSTo.js → p-DWkAgceV.js} +1 -1
  84. package/components/{p-DDWp95gH.js → p-KEFO0w3i.js} +1 -1
  85. package/components/{p-Ciz1-FuE.js → p-Osve4qkc.js} +1 -1
  86. package/components/{p-dhLYXa7A.js → p-SLS1rDZM.js} +1 -1
  87. package/components/{p-D5Ubpm7D.js → p-VWbRkLT7.js} +1 -1
  88. package/components/{p-BTPfOxsU.js → p-aJ6PBUvj.js} +1 -1
  89. package/components/{p-DnL1c9_X.js → p-oD4kcBRX.js} +1 -1
  90. package/components/{p-CI3ncNZm.js → p-scxfI1Dd.js} +1 -1
  91. package/components/p-yzCsOZE2.js +4 -0
  92. package/dist/cjs/{data-DLTUw-KF.js → format-PxvGiOik.js} +8 -532
  93. package/dist/cjs/index.cjs.js +1 -1
  94. package/dist/cjs/ion-action-sheet.cjs.entry.js +1 -1
  95. package/dist/cjs/ion-alert.cjs.entry.js +1 -1
  96. package/dist/cjs/ion-button_2.cjs.entry.js +7 -3
  97. package/dist/cjs/ion-checkbox.cjs.entry.js +17 -7
  98. package/dist/cjs/ion-datetime-button.cjs.entry.js +17 -15
  99. package/dist/cjs/ion-datetime_3.cjs.entry.js +616 -75
  100. package/dist/cjs/ion-fab_3.cjs.entry.js +87 -9
  101. package/dist/cjs/ion-item_8.cjs.entry.js +84 -4
  102. package/dist/cjs/ion-loading.cjs.entry.js +1 -1
  103. package/dist/cjs/ion-menu_3.cjs.entry.js +1 -1
  104. package/dist/cjs/ion-modal.cjs.entry.js +35 -9
  105. package/dist/cjs/ion-popover.cjs.entry.js +1 -1
  106. package/dist/cjs/ion-radio_2.cjs.entry.js +16 -7
  107. package/dist/cjs/ion-refresher_2.cjs.entry.js +31 -4
  108. package/dist/cjs/ion-select-modal.cjs.entry.js +1 -1
  109. package/dist/cjs/ion-select_3.cjs.entry.js +5 -4
  110. package/dist/cjs/ion-tab_2.cjs.entry.js +20 -13
  111. package/dist/cjs/ion-toast.cjs.entry.js +1 -1
  112. package/dist/cjs/ion-toggle.cjs.entry.js +25 -6
  113. package/dist/cjs/ionic.cjs.js +1 -1
  114. package/dist/cjs/item-multiple-inputs-D-gyg57c.js +38 -0
  115. package/dist/cjs/loader.cjs.js +1 -1
  116. package/dist/cjs/{overlays-TbKsuC-K.js → overlays-DdtIYQUH.js} +24 -1
  117. package/dist/collection/components/button/button.js +7 -3
  118. package/dist/collection/components/checkbox/checkbox.ios.css +18 -0
  119. package/dist/collection/components/checkbox/checkbox.js +16 -7
  120. package/dist/collection/components/checkbox/checkbox.md.css +18 -0
  121. package/dist/collection/components/datetime/datetime.js +51 -6
  122. package/dist/collection/components/datetime-button/datetime-button.js +8 -7
  123. package/dist/collection/components/fab-button/fab-button.js +114 -10
  124. package/dist/collection/components/item/item.ios.css +11 -0
  125. package/dist/collection/components/item/item.js +85 -4
  126. package/dist/collection/components/item/item.md.css +11 -0
  127. package/dist/collection/components/modal/gestures/sheet.js +7 -0
  128. package/dist/collection/components/modal/gestures/swipe-to-close.js +7 -0
  129. package/dist/collection/components/modal/modal.ios.css +8 -0
  130. package/dist/collection/components/modal/modal.js +18 -6
  131. package/dist/collection/components/modal/modal.md.css +8 -0
  132. package/dist/collection/components/radio/radio.ios.css +11 -15
  133. package/dist/collection/components/radio/radio.js +15 -7
  134. package/dist/collection/components/radio/radio.md.css +11 -11
  135. package/dist/collection/components/refresher/refresher.js +31 -4
  136. package/dist/collection/components/select/select.js +4 -3
  137. package/dist/collection/components/tab/tab.js +20 -13
  138. package/dist/collection/components/toggle/toggle.ios.css +12 -4
  139. package/dist/collection/components/toggle/toggle.js +24 -6
  140. package/dist/collection/components/toggle/toggle.md.css +42 -5
  141. package/dist/collection/utils/forms/index.js +1 -0
  142. package/dist/collection/utils/forms/item-multiple-inputs.js +33 -0
  143. package/dist/collection/utils/overlays.js +24 -1
  144. package/dist/collection/utils/test/playwright/apply-keyboard-focus.js +25 -0
  145. package/dist/collection/utils/test/playwright/drag-element.js +15 -0
  146. package/dist/collection/utils/test/playwright/index.js +1 -0
  147. package/dist/docs.json +40 -1
  148. package/dist/esm/{data-DZI70dKr.js → format-CAmvpAez.js} +1 -524
  149. package/dist/esm/index.js +1 -1
  150. package/dist/esm/ion-action-sheet.entry.js +1 -1
  151. package/dist/esm/ion-alert.entry.js +1 -1
  152. package/dist/esm/ion-button_2.entry.js +7 -3
  153. package/dist/esm/ion-checkbox.entry.js +19 -9
  154. package/dist/esm/ion-datetime-button.entry.js +9 -7
  155. package/dist/esm/ion-datetime_3.entry.js +550 -9
  156. package/dist/esm/ion-fab_3.entry.js +89 -11
  157. package/dist/esm/ion-item_8.entry.js +84 -4
  158. package/dist/esm/ion-loading.entry.js +1 -1
  159. package/dist/esm/ion-menu_3.entry.js +1 -1
  160. package/dist/esm/ion-modal.entry.js +35 -9
  161. package/dist/esm/ion-popover.entry.js +1 -1
  162. package/dist/esm/ion-radio_2.entry.js +17 -8
  163. package/dist/esm/ion-refresher_2.entry.js +31 -4
  164. package/dist/esm/ion-select-modal.entry.js +1 -1
  165. package/dist/esm/ion-select_3.entry.js +5 -4
  166. package/dist/esm/ion-tab_2.entry.js +20 -13
  167. package/dist/esm/ion-toast.entry.js +1 -1
  168. package/dist/esm/ion-toggle.entry.js +27 -8
  169. package/dist/esm/ionic.js +1 -1
  170. package/dist/esm/item-multiple-inputs-DlNuqNJm.js +36 -0
  171. package/dist/esm/loader.js +1 -1
  172. package/dist/esm/{overlays-TbiM4mdr.js → overlays-Dg0q2_tJ.js} +25 -2
  173. package/dist/html.html-data.json +4 -0
  174. package/dist/ionic/index.esm.js +1 -1
  175. package/dist/ionic/ionic.esm.js +1 -1
  176. package/dist/ionic/{p-30bf9737.entry.js → p-0dc33652.entry.js} +1 -1
  177. package/dist/ionic/p-10e833ef.entry.js +4 -0
  178. package/dist/ionic/{p-4dc1c33c.entry.js → p-2a05aa64.entry.js} +1 -1
  179. package/dist/ionic/p-2b204c59.entry.js +4 -0
  180. package/dist/ionic/p-2fa58e80.entry.js +4 -0
  181. package/dist/ionic/{p-94f2a736.entry.js → p-34586ead.entry.js} +1 -1
  182. package/dist/ionic/p-4654ae1c.entry.js +4 -0
  183. package/dist/ionic/p-4ac4f3d6.entry.js +4 -0
  184. package/dist/ionic/p-5018dfc8.entry.js +4 -0
  185. package/dist/ionic/{p-00dbb17e.entry.js → p-5eb8e86d.entry.js} +1 -1
  186. package/dist/ionic/{p-e847a888.entry.js → p-65ebdf1b.entry.js} +1 -1
  187. package/dist/ionic/p-7c319341.entry.js +4 -0
  188. package/dist/ionic/p-829367ed.entry.js +4 -0
  189. package/dist/ionic/{p-aa5d6b8f.entry.js → p-9f9db3a2.entry.js} +1 -1
  190. package/dist/ionic/p-C0eMdTCW.js +4 -0
  191. package/dist/ionic/p-D-3ycHmd.js +4 -0
  192. package/dist/ionic/p-DqN5EA2O.js +4 -0
  193. package/dist/ionic/p-aaeedb6b.entry.js +4 -0
  194. package/dist/ionic/p-bfc9bb0f.entry.js +4 -0
  195. package/dist/ionic/p-c38b648e.entry.js +4 -0
  196. package/dist/ionic/{p-3a541154.entry.js → p-ca2ab74d.entry.js} +1 -1
  197. package/dist/ionic/p-d889ff6d.entry.js +4 -0
  198. package/dist/types/components/checkbox/checkbox.d.ts +1 -0
  199. package/dist/types/components/datetime/datetime.d.ts +8 -0
  200. package/dist/types/components/fab-button/fab-button.d.ts +15 -0
  201. package/dist/types/components/item/item.d.ts +19 -0
  202. package/dist/types/components/radio/radio.d.ts +1 -0
  203. package/dist/types/components/tab/tab.d.ts +1 -1
  204. package/dist/types/components/toggle/toggle.d.ts +1 -0
  205. package/dist/types/components.d.ts +15 -2
  206. package/dist/types/utils/forms/index.d.ts +1 -0
  207. package/dist/types/utils/forms/item-multiple-inputs.d.ts +13 -0
  208. package/dist/types/utils/test/playwright/apply-keyboard-focus.d.ts +16 -0
  209. package/dist/types/utils/test/playwright/index.d.ts +1 -0
  210. package/hydrate/index.js +382 -79
  211. package/hydrate/index.mjs +382 -79
  212. package/package.json +5 -5
  213. package/components/p-5bE_Wz4Y.js +0 -4
  214. package/components/p-B60hm8Qv.js +0 -4
  215. package/components/p-BAYYcg3o.js +0 -4
  216. package/components/p-BjoEPDW5.js +0 -4
  217. package/components/p-C2lKgrXx.js +0 -4
  218. package/components/p-D7bSXQD3.js +0 -4
  219. package/components/p-DIE4pXMl.js +0 -4
  220. package/components/p-W5nO8mX_.js +0 -4
  221. package/components/p-W9CZ2mWX.js +0 -4
  222. package/components/p-XlSIJDJ-.js +0 -4
  223. package/components/p-ryqmO0B-.js +0 -4
  224. package/dist/ionic/p-0d005398.entry.js +0 -4
  225. package/dist/ionic/p-1ae21e4c.entry.js +0 -4
  226. package/dist/ionic/p-2f55dc1a.entry.js +0 -4
  227. package/dist/ionic/p-3a126bca.entry.js +0 -4
  228. package/dist/ionic/p-3a7d1e91.entry.js +0 -4
  229. package/dist/ionic/p-81ea5652.entry.js +0 -4
  230. package/dist/ionic/p-8c8eee7d.entry.js +0 -4
  231. package/dist/ionic/p-9a65ac7f.entry.js +0 -4
  232. package/dist/ionic/p-DAAFkPFT.js +0 -4
  233. package/dist/ionic/p-a21add2f.entry.js +0 -4
  234. package/dist/ionic/p-ec090e0a.entry.js +0 -4
  235. package/dist/ionic/p-fabcce6c.entry.js +0 -4
  236. package/dist/ionic/p-facfde02.entry.js +0 -4
  237. package/dist/ionic/p-xOfi7-Zn.js +0 -4
@@ -497,7 +497,30 @@ export const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation
497
497
  * to the overlay container.
498
498
  */
499
499
  if (overlay.keyboardClose && (document.activeElement === null || !overlay.el.contains(document.activeElement))) {
500
- overlay.el.focus();
500
+ /**
501
+ * Some overlays (e.g. modal) put the dialog role and accessible label
502
+ * on the `.ion-overlay-wrapper` instead of the host. Screen readers
503
+ * need focus on the element with `role="dialog"` to properly announce
504
+ * and navigate the dialog.
505
+ *
506
+ * We only target wrappers with `tabindex`, since `role="dialog"` alone
507
+ * does not make an element focusable. If no focusable dialog wrapper
508
+ * exists (e.g. picker-legacy), we fall back to the host.
509
+ */
510
+ const overlayWrapper = getElementRoot(overlay.el).querySelector('[role="dialog"][tabindex]');
511
+ const focusTarget = overlayWrapper !== null && overlayWrapper !== void 0 ? overlayWrapper : overlay.el;
512
+ /**
513
+ * `preventScroll` keeps this a pure focus move so the viewport does not
514
+ * jump when the wrapper is partially off-screen (e.g. a sheet modal).
515
+ * Guard the options call so an older engine that mishandles it can never
516
+ * reject present(); we fall back to a plain focus() in that case.
517
+ */
518
+ try {
519
+ focusTarget.focus({ preventScroll: true });
520
+ }
521
+ catch (_c) {
522
+ focusTarget.focus();
523
+ }
501
524
  }
502
525
  /**
503
526
  * If this overlay was previously dismissed without being
@@ -0,0 +1,25 @@
1
+ /*!
2
+ * (C) Ionic http://ionicframework.com - MIT License
3
+ */
4
+ import { expect } from "@playwright/test";
5
+ /**
6
+ * Puts an element into the keyboard focus state that draws the focus indicator.
7
+ * Requires an `ion-app` so `startFocusVisible` is running. Its listeners attach
8
+ * asynchronously, so focus is retried until `ion-focused` sticks.
9
+ *
10
+ * `Shift` re-enables keyboard mode without moving focus, in case a pointer event
11
+ * earlier in the test turned it off. Focus moves programmatically because Firefox
12
+ * cannot move it back into the page once blurred, so an early Tab is unretryable.
13
+ *
14
+ * Pass `indicatorLocator` when something other than the focused element gets
15
+ * `ion-focused`. A checkbox or radio alone in an item has no `ion-focusable` class of
16
+ * its own because the item draws the indicator for it, so wait on the item.
17
+ */
18
+ export const applyKeyboardFocus = async (page, locator, indicatorLocator = locator) => {
19
+ await expect(async () => {
20
+ await page.evaluate(() => { var _a; return (_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.blur(); });
21
+ await page.keyboard.press('Shift');
22
+ await locator.focus();
23
+ await expect(indicatorLocator).toHaveClass(/ion-focused/, { timeout: 250 });
24
+ }).toPass({ timeout: 5000 });
25
+ };
@@ -9,6 +9,7 @@
9
9
  * See https://playwright.dev/docs/api/class-mouse#mouse-move for more information.
10
10
  */
11
11
  export const dragElementBy = async (el, page, dragByX = 0, dragByY = 0, startXCoord, startYCoord, releaseDrag = true) => {
12
+ var _a;
12
13
  const boundingBox = await el.boundingBox();
13
14
  if (!boundingBox) {
14
15
  throw new Error('Cannot get a bounding box for an element that is not visible. See https://playwright.dev/docs/api/class-locator#locator-bounding-box for more information');
@@ -18,6 +19,20 @@ export const dragElementBy = async (el, page, dragByX = 0, dragByY = 0, startXCo
18
19
  // Navigate to the start position.
19
20
  await page.mouse.move(startX, startY);
20
21
  await page.mouse.down();
22
+ // Firefox treats focusable elements (tabindex="-1") as draggable text and
23
+ // initiates text selection on mouse.down(). In Playwright, this selection
24
+ // locks in before the gesture detector fires, blocking pointer events.
25
+ // Clearing it here allows the drag gesture to proceed normally.
26
+ //
27
+ // This is scoped to Firefox because the extra page.evaluate() is an awaited
28
+ // round-trip that adds variable latency between mouse.down() and the first
29
+ // mouse.move(). Chromium and WebKit don't need the selection clear, and on
30
+ // WebKit that latency perturbs the timing-derived gesture velocity, causing
31
+ // the item to settle a few pixels off and flaking screenshot comparisons
32
+ // (e.g. item-sliding safe-area tests).
33
+ if (((_a = page.context().browser()) === null || _a === void 0 ? void 0 : _a.browserType().name()) === 'firefox') {
34
+ await page.evaluate(() => { var _a; return (_a = window.getSelection()) === null || _a === void 0 ? void 0 : _a.removeAllRanges(); });
35
+ }
21
36
  // Drag the element.
22
37
  await moveElement(page, startX, startY, dragByX, dragByY);
23
38
  if (releaseDrag) {
@@ -6,6 +6,7 @@ export * from './playwright-declarations';
6
6
  export * from './page/event-spy';
7
7
  export * from './page/utils';
8
8
  export * from './drag-element';
9
+ export * from './apply-keyboard-focus';
9
10
  export * from './matchers';
10
11
  export * from './viewports';
11
12
  export * from './generator';
package/dist/docs.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "timestamp": "2026-06-28T16:23:29",
2
+ "timestamp": "2026-08-08T17:09:51",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
5
  "version": "4.43.5",
@@ -10562,6 +10562,40 @@
10562
10562
  "getter": false,
10563
10563
  "setter": false
10564
10564
  },
10565
+ {
10566
+ "name": "form",
10567
+ "type": "HTMLFormElement | string | undefined",
10568
+ "complexType": {
10569
+ "original": "string | HTMLFormElement",
10570
+ "resolved": "HTMLFormElement | string | undefined",
10571
+ "references": {
10572
+ "HTMLFormElement": {
10573
+ "location": "global",
10574
+ "id": "global::HTMLFormElement"
10575
+ }
10576
+ }
10577
+ },
10578
+ "mutable": false,
10579
+ "attr": "form",
10580
+ "reflectToAttr": false,
10581
+ "docs": "The HTML form element or form element id. Used to submit a form when the button is not a child of the form.",
10582
+ "docsTags": [],
10583
+ "values": [
10584
+ {
10585
+ "type": "HTMLFormElement"
10586
+ },
10587
+ {
10588
+ "type": "string"
10589
+ },
10590
+ {
10591
+ "type": "undefined"
10592
+ }
10593
+ ],
10594
+ "optional": true,
10595
+ "required": false,
10596
+ "getter": false,
10597
+ "setter": false
10598
+ },
10565
10599
  {
10566
10600
  "name": "href",
10567
10601
  "type": "string | undefined",
@@ -38144,6 +38178,11 @@
38144
38178
  "docstring": "",
38145
38179
  "path": "src/interface.d.ts"
38146
38180
  },
38181
+ "src/components/datetime/datetime-interface.ts::DatetimeParts": {
38182
+ "declaration": "export interface DatetimeParts {\n month: number;\n day: number | null;\n year: number;\n dayOfWeek?: number | null;\n hour?: number;\n minute?: number;\n ampm?: 'am' | 'pm';\n isAdjacentDay?: boolean;\n}",
38183
+ "docstring": "",
38184
+ "path": "src/components/datetime/datetime-interface.ts"
38185
+ },
38147
38186
  "src/components/picker-column/picker-column-interfaces.ts::PickerColumnChangeEventDetail": {
38148
38187
  "declaration": "export interface PickerColumnChangeEventDetail {\n value: PickerColumnValue;\n}",
38149
38188
  "docstring": "",