@ionic/core 7.5.1-dev.11697139276.10eb94b8 → 7.5.1-dev.11697219113.17f86185

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 (86) hide show
  1. package/components/ion-title.js +1 -1
  2. package/components/ios.transition.js +209 -41
  3. package/components/picker-column-internal.js +27 -26
  4. package/components/picker-internal.js +12 -8
  5. package/dist/cjs/{index-d93fb71d.js → index-eccba000.js} +2 -2
  6. package/dist/cjs/index.cjs.js +3 -3
  7. package/dist/cjs/ion-app_8.cjs.entry.js +2 -2
  8. package/dist/cjs/ion-modal.cjs.entry.js +1 -1
  9. package/dist/cjs/ion-nav_2.cjs.entry.js +1 -1
  10. package/dist/cjs/ion-picker-column-internal.cjs.entry.js +26 -24
  11. package/dist/cjs/ion-picker-internal.cjs.entry.js +11 -7
  12. package/dist/cjs/ion-popover.cjs.entry.js +1 -1
  13. package/dist/cjs/ionic.cjs.js +2 -2
  14. package/dist/cjs/{ios.transition-a4d545dd.js → ios.transition-5af5991e.js} +210 -42
  15. package/dist/cjs/loader.cjs.js +1 -1
  16. package/dist/cjs/{md.transition-80bb961b.js → md.transition-1e740a6a.js} +1 -1
  17. package/dist/collection/collection-manifest.json +1 -1
  18. package/dist/collection/components/picker-column-internal/picker-column-internal.js +26 -54
  19. package/dist/collection/components/picker-internal/picker-internal-interfaces.js +1 -0
  20. package/dist/collection/components/picker-internal/picker-internal.js +34 -7
  21. package/dist/collection/components/title/title.ios.css +9 -0
  22. package/dist/collection/utils/transition/ios.transition.js +209 -41
  23. package/dist/docs.json +7 -2
  24. package/dist/esm/{index-7d2b2808.js → index-a09eac70.js} +2 -2
  25. package/dist/esm/index.js +3 -3
  26. package/dist/esm/ion-app_8.entry.js +2 -2
  27. package/dist/esm/ion-modal.entry.js +1 -1
  28. package/dist/esm/ion-nav_2.entry.js +1 -1
  29. package/dist/esm/ion-picker-column-internal.entry.js +26 -24
  30. package/dist/esm/ion-picker-internal.entry.js +12 -8
  31. package/dist/esm/ion-popover.entry.js +1 -1
  32. package/dist/esm/ionic.js +2 -2
  33. package/dist/esm/{ios.transition-a86d7bbe.js → ios.transition-4d1322d6.js} +210 -42
  34. package/dist/esm/loader.js +1 -1
  35. package/dist/esm/{md.transition-365ef6b6.js → md.transition-66b425d0.js} +1 -1
  36. package/dist/esm-es5/{index-7d2b2808.js → index-a09eac70.js} +1 -1
  37. package/dist/esm-es5/index.js +1 -1
  38. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  39. package/dist/esm-es5/ion-modal.entry.js +1 -1
  40. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  41. package/dist/esm-es5/ion-picker-column-internal.entry.js +1 -1
  42. package/dist/esm-es5/ion-picker-internal.entry.js +1 -1
  43. package/dist/esm-es5/ion-popover.entry.js +1 -1
  44. package/dist/esm-es5/ionic.js +1 -1
  45. package/dist/esm-es5/ios.transition-4d1322d6.js +4 -0
  46. package/dist/esm-es5/loader.js +1 -1
  47. package/dist/esm-es5/{md.transition-365ef6b6.js → md.transition-66b425d0.js} +1 -1
  48. package/dist/ionic/index.esm.js +1 -1
  49. package/dist/ionic/ionic.esm.js +1 -1
  50. package/dist/ionic/ionic.js +1 -1
  51. package/dist/ionic/{p-c994fff0.system.js → p-091c8792.system.js} +1 -1
  52. package/dist/ionic/p-0b7c25ee.system.entry.js +4 -0
  53. package/dist/ionic/{p-22923e47.entry.js → p-0f217f27.entry.js} +1 -1
  54. package/dist/ionic/{p-b08e4088.system.entry.js → p-1d8d5f9a.system.entry.js} +1 -1
  55. package/dist/ionic/{p-fcdc853a.system.entry.js → p-2592264d.system.entry.js} +1 -1
  56. package/dist/ionic/p-2a8eeef7.system.js +4 -0
  57. package/dist/ionic/p-3a58e3a4.system.entry.js +4 -0
  58. package/dist/ionic/{p-5c3e72a8.system.js → p-530b98d8.system.js} +1 -1
  59. package/dist/ionic/{p-9b9dcc3e.system.entry.js → p-61ca6685.system.entry.js} +1 -1
  60. package/dist/ionic/{p-4cba3f05.entry.js → p-7eaa585f.entry.js} +1 -1
  61. package/dist/ionic/p-818b2e75.entry.js +4 -0
  62. package/dist/ionic/{p-e42aaa8b.entry.js → p-8209372c.entry.js} +1 -1
  63. package/dist/ionic/p-afb6658f.entry.js +4 -0
  64. package/dist/ionic/{p-c05315f5.system.entry.js → p-b2fb0dda.system.entry.js} +1 -1
  65. package/dist/ionic/{p-e38a5f77.js → p-c44fe9fd.js} +1 -1
  66. package/dist/ionic/p-de68588d.js +4 -0
  67. package/dist/ionic/{p-128a98e8.system.js → p-e028178a.system.js} +1 -1
  68. package/dist/ionic/{p-ced41304.system.js → p-e0f0d55f.system.js} +1 -1
  69. package/dist/ionic/{p-f34f001c.entry.js → p-e25cb483.entry.js} +1 -1
  70. package/dist/ionic/p-eb7d0922.js +4 -0
  71. package/dist/types/components/menu/menu-interface.d.ts +15 -4
  72. package/dist/types/components/picker-column-internal/picker-column-internal.d.ts +1 -3
  73. package/dist/types/components/picker-internal/picker-internal-interfaces.d.ts +8 -0
  74. package/dist/types/components/picker-internal/picker-internal.d.ts +6 -4
  75. package/dist/types/components.d.ts +7 -4
  76. package/dist/types/utils/menu-controller/index.d.ts +2 -21
  77. package/hydrate/index.js +250 -77
  78. package/package.json +3 -3
  79. package/dist/esm-es5/ios.transition-a86d7bbe.js +0 -4
  80. package/dist/ionic/p-129bc265.system.entry.js +0 -4
  81. package/dist/ionic/p-16e44585.js +0 -4
  82. package/dist/ionic/p-b9047b05.system.js +0 -4
  83. package/dist/ionic/p-c0190e6d.system.entry.js +0 -4
  84. package/dist/ionic/p-d021cd8c.entry.js +0 -4
  85. package/dist/ionic/p-e2bb634f.js +0 -4
  86. package/dist/ionic/p-eed2c96d.entry.js +0 -4
@@ -67,10 +67,8 @@ export declare class PickerColumnInternal implements ComponentInterface {
67
67
  * When ionInputModeChange is emitted, each column
68
68
  * needs to check if it is the one being made available
69
69
  * for text entry.
70
- * input/change event listeners.
71
- * @internal
72
70
  */
73
- inputModeChange(useInputMode: boolean, inputModeColumn?: HTMLIonPickerColumnInternalElement): Promise<void>;
71
+ private inputModeChange;
74
72
  /**
75
73
  * Setting isActive will cause a re-render.
76
74
  * As a result, we do not want to cause the
@@ -0,0 +1,8 @@
1
+ export interface PickerInternalChangeEventDetail {
2
+ useInputMode: boolean;
3
+ inputModeColumn?: HTMLIonPickerColumnInternalElement;
4
+ }
5
+ export interface PickerInternalCustomEvent extends CustomEvent {
6
+ target: HTMLIonPickerInternalElement;
7
+ detail: PickerInternalChangeEventDetail;
8
+ }
@@ -1,4 +1,5 @@
1
- import type { ComponentInterface } from '../../stencil-public-runtime';
1
+ import type { ComponentInterface, EventEmitter } from '../../stencil-public-runtime';
2
+ import type { PickerInternalChangeEventDetail } from './picker-internal-interfaces';
2
3
  /**
3
4
  * @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use.
4
5
  * @internal
@@ -12,6 +13,7 @@ export declare class PickerInternal implements ComponentInterface {
12
13
  private destroyKeypressListener?;
13
14
  private singleColumnSearchTimeout?;
14
15
  el: HTMLIonPickerInternalElement;
16
+ ionInputModeChange: EventEmitter<PickerInternalChangeEventDetail>;
15
17
  /**
16
18
  * When the picker is interacted with
17
19
  * we need to prevent touchstart so other
@@ -91,10 +93,10 @@ export declare class PickerInternal implements ComponentInterface {
91
93
  */
92
94
  private onInputChange;
93
95
  /**
94
- * Triggers an input mode change on child picker columns.
95
- * This helps each picker column determine whether
96
+ * Emit ionInputModeChange. Picker columns
97
+ * listen for this event to determine whether
96
98
  * or not their column is "active" for text input.
97
99
  */
98
- private triggerInputModeChange;
100
+ private emitInputModeChange;
99
101
  render(): any;
100
102
  }
@@ -25,6 +25,7 @@ import { NavComponent, NavComponentWithProps, NavOptions, RouterOutletOptions, S
25
25
  import { ViewController } from "./components/nav/view-controller";
26
26
  import { PickerButton, PickerColumn } from "./components/picker/picker-interface";
27
27
  import { PickerColumnItem } from "./components/picker-column-internal/picker-column-internal-interfaces";
28
+ import { PickerInternalChangeEventDetail } from "./components/picker-internal/picker-internal-interfaces";
28
29
  import { PopoverSize, PositionAlign, PositionReference, PositionSide, TriggerAction } from "./components/popover/popover-interface";
29
30
  import { RadioGroupChangeEventDetail } from "./components/radio-group/radio-group-interface";
30
31
  import { PinFormatter, RangeChangeEventDetail, RangeKnobMoveEndEventDetail, RangeKnobMoveStartEventDetail, RangeValue } from "./components/range/range-interface";
@@ -60,6 +61,7 @@ export { NavComponent, NavComponentWithProps, NavOptions, RouterOutletOptions, S
60
61
  export { ViewController } from "./components/nav/view-controller";
61
62
  export { PickerButton, PickerColumn } from "./components/picker/picker-interface";
62
63
  export { PickerColumnItem } from "./components/picker-column-internal/picker-column-internal-interfaces";
64
+ export { PickerInternalChangeEventDetail } from "./components/picker-internal/picker-internal-interfaces";
63
65
  export { PopoverSize, PositionAlign, PositionReference, PositionSide, TriggerAction } from "./components/popover/popover-interface";
64
66
  export { RadioGroupChangeEventDetail } from "./components/radio-group/radio-group-interface";
65
67
  export { PinFormatter, RangeChangeEventDetail, RangeKnobMoveEndEventDetail, RangeKnobMoveStartEventDetail, RangeValue } from "./components/range/range-interface";
@@ -2041,10 +2043,6 @@ export namespace Components {
2041
2043
  * The color to use from your application's color palette. Default options are: `"primary"`, `"secondary"`, `"tertiary"`, `"success"`, `"warning"`, `"danger"`, `"light"`, `"medium"`, and `"dark"`. For more information on colors, see [theming](/docs/theming/basics).
2042
2044
  */
2043
2045
  "color"?: Color;
2044
- /**
2045
- * When ionInputModeChange is emitted, each column needs to check if it is the one being made available for text entry. input/change event listeners.
2046
- */
2047
- "inputModeChange": (useInputMode: boolean, inputModeColumn?: HTMLIonPickerColumnInternalElement) => Promise<void>;
2048
2046
  /**
2049
2047
  * A list of options to be displayed in the picker
2050
2048
  */
@@ -3332,6 +3330,10 @@ export interface IonPickerColumnInternalCustomEvent<T> extends CustomEvent<T> {
3332
3330
  detail: T;
3333
3331
  target: HTMLIonPickerColumnInternalElement;
3334
3332
  }
3333
+ export interface IonPickerInternalCustomEvent<T> extends CustomEvent<T> {
3334
+ detail: T;
3335
+ target: HTMLIonPickerInternalElement;
3336
+ }
3335
3337
  export interface IonPopoverCustomEvent<T> extends CustomEvent<T> {
3336
3338
  detail: T;
3337
3339
  target: HTMLIonPopoverElement;
@@ -5996,6 +5998,7 @@ declare namespace LocalJSX {
5996
5998
  * The mode determines which platform styles to use.
5997
5999
  */
5998
6000
  "mode"?: "ios" | "md";
6001
+ "onIonInputModeChange"?: (event: IonPickerInternalCustomEvent<PickerInternalChangeEventDetail>) => void;
5999
6002
  }
6000
6003
  interface IonPopover {
6001
6004
  /**
@@ -1,21 +1,2 @@
1
- import type { MenuI } from '../../components/menu/menu-interface';
2
- import type { AnimationBuilder } from '../../interface';
3
- export declare const menuController: {
4
- registerAnimation: (name: string, animation: AnimationBuilder) => void;
5
- get: (menu?: string | null, logOnMultipleSideMenus?: boolean) => Promise<HTMLIonMenuElement | undefined>;
6
- getMenus: () => Promise<HTMLIonMenuElement[]>;
7
- getOpen: () => Promise<HTMLIonMenuElement | undefined>;
8
- isEnabled: (menu?: string | null) => Promise<boolean>;
9
- swipeGesture: (shouldEnable: boolean, menu?: string | null) => Promise<HTMLIonMenuElement | undefined>;
10
- isAnimating: () => Promise<boolean>;
11
- isOpen: (menu?: string | null) => Promise<boolean>;
12
- enable: (shouldEnable: boolean, menu?: string | null) => Promise<HTMLIonMenuElement | undefined>;
13
- toggle: (menu?: string | null) => Promise<boolean>;
14
- close: (menu?: string | null) => Promise<boolean>;
15
- open: (menu?: string | null) => Promise<boolean>;
16
- _getOpenSync: () => HTMLIonMenuElement | undefined;
17
- _createAnimation: (type: string, menuCmp: MenuI) => any;
18
- _register: (menu: MenuI) => void;
19
- _unregister: (menu: MenuI) => void;
20
- _setOpen: (menu: MenuI, shouldOpen: boolean, animated: boolean) => Promise<boolean>;
21
- };
1
+ import type { MenuControllerI } from '../../components/menu/menu-interface';
2
+ export declare const menuController: MenuControllerI;
package/hydrate/index.js CHANGED
@@ -6,7 +6,7 @@
6
6
  Object.defineProperty(exports, '__esModule', { value: true });
7
7
 
8
8
  /*!
9
- Stencil Mock Doc v4.4.1 | MIT Licensed | https://stenciljs.com
9
+ Stencil Mock Doc v4.4.1-dev.1697216096.18bf460 | MIT Licensed | https://stenciljs.com
10
10
  */
11
11
  const CONTENT_REF_ID = 'r';
12
12
  const ORG_LOCATION_ID = 'o';
@@ -25053,6 +25053,27 @@ class PickerColumnInternal {
25053
25053
  item.part.remove(PICKER_ITEM_ACTIVE_PART);
25054
25054
  }
25055
25055
  };
25056
+ /**
25057
+ * When ionInputModeChange is emitted, each column
25058
+ * needs to check if it is the one being made available
25059
+ * for text entry.
25060
+ */
25061
+ this.inputModeChange = (ev) => {
25062
+ if (!this.numericInput) {
25063
+ return;
25064
+ }
25065
+ const { useInputMode, inputModeColumn } = ev.detail;
25066
+ /**
25067
+ * If inputModeColumn is undefined then this means
25068
+ * all numericInput columns are being selected.
25069
+ */
25070
+ const isColumnActive = inputModeColumn === undefined || inputModeColumn === this.el;
25071
+ if (!useInputMode || !isColumnActive) {
25072
+ this.setInputModeActive(false);
25073
+ return;
25074
+ }
25075
+ this.setInputModeActive(true);
25076
+ };
25056
25077
  /**
25057
25078
  * Setting isActive will cause a re-render.
25058
25079
  * As a result, we do not want to cause the
@@ -25254,7 +25275,11 @@ class PickerColumnInternal {
25254
25275
  }
25255
25276
  };
25256
25277
  new IntersectionObserver(visibleCallback, { threshold: 0.001 }).observe(this.el);
25257
- this.parentEl = this.el.closest('ion-picker-internal');
25278
+ const parentEl = (this.parentEl = this.el.closest('ion-picker-internal'));
25279
+ if (parentEl !== null) {
25280
+ // TODO(FW-2832): type
25281
+ parentEl.addEventListener('ionInputModeChange', (ev) => this.inputModeChange(ev));
25282
+ }
25258
25283
  }
25259
25284
  componentDidRender() {
25260
25285
  var _a;
@@ -25297,29 +25322,6 @@ class PickerColumnInternal {
25297
25322
  this.ionChange.emit(findItem);
25298
25323
  }
25299
25324
  }
25300
- /**
25301
- * When ionInputModeChange is emitted, each column
25302
- * needs to check if it is the one being made available
25303
- * for text entry.
25304
- * input/change event listeners.
25305
- * @internal
25306
- */
25307
- async inputModeChange(useInputMode, inputModeColumn) {
25308
- if (!this.numericInput) {
25309
- return;
25310
- }
25311
- /**
25312
- * If inputModeColumn is undefined then this means
25313
- * all numericInput columns are being selected.
25314
- */
25315
- const isColumnActive = inputModeColumn === undefined || inputModeColumn === this.el;
25316
- if (!useInputMode || !isColumnActive) {
25317
- this.setInputModeActive(false);
25318
- return;
25319
- }
25320
- this.setInputModeActive(true);
25321
- }
25322
- ;
25323
25325
  get activeItem() {
25324
25326
  return getElementRoot(this.el).querySelector(`.picker-item[data-value="${this.value}"]:not([disabled])`);
25325
25327
  }
@@ -25363,8 +25365,7 @@ class PickerColumnInternal {
25363
25365
  "numericInput": [4, "numeric-input"],
25364
25366
  "isActive": [32],
25365
25367
  "scrollActiveItemIntoView": [64],
25366
- "setValue": [64],
25367
- "inputModeChange": [64]
25368
+ "setValue": [64]
25368
25369
  },
25369
25370
  "$listeners$": undefined,
25370
25371
  "$lazyBundleId$": "-",
@@ -25386,6 +25387,7 @@ const pickerInternalMdCss = "/*!@:host*/.sc-ion-picker-internal-md-h{display:-ms
25386
25387
  class PickerInternal {
25387
25388
  constructor(hostRef) {
25388
25389
  registerInstance(this, hostRef);
25390
+ this.ionInputModeChange = createEvent(this, "ionInputModeChange", 7);
25389
25391
  this.useInputMode = false;
25390
25392
  this.isInHighlightBounds = (ev) => {
25391
25393
  const { highlightEl } = this;
@@ -25599,7 +25601,7 @@ class PickerInternal {
25599
25601
  el.removeEventListener('keypress', this.onKeyPress);
25600
25602
  };
25601
25603
  }
25602
- this.triggerInputModeChange();
25604
+ this.emitInputModeChange();
25603
25605
  };
25604
25606
  this.onKeyPress = (ev) => {
25605
25607
  const { inputEl } = this;
@@ -25795,13 +25797,16 @@ class PickerInternal {
25795
25797
  }
25796
25798
  };
25797
25799
  /**
25798
- * Triggers an input mode change on child picker columns.
25799
- * This helps each picker column determine whether
25800
+ * Emit ionInputModeChange. Picker columns
25801
+ * listen for this event to determine whether
25800
25802
  * or not their column is "active" for text input.
25801
25803
  */
25802
- this.triggerInputModeChange = () => {
25803
- const pickerColumns = this.el.querySelectorAll('ion-picker-column-internal');
25804
- pickerColumns.forEach((pickerColumn) => pickerColumn.inputModeChange(this.useInputMode, this.inputModeColumn));
25804
+ this.emitInputModeChange = () => {
25805
+ const { useInputMode, inputModeColumn } = this;
25806
+ this.ionInputModeChange.emit({
25807
+ useInputMode,
25808
+ inputModeColumn,
25809
+ });
25805
25810
  };
25806
25811
  }
25807
25812
  /**
@@ -25838,7 +25843,7 @@ class PickerInternal {
25838
25843
  this.destroyKeypressListener();
25839
25844
  this.destroyKeypressListener = undefined;
25840
25845
  }
25841
- this.triggerInputModeChange();
25846
+ this.emitInputModeChange();
25842
25847
  }
25843
25848
  render() {
25844
25849
  return (hAsync(Host, { onPointerDown: (ev) => this.onPointerDown(ev), onClick: () => this.onClick() }, hAsync("input", { "aria-hidden": "true", tabindex: -1, inputmode: "numeric", type: "number", ref: (el) => (this.inputEl = el), onInput: () => this.onInputChange(), onBlur: () => this.exitInputMode() }), hAsync("div", { class: "picker-before" }), hAsync("div", { class: "picker-after" }), hAsync("div", { class: "picker-highlight", ref: (el) => (this.highlightEl = el) }), hAsync("slot", null)));
@@ -34659,7 +34664,7 @@ class Toolbar {
34659
34664
  }; }
34660
34665
  }
34661
34666
 
34662
- const titleIosCss = "/*!@:host*/.sc-ion-title-ios-h{--color:initial;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-align:center;align-items:center;-webkit-transform:translateZ(0);transform:translateZ(0);color:var(--color)}/*!@:host(.ion-color)*/.ion-color.sc-ion-title-ios-h{color:var(--ion-color-base)}/*!@.toolbar-title*/.toolbar-title.sc-ion-title-ios{display:block;width:100%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;pointer-events:auto}/*!@:host(.title-small) .toolbar-title*/.title-small.sc-ion-title-ios-h .toolbar-title.sc-ion-title-ios{white-space:normal}/*!@:host*/.sc-ion-title-ios-h{top:0;-webkit-padding-start:90px;padding-inline-start:90px;-webkit-padding-end:90px;padding-inline-end:90px;padding-top:var(--padding-top);padding-bottom:var(--padding-bottom);position:absolute;width:100%;height:100%;-webkit-transform:translateZ(0);transform:translateZ(0);font-size:min(1.0625rem, 20.4px);font-weight:600;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none}@supports (inset-inline-start: 0){/*!@:host*/.sc-ion-title-ios-h{inset-inline-start:0}}@supports not (inset-inline-start: 0){/*!@:host*/.sc-ion-title-ios-h{left:0}/*!@:host-context([dir=rtl])*/[dir=rtl].sc-ion-title-ios-h,[dir=rtl] .sc-ion-title-ios-h{left:unset;right:unset;right:0}/*!@@supports selector(:dir(rtl))*/@supports .sc-ion-title-ios selector(.sc-ion-title-ios:dir(rtl)){.sc-ion-title-ios-h:dir(rtl){left:unset;right:unset;right:0}}}/*!@:host(.title-small)*/.title-small.sc-ion-title-ios-h{-webkit-padding-start:9px;padding-inline-start:9px;-webkit-padding-end:9px;padding-inline-end:9px;padding-top:6px;padding-bottom:16px;position:relative;font-size:min(0.8125rem, 23.4px);font-weight:normal}/*!@:host(.title-large)*/.title-large.sc-ion-title-ios-h{-webkit-padding-start:12px;padding-inline-start:12px;-webkit-padding-end:12px;padding-inline-end:12px;padding-top:2px;padding-bottom:4px;-webkit-transform-origin:left center;transform-origin:left center;position:static;-ms-flex-align:end;align-items:flex-end;min-width:100%;font-size:min(2.125rem, 61.2px);font-weight:700;text-align:start}/*!@:host(.title-large.title-rtl)*/.title-large.title-rtl.sc-ion-title-ios-h{-webkit-transform-origin:right center;transform-origin:right center}/*!@:host(.title-large.ion-cloned-element)*/.title-large.ion-cloned-element.sc-ion-title-ios-h{--color:var(--ion-text-color, #000);font-family:var(--ion-font-family)}/*!@:host(.title-large) .toolbar-title*/.title-large.sc-ion-title-ios-h .toolbar-title.sc-ion-title-ios{-webkit-transform-origin:inherit;transform-origin:inherit}/*!@:host-context([dir=rtl]):host(.title-large) .toolbar-title, :host-context([dir=rtl]).title-large .toolbar-title*/[dir=rtl].sc-ion-title-ios-h -no-combinator.title-large.sc-ion-title-ios-h .toolbar-title.sc-ion-title-ios,[dir=rtl] .sc-ion-title-ios-h -no-combinator.title-large.sc-ion-title-ios-h .toolbar-title.sc-ion-title-ios,[dir=rtl].title-large.sc-ion-title-ios-h .toolbar-title.sc-ion-title-ios,[dir=rtl] .title-large.sc-ion-title-ios-h .toolbar-title.sc-ion-title-ios{-webkit-transform-origin:calc(100% - inherit);transform-origin:calc(100% - inherit)}@supports selector(:dir(rtl)){/*!@:host(.title-large) .toolbar-title:dir(rtl)*/.title-large.sc-ion-title-ios-h .toolbar-title.sc-ion-title-ios:dir(rtl){-webkit-transform-origin:calc(100% - inherit);transform-origin:calc(100% - inherit)}}";
34667
+ const titleIosCss = "/*!@:host*/.sc-ion-title-ios-h{--color:initial;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-align:center;align-items:center;-webkit-transform:translateZ(0);transform:translateZ(0);color:var(--color)}/*!@:host(.ion-color)*/.ion-color.sc-ion-title-ios-h{color:var(--ion-color-base)}/*!@.toolbar-title*/.toolbar-title.sc-ion-title-ios{display:block;width:100%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;pointer-events:auto}/*!@:host(.title-small) .toolbar-title*/.title-small.sc-ion-title-ios-h .toolbar-title.sc-ion-title-ios{white-space:normal}/*!@:host*/.sc-ion-title-ios-h{top:0;-webkit-padding-start:90px;padding-inline-start:90px;-webkit-padding-end:90px;padding-inline-end:90px;padding-top:var(--padding-top);padding-bottom:var(--padding-bottom);position:absolute;width:100%;height:100%;-webkit-transform:translateZ(0);transform:translateZ(0);font-size:min(1.0625rem, 20.4px);font-weight:600;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none}@supports (inset-inline-start: 0){/*!@:host*/.sc-ion-title-ios-h{inset-inline-start:0}}@supports not (inset-inline-start: 0){/*!@:host*/.sc-ion-title-ios-h{left:0}/*!@:host-context([dir=rtl])*/[dir=rtl].sc-ion-title-ios-h,[dir=rtl] .sc-ion-title-ios-h{left:unset;right:unset;right:0}/*!@@supports selector(:dir(rtl))*/@supports .sc-ion-title-ios selector(.sc-ion-title-ios:dir(rtl)){.sc-ion-title-ios-h:dir(rtl){left:unset;right:unset;right:0}}}/*!@:host(.title-small)*/.title-small.sc-ion-title-ios-h{-webkit-padding-start:9px;padding-inline-start:9px;-webkit-padding-end:9px;padding-inline-end:9px;padding-top:6px;padding-bottom:16px;position:relative;font-size:min(0.8125rem, 23.4px);font-weight:normal}/*!@:host(.title-large)*/.title-large.sc-ion-title-ios-h{-webkit-padding-start:12px;padding-inline-start:12px;-webkit-padding-end:12px;padding-inline-end:12px;padding-top:2px;padding-bottom:4px;-webkit-transform-origin:left center;transform-origin:left center;position:static;-ms-flex-align:end;align-items:flex-end;min-width:100%;font-size:min(2.125rem, 61.2px);font-weight:700;text-align:start}/*!@:host(.title-large.title-rtl)*/.title-large.title-rtl.sc-ion-title-ios-h{-webkit-transform-origin:right center;transform-origin:right center}/*!@:host(.title-large.ion-cloned-element)*/.title-large.ion-cloned-element.sc-ion-title-ios-h{--color:var(--ion-text-color, #000);font-family:var(--ion-font-family)}/*!@:host(.title-large) .toolbar-title*/.title-large.sc-ion-title-ios-h .toolbar-title.sc-ion-title-ios{-webkit-transform-origin:inherit;transform-origin:inherit;width:auto}/*!@:host-context([dir=rtl]):host(.title-large) .toolbar-title, :host-context([dir=rtl]).title-large .toolbar-title*/[dir=rtl].sc-ion-title-ios-h -no-combinator.title-large.sc-ion-title-ios-h .toolbar-title.sc-ion-title-ios,[dir=rtl] .sc-ion-title-ios-h -no-combinator.title-large.sc-ion-title-ios-h .toolbar-title.sc-ion-title-ios,[dir=rtl].title-large.sc-ion-title-ios-h .toolbar-title.sc-ion-title-ios,[dir=rtl] .title-large.sc-ion-title-ios-h .toolbar-title.sc-ion-title-ios{-webkit-transform-origin:calc(100% - inherit);transform-origin:calc(100% - inherit)}@supports selector(:dir(rtl)){/*!@:host(.title-large) .toolbar-title:dir(rtl)*/.title-large.sc-ion-title-ios-h .toolbar-title.sc-ion-title-ios:dir(rtl){-webkit-transform-origin:calc(100% - inherit);transform-origin:calc(100% - inherit)}}";
34663
34668
 
34664
34669
  const titleMdCss = "/*!@:host*/.sc-ion-title-md-h{--color:initial;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-align:center;align-items:center;-webkit-transform:translateZ(0);transform:translateZ(0);color:var(--color)}/*!@:host(.ion-color)*/.ion-color.sc-ion-title-md-h{color:var(--ion-color-base)}/*!@.toolbar-title*/.toolbar-title.sc-ion-title-md{display:block;width:100%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;pointer-events:auto}/*!@:host(.title-small) .toolbar-title*/.title-small.sc-ion-title-md-h .toolbar-title.sc-ion-title-md{white-space:normal}/*!@:host*/.sc-ion-title-md-h{-webkit-padding-start:20px;padding-inline-start:20px;-webkit-padding-end:20px;padding-inline-end:20px;padding-top:0;padding-bottom:0;font-size:1.25rem;font-weight:500;letter-spacing:0.0125em}/*!@:host(.title-small)*/.title-small.sc-ion-title-md-h{width:100%;height:100%;font-size:0.9375rem;font-weight:normal}";
34665
34670
 
@@ -34861,60 +34866,134 @@ const createLargeTitleTransition = (rootAnimation, rtl, backDirection, enteringE
34861
34866
  if (shouldAnimationForward) {
34862
34867
  const leavingLargeTitleBox = leavingLargeTitle.getBoundingClientRect();
34863
34868
  const enteringBackButtonBox = enteringBackButton.getBoundingClientRect();
34864
- animateLargeTitle(rootAnimation, rtl, backDirection, leavingLargeTitle, leavingLargeTitleBox, enteringBackButtonBox);
34865
- animateBackButton(rootAnimation, rtl, backDirection, enteringBackButton, leavingLargeTitleBox, enteringBackButtonBox);
34869
+ const enteringBackButtonTextEl = shadow(enteringBackButton).querySelector('.button-text');
34870
+ const enteringBackButtonTextBox = enteringBackButtonTextEl.getBoundingClientRect();
34871
+ const leavingLargeTitleTextEl = shadow(leavingLargeTitle).querySelector('.toolbar-title');
34872
+ const leavingLargeTitleTextBox = leavingLargeTitleTextEl.getBoundingClientRect();
34873
+ animateLargeTitle(rootAnimation, rtl, backDirection, leavingLargeTitle, leavingLargeTitleBox, leavingLargeTitleTextBox, enteringBackButtonTextEl, enteringBackButtonTextBox);
34874
+ animateBackButton(rootAnimation, rtl, backDirection, enteringBackButton, enteringBackButtonBox, enteringBackButtonTextEl, enteringBackButtonTextBox, leavingLargeTitle, leavingLargeTitleTextBox);
34866
34875
  }
34867
34876
  else if (shouldAnimationBackward) {
34868
34877
  const enteringLargeTitleBox = enteringLargeTitle.getBoundingClientRect();
34869
34878
  const leavingBackButtonBox = leavingBackButton.getBoundingClientRect();
34870
- animateLargeTitle(rootAnimation, rtl, backDirection, enteringLargeTitle, enteringLargeTitleBox, leavingBackButtonBox);
34871
- animateBackButton(rootAnimation, rtl, backDirection, leavingBackButton, enteringLargeTitleBox, leavingBackButtonBox);
34879
+ const leavingBackButtonTextEl = shadow(leavingBackButton).querySelector('.button-text');
34880
+ const leavingBackButtonTextBox = leavingBackButtonTextEl.getBoundingClientRect();
34881
+ const enteringLargeTitleTextEl = shadow(enteringLargeTitle).querySelector('.toolbar-title');
34882
+ const enteringLargeTitleTextBox = enteringLargeTitleTextEl.getBoundingClientRect();
34883
+ animateLargeTitle(rootAnimation, rtl, backDirection, enteringLargeTitle, enteringLargeTitleBox, enteringLargeTitleTextBox, leavingBackButtonTextEl, leavingBackButtonTextBox);
34884
+ animateBackButton(rootAnimation, rtl, backDirection, leavingBackButton, leavingBackButtonBox, leavingBackButtonTextEl, leavingBackButtonTextBox, enteringLargeTitle, enteringLargeTitleTextBox);
34872
34885
  }
34873
34886
  return {
34874
34887
  forward: shouldAnimationForward,
34875
34888
  backward: shouldAnimationBackward,
34876
34889
  };
34877
34890
  };
34878
- const animateBackButton = (rootAnimation, rtl, backDirection, backButtonEl, largeTitleBox, backButtonBox) => {
34891
+ const animateBackButton = (rootAnimation, rtl, backDirection, backButtonEl, backButtonBox, backButtonTextEl, backButtonTextBox, largeTitleEl, largeTitleTextBox) => {
34892
+ var _a, _b;
34879
34893
  const BACK_BUTTON_START_OFFSET = rtl ? `calc(100% - ${backButtonBox.right + 4}px)` : `${backButtonBox.left - 4}px`;
34880
- const START_TEXT_TRANSLATE = rtl ? '7px' : '-7px';
34881
- const END_TEXT_TRANSLATE = rtl ? '-4px' : '4px';
34882
- const ICON_TRANSLATE = rtl ? '-4px' : '4px';
34883
34894
  const TEXT_ORIGIN_X = rtl ? 'right' : 'left';
34884
34895
  const ICON_ORIGIN_X = rtl ? 'left' : 'right';
34896
+ const CONTAINER_ORIGIN_X = rtl ? 'right' : 'left';
34897
+ /**
34898
+ * When the title and back button texts match
34899
+ * then they should overlap during the page transition.
34900
+ * If the texts do not match up then the back button text scale adjusts
34901
+ * to not perfectly match the large title text otherwise the
34902
+ * proportions will be incorrect.
34903
+ * When the texts match we scale both the width and height to account for
34904
+ * font weight differences between the title and back button.
34905
+ */
34906
+ const doTitleAndButtonTextsMatch = ((_a = backButtonTextEl.textContent) === null || _a === void 0 ? void 0 : _a.trim()) === ((_b = largeTitleEl.textContent) === null || _b === void 0 ? void 0 : _b.trim());
34907
+ const WIDTH_SCALE = largeTitleTextBox.width / backButtonTextBox.width;
34908
+ /**
34909
+ * We subtract an offset to account for slight sizing/padding
34910
+ * differences between the title and the back button.
34911
+ */
34912
+ const HEIGHT_SCALE = (largeTitleTextBox.height - LARGE_TITLE_SIZE_OFFSET) / backButtonTextBox.height;
34913
+ const TEXT_START_SCALE = doTitleAndButtonTextsMatch
34914
+ ? `scale(${WIDTH_SCALE}, ${HEIGHT_SCALE})`
34915
+ : `scale(${HEIGHT_SCALE})`;
34916
+ const TEXT_END_SCALE = 'scale(1)';
34917
+ const backButtonIconEl = shadow(backButtonEl).querySelector('ion-icon');
34918
+ const backButtonIconBox = backButtonIconEl.getBoundingClientRect();
34919
+ /**
34920
+ * We need to offset the container by the icon dimensions
34921
+ * so that the back button text aligns with the large title
34922
+ * text. Otherwise, the back button icon will align with the
34923
+ * large title text but the back button text will not.
34924
+ */
34925
+ const CONTAINER_START_TRANSLATE_X = rtl
34926
+ ? `${backButtonIconBox.width / 2 - (backButtonIconBox.right - backButtonBox.right)}px`
34927
+ : `${backButtonBox.left - backButtonIconBox.width / 2}px`;
34928
+ const CONTAINER_END_TRANSLATE_X = rtl ? `-${window.innerWidth - backButtonBox.right}px` : `${backButtonBox.left}px`;
34929
+ /**
34930
+ * Back button container should be
34931
+ * aligned to the top of the title container
34932
+ * so the texts overlap as the back button
34933
+ * text begins to fade in.
34934
+ */
34935
+ const CONTAINER_START_TRANSLATE_Y = `${largeTitleTextBox.top}px`;
34936
+ /**
34937
+ * The cloned back button should align exactly with the
34938
+ * real back button on the entering page otherwise there will
34939
+ * be a layout shift.
34940
+ */
34941
+ const CONTAINER_END_TRANSLATE_Y = `${backButtonBox.top}px`;
34942
+ /**
34943
+ * In the forward direction, the cloned back button
34944
+ * container should translate from over the large title
34945
+ * to over the back button. In the backward direction,
34946
+ * it should translate from over the back button to over
34947
+ * the large title.
34948
+ */
34949
+ const FORWARD_CONTAINER_KEYFRAMES = [
34950
+ { offset: 0, transform: `translate3d(${CONTAINER_START_TRANSLATE_X}, ${CONTAINER_START_TRANSLATE_Y}, 0)` },
34951
+ { offset: 1, transform: `translate3d(${CONTAINER_END_TRANSLATE_X}, ${CONTAINER_END_TRANSLATE_Y}, 0)` },
34952
+ ];
34953
+ const BACKWARD_CONTAINER_KEYFRAMES = [
34954
+ { offset: 0, transform: `translate3d(${CONTAINER_END_TRANSLATE_X}, ${CONTAINER_END_TRANSLATE_Y}, 0)` },
34955
+ { offset: 1, transform: `translate3d(${CONTAINER_START_TRANSLATE_X}, ${CONTAINER_START_TRANSLATE_Y}, 0)` },
34956
+ ];
34957
+ const CONTAINER_KEYFRAMES = backDirection ? BACKWARD_CONTAINER_KEYFRAMES : FORWARD_CONTAINER_KEYFRAMES;
34958
+ /**
34959
+ * In the forward direction, the text in the cloned back button
34960
+ * should start to be (roughly) the size of the large title
34961
+ * and then scale down to be the size of the actual back button.
34962
+ * The text should also translate, but that translate is handled
34963
+ * by the container keyframes.
34964
+ */
34885
34965
  const FORWARD_TEXT_KEYFRAMES = [
34886
- {
34887
- offset: 0,
34888
- opacity: 0,
34889
- transform: `translate3d(${START_TEXT_TRANSLATE}, ${largeTitleBox.top - 40}px, 0) scale(2.1)`,
34890
- },
34891
- { offset: 1, opacity: 1, transform: `translate3d(${END_TEXT_TRANSLATE}, ${backButtonBox.top - 46}px, 0) scale(1)` },
34966
+ { offset: 0, opacity: 0, transform: TEXT_START_SCALE },
34967
+ { offset: 1, opacity: 1, transform: TEXT_END_SCALE },
34892
34968
  ];
34893
34969
  const BACKWARD_TEXT_KEYFRAMES = [
34894
- { offset: 0, opacity: 1, transform: `translate3d(${END_TEXT_TRANSLATE}, ${backButtonBox.top - 46}px, 0) scale(1)` },
34895
- { offset: 0.6, opacity: 0 },
34896
- {
34897
- offset: 1,
34898
- opacity: 0,
34899
- transform: `translate3d(${START_TEXT_TRANSLATE}, ${largeTitleBox.top - 40}px, 0) scale(2.1)`,
34900
- },
34970
+ { offset: 0, opacity: 1, transform: TEXT_END_SCALE },
34971
+ { offset: 1, opacity: 0, transform: TEXT_START_SCALE },
34901
34972
  ];
34902
34973
  const TEXT_KEYFRAMES = backDirection ? BACKWARD_TEXT_KEYFRAMES : FORWARD_TEXT_KEYFRAMES;
34974
+ /**
34975
+ * The icon should scale in/out in the second
34976
+ * half of the animation. The icon should also
34977
+ * translate, but that translate is handled by the
34978
+ * container keyframes.
34979
+ */
34903
34980
  const FORWARD_ICON_KEYFRAMES = [
34904
- { offset: 0, opacity: 0, transform: `translate3d(${ICON_TRANSLATE}, ${backButtonBox.top - 41}px, 0) scale(0.6)` },
34905
- { offset: 1, opacity: 1, transform: `translate3d(${ICON_TRANSLATE}, ${backButtonBox.top - 46}px, 0) scale(1)` },
34981
+ { offset: 0, opacity: 0, transform: 'scale(0.6)' },
34982
+ { offset: 0.6, opacity: 0, transform: 'scale(0.6)' },
34983
+ { offset: 1, opacity: 1, transform: 'scale(1)' },
34906
34984
  ];
34907
34985
  const BACKWARD_ICON_KEYFRAMES = [
34908
- { offset: 0, opacity: 1, transform: `translate3d(${ICON_TRANSLATE}, ${backButtonBox.top - 46}px, 0) scale(1)` },
34909
- { offset: 0.2, opacity: 0, transform: `translate3d(${ICON_TRANSLATE}, ${backButtonBox.top - 41}px, 0) scale(0.6)` },
34910
- { offset: 1, opacity: 0, transform: `translate3d(${ICON_TRANSLATE}, ${backButtonBox.top - 41}px, 0) scale(0.6)` },
34986
+ { offset: 0, opacity: 1, transform: 'scale(1)' },
34987
+ { offset: 0.2, opacity: 0, transform: 'scale(0.6)' },
34988
+ { offset: 1, opacity: 0, transform: 'scale(0.6)' },
34911
34989
  ];
34912
34990
  const ICON_KEYFRAMES = backDirection ? BACKWARD_ICON_KEYFRAMES : FORWARD_ICON_KEYFRAMES;
34913
34991
  const enteringBackButtonTextAnimation = createAnimation();
34914
34992
  const enteringBackButtonIconAnimation = createAnimation();
34993
+ const enteringBackButtonAnimation = createAnimation();
34915
34994
  const clonedBackButtonEl = getClonedElement('ion-back-button');
34916
- const backButtonTextEl = shadow(clonedBackButtonEl).querySelector('.button-text');
34917
- const backButtonIconEl = shadow(clonedBackButtonEl).querySelector('ion-icon');
34995
+ const clonedBackButtonTextEl = shadow(clonedBackButtonEl).querySelector('.button-text');
34996
+ const clonedBackButtonIconEl = shadow(clonedBackButtonEl).querySelector('ion-icon');
34918
34997
  clonedBackButtonEl.text = backButtonEl.text;
34919
34998
  clonedBackButtonEl.mode = backButtonEl.mode;
34920
34999
  clonedBackButtonEl.icon = backButtonEl.icon;
@@ -34922,11 +35001,19 @@ const animateBackButton = (rootAnimation, rtl, backDirection, backButtonEl, larg
34922
35001
  clonedBackButtonEl.disabled = backButtonEl.disabled;
34923
35002
  clonedBackButtonEl.style.setProperty('display', 'block');
34924
35003
  clonedBackButtonEl.style.setProperty('position', 'fixed');
34925
- enteringBackButtonIconAnimation.addElement(backButtonIconEl);
34926
- enteringBackButtonTextAnimation.addElement(backButtonTextEl);
35004
+ enteringBackButtonIconAnimation.addElement(clonedBackButtonIconEl);
35005
+ enteringBackButtonTextAnimation.addElement(clonedBackButtonTextEl);
35006
+ enteringBackButtonAnimation.addElement(clonedBackButtonEl);
35007
+ enteringBackButtonAnimation
35008
+ .beforeStyles({
35009
+ position: 'absolute',
35010
+ top: '0px',
35011
+ [CONTAINER_ORIGIN_X]: '0px',
35012
+ })
35013
+ .keyframes(CONTAINER_KEYFRAMES);
34927
35014
  enteringBackButtonTextAnimation
34928
35015
  .beforeStyles({
34929
- 'transform-origin': `${TEXT_ORIGIN_X} center`,
35016
+ 'transform-origin': `${TEXT_ORIGIN_X} top`,
34930
35017
  })
34931
35018
  .beforeAddWrite(() => {
34932
35019
  backButtonEl.style.setProperty('display', 'none');
@@ -34943,21 +35030,91 @@ const animateBackButton = (rootAnimation, rtl, backDirection, backButtonEl, larg
34943
35030
  'transform-origin': `${ICON_ORIGIN_X} center`,
34944
35031
  })
34945
35032
  .keyframes(ICON_KEYFRAMES);
34946
- rootAnimation.addAnimation([enteringBackButtonTextAnimation, enteringBackButtonIconAnimation]);
35033
+ rootAnimation.addAnimation([
35034
+ enteringBackButtonTextAnimation,
35035
+ enteringBackButtonIconAnimation,
35036
+ enteringBackButtonAnimation,
35037
+ ]);
34947
35038
  };
34948
- const animateLargeTitle = (rootAnimation, rtl, backDirection, largeTitleEl, largeTitleBox, backButtonBox) => {
34949
- const TITLE_START_OFFSET = rtl ? `calc(100% - ${largeTitleBox.right}px)` : `${largeTitleBox.left}px`;
34950
- const START_TRANSLATE = rtl ? '-18px' : '18px';
35039
+ const animateLargeTitle = (rootAnimation, rtl, backDirection, largeTitleEl, largeTitleBox, largeTitleTextBox, backButtonTextEl, backButtonTextBox) => {
35040
+ var _a, _b;
35041
+ /**
35042
+ * The horizontal transform origin for the large title
35043
+ */
34951
35044
  const ORIGIN_X = rtl ? 'right' : 'left';
35045
+ const TITLE_START_OFFSET = rtl ? `calc(100% - ${largeTitleBox.right}px)` : `${largeTitleBox.left}px`;
35046
+ /**
35047
+ * The cloned large should align exactly with the
35048
+ * real large title on the leaving page otherwise there will
35049
+ * be a layout shift.
35050
+ */
35051
+ const START_TRANSLATE_X = '0px';
35052
+ const START_TRANSLATE_Y = `${largeTitleBox.top}px`;
35053
+ /**
35054
+ * How much to offset the large title translation by.
35055
+ * This accounts for differences in sizing between the large
35056
+ * title and the back button due to padding and font weight.
35057
+ */
35058
+ const LARGE_TITLE_TRANSLATION_OFFSET = 8;
35059
+ /**
35060
+ * The scaled title should (roughly) overlap the back button.
35061
+ * This ensures that the back button and title overlap during
35062
+ * the animation. Note that since both elements either fade in
35063
+ * or fade out over the course of the animation, neither element
35064
+ * will be fully visible on top of the other. As a result, the overlap
35065
+ * does not need to be perfect, so approximate values are acceptable here.
35066
+ */
35067
+ const END_TRANSLATE_X = rtl
35068
+ ? `-${window.innerWidth - backButtonTextBox.right - LARGE_TITLE_TRANSLATION_OFFSET}px`
35069
+ : `${backButtonTextBox.x - LARGE_TITLE_TRANSLATION_OFFSET}px`;
35070
+ /**
35071
+ * The top of the scaled large title
35072
+ * should match with the top of the
35073
+ * back button text element.
35074
+ * We subtract 2px to account for the top padding
35075
+ * on the large title element.
35076
+ */
35077
+ const LARGE_TITLE_TOP_PADDING = 2;
35078
+ const END_TRANSLATE_Y = `${backButtonTextBox.y - LARGE_TITLE_TOP_PADDING}px`;
35079
+ /**
35080
+ * In the forward direction, the large title should start at its
35081
+ * normal size and then scale down to be (roughly) the size of the
35082
+ * back button on the other view. In the backward direction, the
35083
+ * large title should start at (roughly) the size of the back button
35084
+ * and then scale up to its original size.
35085
+ *
35086
+ * Note that since both elements either fade in
35087
+ * or fade out over the course of the animation, neither element
35088
+ * will be fully visible on top of the other. As a result, the overlap
35089
+ * does not need to be perfect, so approximate values are acceptable here.
35090
+ */
35091
+ /**
35092
+ * When the title and back button texts match
35093
+ * then they should overlap during the page transition.
35094
+ * If the texts do not match up then the large title text scale adjusts
35095
+ * to not perfectly match the back button text otherwise the
35096
+ * proportions will be incorrect.
35097
+ * When the texts match we scale both the width and height to account for
35098
+ * font weight differences between the title and back button.
35099
+ */
35100
+ const doTitleAndButtonTextsMatch = ((_a = backButtonTextEl.textContent) === null || _a === void 0 ? void 0 : _a.trim()) === ((_b = largeTitleEl.textContent) === null || _b === void 0 ? void 0 : _b.trim());
35101
+ const WIDTH_SCALE = backButtonTextBox.width / largeTitleTextBox.width;
35102
+ const HEIGHT_SCALE = backButtonTextBox.height / (largeTitleTextBox.height - LARGE_TITLE_SIZE_OFFSET);
35103
+ const START_SCALE = 'scale(1)';
35104
+ const END_SCALE = doTitleAndButtonTextsMatch ? `scale(${WIDTH_SCALE}, ${HEIGHT_SCALE})` : `scale(${HEIGHT_SCALE})`;
34952
35105
  const BACKWARDS_KEYFRAMES = [
34953
- { offset: 0, opacity: 0, transform: `translate3d(${START_TRANSLATE}, ${backButtonBox.top - 4}px, 0) scale(0.49)` },
35106
+ { offset: 0, opacity: 0, transform: `translate3d(${END_TRANSLATE_X}, ${END_TRANSLATE_Y}, 0) ${END_SCALE}` },
34954
35107
  { offset: 0.1, opacity: 0 },
34955
- { offset: 1, opacity: 1, transform: `translate3d(0, ${largeTitleBox.top + 2}px, 0) scale(1)` },
35108
+ { offset: 1, opacity: 1, transform: `translate3d(${START_TRANSLATE_X}, ${START_TRANSLATE_Y}, 0) ${START_SCALE}` },
34956
35109
  ];
34957
35110
  const FORWARDS_KEYFRAMES = [
34958
- { offset: 0, opacity: 0.99, transform: `translate3d(0, ${largeTitleBox.top + 2}px, 0) scale(1)` },
35111
+ {
35112
+ offset: 0,
35113
+ opacity: 0.99,
35114
+ transform: `translate3d(${START_TRANSLATE_X}, ${START_TRANSLATE_Y}, 0) ${START_SCALE}`,
35115
+ },
34959
35116
  { offset: 0.6, opacity: 0 },
34960
- { offset: 1, opacity: 0, transform: `translate3d(${START_TRANSLATE}, ${backButtonBox.top - 4}px, 0) scale(0.5)` },
35117
+ { offset: 1, opacity: 0, transform: `translate3d(${END_TRANSLATE_X}, ${END_TRANSLATE_Y}, 0) ${END_SCALE}` },
34961
35118
  ];
34962
35119
  const KEYFRAMES = backDirection ? BACKWARDS_KEYFRAMES : FORWARDS_KEYFRAMES;
34963
35120
  const clonedTitleEl = getClonedElement('ion-title');
@@ -34968,8 +35125,14 @@ const animateLargeTitle = (rootAnimation, rtl, backDirection, largeTitleEl, larg
34968
35125
  clonedLargeTitleAnimation.addElement(clonedTitleEl);
34969
35126
  clonedLargeTitleAnimation
34970
35127
  .beforeStyles({
34971
- 'transform-origin': `${ORIGIN_X} center`,
34972
- height: '46px',
35128
+ 'transform-origin': `${ORIGIN_X} top`,
35129
+ /**
35130
+ * Since font size changes will cause
35131
+ * the dimension of the large title to change
35132
+ * we need to set the cloned title height
35133
+ * equal to that of the original large title height.
35134
+ */
35135
+ height: `${largeTitleBox.height}px`,
34973
35136
  display: '',
34974
35137
  position: 'relative',
34975
35138
  [ORIGIN_X]: TITLE_START_OFFSET,
@@ -35282,6 +35445,16 @@ const iosTransitionAnimation = (navEl, opts) => {
35282
35445
  throw err;
35283
35446
  }
35284
35447
  };
35448
+ /**
35449
+ * The scale of the back button during the animation
35450
+ * is computed based on the scale of the large title
35451
+ * and vice versa. However, we need to account for slight
35452
+ * variations in the size of the large title due to
35453
+ * padding and font weight. This value should be used to subtract
35454
+ * a small amount from the large title height when computing scales
35455
+ * to get more accurate scale results.
35456
+ */
35457
+ const LARGE_TITLE_SIZE_OFFSET = 10;
35285
35458
 
35286
35459
  var ios_transition = /*#__PURE__*/Object.freeze({
35287
35460
  __proto__: null,
@@ -35491,7 +35664,7 @@ function patchDomImplementation(e, t) {
35491
35664
  r.CustomEvent !== t && (r.CustomEvent = t);
35492
35665
  }
35493
35666
  try {
35494
- e.baseURI;
35667
+ r.__stencil_baseURI = e.baseURI;
35495
35668
  } catch (t) {
35496
35669
  Object.defineProperty(e, "baseURI", {
35497
35670
  get() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ionic/core",
3
- "version": "7.5.1-dev.11697139276.10eb94b8",
3
+ "version": "7.5.1-dev.11697219113.17f86185",
4
4
  "description": "Base components for Ionic",
5
5
  "keywords": [
6
6
  "ionic",
@@ -31,7 +31,7 @@
31
31
  "loader/"
32
32
  ],
33
33
  "dependencies": {
34
- "@stencil/core": "^4.4.1",
34
+ "@stencil/core": "^4.4.1-dev.1697216096.18bf460",
35
35
  "ionicons": "^7.2.1",
36
36
  "tslib": "^2.1.0"
37
37
  },
@@ -44,7 +44,7 @@
44
44
  "@ionic/eslint-config": "^0.3.0",
45
45
  "@ionic/prettier-config": "^2.0.0",
46
46
  "@jest/core": "^27.5.1",
47
- "@playwright/test": "^1.38.1",
47
+ "@playwright/test": "^1.39.0",
48
48
  "@rollup/plugin-node-resolve": "^8.4.0",
49
49
  "@rollup/plugin-virtual": "^2.0.3",
50
50
  "@stencil/angular-output-target": "^0.8.2",