@rdlabo/ionic-theme-ios27 0.1.0 → 0.2.1

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 (140) hide show
  1. package/README.md +10 -2
  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/definitions.d.ts +19 -0
  16. package/dist/native/definitions.d.ts.map +1 -1
  17. package/dist/native/index.d.ts +4 -3
  18. package/dist/native/index.d.ts.map +1 -1
  19. package/dist/native/index.js +22 -9
  20. package/dist/native/lifecycle.d.ts +4 -0
  21. package/dist/native/lifecycle.d.ts.map +1 -0
  22. package/dist/native/lifecycle.js +34 -0
  23. package/dist/native/runtime.d.ts +2 -2
  24. package/dist/native/runtime.d.ts.map +1 -1
  25. package/dist/native/runtime.js +43 -4
  26. package/dist/tab-bar-searchable/animations/enter.d.ts +1 -1
  27. package/dist/tab-bar-searchable/animations/enter.d.ts.map +1 -1
  28. package/dist/tab-bar-searchable/animations/enter.js +1 -1
  29. package/dist/tab-bar-searchable/animations/leave.d.ts +1 -1
  30. package/dist/tab-bar-searchable/animations/leave.d.ts.map +1 -1
  31. package/dist/tab-bar-searchable/animations/leave.js +1 -1
  32. package/dist/tab-bar-searchable/index.d.ts +2 -2
  33. package/dist/tab-bar-searchable/index.d.ts.map +1 -1
  34. package/dist/tab-bar-searchable/index.js +2 -3
  35. package/dist/transition/ios.transition.d.ts +6 -1
  36. package/dist/transition/ios.transition.d.ts.map +1 -1
  37. package/dist/transition/ios.transition.js +10 -385
  38. package/docs/features.md +3 -1
  39. package/docs/native-ui-shell.md +113 -0
  40. package/ios/Sources/IonicNativeUIShellPlugin/IonicNativeUIShellPlugin.swift +28 -0
  41. package/node_modules/@rdlabo/ionic-theme-utils/LICENSE +21 -0
  42. package/node_modules/@rdlabo/ionic-theme-utils/README.md +28 -0
  43. package/node_modules/@rdlabo/ionic-theme-utils/dist/dom.d.ts +3 -0
  44. package/node_modules/@rdlabo/ionic-theme-utils/dist/dom.d.ts.map +1 -0
  45. package/node_modules/@rdlabo/ionic-theme-utils/dist/dom.js +13 -0
  46. package/node_modules/@rdlabo/ionic-theme-utils/dist/dom.js.map +1 -0
  47. package/node_modules/@rdlabo/ionic-theme-utils/dist/focus-controller.d.ts +6 -0
  48. package/node_modules/@rdlabo/ionic-theme-utils/dist/focus-controller.d.ts.map +1 -0
  49. package/node_modules/@rdlabo/ionic-theme-utils/dist/focus-controller.js +37 -0
  50. package/node_modules/@rdlabo/ionic-theme-utils/dist/focus-controller.js.map +1 -0
  51. package/node_modules/@rdlabo/ionic-theme-utils/dist/index.d.ts +13 -0
  52. package/node_modules/@rdlabo/ionic-theme-utils/dist/index.d.ts.map +1 -0
  53. package/node_modules/@rdlabo/ionic-theme-utils/dist/index.js +11 -0
  54. package/node_modules/@rdlabo/ionic-theme-utils/dist/index.js.map +1 -0
  55. package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/animations/ios.enter.d.ts +0 -1
  56. package/node_modules/@rdlabo/ionic-theme-utils/dist/popover/animations/ios.enter.d.ts.map +1 -0
  57. package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/animations/ios.enter.js +8 -5
  58. package/node_modules/@rdlabo/ionic-theme-utils/dist/popover/animations/ios.enter.js.map +1 -0
  59. package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/animations/ios.leave.d.ts.map +1 -1
  60. package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/animations/ios.leave.js +11 -5
  61. package/node_modules/@rdlabo/ionic-theme-utils/dist/popover/animations/ios.leave.js.map +1 -0
  62. package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/callout-surface.js +1 -0
  63. package/node_modules/@rdlabo/ionic-theme-utils/dist/popover/callout-surface.js.map +1 -0
  64. package/node_modules/@rdlabo/ionic-theme-utils/dist/popover/popover-interface.js +2 -0
  65. package/node_modules/@rdlabo/ionic-theme-utils/dist/popover/popover-interface.js.map +1 -0
  66. package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/utils.d.ts +1 -0
  67. package/node_modules/@rdlabo/ionic-theme-utils/dist/popover/utils.d.ts.map +1 -0
  68. package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/utils.js +3 -2
  69. package/node_modules/@rdlabo/ionic-theme-utils/dist/popover/utils.js.map +1 -0
  70. package/node_modules/@rdlabo/ionic-theme-utils/dist/sheets-of-glass.d.ts +16 -0
  71. package/node_modules/@rdlabo/ionic-theme-utils/dist/sheets-of-glass.d.ts.map +1 -0
  72. package/node_modules/@rdlabo/ionic-theme-utils/dist/sheets-of-glass.js +2 -0
  73. package/node_modules/@rdlabo/ionic-theme-utils/dist/sheets-of-glass.js.map +1 -0
  74. package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/tab-bar-searchable/interfaces.js +1 -0
  75. package/node_modules/@rdlabo/ionic-theme-utils/dist/tab-bar-searchable/interfaces.js.map +1 -0
  76. package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/tab-bar-searchable/utils.js +1 -0
  77. package/node_modules/@rdlabo/ionic-theme-utils/dist/tab-bar-searchable/utils.js.map +1 -0
  78. package/node_modules/@rdlabo/ionic-theme-utils/dist/theme.d.ts +15 -0
  79. package/node_modules/@rdlabo/ionic-theme-utils/dist/theme.d.ts.map +1 -0
  80. package/node_modules/@rdlabo/ionic-theme-utils/dist/theme.js +49 -0
  81. package/node_modules/@rdlabo/ionic-theme-utils/dist/theme.js.map +1 -0
  82. package/node_modules/@rdlabo/ionic-theme-utils/dist/transition/ios.transition.d.ts +18 -0
  83. package/node_modules/@rdlabo/ionic-theme-utils/dist/transition/ios.transition.d.ts.map +1 -0
  84. package/node_modules/@rdlabo/ionic-theme-utils/dist/transition/ios.transition.js +412 -0
  85. package/node_modules/@rdlabo/ionic-theme-utils/dist/transition/ios.transition.js.map +1 -0
  86. package/node_modules/@rdlabo/ionic-theme-utils/package.json +64 -0
  87. package/node_modules/@rdlabo/ionic-theme-utils/src/dom.spec.ts +19 -0
  88. package/node_modules/@rdlabo/ionic-theme-utils/src/dom.ts +16 -0
  89. package/node_modules/@rdlabo/ionic-theme-utils/src/focus-controller.ts +38 -0
  90. package/node_modules/@rdlabo/ionic-theme-utils/src/index.ts +59 -0
  91. package/{src → node_modules/@rdlabo/ionic-theme-utils/src}/popover/animations/ios.enter.ts +7 -5
  92. package/{src → node_modules/@rdlabo/ionic-theme-utils/src}/popover/animations/ios.leave.ts +14 -5
  93. package/node_modules/@rdlabo/ionic-theme-utils/src/popover/utils.spec.ts +58 -0
  94. package/{src → node_modules/@rdlabo/ionic-theme-utils/src}/popover/utils.ts +4 -2
  95. package/node_modules/@rdlabo/ionic-theme-utils/src/sheets-of-glass.ts +17 -0
  96. package/node_modules/@rdlabo/ionic-theme-utils/src/styles/index.scss +1 -0
  97. package/node_modules/@rdlabo/ionic-theme-utils/src/styles/md-ion-list-inset.scss +20 -0
  98. package/node_modules/@rdlabo/ionic-theme-utils/src/styles/structured-list.scss +310 -0
  99. package/node_modules/@rdlabo/ionic-theme-utils/src/tab-bar-searchable/utils.spec.ts +56 -0
  100. package/node_modules/@rdlabo/ionic-theme-utils/src/theme.ts +51 -0
  101. package/node_modules/@rdlabo/ionic-theme-utils/src/transition/ios.transition.spec.ts +52 -0
  102. package/node_modules/@rdlabo/ionic-theme-utils/src/transition/ios.transition.ts +542 -0
  103. package/package.json +13 -5
  104. package/src/index.ts +4 -2
  105. package/src/native/definitions.ts +34 -0
  106. package/src/native/index.ts +38 -11
  107. package/src/native/lifecycle.ts +38 -0
  108. package/src/native/runtime.ts +49 -4
  109. package/src/styles/components/ion-button.scss +21 -10
  110. package/src/styles/components/ion-fab.scss +10 -4
  111. package/src/styles/components/ion-list.scss +12 -3
  112. package/src/styles/components/ion-menu.scss +17 -10
  113. package/src/styles/components/ion-searchbar.scss +1 -1
  114. package/src/styles/components/ion-tabs.scss +14 -10
  115. package/src/styles/components/ion-toolbar.scss +9 -10
  116. package/src/styles/md-ion-list-inset.scss +2 -2
  117. package/src/styles/utils/dark/ion-list.scss +1 -1
  118. package/src/styles/utils/translucent.scss +44 -0
  119. package/src/tab-bar-searchable/animations/enter.ts +1 -2
  120. package/src/tab-bar-searchable/animations/leave.ts +1 -2
  121. package/src/tab-bar-searchable/index.ts +12 -4
  122. package/src/transition/ios.transition.ts +14 -473
  123. package/dist/css/utils/structured-list.css +0 -1
  124. package/dist/popover/animations/ios.enter.d.ts.map +0 -1
  125. package/dist/popover/popover-interface.js +0 -1
  126. package/dist/popover/utils.d.ts.map +0 -1
  127. package/src/styles/utils/structured-list.scss +0 -223
  128. /package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/animations/ios.leave.d.ts +0 -0
  129. /package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/callout-surface.d.ts +0 -0
  130. /package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/callout-surface.d.ts.map +0 -0
  131. /package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/popover-interface.d.ts +0 -0
  132. /package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/popover/popover-interface.d.ts.map +0 -0
  133. /package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/tab-bar-searchable/interfaces.d.ts +0 -0
  134. /package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/tab-bar-searchable/interfaces.d.ts.map +0 -0
  135. /package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/tab-bar-searchable/utils.d.ts +0 -0
  136. /package/{dist → node_modules/@rdlabo/ionic-theme-utils/dist}/tab-bar-searchable/utils.d.ts.map +0 -0
  137. /package/{src → node_modules/@rdlabo/ionic-theme-utils/src}/popover/callout-surface.ts +0 -0
  138. /package/{src → node_modules/@rdlabo/ionic-theme-utils/src}/popover/popover-interface.ts +0 -0
  139. /package/{src → node_modules/@rdlabo/ionic-theme-utils/src}/tab-bar-searchable/interfaces.ts +0 -0
  140. /package/{src → node_modules/@rdlabo/ionic-theme-utils/src}/tab-bar-searchable/utils.ts +0 -0
@@ -0,0 +1,412 @@
1
+ import { createAnimation } from '@ionic/core';
2
+ const DURATION = 540;
3
+ const getClonedElement = (tagName) => {
4
+ return document.querySelector(`${tagName}.ion-cloned-element`);
5
+ };
6
+ export const shadow = (el) => {
7
+ return el.shadowRoot || el;
8
+ };
9
+ const animateFixedBackButton = (root, navEl, page, entering, interactive, otherPage) => {
10
+ const button = page.querySelector(':scope > ion-header.header-translucent:not(.ios-theme-disabled, .ios26-disabled) ion-back-button:not(.ios-theme-disabled, .ios26-disabled)');
11
+ if (!button || button.offsetWidth === 0) {
12
+ return;
13
+ }
14
+ const otherButton = otherPage?.querySelector(':scope > ion-header.header-translucent:not(.ios-theme-disabled, .ios26-disabled) ion-back-button:not(.ios-theme-disabled, .ios26-disabled)');
15
+ const persistent = !!otherButton && otherButton.offsetWidth > 0;
16
+ const buttons = [button, ...(persistent ? [otherButton] : [])].map((element) => ({
17
+ element,
18
+ visibility: element.style.visibility,
19
+ }));
20
+ const rect = button.getBoundingClientRect();
21
+ const width = button.offsetWidth;
22
+ const height = button.offsetHeight;
23
+ const clone = getClonedElement('ion-back-button');
24
+ if (!clone) {
25
+ return;
26
+ }
27
+ const cloneParent = clone.parentNode;
28
+ const cloneNextSibling = clone.nextSibling;
29
+ const cloneStyle = clone.getAttribute('style');
30
+ clone.icon = button.icon;
31
+ clone.text = button.text;
32
+ clone.mode = button.mode;
33
+ clone.color = button.color;
34
+ clone.disabled = button.disabled;
35
+ const icon = shadow(clone).querySelector('ion-icon');
36
+ const animation = createAnimation().addElement(clone);
37
+ const fadeStart = !entering && interactive ? 0.8 : 0.4;
38
+ const fadeEnd = entering ? 0.96 : interactive ? 1 : 0.95;
39
+ if (persistent) {
40
+ animation.fromTo('transform', 'scale(1)', 'scale(1)').fromTo('opacity', 1, 1);
41
+ }
42
+ else if (entering) {
43
+ animation.keyframes([
44
+ { offset: 0, transform: 'scale(1.2)', opacity: 0 },
45
+ { offset: fadeStart, transform: 'scale(1.2)', opacity: 0 },
46
+ { offset: 0.65, transform: 'scale(1.12)', opacity: 0.15 },
47
+ { offset: 0.9, transform: 'scale(1.02)', opacity: 0.75 },
48
+ { offset: fadeEnd, transform: 'scale(1)', opacity: 1 },
49
+ { offset: 1, transform: 'scale(1)', opacity: 1 },
50
+ ]);
51
+ }
52
+ else {
53
+ animation.keyframes([
54
+ { offset: 0, transform: 'scale(1)', opacity: 1 },
55
+ { offset: fadeStart, transform: 'scale(1)', opacity: 1 },
56
+ { offset: fadeEnd, transform: 'scale(1.2)', opacity: 0 },
57
+ { offset: 1, transform: 'scale(1.2)', opacity: 0 },
58
+ ]);
59
+ }
60
+ if (icon && !persistent) {
61
+ const from = entering ? 'blur(4px)' : 'blur(0px)';
62
+ const to = entering ? 'blur(0px)' : 'blur(4px)';
63
+ animation.addAnimation(createAnimation()
64
+ .addElement(icon)
65
+ .keyframes([
66
+ { offset: 0, filter: from },
67
+ { offset: fadeStart, filter: from },
68
+ { offset: fadeEnd, filter: to },
69
+ { offset: 1, filter: to },
70
+ ]));
71
+ }
72
+ root.beforeAddWrite(() => {
73
+ Object.assign(clone.style, {
74
+ position: 'fixed',
75
+ left: `${rect.left + (rect.width - width) / 2}px`,
76
+ top: `${rect.top + (rect.height - height) / 2}px`,
77
+ width: `${width}px`,
78
+ height: `${height}px`,
79
+ margin: '0',
80
+ pointerEvents: 'none',
81
+ visibility: 'visible',
82
+ display: getComputedStyle(button).display,
83
+ zIndex: '1000',
84
+ });
85
+ navEl.appendChild(clone);
86
+ buttons.forEach(({ element }) => (element.style.visibility = 'hidden'));
87
+ });
88
+ root.afterAddWrite(() => {
89
+ buttons.forEach(({ element, visibility }) => (element.style.visibility = visibility));
90
+ cloneParent.insertBefore(clone, cloneNextSibling);
91
+ if (cloneStyle === null) {
92
+ clone.removeAttribute('style');
93
+ }
94
+ else {
95
+ clone.setAttribute('style', cloneStyle);
96
+ }
97
+ });
98
+ root.addAnimation(animation);
99
+ };
100
+ export const createIosTransitionAnimation = (config) => {
101
+ const { offLeftPercent, getIonPageElement, connectNativeUIShellTransition } = config;
102
+ return (navEl, opts) => {
103
+ try {
104
+ const EASING = 'cubic-bezier(0.32,0.72,0,1)';
105
+ const OPACITY = 'opacity';
106
+ const TRANSFORM = 'transform';
107
+ const CENTER = '0%';
108
+ const OFF_OPACITY = 0.8;
109
+ const isRTL = navEl.ownerDocument.dir === 'rtl';
110
+ const OFF_RIGHT = isRTL ? '-99.5%' : '99.5%';
111
+ const OFF_LEFT = isRTL ? `${offLeftPercent}%` : `-${offLeftPercent}%`;
112
+ const enteringEl = opts.enteringEl;
113
+ const leavingEl = opts.leavingEl;
114
+ const backDirection = opts.direction === 'back';
115
+ const contentEl = enteringEl.querySelector(':scope > ion-content');
116
+ const headerEls = enteringEl.querySelectorAll(':scope > ion-header > *:not(ion-toolbar), :scope > ion-footer > *');
117
+ const enteringToolBarEls = enteringEl.querySelectorAll(':scope > ion-header > ion-toolbar');
118
+ const rootAnimation = createAnimation();
119
+ const enteringContentAnimation = createAnimation();
120
+ rootAnimation
121
+ .addElement(enteringEl)
122
+ .duration((opts.duration ?? 0) || DURATION)
123
+ .easing(opts.easing || EASING)
124
+ .fill('both')
125
+ .beforeRemoveClass('ion-page-invisible');
126
+ const topPage = backDirection ? leavingEl : enteringEl;
127
+ const translucentTop = topPage?.querySelector(':scope > ion-header.header-translucent:not(.ios-theme-disabled, .ios26-disabled)');
128
+ if (topPage && translucentTop) {
129
+ const shade = navEl.ownerDocument.createElement('div');
130
+ shade.className = 'ios-transition-shade';
131
+ shade.setAttribute('aria-hidden', 'true');
132
+ const clipPath = topPage.style.clipPath;
133
+ const corner = config.radius ?? 0;
134
+ Object.assign(shade.style, {
135
+ position: 'absolute',
136
+ inset: '0',
137
+ zIndex: topPage.style.zIndex,
138
+ pointerEvents: 'none',
139
+ background: 'rgba(0, 0, 0, 0.1)',
140
+ });
141
+ rootAnimation.beforeAddWrite(() => {
142
+ topPage.before(shade);
143
+ if (corner > 0) {
144
+ topPage.style.clipPath = `inset(0 round ${corner}px)`;
145
+ }
146
+ });
147
+ rootAnimation.afterAddWrite(() => {
148
+ shade.remove();
149
+ topPage.style.clipPath = clipPath;
150
+ });
151
+ rootAnimation.addAnimation(createAnimation()
152
+ .addElement(shade)
153
+ .fromTo(OPACITY, backDirection ? 1 : 0, backDirection ? 0 : 1));
154
+ }
155
+ if (leavingEl && navEl !== null && navEl !== undefined) {
156
+ const navDecorAnimation = createAnimation();
157
+ navDecorAnimation.addElement(navEl);
158
+ rootAnimation.addAnimation(navDecorAnimation);
159
+ }
160
+ if (enteringEl.querySelector(':scope > ion-header.header-translucent:not(.ios-theme-disabled, .ios26-disabled)')) {
161
+ enteringContentAnimation.addElement(enteringEl);
162
+ }
163
+ else if (!contentEl && enteringToolBarEls.length === 0 && headerEls.length === 0) {
164
+ enteringContentAnimation.addElement(enteringEl.querySelector(':scope > .ion-page, :scope > ion-nav, :scope > ion-tabs'));
165
+ }
166
+ else {
167
+ enteringContentAnimation.addElement(contentEl);
168
+ enteringContentAnimation.addElement(headerEls);
169
+ }
170
+ rootAnimation.addAnimation(enteringContentAnimation);
171
+ if (backDirection) {
172
+ enteringContentAnimation
173
+ .beforeClearStyles([OPACITY])
174
+ .fromTo('transform', `translateX(${OFF_LEFT})`, `translateX(${CENTER})`)
175
+ .fromTo(OPACITY, translucentTop ? 1 : OFF_OPACITY, 1);
176
+ }
177
+ else {
178
+ enteringContentAnimation.beforeClearStyles([OPACITY]).fromTo('transform', `translateX(${OFF_RIGHT})`, `translateX(${CENTER})`);
179
+ }
180
+ if (contentEl && !enteringEl.querySelector(':scope > ion-header.header-translucent:not(.ios-theme-disabled, .ios26-disabled)')) {
181
+ const enteringTransitionEffectEl = shadow(contentEl).querySelector('.transition-effect');
182
+ if (enteringTransitionEffectEl) {
183
+ const enteringTransitionCoverEl = enteringTransitionEffectEl.querySelector('.transition-cover');
184
+ const enteringTransitionShadowEl = enteringTransitionEffectEl.querySelector('.transition-shadow');
185
+ const enteringTransitionEffect = createAnimation();
186
+ const enteringTransitionCover = createAnimation();
187
+ const enteringTransitionShadow = createAnimation();
188
+ enteringTransitionEffect
189
+ .addElement(enteringTransitionEffectEl)
190
+ .beforeStyles({ opacity: '1', display: 'block' })
191
+ .afterStyles({ opacity: '', display: '' });
192
+ enteringTransitionCover
193
+ .addElement(enteringTransitionCoverEl)
194
+ .beforeClearStyles([OPACITY])
195
+ .fromTo(OPACITY, 0, 0.1);
196
+ enteringTransitionShadow
197
+ .addElement(enteringTransitionShadowEl)
198
+ .beforeClearStyles([OPACITY])
199
+ .fromTo(OPACITY, 0.03, 0.7);
200
+ enteringTransitionEffect.addAnimation([enteringTransitionCover, enteringTransitionShadow]);
201
+ enteringContentAnimation.addAnimation([enteringTransitionEffect]);
202
+ }
203
+ }
204
+ if (topPage) {
205
+ animateFixedBackButton(rootAnimation, navEl, topPage, !backDirection, opts.progressCallback !== undefined, backDirection ? enteringEl : leavingEl);
206
+ }
207
+ const enteringContentHasLargeTitle = enteringEl.querySelector('ion-header.header-collapse-condense');
208
+ enteringToolBarEls.forEach((enteringToolBarEl) => {
209
+ if (enteringToolBarEl.closest('ion-header')?.matches('.header-translucent:not(.ios-theme-disabled, .ios26-disabled)')) {
210
+ return;
211
+ }
212
+ const enteringToolBar = createAnimation();
213
+ enteringToolBar.addElement(enteringToolBarEl);
214
+ rootAnimation.addAnimation(enteringToolBar);
215
+ const enteringTitle = createAnimation();
216
+ enteringTitle.addElement(enteringToolBarEl.querySelector('ion-title'));
217
+ const enteringToolBarButtons = createAnimation();
218
+ const buttons = Array.from(enteringToolBarEl.querySelectorAll('ion-buttons,[menuToggle]'));
219
+ const parentHeader = enteringToolBarEl.closest('ion-header');
220
+ const inactiveHeader = parentHeader?.classList.contains('header-collapse-condense-inactive');
221
+ let buttonsToAnimate;
222
+ if (backDirection) {
223
+ buttonsToAnimate = buttons.filter((button) => {
224
+ const isCollapseButton = button.classList.contains('buttons-collapse');
225
+ return (isCollapseButton && !inactiveHeader) || !isCollapseButton;
226
+ });
227
+ }
228
+ else {
229
+ buttonsToAnimate = buttons.filter((button) => !button.classList.contains('buttons-collapse'));
230
+ }
231
+ enteringToolBarButtons.addElement(buttonsToAnimate);
232
+ const enteringToolBarItems = createAnimation();
233
+ enteringToolBarItems.addElement(enteringToolBarEl.querySelectorAll(':scope > *:not(ion-title):not(ion-buttons):not([menuToggle])'));
234
+ const enteringToolBarBg = createAnimation();
235
+ enteringToolBarBg.addElement(shadow(enteringToolBarEl).querySelector('.toolbar-background'));
236
+ const enteringBackButton = createAnimation();
237
+ const backButtonEl = enteringToolBarEl.querySelector('ion-back-button');
238
+ if (backButtonEl) {
239
+ enteringBackButton.addElement(backButtonEl);
240
+ }
241
+ enteringToolBar.addAnimation([enteringTitle, enteringToolBarButtons, enteringToolBarItems, enteringToolBarBg, enteringBackButton]);
242
+ enteringToolBarButtons.fromTo(OPACITY, 0.01, 1);
243
+ enteringToolBarItems.fromTo(OPACITY, 0.01, 1);
244
+ if (backDirection) {
245
+ if (!inactiveHeader) {
246
+ enteringTitle.fromTo('transform', `translateX(${OFF_LEFT})`, `translateX(${CENTER})`).fromTo(OPACITY, 0.01, 1);
247
+ }
248
+ enteringToolBarItems.fromTo('transform', `translateX(${OFF_LEFT})`, `translateX(${CENTER})`);
249
+ enteringBackButton.fromTo(OPACITY, 0.01, 1);
250
+ }
251
+ else {
252
+ if (!enteringContentHasLargeTitle) {
253
+ enteringTitle.fromTo('transform', `translateX(${OFF_RIGHT})`, `translateX(${CENTER})`).fromTo(OPACITY, 0.01, 1);
254
+ }
255
+ enteringToolBarItems.fromTo('transform', `translateX(${OFF_RIGHT})`, `translateX(${CENTER})`);
256
+ enteringToolBarBg.beforeClearStyles([OPACITY, 'transform']);
257
+ const translucentHeader = parentHeader?.translucent;
258
+ if (!translucentHeader) {
259
+ enteringToolBarBg.fromTo(OPACITY, 0.01, 'var(--opacity)');
260
+ }
261
+ else {
262
+ enteringToolBarBg.fromTo('transform', isRTL ? 'translateX(-100%)' : 'translateX(100%)', 'translateX(0px)');
263
+ }
264
+ enteringBackButton.fromTo(OPACITY, 0.01, 1);
265
+ if (backButtonEl) {
266
+ const enteringBackBtnText = createAnimation();
267
+ enteringBackBtnText
268
+ .addElement(shadow(backButtonEl).querySelector('.button-text'))
269
+ .fromTo(`transform`, isRTL ? 'translateX(-100px)' : 'translateX(100px)', 'translateX(0px)');
270
+ enteringToolBar.addAnimation(enteringBackBtnText);
271
+ }
272
+ }
273
+ });
274
+ if (leavingEl) {
275
+ const leavingContent = createAnimation();
276
+ const leavingContentEl = leavingEl.querySelector(':scope > ion-content');
277
+ const leavingToolBarEls = leavingEl.querySelectorAll(':scope > ion-header > ion-toolbar');
278
+ const leavingHeaderEls = leavingEl.querySelectorAll(':scope > ion-header > *:not(ion-toolbar), :scope > ion-footer > *');
279
+ if (leavingEl.querySelector(':scope > ion-header.header-translucent:not(.ios-theme-disabled, .ios26-disabled)')) {
280
+ leavingContent.addElement(leavingEl);
281
+ }
282
+ else if (!leavingContentEl && leavingToolBarEls.length === 0 && leavingHeaderEls.length === 0) {
283
+ leavingContent.addElement(leavingEl.querySelector(':scope > .ion-page, :scope > ion-nav, :scope > ion-tabs'));
284
+ }
285
+ else {
286
+ leavingContent.addElement(leavingContentEl);
287
+ leavingContent.addElement(leavingHeaderEls);
288
+ }
289
+ rootAnimation.addAnimation(leavingContent);
290
+ if (backDirection) {
291
+ leavingContent
292
+ .beforeClearStyles([OPACITY])
293
+ .fromTo('transform', `translateX(${CENTER})`, isRTL ? 'translateX(-100%)' : 'translateX(100%)');
294
+ const leavingPage = getIonPageElement(leavingEl);
295
+ rootAnimation.afterAddWrite(() => {
296
+ if (rootAnimation.getDirection() === 'normal') {
297
+ leavingPage.style.setProperty('display', 'none');
298
+ }
299
+ });
300
+ }
301
+ else {
302
+ leavingContent
303
+ .fromTo('transform', `translateX(${CENTER})`, `translateX(${OFF_LEFT})`)
304
+ .fromTo(OPACITY, 1, translucentTop ? 1 : OFF_OPACITY);
305
+ }
306
+ if (leavingContentEl &&
307
+ !leavingEl.querySelector(':scope > ion-header.header-translucent:not(.ios-theme-disabled, .ios26-disabled)')) {
308
+ const leavingTransitionEffectEl = shadow(leavingContentEl).querySelector('.transition-effect');
309
+ if (leavingTransitionEffectEl) {
310
+ const leavingTransitionCoverEl = leavingTransitionEffectEl.querySelector('.transition-cover');
311
+ const leavingTransitionShadowEl = leavingTransitionEffectEl.querySelector('.transition-shadow');
312
+ const leavingTransitionEffect = createAnimation();
313
+ const leavingTransitionCover = createAnimation();
314
+ const leavingTransitionShadow = createAnimation();
315
+ leavingTransitionEffect
316
+ .addElement(leavingTransitionEffectEl)
317
+ .beforeStyles({ opacity: '1', display: 'block' })
318
+ .afterStyles({ opacity: '', display: '' });
319
+ leavingTransitionCover
320
+ .addElement(leavingTransitionCoverEl)
321
+ .beforeClearStyles([OPACITY])
322
+ .fromTo(OPACITY, 0.1, 0);
323
+ leavingTransitionShadow
324
+ .addElement(leavingTransitionShadowEl)
325
+ .beforeClearStyles([OPACITY])
326
+ .fromTo(OPACITY, 0.7, 0.03);
327
+ leavingTransitionEffect.addAnimation([leavingTransitionCover, leavingTransitionShadow]);
328
+ leavingContent.addAnimation([leavingTransitionEffect]);
329
+ }
330
+ }
331
+ leavingToolBarEls.forEach((leavingToolBarEl) => {
332
+ if (leavingToolBarEl.closest('ion-header')?.matches('.header-translucent:not(.ios-theme-disabled, .ios26-disabled)')) {
333
+ return;
334
+ }
335
+ const leavingToolBar = createAnimation();
336
+ leavingToolBar.addElement(leavingToolBarEl);
337
+ const leavingTitle = createAnimation();
338
+ leavingTitle.addElement(leavingToolBarEl.querySelector('ion-title'));
339
+ const leavingToolBarButtons = createAnimation();
340
+ const buttons = leavingToolBarEl.querySelectorAll('ion-buttons,[menuToggle]');
341
+ const parentHeader = leavingToolBarEl.closest('ion-header');
342
+ const inactiveHeader = parentHeader?.classList.contains('header-collapse-condense-inactive');
343
+ const buttonsToAnimate = Array.from(buttons).filter((button) => {
344
+ const isCollapseButton = button.classList.contains('buttons-collapse');
345
+ return (isCollapseButton && !inactiveHeader) || !isCollapseButton;
346
+ });
347
+ leavingToolBarButtons.addElement(buttonsToAnimate);
348
+ const leavingToolBarItems = createAnimation();
349
+ const leavingToolBarItemEls = leavingToolBarEl.querySelectorAll(':scope > *:not(ion-title):not(ion-buttons):not([menuToggle])');
350
+ if (leavingToolBarItemEls.length > 0) {
351
+ leavingToolBarItems.addElement(leavingToolBarItemEls);
352
+ }
353
+ const leavingToolBarBg = createAnimation();
354
+ leavingToolBarBg.addElement(shadow(leavingToolBarEl).querySelector('.toolbar-background'));
355
+ const leavingBackButton = createAnimation();
356
+ const backButtonEl = leavingToolBarEl.querySelector('ion-back-button');
357
+ if (backButtonEl) {
358
+ leavingBackButton.addElement(backButtonEl);
359
+ }
360
+ leavingToolBar.addAnimation([leavingTitle, leavingToolBarButtons, leavingToolBarItems, leavingBackButton, leavingToolBarBg]);
361
+ rootAnimation.addAnimation(leavingToolBar);
362
+ leavingBackButton.fromTo(OPACITY, 0.99, 0);
363
+ leavingToolBarButtons.fromTo(OPACITY, 0.99, 0);
364
+ leavingToolBarItems.fromTo(OPACITY, 0.99, 0);
365
+ if (backDirection) {
366
+ if (!inactiveHeader) {
367
+ leavingTitle
368
+ .fromTo('transform', `translateX(${CENTER})`, isRTL ? 'translateX(-100%)' : 'translateX(100%)')
369
+ .fromTo(OPACITY, 0.99, 0);
370
+ }
371
+ leavingToolBarItems.fromTo('transform', `translateX(${CENTER})`, isRTL ? 'translateX(-100%)' : 'translateX(100%)');
372
+ leavingToolBarBg.beforeClearStyles([OPACITY, 'transform']);
373
+ const translucentHeader = parentHeader?.translucent;
374
+ if (!translucentHeader) {
375
+ leavingToolBarBg.fromTo(OPACITY, 'var(--opacity)', 0);
376
+ }
377
+ else {
378
+ leavingToolBarBg.fromTo('transform', 'translateX(0px)', isRTL ? 'translateX(-100%)' : 'translateX(100%)');
379
+ }
380
+ if (backButtonEl) {
381
+ const leavingBackBtnText = createAnimation();
382
+ leavingBackBtnText
383
+ .addElement(shadow(backButtonEl).querySelector('.button-text'))
384
+ .fromTo('transform', `translateX(${CENTER})`, `translateX(${(isRTL ? -124 : 124) + 'px'})`);
385
+ leavingToolBar.addAnimation(leavingBackBtnText);
386
+ }
387
+ }
388
+ else {
389
+ if (!inactiveHeader) {
390
+ leavingTitle
391
+ .fromTo('transform', `translateX(${CENTER})`, `translateX(${OFF_LEFT})`)
392
+ .fromTo(OPACITY, 0.99, 0)
393
+ .afterClearStyles([TRANSFORM, OPACITY]);
394
+ }
395
+ leavingToolBarItems
396
+ .fromTo('transform', `translateX(${CENTER})`, `translateX(${OFF_LEFT})`)
397
+ .afterClearStyles([TRANSFORM, OPACITY]);
398
+ leavingBackButton.afterClearStyles([OPACITY]);
399
+ leavingTitle.afterClearStyles([OPACITY]);
400
+ leavingToolBarButtons.afterClearStyles([OPACITY]);
401
+ }
402
+ });
403
+ }
404
+ connectNativeUIShellTransition?.(rootAnimation, enteringEl, leavingEl);
405
+ return rootAnimation;
406
+ }
407
+ catch (err) {
408
+ throw err;
409
+ }
410
+ };
411
+ };
412
+ //# sourceMappingURL=ios.transition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ios.transition.js","sourceRoot":"","sources":["../../src/transition/ios.transition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@rdlabo/ionic-theme-utils",
3
+ "private": false,
4
+ "version": "0.1.0",
5
+ "description": "Shared utilities for Rdlabo Ionic themes",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ },
15
+ "./styles": "./src/styles/index.scss",
16
+ "./styles/md-ion-list-inset": "./src/styles/md-ion-list-inset.scss",
17
+ "./styles/*": "./src/styles/*.scss"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "src",
22
+ "package.json",
23
+ "README.md",
24
+ "LICENSE"
25
+ ],
26
+ "scripts": {
27
+ "build": "tsc",
28
+ "test": "vitest run",
29
+ "fmt:check": "prettier --check \"./**/*.{js,json,md,scss,ts,yml}\"",
30
+ "lint": "eslint .",
31
+ "fmt": "prettier --write \"./**/*.{js,json,md,scss,ts,yml}\"",
32
+ "prepublishOnly": "npm run build",
33
+ "prepare": "npm run build"
34
+ },
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+ssh://git@github.com/rdlabo-dev/ionic-theme-utils.git"
38
+ },
39
+ "keywords": [
40
+ "ionic",
41
+ "framework",
42
+ "theme",
43
+ "utilities"
44
+ ],
45
+ "author": "Masahiko Sakakibara <sakakibara@rdlabo.jp>",
46
+ "license": "MIT",
47
+ "bugs": {
48
+ "url": "https://github.com/rdlabo-dev/ionic-theme-utils/issues"
49
+ },
50
+ "homepage": "https://github.com/rdlabo-dev/ionic-theme-utils#readme",
51
+ "peerDependencies": {
52
+ "@ionic/core": ">=8.8.1 <10"
53
+ },
54
+ "devDependencies": {
55
+ "@eslint/js": "^9.39.5",
56
+ "@ionic/core": "^9.0.0",
57
+ "eslint": "^9.39.5",
58
+ "jsdom": "^26.1.0",
59
+ "prettier": "^3.6.2",
60
+ "typescript": "^5.9.3",
61
+ "typescript-eslint": "^8.70.0",
62
+ "vitest": "^4.1.11"
63
+ }
64
+ }
@@ -0,0 +1,19 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import { getElementRoot } from './dom';
4
+
5
+ describe('getElementRoot', () => {
6
+ it('returns the shadow root when one exists', () => {
7
+ const element = document.createElement('div');
8
+ const root = element.attachShadow({ mode: 'open' });
9
+
10
+ expect(getElementRoot(element)).toBe(root);
11
+ });
12
+
13
+ it('returns the supplied fallback without a shadow root', () => {
14
+ const element = document.createElement('div');
15
+ const fallback = document.createElement('main');
16
+
17
+ expect(getElementRoot(element, fallback)).toBe(fallback);
18
+ });
19
+ });
@@ -0,0 +1,16 @@
1
+ declare const __zone_symbol__requestAnimationFrame: any;
2
+ declare const requestAnimationFrame: any;
3
+
4
+ export const getElementRoot = (el: HTMLElement, fallback: HTMLElement = el) => {
5
+ return el.shadowRoot || fallback;
6
+ };
7
+
8
+ export const raf = (h: FrameRequestCallback) => {
9
+ if (typeof __zone_symbol__requestAnimationFrame === 'function') {
10
+ return __zone_symbol__requestAnimationFrame(h);
11
+ }
12
+ if (typeof requestAnimationFrame === 'function') {
13
+ return requestAnimationFrame(h);
14
+ }
15
+ return setTimeout(h);
16
+ };
@@ -0,0 +1,38 @@
1
+ import { config } from './theme';
2
+
3
+ const LAST_FOCUS = 'ion-last-focus';
4
+ const moveFocus = (element: HTMLElement) => {
5
+ element.tabIndex = -1;
6
+ element.focus();
7
+ };
8
+ const isVisible = (element: HTMLElement) => element.offsetParent !== null;
9
+
10
+ export interface FocusController {
11
+ saveViewFocus(referenceEl?: HTMLElement): void;
12
+ setViewFocus(referenceEl: HTMLElement): void;
13
+ }
14
+
15
+ export const createFocusController = (): FocusController => ({
16
+ saveViewFocus: (referenceEl) => {
17
+ if (!config.get('focusManagerPriority', false)) return;
18
+ const activeEl = document.activeElement;
19
+ if (activeEl && referenceEl?.contains(activeEl)) activeEl.setAttribute(LAST_FOCUS, 'true');
20
+ },
21
+ setViewFocus: (referenceEl) => {
22
+ const priorities = config.get<unknown>('focusManagerPriority', false);
23
+ if (!Array.isArray(priorities) || referenceEl.contains(document.activeElement)) return;
24
+ const lastFocus = referenceEl.querySelector<HTMLElement>(`[${LAST_FOCUS}]`);
25
+ if (lastFocus && isVisible(lastFocus)) return moveFocus(lastFocus);
26
+ const selectors: Record<string, string> = {
27
+ content: 'main, [role="main"]',
28
+ heading: 'h1, [role="heading"][aria-level="1"]',
29
+ banner: 'header, [role="banner"]',
30
+ };
31
+ for (const priority of priorities) {
32
+ const selector = selectors[String(priority)];
33
+ const candidate = selector ? referenceEl.querySelector<HTMLElement>(selector) : null;
34
+ if (candidate && isVisible(candidate)) return moveFocus(candidate);
35
+ }
36
+ moveFocus(referenceEl);
37
+ },
38
+ });
@@ -0,0 +1,59 @@
1
+ export {
2
+ createIosTransitionAnimation,
3
+ shadow,
4
+ type IosTransitionAnimationConfig,
5
+ type IosTransitionAnimationOptions,
6
+ } from './transition/ios.transition';
7
+
8
+ export type {
9
+ PopoverInterface,
10
+ PopoverOptions,
11
+ PopoverSize,
12
+ TriggerAction,
13
+ PositionReference,
14
+ PositionSide,
15
+ PositionAlign,
16
+ } from './popover/popover-interface';
17
+
18
+ export {
19
+ POPOVER_IOS_BODY_MARGIN,
20
+ getPopoverDimensions,
21
+ configureDismissInteraction,
22
+ configureTriggerInteraction,
23
+ getIndexOfItem,
24
+ getNextItem,
25
+ getPrevItem,
26
+ getPopoverPosition,
27
+ calculateWindowAdjustment,
28
+ type ReferenceCoordinates,
29
+ type PopoverStyles,
30
+ } from './popover/utils';
31
+
32
+ export { createCalloutSurface } from './popover/callout-surface';
33
+ export { iosEnterAnimation as iosPopoverEnterAnimation } from './popover/animations/ios.enter';
34
+ export { iosLeaveAnimation as iosPopoverLeaveAnimation } from './popover/animations/ios.leave';
35
+ export { cloneElement, getStep, changeSelectedElement, Config, config } from './theme';
36
+ export { getElementRoot, raf } from './dom';
37
+ export { createFocusController, type FocusController } from './focus-controller';
38
+ export type { EffectScales, registeredEffect, AnimationPosition } from './sheets-of-glass';
39
+
40
+ export {
41
+ TabBarSearchableType,
42
+ type TabBarSearchableFunction,
43
+ type SearchableEventCache,
44
+ type ElementSizes,
45
+ type ElementReferences,
46
+ } from './tab-bar-searchable/interfaces';
47
+
48
+ export {
49
+ ANIMATION_DURATION,
50
+ ANIMATION_DELAY_BASE,
51
+ ANIMATION_DELAY_CLOSE_BUTTONS,
52
+ ANIMATION_EASING,
53
+ OPACITY_TRANSITION,
54
+ throwErrorByFailedClickElement,
55
+ throwErrorByFailedExistElement,
56
+ getElement,
57
+ getElementReferences,
58
+ getElementSizes,
59
+ } from './tab-bar-searchable/utils';