@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.
- package/components/ion-title.js +1 -1
- package/components/ios.transition.js +209 -41
- package/components/picker-column-internal.js +27 -26
- package/components/picker-internal.js +12 -8
- package/dist/cjs/{index-d93fb71d.js → index-eccba000.js} +2 -2
- package/dist/cjs/index.cjs.js +3 -3
- package/dist/cjs/ion-app_8.cjs.entry.js +2 -2
- package/dist/cjs/ion-modal.cjs.entry.js +1 -1
- package/dist/cjs/ion-nav_2.cjs.entry.js +1 -1
- package/dist/cjs/ion-picker-column-internal.cjs.entry.js +26 -24
- package/dist/cjs/ion-picker-internal.cjs.entry.js +11 -7
- package/dist/cjs/ion-popover.cjs.entry.js +1 -1
- package/dist/cjs/ionic.cjs.js +2 -2
- package/dist/cjs/{ios.transition-a4d545dd.js → ios.transition-5af5991e.js} +210 -42
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/{md.transition-80bb961b.js → md.transition-1e740a6a.js} +1 -1
- package/dist/collection/collection-manifest.json +1 -1
- package/dist/collection/components/picker-column-internal/picker-column-internal.js +26 -54
- package/dist/collection/components/picker-internal/picker-internal-interfaces.js +1 -0
- package/dist/collection/components/picker-internal/picker-internal.js +34 -7
- package/dist/collection/components/title/title.ios.css +9 -0
- package/dist/collection/utils/transition/ios.transition.js +209 -41
- package/dist/docs.json +7 -2
- package/dist/esm/{index-7d2b2808.js → index-a09eac70.js} +2 -2
- package/dist/esm/index.js +3 -3
- package/dist/esm/ion-app_8.entry.js +2 -2
- package/dist/esm/ion-modal.entry.js +1 -1
- package/dist/esm/ion-nav_2.entry.js +1 -1
- package/dist/esm/ion-picker-column-internal.entry.js +26 -24
- package/dist/esm/ion-picker-internal.entry.js +12 -8
- package/dist/esm/ion-popover.entry.js +1 -1
- package/dist/esm/ionic.js +2 -2
- package/dist/esm/{ios.transition-a86d7bbe.js → ios.transition-4d1322d6.js} +210 -42
- package/dist/esm/loader.js +1 -1
- package/dist/esm/{md.transition-365ef6b6.js → md.transition-66b425d0.js} +1 -1
- package/dist/esm-es5/{index-7d2b2808.js → index-a09eac70.js} +1 -1
- package/dist/esm-es5/index.js +1 -1
- package/dist/esm-es5/ion-app_8.entry.js +1 -1
- package/dist/esm-es5/ion-modal.entry.js +1 -1
- package/dist/esm-es5/ion-nav_2.entry.js +1 -1
- package/dist/esm-es5/ion-picker-column-internal.entry.js +1 -1
- package/dist/esm-es5/ion-picker-internal.entry.js +1 -1
- package/dist/esm-es5/ion-popover.entry.js +1 -1
- package/dist/esm-es5/ionic.js +1 -1
- package/dist/esm-es5/ios.transition-4d1322d6.js +4 -0
- package/dist/esm-es5/loader.js +1 -1
- package/dist/esm-es5/{md.transition-365ef6b6.js → md.transition-66b425d0.js} +1 -1
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/ionic.js +1 -1
- package/dist/ionic/{p-c994fff0.system.js → p-091c8792.system.js} +1 -1
- package/dist/ionic/p-0b7c25ee.system.entry.js +4 -0
- package/dist/ionic/{p-22923e47.entry.js → p-0f217f27.entry.js} +1 -1
- package/dist/ionic/{p-b08e4088.system.entry.js → p-1d8d5f9a.system.entry.js} +1 -1
- package/dist/ionic/{p-fcdc853a.system.entry.js → p-2592264d.system.entry.js} +1 -1
- package/dist/ionic/p-2a8eeef7.system.js +4 -0
- package/dist/ionic/p-3a58e3a4.system.entry.js +4 -0
- package/dist/ionic/{p-5c3e72a8.system.js → p-530b98d8.system.js} +1 -1
- package/dist/ionic/{p-9b9dcc3e.system.entry.js → p-61ca6685.system.entry.js} +1 -1
- package/dist/ionic/{p-4cba3f05.entry.js → p-7eaa585f.entry.js} +1 -1
- package/dist/ionic/p-818b2e75.entry.js +4 -0
- package/dist/ionic/{p-e42aaa8b.entry.js → p-8209372c.entry.js} +1 -1
- package/dist/ionic/p-afb6658f.entry.js +4 -0
- package/dist/ionic/{p-c05315f5.system.entry.js → p-b2fb0dda.system.entry.js} +1 -1
- package/dist/ionic/{p-e38a5f77.js → p-c44fe9fd.js} +1 -1
- package/dist/ionic/p-de68588d.js +4 -0
- package/dist/ionic/{p-128a98e8.system.js → p-e028178a.system.js} +1 -1
- package/dist/ionic/{p-ced41304.system.js → p-e0f0d55f.system.js} +1 -1
- package/dist/ionic/{p-f34f001c.entry.js → p-e25cb483.entry.js} +1 -1
- package/dist/ionic/p-eb7d0922.js +4 -0
- package/dist/types/components/menu/menu-interface.d.ts +15 -4
- package/dist/types/components/picker-column-internal/picker-column-internal.d.ts +1 -3
- package/dist/types/components/picker-internal/picker-internal-interfaces.d.ts +8 -0
- package/dist/types/components/picker-internal/picker-internal.d.ts +6 -4
- package/dist/types/components.d.ts +7 -4
- package/dist/types/utils/menu-controller/index.d.ts +2 -21
- package/hydrate/index.js +250 -77
- package/package.json +3 -3
- package/dist/esm-es5/ios.transition-a86d7bbe.js +0 -4
- package/dist/ionic/p-129bc265.system.entry.js +0 -4
- package/dist/ionic/p-16e44585.js +0 -4
- package/dist/ionic/p-b9047b05.system.js +0 -4
- package/dist/ionic/p-c0190e6d.system.entry.js +0 -4
- package/dist/ionic/p-d021cd8c.entry.js +0 -4
- package/dist/ionic/p-e2bb634f.js +0 -4
- 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
|
|
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
|
-
*
|
|
95
|
-
*
|
|
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
|
|
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 {
|
|
2
|
-
|
|
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.
|
|
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
|
-
*
|
|
25799
|
-
*
|
|
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.
|
|
25803
|
-
const
|
|
25804
|
-
|
|
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.
|
|
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
|
-
|
|
34865
|
-
|
|
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
|
-
|
|
34871
|
-
|
|
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,
|
|
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
|
-
|
|
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:
|
|
34895
|
-
{ offset:
|
|
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:
|
|
34905
|
-
{ offset:
|
|
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:
|
|
34909
|
-
{ offset: 0.2, opacity: 0, transform:
|
|
34910
|
-
{ offset: 1, opacity: 0, transform:
|
|
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
|
|
34917
|
-
const
|
|
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(
|
|
34926
|
-
enteringBackButtonTextAnimation.addElement(
|
|
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}
|
|
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([
|
|
35033
|
+
rootAnimation.addAnimation([
|
|
35034
|
+
enteringBackButtonTextAnimation,
|
|
35035
|
+
enteringBackButtonIconAnimation,
|
|
35036
|
+
enteringBackButtonAnimation,
|
|
35037
|
+
]);
|
|
34947
35038
|
};
|
|
34948
|
-
const animateLargeTitle = (rootAnimation, rtl, backDirection, largeTitleEl, largeTitleBox,
|
|
34949
|
-
|
|
34950
|
-
|
|
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(${
|
|
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(
|
|
35108
|
+
{ offset: 1, opacity: 1, transform: `translate3d(${START_TRANSLATE_X}, ${START_TRANSLATE_Y}, 0) ${START_SCALE}` },
|
|
34956
35109
|
];
|
|
34957
35110
|
const FORWARDS_KEYFRAMES = [
|
|
34958
|
-
{
|
|
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(${
|
|
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}
|
|
34972
|
-
|
|
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.
|
|
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.
|
|
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",
|