@webview-native-ui/engine 0.0.1 → 0.0.3
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.
- package/LICENSE +17 -14
- package/README.md +27 -599
- package/WebViewNativeUIEngine.podspec +2 -2
- package/dist/{scroll-bindings.d.ts → dom/scroll-bindings.d.ts} +1 -1
- package/dist/{scroll-placement.d.ts → dom/scroll-placement.d.ts} +1 -1
- package/dist/index.d.ts +9 -9
- package/dist/index.js +8 -8
- package/dist/ionic.d.ts +3 -3
- package/dist/ionic.js +1 -1
- package/dist/{native-bootstrap.d.ts → native/bootstrap.d.ts} +1 -1
- package/dist/{native-bootstrap.js → native/bootstrap.js} +1 -1
- package/dist/{bridge.d.ts → native/bridge.d.ts} +1 -1
- package/dist/{native-session.d.ts → native/session.d.ts} +3 -2
- package/dist/{native-session.js → native/session.js} +8 -7
- package/dist/{projection-events.d.ts → projection/events.d.ts} +1 -1
- package/dist/{projection-events.js → projection/events.js} +1 -1
- package/dist/{web-projection.d.ts → projection/web.d.ts} +5 -3
- package/dist/{web-projection.js → projection/web.js} +9 -6
- package/dist/types.d.ts +1 -1
- package/docs/assets/hero.png +0 -0
- package/docs/capacitor-plugin.md +279 -0
- package/docs/cordova-plugin.md +198 -0
- package/docs/cordova.md +1 -123
- package/docs/maintenance.md +52 -0
- package/docs/projection.md +340 -0
- package/ios/Sources/WebViewNativeUIEngine/CoveredSnapshots.swift +6 -14
- package/ios/Sources/WebViewNativeUIEngine/NativeUIProjection.swift +6 -3
- package/ios/Sources/WebViewNativeUIEngine/Resources/native-ui-engine.js +3 -3
- package/package.json +2 -3
- package/NOTICE +0 -39
- /package/dist/{geometry.d.ts → dom/geometry.d.ts} +0 -0
- /package/dist/{geometry.js → dom/geometry.js} +0 -0
- /package/dist/{overlays.d.ts → dom/overlays.d.ts} +0 -0
- /package/dist/{overlays.js → dom/overlays.js} +0 -0
- /package/dist/{scroll-bindings.js → dom/scroll-bindings.js} +0 -0
- /package/dist/{scroll-placement.js → dom/scroll-placement.js} +0 -0
- /package/dist/{visibility.d.ts → dom/visibility.d.ts} +0 -0
- /package/dist/{visibility.js → dom/visibility.js} +0 -0
- /package/dist/{bridge.js → native/bridge.js} +0 -0
- /package/dist/{runtime.d.ts → native/resource-url.d.ts} +0 -0
- /package/dist/{runtime.js → native/resource-url.js} +0 -0
- /package/dist/{projection-placement.d.ts → projection/placement.d.ts} +0 -0
- /package/dist/{projection-placement.js → projection/placement.js} +0 -0
- /package/dist/{web-projection-scope.d.ts → projection/scope.d.ts} +0 -0
- /package/dist/{web-projection-scope.js → projection/scope.js} +0 -0
- /package/dist/{snapshot-styles.d.ts → projection/styles.d.ts} +0 -0
- /package/dist/{snapshot-styles.js → projection/styles.js} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var WebViewNativeUIEngineRuntime=(()=>{var
|
|
1
|
+
"use strict";var WebViewNativeUIEngineRuntime=(()=>{var ze=Object.defineProperty;var it=Object.getOwnPropertyDescriptor;var st=Object.getOwnPropertyNames;var at=Object.prototype.hasOwnProperty;var ct=(e,o)=>{for(var n in o)ze(e,n,{get:o[n],enumerable:!0})},lt=(e,o,n,f)=>{if(o&&typeof o=="object"||typeof o=="function")for(let v of st(o))!at.call(e,v)&&v!==n&&ze(e,v,{get:()=>o[v],enumerable:!(f=it(o,v))||f.enumerable});return e};var dt=e=>lt(ze({},"__esModule",{value:!0}),e);var jt={};ct(jt,{hide:()=>Lt,notify:()=>wt,receive:()=>Pt,show:()=>Tt,start:()=>St,stop:()=>Mt});var ut=Symbol.for("webview-native-ui-engine.projection-placement");var $e=e=>e?.[ut];var pt=(e,o)=>{if(e.matches("ion-toast, ion-menu"))return!1;let n=e;if(n.showBackdrop===!1)return!1;if(!e.matches("ion-modal"))return!0;let f=o??n.initialBreakpoint;return f===void 0||f>(n.backdropBreakpoint??0)},ft=Symbol.for("@webview-native-ui/engine/overlays/v1"),mt=e=>{let o=new Set,n=new Set,f=new Set,v=new WeakMap,c=new WeakSet,l=new Map,w=[],u={},S=new Map,j,M=m=>{for(let p of[...f])try{p(m)}catch(i){console.error("Native UI overlay listener failed",i)}},O=(m,p,i)=>{p==="willPresent"||p==="didPresent"?(c.delete(m),o.add(m)):p==="didDismiss"&&(c.add(m),o.delete(m),n.delete(m),v.delete(m));let T=i?.detail?.breakpoint;typeof T=="number"&&T>0&&v.set(m,T),M({element:m,phase:p,event:i})},R=(m=!1)=>{let p=!1;for(let i of o)(!i.isConnected||i.ownerDocument!==e||!w.some(({selector:T})=>i.matches(T)))&&(o.delete(i),n.delete(i),p=!0);for(let i of e.querySelectorAll(w.map(({selector:T})=>T).join(",")))!o.has(i)&&!c.has(i)&&(m||!i.matches("ion-popover"))&&(i.presented||i.classList.contains("show-menu"))&&(o.add(i),p=!0);p&&M({phase:"change"})};return{get active(){return o},subscribe(m){return f.add(m),()=>{f.delete(m)}},setNative(m,p){n.has(m)!==p&&(p?n.add(m):n.delete(m),M({element:m,phase:"change"}))},isExcluded(m){return!!u.exclude&&m.matches(u.exclude)},isNative(m){return n.has(m)},get stack(){let m=[...o].filter(i=>i.isConnected&&i.ownerDocument===e),p=i=>{let T=Number.parseFloat(e.defaultView.getComputedStyle(i).zIndex);return Number.isFinite(T)?T:i.overlayIndex??0};return m.sort((i,T)=>p(i)-p(T)),m},isCovered(m){let p=this.stack,i=p.reduce((T,N,d)=>N.contains(m)?d:T,-1);return p.some((T,N)=>{if(n.has(T)||u.exclude&&T.matches(u.exclude))return!1;let d=u.covers?.(T,m);return d!==void 0?d:N>i&&!T.contains(m)&&(T.matches("ion-menu")||pt(T,v.get(T)))})},enable(m,p){let i={...u,...p},T=[...m,...i.additional??[]];i.exclude&&e.querySelector(i.exclude);let N=new Map;for(let W of T){e.querySelector(W.selector);for(let[$,A]of Object.entries(W.events)){let F=N.get(A);if(F&&F.phase!==$)throw new TypeError(`Overlay event "${A}" has conflicting phases`);N.set(A,{phase:$,selector:F?`${F.selector}, ${W.selector}`:W.selector})}}u=i,w=T,S=N;for(let W of S.keys()){if(l.has(W))continue;let $=A=>{let F=S.get(W),C=A.composedPath().find(X=>X instanceof e.defaultView.HTMLElement&&X.matches(F.selector));C&&O(C,F.phase,A)};e.addEventListener(W,$,!0),l.set(W,()=>e.removeEventListener(W,$,!0))}for(let[W,$]of l)S.has(W)||($(),l.delete(W));let d=!j;j||(j=new MutationObserver(()=>R()),j.observe(e.documentElement,{childList:!0,subtree:!0}),e.addEventListener("nativeUIOverlayAdopted",W=>{let $=W.detail;$?.ownerDocument===e&&O($,"willPresent",W)})),R(d),(d||p)&&M({phase:"change"})}}},_e=e=>{let o=e;return o[ft]??=mt(e)};function*ae(e){let o=e;for(;o;){let n=o.getRootNode();o=o.assignedSlot??o.parentElement??(n instanceof ShadowRoot?n.host:null),o&&(yield o)}}var vt=({x:e,y:o,width:n,height:f})=>({x:e,y:o,width:n,height:f}),Ke=e=>{let o=e.getBoundingClientRect(),n=getComputedStyle(e),f=parseFloat(n.borderLeftWidth)||0,v=parseFloat(n.borderTopWidth)||0;return{x:o.left+f,y:o.top+v,width:o.width-f-(parseFloat(n.borderRightWidth)||0),height:o.height-v-(parseFloat(n.borderBottomWidth)||0)}},Ve=(e,o,n)=>{let f=[e,...ae(e)],v=f.indexOf(o);if(v<=0||o===e.ownerDocument.scrollingElement)return;let c=e.ownerDocument.defaultView;if(c.visualViewport&&(c.visualViewport.scale!==1||c.visualViewport.offsetLeft||c.visualViewport.offsetTop))return;let l=0,w=0,u=c.innerWidth,S=c.innerHeight;for(let[R,m]of f.entries()){let p=getComputedStyle(m);if(p.transform!=="none"&&!new DOMMatrixReadOnly(p.transform).isIdentity||p.zoom&&p.zoom!=="normal"&&Number(p.zoom)!==1||[p.translate,p.rotate,p.scale,p.perspective].some(d=>d&&d!=="none")||p.writingMode&&p.writingMode!=="horizontal-tb"||R<v&&/^(fixed|sticky)$/.test(p.position))return;if(R===0)continue;if(p.scrollbarGutter&&p.scrollbarGutter!=="auto")return;let i=/^(auto|scroll|hidden|clip)$/.test(p.overflowX),T=/^(auto|scroll|hidden|clip)$/.test(p.overflowY);if(R<v&&(i||T))return;let N=m===e.ownerDocument.scrollingElement;if(R>v&&((i||N)&&m.scrollWidth>m.clientWidth||(T||N)&&m.scrollHeight>m.clientHeight)||(i||T)&&[p.borderTopLeftRadius,p.borderTopRightRadius,p.borderBottomLeftRadius,p.borderBottomRightRadius].some(d=>parseFloat(d)>0)||p.clipPath&&p.clipPath!=="none"||p.maskImage&&p.maskImage!=="none")return;if(R>=v){let d=Ke(m);i&&(l=Math.max(l,d.x),u=Math.min(u,d.x+d.width)),T&&(w=Math.max(w,d.y),S=Math.min(S,d.y+d.height))}}let j=getComputedStyle(o);if(!/^(auto|scroll)$/.test(j.overflowX)&&!/^(auto|scroll)$/.test(j.overflowY))return;let M=Ke(o);if(u<=l||S<=w||!M.width||!M.height)return;let O=vt(e.getBoundingClientRect());return{id:n(o),offsetX:o.scrollLeft,offsetY:o.scrollTop,viewport:M,clip:{x:l,y:w,width:u-l,height:S-w},contentWidth:o.scrollWidth,contentHeight:o.scrollHeight,frame:{...O,x:O.x-M.x+o.scrollLeft,y:O.y-M.y+o.scrollTop}}};var Ge=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 ce=e=>new Promise((o,n)=>{let f=setTimeout(()=>n(new Error("Native UI bridge timed out")),5e3);e.then(o,n).finally(()=>clearTimeout(f))}),Ne=async e=>{try{return await ce(e)}catch(o){throw e.then(n=>n.remove()).catch(()=>{}),o}};var Ue=async(e,o)=>{let n=new Map;for(let w of e.update??[])n.set(w,{updated:!0});for(let w of["native","web","none"])for(let u of e.projection?.[w]??[]){let S=n.get(u)??{updated:!1};if(S.destination&&S.destination!==w)throw new TypeError(`Projection event "${u}" has conflicting destinations`);n.set(u,{...S,destination:w})}let f=!1,v=[],c=async()=>{f=!0;let u=(await Promise.allSettled(v.splice(0).map(S=>Promise.resolve().then(()=>S.remove())))).find(S=>S.status==="rejected");if(u?.status==="rejected")throw u.reason},l=[...n].map(async([w,u])=>{let S=await Ne(Promise.resolve().then(()=>e.addListener(w,j=>{!f&&(!e.accepts||e.accepts(j))&&o(u.destination,u.updated)})));f?await S.remove():v.push(S)});try{return await Promise.all(l),{remove:c}}catch(w){throw await c().catch(()=>{}),w}};var Je=`
|
|
2
2
|
:is([data-native-ui-snapshot-source], [data-native-ui-snapshot-prepared]),
|
|
3
3
|
:is([data-native-ui-snapshot-source], [data-native-ui-snapshot-prepared]) *,
|
|
4
4
|
:is([data-native-ui-snapshot-source], [data-native-ui-snapshot-prepared])::after,
|
|
@@ -10,5 +10,5 @@
|
|
|
10
10
|
}
|
|
11
11
|
[data-native-ui-snapshot-visible] { opacity:1!important;overflow:visible!important; }
|
|
12
12
|
[data-native-ui-snapshot-visible][data-native-ui-snapshot][data-native-ui-snapshot]::before { opacity:1!important; }
|
|
13
|
-
`;var
|
|
14
|
-
`),j.forEach(({target:H,x:_,y:te},ne)=>J.set(H,{x:_,y:te,style:i.sheet.cssRules[ne*2+1].style}))},Ve=()=>{if(b(),Z||l==="none"||u)return;let t=O;if(!t||t.viewport!==D()||!t.sources.every(h)||n.current&&!n.current(t.targets)||t.targets.some(i=>!ee.has(i))||I(t).some(i=>!i?.isConnected)||[...A].some(i=>!i.isConnected))return;t.scopes.some((i,L)=>i.element.parentNode!==t.parents[L])&&Re(),Me();let c=++oe,g=()=>oe===c;R=!0,$=!!n.opaqueUnderlay,u=t,K++,r.clearTimeout(N),t.sources.forEach(i=>{C.add(i)}),A.forEach(i=>{i.setAttribute("data-native-ui-snapshot-source",""),i.toggleAttribute("data-native-ui-snapshot-visible",$)}),W=r.requestAnimationFrame(()=>{W=0,g()&&(R=!1,n.wake())}),de(P({action:"cover",token:t.data.token,...n.transient?{transient:!0}:{}})).then(i=>{if(g()){if(R=!1,i?.shown!==!0){s(t,!1);return}B||($=!0,t.sources.forEach(L=>U.add(L)),Re(),Me(),Oe()),r.cancelAnimationFrame(W),W=r.requestAnimationFrame(()=>{W=0,g()&&P({action:"painted",token:t.data.token}).catch(()=>{g()&&s(t,!1)})}),n.wake()}}).catch(()=>{g()&&s(t,!1)})},Xe=()=>{if(!(!u||Z||B)){if(!u.sources.every(h)||I(u).some(t=>!t)||n.current&&!n.current(u.targets)){s(u,!1);return}if(!n.blocked()){if(n.transient){let t=u,c=I(t);if(c.some(i=>!i?.isConnected)){s(t,!1);return}let g=c.map((i,L)=>{let j=Je(i,r),H=t.frames[L];return{...t.data.parts[L],x:j.x+H.x*j.scaleX,y:j.y+H.y*j.scaleY,width:H.width*j.scaleX,height:H.height*j.scaleY}});g.some((i,L)=>["x","y","width","height"].some(j=>i[j]!==t.data.parts[L][j]))&&(n.opaqueUnderlay?t.data={...t.data,parts:g}:O=void 0),P({action:"restore",token:t.data.token,viewportWidth:r.innerWidth,parts:g}).catch(()=>{})}ge=n.revision?.()??q?.revision??0,B=!0,u.sources.forEach(t=>C.delete(t)),ae=r.setTimeout(()=>{B&&s(u,!1)},250),n.wake()}}},tt=(t,c,g)=>{!B||!u||g===void 0||g<=ge||!n.transient&&t||u.data.parts.every(i=>i.ids.every(L=>c?.includes(L)))&&(y(),G())},ve=()=>{ce.forEach(c=>c()),K++,r.clearTimeout(N);let t=O;O=void 0,fe(t),u?s(u,!1):(Te(),ee.clear(),r.dispatchEvent(new Event(x)))},Ye;try{n.events&&(Ye=await Ne(n.events,(t,c)=>{if(!Z){if(t&&(l=t),l==="none"){ve();return}t==="web"&&Ve(),t==="native"&&(Xe(),G()),c&&je()}}))}catch(t){throw Z=!0,ve(),await de(Promise.resolve(me.remove())).catch(()=>{}),t}return{get owners(){return[...C]},get visibleOwners(){return[...U]},get preparedOwners(){return[...p]},consider:Se,changed:je,moved:()=>{Me(),Oe()},get token(){return B?void 0:u?.data.token},begin:Ve,get restoring(){return B},get handoffPending(){return R},retireRestoration:b,end:Xe,updated:tt,invalidate:ve,async destroy(){Z=!0,ve(),await Promise.allSettled([de(Promise.resolve().then(()=>me?.remove())),de(Promise.resolve().then(()=>Ye?.remove()))])}}},Ze=async(e,o,n)=>{let l=await ht(e,o,n),d=l.consider;return Object.assign(l,{consider:(r,T)=>d(r,T.map(h=>({...h,scope:e})))})};var Qe=(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 support ::before; use its existing container element");return Object.freeze({element:e,namespace:o})};var et=async(e,o,n={addListener:async(l,d)=>globalThis.Capacitor.addListener(e.plugin,l,d)})=>{let l="view",d=e.receiveListeners,r=!1,T=!1,h="native",v="native",P=qe(document),S=()=>h==="native"&&m&&P.isCovered(m)?"web":h,x=!1,C=!1,U=!1,p,f,a,E=!1,F=()=>{let s=E;E=!0;try{a?.begin()}finally{E=s}},m,k={},D,R=0,$=()=>{R++,D=void 0;let s=Fe(m);s?.owner===k&&(s.projected=!1,s.owner=void 0)},W={listen:s=>o.listen(s),send:s=>{if(!e.placementHandoff)return o.send(s);let y=Fe(m);if(s.action==="cover"){let J=++R;return D=s.token,y&&(y.owner=k,y.projected=!1),o.send(s).then(Y=>(J===R&&y===Fe(m)&&y?.owner===k&&(y.projected=Y?.shown===!0),Y)).catch(Y=>{throw J===R&&y?.owner===k&&($(),y.invalidate()),Y})}let b=s.action==="release"&&s.token===D,I=D&&(s.action==="restore"||b||s.action==="reset"||s.action==="visibility"&&s.visible);I&&R++;let A=R,ee=()=>{A!==R||y?.owner!==k||($(),y.invalidate())};try{let J=I&&y?.owner===k?{...s,token:"token"in s?s.token:D,placement:y.measure()}:s;return o.send(J).then(Y=>(A===R&&(s.action==="resume"||b||s.action==="reset"||s.action==="visibility")&&$(),Y)).catch(Y=>{throw ee(),Y})}catch(J){return ee(),Promise.reject(J)}}},oe=0,O=0,u=0,ie=!1,B=!1,ae=!1,ge=!1,K=document.createElement("style"),N=`data-native-ui-session-${e.id.replace(/[^a-zA-Z0-9-]/g,"")}`;K.textContent=`[${N}="native"], [${N}="native"] *, [${N}="none"], [${N}="none"] * {visibility:hidden!important}`,document.documentElement.append(K);let se=()=>{let s=document.querySelectorAll(e.projectionSelector);return s.length===1&&s[0]instanceof HTMLElement?s[0]:void 0},X=()=>{m&&(v==="web"||v==="native"&&C?m.removeAttribute(N):m.setAttribute(N,v))},Z=()=>{if(!m?.isConnected)return[];let s=m.getBoundingClientRect(),y={x:s.x,y:s.y,width:s.width,height:s.height},b=p&&ze(m,p,()=>e.id);return[{element:m,scrollElement:p,control:{id:l,...y,...b?{scroll:b}:{}}}]},we=async()=>{if(r)return;let s=u,y=e.failedFallback==="native"&&S()==="native"&&!!m?.isConnected;await W.send({action:"visibility",visible:y}).catch(()=>{}),!(r||s!==u)&&(y||v==="none"?X():m?.removeAttribute(N))},q=()=>{if(!x||v!=="native"||!m?.isConnected||a?.token||a?.restoring)return;let s=e.failedFallback==="native";W.send({action:"visibility",visible:s}).catch(()=>{}),s?X():m.removeAttribute(N)},ce=()=>{if(r||E)return;if(q(),v==="web"&&a&&!a.token&&!a.restoring){W.send({action:"visibility",visible:!1}).catch(()=>{}),m?.removeAttribute(N);return}if(ie||!a?.restoring||v!=="native")return;ie=!0;let s=u,y=a;W.send({action:"resume"}).then(()=>{r||s!==u||y!==a||(C=!1,y.updated(void 0,[l],++oe),X(),V())}).catch(()=>{s!==u||r||(y.invalidate(),we())}).finally(()=>{ie=!1,ce()})},ke=async()=>{if(r||B||x)return;if(a?.restoring){ce();return}let s=se();if(s!==m){if(u++,$(),m?.removeAttribute(N),await a?.destroy(),a=void 0,r)return;m=s,C=!1,fe.disconnect(),m&&fe.observe(m)}if(Ee(),v=S(),!m){await W.send({action:"visibility",visible:!1});return}if(!a){B=!0;let y=u;try{let b=await Ze(Qe(m,e.id),W,{wake:ce,blocked:()=>v!=="native"||x||C&&!a?.token,revision:()=>oe,captureRevision:e.captureMode==="view"?()=>O:void 0,transient:!0,opaqueUnderlay:e.captureMode==="view"});if(r||y!==u){await b.destroy();return}a=b}finally{B=!1}}if(!r){if(v==="native"&&C){await W.send({action:"visibility",visible:!1}),X();return}if(v==="native"){let y=u;if(await W.send({action:"visibility",visible:!0}),r||y!==u||v!=="native")return;X(),p=[...le(m)].find(A=>{let ee=getComputedStyle(A);return/auto|scroll/.test(ee.overflowX+ee.overflowY)&&(A.scrollHeight>A.clientHeight||A.scrollWidth>A.clientWidth)});let b=p&&ze(m,p,()=>e.id),I=await W.send({action:"track",viewportWidth:innerWidth,...b?{scroll:b}:{}});if(r||y!==u)return;U=I?.tracked===!0,a.consider(e.captureMode==="view"?O:++oe,Z())}else await W.send({action:"visibility",visible:!1}),X()}},V=()=>{r||(ae=!0,!(!T||ge)&&(ge=!0,Promise.resolve().then(async()=>{try{for(;ae&&!r;)ae=!1,await ke()}catch{await we()}finally{ge=!1,ae&&V()}})))},be=()=>{a?.invalidate(),V()},fe=new ResizeObserver(be);window.addEventListener("resize",be);let Q=new Set,We=new WeakSet,G=s=>{let y=s.composedPath()[0]??s.target;if(!(r||v!=="native"||!m||We.has(s)||y!==document&&![...le(m)].includes(y))){if(We.add(s),U&&y===p){a?.changed(y);return}x?e.captureMode==="view"?a?.moved():a?.changed():((ie||a?.restoring)&&u++,x=!0,F(),C=e.failedFallback!=="native",a?.token?m.removeAttribute(N):q()),clearTimeout(f),f=setTimeout(()=>{x=!1,!(r||v!=="native")&&(a?.end(),a?.restoring||V())},100)}},Ee=()=>{let s=new Set(m?le(m):[]),y=s.size!==Q.size||[...s].some(b=>!Q.has(b));for(let b of Q)s.has(b)||(b.removeEventListener("scroll",G),b.removeEventListener("slotchange",Se),Q.delete(b));for(let b of s)Q.has(b)||(b.addEventListener("scroll",G,{passive:!0}),b.addEventListener("slotchange",Se),Q.add(b));y&&(U=!1,p=void 0,a?.invalidate(),V())},Se=()=>{Ee(),V()};document.addEventListener("scroll",G,!0);let je=new MutationObserver(s=>{Ee(),se()!==m?V():m&&s.some(y=>y.type==="childList")&&me(S())});je.observe(document.documentElement,{childList:!0,attributes:!0,subtree:!0});let me=(s,y=!1)=>{if(r||!y&&s===v)return;x=!1,clearTimeout(f),v=s,u++;let b=u;v==="none"?W.send({action:"visibility",visible:!1}).then(()=>{v!=="none"||b!==u||r||(a?.invalidate(),X())}).catch(()=>{v!=="none"||b!==u||r||(a?.invalidate(),X())}):v==="web"?(F(),a?.token||W.send({action:"visibility",visible:!1}).catch(()=>{}),X()):v==="native"&&(a?.end(),a?.restoring||V())},Ce=P.subscribe(()=>queueMicrotask(()=>me(S()))),Pe,Te=async()=>{if(!r){r=!0,$(),u++,Ce(),je.disconnect(),fe.disconnect(),window.removeEventListener("resize",be),document.removeEventListener("scroll",G,!0);for(let s of Q)s.removeEventListener("scroll",G),s.removeEventListener("slotchange",Se);Q.clear(),clearTimeout(f),m?.removeAttribute(N),K.remove(),await Promise.allSettled([Promise.resolve(Pe?.remove()),a?.destroy()])}};try{let s=u;Pe=await Ne({addListener:(b,I)=>n.addListener(b,I),update:d?.update,projection:d?.projection,accepts:b=>!d?.match||Object.entries(d?.match).every(([I,A])=>typeof b=="object"&&b!==null&&b[I]===A)},(b,I)=>{r||(b&&(b==="native"&&(C=!1),h=b,W.send({action:"destination",destination:b}).catch(()=>{}),me(S(),!0)),I&&(O++,a?.changed(),v==="native"&&V()))});let y=await W.send({action:"connect"});return u===s&&["native","web","none"].includes(y?.destination)&&(h=y.destination),v=S(),T=!0,V(),{destroy:Te,show:()=>{C=!1,h="native",me(S(),!0)},hide:()=>{h=v="none",u++,x=!1,clearTimeout(f),a?.invalidate(),X()}}}catch(s){throw await Te(),s}};var ue=new Map,pe=new Map,He=new Map,yt=Array.from(crypto.getRandomValues(new Uint32Array(4)),e=>e.toString(16)).join("-"),Ue=new Map,gt=(e,o,n)=>Ue.get(e)?.get(o)?.(n),wt=0,bt=(e,o)=>new Promise((n,l)=>{let d=`${e}:${yt}:${++wt}`,r=setTimeout(()=>{pe.delete(d),l(new Error("Native UI session timed out"))},5e3);pe.set(d,{resolve:n,reject:l,timer:r});let T=JSON.stringify({key:d,request:o}),h=globalThis,v=h.webkit?.messageHandlers?.[e]??h[e]??h.nativeUIEngine;if(!v){clearTimeout(r),pe.delete(d),l(new Error("Native UI session unavailable"));return}try{v.postMessage(T)}catch(P){clearTimeout(r),pe.delete(d),l(P)}}),Et=(e,o,n,l)=>{if(o===null){He.get(e)?.(n);return}let d=pe.get(o);!d||!o.startsWith(`${e}:`)||(pe.delete(o),clearTimeout(d.timer),l?d.reject(new Error(l)):d.resolve(n))},Pt=e=>{ue.get(e)?.show()},Tt=e=>(ue.get(e)?.hide(),!0),Lt=async e=>{let o=ue.get(e);ue.delete(e),Ue.delete(e),He.delete(e);for(let[n,l]of pe)n.startsWith(`${e}:`)&&(pe.delete(n),clearTimeout(l.timer),l.reject(new Error("Native UI session closed")));await o?.destroy()},St=async e=>{if(ue.has(e.id))return;let o,n=!1,l,d={show:()=>{l="native",o?.show()},hide:()=>{l="none",o?.hide()},destroy:async()=>{n=!0,await o?.destroy()}};ue.set(e.id,d);try{if(document.readyState==="loading"&&await new Promise(T=>document.addEventListener("DOMContentLoaded",()=>T(),{once:!0})),n)return;let r=new Map;e.runtime==="cordova"&&Ue.set(e.id,r),o=await et(e,{send:T=>bt(e.id,T),listen:async T=>(He.set(e.id,T),{remove:()=>{He.get(e.id)===T&&He.delete(e.id)}})},e.runtime==="cordova"?{addListener:async(T,h)=>(r.set(T,h),{remove:()=>{r.delete(T)}})}:void 0),l==="none"?o.hide():l==="native"&&o.show(),n&&await o.destroy()}catch(r){throw ue.get(e.id)===d&&(ue.delete(e.id),Ue.delete(e.id)),r}};return lt(jt);})();
|
|
13
|
+
`;var ht=(e,o=!1)=>JSON.stringify(e.map(({control:n})=>[n.id,n.kind,n.placement,o?0:n.x,o?0:n.y,n.width,n.height,n.dark,n.rtl])),Ze=(e,o,n=o.getComputedStyle(e))=>{let f=e.getBoundingClientRect(),v=(j,M)=>{let O=parseFloat(j);return n.display!=="inline"&&Number.isFinite(O)?O+(n.boxSizing==="border-box"?0:M.reduce((R,m)=>R+(parseFloat(n.getPropertyValue(m))||0),0)):NaN},c=v(n.width,["padding-left","padding-right","border-left-width","border-right-width"]),l=v(n.height,["padding-top","padding-bottom","border-top-width","border-bottom-width"]),w=1;if(!(c>0&&l>0))for(let j of[e,...ae(e)]){let M=(j===e?n:o.getComputedStyle(j)).getPropertyValue("zoom");w*=(parseFloat(M)||1)/(M.endsWith("%")?100:1)}let u=c>0?f.width/c:w,S=l>0?f.height/l:w;return{x:f.x,y:f.y,scaleX:u||1,scaleY:S||1,left:(parseFloat(n.borderLeftWidth)||0)-e.scrollLeft,top:(parseFloat(n.borderTopWidth)||0)-e.scrollTop,position:n.position}},yt=async(e,o,n)=>{let f=n.captureDelayMs??50;if(!Number.isFinite(f)||f<0||f>2147483647)throw new RangeError("captureDelayMs must be a finite, nonnegative timer interval");let v="native",c=e.element.ownerDocument,l=c.defaultView,w=Array.from(l.crypto.getRandomValues(new Uint32Array(4)),t=>t.toString(16)).join("-"),u=t=>t.isConnected&&t.ownerDocument===c,S=t=>!!t?.isConnected&&t.ownerDocument===c,j=o.send.bind(o),M="data-native-ui-snapshot",O=`${e.namespace}:sources-change`,R=new Set,m=new Set,p=new Set,i=new WeakMap,T=0,N=t=>JSON.stringify(t.map(a=>(i.has(a.scope)||i.set(a.scope,++T),[i.get(a.scope),ht([a],!!n.opaqueUnderlay)]))),d=new Map,W=t=>{let a=t.getRootNode();return a.nodeType===11&&"host"in a?a:c},$=t=>{let a=d.get(t);if(!a){let y=c.createElement("style"),r=c.createElement("style");y.setAttribute("data-native-ui-snapshot-base",""),r.setAttribute(M,""),y.textContent=Je,(t.nodeType===11?t:t.head).append(y,r),a={base:y,image:r},d.set(t,a)}return a.image},A=()=>`${l.innerWidth}:${l.innerHeight}:${l.devicePixelRatio}`,F=!1,C=!1,X=0,ue=0,P,g,ie=!1,U=!1,pe=0,ge=0,D=0,re=0,B=0,Me=-1,J=!1,we=!1,Y,be=new Set,_=(t,a,y)=>{let r=()=>{be.delete(r)&&j({action:t,token:a}).catch(()=>{})};be.add(r),y&&!J?l.requestAnimationFrame(()=>l.requestAnimationFrame(r)):r()},se=new Set,Ee=()=>{se.forEach(t=>p.delete(t)),se.clear()},Z=(t,a=!1)=>{!t||t===P||t===g||(t.images.forEach(y=>{y.src=""}),_("release",t.data.token,a))},Se=t=>t.filter(a=>{if(!S(a.scope.element)||![a.element,...a.sources??[]].every(u))return!1;if(a.control.scroll){let y=a.element.getBoundingClientRect(),r=a.control.scroll.clip;if(y.right<=r.x||y.bottom<=r.y||y.left>=r.x+r.width||y.top>=r.y+r.height)return!1}return n.eligible?.(a)??!0}),fe=async()=>{if(re=0,J||v!=="native"||we||ie||g||n.blocked()||!Y||P?.revision===Y.revision&&Me===B)return;let{revision:t,candidates:a}=Y,y=D,r=B,L=A(),x=Se(a);if(!x.length)return;we=!0;let k,G=!1,ee=[];try{let te=!1,he=j({action:"prepare",revision:n.captureRevision?.()??t,viewportWidth:l.innerWidth,ids:x.map(b=>b.control.id)});he.then(b=>{te&&b.token&&j({action:"release",token:b.token}).catch(()=>{})}).catch(()=>{});try{k=await ce(he)}finally{te=!0}if(!k.token||!k.parts?.length)return;let ye=new Set(x.map(b=>b.control.id));if(k.parts.some(b=>!b.url.startsWith("file:")&&!/^\/__native_ui_engine__\/nativeUI[a-fA-F0-9]+\/[a-fA-F0-9-]+-[0-9]+\.png$/.test(b.url)||!b.ids.length||b.ids.some(V=>!ye.has(V))||![b.x,b.y,b.width,b.height].every(Number.isFinite)||b.width<=0||b.height<=0)||new Set(k.parts.flatMap(b=>b.ids)).size!==ye.size||k.parts.some(b=>new Set(b.ids.map(V=>x.find(Ie=>Ie.control.id===V).scope)).size!==1)||(await ce(Promise.all(k.parts.map(async b=>{let V=c.createElement("img");return ee.push(V),V.src=Ge(b.url),await V.decode(),V}))),J||v!=="native"||ie||g||n.blocked()||D!==y||A()!==L||Y?.revision!==t||x.some(b=>!S(b.scope.element)||![b.element,...b.sources??[]].every(u))))return;let Le=P;P={data:k,images:ee,sources:Array.from(new Set(x.flatMap(b=>[b.element,...b.sources??[]]))),targets:k.parts.map(b=>x.find(V=>b.ids.includes(V.control.id)).element),scopes:k.parts.map(b=>x.find(V=>b.ids.includes(V.control.id)).scope),parents:k.parts.map(b=>x.find(V=>b.ids.includes(V.control.id)).scope.element.parentNode),frames:[],viewport:L,revision:t,layout:N(x)},Ee(),P.sources.forEach(b=>{p.add(b),se.add(b)}),Re(),n.opaqueUnderlay&&j({action:"prepared",token:k.token}).catch(()=>{}),l.dispatchEvent(new Event(O)),Me=r,G=!0,Z(Le)}catch{}finally{G||ee.forEach(te=>{te.src=""}),k?.token&&!G&&j({action:"release",token:k.token}).catch(()=>{}),we=!1,Y&&(Y.revision!==t||B!==r)&&ne()}},ne=()=>{l.clearTimeout(re),!J&&v==="native"&&!g&&!ie&&!n.blocked()&&(re=l.setTimeout(()=>{fe()},f))},Pe,Ce=(t,a)=>{if(a.some(r=>r.scope.element.ownerDocument!==c||[r.element,...r.sources??[]].some(L=>L.ownerDocument!==c)))throw new TypeError("All projection sources and fallback scopes must share one Document");if(n.blocked())return;!g&&P&&P.layout!==N(Se(a))&&ve();let y=N(a);Pe!==y&&(Pe=y,B++,D++),Y?.revision!==t&&D++,Y={revision:t,candidates:a},(P?.revision!==t||Me!==B)&&ne()},me=t=>{!g&&P&&t&&Y?.candidates.some(a=>a.scrollElement===t&&P.sources.includes(a.element))&&ve(),g&&(He(),De()),B++,D++,ne()},Oe=await Ne(o.listen(({active:t})=>{ie=t,D++,l.clearTimeout(re),t||ne()})),je=new Set,Te=t=>{je.delete(t)&&t.removeAttribute("data-native-ui-snapshot-prepared"),t.removeAttribute("data-native-ui-snapshot-visible"),t.removeAttribute(M),t.removeAttribute("data-native-ui-snapshot-source")},s=()=>{ue++,l.cancelAnimationFrame(X),l.cancelAnimationFrame(xe),xe=0,q.clear(),X=0,F=!1,C=!1,Ee(),g?.sources.forEach(t=>{R.delete(t),m.delete(t)}),z.forEach(Te),z.clear(),d.forEach(({base:t,image:a})=>{t.remove(),a.remove()}),d.clear()},h=(t=g,a=U)=>{if(g!==t)return;let y=new Set([g,P]);s(),g=void 0,P=void 0,U=!1,l.clearTimeout(pe),y.forEach(r=>Z(r,a)),n.wake()},E=()=>{if(!g)return;if(P!==g){h();return}let t=g;s(),g=void 0,U=!1,l.clearTimeout(pe),_("restored",t.data.token,!0),t.sources.forEach(a=>{p.add(a),se.add(a)}),Re(),n.wake()},K=()=>{U&&E(),be.forEach(t=>t())},I=t=>t.scopes.map(a=>S(a.element)?a.element:void 0),z=new Set,Q=new Map,q=new Map,xe=0,He=()=>{for(let[t,a]of q){if(!t.isConnected)continue;let y=l.getComputedStyle(t),r=`${a.x-(parseFloat(y.borderLeftWidth)||0)+t.scrollLeft}px`,L=`${a.y-(parseFloat(y.borderTopWidth)||0)+t.scrollTop}px`;a.style.left!==r&&a.style.setProperty("left",r,"important"),a.style.top!==L&&a.style.setProperty("top",L,"important")}},De=()=>{if(xe||!g)return;[...q.keys()].some(a=>a.getAnimations?.().some(y=>y.playState==="running"&&y.effect?.getKeyframes().some(r=>["borderLeftWidth","borderTopWidth","borderWidth"].some(L=>L in r))))&&(xe=l.requestAnimationFrame(()=>{xe=0,He(),De()}))},Re=()=>{let t=g??P;if(!t||U)return;if(!t.sources.every(u)||I(t).some(r=>!r)){ve();return}let a=I(t);if(g){if(a.some(L=>!L?.isConnected||!d.has(W(L)))){h(g,!1);return}let r=new Set;for(let[L,x]of t.targets.entries()){let k=Q.get(x),G=a[L];!k||!G?.isConnected||(G.setAttribute(M,k),G.setAttribute("data-native-ui-snapshot-source",""),G.toggleAttribute("data-native-ui-snapshot-visible",C),r.add(G))}for(let L of z)r.has(L)||Te(L);z.clear(),r.forEach(L=>z.add(L));return}Q.clear(),q.clear(),z.forEach(Te),z.clear();let y=new Map;for(let r of new Set(a)){if(!r)continue;z.add(r);let L=$(W(r)),x=y.get(L);x||(x={rules:[],positions:[]},y.set(L,x));let{rules:k,positions:G}=x;r!==t.targets[a.indexOf(r)]&&!r.hasAttribute("data-native-ui-snapshot-prepared")&&(r.setAttribute("data-native-ui-snapshot-prepared",""),je.add(r)),r.toggleAttribute("data-native-ui-snapshot-visible",!!g||!!n.opaqueUnderlay),g&&r.setAttribute("data-native-ui-snapshot-source","");let ee=a.flatMap((H,oe)=>H===r?[oe]:[]),te=l.getComputedStyle(r);{let H=Ze(r,l,te);ee.forEach(oe=>{let Fe=t.data.parts[oe];n.opaqueUnderlay&&t.frames[oe]||(t.frames[oe]={x:n.opaqueUnderlay?0:(Fe.x-H.x)/H.scaleX,y:n.opaqueUnderlay?0:(Fe.y-H.y)/H.scaleY,width:Fe.width/H.scaleX,height:Fe.height/H.scaleY})})}let he=ee.map(H=>t.frames[H]),ye=Math.min(...he.map(H=>H.x)),Le=Math.min(...he.map(H=>H.y)),b=Math.max(...he.map(H=>H.x+H.width)),V=Math.max(...he.map(H=>H.y+H.height)),Ie=(parseFloat(te.borderLeftWidth)||0)-r.scrollLeft,ot=(parseFloat(te.borderTopWidth)||0)-r.scrollTop,Ae=`${w}-${ee[0]}`;ee.forEach(H=>Q.set(t.targets[H],Ae)),r.setAttribute(M,Ae),k.push(`[${M}="${Ae}"][data-native-ui-snapshot-visible] { ${te.position==="static"?"position:relative!important;":""} }`);let rt=ee.map(H=>{let oe=t.frames[H];return`url(${JSON.stringify(t.images[H].src)}) ${oe.x-ye}px ${oe.y-Le}px / ${oe.width}px ${oe.height}px no-repeat`}),ke=c.createElement("span").style;ke.cssText=`left:${ye-Ie}px;top:${Le-ot}px;width:${b-ye}px;height:${V-Le}px;background:${rt.join(",")};`;for(let H of Array.from(ke))ke.setProperty(H,ke.getPropertyValue(H),"important");k.push(`[${M}="${Ae}"][${M}][${M}]::before { ${ke.cssText} }`),G.push({target:r,x:ye,y:Le})}t.parents=t.scopes.map(r=>r.element.parentNode);for(let[r,{rules:L,positions:x}]of y)r.textContent=L.join(`
|
|
14
|
+
`),x.forEach(({target:k,x:G,y:ee},te)=>q.set(k,{x:G,y:ee,style:r.sheet.cssRules[te*2+1].style}))},Xe=()=>{if(K(),J||v==="none"||g)return;let t=P;if(!t||t.viewport!==A()||!t.sources.every(u)||n.current&&!n.current(t.targets)||t.targets.some(r=>!Q.has(r))||I(t).some(r=>!r?.isConnected)||[...z].some(r=>!r.isConnected))return;t.scopes.some((r,L)=>r.element.parentNode!==t.parents[L])&&Re(),He();let a=++ue,y=()=>ue===a;F=!0,C=!!n.opaqueUnderlay,g=t,D++,l.clearTimeout(re),t.sources.forEach(r=>{R.add(r)}),z.forEach(r=>{r.setAttribute("data-native-ui-snapshot-source",""),r.toggleAttribute("data-native-ui-snapshot-visible",C)}),X=l.requestAnimationFrame(()=>{X=0,y()&&(F=!1,n.wake())}),ce(j({action:"cover",token:t.data.token,...n.transient?{transient:!0}:{}})).then(r=>{if(y()){if(F=!1,r?.shown!==!0){h(t,!1);return}U||(C=!0,t.sources.forEach(L=>m.add(L)),Re(),He(),De()),l.cancelAnimationFrame(X),X=l.requestAnimationFrame(()=>{X=0,y()&&j({action:"painted",token:t.data.token}).catch(()=>{y()&&h(t,!1)})}),n.wake()}}).catch(()=>{y()&&h(t,!1)})},Ye=()=>{if(!(!g||J||U)){if(!g.sources.every(u)||I(g).some(t=>!t)||n.current&&!n.current(g.targets)){h(g,!1);return}if(!n.blocked()){if(n.transient){let t=g,a=I(t);if(a.some(r=>!r?.isConnected)){h(t,!1);return}let y=a.map((r,L)=>{let x=Ze(r,l),k=t.frames[L];return{...t.data.parts[L],x:x.x+k.x*x.scaleX,y:x.y+k.y*x.scaleY,width:k.width*x.scaleX,height:k.height*x.scaleY}});y.some((r,L)=>["x","y","width","height"].some(x=>r[x]!==t.data.parts[L][x]))&&(n.opaqueUnderlay?t.data={...t.data,parts:y}:P=void 0),j({action:"restore",token:t.data.token,viewportWidth:l.innerWidth,parts:y}).catch(()=>{})}ge=n.revision?.()??Y?.revision??0,U=!0,g.sources.forEach(t=>R.delete(t)),pe=l.setTimeout(()=>{U&&h(g,!1)},250),n.wake()}}},nt=(t,a,y)=>{!U||!g||y===void 0||y<=ge||!n.transient&&t||g.data.parts.every(r=>r.ids.every(L=>a?.includes(L)))&&(E(),ne())},ve=()=>{be.forEach(a=>a()),D++,l.clearTimeout(re);let t=P;P=void 0,Z(t),g?h(g,!1):(s(),Q.clear(),l.dispatchEvent(new Event(O)))},qe;try{n.events&&(qe=await Ue(n.events,(t,a)=>{if(!J){if(t&&(v=t),v==="none"){ve();return}t==="web"&&Xe(),t==="native"&&(Ye(),ne()),a&&me()}}))}catch(t){throw J=!0,ve(),await ce(Promise.resolve(Oe.remove())).catch(()=>{}),t}return{get owners(){return[...R]},get visibleOwners(){return[...m]},get preparedOwners(){return[...p]},consider:Ce,changed:me,moved:()=>{He(),De()},get token(){return U?void 0:g?.data.token},begin:Xe,get restoring(){return U},get handoffPending(){return F},retireRestoration:K,end:Ye,updated:nt,invalidate:ve,async destroy(){J=!0,ve(),await Promise.allSettled([ce(Promise.resolve().then(()=>Oe?.remove())),ce(Promise.resolve().then(()=>qe?.remove()))])}}},Qe=async(e,o,n)=>{let f=await yt(e,o,n),v=f.consider;return Object.assign(f,{consider:(c,l)=>v(c,l.map(w=>({...w,scope:e})))})};var et=(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 support ::before; use its existing container element");return Object.freeze({element:e,namespace:o})};var tt=async(e,o,n={addListener:async(f,v)=>globalThis.Capacitor.addListener(e.plugin,f,v)})=>{let f="view",v=e.receiveListeners,c=!1,l=!1,w="native",u="native",S=_e(document),j=()=>w==="native"&&d&&S.isCovered(d)?"web":w,M=!1,O=!1,R=!1,m,p,i,T=!1,N=()=>{let s=T;T=!0;try{i?.begin()}finally{T=s}},d,W={},$,A=0,F=()=>{A++,$=void 0;let s=$e(d);s?.owner===W&&(s.projected=!1,s.owner=void 0)},C={listen:s=>o.listen(s),send:s=>{if(!e.placementHandoff)return o.send(s);let h=$e(d);if(s.action==="cover"){let Q=++A;return $=s.token,h&&(h.owner=W,h.projected=!1),o.send(s).then(q=>(Q===A&&h===$e(d)&&h?.owner===W&&(h.projected=q?.shown===!0),q)).catch(q=>{throw Q===A&&h?.owner===W&&(F(),h.invalidate()),q})}let E=s.action==="release"&&s.token===$,K=$&&(s.action==="restore"||E||s.action==="reset"||s.action==="visibility"&&s.visible);K&&A++;let I=A,z=()=>{I!==A||h?.owner!==W||(F(),h.invalidate())};try{let Q=K&&h?.owner===W?{...s,token:"token"in s?s.token:$,placement:h.measure()}:s;return o.send(Q).then(q=>(I===A&&(s.action==="resume"||E||s.action==="reset"||s.action==="visibility")&&F(),q)).catch(q=>{throw z(),q})}catch(Q){return z(),Promise.reject(Q)}}},X=0,ue=0,P=0,g=!1,ie=!1,U=!1,pe=!1,ge=document.createElement("style"),D=`data-native-ui-session-${e.id.replace(/[^a-zA-Z0-9-]/g,"")}`;ge.textContent=`[${D}="native"], [${D}="native"] *, [${D}="none"], [${D}="none"] * {visibility:hidden!important}`,document.documentElement.append(ge);let re=()=>{let s=document.querySelectorAll(e.projectionSelector);return s.length===1&&s[0]instanceof HTMLElement?s[0]:void 0},B=()=>{d&&(u==="web"||u==="native"&&O?d.removeAttribute(D):d.setAttribute(D,u))},Me=()=>{if(!d?.isConnected)return[];let s=d.getBoundingClientRect(),h={x:s.x,y:s.y,width:s.width,height:s.height},E=m&&Ve(d,m,()=>e.id);return[{element:d,scrollElement:m,control:{id:f,...h,...E?{scroll:E}:{}}}]},J=async()=>{if(c)return;let s=P,h=e.failedFallback==="native"&&j()==="native"&&!!d?.isConnected;await C.send({action:"visibility",visible:h}).catch(()=>{}),!(c||s!==P)&&(h||u==="none"?B():d?.removeAttribute(D))},we=()=>{if(!M||u!=="native"||!d?.isConnected||i?.token||i?.restoring)return;let s=e.failedFallback==="native";C.send({action:"visibility",visible:s}).catch(()=>{}),s?B():d.removeAttribute(D)},Y=()=>{if(c||T)return;if(we(),u==="web"&&i&&!i.token&&!i.restoring){C.send({action:"visibility",visible:!1}).catch(()=>{}),d?.removeAttribute(D);return}if(g||!i?.restoring||u!=="native")return;g=!0;let s=P,h=i;C.send({action:"resume"}).then(()=>{c||s!==P||h!==i||(O=!1,h.updated(void 0,[f],++X),B(),_())}).catch(()=>{s!==P||c||(h.invalidate(),J())}).finally(()=>{g=!1,Y()})},be=async()=>{if(c||ie||M)return;if(i?.restoring){Y();return}let s=re();if(s!==d){if(P++,F(),d?.removeAttribute(D),await i?.destroy(),i=void 0,c)return;d=s,O=!1,Ee.disconnect(),d&&Ee.observe(d)}if(ne(),u=j(),!d){await C.send({action:"visibility",visible:!1});return}if(!i){ie=!0;let h=P;try{let E=await Qe(et(d,e.id),C,{wake:Y,captureDelayMs:e.captureDelayMs,blocked:()=>u!=="native"||M||O&&!i?.token,revision:()=>X,captureRevision:e.captureMode==="view"?()=>ue:void 0,transient:!0,opaqueUnderlay:e.captureMode==="view"});if(c||h!==P){await E.destroy();return}i=E}finally{ie=!1}}if(!c){if(u==="native"&&O){await C.send({action:"visibility",visible:!1}),B();return}if(u==="native"){let h=P;if(await C.send({action:"visibility",visible:!0}),c||h!==P||u!=="native")return;B(),m=[...ae(d)].find(I=>{let z=getComputedStyle(I);return/auto|scroll/.test(z.overflowX+z.overflowY)&&(I.scrollHeight>I.clientHeight||I.scrollWidth>I.clientWidth)});let E=m&&Ve(d,m,()=>e.id),K=await C.send({action:"track",viewportWidth:innerWidth,...E?{scroll:E}:{}});if(c||h!==P)return;R=K?.tracked===!0,i.consider(e.captureMode==="view"?ue:++X,Me())}else await C.send({action:"visibility",visible:!1}),B()}},_=()=>{c||(U=!0,!(!l||pe)&&(pe=!0,Promise.resolve().then(async()=>{try{for(;U&&!c;)U=!1,await be()}catch{await J()}finally{pe=!1,U&&_()}})))},se=()=>{i?.invalidate(),_()},Ee=new ResizeObserver(se);window.addEventListener("resize",se);let Z=new Set,Se=new WeakSet,fe=s=>{let h=s.composedPath()[0]??s.target;if(!(c||u!=="native"||!d||Se.has(s)||h!==document&&![...ae(d)].includes(h))){if(Se.add(s),R&&h===m){i?.changed(h);return}M?e.captureMode==="view"?i?.moved():i?.changed():((g||i?.restoring)&&P++,M=!0,N(),O=e.failedFallback!=="native",i?.token?d.removeAttribute(D):we()),clearTimeout(p),p=setTimeout(()=>{M=!1,!(c||u!=="native")&&(i?.end(),i?.restoring||_())},100)}},ne=()=>{let s=new Set(d?ae(d):[]),h=s.size!==Z.size||[...s].some(E=>!Z.has(E));for(let E of Z)s.has(E)||(E.removeEventListener("scroll",fe),E.removeEventListener("slotchange",Pe),Z.delete(E));for(let E of s)Z.has(E)||(E.addEventListener("scroll",fe,{passive:!0}),E.addEventListener("slotchange",Pe),Z.add(E));h&&(R=!1,m=void 0,i?.invalidate(),_())},Pe=()=>{ne(),_()};document.addEventListener("scroll",fe,!0);let Ce=new MutationObserver(s=>{ne(),re()!==d?_():d&&s.some(h=>h.type==="childList")&&me(j())});Ce.observe(document.documentElement,{childList:!0,attributes:!0,subtree:!0});let me=(s,h=!1)=>{if(c||!h&&s===u)return;M=!1,clearTimeout(p),u=s,P++;let E=P;u==="none"?C.send({action:"visibility",visible:!1}).then(()=>{u!=="none"||E!==P||c||(i?.invalidate(),B())}).catch(()=>{u!=="none"||E!==P||c||(i?.invalidate(),B())}):u==="web"?(N(),i?.token||C.send({action:"visibility",visible:!1}).catch(()=>{}),B()):u==="native"&&(i?.end(),i?.restoring||_())},Oe=S.subscribe(()=>queueMicrotask(()=>me(j()))),je,Te=async()=>{if(!c){c=!0,F(),P++,Oe(),Ce.disconnect(),Ee.disconnect(),window.removeEventListener("resize",se),document.removeEventListener("scroll",fe,!0);for(let s of Z)s.removeEventListener("scroll",fe),s.removeEventListener("slotchange",Pe);Z.clear(),clearTimeout(p),d?.removeAttribute(D),ge.remove(),await Promise.allSettled([Promise.resolve(je?.remove()),i?.destroy()])}};try{let s=P;je=await Ue({addListener:(E,K)=>n.addListener(E,K),update:v?.update,projection:v?.projection,accepts:E=>!v?.match||Object.entries(v?.match).every(([K,I])=>typeof E=="object"&&E!==null&&E[K]===I)},(E,K)=>{c||(E&&(E==="native"&&(O=!1),w=E,C.send({action:"destination",destination:E}).catch(()=>{}),me(j(),!0)),K&&(ue++,i?.changed(),u==="native"&&_()))});let h=await C.send({action:"connect"});return P===s&&["native","web","none"].includes(h?.destination)&&(w=h.destination),u=j(),l=!0,_(),{destroy:Te,show:()=>{O=!1,w="native",me(j(),!0)},hide:()=>{w=u="none",P++,M=!1,clearTimeout(p),i?.invalidate(),B()}}}catch(s){throw await Te(),s}};var le=new Map,de=new Map,We=new Map,gt=Array.from(crypto.getRandomValues(new Uint32Array(4)),e=>e.toString(16)).join("-"),Be=new Map,wt=(e,o,n)=>Be.get(e)?.get(o)?.(n),bt=0,Et=(e,o)=>new Promise((n,f)=>{let v=`${e}:${gt}:${++bt}`,c=setTimeout(()=>{de.delete(v),f(new Error("Native UI session timed out"))},5e3);de.set(v,{resolve:n,reject:f,timer:c});let l=JSON.stringify({key:v,request:o}),w=globalThis,u=w.webkit?.messageHandlers?.[e]??w[e]??w.nativeUIEngine;if(!u){clearTimeout(c),de.delete(v),f(new Error("Native UI session unavailable"));return}try{u.postMessage(l)}catch(S){clearTimeout(c),de.delete(v),f(S)}}),Pt=(e,o,n,f)=>{if(o===null){We.get(e)?.(n);return}let v=de.get(o);!v||!o.startsWith(`${e}:`)||(de.delete(o),clearTimeout(v.timer),f?v.reject(new Error(f)):v.resolve(n))},Tt=e=>{le.get(e)?.show()},Lt=e=>(le.get(e)?.hide(),!0),Mt=async e=>{let o=le.get(e);le.delete(e),Be.delete(e),We.delete(e);for(let[n,f]of de)n.startsWith(`${e}:`)&&(de.delete(n),clearTimeout(f.timer),f.reject(new Error("Native UI session closed")));await o?.destroy()},St=async e=>{if(le.has(e.id))return;let o,n=!1,f,v={show:()=>{f="native",o?.show()},hide:()=>{f="none",o?.hide()},destroy:async()=>{n=!0,await o?.destroy()}};le.set(e.id,v);try{if(document.readyState==="loading"&&await new Promise(l=>document.addEventListener("DOMContentLoaded",()=>l(),{once:!0})),n)return;let c=new Map;e.runtime==="cordova"&&Be.set(e.id,c),o=await tt(e,{send:l=>Et(e.id,l),listen:async l=>(We.set(e.id,l),{remove:()=>{We.get(e.id)===l&&We.delete(e.id)}})},e.runtime==="cordova"?{addListener:async(l,w)=>(c.set(l,w),{remove:()=>{c.delete(l)}})}:void 0),f==="none"?o.hide():f==="native"&&o.show(),n&&await o.destroy()}catch(c){throw le.get(e.id)===v&&(le.delete(e.id),Be.delete(e.id)),c}};return dt(jt);})();
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webview-native-ui/engine",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "Native UI placement, scroll tracking, and Web projection for Capacitor and Cordova plugin maintainers.",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"license": "
|
|
6
|
+
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
9
9
|
"url": "git+https://github.com/webview-native-ui/engine.git"
|
|
@@ -24,7 +24,6 @@
|
|
|
24
24
|
"WebViewNativeUIEngine.podspec",
|
|
25
25
|
"README.md",
|
|
26
26
|
"LICENSE",
|
|
27
|
-
"NOTICE",
|
|
28
27
|
"docs"
|
|
29
28
|
],
|
|
30
29
|
"scripts": {
|
package/NOTICE
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
WebView Native UI Engine
|
|
2
|
-
https://github.com/webview-native-ui/engine
|
|
3
|
-
|
|
4
|
-
Extracted from https://github.com/rdlabo-dev/ionic-theme-ios27 at commit
|
|
5
|
-
b218d8bfe0c87c02addc668fee9c7aa333489486 (2026-10-27).
|
|
6
|
-
Original history remains available in that repository.
|
|
7
|
-
|
|
8
|
-
This package extracts and adapts native UI infrastructure from
|
|
9
|
-
ionic-theme-ios27 / @rdlabo/capacitor-native-ui. It is an adapted library,
|
|
10
|
-
not an unmodified copy of those projects. New work and modifications in
|
|
11
|
-
this engine are licensed under Zlib (see LICENSE).
|
|
12
|
-
|
|
13
|
-
The upstream MIT notice is retained below for the portions derived from
|
|
14
|
-
those projects. This does not withdraw rights previously granted under MIT.
|
|
15
|
-
The Gradle wrapper retains its own Apache-2.0 notices.
|
|
16
|
-
|
|
17
|
-
--- Upstream notice ---
|
|
18
|
-
|
|
19
|
-
MIT License
|
|
20
|
-
|
|
21
|
-
Copyright (c) 2021
|
|
22
|
-
|
|
23
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
24
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
25
|
-
in the Software without restriction, including without limitation the rights
|
|
26
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
27
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
28
|
-
furnished to do so, subject to the following conditions:
|
|
29
|
-
|
|
30
|
-
The above copyright notice and this permission notice shall be included in all
|
|
31
|
-
copies or substantial portions of the Software.
|
|
32
|
-
|
|
33
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
34
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
35
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
36
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
37
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
38
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
39
|
-
SOFTWARE.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|