@ionic/core 8.8.18-dev.11786385944.17aca7e5 → 8.8.18-dev.11786399582.1d58c37d

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 (115) hide show
  1. package/components/ion-content.js +1 -1
  2. package/components/ion-datetime.js +1 -1
  3. package/components/ion-modal.js +1 -1
  4. package/components/ion-select-modal.js +1 -1
  5. package/components/ion-select.js +1 -1
  6. package/components/p-DRxvM2Ic.js +4 -0
  7. package/components/{p-BMaKgJFV.js → p-gYiraiT_.js} +1 -1
  8. package/components/p-yEQxMl70.js +4 -0
  9. package/dist/cjs/{animation-BJq0kcy2.js → animation-Ch16T-Nb.js} +1 -1
  10. package/dist/cjs/{app-globals-BlqrqKTN.js → app-globals-Dd89e0MR.js} +1 -1
  11. package/dist/cjs/{button-active-0mPOKmV2.js → button-active-COnxOe4X.js} +1 -1
  12. package/dist/cjs/{config-xninhj0J.js → config-D6C-KlA9.js} +1 -1
  13. package/dist/cjs/{format-PxvGiOik.js → format-BUFWn4Bn.js} +1 -1
  14. package/dist/cjs/{framework-delegate-BtICZDHr.js → framework-delegate-BgU6U9Ez.js} +1 -1
  15. package/dist/cjs/{hardware-back-button-iUuF_76h.js → hardware-back-button-CXmUnTJC.js} +1 -1
  16. package/dist/cjs/{helpers-Cv23MFHM.js → helpers-gntk8bfm.js} +1 -1
  17. package/dist/cjs/{index-BERfRao3.js → index-BS2uhvhT.js} +4 -4
  18. package/dist/cjs/{index-Ct7gcRif.js → index-BfaXsATC.js} +237 -2
  19. package/dist/cjs/{index-D81eLYUM.js → index-BhhuJ1Yx.js} +2 -2
  20. package/dist/cjs/{index-Dqpns5vP.js → index-BiRrzGDi.js} +2 -2
  21. package/dist/cjs/{index-aC4x3Fk3.js → index-ooS8B4p9.js} +5 -5
  22. package/dist/cjs/index.cjs.js +12 -12
  23. package/dist/cjs/{input-shims-DpA1zUN9.js → input-shims-Bn1cXfCM.js} +3 -3
  24. package/dist/cjs/{input.utils-DetjmtH2.js → input.utils-BwhxZooW.js} +2 -2
  25. package/dist/cjs/ion-accordion_2.cjs.entry.js +3 -3
  26. package/dist/cjs/ion-action-sheet.cjs.entry.js +8 -8
  27. package/dist/cjs/ion-alert.cjs.entry.js +9 -9
  28. package/dist/cjs/ion-app_8.cjs.entry.js +65 -15
  29. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
  30. package/dist/cjs/ion-back-button.cjs.entry.js +3 -3
  31. package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
  32. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +3 -3
  33. package/dist/cjs/ion-button_2.cjs.entry.js +3 -3
  34. package/dist/cjs/ion-card_5.cjs.entry.js +3 -3
  35. package/dist/cjs/ion-checkbox.cjs.entry.js +4 -4
  36. package/dist/cjs/ion-chip.cjs.entry.js +2 -2
  37. package/dist/cjs/ion-col_3.cjs.entry.js +2 -2
  38. package/dist/cjs/ion-datetime-button.cjs.entry.js +4 -4
  39. package/dist/cjs/ion-datetime_3.cjs.entry.js +15 -12
  40. package/dist/cjs/ion-fab_3.cjs.entry.js +3 -3
  41. package/dist/cjs/ion-img.cjs.entry.js +3 -3
  42. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +5 -5
  43. package/dist/cjs/ion-input-otp.cjs.entry.js +3 -3
  44. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +2 -2
  45. package/dist/cjs/ion-input.cjs.entry.js +5 -5
  46. package/dist/cjs/ion-item-option_3.cjs.entry.js +4 -4
  47. package/dist/cjs/ion-item_8.cjs.entry.js +3 -3
  48. package/dist/cjs/ion-loading.cjs.entry.js +8 -8
  49. package/dist/cjs/ion-menu_3.cjs.entry.js +8 -8
  50. package/dist/cjs/ion-modal.cjs.entry.js +59 -19
  51. package/dist/cjs/ion-nav_2.cjs.entry.js +6 -6
  52. package/dist/cjs/ion-picker-column-option.cjs.entry.js +3 -3
  53. package/dist/cjs/ion-picker-column.cjs.entry.js +3 -3
  54. package/dist/cjs/ion-picker.cjs.entry.js +2 -2
  55. package/dist/cjs/ion-popover.cjs.entry.js +8 -8
  56. package/dist/cjs/ion-progress-bar.cjs.entry.js +3 -3
  57. package/dist/cjs/ion-radio_2.cjs.entry.js +4 -4
  58. package/dist/cjs/ion-range.cjs.entry.js +4 -4
  59. package/dist/cjs/ion-refresher_2.cjs.entry.js +6 -6
  60. package/dist/cjs/ion-reorder_2.cjs.entry.js +4 -4
  61. package/dist/cjs/ion-ripple-effect.cjs.entry.js +2 -2
  62. package/dist/cjs/ion-route_4.cjs.entry.js +4 -4
  63. package/dist/cjs/ion-searchbar.cjs.entry.js +3 -3
  64. package/dist/cjs/ion-segment-content.cjs.entry.js +1 -1
  65. package/dist/cjs/ion-segment-view.cjs.entry.js +1 -1
  66. package/dist/cjs/ion-segment_2.cjs.entry.js +3 -3
  67. package/dist/cjs/ion-select-modal.cjs.entry.js +6 -6
  68. package/dist/cjs/ion-select_3.cjs.entry.js +7 -7
  69. package/dist/cjs/ion-spinner.cjs.entry.js +2 -2
  70. package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
  71. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +3 -3
  72. package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
  73. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  74. package/dist/cjs/ion-textarea.cjs.entry.js +5 -5
  75. package/dist/cjs/ion-toast.cjs.entry.js +8 -8
  76. package/dist/cjs/ion-toggle.cjs.entry.js +4 -4
  77. package/dist/cjs/{ionic-global-B-cA6LkY.js → ionic-global-BerQGEpE.js} +1 -1
  78. package/dist/cjs/ionic.cjs.js +4 -4
  79. package/dist/cjs/{ios.transition-BOSWOaiK.js → ios.transition-IMJRwn29.js} +4 -4
  80. package/dist/cjs/{item-multiple-inputs-D-gyg57c.js → item-multiple-inputs-jOJZE_I0.js} +1 -1
  81. package/dist/cjs/loader.cjs.js +4 -4
  82. package/dist/cjs/{md.transition-B8-wBZqt.js → md.transition-CgQZxcoT.js} +4 -4
  83. package/dist/cjs/{notch-controller-18PzRGXd.js → notch-controller-_SwR025y.js} +1 -1
  84. package/dist/cjs/{overlays-DdtIYQUH.js → overlays-DuSEMhIW.js} +5 -5
  85. package/dist/cjs/{status-tap-N1kaBbuk.js → status-tap-CSvBT7FV.js} +3 -3
  86. package/dist/cjs/{swipe-back-C0GCB18x.js → swipe-back-CuIiziaa.js} +2 -2
  87. package/dist/collection/components/content/content.js +55 -4
  88. package/dist/collection/components/datetime/datetime.js +8 -5
  89. package/dist/collection/components/modal/modal.js +16 -11
  90. package/dist/collection/components/modal/safe-area-utils.js +35 -0
  91. package/dist/docs.json +2 -2
  92. package/dist/esm/index-tcQvqkiX.js +218 -1
  93. package/dist/esm/ion-app_8.entry.js +54 -4
  94. package/dist/esm/ion-datetime_3.entry.js +7 -4
  95. package/dist/esm/ion-modal.entry.js +50 -10
  96. package/dist/esm/ionic.js +1 -1
  97. package/dist/esm/loader.js +1 -1
  98. package/dist/html.html-data.json +1 -1
  99. package/dist/ionic/ionic.esm.js +1 -1
  100. package/dist/ionic/p-5e2f73ee.entry.js +4 -0
  101. package/dist/ionic/p-9fa3c405.entry.js +4 -0
  102. package/dist/ionic/p-ea56626d.entry.js +4 -0
  103. package/dist/types/components/content/content.d.ts +12 -0
  104. package/dist/types/components/datetime/datetime.d.ts +5 -1
  105. package/dist/types/components/modal/modal.d.ts +5 -3
  106. package/dist/types/components/modal/safe-area-utils.d.ts +6 -0
  107. package/dist/types/components.d.ts +2 -2
  108. package/hydrate/index.js +93 -17
  109. package/hydrate/index.mjs +93 -17
  110. package/package.json +3 -2
  111. package/components/p-BvmB20aD.js +0 -4
  112. package/components/p-scxfI1Dd.js +0 -4
  113. package/dist/ionic/p-15c9319c.entry.js +0 -4
  114. package/dist/ionic/p-5018dfc8.entry.js +0 -4
  115. package/dist/ionic/p-d1aac015.entry.js +0 -4
@@ -250,7 +250,224 @@ var loadModule = (cmpMeta, hostRef, hmrVersionId) => {
250
250
  if (module) {
251
251
  return module[exportName];
252
252
  }
253
- /*!__STENCIL_STATIC_IMPORT_SWITCH__*/
253
+
254
+ if (!hmrVersionId || !BUILD.hotModuleReplacement) {
255
+ const processMod = importedModule => {
256
+ cmpModules.set(bundleId, importedModule);
257
+ return importedModule[exportName];
258
+ }
259
+ switch(bundleId) {
260
+
261
+ case 'ion-action-sheet':
262
+ return import(
263
+ /* webpackMode: "lazy" */
264
+ './ion-action-sheet.entry.js').then(processMod, consoleError);
265
+ case 'ion-alert':
266
+ return import(
267
+ /* webpackMode: "lazy" */
268
+ './ion-alert.entry.js').then(processMod, consoleError);
269
+ case 'ion-back-button':
270
+ return import(
271
+ /* webpackMode: "lazy" */
272
+ './ion-back-button.entry.js').then(processMod, consoleError);
273
+ case 'ion-backdrop':
274
+ return import(
275
+ /* webpackMode: "lazy" */
276
+ './ion-backdrop.entry.js').then(processMod, consoleError);
277
+ case 'ion-checkbox':
278
+ return import(
279
+ /* webpackMode: "lazy" */
280
+ './ion-checkbox.entry.js').then(processMod, consoleError);
281
+ case 'ion-chip':
282
+ return import(
283
+ /* webpackMode: "lazy" */
284
+ './ion-chip.entry.js').then(processMod, consoleError);
285
+ case 'ion-input':
286
+ return import(
287
+ /* webpackMode: "lazy" */
288
+ './ion-input.entry.js').then(processMod, consoleError);
289
+ case 'ion-textarea':
290
+ return import(
291
+ /* webpackMode: "lazy" */
292
+ './ion-textarea.entry.js').then(processMod, consoleError);
293
+ case 'ion-loading':
294
+ return import(
295
+ /* webpackMode: "lazy" */
296
+ './ion-loading.entry.js').then(processMod, consoleError);
297
+ case 'ion-modal':
298
+ return import(
299
+ /* webpackMode: "lazy" */
300
+ './ion-modal.entry.js').then(processMod, consoleError);
301
+ case 'ion-img':
302
+ return import(
303
+ /* webpackMode: "lazy" */
304
+ './ion-img.entry.js').then(processMod, consoleError);
305
+ case 'ion-popover':
306
+ return import(
307
+ /* webpackMode: "lazy" */
308
+ './ion-popover.entry.js').then(processMod, consoleError);
309
+ case 'ion-progress-bar':
310
+ return import(
311
+ /* webpackMode: "lazy" */
312
+ './ion-progress-bar.entry.js').then(processMod, consoleError);
313
+ case 'ion-range':
314
+ return import(
315
+ /* webpackMode: "lazy" */
316
+ './ion-range.entry.js').then(processMod, consoleError);
317
+ case 'ion-ripple-effect':
318
+ return import(
319
+ /* webpackMode: "lazy" */
320
+ './ion-ripple-effect.entry.js').then(processMod, consoleError);
321
+ case 'ion-searchbar':
322
+ return import(
323
+ /* webpackMode: "lazy" */
324
+ './ion-searchbar.entry.js').then(processMod, consoleError);
325
+ case 'ion-spinner':
326
+ return import(
327
+ /* webpackMode: "lazy" */
328
+ './ion-spinner.entry.js').then(processMod, consoleError);
329
+ case 'ion-split-pane':
330
+ return import(
331
+ /* webpackMode: "lazy" */
332
+ './ion-split-pane.entry.js').then(processMod, consoleError);
333
+ case 'ion-text':
334
+ return import(
335
+ /* webpackMode: "lazy" */
336
+ './ion-text.entry.js').then(processMod, consoleError);
337
+ case 'ion-toast':
338
+ return import(
339
+ /* webpackMode: "lazy" */
340
+ './ion-toast.entry.js').then(processMod, consoleError);
341
+ case 'ion-toggle':
342
+ return import(
343
+ /* webpackMode: "lazy" */
344
+ './ion-toggle.entry.js').then(processMod, consoleError);
345
+ case 'ion-button_2':
346
+ return import(
347
+ /* webpackMode: "lazy" */
348
+ './ion-button_2.entry.js').then(processMod, consoleError);
349
+ case 'ion-infinite-scroll_2':
350
+ return import(
351
+ /* webpackMode: "lazy" */
352
+ './ion-infinite-scroll_2.entry.js').then(processMod, consoleError);
353
+ case 'ion-nav_2':
354
+ return import(
355
+ /* webpackMode: "lazy" */
356
+ './ion-nav_2.entry.js').then(processMod, consoleError);
357
+ case 'ion-radio_2':
358
+ return import(
359
+ /* webpackMode: "lazy" */
360
+ './ion-radio_2.entry.js').then(processMod, consoleError);
361
+ case 'ion-refresher_2':
362
+ return import(
363
+ /* webpackMode: "lazy" */
364
+ './ion-refresher_2.entry.js').then(processMod, consoleError);
365
+ case 'ion-reorder_2':
366
+ return import(
367
+ /* webpackMode: "lazy" */
368
+ './ion-reorder_2.entry.js').then(processMod, consoleError);
369
+ case 'ion-segment_2':
370
+ return import(
371
+ /* webpackMode: "lazy" */
372
+ './ion-segment_2.entry.js').then(processMod, consoleError);
373
+ case 'ion-tab_2':
374
+ return import(
375
+ /* webpackMode: "lazy" */
376
+ './ion-tab_2.entry.js').then(processMod, consoleError);
377
+ case 'ion-tab-bar_2':
378
+ return import(
379
+ /* webpackMode: "lazy" */
380
+ './ion-tab-bar_2.entry.js').then(processMod, consoleError);
381
+ case 'ion-accordion_2':
382
+ return import(
383
+ /* webpackMode: "lazy" */
384
+ './ion-accordion_2.entry.js').then(processMod, consoleError);
385
+ case 'ion-breadcrumb_2':
386
+ return import(
387
+ /* webpackMode: "lazy" */
388
+ './ion-breadcrumb_2.entry.js').then(processMod, consoleError);
389
+ case 'ion-avatar_3':
390
+ return import(
391
+ /* webpackMode: "lazy" */
392
+ './ion-avatar_3.entry.js').then(processMod, consoleError);
393
+ case 'ion-datetime_3':
394
+ return import(
395
+ /* webpackMode: "lazy" */
396
+ './ion-datetime_3.entry.js').then(processMod, consoleError);
397
+ case 'ion-fab_3':
398
+ return import(
399
+ /* webpackMode: "lazy" */
400
+ './ion-fab_3.entry.js').then(processMod, consoleError);
401
+ case 'ion-col_3':
402
+ return import(
403
+ /* webpackMode: "lazy" */
404
+ './ion-col_3.entry.js').then(processMod, consoleError);
405
+ case 'ion-item-option_3':
406
+ return import(
407
+ /* webpackMode: "lazy" */
408
+ './ion-item-option_3.entry.js').then(processMod, consoleError);
409
+ case 'ion-menu_3':
410
+ return import(
411
+ /* webpackMode: "lazy" */
412
+ './ion-menu_3.entry.js').then(processMod, consoleError);
413
+ case 'ion-select_3':
414
+ return import(
415
+ /* webpackMode: "lazy" */
416
+ './ion-select_3.entry.js').then(processMod, consoleError);
417
+ case 'ion-route_4':
418
+ return import(
419
+ /* webpackMode: "lazy" */
420
+ './ion-route_4.entry.js').then(processMod, consoleError);
421
+ case 'ion-card_5':
422
+ return import(
423
+ /* webpackMode: "lazy" */
424
+ './ion-card_5.entry.js').then(processMod, consoleError);
425
+ case 'ion-app_8':
426
+ return import(
427
+ /* webpackMode: "lazy" */
428
+ './ion-app_8.entry.js').then(processMod, consoleError);
429
+ case 'ion-item_8':
430
+ return import(
431
+ /* webpackMode: "lazy" */
432
+ './ion-item_8.entry.js').then(processMod, consoleError);
433
+ case 'ion-datetime-button':
434
+ return import(
435
+ /* webpackMode: "lazy" */
436
+ './ion-datetime-button.entry.js').then(processMod, consoleError);
437
+ case 'ion-input-otp':
438
+ return import(
439
+ /* webpackMode: "lazy" */
440
+ './ion-input-otp.entry.js').then(processMod, consoleError);
441
+ case 'ion-input-password-toggle':
442
+ return import(
443
+ /* webpackMode: "lazy" */
444
+ './ion-input-password-toggle.entry.js').then(processMod, consoleError);
445
+ case 'ion-segment-content':
446
+ return import(
447
+ /* webpackMode: "lazy" */
448
+ './ion-segment-content.entry.js').then(processMod, consoleError);
449
+ case 'ion-segment-view':
450
+ return import(
451
+ /* webpackMode: "lazy" */
452
+ './ion-segment-view.entry.js').then(processMod, consoleError);
453
+ case 'ion-picker':
454
+ return import(
455
+ /* webpackMode: "lazy" */
456
+ './ion-picker.entry.js').then(processMod, consoleError);
457
+ case 'ion-picker-column':
458
+ return import(
459
+ /* webpackMode: "lazy" */
460
+ './ion-picker-column.entry.js').then(processMod, consoleError);
461
+ case 'ion-picker-column-option':
462
+ return import(
463
+ /* webpackMode: "lazy" */
464
+ './ion-picker-column-option.entry.js').then(processMod, consoleError);
465
+ case 'ion-select-modal':
466
+ return import(
467
+ /* webpackMode: "lazy" */
468
+ './ion-select-modal.entry.js').then(processMod, consoleError);
469
+ }
470
+ }
254
471
  return import(
255
472
  /* @vite-ignore */
256
473
  /* webpackInclude: /\.entry\.js$/ */
@@ -6,7 +6,7 @@ import { shouldUseCloseWatcher } from './hardware-back-button-B93Gru0Y.js';
6
6
  import { a as isPlatform, b as getIonMode } from './ionic-global-Cp_eT4sZ.js';
7
7
  import { i as inheritAriaAttributes, h as hasLazyBuild, c as componentOnReady, e as clamp, s as shallowEqualStringMap } from './helpers-HEqiOzXb.js';
8
8
  import { i as isRTL } from './dir-C53feagD.js';
9
- import { c as createColorClasses, h as hostContext } from './theme-DiVJyqlX.js';
9
+ import { h as hostContext, c as createColorClasses } from './theme-DiVJyqlX.js';
10
10
  import { b as findIonContent, p as printIonContentErrorMsg, g as getScrollElement } from './index-Dw-wN0Ja.js';
11
11
  import { c as createKeyboardController } from './keyboard-controller-BaaVITYt.js';
12
12
  import { g as getTimeGivenProgression } from './cubic-bezier-hHmYLOfE.js';
@@ -224,6 +224,9 @@ const Content = class {
224
224
  */
225
225
  this.scrollEvents = false;
226
226
  }
227
+ fullscreenChanged() {
228
+ this.setupFullscreenResizeObserver();
229
+ }
227
230
  componentWillLoad() {
228
231
  this.inheritedAttributes = inheritAriaAttributes(this.el);
229
232
  }
@@ -263,6 +266,12 @@ const Content = class {
263
266
  closestTabs.addEventListener('ionTabBarLoaded', this.tabsLoadCallback);
264
267
  }
265
268
  }
269
+ // Re-observe on reattach, since componentDidLoad only fires once.
270
+ this.setupFullscreenResizeObserver();
271
+ }
272
+ componentDidLoad() {
273
+ // The custom elements build assigns fullscreen after connectedCallback.
274
+ this.setupFullscreenResizeObserver();
266
275
  }
267
276
  disconnectedCallback() {
268
277
  this.onScrollEnd();
@@ -284,6 +293,42 @@ const Content = class {
284
293
  clearTimeout(this.resizeTimeout);
285
294
  this.resizeTimeout = null;
286
295
  }
296
+ this.destroyFullscreenResizeObserver();
297
+ }
298
+ /**
299
+ * Header and footer sizes can change after load without a window resize
300
+ * firing, so the `resize` listener alone misses those changes.
301
+ *
302
+ * Popover content is excluded because `contain: none` lets its offsets drive
303
+ * the host's own height, which would feed back into the observer.
304
+ */
305
+ setupFullscreenResizeObserver() {
306
+ if (typeof ResizeObserver === 'undefined') {
307
+ return;
308
+ }
309
+ if (!this.fullscreen || hostContext('ion-popover', this.el)) {
310
+ this.destroyFullscreenResizeObserver();
311
+ return;
312
+ }
313
+ if (this.fullscreenResizeObserver !== undefined) {
314
+ return;
315
+ }
316
+ this.fullscreenResizeObserver = new ResizeObserver(() => {
317
+ // A hidden page reports a 0x0 box, which would zero the offsets. Same
318
+ // reasoning as the guard in onResize, minus its debounce so the
319
+ // correction lands in the next frame instead of 100ms later.
320
+ if (this.el.offsetParent === null) {
321
+ return;
322
+ }
323
+ this.resize();
324
+ });
325
+ this.fullscreenResizeObserver.observe(this.el);
326
+ }
327
+ destroyFullscreenResizeObserver() {
328
+ if (this.fullscreenResizeObserver !== undefined) {
329
+ this.fullscreenResizeObserver.disconnect();
330
+ this.fullscreenResizeObserver = undefined;
331
+ }
287
332
  }
288
333
  /**
289
334
  * Rotating certain devices can update
@@ -522,7 +567,7 @@ const Content = class {
522
567
  const forceOverscroll = this.shouldForceOverscroll();
523
568
  const transitionShadow = mode === 'ios';
524
569
  this.resize();
525
- return (h(Host, Object.assign({ key: '8c1bc4a4df8698d3884741eb38512dc059210c50', role: isMainContent ? 'main' : undefined, class: createColorClasses(this.color, {
570
+ return (h(Host, Object.assign({ key: '9551c759df407b10d809171641fc6e8f14d92219', role: isMainContent ? 'main' : undefined, class: createColorClasses(this.color, {
526
571
  [mode]: true,
527
572
  'content-fullscreen': this.fullscreen,
528
573
  'content-sizing': hostContext('ion-popover', this.el),
@@ -531,14 +576,19 @@ const Content = class {
531
576
  }), style: {
532
577
  '--offset-top': `${this.cTop}px`,
533
578
  '--offset-bottom': `${this.cBottom}px`,
534
- } }, inheritedAttributes), h("div", { key: '5e7412549b51ef7543d9378ecab9aac6bc461588', ref: (el) => (this.backgroundContentEl = el), id: "background-content", part: "background" }), fixedSlotPlacement === 'before' ? h("slot", { name: "fixed" }) : null, h("div", { key: '33f6fbf7e1e027c7cbd2dda95b487f18dc648cef', class: {
579
+ } }, inheritedAttributes), h("div", { key: 'c6de8fd226f0d10a534eb107fe032ac155fbe68e', ref: (el) => (this.backgroundContentEl = el), id: "background-content", part: "background" }), fixedSlotPlacement === 'before' ? h("slot", { name: "fixed" }) : null, h("div", { key: '082fc2936061360060b48221ecb1c864a3711fa0', class: {
535
580
  'inner-scroll': true,
536
581
  'scroll-x': scrollX,
537
582
  'scroll-y': scrollY,
538
583
  overscroll: (scrollX || scrollY) && forceOverscroll,
539
- }, ref: (scrollEl) => (this.scrollEl = scrollEl), onScroll: this.scrollEvents ? (ev) => this.onScroll(ev) : undefined, part: "scroll" }, h("slot", { key: '00c8fe7b9e73533c702273c9457d274195d54e98' })), transitionShadow ? (h("div", { class: "transition-effect" }, h("div", { class: "transition-cover" }), h("div", { class: "transition-shadow" }))) : null, fixedSlotPlacement === 'after' ? h("slot", { name: "fixed" }) : null));
584
+ }, ref: (scrollEl) => (this.scrollEl = scrollEl), onScroll: this.scrollEvents ? (ev) => this.onScroll(ev) : undefined, part: "scroll" }, h("slot", { key: '0d2286206facb22696a9ca7e74a3f6b7d2397aab' })), transitionShadow ? (h("div", { class: "transition-effect" }, h("div", { class: "transition-cover" }), h("div", { class: "transition-shadow" }))) : null, fixedSlotPlacement === 'after' ? h("slot", { name: "fixed" }) : null));
540
585
  }
541
586
  get el() { return getElement(this); }
587
+ static get watchers() { return {
588
+ "fullscreen": [{
589
+ "fullscreenChanged": 0
590
+ }]
591
+ }; }
542
592
  };
543
593
  const getParentElement = (el) => {
544
594
  var _a;
@@ -771,6 +771,10 @@ const Datetime = class {
771
771
  * Set true only by `visibleCallback`. Lets `hiddenCallback` ignore the
772
772
  * synthetic "not intersecting" entry IntersectionObserver fires on
773
773
  * `observe()` when the host mounts offscreen.
774
+ *
775
+ * Don't reset this in `disconnectedCallback`. Overlays disconnect and
776
+ * reconnect the host without re-creating the observers, so a reset there
777
+ * makes `hiddenCallback` miss the dismissal.
774
778
  */
775
779
  this.hasBeenIntersecting = false;
776
780
  this.prevPresentation = null;
@@ -789,7 +793,7 @@ const Datetime = class {
789
793
  /**
790
794
  * The color to use from your application's color palette.
791
795
  * Default options are: `"primary"`, `"secondary"`, `"tertiary"`, `"success"`, `"warning"`, `"danger"`, `"light"`, `"medium"`, and `"dark"`.
792
- * For more information on colors, see [theming](/docs/theming/basics).
796
+ * For more information on colors, refer to [theming](/docs/theming/basics).
793
797
  */
794
798
  this.color = 'primary';
795
799
  /**
@@ -1654,7 +1658,6 @@ const Datetime = class {
1654
1658
  this.clearFocusVisible = undefined;
1655
1659
  }
1656
1660
  this.loadTimeoutCleanup();
1657
- this.hasBeenIntersecting = false;
1658
1661
  }
1659
1662
  initializeListeners() {
1660
1663
  this.initializeCalendarListener();
@@ -2465,7 +2468,7 @@ const Datetime = class {
2465
2468
  const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
2466
2469
  const hasWheelVariant = hasDatePresentation && preferWheel;
2467
2470
  renderHiddenInput(true, el, name, formatValue(value), disabled);
2468
- return (h(Host, { key: '5e0b83cb88a87945eaae2f9402751819b75452ee', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: Object.assign({}, createColorClasses(color, {
2471
+ return (h(Host, { key: '48555ab73ae3f22b56d15e83ff5e29b854ccc2ef', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: Object.assign({}, createColorClasses(color, {
2469
2472
  [mode]: true,
2470
2473
  ['datetime-readonly']: readonly,
2471
2474
  ['datetime-disabled']: disabled,
@@ -2475,7 +2478,7 @@ const Datetime = class {
2475
2478
  [`datetime-size-${size}`]: true,
2476
2479
  [`datetime-prefer-wheel`]: hasWheelVariant,
2477
2480
  [`datetime-grid`]: isGridStyle,
2478
- })) }, h("div", { key: '9f9ba72e9879525961b00abe342a7891492ca0ff', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
2481
+ })) }, h("div", { key: 'd09134c540f93a8cc92cdf41ad5d3623632d144f', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
2479
2482
  }
2480
2483
  get el() { return getElement(this); }
2481
2484
  static get watchers() { return {
@@ -1695,6 +1695,41 @@ const getRootSafeAreaTop = () => {
1695
1695
  }
1696
1696
  return value;
1697
1697
  };
1698
+ /**
1699
+ * Calls back when the resolved root `--ion-safe-area-top` changes, which no
1700
+ * event and no window resize covers. The probe's height tracks the variable, so
1701
+ * a change to it becomes a size change the observer can see.
1702
+ */
1703
+ const onRootSafeAreaTopChange = (callback) => {
1704
+ const doc = win === null || win === void 0 ? void 0 : win.document;
1705
+ if (!(doc === null || doc === void 0 ? void 0 : doc.body) || typeof ResizeObserver === 'undefined') {
1706
+ return () => undefined;
1707
+ }
1708
+ const probe = doc.createElement('div');
1709
+ probe.style.cssText =
1710
+ 'position:fixed;visibility:hidden;pointer-events:none;top:0;left:0;width:0;' +
1711
+ 'height:var(--ion-safe-area-top,0px);';
1712
+ doc.body.appendChild(probe);
1713
+ /**
1714
+ * Seeded with the value the caller has already applied, so a change that
1715
+ * lands before the observer's first delivery still gets reported. Comparing
1716
+ * against an unset value instead would consume that first delivery and treat
1717
+ * the new inset as the baseline.
1718
+ */
1719
+ let lastHeight = getRootSafeAreaTop();
1720
+ const observer = new ResizeObserver((entries) => {
1721
+ const { height } = entries[0].contentRect;
1722
+ if (height !== lastHeight) {
1723
+ lastHeight = height;
1724
+ callback(height);
1725
+ }
1726
+ });
1727
+ observer.observe(probe);
1728
+ return () => {
1729
+ observer.disconnect();
1730
+ probe.remove();
1731
+ };
1732
+ };
1698
1733
  /**
1699
1734
  * True when the modal host declares BOTH a non-fullscreen `--width` AND a
1700
1735
  * non-fullscreen `--height` (i.e. a centered-dialog-like modal that doesn't
@@ -2847,16 +2882,18 @@ const Modal = class {
2847
2882
  // Set the internal offset property with the resolved root safe-area-top value
2848
2883
  if (context.isSheetModal) {
2849
2884
  this.updateSheetOffsetTop();
2885
+ this.unsubscribeRootSafeAreaTop = onRootSafeAreaTopChange((safeAreaTop) => this.updateSheetOffsetTop(safeAreaTop));
2850
2886
  }
2851
2887
  }
2852
2888
  /**
2853
- * Resolves the current root --ion-safe-area-top value and sets the
2854
- * internal --ion-modal-offset-top property on the host element.
2855
- * Called on present and on resize (e.g., device rotation changes safe-area).
2889
+ * Sets the internal --ion-modal-offset-top property on the host element,
2890
+ * resolving the current root --ion-safe-area-top when no value is given.
2891
+ * Called on present, on resize (e.g., device rotation changes safe-area),
2892
+ * and whenever the root safe-area value itself changes.
2856
2893
  */
2857
- updateSheetOffsetTop() {
2858
- const safeAreaTop = getRootSafeAreaTop();
2859
- this.el.style.setProperty('--ion-modal-offset-top', `${safeAreaTop}px`);
2894
+ updateSheetOffsetTop(safeAreaTop) {
2895
+ const value = safeAreaTop !== null && safeAreaTop !== void 0 ? safeAreaTop : getRootSafeAreaTop();
2896
+ this.el.style.setProperty('--ion-modal-offset-top', `${value}px`);
2860
2897
  }
2861
2898
  /**
2862
2899
  * Updates safe-area overrides during dynamic state changes.
@@ -2955,7 +2992,10 @@ const Modal = class {
2955
2992
  * Clears all safe-area overrides and padding.
2956
2993
  */
2957
2994
  cleanupSafeAreaOverrides() {
2995
+ var _a;
2958
2996
  clearSafeAreaOverrides(this.el);
2997
+ (_a = this.unsubscribeRootSafeAreaTop) === null || _a === void 0 ? void 0 : _a.call(this);
2998
+ this.unsubscribeRootSafeAreaTop = undefined;
2959
2999
  // Remove internal sheet offset property
2960
3000
  this.el.style.removeProperty('--ion-modal-offset-top');
2961
3001
  const { contentEl } = this.findContentAndFooter();
@@ -2968,11 +3008,11 @@ const Modal = class {
2968
3008
  const isCardModal = presentingElement !== undefined && mode === 'ios';
2969
3009
  const isHandleCycle = handleBehavior === 'cycle';
2970
3010
  const isSheetModalWithHandle = isSheetModal && showHandle;
2971
- return (h(Host, Object.assign({ key: '09f09a10d858e976bc2a989f30db925348a7784c', "no-router": true,
3011
+ return (h(Host, Object.assign({ key: 'c4b2713ebc788ac8672e18fdd5069e4253c4da34', "no-router": true,
2972
3012
  // Allow the modal to be navigable when the handle is focusable
2973
3013
  tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1 }, htmlAttributes, { style: {
2974
3014
  zIndex: `${20000 + this.overlayIndex}`,
2975
- }, class: Object.assign({ [mode]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }), h("ion-backdrop", { key: 'b197319bdddf0b979ccacdb63dbceccfd9bf2560', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: 'c848ff6a10e9092cdb10a6f21c9a299a72b17ca9', class: "modal-shadow" }), h("div", Object.assign({ key: 'e7c8e67807d49098aba63dce69a1bbf9647bbab6',
3015
+ }, class: Object.assign({ [mode]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }), h("ion-backdrop", { key: '2cc0afff8a815954492138afb0fca042243afddd', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: '9844700b9436f9bfa1a69ba436e9ca46d70cf316', class: "modal-shadow" }), h("div", Object.assign({ key: 'ab1cd56ca956c773c9242fb42ff320bac7627b4b',
2976
3016
  /*
2977
3017
  role and aria-modal must be used on the
2978
3018
  same element. They must also be set inside the
@@ -2985,9 +3025,9 @@ const Modal = class {
2985
3025
  without the tabindex focus() would be a no-op and screen readers
2986
3026
  may not properly announce the dialog and its content when it opens.
2987
3027
  */
2988
- role: "dialog" }, inheritedAttributes, { "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: '0851cc75ee7367e13d1993a9c4d8b1b4de1d3bf0', class: "modal-handle",
3028
+ role: "dialog" }, inheritedAttributes, { "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: 'c7706794e04a962178640e9a9a11c56288c45e08', class: "modal-handle",
2989
3029
  // Prevents the handle from receiving keyboard focus when it does not cycle
2990
- tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), h("slot", { key: 'b4d9bc13dc0867e858db8e1c7277bd09b7fce44c', onSlotchange: this.onSlotChange }))));
3030
+ tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), h("slot", { key: 'c44fd9810cdd3286f096af98e5a4072f8f44c193', onSlotchange: this.onSlotChange }))));
2991
3031
  }
2992
3032
  get el() { return getElement(this); }
2993
3033
  static get watchers() { return {