@rdlabo/ionic-theme-ios27 1.2.1-beta.pr275.shad339e7688db7 → 2.0.0-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 (248) hide show
  1. package/README.md +24 -280
  2. package/dist/css/components/ion-toolbar.css +1 -1
  3. package/dist/css/ionic-theme-ios27.css +1 -1
  4. package/dist/css/vertical-bars.css +1 -1
  5. package/dist/index.d.ts +3 -2
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +3 -2
  8. package/dist/index.js.map +1 -1
  9. package/dist/layout/index.d.ts +18 -0
  10. package/dist/layout/index.d.ts.map +1 -0
  11. package/dist/layout/index.js +26 -0
  12. package/dist/layout/index.js.map +1 -0
  13. package/dist/segment/index.js +3 -3
  14. package/dist/segment/index.js.map +1 -1
  15. package/dist/sheets-of-glass/index.js +7 -7
  16. package/dist/sheets-of-glass/index.js.map +1 -1
  17. package/dist/tab-bar-searchable/dismiss-button.js +53 -3
  18. package/dist/tab-bar-searchable/dismiss-button.js.map +1 -1
  19. package/dist/tab-bar-searchable/index.js +18 -3
  20. package/dist/tab-bar-searchable/index.js.map +1 -1
  21. package/dist/transition/ios.transition.d.ts.map +1 -1
  22. package/dist/transition/ios.transition.js +7 -4
  23. package/dist/transition/ios.transition.js.map +1 -1
  24. package/dist/transition/native-ui.d.ts +6 -0
  25. package/dist/transition/native-ui.d.ts.map +1 -0
  26. package/dist/{native-integration/index.js → transition/native-ui.js} +16 -30
  27. package/dist/transition/native-ui.js.map +1 -0
  28. package/docs/adaptive-themes.md +161 -0
  29. package/docs/add-native-ui.md +53 -0
  30. package/docs/animation.md +19 -3
  31. package/docs/eslint.md +3 -1
  32. package/docs/features.md +9 -5
  33. package/docs/iphone-duo.md +62 -35
  34. package/docs/migration.md +17 -26
  35. package/docs/setup.md +92 -0
  36. package/docs/special-markup.md +41 -10
  37. package/docs/using-ion-item-group.md +2 -2
  38. package/docs/vertical-bars-layout.md +67 -0
  39. package/package.json +12 -42
  40. package/src/index.ts +3 -1
  41. package/src/layout/index.ts +29 -0
  42. package/src/segment/index.ts +3 -3
  43. package/src/sheets-of-glass/index.ts +7 -7
  44. package/src/styles/components/ion-toolbar.scss +1 -1
  45. package/src/styles/vertical-bars.scss +15 -18
  46. package/src/tab-bar-searchable/dismiss-button.ts +73 -4
  47. package/src/tab-bar-searchable/index.ts +20 -3
  48. package/src/transition/ios.transition.ts +7 -4
  49. package/src/{native-integration/index.ts → transition/native-ui.ts} +17 -46
  50. package/Package.swift +0 -21
  51. package/dist/_virtual/_rolldown/runtime.js +0 -13
  52. package/dist/native/components/index.d.ts +0 -19
  53. package/dist/native/components/index.d.ts.map +0 -1
  54. package/dist/native/components/index.js +0 -40
  55. package/dist/native/components/index.js.map +0 -1
  56. package/dist/native/components/ion-back-button.d.ts +0 -9
  57. package/dist/native/components/ion-back-button.d.ts.map +0 -1
  58. package/dist/native/components/ion-back-button.js +0 -20
  59. package/dist/native/components/ion-back-button.js.map +0 -1
  60. package/dist/native/components/ion-button.d.ts +0 -10
  61. package/dist/native/components/ion-button.d.ts.map +0 -1
  62. package/dist/native/components/ion-button.js +0 -23
  63. package/dist/native/components/ion-button.js.map +0 -1
  64. package/dist/native/components/ion-buttons.d.ts +0 -11
  65. package/dist/native/components/ion-buttons.d.ts.map +0 -1
  66. package/dist/native/components/ion-buttons.js +0 -30
  67. package/dist/native/components/ion-buttons.js.map +0 -1
  68. package/dist/native/components/ion-fab.d.ts +0 -10
  69. package/dist/native/components/ion-fab.d.ts.map +0 -1
  70. package/dist/native/components/ion-fab.js +0 -132
  71. package/dist/native/components/ion-fab.js.map +0 -1
  72. package/dist/native/components/ion-menu-button.d.ts +0 -13
  73. package/dist/native/components/ion-menu-button.d.ts.map +0 -1
  74. package/dist/native/components/ion-menu-button.js +0 -31
  75. package/dist/native/components/ion-menu-button.js.map +0 -1
  76. package/dist/native/components/ion-segment.d.ts +0 -11
  77. package/dist/native/components/ion-segment.d.ts.map +0 -1
  78. package/dist/native/components/ion-segment.js +0 -30
  79. package/dist/native/components/ion-segment.js.map +0 -1
  80. package/dist/native/components/ion-tab-bar.d.ts +0 -11
  81. package/dist/native/components/ion-tab-bar.d.ts.map +0 -1
  82. package/dist/native/components/ion-tab-bar.js +0 -50
  83. package/dist/native/components/ion-tab-bar.js.map +0 -1
  84. package/dist/native/components/searchable-tabs.d.ts +0 -20
  85. package/dist/native/components/searchable-tabs.d.ts.map +0 -1
  86. package/dist/native/components/searchable-tabs.js +0 -383
  87. package/dist/native/components/searchable-tabs.js.map +0 -1
  88. package/dist/native/definitions.d.ts +0 -191
  89. package/dist/native/definitions.d.ts.map +0 -1
  90. package/dist/native/definitions.js +0 -0
  91. package/dist/native/foldable/fold-state.d.ts +0 -5
  92. package/dist/native/foldable/fold-state.d.ts.map +0 -1
  93. package/dist/native/foldable/fold-state.js +0 -14
  94. package/dist/native/foldable/fold-state.js.map +0 -1
  95. package/dist/native/foldable/types.d.ts +0 -12
  96. package/dist/native/foldable/types.d.ts.map +0 -1
  97. package/dist/native/foldable/types.js +0 -0
  98. package/dist/native/index.d.ts +0 -11
  99. package/dist/native/index.d.ts.map +0 -1
  100. package/dist/native/index.js +0 -267
  101. package/dist/native/index.js.map +0 -1
  102. package/dist/native/overlays/content.d.ts +0 -4
  103. package/dist/native/overlays/content.d.ts.map +0 -1
  104. package/dist/native/overlays/content.js +0 -51
  105. package/dist/native/overlays/content.js.map +0 -1
  106. package/dist/native/overlays/controller.d.ts +0 -8
  107. package/dist/native/overlays/controller.d.ts.map +0 -1
  108. package/dist/native/overlays/controller.js +0 -285
  109. package/dist/native/overlays/controller.js.map +0 -1
  110. package/dist/native/overlays/dialog-animation.d.ts +0 -9
  111. package/dist/native/overlays/dialog-animation.d.ts.map +0 -1
  112. package/dist/native/overlays/dialog-animation.js +0 -53
  113. package/dist/native/overlays/dialog-animation.js.map +0 -1
  114. package/dist/native/overlays/dismiss-animation.d.ts +0 -4
  115. package/dist/native/overlays/dismiss-animation.d.ts.map +0 -1
  116. package/dist/native/overlays/dismiss-animation.js +0 -18
  117. package/dist/native/overlays/dismiss-animation.js.map +0 -1
  118. package/dist/native/overlays/focus.d.ts +0 -5
  119. package/dist/native/overlays/focus.d.ts.map +0 -1
  120. package/dist/native/overlays/focus.js +0 -59
  121. package/dist/native/overlays/focus.js.map +0 -1
  122. package/dist/native/overlays/popover.d.ts +0 -12
  123. package/dist/native/overlays/popover.d.ts.map +0 -1
  124. package/dist/native/overlays/popover.js +0 -110
  125. package/dist/native/overlays/popover.js.map +0 -1
  126. package/dist/native/overlays/styles.d.ts +0 -11
  127. package/dist/native/overlays/styles.d.ts.map +0 -1
  128. package/dist/native/overlays/styles.js +0 -167
  129. package/dist/native/overlays/styles.js.map +0 -1
  130. package/dist/native/prehide.d.ts +0 -7
  131. package/dist/native/prehide.d.ts.map +0 -1
  132. package/dist/native/prehide.js +0 -230
  133. package/dist/native/prehide.js.map +0 -1
  134. package/dist/native/runtime.d.ts +0 -7
  135. package/dist/native/runtime.d.ts.map +0 -1
  136. package/dist/native/runtime.js +0 -710
  137. package/dist/native/runtime.js.map +0 -1
  138. package/dist/native/shared/bridge.d.ts +0 -6
  139. package/dist/native/shared/bridge.d.ts.map +0 -1
  140. package/dist/native/shared/bridge.js +0 -18
  141. package/dist/native/shared/bridge.js.map +0 -1
  142. package/dist/native/shared/candidate.d.ts +0 -21
  143. package/dist/native/shared/candidate.d.ts.map +0 -1
  144. package/dist/native/shared/candidate.js +0 -98
  145. package/dist/native/shared/candidate.js.map +0 -1
  146. package/dist/native/shared/crossfade.d.ts +0 -12
  147. package/dist/native/shared/crossfade.d.ts.map +0 -1
  148. package/dist/native/shared/crossfade.js +0 -67
  149. package/dist/native/shared/crossfade.js.map +0 -1
  150. package/dist/native/shared/dom.d.ts +0 -46
  151. package/dist/native/shared/dom.d.ts.map +0 -1
  152. package/dist/native/shared/dom.js +0 -172
  153. package/dist/native/shared/dom.js.map +0 -1
  154. package/dist/native/shared/events.d.ts +0 -11
  155. package/dist/native/shared/events.d.ts.map +0 -1
  156. package/dist/native/shared/events.js +0 -13
  157. package/dist/native/shared/events.js.map +0 -1
  158. package/dist/native/shared/icons.d.ts +0 -8
  159. package/dist/native/shared/icons.d.ts.map +0 -1
  160. package/dist/native/shared/icons.js +0 -61
  161. package/dist/native/shared/icons.js.map +0 -1
  162. package/dist/native/shared/modal.d.ts +0 -10
  163. package/dist/native/shared/modal.d.ts.map +0 -1
  164. package/dist/native/shared/modal.js +0 -160
  165. package/dist/native/shared/modal.js.map +0 -1
  166. package/dist/native/shared/projection-id.d.ts +0 -4
  167. package/dist/native/shared/projection-id.d.ts.map +0 -1
  168. package/dist/native/shared/projection-id.js +0 -7
  169. package/dist/native/shared/projection-id.js.map +0 -1
  170. package/dist/native/shared/vertical-bars-geometry.d.ts +0 -10
  171. package/dist/native/shared/vertical-bars-geometry.d.ts.map +0 -1
  172. package/dist/native/shared/vertical-bars-geometry.js +0 -85
  173. package/dist/native/shared/vertical-bars-geometry.js.map +0 -1
  174. package/dist/native/vertical-bars-web-search.d.ts +0 -10
  175. package/dist/native/vertical-bars-web-search.d.ts.map +0 -1
  176. package/dist/native/vertical-bars-web-search.js +0 -90
  177. package/dist/native/vertical-bars-web-search.js.map +0 -1
  178. package/dist/native/vertical-bars-web.d.ts +0 -5
  179. package/dist/native/vertical-bars-web.d.ts.map +0 -1
  180. package/dist/native/vertical-bars-web.js +0 -411
  181. package/dist/native/vertical-bars-web.js.map +0 -1
  182. package/dist/native-integration/index.d.ts +0 -23
  183. package/dist/native-integration/index.d.ts.map +0 -1
  184. package/dist/native-integration/index.js.map +0 -1
  185. package/dist/native-integration/transition.d.ts +0 -5
  186. package/dist/native-integration/transition.d.ts.map +0 -1
  187. package/dist/native-integration/transition.js +0 -16
  188. package/dist/native-integration/transition.js.map +0 -1
  189. package/dist/vertical-bars.d.ts +0 -5
  190. package/dist/vertical-bars.js +0 -4
  191. package/docs/e2e-testing.md +0 -51
  192. package/docs/feedback.md +0 -65
  193. package/docs/iphone-duo-with-original-theme.md +0 -158
  194. package/docs/native-ui-shell.md +0 -325
  195. package/docs/vertical-bars.md +0 -300
  196. package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellButton.swift +0 -71
  197. package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellButtons.swift +0 -24
  198. package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellComponents.swift +0 -18
  199. package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellFab.swift +0 -80
  200. package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellSearchController.swift +0 -432
  201. package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellSegment.swift +0 -91
  202. package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellTabBar.swift +0 -218
  203. package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift +0 -565
  204. package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalSearch.swift +0 -118
  205. package/ios/Sources/IonicNativeUIShellPlugin/IonicNativeUIShellPlugin.swift +0 -502
  206. package/ios/Sources/IonicNativeUIShellPlugin/Overlays/ShellOverlayController.swift +0 -119
  207. package/ios/Sources/IonicNativeUIShellPlugin/Overlays/ShellOverlayHost.swift +0 -75
  208. package/ios/Sources/IonicNativeUIShellPlugin/Shared/ShellCrossfade.swift +0 -35
  209. package/ios/Sources/IonicNativeUIShellPlugin/Shared/ShellHost.swift +0 -8
  210. package/ios/Sources/IonicNativeUIShellPlugin/Shared/ShellRendering.swift +0 -27
  211. package/ios/Sources/IonicNativeUIShellPlugin/Shared/ShellSnapshot.swift +0 -135
  212. package/ios/Sources/IonicNativeUIShellPlugin/Shared/ShellVerticalBarsGeometry.swift +0 -52
  213. package/ios/Tests/IonicNativeUIShellPluginTests/ShellSnapshotTests.swift +0 -788
  214. package/src/native/components/index.ts +0 -53
  215. package/src/native/components/ion-back-button.ts +0 -19
  216. package/src/native/components/ion-button.ts +0 -24
  217. package/src/native/components/ion-buttons.ts +0 -38
  218. package/src/native/components/ion-fab.ts +0 -151
  219. package/src/native/components/ion-menu-button.ts +0 -24
  220. package/src/native/components/ion-segment.ts +0 -27
  221. package/src/native/components/ion-tab-bar.ts +0 -50
  222. package/src/native/components/searchable-tabs.ts +0 -459
  223. package/src/native/definitions.ts +0 -218
  224. package/src/native/foldable/fold-state.ts +0 -9
  225. package/src/native/foldable/types.ts +0 -4
  226. package/src/native/index.ts +0 -315
  227. package/src/native/overlays/content.ts +0 -51
  228. package/src/native/overlays/controller.ts +0 -349
  229. package/src/native/overlays/dialog-animation.ts +0 -53
  230. package/src/native/overlays/dismiss-animation.ts +0 -15
  231. package/src/native/overlays/focus.ts +0 -64
  232. package/src/native/overlays/popover.ts +0 -120
  233. package/src/native/overlays/styles.ts +0 -181
  234. package/src/native/prehide.ts +0 -265
  235. package/src/native/runtime.ts +0 -885
  236. package/src/native/shared/bridge.ts +0 -18
  237. package/src/native/shared/candidate.ts +0 -150
  238. package/src/native/shared/crossfade.ts +0 -67
  239. package/src/native/shared/dom.ts +0 -286
  240. package/src/native/shared/events.ts +0 -8
  241. package/src/native/shared/icons.ts +0 -57
  242. package/src/native/shared/modal.ts +0 -157
  243. package/src/native/shared/projection-id.ts +0 -2
  244. package/src/native/shared/vertical-bars-geometry.ts +0 -80
  245. package/src/native/vertical-bars-web-search.ts +0 -86
  246. package/src/native/vertical-bars-web.ts +0 -485
  247. package/src/native-integration/transition.ts +0 -15
  248. package/src/vertical-bars.ts +0 -11
@@ -1,110 +0,0 @@
1
- import { projectionIds } from "../shared/projection-id.js";
2
- import { isDark } from "../shared/dom.js";
3
- import { captureRelayAppearance, sheetText } from "./styles.js";
4
- import { moveContent } from "./content.js";
5
- //#region src/native/overlays/popover.ts
6
- const popoverTrigger = (overlay) => {
7
- const event = overlay.event;
8
- const target = overlay.trigger ? overlay.ownerDocument.getElementById(overlay.trigger) : event?.target;
9
- return target?.closest?.("ion-button,ion-fab-button,ion-item") ?? target;
10
- };
11
- /** Only accepted native rail buttons can retain the page projection. */
12
- const verticalBarsPopoverAnchor = (overlay) => {
13
- const trigger = popoverTrigger(overlay);
14
- if (!trigger?.matches("ion-button[data-native-ui-shell-vertical-bars-member]") || !trigger.closest("[data-native-ui-shell]") || trigger.disabled) return void 0;
15
- return projectionIds.get(trigger);
16
- };
17
- const popoverPresentation = (overlay) => {
18
- const content = overlay.shadowRoot.querySelector(".popover-content");
19
- const rect = content.getBoundingClientRect();
20
- const anchorId = verticalBarsPopoverAnchor(overlay);
21
- if (!anchorId) throw new Error("Native Vertical Bars anchor unavailable");
22
- return {
23
- kind: "popover",
24
- animated: overlay.animated,
25
- dark: isDark(overlay.ownerDocument.defaultView.getComputedStyle(overlay)),
26
- anchorId,
27
- width: rect.width,
28
- height: rect.height,
29
- backgroundColor: overlay.ownerDocument.defaultView.getComputedStyle(content).backgroundColor,
30
- backdropDismiss: overlay.backdropDismiss
31
- };
32
- };
33
- const relayPopover = (overlay, destination) => {
34
- const doc = destination.ownerDocument;
35
- const source = overlay.shadowRoot.querySelector(".popover-content");
36
- const content = Array.from(source.querySelector("slot").assignedElements());
37
- const matchesSourceAppearance = captureRelayAppearance(content);
38
- const size = source.getBoundingClientRect();
39
- const root = doc.createElement("ion-popover");
40
- for (const attribute of Array.from(overlay.attributes)) root.setAttribute(attribute.name, attribute.value);
41
- Object.assign(root.style, {
42
- position: "absolute",
43
- inset: "0",
44
- display: "block",
45
- visibility: "visible",
46
- opacity: "1",
47
- pointerEvents: "auto"
48
- });
49
- root.setAttribute("role", "dialog");
50
- root.setAttribute("aria-modal", "true");
51
- const shadow = root.attachShadow({ mode: "open" });
52
- const inheritedStyles = doc.createElement("style");
53
- inheritedStyles.textContent = sheetText(overlay.shadowRoot.adoptedStyleSheets) + Array.from(overlay.shadowRoot.querySelectorAll("style"), (style) => style.textContent).join("\n");
54
- shadow.append(inheritedStyles);
55
- const shell = doc.createElement("div");
56
- shell.className = "popover-content";
57
- const css = overlay.ownerDocument.defaultView.getComputedStyle(source);
58
- Object.assign(shell.style, {
59
- position: "relative",
60
- opacity: "1",
61
- boxSizing: "border-box",
62
- inset: "auto",
63
- width: "100%",
64
- maxWidth: "none",
65
- height: "100%",
66
- maxHeight: "none",
67
- transform: "none",
68
- boxShadow: "none",
69
- border: css.border,
70
- borderColor: "transparent",
71
- borderRadius: "0",
72
- overflow: css.overflow,
73
- background: css.backgroundColor
74
- });
75
- shell.append(doc.createElement("slot"));
76
- shadow.append(shell);
77
- destination.append(root);
78
- root.dismiss = (...args) => overlay.dismiss(...args);
79
- const restore = moveContent(content, root);
80
- const select = (event) => {
81
- if (!event.composedPath().includes(shell)) {
82
- if (overlay.backdropDismiss) overlay.dismiss(void 0, "backdrop");
83
- } else if (overlay.dismissOnSelect) overlay.dismiss();
84
- };
85
- root.addEventListener("click", select);
86
- return {
87
- root,
88
- matchesSourceAppearance() {
89
- const previousWidth = root.style.width;
90
- const previousHeight = root.style.height;
91
- root.style.width = `${size.width}px`;
92
- root.style.height = `${size.height}px`;
93
- try {
94
- return matchesSourceAppearance();
95
- } finally {
96
- root.style.width = previousWidth;
97
- root.style.height = previousHeight;
98
- }
99
- },
100
- stop() {
101
- root.removeEventListener("click", select);
102
- restore();
103
- root.remove();
104
- }
105
- };
106
- };
107
- //#endregion
108
- export { popoverPresentation, popoverTrigger, relayPopover, verticalBarsPopoverAnchor };
109
-
110
- //# sourceMappingURL=popover.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"popover.js","names":[],"sources":["../../../src/native/overlays/popover.ts"],"sourcesContent":["import type { ShellPopoverPresentation } from '../definitions';\nimport { projectionIds } from '../shared/projection-id';\nimport { isDark } from '../shared/dom';\nimport { moveContent } from './content';\nimport { captureRelayAppearance, sheetText } from './styles';\n\nexport const popoverTrigger = (overlay: HTMLIonPopoverElement): Element | undefined => {\n const event = overlay.event as MouseEvent | undefined;\n const target = (overlay.trigger ? overlay.ownerDocument.getElementById(overlay.trigger) : event?.target) as Element | undefined;\n return target?.closest?.('ion-button,ion-fab-button,ion-item') ?? target;\n};\n\n/** Only accepted native rail buttons can retain the page projection. */\nexport const verticalBarsPopoverAnchor = (overlay: HTMLIonPopoverElement): string | undefined => {\n const trigger = popoverTrigger(overlay);\n if (\n !trigger?.matches('ion-button[data-native-ui-shell-vertical-bars-member]') ||\n !trigger.closest('[data-native-ui-shell]') ||\n (trigger as HTMLIonButtonElement).disabled\n )\n return undefined;\n return projectionIds.get(trigger);\n};\n\nexport const popoverPresentation = (overlay: HTMLIonPopoverElement): ShellPopoverPresentation => {\n const content = overlay.shadowRoot!.querySelector<HTMLElement>('.popover-content')!;\n const rect = content.getBoundingClientRect();\n const anchorId = verticalBarsPopoverAnchor(overlay);\n if (!anchorId) throw new Error('Native Vertical Bars anchor unavailable');\n return {\n kind: 'popover',\n animated: overlay.animated,\n dark: isDark(overlay.ownerDocument.defaultView!.getComputedStyle(overlay)),\n anchorId,\n width: rect.width,\n height: rect.height,\n backgroundColor: overlay.ownerDocument.defaultView!.getComputedStyle(content).backgroundColor,\n backdropDismiss: overlay.backdropDismiss,\n };\n};\n\nexport const relayPopover = (overlay: HTMLIonPopoverElement, destination: HTMLElement) => {\n const doc = destination.ownerDocument;\n const source = overlay.shadowRoot!.querySelector<HTMLElement>('.popover-content')!;\n const content = Array.from(source.querySelector('slot')!.assignedElements()) as HTMLElement[];\n const matchesSourceAppearance = captureRelayAppearance(content);\n const size = source.getBoundingClientRect();\n const root = doc.createElement('ion-popover');\n for (const attribute of Array.from(overlay.attributes)) root.setAttribute(attribute.name, attribute.value);\n Object.assign(root.style, {\n position: 'absolute',\n inset: '0',\n display: 'block',\n visibility: 'visible',\n opacity: '1',\n pointerEvents: 'auto',\n });\n root.setAttribute('role', 'dialog');\n root.setAttribute('aria-modal', 'true');\n const shadow = root.attachShadow({ mode: 'open' });\n const inheritedStyles = doc.createElement('style');\n inheritedStyles.textContent =\n sheetText(overlay.shadowRoot!.adoptedStyleSheets) +\n Array.from(overlay.shadowRoot!.querySelectorAll('style'), (style) => style.textContent).join('\\n');\n shadow.append(inheritedStyles);\n const shell = doc.createElement('div');\n shell.className = 'popover-content';\n const css = overlay.ownerDocument.defaultView!.getComputedStyle(source);\n Object.assign(shell.style, {\n position: 'relative',\n // Ionic hides this shell until its Web enter animation runs. SwiftUI owns\n // the relay animation, so its content must already be opaque.\n opacity: '1',\n boxSizing: 'border-box',\n inset: 'auto',\n width: '100%',\n maxWidth: 'none',\n height: '100%',\n maxHeight: 'none',\n transform: 'none',\n boxShadow: 'none',\n border: css.border,\n borderColor: 'transparent',\n borderRadius: '0',\n overflow: css.overflow,\n background: css.backgroundColor,\n });\n shell.append(doc.createElement('slot'));\n shadow.append(shell);\n destination.append(root);\n // Components such as ion-select-popover dismiss their closest ion-popover.\n root.dismiss = (...args) => overlay.dismiss(...args);\n const restore = moveContent(content, root);\n const select = (event: MouseEvent) => {\n if (!event.composedPath().includes(shell)) {\n if (overlay.backdropDismiss) void overlay.dismiss(undefined, 'backdrop');\n } else if (overlay.dismissOnSelect) void overlay.dismiss();\n };\n root.addEventListener('click', select);\n return {\n root,\n matchesSourceAppearance() {\n const previousWidth = root.style.width;\n const previousHeight = root.style.height;\n root.style.width = `${size.width}px`;\n root.style.height = `${size.height}px`;\n try {\n return matchesSourceAppearance();\n } finally {\n root.style.width = previousWidth;\n root.style.height = previousHeight;\n }\n },\n stop() {\n root.removeEventListener('click', select);\n restore();\n root.remove();\n },\n };\n};\n"],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- //#region src/native/overlays/styles.d.ts
2
- export declare const sheetText: (sheets: readonly CSSStyleSheet[]) => string;
3
- export declare const relayStyles: (source: Document, destination: Document, overlay: HTMLElement, changed?: () => void) => {
4
- destination: HTMLElement;
5
- ready: Promise<void>;
6
- stop: () => void;
7
- };
8
- export declare const captureRelayAppearance: (roots: Element[]) => (() => boolean);
9
- export declare const relayLayoutSupported: (overlay: HTMLElement) => boolean;
10
- //#endregion
11
- //# sourceMappingURL=styles.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"styles.d.ts","names":[],"sources":["../../../src/native/overlays/styles.ts"],"mappings":";qBAAa,YAAa,iBAAiB;qBAG9B,cACX,QAAQ,UACR,aAAa,UACb,SAAS,aACT;EACG,aAAa;EAAa,OAAO;EAAe;;qBAmFxC,yBAA0B,OAAO;qBA2EjC,uBAAwB,SAAS"}
@@ -1,167 +0,0 @@
1
- //#region src/native/overlays/styles.ts
2
- const sheetText = (sheets) => sheets.flatMap((sheet) => Array.from(sheet.cssRules, (rule) => rule.cssText)).join("\n");
3
- const relayStyles = (source, destination, overlay, changed) => {
4
- const base = destination.createElement("base");
5
- base.href = source.baseURI;
6
- destination.head.append(base);
7
- const copies = /* @__PURE__ */ new Map();
8
- const sheets = destination.createElement("style");
9
- destination.head.append(sheets);
10
- const sync = () => {
11
- sheets.textContent = sheetText(source.adoptedStyleSheets);
12
- const sources = Array.from(source.querySelectorAll("meta[name=viewport],link[rel=stylesheet],style:not([data-overlay-relay-local])"));
13
- for (const [node, copy] of copies) if (!sources.includes(node)) {
14
- copy.remove();
15
- copies.delete(node);
16
- }
17
- for (const node of sources) {
18
- let copy = copies.get(node);
19
- if (!copy) {
20
- copy = node.cloneNode(true);
21
- copies.set(node, copy);
22
- } else {
23
- for (const attribute of Array.from(copy.attributes)) copy.removeAttribute(attribute.name);
24
- for (const attribute of Array.from(node.attributes)) copy.setAttribute(attribute.name, attribute.value);
25
- copy.textContent = node.textContent;
26
- }
27
- destination.head.append(copy);
28
- }
29
- destination.head.append(surface);
30
- };
31
- const surface = destination.createElement("style");
32
- surface.textContent = "html,body{background:transparent!important}";
33
- const observers = [];
34
- const mirror = (node, target, flatten = false) => {
35
- const update = () => {
36
- for (const attribute of Array.from(target.attributes)) if (!node.hasAttribute(attribute.name)) target.removeAttribute(attribute.name);
37
- for (const attribute of Array.from(node.attributes)) target.setAttribute(attribute.name, attribute.value);
38
- if (target.localName === "ion-app") target.classList.remove("ios-theme-vertical-bars");
39
- if (flatten) target.style.setProperty("display", "contents", "important");
40
- };
41
- update();
42
- const observer = new MutationObserver(() => {
43
- update();
44
- changed?.();
45
- });
46
- observer.observe(node, { attributes: true });
47
- observers.push(observer);
48
- };
49
- mirror(source.documentElement, destination.documentElement);
50
- mirror(source.body, destination.body);
51
- const ancestors = [];
52
- for (let node = overlay.parentElement; node && node !== source.body; node = node.parentElement) ancestors.unshift(node);
53
- let parent = destination.body;
54
- for (const node of ancestors) {
55
- const shell = destination.createElement(node.localName);
56
- mirror(node, shell, true);
57
- parent.append(shell);
58
- parent = shell;
59
- }
60
- sync();
61
- const ready = Promise.all(Array.from(destination.querySelectorAll("link[rel=stylesheet]"), (link) => {
62
- if (link.sheet) return Promise.resolve();
63
- return new Promise((resolve, reject) => {
64
- link.addEventListener("load", () => resolve(), { once: true });
65
- link.addEventListener("error", () => reject(/* @__PURE__ */ new Error("Popover stylesheet unavailable")), { once: true });
66
- });
67
- })).then(() => void 0);
68
- const observer = new MutationObserver(() => {
69
- sync();
70
- changed?.();
71
- });
72
- observer.observe(source.head, {
73
- subtree: true,
74
- childList: true,
75
- characterData: true,
76
- attributes: true
77
- });
78
- observers.push(observer);
79
- return {
80
- destination: parent,
81
- ready,
82
- stop: () => observers.forEach((item) => item.disconnect())
83
- };
84
- };
85
- const captureRelayAppearance = (roots) => {
86
- const properties = [
87
- "display",
88
- "position",
89
- "box-sizing",
90
- "color",
91
- "background-color",
92
- "background-image",
93
- "background-size",
94
- "background-position",
95
- "box-shadow",
96
- "visibility",
97
- "opacity",
98
- "transform",
99
- "filter",
100
- "overflow",
101
- "text-decoration",
102
- "font-family",
103
- "font-size",
104
- "font-weight",
105
- "font-style",
106
- "line-height",
107
- "letter-spacing",
108
- "text-align",
109
- "text-transform",
110
- "white-space",
111
- "direction",
112
- "padding-top",
113
- "padding-right",
114
- "padding-bottom",
115
- "padding-left",
116
- "margin-top",
117
- "margin-right",
118
- "margin-bottom",
119
- "margin-left",
120
- "border-top-width",
121
- "border-right-width",
122
- "border-bottom-width",
123
- "border-left-width",
124
- "border-top-color",
125
- "border-radius",
126
- "flex-direction",
127
- "flex-wrap",
128
- "justify-content",
129
- "align-items",
130
- "grid-template-columns",
131
- "grid-template-rows",
132
- "gap",
133
- "width",
134
- "height"
135
- ];
136
- const snapshots = [];
137
- const values = (node) => {
138
- const css = node.ownerDocument.defaultView.getComputedStyle(node);
139
- return properties.map((property) => css.getPropertyValue(property));
140
- };
141
- const visit = (node) => {
142
- if (snapshots.length >= 1e3) throw new Error("Popover content too complex to verify native styling");
143
- snapshots.push({
144
- node,
145
- values: values(node)
146
- });
147
- Array.from(node.children).forEach(visit);
148
- if (node.shadowRoot) Array.from(node.shadowRoot.children).filter((child) => !child.matches("style, link")).forEach(visit);
149
- };
150
- roots.forEach(visit);
151
- return () => snapshots.every(({ node, values: before }) => values(node).every((value, index) => {
152
- return value === before[index];
153
- }));
154
- };
155
- /** Flattening an ancestor must not remove a containing block or visual effect. */
156
- const relayLayoutSupported = (overlay) => {
157
- const win = overlay.ownerDocument.defaultView;
158
- for (let node = overlay.parentElement; node; node = node.parentElement) {
159
- const css = win.getComputedStyle(node);
160
- if (css.containerType !== "normal" || css.transform !== "none" && !new DOMMatrixReadOnly(css.transform).isIdentity || css.perspective !== "none" || css.filter !== "none" || css.opacity !== "1") return false;
161
- }
162
- return true;
163
- };
164
- //#endregion
165
- export { captureRelayAppearance, relayLayoutSupported, relayStyles, sheetText };
166
-
167
- //# sourceMappingURL=styles.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"styles.js","names":[],"sources":["../../../src/native/overlays/styles.ts"],"sourcesContent":["export const sheetText = (sheets: readonly CSSStyleSheet[]): string =>\n sheets.flatMap((sheet) => Array.from(sheet.cssRules, (rule) => rule.cssText)).join('\\n');\n\nexport const relayStyles = (\n source: Document,\n destination: Document,\n overlay: HTMLElement,\n changed?: () => void,\n): { destination: HTMLElement; ready: Promise<void>; stop: () => void } => {\n const base = destination.createElement('base');\n base.href = source.baseURI;\n destination.head.append(base);\n const copies = new Map<Element, Element>();\n const sheets = destination.createElement('style');\n destination.head.append(sheets);\n const sync = () => {\n sheets.textContent = sheetText(source.adoptedStyleSheets);\n const sources = Array.from(source.querySelectorAll('meta[name=viewport],link[rel=stylesheet],style:not([data-overlay-relay-local])'));\n for (const [node, copy] of copies)\n if (!sources.includes(node)) {\n copy.remove();\n copies.delete(node);\n }\n for (const node of sources) {\n let copy = copies.get(node);\n if (!copy) {\n copy = node.cloneNode(true) as Element;\n copies.set(node, copy);\n } else {\n for (const attribute of Array.from(copy.attributes)) copy.removeAttribute(attribute.name);\n for (const attribute of Array.from(node.attributes)) copy.setAttribute(attribute.name, attribute.value);\n copy.textContent = node.textContent;\n }\n destination.head.append(copy);\n }\n destination.head.append(surface);\n };\n const surface = destination.createElement('style');\n surface.textContent = 'html,body{background:transparent!important}';\n const observers: MutationObserver[] = [];\n const mirror = (node: Element, target: HTMLElement, flatten = false) => {\n const update = () => {\n for (const attribute of Array.from(target.attributes)) if (!node.hasAttribute(attribute.name)) target.removeAttribute(attribute.name);\n for (const attribute of Array.from(node.attributes)) target.setAttribute(attribute.name, attribute.value);\n // The popover content must not inherit the source page's rail layout.\n if (target.localName === 'ion-app') target.classList.remove('ios-theme-vertical-bars');\n if (flatten) target.style.setProperty('display', 'contents', 'important');\n };\n update();\n const observer = new MutationObserver(() => {\n update();\n changed?.();\n });\n observer.observe(node, { attributes: true });\n observers.push(observer);\n };\n mirror(source.documentElement, destination.documentElement);\n mirror(source.body, destination.body);\n const ancestors: Element[] = [];\n for (let node = overlay.parentElement; node && node !== source.body; node = node.parentElement) ancestors.unshift(node);\n let parent = destination.body;\n for (const node of ancestors) {\n const shell = destination.createElement(node.localName);\n mirror(node, shell, true);\n parent.append(shell);\n parent = shell;\n }\n sync();\n // A copied external stylesheet can still be loading when Ionic's content is\n // ready. Do not expose an unstyled first native frame (notably button sizes).\n const ready = Promise.all(\n Array.from(destination.querySelectorAll<HTMLLinkElement>('link[rel=stylesheet]'), (link) => {\n if (link.sheet) return Promise.resolve();\n return new Promise<void>((resolve, reject) => {\n link.addEventListener('load', () => resolve(), { once: true });\n link.addEventListener('error', () => reject(new Error('Popover stylesheet unavailable')), { once: true });\n });\n }),\n ).then(() => undefined);\n const observer = new MutationObserver(() => {\n sync();\n changed?.();\n });\n observer.observe(source.head, { subtree: true, childList: true, characterData: true, attributes: true });\n observers.push(observer);\n return { destination: parent, ready, stop: () => observers.forEach((item) => item.disconnect()) };\n};\n\n// Compare the live content at the same proposed size before exposing a native\n// surface. Ancestor/sibling selectors and container queries can change when\n// ancestor shells become display:contents; unsupported contexts stay on Web.\nexport const captureRelayAppearance = (roots: Element[]): (() => boolean) => {\n const properties = [\n 'display',\n 'position',\n 'box-sizing',\n 'color',\n 'background-color',\n 'background-image',\n 'background-size',\n 'background-position',\n 'box-shadow',\n 'visibility',\n 'opacity',\n 'transform',\n 'filter',\n 'overflow',\n 'text-decoration',\n 'font-family',\n 'font-size',\n 'font-weight',\n 'font-style',\n 'line-height',\n 'letter-spacing',\n 'text-align',\n 'text-transform',\n 'white-space',\n 'direction',\n 'padding-top',\n 'padding-right',\n 'padding-bottom',\n 'padding-left',\n 'margin-top',\n 'margin-right',\n 'margin-bottom',\n 'margin-left',\n 'border-top-width',\n 'border-right-width',\n 'border-bottom-width',\n 'border-left-width',\n 'border-top-color',\n 'border-radius',\n 'flex-direction',\n 'flex-wrap',\n 'justify-content',\n 'align-items',\n 'grid-template-columns',\n 'grid-template-rows',\n 'gap',\n 'width',\n 'height',\n ];\n const snapshots: { node: Element; values: string[] }[] = [];\n const values = (node: Element) => {\n const css = node.ownerDocument.defaultView!.getComputedStyle(node);\n return properties.map((property) => css.getPropertyValue(property));\n };\n const visit = (node: Element) => {\n if (snapshots.length >= 1000) throw new Error('Popover content too complex to verify native styling');\n snapshots.push({ node, values: values(node) });\n Array.from(node.children).forEach(visit);\n if (node.shadowRoot)\n Array.from(node.shadowRoot.children)\n .filter((child) => !child.matches('style, link'))\n .forEach(visit);\n };\n roots.forEach(visit);\n return () =>\n snapshots.every(({ node, values: before }) =>\n values(node).every((value, index) => {\n return value === before[index];\n }),\n );\n};\n\n/** Flattening an ancestor must not remove a containing block or visual effect. */\nexport const relayLayoutSupported = (overlay: HTMLElement): boolean => {\n const win = overlay.ownerDocument.defaultView!;\n for (let node = overlay.parentElement; node; node = node.parentElement) {\n const css = win.getComputedStyle(node);\n if (\n css.containerType !== 'normal' ||\n (css.transform !== 'none' && !new DOMMatrixReadOnly(css.transform).isIdentity) ||\n css.perspective !== 'none' ||\n css.filter !== 'none' ||\n css.opacity !== '1'\n )\n return false;\n }\n return true;\n};\n"],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- //#region src/native/prehide.d.ts
2
- export declare const prehideVerticalBarsToolbarSources: (doc: Document) => {
3
- suspend: () => () => void;
4
- stop: () => void;
5
- };
6
- //#endregion
7
- //# sourceMappingURL=prehide.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prehide.d.ts","names":[],"sources":["../../src/native/prehide.ts"],"mappings":";qBAmCa,oCAAqC,KAAK;EAAa;EAA2B"}
@@ -1,230 +0,0 @@
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, syncToolbarText, 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/components/index.js";
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";
8
- const isHtmlElement = (node) => !!node && node.nodeType === 1;
9
- const asElement = (node) => isHtmlElement(node) ? node : void 0;
10
- const backSupported = (element) => {
11
- const back = element;
12
- return back.icon === void 0 && back.color === void 0 && !!back.shadowRoot;
13
- };
14
- const eligibleBack = verticalBarsBackCandidate;
15
- const eligible = verticalBarsActionCandidate;
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
- syncToolbarText(doc);
103
- const verticalBars = root();
104
- if (!verticalBars) {
105
- Array.from(scopes.keys()).forEach(release);
106
- return;
107
- }
108
- for (const scope of scopes.keys()) if (!scope.isConnected || !modalUsesVerticalBars(scope)) release(scope);
109
- for (const [element, pending] of pendingBacks) if (element.shadowRoot || element.classList.contains("hydrated")) capture(pending.scope);
110
- verticalBars.querySelectorAll(".ion-page:not(ion-app, body, .ion-page-hidden)").forEach(capture);
111
- verticalBars.querySelectorAll(sourceSelector).forEach((element) => {
112
- if (routedPage(element) || element.closest(overlays)) return;
113
- const scope = element.closest("ion-toolbar") ?? (element.matches("ion-back-button") ? element : null);
114
- if (scope) capture(scope);
115
- });
116
- for (const owned of scopes.values()) for (const element of owned) {
117
- const groupOwnsChildren = element.parentElement?.matches("ion-buttons") && verticalBarsOwned(element.parentElement) && childElements(element.parentElement).every((child) => verticalBarsOwned(child));
118
- 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)));
119
- element.classList.toggle(prehiddenClass, hide);
120
- if (element.matches("ion-back-button")) element.classList.toggle(verticalBarsBackWebClass, !hide);
121
- }
122
- };
123
- const onWillEnter = (event) => {
124
- const page = asElement(event.target);
125
- if (page?.matches(".ion-page")) {
126
- verticalBarsPages.lifecycle(event);
127
- release(page);
128
- capture(page);
129
- reconcile();
130
- }
131
- };
132
- const onPageLifecycle = (event) => {
133
- verticalBarsPages.lifecycle(event);
134
- if (event.type !== LIFECYCLE_DID_LEAVE) return;
135
- const page = asElement(event.target);
136
- if (page) release(page);
137
- };
138
- const onTransitionCanceled = (event) => {
139
- const leaving = asElement(event.target);
140
- if (!leaving) return;
141
- const entering = event.detail?.entering;
142
- verticalBarsPages.cancel(entering, leaving);
143
- reconcile();
144
- };
145
- doc.addEventListener(LIFECYCLE_WILL_ENTER, onWillEnter, {
146
- capture: true,
147
- signal: listeners.signal
148
- });
149
- for (const name of [
150
- LIFECYCLE_WILL_LEAVE,
151
- LIFECYCLE_DID_ENTER,
152
- LIFECYCLE_DID_LEAVE
153
- ]) doc.addEventListener(name, onPageLifecycle, {
154
- capture: true,
155
- signal: listeners.signal
156
- });
157
- doc.addEventListener(VERTICAL_BARS_TRANSITION_CANCELED, onTransitionCanceled, {
158
- capture: true,
159
- signal: listeners.signal
160
- });
161
- doc.defaultView?.addEventListener("nativeUIShellRefresh", reconcile, { signal: listeners.signal });
162
- reconcile();
163
- const mutationRelevant = (record) => {
164
- if (record.type === "characterData") return record.target.parentElement?.matches("ion-toolbar") === true;
165
- if (record.type === "childList" && asElement(record.target)?.matches("ion-toolbar")) return true;
166
- 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`)));
167
- if (record.attributeName !== "class") return true;
168
- const current = record.target.className;
169
- const previous = record.oldValue ?? "";
170
- const withoutOwned = (value) => value.split(/\s+/).filter((name) => name && ![
171
- "ios-theme-native-ui-shell-prehidden",
172
- "ios-theme-native-ui-shell-prehide",
173
- "ios-theme-vertical-bars-back-web-owned"
174
- ].includes(name)).join(" ");
175
- return typeof current !== "string" || withoutOwned(previous) !== withoutOwned(current);
176
- };
177
- let scheduled = false;
178
- const observer = new ((doc.defaultView?.MutationObserver) ?? MutationObserver)((records) => {
179
- if (scheduled || stopped || !records.some(mutationRelevant)) return;
180
- scheduled = true;
181
- queueMicrotask(() => {
182
- scheduled = false;
183
- if (!stopped) reconcile();
184
- });
185
- });
186
- observer.observe(doc.documentElement, {
187
- subtree: true,
188
- childList: true,
189
- characterData: true,
190
- attributes: true,
191
- attributeOldValue: true,
192
- attributeFilter: [
193
- "class",
194
- "data-shell",
195
- "hidden",
196
- "inert",
197
- "icon",
198
- "color"
199
- ]
200
- });
201
- return {
202
- suspend: () => {
203
- if (stopped) return () => {};
204
- suspended++;
205
- doc.documentElement.classList.remove(prehideRootClass);
206
- reconcile();
207
- let resumed = false;
208
- return () => {
209
- if (resumed || stopped) return;
210
- resumed = true;
211
- if (--suspended === 0) {
212
- doc.documentElement.classList.add(prehideRootClass);
213
- reconcile();
214
- }
215
- };
216
- },
217
- stop: () => {
218
- if (stopped) return;
219
- stopped = true;
220
- observer.disconnect();
221
- listeners.abort();
222
- doc.documentElement.classList.remove(prehideRootClass);
223
- Array.from(scopes.keys()).forEach(release);
224
- }
225
- };
226
- };
227
- //#endregion
228
- export { prehideVerticalBarsToolbarSources };
229
-
230
- //# sourceMappingURL=prehide.js.map
@@ -1 +0,0 @@
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/components/index.js';\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 syncToolbarText,\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 syncToolbarText(doc);\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 === 'characterData') return record.target.parentElement?.matches('ion-toolbar') === true;\n if (record.type === 'childList' && asElement(record.target)?.matches('ion-toolbar')) return true;\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 characterData: 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,7 +0,0 @@
1
- import { NativeUIShellHandle, NativeUIShellOptions, NativeUIShellPlugin } from "./definitions.js";
2
- //#region src/native/runtime.d.ts
3
- export declare const createRuntime: (doc: Document, plugin: NativeUIShellPlugin, options?: NativeUIShellOptions, nativeVerticalBars?: () => boolean, verticalBarsOnly?: boolean) => Promise<NativeUIShellHandle & {
4
- retain: (deferActivation?: (id: string) => boolean) => () => void;
5
- }>;
6
- //#endregion
7
- //# sourceMappingURL=runtime.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runtime.d.ts","names":[],"sources":["../../src/native/runtime.ts"],"mappings":";;qBA+Ca,gBACX,KAAK,UACL,QAAQ,qBACR,UAAS,sBACT,oCACA,+BACC,QAAQ;EAAwB,SAAS,mBAAmB"}