@webview-native-ui/engine 1.0.0 → 1.0.2-0

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 (238) hide show
  1. package/README.md +48 -35
  2. package/WebViewNativeUIControls.podspec +17 -0
  3. package/dist/controls/activation.d.ts +15 -0
  4. package/dist/controls/activation.js +370 -0
  5. package/dist/controls/components/index.d.ts +16 -0
  6. package/dist/controls/components/index.js +38 -0
  7. package/dist/controls/components/ion-back-button.d.ts +4 -0
  8. package/dist/controls/components/ion-back-button.js +16 -0
  9. package/dist/controls/components/ion-button.d.ts +4 -0
  10. package/dist/controls/components/ion-button.js +26 -0
  11. package/dist/controls/components/ion-buttons.d.ts +5 -0
  12. package/dist/controls/components/ion-buttons.js +34 -0
  13. package/dist/controls/components/ion-fab.d.ts +4 -0
  14. package/dist/controls/components/ion-fab.js +164 -0
  15. package/dist/controls/components/ion-menu-button.d.ts +7 -0
  16. package/dist/controls/components/ion-menu-button.js +41 -0
  17. package/dist/controls/components/ion-segment.d.ts +5 -0
  18. package/dist/controls/components/ion-segment.js +24 -0
  19. package/dist/controls/components/ion-tab-bar.d.ts +5 -0
  20. package/dist/controls/components/ion-tab-bar.js +49 -0
  21. package/dist/controls/components/searchable-tabs.d.ts +20 -0
  22. package/dist/controls/components/searchable-tabs.js +525 -0
  23. package/dist/controls/definitions.d.ts +360 -0
  24. package/dist/controls/definitions.js +1 -0
  25. package/dist/controls/extensions.d.ts +44 -0
  26. package/dist/controls/extensions.js +164 -0
  27. package/dist/controls/foldable/fold-state.d.ts +4 -0
  28. package/dist/controls/foldable/fold-state.js +8 -0
  29. package/dist/controls/foldable/types.d.ts +9 -0
  30. package/dist/controls/foldable/types.js +1 -0
  31. package/dist/controls/html.d.ts +8 -0
  32. package/dist/controls/html.js +260 -0
  33. package/dist/controls/index.d.ts +7 -0
  34. package/dist/controls/index.js +4 -0
  35. package/dist/controls/ionic.d.ts +1 -0
  36. package/dist/controls/ionic.js +1 -0
  37. package/dist/controls/legacy-layout.d.ts +7 -0
  38. package/dist/controls/legacy-layout.js +23 -0
  39. package/dist/controls/overlays/content.d.ts +2 -0
  40. package/dist/controls/overlays/content.js +55 -0
  41. package/dist/controls/overlays/controller.d.ts +7 -0
  42. package/dist/controls/overlays/controller.js +369 -0
  43. package/dist/controls/overlays/covered-overlay.d.ts +4 -0
  44. package/dist/controls/overlays/covered-overlay.js +9 -0
  45. package/dist/controls/overlays/dialog-animation.d.ts +7 -0
  46. package/dist/controls/overlays/dialog-animation.js +49 -0
  47. package/dist/controls/overlays/dismiss-animation.d.ts +2 -0
  48. package/dist/controls/overlays/dismiss-animation.js +14 -0
  49. package/dist/controls/overlays/focus.d.ts +2 -0
  50. package/dist/controls/overlays/focus.js +67 -0
  51. package/dist/controls/overlays/popover.d.ts +10 -0
  52. package/dist/controls/overlays/popover.js +117 -0
  53. package/dist/controls/overlays/styles.d.ts +9 -0
  54. package/dist/controls/overlays/styles.js +194 -0
  55. package/dist/controls/prehide.d.ts +6 -0
  56. package/dist/controls/prehide.js +280 -0
  57. package/dist/controls/runtime.d.ts +5 -0
  58. package/dist/controls/runtime.js +1685 -0
  59. package/dist/controls/shared/bridge.d.ts +4 -0
  60. package/dist/controls/shared/bridge.js +15 -0
  61. package/dist/controls/shared/candidate.d.ts +23 -0
  62. package/dist/controls/shared/candidate.js +128 -0
  63. package/dist/controls/shared/clipping.d.ts +1 -0
  64. package/dist/controls/shared/clipping.js +1 -0
  65. package/dist/controls/shared/connection.d.ts +21 -0
  66. package/dist/controls/shared/connection.js +112 -0
  67. package/dist/controls/shared/control-options.d.ts +4 -0
  68. package/dist/controls/shared/control-options.js +14 -0
  69. package/dist/controls/shared/covered-snapshot.d.ts +35 -0
  70. package/dist/controls/shared/covered-snapshot.js +41 -0
  71. package/dist/controls/shared/covered-source.d.ts +22 -0
  72. package/dist/controls/shared/covered-source.js +72 -0
  73. package/dist/controls/shared/crossfade.d.ts +11 -0
  74. package/dist/controls/shared/crossfade.js +71 -0
  75. package/dist/controls/shared/diagnostics.d.ts +2 -0
  76. package/dist/controls/shared/diagnostics.js +16 -0
  77. package/dist/controls/shared/dom.d.ts +45 -0
  78. package/dist/controls/shared/dom.js +258 -0
  79. package/dist/controls/shared/events.d.ts +12 -0
  80. package/dist/controls/shared/events.js +13 -0
  81. package/dist/controls/shared/horizontal-navigation.d.ts +36 -0
  82. package/dist/controls/shared/horizontal-navigation.js +90 -0
  83. package/dist/controls/shared/icons.d.ts +5 -0
  84. package/dist/controls/shared/icons.js +66 -0
  85. package/dist/controls/shared/modal-animation.d.ts +21 -0
  86. package/dist/controls/shared/modal-animation.js +97 -0
  87. package/dist/controls/shared/modal.d.ts +26 -0
  88. package/dist/controls/shared/modal.js +261 -0
  89. package/dist/controls/shared/projection-id.d.ts +2 -0
  90. package/dist/controls/shared/projection-id.js +2 -0
  91. package/dist/controls/shared/scroll-placement.d.ts +1 -0
  92. package/dist/controls/shared/scroll-placement.js +1 -0
  93. package/dist/controls/shared/tab-bar-width.d.ts +7 -0
  94. package/dist/controls/shared/tab-bar-width.js +72 -0
  95. package/dist/controls/shared/toolbar-options.d.ts +10 -0
  96. package/dist/controls/shared/toolbar-options.js +38 -0
  97. package/dist/controls/shared/transition-identity.d.ts +3 -0
  98. package/dist/controls/shared/transition-identity.js +64 -0
  99. package/dist/controls/shared/vertical-bars-geometry.d.ts +8 -0
  100. package/dist/controls/shared/vertical-bars-geometry.js +82 -0
  101. package/dist/controls/shared/vertical-navigation.d.ts +5 -0
  102. package/dist/controls/shared/vertical-navigation.js +39 -0
  103. package/dist/controls/startup.d.ts +7 -0
  104. package/dist/controls/startup.js +72 -0
  105. package/dist/controls/transport.d.ts +10 -0
  106. package/dist/controls/transport.js +1 -0
  107. package/dist/controls/vertical-bars-web-search.d.ts +8 -0
  108. package/dist/controls/vertical-bars-web-search.js +83 -0
  109. package/dist/controls/vertical-bars-web.d.ts +2 -0
  110. package/dist/controls/vertical-bars-web.js +609 -0
  111. package/dist/index.d.ts +1 -0
  112. package/dist/index.js +1 -0
  113. package/dist/integration/index.d.ts +36 -0
  114. package/dist/integration/index.js +25 -0
  115. package/dist/native/bootstrap.js +1 -1
  116. package/dist/native/session.js +14 -8
  117. package/dist/projection/pause.d.ts +10 -0
  118. package/dist/projection/pause.js +58 -0
  119. package/dist/projection/styles.d.ts +1 -1
  120. package/dist/projection/styles.js +0 -1
  121. package/dist/projection/surfaces.js +11 -8
  122. package/dist/projection/web.js +48 -13
  123. package/dist/types.d.ts +5 -1
  124. package/docs/README.md +17 -10
  125. package/docs/concepts.md +39 -14
  126. package/docs/configuration/README.md +4 -2
  127. package/docs/configuration/ionic-overlays.md +36 -2
  128. package/docs/configuration/pause-resume.md +51 -0
  129. package/docs/controls.md +39 -0
  130. package/docs/getting-started/capacitor.md +3 -3
  131. package/docs/getting-started/cordova.md +3 -1
  132. package/docs/getting-started/initialization.md +18 -2
  133. package/docs/reference/platforms.md +2 -2
  134. package/docs/reference/projection.md +1 -1
  135. package/ios/Sources/WebViewNativeUIControls/Components/NativeUIButton.swift +98 -0
  136. package/ios/Sources/WebViewNativeUIControls/Components/NativeUIButtons.swift +24 -0
  137. package/ios/Sources/WebViewNativeUIControls/Components/NativeUIComponents.swift +19 -0
  138. package/ios/Sources/WebViewNativeUIControls/Components/NativeUIFab.swift +80 -0
  139. package/ios/Sources/WebViewNativeUIControls/Components/NativeUISearchController.swift +449 -0
  140. package/ios/Sources/WebViewNativeUIControls/Components/NativeUISegment.swift +91 -0
  141. package/ios/Sources/WebViewNativeUIControls/Components/NativeUITabBar.swift +213 -0
  142. package/ios/Sources/WebViewNativeUIControls/Components/NativeUIToolbarTransition.swift +186 -0
  143. package/ios/Sources/WebViewNativeUIControls/Components/NativeUIVerticalBars.swift +696 -0
  144. package/ios/Sources/WebViewNativeUIControls/Components/NativeUIVerticalSearch.swift +117 -0
  145. package/ios/Sources/WebViewNativeUIControls/Extensions/NativeUI.swift +180 -0
  146. package/ios/Sources/WebViewNativeUIControls/Extensions/NativeUIRendering.swift +38 -0
  147. package/ios/Sources/WebViewNativeUIControls/NativeUIController.swift +801 -0
  148. package/ios/Sources/WebViewNativeUIControls/Overlays/NativeUIOverlayController.swift +131 -0
  149. package/ios/Sources/WebViewNativeUIControls/Overlays/NativeUIOverlayHost.swift +85 -0
  150. package/ios/Sources/WebViewNativeUIControls/Shared/NativeUIControlRendering.swift +21 -0
  151. package/ios/Sources/WebViewNativeUIControls/Shared/NativeUICoveredSnapshots.swift +14 -0
  152. package/ios/Sources/WebViewNativeUIControls/Shared/NativeUICrossfade.swift +35 -0
  153. package/ios/Sources/WebViewNativeUIControls/Shared/NativeUIHost.swift +8 -0
  154. package/ios/Sources/WebViewNativeUIControls/Shared/NativeUIScrollTracker.swift +2 -0
  155. package/ios/Sources/WebViewNativeUIControls/Shared/NativeUISnapshot.swift +206 -0
  156. package/ios/Sources/WebViewNativeUIControls/Shared/NativeUIVerticalBarsGeometry.swift +93 -0
  157. package/ios/Sources/WebViewNativeUIEngine/CoveredSnapshots.swift +2 -2
  158. package/ios/Sources/WebViewNativeUIEngine/NativeUIProjection.swift +6 -4
  159. package/ios/Sources/WebViewNativeUIEngine/ProjectionOrigins.swift +31 -0
  160. package/ios/Sources/WebViewNativeUIEngine/Resources/native-ui-engine.js +3 -4
  161. package/package.json +30 -5
  162. package/src/controls/activation.ts +427 -0
  163. package/src/controls/components/index.ts +45 -0
  164. package/src/controls/components/ion-back-button.ts +22 -0
  165. package/src/controls/components/ion-button.ts +28 -0
  166. package/src/controls/components/ion-buttons.ts +37 -0
  167. package/src/controls/components/ion-fab.ts +151 -0
  168. package/src/controls/components/ion-menu-button.ts +37 -0
  169. package/src/controls/components/ion-segment.ts +27 -0
  170. package/src/controls/components/ion-tab-bar.ts +55 -0
  171. package/src/controls/components/searchable-tabs.ts +534 -0
  172. package/src/controls/definitions.ts +338 -0
  173. package/src/controls/extensions.ts +198 -0
  174. package/src/controls/foldable/fold-state.ts +10 -0
  175. package/src/controls/foldable/types.ts +4 -0
  176. package/src/controls/html.ts +239 -0
  177. package/src/controls/index.ts +7 -0
  178. package/src/controls/ionic.ts +1 -0
  179. package/src/controls/legacy-layout.ts +21 -0
  180. package/src/controls/overlays/content.ts +51 -0
  181. package/src/controls/overlays/controller.ts +394 -0
  182. package/src/controls/overlays/covered-overlay.ts +11 -0
  183. package/src/controls/overlays/dialog-animation.ts +53 -0
  184. package/src/controls/overlays/dismiss-animation.ts +15 -0
  185. package/src/controls/overlays/focus.ts +64 -0
  186. package/src/controls/overlays/popover.ts +116 -0
  187. package/src/controls/overlays/styles.ts +195 -0
  188. package/src/controls/prehide.ts +285 -0
  189. package/src/controls/runtime.ts +1731 -0
  190. package/src/controls/shared/bridge.ts +18 -0
  191. package/src/controls/shared/candidate.ts +163 -0
  192. package/src/controls/shared/clipping.ts +1 -0
  193. package/src/controls/shared/connection.ts +105 -0
  194. package/src/controls/shared/control-options.ts +20 -0
  195. package/src/controls/shared/covered-snapshot.ts +52 -0
  196. package/src/controls/shared/covered-source.ts +78 -0
  197. package/src/controls/shared/crossfade.ts +70 -0
  198. package/src/controls/shared/diagnostics.ts +13 -0
  199. package/src/controls/shared/dom.ts +310 -0
  200. package/src/controls/shared/events.ts +14 -0
  201. package/src/controls/shared/horizontal-navigation.ts +106 -0
  202. package/src/controls/shared/icons.ts +64 -0
  203. package/src/controls/shared/modal-animation.ts +109 -0
  204. package/src/controls/shared/modal.ts +286 -0
  205. package/src/controls/shared/projection-id.ts +2 -0
  206. package/src/controls/shared/scroll-placement.ts +1 -0
  207. package/src/controls/shared/tab-bar-width.ts +66 -0
  208. package/src/controls/shared/toolbar-options.ts +51 -0
  209. package/src/controls/shared/transition-identity.ts +67 -0
  210. package/src/controls/shared/vertical-bars-geometry.ts +92 -0
  211. package/src/controls/shared/vertical-navigation.ts +34 -0
  212. package/src/controls/startup.ts +74 -0
  213. package/src/controls/transport.ts +11 -0
  214. package/src/controls/vertical-bars-web-search.ts +86 -0
  215. package/src/controls/vertical-bars-web.ts +674 -0
  216. package/src/dom/geometry.ts +24 -0
  217. package/src/dom/overlays.ts +196 -0
  218. package/src/dom/scroll-bindings.ts +66 -0
  219. package/src/dom/scroll-placement.ts +92 -0
  220. package/src/dom/visibility.ts +29 -0
  221. package/src/index.ts +19 -0
  222. package/src/integration/index.ts +64 -0
  223. package/src/ionic.ts +34 -0
  224. package/src/native/bootstrap.ts +132 -0
  225. package/src/native/bridge.ts +18 -0
  226. package/src/native/resource-url.ts +11 -0
  227. package/src/native/session.ts +708 -0
  228. package/src/native/updates.ts +103 -0
  229. package/src/native/values.ts +29 -0
  230. package/src/projection/events.ts +58 -0
  231. package/src/projection/pause.ts +58 -0
  232. package/src/projection/placement.ts +34 -0
  233. package/src/projection/scope.ts +13 -0
  234. package/src/projection/styles.ts +26 -0
  235. package/src/projection/surface.ts +88 -0
  236. package/src/projection/surfaces.ts +119 -0
  237. package/src/projection/web.ts +1013 -0
  238. package/src/types.ts +58 -0
@@ -0,0 +1,31 @@
1
+ import Foundation
2
+ import WebKit
3
+
4
+ enum ProjectionOrigins {
5
+ static let defaults: Set<String> = ["capacitor://localhost", "app://localhost", "https://localhost", "http://localhost"]
6
+
7
+ static func configured(in bundle: Bundle = .main) throws -> Set<String> {
8
+ guard let url = bundle.url(forResource: "capacitor.config", withExtension: "json") else { return defaults }
9
+ guard let configuration = try JSONSerialization.jsonObject(with: Data(contentsOf: url)) as? [String: Any] else { throw URLError(.badURL) }
10
+ return try configured(configuration)
11
+ }
12
+
13
+ static func configured(_ configuration: [String: Any]) throws -> Set<String> {
14
+ guard let server = configuration["server"] as? [String: Any] else { return defaults }
15
+ var scheme = server["iosScheme"] as? String ?? "capacitor"
16
+ if WKWebView.handlesURLScheme(scheme) || scheme.range(of: "^[a-z][a-z0-9.+-]*$", options: [.caseInsensitive, .regularExpression]) == nil {
17
+ scheme = "capacitor"
18
+ }
19
+ let host = server["hostname"] as? String ?? "localhost"
20
+ guard let url = URLComponents(string: server["url"] as? String ?? "\(scheme)://\(host)"),
21
+ let scheme = url.scheme?.lowercased(), let host = url.host?.lowercased(),
22
+ !host.isEmpty, !host.contains("*") else { throw URLError(.badURL) }
23
+ var origin = URLComponents()
24
+ origin.scheme = scheme
25
+ origin.host = host
26
+ origin.port = url.port
27
+ if (scheme == "https" && url.port == 443) || (scheme == "http" && url.port == 80) { origin.port = nil }
28
+ guard let value = origin.string else { throw URLError(.badURL) }
29
+ return [value]
30
+ }
31
+ }
@@ -1,4 +1,4 @@
1
- "use strict";var WebViewNativeUIEngineRuntime=(()=>{var Ge=Object.defineProperty;var ut=Object.getOwnPropertyDescriptor;var ft=Object.getOwnPropertyNames;var pt=Object.prototype.hasOwnProperty;var mt=(t,r)=>{for(var o in r)Ge(t,o,{get:r[o],enumerable:!0})},vt=(t,r,o,v)=>{if(r&&typeof r=="object"||typeof r=="function")for(let y of ft(r))!pt.call(t,y)&&y!==o&&Ge(t,y,{get:()=>r[y],enumerable:!(v=ut(r,y))||v.enumerable});return t};var ht=t=>vt(Ge({},"__esModule",{value:!0}),t);var Ot={};mt(Ot,{hide:()=>kt,notify:()=>Mt,receive:()=>xt,show:()=>Ht,start:()=>Ct,stop:()=>Rt});var tt=(t,r,o)=>{for(let[v,y]of Object.entries(r)){if(!/^[a-z][a-z0-9-]*$/.test(v))throw new TypeError("Native value keys must be lowercase attribute names");let f=(Object.hasOwn(o,v)?o[v]:void 0)?.property;if(f&&(!/^[a-zA-Z][\w]*$/.test(f)||/^on/i.test(f)||["innerHTML","outerHTML","textContent","innerText","style","constructor","prototype"].includes(f)))throw new TypeError("Native value binding requires a data property");let P=JSON.stringify(y);if(P===void 0)throw new TypeError("Native values must be JSON values");if(f){let p=t;JSON.stringify(p[f])!==P&&(p[f]=y)}else{let p=`data-native-ui-value-${v}`,M=typeof y=="string"?y:P;t.getAttribute(p)!==M&&t.setAttribute(p,M)}}};var yt=Symbol.for("webview-native-ui-engine.projection-placement");var Ue=t=>t?.[yt];var gt=(t,r)=>{if(t.matches("ion-toast, ion-menu"))return!1;let o=t;if(o.showBackdrop===!1)return!1;if(!t.matches("ion-modal"))return!0;let v=r??o.initialBreakpoint;return v===void 0||v>(o.backdropBreakpoint??0)},wt=Symbol.for("@webview-native-ui/engine/overlays/v1"),bt=t=>{let r=new Set,o=new Set,v=new Set,y=new WeakMap,m=new WeakSet,f=new Map,P=[],p={},M=new Map,x,j=g=>{for(let d of[...v])try{d(g)}catch(w){console.error("Native UI overlay listener failed",w)}},B=(g,d,w)=>{d==="willPresent"||d==="didPresent"?(m.delete(g),r.add(g)):d==="didDismiss"&&(m.add(g),r.delete(g),o.delete(g),y.delete(g));let c=w?.detail?.breakpoint;typeof c=="number"&&c>0&&y.set(g,c),j({element:g,phase:d,event:w})},k=(g=!1)=>{let d=!1;for(let w of r)(!w.isConnected||w.ownerDocument!==t||!P.some(({selector:c})=>w.matches(c)))&&(r.delete(w),o.delete(w),d=!0);for(let w of t.querySelectorAll(P.map(({selector:c})=>c).join(",")))!r.has(w)&&!m.has(w)&&(g||!w.matches("ion-popover"))&&(w.presented||w.classList.contains("show-menu"))&&(r.add(w),d=!0);d&&j({phase:"change"})};return{get active(){return r},subscribe(g){return v.add(g),()=>{v.delete(g)}},setNative(g,d){o.has(g)!==d&&(d?o.add(g):o.delete(g),j({element:g,phase:"change"}))},isExcluded(g){return!!p.exclude&&g.matches(p.exclude)},isNative(g){return o.has(g)},get stack(){let g=[...r].filter(w=>w.isConnected&&w.ownerDocument===t),d=w=>{let c=Number.parseFloat(t.defaultView.getComputedStyle(w).zIndex);return Number.isFinite(c)?c:w.overlayIndex??0};return g.sort((w,c)=>d(w)-d(c)),g},isCovered(g){let d=this.stack,w=d.reduce((c,W,R)=>W.contains(g)?R:c,-1);return d.some((c,W)=>{if(o.has(c)||p.exclude&&c.matches(p.exclude))return!1;let R=p.covers?.(c,g);return R!==void 0?R:W>w&&!c.contains(g)&&(c.matches("ion-menu")||gt(c,y.get(c)))})},enable(g,d){let w={...p,...d},c=[...g,...w.additional??[]];w.exclude&&t.querySelector(w.exclude);let W=new Map;for(let l of c){t.querySelector(l.selector);for(let[V,$]of Object.entries(l.events)){let G=W.get($);if(G&&G.phase!==V)throw new TypeError(`Overlay event "${$}" has conflicting phases`);W.set($,{phase:V,selector:G?`${G.selector}, ${l.selector}`:l.selector})}}p=w,P=c,M=W;for(let l of M.keys()){if(f.has(l))continue;let V=$=>{let G=M.get(l),ye=$.composedPath().find(J=>J instanceof t.defaultView.HTMLElement&&J.matches(G.selector));ye&&B(ye,G.phase,$)};t.addEventListener(l,V,!0),f.set(l,()=>t.removeEventListener(l,V,!0))}for(let[l,V]of f)M.has(l)||(V(),f.delete(l));let R=!x;x||(x=new MutationObserver(()=>k()),x.observe(t.documentElement,{childList:!0,subtree:!0}),t.addEventListener("nativeUIOverlayAdopted",l=>{let V=l.detail;V?.ownerDocument===t&&B(V,"willPresent",l)})),k(R),(R||d)&&j({phase:"change"})}}},nt=t=>{let r=t;return r[wt]??=bt(t)};function*Ne(t){let r=t;for(;r;){let o=r.getRootNode();r=r.assignedSlot??r.parentElement??(o instanceof ShadowRoot?o.host:null),r&&(yield r)}}var Et=({x:t,y:r,width:o,height:v})=>({x:t,y:r,width:o,height:v}),ot=t=>{let r=t.getBoundingClientRect(),o=getComputedStyle(t),v=parseFloat(o.borderLeftWidth)||0,y=parseFloat(o.borderTopWidth)||0;return{x:r.left+v,y:r.top+y,width:r.width-v-(parseFloat(o.borderRightWidth)||0),height:r.height-y-(parseFloat(o.borderBottomWidth)||0)}},Ke=(t,r,o)=>{let v=[t,...Ne(t)],y=v.indexOf(r);if(y<=0||r===t.ownerDocument.scrollingElement)return;let m=t.ownerDocument.defaultView;if(m.visualViewport&&(m.visualViewport.scale!==1||m.visualViewport.offsetLeft||m.visualViewport.offsetTop))return;let f=0,P=0,p=m.innerWidth,M=m.innerHeight;for(let[k,g]of v.entries()){let d=getComputedStyle(g);if(d.transform!=="none"&&!new DOMMatrixReadOnly(d.transform).isIdentity||d.zoom&&d.zoom!=="normal"&&Number(d.zoom)!==1||[d.translate,d.rotate,d.scale,d.perspective].some(R=>R&&R!=="none")||d.writingMode&&d.writingMode!=="horizontal-tb"||k<y&&/^(fixed|sticky)$/.test(d.position))return;if(k===0)continue;if(d.scrollbarGutter&&d.scrollbarGutter!=="auto")return;let w=/^(auto|scroll|hidden|clip)$/.test(d.overflowX),c=/^(auto|scroll|hidden|clip)$/.test(d.overflowY);if(k<y&&(w||c))return;let W=g===t.ownerDocument.scrollingElement;if(k>y&&((w||W)&&g.scrollWidth>g.clientWidth||(c||W)&&g.scrollHeight>g.clientHeight)||(w||c)&&[d.borderTopLeftRadius,d.borderTopRightRadius,d.borderBottomLeftRadius,d.borderBottomRightRadius].some(R=>parseFloat(R)>0)||d.clipPath&&d.clipPath!=="none"||d.maskImage&&d.maskImage!=="none")return;if(k>=y){let R=ot(g);w&&(f=Math.max(f,R.x),p=Math.min(p,R.x+R.width)),c&&(P=Math.max(P,R.y),M=Math.min(M,R.y+R.height))}}let x=getComputedStyle(r);if(!/^(auto|scroll)$/.test(x.overflowX)&&!/^(auto|scroll)$/.test(x.overflowY))return;let j=ot(r);if(p<=f||M<=P||!j.width||!j.height)return;let B=Et(t.getBoundingClientRect());return{id:o(r),offsetX:r.scrollLeft,offsetY:r.scrollTop,viewport:j,clip:{x:f,y:P,width:p-f,height:M-P},contentWidth:r.scrollWidth,contentHeight:r.scrollHeight,frame:{...B,x:B.x-j.x+r.scrollLeft,y:B.y-j.y+r.scrollTop}}};var it=t=>{let r=globalThis;if(r.Capacitor?.convertFileSrc)return r.Capacitor.convertFileSrc(t);if(!t.startsWith("file:"))return t;if(r.WkWebView?.convertFilePath)return r.WkWebView.convertFilePath(t);throw new Error("Native UI file URL requires a host resource handler")};var he=t=>new Promise((r,o)=>{let v=setTimeout(()=>o(new Error("Native UI bridge timed out")),5e3);t.then(r,o).finally(()=>clearTimeout(v))}),Xe=async t=>{try{return await he(t)}catch(r){throw t.then(o=>o.remove()).catch(()=>{}),r}};var Ye=async(t,r)=>{let o=new Map;for(let P of t.update??[])o.set(P,{updated:!0});for(let P of["native","web","none"])for(let p of t.projection?.[P]??[]){let M=o.get(p)??{updated:!1};if(M.destination&&M.destination!==P)throw new TypeError(`Projection event "${p}" has conflicting destinations`);o.set(p,{...M,destination:P})}let v=!1,y=[],m=async()=>{v=!0;let p=(await Promise.allSettled(y.splice(0).map(M=>Promise.resolve().then(()=>M.remove())))).find(M=>M.status==="rejected");if(p?.status==="rejected")throw p.reason},f=[...o].map(async([P,p])=>{let M=await Xe(Promise.resolve().then(()=>t.addListener(P,x=>{!v&&(!t.accepts||t.accepts(x))&&r(p.destination,p.updated)})));v?await M.remove():y.push(M)});try{return await Promise.all(f),{remove:m}}catch(P){throw await m().catch(()=>{}),P}};var xe=":is([data-native-ui-snapshot-source], [data-native-ui-snapshot-prepared], [data-native-ui-snapshot-content])",rt=`
1
+ "use strict";var WebViewNativeUIEngineRuntime=(()=>{var Ze=Object.defineProperty;var bt=Object.getOwnPropertyDescriptor;var Pt=Object.getOwnPropertyNames;var Et=Object.prototype.hasOwnProperty;var Tt=(e,o)=>{for(var s in o)Ze(e,s,{get:o[s],enumerable:!0})},Lt=(e,o,s,v)=>{if(o&&typeof o=="object"||typeof o=="function")for(let p of Pt(o))!Et.call(e,p)&&p!==s&&Ze(e,p,{get:()=>o[p],enumerable:!(v=bt(o,p))||v.enumerable});return e};var Mt=e=>Lt(Ze({},"__esModule",{value:!0}),e);var zt={};Tt(zt,{hide:()=>Ut,notify:()=>Dt,receive:()=>$t,show:()=>It,start:()=>Vt,stop:()=>Bt});var st=(e,o,s)=>{for(let[v,p]of Object.entries(o)){if(!/^[a-z][a-z0-9-]*$/.test(v))throw new TypeError("Native value keys must be lowercase attribute names");let w=(Object.hasOwn(s,v)?s[v]:void 0)?.property;if(w&&(!/^[a-zA-Z][\w]*$/.test(w)||/^on/i.test(w)||["innerHTML","outerHTML","textContent","innerText","style","constructor","prototype"].includes(w)))throw new TypeError("Native value binding requires a data property");let b=JSON.stringify(p);if(b===void 0)throw new TypeError("Native values must be JSON values");if(w){let a=e;JSON.stringify(a[w])!==b&&(a[w]=p)}else{let a=`data-native-ui-value-${v}`,L=typeof p=="string"?p:b;e.getAttribute(a)!==L&&e.setAttribute(a,L)}}};var jt=Symbol.for("webview-native-ui-engine.projection-placement");var ze=e=>e?.[jt];var St=(e,o)=>{if(e.matches("ion-toast, ion-menu"))return!1;let s=e;if(s.showBackdrop===!1)return!1;if(!e.matches("ion-modal"))return!0;let v=o??s.initialBreakpoint;return v===void 0||v>(s.backdropBreakpoint??0)},xt=Symbol.for("@webview-native-ui/engine/overlays/v1"),Ht=e=>{let o=new Set,s=new Set,v=new Set,p=new WeakMap,f=new WeakSet,w=new Map,b=[],a={},L=new Map,j,H=y=>{for(let d of[...v])try{d(y)}catch(g){console.error("Native UI overlay listener failed",g)}},D=(y,d,g)=>{d==="willPresent"||d==="didPresent"?(f.delete(y),o.add(y)):d==="didDismiss"&&(f.add(y),o.delete(y),s.delete(y),p.delete(y));let l=g?.detail?.breakpoint;typeof l=="number"&&l>0&&p.set(y,l),H({element:y,phase:d,event:g})},W=(y=!1)=>{let d=!1;for(let g of o)(!g.isConnected||g.ownerDocument!==e||!b.some(({selector:l})=>g.matches(l)))&&(o.delete(g),s.delete(g),d=!0);for(let g of e.querySelectorAll(b.map(({selector:l})=>l).join(",")))!o.has(g)&&!f.has(g)&&(y||!g.matches("ion-popover"))&&(g.presented||g.classList.contains("show-menu"))&&(o.add(g),d=!0);d&&H({phase:"change"})};return{get active(){return o},subscribe(y){return v.add(y),()=>{v.delete(y)}},setNative(y,d){s.has(y)!==d&&(d?s.add(y):s.delete(y),H({element:y,phase:"change"}))},isExcluded(y){return!!a.exclude&&y.matches(a.exclude)},isNative(y){return s.has(y)},get stack(){let y=[...o].filter(g=>g.isConnected&&g.ownerDocument===e),d=g=>{let l=Number.parseFloat(e.defaultView.getComputedStyle(g).zIndex);return Number.isFinite(l)?l:g.overlayIndex??0};return y.sort((g,l)=>d(g)-d(l)),y},isCovered(y){let d=this.stack,g=d.reduce((l,F,x)=>F.contains(y)?x:l,-1);return d.some((l,F)=>{if(s.has(l)||a.exclude&&l.matches(a.exclude))return!1;let x=a.covers?.(l,y);return x!==void 0?x:F>g&&!l.contains(y)&&(l.matches("ion-menu")||St(l,p.get(l)))})},enable(y,d){let g={...a,...d},l=[...y,...g.additional??[]];g.exclude&&e.querySelector(g.exclude);let F=new Map;for(let u of l){e.querySelector(u.selector);for(let[B,Z]of Object.entries(u.events)){let _=F.get(Z);if(_&&_.phase!==B)throw new TypeError(`Overlay event "${Z}" has conflicting phases`);F.set(Z,{phase:B,selector:_?`${_.selector}, ${u.selector}`:u.selector})}}a=g,b=l,L=F;for(let u of L.keys()){if(w.has(u))continue;let B=Z=>{let _=L.get(u),Q=Z.composedPath().find(J=>J instanceof e.defaultView.HTMLElement&&J.matches(_.selector));Q&&D(Q,_.phase,Z)};e.addEventListener(u,B,!0),w.set(u,()=>e.removeEventListener(u,B,!0))}for(let[u,B]of w)L.has(u)||(B(),w.delete(u));let x=!j;j||(j=new MutationObserver(()=>W()),j.observe(e.documentElement,{childList:!0,subtree:!0}),e.addEventListener("nativeUIOverlayAdopted",u=>{let B=u.detail;B?.ownerDocument===e&&D(B,"willPresent",u)})),W(x),(x||d)&&H({phase:"change"})}}},at=e=>{let o=e;return o[xt]??=Ht(e)};var kt=Symbol.for("@webview-native-ui/engine/projection-pause/v1"),Rt=e=>{let o=at(e),s=new Set,v=0,p=0,f=()=>v>0||p!==0,w=()=>{for(let a of s)a()},b=a=>{if(a<0&&v===0)return;let L=f();v+=a;let j=e.defaultView;p&&j&&(j.cancelAnimationFrame(p),p=0),v===0&&j?p=j.requestAnimationFrame(()=>{p=j.requestAnimationFrame(()=>{p=0,w()})}):L!==f()&&w()};return{isPaused:a=>f()||!!a&&o.isCovered(a),subscribe(a){s.add(a);let L=o.subscribe(a);return()=>{s.delete(a),L()}},pause:()=>b(1),resume:()=>b(-1)}},_e=e=>{let o=e;return o[kt]??=Rt(e)};function*De(e){let o=e;for(;o;){let s=o.getRootNode();o=o.assignedSlot??o.parentElement??(s instanceof ShadowRoot?s.host:null),o&&(yield o)}}var Ct=({x:e,y:o,width:s,height:v})=>({x:e,y:o,width:s,height:v}),ct=e=>{let o=e.getBoundingClientRect(),s=getComputedStyle(e),v=parseFloat(s.borderLeftWidth)||0,p=parseFloat(s.borderTopWidth)||0;return{x:o.left+v,y:o.top+p,width:o.width-v-(parseFloat(s.borderRightWidth)||0),height:o.height-p-(parseFloat(s.borderBottomWidth)||0)}},Qe=(e,o,s)=>{let v=[e,...De(e)],p=v.indexOf(o);if(p<=0||o===e.ownerDocument.scrollingElement)return;let f=e.ownerDocument.defaultView;if(f.visualViewport&&(f.visualViewport.scale!==1||f.visualViewport.offsetLeft||f.visualViewport.offsetTop))return;let w=0,b=0,a=f.innerWidth,L=f.innerHeight;for(let[W,y]of v.entries()){let d=getComputedStyle(y);if(d.transform!=="none"&&!new DOMMatrixReadOnly(d.transform).isIdentity||d.zoom&&d.zoom!=="normal"&&Number(d.zoom)!==1||[d.translate,d.rotate,d.scale,d.perspective].some(x=>x&&x!=="none")||d.writingMode&&d.writingMode!=="horizontal-tb"||W<p&&/^(fixed|sticky)$/.test(d.position))return;if(W===0)continue;if(d.scrollbarGutter&&d.scrollbarGutter!=="auto")return;let g=/^(auto|scroll|hidden|clip)$/.test(d.overflowX),l=/^(auto|scroll|hidden|clip)$/.test(d.overflowY);if(W<p&&(g||l))return;let F=y===e.ownerDocument.scrollingElement;if(W>p&&((g||F)&&y.scrollWidth>y.clientWidth||(l||F)&&y.scrollHeight>y.clientHeight)||(g||l)&&[d.borderTopLeftRadius,d.borderTopRightRadius,d.borderBottomLeftRadius,d.borderBottomRightRadius].some(x=>parseFloat(x)>0)||d.clipPath&&d.clipPath!=="none"||d.maskImage&&d.maskImage!=="none")return;if(W>=p){let x=ct(y);g&&(w=Math.max(w,x.x),a=Math.min(a,x.x+x.width)),l&&(b=Math.max(b,x.y),L=Math.min(L,x.y+x.height))}}let j=getComputedStyle(o);if(!/^(auto|scroll)$/.test(j.overflowX)&&!/^(auto|scroll)$/.test(j.overflowY))return;let H=ct(o);if(a<=w||L<=b||!H.width||!H.height)return;let D=Ct(e.getBoundingClientRect());return{id:s(o),offsetX:o.scrollLeft,offsetY:o.scrollTop,viewport:H,clip:{x:w,y:b,width:a-w,height:L-b},contentWidth:o.scrollWidth,contentHeight:o.scrollHeight,frame:{...D,x:D.x-H.x+o.scrollLeft,y:D.y-H.y+o.scrollTop}}};var lt=e=>{let o=globalThis;if(o.Capacitor?.convertFileSrc)return o.Capacitor.convertFileSrc(e);if(!e.startsWith("file:"))return e;if(o.WkWebView?.convertFilePath)return o.WkWebView.convertFilePath(e);throw new Error("Native UI file URL requires a host resource handler")};var me=e=>new Promise((o,s)=>{let v=setTimeout(()=>s(new Error("Native UI bridge timed out")),5e3);e.then(o,s).finally(()=>clearTimeout(v))}),Je=async e=>{try{return await me(e)}catch(o){throw e.then(s=>s.remove()).catch(()=>{}),o}};var Ge=async(e,o)=>{let s=new Map;for(let b of e.update??[])s.set(b,{updated:!0});for(let b of["native","web","none"])for(let a of e.projection?.[b]??[]){let L=s.get(a)??{updated:!1};if(L.destination&&L.destination!==b)throw new TypeError(`Projection event "${a}" has conflicting destinations`);s.set(a,{...L,destination:b})}let v=!1,p=[],f=async()=>{v=!0;let a=(await Promise.allSettled(p.splice(0).map(L=>Promise.resolve().then(()=>L.remove())))).find(L=>L.status==="rejected");if(a?.status==="rejected")throw a.reason},w=[...s].map(async([b,a])=>{let L=await Je(Promise.resolve().then(()=>e.addListener(b,j=>{!v&&(!e.accepts||e.accepts(j))&&o(a.destination,a.updated)})));v?await L.remove():p.push(L)});try{return await Promise.all(w),{remove:f}}catch(b){throw await f().catch(()=>{}),b}};var xe=":is([data-native-ui-snapshot-source], [data-native-ui-snapshot-prepared], [data-native-ui-snapshot-content])",dt=`
2
2
  @layer native-ui-projection {
3
3
  ${xe}, ${xe} *, ${xe}::part(native) { visibility: hidden !important; }
4
4
  ${xe}::before, ${xe}::after,
@@ -6,9 +6,8 @@ ${xe} *::before, ${xe} *::after {
6
6
  visibility: hidden !important;
7
7
  }
8
8
  }
9
- [data-native-ui-snapshot-visible] { opacity:1!important;overflow:visible!important; }
10
9
  [data-native-ui-snapshot-visible][data-native-ui-snapshot-positioned] { position:relative!important; }
11
- `,st=`
10
+ `,ut=`
12
11
  @layer native-ui-projection {
13
12
  :host([data-native-ui-snapshot-content]),
14
13
  :host([data-native-ui-snapshot-content])::before,
@@ -19,4 +18,4 @@ ${xe} *::before, ${xe} *::after {
19
18
  visibility: hidden !important;
20
19
  }
21
20
  }
22
- `;var Pt=(t,r=!1)=>JSON.stringify(t.map(({control:o})=>[o.id,o.kind,o.placement,r?0:o.x,r?0:o.y,o.width,o.height,o.dark,o.rtl])),Tt=async(t,r,o)=>{let v=o.captureDelayMs??50;if(!Number.isFinite(v)||v<0||v>2147483647)throw new RangeError("captureDelayMs must be a finite, nonnegative timer interval");let y="native",m=t.element.ownerDocument,f=m.defaultView,P=Array.from(f.crypto.getRandomValues(new Uint32Array(4)),e=>e.toString(16)).join("-"),p=e=>e.isConnected&&e.ownerDocument===m,M=e=>!!e?.isConnected&&e.ownerDocument===m,x=new Map,j=new Set,B=e=>{j.delete(e),e.style.setProperty("display","none","important"),e.removeAttribute("data-native-ui-projection-image"),e.removeAttribute("src"),He()},k=r.send.bind(r),g="data-native-ui-snapshot",d=`${t.namespace}:sources-change`,w=new Set,c=new Set,W=new Set,R=new WeakMap,l=0,V=e=>JSON.stringify(e.map(i=>{R.has(i.scope)||R.set(i.scope,++l);let n=o.transient&&!o.opaqueUnderlay?i.scope.element.getBoundingClientRect():void 0,a=n?{...i,control:{...i.control,x:i.control.x-n.x,y:i.control.y-n.y}}:i;return[R.get(i.scope),Pt([a],!!o.opaqueUnderlay)]})),$=new Map,G=e=>{let i=e.getRootNode();return i.nodeType===11&&"host"in i?i:m},ye=e=>{if($.has(e))return;let i=m.createElement("style");i.setAttribute("data-native-ui-snapshot-base",""),i.textContent=rt+(e.nodeType===11?st:""),(e.nodeType===11?e:e.head).append(i),$.set(e,i)},J=e=>{let i=[...e.getAnimations({subtree:!0}),...[...K.get(e)??[]].flatMap(n=>n.shadowRoot?.getAnimations()??[])];for(let n of i)"transitionProperty"in n&&n.transitionProperty==="visibility"&&n.cancel()},K=new Map,ee=e=>{let i=K.get(e)??new Set;K.set(e,i);let n=e.hasAttribute("data-native-ui-snapshot-source")||e.hasAttribute("data-native-ui-snapshot-prepared"),a=T=>{if(!T.hasAttribute("data-native-ui-projection-node")){if(T.shadowRoot){i.add(T),ye(T.shadowRoot);for(let S of T.shadowRoot.children)a(S)}for(let S of T.children)a(S)}};a(e);for(let T of i)T.toggleAttribute("data-native-ui-snapshot-content",n);J(e)},pe=()=>`${f.innerWidth}:${f.innerHeight}:${f.devicePixelRatio}`,re=!1,le=!1,te=0,de=0,L,me,b,H=!1,D=!1,Pe=0,Te=0,oe=0,ue=0,I=0,fe=-1,A=!1,Fe=!1,Y,He=()=>{let e=new Set(Y?.candidates.map(n=>n.scope.element));for(let[n,a]of x){let T=!A&&n.isConnected&&e.has(n);if(T&&(b||D||re))continue;let S=T?2*Math.max(1,L?.scopes.filter(O=>O.element===n).length??0):0,C=Math.max(0,S-a.filter(O=>j.has(O)).length),U=a.filter(O=>j.has(O)||C-- >0?!0:(O.remove(),!1));U.length?x.set(n,U):x.delete(n)}let i=new Set([...Y?.candidates.map(n=>n.scope.element.getRootNode())??[],...b?.scopes.map(n=>n.element.getRootNode())??[],...L?.scopes.map(n=>n.element.getRootNode())??[],...[...j].map(n=>n.getRootNode()),...[...K.values()].flatMap(n=>[...n].map(a=>a.shadowRoot))]);for(let[n,a]of $)n.nodeType===11&&!i.has(n)&&(a.remove(),$.delete(n))},ge=new Set,Ve=(e,i,n)=>{let a=()=>{ge.delete(a)&&(k({action:e,token:i}).catch(()=>{}),e==="restored"&&He())};ge.add(a),n&&!A?f.requestAnimationFrame(()=>f.requestAnimationFrame(a)):a()},q=new Set,ke=()=>{q.forEach(e=>W.delete(e)),q.clear()},Le=(e,i=!1)=>{!e||e===L||e===b||(e.images.forEach(n=>{B(n)}),Ve("release",e.data.token,i))},se=e=>e.filter(i=>{if(!M(i.scope.element)||![i.element,...i.sources??[]].every(p))return!1;if(i.control.scroll){let n=i.element.getBoundingClientRect(),a=i.control.scroll.clip;if(n.right<=a.x||n.bottom<=a.y||n.left>=a.x+a.width||n.top>=a.y+a.height)return!1}return o.eligible?.(i)??!0}),ze=async()=>{if(ue=0,A||y!=="native"||Fe||H||b||o.blocked()||!Y||L?.revision===Y.revision&&fe===I)return;let{revision:e,candidates:i}=Y,n=oe,a=I,T=pe(),S=se(i);if(!S.length)return;Fe=!0;let C,U=!1,O=[];try{let ae=!1,ce=k({action:"prepare",revision:o.captureRevision?.()??e,viewportWidth:f.innerWidth,ids:S.map(E=>E.control.id)});ce.then(E=>{ae&&E.token&&k({action:"release",token:E.token}).catch(()=>{})}).catch(()=>{});try{C=await he(ce)}finally{ae=!0}if(!C.token||!C.parts?.length)return;let We=new Set(S.map(E=>E.control.id));if(C.parts.some(E=>!E.url.startsWith("file:")&&!/^\/__native_ui_engine__\/nativeUI[a-fA-F0-9]+\/[a-fA-F0-9-]+-[0-9]+\.png$/.test(E.url)||!E.ids.length||E.ids.some(_=>!We.has(_))||![E.x,E.y,E.width,E.height].every(Number.isFinite)||E.width<=0||E.height<=0)||new Set(C.parts.flatMap(E=>E.ids)).size!==We.size||C.parts.some(E=>new Set(E.ids.map(_=>S.find(Se=>Se.control.id===_).scope)).size!==1)||(await he(Promise.all(C.parts.map(async E=>{let _=S.find(_e=>E.ids.includes(_e.control.id)).scope.element,Se=x.get(_);Se||(Se=[],x.set(_,Se));let ve=Se.find(_e=>!j.has(_e));return ve||(ve=m.createElement("img"),ve.setAttribute("data-native-ui-projection-node",""),Se.push(ve)),j.add(ve),O.push(ve),ve.src=it(E.url),await ve.decode(),ve}))),A||y!=="native"||H||b||o.blocked()||oe!==n||pe()!==T||Y?.revision!==e||S.some(E=>!M(E.scope.element)||![E.element,...E.sources??[]].every(p))))return;let De=L,et={data:C,images:O,sources:Array.from(new Set(S.flatMap(E=>[E.element,...E.sources??[]]))),targets:C.parts.map(E=>S.find(_=>E.ids.includes(_.control.id)).element),scopes:C.parts.map(E=>S.find(_=>E.ids.includes(_.control.id)).scope),parents:C.parts.map(E=>S.find(_=>E.ids.includes(_.control.id)).scope.element.parentNode),frames:[],viewport:T,revision:e,layout:V(S)};try{if(!Q(et))throw new Error("Projection destination is unavailable")}catch(E){Ae();try{Q(),L?.sources.forEach(_=>{W.add(_),q.add(_)})}catch{ne()}throw E}L=et,ke(),L.sources.forEach(E=>{W.add(E),q.add(E)}),o.opaqueUnderlay&&k({action:"prepared",token:C.token}).catch(()=>{}),f.dispatchEvent(new Event(d)),fe=a,U=!0,Le(De)}catch{}finally{U||O.forEach(ae=>{B(ae)}),C?.token&&!U&&k({action:"release",token:C.token}).catch(()=>{}),Fe=!1,Y&&(Y.revision!==e||I!==a)&&ie()}},ie=()=>{f.clearTimeout(ue),!A&&y==="native"&&!b&&!H&&!o.blocked()&&(ue=f.setTimeout(()=>{ze()},v))},Re,Je=(e,i)=>{if(i.some(a=>a.scope.element.ownerDocument!==m||[a.element,...a.sources??[]].some(T=>T.ownerDocument!==m)))throw new TypeError("All projection sources and fallback scopes must share one Document");if(o.blocked())return;!b&&L&&L.layout!==V(se(i))&&je();let n=V(i);Re!==n&&(Re=n,I++,oe++),Y?.revision!==e&&oe++,Y={revision:e,candidates:i},He(),(L?.revision!==e||fe!==I)&&ie()},Me=e=>{!b&&L&&e&&Y?.candidates.some(i=>i.scrollElement===e&&L.sources.includes(i.element))&&je(),b&&z(),I++,oe++,ie()},Ce=await Xe(r.listen(({active:e})=>{H=e,oe++,f.clearTimeout(ue),e||ie()})),Oe=new Set,we=e=>{K.get(e)?.forEach(i=>i.removeAttribute("data-native-ui-snapshot-content")),Oe.delete(e)&&e.removeAttribute("data-native-ui-snapshot-prepared"),e.removeAttribute("data-native-ui-snapshot-visible"),e.removeAttribute(g),e.removeAttribute("data-native-ui-snapshot-positioned"),e.removeAttribute("data-native-ui-snapshot-source"),J(e),K.delete(e)},Ae=()=>{de++,f.cancelAnimationFrame(te);for(let e of Z.keys())e.style.setProperty("opacity","0","important");Z.clear(),te=0,re=!1,le=!1,ke(),b?.sources.forEach(e=>{w.delete(e),c.delete(e)}),h.forEach(we),h.clear(),$.forEach((e,i)=>{(A||i.nodeType===11&&!i.host.isConnected)&&(e.remove(),$.delete(i))})},ne=(e=b,i=D)=>{if(b!==e)return;let n=new Set([b,L]);Ae(),b=void 0,L=void 0,D=!1,f.clearTimeout(Pe),n.forEach(a=>Le(a,i)),o.wake()},$e=()=>{if(!b)return;if(L!==b){ne();return}let e=b;de++,f.cancelAnimationFrame(te),te=0,re=le=!1,e.sources.forEach(i=>{w.delete(i),c.delete(i)}),h.forEach(i=>i.removeAttribute("data-native-ui-snapshot-source")),N(e,!!o.opaqueUnderlay),b=void 0,D=!1,f.clearTimeout(Pe),Ve("restored",e.data.token,!0),e.sources.forEach(i=>{W.add(i),q.add(i)}),o.wake()},s=()=>{D&&$e(),ge.forEach(e=>e())},u=e=>e.scopes.map(i=>M(i.element)?i.element:void 0),h=new Set,N=(e,i)=>{for(let n of h)n.toggleAttribute("data-native-ui-snapshot-visible",i),ee(n);e.images.forEach(n=>n.style.setProperty("opacity",i?"1":"0","important"))},F=new Map,Z=new Map,z=()=>{let e=[];for(let[i,n]of Z){let{target:a,frame:T}=n;if(!a.isConnected){i.remove();continue}let S=a.shadowRoot??a;i.parentNode!==S&&S.insertBefore(i,null);let C=a.getBoundingClientRect(),U=i.getBoundingClientRect(),O=parseFloat(i.style.width)||T.width,ae=parseFloat(i.style.height)||T.height,ce=U.width/O||1,We=U.height/ae||1,De=n.scale??(n.scale={x:ce,y:We});e.push({element:i,left:(parseFloat(i.style.left)||0)+(C.x+T.x*ce/De.x-U.x)/ce,top:(parseFloat(i.style.top)||0)+(C.y+T.y*We/De.y-U.y)/We,width:T.width/De.x,height:T.height/De.y})}for(let{element:i,...n}of e)for(let[a,T]of Object.entries(n)){let S=`${T}px`;i.style.getPropertyValue(a)!==S&&i.style.setProperty(a,S,"important")}},Q=(e=b??L)=>{if(!e||D)return!1;if(!e.sources.every(p)||u(e).some(n=>!n))return je(),!1;let i=u(e);if(b){if(i.some(a=>!a?.isConnected||!$.has(G(a))))return ne(b,!1),!1;let n=new Set;for(let[a,T]of e.targets.entries()){let S=F.get(T),C=i[a];!S||!C?.isConnected||(C.setAttribute(g,S),C.setAttribute("data-native-ui-snapshot-source",""),n.add(C))}for(let a of h)n.has(a)||we(a);return h.clear(),n.forEach(a=>h.add(a)),N(e,le),!0}x.forEach(n=>n.forEach(a=>{e.images.includes(a)||(a.style.setProperty("display","none","important"),a.removeAttribute("data-native-ui-projection-image"))})),F.clear(),Z.clear(),h.forEach(we),h.clear();for(let n of new Set(i)){if(!n)continue;h.add(n),ye(G(n));let a=i.flatMap((U,O)=>U===n?[O]:[]),T=`${P}-${a[0]}`;n.setAttribute(g,T),n!==e.targets[a[0]]&&(n.setAttribute("data-native-ui-snapshot-prepared",""),Oe.add(n)),n.toggleAttribute("data-native-ui-snapshot-visible",!!o.opaqueUnderlay),ee(n);let S=n.getBoundingClientRect();n.toggleAttribute("data-native-ui-snapshot-positioned",f.getComputedStyle(n).position==="static");let C=n.shadowRoot??n;for(let U of[...a].reverse()){let O=e.images[U],ae=e.data.parts[U],ce=e.frames[U]??{x:o.opaqueUnderlay?0:ae.x-S.x,y:o.opaqueUnderlay?0:ae.y-S.y,width:ae.width,height:ae.height};e.frames[U]=ce,F.set(e.targets[U],T),O.inert=!0,O.setAttribute("aria-hidden","true"),O.setAttribute("data-native-ui-projection-image",T),O.style.cssText="all:initial!important;position:absolute!important;display:block!important;visibility:visible!important;pointer-events:none!important;image-rendering:pixelated!important;will-change:opacity!important;opacity:0!important;",O.style.setProperty("width",`${ce.width}px`,"important"),O.style.setProperty("height",`${ce.height}px`,"important"),O.style.setProperty("left","0px","important"),O.style.setProperty("top","0px","important"),O.style.setProperty("opacity",o.opaqueUnderlay?"1":"0","important"),O.parentNode!==C&&C.insertBefore(O,null),Z.set(O,{target:n,frame:ce})}}return e.parents=e.scopes.map(n=>n.element.parentNode),z(),!0},X=e=>e.images.map((i,n)=>{let a=i.getBoundingClientRect();return{...e.data.parts[n],x:a.x,y:a.y,width:a.width,height:a.height}}),Ie=()=>{if(s(),A||y==="none"||b)return;let e=L;if(!e||e.viewport!==pe()||!e.sources.every(p)||o.current&&!o.current(e.targets)||e.targets.some(a=>!F.has(a))||u(e).some(a=>!a?.isConnected)||[...h].some(a=>!a.isConnected))return;e.scopes.some((a,T)=>a.element.parentNode!==e.parents[T])&&Q(),z();let i=++de,n=()=>de===i;re=!0,le=!!o.opaqueUnderlay,b=e,oe++,f.clearTimeout(ue),e.sources.forEach(a=>{w.add(a)}),h.forEach(a=>a.setAttribute("data-native-ui-snapshot-source","")),N(e,le),te=f.requestAnimationFrame(()=>{te=0,n()&&(re=!1,o.wake())}),he(k({action:"cover",token:e.data.token,...o.transient?{transient:!0,viewportWidth:f.innerWidth,parts:X(e)}:{}})).then(a=>{if(n()){if(re=!1,a?.shown!==!0){ne(e,!1);return}D||(le=!0,e.sources.forEach(T=>c.add(T)),Q(),z()),f.cancelAnimationFrame(te),te=f.requestAnimationFrame(()=>{te=0,n()&&k({action:"painted",token:e.data.token}).catch(()=>{n()&&ne(e,!1)})}),o.wake()}}).catch(()=>{n()&&ne(e,!1)})},Ze=()=>{if(!(!b||A||D)){if(!b.sources.every(p)||u(b).some(e=>!e)||o.current&&!o.current(b.targets)){ne(b,!1);return}if(!o.blocked()){if(z(),o.transient){let e=b;if(u(e).some(a=>!a?.isConnected)){ne(e,!1);return}let n=X(e);o.opaqueUnderlay||n.every((a,T)=>a.width===e.data.parts[T].width&&a.height===e.data.parts[T].height)?e.data={...e.data,parts:n}:L=void 0,k({action:"restore",token:e.data.token,viewportWidth:f.innerWidth,parts:n}).catch(()=>{})}Te=o.revision?.()??Y?.revision??0,D=!0,b.sources.forEach(e=>w.delete(e)),Pe=f.setTimeout(()=>{D&&ne(b,!1)},250),o.wake()}}},dt=(e,i,n)=>{!D||!b||n===void 0||n<=Te||!o.transient&&e||b.data.parts.every(a=>a.ids.every(T=>i?.includes(T)))&&($e(),ie())},je=(e=!1)=>{ge.forEach(n=>n()),oe++,f.clearTimeout(ue);let i=L;if(L=void 0,(e||A)&&(me=void 0),o.retainPreparedUntilRelease&&!b&&!e&&!A){if(i){let n={};me=n,he(k({action:"release",token:i.data.token})).catch(()=>{}).finally(()=>{if(i.images.forEach(a=>{B(a)}),me===n&&(me=void 0,!(L||b))){for(let a of h)a.getAttribute(g)!==F.get(a)&&(h.delete(a),Oe.delete(a));Ae(),F.clear(),f.dispatchEvent(new Event(d))}})}if(me)return}Le(i),b?ne(b,!1):(Ae(),F.clear(),f.dispatchEvent(new Event(d)))},Qe;try{o.events&&(Qe=await Ye(o.events,(e,i)=>{if(!A){if(e&&(y=e),y==="none"){je();return}e==="web"&&Ie(),e==="native"&&(Ze(),ie()),i&&Me()}}))}catch(e){throw A=!0,je(),await he(Promise.resolve(Ce.remove())).catch(()=>{}),e}return{get owners(){return[...w]},get visibleOwners(){return[...c]},get preparedOwners(){return[...W]},consider:Je,changed:Me,moved:z,get token(){return D?void 0:b?.data.token},begin:Ie,get restoring(){return D},get handoffPending(){return re},retireRestoration:s,end:Ze,updated:dt,invalidate:je,async destroy(){A=!0,je(),x.forEach(e=>e.forEach(i=>i.remove())),x.clear(),await Promise.allSettled([he(Promise.resolve().then(()=>Ce?.remove())),he(Promise.resolve().then(()=>Qe?.remove()))])}}},at=async(t,r,o)=>{let v=await Tt(t,r,o),y=v.consider;return Object.assign(v,{consider:(m,f)=>y(m,f.map(P=>({...P,scope:t})))})};var ct=(t,r)=>{if(t.nodeType!==1||t.namespaceURI!=="http://www.w3.org/1999/xhtml"||!t.ownerDocument||!("style"in t))throw new TypeError("A Web projection scope requires an HTMLElement fallback");if(t.matches("img, input, textarea, select, video, audio, canvas, iframe, embed, object, br, hr, area, base, link, meta, source, track, wbr"))throw new TypeError("A Web projection fallback must be a container element; use the existing fallback container");return Object.freeze({element:t,namespace:r})};var lt=async(t,r,o={addListener:async(v,y)=>globalThis.Capacitor.addListener(t.plugin,v,y)})=>{let v="view",y=t.receiveListeners,m=!1,f=!1,P="native",p="native",M=nt(document),x=()=>P==="native"&&l&&M.isCovered(l)?"web":P,j=!1,B=!1,k=!1,g=!1,d,w,c,W=!1,R=()=>{let s=W;W=!0;try{c?.begin()}finally{W=s}},l,V=0,$,G=()=>{V++,$?.(),$=void 0},ye=async()=>{if(!t.values||!l||m)return;let s=l;G();let u=V,h=()=>!m&&u===V&&l===s&&fe()===s&&s.isConnected;if(s.localName.includes("-")&&!s.matches(":defined")&&Object.values(t.values).some(F=>F.property)){if(await Promise.race([s.ownerDocument.defaultView.customElements.whenDefined(s.localName),new Promise(F=>{$=F})]),!h())return;$=void 0}let N=await r.send({action:"values"}).catch(()=>{});if(h()&&N?.values&&typeof N.values=="object"&&!Array.isArray(N.values))try{tt(s,N.values,t.values)}catch(F){console.warn("[Native UI Engine] Cannot reflect values",F)}},J={},K,ee=0,pe=new Set,re=()=>{},le=new Promise(s=>{re=s}),te=()=>{pe.clear(),re(),le=new Promise(s=>{re=s})},de=()=>{ee++,K=void 0;let s=Ue(l);s?.owner===J&&(s.projected=!1,s.owner=void 0)},L={listen:s=>r.listen(u=>{s(u),!u.active&&B&&(B=!1,Re()),u.precovered&&Je(u.precovered)}),send:s=>{if(!t.placementHandoff)return r.send(s);if(s.action==="visibility"&&!s.visible&&te(),s.action==="visibility"&&s.visible&&pe.size){let z=H,Q=ee,X=l,Ie=le;return Promise.race([Promise.allSettled([...pe]),Ie]).then(()=>m||Ie!==le||z!==H||Q!==ee||X!==l||!X?.isConnected||fe()!==l||x()!=="native"?{}:L.send(s))}let u=Ue(l);if(s.action==="cover"){let z=K===s.token&&u?.owner===J&&u.projected,Q=++ee;return K=s.token,u&&(u.owner=J,u.projected=!!z),r.send(s).then(X=>(Q===ee&&u===Ue(l)&&u?.owner===J&&(u.projected=X?.shown===!0),X)).catch(X=>{throw Q===ee&&u?.owner===J&&(de(),u.invalidate()),X})}let h=s.action==="release"&&s.token===K,N=K&&(s.action==="restore"||h||s.action==="reset"||s.action==="visibility"&&s.visible);N&&ee++;let F=ee,Z=()=>{F!==ee||u?.owner!==J||(de(),u.invalidate())};try{let z=N&&u?.owner===J?{...s,token:"token"in s?s.token:K,placement:u.measure()}:s,Q=r.send(z).then(async X=>(s.action==="release"&&X?.requiresPlacement&&(u&&(!u.owner||u.owner===J)?X=await r.send({...s,placement:u.measure()}):(await r.send({action:"visibility",visible:!1}),X=await r.send(s))),F===ee&&(s.action==="resume"||h||s.action==="reset"||s.action==="visibility")&&de(),X)).catch(X=>{throw Z(),X});return s.action!=="release"||!t.nativeDragHandoff?Q:(pe.add(Q),Q.finally(()=>pe.delete(Q)))}catch(z){return Z(),Promise.reject(z)}}},me=0,b=0,H=0,D,Pe=!1,Te=!1,oe=!1,ue=document.createElement("style"),I=`data-native-ui-session-${t.id.replace(/[^a-zA-Z0-9-]/g,"")}`;ue.textContent=`[${I}="native"], [${I}="native"] *, [${I}="none"], [${I}="none"] * {visibility:hidden!important}`,document.documentElement.append(ue);let fe=()=>{let s=document.querySelectorAll(t.projectionSelector);return s.length===1&&s[0]instanceof HTMLElement?s[0]:void 0},A=()=>{let s=x();l&&l.getAttribute("data-native-ui-destination")!==s&&l.setAttribute("data-native-ui-destination",s),l&&(p==="web"||p==="native"&&k?l.removeAttribute(I):l.setAttribute(I,p))},Fe=()=>{if(!l?.isConnected)return[];let s=l.getBoundingClientRect(),u={x:s.x,y:s.y,width:s.width,height:s.height},h=d&&Ke(l,d,()=>t.id);return[{element:l,scrollElement:d,control:{id:v,...u,...h?{scroll:h}:{}}}]},Y=async()=>{if(m)return;let s=H,u=t.failedFallback==="native"&&x()==="native"&&!!l?.isConnected;await L.send({action:"visibility",visible:u}).catch(()=>{}),!(m||s!==H)&&(u||p==="none"?A():l?.removeAttribute(I))},He=()=>{if(!j||p!=="native"||!l?.isConnected||c?.token||c?.restoring)return;let s=t.failedFallback==="native";L.send({action:"visibility",visible:s}).catch(()=>{}),s?A():l.removeAttribute(I)},ge=()=>{if(m||W)return;if(He(),p==="web"&&c&&!c.token&&!c.restoring){L.send({action:"visibility",visible:!1}).catch(()=>{}),l?.removeAttribute(I);return}if(!c?.restoring||D===c||p!=="native")return;D=c;let s=H,u=c;L.send({action:"resume"}).then(()=>{m||s!==H||u!==c||fe()!==l||(k=!1,u.updated(void 0,[v],++me),A(),q())}).catch(()=>{s!==H||m||(u.invalidate(),Y())}).finally(()=>{D===u&&(D=void 0),ge()})},Ve=async()=>{if(m||Pe)return;if(fe()!==l){H++,j=!1,B=!1,clearTimeout(w),de(),l?.removeAttribute(I),l?.removeAttribute("data-native-ui-destination"),G();let u=c,h=l;c=void 0,l=void 0,Le.disconnect(),Me();try{h&&await L.send({action:"visibility",visible:!1})}finally{await u?.destroy()}if(m)return;l=fe(),k=!1,l&&(Le.observe(l),ye())}if(Me(),!j){if(c?.restoring){ge();return}if(p=x(),!l){await L.send({action:"visibility",visible:!1});return}if(!c){Pe=!0;let u=H;try{let h=await at(ct(l,t.id),L,{wake:ge,captureDelayMs:t.captureDelayMs,retainPreparedUntilRelease:t.nativeDragHandoff,blocked:()=>p!=="native"||j||k&&!c?.token,revision:()=>me,captureRevision:t.captureMode==="view"?()=>b:void 0,transient:!0,opaqueUnderlay:t.captureMode==="view"});if(m||u!==H){await h.destroy();return}c=h}finally{Pe=!1}}if(!m){if(p==="native"&&k){await L.send({action:"visibility",visible:!1}),A();return}if(p==="native"){let u=H;if(await L.send({action:"visibility",visible:!0}),m||u!==H||p!=="native"||j)return;A(),d=[...Ne(l)].find(Z=>{let z=getComputedStyle(Z);return/auto|scroll/.test(z.overflowX+z.overflowY)&&(Z.scrollHeight>Z.clientHeight||Z.scrollWidth>Z.clientWidth)});let h=d&&Ke(l,d,()=>t.id),N=t.nativeDragHandoff&&t.captureMode==="view"&&d?{viewport:d.getBoundingClientRect(),offsetX:d.scrollLeft,offsetY:d.scrollTop,rangeX:Math.max(0,d.scrollWidth-d.clientWidth),rangeY:Math.max(0,d.scrollHeight-d.clientHeight)}:void 0,F=await L.send({action:"track",viewportWidth:innerWidth,...h?{scroll:h}:{},...N?{gesture:N}:{}});if(m||u!==H)return;g=F?.tracked===!0,c.consider(t.captureMode==="view"?b:++me,Fe())}else await L.send({action:"visibility",visible:!1}),A()}}},q=()=>{m||(Te=!0,!(!f||oe)&&(oe=!0,Promise.resolve().then(async()=>{try{for(;Te&&!m;)Te=!1,await Ve()}catch{await Y()}finally{oe=!1,Te&&q()}})))},ke=()=>{c?.invalidate(),q()},Le=new ResizeObserver(ke);window.addEventListener("resize",ke);let se=new Set,ze=new WeakSet,ie=s=>{let u=s.composedPath()[0]??s.target;if(!(m||p!=="native"||!l||ze.has(s)||u!==document&&![...Ne(l)].includes(u))){if(ze.add(s),g&&u===d){c?.changed(u);return}j?t.captureMode==="view"?c?.moved():c?.changed():((D||c?.restoring)&&H++,j=!0,R(),k=t.failedFallback!=="native",c?.token?l.removeAttribute(I):He()),Re()}};function Re(){clearTimeout(w),w=setTimeout(()=>{B||(j=!1,!(m||p!=="native")&&(c?.end(),c?.restoring||q()))},100)}function Je(s){if(m||p!=="native"||!l?.isConnected||!c||(B=!0,c.token))return;(D||c.restoring)&&H++,K=s;let u=Ue(l);if(u&&(u.owner=J,u.projected=!0),j=!0,R(),!c.token){j=!1,Y();return}Re()}let Me=()=>{let s=new Set(l?Ne(l):[]),u=s.size!==se.size||[...s].some(h=>!se.has(h));for(let h of se)s.has(h)||(h.removeEventListener("scroll",ie),h.removeEventListener("slotchange",Ce),se.delete(h));for(let h of s)se.has(h)||(h.addEventListener("scroll",ie,{passive:!0}),h.addEventListener("slotchange",Ce),se.add(h));u&&(g=!1,d=void 0,c?.invalidate(),q())},Ce=()=>{Me(),q()};document.addEventListener("scroll",ie,!0);let Oe=new MutationObserver(s=>{Me(),fe()!==l?q():l&&s.some(u=>u.type==="childList")&&we(x())});Oe.observe(document.documentElement,{childList:!0,attributes:!0,subtree:!0});let we=(s,u=!1)=>{if(m||!u&&s===p)return;j=!1,B=!1,clearTimeout(w),p=s,H++;let h=H;p==="none"?L.send({action:"visibility",visible:!1}).then(()=>{p!=="none"||h!==H||m||(c?.invalidate(!0),A())}).catch(()=>{p!=="none"||h!==H||m||(c?.invalidate(!0),A())}):p==="web"?(R(),c?.token||L.send({action:"visibility",visible:!1}).catch(()=>{}),A()):p==="native"&&(c?.end(),c?.restoring||q())},Ae=M.subscribe(()=>queueMicrotask(()=>we(x()))),ne,$e=async()=>{if(!m){m=!0,te(),G(),de(),H++,Ae(),Oe.disconnect(),Le.disconnect(),window.removeEventListener("resize",ke),document.removeEventListener("scroll",ie,!0);for(let s of se)s.removeEventListener("scroll",ie),s.removeEventListener("slotchange",Ce);se.clear(),clearTimeout(w),l?.removeAttribute(I),l?.removeAttribute("data-native-ui-destination"),ue.remove(),await Promise.allSettled([Promise.resolve(ne?.remove()),c?.destroy()])}};try{let s=H;ne=await Ye({addListener:(h,N)=>o.addListener(h,N),update:y?.update,projection:y?.projection,accepts:h=>!y?.match||Object.entries(y?.match).every(([N,F])=>typeof h=="object"&&h!==null&&h[N]===F)},(h,N)=>{m||(h&&(h==="native"&&(k=!1),P=h,L.send({action:"destination",destination:h}).catch(()=>{}),we(x(),!0)),N&&(ye(),b++,c?.changed(),p==="native"&&q()))});let u=await L.send({action:"connect"});return H===s&&["native","web","none"].includes(u?.destination)&&(P=u.destination),p=x(),f=!0,q(),{destroy:$e,show:()=>{k=!1,P="native",we(x(),!0)},hide:()=>{P=p="none",H++,te(),j=!1,B=!1,clearTimeout(w),c?.invalidate(!0),A()}}}catch(s){throw await $e(),s}};var be=new Map,Ee=new Map,Be=new Map,Lt=Array.from(crypto.getRandomValues(new Uint32Array(4)),t=>t.toString(16)).join("-"),qe=new Map,Mt=(t,r,o)=>qe.get(t)?.get(r)?.(o),jt=0,St=(t,r)=>new Promise((o,v)=>{let y=`${t}:${Lt}:${++jt}`,m=setTimeout(()=>{Ee.delete(y),v(new Error("Native UI session timed out"))},5e3);Ee.set(y,{resolve:o,reject:v,timer:m});let f=JSON.stringify({key:y,request:r}),P=globalThis,p=P.webkit?.messageHandlers?.[t]??P[t]??P.nativeUIEngine;if(!p){clearTimeout(m),Ee.delete(y),v(new Error("Native UI session unavailable"));return}try{p.postMessage(f)}catch(M){clearTimeout(m),Ee.delete(y),v(M)}}),xt=(t,r,o,v)=>{if(r===null){Be.get(t)?.(o);return}let y=Ee.get(r);!y||!r.startsWith(`${t}:`)||(Ee.delete(r),clearTimeout(y.timer),v?y.reject(new Error(v)):y.resolve(o))},Ht=t=>{be.get(t)?.show()},kt=t=>(be.get(t)?.hide(),!0),Rt=async t=>{let r=be.get(t);be.delete(t),qe.delete(t),Be.delete(t);for(let[o,v]of Ee)o.startsWith(`${t}:`)&&(Ee.delete(o),clearTimeout(v.timer),v.reject(new Error("Native UI session closed")));await r?.destroy()},Ct=async t=>{if(be.has(t.id))return;let r,o=!1,v,y={show:()=>{v="native",r?.show()},hide:()=>{v="none",r?.hide()},destroy:async()=>{o=!0,await r?.destroy()}};be.set(t.id,y);try{if(document.readyState==="loading"&&await new Promise(f=>document.addEventListener("DOMContentLoaded",()=>f(),{once:!0})),o)return;let m=new Map;t.runtime==="cordova"&&qe.set(t.id,m),r=await lt(t,{send:f=>St(t.id,f),listen:async f=>(Be.set(t.id,f),{remove:()=>{Be.get(t.id)===f&&Be.delete(t.id)}})},t.runtime==="cordova"?{addListener:async(f,P)=>(m.set(f,P),{remove:()=>{m.delete(f)}})}:void 0),v==="none"?r.hide():v==="native"&&r.show(),o&&await r.destroy()}catch(m){throw be.get(t.id)===y&&(be.delete(t.id),qe.delete(t.id)),m}};return ht(Ot);})();
21
+ `;var At=({control:e},o=!1)=>[e.id,e.kind,e.placement,o?0:e.x,o?0:e.y,e.width,e.height,e.dark,e.rtl],Ot=async(e,o,s)=>{let v=s.captureDelayMs??50;if(!Number.isFinite(v)||v<0||v>2147483647)throw new RangeError("captureDelayMs must be a finite, nonnegative timer interval");let p="native",f=e.element.ownerDocument,w=_e(f),b=!1,a=f.defaultView,L=Array.from(a.crypto.getRandomValues(new Uint32Array(4)),t=>t.toString(16)).join("-"),j=t=>t.isConnected&&t.ownerDocument===f,H=t=>!!t?.isConnected&&t.ownerDocument===f,D=new Map,W=new Set,y=t=>{W.delete(t),t.style.setProperty("display","none","important"),t.removeAttribute("data-native-ui-projection-image"),t.removeAttribute("src"),Fe()},d=o.send.bind(o),g="data-native-ui-snapshot",l=`${e.namespace}:sources-change`,F=new Set,x=new Set,u=new Set,B=new WeakMap,Z=0,_=t=>JSON.stringify(t.map(n=>{B.has(n.scope)||B.set(n.scope,++Z);let r=s.transient&&!s.opaqueUnderlay?n.scope.element.getBoundingClientRect():void 0,c=r?{...n,control:{...n.control,x:n.control.x-r.x,y:n.control.y-r.y}}:n;return[B.get(n.scope),At(c,!!s.opaqueUnderlay)]})),Q=new Map,J=t=>{let n=t.getRootNode();return n.nodeType===11&&"host"in n?n:f},le=t=>{if(Q.has(t))return;let n=f.createElement("style");n.setAttribute("data-native-ui-snapshot-base",""),n.textContent=dt+(t.nodeType===11?ut:""),(t.nodeType===11?t:t.head).append(n),Q.set(t,n)},ee=t=>{let n=[...t.getAnimations({subtree:!0}),...[...ne.get(t)??[]].flatMap(r=>r.shadowRoot?.getAnimations()??[])];for(let r of n)"transitionProperty"in r&&r.transitionProperty==="visibility"&&r.cancel()},ne=new Map,He=t=>{let n=ne.get(t)??new Set;ne.set(t,n);let r=t.hasAttribute("data-native-ui-snapshot-source")||t.hasAttribute("data-native-ui-snapshot-prepared"),c=h=>{if(!h.hasAttribute("data-native-ui-projection-node")){if(h.shadowRoot){n.add(h),le(h.shadowRoot);for(let M of h.shadowRoot.children)c(M)}for(let M of h.children)c(M)}};c(t);for(let h of n)h.toggleAttribute("data-native-ui-snapshot-content",r);ee(t)},Pe=()=>`${a.innerWidth}:${a.innerHeight}:${a.devicePixelRatio}`,re=!1,oe=!1,C=0,ve=0,A,S,P,he=!1,V=!1,Ee=0,ke=0,$=0,te=0,X=0,Ne=-1,z=!1,Re=!1,Y,Fe=()=>{let t=new Set(Y?.candidates.map(r=>r.scope.element));for(let[r,c]of D){let h=!z&&r.isConnected&&t.has(r);if(h&&(P||V||re))continue;let M=h?2*Math.max(1,A?.scopes.filter(R=>R.element===r).length??0):0,O=Math.max(0,M-c.filter(R=>W.has(R)).length),U=c.filter(R=>W.has(R)||O-- >0?!0:(R.remove(),!1));U.length?D.set(r,U):D.delete(r)}let n=new Set([...Y?.candidates.map(r=>r.scope.element.getRootNode())??[],...P?.scopes.map(r=>r.element.getRootNode())??[],...A?.scopes.map(r=>r.element.getRootNode())??[],...[...W].map(r=>r.getRootNode()),...[...ne.values()].flatMap(r=>[...r].map(c=>c.shadowRoot))]);for(let[r,c]of Q)r.nodeType===11&&!n.has(r)&&(c.remove(),Q.delete(r))},G=new Set,Ce=(t,n,r)=>{let c=()=>{G.delete(c)&&(d({action:t,token:n}).catch(()=>{}),t==="restored"&&Fe())};G.add(c),r&&!z?a.requestAnimationFrame(()=>a.requestAnimationFrame(c)):c()},ue=new Set,se=()=>{ue.forEach(t=>u.delete(t)),ue.clear()},Ae=(t,n=!1)=>{!t||t===A||t===P||(t.images.forEach(r=>{y(r)}),Ce("release",t.data.token,n))},ye=t=>t.filter(n=>{if(!H(n.scope.element)||![n.element,...n.sources??[]].every(j))return!1;if(n.control.scroll){let r=n.element.getBoundingClientRect(),c=n.control.scroll.clip;if(r.right<=c.x||r.bottom<=c.y||r.left>=c.x+c.width||r.top>=c.y+c.height)return!1}return s.eligible?.(n)??!0}),$e=async()=>{if(te=0,z||p!=="native"||Re||he||P||s.blocked()||!Y||A?.revision===Y.revision&&Ne===X)return;let{revision:t,candidates:n}=Y,r=$,c=X,h=Pe(),M=ye(n);if(!M.length)return;Re=!0;let O,U=!1,R=[];try{let ae=!1,ce=d({action:"prepare",revision:s.captureRevision?.()??t,viewportWidth:a.innerWidth,ids:M.map(T=>T.control.id)});ce.then(T=>{ae&&T.token&&d({action:"release",token:T.token}).catch(()=>{})}).catch(()=>{});try{O=await me(ce)}finally{ae=!0}if(!O.token||!O.parts?.length)return;let We=new Set(M.map(T=>T.control.id));if(O.parts.some(T=>!T.url.startsWith("file:")&&!/^\/__native_ui_engine__\/nativeUI[a-fA-F0-9]+\/[a-fA-F0-9-]+-[0-9]+\.png$/.test(T.url)||!T.ids.length||T.ids.some(de=>!We.has(de))||![T.x,T.y,T.width,T.height].every(Number.isFinite)||T.width<=0||T.height<=0)||new Set(O.parts.flatMap(T=>T.ids)).size!==We.size||O.parts.some(T=>new Set(T.ids.map(de=>M.find(Ye=>Ye.control.id===de).scope)).size!==1))return;let fe=O.parts.map(T=>M.find(de=>T.ids.includes(de.control.id)));if(await me(Promise.all(O.parts.map(async(T,de)=>{let Ye=fe[de].scope.element,Ve=D.get(Ye);Ve||(Ve=[],D.set(Ye,Ve));let pe=Ve.find(wt=>!W.has(wt));return pe||(pe=f.createElement("img"),pe.setAttribute("data-native-ui-projection-node",""),Ve.push(pe)),W.add(pe),R.push(pe),pe.src=lt(T.url),await pe.decode(),pe}))),z||p!=="native"||he||P||s.blocked()||$!==r||Pe()!==h||Y?.revision!==t||M.some(T=>!H(T.scope.element)||![T.element,...T.sources??[]].every(j)))return;let gt=A,rt={data:O,images:R,sources:Array.from(new Set(M.flatMap(T=>[T.element,...T.sources??[]]))),targets:fe.map(T=>T.element),scopes:fe.map(T=>T.scope),parents:fe.map(T=>T.scope.element.parentNode),frames:[],viewport:h,revision:t,layout:_(M)};try{if(!je(rt))throw new Error("Projection destination is unavailable")}catch(T){Me();try{je(),A?.sources.forEach(de=>{u.add(de),ue.add(de)})}catch{i()}throw T}A=rt,se(),A.sources.forEach(T=>{u.add(T),ue.add(T)}),s.opaqueUnderlay&&d({action:"prepared",token:O.token}).catch(()=>{}),a.dispatchEvent(new Event(l)),Ne=c,U=!0,Ae(gt),w.isPaused()&&Xe()}catch{}finally{U||R.forEach(ae=>{y(ae)}),O?.token&&!U&&d({action:"release",token:O.token}).catch(()=>{}),Re=!1,Y&&(Y.revision!==t||X!==c)&&ge()}},ge=()=>{a.clearTimeout(te),!z&&p==="native"&&!P&&!he&&!s.blocked()&&(te=a.setTimeout(()=>{$e()},v))},Te,Ie=(t,n)=>{if(n.some(c=>c.scope.element.ownerDocument!==f||[c.element,...c.sources??[]].some(h=>h.ownerDocument!==f)))throw new TypeError("All projection sources and fallback scopes must share one Document");if(s.blocked())return;!P&&A&&A.layout!==_(ye(n))&&Se();let r=_(n);Te!==r&&(Te=r,X++,$++),Y?.revision!==t&&$++,Y={revision:t,candidates:n},Fe(),(A?.revision!==t||Ne!==X)&&ge()},Ue=t=>{!P&&A&&t&&Y?.candidates.some(n=>n.scrollElement===t&&A.sources.includes(n.element))&&Se(),P&&I(),X++,$++,ge()},Le=await Je(o.listen(({active:t})=>{he=t,$++,a.clearTimeout(te),t||ge()})),Be=new Set,Oe=t=>{ne.get(t)?.forEach(n=>n.removeAttribute("data-native-ui-snapshot-content")),Be.delete(t)&&t.removeAttribute("data-native-ui-snapshot-prepared"),t.removeAttribute("data-native-ui-snapshot-visible"),t.removeAttribute(g),t.removeAttribute("data-native-ui-snapshot-positioned"),t.removeAttribute("data-native-ui-snapshot-source"),ee(t),ne.delete(t)},Me=()=>{ve++,a.cancelAnimationFrame(C);for(let t of K.keys())t.style.setProperty("opacity","0","important");K.clear(),C=0,re=!1,oe=!1,se(),P?.sources.forEach(t=>{F.delete(t),x.delete(t)}),k.forEach(Oe),k.clear(),Q.forEach((t,n)=>{(z||n.nodeType===11&&!n.host.isConnected)&&(t.remove(),Q.delete(n))})},i=(t=P,n=V)=>{if(P!==t)return;let r=new Set([P,A]);Me(),P=void 0,A=void 0,V=!1,a.clearTimeout(Ee),r.forEach(c=>Ae(c,n)),s.wake()},m=()=>{if(!P)return;if(A!==P){i();return}let t=P;ve++,a.cancelAnimationFrame(C),C=0,re=oe=!1,t.sources.forEach(n=>{F.delete(n),x.delete(n)}),k.forEach(n=>n.removeAttribute("data-native-ui-snapshot-source")),ie(t,!!s.opaqueUnderlay),P=void 0,V=!1,a.clearTimeout(Ee),Ce("restored",t.data.token,!0),t.sources.forEach(n=>{u.add(n),ue.add(n)}),s.wake()},E=()=>{V&&m(),G.forEach(t=>t())},N=t=>t.scopes.map(n=>H(n.element)?n.element:void 0),k=new Set,ie=(t,n)=>{for(let r of k)r.toggleAttribute("data-native-ui-snapshot-visible",n),He(r);t.images.forEach(r=>r.style.setProperty("opacity",n?"1":"0","important"))},q=new Map,K=new Map,I=()=>{let t=[];for(let[n,r]of K){let{target:c,frame:h}=r;if(!c.isConnected){n.remove();continue}let M=c.shadowRoot??c;n.parentNode!==M&&M.insertBefore(n,null);let O=c.getBoundingClientRect(),U=n.getBoundingClientRect(),R=parseFloat(n.style.width)||h.width,ae=parseFloat(n.style.height)||h.height,ce=U.width/R||1,We=U.height/ae||1,fe=r.scale??(r.scale={x:ce,y:We});t.push({element:n,left:(parseFloat(n.style.left)||0)+(O.x+h.x*ce/fe.x-U.x)/ce,top:(parseFloat(n.style.top)||0)+(O.y+h.y*We/fe.y-U.y)/We,width:h.width/fe.x,height:h.height/fe.y})}for(let{element:n,...r}of t)for(let[c,h]of Object.entries(r)){let M=`${h}px`;n.style.getPropertyValue(c)!==M&&n.style.setProperty(c,M,"important")}},je=(t=P??A)=>{if(!t||V)return!1;if(!t.sources.every(j)||N(t).some(r=>!r))return Se(),!1;let n=N(t);if(P){if(n.some(c=>!c?.isConnected||!Q.has(J(c))))return i(P,!1),!1;let r=new Set;for(let[c,h]of t.targets.entries()){let M=q.get(h),O=n[c];!M||!O?.isConnected||(O.setAttribute(g,M),O.setAttribute("data-native-ui-snapshot-source",""),r.add(O))}for(let c of k)r.has(c)||Oe(c);return k.clear(),r.forEach(c=>k.add(c)),ie(t,oe),!0}D.forEach(r=>r.forEach(c=>{t.images.includes(c)||(c.style.setProperty("display","none","important"),c.removeAttribute("data-native-ui-projection-image"))})),q.clear(),K.clear(),k.forEach(Oe),k.clear();for(let r of new Set(n)){if(!r)continue;k.add(r),le(J(r));let c=n.flatMap((U,R)=>U===r?[R]:[]),h=`${L}-${c[0]}`;r.setAttribute(g,h),r!==t.targets[c[0]]&&(r.setAttribute("data-native-ui-snapshot-prepared",""),Be.add(r)),r.toggleAttribute("data-native-ui-snapshot-visible",!!s.opaqueUnderlay),He(r);let M=r.getBoundingClientRect();r.toggleAttribute("data-native-ui-snapshot-positioned",a.getComputedStyle(r).position==="static");let O=r.shadowRoot??r;for(let U of[...c].reverse()){let R=t.images[U],ae=t.data.parts[U],ce=t.frames[U]??{x:s.opaqueUnderlay?0:ae.x-M.x,y:s.opaqueUnderlay?0:ae.y-M.y,width:ae.width,height:ae.height};t.frames[U]=ce,q.set(t.targets[U],h),R.inert=!0,R.setAttribute("aria-hidden","true"),R.setAttribute("data-native-ui-projection-image",h),R.style.cssText="all:initial!important;position:absolute!important;display:block!important;visibility:visible!important;pointer-events:none!important;image-rendering:pixelated!important;will-change:opacity!important;opacity:0!important;",R.style.setProperty("width",`${ce.width}px`,"important"),R.style.setProperty("height",`${ce.height}px`,"important"),R.style.setProperty("left","0px","important"),R.style.setProperty("top","0px","important"),R.style.setProperty("opacity",s.opaqueUnderlay?"1":"0","important"),R.parentNode!==O&&O.insertBefore(R,null),K.set(R,{target:r,frame:ce})}}return t.parents=t.scopes.map(r=>r.element.parentNode),I(),!0},et=t=>t.images.map((n,r)=>{let c=n.getBoundingClientRect();return{...t.data.parts[r],x:c.x,y:c.y,width:c.width,height:c.height}}),Xe=(t=!1)=>{if(E(),z||p==="none"||P&&!t)return;let n=P??A;if(!n||n.viewport!==Pe()||!n.sources.every(j)||s.current&&!s.current(n.targets)||n.targets.some(h=>!q.has(h))||N(n).some(h=>!h?.isConnected)||[...k].some(h=>!h.isConnected))return;n.scopes.some((h,M)=>h.element.parentNode!==n.parents[M])&&je(),I();let r=++ve,c=()=>ve===r;re=!0,oe=!!s.opaqueUnderlay,P=n,$++,a.clearTimeout(te),n.sources.forEach(h=>{F.add(h)}),k.forEach(h=>h.setAttribute("data-native-ui-snapshot-source","")),ie(n,oe),C=a.requestAnimationFrame(()=>{C=0,c()&&(re=!1,s.wake())}),me(d({action:"cover",token:n.data.token,...s.transient?{transient:!0,viewportWidth:a.innerWidth,parts:et(n)}:{}})).then(h=>{if(c()){if(re=!1,h?.shown!==!0){i(n,!1);return}V||(oe=!0,n.sources.forEach(M=>x.add(M)),je(),I()),a.cancelAnimationFrame(C),C=a.requestAnimationFrame(()=>{C=0,c()&&d({action:"painted",token:n.data.token}).then(M=>{c()&&M?.shown===!1&&i(n,!1)}).catch(()=>{c()&&i(n,!1)})}),s.wake()}}).catch(()=>{c()&&i(n,!1)})},tt=()=>{if(!(!P||z||V)){if(!P.sources.every(j)||N(P).some(t=>!t)||s.current&&!s.current(P.targets)){i(P,!1);return}if(!s.blocked()){if(I(),s.transient){let t=P;if(N(t).some(c=>!c?.isConnected)){i(t,!1);return}let r=et(t);s.opaqueUnderlay||r.every((c,h)=>c.width===t.data.parts[h].width&&c.height===t.data.parts[h].height)?t.data={...t.data,parts:r}:A=void 0,d({action:"restore",token:t.data.token,viewportWidth:a.innerWidth,parts:r}).catch(()=>{})}ke=s.revision?.()??Y?.revision??0,V=!0,P.sources.forEach(t=>F.delete(t)),Ee=a.setTimeout(()=>{V&&i(P,!1)},250),s.wake()}}},vt=(t,n,r)=>{!V||!P||r===void 0||r<=ke||!s.transient&&t||P.data.parts.every(c=>c.ids.every(h=>n?.includes(h)))&&(m(),ge())},Se=(t=!1)=>{G.forEach(r=>r()),$++,a.clearTimeout(te);let n=A;if(A=void 0,(t||z)&&(S=void 0),s.retainPreparedUntilRelease&&!P&&!t&&!z){if(n){let r={};S=r,me(d({action:"release",token:n.data.token})).catch(()=>{}).finally(()=>{if(n.images.forEach(c=>{y(c)}),S===r&&(S=void 0,!(A||P))){for(let c of k)c.getAttribute(g)!==q.get(c)&&(k.delete(c),Be.delete(c));Me(),q.clear(),a.dispatchEvent(new Event(l))}})}if(S)return}Ae(n),P?i(P,!1):(Me(),q.clear(),a.dispatchEvent(new Event(l)))},nt=()=>{let t=!b;b=!0,Xe(t&&w.isPaused())},ot=()=>{b=!1,w.isPaused()||tt()},ht=()=>queueMicrotask(()=>{z||(w.isPaused()?Xe():b||tt(),s.wake())}),it;try{s.events&&(it=await Ge(s.events,(t,n)=>{if(!z){if(t&&(p=t),p==="none"){b=!1,Se();return}t==="web"&&nt(),t==="native"&&(ot(),w.isPaused()&&Xe(!0),ge()),n&&Ue()}}))}catch(t){throw z=!0,Se(),await me(Promise.resolve(Le.remove())).catch(()=>{}),t}let yt=w.subscribe(ht);return{get owners(){return[...F]},get visibleOwners(){return[...x]},get preparedOwners(){return[...u]},consider:Ie,changed:Ue,moved:I,get token(){return V?void 0:P?.data.token},begin:nt,get restoring(){return V},get handoffPending(){return re},retireRestoration:E,end:ot,updated:vt,invalidate:Se,async destroy(){z=!0,yt(),Se(),D.forEach(t=>t.forEach(n=>n.remove())),D.clear(),await Promise.allSettled([me(Promise.resolve().then(()=>Le?.remove())),me(Promise.resolve().then(()=>it?.remove()))])}}},ft=async(e,o,s)=>{let v=await Ot(e,o,s),p=v.consider;return Object.assign(v,{consider:(f,w)=>p(f,w.map(b=>({...b,scope:e})))})};var pt=(e,o)=>{if(e.nodeType!==1||e.namespaceURI!=="http://www.w3.org/1999/xhtml"||!e.ownerDocument||!("style"in e))throw new TypeError("A Web projection scope requires an HTMLElement fallback");if(e.matches("img, input, textarea, select, video, audio, canvas, iframe, embed, object, br, hr, area, base, link, meta, source, track, wbr"))throw new TypeError("A Web projection fallback must be a container element; use the existing fallback container");return Object.freeze({element:e,namespace:o})};var mt=async(e,o,s={addListener:async(v,p)=>globalThis.Capacitor.addListener(e.plugin,v,p)})=>{let v="view",p=e.receiveListeners,f=!1,w=!1,b="native",a="native",L=_e(document),j=()=>b==="native"&&L.isPaused(u)?"web":b,H=!1,D=!1,W=!1,y=!1,d,g,l,F=!1,x=()=>{let i=F;F=!0;try{l?.begin()}finally{F=i}},u,B=0,Z,_=()=>{B++,Z?.(),Z=void 0},Q=async()=>{if(!e.values||!u||f)return;let i=u;_();let m=B,E=()=>!f&&m===B&&u===i&&te()===i&&i.isConnected;if(i.localName.includes("-")&&!i.matches(":defined")&&Object.values(e.values).some(k=>k.property)){if(await Promise.race([i.ownerDocument.defaultView.customElements.whenDefined(i.localName),new Promise(k=>{Z=k})]),!E())return;Z=void 0}let N=await o.send({action:"values"}).catch(()=>{});if(E()&&N?.values&&typeof N.values=="object"&&!Array.isArray(N.values))try{st(i,N.values,e.values)}catch(k){console.warn("[Native UI Engine] Cannot reflect values",k)}},J={},le,ee=0,ne=new Set,He=()=>{},Pe=new Promise(i=>{He=i}),re=()=>{ne.clear(),He(),Pe=new Promise(i=>{He=i})},oe=()=>{ee++,le=void 0;let i=ze(u);i?.owner===J&&(i.projected=!1,i.owner=void 0)},C={listen:i=>o.listen(m=>{i(m),!m.active&&D&&(D=!1,$e()),m.precovered&&ge(m.precovered)}),send:i=>{if(!e.placementHandoff)return o.send(i);if(i.action==="visibility"&&!i.visible&&re(),i.action==="visibility"&&i.visible&&ne.size){let q=S,K=ee,I=u,je=Pe;return Promise.race([Promise.allSettled([...ne]),je]).then(()=>f||je!==Pe||q!==S||K!==ee||I!==u||!I?.isConnected||te()!==u||j()!=="native"?{}:C.send(i))}let m=ze(u);if(i.action==="cover"){let q=le===i.token&&m?.owner===J&&m.projected,K=++ee;return le=i.token,m&&(m.owner=J,m.projected=!!q),o.send(i).then(I=>(K===ee&&m===ze(u)&&m?.owner===J&&(m.projected=I?.shown===!0),I)).catch(I=>{throw K===ee&&m?.owner===J&&(oe(),m.invalidate()),I})}let E=i.action==="release"&&i.token===le,N=le&&(i.action==="restore"||E||i.action==="reset"||i.action==="visibility"&&i.visible);N&&ee++;let k=ee,ie=()=>{k!==ee||m?.owner!==J||(oe(),m.invalidate())};try{let q=N&&m?.owner===J?{...i,token:"token"in i?i.token:le,placement:m.measure()}:i,K=o.send(q).then(async I=>(i.action==="release"&&I?.requiresPlacement&&(m&&(!m.owner||m.owner===J)?I=await o.send({...i,placement:m.measure()}):(await o.send({action:"visibility",visible:!1}),I=await o.send(i))),k===ee&&(i.action==="resume"||E||i.action==="reset"||i.action==="visibility")&&oe(),I)).catch(I=>{throw ie(),I});return i.action!=="release"||!e.nativeDragHandoff?K:(ne.add(K),K.finally(()=>ne.delete(K)))}catch(q){return ie(),Promise.reject(q)}}},ve=0,A=0,S=0,P,he=!1,V=!1,Ee=!1,ke=document.createElement("style"),$=`data-native-ui-session-${e.id.replace(/[^a-zA-Z0-9-]/g,"")}`;ke.textContent=`[${$}="native"], [${$}="native"] *, [${$}="none"], [${$}="none"] * {visibility:hidden!important}`,document.documentElement.append(ke);let te=()=>{let i=document.querySelectorAll(e.projectionSelector);return i.length===1&&i[0]instanceof HTMLElement?i[0]:void 0},X=()=>{let i=j();u&&u.getAttribute("data-native-ui-destination")!==i&&u.setAttribute("data-native-ui-destination",i),u&&(a==="web"||a==="native"&&W?u.removeAttribute($):u.setAttribute($,a))},Ne=()=>{if(!u?.isConnected)return[];let i=u.getBoundingClientRect(),m={x:i.x,y:i.y,width:i.width,height:i.height},E=d&&Qe(u,d,()=>e.id);return[{element:u,scrollElement:d,control:{id:v,...m,...E?{scroll:E}:{}}}]},z=async()=>{if(f)return;let i=S,m=e.failedFallback==="native"&&j()==="native"&&!!u?.isConnected;await C.send({action:"visibility",visible:m}).catch(()=>{}),!(f||i!==S)&&(m||a==="none"?X():u?.removeAttribute($))},Re=()=>{if(!H||a!=="native"||!u?.isConnected||l?.token||l?.restoring)return;let i=e.failedFallback==="native";C.send({action:"visibility",visible:i}).catch(()=>{}),i?X():u.removeAttribute($)},Y=()=>{if(f||F)return;if(Re(),a==="web"&&l&&!l.token&&!l.restoring){C.send({action:"visibility",visible:!1}).catch(()=>{}),u?.removeAttribute($);return}if(!l?.restoring||P===l||a!=="native")return;P=l;let i=S,m=l;C.send({action:"resume"}).then(()=>{f||i!==S||m!==l||te()!==u||(W=!1,m.updated(void 0,[v],++ve),X(),G())}).catch(()=>{i!==S||f||(m.invalidate(),z())}).finally(()=>{P===m&&(P=void 0),Y()})},Fe=async()=>{if(f||he)return;if(te()!==u){S++,H=!1,D=!1,clearTimeout(g),oe(),u?.removeAttribute($),u?.removeAttribute("data-native-ui-destination"),_();let m=l,E=u;l=void 0,u=void 0,ue.disconnect(),Te();try{E&&await C.send({action:"visibility",visible:!1})}finally{await m?.destroy()}if(f)return;u=te(),W=!1,u&&(ue.observe(u),Q())}if(Te(),!H){if(l?.restoring){Y();return}if(a=j(),!u){await C.send({action:"visibility",visible:!1});return}if(!l){he=!0;let m=S;try{let E=await ft(pt(u,e.id),C,{wake:Y,captureDelayMs:e.captureDelayMs,retainPreparedUntilRelease:e.nativeDragHandoff,blocked:()=>a!=="native"||H||W&&!l?.token,revision:()=>ve,captureRevision:e.captureMode==="view"?()=>A:void 0,transient:!0,opaqueUnderlay:e.captureMode==="view"});if(f||m!==S){await E.destroy();return}l=E}finally{he=!1}}if(!f){if(a==="native"&&W){await C.send({action:"visibility",visible:!1}),X();return}if(a==="native"){let m=S;if(await C.send({action:"visibility",visible:!0}),f||m!==S||a!=="native"||H)return;X(),d=[...De(u)].find(ie=>{let q=getComputedStyle(ie);return/auto|scroll/.test(q.overflowX+q.overflowY)&&(ie.scrollHeight>ie.clientHeight||ie.scrollWidth>ie.clientWidth)});let E=d&&Qe(u,d,()=>e.id),N=e.nativeDragHandoff&&e.captureMode==="view"&&d?{viewport:d.getBoundingClientRect(),offsetX:d.scrollLeft,offsetY:d.scrollTop,rangeX:Math.max(0,d.scrollWidth-d.clientWidth),rangeY:Math.max(0,d.scrollHeight-d.clientHeight)}:void 0,k=await C.send({action:"track",viewportWidth:innerWidth,...E?{scroll:E}:{},...N?{gesture:N}:{}});if(f||m!==S)return;y=k?.tracked===!0,l.consider(e.captureMode==="view"?A:++ve,Ne())}else await C.send({action:"visibility",visible:!1}),X()}}},G=()=>{f||(V=!0,!(!w||Ee)&&(Ee=!0,Promise.resolve().then(async()=>{try{for(;V&&!f;)V=!1,await Fe()}catch{await z()}finally{Ee=!1,V&&G()}})))},Ce=()=>{l?.invalidate(),G()},ue=new ResizeObserver(Ce);window.addEventListener("resize",Ce);let se=new Set,Ae=new WeakSet,ye=i=>{let m=i.composedPath()[0]??i.target;if(!(f||a!=="native"||!u||Ae.has(i)||m!==document&&![...De(u)].includes(m))){if(Ae.add(i),y&&m===d){l?.changed(m);return}H?e.captureMode==="view"?l?.moved():l?.changed():((P||l?.restoring)&&S++,H=!0,x(),W=e.failedFallback!=="native",l?.token?u.removeAttribute($):Re()),$e()}};function $e(){clearTimeout(g),g=setTimeout(()=>{D||(H=!1,!(f||a!=="native")&&(l?.end(),l?.restoring||G()))},100)}function ge(i){if(f||a!=="native"||!u?.isConnected||!l||(D=!0,l.token))return;(P||l.restoring)&&S++,le=i;let m=ze(u);if(m&&(m.owner=J,m.projected=!0),H=!0,x(),!l.token){H=!1,z();return}$e()}let Te=()=>{let i=new Set(u?De(u):[]),m=i.size!==se.size||[...i].some(E=>!se.has(E));for(let E of se)i.has(E)||(E.removeEventListener("scroll",ye),E.removeEventListener("slotchange",Ie),se.delete(E));for(let E of i)se.has(E)||(E.addEventListener("scroll",ye,{passive:!0}),E.addEventListener("slotchange",Ie),se.add(E));m&&(y=!1,d=void 0,l?.invalidate(),G())},Ie=()=>{Te(),G()};document.addEventListener("scroll",ye,!0);let Ue=new MutationObserver(i=>{Te(),te()!==u?G():u&&i.some(m=>m.type==="childList")&&Le(j())});Ue.observe(document.documentElement,{childList:!0,attributes:!0,subtree:!0});let Le=(i,m)=>{if(f||!m&&i===a)return;H=!1,D=!1,clearTimeout(g),a=i,S++;let E=S;a==="none"?C.send({action:"visibility",visible:!1}).then(()=>{a!=="none"||E!==S||f||(l?.invalidate(!0),X())}).catch(()=>{a!=="none"||E!==S||f||(l?.invalidate(!0),X())}):a==="web"?(m==="native"&&L.isPaused()&&l?.end(),x(),l?.token||C.send({action:"visibility",visible:!1}).catch(()=>{}),X()):a==="native"&&(l?.end(),l?.restoring||G())},Be=L.subscribe(()=>queueMicrotask(()=>{w&&Le(j())})),Oe,Me=async()=>{if(!f){f=!0,re(),_(),oe(),S++,Be(),Ue.disconnect(),ue.disconnect(),window.removeEventListener("resize",Ce),document.removeEventListener("scroll",ye,!0);for(let i of se)i.removeEventListener("scroll",ye),i.removeEventListener("slotchange",Ie);se.clear(),clearTimeout(g),u?.removeAttribute($),u?.removeAttribute("data-native-ui-destination"),ke.remove(),await Promise.allSettled([Promise.resolve(Oe?.remove()),l?.destroy()])}};try{let i=S;Oe=await Ge({addListener:(E,N)=>s.addListener(E,N),update:p?.update,projection:p?.projection,accepts:E=>!p?.match||Object.entries(p?.match).every(([N,k])=>typeof E=="object"&&E!==null&&E[N]===k)},(E,N)=>{f||(E&&(E==="native"&&(W=!1),b=E,C.send({action:"destination",destination:E}).catch(()=>{}),Le(j(),E)),N&&(Q(),A++,l?.changed(),a==="native"&&G()))});let m=await C.send({action:"connect"});return S===i&&["native","web","none"].includes(m?.destination)&&(b=m.destination),a=j(),w=!0,G(),{destroy:Me,show:()=>{W=!1,b="native",Le(j(),"native")},hide:()=>{b=a="none",S++,re(),H=!1,D=!1,clearTimeout(g),l?.invalidate(!0),X()}}}catch(i){throw await Me(),i}};var we=new Map,be=new Map,qe=new Map,Wt=Array.from(crypto.getRandomValues(new Uint32Array(4)),e=>e.toString(16)).join("-"),Ke=new Map,Dt=(e,o,s)=>Ke.get(e)?.get(o)?.(s),Nt=0,Ft=(e,o)=>new Promise((s,v)=>{let p=`${e}:${Wt}:${++Nt}`,f=setTimeout(()=>{be.delete(p),v(new Error("Native UI session timed out"))},5e3);be.set(p,{resolve:s,reject:v,timer:f});let w=JSON.stringify({key:p,request:o}),b=globalThis,a=b.webkit?.messageHandlers?.[e]??b.nativeUIEngine;if(!a){clearTimeout(f),be.delete(p),v(new Error("Native UI session unavailable"));return}try{a.postMessage(w)}catch(L){clearTimeout(f),be.delete(p),v(L)}}),$t=(e,o,s,v)=>{if(o===null){qe.get(e)?.(s);return}let p=be.get(o);!p||!o.startsWith(`${e}:`)||(be.delete(o),clearTimeout(p.timer),v?p.reject(new Error(v)):p.resolve(s))},It=e=>{we.get(e)?.show()},Ut=e=>(we.get(e)?.hide(),!0),Bt=async e=>{let o=we.get(e);we.delete(e),Ke.delete(e),qe.delete(e);for(let[s,v]of be)s.startsWith(`${e}:`)&&(be.delete(s),clearTimeout(v.timer),v.reject(new Error("Native UI session closed")));await o?.destroy()},Vt=async e=>{if(we.has(e.id))return;let o,s=!1,v,p={show:()=>{v="native",o?.show()},hide:()=>{v="none",o?.hide()},destroy:async()=>{s=!0,await o?.destroy()}};we.set(e.id,p);try{if(document.readyState==="loading"&&await new Promise(w=>document.addEventListener("DOMContentLoaded",()=>w(),{once:!0})),s)return;let f=new Map;e.runtime==="cordova"&&Ke.set(e.id,f),o=await mt(e,{send:w=>Ft(e.id,w),listen:async w=>(qe.set(e.id,w),{remove:()=>{qe.get(e.id)===w&&qe.delete(e.id)}})},e.runtime==="cordova"?{addListener:async(w,b)=>(f.set(w,b),{remove:()=>{f.delete(w)}})}:void 0),v==="none"?o.hide():v==="native"&&o.show(),s&&await o.destroy()}catch(f){throw we.get(e.id)===p&&(we.delete(e.id),Ke.delete(e.id)),f}};return Mt(zt);})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webview-native-ui/engine",
3
- "version": "1.0.0",
3
+ "version": "1.0.2-0",
4
4
  "description": "Native UI placement, scroll tracking, and Web projection for Capacitor and Cordova plugin maintainers.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -16,6 +16,18 @@
16
16
  "./ionic": {
17
17
  "types": "./dist/ionic.d.ts",
18
18
  "import": "./dist/ionic.js"
19
+ },
20
+ "./controls": {
21
+ "types": "./dist/controls/index.d.ts",
22
+ "import": "./dist/controls/index.js"
23
+ },
24
+ "./controls/ionic": {
25
+ "types": "./dist/controls/ionic.d.ts",
26
+ "import": "./dist/controls/ionic.js"
27
+ },
28
+ "./integration": {
29
+ "types": "./dist/integration/index.d.ts",
30
+ "import": "./dist/integration/index.js"
19
31
  }
20
32
  },
21
33
  "files": [
@@ -24,7 +36,9 @@
24
36
  "WebViewNativeUIEngine.podspec",
25
37
  "README.md",
26
38
  "LICENSE",
27
- "docs"
39
+ "docs",
40
+ "src",
41
+ "WebViewNativeUIControls.podspec"
28
42
  ],
29
43
  "scripts": {
30
44
  "build": "rm -rf dist && tsc -p tsconfig.json && node scripts/build-runtime.mjs",
@@ -41,7 +55,8 @@
41
55
  "lint:swift": "swiftlint version && node-swiftlint lint --strict --no-cache",
42
56
  "format:swift": "swiftlint version && node-swiftlint --fix --format --no-cache",
43
57
  "lint:android": "android/gradlew -p android ktfmtCheck lintRelease",
44
- "format:kotlin": "android/gradlew -p android ktfmtFormat"
58
+ "format:kotlin": "android/gradlew -p android ktfmtFormat",
59
+ "test:controls": "vitest run"
45
60
  },
46
61
  "devDependencies": {
47
62
  "@eslint/js": "^10.0.1",
@@ -53,18 +68,28 @@
53
68
  "prettier": "^3.6.2",
54
69
  "swiftlint": "^2.0.0",
55
70
  "typescript": "^5.9.3",
56
- "typescript-eslint": "^8.72.1"
71
+ "typescript-eslint": "^8.72.1",
72
+ "@ionic/core": "^8.8.1",
73
+ "vitest": "^4.0.0",
74
+ "jsdom": "^26.0.0"
57
75
  },
58
76
  "publishConfig": {
59
77
  "access": "public"
60
78
  },
61
79
  "peerDependencies": {
62
- "@capacitor/core": ">=8.0.0 <9"
80
+ "@capacitor/core": ">=8.0.0 <9",
81
+ "@ionic/core": ">=8.8.1 <10"
63
82
  },
64
83
  "types": "./dist/index.d.ts",
65
84
  "peerDependenciesMeta": {
66
85
  "@capacitor/core": {
67
86
  "optional": true
87
+ },
88
+ "@ionic/core": {
89
+ "optional": true
68
90
  }
91
+ },
92
+ "dependencies": {
93
+ "@rdlabo/ionic-theme-utils": "0.1.5"
69
94
  }
70
95
  }