@rdlabo/ionic-theme-ios27 1.2.0-3 → 1.2.0-4

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 (175) hide show
  1. package/README.md +15 -2
  2. package/dist/_virtual/_rolldown/runtime.js +13 -0
  3. package/dist/css/ionic-theme-ios27.css +1 -1
  4. package/dist/css/vertical-bars.css +1 -1
  5. package/dist/focus-controller/index.d.ts +4 -2
  6. package/dist/focus-controller/index.d.ts.map +1 -1
  7. package/dist/focus-controller/index.js +100 -57
  8. package/dist/focus-controller/index.js.map +1 -0
  9. package/dist/index.d.ts +10 -8
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +54 -60
  12. package/dist/index.js.map +1 -0
  13. package/dist/native/components/index.d.ts +13 -10
  14. package/dist/native/components/index.d.ts.map +1 -1
  15. package/dist/native/components/index.js +39 -41
  16. package/dist/native/components/index.js.map +1 -0
  17. package/dist/native/components/ion-back-button.d.ts +6 -1
  18. package/dist/native/components/ion-back-button.d.ts.map +1 -1
  19. package/dist/native/components/ion-back-button.js +19 -13
  20. package/dist/native/components/ion-back-button.js.map +1 -0
  21. package/dist/native/components/ion-button.d.ts +8 -2
  22. package/dist/native/components/ion-button.d.ts.map +1 -1
  23. package/dist/native/components/ion-button.js +22 -17
  24. package/dist/native/components/ion-button.js.map +1 -0
  25. package/dist/native/components/ion-buttons.d.ts +8 -2
  26. package/dist/native/components/ion-buttons.d.ts.map +1 -1
  27. package/dist/native/components/ion-buttons.js +29 -33
  28. package/dist/native/components/ion-buttons.js.map +1 -0
  29. package/dist/native/components/ion-fab.d.ts +6 -1
  30. package/dist/native/components/ion-fab.d.ts.map +1 -1
  31. package/dist/native/components/ion-fab.js +131 -151
  32. package/dist/native/components/ion-fab.js.map +1 -0
  33. package/dist/native/components/ion-menu-button.d.ts +8 -2
  34. package/dist/native/components/ion-menu-button.d.ts.map +1 -1
  35. package/dist/native/components/ion-menu-button.js +29 -19
  36. package/dist/native/components/ion-menu-button.js.map +1 -0
  37. package/dist/native/components/ion-segment.d.ts +6 -1
  38. package/dist/native/components/ion-segment.d.ts.map +1 -1
  39. package/dist/native/components/ion-segment.js +29 -23
  40. package/dist/native/components/ion-segment.js.map +1 -0
  41. package/dist/native/components/ion-tab-bar.d.ts +6 -1
  42. package/dist/native/components/ion-tab-bar.d.ts.map +1 -1
  43. package/dist/native/components/ion-tab-bar.js +49 -40
  44. package/dist/native/components/ion-tab-bar.js.map +1 -0
  45. package/dist/native/components/searchable-tabs.d.ts +17 -15
  46. package/dist/native/components/searchable-tabs.d.ts.map +1 -1
  47. package/dist/native/components/searchable-tabs.js +382 -434
  48. package/dist/native/components/searchable-tabs.js.map +1 -0
  49. package/dist/native/definitions.d.ts +118 -111
  50. package/dist/native/definitions.d.ts.map +1 -1
  51. package/dist/native/definitions.js +0 -1
  52. package/dist/native/foldable/fold-state.d.ts +5 -0
  53. package/dist/native/foldable/fold-state.d.ts.map +1 -0
  54. package/dist/native/foldable/fold-state.js +14 -0
  55. package/dist/native/foldable/fold-state.js.map +1 -0
  56. package/dist/native/foldable/types.d.ts +12 -0
  57. package/dist/native/foldable/types.d.ts.map +1 -0
  58. package/dist/native/foldable/types.js +0 -0
  59. package/dist/native/index.d.ts +6 -3
  60. package/dist/native/index.d.ts.map +1 -1
  61. package/dist/native/index.js +228 -204
  62. package/dist/native/index.js.map +1 -0
  63. package/dist/native/prehide.d.ts +4 -2
  64. package/dist/native/prehide.d.ts.map +1 -1
  65. package/dist/native/prehide.js +220 -242
  66. package/dist/native/prehide.js.map +1 -0
  67. package/dist/native/runtime.d.ts +3 -1
  68. package/dist/native/runtime.d.ts.map +1 -1
  69. package/dist/native/runtime.js +626 -730
  70. package/dist/native/runtime.js.map +1 -0
  71. package/dist/native/shared/candidate.d.ts +16 -11
  72. package/dist/native/shared/candidate.d.ts.map +1 -1
  73. package/dist/native/shared/candidate.js +96 -95
  74. package/dist/native/shared/candidate.js.map +1 -0
  75. package/dist/native/shared/crossfade.d.ts +6 -4
  76. package/dist/native/shared/crossfade.d.ts.map +1 -1
  77. package/dist/native/shared/crossfade.js +49 -45
  78. package/dist/native/shared/crossfade.js.map +1 -0
  79. package/dist/native/shared/dom.d.ts +7 -5
  80. package/dist/native/shared/dom.d.ts.map +1 -1
  81. package/dist/native/shared/dom.js +163 -211
  82. package/dist/native/shared/dom.js.map +1 -0
  83. package/dist/native/shared/events.d.ts +8 -6
  84. package/dist/native/shared/events.d.ts.map +1 -1
  85. package/dist/native/shared/events.js +12 -7
  86. package/dist/native/shared/events.js.map +1 -0
  87. package/dist/native/shared/icons.d.ts +4 -2
  88. package/dist/native/shared/icons.d.ts.map +1 -1
  89. package/dist/native/shared/icons.js +59 -53
  90. package/dist/native/shared/icons.js.map +1 -0
  91. package/dist/native/shared/modal.d.ts +3 -1
  92. package/dist/native/shared/modal.d.ts.map +1 -1
  93. package/dist/native/shared/modal.js +156 -139
  94. package/dist/native/shared/modal.js.map +1 -0
  95. package/dist/native/vertical-bars-web.d.ts +3 -1
  96. package/dist/native/vertical-bars-web.d.ts.map +1 -1
  97. package/dist/native/vertical-bars-web.js +332 -346
  98. package/dist/native/vertical-bars-web.js.map +1 -0
  99. package/dist/native-integration/index.d.ts +10 -8
  100. package/dist/native-integration/index.d.ts.map +1 -1
  101. package/dist/native-integration/index.js +102 -100
  102. package/dist/native-integration/index.js.map +1 -0
  103. package/dist/native-integration/transition.d.ts +3 -1
  104. package/dist/native-integration/transition.d.ts.map +1 -1
  105. package/dist/native-integration/transition.js +15 -6
  106. package/dist/native-integration/transition.js.map +1 -0
  107. package/dist/searchbar/index.d.ts +4 -2
  108. package/dist/searchbar/index.d.ts.map +1 -1
  109. package/dist/searchbar/index.js +64 -56
  110. package/dist/searchbar/index.js.map +1 -0
  111. package/dist/segment/index.d.ts +3 -1
  112. package/dist/segment/index.d.ts.map +1 -1
  113. package/dist/segment/index.js +465 -324
  114. package/dist/segment/index.js.map +1 -0
  115. package/dist/sheets-of-glass/animations.d.ts +13 -12
  116. package/dist/sheets-of-glass/animations.d.ts.map +1 -1
  117. package/dist/sheets-of-glass/animations.js +496 -306
  118. package/dist/sheets-of-glass/animations.js.map +1 -0
  119. package/dist/sheets-of-glass/index.d.ts +3 -1
  120. package/dist/sheets-of-glass/index.d.ts.map +1 -1
  121. package/dist/sheets-of-glass/index.js +294 -357
  122. package/dist/sheets-of-glass/index.js.map +1 -0
  123. package/dist/sheets-of-glass/interfaces.d.ts +11 -9
  124. package/dist/sheets-of-glass/interfaces.d.ts.map +1 -1
  125. package/dist/sheets-of-glass/interfaces.js +0 -1
  126. package/dist/tab-bar-searchable/animations/enter.d.ts +4 -2
  127. package/dist/tab-bar-searchable/animations/enter.d.ts.map +1 -1
  128. package/dist/tab-bar-searchable/animations/enter.js +50 -69
  129. package/dist/tab-bar-searchable/animations/enter.js.map +1 -0
  130. package/dist/tab-bar-searchable/animations/leave.d.ts +4 -2
  131. package/dist/tab-bar-searchable/animations/leave.d.ts.map +1 -1
  132. package/dist/tab-bar-searchable/animations/leave.js +48 -62
  133. package/dist/tab-bar-searchable/animations/leave.js.map +1 -0
  134. package/dist/tab-bar-searchable/index.d.ts +5 -3
  135. package/dist/tab-bar-searchable/index.d.ts.map +1 -1
  136. package/dist/tab-bar-searchable/index.js +123 -135
  137. package/dist/tab-bar-searchable/index.js.map +1 -0
  138. package/dist/transition/index.d.ts +9 -8
  139. package/dist/transition/index.d.ts.map +1 -1
  140. package/dist/transition/index.js +203 -192
  141. package/dist/transition/index.js.map +1 -0
  142. package/dist/transition/ios.transition.d.ts +7 -5
  143. package/dist/transition/ios.transition.d.ts.map +1 -1
  144. package/dist/transition/ios.transition.js +15 -11
  145. package/dist/transition/ios.transition.js.map +1 -0
  146. package/dist/utils.d.ts +10 -8
  147. package/dist/utils.d.ts.map +1 -1
  148. package/dist/utils.js +58 -66
  149. package/dist/utils.js.map +1 -0
  150. package/dist/vertical-bars.d.ts +5 -4
  151. package/dist/vertical-bars.js +4 -2
  152. package/docs/iphone-duo-with-original-theme.md +18 -29
  153. package/docs/iphone-duo.md +44 -204
  154. package/docs/native-ui-shell.md +10 -8
  155. package/docs/special-markup.md +2 -0
  156. package/docs/vertical-bars.md +283 -0
  157. package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift +34 -14
  158. package/ios/Sources/IonicNativeUIShellPlugin/Shared/ShellSnapshot.swift +2 -0
  159. package/ios/Tests/IonicNativeUIShellPluginTests/ShellSnapshotTests.swift +3 -0
  160. package/package.json +9 -6
  161. package/src/native/components/index.ts +3 -2
  162. package/src/native/components/ion-button.ts +3 -2
  163. package/src/native/components/ion-buttons.ts +4 -3
  164. package/src/native/components/ion-menu-button.ts +3 -2
  165. package/src/native/definitions.ts +22 -1
  166. package/src/native/foldable/fold-state.ts +9 -0
  167. package/src/native/foldable/types.ts +4 -0
  168. package/src/native/index.ts +17 -3
  169. package/src/native/prehide.ts +3 -1
  170. package/src/native/runtime.ts +2 -2
  171. package/src/native/shared/candidate.ts +39 -10
  172. package/src/native/shared/dom.ts +4 -4
  173. package/src/styles/vertical-bars.scss +4 -2
  174. package/src/vertical-bars.ts +9 -1
  175. package/dist/vertical-bars.d.ts.map +0 -1
@@ -1,248 +1,226 @@
1
- import { modalUsesVerticalBars } from './shared/modal';
2
- import { LIFECYCLE_DID_ENTER, LIFECYCLE_DID_LEAVE, LIFECYCLE_WILL_ENTER, LIFECYCLE_WILL_LEAVE } from '@ionic/core';
3
- import { VERTICAL_BARS_TRANSITION_CANCELED } from '../native-integration';
4
- import { childElements, clearVerticalBarsPlacement, createVerticalBarsPageState, verticalBarsActionCandidate, verticalBarsBackCandidate, verticalBarsBackWebClass, verticalBarsOwned, isVerticalBarsToolbarActionShape, isPermanentlyExcluded, isShellDisabled, prehiddenClass, prehideRootClass, rejectedClass, setVerticalBarsPlacement, } from './shared/dom';
5
- const overlays = 'ion-menu, ion-popover';
6
- const sourceSelector = 'ion-back-button, ion-menu-button, ion-buttons, ion-button';
1
+ import { VERTICAL_BARS_TRANSITION_CANCELED } from "../native-integration/index.js";
2
+ import { modalUsesVerticalBars } from "./shared/modal.js";
3
+ import { childElements, clearVerticalBarsPlacement, createVerticalBarsPageState, isPermanentlyExcluded, isShellDisabled, isVerticalBarsToolbarActionShape, prehiddenClass, prehideRootClass, setVerticalBarsPlacement, verticalBarsActionCandidate, verticalBarsBackCandidate, verticalBarsBackWebClass, verticalBarsOwned } from "./shared/dom.js";
4
+ import { LIFECYCLE_DID_ENTER, LIFECYCLE_DID_LEAVE, LIFECYCLE_WILL_ENTER, LIFECYCLE_WILL_LEAVE } from "@ionic/core";
5
+ //#region src/native/prehide.ts
6
+ const overlays = "ion-menu, ion-popover";
7
+ const sourceSelector = "ion-back-button, ion-menu-button, ion-buttons, ion-button";
7
8
  const isHtmlElement = (node) => !!node && node.nodeType === 1;
8
- const asElement = (node) => (isHtmlElement(node) ? node : undefined);
9
+ const asElement = (node) => isHtmlElement(node) ? node : void 0;
9
10
  const backSupported = (element) => {
10
- const back = element;
11
- return back.icon === undefined && back.color === undefined && !!back.shadowRoot;
11
+ const back = element;
12
+ return back.icon === void 0 && back.color === void 0 && !!back.shadowRoot;
12
13
  };
13
14
  const eligibleBack = verticalBarsBackCandidate;
14
15
  const eligible = verticalBarsActionCandidate;
15
- export const prehideVerticalBarsToolbarSources = (doc) => {
16
- doc.documentElement.classList.add(prehideRootClass);
17
- const scopes = new Map();
18
- const owner = new WeakMap();
19
- const pendingBacks = new Map();
20
- const verticalBarsPages = createVerticalBarsPageState();
21
- const listeners = new AbortController();
22
- const root = () => doc.querySelector('ion-app.ios-theme-vertical-bars');
23
- let suspended = 0;
24
- let stopped = false;
25
- const routedPage = (element) => element.closest('.ion-page:not(ion-app, body)');
26
- const release = (scope) => {
27
- for (const [element, pending] of pendingBacks) {
28
- if (pending.scope !== scope)
29
- continue;
30
- clearTimeout(pending.timer);
31
- pendingBacks.delete(element);
32
- }
33
- const owned = scopes.get(scope);
34
- if (!owned)
35
- return;
36
- owned.forEach((element) => {
37
- if (owner.get(element) !== scope)
38
- return;
39
- owner.delete(element);
40
- element.classList.remove(prehiddenClass);
41
- element.classList.remove(verticalBarsBackWebClass);
42
- clearVerticalBarsPlacement(element);
43
- });
44
- scopes.delete(scope);
45
- };
46
- const capture = (scope) => {
47
- if (!root()?.contains(scope) || scope.closest(overlays) || !modalUsesVerticalBars(scope) || verticalBarsPages.isDeparted(scope))
48
- return;
49
- const owned = scopes.get(scope) ?? new Set();
50
- const place = (element, rail) => {
51
- if (owned.has(element))
52
- return;
53
- const previousScope = owner.get(element);
54
- if (previousScope)
55
- scopes.get(previousScope)?.delete(element);
56
- owner.set(element, scope);
57
- setVerticalBarsPlacement(element, rail);
58
- if (element.matches('ion-back-button'))
59
- element.classList.toggle(verticalBarsBackWebClass, !rail);
60
- owned.add(element);
61
- };
62
- const sources = scope.matches('ion-back-button') ? [scope] : Array.from(scope.querySelectorAll(sourceSelector));
63
- sources.forEach((element) => {
64
- if (!modalUsesVerticalBars(element) || element.closest(overlays) || (scope.matches('.ion-page') && routedPage(element) !== scope))
65
- return;
66
- if (element.matches('ion-buttons')) {
67
- const children = childElements(element);
68
- const actions = children.filter((child) => eligible(child) && isVerticalBarsToolbarActionShape(child));
69
- const group = eligible(element) &&
70
- actions.length === children.length &&
71
- (actions.length > 1 || (actions.length === 1 && actions[0].matches('ion-menu-button')));
72
- const freshGroup = !owned.has(element);
73
- place(element, group);
74
- children.forEach((child) => {
75
- if (!child.matches('ion-back-button'))
76
- place(child, freshGroup && actions.includes(child));
77
- });
78
- }
79
- else if (element.matches('ion-back-button') || !element.parentElement?.matches('ion-buttons')) {
80
- if (owned.has(element))
81
- return;
82
- if (element.matches('ion-back-button') &&
83
- eligibleBack(element) &&
84
- element.icon === undefined &&
85
- element.color === undefined &&
86
- !element.shadowRoot &&
87
- !element.classList.contains('hydrated')) {
88
- const previousPending = pendingBacks.get(element);
89
- if (previousPending && previousPending.scope !== scope) {
90
- clearTimeout(previousPending.timer);
91
- pendingBacks.delete(element);
92
- }
93
- if (!pendingBacks.has(element)) {
94
- const timer = setTimeout(() => {
95
- if (pendingBacks.get(element)?.scope !== scope)
96
- return;
97
- pendingBacks.delete(element);
98
- place(element, false);
99
- reconcile();
100
- }, 1500);
101
- pendingBacks.set(element, { scope, timer });
102
- }
103
- return;
104
- }
105
- const pending = pendingBacks.get(element);
106
- if (pending) {
107
- clearTimeout(pending.timer);
108
- pendingBacks.delete(element);
109
- }
110
- place(element, element.matches('ion-back-button')
111
- ? eligibleBack(element) && backSupported(element)
112
- : eligible(element) && isVerticalBarsToolbarActionShape(element));
113
- }
114
- });
115
- scopes.set(scope, owned);
116
- };
117
- const reconcile = () => {
118
- const verticalBars = root();
119
- if (!verticalBars) {
120
- Array.from(scopes.keys()).forEach(release);
121
- return;
122
- }
123
- for (const scope of scopes.keys())
124
- if (!scope.isConnected || !modalUsesVerticalBars(scope))
125
- release(scope);
126
- for (const [element, pending] of pendingBacks)
127
- if (element.shadowRoot || element.classList.contains('hydrated'))
128
- capture(pending.scope);
129
- verticalBars.querySelectorAll('.ion-page:not(ion-app, body, .ion-page-hidden)').forEach(capture);
130
- verticalBars.querySelectorAll(sourceSelector).forEach((element) => {
131
- if (routedPage(element) || element.closest(overlays))
132
- return;
133
- const scope = element.closest('ion-toolbar') ?? (element.matches('ion-back-button') ? element : null);
134
- if (scope)
135
- capture(scope);
136
- });
137
- for (const owned of scopes.values()) {
138
- for (const element of owned) {
139
- const groupOwnsChildren = element.parentElement?.matches('ion-buttons') &&
140
- verticalBarsOwned(element.parentElement) &&
141
- childElements(element.parentElement).every((child) => verticalBarsOwned(child));
142
- const hide = !suspended &&
143
- verticalBarsOwned(element) &&
144
- !groupOwnsChildren &&
145
- element.isConnected &&
146
- !element.closest(`.${rejectedClass}`) &&
147
- !isPermanentlyExcluded(element) &&
148
- !isShellDisabled(element) &&
149
- (!element.matches('ion-back-button') || backSupported(element) || !element.classList.contains('hydrated')) &&
150
- (!element.matches('ion-buttons') || childElements(element).every((child) => verticalBarsOwned(child)));
151
- element.classList.toggle(prehiddenClass, hide);
152
- if (element.matches('ion-back-button'))
153
- element.classList.toggle(verticalBarsBackWebClass, !hide);
154
- }
155
- }
156
- };
157
- const onWillEnter = (event) => {
158
- const page = asElement(event.target);
159
- if (page?.matches('.ion-page')) {
160
- verticalBarsPages.lifecycle(event);
161
- release(page);
162
- capture(page);
163
- reconcile();
164
- }
165
- };
166
- const onPageLifecycle = (event) => {
167
- verticalBarsPages.lifecycle(event);
168
- if (event.type !== LIFECYCLE_DID_LEAVE)
169
- return;
170
- const page = asElement(event.target);
171
- if (page)
172
- release(page);
173
- };
174
- const onTransitionCanceled = (event) => {
175
- const leaving = asElement(event.target);
176
- if (!leaving)
177
- return;
178
- const entering = event.detail?.entering;
179
- verticalBarsPages.cancel(entering, leaving);
180
- reconcile();
181
- };
182
- doc.addEventListener(LIFECYCLE_WILL_ENTER, onWillEnter, { capture: true, signal: listeners.signal });
183
- for (const name of [LIFECYCLE_WILL_LEAVE, LIFECYCLE_DID_ENTER, LIFECYCLE_DID_LEAVE])
184
- doc.addEventListener(name, onPageLifecycle, { capture: true, signal: listeners.signal });
185
- doc.addEventListener(VERTICAL_BARS_TRANSITION_CANCELED, onTransitionCanceled, { capture: true, signal: listeners.signal });
186
- doc.defaultView?.addEventListener('nativeUIShellRefresh', reconcile, { signal: listeners.signal });
187
- reconcile();
188
- const mutationRelevant = (record) => {
189
- if (record.type === 'childList')
190
- return [...Array.from(record.addedNodes), ...Array.from(record.removedNodes)].some((node) => isHtmlElement(node) &&
191
- (node.matches(`${sourceSelector}, .ion-page, ion-toolbar`) || !!node.querySelector(`${sourceSelector}, .ion-page, ion-toolbar`)));
192
- if (record.attributeName !== 'class')
193
- return true;
194
- const current = record.target.className;
195
- const previous = record.oldValue ?? '';
196
- const withoutOwned = (value) => value
197
- .split(/\s+/)
198
- .filter((name) => name && ![prehiddenClass, prehideRootClass, verticalBarsBackWebClass].includes(name))
199
- .join(' ');
200
- return typeof current !== 'string' || withoutOwned(previous) !== withoutOwned(current);
201
- };
202
- let scheduled = false;
203
- const observer = new (doc.defaultView?.MutationObserver ?? MutationObserver)((records) => {
204
- if (scheduled || stopped || !records.some(mutationRelevant))
205
- return;
206
- scheduled = true;
207
- queueMicrotask(() => {
208
- scheduled = false;
209
- if (!stopped)
210
- reconcile();
211
- });
212
- });
213
- observer.observe(doc.documentElement, {
214
- subtree: true,
215
- childList: true,
216
- attributes: true,
217
- attributeOldValue: true,
218
- attributeFilter: ['class', 'hidden', 'inert', 'icon', 'color'],
219
- });
220
- return {
221
- suspend: () => {
222
- if (stopped)
223
- return () => { };
224
- suspended++;
225
- doc.documentElement.classList.remove(prehideRootClass);
226
- reconcile();
227
- let resumed = false;
228
- return () => {
229
- if (resumed || stopped)
230
- return;
231
- resumed = true;
232
- if (--suspended === 0) {
233
- doc.documentElement.classList.add(prehideRootClass);
234
- reconcile();
235
- }
236
- };
237
- },
238
- stop: () => {
239
- if (stopped)
240
- return;
241
- stopped = true;
242
- observer.disconnect();
243
- listeners.abort();
244
- doc.documentElement.classList.remove(prehideRootClass);
245
- Array.from(scopes.keys()).forEach(release);
246
- },
247
- };
16
+ /** Capture toolbar placement once per routed-page epoch, before Ionic paints its transition. */
17
+ const prehideVerticalBarsToolbarSources = (doc) => {
18
+ doc.documentElement.classList.add(prehideRootClass);
19
+ const scopes = /* @__PURE__ */ new Map();
20
+ const owner = /* @__PURE__ */ new WeakMap();
21
+ const pendingBacks = /* @__PURE__ */ new Map();
22
+ const verticalBarsPages = createVerticalBarsPageState();
23
+ const listeners = new AbortController();
24
+ const root = () => doc.querySelector("ion-app.ios-theme-vertical-bars");
25
+ let suspended = 0;
26
+ let stopped = false;
27
+ const routedPage = (element) => element.closest(".ion-page:not(ion-app, body)");
28
+ const release = (scope) => {
29
+ for (const [element, pending] of pendingBacks) {
30
+ if (pending.scope !== scope) continue;
31
+ clearTimeout(pending.timer);
32
+ pendingBacks.delete(element);
33
+ }
34
+ const owned = scopes.get(scope);
35
+ if (!owned) return;
36
+ owned.forEach((element) => {
37
+ if (owner.get(element) !== scope) return;
38
+ owner.delete(element);
39
+ element.classList.remove(prehiddenClass);
40
+ element.classList.remove(verticalBarsBackWebClass);
41
+ clearVerticalBarsPlacement(element);
42
+ });
43
+ scopes.delete(scope);
44
+ };
45
+ const capture = (scope) => {
46
+ if (!root()?.contains(scope) || scope.closest(overlays) || !modalUsesVerticalBars(scope) || verticalBarsPages.isDeparted(scope)) return;
47
+ const owned = scopes.get(scope) ?? /* @__PURE__ */ new Set();
48
+ const place = (element, rail) => {
49
+ if (owned.has(element)) return;
50
+ const previousScope = owner.get(element);
51
+ if (previousScope) scopes.get(previousScope)?.delete(element);
52
+ owner.set(element, scope);
53
+ setVerticalBarsPlacement(element, rail);
54
+ if (element.matches("ion-back-button")) element.classList.toggle(verticalBarsBackWebClass, !rail);
55
+ owned.add(element);
56
+ };
57
+ (scope.matches("ion-back-button") ? [scope] : Array.from(scope.querySelectorAll(sourceSelector))).forEach((element) => {
58
+ if (isShellDisabled(element)) return;
59
+ if (!modalUsesVerticalBars(element) || element.closest(overlays) || scope.matches(".ion-page") && routedPage(element) !== scope) return;
60
+ if (element.matches("ion-buttons")) {
61
+ const children = childElements(element);
62
+ const actions = children.filter((child) => eligible(child) && isVerticalBarsToolbarActionShape(child));
63
+ const group = eligible(element) && actions.length === children.length && (actions.length > 1 || actions.length === 1 && actions[0].matches("ion-menu-button"));
64
+ const freshGroup = !owned.has(element);
65
+ place(element, group);
66
+ children.forEach((child) => {
67
+ if (!child.matches("ion-back-button")) place(child, freshGroup && actions.includes(child));
68
+ });
69
+ } else if (element.matches("ion-back-button") || !element.parentElement?.matches("ion-buttons")) {
70
+ if (owned.has(element)) return;
71
+ if (element.matches("ion-back-button") && eligibleBack(element) && element.icon === void 0 && element.color === void 0 && !element.shadowRoot && !element.classList.contains("hydrated")) {
72
+ const previousPending = pendingBacks.get(element);
73
+ if (previousPending && previousPending.scope !== scope) {
74
+ clearTimeout(previousPending.timer);
75
+ pendingBacks.delete(element);
76
+ }
77
+ if (!pendingBacks.has(element)) {
78
+ const timer = setTimeout(() => {
79
+ if (pendingBacks.get(element)?.scope !== scope) return;
80
+ pendingBacks.delete(element);
81
+ place(element, false);
82
+ reconcile();
83
+ }, 1500);
84
+ pendingBacks.set(element, {
85
+ scope,
86
+ timer
87
+ });
88
+ }
89
+ return;
90
+ }
91
+ const pending = pendingBacks.get(element);
92
+ if (pending) {
93
+ clearTimeout(pending.timer);
94
+ pendingBacks.delete(element);
95
+ }
96
+ place(element, element.matches("ion-back-button") ? eligibleBack(element) && backSupported(element) : eligible(element) && isVerticalBarsToolbarActionShape(element));
97
+ }
98
+ });
99
+ scopes.set(scope, owned);
100
+ };
101
+ const reconcile = () => {
102
+ const verticalBars = root();
103
+ if (!verticalBars) {
104
+ Array.from(scopes.keys()).forEach(release);
105
+ return;
106
+ }
107
+ for (const scope of scopes.keys()) if (!scope.isConnected || !modalUsesVerticalBars(scope)) release(scope);
108
+ for (const [element, pending] of pendingBacks) if (element.shadowRoot || element.classList.contains("hydrated")) capture(pending.scope);
109
+ verticalBars.querySelectorAll(".ion-page:not(ion-app, body, .ion-page-hidden)").forEach(capture);
110
+ verticalBars.querySelectorAll(sourceSelector).forEach((element) => {
111
+ if (routedPage(element) || element.closest(overlays)) return;
112
+ const scope = element.closest("ion-toolbar") ?? (element.matches("ion-back-button") ? element : null);
113
+ if (scope) capture(scope);
114
+ });
115
+ for (const owned of scopes.values()) for (const element of owned) {
116
+ const groupOwnsChildren = element.parentElement?.matches("ion-buttons") && verticalBarsOwned(element.parentElement) && childElements(element.parentElement).every((child) => verticalBarsOwned(child));
117
+ const hide = !suspended && verticalBarsOwned(element) && !groupOwnsChildren && element.isConnected && !element.closest(`.ios-theme-native-ui-shell-rejected`) && !isPermanentlyExcluded(element) && !isShellDisabled(element) && (!element.matches("ion-back-button") || backSupported(element) || !element.classList.contains("hydrated")) && (!element.matches("ion-buttons") || childElements(element).every((child) => verticalBarsOwned(child)));
118
+ element.classList.toggle(prehiddenClass, hide);
119
+ if (element.matches("ion-back-button")) element.classList.toggle(verticalBarsBackWebClass, !hide);
120
+ }
121
+ };
122
+ const onWillEnter = (event) => {
123
+ const page = asElement(event.target);
124
+ if (page?.matches(".ion-page")) {
125
+ verticalBarsPages.lifecycle(event);
126
+ release(page);
127
+ capture(page);
128
+ reconcile();
129
+ }
130
+ };
131
+ const onPageLifecycle = (event) => {
132
+ verticalBarsPages.lifecycle(event);
133
+ if (event.type !== LIFECYCLE_DID_LEAVE) return;
134
+ const page = asElement(event.target);
135
+ if (page) release(page);
136
+ };
137
+ const onTransitionCanceled = (event) => {
138
+ const leaving = asElement(event.target);
139
+ if (!leaving) return;
140
+ const entering = event.detail?.entering;
141
+ verticalBarsPages.cancel(entering, leaving);
142
+ reconcile();
143
+ };
144
+ doc.addEventListener(LIFECYCLE_WILL_ENTER, onWillEnter, {
145
+ capture: true,
146
+ signal: listeners.signal
147
+ });
148
+ for (const name of [
149
+ LIFECYCLE_WILL_LEAVE,
150
+ LIFECYCLE_DID_ENTER,
151
+ LIFECYCLE_DID_LEAVE
152
+ ]) doc.addEventListener(name, onPageLifecycle, {
153
+ capture: true,
154
+ signal: listeners.signal
155
+ });
156
+ doc.addEventListener(VERTICAL_BARS_TRANSITION_CANCELED, onTransitionCanceled, {
157
+ capture: true,
158
+ signal: listeners.signal
159
+ });
160
+ doc.defaultView?.addEventListener("nativeUIShellRefresh", reconcile, { signal: listeners.signal });
161
+ reconcile();
162
+ const mutationRelevant = (record) => {
163
+ if (record.type === "childList") return [...Array.from(record.addedNodes), ...Array.from(record.removedNodes)].some((node) => isHtmlElement(node) && (node.matches(`${sourceSelector}, .ion-page, ion-toolbar`) || !!node.querySelector(`${sourceSelector}, .ion-page, ion-toolbar`)));
164
+ if (record.attributeName !== "class") return true;
165
+ const current = record.target.className;
166
+ const previous = record.oldValue ?? "";
167
+ const withoutOwned = (value) => value.split(/\s+/).filter((name) => name && ![
168
+ "ios-theme-native-ui-shell-prehidden",
169
+ "ios-theme-native-ui-shell-prehide",
170
+ "ios-theme-vertical-bars-back-web-owned"
171
+ ].includes(name)).join(" ");
172
+ return typeof current !== "string" || withoutOwned(previous) !== withoutOwned(current);
173
+ };
174
+ let scheduled = false;
175
+ const observer = new ((doc.defaultView?.MutationObserver) ?? MutationObserver)((records) => {
176
+ if (scheduled || stopped || !records.some(mutationRelevant)) return;
177
+ scheduled = true;
178
+ queueMicrotask(() => {
179
+ scheduled = false;
180
+ if (!stopped) reconcile();
181
+ });
182
+ });
183
+ observer.observe(doc.documentElement, {
184
+ subtree: true,
185
+ childList: true,
186
+ attributes: true,
187
+ attributeOldValue: true,
188
+ attributeFilter: [
189
+ "class",
190
+ "data-shell",
191
+ "hidden",
192
+ "inert",
193
+ "icon",
194
+ "color"
195
+ ]
196
+ });
197
+ return {
198
+ suspend: () => {
199
+ if (stopped) return () => {};
200
+ suspended++;
201
+ doc.documentElement.classList.remove(prehideRootClass);
202
+ reconcile();
203
+ let resumed = false;
204
+ return () => {
205
+ if (resumed || stopped) return;
206
+ resumed = true;
207
+ if (--suspended === 0) {
208
+ doc.documentElement.classList.add(prehideRootClass);
209
+ reconcile();
210
+ }
211
+ };
212
+ },
213
+ stop: () => {
214
+ if (stopped) return;
215
+ stopped = true;
216
+ observer.disconnect();
217
+ listeners.abort();
218
+ doc.documentElement.classList.remove(prehideRootClass);
219
+ Array.from(scopes.keys()).forEach(release);
220
+ }
221
+ };
248
222
  };
223
+ //#endregion
224
+ export { prehideVerticalBarsToolbarSources };
225
+
226
+ //# sourceMappingURL=prehide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prehide.js","names":[],"sources":["../../src/native/prehide.ts"],"sourcesContent":["import { modalUsesVerticalBars } from './shared/modal';\nimport { LIFECYCLE_DID_ENTER, LIFECYCLE_DID_LEAVE, LIFECYCLE_WILL_ENTER, LIFECYCLE_WILL_LEAVE } from '@ionic/core';\nimport { VERTICAL_BARS_TRANSITION_CANCELED } from '../native-integration';\nimport {\n childElements,\n clearVerticalBarsPlacement,\n createVerticalBarsPageState,\n verticalBarsActionCandidate,\n verticalBarsBackCandidate,\n verticalBarsBackWebClass,\n verticalBarsOwned,\n isVerticalBarsToolbarActionShape,\n isPermanentlyExcluded,\n isShellDisabled,\n prehiddenClass,\n prehideRootClass,\n rejectedClass,\n setVerticalBarsPlacement,\n} from './shared/dom';\n\nconst overlays = 'ion-menu, ion-popover';\nconst sourceSelector = 'ion-back-button, ion-menu-button, ion-buttons, ion-button';\n// Realm- and teardown-safe: globals such as Element/HTMLElement may be gone\n// when a queued mutation microtask or a stale listener still runs.\nconst isHtmlElement = (node: unknown): node is HTMLElement => !!node && (node as Node).nodeType === 1;\nconst asElement = (node: Node | EventTarget | null): HTMLElement | undefined => (isHtmlElement(node) ? node : undefined);\nconst backSupported = (element: HTMLElement): boolean => {\n const back = element as HTMLIonBackButtonElement;\n return back.icon === undefined && back.color === undefined && !!back.shadowRoot;\n};\nconst eligibleBack = verticalBarsBackCandidate;\nconst eligible = verticalBarsActionCandidate;\n\n/** Capture toolbar placement once per routed-page epoch, before Ionic paints its transition. */\nexport const prehideVerticalBarsToolbarSources = (doc: Document): { suspend: () => () => void; stop: () => void } => {\n doc.documentElement.classList.add(prehideRootClass);\n const scopes = new Map<HTMLElement, Set<HTMLElement>>();\n const owner = new WeakMap<HTMLElement, HTMLElement>();\n const pendingBacks = new Map<HTMLElement, { scope: HTMLElement; timer: ReturnType<typeof setTimeout> }>();\n const verticalBarsPages = createVerticalBarsPageState();\n const listeners = new AbortController();\n const root = () => doc.querySelector<HTMLElement>('ion-app.ios-theme-vertical-bars');\n let suspended = 0;\n let stopped = false;\n const routedPage = (element: HTMLElement) => element.closest<HTMLElement>('.ion-page:not(ion-app, body)');\n const release = (scope: HTMLElement) => {\n for (const [element, pending] of pendingBacks) {\n if (pending.scope !== scope) continue;\n clearTimeout(pending.timer);\n pendingBacks.delete(element);\n }\n const owned = scopes.get(scope);\n if (!owned) return;\n owned.forEach((element) => {\n if (owner.get(element) !== scope) return;\n owner.delete(element);\n element.classList.remove(prehiddenClass);\n element.classList.remove(verticalBarsBackWebClass);\n clearVerticalBarsPlacement(element);\n });\n scopes.delete(scope);\n };\n const capture = (scope: HTMLElement) => {\n if (!root()?.contains(scope) || scope.closest(overlays) || !modalUsesVerticalBars(scope) || verticalBarsPages.isDeparted(scope)) return;\n const owned = scopes.get(scope) ?? new Set<HTMLElement>();\n const place = (element: HTMLElement, rail: boolean) => {\n if (owned.has(element)) return;\n const previousScope = owner.get(element);\n if (previousScope) scopes.get(previousScope)?.delete(element);\n owner.set(element, scope);\n setVerticalBarsPlacement(element, rail);\n if (element.matches('ion-back-button')) element.classList.toggle(verticalBarsBackWebClass, !rail);\n owned.add(element);\n };\n const sources = scope.matches('ion-back-button') ? [scope] : Array.from(scope.querySelectorAll<HTMLElement>(sourceSelector));\n sources.forEach((element) => {\n // Shell opt-out is temporary; decide initial placement once it is lifted.\n if (isShellDisabled(element)) return;\n if (!modalUsesVerticalBars(element) || element.closest(overlays) || (scope.matches('.ion-page') && routedPage(element) !== scope))\n return;\n if (element.matches('ion-buttons')) {\n const children = childElements(element);\n const actions = children.filter((child) => eligible(child) && isVerticalBarsToolbarActionShape(child));\n const group =\n eligible(element) &&\n actions.length === children.length &&\n (actions.length > 1 || (actions.length === 1 && actions[0].matches('ion-menu-button')));\n const freshGroup = !owned.has(element);\n place(element, group);\n children.forEach((child) => {\n if (!child.matches('ion-back-button')) place(child, freshGroup && actions.includes(child));\n });\n } else if (element.matches('ion-back-button') || !element.parentElement?.matches('ion-buttons')) {\n if (owned.has(element)) return;\n if (\n element.matches('ion-back-button') &&\n eligibleBack(element) &&\n (element as HTMLIonBackButtonElement).icon === undefined &&\n (element as HTMLIonBackButtonElement).color === undefined &&\n !element.shadowRoot &&\n !element.classList.contains('hydrated')\n ) {\n const previousPending = pendingBacks.get(element);\n if (previousPending && previousPending.scope !== scope) {\n clearTimeout(previousPending.timer);\n pendingBacks.delete(element);\n }\n if (!pendingBacks.has(element)) {\n const timer = setTimeout(() => {\n if (pendingBacks.get(element)?.scope !== scope) return;\n pendingBacks.delete(element);\n // A custom element that never hydrates must remain usable on Web.\n place(element, false);\n reconcile();\n }, 1500);\n pendingBacks.set(element, { scope, timer });\n }\n return;\n }\n const pending = pendingBacks.get(element);\n if (pending) {\n clearTimeout(pending.timer);\n pendingBacks.delete(element);\n }\n place(\n element,\n element.matches('ion-back-button')\n ? eligibleBack(element) && backSupported(element)\n : eligible(element) && isVerticalBarsToolbarActionShape(element),\n );\n }\n });\n scopes.set(scope, owned);\n };\n const reconcile = () => {\n const verticalBars = root();\n if (!verticalBars) {\n Array.from(scopes.keys()).forEach(release);\n return;\n }\n for (const scope of scopes.keys()) if (!scope.isConnected || !modalUsesVerticalBars(scope)) release(scope);\n for (const [element, pending] of pendingBacks) if (element.shadowRoot || element.classList.contains('hydrated')) capture(pending.scope);\n // Ionic inserts the destination as invisible before WillEnter. Hide its\n // sources in that same mutation microtask; capture new DOM identities on active pages too.\n verticalBars.querySelectorAll<HTMLElement>('.ion-page:not(ion-app, body, .ion-page-hidden)').forEach(capture);\n // Root toolbars can mount after startup; each new DOM identity is captured once.\n verticalBars.querySelectorAll<HTMLElement>(sourceSelector).forEach((element) => {\n if (routedPage(element) || element.closest(overlays)) return;\n const scope = element.closest<HTMLElement>('ion-toolbar') ?? (element.matches('ion-back-button') ? element : null);\n if (scope) capture(scope);\n });\n for (const owned of scopes.values()) {\n for (const element of owned) {\n const groupOwnsChildren =\n element.parentElement?.matches('ion-buttons') &&\n verticalBarsOwned(element.parentElement) &&\n childElements(element.parentElement).every((child) => verticalBarsOwned(child));\n const hide =\n !suspended &&\n verticalBarsOwned(element) &&\n !groupOwnsChildren &&\n element.isConnected &&\n !element.closest(`.${rejectedClass}`) &&\n !isPermanentlyExcluded(element) &&\n !isShellDisabled(element) &&\n (!element.matches('ion-back-button') || backSupported(element) || !element.classList.contains('hydrated')) &&\n (!element.matches('ion-buttons') || childElements(element).every((child) => verticalBarsOwned(child)));\n element.classList.toggle(prehiddenClass, hide);\n if (element.matches('ion-back-button')) element.classList.toggle(verticalBarsBackWebClass, !hide);\n }\n }\n };\n const onWillEnter = (event: Event) => {\n const page = asElement(event.target);\n if (page?.matches('.ion-page')) {\n verticalBarsPages.lifecycle(event);\n release(page); // Cached pages begin a new placement epoch.\n capture(page);\n reconcile();\n }\n };\n const onPageLifecycle: EventListener = (event) => {\n verticalBarsPages.lifecycle(event);\n if (event.type !== LIFECYCLE_DID_LEAVE) return;\n const page = asElement(event.target);\n if (page) release(page);\n };\n // A canceled transition keeps the leaving page active and abandons the entering one.\n const onTransitionCanceled: EventListener = (event) => {\n const leaving = asElement(event.target);\n if (!leaving) return;\n const entering = (event as CustomEvent<{ entering?: HTMLElement }>).detail?.entering;\n verticalBarsPages.cancel(entering, leaving);\n reconcile();\n };\n doc.addEventListener(LIFECYCLE_WILL_ENTER, onWillEnter, { capture: true, signal: listeners.signal });\n for (const name of [LIFECYCLE_WILL_LEAVE, LIFECYCLE_DID_ENTER, LIFECYCLE_DID_LEAVE])\n doc.addEventListener(name, onPageLifecycle, { capture: true, signal: listeners.signal });\n doc.addEventListener(VERTICAL_BARS_TRANSITION_CANCELED, onTransitionCanceled, { capture: true, signal: listeners.signal });\n doc.defaultView?.addEventListener('nativeUIShellRefresh', reconcile, { signal: listeners.signal });\n reconcile();\n const mutationRelevant = (record: MutationRecord) => {\n if (record.type === 'childList')\n return [...Array.from(record.addedNodes), ...Array.from(record.removedNodes)].some(\n (node) =>\n isHtmlElement(node) &&\n (node.matches(`${sourceSelector}, .ion-page, ion-toolbar`) || !!node.querySelector(`${sourceSelector}, .ion-page, ion-toolbar`)),\n );\n if (record.attributeName !== 'class') return true;\n const current = (record.target as Element).className;\n const previous = record.oldValue ?? '';\n const withoutOwned = (value: string) =>\n value\n .split(/\\s+/)\n .filter((name) => name && ![prehiddenClass, prehideRootClass, verticalBarsBackWebClass].includes(name))\n .join(' ');\n return typeof current !== 'string' || withoutOwned(previous) !== withoutOwned(current);\n };\n let scheduled = false;\n const observer = new (doc.defaultView?.MutationObserver ?? MutationObserver)((records) => {\n if (scheduled || stopped || !records.some(mutationRelevant)) return;\n scheduled = true;\n queueMicrotask(() => {\n scheduled = false;\n if (!stopped) reconcile();\n });\n });\n observer.observe(doc.documentElement, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeOldValue: true,\n attributeFilter: ['class', 'data-shell', 'hidden', 'inert', 'icon', 'color'],\n });\n return {\n suspend: () => {\n if (stopped) return () => {};\n suspended++;\n doc.documentElement.classList.remove(prehideRootClass);\n reconcile();\n let resumed = false;\n return () => {\n if (resumed || stopped) return;\n resumed = true;\n if (--suspended === 0) {\n doc.documentElement.classList.add(prehideRootClass);\n reconcile();\n }\n };\n },\n stop: () => {\n if (stopped) return;\n stopped = true;\n observer.disconnect();\n listeners.abort();\n doc.documentElement.classList.remove(prehideRootClass);\n Array.from(scopes.keys()).forEach(release);\n },\n };\n};\n"],"mappings":"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"}
@@ -1,3 +1,5 @@
1
- import type { NativeUIShellHandle, NativeUIShellOptions, NativeUIShellPlugin } from './definitions';
1
+ import { NativeUIShellHandle, NativeUIShellOptions, NativeUIShellPlugin } from "./definitions.js";
2
+ //#region src/native/runtime.d.ts
2
3
  export declare const createRuntime: (doc: Document, plugin: NativeUIShellPlugin, options?: NativeUIShellOptions, nativeVerticalBars?: () => boolean, verticalBarsOnly?: boolean) => Promise<NativeUIShellHandle>;
4
+ //#endregion
3
5
  //# sourceMappingURL=runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/native/runtime.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAGV,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EAEpB,MAAM,eAAe,CAAC;AA6BvB,eAAO,MAAM,aAAa,GACxB,KAAK,QAAQ,EACb,QAAQ,mBAAmB,EAC3B,UAAS,oBAAyB,EAClC,qBAAoB,MAAM,OAAoB,EAC9C,0BAAwB,KACvB,OAAO,CAAC,mBAAmB,CAytB7B,CAAC"}
1
+ {"version":3,"file":"runtime.d.ts","names":[],"sources":["../../src/native/runtime.ts"],"mappings":";;qBAyCa,gBACX,KAAK,UACL,QAAQ,qBACR,UAAS,sBACT,oCACA,+BACC,QAAQ"}