@rdlabo/ionic-theme-ios27 0.1.0 → 0.2.1-beta.pr185.sha0793981f6cf4

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 (148) hide show
  1. package/README.md +34 -8
  2. package/dist/css/components/ion-button.css +1 -1
  3. package/dist/css/components/ion-fab.css +1 -1
  4. package/dist/css/components/ion-list.css +1 -1
  5. package/dist/css/components/ion-menu.css +1 -1
  6. package/dist/css/components/ion-searchbar.css +1 -1
  7. package/dist/css/components/ion-tabs.css +1 -1
  8. package/dist/css/components/ion-toolbar.css +1 -1
  9. package/dist/css/ionic-theme-ios27.css +1 -1
  10. package/dist/css/md-ion-list-inset.css +1 -1
  11. package/dist/css/utils/translucent.css +1 -1
  12. package/dist/index.d.ts +1 -2
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +1 -2
  15. package/dist/native/components/searchable-tabs.d.ts +2 -0
  16. package/dist/native/components/searchable-tabs.d.ts.map +1 -1
  17. package/dist/native/components/searchable-tabs.js +131 -21
  18. package/dist/native/definitions.d.ts +19 -0
  19. package/dist/native/definitions.d.ts.map +1 -1
  20. package/dist/native/index.d.ts +4 -3
  21. package/dist/native/index.d.ts.map +1 -1
  22. package/dist/native/index.js +22 -9
  23. package/dist/native/lifecycle.d.ts +4 -0
  24. package/dist/native/lifecycle.d.ts.map +1 -0
  25. package/dist/native/lifecycle.js +34 -0
  26. package/dist/native/runtime.d.ts +2 -2
  27. package/dist/native/runtime.d.ts.map +1 -1
  28. package/dist/native/runtime.js +57 -11
  29. package/dist/tab-bar-searchable/animations/enter.d.ts +1 -1
  30. package/dist/tab-bar-searchable/animations/enter.d.ts.map +1 -1
  31. package/dist/tab-bar-searchable/animations/enter.js +1 -1
  32. package/dist/tab-bar-searchable/animations/leave.d.ts +1 -1
  33. package/dist/tab-bar-searchable/animations/leave.d.ts.map +1 -1
  34. package/dist/tab-bar-searchable/animations/leave.js +1 -1
  35. package/dist/tab-bar-searchable/index.d.ts +2 -2
  36. package/dist/tab-bar-searchable/index.d.ts.map +1 -1
  37. package/dist/tab-bar-searchable/index.js +2 -3
  38. package/dist/transition/ios.transition.d.ts +6 -1
  39. package/dist/transition/ios.transition.d.ts.map +1 -1
  40. package/dist/transition/ios.transition.js +10 -385
  41. package/docs/features.md +3 -1
  42. package/docs/ios-adaptive.md +20 -21
  43. package/docs/native-ui-shell.md +117 -3
  44. package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellSearchController.swift +243 -64
  45. package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellTabBar.swift +77 -6
  46. package/ios/Sources/IonicNativeUIShellPlugin/IonicNativeUIShellPlugin.swift +106 -11
  47. package/ios/Tests/IonicNativeUIShellPluginTests/ShellSnapshotTests.swift +258 -2
  48. package/node_modules/@rdlabo/ionic-theme-utils/LICENSE +21 -0
  49. package/node_modules/@rdlabo/ionic-theme-utils/README.md +28 -0
  50. package/node_modules/@rdlabo/ionic-theme-utils/dist/dom.d.ts +3 -0
  51. package/node_modules/@rdlabo/ionic-theme-utils/dist/dom.d.ts.map +1 -0
  52. package/node_modules/@rdlabo/ionic-theme-utils/dist/dom.js +13 -0
  53. package/node_modules/@rdlabo/ionic-theme-utils/dist/dom.js.map +1 -0
  54. package/node_modules/@rdlabo/ionic-theme-utils/dist/focus-controller.d.ts +6 -0
  55. package/node_modules/@rdlabo/ionic-theme-utils/dist/focus-controller.d.ts.map +1 -0
  56. package/node_modules/@rdlabo/ionic-theme-utils/dist/focus-controller.js +37 -0
  57. package/node_modules/@rdlabo/ionic-theme-utils/dist/focus-controller.js.map +1 -0
  58. package/node_modules/@rdlabo/ionic-theme-utils/dist/index.d.ts +13 -0
  59. package/node_modules/@rdlabo/ionic-theme-utils/dist/index.d.ts.map +1 -0
  60. package/node_modules/@rdlabo/ionic-theme-utils/dist/index.js +11 -0
  61. package/node_modules/@rdlabo/ionic-theme-utils/dist/index.js.map +1 -0
  62. package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/animations/ios.enter.d.ts +0 -1
  63. package/node_modules/@rdlabo/ionic-theme-utils/dist/popover/animations/ios.enter.d.ts.map +1 -0
  64. package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/animations/ios.enter.js +8 -5
  65. package/node_modules/@rdlabo/ionic-theme-utils/dist/popover/animations/ios.enter.js.map +1 -0
  66. package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/animations/ios.leave.d.ts.map +1 -1
  67. package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/animations/ios.leave.js +11 -5
  68. package/node_modules/@rdlabo/ionic-theme-utils/dist/popover/animations/ios.leave.js.map +1 -0
  69. package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/callout-surface.js +1 -0
  70. package/node_modules/@rdlabo/ionic-theme-utils/dist/popover/callout-surface.js.map +1 -0
  71. package/node_modules/@rdlabo/ionic-theme-utils/dist/popover/popover-interface.js +2 -0
  72. package/node_modules/@rdlabo/ionic-theme-utils/dist/popover/popover-interface.js.map +1 -0
  73. package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/utils.d.ts +1 -0
  74. package/node_modules/@rdlabo/ionic-theme-utils/dist/popover/utils.d.ts.map +1 -0
  75. package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/utils.js +3 -2
  76. package/node_modules/@rdlabo/ionic-theme-utils/dist/popover/utils.js.map +1 -0
  77. package/node_modules/@rdlabo/ionic-theme-utils/dist/sheets-of-glass.d.ts +16 -0
  78. package/node_modules/@rdlabo/ionic-theme-utils/dist/sheets-of-glass.d.ts.map +1 -0
  79. package/node_modules/@rdlabo/ionic-theme-utils/dist/sheets-of-glass.js +2 -0
  80. package/node_modules/@rdlabo/ionic-theme-utils/dist/sheets-of-glass.js.map +1 -0
  81. package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/tab-bar-searchable/interfaces.js +1 -0
  82. package/node_modules/@rdlabo/ionic-theme-utils/dist/tab-bar-searchable/interfaces.js.map +1 -0
  83. package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/tab-bar-searchable/utils.js +1 -0
  84. package/node_modules/@rdlabo/ionic-theme-utils/dist/tab-bar-searchable/utils.js.map +1 -0
  85. package/node_modules/@rdlabo/ionic-theme-utils/dist/theme.d.ts +15 -0
  86. package/node_modules/@rdlabo/ionic-theme-utils/dist/theme.d.ts.map +1 -0
  87. package/node_modules/@rdlabo/ionic-theme-utils/dist/theme.js +49 -0
  88. package/node_modules/@rdlabo/ionic-theme-utils/dist/theme.js.map +1 -0
  89. package/node_modules/@rdlabo/ionic-theme-utils/dist/transition/ios.transition.d.ts +18 -0
  90. package/node_modules/@rdlabo/ionic-theme-utils/dist/transition/ios.transition.d.ts.map +1 -0
  91. package/node_modules/@rdlabo/ionic-theme-utils/dist/transition/ios.transition.js +412 -0
  92. package/node_modules/@rdlabo/ionic-theme-utils/dist/transition/ios.transition.js.map +1 -0
  93. package/node_modules/@rdlabo/ionic-theme-utils/package.json +64 -0
  94. package/node_modules/@rdlabo/ionic-theme-utils/src/dom.spec.ts +19 -0
  95. package/node_modules/@rdlabo/ionic-theme-utils/src/dom.ts +16 -0
  96. package/node_modules/@rdlabo/ionic-theme-utils/src/focus-controller.ts +38 -0
  97. package/node_modules/@rdlabo/ionic-theme-utils/src/index.ts +59 -0
  98. package/{src → node_modules/@rdlabo/ionic-theme-utils/src}/popover/animations/ios.enter.ts +7 -5
  99. package/{src → node_modules/@rdlabo/ionic-theme-utils/src}/popover/animations/ios.leave.ts +14 -5
  100. package/node_modules/@rdlabo/ionic-theme-utils/src/popover/utils.spec.ts +58 -0
  101. package/{src → node_modules/@rdlabo/ionic-theme-utils/src}/popover/utils.ts +4 -2
  102. package/node_modules/@rdlabo/ionic-theme-utils/src/sheets-of-glass.ts +17 -0
  103. package/node_modules/@rdlabo/ionic-theme-utils/src/styles/index.scss +1 -0
  104. package/node_modules/@rdlabo/ionic-theme-utils/src/styles/md-ion-list-inset.scss +20 -0
  105. package/node_modules/@rdlabo/ionic-theme-utils/src/styles/structured-list.scss +310 -0
  106. package/node_modules/@rdlabo/ionic-theme-utils/src/tab-bar-searchable/utils.spec.ts +56 -0
  107. package/node_modules/@rdlabo/ionic-theme-utils/src/theme.ts +51 -0
  108. package/node_modules/@rdlabo/ionic-theme-utils/src/transition/ios.transition.spec.ts +52 -0
  109. package/node_modules/@rdlabo/ionic-theme-utils/src/transition/ios.transition.ts +542 -0
  110. package/package.json +13 -5
  111. package/src/index.ts +4 -2
  112. package/src/native/components/searchable-tabs.ts +142 -22
  113. package/src/native/definitions.ts +34 -0
  114. package/src/native/index.ts +38 -11
  115. package/src/native/lifecycle.ts +38 -0
  116. package/src/native/runtime.ts +60 -10
  117. package/src/styles/components/ion-button.scss +21 -10
  118. package/src/styles/components/ion-fab.scss +10 -4
  119. package/src/styles/components/ion-list.scss +12 -3
  120. package/src/styles/components/ion-menu.scss +17 -10
  121. package/src/styles/components/ion-searchbar.scss +1 -1
  122. package/src/styles/components/ion-tabs.scss +14 -10
  123. package/src/styles/components/ion-toolbar.scss +9 -10
  124. package/src/styles/md-ion-list-inset.scss +2 -2
  125. package/src/styles/utils/dark/ion-list.scss +1 -1
  126. package/src/styles/utils/translucent.scss +44 -0
  127. package/src/tab-bar-searchable/animations/enter.ts +1 -2
  128. package/src/tab-bar-searchable/animations/leave.ts +1 -2
  129. package/src/tab-bar-searchable/index.ts +12 -4
  130. package/src/transition/ios.transition.ts +14 -473
  131. package/dist/css/utils/structured-list.css +0 -1
  132. package/dist/popover/animations/ios.enter.d.ts.map +0 -1
  133. package/dist/popover/popover-interface.js +0 -1
  134. package/dist/popover/utils.d.ts.map +0 -1
  135. package/src/styles/utils/structured-list.scss +0 -223
  136. /package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/animations/ios.leave.d.ts +0 -0
  137. /package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/callout-surface.d.ts +0 -0
  138. /package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/callout-surface.d.ts.map +0 -0
  139. /package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/popover-interface.d.ts +0 -0
  140. /package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/popover-interface.d.ts.map +0 -0
  141. /package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/tab-bar-searchable/interfaces.d.ts +0 -0
  142. /package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/tab-bar-searchable/interfaces.d.ts.map +0 -0
  143. /package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/tab-bar-searchable/utils.d.ts +0 -0
  144. /package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/tab-bar-searchable/utils.d.ts.map +0 -0
  145. /package/{src → node_modules/@rdlabo/ionic-theme-utils/src}/popover/callout-surface.ts +0 -0
  146. /package/{src → node_modules/@rdlabo/ionic-theme-utils/src}/popover/popover-interface.ts +0 -0
  147. /package/{src → node_modules/@rdlabo/ionic-theme-utils/src}/tab-bar-searchable/interfaces.ts +0 -0
  148. /package/{src → node_modules/@rdlabo/ionic-theme-utils/src}/tab-bar-searchable/utils.ts +0 -0
@@ -1,484 +1,25 @@
1
+ import { createIosTransitionAnimation, shadow } from '@rdlabo/ionic-theme-utils';
1
2
  import type { Animation } from '@ionic/core';
2
- import { createAnimation } from '@ionic/core';
3
3
  import type { TransitionOptions } from './index';
4
4
  import { getIonPageElement } from './index';
5
5
  import { connectNativeUIShellTransition } from '../native-integration';
6
6
 
7
- const DURATION = 540;
7
+ export { shadow };
8
8
 
9
- const getClonedElement = <T extends HTMLIonBackButtonElement | HTMLIonTitleElement>(tagName: string) => {
10
- return document.querySelector<T>(`${tagName}.ion-cloned-element`);
11
- };
9
+ export interface IosTransitionConfig {
10
+ radius: number;
11
+ }
12
12
 
13
- export const shadow = <T extends Element>(el: T): ShadowRoot | T => {
14
- return el.shadowRoot || el;
13
+ const transitionConfig = {
14
+ offLeftPercent: 30,
15
+ getIonPageElement,
16
+ connectNativeUIShellTransition,
17
+ radius: 0,
15
18
  };
16
19
 
17
- const animateFixedBackButton = (
18
- root: Animation,
19
- navEl: HTMLElement,
20
- page: HTMLElement,
21
- entering: boolean,
22
- interactive: boolean,
23
- otherPage?: HTMLElement,
24
- ) => {
25
- const button = page.querySelector<HTMLIonBackButtonElement>(
26
- ':scope > ion-header.header-translucent:not(.ios-theme-disabled, .ios26-disabled) ion-back-button:not(.ios-theme-disabled, .ios26-disabled)',
27
- );
28
- if (!button || button.offsetWidth === 0) {
29
- return;
30
- }
31
-
32
- const otherButton = otherPage?.querySelector<HTMLIonBackButtonElement>(
33
- ':scope > ion-header.header-translucent:not(.ios-theme-disabled, .ios26-disabled) ion-back-button:not(.ios-theme-disabled, .ios26-disabled)',
34
- );
35
- const persistent = !!otherButton && otherButton.offsetWidth > 0;
36
- const buttons = [button, ...(persistent ? [otherButton!] : [])].map((element) => ({
37
- element,
38
- visibility: element.style.visibility,
39
- }));
40
- const rect = button.getBoundingClientRect();
41
- const width = button.offsetWidth;
42
- const height = button.offsetHeight;
43
- const clone = getClonedElement<HTMLIonBackButtonElement>('ion-back-button');
44
- if (!clone) {
45
- return;
46
- }
47
- const cloneParent = clone.parentNode!;
48
- const cloneNextSibling = clone.nextSibling;
49
- const cloneStyle = clone.getAttribute('style');
50
- clone.icon = button.icon;
51
- clone.text = button.text;
52
- clone.mode = button.mode;
53
- clone.color = button.color;
54
- clone.disabled = button.disabled;
55
- const icon = shadow(clone).querySelector('ion-icon');
56
- const animation = createAnimation().addElement(clone);
57
- const fadeStart = !entering && interactive ? 0.8 : 0.4;
58
- const fadeEnd = entering ? 0.96 : interactive ? 1 : 0.95;
59
- if (persistent) {
60
- animation.fromTo('transform', 'scale(1)', 'scale(1)').fromTo('opacity', 1, 1);
61
- } else if (entering) {
62
- animation.keyframes([
63
- { offset: 0, transform: 'scale(1.2)', opacity: 0 },
64
- { offset: fadeStart, transform: 'scale(1.2)', opacity: 0 },
65
- { offset: 0.65, transform: 'scale(1.12)', opacity: 0.15 },
66
- { offset: 0.9, transform: 'scale(1.02)', opacity: 0.75 },
67
- { offset: fadeEnd, transform: 'scale(1)', opacity: 1 },
68
- { offset: 1, transform: 'scale(1)', opacity: 1 },
69
- ]);
70
- } else {
71
- animation.keyframes([
72
- { offset: 0, transform: 'scale(1)', opacity: 1 },
73
- { offset: fadeStart, transform: 'scale(1)', opacity: 1 },
74
- { offset: fadeEnd, transform: 'scale(1.2)', opacity: 0 },
75
- { offset: 1, transform: 'scale(1.2)', opacity: 0 },
76
- ]);
77
- }
78
- if (icon && !persistent) {
79
- const from = entering ? 'blur(4px)' : 'blur(0px)';
80
- const to = entering ? 'blur(0px)' : 'blur(4px)';
81
- animation.addAnimation(
82
- createAnimation()
83
- .addElement(icon)
84
- .keyframes([
85
- { offset: 0, filter: from },
86
- { offset: fadeStart, filter: from },
87
- { offset: fadeEnd, filter: to },
88
- { offset: 1, filter: to },
89
- ]),
90
- );
91
- }
92
- root.beforeAddWrite(() => {
93
- Object.assign(clone.style, {
94
- position: 'fixed',
95
- left: `${rect.left + (rect.width - width) / 2}px`,
96
- top: `${rect.top + (rect.height - height) / 2}px`,
97
- width: `${width}px`,
98
- height: `${height}px`,
99
- margin: '0',
100
- pointerEvents: 'none',
101
- visibility: 'visible',
102
- display: getComputedStyle(button).display,
103
- zIndex: '1000',
104
- });
105
- navEl.appendChild(clone);
106
- buttons.forEach(({ element }) => (element.style.visibility = 'hidden'));
107
- });
108
- root.afterAddWrite(() => {
109
- buttons.forEach(({ element, visibility }) => (element.style.visibility = visibility));
110
- cloneParent.insertBefore(clone, cloneNextSibling);
111
- if (cloneStyle === null) {
112
- clone.removeAttribute('style');
113
- } else {
114
- clone.setAttribute('style', cloneStyle);
115
- }
116
- });
117
- root.addAnimation(animation);
20
+ export const setConfig = (config: Partial<IosTransitionConfig>): void => {
21
+ Object.assign(transitionConfig, config);
118
22
  };
119
23
 
120
- export const iosTransitionAnimation = (navEl: HTMLElement, opts: TransitionOptions): Animation => {
121
- try {
122
- const EASING = 'cubic-bezier(0.32,0.72,0,1)';
123
- const OPACITY = 'opacity';
124
- const TRANSFORM = 'transform';
125
- const CENTER = '0%';
126
- const OFF_OPACITY = 0.8;
127
-
128
- const isRTL = navEl.ownerDocument.dir === 'rtl';
129
- const OFF_RIGHT = isRTL ? '-99.5%' : '99.5%';
130
- const OFF_LEFT = isRTL ? '33%' : '-33%';
131
-
132
- const enteringEl = opts.enteringEl;
133
- const leavingEl = opts.leavingEl;
134
-
135
- const backDirection = opts.direction === 'back';
136
- const contentEl = enteringEl.querySelector(':scope > ion-content');
137
- const headerEls = enteringEl.querySelectorAll(':scope > ion-header > *:not(ion-toolbar), :scope > ion-footer > *');
138
- const enteringToolBarEls = enteringEl.querySelectorAll(':scope > ion-header > ion-toolbar');
139
-
140
- const rootAnimation = createAnimation();
141
- const enteringContentAnimation = createAnimation();
142
-
143
- rootAnimation
144
- .addElement(enteringEl)
145
- .duration((opts.duration ?? 0) || DURATION)
146
- .easing(opts.easing || EASING)
147
- .fill('both')
148
- .beforeRemoveClass('ion-page-invisible');
149
-
150
- const topPage = backDirection ? leavingEl : enteringEl;
151
- if (topPage?.querySelector(':scope > ion-header.header-translucent:not(.ios-theme-disabled, .ios26-disabled)')) {
152
- const shadow = topPage.style.boxShadow;
153
- rootAnimation.beforeAddWrite(() => {
154
- topPage.style.boxShadow = `${isRTL ? 4 : -4}px 0 24px rgba(0, 0, 0, 0.04)`;
155
- });
156
- rootAnimation.afterAddWrite(() => {
157
- topPage.style.boxShadow = shadow;
158
- });
159
- }
160
-
161
- // eslint-disable-next-line @typescript-eslint/prefer-optional-chain
162
- if (leavingEl && navEl !== null && navEl !== undefined) {
163
- const navDecorAnimation = createAnimation();
164
- navDecorAnimation.addElement(navEl);
165
- rootAnimation.addAnimation(navDecorAnimation);
166
- }
167
-
168
- if (enteringEl.querySelector(':scope > ion-header.header-translucent:not(.ios-theme-disabled, .ios26-disabled)')) {
169
- enteringContentAnimation.addElement(enteringEl);
170
- } else if (!contentEl && enteringToolBarEls.length === 0 && headerEls.length === 0) {
171
- enteringContentAnimation.addElement(enteringEl.querySelector(':scope > .ion-page, :scope > ion-nav, :scope > ion-tabs')!); // REVIEW
172
- } else {
173
- enteringContentAnimation.addElement(contentEl!); // REVIEW
174
- enteringContentAnimation.addElement(headerEls);
175
- }
176
-
177
- rootAnimation.addAnimation(enteringContentAnimation);
178
-
179
- if (backDirection) {
180
- enteringContentAnimation
181
- .beforeClearStyles([OPACITY])
182
- .fromTo('transform', `translateX(${OFF_LEFT})`, `translateX(${CENTER})`)
183
- .fromTo(OPACITY, OFF_OPACITY, 1);
184
- } else {
185
- // entering content, forward direction
186
- enteringContentAnimation.beforeClearStyles([OPACITY]).fromTo('transform', `translateX(${OFF_RIGHT})`, `translateX(${CENTER})`);
187
- }
188
-
189
- if (contentEl && !enteringEl.querySelector(':scope > ion-header.header-translucent:not(.ios-theme-disabled, .ios26-disabled)')) {
190
- const enteringTransitionEffectEl = shadow(contentEl).querySelector('.transition-effect');
191
- if (enteringTransitionEffectEl) {
192
- const enteringTransitionCoverEl = enteringTransitionEffectEl.querySelector('.transition-cover');
193
- const enteringTransitionShadowEl = enteringTransitionEffectEl.querySelector('.transition-shadow');
194
-
195
- const enteringTransitionEffect = createAnimation();
196
- const enteringTransitionCover = createAnimation();
197
- const enteringTransitionShadow = createAnimation();
198
-
199
- enteringTransitionEffect
200
- .addElement(enteringTransitionEffectEl)
201
- .beforeStyles({ opacity: '1', display: 'block' })
202
- .afterStyles({ opacity: '', display: '' });
203
-
204
- enteringTransitionCover
205
- .addElement(enteringTransitionCoverEl!) // REVIEW
206
- .beforeClearStyles([OPACITY])
207
- .fromTo(OPACITY, 0, 0.1);
208
-
209
- enteringTransitionShadow
210
- .addElement(enteringTransitionShadowEl!) // REVIEW
211
- .beforeClearStyles([OPACITY])
212
- .fromTo(OPACITY, 0.03, 0.7);
213
-
214
- enteringTransitionEffect.addAnimation([enteringTransitionCover, enteringTransitionShadow]);
215
- enteringContentAnimation.addAnimation([enteringTransitionEffect]);
216
- }
217
- }
218
-
219
- if (topPage) {
220
- animateFixedBackButton(
221
- rootAnimation,
222
- navEl,
223
- topPage,
224
- !backDirection,
225
- opts.progressCallback !== undefined,
226
- backDirection ? enteringEl : leavingEl,
227
- );
228
- }
229
-
230
- const enteringContentHasLargeTitle = enteringEl.querySelector('ion-header.header-collapse-condense');
231
-
232
- enteringToolBarEls.forEach((enteringToolBarEl) => {
233
- if (enteringToolBarEl.closest('ion-header')?.matches('.header-translucent:not(.ios-theme-disabled, .ios26-disabled)')) {
234
- return;
235
- }
236
- const enteringToolBar = createAnimation();
237
- enteringToolBar.addElement(enteringToolBarEl);
238
- rootAnimation.addAnimation(enteringToolBar);
239
-
240
- const enteringTitle = createAnimation();
241
- enteringTitle.addElement(enteringToolBarEl.querySelector('ion-title')!); // REVIEW
242
-
243
- const enteringToolBarButtons = createAnimation();
244
- const buttons = Array.from(enteringToolBarEl.querySelectorAll('ion-buttons,[menuToggle]'));
245
-
246
- const parentHeader = enteringToolBarEl.closest('ion-header');
247
- const inactiveHeader = parentHeader?.classList.contains('header-collapse-condense-inactive');
248
-
249
- let buttonsToAnimate;
250
- if (backDirection) {
251
- buttonsToAnimate = buttons.filter((button) => {
252
- const isCollapseButton = button.classList.contains('buttons-collapse');
253
- return (isCollapseButton && !inactiveHeader) || !isCollapseButton;
254
- });
255
- } else {
256
- buttonsToAnimate = buttons.filter((button) => !button.classList.contains('buttons-collapse'));
257
- }
258
-
259
- enteringToolBarButtons.addElement(buttonsToAnimate);
260
-
261
- const enteringToolBarItems = createAnimation();
262
- enteringToolBarItems.addElement(enteringToolBarEl.querySelectorAll(':scope > *:not(ion-title):not(ion-buttons):not([menuToggle])'));
263
-
264
- const enteringToolBarBg = createAnimation();
265
- enteringToolBarBg.addElement(shadow(enteringToolBarEl).querySelector('.toolbar-background')!); // REVIEW
266
-
267
- const enteringBackButton = createAnimation();
268
- const backButtonEl = enteringToolBarEl.querySelector('ion-back-button');
269
-
270
- if (backButtonEl) {
271
- enteringBackButton.addElement(backButtonEl);
272
- }
273
-
274
- enteringToolBar.addAnimation([enteringTitle, enteringToolBarButtons, enteringToolBarItems, enteringToolBarBg, enteringBackButton]);
275
- enteringToolBarButtons.fromTo(OPACITY, 0.01, 1);
276
- enteringToolBarItems.fromTo(OPACITY, 0.01, 1);
277
-
278
- if (backDirection) {
279
- if (!inactiveHeader) {
280
- enteringTitle.fromTo('transform', `translateX(${OFF_LEFT})`, `translateX(${CENTER})`).fromTo(OPACITY, 0.01, 1);
281
- }
282
-
283
- enteringToolBarItems.fromTo('transform', `translateX(${OFF_LEFT})`, `translateX(${CENTER})`);
284
-
285
- // back direction, entering page has a back button
286
- enteringBackButton.fromTo(OPACITY, 0.01, 1);
287
- } else {
288
- // entering toolbar, forward direction
289
- if (!enteringContentHasLargeTitle) {
290
- enteringTitle.fromTo('transform', `translateX(${OFF_RIGHT})`, `translateX(${CENTER})`).fromTo(OPACITY, 0.01, 1);
291
- }
292
-
293
- enteringToolBarItems.fromTo('transform', `translateX(${OFF_RIGHT})`, `translateX(${CENTER})`);
294
- enteringToolBarBg.beforeClearStyles([OPACITY, 'transform']);
295
-
296
- const translucentHeader = parentHeader?.translucent;
297
- if (!translucentHeader) {
298
- enteringToolBarBg.fromTo(OPACITY, 0.01, 'var(--opacity)');
299
- } else {
300
- enteringToolBarBg.fromTo('transform', isRTL ? 'translateX(-100%)' : 'translateX(100%)', 'translateX(0px)');
301
- }
302
-
303
- // forward direction, entering page has a back button
304
- enteringBackButton.fromTo(OPACITY, 0.01, 1);
305
-
306
- if (backButtonEl) {
307
- const enteringBackBtnText = createAnimation();
308
- enteringBackBtnText
309
- .addElement(shadow(backButtonEl).querySelector('.button-text')!) // REVIEW
310
- .fromTo(`transform`, isRTL ? 'translateX(-100px)' : 'translateX(100px)', 'translateX(0px)');
311
-
312
- enteringToolBar.addAnimation(enteringBackBtnText);
313
- }
314
- }
315
- });
316
-
317
- // setup leaving view
318
- if (leavingEl) {
319
- const leavingContent = createAnimation();
320
- const leavingContentEl = leavingEl.querySelector(':scope > ion-content');
321
- const leavingToolBarEls = leavingEl.querySelectorAll(':scope > ion-header > ion-toolbar');
322
- const leavingHeaderEls = leavingEl.querySelectorAll(':scope > ion-header > *:not(ion-toolbar), :scope > ion-footer > *');
323
-
324
- if (leavingEl.querySelector(':scope > ion-header.header-translucent:not(.ios-theme-disabled, .ios26-disabled)')) {
325
- leavingContent.addElement(leavingEl);
326
- } else if (!leavingContentEl && leavingToolBarEls.length === 0 && leavingHeaderEls.length === 0) {
327
- leavingContent.addElement(leavingEl.querySelector(':scope > .ion-page, :scope > ion-nav, :scope > ion-tabs')!); // REVIEW
328
- } else {
329
- leavingContent.addElement(leavingContentEl!); // REVIEW
330
- leavingContent.addElement(leavingHeaderEls);
331
- }
332
-
333
- rootAnimation.addAnimation(leavingContent);
334
-
335
- if (backDirection) {
336
- // leaving content, back direction
337
- leavingContent
338
- .beforeClearStyles([OPACITY])
339
- .fromTo('transform', `translateX(${CENTER})`, isRTL ? 'translateX(-100%)' : 'translateX(100%)');
340
-
341
- const leavingPage = getIonPageElement(leavingEl) as HTMLElement;
342
- rootAnimation.afterAddWrite(() => {
343
- if (rootAnimation.getDirection() === 'normal') {
344
- leavingPage.style.setProperty('display', 'none');
345
- }
346
- });
347
- } else {
348
- // leaving content, forward direction
349
- leavingContent.fromTo('transform', `translateX(${CENTER})`, `translateX(${OFF_LEFT})`).fromTo(OPACITY, 1, OFF_OPACITY);
350
- }
351
-
352
- if (
353
- leavingContentEl &&
354
- !leavingEl.querySelector(':scope > ion-header.header-translucent:not(.ios-theme-disabled, .ios26-disabled)')
355
- ) {
356
- const leavingTransitionEffectEl = shadow(leavingContentEl).querySelector('.transition-effect');
357
-
358
- if (leavingTransitionEffectEl) {
359
- const leavingTransitionCoverEl = leavingTransitionEffectEl.querySelector('.transition-cover');
360
- const leavingTransitionShadowEl = leavingTransitionEffectEl.querySelector('.transition-shadow');
361
-
362
- const leavingTransitionEffect = createAnimation();
363
- const leavingTransitionCover = createAnimation();
364
- const leavingTransitionShadow = createAnimation();
365
-
366
- leavingTransitionEffect
367
- .addElement(leavingTransitionEffectEl)
368
- .beforeStyles({ opacity: '1', display: 'block' })
369
- .afterStyles({ opacity: '', display: '' });
370
-
371
- leavingTransitionCover
372
- .addElement(leavingTransitionCoverEl!) // REVIEW
373
- .beforeClearStyles([OPACITY])
374
- .fromTo(OPACITY, 0.1, 0);
375
-
376
- leavingTransitionShadow
377
- .addElement(leavingTransitionShadowEl!) // REVIEW
378
- .beforeClearStyles([OPACITY])
379
- .fromTo(OPACITY, 0.7, 0.03);
380
-
381
- leavingTransitionEffect.addAnimation([leavingTransitionCover, leavingTransitionShadow]);
382
- leavingContent.addAnimation([leavingTransitionEffect]);
383
- }
384
- }
385
-
386
- leavingToolBarEls.forEach((leavingToolBarEl) => {
387
- if (leavingToolBarEl.closest('ion-header')?.matches('.header-translucent:not(.ios-theme-disabled, .ios26-disabled)')) {
388
- return;
389
- }
390
- const leavingToolBar = createAnimation();
391
- leavingToolBar.addElement(leavingToolBarEl);
392
-
393
- const leavingTitle = createAnimation();
394
- leavingTitle.addElement(leavingToolBarEl.querySelector('ion-title')!); // REVIEW
395
-
396
- const leavingToolBarButtons = createAnimation();
397
- const buttons = leavingToolBarEl.querySelectorAll('ion-buttons,[menuToggle]');
398
-
399
- const parentHeader = leavingToolBarEl.closest('ion-header');
400
- const inactiveHeader = parentHeader?.classList.contains('header-collapse-condense-inactive');
401
-
402
- const buttonsToAnimate = Array.from(buttons).filter((button) => {
403
- const isCollapseButton = button.classList.contains('buttons-collapse');
404
- return (isCollapseButton && !inactiveHeader) || !isCollapseButton;
405
- });
406
-
407
- leavingToolBarButtons.addElement(buttonsToAnimate);
408
-
409
- const leavingToolBarItems = createAnimation();
410
- const leavingToolBarItemEls = leavingToolBarEl.querySelectorAll(':scope > *:not(ion-title):not(ion-buttons):not([menuToggle])');
411
- if (leavingToolBarItemEls.length > 0) {
412
- leavingToolBarItems.addElement(leavingToolBarItemEls);
413
- }
414
-
415
- const leavingToolBarBg = createAnimation();
416
- leavingToolBarBg.addElement(shadow(leavingToolBarEl).querySelector('.toolbar-background')!); // REVIEW
417
-
418
- const leavingBackButton = createAnimation();
419
- const backButtonEl = leavingToolBarEl.querySelector('ion-back-button');
420
- if (backButtonEl) {
421
- leavingBackButton.addElement(backButtonEl);
422
- }
423
-
424
- leavingToolBar.addAnimation([leavingTitle, leavingToolBarButtons, leavingToolBarItems, leavingBackButton, leavingToolBarBg]);
425
- rootAnimation.addAnimation(leavingToolBar);
426
-
427
- // fade out leaving toolbar items
428
- leavingBackButton.fromTo(OPACITY, 0.99, 0);
429
-
430
- leavingToolBarButtons.fromTo(OPACITY, 0.99, 0);
431
- leavingToolBarItems.fromTo(OPACITY, 0.99, 0);
432
-
433
- if (backDirection) {
434
- if (!inactiveHeader) {
435
- // leaving toolbar, back direction
436
- leavingTitle
437
- .fromTo('transform', `translateX(${CENTER})`, isRTL ? 'translateX(-100%)' : 'translateX(100%)')
438
- .fromTo(OPACITY, 0.99, 0);
439
- }
440
-
441
- leavingToolBarItems.fromTo('transform', `translateX(${CENTER})`, isRTL ? 'translateX(-100%)' : 'translateX(100%)');
442
- leavingToolBarBg.beforeClearStyles([OPACITY, 'transform']);
443
- // leaving toolbar, back direction, and there's no entering toolbar
444
- // should just slide out, no fading out
445
- const translucentHeader = parentHeader?.translucent;
446
- if (!translucentHeader) {
447
- leavingToolBarBg.fromTo(OPACITY, 'var(--opacity)', 0);
448
- } else {
449
- leavingToolBarBg.fromTo('transform', 'translateX(0px)', isRTL ? 'translateX(-100%)' : 'translateX(100%)');
450
- }
451
-
452
- if (backButtonEl) {
453
- const leavingBackBtnText = createAnimation();
454
- leavingBackBtnText
455
- .addElement(shadow(backButtonEl).querySelector('.button-text')!) // REVIEW
456
- .fromTo('transform', `translateX(${CENTER})`, `translateX(${(isRTL ? -124 : 124) + 'px'})`);
457
- leavingToolBar.addAnimation(leavingBackBtnText);
458
- }
459
- } else {
460
- // leaving toolbar, forward direction
461
- if (!inactiveHeader) {
462
- leavingTitle
463
- .fromTo('transform', `translateX(${CENTER})`, `translateX(${OFF_LEFT})`)
464
- .fromTo(OPACITY, 0.99, 0)
465
- .afterClearStyles([TRANSFORM, OPACITY]);
466
- }
467
-
468
- leavingToolBarItems
469
- .fromTo('transform', `translateX(${CENTER})`, `translateX(${OFF_LEFT})`)
470
- .afterClearStyles([TRANSFORM, OPACITY]);
471
-
472
- leavingBackButton.afterClearStyles([OPACITY]);
473
- leavingTitle.afterClearStyles([OPACITY]);
474
- leavingToolBarButtons.afterClearStyles([OPACITY]);
475
- }
476
- });
477
- }
478
-
479
- connectNativeUIShellTransition(rootAnimation, enteringEl, leavingEl);
480
- return rootAnimation;
481
- } catch (err) {
482
- throw err;
483
- }
484
- };
24
+ export const iosTransitionAnimation: (navEl: HTMLElement, opts: TransitionOptions) => Animation =
25
+ createIosTransitionAnimation<TransitionOptions>(transitionConfig);
@@ -1 +0,0 @@
1
-
@@ -1 +0,0 @@
1
- {"version":3,"file":"ios.enter.d.ts","sourceRoot":"","sources":["../../../src/popover/animations/ios.enter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAMzC,eAAO,MAAM,iBAAiB,GAAI,QAAQ,WAAW,EAAE,OAAO,GAAG,KAAG,SAmPnE,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/popover/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAQtH,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,eAAe;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAOD,eAAO,MAAM,oBAAoB,GAAI,MAAM,WAAW,EAAE,WAAW,WAAW,EAAE,YAAY,WAAW;;;CActG,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,WAAW,WAAW,EACtB,eAAe,aAAa,EAC5B,WAAW,qBAAqB,EAChC,iBAAiB,qBAAqB,eAyEvC,CAAC;AAOF,eAAO,MAAM,2BAA2B,GAAI,WAAW,WAAW,EAAE,eAAe,aAAa,EAAE,WAAW,qBAAqB,eA4HjI,CAAC;AAKF,eAAO,MAAM,cAAc,GAAI,OAAO,kBAAkB,EAAE,EAAE,MAAM,WAAW,GAAG,IAAI,WAMnF,CAAC;AAOF,eAAO,MAAM,WAAW,GAAI,OAAO,kBAAkB,EAAE,EAAE,aAAa,WAAW,GAAG,IAAI,uBAGvF,CAAC;AAOF,eAAO,MAAM,WAAW,GAAI,OAAO,kBAAkB,EAAE,EAAE,aAAa,WAAW,GAAG,IAAI,uBAGvF,CAAC;AAiBF,eAAO,MAAM,kBAAkB,GAC7B,OAAO,OAAO,EACd,cAAc,MAAM,EACpB,eAAe,MAAM,EACrB,WAAW,iBAAiB,EAC5B,MAAM,YAAY,EAClB,OAAO,aAAa,EACpB,iBAAiB,eAAe,EAChC,YAAY,WAAW,EACvB,QAAQ,UAAU,GAAG,WAAW,KAC/B,eAqFF,CAAC;AA6LF,eAAO,MAAM,yBAAyB,GACpC,MAAM,YAAY,EAClB,UAAU,MAAM,EAChB,WAAW,MAAM,EACjB,aAAa,MAAM,EACnB,WAAW,MAAM,EACjB,YAAY,MAAM,EAClB,cAAc,MAAM,EACpB,eAAe,MAAM,EACrB,gBAAgB,MAAM,EACtB,gBAAgB,MAAM,EACtB,gBAAgB,MAAM,EACtB,qBAAqB,oBAAoB,EACzC,mBAAmB,OAAO,EAC1B,YAAW,OAAe,KACzB,aAmFF,CAAC"}