@ionic/core 8.7.12-dev.11765060985.14ad27fb → 8.7.12-dev.11765231260.1def96ab

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 (63) hide show
  1. package/components/action-sheet.js +186 -5
  2. package/components/ion-select.js +8 -3
  3. package/components/modal.js +16 -86
  4. package/components/overlays.js +11 -15
  5. package/css/core.css +1 -1
  6. package/css/core.css.map +1 -1
  7. package/css/ionic.bundle.css +1 -1
  8. package/css/ionic.bundle.css.map +1 -1
  9. package/dist/cjs/index.cjs.js +1 -1
  10. package/dist/cjs/ion-action-sheet.cjs.entry.js +184 -5
  11. package/dist/cjs/ion-alert.cjs.entry.js +1 -1
  12. package/dist/cjs/ion-datetime_3.cjs.entry.js +1 -1
  13. package/dist/cjs/ion-loading.cjs.entry.js +1 -1
  14. package/dist/cjs/ion-menu_3.cjs.entry.js +1 -1
  15. package/dist/cjs/ion-modal.cjs.entry.js +17 -86
  16. package/dist/cjs/ion-popover.cjs.entry.js +1 -1
  17. package/dist/cjs/ion-select-modal.cjs.entry.js +1 -1
  18. package/dist/cjs/ion-select_3.cjs.entry.js +9 -4
  19. package/dist/cjs/ion-toast.cjs.entry.js +1 -1
  20. package/dist/cjs/ionic.cjs.js +1 -1
  21. package/dist/cjs/loader.cjs.js +1 -1
  22. package/dist/cjs/{overlays-D3xMmZCY.js → overlays-DxIZwUXI.js} +11 -15
  23. package/dist/collection/components/action-sheet/action-sheet.js +199 -4
  24. package/dist/collection/components/modal/modal.js +16 -86
  25. package/dist/collection/components/select/select.js +8 -3
  26. package/dist/collection/utils/overlays.js +11 -15
  27. package/dist/docs.json +14 -8
  28. package/dist/esm/index.js +1 -1
  29. package/dist/esm/ion-action-sheet.entry.js +184 -5
  30. package/dist/esm/ion-alert.entry.js +1 -1
  31. package/dist/esm/ion-datetime_3.entry.js +1 -1
  32. package/dist/esm/ion-loading.entry.js +1 -1
  33. package/dist/esm/ion-menu_3.entry.js +1 -1
  34. package/dist/esm/ion-modal.entry.js +17 -86
  35. package/dist/esm/ion-popover.entry.js +1 -1
  36. package/dist/esm/ion-select-modal.entry.js +1 -1
  37. package/dist/esm/ion-select_3.entry.js +9 -4
  38. package/dist/esm/ion-toast.entry.js +1 -1
  39. package/dist/esm/ionic.js +1 -1
  40. package/dist/esm/loader.js +1 -1
  41. package/dist/esm/{overlays-DYKBVm6h.js → overlays-BymNv-BL.js} +11 -15
  42. package/dist/ionic/index.esm.js +1 -1
  43. package/dist/ionic/ionic.esm.js +1 -1
  44. package/dist/ionic/{p-3fad4ab5.entry.js → p-0b80d700.entry.js} +1 -1
  45. package/dist/ionic/{p-a480563a.entry.js → p-15193d01.entry.js} +1 -1
  46. package/dist/ionic/p-5837f29f.entry.js +4 -0
  47. package/dist/ionic/{p-b4b6513a.entry.js → p-7da39a4d.entry.js} +1 -1
  48. package/dist/ionic/{p-caa8efa1.entry.js → p-83be404e.entry.js} +1 -1
  49. package/dist/ionic/p-8edc7565.entry.js +4 -0
  50. package/dist/ionic/{p-7928cc4d.entry.js → p-98fc09eb.entry.js} +1 -1
  51. package/dist/ionic/p-D87hU-Ly.js +4 -0
  52. package/dist/ionic/p-c69ff6d8.entry.js +4 -0
  53. package/dist/ionic/{p-985f02a8.entry.js → p-cb93126d.entry.js} +1 -1
  54. package/dist/ionic/{p-038f3a87.entry.js → p-e16b69e1.entry.js} +1 -1
  55. package/dist/types/components/action-sheet/action-sheet.d.ts +37 -0
  56. package/dist/types/components/modal/modal.d.ts +0 -13
  57. package/hydrate/index.js +220 -109
  58. package/hydrate/index.mjs +220 -109
  59. package/package.json +4 -1
  60. package/dist/ionic/p-1cf19c5a.entry.js +0 -4
  61. package/dist/ionic/p-9084d52f.entry.js +0 -4
  62. package/dist/ionic/p-CHK505Co.js +0 -4
  63. package/dist/ionic/p-ede27a66.entry.js +0 -4
@@ -118,6 +118,7 @@ const ActionSheet = /*@__PURE__*/ proxyCustomElement(class ActionSheet extends H
118
118
  this.delegateController = createDelegateController(this);
119
119
  this.lockController = createLockController();
120
120
  this.triggerController = createTriggerController();
121
+ this.hasRadioButtons = false;
121
122
  this.presented = false;
122
123
  /** @internal */
123
124
  this.hasController = false;
@@ -162,6 +163,19 @@ const ActionSheet = /*@__PURE__*/ proxyCustomElement(class ActionSheet extends H
162
163
  }
163
164
  };
164
165
  }
166
+ buttonsChanged() {
167
+ const radioButtons = this.getRadioButtons();
168
+ this.hasRadioButtons = radioButtons.length > 0;
169
+ // Initialize activeRadioId when buttons change
170
+ if (this.hasRadioButtons) {
171
+ const checkedButton = radioButtons.find((b) => { var _a; return ((_a = b.htmlAttributes) === null || _a === void 0 ? void 0 : _a['aria-checked']) === 'true'; });
172
+ if (checkedButton) {
173
+ const allButtons = this.getButtons();
174
+ const checkedIndex = allButtons.indexOf(checkedButton);
175
+ this.activeRadioId = this.getButtonId(checkedButton, checkedIndex);
176
+ }
177
+ }
178
+ }
165
179
  onIsOpenChange(newValue, oldValue) {
166
180
  if (newValue === true && oldValue === false) {
167
181
  this.present();
@@ -242,11 +256,122 @@ const ActionSheet = /*@__PURE__*/ proxyCustomElement(class ActionSheet extends H
242
256
  }
243
257
  return true;
244
258
  }
259
+ /**
260
+ * Get all buttons regardless of role.
261
+ */
245
262
  getButtons() {
246
263
  return this.buttons.map((b) => {
247
264
  return typeof b === 'string' ? { text: b } : b;
248
265
  });
249
266
  }
267
+ /**
268
+ * Get all radio buttons (buttons with role="radio").
269
+ */
270
+ getRadioButtons() {
271
+ return this.getButtons().filter((b) => {
272
+ var _a;
273
+ const role = (_a = b.htmlAttributes) === null || _a === void 0 ? void 0 : _a.role;
274
+ return role === 'radio' && !isCancel(role);
275
+ });
276
+ }
277
+ /**
278
+ * Handle radio button selection and update aria-checked state.
279
+ *
280
+ * @param button The radio button that was selected.
281
+ */
282
+ selectRadioButton(button) {
283
+ const buttonId = this.getButtonId(button);
284
+ // Set the active radio ID (this will trigger a re-render and update aria-checked)
285
+ this.activeRadioId = buttonId;
286
+ }
287
+ /**
288
+ * Get or generate an ID for a button.
289
+ *
290
+ * @param button The button for which to get the ID.
291
+ * @param index Optional index of the button in the buttons array.
292
+ * @returns The ID of the button.
293
+ */
294
+ getButtonId(button, index) {
295
+ if (button.id) {
296
+ return button.id;
297
+ }
298
+ const allButtons = this.getButtons();
299
+ const buttonIndex = index !== undefined ? index : allButtons.indexOf(button);
300
+ return `action-sheet-button-${this.overlayIndex}-${buttonIndex}`;
301
+ }
302
+ /**
303
+ * When the action sheet has radio buttons, we want to follow the
304
+ * keyboard navigation pattern for radio groups:
305
+ * - Arrow Down/Right: Move to the next radio button (wrap to first if at end)
306
+ * - Arrow Up/Left: Move to the previous radio button (wrap to last if at start)
307
+ * - Space/Enter: Select the focused radio button and trigger its handler
308
+ */
309
+ onKeydown(ev) {
310
+ // Only handle keyboard navigation if we have radio buttons
311
+ if (!this.hasRadioButtons || !this.presented) {
312
+ return;
313
+ }
314
+ const target = ev.target;
315
+ // Ignore if the target element is not within the action sheet or not a radio button
316
+ if (!this.el.contains(target) ||
317
+ !target.classList.contains('action-sheet-button') ||
318
+ target.getAttribute('role') !== 'radio') {
319
+ return;
320
+ }
321
+ // Get all radio button elements and filter out disabled ones
322
+ const radios = Array.from(this.el.querySelectorAll('.action-sheet-button[role="radio"]')).filter((el) => !el.disabled);
323
+ const currentIndex = radios.findIndex((radio) => radio.id === target.id);
324
+ if (currentIndex === -1) {
325
+ return;
326
+ }
327
+ const allButtons = this.getButtons();
328
+ const radioButtons = this.getRadioButtons();
329
+ /**
330
+ * Build a map of button element IDs to their ActionSheetButton
331
+ * config objects.
332
+ * This allows us to quickly look up which button config corresponds
333
+ * to a DOM element when handling keyboard navigation
334
+ * (e.g., whenuser presses Space/Enter or arrow keys).
335
+ * The key is the ID that was set on the DOM element during render,
336
+ * and the value is the ActionSheetButton config that contains the
337
+ * handler and other properties.
338
+ */
339
+ const buttonIdMap = new Map();
340
+ radioButtons.forEach((b) => {
341
+ const allIndex = allButtons.indexOf(b);
342
+ const buttonId = this.getButtonId(b, allIndex);
343
+ buttonIdMap.set(buttonId, b);
344
+ });
345
+ let nextEl;
346
+ if (['ArrowDown', 'ArrowRight'].includes(ev.key)) {
347
+ ev.preventDefault();
348
+ ev.stopPropagation();
349
+ nextEl = currentIndex === radios.length - 1 ? radios[0] : radios[currentIndex + 1];
350
+ }
351
+ else if (['ArrowUp', 'ArrowLeft'].includes(ev.key)) {
352
+ ev.preventDefault();
353
+ ev.stopPropagation();
354
+ nextEl = currentIndex === 0 ? radios[radios.length - 1] : radios[currentIndex - 1];
355
+ }
356
+ else if (ev.key === ' ' || ev.key === 'Enter') {
357
+ ev.preventDefault();
358
+ ev.stopPropagation();
359
+ const button = buttonIdMap.get(target.id);
360
+ if (button) {
361
+ this.selectRadioButton(button);
362
+ this.buttonClick(button);
363
+ }
364
+ return;
365
+ }
366
+ // Focus the next radio button
367
+ if (nextEl) {
368
+ const button = buttonIdMap.get(nextEl.id);
369
+ if (button) {
370
+ this.selectRadioButton(button);
371
+ nextEl.focus();
372
+ }
373
+ }
374
+ }
250
375
  connectedCallback() {
251
376
  prepareOverlay(this.el);
252
377
  this.triggerChanged();
@@ -263,6 +388,8 @@ const ActionSheet = /*@__PURE__*/ proxyCustomElement(class ActionSheet extends H
263
388
  if (!((_a = this.htmlAttributes) === null || _a === void 0 ? void 0 : _a.id)) {
264
389
  setOverlayId(this.el);
265
390
  }
391
+ // Initialize activeRadioId for radio buttons
392
+ this.buttonsChanged();
266
393
  }
267
394
  componentDidLoad() {
268
395
  /**
@@ -300,22 +427,74 @@ const ActionSheet = /*@__PURE__*/ proxyCustomElement(class ActionSheet extends H
300
427
  */
301
428
  this.triggerChanged();
302
429
  }
430
+ renderActionSheetButtons(filteredButtons) {
431
+ const mode = getIonMode(this);
432
+ const { activeRadioId } = this;
433
+ return filteredButtons.map((b, index) => {
434
+ var _a;
435
+ const isRadio = ((_a = b.htmlAttributes) === null || _a === void 0 ? void 0 : _a.role) === 'radio';
436
+ const buttonId = this.getButtonId(b, index);
437
+ const radioButtons = this.getRadioButtons();
438
+ const isActiveRadio = isRadio && buttonId === activeRadioId;
439
+ const isFirstRadio = isRadio && b === radioButtons[0];
440
+ // For radio buttons, set tabindex: 0 for the active one, -1 for others
441
+ // For non-radio buttons, use default tabindex (undefined, which means 0)
442
+ /**
443
+ * For radio buttons, set tabindex based on activeRadioId
444
+ * - If the button is the active radio, tabindex is 0
445
+ * - If no radio is active, the first radio button should have tabindex 0
446
+ * - All other radio buttons have tabindex -1
447
+ * For non-radio buttons, use default tabindex (undefined, which means 0)
448
+ */
449
+ let tabIndex;
450
+ if (isRadio) {
451
+ // Focus on the active radio button
452
+ if (isActiveRadio) {
453
+ tabIndex = 0;
454
+ }
455
+ else if (!activeRadioId && isFirstRadio) {
456
+ // No active radio, first radio gets focus
457
+ tabIndex = 0;
458
+ }
459
+ else {
460
+ // All other radios are not focusable
461
+ tabIndex = -1;
462
+ }
463
+ }
464
+ else {
465
+ tabIndex = undefined;
466
+ }
467
+ // For radio buttons, set aria-checked based on activeRadioId
468
+ // Otherwise, use the value from htmlAttributes if provided
469
+ const htmlAttrs = Object.assign({}, b.htmlAttributes);
470
+ if (isRadio) {
471
+ htmlAttrs['aria-checked'] = isActiveRadio ? 'true' : 'false';
472
+ }
473
+ return (h("button", Object.assign({}, htmlAttrs, { role: isRadio ? 'radio' : undefined, type: "button", id: buttonId, class: Object.assign(Object.assign({}, buttonClass(b)), { 'action-sheet-selected': isActiveRadio }), onClick: () => {
474
+ if (isRadio) {
475
+ this.selectRadioButton(b);
476
+ }
477
+ this.buttonClick(b);
478
+ }, disabled: b.disabled, tabIndex: tabIndex }), h("span", { class: "action-sheet-button-inner" }, b.icon && h("ion-icon", { icon: b.icon, "aria-hidden": "true", lazy: false, class: "action-sheet-icon" }), b.text), mode === 'md' && h("ion-ripple-effect", null)));
479
+ });
480
+ }
303
481
  render() {
304
- const { header, htmlAttributes, overlayIndex } = this;
482
+ const { header, htmlAttributes, overlayIndex, hasRadioButtons } = this;
305
483
  const mode = getIonMode(this);
306
484
  const allButtons = this.getButtons();
307
485
  const cancelButton = allButtons.find((b) => b.role === 'cancel');
308
486
  const buttons = allButtons.filter((b) => b.role !== 'cancel');
309
487
  const headerID = `action-sheet-${overlayIndex}-header`;
310
- return (h(Host, Object.assign({ key: '9fef156b2a1f09ca4a6c1fe1f37c374139bde03c', role: "dialog", "aria-modal": "true", "aria-labelledby": header !== undefined ? headerID : null, tabindex: "-1" }, htmlAttributes, { style: {
488
+ return (h(Host, Object.assign({ key: '173fcff5b1da7c33c267de4667591c946b8c8d03', role: "dialog", "aria-modal": "true", "aria-labelledby": header !== undefined ? headerID : null, tabindex: "-1" }, htmlAttributes, { style: {
311
489
  zIndex: `${20000 + this.overlayIndex}`,
312
- }, class: Object.assign(Object.assign({ [mode]: true }, getClassMap(this.cssClass)), { 'overlay-hidden': true, 'action-sheet-translucent': this.translucent }), onIonActionSheetWillDismiss: this.dispatchCancelHandler, onIonBackdropTap: this.onBackdropTap }), h("ion-backdrop", { key: '81cf3f7d19864e041813987b46d2d115b8466819', tappable: this.backdropDismiss }), h("div", { key: '791c6a976683646fc306a42c15c5078b6f06a45f', tabindex: "0", "aria-hidden": "true" }), h("div", { key: 'a350b489ef7852eab9dc2227ce6d92da27dd9bf9', class: "action-sheet-wrapper ion-overlay-wrapper", ref: (el) => (this.wrapperEl = el) }, h("div", { key: '69ba51ee13510c1a411d87cb4845b11b7302a36f', class: "action-sheet-container" }, h("div", { key: 'bded15b8306c36591e526f0f99e1eeabcbab3915', class: "action-sheet-group", ref: (el) => (this.groupEl = el) }, header !== undefined && (h("div", { key: '06b5147c0f6d9180fe8f12e75c9b4a0310226adc', id: headerID, class: {
490
+ }, class: Object.assign(Object.assign({ [mode]: true }, getClassMap(this.cssClass)), { 'overlay-hidden': true, 'action-sheet-translucent': this.translucent }), onIonActionSheetWillDismiss: this.dispatchCancelHandler, onIonBackdropTap: this.onBackdropTap }), h("ion-backdrop", { key: '521ede659f747864f6c974e09016436eceb7158c', tappable: this.backdropDismiss }), h("div", { key: '7a7946fc434bc444f16a70638f5e948c69d33fcd', tabindex: "0", "aria-hidden": "true" }), h("div", { key: 'bcff39a580489dbafa255842e57aa8602c6d0f18', class: "action-sheet-wrapper ion-overlay-wrapper", ref: (el) => (this.wrapperEl = el) }, h("div", { key: '84bba13ce14261f0f0daa3f9c77648c9e7f36e0e', class: "action-sheet-container" }, h("div", { key: 'd9c8ac404fd6719a7adf8cb36549f67616f9a0c4', class: "action-sheet-group", ref: (el) => (this.groupEl = el), role: hasRadioButtons ? 'radiogroup' : undefined }, header !== undefined && (h("div", { key: '180433a8ad03ef5c54728a1a8f34715b6921d658', id: headerID, class: {
313
491
  'action-sheet-title': true,
314
492
  'action-sheet-has-sub-title': this.subHeader !== undefined,
315
- } }, header, this.subHeader && h("div", { key: '54874362a75c679aba803bf4f8768f5404d2dd28', class: "action-sheet-sub-title" }, this.subHeader))), buttons.map((b) => (h("button", Object.assign({}, b.htmlAttributes, { type: "button", id: b.id, class: buttonClass(b), onClick: () => this.buttonClick(b), disabled: b.disabled }), h("span", { class: "action-sheet-button-inner" }, b.icon && h("ion-icon", { icon: b.icon, "aria-hidden": "true", lazy: false, class: "action-sheet-icon" }), b.text), mode === 'md' && h("ion-ripple-effect", null))))), cancelButton && (h("div", { key: '67b0de298eb424f3dea846a841b7a06d70e3930d', class: "action-sheet-group action-sheet-group-cancel" }, h("button", Object.assign({ key: 'e7e3f9a5495eea9b97dbf885ef36944f2e420eff' }, cancelButton.htmlAttributes, { type: "button", class: buttonClass(cancelButton), onClick: () => this.buttonClick(cancelButton) }), h("span", { key: 'f889d29ed6c3d14bbc1d805888351d87f5122377', class: "action-sheet-button-inner" }, cancelButton.icon && (h("ion-icon", { key: '7c05cf424b38c37fd40aaeb42a494387291571fb', icon: cancelButton.icon, "aria-hidden": "true", lazy: false, class: "action-sheet-icon" })), cancelButton.text), mode === 'md' && h("ion-ripple-effect", { key: 'bed927b477dc2708a5123ef560274fca9819b3d6' })))))), h("div", { key: 'c5df1b11dc15a93892d57065d3dd5fbe02e43b39', tabindex: "0", "aria-hidden": "true" })));
493
+ } }, header, this.subHeader && h("div", { key: '7138e79e61b1a8f42bc5a9175c57fa2f15d7ec5a', class: "action-sheet-sub-title" }, this.subHeader))), this.renderActionSheetButtons(buttons)), cancelButton && (h("div", { key: 'b617c722f5b8028d73ed34b69310f312c65f34a7', class: "action-sheet-group action-sheet-group-cancel" }, h("button", Object.assign({ key: 'd0dd876fc48815df3710413c201c0b445a8e16c0' }, cancelButton.htmlAttributes, { type: "button", class: buttonClass(cancelButton), onClick: () => this.buttonClick(cancelButton) }), h("span", { key: 'e7b960157cc6fc5fe92a12090b2be55e8ae072e4', class: "action-sheet-button-inner" }, cancelButton.icon && (h("ion-icon", { key: '05498ffc60cab911dbff0ecbc6168dea59ada9a5', icon: cancelButton.icon, "aria-hidden": "true", lazy: false, class: "action-sheet-icon" })), cancelButton.text), mode === 'md' && h("ion-ripple-effect", { key: '3d401346cea301be4ca03671f7370f6f4b0b6bde' })))))), h("div", { key: '971f3c5fcc07f36c28eb469a47ec0290c692e139', tabindex: "0", "aria-hidden": "true" })));
316
494
  }
317
495
  get el() { return this; }
318
496
  static get watchers() { return {
497
+ "buttons": ["buttonsChanged"],
319
498
  "isOpen": ["onIsOpenChange"],
320
499
  "trigger": ["triggerChanged"]
321
500
  }; }
@@ -340,11 +519,13 @@ const ActionSheet = /*@__PURE__*/ proxyCustomElement(class ActionSheet extends H
340
519
  "htmlAttributes": [16],
341
520
  "isOpen": [4, "is-open"],
342
521
  "trigger": [1],
522
+ "activeRadioId": [32],
343
523
  "present": [64],
344
524
  "dismiss": [64],
345
525
  "onDidDismiss": [64],
346
526
  "onWillDismiss": [64]
347
- }, undefined, {
527
+ }, [[0, "keydown", "onKeydown"]], {
528
+ "buttons": ["buttonsChanged"],
348
529
  "isOpen": ["onIsOpenChange"],
349
530
  "trigger": ["triggerChanged"]
350
531
  }]);
@@ -417,13 +417,18 @@ const Select = /*@__PURE__*/ proxyCustomElement(class Select extends HTMLElement
417
417
  .filter((cls) => cls !== 'hydrated')
418
418
  .join(' ');
419
419
  const optClass = `${OPTION_CLASS} ${copyClasses}`;
420
+ const isSelected = isOptionSelected(selectValue, value, this.compareWith);
420
421
  return {
421
- role: isOptionSelected(selectValue, value, this.compareWith) ? 'selected' : '',
422
+ role: isSelected ? 'selected' : '',
422
423
  text: option.textContent,
423
424
  cssClass: optClass,
424
425
  handler: () => {
425
426
  this.setValue(value);
426
427
  },
428
+ htmlAttributes: {
429
+ 'aria-checked': isSelected ? 'true' : 'false',
430
+ role: 'radio',
431
+ },
427
432
  };
428
433
  });
429
434
  // Add "cancel" button
@@ -804,7 +809,7 @@ const Select = /*@__PURE__*/ proxyCustomElement(class Select extends HTMLElement
804
809
  * TODO(FW-5592): Remove hasStartEndSlots condition
805
810
  */
806
811
  const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || isExpanded || hasStartEndSlots));
807
- return (h(Host, { key: '35b5e18e6f79a802ff2d46d1242e80ff755cc0b9', onClick: this.onClick, class: createColorClasses(this.color, {
812
+ return (h(Host, { key: 'd8026835993d0e6dce747098f741a06ae4e4f54d', onClick: this.onClick, class: createColorClasses(this.color, {
808
813
  [mode]: true,
809
814
  'in-item': inItem,
810
815
  'in-item-color': hostContext('ion-item.ion-color', el),
@@ -822,7 +827,7 @@ const Select = /*@__PURE__*/ proxyCustomElement(class Select extends HTMLElement
822
827
  [`select-justify-${justify}`]: justifyEnabled,
823
828
  [`select-shape-${shape}`]: shape !== undefined,
824
829
  [`select-label-placement-${labelPlacement}`]: true,
825
- }) }, h("label", { key: '6005b34a0c50bc4d7653a4276bc232ecd02e083c', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick }, this.renderLabelContainer(), h("div", { key: 'c7e07aa81ae856c057f16275dd058f37c5670a47', class: "select-wrapper-inner" }, h("slot", { key: '7fc2deefe0424404caacdbbd9e08ed43ba55d28a', name: "start" }), h("div", { key: '157d74ee717b1bc30b5f1c233a09b0c8456aa68e', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), h("slot", { key: 'ea66db304528b82bf9317730b6dce3db2612f235', name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && h("div", { key: '786eb1530b7476f0615d4e7c0bf4e7e4dc66509c', class: "select-highlight" })), this.renderBottomContent()));
830
+ }) }, h("label", { key: 'fcfb40209d6d07d49c7fdca4884b31abf6ac2567', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick }, this.renderLabelContainer(), h("div", { key: 'f191664f2290c3890bde1156157c83a6ff17dbe2', class: "select-wrapper-inner" }, h("slot", { key: '317a28d1115b4214f291e228ce0fe6fc782e57d5', name: "start" }), h("div", { key: 'db68e18abd5ca3a1023d7c7b58bf89893ae18073', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), h("slot", { key: '4274e042267c2234a198b0f65c89477898d08130', name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && h("div", { key: '2e2eb1ee2b2791e0683d9afb186fde6e938ca59c', class: "select-highlight" })), this.renderBottomContent()));
826
831
  }
827
832
  get el() { return this; }
828
833
  static get watchers() { return {
@@ -1921,13 +1921,7 @@ const Modal = /*@__PURE__*/ proxyCustomElement(class Modal extends HTMLElement {
1921
1921
  };
1922
1922
  window.addEventListener(KEYBOARD_DID_OPEN, this.keyboardOpenCallback);
1923
1923
  }
1924
- /**
1925
- * Recalculate isSheetModal because framework bindings (e.g., Angular)
1926
- * may not have been applied when componentWillLoad ran.
1927
- */
1928
- const isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined;
1929
- this.isSheetModal = isSheetModal;
1930
- if (isSheetModal) {
1924
+ if (this.isSheetModal) {
1931
1925
  this.initSheetGesture();
1932
1926
  }
1933
1927
  else if (hasCardModal) {
@@ -2009,79 +2003,6 @@ const Modal = /*@__PURE__*/ proxyCustomElement(class Modal extends HTMLElement {
2009
2003
  this.gesture = gesture;
2010
2004
  this.moveSheetToBreakpoint = moveSheetToBreakpoint;
2011
2005
  this.gesture.enable(true);
2012
- /**
2013
- * When backdrop interaction is allowed, nested router outlets from child routes
2014
- * may block pointer events to parent content. Apply passthrough styles only when
2015
- * the modal was the sole content of a child route page.
2016
- * See https://github.com/ionic-team/ionic-framework/issues/30700
2017
- */
2018
- const backdropNotBlocking = this.showBackdrop === false || this.focusTrap === false || backdropBreakpoint > 0;
2019
- if (backdropNotBlocking) {
2020
- this.setupChildRoutePassthrough();
2021
- }
2022
- }
2023
- /**
2024
- * For sheet modals that allow background interaction, sets up pointer-events
2025
- * passthrough on child route page wrappers and nested router outlets.
2026
- */
2027
- setupChildRoutePassthrough() {
2028
- var _a;
2029
- const pageParent = this.getOriginalPageParent();
2030
- // Skip ion-app (controller modals) and pages with other content (inline modals)
2031
- if (!pageParent || pageParent.tagName === 'ION-APP') {
2032
- return;
2033
- }
2034
- const hasVisibleContent = Array.from(pageParent.children).some((child) => {
2035
- var _a;
2036
- if (child === this.el)
2037
- return false;
2038
- if (child instanceof HTMLElement && window.getComputedStyle(child).display === 'none')
2039
- return false;
2040
- if (child.tagName === 'TEMPLATE' || child.tagName === 'SLOT')
2041
- return false;
2042
- if (child.nodeType === Node.TEXT_NODE && !((_a = child.textContent) === null || _a === void 0 ? void 0 : _a.trim()))
2043
- return false;
2044
- return true;
2045
- });
2046
- if (hasVisibleContent) {
2047
- return;
2048
- }
2049
- // Child route case: page only contained the modal
2050
- pageParent.classList.add('ion-page-overlay-passthrough');
2051
- // Also make nested router outlets passthrough
2052
- const routerOutlet = pageParent.parentElement;
2053
- if ((routerOutlet === null || routerOutlet === void 0 ? void 0 : routerOutlet.tagName) === 'ION-ROUTER-OUTLET' && ((_a = routerOutlet.parentElement) === null || _a === void 0 ? void 0 : _a.tagName) !== 'ION-APP') {
2054
- routerOutlet.style.setProperty('pointer-events', 'none');
2055
- routerOutlet.setAttribute('data-overlay-passthrough', 'true');
2056
- }
2057
- }
2058
- /**
2059
- * Finds the ion-page ancestor of the modal's original parent location.
2060
- */
2061
- getOriginalPageParent() {
2062
- if (!this.cachedOriginalParent) {
2063
- return null;
2064
- }
2065
- let pageParent = this.cachedOriginalParent;
2066
- while (pageParent && !pageParent.classList.contains('ion-page')) {
2067
- pageParent = pageParent.parentElement;
2068
- }
2069
- return pageParent;
2070
- }
2071
- /**
2072
- * Removes passthrough styles added by setupChildRoutePassthrough.
2073
- */
2074
- cleanupChildRoutePassthrough() {
2075
- const pageParent = this.getOriginalPageParent();
2076
- if (!pageParent) {
2077
- return;
2078
- }
2079
- pageParent.classList.remove('ion-page-overlay-passthrough');
2080
- const routerOutlet = pageParent.parentElement;
2081
- if (routerOutlet === null || routerOutlet === void 0 ? void 0 : routerOutlet.hasAttribute('data-overlay-passthrough')) {
2082
- routerOutlet.style.removeProperty('pointer-events');
2083
- routerOutlet.removeAttribute('data-overlay-passthrough');
2084
- }
2085
2006
  }
2086
2007
  sheetOnDismiss() {
2087
2008
  /**
@@ -2171,7 +2092,6 @@ const Modal = /*@__PURE__*/ proxyCustomElement(class Modal extends HTMLElement {
2171
2092
  }
2172
2093
  this.cleanupViewTransitionListener();
2173
2094
  this.cleanupParentRemovalObserver();
2174
- this.cleanupChildRoutePassthrough();
2175
2095
  }
2176
2096
  this.currentBreakpoint = undefined;
2177
2097
  this.animation = undefined;
@@ -2368,6 +2288,17 @@ const Modal = /*@__PURE__*/ proxyCustomElement(class Modal extends HTMLElement {
2368
2288
  this.cachedOriginalParent.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
2369
2289
  return;
2370
2290
  }
2291
+ /**
2292
+ * Don't observe for controller-based modals or when the parent is the
2293
+ * app root (document.body or ion-app). These parents won't be removed,
2294
+ * and observing document.body with subtree: true causes performance
2295
+ * issues with frameworks like Angular during change detection.
2296
+ */
2297
+ if (this.hasController ||
2298
+ this.cachedOriginalParent === document.body ||
2299
+ this.cachedOriginalParent.tagName === 'ION-APP') {
2300
+ return;
2301
+ }
2371
2302
  this.parentRemovalObserver = new MutationObserver((mutations) => {
2372
2303
  mutations.forEach((mutation) => {
2373
2304
  if (mutation.type === 'childList' && mutation.removedNodes.length > 0) {
@@ -2409,20 +2340,20 @@ const Modal = /*@__PURE__*/ proxyCustomElement(class Modal extends HTMLElement {
2409
2340
  const isCardModal = presentingElement !== undefined && mode === 'ios';
2410
2341
  const isHandleCycle = handleBehavior === 'cycle';
2411
2342
  const isSheetModalWithHandle = isSheetModal && showHandle;
2412
- return (h(Host, Object.assign({ key: '880d34a27983dde27c81a06bfed390bf38e43244', "no-router": true,
2343
+ return (h(Host, Object.assign({ key: '5d8261a1a174d83642c0f7f2aa4f6c265f50fa57', "no-router": true,
2413
2344
  // Allow the modal to be navigable when the handle is focusable
2414
2345
  tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1 }, htmlAttributes, { style: {
2415
2346
  zIndex: `${20000 + this.overlayIndex}`,
2416
- }, 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: 'c674d142ace2b3e5bd38b302cf2984fc3fac11c8', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: 'ce83713b57960d354935ef8e65251892ed9d4e3b', class: "modal-shadow" }), h("div", Object.assign({ key: '67c001e824f5c31eb58053eea71c884817479896',
2347
+ }, 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: 'bc165dd344e752c13076ca5ae37ea7d68d618d55', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: '4a2f6edaeeec2978f0cd7b2b93a44c2f0da3ab54', class: "modal-shadow" }), h("div", Object.assign({ key: '13d662aa50871e97567270dbbce6825633c62bad',
2417
2348
  /*
2418
2349
  role and aria-modal must be used on the
2419
2350
  same element. They must also be set inside the
2420
2351
  shadow DOM otherwise ion-button will not be highlighted
2421
2352
  when using VoiceOver: https://bugs.webkit.org/show_bug.cgi?id=247134
2422
2353
  */
2423
- role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: '9263cbb0c5f550ef463b72446c21379ccaf0ccdd', class: "modal-handle",
2354
+ role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: 'e678cd3c64a0ab56636f68f9fa416741589f783c', class: "modal-handle",
2424
2355
  // Prevents the handle from receiving keyboard focus when it does not cycle
2425
- 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: '3ef07e617f2b1d46fca6a00b40119c35bff4215a', onSlotchange: this.onSlotChange }))));
2356
+ 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: '1ebc3549c5c67ea286384b9917ed4dd8958ea2ae', onSlotchange: this.onSlotChange }))));
2426
2357
  }
2427
2358
  get el() { return this; }
2428
2359
  static get watchers() { return {
@@ -2459,7 +2390,6 @@ const Modal = /*@__PURE__*/ proxyCustomElement(class Modal extends HTMLElement {
2459
2390
  "keepContentsMounted": [4, "keep-contents-mounted"],
2460
2391
  "focusTrap": [4, "focus-trap"],
2461
2392
  "canDismiss": [4, "can-dismiss"],
2462
- "isSheetModal": [32],
2463
2393
  "presented": [32],
2464
2394
  "present": [64],
2465
2395
  "dismiss": [64],
@@ -502,7 +502,7 @@ const setRootAriaHidden = (hidden = false) => {
502
502
  }
503
503
  };
504
504
  const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts) => {
505
- var _a, _b, _c;
505
+ var _a, _b;
506
506
  if (overlay.presented) {
507
507
  return;
508
508
  }
@@ -536,10 +536,9 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
536
536
  */
537
537
  const overlayEl = overlay.el;
538
538
  const shouldTrapFocus = overlayEl.tagName !== 'ION-TOAST' && overlayEl.focusTrap !== false;
539
- // Only lock out root content when backdrop is always active. Developers relying on
540
- // showBackdrop=false or backdropBreakpoint expect background interaction at some point.
541
- const backdropAlwaysActive = overlayEl.showBackdrop !== false && !(((_a = overlayEl.backdropBreakpoint) !== null && _a !== void 0 ? _a : 0) > 0);
542
- const shouldLockRoot = shouldTrapFocus && backdropAlwaysActive;
539
+ // Only lock out root content when backdrop is active. Developers relying on showBackdrop=false
540
+ // expect background interaction to remain enabled.
541
+ const shouldLockRoot = shouldTrapFocus && overlayEl.showBackdrop !== false;
543
542
  overlay.presented = true;
544
543
  overlay.willPresent.emit();
545
544
  if (shouldLockRoot) {
@@ -551,7 +550,7 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
551
550
  }
552
551
  document.body.classList.add(BACKDROP_NO_SCROLL);
553
552
  }
554
- (_b = overlay.willPresentShorthand) === null || _b === void 0 ? void 0 : _b.emit();
553
+ (_a = overlay.willPresentShorthand) === null || _a === void 0 ? void 0 : _a.emit();
555
554
  const mode = getIonMode(overlay);
556
555
  // get the user's animation fn if one was provided
557
556
  const animationBuilder = overlay.enterAnimation
@@ -560,7 +559,7 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
560
559
  const completed = await overlayAnimation(overlay, animationBuilder, overlay.el, opts);
561
560
  if (completed) {
562
561
  overlay.didPresent.emit();
563
- (_c = overlay.didPresentShorthand) === null || _c === void 0 ? void 0 : _c.emit();
562
+ (_b = overlay.didPresentShorthand) === null || _b === void 0 ? void 0 : _b.emit();
564
563
  }
565
564
  /**
566
565
  * If the focused element is already
@@ -638,7 +637,7 @@ const restoreElementFocus = async (overlayEl) => {
638
637
  }
639
638
  };
640
639
  const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnimation, opts) => {
641
- var _a, _b, _c;
640
+ var _a, _b;
642
641
  if (!overlay.presented) {
643
642
  return false;
644
643
  }
@@ -654,14 +653,11 @@ const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnim
654
653
  * is dismissed.
655
654
  */
656
655
  const overlaysLockingRoot = presentedOverlays.filter((o) => {
657
- var _a;
658
656
  const el = o;
659
- const backdropAlwaysActive = el.showBackdrop !== false && !(((_a = el.backdropBreakpoint) !== null && _a !== void 0 ? _a : 0) > 0);
660
- return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && backdropAlwaysActive;
657
+ return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && el.showBackdrop !== false;
661
658
  });
662
659
  const overlayEl = overlay.el;
663
- const backdropAlwaysActive = overlayEl.showBackdrop !== false && !(((_a = overlayEl.backdropBreakpoint) !== null && _a !== void 0 ? _a : 0) > 0);
664
- const locksRoot = overlayEl.tagName !== 'ION-TOAST' && overlayEl.focusTrap !== false && backdropAlwaysActive;
660
+ const locksRoot = overlayEl.tagName !== 'ION-TOAST' && overlayEl.focusTrap !== false && overlayEl.showBackdrop !== false;
665
661
  /**
666
662
  * If this is the last visible overlay that is trapping focus
667
663
  * then we want to re-add the root to the accessibility tree.
@@ -676,7 +672,7 @@ const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnim
676
672
  // Overlay contents should not be clickable during dismiss
677
673
  overlay.el.style.setProperty('pointer-events', 'none');
678
674
  overlay.willDismiss.emit({ data, role });
679
- (_b = overlay.willDismissShorthand) === null || _b === void 0 ? void 0 : _b.emit({ data, role });
675
+ (_a = overlay.willDismissShorthand) === null || _a === void 0 ? void 0 : _a.emit({ data, role });
680
676
  const mode = getIonMode(overlay);
681
677
  const animationBuilder = overlay.leaveAnimation
682
678
  ? overlay.leaveAnimation
@@ -686,7 +682,7 @@ const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnim
686
682
  await overlayAnimation(overlay, animationBuilder, overlay.el, opts);
687
683
  }
688
684
  overlay.didDismiss.emit({ data, role });
689
- (_c = overlay.didDismissShorthand) === null || _c === void 0 ? void 0 : _c.emit({ data, role });
685
+ (_b = overlay.didDismissShorthand) === null || _b === void 0 ? void 0 : _b.emit({ data, role });
690
686
  // Get a reference to all animations currently assigned to this overlay
691
687
  // Then tear them down to return the overlay to its initial visual state
692
688
  const animations = activeAnimations.get(overlay) || [];
package/css/core.css CHANGED
@@ -1 +1 @@
1
- :root{--ion-color-primary: #0054e9;--ion-color-primary-rgb: 0, 84, 233;--ion-color-primary-contrast: #fff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #004acd;--ion-color-primary-tint: #1a65eb;--ion-color-secondary: #0163aa;--ion-color-secondary-rgb: 1, 99, 170;--ion-color-secondary-contrast: #fff;--ion-color-secondary-contrast-rgb: 255, 255, 255;--ion-color-secondary-shade: #015796;--ion-color-secondary-tint: #1a73b3;--ion-color-tertiary: #6030ff;--ion-color-tertiary-rgb: 96, 48, 255;--ion-color-tertiary-contrast: #fff;--ion-color-tertiary-contrast-rgb: 255, 255, 255;--ion-color-tertiary-shade: #542ae0;--ion-color-tertiary-tint: #7045ff;--ion-color-success: #2dd55b;--ion-color-success-rgb: 45, 213, 91;--ion-color-success-contrast: #000;--ion-color-success-contrast-rgb: 0, 0, 0;--ion-color-success-shade: #28bb50;--ion-color-success-tint: #42d96b;--ion-color-warning: #ffc409;--ion-color-warning-rgb: 255, 196, 9;--ion-color-warning-contrast: #000;--ion-color-warning-contrast-rgb: 0, 0, 0;--ion-color-warning-shade: #e0ac08;--ion-color-warning-tint: #ffca22;--ion-color-danger: #c5000f;--ion-color-danger-rgb: 197, 0, 15;--ion-color-danger-contrast: #fff;--ion-color-danger-contrast-rgb: 255, 255, 255;--ion-color-danger-shade: #ad000d;--ion-color-danger-tint: #cb1a27;--ion-color-light: #f4f5f8;--ion-color-light-rgb: 244, 245, 248;--ion-color-light-contrast: #000;--ion-color-light-contrast-rgb: 0, 0, 0;--ion-color-light-shade: #d7d8da;--ion-color-light-tint: #f5f6f9;--ion-color-medium: #636469;--ion-color-medium-rgb: 99, 100, 105;--ion-color-medium-contrast: #fff;--ion-color-medium-contrast-rgb: 255, 255, 255;--ion-color-medium-shade: #57585c;--ion-color-medium-tint: #737478;--ion-color-dark: #222428;--ion-color-dark-rgb: 34, 36, 40;--ion-color-dark-contrast: #fff;--ion-color-dark-contrast-rgb: 255, 255, 255;--ion-color-dark-shade: #1e2023;--ion-color-dark-tint: #383a3e}html.ios{--ion-default-font: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Roboto", sans-serif}html.md{--ion-default-font: "Roboto", "Helvetica Neue", sans-serif}html{--ion-dynamic-font: -apple-system-body;--ion-font-family: var(--ion-default-font)}body{background:var(--ion-background-color);color:var(--ion-text-color)}body.backdrop-no-scroll{overflow:hidden}html.ios ion-modal.modal-card ion-header ion-toolbar:first-of-type,html.ios ion-modal.modal-sheet ion-header ion-toolbar:first-of-type,html.ios ion-modal ion-footer ion-toolbar:first-of-type,html.ios ion-footer.modal-footer-moving ion-toolbar:first-of-type{padding-top:6px}html.ios ion-modal.modal-card ion-header ion-toolbar:last-of-type,html.ios ion-modal.modal-sheet ion-header ion-toolbar:last-of-type{padding-bottom:6px}html.ios ion-modal ion-toolbar,html.ios .modal-footer-moving ion-toolbar{padding-right:calc(var(--ion-safe-area-right) + 8px);padding-left:calc(var(--ion-safe-area-left) + 8px)}@media screen and (min-width: 768px){html.ios ion-modal.modal-card:first-of-type{--backdrop-opacity: 0.18}}ion-modal.modal-default.show-modal~ion-modal.modal-default{--backdrop-opacity: 0;--box-shadow: none}html.ios ion-modal.modal-card .ion-page{border-top-left-radius:var(--border-radius)}.ion-color-primary{--ion-color-base: var(--ion-color-primary, #0054e9) !important;--ion-color-base-rgb: var(--ion-color-primary-rgb, 0, 84, 233) !important;--ion-color-contrast: var(--ion-color-primary-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-primary-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-primary-shade, #004acd) !important;--ion-color-tint: var(--ion-color-primary-tint, #1a65eb) !important}.ion-color-secondary{--ion-color-base: var(--ion-color-secondary, #0163aa) !important;--ion-color-base-rgb: var(--ion-color-secondary-rgb, 1, 99, 170) !important;--ion-color-contrast: var(--ion-color-secondary-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-secondary-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-secondary-shade, #015796) !important;--ion-color-tint: var(--ion-color-secondary-tint, #1a73b3) !important}.ion-color-tertiary{--ion-color-base: var(--ion-color-tertiary, #6030ff) !important;--ion-color-base-rgb: var(--ion-color-tertiary-rgb, 96, 48, 255) !important;--ion-color-contrast: var(--ion-color-tertiary-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-tertiary-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-tertiary-shade, #542ae0) !important;--ion-color-tint: var(--ion-color-tertiary-tint, #7045ff) !important}.ion-color-success{--ion-color-base: var(--ion-color-success, #2dd55b) !important;--ion-color-base-rgb: var(--ion-color-success-rgb, 45, 213, 91) !important;--ion-color-contrast: var(--ion-color-success-contrast, #000) !important;--ion-color-contrast-rgb: var(--ion-color-success-contrast-rgb, 0, 0, 0) !important;--ion-color-shade: var(--ion-color-success-shade, #28bb50) !important;--ion-color-tint: var(--ion-color-success-tint, #42d96b) !important}.ion-color-warning{--ion-color-base: var(--ion-color-warning, #ffc409) !important;--ion-color-base-rgb: var(--ion-color-warning-rgb, 255, 196, 9) !important;--ion-color-contrast: var(--ion-color-warning-contrast, #000) !important;--ion-color-contrast-rgb: var(--ion-color-warning-contrast-rgb, 0, 0, 0) !important;--ion-color-shade: var(--ion-color-warning-shade, #e0ac08) !important;--ion-color-tint: var(--ion-color-warning-tint, #ffca22) !important}.ion-color-danger{--ion-color-base: var(--ion-color-danger, #c5000f) !important;--ion-color-base-rgb: var(--ion-color-danger-rgb, 197, 0, 15) !important;--ion-color-contrast: var(--ion-color-danger-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-danger-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-danger-shade, #ad000d) !important;--ion-color-tint: var(--ion-color-danger-tint, #cb1a27) !important}.ion-color-light{--ion-color-base: var(--ion-color-light, #f4f5f8) !important;--ion-color-base-rgb: var(--ion-color-light-rgb, 244, 245, 248) !important;--ion-color-contrast: var(--ion-color-light-contrast, #000) !important;--ion-color-contrast-rgb: var(--ion-color-light-contrast-rgb, 0, 0, 0) !important;--ion-color-shade: var(--ion-color-light-shade, #d7d8da) !important;--ion-color-tint: var(--ion-color-light-tint, #f5f6f9) !important}.ion-color-medium{--ion-color-base: var(--ion-color-medium, #636469) !important;--ion-color-base-rgb: var(--ion-color-medium-rgb, 99, 100, 105) !important;--ion-color-contrast: var(--ion-color-medium-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-medium-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-medium-shade, #57585c) !important;--ion-color-tint: var(--ion-color-medium-tint, #737478) !important}.ion-color-dark{--ion-color-base: var(--ion-color-dark, #222428) !important;--ion-color-base-rgb: var(--ion-color-dark-rgb, 34, 36, 40) !important;--ion-color-contrast: var(--ion-color-dark-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-dark-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-dark-shade, #1e2023) !important;--ion-color-tint: var(--ion-color-dark-tint, #383a3e) !important}.ion-page{left:0;right:0;top:0;bottom:0;display:flex;position:absolute;flex-direction:column;justify-content:space-between;contain:layout size style;z-index:0}.ion-page.ion-page-overlay-passthrough{pointer-events:none}ion-modal>.ion-page{position:relative;contain:layout style;height:100%}.split-pane-visible>.ion-page.split-pane-main{position:relative}ion-route,ion-route-redirect,ion-router,ion-select-option,ion-nav-controller,ion-menu-controller,ion-action-sheet-controller,ion-alert-controller,ion-loading-controller,ion-modal-controller,ion-picker-controller,ion-popover-controller,ion-toast-controller,.ion-page-hidden{display:none !important}.ion-page-invisible{opacity:0}.can-go-back>ion-header ion-back-button{display:block}html.plt-ios.plt-hybrid,html.plt-ios.plt-pwa{--ion-statusbar-padding: 20px}@supports(padding-top: 20px){html{--ion-safe-area-top: var(--ion-statusbar-padding)}}@supports(padding-top: env(safe-area-inset-top)){html{--ion-safe-area-top: env(safe-area-inset-top);--ion-safe-area-bottom: env(safe-area-inset-bottom);--ion-safe-area-left: env(safe-area-inset-left);--ion-safe-area-right: env(safe-area-inset-right)}}ion-card.ion-color .ion-inherit-color,ion-card-header.ion-color .ion-inherit-color{color:inherit}.menu-content{transform:translate3d(0, 0, 0)}.menu-content-open{cursor:pointer;touch-action:manipulation;pointer-events:none;overflow-y:hidden}.menu-content-open ion-content{--overflow: hidden}.menu-content-open .ion-content-scroll-host{overflow:hidden}.ios .menu-content-reveal{box-shadow:-8px 0 42px rgba(0,0,0,.08)}[dir=rtl].ios .menu-content-reveal{box-shadow:8px 0 42px rgba(0,0,0,.08)}.md .menu-content-reveal{box-shadow:4px 0px 16px rgba(0,0,0,.18)}.md .menu-content-push{box-shadow:4px 0px 16px rgba(0,0,0,.18)}ion-accordion-group.accordion-group-expand-inset>ion-accordion:first-of-type{border-top-left-radius:8px;border-top-right-radius:8px}ion-accordion-group.accordion-group-expand-inset>ion-accordion:last-of-type{border-bottom-left-radius:8px;border-bottom-right-radius:8px}ion-accordion-group>ion-accordion:last-of-type ion-item[slot=header]{--border-width: 0px}ion-accordion.accordion-animated>[slot=header] .ion-accordion-toggle-icon{transition:300ms transform cubic-bezier(0.25, 0.8, 0.5, 1)}@media(prefers-reduced-motion: reduce){ion-accordion .ion-accordion-toggle-icon{transition:none !important}}ion-accordion.accordion-expanding>[slot=header] .ion-accordion-toggle-icon,ion-accordion.accordion-expanded>[slot=header] .ion-accordion-toggle-icon{transform:rotate(180deg)}ion-accordion-group.accordion-group-expand-inset.md>ion-accordion.accordion-previous ion-item[slot=header]{--border-width: 0px;--inner-border-width: 0px}ion-accordion-group.accordion-group-expand-inset.md>ion-accordion.accordion-expanding:first-of-type,ion-accordion-group.accordion-group-expand-inset.md>ion-accordion.accordion-expanded:first-of-type{margin-top:0}ion-input input::-webkit-date-and-time-value{text-align:start}.ion-datetime-button-overlay{--width: fit-content;--height: fit-content}.ion-datetime-button-overlay ion-datetime.datetime-grid{width:320px;min-height:320px}[ion-last-focus],header[tabindex="-1"]:focus,[role=banner][tabindex="-1"]:focus,main[tabindex="-1"]:focus,[role=main][tabindex="-1"]:focus,h1[tabindex="-1"]:focus,[role=heading][aria-level="1"][tabindex="-1"]:focus{outline:none}.popover-viewport:has(>ion-content){overflow:hidden}@supports not selector(:has(> ion-content)){.popover-viewport{overflow:hidden}}/*# sourceMappingURL=core.css.map */
1
+ :root{--ion-color-primary: #0054e9;--ion-color-primary-rgb: 0, 84, 233;--ion-color-primary-contrast: #fff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #004acd;--ion-color-primary-tint: #1a65eb;--ion-color-secondary: #0163aa;--ion-color-secondary-rgb: 1, 99, 170;--ion-color-secondary-contrast: #fff;--ion-color-secondary-contrast-rgb: 255, 255, 255;--ion-color-secondary-shade: #015796;--ion-color-secondary-tint: #1a73b3;--ion-color-tertiary: #6030ff;--ion-color-tertiary-rgb: 96, 48, 255;--ion-color-tertiary-contrast: #fff;--ion-color-tertiary-contrast-rgb: 255, 255, 255;--ion-color-tertiary-shade: #542ae0;--ion-color-tertiary-tint: #7045ff;--ion-color-success: #2dd55b;--ion-color-success-rgb: 45, 213, 91;--ion-color-success-contrast: #000;--ion-color-success-contrast-rgb: 0, 0, 0;--ion-color-success-shade: #28bb50;--ion-color-success-tint: #42d96b;--ion-color-warning: #ffc409;--ion-color-warning-rgb: 255, 196, 9;--ion-color-warning-contrast: #000;--ion-color-warning-contrast-rgb: 0, 0, 0;--ion-color-warning-shade: #e0ac08;--ion-color-warning-tint: #ffca22;--ion-color-danger: #c5000f;--ion-color-danger-rgb: 197, 0, 15;--ion-color-danger-contrast: #fff;--ion-color-danger-contrast-rgb: 255, 255, 255;--ion-color-danger-shade: #ad000d;--ion-color-danger-tint: #cb1a27;--ion-color-light: #f4f5f8;--ion-color-light-rgb: 244, 245, 248;--ion-color-light-contrast: #000;--ion-color-light-contrast-rgb: 0, 0, 0;--ion-color-light-shade: #d7d8da;--ion-color-light-tint: #f5f6f9;--ion-color-medium: #636469;--ion-color-medium-rgb: 99, 100, 105;--ion-color-medium-contrast: #fff;--ion-color-medium-contrast-rgb: 255, 255, 255;--ion-color-medium-shade: #57585c;--ion-color-medium-tint: #737478;--ion-color-dark: #222428;--ion-color-dark-rgb: 34, 36, 40;--ion-color-dark-contrast: #fff;--ion-color-dark-contrast-rgb: 255, 255, 255;--ion-color-dark-shade: #1e2023;--ion-color-dark-tint: #383a3e}html.ios{--ion-default-font: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Roboto", sans-serif}html.md{--ion-default-font: "Roboto", "Helvetica Neue", sans-serif}html{--ion-dynamic-font: -apple-system-body;--ion-font-family: var(--ion-default-font)}body{background:var(--ion-background-color);color:var(--ion-text-color)}body.backdrop-no-scroll{overflow:hidden}html.ios ion-modal.modal-card ion-header ion-toolbar:first-of-type,html.ios ion-modal.modal-sheet ion-header ion-toolbar:first-of-type,html.ios ion-modal ion-footer ion-toolbar:first-of-type,html.ios ion-footer.modal-footer-moving ion-toolbar:first-of-type{padding-top:6px}html.ios ion-modal.modal-card ion-header ion-toolbar:last-of-type,html.ios ion-modal.modal-sheet ion-header ion-toolbar:last-of-type{padding-bottom:6px}html.ios ion-modal ion-toolbar,html.ios .modal-footer-moving ion-toolbar{padding-right:calc(var(--ion-safe-area-right) + 8px);padding-left:calc(var(--ion-safe-area-left) + 8px)}@media screen and (min-width: 768px){html.ios ion-modal.modal-card:first-of-type{--backdrop-opacity: 0.18}}ion-modal.modal-default.show-modal~ion-modal.modal-default{--backdrop-opacity: 0;--box-shadow: none}html.ios ion-modal.modal-card .ion-page{border-top-left-radius:var(--border-radius)}.ion-color-primary{--ion-color-base: var(--ion-color-primary, #0054e9) !important;--ion-color-base-rgb: var(--ion-color-primary-rgb, 0, 84, 233) !important;--ion-color-contrast: var(--ion-color-primary-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-primary-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-primary-shade, #004acd) !important;--ion-color-tint: var(--ion-color-primary-tint, #1a65eb) !important}.ion-color-secondary{--ion-color-base: var(--ion-color-secondary, #0163aa) !important;--ion-color-base-rgb: var(--ion-color-secondary-rgb, 1, 99, 170) !important;--ion-color-contrast: var(--ion-color-secondary-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-secondary-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-secondary-shade, #015796) !important;--ion-color-tint: var(--ion-color-secondary-tint, #1a73b3) !important}.ion-color-tertiary{--ion-color-base: var(--ion-color-tertiary, #6030ff) !important;--ion-color-base-rgb: var(--ion-color-tertiary-rgb, 96, 48, 255) !important;--ion-color-contrast: var(--ion-color-tertiary-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-tertiary-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-tertiary-shade, #542ae0) !important;--ion-color-tint: var(--ion-color-tertiary-tint, #7045ff) !important}.ion-color-success{--ion-color-base: var(--ion-color-success, #2dd55b) !important;--ion-color-base-rgb: var(--ion-color-success-rgb, 45, 213, 91) !important;--ion-color-contrast: var(--ion-color-success-contrast, #000) !important;--ion-color-contrast-rgb: var(--ion-color-success-contrast-rgb, 0, 0, 0) !important;--ion-color-shade: var(--ion-color-success-shade, #28bb50) !important;--ion-color-tint: var(--ion-color-success-tint, #42d96b) !important}.ion-color-warning{--ion-color-base: var(--ion-color-warning, #ffc409) !important;--ion-color-base-rgb: var(--ion-color-warning-rgb, 255, 196, 9) !important;--ion-color-contrast: var(--ion-color-warning-contrast, #000) !important;--ion-color-contrast-rgb: var(--ion-color-warning-contrast-rgb, 0, 0, 0) !important;--ion-color-shade: var(--ion-color-warning-shade, #e0ac08) !important;--ion-color-tint: var(--ion-color-warning-tint, #ffca22) !important}.ion-color-danger{--ion-color-base: var(--ion-color-danger, #c5000f) !important;--ion-color-base-rgb: var(--ion-color-danger-rgb, 197, 0, 15) !important;--ion-color-contrast: var(--ion-color-danger-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-danger-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-danger-shade, #ad000d) !important;--ion-color-tint: var(--ion-color-danger-tint, #cb1a27) !important}.ion-color-light{--ion-color-base: var(--ion-color-light, #f4f5f8) !important;--ion-color-base-rgb: var(--ion-color-light-rgb, 244, 245, 248) !important;--ion-color-contrast: var(--ion-color-light-contrast, #000) !important;--ion-color-contrast-rgb: var(--ion-color-light-contrast-rgb, 0, 0, 0) !important;--ion-color-shade: var(--ion-color-light-shade, #d7d8da) !important;--ion-color-tint: var(--ion-color-light-tint, #f5f6f9) !important}.ion-color-medium{--ion-color-base: var(--ion-color-medium, #636469) !important;--ion-color-base-rgb: var(--ion-color-medium-rgb, 99, 100, 105) !important;--ion-color-contrast: var(--ion-color-medium-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-medium-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-medium-shade, #57585c) !important;--ion-color-tint: var(--ion-color-medium-tint, #737478) !important}.ion-color-dark{--ion-color-base: var(--ion-color-dark, #222428) !important;--ion-color-base-rgb: var(--ion-color-dark-rgb, 34, 36, 40) !important;--ion-color-contrast: var(--ion-color-dark-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-dark-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-dark-shade, #1e2023) !important;--ion-color-tint: var(--ion-color-dark-tint, #383a3e) !important}.ion-page{left:0;right:0;top:0;bottom:0;display:flex;position:absolute;flex-direction:column;justify-content:space-between;contain:layout size style;z-index:0}ion-modal>.ion-page{position:relative;contain:layout style;height:100%}.split-pane-visible>.ion-page.split-pane-main{position:relative}ion-route,ion-route-redirect,ion-router,ion-select-option,ion-nav-controller,ion-menu-controller,ion-action-sheet-controller,ion-alert-controller,ion-loading-controller,ion-modal-controller,ion-picker-controller,ion-popover-controller,ion-toast-controller,.ion-page-hidden{display:none !important}.ion-page-invisible{opacity:0}.can-go-back>ion-header ion-back-button{display:block}html.plt-ios.plt-hybrid,html.plt-ios.plt-pwa{--ion-statusbar-padding: 20px}@supports(padding-top: 20px){html{--ion-safe-area-top: var(--ion-statusbar-padding)}}@supports(padding-top: env(safe-area-inset-top)){html{--ion-safe-area-top: env(safe-area-inset-top);--ion-safe-area-bottom: env(safe-area-inset-bottom);--ion-safe-area-left: env(safe-area-inset-left);--ion-safe-area-right: env(safe-area-inset-right)}}ion-card.ion-color .ion-inherit-color,ion-card-header.ion-color .ion-inherit-color{color:inherit}.menu-content{transform:translate3d(0, 0, 0)}.menu-content-open{cursor:pointer;touch-action:manipulation;pointer-events:none;overflow-y:hidden}.menu-content-open ion-content{--overflow: hidden}.menu-content-open .ion-content-scroll-host{overflow:hidden}.ios .menu-content-reveal{box-shadow:-8px 0 42px rgba(0,0,0,.08)}[dir=rtl].ios .menu-content-reveal{box-shadow:8px 0 42px rgba(0,0,0,.08)}.md .menu-content-reveal{box-shadow:4px 0px 16px rgba(0,0,0,.18)}.md .menu-content-push{box-shadow:4px 0px 16px rgba(0,0,0,.18)}ion-accordion-group.accordion-group-expand-inset>ion-accordion:first-of-type{border-top-left-radius:8px;border-top-right-radius:8px}ion-accordion-group.accordion-group-expand-inset>ion-accordion:last-of-type{border-bottom-left-radius:8px;border-bottom-right-radius:8px}ion-accordion-group>ion-accordion:last-of-type ion-item[slot=header]{--border-width: 0px}ion-accordion.accordion-animated>[slot=header] .ion-accordion-toggle-icon{transition:300ms transform cubic-bezier(0.25, 0.8, 0.5, 1)}@media(prefers-reduced-motion: reduce){ion-accordion .ion-accordion-toggle-icon{transition:none !important}}ion-accordion.accordion-expanding>[slot=header] .ion-accordion-toggle-icon,ion-accordion.accordion-expanded>[slot=header] .ion-accordion-toggle-icon{transform:rotate(180deg)}ion-accordion-group.accordion-group-expand-inset.md>ion-accordion.accordion-previous ion-item[slot=header]{--border-width: 0px;--inner-border-width: 0px}ion-accordion-group.accordion-group-expand-inset.md>ion-accordion.accordion-expanding:first-of-type,ion-accordion-group.accordion-group-expand-inset.md>ion-accordion.accordion-expanded:first-of-type{margin-top:0}ion-input input::-webkit-date-and-time-value{text-align:start}.ion-datetime-button-overlay{--width: fit-content;--height: fit-content}.ion-datetime-button-overlay ion-datetime.datetime-grid{width:320px;min-height:320px}[ion-last-focus],header[tabindex="-1"]:focus,[role=banner][tabindex="-1"]:focus,main[tabindex="-1"]:focus,[role=main][tabindex="-1"]:focus,h1[tabindex="-1"]:focus,[role=heading][aria-level="1"][tabindex="-1"]:focus{outline:none}.popover-viewport:has(>ion-content){overflow:hidden}@supports not selector(:has(> ion-content)){.popover-viewport{overflow:hidden}}/*# sourceMappingURL=core.css.map */