@rdlabo/capacitor-native-ui 0.0.0-stage → 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 (261) hide show
  1. package/LICENSE +21 -0
  2. package/Package.swift +23 -0
  3. package/README.md +66 -2
  4. package/RdlaboCapacitorNativeUi.podspec +17 -0
  5. package/android/build.gradle +69 -0
  6. package/android/proguard-rules.pro +0 -0
  7. package/android/src/main/AndroidManifest.xml +1 -0
  8. package/android/src/main/java/dev/rdlabo/capacitor/nativeui/NativeUI.kt +51 -0
  9. package/android/src/main/java/dev/rdlabo/capacitor/nativeui/NativeUIPlugin.kt +192 -0
  10. package/android/src/main/java/dev/rdlabo/capacitor/nativeui/NativeUISnapshot.kt +57 -0
  11. package/dist/_virtual/_rolldown/runtime.js +13 -0
  12. package/dist/core.d.ts +4 -0
  13. package/dist/core.js +3 -0
  14. package/dist/native/activation.d.ts +14 -0
  15. package/dist/native/activation.d.ts.map +1 -0
  16. package/dist/native/activation.js +305 -0
  17. package/dist/native/activation.js.map +1 -0
  18. package/dist/native/components/index.d.ts +19 -0
  19. package/dist/native/components/index.d.ts.map +1 -0
  20. package/dist/native/components/index.js +38 -0
  21. package/dist/native/components/index.js.map +1 -0
  22. package/dist/native/components/ion-back-button.d.ts +10 -0
  23. package/dist/native/components/ion-back-button.d.ts.map +1 -0
  24. package/dist/native/components/ion-back-button.js +21 -0
  25. package/dist/native/components/ion-back-button.js.map +1 -0
  26. package/dist/native/components/ion-button.d.ts +10 -0
  27. package/dist/native/components/ion-button.d.ts.map +1 -0
  28. package/dist/native/components/ion-button.js +25 -0
  29. package/dist/native/components/ion-button.js.map +1 -0
  30. package/dist/native/components/ion-buttons.d.ts +11 -0
  31. package/dist/native/components/ion-buttons.d.ts.map +1 -0
  32. package/dist/native/components/ion-buttons.js +30 -0
  33. package/dist/native/components/ion-buttons.js.map +1 -0
  34. package/dist/native/components/ion-fab.d.ts +10 -0
  35. package/dist/native/components/ion-fab.d.ts.map +1 -0
  36. package/dist/native/components/ion-fab.js +132 -0
  37. package/dist/native/components/ion-fab.js.map +1 -0
  38. package/dist/native/components/ion-menu-button.d.ts +13 -0
  39. package/dist/native/components/ion-menu-button.d.ts.map +1 -0
  40. package/dist/native/components/ion-menu-button.js +44 -0
  41. package/dist/native/components/ion-menu-button.js.map +1 -0
  42. package/dist/native/components/ion-segment.d.ts +11 -0
  43. package/dist/native/components/ion-segment.d.ts.map +1 -0
  44. package/dist/native/components/ion-segment.js +30 -0
  45. package/dist/native/components/ion-segment.js.map +1 -0
  46. package/dist/native/components/ion-tab-bar.d.ts +11 -0
  47. package/dist/native/components/ion-tab-bar.d.ts.map +1 -0
  48. package/dist/native/components/ion-tab-bar.js +50 -0
  49. package/dist/native/components/ion-tab-bar.js.map +1 -0
  50. package/dist/native/components/searchable-tabs.d.ts +20 -0
  51. package/dist/native/components/searchable-tabs.d.ts.map +1 -0
  52. package/dist/native/components/searchable-tabs.js +413 -0
  53. package/dist/native/components/searchable-tabs.js.map +1 -0
  54. package/dist/native/definitions.d.ts +237 -0
  55. package/dist/native/definitions.d.ts.map +1 -0
  56. package/dist/native/definitions.js +0 -0
  57. package/dist/native/extensions.d.ts +31 -0
  58. package/dist/native/extensions.d.ts.map +1 -0
  59. package/dist/native/extensions.js +122 -0
  60. package/dist/native/extensions.js.map +1 -0
  61. package/dist/native/foldable/fold-state.d.ts +5 -0
  62. package/dist/native/foldable/fold-state.d.ts.map +1 -0
  63. package/dist/native/foldable/fold-state.js +15 -0
  64. package/dist/native/foldable/fold-state.js.map +1 -0
  65. package/dist/native/foldable/types.d.ts +12 -0
  66. package/dist/native/foldable/types.d.ts.map +1 -0
  67. package/dist/native/foldable/types.js +0 -0
  68. package/dist/native/html.d.ts +9 -0
  69. package/dist/native/html.d.ts.map +1 -0
  70. package/dist/native/html.js +197 -0
  71. package/dist/native/html.js.map +1 -0
  72. package/dist/native/index.d.ts +10 -0
  73. package/dist/native/index.d.ts.map +1 -0
  74. package/dist/native/index.js +19 -0
  75. package/dist/native/index.js.map +1 -0
  76. package/dist/native/legacy-layout.d.ts +5 -0
  77. package/dist/native/legacy-layout.d.ts.map +1 -0
  78. package/dist/native/legacy-layout.js +27 -0
  79. package/dist/native/legacy-layout.js.map +1 -0
  80. package/dist/native/overlays/content.d.ts +4 -0
  81. package/dist/native/overlays/content.d.ts.map +1 -0
  82. package/dist/native/overlays/content.js +51 -0
  83. package/dist/native/overlays/content.js.map +1 -0
  84. package/dist/native/overlays/controller.d.ts +8 -0
  85. package/dist/native/overlays/controller.d.ts.map +1 -0
  86. package/dist/native/overlays/controller.js +285 -0
  87. package/dist/native/overlays/controller.js.map +1 -0
  88. package/dist/native/overlays/dialog-animation.d.ts +9 -0
  89. package/dist/native/overlays/dialog-animation.d.ts.map +1 -0
  90. package/dist/native/overlays/dialog-animation.js +53 -0
  91. package/dist/native/overlays/dialog-animation.js.map +1 -0
  92. package/dist/native/overlays/dismiss-animation.d.ts +4 -0
  93. package/dist/native/overlays/dismiss-animation.d.ts.map +1 -0
  94. package/dist/native/overlays/dismiss-animation.js +18 -0
  95. package/dist/native/overlays/dismiss-animation.js.map +1 -0
  96. package/dist/native/overlays/focus.d.ts +5 -0
  97. package/dist/native/overlays/focus.d.ts.map +1 -0
  98. package/dist/native/overlays/focus.js +59 -0
  99. package/dist/native/overlays/focus.js.map +1 -0
  100. package/dist/native/overlays/popover.d.ts +12 -0
  101. package/dist/native/overlays/popover.d.ts.map +1 -0
  102. package/dist/native/overlays/popover.js +110 -0
  103. package/dist/native/overlays/popover.js.map +1 -0
  104. package/dist/native/overlays/styles.d.ts +11 -0
  105. package/dist/native/overlays/styles.d.ts.map +1 -0
  106. package/dist/native/overlays/styles.js +167 -0
  107. package/dist/native/overlays/styles.js.map +1 -0
  108. package/dist/native/prehide.d.ts +8 -0
  109. package/dist/native/prehide.d.ts.map +1 -0
  110. package/dist/native/prehide.js +238 -0
  111. package/dist/native/prehide.js.map +1 -0
  112. package/dist/native/runtime.d.ts +7 -0
  113. package/dist/native/runtime.d.ts.map +1 -0
  114. package/dist/native/runtime.js +776 -0
  115. package/dist/native/runtime.js.map +1 -0
  116. package/dist/native/shared/bridge.d.ts +6 -0
  117. package/dist/native/shared/bridge.d.ts.map +1 -0
  118. package/dist/native/shared/bridge.js +18 -0
  119. package/dist/native/shared/bridge.js.map +1 -0
  120. package/dist/native/shared/candidate.d.ts +25 -0
  121. package/dist/native/shared/candidate.d.ts.map +1 -0
  122. package/dist/native/shared/candidate.js +106 -0
  123. package/dist/native/shared/candidate.js.map +1 -0
  124. package/dist/native/shared/clipping.d.ts +5 -0
  125. package/dist/native/shared/clipping.d.ts.map +1 -0
  126. package/dist/native/shared/clipping.js +26 -0
  127. package/dist/native/shared/clipping.js.map +1 -0
  128. package/dist/native/shared/control-options.d.ts +6 -0
  129. package/dist/native/shared/control-options.d.ts.map +1 -0
  130. package/dist/native/shared/control-options.js +17 -0
  131. package/dist/native/shared/control-options.js.map +1 -0
  132. package/dist/native/shared/crossfade.d.ts +12 -0
  133. package/dist/native/shared/crossfade.d.ts.map +1 -0
  134. package/dist/native/shared/crossfade.js +67 -0
  135. package/dist/native/shared/crossfade.js.map +1 -0
  136. package/dist/native/shared/diagnostics.d.ts +4 -0
  137. package/dist/native/shared/diagnostics.d.ts.map +1 -0
  138. package/dist/native/shared/diagnostics.js +18 -0
  139. package/dist/native/shared/diagnostics.js.map +1 -0
  140. package/dist/native/shared/dom.d.ts +46 -0
  141. package/dist/native/shared/dom.d.ts.map +1 -0
  142. package/dist/native/shared/dom.js +180 -0
  143. package/dist/native/shared/dom.js.map +1 -0
  144. package/dist/native/shared/events.d.ts +15 -0
  145. package/dist/native/shared/events.d.ts.map +1 -0
  146. package/dist/native/shared/events.js +17 -0
  147. package/dist/native/shared/events.js.map +1 -0
  148. package/dist/native/shared/icons.d.ts +8 -0
  149. package/dist/native/shared/icons.d.ts.map +1 -0
  150. package/dist/native/shared/icons.js +61 -0
  151. package/dist/native/shared/icons.js.map +1 -0
  152. package/dist/native/shared/modal.d.ts +10 -0
  153. package/dist/native/shared/modal.d.ts.map +1 -0
  154. package/dist/native/shared/modal.js +160 -0
  155. package/dist/native/shared/modal.js.map +1 -0
  156. package/dist/native/shared/projection-id.d.ts +4 -0
  157. package/dist/native/shared/projection-id.d.ts.map +1 -0
  158. package/dist/native/shared/projection-id.js +7 -0
  159. package/dist/native/shared/projection-id.js.map +1 -0
  160. package/dist/native/shared/toolbar-options.d.ts +13 -0
  161. package/dist/native/shared/toolbar-options.d.ts.map +1 -0
  162. package/dist/native/shared/toolbar-options.js +28 -0
  163. package/dist/native/shared/toolbar-options.js.map +1 -0
  164. package/dist/native/shared/vertical-bars-geometry.d.ts +10 -0
  165. package/dist/native/shared/vertical-bars-geometry.d.ts.map +1 -0
  166. package/dist/native/shared/vertical-bars-geometry.js +85 -0
  167. package/dist/native/shared/vertical-bars-geometry.js.map +1 -0
  168. package/dist/native/startup.d.ts +8 -0
  169. package/dist/native/startup.d.ts.map +1 -0
  170. package/dist/native/startup.js +70 -0
  171. package/dist/native/startup.js.map +1 -0
  172. package/dist/native/vertical-bars-web-search.d.ts +10 -0
  173. package/dist/native/vertical-bars-web-search.d.ts.map +1 -0
  174. package/dist/native/vertical-bars-web-search.js +90 -0
  175. package/dist/native/vertical-bars-web-search.js.map +1 -0
  176. package/dist/native/vertical-bars-web.d.ts +5 -0
  177. package/dist/native/vertical-bars-web.d.ts.map +1 -0
  178. package/dist/native/vertical-bars-web.js +422 -0
  179. package/dist/native/vertical-bars-web.js.map +1 -0
  180. package/dist/native-integration/index.d.ts +25 -0
  181. package/dist/native-integration/index.d.ts.map +1 -0
  182. package/dist/native-integration/index.js +33 -0
  183. package/dist/native-integration/index.js.map +1 -0
  184. package/dist/vertical-bars.d.ts +6 -0
  185. package/dist/vertical-bars.js +5 -0
  186. package/docs/appearance.md +45 -0
  187. package/docs/configuration.md +219 -0
  188. package/docs/framework-independent.md +107 -0
  189. package/docs/ionic-vertical-bars.md +173 -0
  190. package/docs/migration.md +184 -0
  191. package/docs/native-ui-extensions.md +394 -0
  192. package/docs/native-ui.md +528 -0
  193. package/docs/setup.md +224 -0
  194. package/docs/vertical-bars.md +431 -0
  195. package/ios/Sources/NativeUIPlugin/Components/NativeUIButton.swift +71 -0
  196. package/ios/Sources/NativeUIPlugin/Components/NativeUIButtons.swift +24 -0
  197. package/ios/Sources/NativeUIPlugin/Components/NativeUIComponents.swift +19 -0
  198. package/ios/Sources/NativeUIPlugin/Components/NativeUIFab.swift +80 -0
  199. package/ios/Sources/NativeUIPlugin/Components/NativeUISearchController.swift +439 -0
  200. package/ios/Sources/NativeUIPlugin/Components/NativeUISegment.swift +91 -0
  201. package/ios/Sources/NativeUIPlugin/Components/NativeUITabBar.swift +218 -0
  202. package/ios/Sources/NativeUIPlugin/Components/NativeUIVerticalBars.swift +590 -0
  203. package/ios/Sources/NativeUIPlugin/Components/NativeUIVerticalSearch.swift +118 -0
  204. package/ios/Sources/NativeUIPlugin/Extensions/NativeUI.swift +178 -0
  205. package/ios/Sources/NativeUIPlugin/Extensions/NativeUIRendering.swift +38 -0
  206. package/ios/Sources/NativeUIPlugin/NativeUIPlugin.swift +615 -0
  207. package/ios/Sources/NativeUIPlugin/Overlays/NativeUIOverlayController.swift +119 -0
  208. package/ios/Sources/NativeUIPlugin/Overlays/NativeUIOverlayHost.swift +75 -0
  209. package/ios/Sources/NativeUIPlugin/Shared/NativeUIControlRendering.swift +21 -0
  210. package/ios/Sources/NativeUIPlugin/Shared/NativeUICrossfade.swift +35 -0
  211. package/ios/Sources/NativeUIPlugin/Shared/NativeUIHost.swift +8 -0
  212. package/ios/Sources/NativeUIPlugin/Shared/NativeUISnapshot.swift +161 -0
  213. package/ios/Sources/NativeUIPlugin/Shared/NativeUIVerticalBarsGeometry.swift +52 -0
  214. package/ios/Tests/NativeUIPluginTests/NativeUIExtensionTests.swift +165 -0
  215. package/ios/Tests/NativeUIPluginTests/NativeUISnapshotTests.swift +805 -0
  216. package/package.json +89 -4
  217. package/src/core.ts +14 -0
  218. package/src/native/activation.ts +385 -0
  219. package/src/native/components/index.ts +45 -0
  220. package/src/native/components/ion-back-button.ts +22 -0
  221. package/src/native/components/ion-button.ts +25 -0
  222. package/src/native/components/ion-buttons.ts +37 -0
  223. package/src/native/components/ion-fab.ts +151 -0
  224. package/src/native/components/ion-menu-button.ts +37 -0
  225. package/src/native/components/ion-segment.ts +27 -0
  226. package/src/native/components/ion-tab-bar.ts +50 -0
  227. package/src/native/components/searchable-tabs.ts +499 -0
  228. package/src/native/definitions.ts +274 -0
  229. package/src/native/extensions.ts +176 -0
  230. package/src/native/foldable/fold-state.ts +10 -0
  231. package/src/native/foldable/types.ts +4 -0
  232. package/src/native/html.ts +199 -0
  233. package/src/native/index.ts +32 -0
  234. package/src/native/legacy-layout.ts +21 -0
  235. package/src/native/overlays/content.ts +51 -0
  236. package/src/native/overlays/controller.ts +349 -0
  237. package/src/native/overlays/dialog-animation.ts +53 -0
  238. package/src/native/overlays/dismiss-animation.ts +15 -0
  239. package/src/native/overlays/focus.ts +64 -0
  240. package/src/native/overlays/popover.ts +120 -0
  241. package/src/native/overlays/styles.ts +181 -0
  242. package/src/native/prehide.ts +285 -0
  243. package/src/native/runtime.ts +979 -0
  244. package/src/native/shared/bridge.ts +18 -0
  245. package/src/native/shared/candidate.ts +162 -0
  246. package/src/native/shared/clipping.ts +24 -0
  247. package/src/native/shared/control-options.ts +20 -0
  248. package/src/native/shared/crossfade.ts +67 -0
  249. package/src/native/shared/diagnostics.ts +13 -0
  250. package/src/native/shared/dom.ts +304 -0
  251. package/src/native/shared/events.ts +14 -0
  252. package/src/native/shared/icons.ts +57 -0
  253. package/src/native/shared/modal.ts +157 -0
  254. package/src/native/shared/projection-id.ts +2 -0
  255. package/src/native/shared/toolbar-options.ts +49 -0
  256. package/src/native/shared/vertical-bars-geometry.ts +80 -0
  257. package/src/native/startup.ts +68 -0
  258. package/src/native/vertical-bars-web-search.ts +86 -0
  259. package/src/native/vertical-bars-web.ts +500 -0
  260. package/src/native-integration/index.ts +49 -0
  261. package/src/vertical-bars.ts +12 -0
@@ -0,0 +1,7 @@
1
+ //#region src/native/shared/projection-id.ts
2
+ /** Internal identity used to anchor overlays to their native control. */
3
+ const projectionIds = /* @__PURE__ */ new WeakMap();
4
+ //#endregion
5
+ export { projectionIds };
6
+
7
+ //# sourceMappingURL=projection-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection-id.js","names":[],"sources":["../../../src/native/shared/projection-id.ts"],"sourcesContent":["/** Internal identity used to anchor overlays to their native control. */\nexport const projectionIds = new WeakMap<Element, string>();\n"],"mappings":";;AACA,MAAa,gCAAgB,IAAI,QAAyB"}
@@ -0,0 +1,13 @@
1
+ import { VerticalControlAreaOptions } from "../definitions.js";
2
+ //#region src/native/shared/toolbar-options.d.ts
3
+ export declare const toolbarOptions: (options: VerticalControlAreaOptions, vertical: boolean) => {
4
+ buttonGroup: boolean;
5
+ button: boolean;
6
+ backButton: boolean;
7
+ };
8
+ export declare const localToolbarOption: (element: HTMLElement, vertical: boolean) => boolean | undefined;
9
+ export declare const horizontalSelected: (element: HTMLElement, options: VerticalControlAreaOptions) => boolean;
10
+ export declare const horizontalToolbarGroup: (element: HTMLElement, options: VerticalControlAreaOptions) => boolean;
11
+ export declare const inVerticalToolbarLayout: (element: HTMLElement) => boolean;
12
+ //#endregion
13
+ //# sourceMappingURL=toolbar-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar-options.d.ts","names":[],"sources":["../../../src/native/shared/toolbar-options.ts"],"mappings":";;qBAKa,iBAAkB,SAAS,4BAA4B;;;;;qBAMvD,qBAAsB,SAAS,aAAa;qBAK5C,qBAAsB,SAAS,aAAa,SAAS;qBAQrD,yBAA0B,SAAS,aAAa,SAAS;qBAuBzD,0BAA2B,SAAS"}
@@ -0,0 +1,28 @@
1
+ import { controlDefault } from "./control-options.js";
2
+ import { modalUsesVerticalBars } from "./modal.js";
3
+ import { childElements, inFixedToolbar, isExcluded, isNativeUIDisabled } from "./dom.js";
4
+ //#region src/native/shared/toolbar-options.ts
5
+ const toolbarOptions = (options, vertical) => ({
6
+ buttonGroup: controlDefault(options, "buttonGroup", vertical),
7
+ button: controlDefault(options, "button", vertical),
8
+ backButton: controlDefault(options, "backButton", vertical)
9
+ });
10
+ const localToolbarOption = (element, vertical) => {
11
+ const value = element.getAttribute(vertical ? "data-vertical-bars" : "data-horizontal-bars");
12
+ return value === "true" ? true : value === "false" ? false : void 0;
13
+ };
14
+ const horizontalSelected = (element, options) => {
15
+ const group = element.parentElement;
16
+ if (group?.matches("ion-buttons") && isNativeUIDisabled(group)) return false;
17
+ return localToolbarOption(element, false) ?? toolbarOptions(options, false)[element.matches("ion-back-button") ? "backButton" : "button"];
18
+ };
19
+ const horizontalToolbarGroup = (element, options) => {
20
+ if (!element.matches("ion-buttons.ios") || !(localToolbarOption(element, false) ?? toolbarOptions(options, false).buttonGroup) || !inFixedToolbar(element) || isExcluded(element) || isNativeUIDisabled(element)) return false;
21
+ const children = childElements(element);
22
+ return children.length > 0 && children.every((child) => horizontalSelected(child, options) && !isExcluded(child) && !isNativeUIDisabled(child) && (child.matches("ion-menu-button.ios") || children.length > 1 && child.matches("ion-button.ios.button-clear") && child.fill === "clear"));
23
+ };
24
+ const inVerticalToolbarLayout = (element) => !element.closest("ion-menu, ion-popover") && modalUsesVerticalBars(element) && !!element.closest("ion-app.ios-theme-vertical-bars");
25
+ //#endregion
26
+ export { horizontalSelected, horizontalToolbarGroup, inVerticalToolbarLayout, localToolbarOption, toolbarOptions };
27
+
28
+ //# sourceMappingURL=toolbar-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar-options.js","names":[],"sources":["../../../src/native/shared/toolbar-options.ts"],"sourcesContent":["import { modalUsesVerticalBars } from './modal';\nimport type { VerticalControlAreaOptions } from '../definitions';\nimport { controlDefault } from './control-options';\nimport { childElements, inFixedToolbar, isExcluded, isNativeUIDisabled } from './dom';\n\nexport const toolbarOptions = (options: VerticalControlAreaOptions, vertical: boolean) => ({\n buttonGroup: controlDefault(options, 'buttonGroup', vertical),\n button: controlDefault(options, 'button', vertical),\n backButton: controlDefault(options, 'backButton', vertical),\n});\n\nexport const localToolbarOption = (element: HTMLElement, vertical: boolean): boolean | undefined => {\n const value = element.getAttribute(vertical ? 'data-vertical-bars' : 'data-horizontal-bars');\n return value === 'true' ? true : value === 'false' ? false : undefined;\n};\n\nexport const horizontalSelected = (element: HTMLElement, options: VerticalControlAreaOptions): boolean => {\n const group = element.parentElement;\n if (group?.matches('ion-buttons') && isNativeUIDisabled(group)) return false;\n return localToolbarOption(element, false) ?? toolbarOptions(options, false)[element.matches('ion-back-button') ? 'backButton' : 'button'];\n};\n\n// Group only if all original children qualify; otherwise selected actions remain individual.\n// Back navigation never joins an ordinary action group.\nexport const horizontalToolbarGroup = (element: HTMLElement, options: VerticalControlAreaOptions): boolean => {\n if (\n !element.matches('ion-buttons.ios') ||\n !(localToolbarOption(element, false) ?? toolbarOptions(options, false).buttonGroup) ||\n !inFixedToolbar(element) ||\n isExcluded(element) ||\n isNativeUIDisabled(element)\n )\n return false;\n const children = childElements(element);\n return (\n children.length > 0 &&\n children.every(\n (child) =>\n horizontalSelected(child, options) &&\n !isExcluded(child) &&\n !isNativeUIDisabled(child) &&\n (child.matches('ion-menu-button.ios') ||\n (children.length > 1 && child.matches('ion-button.ios.button-clear') && (child as HTMLIonButtonElement).fill === 'clear')),\n )\n );\n};\n\nexport const inVerticalToolbarLayout = (element: HTMLElement): boolean =>\n !element.closest('ion-menu, ion-popover') && modalUsesVerticalBars(element) && !!element.closest('ion-app.ios-theme-vertical-bars');\n"],"mappings":";;;;AAKA,MAAa,kBAAkB,SAAqC,cAAuB;CACzF,aAAa,eAAe,SAAS,eAAe,QAAQ;CAC5D,QAAQ,eAAe,SAAS,UAAU,QAAQ;CAClD,YAAY,eAAe,SAAS,cAAc,QAAQ;AAC5D;AAEA,MAAa,sBAAsB,SAAsB,aAA2C;CAClG,MAAM,QAAQ,QAAQ,aAAa,WAAW,uBAAuB,sBAAsB;CAC3F,OAAO,UAAU,SAAS,OAAO,UAAU,UAAU,QAAQ,KAAA;AAC/D;AAEA,MAAa,sBAAsB,SAAsB,YAAiD;CACxG,MAAM,QAAQ,QAAQ;CACtB,IAAI,OAAO,QAAQ,aAAa,KAAK,mBAAmB,KAAK,GAAG,OAAO;CACvE,OAAO,mBAAmB,SAAS,KAAK,KAAK,eAAe,SAAS,KAAK,CAAC,CAAC,QAAQ,QAAQ,iBAAiB,IAAI,eAAe;AAClI;AAIA,MAAa,0BAA0B,SAAsB,YAAiD;CAC5G,IACE,CAAC,QAAQ,QAAQ,iBAAiB,KAClC,EAAE,mBAAmB,SAAS,KAAK,KAAK,eAAe,SAAS,KAAK,CAAC,CAAC,gBACvE,CAAC,eAAe,OAAO,KACvB,WAAW,OAAO,KAClB,mBAAmB,OAAO,GAE1B,OAAO;CACT,MAAM,WAAW,cAAc,OAAO;CACtC,OACE,SAAS,SAAS,KAClB,SAAS,OACN,UACC,mBAAmB,OAAO,OAAO,KACjC,CAAC,WAAW,KAAK,KACjB,CAAC,mBAAmB,KAAK,MACxB,MAAM,QAAQ,qBAAqB,KACjC,SAAS,SAAS,KAAK,MAAM,QAAQ,6BAA6B,KAAM,MAA+B,SAAS,QACvH;AAEJ;AAEA,MAAa,2BAA2B,YACtC,CAAC,QAAQ,QAAQ,uBAAuB,KAAK,sBAAsB,OAAO,KAAK,CAAC,CAAC,QAAQ,QAAQ,iCAAiC"}
@@ -0,0 +1,10 @@
1
+ import { Frame } from "../definitions.js";
2
+ //#region src/native/shared/vertical-bars-geometry.d.ts
3
+ export declare const validVerticalBarFrame: (frame: Frame) => boolean;
4
+ export declare const forgetVerticalBarFrame: (element: Element) => boolean;
5
+ export declare const rememberVerticalBarFrame: (element: Element, frame: Frame) => void;
6
+ export declare const verticalBarFrame: (element: Element) => Frame | undefined;
7
+ export declare const alignVerticalBarClone: (clone: HTMLElement, source: Element, parent: HTMLElement) => void;
8
+ export declare const alignVerticalTabBar: (tabBar: HTMLElement, frame: Frame, items: Map<HTMLElement, Frame>) => (() => void);
9
+ //#endregion
10
+ //# sourceMappingURL=vertical-bars-geometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertical-bars-geometry.d.ts","names":[],"sources":["../../../src/native/shared/vertical-bars-geometry.ts"],"mappings":";;qBASa,wBAAyB,OAAO;qBAGhC,yBAA0B,SAAS;qBAEnC,2BAA4B,SAAS,SAAS,OAAO;qBAIrD,mBAAoB,SAAS,YAAU;qBAMvC,wBAAyB,OAAO,aAAa,QAAQ,SAAS,QAAQ;qBAqBtE,sBAAuB,QAAQ,aAAa,OAAO,OAAO,OAAO,IAAI,aAAa"}
@@ -0,0 +1,85 @@
1
+ //#region src/native/shared/vertical-bars-geometry.ts
2
+ const measurements = /* @__PURE__ */ new WeakMap();
3
+ const viewport = (element) => {
4
+ const win = element.ownerDocument.defaultView;
5
+ const classes = element.closest("ion-app")?.classList;
6
+ return `${win.innerWidth}:${win.innerHeight}:${classes?.contains("ios-theme-vertical-bars")}:${classes?.contains("ios-theme-vertical-bars-left")}`;
7
+ };
8
+ const validVerticalBarFrame = (frame) => [
9
+ frame.x,
10
+ frame.y,
11
+ frame.width,
12
+ frame.height
13
+ ].every(Number.isFinite) && frame.width > 0 && frame.height > 0;
14
+ const forgetVerticalBarFrame = (element) => measurements.delete(element);
15
+ const rememberVerticalBarFrame = (element, frame) => {
16
+ if (validVerticalBarFrame(frame)) measurements.set(element, {
17
+ frame,
18
+ viewport: viewport(element)
19
+ });
20
+ };
21
+ const verticalBarFrame = (element) => {
22
+ const saved = measurements.get(element);
23
+ return saved?.viewport === viewport(element) ? saved.frame : void 0;
24
+ };
25
+ /** Convert the native viewport rectangle into the clone's positioning container. */
26
+ const alignVerticalBarClone = (clone, source, parent) => {
27
+ const frame = verticalBarFrame(source);
28
+ if (!frame) return;
29
+ const origin = parent.getBoundingClientRect();
30
+ Object.assign(clone.style, {
31
+ position: "absolute",
32
+ left: `${frame.x - origin.left}px`,
33
+ top: `${frame.y - origin.top}px`,
34
+ right: "auto",
35
+ bottom: "auto",
36
+ width: `${frame.width}px`,
37
+ height: `${frame.height}px`,
38
+ minWidth: `${frame.width}px`,
39
+ maxWidth: `${frame.width}px`,
40
+ minHeight: `${frame.height}px`,
41
+ maxHeight: `${frame.height}px`,
42
+ margin: "0",
43
+ boxSizing: "border-box"
44
+ });
45
+ };
46
+ const alignVerticalTabBar = (tabBar, frame, items) => {
47
+ const doc = tabBar.ownerDocument;
48
+ const style = doc.createElement("style");
49
+ const token = `rail-${Math.random().toString(36).slice(2)}`;
50
+ const selector = `[data-native-rail-geometry="${token}"]`;
51
+ const origin = tabBar.offsetParent?.getBoundingClientRect() ?? {
52
+ left: 0,
53
+ top: 0
54
+ };
55
+ tabBar.setAttribute("data-native-rail-geometry", token);
56
+ const box = (rect, x, y) => `position:absolute!important;left:${rect.x - x}px!important;top:${rect.y - y}px!important;right:auto!important;bottom:auto!important;width:${rect.width}px!important;min-width:${rect.width}px!important;max-width:${rect.width}px!important;height:${rect.height}px!important;min-height:${rect.height}px!important;max-height:${rect.height}px!important;margin:0!important;padding:0!important;box-sizing:border-box!important;`;
57
+ style.textContent = `${selector}{${box(frame, origin.left, origin.top)}}` + [...items].map(([element, rect]) => {
58
+ const index = Array.from(tabBar.children).indexOf(element) + 1;
59
+ return `${selector}>:nth-child(${index}){${box(rect, frame.x, frame.y)}}${selector}>:nth-child(${index})::part(native){min-height:0!important}`;
60
+ }).join("");
61
+ doc.head.append(style);
62
+ const win = doc.defaultView;
63
+ const measuredViewport = viewport(tabBar);
64
+ const stop = () => {
65
+ observer.disconnect();
66
+ win.removeEventListener("resize", stop);
67
+ style.remove();
68
+ if (tabBar.getAttribute("data-native-rail-geometry") === token) tabBar.removeAttribute("data-native-rail-geometry");
69
+ };
70
+ const observer = new MutationObserver((records) => {
71
+ if (viewport(tabBar) !== measuredViewport || records.some((record) => record.type === "childList")) stop();
72
+ });
73
+ observer.observe(tabBar, { childList: true });
74
+ const app = tabBar.closest("ion-app");
75
+ if (app) observer.observe(app, {
76
+ attributes: true,
77
+ attributeFilter: ["class"]
78
+ });
79
+ win.addEventListener("resize", stop);
80
+ return stop;
81
+ };
82
+ //#endregion
83
+ export { alignVerticalBarClone, alignVerticalTabBar, forgetVerticalBarFrame, rememberVerticalBarFrame, validVerticalBarFrame, verticalBarFrame };
84
+
85
+ //# sourceMappingURL=vertical-bars-geometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertical-bars-geometry.js","names":[],"sources":["../../../src/native/shared/vertical-bars-geometry.ts"],"sourcesContent":["import type { Frame } from '../definitions';\n\nconst measurements = new WeakMap<Element, { frame: Frame; viewport: string }>();\nconst viewport = (element: Element) => {\n const win = element.ownerDocument.defaultView!;\n const classes = element.closest('ion-app')?.classList;\n return `${win.innerWidth}:${win.innerHeight}:${classes?.contains('ios-theme-vertical-bars')}:${classes?.contains('ios-theme-vertical-bars-left')}`;\n};\n\nexport const validVerticalBarFrame = (frame: Frame) =>\n [frame.x, frame.y, frame.width, frame.height].every(Number.isFinite) && frame.width > 0 && frame.height > 0;\n\nexport const forgetVerticalBarFrame = (element: Element) => measurements.delete(element);\n\nexport const rememberVerticalBarFrame = (element: Element, frame: Frame) => {\n if (validVerticalBarFrame(frame)) measurements.set(element, { frame, viewport: viewport(element) });\n};\n\nexport const verticalBarFrame = (element: Element): Frame | undefined => {\n const saved = measurements.get(element);\n return saved?.viewport === viewport(element) ? saved.frame : undefined;\n};\n\n/** Convert the native viewport rectangle into the clone's positioning container. */\nexport const alignVerticalBarClone = (clone: HTMLElement, source: Element, parent: HTMLElement) => {\n const frame = verticalBarFrame(source);\n if (!frame) return;\n const origin = parent.getBoundingClientRect();\n Object.assign(clone.style, {\n position: 'absolute',\n left: `${frame.x - origin.left}px`,\n top: `${frame.y - origin.top}px`,\n right: 'auto',\n bottom: 'auto',\n width: `${frame.width}px`,\n height: `${frame.height}px`,\n minWidth: `${frame.width}px`,\n maxWidth: `${frame.width}px`,\n minHeight: `${frame.height}px`,\n maxHeight: `${frame.height}px`,\n margin: '0',\n boxSizing: 'border-box',\n });\n};\n\nexport const alignVerticalTabBar = (tabBar: HTMLElement, frame: Frame, items: Map<HTMLElement, Frame>): (() => void) => {\n const doc = tabBar.ownerDocument;\n const style = doc.createElement('style');\n const token = `rail-${Math.random().toString(36).slice(2)}`;\n const selector = `[data-native-rail-geometry=\"${token}\"]`;\n const origin = (tabBar.offsetParent as HTMLElement | null)?.getBoundingClientRect() ?? { left: 0, top: 0 };\n tabBar.setAttribute('data-native-rail-geometry', token);\n const box = (rect: Frame, x: number, y: number) =>\n `position:absolute!important;left:${rect.x - x}px!important;top:${rect.y - y}px!important;right:auto!important;bottom:auto!important;width:${rect.width}px!important;min-width:${rect.width}px!important;max-width:${rect.width}px!important;height:${rect.height}px!important;min-height:${rect.height}px!important;max-height:${rect.height}px!important;margin:0!important;padding:0!important;box-sizing:border-box!important;`;\n style.textContent =\n `${selector}{${box(frame, origin.left, origin.top)}}` +\n [...items]\n .map(([element, rect]) => {\n const index = Array.from(tabBar.children).indexOf(element) + 1;\n return `${selector}>:nth-child(${index}){${box(rect, frame.x, frame.y)}}${selector}>:nth-child(${index})::part(native){min-height:0!important}`;\n })\n .join('');\n doc.head.append(style);\n const win = doc.defaultView!;\n const measuredViewport = viewport(tabBar);\n const stop = () => {\n observer.disconnect();\n win.removeEventListener('resize', stop);\n style.remove();\n if (tabBar.getAttribute('data-native-rail-geometry') === token) tabBar.removeAttribute('data-native-rail-geometry');\n };\n const observer = new MutationObserver((records) => {\n if (viewport(tabBar) !== measuredViewport || records.some((record) => record.type === 'childList')) stop();\n });\n observer.observe(tabBar, { childList: true });\n const app = tabBar.closest('ion-app');\n if (app) observer.observe(app, { attributes: true, attributeFilter: ['class'] });\n win.addEventListener('resize', stop);\n return stop;\n};\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { NativeUIHandle, NativeUIOptions } from "./definitions.js";
2
+ import { enableNativeUI as enableNativeUI$1 } from "./activation.js";
3
+ //#region src/native/startup.d.ts
4
+ type OverlayFactory = Parameters<typeof enableNativeUI$1>[1];
5
+ export declare const startNativeUI: (input?: NativeUIOptions, overlayFactory?: OverlayFactory) => Promise<NativeUIHandle>;
6
+ export declare const enableNativeUI: (options?: NativeUIOptions) => Promise<NativeUIHandle>;
7
+ //#endregion
8
+ //# sourceMappingURL=startup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup.d.ts","names":["activate"],"sources":["../../src/native/startup.ts"],"mappings":";;;KAGK,iBAAiB,kBAAkBA;qBAI3B,gBAAuB,QAAO,iBAAsB,iBAAiB,mBAAiB,QAAQ;qBA4D9F,iBAAkB,UAAS,oBAAuB,QAAQ"}
@@ -0,0 +1,70 @@
1
+ import { enableNativeUI as enableNativeUI$1 } from "./activation.js";
2
+ //#region src/native/startup.ts
3
+ const handles = /* @__PURE__ */ new WeakMap();
4
+ /** Start one shell. Partial options override defaults; markup owns individual placement. */
5
+ const startNativeUI = async (input = {}, overlayFactory) => {
6
+ const root = input.root ?? (typeof document === "undefined" ? void 0 : document.body);
7
+ const bars = {
8
+ enabled: true,
9
+ ...input.verticalBars
10
+ };
11
+ const host = bars.placement?.webHost;
12
+ if (root && (!root.isConnected || root.ownerDocument !== document)) throw new Error("Native UI requires a connected root in the current document");
13
+ if (host && (!host.isConnected || host.ownerDocument !== document || root?.contains(host) || host.contains(root))) throw new Error("The Web rail host must be connected in the current document and outside the source root");
14
+ const options = {
15
+ ...input,
16
+ root,
17
+ source: "auto",
18
+ verticalBars: bars,
19
+ rail: host ? {
20
+ host,
21
+ edge: bars.placement?.edge === "leading" ? "left" : "right"
22
+ } : void 0
23
+ };
24
+ const runtime = await enableNativeUI$1(options, overlayFactory);
25
+ const existing = handles.get(runtime);
26
+ if (existing) return existing;
27
+ let stopped = false;
28
+ let queue = Promise.resolve();
29
+ const change = (enabled) => {
30
+ const operation = queue.then(async () => {
31
+ if (stopped) throw new Error("Native UI has been destroyed");
32
+ if (bars.enabled === enabled) return;
33
+ const lease = await runtime.suspend();
34
+ try {
35
+ if (stopped) throw new Error("Native UI has been destroyed");
36
+ bars.enabled = enabled;
37
+ root?.ownerDocument.defaultView?.dispatchEvent(new Event("nativeUIRefresh"));
38
+ } finally {
39
+ await lease.resume();
40
+ }
41
+ });
42
+ queue = operation.catch(() => {});
43
+ return operation;
44
+ };
45
+ let destruction;
46
+ const destroy = runtime.destroy.bind(runtime);
47
+ const handle = {
48
+ markForCheck: runtime.markForCheck.bind(runtime),
49
+ getStatus: runtime.getStatus.bind(runtime),
50
+ suspend: runtime.suspend.bind(runtime),
51
+ enableVerticalControlArea: () => change(true),
52
+ disableVerticalControlArea: () => change(false),
53
+ destroy() {
54
+ if (!destruction) {
55
+ stopped = true;
56
+ destruction = destroy();
57
+ }
58
+ return destruction;
59
+ }
60
+ };
61
+ const managed = Object.assign(runtime, handle);
62
+ handles.set(runtime, managed);
63
+ return managed;
64
+ };
65
+ /** Enable the shared standard shell without loading the optional Ionic overlay adapter. */
66
+ const enableNativeUI = (options = {}) => startNativeUI(options);
67
+ //#endregion
68
+ export { enableNativeUI, startNativeUI };
69
+
70
+ //# sourceMappingURL=startup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup.js","names":["activate"],"sources":["../../src/native/startup.ts"],"sourcesContent":["import { enableNativeUI as activate } from './activation';\nimport type { NativeUIRuntimeOptions, NativeUIHandle, NativeUIOptions, NativeUIRuntimeHandle } from './definitions';\n\ntype OverlayFactory = Parameters<typeof activate>[1];\nconst handles = new WeakMap<NativeUIRuntimeHandle, NativeUIHandle>();\n\n/** Start one shell. Partial options override defaults; markup owns individual placement. */\nexport const startNativeUI = async (input: NativeUIOptions = {}, overlayFactory?: OverlayFactory): Promise<NativeUIHandle> => {\n const root = input.root ?? (typeof document === 'undefined' ? undefined : document.body);\n const bars = { enabled: true, ...input.verticalBars };\n const host = bars.placement?.webHost;\n if (root && (!root.isConnected || root.ownerDocument !== document))\n throw new Error('Native UI requires a connected root in the current document');\n if (host && (!host.isConnected || host.ownerDocument !== document || root?.contains(host) || host.contains(root!)))\n throw new Error('The Web rail host must be connected in the current document and outside the source root');\n const options: NativeUIRuntimeOptions = {\n ...input,\n root,\n source: 'auto',\n verticalBars: bars,\n rail: host ? { host, edge: bars.placement?.edge === 'leading' ? 'left' : 'right' } : undefined,\n };\n const runtime = await activate(options, overlayFactory);\n const existing = handles.get(runtime);\n if (existing) return existing;\n let stopped = false;\n let queue = Promise.resolve();\n const change = (enabled: boolean) => {\n const operation = queue.then(async () => {\n if (stopped) throw new Error('Native UI has been destroyed');\n if (bars.enabled === enabled) return;\n // Retire both surfaces before changing ownership. Resume also waits for native reconciliation.\n const lease = await runtime.suspend();\n try {\n if (stopped) throw new Error('Native UI has been destroyed');\n bars.enabled = enabled;\n root?.ownerDocument.defaultView?.dispatchEvent(new Event('nativeUIRefresh'));\n } finally {\n await lease.resume();\n }\n });\n queue = operation.catch(() => {});\n return operation;\n };\n let destruction: Promise<void> | undefined;\n const destroy = runtime.destroy.bind(runtime);\n const handle: NativeUIHandle = {\n markForCheck: runtime.markForCheck.bind(runtime),\n getStatus: runtime.getStatus.bind(runtime),\n suspend: runtime.suspend.bind(runtime),\n enableVerticalControlArea: () => change(true),\n disableVerticalControlArea: () => change(false),\n destroy() {\n if (!destruction) {\n stopped = true;\n // Reserve native teardown immediately, preserving the shared startup queue.\n destruction = destroy();\n }\n return destruction;\n },\n };\n const managed = Object.assign(runtime, handle);\n handles.set(runtime, managed);\n return managed;\n};\n\n/** Enable the shared standard shell without loading the optional Ionic overlay adapter. */\nexport const enableNativeUI = (options: NativeUIOptions = {}): Promise<NativeUIHandle> => startNativeUI(options);\n"],"mappings":";;AAIA,MAAM,0BAAU,IAAI,QAA+C;;AAGnE,MAAa,gBAAgB,OAAO,QAAyB,CAAC,GAAG,mBAA6D;CAC5H,MAAM,OAAO,MAAM,SAAS,OAAO,aAAa,cAAc,KAAA,IAAY,SAAS;CACnF,MAAM,OAAO;EAAE,SAAS;EAAM,GAAG,MAAM;CAAa;CACpD,MAAM,OAAO,KAAK,WAAW;CAC7B,IAAI,SAAS,CAAC,KAAK,eAAe,KAAK,kBAAkB,WACvD,MAAM,IAAI,MAAM,6DAA6D;CAC/E,IAAI,SAAS,CAAC,KAAK,eAAe,KAAK,kBAAkB,YAAY,MAAM,SAAS,IAAI,KAAK,KAAK,SAAS,IAAK,IAC9G,MAAM,IAAI,MAAM,yFAAyF;CAC3G,MAAM,UAAkC;EACtC,GAAG;EACH;EACA,QAAQ;EACR,cAAc;EACd,MAAM,OAAO;GAAE;GAAM,MAAM,KAAK,WAAW,SAAS,YAAY,SAAS;EAAQ,IAAI,KAAA;CACvF;CACA,MAAM,UAAU,MAAMA,iBAAS,SAAS,cAAc;CACtD,MAAM,WAAW,QAAQ,IAAI,OAAO;CACpC,IAAI,UAAU,OAAO;CACrB,IAAI,UAAU;CACd,IAAI,QAAQ,QAAQ,QAAQ;CAC5B,MAAM,UAAU,YAAqB;EACnC,MAAM,YAAY,MAAM,KAAK,YAAY;GACvC,IAAI,SAAS,MAAM,IAAI,MAAM,8BAA8B;GAC3D,IAAI,KAAK,YAAY,SAAS;GAE9B,MAAM,QAAQ,MAAM,QAAQ,QAAQ;GACpC,IAAI;IACF,IAAI,SAAS,MAAM,IAAI,MAAM,8BAA8B;IAC3D,KAAK,UAAU;IACf,MAAM,cAAc,aAAa,cAAc,IAAI,MAAM,iBAAiB,CAAC;GAC7E,UAAU;IACR,MAAM,MAAM,OAAO;GACrB;EACF,CAAC;EACD,QAAQ,UAAU,YAAY,CAAC,CAAC;EAChC,OAAO;CACT;CACA,IAAI;CACJ,MAAM,UAAU,QAAQ,QAAQ,KAAK,OAAO;CAC5C,MAAM,SAAyB;EAC7B,cAAc,QAAQ,aAAa,KAAK,OAAO;EAC/C,WAAW,QAAQ,UAAU,KAAK,OAAO;EACzC,SAAS,QAAQ,QAAQ,KAAK,OAAO;EACrC,iCAAiC,OAAO,IAAI;EAC5C,kCAAkC,OAAO,KAAK;EAC9C,UAAU;GACR,IAAI,CAAC,aAAa;IAChB,UAAU;IAEV,cAAc,QAAQ;GACxB;GACA,OAAO;EACT;CACF;CACA,MAAM,UAAU,OAAO,OAAO,SAAS,MAAM;CAC7C,QAAQ,IAAI,SAAS,OAAO;CAC5B,OAAO;AACT;;AAGA,MAAa,kBAAkB,UAA2B,CAAC,MAA+B,cAAc,OAAO"}
@@ -0,0 +1,10 @@
1
+ //#region src/native/vertical-bars-web-search.d.ts
2
+ export declare const searchProjectionClass = "ios-theme-vertical-bars-search-projection";
3
+ export declare const createVerticalBarsWebSearch: (doc: Document, eligible: (element: HTMLElement) => boolean, refresh: () => void) => {
4
+ restore: (retire?: (surface: HTMLElement) => void) => void;
5
+ readonly surface: HTMLIonFabElement | undefined;
6
+ readonly source: HTMLElement | undefined;
7
+ update(root: HTMLElement): void;
8
+ };
9
+ //#endregion
10
+ //# sourceMappingURL=vertical-bars-web-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertical-bars-web-search.d.ts","names":[],"sources":["../../src/native/vertical-bars-web-search.ts"],"mappings":";qBAGa;qBAGA,8BAA+B,KAAK,UAAU,WAAW,SAAS,yBAAyB;EAM5E,UAAA,UAAC,SAAS;;;EAuBrB,OAAA,MAAA"}
@@ -0,0 +1,90 @@
1
+ import { activateProjectedElement, marker, unprojected } from "./shared/dom.js";
2
+ import { getNativeSearchBindings } from "../native-integration/index.js";
3
+ //#region src/native/vertical-bars-web-search.ts
4
+ const searchProjectionClass = "ios-theme-vertical-bars-search-projection";
5
+ /** Web counterpart of the system search button above the vertical tabs, or at the rail bottom without visible tabs. */
6
+ const createVerticalBarsWebSearch = (doc, eligible, refresh) => {
7
+ let binding;
8
+ let projection;
9
+ let container;
10
+ const iconObserver = new MutationObserver(refresh);
11
+ let previousAriaHidden = null;
12
+ const restore = (retire) => {
13
+ iconObserver.disconnect();
14
+ if (container) {
15
+ if (retire) retire(container);
16
+ else container.remove();
17
+ }
18
+ container = void 0;
19
+ projection = void 0;
20
+ if (binding) {
21
+ binding.trigger.removeAttribute(marker);
22
+ if (previousAriaHidden === null) binding.trigger.removeAttribute("aria-hidden");
23
+ else binding.trigger.setAttribute("aria-hidden", previousAriaHidden);
24
+ }
25
+ binding = void 0;
26
+ };
27
+ return {
28
+ restore,
29
+ get surface() {
30
+ return container;
31
+ },
32
+ get source() {
33
+ return binding?.trigger;
34
+ },
35
+ update(root) {
36
+ const next = unprojected(binding ? [binding.trigger] : [], () => getNativeSearchBindings(doc).find(({ trigger, footer }) => eligible(trigger) && eligible(footer)));
37
+ if (next !== binding || container?.parentElement !== root) restore();
38
+ if (!next) return;
39
+ if (!projection) {
40
+ binding = next;
41
+ previousAriaHidden = next.trigger.getAttribute("aria-hidden");
42
+ projection = next.trigger.cloneNode(true);
43
+ for (const name of [
44
+ "id",
45
+ "slot",
46
+ marker,
47
+ "aria-hidden",
48
+ "style"
49
+ ]) projection.removeAttribute(name);
50
+ container = doc.createElement("ion-fab");
51
+ container.setAttribute("mode", next.trigger.mode ?? "ios");
52
+ container.classList.add(searchProjectionClass, "ion-cloned-element");
53
+ projection.addEventListener("click", (event) => {
54
+ event.preventDefault();
55
+ event.stopImmediatePropagation();
56
+ activateProjectedElement(next.trigger);
57
+ }, { capture: true });
58
+ container.append(projection);
59
+ root.append(container);
60
+ next.trigger.setAttribute(marker, "");
61
+ next.trigger.setAttribute("aria-hidden", "true");
62
+ }
63
+ projection.setAttribute("aria-label", next.trigger.getAttribute("aria-label") ?? next.footer.querySelector("ion-searchbar")?.getAttribute("aria-label") ?? "Search");
64
+ const sourceIcon = next.trigger.querySelector("ion-icon");
65
+ const icon = projection.querySelector("ion-icon");
66
+ if (sourceIcon?.shadowRoot) iconObserver.observe(sourceIcon.shadowRoot, {
67
+ subtree: true,
68
+ childList: true,
69
+ attributes: true
70
+ });
71
+ if (sourceIcon && icon) {
72
+ icon.icon = sourceIcon.icon;
73
+ icon.name = sourceIcon.name;
74
+ icon.src = sourceIcon.src;
75
+ }
76
+ container.hidden = next.trigger.style.pointerEvents === "none";
77
+ projection.disabled = next.trigger.disabled;
78
+ const bounds = next.tabBar.getBoundingClientRect();
79
+ const tabs = bounds.width > 0 && bounds.height > 0 && getComputedStyle(next.tabBar).visibility === "visible" ? bounds : void 0;
80
+ container.style.left = tabs ? `${tabs.left + (tabs.width - 46) / 2}px` : "";
81
+ container.style.top = tabs ? `${tabs.top - 56}px` : "";
82
+ container.style.right = tabs ? "auto" : "";
83
+ container.style.bottom = tabs ? "auto" : "";
84
+ }
85
+ };
86
+ };
87
+ //#endregion
88
+ export { createVerticalBarsWebSearch, searchProjectionClass };
89
+
90
+ //# sourceMappingURL=vertical-bars-web-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertical-bars-web-search.js","names":[],"sources":["../../src/native/vertical-bars-web-search.ts"],"sourcesContent":["import { getNativeSearchBindings, type NativeSearchBinding } from '../native-integration';\nimport { activateProjectedElement, marker, unprojected } from './shared/dom';\n\nexport const searchProjectionClass = 'ios-theme-vertical-bars-search-projection';\n\n/** Web counterpart of the system search button above the vertical tabs, or at the rail bottom without visible tabs. */\nexport const createVerticalBarsWebSearch = (doc: Document, eligible: (element: HTMLElement) => boolean, refresh: () => void) => {\n let binding: NativeSearchBinding | undefined;\n let projection: HTMLIonFabButtonElement | undefined;\n let container: HTMLIonFabElement | undefined;\n const iconObserver = new MutationObserver(refresh);\n let previousAriaHidden: string | null = null;\n const restore = (retire?: (surface: HTMLElement) => void) => {\n iconObserver.disconnect();\n if (container) {\n if (retire) retire(container);\n else container.remove();\n }\n container = undefined;\n projection = undefined;\n if (binding) {\n binding.trigger.removeAttribute(marker);\n if (previousAriaHidden === null) binding.trigger.removeAttribute('aria-hidden');\n else binding.trigger.setAttribute('aria-hidden', previousAriaHidden);\n }\n binding = undefined;\n };\n return {\n restore,\n get surface() {\n return container;\n },\n get source() {\n return binding?.trigger;\n },\n update(root: HTMLElement) {\n const next = unprojected(binding ? [binding.trigger] : [], () =>\n getNativeSearchBindings(doc).find(({ trigger, footer }) => eligible(trigger) && eligible(footer)),\n );\n if (next !== binding || container?.parentElement !== root) restore();\n if (!next) return;\n if (!projection) {\n binding = next;\n previousAriaHidden = next.trigger.getAttribute('aria-hidden');\n projection = next.trigger.cloneNode(true) as HTMLIonFabButtonElement;\n for (const name of ['id', 'slot', marker, 'aria-hidden', 'style']) projection.removeAttribute(name);\n container = doc.createElement('ion-fab');\n container.setAttribute('mode', (next.trigger as HTMLIonFabButtonElement).mode ?? 'ios');\n container.classList.add(searchProjectionClass, 'ion-cloned-element');\n projection.addEventListener(\n 'click',\n (event) => {\n event.preventDefault();\n event.stopImmediatePropagation();\n activateProjectedElement(next.trigger);\n },\n { capture: true },\n );\n container.append(projection);\n root.append(container);\n next.trigger.setAttribute(marker, '');\n next.trigger.setAttribute('aria-hidden', 'true');\n }\n projection.setAttribute(\n 'aria-label',\n next.trigger.getAttribute('aria-label') ?? next.footer.querySelector('ion-searchbar')?.getAttribute('aria-label') ?? 'Search',\n );\n const sourceIcon = next.trigger.querySelector('ion-icon');\n const icon = projection.querySelector('ion-icon');\n if (sourceIcon?.shadowRoot) iconObserver.observe(sourceIcon.shadowRoot, { subtree: true, childList: true, attributes: true });\n if (sourceIcon && icon) {\n icon.icon = sourceIcon.icon;\n icon.name = sourceIcon.name;\n icon.src = sourceIcon.src;\n }\n container!.hidden = next.trigger.style.pointerEvents === 'none';\n projection.disabled = (next.trigger as HTMLIonFabButtonElement).disabled;\n const bounds = next.tabBar.getBoundingClientRect();\n const tabs = bounds.width > 0 && bounds.height > 0 && getComputedStyle(next.tabBar).visibility === 'visible' ? bounds : undefined;\n container!.style.left = tabs ? `${tabs.left + (tabs.width - 46) / 2}px` : '';\n container!.style.top = tabs ? `${tabs.top - 56}px` : '';\n container!.style.right = tabs ? 'auto' : '';\n container!.style.bottom = tabs ? 'auto' : '';\n },\n };\n};\n"],"mappings":";;;AAGA,MAAa,wBAAwB;;AAGrC,MAAa,+BAA+B,KAAe,UAA6C,YAAwB;CAC9H,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,MAAM,eAAe,IAAI,iBAAiB,OAAO;CACjD,IAAI,qBAAoC;CACxC,MAAM,WAAW,WAA4C;EAC3D,aAAa,WAAW;EACxB,IAAI,WAAW;GACb,IAAI,QAAQ,OAAO,SAAS;QACvB,UAAU,OAAO;EACxB;EACA,YAAY,KAAA;EACZ,aAAa,KAAA;EACb,IAAI,SAAS;GACX,QAAQ,QAAQ,gBAAgB,MAAM;GACtC,IAAI,uBAAuB,MAAM,QAAQ,QAAQ,gBAAgB,aAAa;QACzE,QAAQ,QAAQ,aAAa,eAAe,kBAAkB;EACrE;EACA,UAAU,KAAA;CACZ;CACA,OAAO;EACL;EACA,IAAI,UAAU;GACZ,OAAO;EACT;EACA,IAAI,SAAS;GACX,OAAO,SAAS;EAClB;EACA,OAAO,MAAmB;GACxB,MAAM,OAAO,YAAY,UAAU,CAAC,QAAQ,OAAO,IAAI,CAAC,SACtD,wBAAwB,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,aAAa,SAAS,OAAO,KAAK,SAAS,MAAM,CAAC,CAClG;GACA,IAAI,SAAS,WAAW,WAAW,kBAAkB,MAAM,QAAQ;GACnE,IAAI,CAAC,MAAM;GACX,IAAI,CAAC,YAAY;IACf,UAAU;IACV,qBAAqB,KAAK,QAAQ,aAAa,aAAa;IAC5D,aAAa,KAAK,QAAQ,UAAU,IAAI;IACxC,KAAK,MAAM,QAAQ;KAAC;KAAM;KAAQ;KAAQ;KAAe;IAAO,GAAG,WAAW,gBAAgB,IAAI;IAClG,YAAY,IAAI,cAAc,SAAS;IACvC,UAAU,aAAa,QAAS,KAAK,QAAoC,QAAQ,KAAK;IACtF,UAAU,UAAU,IAAI,uBAAuB,oBAAoB;IACnE,WAAW,iBACT,UACC,UAAU;KACT,MAAM,eAAe;KACrB,MAAM,yBAAyB;KAC/B,yBAAyB,KAAK,OAAO;IACvC,GACA,EAAE,SAAS,KAAK,CAClB;IACA,UAAU,OAAO,UAAU;IAC3B,KAAK,OAAO,SAAS;IACrB,KAAK,QAAQ,aAAa,QAAQ,EAAE;IACpC,KAAK,QAAQ,aAAa,eAAe,MAAM;GACjD;GACA,WAAW,aACT,cACA,KAAK,QAAQ,aAAa,YAAY,KAAK,KAAK,OAAO,cAAc,eAAe,CAAC,EAAE,aAAa,YAAY,KAAK,QACvH;GACA,MAAM,aAAa,KAAK,QAAQ,cAAc,UAAU;GACxD,MAAM,OAAO,WAAW,cAAc,UAAU;GAChD,IAAI,YAAY,YAAY,aAAa,QAAQ,WAAW,YAAY;IAAE,SAAS;IAAM,WAAW;IAAM,YAAY;GAAK,CAAC;GAC5H,IAAI,cAAc,MAAM;IACtB,KAAK,OAAO,WAAW;IACvB,KAAK,OAAO,WAAW;IACvB,KAAK,MAAM,WAAW;GACxB;GACA,UAAW,SAAS,KAAK,QAAQ,MAAM,kBAAkB;GACzD,WAAW,WAAY,KAAK,QAAoC;GAChE,MAAM,SAAS,KAAK,OAAO,sBAAsB;GACjD,MAAM,OAAO,OAAO,QAAQ,KAAK,OAAO,SAAS,KAAK,iBAAiB,KAAK,MAAM,CAAC,CAAC,eAAe,YAAY,SAAS,KAAA;GACxH,UAAW,MAAM,OAAO,OAAO,GAAG,KAAK,QAAQ,KAAK,QAAQ,MAAM,EAAE,MAAM;GAC1E,UAAW,MAAM,MAAM,OAAO,GAAG,KAAK,MAAM,GAAG,MAAM;GACrD,UAAW,MAAM,QAAQ,OAAO,SAAS;GACzC,UAAW,MAAM,SAAS,OAAO,SAAS;EAC5C;CACF;AACF"}
@@ -0,0 +1,5 @@
1
+ import { NativeUIOptions, NativeUIRuntimeHandle } from "./definitions.js";
2
+ //#region src/native/vertical-bars-web.d.ts
3
+ export declare const createVerticalBarsWebProjection: (doc: Document, options: NativeUIOptions, enabled?: () => boolean) => NativeUIRuntimeHandle;
4
+ //#endregion
5
+ //# sourceMappingURL=vertical-bars-web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertical-bars-web.d.ts","names":[],"sources":["../../src/native/vertical-bars-web.ts"],"mappings":";;qBA6Ca,kCACX,KAAK,UACL,SAAS,iBACT,4BACC"}