pikibun 0.24.0 → 0.25.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 (98) hide show
  1. package/dist/chunks/{chunk-XNVA5UWA.js → chunk-3IXKVGAD.js} +1 -1
  2. package/dist/chunks/{cli-L6ODIDYQ.js → cli-COW3WXMB.js} +1 -1
  3. package/dist/cli.js +3 -3
  4. package/dist/web/app.eb3752a36c.js +14 -0
  5. package/dist/web/app.eb3752a36c.js.br +0 -0
  6. package/dist/web/app.eb3752a36c.js.gz +0 -0
  7. package/dist/web/assets/src/assets/logo.5872d6d67c.png +0 -0
  8. package/dist/web/browser.6333ad295d/runtime.js +2 -0
  9. package/dist/web/browser.6333ad295d/runtime.js.br +0 -0
  10. package/dist/web/browser.6333ad295d/runtime.js.gz +0 -0
  11. package/dist/web/host.19652b6282.js +80 -0
  12. package/dist/web/host.19652b6282.js.br +0 -0
  13. package/dist/web/host.19652b6282.js.gz +0 -0
  14. package/dist/web/index.html +3 -3
  15. package/dist/web/index.html.br +0 -0
  16. package/dist/web/index.html.gz +0 -0
  17. package/dist/web/{nsh.89070fe10a.js → nsh.6b31ba26e0.js} +1 -1
  18. package/dist/web/nsh.6b31ba26e0.js.br +0 -0
  19. package/dist/web/nsh.6b31ba26e0.js.gz +0 -0
  20. package/npm-shrinkwrap.json +2 -2
  21. package/package.json +1 -1
  22. package/dist/web/app.1d48db9d4c.js +0 -12
  23. package/dist/web/app.1d48db9d4c.js.br +0 -0
  24. package/dist/web/app.1d48db9d4c.js.gz +0 -0
  25. package/dist/web/browser.991ab24c49/runtime.js +0 -2
  26. package/dist/web/browser.991ab24c49/runtime.js.br +0 -0
  27. package/dist/web/browser.991ab24c49/runtime.js.gz +0 -0
  28. package/dist/web/host.a102cc9754.js +0 -38
  29. package/dist/web/host.a102cc9754.js.br +0 -0
  30. package/dist/web/host.a102cc9754.js.gz +0 -0
  31. package/dist/web/nsh.89070fe10a.js.br +0 -0
  32. package/dist/web/nsh.89070fe10a.js.gz +0 -0
  33. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/LICENSES.txt +0 -0
  34. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/LICENSES.txt.br +0 -0
  35. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/LICENSES.txt.gz +0 -0
  36. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/animation.js +0 -0
  37. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/animation.js.br +0 -0
  38. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/animation.js.gz +0 -0
  39. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/bootstrap.js +0 -0
  40. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/buffer.js +0 -0
  41. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/buffer.js.br +0 -0
  42. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/buffer.js.gz +0 -0
  43. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/canvas.js +0 -0
  44. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/canvas.js.br +0 -0
  45. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/canvas.js.gz +0 -0
  46. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/components.js +0 -0
  47. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/components.js.br +0 -0
  48. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/components.js.gz +0 -0
  49. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/dom.js +0 -0
  50. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/dom.js.br +0 -0
  51. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/dom.js.gz +0 -0
  52. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/environment.js +0 -0
  53. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/environment.js.br +0 -0
  54. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/environment.js.gz +0 -0
  55. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/gesture.js +0 -0
  56. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/gesture.js.br +0 -0
  57. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/gesture.js.gz +0 -0
  58. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/host.js +0 -0
  59. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/host.js.br +0 -0
  60. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/host.js.gz +0 -0
  61. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/hot.js +0 -0
  62. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/hot.js.br +0 -0
  63. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/hot.js.gz +0 -0
  64. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/keymap.js +0 -0
  65. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/keymap.js.br +0 -0
  66. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/keymap.js.gz +0 -0
  67. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/list.js +0 -0
  68. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/list.js.br +0 -0
  69. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/list.js.gz +0 -0
  70. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/loader.js +0 -0
  71. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/modules.js +0 -0
  72. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/modules.js.br +0 -0
  73. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/modules.js.gz +0 -0
  74. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/navigation.js +0 -0
  75. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/navigation.js.br +0 -0
  76. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/navigation.js.gz +0 -0
  77. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/path.js +0 -0
  78. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/path.js.br +0 -0
  79. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/path.js.gz +0 -0
  80. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/reactive.js +0 -0
  81. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/reactive.js.br +0 -0
  82. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/reactive.js.gz +0 -0
  83. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/realm.js +0 -0
  84. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/resource.js +0 -0
  85. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/resource.js.br +0 -0
  86. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/resource.js.gz +0 -0
  87. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/scope.js +0 -0
  88. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/scope.js.br +0 -0
  89. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/scope.js.gz +0 -0
  90. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/standard.js +0 -0
  91. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/standard.js.br +0 -0
  92. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/standard.js.gz +0 -0
  93. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/testing.js +0 -0
  94. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/testing.js.br +0 -0
  95. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/testing.js.gz +0 -0
  96. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/values.js +0 -0
  97. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/values.js.br +0 -0
  98. /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/values.js.gz +0 -0
@@ -254,6 +254,6 @@ img.nsh-fill { pointer-events: none; }
254
254
  background: rgba(255,255,255,.12); color: #fff; font: 600 12px -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
255
255
  padding: 4px 12px; cursor: pointer; }
256
256
  .nsh-error-copy:hover { background: rgba(255,255,255,.2); }
257
- `,document.head.append(e)}this.root=document.createElement(`div`),this.root.className=window.top===window?`nsh-root`:`nsh-root nsh-embedded`,e.append(this.root),this.views=new Map,this.mouseTracked=new Set,this.shaderViews=new Set,this.classPrefix=`nsh-p${++w}-`,this.timer=0,this.trapped=!1,this.pumpRequested=!1,this.frame=0,this.measure=O(),this.measureUses=0,this.metricsCache=new Map,this.layoutAnimation=null,this.appearing=[],this.disappearing=[],this.changedStacks=new Set,this.removals=[],this.images=new Map,this.inlineImages=new Map,this.pointers=new Map,this.requests=new Map,this.websockets=new Map,this.fileOperations=new Map,this.dark=t.dark??matchMedia(`(prefers-color-scheme: dark)`).matches,this.history=t.history??window.top===window,this.viewportDialogs=t.dialogs===`viewport`&&typeof HTMLElement.prototype.showPopover==`function`,t.dialogs===`viewport`&&!this.viewportDialogs&&console.warn(`[nsh] this browser has no popovers: dialogs cover the player, not the window`),this.hostEvents=[],window.top===window&&document.documentElement.classList.add(`nsh-page`)}async load(e){let t=this.options.glue?E(this.options.glue):null;t?.catch(()=>{});let n={env:{__nsh_random_fill:(e,t)=>{try{let n=this.bytes(e,t);for(let e=0;e<t;e+=65536)globalThis.crypto.getRandomValues(n.subarray(e,Math.min(e+65536,t)));return 0}catch{return-1}}},nsh:{now_ms:()=>performance.now(),date_now_ms:()=>Date.now(),local_offset:e=>u(e),time_zone:(e,t)=>{let n=p.encode(d());return n.length<=t&&this.bytes(e,t).set(n),n.length},measure_text:(e,t,n,r)=>(++this.measureUses>=5e3&&(this.measureUses=0,this.measure=O()),this.measure.font=this.str(e,t),this.measure.measureText(this.str(n,r)).width),measure_numeric_text:(e,t,n,r,i,a)=>{let o=this.str(e,t),s=this.str(i,a);return A(o,this.str(n,r),s)??(this.measure.font=o,this.measure.measureText(s).width)},text_cluster_boxes:(e,t,n,r,i,a,o,s,c,l)=>{let u=new Uint32Array(this.wasm.memory.buffer,s,l*2),d=Array.from({length:l},(e,t)=>[u[2*t],u[2*t+1]]),f=j(this.str(e,t),this.str(n,r),i,this.str(a,o),d),p=new Float32Array(this.wasm.memory.buffer,c,l*2);f.forEach(([e,t],n)=>{p[2*n]=e,p[2*n+1]=t})},font_ascent:(e,t)=>this.metrics(this.str(e,t))[0],font_descent:(e,t)=>this.metrics(this.str(e,t))[1],font_x_height:(e,t)=>this.metrics(this.str(e,t))[2],register_font:(e,t,n,r,i,a)=>{let o=this.str(e,t),s=this.bytes(n,r).slice(),c=new FontFace(o,s,{weight:String(i),style:a?`italic`:`normal`});document.fonts.add(c),this.fontLoading(c.load())},image_bytes:(e,t,n,r)=>{let i=this.str(e,t),a=this.inlineImages.get(i);a&&URL.revokeObjectURL(a);let o=i.startsWith(`data:`)?i.slice(5,i.indexOf(`;`)):``;this.inlineImages.set(i,URL.createObjectURL(new Blob([this.bytes(n,r).slice()],{type:o})))},release_image:(e,t)=>{let n=this.str(e,t),r=this.inlineImages.get(n);r&&URL.revokeObjectURL(r),this.inlineImages.delete(n)},submit:(e,t)=>{let n=JSON.parse(this.str(e,t));this.apply(n)},request_frame:()=>this.requestFrame(),request_pump:()=>this.requestPump(),report_error:(e,t)=>this.showError(this.str(e,t)),report_panic:(e,t)=>this.reportPanic(this.str(e,t)),test_send:(e,t)=>this.onTestSend?.(JSON.parse(this.str(e,t))),log:(e,t,n)=>{let r=this.str(t,n);(e<=1?console.error:e===2?console.warn:console.log)(`[nsh]`,r),this.options.onLog?.(e<=1?`error`:e===2?`warn`:`log`,r)},read_asset:(e,t)=>{let n=this.options.readAsset?.(this.str(e,t));return n?(this.withStrings([n],(e,t)=>this.wasm.nsh_asset_bytes(e,t)),1):0},asset_url:(e,t,n,r)=>{let i=p.encode(this.asset(this.str(e,t)));return i.length<=r&&this.bytes(n,r).set(i),i.length},fetch_start:(e,t,n,r,i,a,o,s,c,l,u)=>this.fetchStart(e,this.str(t,n),this.str(r,i),JSON.parse(this.str(a,o)),l===1?this.bytes(s,c).slice():null,l===2,u!==0),fetch_send:(e,t,n)=>this.fetchSend(e,this.bytes(t,n).slice()),fetch_finish:e=>this.requests.get(e)?.finish?.(),fetch_pause:(e,t)=>this.fetchPause(e,t!==0),fetch_cancel:e=>this.fetchCancel(e),filesystem_start:(e,t,n,r,i)=>this.filesystemStart(e,JSON.parse(this.str(t,n)),this.bytes(r,i).slice()),filesystem_cancel:e=>this.fileOperations.delete(e),websocket_start:(e,t,n)=>this.websocketOperation(()=>this.websocketStart(e,JSON.parse(this.str(t,n)))),websocket_send:(e,t,n,r)=>this.websocketOperation(()=>{let i=this.websockets.get(e);if(!i)throw Error(`WebSocket is closed`);i.send(r?this.bytes(t,n).slice():this.str(t,n))}),websocket_close:(e,t,n,r)=>this.websocketOperation(()=>{let i=this.websockets.get(e);i&&i.close(t,this.str(n,r))}),websocket_buffered:e=>this.websockets.get(e)?.bufferedAmount??0,websocket_pause:(e,t)=>this.websocketPause(e,t!==0),websocket_cancel:e=>this.websocketCancel(e),load_data:(e,t)=>this.loadData(this.str(e,t)),storage_load:(e,t)=>this.storage(()=>{let n=this.str(e,t),r=Object.create(null);for(let e=0;e<localStorage.length;e++){let t=localStorage.key(e);t?.startsWith(n)&&(r[t.slice(n.length)]=localStorage.getItem(t))}return JSON.stringify(r)}),storage_set:(e,t,n,r,i,a)=>this.storage(()=>localStorage.setItem(this.str(e,t)+this.str(n,r),this.str(i,a))),storage_remove:(e,t,n,r)=>this.storage(()=>localStorage.removeItem(this.str(e,t)+this.str(n,r))),storage_clear:(e,t)=>this.storage(()=>{let n=this.str(e,t),r=[];for(let e=0;e<localStorage.length;e++){let t=localStorage.key(e);t?.startsWith(n)&&r.push(t)}for(let e of r)localStorage.removeItem(e)})}},r=await(typeof e==`string`||e instanceof URL?fetch(e):e),i=r.headers.get(`Content-Type`)?.trim().toLowerCase()===`application/wasm`&&WebAssembly.compileStreaming?await WebAssembly.compileStreaming(r):await WebAssembly.compile(await r.arrayBuffer()),a=t&&await t;if(a){if(typeof a.__nsh_imports!=`function`||typeof a.__nsh_finalize!=`function`)throw Error(`the glue ${this.options.glue} exports no __nsh_imports / __nsh_finalize: it must be the glue the nsh CLI adapts (nsh-bindgen.js), not wasm-bindgen's own output`);for(let[e,t]of Object.entries(a.__nsh_imports()))n[e]=e in n?{...t,...n[e]}:t}for(let{module:e,name:t,kind:r}of WebAssembly.Module.imports(i))r!==`function`||n[e]?.[t]||(n[e]??={},n[e][t]=()=>{throw Error(`nsh.wasm called ${e}.${t}, which the web runtime does not provide`)});if(WebAssembly.Module.imports(i).some(e=>e.module===`nsh_browser`)){let{createBrowserHost:e}=await import(`./browser.991ab24c49/runtime.js`);this.browserHost=e(this),n.nsh_browser=this.browserHost.imports}n.__wbindgen_placeholder__&&(n.__wbindgen_placeholder__.__wbindgen_describe=()=>{});let o=await WebAssembly.instantiate(i,n);this.wasm=this.browserHost?this.browserHost.bind(o.exports):o.exports,this.mainExports=o.exports,this.sideLoads=new Map,this.sideModules=new Map,this.trapped=!1,a?.__nsh_finalize(o,i);for(let e of Object.keys(o.exports))/^nsh_(part|std|feature|ui_set)_/.test(e)&&o.exports[e]();this.wasm.nsh_app_init?.(),this.withStrings([document.baseURI],(e,t)=>this.wasm.nsh_set_base_url(e,t)),new ResizeObserver(()=>this.resized()).observe(this.root),matchMedia(`(prefers-color-scheme: dark)`).addEventListener(`change`,e=>{this.options.dark===void 0&&this.setDark(e.matches)}),this.installEnvironment(),this.installInput()}loadSides(e,t){return Promise.all((e??[]).map(e=>this.loadSide(e,t)))}prefetchSides(e){let t=Object.keys(e??{}).filter(t=>!e[t].onDemand);for(let n of t){if(this.sideModules.has(n)||this.sideLoads.has(n))continue;let t=this.compileSide(e[n].url,{priority:`low`});t.catch(()=>this.sideModules.delete(n)),this.sideModules.set(n,t)}}preloadSides(e){let t=Object.keys(e??{}).filter(t=>!e[t].onDemand);t.length&&(globalThis.requestIdleCallback??(e=>setTimeout(e,200)))(()=>this.loadSides(t,e).catch(e=>console.warn(`[nsh] preloading side modules: ${e?.message??e}`)))}async compileSide(e,t){try{return await WebAssembly.compileStreaming(fetch(e,t))}catch(n){if(!(n instanceof TypeError))throw n;let r=await fetch(e,t);if(!r.ok)throw Error(`${e}: HTTP ${r.status}`);return WebAssembly.compile(await r.arrayBuffer())}}loadSide(e,t){if(!this.sideLoads.has(e)){let n=t?.[e];if(!n)return Promise.reject(Error(`no side module ${e}`));this.sideLoads.set(e,this.instantiateSide(e,n,t))}return this.sideLoads.get(e)}async instantiateSide(e,{url:t,gate:n,needs:r},i){let a={main:this.mainExports},o=await Promise.all((r??[]).map(e=>this.loadSide(e,i)));(r??[]).forEach((e,t)=>{a[e]=o[t]});let s=this.sideModules.get(e);this.sideModules.delete(e);let c=await(s?.catch(()=>null)??null)??await this.compileSide(t),l=await WebAssembly.instantiate(c,a);if(n){let e=l.exports[n];if(typeof e!=`function`)throw Error(`${t} exports no ${n}`);e(),this.afterGate(n)}return l.exports}afterGate(e){typeof this.wasm.nsh_after_gate==`function`&&this.withStrings([e],(e,t)=>this.wasm.nsh_after_gate(e,t))}testStart(){this.testing=!0,this.wasm.nsh_test_start?.()}testSetup(e,t,n){if(this.testIdiom=n?.idiom,!this.wasm.nsh_test_setup)return;let r=JSON.stringify({storage:e??[],trace:!!t,environment:n??{}});this.withStrings([r],(e,t)=>this.wasm.nsh_test_setup(e,t))}testFetchReply(e,t){this.wasm.nsh_test_fetch_reply&&this.withStrings([JSON.stringify({id:e,reply:t})],(e,t)=>this.wasm.nsh_test_fetch_reply(e,t))}get takesTests(){return typeof this.wasm?.nsh_test_answer==`function`}testStep(e){if(!this.takesTests)return{outcome:`failed`,message:`this runtime takes no test steps`};let t=this.withStrings([JSON.stringify(e)],(e,t)=>this.wasm.nsh_test_answer(e,t)),n=JSON.parse(this.str(this.wasm.nsh_test_answer_ptr(),t));if(e.query?.query===`animating`&&`done`in n)return{outcome:`done`,value:n.done===!0||this.pageAnimating()};if(`done`in n)return{outcome:`done`,value:n.done??null};if(`failed`in n)return{outcome:`failed`,message:n.failed};try{return{outcome:`done`,value:this.testPage(e.query??{})}}catch(e){return{outcome:`failed`,message:String(e?.message??e)}}}pageAnimating(){return this.root.getAnimations({subtree:!0}).some(e=>{if(e.playState!==`running`)return!1;let t=e.effect?.getComputedTiming().endTime;return t!=null&&Number.isFinite(Number(t))})}testPage(e){switch(e.query){case`bounds`:{let t=this.views.get(e.id);if(!t?.isConnected)return null;let n=t.getBoundingClientRect();return n.width===0&&n.height===0?null:[n.left,n.top,n.width,n.height]}case`viewport`:return[window.innerWidth,window.innerHeight];case`text_bounds`:{let t=this.views.get(e.id);if(!t?.isConnected)return null;for(let n of t.querySelectorAll(`:scope > .nsh-run`)){if(n._start==null)continue;let t=Math.max(e.start-n._start,0),r=Math.min(e.end-n._start,n.textContent.length);if(t>=r)continue;let i=document.createRange();i.setStart(...S(n,t)),i.setEnd(...S(n,r));let a=i.getBoundingClientRect();return[a.left,a.top,a.width,a.height]}return null}case`input_text`:{let t=this.views.get(e.id)?._field;return t?t.value:null}case`dialog_point`:{let t=this.root.querySelectorAll(`.nsh-dialog-backdrop`),n=t[t.length-1];if(!n)throw Error(`no dialog is shown`);if(e.button==null){let e=n.getBoundingClientRect();return[e.left+2,e.top+2]}let r=[...n.querySelectorAll(`button`)].find(t=>t.textContent.trim()===e.button);if(!r)throw Error(`the dialog has no button ${JSON.stringify(e.button)}`);let i=r.getBoundingClientRect();return[i.left+i.width/2,i.top+i.height/2]}}throw Error(`the page cannot answer ${JSON.stringify(e)}`)}str(e,t){return m.decode(new Uint8Array(this.wasm.memory.buffer,e,t))}bytes(e,t){return new Uint8Array(this.wasm.memory.buffer,e,t)}storage(e){let t,n;try{t=e(),n=1}catch(e){t=String(e?.message??e),n=0}return typeof t==`string`&&this.withStrings([t],(e,t)=>this.wasm.nsh_storage_reply(e,t)),n}withStrings(e,t){let n=e.map(e=>{let t=typeof e==`string`?p.encode(e):e,n=this.wasm.nsh_alloc(t.length);return new Uint8Array(this.wasm.memory.buffer,n,t.length).set(t),[n,t.length]});try{return t(...n.flat())}finally{for(let[e,t]of n)this.wasm.nsh_dealloc(e,t)}}metrics(e){let t=this.metricsCache.get(e);if(!t){this.measure.font=e;let n=this.measure.measureText(`Hg`),r=this.measure.measureText(`x`);t=[n.fontBoundingBoxAscent??0,n.fontBoundingBoxDescent??0,r.actualBoundingBoxAscent??0],this.metricsCache.set(e,t)}return t}fontLoading(e){let t=this.fontsPending??=[];if(t.push(e.catch(e=>console.warn(`[nsh] font failed to load:`,e))),this.starting&&!this.root.classList.contains(`nsh-hidden`)&&(this.root.classList.add(`nsh-hidden`),clearTimeout(this.fontTimer),this.fontTimer=setTimeout(()=>this.root.classList.remove(`nsh-hidden`),3e3)),t.length>1)return;let n=()=>{let e=this.fontsPending;Promise.all(e).then(()=>{this.fontsPending.length>e.length?(this.fontsPending=this.fontsPending.slice(e.length),n()):(this.fontsPending=[],this.metricsCache.clear(),this.call(e=>e.nsh_fonts_loaded()),clearTimeout(this.fontTimer),this.root.classList.remove(`nsh-hidden`))})};n()}runModule(e,t){return this.browserHost?this.browserHost.run(e,t):Promise.reject(Error(`this runtime has no browser JavaScript host`))}runSource(e,{appId:t=``,capabilities:n=``,sourceMap:r=``,name:i=``}={}){return this.browserHost?this.browserHost.runSource(e,{appId:t,capabilities:n,sourceMap:r,name:i}):Promise.reject(Error(`this runtime has no browser JavaScript host`))}runRust(){if(!this.wasm.nsh_start_rust)throw Error(`this runtime has no Rust app`);let[e,t]=this.reset();this.begin(e,n=>(this.withStrings([n],(e,t)=>this.wasm.nsh_environment(e,t)),this.wasm.nsh_start_rust(e,t,+!!this.dark,devicePixelRatio||1)))}reset(){this.stop(),this.resetHistory(),this.app=(this.app??0)+1;let e=this.root;e.textContent=``,e.append(this.live),this.views.clear(),this.mouseTracked.clear(),e._id=1,e._kind=`root`,e._events=new Set,e._animation={},this.views.set(1,e);let t=e.clientWidth||390,n=e.clientHeight||844;return this.size=[t,n],this.size}begin(e,t,n=!1){this.idiom=this.options.idiom??this.testIdiom??this.measureIdiom(e);let r=this.reported=JSON.stringify(this.environment());this.updateRootClasses(),this.started=!1,this.hostEvents??=[],this.starting=!0;try{this.call(()=>t(r))}catch(e){throw this.hostEvents=null,e}finally{this.starting=!1}n||this.startedApp()}startedApp(){this.started=!0;let e=this.hostEvents;this.hostEvents=[];for(let t of e)this.eventJson(1,`onHost`,t)}async loadData(e){let t=this.options.data?.[e]??new URL(`nsh-${e}.bin`,import.meta.url),n=null;try{let r=`nsh_feature_${e}`;this.options.sides?.[r]?await this.loadSide(r,this.options.sides):this.wasm[r]?.();let i=await fetch(t);if(!i.ok)throw Error(`${i.status} ${i.statusText}`.trim());n=new Uint8Array(await i.arrayBuffer())}catch(e){console.warn(`[nsh]`,`${e.message??e} (${t})`)}let r=n??new Uint8Array;this.call(t=>this.withStrings([e,r],(e,r,i,a)=>t.nsh_data(e,r,i,a,+!!n)))}compile(e,t=`App.tsx`){if(!this.wasm.nsh_compile)return{error:`this runtime has no compiler (load nsh-playground.wasm)`};let n=this.withStrings([t,e],(e,t,n,r)=>this.wasm.nsh_compile(e,t,n,r)),r=this.str(this.wasm.nsh_compiled_ptr(),this.wasm.nsh_compiled_len());return n?{code:r}:{error:r}}async compileAndRun(e,t=`App.tsx`,n={}){let r=this.compile(e,t);return r.error?r.error:(await this.runSource(r.code,{name:t,...n}),null)}hotUpdate(e,t=`hot.js`,n=``){return this.browserHost?this.browserHost.hotUpdate(e,t,n??``):Promise.resolve(!1)}stop(){if(!this.stopping){this.stopping=!0;try{this.started=!1,this.hostEvents??=[],this.frameSession?.close(),this.viewportPageRelease?.(),this.viewportPageRelease=null;for(let e of this.frameLayers??[])e.remove();this.frameLayers?.clear(),this.viewportDialogs&&(this.dialogs=[]),this.viewportObserver?.disconnect(),this.fileOperations.clear();for(let e of[...this.requests.keys()])this.fetchCancel(e);for(let e of[...this.websockets.keys()])this.websocketCancel(e);clearTimeout(this.timer),cancelAnimationFrame(this.frame),this.frame=0,this.browserHost?.stop(),this.wasm?.nsh_stop()}finally{this.stopping=!1}}}requestPump(){this.pumpRequested||(this.pumpRequested=!0,setTimeout(()=>{this.pumpRequested=!1,this.call(e=>e.nsh_pump())},0))}schedule(e){clearTimeout(this.timer),e>=0&&(this.timer=setTimeout(()=>this.call(e=>e.nsh_pump()),Math.max(0,e)))}call(e){if(this.trapped)return;if(this.depth>0){(this.deferred??=[]).push(e);return}this.depth=1;try{this.schedule(e(this.wasm))}catch(e){throw e instanceof WebAssembly.RuntimeError&&this.trap(),e}finally{this.depth=0}let t=this.deferred;if(t?.length){this.deferred=[];for(let e of t)this.call(e)}}requestFrame(){this.frame||=requestAnimationFrame(e=>{this.frame=0,this.call(t=>t.nsh_frame(e))})}resized(){let e=this.root.clientWidth,t=this.root.clientHeight;if(this.size&&e&&(e!==this.size[0]||t!==this.size[1])){this.size=[e,t],this.call(n=>n.nsh_resize(e,t)),this.environmentChanged();for(let e of this.views.values())e._kind===`modal`&&e.isConnected&&!e._leaving&&this.placeModal(e)}}measureIdiom(e){return matchMedia(`(pointer: fine) and (hover: hover)`).matches&&e>=600?`desktop`:Math.min(screen.width,screen.height)>=600?`pad`:`phone`}installEnvironment(){let e=()=>this.environmentChanged();this.reducedMotion=matchMedia(`(prefers-reduced-motion: reduce)`),this.reducedMotion.addEventListener(`change`,e);let t=()=>{matchMedia(`(resolution: ${devicePixelRatio||1}dppx)`).addEventListener(`change`,()=>{t(),e()},{once:!0})};t(),addEventListener(`languagechange`,e),addEventListener(`resize`,e),document.addEventListener(`visibilitychange`,e),addEventListener(`focus`,e),addEventListener(`blur`,e),visualViewport?.addEventListener(`resize`,e),visualViewport?.addEventListener(`scroll`,e),new MutationObserver(e).observe(document.documentElement,{attributes:!0,attributeFilter:[`dir`,`lang`]}),this.safeProbe=document.createElement(`div`),this.safeProbe.className=`nsh-probe`,document.body.append(this.safeProbe)}safeArea(e=this.root.getBoundingClientRect()){let t=getComputedStyle(this.safeProbe),n=e=>parseFloat(e)||0;return[Math.max(0,n(t.paddingTop)-e.top),Math.max(0,n(t.paddingRight)-(innerWidth-e.right)),Math.max(0,n(t.paddingBottom)-(innerHeight-e.bottom)),Math.max(0,n(t.paddingLeft)-e.left)].map(Math.round)}keyboardHeight(){let e=visualViewport;if(!e||e.scale>1.01)return 0;let t=this.root.getBoundingClientRect().bottom;return Math.max(0,Math.round(t-(e.offsetTop+e.height)))}environment(){let e=(navigator.languages?.length?navigator.languages:[navigator.language]).find(Boolean)??Intl.DateTimeFormat().resolvedOptions().locale,t=document.documentElement.getAttribute(`dir`),n=parseFloat(getComputedStyle(document.documentElement).fontSize)||16;return{idiom:this.idiom,locale:e,rtl:t===`rtl`||t===`ltr`?t===`rtl`:M(e),reduceMotion:this.reducedMotion.matches,fontScale:Math.round(n/16*100)/100,pixelRatio:devicePixelRatio||1,safeArea:this.safeArea(),keyboard:this.keyboardHeight(),appleKeyboard:s,host:!!this.options.host,lifecycle:document.visibilityState===`hidden`?`background`:document.hasFocus()?`active`:`inactive`,screenColor:typeof window.EyeDropper==`function`}}environmentChanged(){if(!this.reported)return;this.updateRootClasses();let e=JSON.stringify(this.environment());e!==this.reported&&(this.reported=e,this.call(()=>this.withStrings([e],(e,t)=>this.wasm.nsh_environment(e,t))))}setDark(e){this.dark=e,this.updateRootClasses(),this.call(t=>t.nsh_set_dark(+!!e))}event(e,t,n=null){this.eventJson(e,t,JSON.stringify(n))}eventJson(e,t,n){this.call(()=>this.withStrings([t,n],(t,n,r,i)=>this.wasm.nsh_event(e,t,n,r,i)))}reportPanic(e){let t=!this.trapped;this.trap(),this.showError(e,{overlay:t})}trap(){this.trapped=!0,this.deferred=[],clearTimeout(this.timer)}showError(e,{overlay:t=!this.trapped}={}){if(console.error(`[nsh]`,e),this.options.onError?.(e),this.options.overlay===!1||!t)return;let n=this.root.querySelector(`:scope > .nsh-error`);n||(n=document.createElement(`div`),n.className=`nsh-error`,n.title=`Click to dismiss`,n.addEventListener(`click`,()=>n.remove()),this.root.append(n));let r=document.createElement(`button`);r.className=`nsh-error-copy`,r.textContent=`Copy`,r.addEventListener(`click`,t=>{t.stopPropagation(),navigator.clipboard?.writeText(e).then(()=>{r.textContent=`Copied`},()=>{})}),n.replaceChildren(r,e)}asset(e){if(!e)return e;if(e.startsWith(`asset:/`)){let t=e.slice(7).replace(/^\/+/,``);return this.options.assets?.[t]??this.assetBase+t}return this.inlineImages.get(e)??e}apply(e){for(let t of e){let e=this[`op_${t[0]}`];e&&e.call(this,t)}this.endLayoutAnimation(),this.changedStacks.size&&this.reconcileStacks(),this.removals.length&&this.finishRemovals()}finishRemovals(){let e=this.removals;this.removals=[];for(let t of e){if(!t._removing)continue;t._removing=!1;let e=t.parentNode;for(;e&&e!==this.root&&!(e._leaving||e._popping||e._removedFrom||e._dying);)e=e.parentNode;e&&e!==this.root?t._leftWith=e:t.remove()}}view(e){return this.views.get(e)}op_c([,e,t]){let n;if(t===`canvas`){n=document.createElement(`div`);let e=document.createElement(`canvas`);e.className=`nsh-fill`,n.append(e),n._canvas=e,n._slots=[]}else if(t===`web`){n=document.createElement(`div`);let e=document.createElement(`iframe`);e.className=`nsh-fill`,n.append(e),n._frameEl=e,e.addEventListener(`load`,()=>this.webLoaded(n))}else if(t===`video`){n=document.createElement(`div`);let e=document.createElement(`video`);e.playsInline=!0,e.className=`nsh-fill`,n.append(e),n._video=e,this.wireVideo(n,e)}else n=document.createElement(`div`);if(n._id=e,n._kind=t,n._events=new Set,n._animation={},n._frame=null,n.className=t===`scroll`?`nsh-v nsh-scroll`:`nsh-v`,t===`image`){let e=document.createElement(`img`);e.draggable=!1,e.className=`nsh-fill nsh-fit-cover`,e.addEventListener(`load`,()=>this.imageLoaded(n,e)),e.addEventListener(`error`,()=>this.imageFailed(n)),n.append(e),n._img=e,n.classList.add(`nsh-clip`)}if(t===`scroll`){n._spacer=document.createElement(`div`),n._spacer.className=`nsh-spacer`,n.append(n._spacer),n._applied=0,n.addEventListener(`scroll`,()=>this.scrolled(n),{passive:!0}),n.addEventListener(`scrollend`,()=>this.scrollEnded(n));let e=()=>{n._smooth=null};for(let t of[`wheel`,`pointerdown`,`touchstart`,`keydown`])n.addEventListener(t,e,{passive:!0})}t===`screen`&&n.classList.add(`nsh-screen`),t===`modal`&&n.classList.add(`nsh-modal`),t===`stack`&&n.classList.add(`nsh-clip`),this.layoutAnimation?.create&&this.appearing.push(n),this.views.set(e,n)}op_i([,e,t,n]){let r=this.view(e),i=this.view(t);if(!r||!i)return;if(i._kind===`modal`){this.present(i);return}let a=n==null?null:this.view(n);if(i._kind===`header`){i._headerParent=r;return}i._dying&&this.revive(i),i._removedFrom=null,i._removing=!1,i._leftWith=null;let o=r._layer??r;o.insertBefore(i,a&&a.parentNode===o?a:null),r._kind===`stack`&&(this.changedStacks.add(r),this.stackChanged(r,i))}op_r([,e]){let t=this.view(e);if(!t)return;if(t._kind===`modal`){this.dismiss(t);return}let n=t.parentNode,r=t.contains(document.activeElement);this.detach(t,n),n?._kind===`stack`&&this.stackChanged(n),this.screenGone(t,r)}detach(e,t){e._dying||e._removedFrom||(e._kind===`screen`&&t?._kind===`stack`?(e._removedFrom=t,this.changedStacks.add(t)):this.layoutAnimation?.delete&&t&&!this.navigated(e,t)?(e._dying=!0,e.style.pointerEvents=`none`,this.disappearing.push(e)):(e._removing=!0,this.removals.push(e)))}op_d([,e]){let t=this.view(e);if(!t)return;if(this.views.delete(e),this.mouseTracked.delete(e),t._shader&&this.dropShader(t),t._video&&(clearInterval(t._progressTimer),t._video.pause(),t._video.removeAttribute(`src`),t._video.load()),t._kind===`modal`){this.dismiss(t);return}let n=t.parentNode,r=t.contains(document.activeElement);this.detach(t,n),n?._kind===`stack`&&this.stackChanged(n),this.screenGone(t,r)}screenGone(e,t){let n=e._restoreFocus;e._restoreFocus=null;let r=document.activeElement;n?.isConnected&&(t||!r||r===document.body)&&n.focus({preventScroll:!0})}op_f([,e,t,n,r,i]){let a=this.view(e);if(!a||a._kind===`modal`)return;let o=this.layoutAnimation?.update,s=o&&a._frame&&!a._track&&!this.navigated(a,a.parentNode)?this.shownFrame(a):null;a._frameAnimation?.cancel(),a._frameAnimation=null;let c=!a._frame||a._frame[2]!==r||a._frame[3]!==i;if(a._frame=[t,n,r,i],this.placeFrame(a),s&&s.some((e,t)=>e!==a._frame[t])){let e=e=>({left:`${e[0]}px`,top:`${e[1]}px`,width:`${e[2]}px`,height:`${e[3]}px`}),t=this.animateLayout(a,[e(s),e(a._frame)],o);t.onfinish=()=>{a._frameAnimation===t&&(a._frameAnimation=null)},a._frameAnimation=t}if(a._kind===`canvas`&&c&&this.drawSoon(a),a._shader&&this.shaderDirty(a),a._kind===`stack`)for(let e of a.children)e._kind===`screen`&&this.reportRoot(e,r,i,this.screenInsets(e))}placeFrame(e){if(e===this.root&&this.frameSession)return;let t=e._frame;if(!t)return;if(e._track){this.placeTrack(e);return}let n=e.style;n.left=`${t[0]}px`,n.top=`${t[1]}px`,n.width=`${t[2]}px`,n.height=`${t[3]}px`}styleClass(e){return e&&e.charCodeAt(0)===105?this.classPrefix+e:e}op_css([,e,t]){let n=e.charCodeAt(0)===105;_(n?this.classPrefix+e:e,t,n)}op_s([,e,t,n,r]){let i=this.view(e);i&&(y(i,`_class`,this.styleClass(t)),n?(i._border||=document.createElement(`div`),i._border.className=`nsh-border ${this.styleClass(n)}`,i._animation[`border-color`]&&(i._border.style.borderColor=i._animation[`border-color`]),i.append(i._border)):i._border&&=(i._border.remove(),null),i._kind===`image`&&(i._tint=r,this.applyTint(i)))}op_a([,e,t,n]){let r=this.view(e);if(r){if(t.startsWith(`canvas:`)&&r._shader)this.shaderSlot(r,Number(t.slice(7)),n);else if(t.startsWith(`canvas:`)){let e=Number(t.slice(7)),i=isNaN(Number(n))?n:Number(n);if(r._slots[e]===i)return;r._slots[e]=i,this.drawSoon(r)}else if(t===`sticky-offset`){let e=Number(n);if(r._stickyOffset===e)return;r._stickyOffset=e,r._track&&this.placeTrack(r)}else if((t===`border-color`||t===`color`?r._animation[t]:r.style.getPropertyValue(t))!==n){if(r._animation[t]=n,t===`border-color`)r._border&&(r._border.style.borderColor=n);else if(t===`color`)for(let e of r.querySelectorAll(`:scope > .nsh-run`))e.style.color=n;else r.style.setProperty(t,n)}}}op_t([,e,t,n,,,r,i,a,o,s,c,l]){let u=this.view(e);u&&(b(u,s??null),this.updateRuns(u,t,n,r,i,c,l)||this.replaceRuns(u,t,n,r,i,c,l),u.classList.toggle(`nsh-selectable`,!!a),u.classList.toggle(`nsh-autoselect`,a==null),u.classList.toggle(`nsh-noselect`,a===!1),y(u,`_selection`,this.styleClass(o)),u._textLabel=r.map(e=>e[2]).join(``),u._props?.label??u.setAttribute(`aria-label`,u._textLabel))}updateRuns(e,t,n,r,i,a,o){if(a?.length||o?.length||!r.length)return!1;let s=[];for(let t of e.children){if(t.classList.contains(`nsh-run-bg`))return!1;t.classList.contains(`nsh-run`)&&s.push(t)}if(s.length!==r.length)return!1;for(let e=0;e<r.length;e++){let[,,t,,,n]=r[e],i=s[e].firstChild;if(n||!t||!i||i.nodeType!==3||i.nextSibling)return!1}return r.forEach(([e,r,a,o,c,,l],u)=>{let d=s[u],f=this.styleClass(i[o]),p=f?`nsh-run ${f}`:`nsh-run`;d.className!==p&&(d.className=p);let m=`${t+e}px`,h=`${n+r}px`;d.style.left!==m&&(d.style.left=m),d.style.top!==h&&(d.style.top=h),d.firstChild.data!==a&&(d.firstChild.data=a),d._start=c,l?d._after=l:delete d._after}),!0}replaceRuns(e,t,n,r,i,a,o){let s=document.createDocumentFragment();for(let[e,r,i,o,c,l]of a??[]){let a=document.createElement(`div`);a.className=`nsh-run-bg`,a.style.cssText=`left:${t+e}px;top:${n+r}px;width:${i}px;height:${o}px;border-radius:${c}px;background:${l}`,s.append(a)}let c=(o??[]).map(([e,t])=>({node:e,events:new Set(t)}));for(let[a,o,l,u,d,f,p]of r){let r=document.createElement(`span`),m=this.styleClass(i[u]);r.className=m?`nsh-run ${m}`:`nsh-run`,r.style.cssText=`left:${t+a}px;top:${n+o}px`,x(r,l,f,c),r._start=d,p&&(r._after=p),e._animation.color&&(r.style.color=e._animation.color),s.append(r)}for(let t of[...e.querySelectorAll(`:scope > .nsh-run, :scope > .nsh-run-bg`)])t.remove();e.insertBefore(s,e.firstChild)}op_e([,n,r]){let i=this.view(n);i&&(i._events=new Set(r),i._events.has(`onMouseMove`)?this.mouseTracked.add(n):this.mouseTracked.delete(n),i._pressable=e.some(e=>i._events.has(e)),this.updateFocusable(i),this.updateTouchAction(i),i._kind===`scroll`&&i._events.has(`onRefresh`)&&this.installPull(i),!i._mouseEvents&&t.some(e=>i._events.has(e))&&this.installMouse(i))}installMouse(e){e._mouseEvents=!0,e.addEventListener(`pointerenter`,t=>{t.pointerType===`mouse`&&(e._hoverIn=!0,e._events.has(`onMouseEnter`)&&this.event(e._id,`onMouseEnter`,this.mouseEvent(e,t,!0)))}),e.addEventListener(`pointerleave`,t=>{e._hoverIn&&(e._hoverIn=!1,e._events.has(`onMouseLeave`)&&this.event(e._id,`onMouseLeave`,this.mouseEvent(e,t,!0)))})}mouseEvent(e,t,r=!1){let i=this.mousePoint(e,t);if(!i){if(!r)return null;let n=e.getBoundingClientRect();i=[t.clientX-n.left,t.clientY-n.top]}let[a,o]=this.point(t),s=n.find(([e])=>t.buttons&e);return{position:{x:i[0],y:i[1]},pagePosition:{x:a,y:o},modifiers:{control:!!t.ctrlKey,alt:!!t.altKey,shift:!!t.shiftKey,platform:!!t.metaKey},pressedButton:s?s[1]:null}}op_ts([,e,t]){let n=this.view(e);n&&(n._tracked=t,n._states=(n._states||0)&4,t&2&&!n._hoverListeners&&(n._hoverListeners=!0,n.addEventListener(`pointerenter`,e=>e.pointerType===`mouse`&&this.setState(n,2,!0)),n.addEventListener(`pointerleave`,()=>this.setState(n,2,!1))))}setState(e,t,n){if(!(((e._tracked||0)|4)&t))return;let r=e._states||0,i=n?r|t:r&~t;i!==r&&(e._states=i,this.call(t=>t.nsh_states(e._id,i)))}op_vp([,e,t]){let n=this.view(e);if(!n)return;n._props=t,t.testID?n.dataset.testid=t.testID:delete n.dataset.testid;let r=t.pointerEvents;n.classList.toggle(`nsh-inert`,r===`none`),n.classList.toggle(`nsh-box-none`,r===`box-none`),n.classList.toggle(`nsh-area`,!!t.selectableView),this.updateFocusable(n),this.updateTouchAction(n)}op_al([,e,t]){let n=this.view(e);n&&((n._props??={}).label=t,this.updateAria(n))}updateAria(e){let t=e._props??{},n=(t,n)=>n==null||n===!1?e.removeAttribute(t):e.setAttribute(t,String(n));n(`role`,a[t.role]??(t.role&&t.role!==`none`?t.role:e._pressable?`button`:null)),n(`aria-label`,t.label??e._textLabel),n(`aria-description`,t.hint),n(`aria-disabled`,t.disabled&&`true`),n(`aria-selected`,t.selected&&`true`),n(`aria-checked`,t.checked),n(`aria-busy`,t.busy&&`true`),n(`aria-expanded`,t.expanded),n(`aria-pressed`,t.pressed),n(`aria-current`,t.current),n(`aria-level`,t.level);let[r,i,o,s]=t.value??[];n(`aria-valuemin`,r),n(`aria-valuemax`,i),n(`aria-valuenow`,o),n(`aria-valuetext`,s),n(`aria-live`,t.live),n(`aria-hidden`,t.hidden&&`true`)}updateFocusable(e){let t=e._props,n=(t?.focusable??!!e._pressable)&&!t?.disabled&&!t?.hidden;n?e.tabIndex=0:e._a11yFocus?e.tabIndex=-1:e.hasAttribute(`tabindex`)&&e.removeAttribute(`tabindex`),!n&&!e._a11yFocus&&document.activeElement===e&&e.blur(),n&&!e._focusListeners&&(e._focusListeners=!0,e.addEventListener(`focus`,()=>{(e._focusCall||e.matches(`:focus-visible`))&&this.keyFocus(e)}),e.addEventListener(`blur`,()=>{this.setState(e,4,!1),e._keyFocus&&(e._keyFocus=!1,this.event(e._id,`onBlur`))})),this.updateAria(e)}keyFocus(e){e._keyFocus=!0,this.setState(e,4,!0),this.event(e._id,`onFocus`)}focusPressable(e){if(e.tabIndex===0){if(document.activeElement===e)e._keyFocus||this.keyFocus(e);else{e._focusCall=!0;try{e.focus({focusVisible:!0})}finally{e._focusCall=!1}}}}updateTouchAction(e){let t=e._gestures?.pan||e._events.has(`onPanStart`)||e._events.has(`onPanEnd`),n=e._gestures?.pinch||e._gestures?.rotation;e.classList.toggle(`nsh-press`,!!(e._pressable||t||n||e._events.has(`onTouch`)));let r=e._props?.panActivation,i=r&&r[0]!=null&&r[1]==null,a=r&&r[1]!=null&&r[0]==null;e.classList.toggle(`nsh-pan`,!!(n||t&&!i&&!a)),e.classList.toggle(`nsh-pan-x`,!n&&!!i),e.classList.toggle(`nsh-pan-y`,!n&&!!a)}op_la([,e,t,n]){this.layoutAnimation=this.reduceMotion()?null:{create:e,update:t,delete:n}}navigated(e,t){return o.has(e._kind)||t?._kind===`stack`}shownFrame(e){if(!e._frameAnimation)return e._frame;let t=getComputedStyle(e);return[t.left,t.top,t.width,t.height].map(e=>parseFloat(e)||0)}animateLayout(e,t,n,r=`backwards`){let i={duration:n.duration,delay:n.delay,easing:n.easing,fill:r};try{return e.animate(t,i)}catch{return e.animate(t,{...i,easing:`ease-out`})}}endLayoutAnimation(){let e=this.layoutAnimation;this.layoutAnimation=null;let t=this.appearing,n=this.disappearing;if(t.length&&(this.appearing=[]),n.length&&(this.disappearing=[]),e?.create)for(let n of t)n.parentNode&&!n._dying&&!this.navigated(n,n.parentNode)&&this.appear(n,e.create);for(let t of n){let n=t.parentNode;for(;n&&n!==this.root&&!n._dying;)n=n.parentNode;n?._dying?(t._dying=!1,t._leftWith=n):this.disappear(t,e.delete)}}appear(e,t){this.animateLayout(e,t.property===`scale`?{transform:[`scale(0.01)`,`scale(1)`],composite:`add`}:[{opacity:0,offset:0}],t)}disappear(e,t){let n=getComputedStyle(e).opacity,r=this.animateLayout(e,t.property===`scale`?{transform:[`scale(1)`,`scale(0.01)`],composite:`add`}:[{opacity:n},{opacity:0}],t,`both`);e._dying=r,r.onfinish=()=>{e._dying===r&&(e._dying=!1,r.cancel(),e.style.pointerEvents=``,e.remove(),this.dropLeftWith(e))}}revive(e){e._dying instanceof Animation&&e._dying.cancel(),e._dying=!1,e.style.pointerEvents=``,this.dropLeftWith(e)}dropLeftWith(e){for(let t of e.querySelectorAll(`.nsh-v`))t._leftWith===e&&(t._leftWith=null,t.style.pointerEvents=``,t.remove())}op_dir([,e]){this.root.dir=e?`rtl`:`ltr`}op_appearance([,e]){this.appearance=e,this.root.classList.toggle(`nsh-scheme-light`,e===1),this.root.classList.toggle(`nsh-scheme-dark`,e===2),this.updateRootClasses()}get shownDark(){return this.appearance?this.appearance===2:this.dark}op_img([,e,t,n,r,i,a,o]){let s=this.view(e);if(!s?._img)return;let c=s._img;s._fit=n,s._position=o||``,s._imgClass=`nsh-fill nsh-fit-${n}${i>0?` ${v(`filter:blur(${i}px);`)}`:``}${o?` ${v(`object-position:${o};`)}`:``}`,c.className=s._imgClass+(c.classList.contains(`nsh-hidden`)?` nsh-hidden`:``),s._fade=a;let l=r?this.asset(r):``;l&&!s._ph&&(s._ph=document.createElement(`img`),s._ph.draggable=!1,s.insertBefore(s._ph,c)),s._ph&&(s._ph.className=s._imgClass+(s._ph.classList.contains(`nsh-hidden`)?` nsh-hidden`:``),l?s._ph.getAttribute(`src`)!==l&&(s._ph.src=l):(s._ph.remove(),s._ph=null));let u=this.asset(t??``);s._src!==u&&(s._src=u,s._failed=!1,s._ph&&s._ph.classList.remove(`nsh-hidden`),u?(queueMicrotask(()=>s._events.has(`onLoadStart`)&&this.event(e,`onLoadStart`)),c.style.transition=``,c.style.opacity=a>0?`0`:``,c.src=u,c.complete&&(c.style.opacity=``),this.applyTint(s)):c.removeAttribute(`src`))}applyTint(e){if(e._img){if(e._tint&&e._src){e._img.classList.add(`nsh-hidden`);let t=e._fit,n=t===`fill`?`100% 100%`:t===`scale-down`?`contain`:t===`none`?`auto`:t||`cover`,r=`url(${JSON.stringify(e._src)}) ${e._position||`center`} / ${n} no-repeat`;y(e,`_tintClass`,v(`background-color:${e._tint};-webkit-mask:${r};mask:${r};`,3))}else e._img.classList.toggle(`nsh-hidden`,!!e._failed),y(e,`_tintClass`,null)}}imageLoaded(e,t){if(e._fade>0&&(t.style.transition=`opacity ${e._fade}ms linear`,t.style.opacity=``),e._ph){let t=e._ph;clearTimeout(e._phTimer),e._phTimer=setTimeout(()=>{e._ph===t&&t.classList.add(`nsh-hidden`)},e._fade>0?e._fade:0)}e._events.has(`onLoad`)&&this.event(e._id,`onLoad`,{width:t.naturalWidth,height:t.naturalHeight}),e._events.has(`onLoadEnd`)&&this.event(e._id,`onLoadEnd`)}imageFailed(e){e._failed=!0,e._img.classList.add(`nsh-hidden`),e._events.has(`onError`)&&this.event(e._id,`onError`,{message:`failed to load ${e._src}`}),e._events.has(`onLoadEnd`)&&this.event(e._id,`onLoadEnd`)}op_sh([,e,t]){let n=this.view(e);if(!n)return;if(!t){this.dropShader(n);return}let r=n._shader;r&&r.layer.role!==t.role&&this.dropShader(n);let i=n._shader,a=new Uint32Array(t.words),o=i&&i.layer.key===t.key&&JSON.stringify(i.layer.slots)===JSON.stringify(t.slots);if(o)for(let[e,n]of t.slots){let t=n===3?3:n===4?4:1;for(let n=0;n<t;n++)e+n<a.length&&(a[e+n]=i.words[e+n])}let s=performance.now();n._shader={layer:t,words:a,kept:i?i.kept+(i.since==null?0:s-i.since):0,since:t.paused?null:s,dirty:!0,progress:o&&i.moved?i.progress:t.progress,moved:o&&i.moved,running:i?.running??null,pictures:i?.pictures??[null,null,null,null],fresh:i?.fresh??[!1,!1,!1,!1],textures:i?.textures??[null,null,null,null],stale:0},n._shader.reads=t.pictures.reduce((e,[,t])=>e|1<<t,0);let c=t.role,l=c>=3?this.root:n,u=this.shaderDraws(t);if(c===3&&u?this.screenShader=n:this.screenShader===n&&(this.screenShader=null),!n._shaderCanvas){let e=document.createElement(`canvas`);e.className=c===0?`nsh-fill nsh-shader`:`nsh-fill nsh-fx-out`,e._shaderOutput=!0,c===0?n.insertBefore(e,n.firstChild):l.append(e),n._shaderCanvas=e,n._shaderVisible=!0,typeof IntersectionObserver<`u`&&c<3&&(n._shaderObserver=new IntersectionObserver(e=>{n._shaderVisible=e[e.length-1].isIntersecting,n._shaderVisible&&this.shaderDirty(n)}),n._shaderObserver.observe(n))}u?(c===1||c===3)&&l.classList.add(`nsh-fx`):this.endTransition(n),this.shaderViews.add(n),this.watchInputs(n),this.shaderDirty(n)}shaderHost(e){return e._shader&&e._shader.layer.role>=3?this.root:e}dropShader(e){let t=e._shader;if(!t)return;let n=this.shaderHost(e);this.screenShader===e&&(this.screenShader=null),(n!==this.root||!this.screenShader)&&n.classList.remove(`nsh-fx`),e._shaderCanvas?.remove(),e._shaderCanvas=null,e._shaderObserver?.disconnect(),e._shaderObserver=null,e._contentObserver?.disconnect(),e._contentObserver=null,e._contentMark&&=(n.removeEventListener(`scroll`,e._contentMark,!0),n.removeEventListener(`load`,e._contentMark,!0),null),this.freeTextures(t),e._shader=null,this.shaderViews.delete(e),this.backdrops?.delete(e),this.watchBackdrops()}op_shi([,e]){let t=this.view(e),n=t?._shader;n&&(n.stale|=n.reads,this.shaderDirty(t))}op_sht([,e,t]){let n=this.view(e),r=n?._shader;if(!r||r.layer.role!==2&&r.layer.role!==4||r.failed||!this.shaderDraws(r.layer))return;let i=this.shaderHost(n),a=this.shaderBox(n);if(!a)return;let o=this.pictureCanvas(n,2,a);r.running&&n._shaderCanvas.width?(o.cx.setTransform(1,0,0,1,0,0),o.cx.drawImage(n._shaderCanvas,0,0,o.canvas.width,o.canvas.height)):this.paintHost(o.cx,i,i.getBoundingClientRect(),null,i),r.fresh[2]=!0,r.running={start:performance.now(),ms:Math.max(1,t),reverse:!1},r.pictures[3]=null,r.fresh[3]=!0,r.stale|=8,i.classList.add(`nsh-fx`),this.renderShader(n,performance.now())?this.shaderDirty(n):this.shaderFailed(n)}op_shn([,e,t,n]){let r=this.view(e);r&&(r._navShader=t?{layer:t,ms:n}:null)}shaderNav(e,t,n,r,i){if(this.endNavShader(e),this.reduceMotion())return!1;let a=e.getBoundingClientRect();if(!a.width||!a.height||!this.shaderDraws(n.layer))return!1;let o=document.createElement(`div`);o.className=`nsh-nav-shader`,Object.assign(o.style,{position:`absolute`,left:`0`,top:`0`,width:`${a.width}px`,height:`${a.height}px`,zIndex:`2147483001`,pointerEvents:`none`});let s=document.createElement(`canvas`);s.className=`nsh-fill`,s._shaderOutput=!0,o.append(s);let c={...n.layer,role:2,overflow:0};o._frame=[0,0,a.width,a.height],o._shaderCanvas=s,o._shaderVisible=!0,o._shader={layer:c,words:new Uint32Array(c.words),kept:0,since:performance.now(),dirty:!0,progress:+!!r,running:{start:performance.now(),ms:Math.max(1,n.ms),reverse:r,done:()=>{o.remove(),e._navOverlay===o&&(e._navOverlay=null),i?.()}},pictures:[null,null,null,null],fresh:[!1,!1,!0,!0],textures:[null,null,null,null],stale:0,reads:0,nav:!0};let l=this.pictureCanvas(o,2,[a.width,a.height,0]);this.paintHost(l.cx,e,a,t,null);let u=this.pictureCanvas(o,3,[a.width,a.height,0]);return this.paintHost(u.cx,e,a,null,null),e.append(o),this.renderShader(o,performance.now())?(e._navOverlay=o,this.shaderViews.add(o),this.shaderDirty(o),!0):(o.remove(),this.freeTextures(o._shader),!1)}endNavShader(e){let t=e?._navOverlay;t?._shader?.running&&this.endTransition(t)}paintHost(e,t,n,r,i){this.watchPaint(),this.touchAll(this._paintObserver.takeRecords());let a=0;for(let e=t;e;e=e.parentElement)a=Math.max(a,e._touched??0);let o=t.classList.contains(`nsh-fx`);o&&(t.classList.add(`nsh-painting`),t.classList.remove(`nsh-fx`));try{this.paintTree(e,t,n,1,r,i,a)}finally{o&&(t.classList.add(`nsh-fx`),t.classList.remove(`nsh-painting`)),this._paintObserver.takeRecords()}}watchPaint(){this._paintObserver||(this.paintGen=0,this.paintReset=0,this._paintObserver=new MutationObserver(e=>this.touchAll(e)),this._paintObserver.observe(this.root,{subtree:!0,childList:!0,attributes:!0}),this._paintScheme=()=>{this.paintReset=++this.paintGen},globalThis.matchMedia?.(`(prefers-color-scheme: dark)`).addEventListener?.(`change`,this._paintScheme))}touchAll(e){for(let t of e)t.type!==`characterData`&&(t.target._touched=++this.paintGen)}paintStyle(e,t){let n=e._paintStyle;if(n&&n.stamp>=t&&n.stamp>=this.paintReset)return n;let r=getComputedStyle(e),i=r.backgroundColor,a=parseFloat(r.borderTopWidth)||0,o={stamp:this.paintGen,shown:r.display!==`none`,opacity:Number(r.opacity),hidden:r.visibility===`hidden`,radii:[r.borderTopLeftRadius,r.borderTopRightRadius,r.borderBottomRightRadius,r.borderBottomLeftRadius].map(e=>parseFloat(e)||0),background:i&&i!==`transparent`&&!/rgba\([^)]*,\s*0\)$/.test(i)?i:null,border:a>0&&r.borderTopStyle!==`none`&&r.borderTopStyle!==`hidden`?[a,r.borderTopColor]:null,clips:r.overflowX!==`visible`||r.overflowY!==`visible`,font:r.font,color:r.color,objectFit:r.objectFit};return e._paintStyle=o,o}shaderBox(e){let t=e._shader;return t.layer.role>=3?this.size?.[0]>0?[this.size[0],this.size[1],0]:null:e._frame?[e._frame[2],e._frame[3],Math.max(0,t.layer.overflow||0)]:null}pictureCanvas(e,t,[n,r,i]){let a=e._shader,o=devicePixelRatio||1,s=a.pictures[t]??=document.createElement(`canvas`),c=Math.max(1,Math.round((n+2*i)*o)),l=Math.max(1,Math.round((r+2*i)*o)),u=s.getContext(`2d`);return s.width!==c||s.height!==l?(s.width=c,s.height=l):(u.setTransform(1,0,0,1,0,0),u.clearRect(0,0,c,l)),u.setTransform(o,0,0,o,i*o,i*o),a.fresh[t]=!0,{canvas:s,cx:u}}watchInputs(e){let t=e._shader,n=t.layer.role,r=this.shaderHost(e),i=n!==0&&t.reads&(n===2||n===4?8:1),a=t.reads&2;if(i&&!e._contentObserver){let t=t=>{(!t||this.shownChange(t))&&e._shader&&(e._shader.stale|=e._shader.reads&9,this.shaderDirty(e))};e._contentObserver=new MutationObserver(t),e._contentObserver.observe(r,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,characterData:!0}),e._contentMark=()=>t(),r.addEventListener(`scroll`,e._contentMark,!0),r.addEventListener(`load`,e._contentMark,!0)}this.backdrops??=new Set,a?this.backdrops.add(e):this.backdrops.delete(e),this.watchBackdrops(),t.stale|=t.reads}shownChange(e){let t=e=>(e??``).split(` `).filter(e=>e&&e!==`nsh-fx`&&e!==`nsh-painting`).join(` `);return e.some(e=>!(e.target._shaderOutput||e.target.parentElement?._shaderOutput||e.type===`attributes`&&e.attributeName===`class`&&t(e.oldValue)===t(e.target.getAttribute(`class`))))}watchBackdrops(){let e=this.backdrops??new Set;for(let t of e)t._shader||e.delete(t);let t=e.size>0;if(t&&!this._backdropObserver){let e=e=>{if(!e||this.shownChange(e))for(let e of this.backdrops)e._shader&&(e._shader.stale|=2,this.shaderDirty(e))};this._backdropObserver=new MutationObserver(e),this._backdropObserver.observe(this.root,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,characterData:!0}),this._backdropMark=()=>e(),this.root.addEventListener(`scroll`,this._backdropMark,!0),this.root.addEventListener(`load`,this._backdropMark,!0)}else!t&&this._backdropObserver&&(this._backdropObserver.disconnect(),this.root.removeEventListener(`scroll`,this._backdropMark,!0),this.root.removeEventListener(`load`,this._backdropMark,!0),this._backdropObserver=this._backdropMark=null)}paintInputs(e){let t=e._shader,n=t.stale;t.stale=0;let r=t.layer.role,i=this.shaderBox(e);if(!n||!i||t.nav)return;let a=r===2||r===4,o=this.shaderHost(e),s=o.getBoundingClientRect();if(a?t.running&&n&8:r!==0&&n&1){let{cx:t}=this.pictureCanvas(e,a?3:0,i);this.paintHost(t,o,s,null,o)}if(n&2){let{cx:t}=this.pictureCanvas(e,1,i);this.paintHost(t,this.root,e.getBoundingClientRect(),e,this.root)}}paintTree(e,t,n,r,i,a,o=1/0){for(let s of t.children){if(s===i)return!0;if(s._shaderOutput&&(s.parentElement===a||s.classList.contains(`nsh-fx-out`)&&!s.parentElement.classList.contains(`nsh-fx`))||s.classList.contains(`nsh-nav-shader`))continue;let t=Math.max(o,s._touched??0),c=this.paintStyle(s,t);if(!c.shown)continue;let l=r*c.opacity;if(l<=0||c.hidden){if(i&&s.contains(i))return!0;continue}let u=s.getBoundingClientRect(),d=u.left-n.left,f=u.top-n.top,p=u.width,m=u.height,h=c.radii.map(e=>Math.min(e,p/2,m/2)),g=()=>{e.beginPath(),e.roundRect(d,f,p,m,h)};if(e.save(),e.globalAlpha=l,c.background&&(e.fillStyle=c.background,g(),e.fill()),c.border){let[t,n]=c.border;e.strokeStyle=n,e.lineWidth=t,e.beginPath(),e.roundRect(d+t/2,f+t/2,Math.max(0,p-t),Math.max(0,m-t),h.map(e=>Math.max(0,e-t/2))),e.stroke()}if(s.tagName===`IMG`)s.complete&&s.naturalWidth&&this.paintable(s)&&this.paintImage(e,s,c,d,f,p,m,h);else if(s.tagName===`CANVAS`)s.width&&s.height&&!s._tainted&&(e.save(),g(),e.clip(),e.drawImage(s,d,f,p,m),e.restore());else if(s.classList.contains(`nsh-run`)){e.font=c.font,e.fillStyle=c.color,e.textBaseline=`alphabetic`;let t=s.textContent,n=e.measureText(t);e.fillText(t,d,f+(n.fontBoundingBoxAscent??n.actualBoundingBoxAscent))}c.clips&&(g(),e.clip());let _=this.paintTree(e,s,n,l,i,a,t);if(e.restore(),_)return!0}return!1}paintable(e){let t=e.currentSrc||e.src;if(t.startsWith(`data:`))return!0;try{return new URL(t,location.href).origin===location.origin||e.crossOrigin!=null}catch{return!1}}paintImage(e,t,n,r,i,a,o,s){let c=t.naturalWidth,l=t.naturalHeight,u=a,d=o,f=n.objectFit;if(f===`contain`||f===`cover`||f===`scale-down`){let e=f===`cover`?Math.max(a/c,o/l):Math.min(a/c,o/l,f===`scale-down`?1:1/0);u=c*e,d=l*e}else f===`none`&&(u=c,d=l);e.save(),e.beginPath(),e.roundRect(r,i,a,o,s),e.clip(),e.drawImage(t,r+(a-u)/2,i+(o-d)/2,u,d),e.restore()}shaderSlot(e,t,n){let r=e._shader;if(t===r.layer.progressSlot){r.progress=Number(n),r.moved=!0,this.shaderDirty(e);return}let i=r.layer.slots[t];if(!i)return;let[a,o]=i;r.f32?.buffer!==r.words.buffer&&(r.f32=new Float32Array(r.words.buffer));let s=r.f32;if(o>=3){let e=I(n);for(let t=0;t<(o===3?3:4);t++)s[a+t]=e[t]}else o===0?s[a]=Number(n):r.words[a]=o===1?Math.trunc(Number(n))|0:Math.max(0,Math.trunc(Number(n)))>>>0;this.shaderDirty(e)}shaderDirty(e){e._shader&&(e._shader.dirty=!0),!this.shaderFrameQueued&&(this.shaderFrameQueued=!0,requestAnimationFrame(e=>this.shaderFrame(e)))}shaderFrame(e){this.shaderFrameQueued=!1;let t=this._shaderGl;t&&t.isContextLost()!==!!this._shaderLost&&(this._shaderLost?this.shaderRestored():this.shaderLost());let n=!1,r=performance.now();for(let e of[...this.shaderViews]){let t=e._shader;if(!t){this.shaderViews.delete(e);continue}if(t.layer.role>=3&&!t.nav&&this.screenShown(e),!e.isConnected){(t.nav||t.running)&&this.endTransition(e);continue}if(t.running&&r-t.running.start>=t.running.ms){this.endTransition(e);continue}let i=t.layer.animated&&t.since!=null||!!t.running;e._shaderVisible&&(t.dirty||i||t.stale)&&(t.dirty=!1,!t.failed&&this.shaderDraws(t.layer)&&(t.stale&&this.paintInputs(e),this.renderShader(e,r)?n||=i:this.shaderFailed(e)))}n&&(this.shaderFrameQueued=!0,requestAnimationFrame(e=>this.shaderFrame(e)))}screenShown(e){let t=e.isConnected,n=e._shaderCanvas;n&&n.hidden!==!t&&(n.hidden=!t,e._shader.layer.role===3&&(t&&!e._shader.failed&&this.shaderDraws(e._shader.layer)?this.screenShader=e:this.screenShader===e&&(this.screenShader=null),this.root.classList.toggle(`nsh-fx`,!!this.screenShader)))}shaderFailed(e){e._shader.failed=!0,this.screenShader===e&&(this.screenShader=null),this.endTransition(e)}endTransition(e){let t=e._shader,n=t.running;if(t.running=null,t.nav){this.freeTextures(t),this.shaderViews.delete(e),n?.done?.();return}let r=this.shaderHost(e);(r!==this.root||!this.screenShader)&&r.classList.remove(`nsh-fx`),t.pictures[2]=t.pictures[3]=null,this.freeTextures(t,[2,3]);let i=e._shaderCanvas;i._bitmap?.transferFromImageBitmap(null),i.width=0}freeTextures(e,t=[0,1,2,3]){let n=this._shaderGl;for(let r of t){let t=e.textures[r];t&&n&&n.deleteTexture(t),e.textures[r]=null}}shaderGl(){if(this._shaderGl!==void 0)return this._shaderGl;let e=typeof OffscreenCanvas<`u`?new OffscreenCanvas(1,1):document.createElement(`canvas`),t=e.getContext(`webgl2`,{premultipliedAlpha:!0,antialias:!1,preserveDrawingBuffer:!1});return t?(e.addEventListener(`webglcontextlost`,e=>{e.preventDefault(),this.shaderLost()}),e.addEventListener(`webglcontextrestored`,()=>this.shaderRestored())):console.warn(`[nsh] shaders: no WebGL 2; shader views draw nothing`),this._shaderGl=t,this._shaderPrograms=new Map,t}shaderDraws(e){let t=this.shaderGl();return!!(t&&!t.isContextLost()&&this.shaderProgram(t,e))}shaderLost(){if(!this._shaderLost){this._shaderLost=!0,console.warn(`[nsh] shaders: the WebGL context was lost; shader views show their children until it is back`),this._shaderPrograms=new Map,this._emptyTexture=null,this.screenShader=null,this.root.classList.remove(`nsh-fx`);for(let e of[...this.shaderViews]){let t=e._shader;t&&(t.textures=[null,null,null,null],this.endTransition(e))}}}shaderRestored(){if(this._shaderLost){this._shaderLost=!1,this._shaderPrograms=new Map,this._emptyTexture=null;for(let e of this.shaderViews){let t=e._shader;if(!t)continue;t.textures=[null,null,null,null],t.stale|=t.reads;let n=t.layer.role;(n===1||n===3)&&!t.failed&&e.isConnected&&this.shaderDraws(t.layer)&&(n===3&&(this.screenShader=e),this.shaderHost(e).classList.add(`nsh-fx`)),this.shaderDirty(e)}}}shaderProgram(e,t){let n=this._shaderPrograms.get(t.key);if(n!==void 0)return n;let r=(t,n)=>{let r=e.createShader(t);return e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(console.warn(`[nsh] shader:`,e.getShaderInfoLog(r)),null)},i=null,a=r(e.VERTEX_SHADER,t.vs),o=a&&r(e.FRAGMENT_SHADER,t.fs);o&&(i=e.createProgram(),e.attachShader(i,a),e.attachShader(i,o),e.linkProgram(i),e.getProgramParameter(i,e.LINK_STATUS)||(console.warn(`[nsh] shader:`,e.getProgramInfoLog(i)),i=null));let s=null;if(i){let n=(t,n)=>{if(!t)return null;let r=e.getUniformBlockIndex(i,t);return r===e.INVALID_INDEX?null:(e.uniformBlockBinding(i,r,n),e.createBuffer())},r=(t.pictures??[]).map(([t,n])=>[e.getUniformLocation(i,t),n]);s={program:i,builtins:n(t.nsh,0),uniforms:n(t.u,1),samplers:r,vao:e.createVertexArray()}}return this._shaderPrograms.set(t.key,s),s}shaderTexture(e,t,n){let r=t.pictures[n];if(!r)return this._emptyTexture||(this._emptyTexture=e.createTexture(),e.bindTexture(e.TEXTURE_2D,this._emptyTexture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,1,1,0,e.RGBA,e.UNSIGNED_BYTE,new Uint8Array(4))),this._emptyTexture;let i=t.textures[n];if(i||(i=t.textures[n]=e.createTexture(),t.fresh[n]=!0),e.bindTexture(e.TEXTURE_2D,i),t.fresh[n]){t.fresh[n]=!1,e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0);try{e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,r)}finally{e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1)}for(let[t,n]of[[e.TEXTURE_MIN_FILTER,e.LINEAR],[e.TEXTURE_MAG_FILTER,e.LINEAR],[e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE],[e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE]])e.texParameteri(e.TEXTURE_2D,t,n)}return i}renderShader(e,t){try{return this.drawShader(e,t),!0}catch(e){return console.warn(`[nsh] shader:`,e),!1}}drawShader(e,t){let n=e._shader,r=this.shaderGl();if(!r)return;let i=this.shaderBox(e);if(!i)return;let a=this.shaderProgram(r,n.layer);if(!a)return;let o=n.layer.role;if((o===2||o===4)&&!n.running)return;let[s,c,l]=i,u=(devicePixelRatio||1)*Math.min(4,this.zoomOf(e));u=Math.min(u,4096/Math.max(s+2*l,c+2*l,1));let d=Math.max(1,Math.round((s+2*l)*u)),f=Math.max(1,Math.round((c+2*l)*u)),p=r.canvas;(p.width!==d||p.height!==f)&&(p.width=d,p.height=f);let m=(n.kept+(n.since==null?0:t-n.since))/1e3,h=n.progress;if(n.running){let e=Math.min(1,Math.max(0,(t-n.running.start)/n.running.ms));h=n.running.reverse?1-e:e}if(r.viewport(0,0,d,f),r.useProgram(a.program),r.bindVertexArray(a.vao),a.builtins){r.bindBuffer(r.UNIFORM_BUFFER,a.builtins);let e=n.builtins??=new Float32Array(8);e.set([s,c,Math.max(0,m),d/Math.max(s+2*l,1e-6),h,l,0,0]),r.bufferData(r.UNIFORM_BUFFER,e,r.DYNAMIC_DRAW),r.bindBufferBase(r.UNIFORM_BUFFER,0,a.builtins)}a.uniforms&&(r.bindBuffer(r.UNIFORM_BUFFER,a.uniforms),r.bufferData(r.UNIFORM_BUFFER,n.words,r.DYNAMIC_DRAW),r.bindBufferBase(r.UNIFORM_BUFFER,1,a.uniforms)),a.samplers.forEach(([e,t],i)=>{r.activeTexture(r.TEXTURE0+i),r.bindTexture(r.TEXTURE_2D,this.shaderTexture(r,n,t)),r.uniform1i(e,i)}),r.disable(r.BLEND),r.clearColor(0,0,0,0),r.clear(r.COLOR_BUFFER_BIT),r.drawArrays(r.TRIANGLES,0,3);let g=e._shaderCanvas;if((g.width!==d||g.height!==f)&&(g.width=d,g.height=f),o!==0&&o<3){let e=g.style,t=`${-l}px`;(e.left!==t||e.width!==`${s+2*l}px`||e.height!==`${c+2*l}px`)&&([e.left,e.top,e.width,e.height]=[t,t,`${s+2*l}px`,`${c+2*l}px`])}p.transferToImageBitmap?(g._bitmap??=g.getContext(`bitmaprenderer`),g._bitmap.transferFromImageBitmap(p.transferToImageBitmap())):(g._2d??=g.getContext(`2d`),g._2d.clearRect(0,0,d,f),g._2d.drawImage(p,0,0));let _=this.screenShader;_&&_!==e&&_._shader&&o!==3&&!n.nav&&(_._shader.stale|=1,_._shader.dirty||this.shaderDirty(_))}op_sc([,e,t,n,,r]){let i=this.view(e);i&&(i._horizontal=t,i._indicator=n,i._replaced=r,this.scrollOverflow(i),i.classList.toggle(`nsh-noindicator`,!n),i._bar&&!this.barShown(i)&&this.showBar(i))}op_scs([,e,t,n]){let r=this.view(e);if(r?._spacer){r._content=[t,n],this.placeLayer(r),this.snapMarkers(r);for(let e of r._tracks?.values()??[])this.placeTrack(e)}}op_sb([,e,t,n]){let r=this.view(e);if(!r)return;if(r._applied++,r._smooth){r._smooth=[r._smooth[0]+t,r._smooth[1]+n],r.scrollTo({left:r._smooth[0],top:r._smooth[1],behavior:`smooth`});return}let i=r._glide;i&&(i.x+=t,i.y+=n,i.at&&=[i.at[0]+t,i.at[1]+n]),r.scrollLeft+=t,r.scrollTop+=n}op_sbh([,e,t]){let n=this.view(e);if(!n)return;let r=n._behavior?.refreshIndicator?.height!==t.refreshIndicator?.height;n._behavior=t,r&&n._refreshing&&!n._pulling&&n._pull>0&&this.animatePull(n,this.refreshSpace(n)),r&&this.updateSpinner(n),this.zooms(n)&&(this.ensureLayer(n),n._zoom=Math.min(Math.max(n._zoom,t.minZoom),t.maxZoom),this.placeLayer(n)),this.scrollOverflow(n),this.snapMarkers(n)}scrollOverflow(e){let t=e._behavior?.enabled===!1?`hidden`:`auto`,n=this.zooms(e);y(e,`_overflow`,t===`hidden`?`nsh-onone`:n?`nsh-oxy`:e._horizontal?`nsh-ox`:`nsh-oy`),e.classList.toggle(`nsh-zoom`,n)}snapMarkers(e){let t=e._behavior;for(let t of e._markers??[])t.remove();if(e._markers=[],e._snapPoints=null,e.classList.remove(`nsh-snap-x`,`nsh-snap-y`),!t||!e._content||!e._frame)return;let n=+!e._horizontal,r=e._frame[2+n],i=Math.max(0,e._content[n]-r),a=[];if(t.snapInterval>0){let e=t.snapInterval,n=t.snapAlignment===`center`?(r-e)/2:t.snapAlignment===`end`?r-e:0,o=Math.max(0,Math.ceil((i+n)/e));for(let t=0;t<=o;t++)a.push(Math.min(i,Math.max(0,t*e-n)))}else if(t.snapOffsets.length)a=t.snapOffsets.map(e=>Math.min(i,Math.max(0,e)));else if(t.paging&&r>0)for(let e=0;e<=Math.ceil(i/r);e++)a.push(Math.min(i,e*r));if(a.length){e._snapPoints=[...a].sort((e,t)=>e-t),e.classList.add(e._horizontal?`nsh-snap-x`:`nsh-snap-y`);for(let n of a){let r=document.createElement(`div`);r.className=t.paging||t.snapInterval>0?`nsh-snap nsh-snap-stop`:`nsh-snap`,r.style.cssText=e._horizontal?`left:${n}px`:`top:${n}px`,e.append(r),e._markers.push(r)}}}op_sticky([,e,t]){let n=this.view(e);if(!n)return;let r=n._tracks??=new Map,i=new Map(t.map(([e,t,n])=>[e,[t,n]]));n.classList.toggle(`nsh-sticky`,i.size>0);for(let[e,t]of r)i.has(e)&&this.view(e)===t||(r.delete(e),this.unstick(t));for(let[e,t]of i){let i=this.view(e);if(i){if(!i._track){i._frameAnimation?.cancel(),i._frameAnimation=null;let t=document.createElement(`div`);t.className=`nsh-track`,t._list=n;let a=n._layer??n,o=i.parentNode??a;t._page=o!==a,t._page&&o.classList.add(`nsh-sticky`),o.insertBefore(t,i.parentNode===o?i:null),t.append(i),i._track=t,r.set(e,i)}i._range=t,i._stickyOffset=void 0,this.placeTrack(i)}}}unstick(e){let t=e._track;e._track=null,e._range=null,e.parentNode===t?t.replaceWith(e):t.remove(),this.placeFrame(e)}trackOrigin(e,t){let n=e._list,r=0;for(let i=e.parentNode;i&&i!==n&&i!==n._layer;i=i.parentNode){let e=i._frame;e&&(r+=t?e[0]:e[1])}return r}placeTrack(e){let t=e._frame,n=e._range;if(!t||!n)return;let r=e._track._list,i=!!r._horizontal,[a,o]=i?[t[0],t[2]]:[t[1],t[3]],s=e._track._page,c=s?this.trackOrigin(e._track,i):0,l=r._content?.[+!i]??0,u=s?n[1]-n[0]:Math.min(n[1]-n[0],l-a-o),d=o+Math.max(0,u),f=e._track.style;f.left=`${t[0]}px`,f.top=`${t[1]}px`,f.width=`${i?d:0}px`,f.height=`${i?0:d}px`;let p=e.style,m=`${a+c-n[0]+(e._stickyOffset??0)}px`;p.left=i?m:`auto`,p.top=i?`auto`:m,p.width=`${t[2]}px`,p.height=`${t[3]}px`}barShown(e){return this.desktopUI&&e._kind===`scroll`&&!this.zooms(e)&&e._behavior?.enabled!==!1&&!!(e._indicator||e._horizontal&&!e._replaced)}barThumb(e){let t=!!e._horizontal,n=t?e.clientWidth:e.clientHeight,r=t?e.scrollWidth:e.scrollHeight;if(r<=n+.5||n<=8)return null;let i=n-4,a=Math.min(i,Math.max(32,i*n/r)),o=r-n;return[2+Math.min(Math.max((t?e.scrollLeft:e.scrollTop)/o,0),1)*(i-a),a,i-a,o]}showBar(e){let t=this.barShown(e)?this.barThumb(e):null;if(!t){e._bar&&(e._bar.firstChild.style.opacity=`0`);return}e._bar||(e._bar=document.createElement(`div`),e._bar.className=`nsh-bar`,e._bar.append(document.createElement(`div`)),e.insertBefore(e._bar,e.firstChild));let[n,r]=t,i=(e._horizontal?e.clientHeight:e.clientWidth)-4-2;e._bar.firstChild.style.cssText=e._horizontal?`left:${n}px;top:${i}px;width:${r}px;height:4px`:`left:${i}px;top:${n}px;width:4px;height:${r}px`,clearTimeout(e._barTimer),e._barHeld||(e._barTimer=setTimeout(()=>e._bar&&(e._bar.firstChild.style.opacity=`0`),700))}barHit(e,t){if(!this.barShown(e))return!1;let n=this.barThumb(e);if(!n)return!1;let r=e.getBoundingClientRect(),[i,a]=[t.clientX-r.left,t.clientY-r.top],[o,s,c]=e._horizontal?[i,a,e.clientHeight]:[a,i,e.clientWidth];return s>=c-12&&s<=c&&o>=n[0]-4&&o<=n[0]+n[1]+4}hoverBar(e,t){this.barHit(e,t)&&this.showBar(e)}grabBar(e){let t=this.viewOf(e.target);if(!t)return!1;for(let n of this.ancestors(t)){if(!this.barHit(n,e))continue;let t=!!n._horizontal;return e.preventDefault(),n._barHeld=!0,n.style.scrollSnapType=`none`,this.drive(n,1),this.scrollEvent(n,`onScrollDragStart`),this.pointers.set(e.pointerId,{mode:`bar`,scroll:n,start:t?e.clientX:e.clientY,offset:t?n.scrollLeft:n.scrollTop,touchPath:[],states:[]}),this.showBar(n),!0}return!1}dragBar(e,t){let n=e.scroll,r=this.barThumb(n);if(!r||r[2]<=0)return;let i=((n._horizontal?t.clientX:t.clientY)-e.start)*(r[3]/r[2]);n._horizontal?n.scrollLeft=e.offset+i:n.scrollTop=e.offset+i}releaseBar(e){e._barHeld=!1,this.scrollEvent(e,`onScrollDragEnd`),this.drive(e,-1),e._restoreSnap=!0,(!e._snapPoints||!this.snapTo(e,this.snapPoint(e,0)))&&(e._restoreSnap=!1,e.style.scrollSnapType=``,this.ownEnd(e)),this.showBar(e)}scrolled(e){e._commandEnd&&this.waitCommandEnd(e),this.desktopUI&&this.showBar(e),e._released&&!e._momentum&&performance.now()-e._released<150&&(e._momentum=!0,this.scrollEvent(e,`onMomentumStart`)),this.call(t=>t.nsh_scroll(e._id,e.scrollLeft,e.scrollTop-(e._pull??0),e._applied))}scrollEnded(e){if(clearTimeout(e._commandEnd),e._commandEnd=0,e._smooth=null,e._driven||e._touchDrag)return;let t=e._ownEnd;e._ownEnd=null,!(t&&t[0]===e.scrollLeft&&t[1]===e.scrollTop)&&(e._released=0,e._restoreSnap&&(e._restoreSnap=!1,e.style.scrollSnapType=``),e._momentum&&(e._momentum=!1,this.scrollEvent(e,`onMomentumEnd`)),this.scrollEvent(e,`onScrollEnd`))}ensureLayer(e){if(e._layer)return e._layer;let t=document.createElement(`div`);t.className=`nsh-layer`;for(let n of[...e.children])(n._id!==void 0||n._list)&&t.append(n);return e.insertBefore(t,e._spacer.nextSibling),e._layer=t,e._zoom=1,e._pull=0,t}zooms(e){let t=e._behavior;return e._kind===`scroll`&&!!t&&t.maxZoom>t.minZoom}layerOffset(e){if(!e._behavior?.centerContent||!e._frame||!e._content)return[0,0];let t=e._zoom??1;return[Math.max(0,(e._frame[2]-e._content[0]*t)/2),Math.max(0,(e._frame[3]-e._content[1]*t)/2)]}placeLayer(e){let[t,n]=e._content??[1,1],r=e._zoom??1,i=e._pull??0;if(e._spacer.style.width=`${t*r}px`,e._spacer.style.height=`${n*r+i}px`,!e._layer)return;let[a,o]=this.layerOffset(e);e._layer.style.transform=`translate(${a}px, ${o+i}px)${r===1?``:` scale(${r})`}`}zoomOf(e){let t=1;for(let n=e.parentNode;n&&n!==this.root;n=n.parentNode)n._layer&&n._zoom&&(t*=n._zoom);return t}zoomContent(e,t,n,r,i,a){e._zoom=t,this.placeLayer(e);let[o,s]=this.layerOffset(e);e.scrollLeft=n*t+o-i,e.scrollTop=r*t+s-a,this.call(n=>n.nsh_zoom(e._id,t)),this.scrolled(e)}contentPoint(e,t,n){let[r,i]=this.layerOffset(e),a=e._zoom??1;return[(e.scrollLeft+t-r)/a,(e.scrollTop+n-i)/a]}limitZoom(e,t,n){let r=e._behavior,i=r.minZoom,a=Math.max(r.maxZoom,i);return t>a?n&&r.bouncesZoom?a*(t/a)**.3:a:t<i?n&&r.bouncesZoom?i*(t/i)**.3:i:t}animateZoom(e,t,n,r,i,a,o){cancelAnimationFrame(e._zoomAnimation);let s=e._zoom,[c,l]=this.contentPoint(e,i,a),u=performance.now(),d=f=>{let p=Math.min(1,(f-u)/250),m=1-(1-p)**3;this.zoomContent(e,s+(t-s)*m,c+(n-c)*m,l+(r-l)*m,i,a),p<1?e._zoomAnimation=requestAnimationFrame(d):o?.()};e._zoomAnimation=requestAnimationFrame(d)}zoomEnded(e,t,n){let r=()=>{for(let t of e._layer?.querySelectorAll(`canvas`)??[]){let e=this.viewOf(t);e&&this.drawSoon(e)}},i=this.limitZoom(e,e._zoom,!1);if(Math.abs(i-e._zoom)>.001){let[a,o]=this.contentPoint(e,t,n);this.animateZoom(e,i,a,o,t,n,r)}else r()}zoomCommand(e,t,n,r,i){if(!this.zooms(e)||!e._frame)return;let a=this.limitZoom(e,t,!1),o=e._frame[2]/2,s=e._frame[3]/2,[c,l]=this.contentPoint(e,o,s),u=n??c,d=r??l;i?this.animateZoom(e,a,u,d,o,s,()=>this.zoomEnded(e,o,s)):(this.zoomContent(e,a,u,d,o,s),this.zoomEnded(e,o,s))}wheelZoom(e){let t=this.ancestors(this.viewOf(e.target)).find(e=>this.zooms(e)&&e._behavior.pinch);if(!t)return!1;let n=t.getBoundingClientRect(),r=e.clientX-n.left,i=e.clientY-n.top,a=e.deltaMode===1?e.deltaY*33:e.deltaY,o=Math.abs(a)>=50?1.25**-Math.sign(a):Math.exp(-a*.01),[s,c]=this.contentPoint(t,r,i);return cancelAnimationFrame(t._zoomAnimation),this.zoomContent(t,this.limitZoom(t,t._zoom*o,!1),s,c,r,i),clearTimeout(t._wheelZoomTimer),t._wheelZoomTimer=setTimeout(()=>this.zoomEnded(t,r,i),200),!0}gestureZoom(e,t){let n=t===0?this.ancestors(this.viewOf(e.target)).find(e=>this.zooms(e)&&e._behavior.pinch):this.gesture;if(!n)return;e.preventDefault();let r=n.getBoundingClientRect(),i=(e.clientX??r.left+r.width/2)-r.left,a=(e.clientY??r.top+r.height/2)-r.top;t===0&&(this.gesture=n,n._gestureStart=n._zoom);let[o,s]=this.contentPoint(n,i,a);this.zoomContent(n,this.limitZoom(n,n._gestureStart*e.scale,!0),o,s,i,a),t===2&&(this.gesture=null,this.zoomEnded(n,i,a))}op_ref([,e,t]){let n=this.view(e);n&&n._kind===`scroll`&&!n._horizontal&&(this.ensureLayer(n),n._refreshing=t,n._pulling||(t&&n.scrollTop<=.5?this.animatePull(n,this.refreshSpace(n)):!t&&n._pull>0&&this.animatePull(n,0)),this.updateSpinner(n))}refreshThreshold(e){return e._behavior?.refreshIndicator?.height??64}refreshSpace(e){return e._behavior?.refreshIndicator?.height??56}refreshable(e){return e._kind===`scroll`&&!e._horizontal&&!this.zooms(e)&&(e._events.has(`onRefresh`)||e._refreshing)}installPull(e){if(this.ensureLayer(e),e._pullTouch)return;e._pullTouch=!0;let t=null;e.addEventListener(`touchstart`,n=>{t=n.touches.length===1&&this.refreshable(e)&&e._behavior?.enabled!==!1?{y:n.touches[0].clientY,v:e.scrollTop-e._pull,pulling:!1}:null},{passive:!0}),e.addEventListener(`touchmove`,n=>{if(!t||n.touches.length!==1)return;let r=t.v-(n.touches[0].clientY-t.y);r>=0&&e._pull<=0||(n.cancelable?(n.preventDefault(),t.pulling||(t.pulling=!0,e._pulling=!0,cancelAnimationFrame(e._pullAnimation)),this.dragPull(e,r)):t=null)},{passive:!1});let n=()=>{t?.pulling&&(e._pulling=!1,this.releasePull(e)),t=null};e.addEventListener(`touchend`,n),e.addEventListener(`touchcancel`,n)}dragPull(e,t){if(t>=0){this.setPull(e,0),e.scrollTop=t;return}e.scrollTop=0;let n=-t,r=this.refreshSpace(e);this.setPull(e,e._refreshing?Math.min(n,r)+Math.max(0,n-r)*.5:n*.5)}releasePull(e){!e._refreshing&&e._events.has(`onRefresh`)&&e._pull>=this.refreshThreshold(e)&&(e._refreshing=!0,this.event(e._id,`onRefresh`)),this.animatePull(e,e._refreshing&&e._pull>0?this.refreshSpace(e):0)}setPull(e,t){t!==e._pull&&(e._pull=t,this.placeLayer(e),this.updateSpinner(e),this.scrolled(e),this.call(n=>n.nsh_pull(e._id,t)))}animatePull(e,t){cancelAnimationFrame(e._pullAnimation);let n=e._pull??0;if(n===t)return;let r=performance.now(),i=a=>{let o=Math.min(1,(a-r)/250);this.setPull(e,n+(t-n)*(1-(1-o)**3)),o<1&&(e._pullAnimation=requestAnimationFrame(i))};e._pullAnimation=requestAnimationFrame(i)}updateSpinner(e){let t=e._pull>0&&!e._behavior?.refreshIndicator,n=e._spinner;if(!t){n?.classList.add(`nsh-gone`);return}if(!n){n=e._spinner=document.createElement(`div`),n.className=`nsh-spinner`;for(let e=0;e<8;e++)n.append(document.createElement(`i`));e.append(n)}n.classList.remove(`nsh-gone`),n.style.top=`${e._pull-this.refreshSpace(e)/2-10}px`;let r=e._refreshing?1:Math.min(1,e._pull/this.refreshThreshold(e)),i=Math.min(8,Math.ceil(r*8));[...n.children].forEach((e,t)=>e.classList.toggle(`nsh-hidden`,t>=i)),n.classList.toggle(`full`,r>=1),n.classList.toggle(`spin`,!!e._refreshing)}op_cv([,e,t]){let n=this.view(e);n&&(n._ops=t,this.drawSoon(n))}drawSoon(e){e._drawQueued||(e._drawQueued=!0,queueMicrotask(()=>{e._drawQueued=!1,this.draw(e)}))}draw(e){let t=e._canvas;if(!t||!e._frame||!e._ops)return;let n=(devicePixelRatio||1)*Math.min(4,this.zoomOf(e)),[,,r,i]=e._frame,a=Math.max(1,Math.round(r*n)),o=Math.max(1,Math.round(i*n));(t.width!==a||t.height!==o)&&(t.width=a,t.height=o);let s=t.getContext(`2d`);s.setTransform(n,0,0,n,0,0),s.clearRect(0,0,r,i),s.save();let c=e._slots,l=e=>Array.isArray(e)&&e[0]===`$`?c[e[1]]??0:e,u=e=>{if(Array.isArray(e)&&e[0]===`$`)return c[e[1]]??`transparent`;if(e&&typeof e==`object`&&e.g){let t=e.args,n=e.g===`linear`?s.createLinearGradient(t[0],t[1],t[2],t[3]):e.g===`radial`?s.createRadialGradient(t[0],t[1],t[2],t[3],t[4],t[5]):s.createConicGradient(t[0],t[1],t[2]);for(let[t,r]of e.stops)n.addColorStop(Math.min(1,Math.max(0,t)),r);return n}return e},d=e=>{let t=new Path2D;for(let[n,...r]of e)n===`roundRect`?t.roundRect(...r.slice(0,4).map(l),r[4].map(l)):t[n](...r.map(l));return t};for(let[n,...r]of e._ops)try{if(n.startsWith(`=`)){let e=n.slice(1);s[e]=e.endsWith(`Style`)?u(r[0]):l(r[0])}else if(n===`fill`||n===`clip`)r[0]?s[n](d(r[0]),r[1]):s[n](r[1]);else if(n===`stroke`)r[0]?s.stroke(d(r[0])):s.stroke();else if(n===`shadowOffset`)s.shadowOffsetX=r[0],s.shadowOffsetY=r[1];else if(n===`roundRect`)s.roundRect(...r.slice(0,4).map(l),r[4].map(l));else if(n===`drawImage`){let n=this.canvasImage(r[0],e);if(!n)continue;this.paintable(n)||(t._tainted=!0);let i=r.slice(2).map(l);r[1]?s.drawImage(n,...r[1],...i):s.drawImage(n,...i)}else n===`fillText`||n===`strokeText`?s[n](r[0],...r.slice(1).map(l)):n===`setLineDash`?s.setLineDash(r[0]):typeof s[n]==`function`&&s[n](...r.map(l))}catch(e){console.warn(`[nsh] canvas`,n,e)}s.restore()}canvasImage(e,t){let n=this.asset(e),r=this.images.get(n);if(!r){let e=new Image;r={img:e,ready:!1,waiting:new Set},e.onload=()=>{r.ready=!0;for(let e of r.waiting)this.drawSoon(e)},e.src=n,this.images.set(n,r)}return r.ready||r.waiting.add(t),r.ready?r.img:null}op_g([,e,t,n,r]){let i=this.view(e);i&&(i._gestures={pan:t,pinch:n,rotation:r},this.updateTouchAction(i))}op_in([,e,t,n]){let r=this.view(e);if(!r)return;let i=r._field,a=t.multiline?`TEXTAREA`:`INPUT`;(!i||i.tagName!==a)&&(i?.remove(),i=document.createElement(a),i.className=`nsh-field`,i._count=0,i._known=``,this.wireInput(r,i),r._field=i,r.append(i),r._content&&this.placeContent(r)),y(i,`_class`,this.styleClass(n)),i.classList.toggle(`nsh-inset`,!r._content),i.placeholder=t.placeholder,t.multiline||(i.type=t.secure?`password`:t.keyboard===`email-address`?`email`:t.keyboard===`url`?`url`:t.keyboard===`phone-pad`?`tel`:`text`,i.inputMode={"number-pad":`numeric`,numeric:`decimal`,"decimal-pad":`decimal`,"numbers-and-punctuation":`text`,"phone-pad":`tel`,"email-address":`email`,url:`url`}[t.keyboard]??`text`),!t.multiline||t.submit!==`newline`?i.enterKeyHint={done:`done`,go:`go`,next:`next`,search:`search`,send:`send`}[t.returnKey]??`enter`:i.removeAttribute(`enterkeyhint`),i.readOnly=!t.editable,i.autocapitalize=t.autoCapitalize===`none`?`off`:t.autoCapitalize,i.spellcheck=t.autoCorrect,t.autoComplete==null?i.removeAttribute(`autocomplete`):i.setAttribute(`autocomplete`,t.autoComplete),t.maxLength==null?i.removeAttribute(`maxlength`):i.maxLength=t.maxLength,r._config=t,i.classList.toggle(`nsh-ph`,!!t.placeholderColor),i.classList.toggle(`nsh-noindicator`,!!t.noIndicator),this.inputScrolled(r,i),t.autoFocus&&!r._autoFocused&&(r._autoFocused=!0,setTimeout(()=>i.focus(),0))}wireInput(e,t){t.addEventListener(`input`,()=>this.textChanged(e,t)),t.addEventListener(`scroll`,()=>this.inputScrolled(e,t),{passive:!0}),typeof ResizeObserver==`function`&&new ResizeObserver(()=>this.inputScrolled(e,t)).observe(t),t.addEventListener(`compositionstart`,n=>{t._composing=!0,this.compositionChanged(e,t,n.data??``)}),t.addEventListener(`compositionupdate`,n=>this.compositionChanged(e,t,n.data??``)),t.addEventListener(`compositionend`,()=>{t._composing=!1,this.textChanged(e,t),this.compositionChanged(e,t,``);let n=t._pending;t._pending=null,n&&this.op_iv([,e._id,...n])}),t.addEventListener(`keydown`,n=>{if(e._events.has(`onKeyPress`)&&this.shortcut(n,!0)===-1){let t=n.key===`Backspace`||n.key===`Enter`||n.key===`Escape`||n.key.length===1?n.key:null;t&&this.event(e._id,`onKeyPress`,{key:t})}let r=e._config?.submit??`blurAndSubmit`,i=t.tagName===`TEXTAREA`&&(r===`newline`||n.shiftKey||n.altKey);n.key===`Enter`&&!i&&!n.isComposing&&n.keyCode!==229&&(n.preventDefault(),this.event(e._id,`onSubmitEditing`,{text:t.value,count:t._count}),r===`blurAndSubmit`&&t.blur())}),t.addEventListener(`focus`,()=>{this.setState(e,4,!0),this.event(e._id,`onFocus`)}),t.addEventListener(`blur`,()=>{this.setState(e,4,!1),this.event(e._id,`onBlur`)}),t.addEventListener(`select`,()=>this.selectionChanged(e,t)),t.addEventListener(`keyup`,()=>this.selectionChanged(e,t)),t.addEventListener(`pointerup`,()=>this.selectionChanged(e,t)),t.addEventListener(`scroll`,()=>this.caretMoved(e,t)),t.addEventListener(`paste`,t=>this.pasted(e,t))}inputScrolled(e,t){if(!e._config?.replaced||t.tagName!==`TEXTAREA`)return;let n=[t.scrollTop,t.clientWidth,t.scrollHeight,t.clientHeight];t._scrolled?.every((e,t)=>e===n[t])||(t._scrolled=n,this.call(t=>t.nsh_input_scroll(e._id,...n)))}textChanged(e,t){this.inputScrolled(e,t),t.value!==t._known&&(t._known=t.value,t._count++,this.event(e._id,`onChangeText`,{text:t.value,count:t._count}))}compositionChanged(e,t,n){let r=!!t._composing,i=t._composition;i&&i[0]===r&&i[1]===n||(t._composition=[r,n],e._events.has(`onCompositionChange`)&&this.event(e._id,`onCompositionChange`,{composing:r,text:n}))}selectionChanged(e,t){if(this.caretMoved(e,t),!e._events.has(`onSelectionChange`))return;let n=[t.selectionStart??0,t.selectionEnd??0];e._selection&&e._selection[0]===n[0]&&e._selection[1]===n[1]||(e._selection=n,this.event(e._id,`onSelectionChange`,{start:n[0],end:n[1]}))}pasted(e,t){if(e._config?.pasteInserts===!1&&t.preventDefault(),!e._events.has(`onPaste`))return;let n=t.clipboardData,r=n?.getData(`text/plain`)??``,i=n?.getData(`text/html`)??``,a=[...n?.files??[]],o=(n?.getData(`text/uri-list`)??``).split(/\r?\n/).filter(e=>e.startsWith(`file:`));Promise.all(a.map(e=>e.arrayBuffer())).then(t=>{let n=t.reduce((e,t)=>e+t.byteLength,0),s=new Uint8Array(n),c=0;for(let e of t)s.set(new Uint8Array(e),c),c+=e.byteLength;let l=JSON.stringify({text:r,html:i,files:a.map((e,n)=>({name:e.name||`image.png`,type:e.type,size:t[n].byteLength})),uris:o});this.call(()=>this.withStrings([l,s],(t,n,r,i)=>this.wasm.nsh_paste(e._id,t,n,r,i)))})}caretMoved(e,t){if(!e._events.has(`onCaretMove`)||document.activeElement!==t)return;let n=this.caretBounds(e,t),r=n.join();if(e._caret===r)return;e._caret=r;let[i,a,o,s]=n;this.event(e._id,`onCaretMove`,{bounds:{origin:{x:i,y:a},size:{width:o,height:s}}})}caretBounds(e,t){let n=getComputedStyle(t),r=t.tagName===`TEXTAREA`,a=this._caretMirror??=document.createElement(`div`),o=a.style;for(let e of i)o[e]=n[e];o.position=`absolute`,o.visibility=`hidden`,o.top=`0`,o.left=`-9999px`,o.overflow=`hidden`,o.whiteSpace=r?`pre-wrap`:`pre`,o.overflowWrap=r?`break-word`:`normal`,document.body.appendChild(a);let s=t.selectionEnd??t.value.length,c=t.value.slice(0,s);a.textContent=t.type===`password`?`•`.repeat(c.length):c;let l=document.createElement(`span`);l.textContent=t.value.slice(s)||`.`,a.appendChild(l);let u=parseFloat(n.fontSize)||16,d=parseFloat(n.lineHeight)||u*1.2,f=e=>parseFloat(n[`border${e}Width`])||0,p=l.offsetLeft+f(`Left`)-t.scrollLeft,m=r?l.offsetTop+f(`Top`)-t.scrollTop:(t.clientHeight-d)/2+f(`Top`);return a.remove(),p+=t.offsetLeft,m+=t.offsetTop,[p,m,1,d]}op_iv([,e,t,n]){let r=this.view(e)?._field;!r||n<r._count||(r._composing?r._pending=[t,n]:(r._known=t,r.value!==t&&(r.value=t)))}op_ic([,e,t,n,r,i]){let a=this.view(e);a&&(a._content=[t,n,r,i],this.placeContent(a))}placeContent(e){let t=e._field;if(!t||!e._content)return;let[n,r,i,a]=e._content;t.classList.remove(`nsh-inset`),t.style.left=`${n}px`,t.style.top=`${r}px`,t.style.width=`${i}px`,t.style.height=`${a}px`,this.caretMoved(e,t)}op_scr([,e,t,n,r,i]){let a=this.view(e);if(!a)return;a._screen={height:t,preventBack:n,header:r,animation:i},this.placeHeader(a);let o=a.parentNode;o?._kind===`stack`&&o._frame&&this.reportRoot(a,o._frame[2],o._frame[3],this.screenInsets(a))}placeHeader(e){let t=e._screen?.header,n=t==null?null:this.view(t);e._header&&e._header!==n&&e._header.remove(),e._header=n,n&&(n.classList.add(`nsh-page-header`),n.parentNode!==e&&e.append(n))}screenInsets(e){let t=this.safeProbe?this.safeArea():[0,0,0,0];return e._screen?.header==null?t:[0,t[1],t[2],t[3]]}goBack(e){if(e._events?.has(`onBackRequest`)&&this.event(e._id,`onBackRequest`),e._screen?.preventBack)return;let t=e.parentNode,n=t?[...t.children].filter(e=>e._kind===`screen`):[],r=n[n.indexOf(e)-1];r&&(clearTimeout(t._hideTimer),r.classList.remove(`nsh-hidden`),r.style.transform=``),t._top=r??null,e._popping=!0,this.moveScreens(e,r,!1,()=>this.event(e._id,`onDismiss`)),this.syncHistorySoon()}screensOf(e){return[...e.children].filter(e=>e._kind===`screen`&&!e._popping&&!e._removedFrom)}screenMotion(e){let t=e?._screen?.animation??`default`;return t===`none`?null:t===`fade`||this.reduceMotion()?{duration:200,fade:!0}:{duration:300,fade:!1}}moveScreens(e,t,n,r){let i=n?t:e,a=(t??e)?.parentNode;if(this.endNavShader(a),i?._navShader&&a&&(n||(e.style.pointerEvents=`none`),this.shaderNav(a,i,i._navShader,!n,r)))return;let o=this.screenMotion(n?t:e);if(!o){!n&&e&&(e.style.visibility=`hidden`),r?.();return}let s={duration:o.duration,easing:`cubic-bezier(0.333,1,0.667,1)`},c=(e,t)=>[{transform:`translateX(${e}%)`},{transform:`translateX(${t}%)`}],l;n?(l=t.animate(o.fade?[{opacity:0},{opacity:1}]:c(100,0),s),!o.fade&&e&&(e.animate(c(0,-30),s),e.style.transform=`translateX(-30%)`)):(l=e.animate(o.fade?[{opacity:1},{opacity:0}]:c(0,100),{...s,fill:`forwards`}),e.style.pointerEvents=`none`,!o.fade&&t&&t.animate(c(-30,0),s)),r&&(l.onfinish=r)}reconcileStacks(){let e=this.changedStacks;this.changedStacks=new Set;for(let t of e){let e=this.screensOf(t),n=e[e.length-1]??null,r=t._top??null,i=t._shown??[];t._top=n,t._shown=e;let a=r?._removedFrom===t,o=null;r&&n&&r!==n&&t._frame?.[2]>0&&(i.includes(n)?a&&!r._popping&&(o=r,r._popping=!0,this.moveScreens(r,n,!1,()=>{r._popping=!1,r.style.pointerEvents=``,r._removedFrom===t&&(r._removedFrom=null,r.remove(),this.dropLeftWith(r))})):this.moveScreens(a?null:r,n,!0));for(let e of[...t.children])e._removedFrom===t&&e!==o&&(e._removedFrom=null,e._popping=!1,e.remove(),this.dropLeftWith(e))}}topModal(){let e=[...this.root.children].filter(e=>e._kind===`modal`&&!e._leaving);return e[e.length-1]??null}backStack(e){let t=e=>e.isConnected&&(e.checkVisibility?.({visibilityProperty:!0})??!0),n=[];for(let r of this.views.values()){if(r._kind!==`stack`||!t(r)||e&&!e.contains(r))continue;let i=this.screensOf(r);(i.length>1||i[i.length-1]?._screen?.preventBack)&&n.push(r)}return n.find(e=>!n.some(t=>t!==e&&e.contains(t)))??null}back(){return!this.topModal()&&this.root._events?.has(`onBackPress`)?(this.event(1,`onBackPress`),!0):this.defaultBack()}defaultBack(){let e=this.topModal(),t=this.backStack(e);if(t){let e=this.screensOf(t);return this.goBack(e[e.length-1]),!0}return e?(this.requestClose(e),!0):!1}installHistory(){this.historyDepth=0,this.ignoredPops=0,this.historySession=`${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`,history.replaceState(this.historyState(0),``),window.addEventListener(`popstate`,e=>this.popState(e))}historyState(e){return{...history.state??{},nsh:e,nshSession:this.historySession}}resetHistory(){this.history&&this.historyDepth&&(this.ignoredPops++,history.go(-this.historyDepth),this.historyDepth=0)}backDepth(){let e=[...this.root.children].filter(e=>e._kind===`modal`&&!e._leaving).length;for(let t of this.views.values())t._kind===`stack`&&t.isConnected&&(t.checkVisibility?.({visibilityProperty:!0})??!0)&&(e+=Math.max(0,this.screensOf(t).length-1));return e}syncHistorySoon(){this.history&&!this.historySync&&(this.historySync=setTimeout(()=>{this.historySync=0,this.syncHistory()},0))}syncHistory(){let e=this.backDepth(),t=this.historyDepth;for(let n=t+1;n<=e;n++)history.pushState(this.historyState(n),``);e<t&&(this.ignoredPops++,history.go(e-t)),this.historyDepth=e}popState(e){if(this.ignoredPops>0){this.ignoredPops--;return}let t=this.historyDepth;if(e.state?.nshSession!==this.historySession){this.historyDepth=0;for(let e=0;e<t&&this.back();e++);e.state?.nsh!=null&&history.back();return}let n=e.state.nsh??0;if(n<t){this.historyDepth=n;for(let e=n;e<t&&this.back();e++);this.syncHistorySoon()}else n>t&&(this.ignoredPops++,history.go(t-n))}stackChanged(e,t){let n=this.screensOf(e);clearTimeout(e._hideTimer),e._hideTimer=setTimeout(()=>{n.forEach((t,r)=>{r<n.length-1&&t.parentNode===e&&t.classList.add(`nsh-hidden`)})},400),n.forEach((e,r)=>{let i=r===n.length-1;if(e.classList.toggle(`nsh-hidden`,!(i||r===n.length-2)),e===t&&r>0){let e=document.activeElement;e&&e!==document.body&&this.root.contains(e)&&!t.contains(e)&&(t._restoreFocus=e)}i&&(e.style.transform=``),this.placeHeader(e)}),t&&e._frame&&this.reportRoot(t,e._frame[2],e._frame[3],this.screenInsets(t)),this.syncHistorySoon()}reportRoot(e,t,n,r=[0,0,0,0]){let[i,a,o,s]=r;this.call(r=>r.nsh_root_size(e._id,t,n,i,a,o,s))}op_mc([,e,t,n]){let r=this.view(e);r&&(r._modal={animation:t,closeOnEscape:n},r.isConnected&&!r._leaving&&this.placeModal(r),r._entering&&(r.style.transform=``,r.style.opacity=``,this.hideModal(r,this.modalMotion(r))))}placeModal(e){let t=this.viewportDialogs,[n,r]=t?[e.clientWidth,e.clientHeight]:this.size,[i,a]=t&&this.frameScale||[1,1],o=t?{left:0,top:0,right:n*i,bottom:r*a}:void 0,s=this.safeProbe?this.safeArea(o).map((e,t)=>Math.round(e/(t%2?i:a))):[0,0,0,0],c=[0,0,n,r];e._frame=c,t||this.placeFrame(e);let l=`${c[2]},${c[3]},${s}`;e._reported!==l&&(e._reported=l,this.reportRoot(e,c[2],c[3],s))}modalMotion(e){let t=e._modal?.animation??`slide`;return t===`slide`&&this.reducedMotion?.matches?`fade`:t}hideModal(e,t){let n=e._frame??[0,0,...this.size],r=(this.viewportDialogs?n[3]:this.size[1])-n[1];t===`slide`&&(e.style.transform=`translateY(${r}px)`),t===`fade`&&(e.style.opacity=`0`)}present(e){this.endNavShader(this.root);let t=this.modalMotion(e);e._leaving=!1,e.style.pointerEvents=``,this.dropLeftWith(e),e._closed=!1,e._reported=null;let n=document.activeElement;if(e._restoreFocus=n!==document.body&&this.root.contains(n)?n:null,e._restoreFocus?.blur(),e.setAttribute(`aria-modal`,`true`),this.root.append(e),this.viewportDialogs){this.raise(e);for(let e of this.dialogs??[])this.raise(e);(this.viewportObserver??=new ResizeObserver(e=>{for(let{target:t}of e)t.isConnected&&!t._leaving&&this.placeModal(t)})).observe(e)}this.placeModal(e),e.style.transition=`none`,this.hideModal(e,t),e._entering=!0,this.scopeFocus(),this.syncHistorySoon(),requestAnimationFrame(()=>requestAnimationFrame(()=>{e._entering&&(e._entering=!1,e._navShader&&!this.viewportDialogs&&(e.style.transform=``,e.style.opacity=``,this.shaderNav(this.root,e,e._navShader,!1,()=>this.event(e._id,`onShow`)))?requestAnimationFrame(()=>{e.style.transition=``}):(e.style.transition=``,e.style.transform=``,e.style.opacity=``,e._showTimer=setTimeout(()=>{e._showTimer=0,this.event(e._id,`onShow`)},t===`none`?0:350)))}))}endPresentation(e){(e._entering||e._showTimer)&&(e._entering=!1,clearTimeout(e._showTimer),e._showTimer=0,this.event(e._id,`onShow`))}dismiss(e,t=e._closed){if(e._leaving)return;this.endNavShader(this.root),this.endPresentation(e),e._leaving=!0;let n=this.modalMotion(e),r=e._navShader&&!this.viewportDialogs&&this.shaderNav(this.root,e,e._navShader,!0,()=>{e._leaving&&(e.remove(),this.viewportObserver?.unobserve(e),this.releaseFrame(e),this.dropLeftWith(e)),t||this.event(e._id,`onDismiss`)});r?(e.style.transition=`none`,e.style.opacity=`0`,e.style.pointerEvents=`none`):this.hideModal(e,n),this.scopeFocus(),this.syncHistorySoon();let i=e._restoreFocus;i?.isConnected&&!this.topModal()&&i.focus({preventScroll:!0}),!r&&setTimeout(()=>{e._leaving&&(e.remove(),this.viewportObserver?.unobserve(e),this.releaseFrame(e),this.dropLeftWith(e)),t||this.event(e._id,`onDismiss`)},n===`none`?0:350)}holdFrame(e){if(typeof window>`u`)return;let t=this.frameLayers??=new Set;if(t.has(e)||(t.add(e),t.size>1)||(this.viewportPageRelease=P(this.root),window.parent===window))return;let n=this.root,r=n.getBoundingClientRect(),i=[`position`,`left`,`top`,`width`,`height`,`transform`,`transform-origin`],a=i.map(e=>[e,n.style.getPropertyValue(e),n.style.getPropertyPriority(e)]),o=[document.documentElement,document.body].map(e=>[e,e.style.getPropertyValue(`background`),e.style.getPropertyPriority(`background`)]);for(let[e]of o)e.style.setProperty(`background`,`transparent`,`important`);let s=e=>{let t=[`fixed`,`${e.left+r.left*e.sx}px`,`${e.top+r.top*e.sy}px`,`${n.clientWidth}px`,`${n.clientHeight}px`,`scale(${e.sx},${e.sy})`,`0 0`];i.forEach((e,r)=>n.style.setProperty(e,t[r],`important`))};s({left:0,top:0,sx:1,sy:1});let c=this.frameSession={close:null},l=!1,u,d,f=c.close=()=>{if(!l){l=!0,clearTimeout(d),window.removeEventListener(`pagehide`,f);for(let[e,t,r]of a)n.style.setProperty(e,t,r);for(let[e,t,n]of o)e.style.setProperty(`background`,t,n);if(u?.(),this.frameSession===c){this.frameSession=null,this.frameScale=null;for(let e of t)this.scaleLayer(e)}}};window.addEventListener(`pagehide`,f,{once:!0});let p=e=>{if(l)e.release();else{u=e.release,s(e.rect),this.frameScale=[e.rect.sx,e.rect.sy];for(let e of t)this.scaleLayer(e),e._kind===`modal`&&this.placeModal(e)}};try{if(window.frameElement){p(F(window.frameElement,N(document)));return}}catch(e){console.warn(`[nsh] iframe viewport host:`,e)}let m=new MessageChannel;u=()=>{m.port1.postMessage(`release`),m.port1.close()},m.port1.onmessage=({data:e})=>{clearTimeout(d),e.error?(console.warn(`[nsh] iframe viewport host:`,e.error),f()):p({rect:e,release:u})};let h=()=>{l||(window.parent.postMessage({type:`nsh:viewport`,colorScheme:N(document)},`*`,[m.port2]),d=setTimeout(()=>{console.warn(`[nsh] install hostPlayerFrame(iframe) on the embedding page for viewport dialogs`),f()},1500))};document.readyState===`complete`?h():window.addEventListener(`load`,h,{once:!0})}releaseFrame(e){this.frameLayers?.delete(e),this.frameLayers?.size||(this.frameSession?.close(),this.viewportPageRelease?.(),this.viewportPageRelease=null)}raise(e){this.holdFrame(e),e.popover||(e.classList.add(`nsh-viewport`),e.popover=`manual`,e.addEventListener(`wheel`,()=>{},{passive:!1})),e.matches(`:popover-open`)&&e.hidePopover(),e.showPopover(),this.scaleLayer(e)}scaleLayer(e){let[t,n]=this.frameScale??[1,1],r=t!==1||n!==1;(r||e._scaled)&&(e._scaled=r,e.style.width=r?`${100/t}%`:``,e.style.height=r?`${100/n}%`:``,e.style.scale=r?`${t} ${n}`:``,e.style.transformOrigin=r?`0 0`:``)}requestClose(e){this.event(e._id,`onRequestClose`,{reason:`cancel`}),(e._modal?.closeOnEscape??!0)&&!e._leaving&&(e._closed=!0,this.event(e._id,`onDismiss`),this.dismiss(e,!0))}scopeFocus(){let e=this.dialogs?.[this.dialogs.length-1]??this.topModal();for(let t of this.root.children)t===this.live||t.classList.contains(`nsh-error`)||(t.inert=t._kind===`modal`&&!!t._leaving||!!e&&t!==e)}op_web([,e,t,n,r,i,a,o,s]){let c=this.view(e),l=c?._frameEl;if(!l)return;let u=JSON.stringify([t,n,r,i,a,o,s]);if(c._web===u)return;c._web=u,c._port?.close(),c._port=null,c._token=n!=null&&s?Math.random().toString(36).slice(2):null;let d=[`allow-forms`,`allow-popups`,`allow-popups-to-escape-sandbox`,`allow-modals`,`allow-downloads`];s&&d.push(`allow-scripts`);let f=!1;if(n==null&&t){try{f=new URL(t,location.href).origin===location.origin}catch{}f||d.push(`allow-same-origin`)}if(l.setAttribute(`sandbox`,d.join(` `)),n!=null){let e=``;r&&(e+=`<base href="${r.replace(/"/g,`&quot;`)}">`),c._token&&(e+=`<script>${D(c._token)}<\/script>`),o||(e+=`<style>html,body{overflow:hidden!important}</style>`),i&&(e+=`<script>${i.replace(/<\/script/gi,`<\\/script`)}<\/script>`);let t=a?`<script>${a.replace(/<\/script/gi,`<\\/script`)}<\/script>`:``,s=/^\s*<!doctype[^>]*>/i.exec(n)?.[0]??``;c._webUrl=r??`about:srcdoc`,c._webTitle=new DOMParser().parseFromString(n,`text/html`).title,l.removeAttribute(`src`),l.removeAttribute(`scrolling`),l.srcdoc=s+e+n.slice(s.length)+t}else c._webUrl=t??``,c._webTitle=``,l.removeAttribute(`srcdoc`),o?l.removeAttribute(`scrolling`):l.setAttribute(`scrolling`,`no`),t?l.src=t:l.removeAttribute(`src`);(n!=null||t)&&queueMicrotask(()=>this.webNavigation(c,`onLoadStart`,!0))}webNavigation(e,t,n){let r={url:e._webUrl??``,title:e._webTitle??``,loading:n,canGoBack:!1,canGoForward:!1};e._events.has(t)&&this.event(e._id,t,r),e._events.has(`onNavigationStateChange`)&&this.event(e._id,`onNavigationStateChange`,r)}webLoaded(e){let t=e._frameEl;if(t.getAttribute(`src`)||t.hasAttribute(`srcdoc`)){if(e._token){let n=new MessageChannel;n.port1.onmessage=t=>{e._events.has(`onMessage`)&&this.event(e._id,`onMessage`,{data:String(t.data)})},e._port?.close(),e._port=n.port1,t.contentWindow?.postMessage(e._token,`*`,[n.port2])}this.webNavigation(e,`onLoad`,!1)}}op_video([,e,t,n,r,i,a,o,s,c,l]){let u=this.view(e),d=u?._video;if(!d)return;let f=t?this.asset(t):``;f!==u._src&&(u._src=f,f?d.src=f:d.removeAttribute(`src`)),u._progressInterval=l>0?l:250,d.muted=r,d.volume=Math.min(1,Math.max(0,i)),d.playbackRate=a,d.loop=o,d.controls=c,d.className=`nsh-fill nsh-fit-${s}`,n?d.pause():f&&d.paused&&d.play().catch(e=>{e?.name===`NotAllowedError`&&!u._autoplayWarned&&(u._autoplayWarned=!0,console.warn(`[nsh] the browser did not let the video play before a user gesture (muted videos can)`))})}wireVideo(e,t){let n=(t,n)=>e._events.has(t)&&this.event(e._id,t,n),r=()=>n(`onProgress`,{currentTime:t.currentTime,duration:t.duration||0}),i=()=>{clearInterval(e._progressTimer),e._progressTimer=0},a=!1,o=e=>{a!==e&&(a=e,n(`onBuffer`,{isBuffering:e}))};t.addEventListener(`loadstart`,()=>{t.getAttribute(`src`)&&n(`onLoadStart`)}),t.addEventListener(`loadedmetadata`,()=>n(`onLoad`,{duration:t.duration||0,width:t.videoWidth,height:t.videoHeight})),t.addEventListener(`playing`,()=>{o(!1),i(),e._events.has(`onProgress`)&&(e._progressTimer=setInterval(r,e._progressInterval??250))}),t.addEventListener(`pause`,()=>{i(),r()}),t.addEventListener(`waiting`,()=>o(!0)),t.addEventListener(`canplay`,()=>o(!1)),t.addEventListener(`ended`,()=>{i(),r(),n(`onEnd`)}),t.addEventListener(`error`,()=>{i();let e=t.error;e&&t.getAttribute(`src`)&&n(`onError`,{message:e.message||`media error ${e.code}`})})}op_cmd([,e,t,...n]){let r=this.view(e);switch(t){case`focus`:r?._field?r._field.focus():r&&this.focusPressable(r);break;case`blur`:r?._field?r._field.blur():document.activeElement?.blur?.();break;case`setSelection`:r?._field?.setSelectionRange(n[0],n[1]);break;case`scrollTo`:if(!r)break;if(r._field){r._field.scrollTo({top:n[1],behavior:n[2]?`smooth`:`instant`});break}r._applied++,this.stopGlide(r,n[0],n[1]),r._smooth=n[2]?[n[0],n[1]]:null,r.scrollTo({left:n[0],top:n[1],behavior:n[2]?`smooth`:`instant`});break;case`scrollToEnd`:{if(!r)break;r._applied++;let[e,t]=r._horizontal?[r.scrollWidth,0]:[0,r.scrollHeight];this.stopGlide(r,e,t),r.scrollTo({left:e,top:t,behavior:n[0]?`smooth`:`instant`});break}case`zoomTo`:r&&this.zoomCommand(r,...n);break;case`dialog`:this.dialog(n[0],n[1],n[2],n[3],n[4]??[],n[5]??!0,n[6]??!1);break;case`reload`:{let e=r?._frameEl;if(!e)break;e.hasAttribute(`srcdoc`)?e.srcdoc=e.srcdoc:e.getAttribute(`src`)&&(e.src=e.getAttribute(`src`)),this.webNavigation(r,`onLoadStart`,!0);break}case`postMessage`:r?._frameEl?.contentWindow?.postMessage(n[0],`*`);break;case`injectJavaScript`:case`goBack`:case`goForward`:r?._port?r._port.postMessage(t===`injectJavaScript`?{eval:n[0]}:{go:t===`goBack`?-1:1}):r?._frameEl&&!r._noBridgeWarned&&(r._noBridgeWarned=!0,console.warn(`[nsh] web view: ${t} only reaches HTML sources (a page of another site is the browser's own)`));break;case`seek`:r?._video&&(r._video.currentTime=n[0]);break;case`openUrl`:this.event(1,`onOpenUrl`,{id:n[0],opened:this.openUrl(n[1])});break;case`setClipboard`:this.writeClipboard(n[0]);break;case`readClipboard`:this.readClipboard(n[0],n[1]);break;case`setClipboardImage`:this.writeClipboardImage(n[0]);break;case`readClipboardImage`:this.readClipboardImage(n[0],n[1]);break;case`readClipboardFiles`:this.event(1,`onClipboard`,{id:n[0],has:!1,files:``});break;case`pickScreenColor`:this.pickScreenColor(n[0]);break;case`pickImages`:this.pickImages(n[0],n[1],n[2],n[3],n[4]);break;case`hostCall`:this.hostCall(n[0],n[1],n[2]);break;case`imageInfo`:this.imageInfo(n[0],n[1]);break;case`back`:this.defaultBack();break;case`exitApp`:{let e=this.app;queueMicrotask(()=>{this.app===e&&this.reset()});break}case`announce`:this.live.textContent=``,setTimeout(()=>{this.live.textContent=n[0]},50);break;case`a11yFocus`:if(!r)break;r.hasAttribute(`tabindex`)||(r.tabIndex=-1,r._a11yFocus=!0),r.focus()}}writeClipboard(e){let t=()=>{let t=document.createElement(`textarea`);t.value=e,t.className=`nsh-offscreen`,document.body.append(t),t.select();try{document.execCommand(`copy`)}catch{}t.remove()};navigator.clipboard?.writeText?navigator.clipboard.writeText(e).catch(t):t()}async pickScreenColor(e){let t;try{let{sRGBHex:e}=await new EyeDropper().open();t=parseInt(e.slice(1,7),16)*256+255}catch{}this.event(1,`onScreenColor`,t===void 0?{id:e}:{id:e,color:t})}openUrl(e){let t=null;try{t=window.open(e,`_blank`)}catch(e){console.warn(`[nsh] openUrl: ${e}`)}if(t)try{t.opener=null}catch{}return!!t}async readClipboard(e,t){let n=``;try{n=await navigator.clipboard?.readText()??``}catch{}let r={id:e,has:n.length>0};!t&&n&&(r.text=n),this.event(1,`onClipboard`,r)}async writeClipboardImage(e){try{let t=await(await fetch(e)).blob();await navigator.clipboard.write([new ClipboardItem({[t.type]:t})])}catch{}}pickImages(e,t,n,r,i){let a=this.app,o=document.createElement(`input`);o.type=`file`,o.accept=i?`image/*`:`image/jpeg,image/png,image/gif,image/webp`,o.multiple=t>1,o.style.display=`none`;let s=!1,c=async i=>{if(s)return;s=!0,o.remove();let c=[];for(let e of i.slice(0,t))try{c.push(await this.preparePicked(e,n,r))}catch{}a===this.app&&this.call(t=>{for(let e of c)this.withStrings([e.name,e.type,e.bytes],(n,r,i,a,o,s)=>t.nsh_picked_file(n,r,i,a,o,s,e.width,e.height,e.lastModified));return t.nsh_picked(e)})};o.addEventListener(`change`,()=>c([...o.files??[]])),o.addEventListener(`cancel`,()=>c([])),this.root.append(o),o.click()}async preparePicked(e,t,n){let r=e.type.toLowerCase(),i=null;try{i=await createImageBitmap(e,{imageOrientation:`from-image`})}catch{}let a=i?.width??0,o=i?.height??0,s=Math.max(a,o),c=t>0&&s>t,l=n>=0&&r===`image/jpeg`,u={name:e.name,type:r,lastModified:e.lastModified,width:a,height:o};if(!i||!(c||l))return i?.close(),{...u,bytes:new Uint8Array(await e.arrayBuffer())};let d=c?t/s:1,f=Math.max(1,Math.round(a*d)),p=Math.max(1,Math.round(o*d)),m=new OffscreenCanvas(f,p);m.getContext(`2d`).drawImage(i,0,0,f,p),i.close();let h=r===`image/png`&&c,g=await m.convertToBlob(h?{type:`image/png`}:{type:`image/jpeg`,quality:n>=0?n:.9}),_=e.name.replace(/\.[^.]*$/,``)+(h?`.png`:`.jpg`);return{...u,name:_,type:g.type,width:f,height:p,bytes:new Uint8Array(await g.arrayBuffer())}}async readClipboardImage(e,t){let n=this.app,r=t=>n===this.app&&this.event(1,`onClipboard`,{id:e,...t}),i=null;try{for(let e of await navigator.clipboard?.read()??[]){let t=e.types.find(e=>e.startsWith(`image/`));if(t){i=await e.getType(t);break}}}catch{}if(!i||t)return r({has:!!i});let a=await new Promise(e=>{let t=new FileReader;t.onload=()=>e(t.result),t.onerror=()=>e(null),t.readAsDataURL(i)});if(!a)return r({has:!0});let o=new Image;o.onload=()=>r({has:!0,uri:a,width:o.naturalWidth,height:o.naturalHeight}),o.onerror=()=>r({has:!0}),o.src=a}async hostCall(e,t,n){let r=this.app,i;try{let r=this.options.host;if(typeof r?.call!=`function`)throw Error("this page has no host (createPlayer's `host`)");let a=await r.call(t,n)??null;i=JSON.stringify({type:`reply`,id:e,ok:!0,value:a})}catch(t){i=JSON.stringify({type:`reply`,id:e,ok:!1,error:String(t?.message??t)})}r===this.app&&this.eventJson(1,`onHost`,i)}hostEvent(e,t=null){let n=JSON.stringify({type:`event`,event:String(e),payload:t??null});this.started?this.eventJson(1,`onHost`,n):this.hostEvents?.push(n)}imageInfo(e,t){let n=new Image,r=this.app,i=t=>r===this.app&&this.event(1,`onImageInfo`,{id:e,...t});n.onload=()=>i({width:n.naturalWidth,height:n.naturalHeight}),n.onerror=()=>i({error:`failed to load ${t}`}),n.src=this.asset(t)}filesystemStart(e,t,n){let r={};this.fileOperations.set(e,r);let i=()=>this.fileOperations.get(e)===r,a=(e,t=e)=>Object.assign(Error(t),{code:e}),o=e=>{let t=e.split(`/`).filter(Boolean);if(t.some(e=>e===`.`||e===`..`||e.includes(`\\`)))throw a(`EACCES`);return t};(async()=>{if(!navigator.storage?.getDirectory)throw a(`ERR_FEATURE_UNAVAILABLE_ON_PLATFORM`,`This browser does not provide Origin Private File System storage`);let e=await navigator.storage.getDirectory(),r=await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(t.namespace)),s=Array.from(new Uint8Array(r),e=>e.toString(16).padStart(2,`0`)).join(``),c=await(await e.getDirectoryHandle(`nsh-files`,{create:!0})).getDirectoryHandle(s,{create:!0}),l=async(e,t=!1)=>{let n=c;for(let r of e)n=await n.getDirectoryHandle(r,{create:t});return n},u=async e=>{let t=o(e);if(!t.length)return{handle:c,parent:c,name:``};let n=t.pop(),r=await l(t),i;try{i=await r.getFileHandle(n)}catch(e){if(e.name!==`TypeMismatchError`)throw e;i=await r.getDirectoryHandle(n)}return{handle:i,parent:r,name:n}},d=o(t.path),f=d.at(-1);if(!i())return{};if(t.op===`mkdir`){if(!d.length){if(!t.recursive)throw a(`EEXIST`);return{}}if(t.recursive)return await l(d,!0),{};let e=await l(d.slice(0,-1));try{throw await u(t.path),a(`EEXIST`)}catch(e){if(e.name!==`NotFoundError`)throw e}return await e.getDirectoryHandle(f,{create:!0}),{}}if(t.op===`write`){if(!f)throw a(`EISDIR`);let e=await l(d.slice(0,-1)),t;try{t=await e.getFileHandle(f,{create:!0})}catch(e){throw e.name===`TypeMismatchError`?a(`EISDIR`):e}if(!i())return{};let r=await t.createWritable();try{if(!i()||(await r.write(n),!i()))return await r.abort(),{};await r.close()}catch(e){throw await r.abort().catch(()=>{}),e}return{}}let p;try{p=await u(t.path)}catch(e){if(t.op===`exists`&&e.name===`NotFoundError`)return{kind:`exists`,value:!1};throw e}let{handle:m,parent:h}=p,g=m.kind===`directory`;switch(t.op){case`exists`:return{kind:`exists`,value:!0};case`read`:{if(g)throw a(`EISDIR`);let e=await m.getFile();if(e.size>t.maxBytes)throw a(`EFBIG`,`File exceeds the configured read limit`);return{kind:`bytes`,bytes:new Uint8Array(await e.arrayBuffer())}}case`entries`:{if(!g)throw a(`ENOTDIR`);let e=[],n=0;for await(let[r,i]of m.entries()){if(n+=new TextEncoder().encode(r).length,e.length>=t.maxEntries||n>t.maxNameBytes)throw a(`EFBIG`,`Directory exceeds the configured listing limit`);e.push({name:r,directory:i.kind===`directory`})}return{kind:`entries`,entries:e}}case`stat`:{let e=g?null:await m.getFile();return{kind:`metadata`,file:!g,directory:g,size:e?.size??0,mtime:e?.lastModified??0}}case`readlink`:throw a(`EINVAL`,`OPFS entries are regular files and directories`);case`unlink`:if(g)throw a(`EISDIR`);return i()&&await h.removeEntry(p.name),{};case`rmdir`:if(!g)throw a(`ENOTDIR`);if(!p.name)throw a(`EBUSY`);for await(let e of m.keys())throw a(`ENOTEMPTY`);return i()&&await h.removeEntry(p.name),{};case`rename`:{let e=o(t.to),n=e.pop();if(!p.name||!n)throw a(`EBUSY`);let r=await l(e);if(await h.isSameEntry(r)&&p.name===n)return{};try{let e=(await u(t.to)).handle;if(e.kind===`directory`&&!g)throw a(`EISDIR`);if(e.kind===`file`&&g)throw a(`ENOTDIR`);if(e.kind===`directory`)for await(let t of e.keys())throw a(`ENOTEMPTY`)}catch(e){if(e.name!==`NotFoundError`)throw e}if(typeof m.move!=`function`)throw a(`ENOTSUP`,`This browser does not support atomic OPFS rename for this entry`);return i()&&await m.move(r,n),{}}default:throw a(`ENOTSUP`)}})().then(t=>{if(!i())return;let n=t.bytes??new Uint8Array;delete t.bytes,this.call(r=>this.withStrings([JSON.stringify(t),n],(t,n,i,a)=>r.nsh_filesystem_reply(e,t,n,i,a))),this.fileOperations.delete(e)},n=>{if(!i())return;let r={error:String(n?.message??n),code:n?.code&&typeof n.code==`string`?n.code:{NotFoundError:`ENOENT`,TypeMismatchError:`ENOTDIR`,NotAllowedError:`EACCES`,SecurityError:`EACCES`,QuotaExceededError:`ENOSPC`,InvalidModificationError:`ENOTEMPTY`,NotSupportedError:`ENOTSUP`}[n?.name]??`EIO`,syscall:t.op,path:t.path};this.call(t=>this.withStrings([JSON.stringify(r),new Uint8Array],(n,r,i,a)=>t.nsh_filesystem_reply(e,n,r,i,a))),this.fileOperations.delete(e)})}websocketOperation(e){try{return e(),1}catch(e){return this.withStrings([String(e?.message??e)],(e,t)=>this.wasm.nsh_websocket_reply(e,t)),0}}websocketStart(e,t){let n=new WebSocket(t.url,t.protocols);n.binaryType=`arraybuffer`,this.websockets.set(e,n);let r=(t,r,i=0,a=!1)=>{this.websockets.get(e)===n&&this.call(o=>{if(this.websockets.get(e)!==n)return o.nsh_pump();let s=8388608,c=typeof r==`string`?0:r.byteLength;if(typeof r==`string`)for(let e=0;e<r.length&&c<=s;e++){let t=r.charCodeAt(e);t<128?c++:t<2048?c+=2:t>=55296&&t<=56319&&e+1<r.length&&r.charCodeAt(e+1)>=56320&&r.charCodeAt(e+1)<=57343?(c+=4,e++):c+=3}return c>s?this.withStrings([`WebSocket message exceeds the 8 MiB limit`],(t,n)=>{try{return o.nsh_websocket_event(e,3,t,n,0,0),o.nsh_websocket_event(e,4,t,n,1009,0)}finally{this.websocketCancel(e)}}):this.withStrings([r],(n,r)=>o.nsh_websocket_event(e,t,n,r,i,+!!a))})},i={paused:!1,events:[],report:r};n.nshHold=i;let a=(...e)=>{i.paused||i.events.length?i.events.push(e):r(...e)};n.onopen=()=>a(0,n.protocol),n.onmessage=e=>a(typeof e.data==`string`?1:2,typeof e.data==`string`?e.data:new Uint8Array(e.data)),n.onerror=()=>a(3,`Browser WebSocket failed (network, TLS, origin or server handshake error)`),n.onclose=e=>a(4,e.reason,e.code,e.wasClean)}websocketPause(e,t){let n=this.websockets.get(e),r=n?.nshHold;r&&(r.paused=t,!t&&r.events.length&&setTimeout(()=>{for(;!r.paused&&r.events.length&&this.websockets.get(e)===n;)r.report(...r.events.shift())}))}websocketCancel(e){let t=this.websockets.get(e);if(t){this.websockets.delete(e),t.onopen=t.onmessage=t.onerror=t.onclose=null;try{t.close()}catch{}}}fetchStart(e,t,n,r,i,a,o){let s={controller:new AbortController,paused:!1,resume:null,reader:null,done:!1};this.requests.set(e,s);let c=t=>{this.requests.get(e)===s&&this.call(t)},l=t=>{c(n=>this.withStrings([t],(t,r)=>n.nsh_fetch_failed(e,t,r))),this.requests.delete(e)},u=async i=>{let a={method:t,headers:new Headers,body:i,redirect:o?`follow`:`manual`,signal:s.controller.signal};for(let[e,t]of r)try{a.headers.append(e,t)}catch{}let u;try{u=await fetch(n,a)}catch(e){if(s.controller.signal.aborted)return;l(`fetch ${t} ${n} failed: ${e?.message??e} (a network error, or a cross-origin server that does not allow this page's origin)`);return}if(u.type===`opaqueredirect`){l(`fetch ${t} ${n} was redirected: on the web a redirect is only followed by the browser, not delivered or checked hop by hop`);return}let d=[];if(u.headers.forEach((e,t)=>d.push([t,e])),c(t=>this.withStrings([u.url||n,u.statusText,JSON.stringify(d)],(n,r,i,a,o,s)=>t.nsh_fetch_head(e,u.status,n,r,i,a,o,s,+!!u.redirected))),!u.body)c(t=>t.nsh_fetch_end(e)),this.requests.delete(e);else{s.reader=u.body.getReader();try{for(;;){for(;s.paused;)await new Promise(e=>s.resume=e);if(this.requests.get(e)!==s)return;let{done:t,value:n}=await s.reader.read();if(t)break;c(t=>this.withStrings([n],(n,r)=>t.nsh_fetch_data(e,n,r)))}}catch(e){s.controller.signal.aborted||l(`fetch ${t} ${n}: the body broke off: ${e?.message??e}`);return}c(t=>t.nsh_fetch_end(e)),this.requests.delete(e)}};a?(s.chunks=[],s.wanted=()=>c(t=>t.nsh_fetch_body_wanted(e)),s.finish=()=>{let e=s.chunks;s.chunks=null,e&&u(new Blob(e))},s.wanted()):u(i??void 0)}fetchSend(e,t){let n=this.requests.get(e);n?.chunks&&(n.chunks.push(t),n.wanted())}fetchPause(e,t){let n=this.requests.get(e);n&&(n.paused=t,!t&&n.resume&&(n.resume(),n.resume=null))}fetchCancel(e){let t=this.requests.get(e);t&&(this.requests.delete(e),t.controller.abort(),t.resume?.())}dialog(e,t,n,r,i,a,o){let s=r,c=e=>i[e]??`default`,l=this.desktopUI,u=document.createElement(`div`);u.className=o?`nsh-dialog-backdrop nsh-sheet-backdrop`:`nsh-dialog-backdrop`;let d=document.activeElement,f=d!==document.body&&this.root.contains(d)?d:null,p=!1,m=null;u.addEventListener(`pointerdown`,e=>{m=e.target},!0);let h=(e,t)=>e.detail===0||m!==null&&t.contains(m),g=t=>{p||(p=!0,u.remove(),this.releaseFrame(u),this.dialogs=this.dialogs.filter(e=>e!==u),this.scopeFocus(),f?.isConnected&&f.focus({preventScroll:!0}),this.event(1,`onDialog`,{id:e,index:t}))},_=s.findIndex((e,t)=>c(t)===`cancel`);u._cancel=()=>_>=0?g(_):a&&g(-1);let v=e=>{let t=document.createElement(`button`);return t.textContent=s[e],c(e)!=="default"&&t.classList.add(c(e)),t.addEventListener(`click`,n=>h(n,t)&&g(e)),t},y=null,b=document.createElement(`div`);if(b.setAttribute(`role`,`alertdialog`),b.setAttribute(`aria-modal`,`true`),b.setAttribute(`aria-label`,t??n??``),o){b.className=`nsh-sheet`;let e=document.createElement(`div`);if(t||n){let r=document.createElement(`div`);if(r.className=`nsh-sheet-head`,t){let e=document.createElement(`b`);e.textContent=t,r.append(e)}n&&r.append(n),e.append(r)}if(s.forEach((t,n)=>{if(n===_)return;let r=v(n);y??=r,e.append(r)}),e.firstChild&&b.append(e),_>=0){let e=document.createElement(`div`),t=v(_);y??=t,e.append(t),b.append(e)}}else{if(b.className=`nsh-dialog`,t){let e=document.createElement(`h3`);e.textContent=t,b.append(e)}if(n){let e=document.createElement(`p`);e.textContent=n,b.append(e)}let e=document.createElement(`div`);e.className=`nsh-dialog-actions ${(l?s.length<=3:s.length===2)?`row`:`column`}`;let r=-1;for(let e=s.length-1;e>=0&&r<0;e--)c(e)==="default"&&(r=e);s.forEach((t,n)=>{let i=v(n);n===r&&(l&&i.classList.add(`default`),y=i),e.append(i)}),y??=e.firstChild,b.append(e)}u.addEventListener(`click`,e=>e.target===u&&m===u&&a&&g(-1)),u.append(b),this.root.append(u),this.viewportDialogs&&this.raise(u),(this.dialogs??=[]).push(u),this.scopeFocus(),y?.focus({preventScroll:!0})}get desktopUI(){return this.idiom===`desktop`}updateRootClasses(){this.root.classList.toggle(`nsh-dark`,this.shownDark),this.root.classList.toggle(`nsh-desktop`,this.desktopUI),this.root.classList.toggle(`nsh-reduce`,this.reduceMotion())}reduceMotion(){return!!this.reducedMotion?.matches}op_comp([,,e]){if(this.missingComponents?.has(e))return;(this.missingComponents??=new Set).add(e);let t=`native component "${e}" is not available on the web: its view stays empty`;console.warn(`[nsh]`,t),this.options.onLog?.(`warn`,t)}viewOf(e){let t=e;for(;t&&t!==this.root&&t._id===void 0;)t=t.parentNode;return t&&t._id!==void 0?t:null}ancestors(e){let t=[];for(let n=e;n&&n!==this.root.parentNode;n=n.parentNode)n._id!==void 0&&t.push(n);return t}mousePoint(e,t){let n=1,r=0,i=0,a=1;for(let t=e;t;t=t.parentElement){let e=getComputedStyle(t);if(e.transform!==`none`){let t=new DOMMatrix(e.transform);[n,r,i,a]=[t.a*n+t.c*r,t.b*n+t.d*r,t.a*i+t.c*a,t.b*i+t.d*a]}if(e.scale&&e.scale!==`none`){let[t,o=t]=e.scale.split(` `).map(Number);[n,r,i,a]=[t*n,o*r,t*i,o*a]}if(t.classList?.contains(`nsh-viewport`))break}let o=e.getBoundingClientRect(),s=n*a-r*i;if(!s)return null;let c=getComputedStyle(e),l=parseFloat(c.width),u=parseFloat(c.height),d=t.clientX-o.left+Math.min(0,n*l,i*u,n*l+i*u),f=t.clientY-o.top+Math.min(0,r*l,a*u,r*l+a*u);return[(a*d-i*f)/s,(n*f-r*d)/s]}mouseMoved(e){if(e.pointerType!==`mouse`||!this.mouseTracked.size)return;let t=document.elementFromPoint(e.clientX,e.clientY);if(t&&this.root.contains(t))for(let n of this.ancestors(this.viewOf(t))){if(!n._events?.has(`onMouseMove`))continue;let t=this.mouseEvent(n,e);t&&this.event(n._id,`onMouseMove`,t)}}installInput(){let e=this.root;e.addEventListener(`pointerdown`,e=>this.pointerDown(e)),window.addEventListener(`pointermove`,e=>this.pointerMove(e),{passive:!1}),window.addEventListener(`pointerup`,e=>this.pointerUp(e,!1)),window.addEventListener(`pointercancel`,e=>this.pointerUp(e,!0)),e.addEventListener(`dragstart`,e=>e.preventDefault()),e.addEventListener(`mousedown`,e=>{this.lastPointer===`touch`||this.editable(e.target)||(e.preventDefault(),document.hasFocus()||window.focus())}),e.addEventListener(`contextmenu`,e=>this.contextMenu(e)||this.editable(e.target)||e.preventDefault()),e.addEventListener(`copy`,e=>this.copyText(e)),e.addEventListener(`wheel`,e=>this.wheel(e),{passive:!1}),e.addEventListener(`gesturestart`,e=>this.gestureZoom(e,0)),e.addEventListener(`gesturechange`,e=>this.gesture&&this.gestureZoom(e,1)),e.addEventListener(`gestureend`,e=>this.gesture&&this.gestureZoom(e,2)),e.addEventListener(`pointermove`,e=>{if(this.mouseMoved(e),e.pointerType!==`mouse`||(this.hover=[e.clientX,e.clientY],this.hoverButtons=e.buttons,!this.desktopUI||e.buttons))return;let t=this.viewOf(e.target);if(t)for(let n of this.ancestors(t))n._kind===`scroll`&&this.hoverBar(n,e)}),e.addEventListener(`focusin`,()=>L.active=this),window.addEventListener(`keydown`,e=>this.keyDown(e)),window.addEventListener(`keyup`,e=>this.keyUp(e)),e.addEventListener(`mouseup`,e=>{e.button!==3||this.history||(e.preventDefault(),this.back())}),this.live=document.createElement(`div`),this.live.className=`nsh-live`,this.live.setAttribute(`aria-live`,`polite`),this.history&&this.installHistory()}contextMenu(e){let t=this.viewOf(e.target);if(!t)return!1;for(let n of this.ancestors(t)){if(n._events?.has(`onContextMenu`)){e.preventDefault();let[t,r]=this.point(e),i=n.getBoundingClientRect();return this.event(n._id,`onContextMenu`,{position:{x:e.clientX-i.left,y:e.clientY-i.top},pagePosition:{x:t,y:r},modifiers:{control:e.ctrlKey,alt:e.altKey,shift:e.shiftKey,platform:e.metaKey}}),!0}if(n.matches(`.nsh-field, .nsh-selectable`))return!1}return!1}editable(e){return!!e?.closest?.(`.nsh-field, .nsh-selectable, iframe, video`)||!!this.textAt(e)||this.areaGap(e)}areaGap(e){let t=e?.closest?.(`.nsh-area`);if(!t||e.closest(`.nsh-noselect`))return!1;let n=e.closest(`.nsh-press`);return!n||!t.contains(n)}textAt(e){let t=e?.closest?.(`.nsh-autoselect`);return t&&(t.closest(`.nsh-area`)||this.desktopUI&&!t.closest(`.nsh-press`))?t:null}areaOf(e){let t=null;for(let n=e?.closest?.(`.nsh-area`);n;n=n.parentElement?.closest(`.nsh-area`))t=n;return t}takesKeys(){let e=document.activeElement;return e&&e!==document.body?this.root.contains(e):(L.active??this)===this}modifiersChanged(e){if(!r.has(e.key)||e.repeat||!this.hover||this.hoverButtons||!this.mouseTracked.size)return;let[t,n]=this.hover,i=document.elementFromPoint(t,n);if(!i||!this.root.contains(i))return;let a={target:i,clientX:t,clientY:n,buttons:0,ctrlKey:e.ctrlKey,altKey:e.altKey,shiftKey:e.shiftKey,metaKey:e.metaKey};for(let e of this.ancestors(this.viewOf(i))){if(!e._hoverIn||!e._events?.has(`onMouseMove`))continue;let t=this.mouseEvent(e,a);t&&this.event(e._id,`onMouseMove`,t)}}shortcut(e,t){let n=e.isComposing?-1:f(e);if(n<0)return-1;let r=+!!e.ctrlKey|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0);return this.wasm.nsh_key(n,r,+!!t,+!!e.repeat)}keyDown(e){if(this.wasm&&this.modifiersChanged(e),!this.wasm||!this.takesKeys())return;let t=document.activeElement,n=t&&this.root.contains(t),r=n&&!!t.closest(`.nsh-field, iframe`),i=this.shortcut(e,r);if(i!==-1){e.preventDefault(),e.stopPropagation(),i>=0&&this.call(e=>e.nsh_key_command(i));return}if(e.defaultPrevented||e.isComposing)return;let a=!e.ctrlKey&&!e.altKey&&!e.metaKey,o=this.dialogs?.[this.dialogs.length-1];if(o){e.key===`Escape`&&(e.preventDefault(),o._cancel());return}if(r){e.key===`Escape`&&a&&t.classList.contains(`nsh-field`)&&(e.preventDefault(),t.blur());return}if(this.selectionKey(e))return;if(n&&t._pressable&&a&&!e.shiftKey&&(e.key===`Enter`||e.key===` `)){if(e.preventDefault(),e.repeat)return;this.keyPress={press:t,states:this.ancestors(t).filter(e=>e._tracked&1)},this.pressIn(this.keyPress);for(let e of this.keyPress.states)this.setState(e,1,!0);e.key===`Enter`&&this.keyPressEnd(!0);return}let c=e.key===`BrowserBack`||e.altKey&&!s&&e.key===`ArrowLeft`||e.metaKey&&s&&e.key===`[`;if(e.key===`Escape`&&a||c){if(c&&this.history)return;this.back()&&e.preventDefault()}else a&&this.scrollKey(e,n?t:null)&&e.preventDefault()}keyUp(e){this.wasm&&this.modifiersChanged(e),e.key===` `&&this.keyPress&&this.keyPressEnd(!0)}keyPressEnd(e){let t=this.keyPress;this.keyPress=null,this.pressOut(t,e);for(let e of t.states)this.setState(e,1,!1)}selectableText(e){return e?.closest(`.nsh-selectable`)??this.textAt(e)}copyText(e){let t=getSelection();if(e.target.closest?.(`.nsh-field`)||!t?.rangeCount||t.isCollapsed||!this.root.contains(t.anchorNode))return;let n=t.getRangeAt(0),r=``,i=null,a=null,o=null,s=!1;for(let e of this.root.querySelectorAll(`.nsh-run`)){if(!n.intersectsNode(e)||!this.selectableText(e))continue;let t=e.textContent;if(!t)continue;let c=e.contains(n.startContainer)?C(e,n.startContainer,n.startOffset):0,l=e.contains(n.endContainer)?C(e,n.endContainer,n.endOffset):t.length;if(c>=l)continue;s=!0;let u=this.areaOf(e.parentNode);if(i!==e.parentNode){let t=u?e.parentNode.getBoundingClientRect():null;i&&u&&u===a&&t.top<o.bottom&&o.top<t.bottom?r=r.replace(/\n$/,``)+` `:i&&!r.endsWith(`
257
+ `,document.head.append(e)}this.root=document.createElement(`div`),this.root.className=window.top===window?`nsh-root`:`nsh-root nsh-embedded`,e.append(this.root),this.views=new Map,this.mouseTracked=new Set,this.shaderViews=new Set,this.classPrefix=`nsh-p${++w}-`,this.timer=0,this.trapped=!1,this.pumpRequested=!1,this.frame=0,this.measure=O(),this.measureUses=0,this.metricsCache=new Map,this.layoutAnimation=null,this.appearing=[],this.disappearing=[],this.changedStacks=new Set,this.removals=[],this.images=new Map,this.inlineImages=new Map,this.pointers=new Map,this.requests=new Map,this.websockets=new Map,this.fileOperations=new Map,this.dark=t.dark??matchMedia(`(prefers-color-scheme: dark)`).matches,this.history=t.history??window.top===window,this.viewportDialogs=t.dialogs===`viewport`&&typeof HTMLElement.prototype.showPopover==`function`,t.dialogs===`viewport`&&!this.viewportDialogs&&console.warn(`[nsh] this browser has no popovers: dialogs cover the player, not the window`),this.hostEvents=[],window.top===window&&document.documentElement.classList.add(`nsh-page`)}async load(e){let t=this.options.glue?E(this.options.glue):null;t?.catch(()=>{});let n={env:{__nsh_random_fill:(e,t)=>{try{let n=this.bytes(e,t);for(let e=0;e<t;e+=65536)globalThis.crypto.getRandomValues(n.subarray(e,Math.min(e+65536,t)));return 0}catch{return-1}}},nsh:{now_ms:()=>performance.now(),date_now_ms:()=>Date.now(),local_offset:e=>u(e),time_zone:(e,t)=>{let n=p.encode(d());return n.length<=t&&this.bytes(e,t).set(n),n.length},measure_text:(e,t,n,r)=>(++this.measureUses>=5e3&&(this.measureUses=0,this.measure=O()),this.measure.font=this.str(e,t),this.measure.measureText(this.str(n,r)).width),measure_numeric_text:(e,t,n,r,i,a)=>{let o=this.str(e,t),s=this.str(i,a);return A(o,this.str(n,r),s)??(this.measure.font=o,this.measure.measureText(s).width)},text_cluster_boxes:(e,t,n,r,i,a,o,s,c,l)=>{let u=new Uint32Array(this.wasm.memory.buffer,s,l*2),d=Array.from({length:l},(e,t)=>[u[2*t],u[2*t+1]]),f=j(this.str(e,t),this.str(n,r),i,this.str(a,o),d),p=new Float32Array(this.wasm.memory.buffer,c,l*2);f.forEach(([e,t],n)=>{p[2*n]=e,p[2*n+1]=t})},font_ascent:(e,t)=>this.metrics(this.str(e,t))[0],font_descent:(e,t)=>this.metrics(this.str(e,t))[1],font_x_height:(e,t)=>this.metrics(this.str(e,t))[2],register_font:(e,t,n,r,i,a)=>{let o=this.str(e,t),s=this.bytes(n,r).slice(),c=new FontFace(o,s,{weight:String(i),style:a?`italic`:`normal`});document.fonts.add(c),this.fontLoading(c.load())},image_bytes:(e,t,n,r)=>{let i=this.str(e,t),a=this.inlineImages.get(i);a&&URL.revokeObjectURL(a);let o=i.startsWith(`data:`)?i.slice(5,i.indexOf(`;`)):``;this.inlineImages.set(i,URL.createObjectURL(new Blob([this.bytes(n,r).slice()],{type:o})))},release_image:(e,t)=>{let n=this.str(e,t),r=this.inlineImages.get(n);r&&URL.revokeObjectURL(r),this.inlineImages.delete(n)},submit:(e,t)=>{let n=JSON.parse(this.str(e,t));this.apply(n)},request_frame:()=>this.requestFrame(),request_pump:()=>this.requestPump(),report_error:(e,t)=>this.showError(this.str(e,t)),report_panic:(e,t)=>this.reportPanic(this.str(e,t)),test_send:(e,t)=>this.onTestSend?.(JSON.parse(this.str(e,t))),log:(e,t,n)=>{let r=this.str(t,n);(e<=1?console.error:e===2?console.warn:console.log)(`[nsh]`,r),this.options.onLog?.(e<=1?`error`:e===2?`warn`:`log`,r)},read_asset:(e,t)=>{let n=this.options.readAsset?.(this.str(e,t));return n?(this.withStrings([n],(e,t)=>this.wasm.nsh_asset_bytes(e,t)),1):0},asset_url:(e,t,n,r)=>{let i=p.encode(this.asset(this.str(e,t)));return i.length<=r&&this.bytes(n,r).set(i),i.length},fetch_start:(e,t,n,r,i,a,o,s,c,l,u)=>this.fetchStart(e,this.str(t,n),this.str(r,i),JSON.parse(this.str(a,o)),l===1?this.bytes(s,c).slice():null,l===2,u!==0),fetch_send:(e,t,n)=>this.fetchSend(e,this.bytes(t,n).slice()),fetch_finish:e=>this.requests.get(e)?.finish?.(),fetch_pause:(e,t)=>this.fetchPause(e,t!==0),fetch_cancel:e=>this.fetchCancel(e),filesystem_start:(e,t,n,r,i)=>this.filesystemStart(e,JSON.parse(this.str(t,n)),this.bytes(r,i).slice()),filesystem_cancel:e=>this.fileOperations.delete(e),websocket_start:(e,t,n)=>this.websocketOperation(()=>this.websocketStart(e,JSON.parse(this.str(t,n)))),websocket_send:(e,t,n,r)=>this.websocketOperation(()=>{let i=this.websockets.get(e);if(!i)throw Error(`WebSocket is closed`);i.send(r?this.bytes(t,n).slice():this.str(t,n))}),websocket_close:(e,t,n,r)=>this.websocketOperation(()=>{let i=this.websockets.get(e);i&&i.close(t,this.str(n,r))}),websocket_buffered:e=>this.websockets.get(e)?.bufferedAmount??0,websocket_pause:(e,t)=>this.websocketPause(e,t!==0),websocket_cancel:e=>this.websocketCancel(e),load_data:(e,t)=>this.loadData(this.str(e,t)),storage_load:(e,t)=>this.storage(()=>{let n=this.str(e,t),r=Object.create(null);for(let e=0;e<localStorage.length;e++){let t=localStorage.key(e);t?.startsWith(n)&&(r[t.slice(n.length)]=localStorage.getItem(t))}return JSON.stringify(r)}),storage_set:(e,t,n,r,i,a)=>this.storage(()=>localStorage.setItem(this.str(e,t)+this.str(n,r),this.str(i,a))),storage_remove:(e,t,n,r)=>this.storage(()=>localStorage.removeItem(this.str(e,t)+this.str(n,r))),storage_clear:(e,t)=>this.storage(()=>{let n=this.str(e,t),r=[];for(let e=0;e<localStorage.length;e++){let t=localStorage.key(e);t?.startsWith(n)&&r.push(t)}for(let e of r)localStorage.removeItem(e)})}},r=await(typeof e==`string`||e instanceof URL?fetch(e):e),i=r.headers.get(`Content-Type`)?.trim().toLowerCase()===`application/wasm`&&WebAssembly.compileStreaming?await WebAssembly.compileStreaming(r):await WebAssembly.compile(await r.arrayBuffer()),a=t&&await t;if(a){if(typeof a.__nsh_imports!=`function`||typeof a.__nsh_finalize!=`function`)throw Error(`the glue ${this.options.glue} exports no __nsh_imports / __nsh_finalize: it must be the glue the nsh CLI adapts (nsh-bindgen.js), not wasm-bindgen's own output`);for(let[e,t]of Object.entries(a.__nsh_imports()))n[e]=e in n?{...t,...n[e]}:t}for(let{module:e,name:t,kind:r}of WebAssembly.Module.imports(i))r!==`function`||n[e]?.[t]||(n[e]??={},n[e][t]=()=>{throw Error(`nsh.wasm called ${e}.${t}, which the web runtime does not provide`)});if(WebAssembly.Module.imports(i).some(e=>e.module===`nsh_browser`)){let{createBrowserHost:e}=await import(`./browser.6333ad295d/runtime.js`);this.browserHost=e(this),n.nsh_browser=this.browserHost.imports}n.__wbindgen_placeholder__&&(n.__wbindgen_placeholder__.__wbindgen_describe=()=>{});let o=await WebAssembly.instantiate(i,n);this.wasm=this.browserHost?this.browserHost.bind(o.exports):o.exports,this.mainExports=o.exports,this.sideLoads=new Map,this.sideModules=new Map,this.trapped=!1,a?.__nsh_finalize(o,i);for(let e of Object.keys(o.exports))/^nsh_(part|std|feature|ui_set)_/.test(e)&&o.exports[e]();this.wasm.nsh_app_init?.(),this.withStrings([document.baseURI],(e,t)=>this.wasm.nsh_set_base_url(e,t)),new ResizeObserver(()=>this.resized()).observe(this.root),matchMedia(`(prefers-color-scheme: dark)`).addEventListener(`change`,e=>{this.options.dark===void 0&&this.setDark(e.matches)}),this.installEnvironment(),this.installInput()}loadSides(e,t){return Promise.all((e??[]).map(e=>this.loadSide(e,t)))}prefetchSides(e){let t=Object.keys(e??{}).filter(t=>!e[t].onDemand);for(let n of t){if(this.sideModules.has(n)||this.sideLoads.has(n))continue;let t=this.compileSide(e[n].url,{priority:`low`});t.catch(()=>this.sideModules.delete(n)),this.sideModules.set(n,t)}}preloadSides(e){let t=Object.keys(e??{}).filter(t=>!e[t].onDemand);t.length&&(globalThis.requestIdleCallback??(e=>setTimeout(e,200)))(()=>this.loadSides(t,e).catch(e=>console.warn(`[nsh] preloading side modules: ${e?.message??e}`)))}async compileSide(e,t){try{return await WebAssembly.compileStreaming(fetch(e,t))}catch(n){if(!(n instanceof TypeError))throw n;let r=await fetch(e,t);if(!r.ok)throw Error(`${e}: HTTP ${r.status}`);return WebAssembly.compile(await r.arrayBuffer())}}loadSide(e,t){if(!this.sideLoads.has(e)){let n=t?.[e];if(!n)return Promise.reject(Error(`no side module ${e}`));this.sideLoads.set(e,this.instantiateSide(e,n,t))}return this.sideLoads.get(e)}async instantiateSide(e,{url:t,gate:n,needs:r},i){let a={main:this.mainExports},o=await Promise.all((r??[]).map(e=>this.loadSide(e,i)));(r??[]).forEach((e,t)=>{a[e]=o[t]});let s=this.sideModules.get(e);this.sideModules.delete(e);let c=await(s?.catch(()=>null)??null)??await this.compileSide(t),l=await WebAssembly.instantiate(c,a);if(n){let e=l.exports[n];if(typeof e!=`function`)throw Error(`${t} exports no ${n}`);e(),this.afterGate(n)}return l.exports}afterGate(e){typeof this.wasm.nsh_after_gate==`function`&&this.withStrings([e],(e,t)=>this.wasm.nsh_after_gate(e,t))}testStart(){this.testing=!0,this.wasm.nsh_test_start?.()}testSetup(e,t,n){if(this.testIdiom=n?.idiom,!this.wasm.nsh_test_setup)return;let r=JSON.stringify({storage:e??[],trace:!!t,environment:n??{}});this.withStrings([r],(e,t)=>this.wasm.nsh_test_setup(e,t))}testFetchReply(e,t){this.wasm.nsh_test_fetch_reply&&this.withStrings([JSON.stringify({id:e,reply:t})],(e,t)=>this.wasm.nsh_test_fetch_reply(e,t))}get takesTests(){return typeof this.wasm?.nsh_test_answer==`function`}testStep(e){if(!this.takesTests)return{outcome:`failed`,message:`this runtime takes no test steps`};let t=this.withStrings([JSON.stringify(e)],(e,t)=>this.wasm.nsh_test_answer(e,t)),n=JSON.parse(this.str(this.wasm.nsh_test_answer_ptr(),t));if(e.query?.query===`animating`&&`done`in n)return{outcome:`done`,value:n.done===!0||this.pageAnimating()};if(`done`in n)return{outcome:`done`,value:n.done??null};if(`failed`in n)return{outcome:`failed`,message:n.failed};try{return{outcome:`done`,value:this.testPage(e.query??{})}}catch(e){return{outcome:`failed`,message:String(e?.message??e)}}}pageAnimating(){return this.root.getAnimations({subtree:!0}).some(e=>{if(e.playState!==`running`)return!1;let t=e.effect?.getComputedTiming().endTime;return t!=null&&Number.isFinite(Number(t))})}testPage(e){switch(e.query){case`bounds`:{let t=this.views.get(e.id);if(!t?.isConnected)return null;let n=t.getBoundingClientRect();return n.width===0&&n.height===0?null:[n.left,n.top,n.width,n.height]}case`viewport`:return[window.innerWidth,window.innerHeight];case`text_bounds`:{let t=this.views.get(e.id);if(!t?.isConnected)return null;for(let n of t.querySelectorAll(`:scope > .nsh-run`)){if(n._start==null)continue;let t=Math.max(e.start-n._start,0),r=Math.min(e.end-n._start,n.textContent.length);if(t>=r)continue;let i=document.createRange();i.setStart(...S(n,t)),i.setEnd(...S(n,r));let a=i.getBoundingClientRect();return[a.left,a.top,a.width,a.height]}return null}case`input_text`:{let t=this.views.get(e.id)?._field;return t?t.value:null}case`dialog_point`:{let t=this.root.querySelectorAll(`.nsh-dialog-backdrop`),n=t[t.length-1];if(!n)throw Error(`no dialog is shown`);if(e.button==null){let e=n.getBoundingClientRect();return[e.left+2,e.top+2]}let r=[...n.querySelectorAll(`button`)].find(t=>t.textContent.trim()===e.button);if(!r)throw Error(`the dialog has no button ${JSON.stringify(e.button)}`);let i=r.getBoundingClientRect();return[i.left+i.width/2,i.top+i.height/2]}}throw Error(`the page cannot answer ${JSON.stringify(e)}`)}str(e,t){return m.decode(new Uint8Array(this.wasm.memory.buffer,e,t))}bytes(e,t){return new Uint8Array(this.wasm.memory.buffer,e,t)}storage(e){let t,n;try{t=e(),n=1}catch(e){t=String(e?.message??e),n=0}return typeof t==`string`&&this.withStrings([t],(e,t)=>this.wasm.nsh_storage_reply(e,t)),n}withStrings(e,t){let n=e.map(e=>{let t=typeof e==`string`?p.encode(e):e,n=this.wasm.nsh_alloc(t.length);return new Uint8Array(this.wasm.memory.buffer,n,t.length).set(t),[n,t.length]});try{return t(...n.flat())}finally{for(let[e,t]of n)this.wasm.nsh_dealloc(e,t)}}metrics(e){let t=this.metricsCache.get(e);if(!t){this.measure.font=e;let n=this.measure.measureText(`Hg`),r=this.measure.measureText(`x`);t=[n.fontBoundingBoxAscent??0,n.fontBoundingBoxDescent??0,r.actualBoundingBoxAscent??0],this.metricsCache.set(e,t)}return t}fontLoading(e){let t=this.fontsPending??=[];if(t.push(e.catch(e=>console.warn(`[nsh] font failed to load:`,e))),this.starting&&!this.root.classList.contains(`nsh-hidden`)&&(this.root.classList.add(`nsh-hidden`),clearTimeout(this.fontTimer),this.fontTimer=setTimeout(()=>this.root.classList.remove(`nsh-hidden`),3e3)),t.length>1)return;let n=()=>{let e=this.fontsPending;Promise.all(e).then(()=>{this.fontsPending.length>e.length?(this.fontsPending=this.fontsPending.slice(e.length),n()):(this.fontsPending=[],this.metricsCache.clear(),this.call(e=>e.nsh_fonts_loaded()),clearTimeout(this.fontTimer),this.root.classList.remove(`nsh-hidden`))})};n()}runModule(e,t){return this.browserHost?this.browserHost.run(e,t):Promise.reject(Error(`this runtime has no browser JavaScript host`))}runSource(e,{appId:t=``,capabilities:n=``,sourceMap:r=``,name:i=``}={}){return this.browserHost?this.browserHost.runSource(e,{appId:t,capabilities:n,sourceMap:r,name:i}):Promise.reject(Error(`this runtime has no browser JavaScript host`))}runRust(){if(!this.wasm.nsh_start_rust)throw Error(`this runtime has no Rust app`);let[e,t]=this.reset();this.begin(e,n=>(this.withStrings([n],(e,t)=>this.wasm.nsh_environment(e,t)),this.wasm.nsh_start_rust(e,t,+!!this.dark,devicePixelRatio||1)))}reset(){this.stop(),this.resetHistory(),this.app=(this.app??0)+1;let e=this.root;e.textContent=``,e.append(this.live),this.views.clear(),this.mouseTracked.clear(),e._id=1,e._kind=`root`,e._events=new Set,e._animation={},this.views.set(1,e);let t=e.clientWidth||390,n=e.clientHeight||844;return this.size=[t,n],this.size}begin(e,t,n=!1){this.idiom=this.options.idiom??this.testIdiom??this.measureIdiom(e);let r=this.reported=JSON.stringify(this.environment());this.updateRootClasses(),this.started=!1,this.hostEvents??=[],this.starting=!0;try{this.call(()=>t(r))}catch(e){throw this.hostEvents=null,e}finally{this.starting=!1}n||this.startedApp()}startedApp(){this.started=!0;let e=this.hostEvents;this.hostEvents=[];for(let t of e)this.eventJson(1,`onHost`,t)}async loadData(e){let t=this.options.data?.[e]??new URL(`nsh-${e}.bin`,import.meta.url),n=null;try{let r=`nsh_feature_${e}`;this.options.sides?.[r]?await this.loadSide(r,this.options.sides):this.wasm[r]?.();let i=await fetch(t);if(!i.ok)throw Error(`${i.status} ${i.statusText}`.trim());n=new Uint8Array(await i.arrayBuffer())}catch(e){console.warn(`[nsh]`,`${e.message??e} (${t})`)}let r=n??new Uint8Array;this.call(t=>this.withStrings([e,r],(e,r,i,a)=>t.nsh_data(e,r,i,a,+!!n)))}compile(e,t=`App.tsx`){if(!this.wasm.nsh_compile)return{error:`this runtime has no compiler (load nsh-playground.wasm)`};let n=this.withStrings([t,e],(e,t,n,r)=>this.wasm.nsh_compile(e,t,n,r)),r=this.str(this.wasm.nsh_compiled_ptr(),this.wasm.nsh_compiled_len());return n?{code:r}:{error:r}}async compileAndRun(e,t=`App.tsx`,n={}){let r=this.compile(e,t);return r.error?r.error:(await this.runSource(r.code,{name:t,...n}),null)}hotUpdate(e,t=`hot.js`,n=``){return this.browserHost?this.browserHost.hotUpdate(e,t,n??``):Promise.resolve(!1)}stop(){if(!this.stopping){this.stopping=!0;try{this.started=!1,this.hostEvents??=[],this.frameSession?.close(),this.viewportPageRelease?.(),this.viewportPageRelease=null;for(let e of this.frameLayers??[])e.remove();this.frameLayers?.clear(),this.viewportDialogs&&(this.dialogs=[]),this.viewportObserver?.disconnect(),this.fileOperations.clear();for(let e of[...this.requests.keys()])this.fetchCancel(e);for(let e of[...this.websockets.keys()])this.websocketCancel(e);clearTimeout(this.timer),cancelAnimationFrame(this.frame),this.frame=0,this.browserHost?.stop(),this.wasm?.nsh_stop()}finally{this.stopping=!1}}}requestPump(){this.pumpRequested||(this.pumpRequested=!0,setTimeout(()=>{this.pumpRequested=!1,this.call(e=>e.nsh_pump())},0))}schedule(e){clearTimeout(this.timer),e>=0&&(this.timer=setTimeout(()=>this.call(e=>e.nsh_pump()),Math.max(0,e)))}call(e){if(this.trapped)return;if(this.depth>0){(this.deferred??=[]).push(e);return}this.depth=1;try{this.schedule(e(this.wasm))}catch(e){throw e instanceof WebAssembly.RuntimeError&&this.trap(),e}finally{this.depth=0}let t=this.deferred;if(t?.length){this.deferred=[];for(let e of t)this.call(e)}}requestFrame(){this.frame||=requestAnimationFrame(e=>{this.frame=0,this.call(t=>t.nsh_frame(e))})}resized(){let e=this.root.clientWidth,t=this.root.clientHeight;if(this.size&&e&&(e!==this.size[0]||t!==this.size[1])){this.size=[e,t],this.call(n=>n.nsh_resize(e,t)),this.environmentChanged();for(let e of this.views.values())e._kind===`modal`&&e.isConnected&&!e._leaving&&this.placeModal(e)}}measureIdiom(e){return matchMedia(`(pointer: fine) and (hover: hover)`).matches&&e>=600?`desktop`:Math.min(screen.width,screen.height)>=600?`pad`:`phone`}installEnvironment(){let e=()=>this.environmentChanged();this.reducedMotion=matchMedia(`(prefers-reduced-motion: reduce)`),this.reducedMotion.addEventListener(`change`,e);let t=()=>{matchMedia(`(resolution: ${devicePixelRatio||1}dppx)`).addEventListener(`change`,()=>{t(),e()},{once:!0})};t(),addEventListener(`languagechange`,e),addEventListener(`resize`,e),document.addEventListener(`visibilitychange`,e),addEventListener(`focus`,e),addEventListener(`blur`,e),visualViewport?.addEventListener(`resize`,e),visualViewport?.addEventListener(`scroll`,e),new MutationObserver(e).observe(document.documentElement,{attributes:!0,attributeFilter:[`dir`,`lang`]}),this.safeProbe=document.createElement(`div`),this.safeProbe.className=`nsh-probe`,document.body.append(this.safeProbe)}safeArea(e=this.root.getBoundingClientRect()){let t=getComputedStyle(this.safeProbe),n=e=>parseFloat(e)||0;return[Math.max(0,n(t.paddingTop)-e.top),Math.max(0,n(t.paddingRight)-(innerWidth-e.right)),Math.max(0,n(t.paddingBottom)-(innerHeight-e.bottom)),Math.max(0,n(t.paddingLeft)-e.left)].map(Math.round)}keyboardHeight(){let e=visualViewport;if(!e||e.scale>1.01)return 0;let t=this.root.getBoundingClientRect().bottom;return Math.max(0,Math.round(t-(e.offsetTop+e.height)))}environment(){let e=(navigator.languages?.length?navigator.languages:[navigator.language]).find(Boolean)??Intl.DateTimeFormat().resolvedOptions().locale,t=document.documentElement.getAttribute(`dir`),n=parseFloat(getComputedStyle(document.documentElement).fontSize)||16;return{idiom:this.idiom,locale:e,rtl:t===`rtl`||t===`ltr`?t===`rtl`:M(e),reduceMotion:this.reducedMotion.matches,fontScale:Math.round(n/16*100)/100,pixelRatio:devicePixelRatio||1,safeArea:this.safeArea(),keyboard:this.keyboardHeight(),appleKeyboard:s,host:!!this.options.host,lifecycle:document.visibilityState===`hidden`?`background`:document.hasFocus()?`active`:`inactive`,screenColor:typeof window.EyeDropper==`function`}}environmentChanged(){if(!this.reported)return;this.updateRootClasses();let e=JSON.stringify(this.environment());e!==this.reported&&(this.reported=e,this.call(()=>this.withStrings([e],(e,t)=>this.wasm.nsh_environment(e,t))))}setDark(e){this.dark=e,this.updateRootClasses(),this.call(t=>t.nsh_set_dark(+!!e))}event(e,t,n=null){this.eventJson(e,t,JSON.stringify(n))}eventJson(e,t,n){this.call(()=>this.withStrings([t,n],(t,n,r,i)=>this.wasm.nsh_event(e,t,n,r,i)))}reportPanic(e){let t=!this.trapped;this.trap(),this.showError(e,{overlay:t})}trap(){this.trapped=!0,this.deferred=[],clearTimeout(this.timer)}showError(e,{overlay:t=!this.trapped}={}){if(console.error(`[nsh]`,e),this.options.onError?.(e),this.options.overlay===!1||!t)return;let n=this.root.querySelector(`:scope > .nsh-error`);n||(n=document.createElement(`div`),n.className=`nsh-error`,n.title=`Click to dismiss`,n.addEventListener(`click`,()=>n.remove()),this.root.append(n));let r=document.createElement(`button`);r.className=`nsh-error-copy`,r.textContent=`Copy`,r.addEventListener(`click`,t=>{t.stopPropagation(),navigator.clipboard?.writeText(e).then(()=>{r.textContent=`Copied`},()=>{})}),n.replaceChildren(r,e)}asset(e){if(!e)return e;if(e.startsWith(`asset:/`)){let t=e.slice(7).replace(/^\/+/,``);return this.options.assets?.[t]??this.assetBase+t}return this.inlineImages.get(e)??e}apply(e){for(let t of e){let e=this[`op_${t[0]}`];e&&e.call(this,t)}this.endLayoutAnimation(),this.changedStacks.size&&this.reconcileStacks(),this.removals.length&&this.finishRemovals()}finishRemovals(){let e=this.removals;this.removals=[];for(let t of e){if(!t._removing)continue;t._removing=!1;let e=t.parentNode;for(;e&&e!==this.root&&!(e._leaving||e._popping||e._removedFrom||e._dying);)e=e.parentNode;e&&e!==this.root?t._leftWith=e:t.remove()}}view(e){return this.views.get(e)}op_c([,e,t]){let n;if(t===`canvas`){n=document.createElement(`div`);let e=document.createElement(`canvas`);e.className=`nsh-fill`,n.append(e),n._canvas=e,n._slots=[]}else if(t===`web`){n=document.createElement(`div`);let e=document.createElement(`iframe`);e.className=`nsh-fill`,n.append(e),n._frameEl=e,e.addEventListener(`load`,()=>this.webLoaded(n))}else if(t===`video`){n=document.createElement(`div`);let e=document.createElement(`video`);e.playsInline=!0,e.className=`nsh-fill`,n.append(e),n._video=e,this.wireVideo(n,e)}else n=document.createElement(`div`);if(n._id=e,n._kind=t,n._events=new Set,n._animation={},n._frame=null,n.className=t===`scroll`?`nsh-v nsh-scroll`:`nsh-v`,t===`image`){let e=document.createElement(`img`);e.draggable=!1,e.className=`nsh-fill nsh-fit-cover`,e.addEventListener(`load`,()=>this.imageLoaded(n,e)),e.addEventListener(`error`,()=>this.imageFailed(n)),n.append(e),n._img=e,n.classList.add(`nsh-clip`)}if(t===`scroll`){n._spacer=document.createElement(`div`),n._spacer.className=`nsh-spacer`,n.append(n._spacer),n._applied=0,n.addEventListener(`scroll`,()=>this.scrolled(n),{passive:!0}),n.addEventListener(`scrollend`,()=>this.scrollEnded(n));let e=()=>{n._smooth=null};for(let t of[`wheel`,`pointerdown`,`touchstart`,`keydown`])n.addEventListener(t,e,{passive:!0})}t===`screen`&&n.classList.add(`nsh-screen`),t===`modal`&&n.classList.add(`nsh-modal`),t===`stack`&&n.classList.add(`nsh-clip`),this.layoutAnimation?.create&&this.appearing.push(n),this.views.set(e,n)}op_i([,e,t,n]){let r=this.view(e),i=this.view(t);if(!r||!i)return;if(i._kind===`modal`){this.present(i);return}let a=n==null?null:this.view(n);if(i._kind===`header`){i._headerParent=r;return}i._dying&&this.revive(i),i._removedFrom=null,i._removing=!1,i._leftWith=null;let o=r._layer??r;o.insertBefore(i,a&&a.parentNode===o?a:null),r._kind===`stack`&&(this.changedStacks.add(r),this.stackChanged(r,i))}op_r([,e]){let t=this.view(e);if(!t)return;if(t._kind===`modal`){this.dismiss(t);return}let n=t.parentNode,r=t.contains(document.activeElement);this.detach(t,n),n?._kind===`stack`&&this.stackChanged(n),this.screenGone(t,r)}detach(e,t){e._dying||e._removedFrom||(e._kind===`screen`&&t?._kind===`stack`?(e._removedFrom=t,this.changedStacks.add(t)):this.layoutAnimation?.delete&&t&&!this.navigated(e,t)?(e._dying=!0,e.style.pointerEvents=`none`,this.disappearing.push(e)):(e._removing=!0,this.removals.push(e)))}op_d([,e]){let t=this.view(e);if(!t)return;if(this.views.delete(e),this.mouseTracked.delete(e),t._shader&&this.dropShader(t),t._video&&(clearInterval(t._progressTimer),t._video.pause(),t._video.removeAttribute(`src`),t._video.load()),t._kind===`modal`){this.dismiss(t);return}let n=t.parentNode,r=t.contains(document.activeElement);this.detach(t,n),n?._kind===`stack`&&this.stackChanged(n),this.screenGone(t,r)}screenGone(e,t){let n=e._restoreFocus;e._restoreFocus=null;let r=document.activeElement;n?.isConnected&&(t||!r||r===document.body)&&n.focus({preventScroll:!0})}op_f([,e,t,n,r,i]){let a=this.view(e);if(!a||a._kind===`modal`)return;let o=this.layoutAnimation?.update,s=o&&a._frame&&!a._track&&!this.navigated(a,a.parentNode)?this.shownFrame(a):null;a._frameAnimation?.cancel(),a._frameAnimation=null;let c=!a._frame||a._frame[2]!==r||a._frame[3]!==i;if(a._frame=[t,n,r,i],this.placeFrame(a),s&&s.some((e,t)=>e!==a._frame[t])){let e=e=>({left:`${e[0]}px`,top:`${e[1]}px`,width:`${e[2]}px`,height:`${e[3]}px`}),t=this.animateLayout(a,[e(s),e(a._frame)],o);t.onfinish=()=>{a._frameAnimation===t&&(a._frameAnimation=null)},a._frameAnimation=t}if(a._kind===`canvas`&&c&&this.drawSoon(a),a._shader&&this.shaderDirty(a),a._kind===`stack`)for(let e of a.children)e._kind===`screen`&&this.reportRoot(e,r,i,this.screenInsets(e))}placeFrame(e){if(e===this.root&&this.frameSession)return;let t=e._frame;if(!t)return;if(e._track){this.placeTrack(e);return}let n=e.style;n.left=`${t[0]}px`,n.top=`${t[1]}px`,n.width=`${t[2]}px`,n.height=`${t[3]}px`}styleClass(e){return e&&e.charCodeAt(0)===105?this.classPrefix+e:e}op_css([,e,t]){let n=e.charCodeAt(0)===105;_(n?this.classPrefix+e:e,t,n)}op_s([,e,t,n,r]){let i=this.view(e);i&&(y(i,`_class`,this.styleClass(t)),n?(i._border||=document.createElement(`div`),i._border.className=`nsh-border ${this.styleClass(n)}`,i._animation[`border-color`]&&(i._border.style.borderColor=i._animation[`border-color`]),i.append(i._border)):i._border&&=(i._border.remove(),null),i._kind===`image`&&(i._tint=r,this.applyTint(i)))}op_a([,e,t,n]){let r=this.view(e);if(r){if(t.startsWith(`canvas:`)&&r._shader)this.shaderSlot(r,Number(t.slice(7)),n);else if(t.startsWith(`canvas:`)){let e=Number(t.slice(7)),i=isNaN(Number(n))?n:Number(n);if(r._slots[e]===i)return;r._slots[e]=i,this.drawSoon(r)}else if(t===`sticky-offset`){let e=Number(n);if(r._stickyOffset===e)return;r._stickyOffset=e,r._track&&this.placeTrack(r)}else if((t===`border-color`||t===`color`?r._animation[t]:r.style.getPropertyValue(t))!==n){if(r._animation[t]=n,t===`border-color`)r._border&&(r._border.style.borderColor=n);else if(t===`color`)for(let e of r.querySelectorAll(`:scope > .nsh-run`))e.style.color=n;else r.style.setProperty(t,n)}}}op_t([,e,t,n,,,r,i,a,o,s,c,l]){let u=this.view(e);u&&(b(u,s??null),this.updateRuns(u,t,n,r,i,c,l)||this.replaceRuns(u,t,n,r,i,c,l),u.classList.toggle(`nsh-selectable`,!!a),u.classList.toggle(`nsh-autoselect`,a==null),u.classList.toggle(`nsh-noselect`,a===!1),y(u,`_selection`,this.styleClass(o)),u._textLabel=r.map(e=>e[2]).join(``),u._props?.label??u.setAttribute(`aria-label`,u._textLabel))}updateRuns(e,t,n,r,i,a,o){if(a?.length||o?.length||!r.length)return!1;let s=[];for(let t of e.children){if(t.classList.contains(`nsh-run-bg`))return!1;t.classList.contains(`nsh-run`)&&s.push(t)}if(s.length!==r.length)return!1;for(let e=0;e<r.length;e++){let[,,t,,,n]=r[e],i=s[e].firstChild;if(n||!t||!i||i.nodeType!==3||i.nextSibling)return!1}return r.forEach(([e,r,a,o,c,,l],u)=>{let d=s[u],f=this.styleClass(i[o]),p=f?`nsh-run ${f}`:`nsh-run`;d.className!==p&&(d.className=p);let m=`${t+e}px`,h=`${n+r}px`;d.style.left!==m&&(d.style.left=m),d.style.top!==h&&(d.style.top=h),d.firstChild.data!==a&&(d.firstChild.data=a),d._start=c,l?d._after=l:delete d._after}),!0}replaceRuns(e,t,n,r,i,a,o){let s=document.createDocumentFragment();for(let[e,r,i,o,c,l]of a??[]){let a=document.createElement(`div`);a.className=`nsh-run-bg`,a.style.cssText=`left:${t+e}px;top:${n+r}px;width:${i}px;height:${o}px;border-radius:${c}px;background:${l}`,s.append(a)}let c=(o??[]).map(([e,t])=>({node:e,events:new Set(t)}));for(let[a,o,l,u,d,f,p]of r){let r=document.createElement(`span`),m=this.styleClass(i[u]);r.className=m?`nsh-run ${m}`:`nsh-run`,r.style.cssText=`left:${t+a}px;top:${n+o}px`,x(r,l,f,c),r._start=d,p&&(r._after=p),e._animation.color&&(r.style.color=e._animation.color),s.append(r)}for(let t of[...e.querySelectorAll(`:scope > .nsh-run, :scope > .nsh-run-bg`)])t.remove();e.insertBefore(s,e.firstChild)}op_e([,n,r]){let i=this.view(n);i&&(i._events=new Set(r),i._events.has(`onMouseMove`)?this.mouseTracked.add(n):this.mouseTracked.delete(n),i._pressable=e.some(e=>i._events.has(e)),this.updateFocusable(i),this.updateTouchAction(i),i._kind===`scroll`&&i._events.has(`onRefresh`)&&this.installPull(i),!i._mouseEvents&&t.some(e=>i._events.has(e))&&this.installMouse(i))}installMouse(e){e._mouseEvents=!0,e.addEventListener(`pointerenter`,t=>{t.pointerType===`mouse`&&(e._hoverIn=!0,e._events.has(`onMouseEnter`)&&this.event(e._id,`onMouseEnter`,this.mouseEvent(e,t,!0)))}),e.addEventListener(`pointerleave`,t=>{e._hoverIn&&(e._hoverIn=!1,e._events.has(`onMouseLeave`)&&this.event(e._id,`onMouseLeave`,this.mouseEvent(e,t,!0)))})}mouseEvent(e,t,r=!1){let i=this.mousePoint(e,t);if(!i){if(!r)return null;let n=e.getBoundingClientRect();i=[t.clientX-n.left,t.clientY-n.top]}let[a,o]=this.point(t),s=n.find(([e])=>t.buttons&e);return{position:{x:i[0],y:i[1]},pagePosition:{x:a,y:o},modifiers:{control:!!t.ctrlKey,alt:!!t.altKey,shift:!!t.shiftKey,platform:!!t.metaKey},pressedButton:s?s[1]:null}}op_ts([,e,t]){let n=this.view(e);n&&(n._tracked=t,n._states=(n._states||0)&4,t&2&&!n._hoverListeners&&(n._hoverListeners=!0,n.addEventListener(`pointerenter`,e=>e.pointerType===`mouse`&&this.setState(n,2,!0)),n.addEventListener(`pointerleave`,()=>this.setState(n,2,!1))))}setState(e,t,n){if(!(((e._tracked||0)|4)&t))return;let r=e._states||0,i=n?r|t:r&~t;i!==r&&(e._states=i,this.call(t=>t.nsh_states(e._id,i)))}op_vp([,e,t]){let n=this.view(e);if(!n)return;n._props=t,t.testID?n.dataset.testid=t.testID:delete n.dataset.testid;let r=t.pointerEvents;n.classList.toggle(`nsh-inert`,r===`none`),n.classList.toggle(`nsh-box-none`,r===`box-none`),n.classList.toggle(`nsh-area`,!!t.selectableView),this.updateFocusable(n),this.updateTouchAction(n)}op_al([,e,t]){let n=this.view(e);n&&((n._props??={}).label=t,this.updateAria(n))}updateAria(e){let t=e._props??{},n=(t,n)=>n==null||n===!1?e.removeAttribute(t):e.setAttribute(t,String(n));n(`role`,a[t.role]??(t.role&&t.role!==`none`?t.role:e._pressable?`button`:null)),n(`aria-label`,t.label??e._textLabel),n(`aria-description`,t.hint),n(`aria-disabled`,t.disabled&&`true`),n(`aria-selected`,t.selected&&`true`),n(`aria-checked`,t.checked),n(`aria-busy`,t.busy&&`true`),n(`aria-expanded`,t.expanded),n(`aria-pressed`,t.pressed),n(`aria-current`,t.current),n(`aria-level`,t.level);let[r,i,o,s]=t.value??[];n(`aria-valuemin`,r),n(`aria-valuemax`,i),n(`aria-valuenow`,o),n(`aria-valuetext`,s),n(`aria-live`,t.live),n(`aria-hidden`,t.hidden&&`true`)}updateFocusable(e){let t=e._props,n=(t?.focusable??!!e._pressable)&&!t?.disabled&&!t?.hidden;n?e.tabIndex=0:e._a11yFocus?e.tabIndex=-1:e.hasAttribute(`tabindex`)&&e.removeAttribute(`tabindex`),!n&&!e._a11yFocus&&document.activeElement===e&&e.blur(),n&&!e._focusListeners&&(e._focusListeners=!0,e.addEventListener(`focus`,()=>{(e._focusCall||e.matches(`:focus-visible`))&&this.keyFocus(e)}),e.addEventListener(`blur`,()=>{this.setState(e,4,!1),e._keyFocus&&(e._keyFocus=!1,this.event(e._id,`onBlur`))})),this.updateAria(e)}keyFocus(e){e._keyFocus=!0,this.setState(e,4,!0),this.event(e._id,`onFocus`)}focusPressable(e){if(e.tabIndex===0){if(document.activeElement===e)e._keyFocus||this.keyFocus(e);else{e._focusCall=!0;try{e.focus({focusVisible:!0})}finally{e._focusCall=!1}}}}updateTouchAction(e){let t=e._gestures?.pan||e._events.has(`onPanStart`)||e._events.has(`onPanEnd`),n=e._gestures?.pinch||e._gestures?.rotation;e.classList.toggle(`nsh-press`,!!(e._pressable||t||n||e._events.has(`onTouch`)));let r=e._props?.panActivation,i=r&&r[0]!=null&&r[1]==null,a=r&&r[1]!=null&&r[0]==null;e.classList.toggle(`nsh-pan`,!!(n||t&&!i&&!a)),e.classList.toggle(`nsh-pan-x`,!n&&!!i),e.classList.toggle(`nsh-pan-y`,!n&&!!a)}op_la([,e,t,n]){this.layoutAnimation=this.reduceMotion()?null:{create:e,update:t,delete:n}}navigated(e,t){return o.has(e._kind)||t?._kind===`stack`}shownFrame(e){if(!e._frameAnimation)return e._frame;let t=getComputedStyle(e);return[t.left,t.top,t.width,t.height].map(e=>parseFloat(e)||0)}animateLayout(e,t,n,r=`backwards`){let i={duration:n.duration,delay:n.delay,easing:n.easing,fill:r};try{return e.animate(t,i)}catch{return e.animate(t,{...i,easing:`ease-out`})}}endLayoutAnimation(){let e=this.layoutAnimation;this.layoutAnimation=null;let t=this.appearing,n=this.disappearing;if(t.length&&(this.appearing=[]),n.length&&(this.disappearing=[]),e?.create)for(let n of t)n.parentNode&&!n._dying&&!this.navigated(n,n.parentNode)&&this.appear(n,e.create);for(let t of n){let n=t.parentNode;for(;n&&n!==this.root&&!n._dying;)n=n.parentNode;n?._dying?(t._dying=!1,t._leftWith=n):this.disappear(t,e.delete)}}appear(e,t){this.animateLayout(e,t.property===`scale`?{transform:[`scale(0.01)`,`scale(1)`],composite:`add`}:[{opacity:0,offset:0}],t)}disappear(e,t){let n=getComputedStyle(e).opacity,r=this.animateLayout(e,t.property===`scale`?{transform:[`scale(1)`,`scale(0.01)`],composite:`add`}:[{opacity:n},{opacity:0}],t,`both`);e._dying=r,r.onfinish=()=>{e._dying===r&&(e._dying=!1,r.cancel(),e.style.pointerEvents=``,e.remove(),this.dropLeftWith(e))}}revive(e){e._dying instanceof Animation&&e._dying.cancel(),e._dying=!1,e.style.pointerEvents=``,this.dropLeftWith(e)}dropLeftWith(e){for(let t of e.querySelectorAll(`.nsh-v`))t._leftWith===e&&(t._leftWith=null,t.style.pointerEvents=``,t.remove())}op_dir([,e]){this.root.dir=e?`rtl`:`ltr`}op_appearance([,e]){this.appearance=e,this.root.classList.toggle(`nsh-scheme-light`,e===1),this.root.classList.toggle(`nsh-scheme-dark`,e===2),this.updateRootClasses()}get shownDark(){return this.appearance?this.appearance===2:this.dark}op_img([,e,t,n,r,i,a,o]){let s=this.view(e);if(!s?._img)return;let c=s._img;s._fit=n,s._position=o||``,s._imgClass=`nsh-fill nsh-fit-${n}${i>0?` ${v(`filter:blur(${i}px);`)}`:``}${o?` ${v(`object-position:${o};`)}`:``}`,c.className=s._imgClass+(c.classList.contains(`nsh-hidden`)?` nsh-hidden`:``),s._fade=a;let l=r?this.asset(r):``;l&&!s._ph&&(s._ph=document.createElement(`img`),s._ph.draggable=!1,s.insertBefore(s._ph,c)),s._ph&&(s._ph.className=s._imgClass+(s._ph.classList.contains(`nsh-hidden`)?` nsh-hidden`:``),l?s._ph.getAttribute(`src`)!==l&&(s._ph.src=l):(s._ph.remove(),s._ph=null));let u=this.asset(t??``);s._src!==u&&(s._src=u,s._failed=!1,s._ph&&s._ph.classList.remove(`nsh-hidden`),u?(queueMicrotask(()=>s._events.has(`onLoadStart`)&&this.event(e,`onLoadStart`)),c.style.transition=``,c.style.opacity=a>0?`0`:``,c.src=u,c.complete&&(c.style.opacity=``),this.applyTint(s)):c.removeAttribute(`src`))}applyTint(e){if(e._img){if(e._tint&&e._src){e._img.classList.add(`nsh-hidden`);let t=e._fit,n=t===`fill`?`100% 100%`:t===`scale-down`?`contain`:t===`none`?`auto`:t||`cover`,r=`url(${JSON.stringify(e._src)}) ${e._position||`center`} / ${n} no-repeat`;y(e,`_tintClass`,v(`background-color:${e._tint};-webkit-mask:${r};mask:${r};`,3))}else e._img.classList.toggle(`nsh-hidden`,!!e._failed),y(e,`_tintClass`,null)}}imageLoaded(e,t){if(e._fade>0&&(t.style.transition=`opacity ${e._fade}ms linear`,t.style.opacity=``),e._ph){let t=e._ph;clearTimeout(e._phTimer),e._phTimer=setTimeout(()=>{e._ph===t&&t.classList.add(`nsh-hidden`)},e._fade>0?e._fade:0)}e._events.has(`onLoad`)&&this.event(e._id,`onLoad`,{width:t.naturalWidth,height:t.naturalHeight}),e._events.has(`onLoadEnd`)&&this.event(e._id,`onLoadEnd`)}imageFailed(e){e._failed=!0,e._img.classList.add(`nsh-hidden`),e._events.has(`onError`)&&this.event(e._id,`onError`,{message:`failed to load ${e._src}`}),e._events.has(`onLoadEnd`)&&this.event(e._id,`onLoadEnd`)}op_sh([,e,t]){let n=this.view(e);if(!n)return;if(!t){this.dropShader(n);return}let r=n._shader;r&&r.layer.role!==t.role&&this.dropShader(n);let i=n._shader,a=new Uint32Array(t.words),o=i&&i.layer.key===t.key&&JSON.stringify(i.layer.slots)===JSON.stringify(t.slots);if(o)for(let[e,n]of t.slots){let t=n===3?3:n===4?4:1;for(let n=0;n<t;n++)e+n<a.length&&(a[e+n]=i.words[e+n])}let s=performance.now();n._shader={layer:t,words:a,kept:i?i.kept+(i.since==null?0:s-i.since):0,since:t.paused?null:s,dirty:!0,progress:o&&i.moved?i.progress:t.progress,moved:o&&i.moved,running:i?.running??null,pictures:i?.pictures??[null,null,null,null],fresh:i?.fresh??[!1,!1,!1,!1],textures:i?.textures??[null,null,null,null],stale:0},n._shader.reads=t.pictures.reduce((e,[,t])=>e|1<<t,0);let c=t.role,l=c>=3?this.root:n,u=this.shaderDraws(t);if(c===3&&u?this.screenShader=n:this.screenShader===n&&(this.screenShader=null),!n._shaderCanvas){let e=document.createElement(`canvas`);e.className=c===0?`nsh-fill nsh-shader`:`nsh-fill nsh-fx-out`,e._shaderOutput=!0,c===0?n.insertBefore(e,n.firstChild):l.append(e),n._shaderCanvas=e,n._shaderVisible=!0,typeof IntersectionObserver<`u`&&c<3&&(n._shaderObserver=new IntersectionObserver(e=>{n._shaderVisible=e[e.length-1].isIntersecting,n._shaderVisible&&this.shaderDirty(n)}),n._shaderObserver.observe(n))}u?(c===1||c===3)&&l.classList.add(`nsh-fx`):this.endTransition(n),this.shaderViews.add(n),this.watchInputs(n),this.shaderDirty(n)}shaderHost(e){return e._shader&&e._shader.layer.role>=3?this.root:e}dropShader(e){let t=e._shader;if(!t)return;let n=this.shaderHost(e);this.screenShader===e&&(this.screenShader=null),(n!==this.root||!this.screenShader)&&n.classList.remove(`nsh-fx`),e._shaderCanvas?.remove(),e._shaderCanvas=null,e._shaderObserver?.disconnect(),e._shaderObserver=null,e._contentObserver?.disconnect(),e._contentObserver=null,e._contentMark&&=(n.removeEventListener(`scroll`,e._contentMark,!0),n.removeEventListener(`load`,e._contentMark,!0),null),this.freeTextures(t),e._shader=null,this.shaderViews.delete(e),this.backdrops?.delete(e),this.watchBackdrops()}op_shi([,e]){let t=this.view(e),n=t?._shader;n&&(n.stale|=n.reads,this.shaderDirty(t))}op_sht([,e,t]){let n=this.view(e),r=n?._shader;if(!r||r.layer.role!==2&&r.layer.role!==4||r.failed||!this.shaderDraws(r.layer))return;let i=this.shaderHost(n),a=this.shaderBox(n);if(!a)return;let o=this.pictureCanvas(n,2,a);r.running&&n._shaderCanvas.width?(o.cx.setTransform(1,0,0,1,0,0),o.cx.drawImage(n._shaderCanvas,0,0,o.canvas.width,o.canvas.height)):this.paintHost(o.cx,i,i.getBoundingClientRect(),null,i),r.fresh[2]=!0,r.running={start:performance.now(),ms:Math.max(1,t),reverse:!1},r.pictures[3]=null,r.fresh[3]=!0,r.stale|=8,i.classList.add(`nsh-fx`),this.renderShader(n,performance.now())?this.shaderDirty(n):this.shaderFailed(n)}op_shn([,e,t,n]){let r=this.view(e);r&&(r._navShader=t?{layer:t,ms:n}:null)}shaderNav(e,t,n,r,i){if(this.endNavShader(e),this.reduceMotion())return!1;let a=e.getBoundingClientRect();if(!a.width||!a.height||!this.shaderDraws(n.layer))return!1;let o=document.createElement(`div`);o.className=`nsh-nav-shader`,Object.assign(o.style,{position:`absolute`,left:`0`,top:`0`,width:`${a.width}px`,height:`${a.height}px`,zIndex:`2147483001`,pointerEvents:`none`});let s=document.createElement(`canvas`);s.className=`nsh-fill`,s._shaderOutput=!0,o.append(s);let c={...n.layer,role:2,overflow:0};o._frame=[0,0,a.width,a.height],o._shaderCanvas=s,o._shaderVisible=!0,o._shader={layer:c,words:new Uint32Array(c.words),kept:0,since:performance.now(),dirty:!0,progress:+!!r,running:{start:performance.now(),ms:Math.max(1,n.ms),reverse:r,done:()=>{o.remove(),e._navOverlay===o&&(e._navOverlay=null),i?.()}},pictures:[null,null,null,null],fresh:[!1,!1,!0,!0],textures:[null,null,null,null],stale:0,reads:0,nav:!0};let l=this.pictureCanvas(o,2,[a.width,a.height,0]);this.paintHost(l.cx,e,a,t,null);let u=this.pictureCanvas(o,3,[a.width,a.height,0]);return this.paintHost(u.cx,e,a,null,null),e.append(o),this.renderShader(o,performance.now())?(e._navOverlay=o,this.shaderViews.add(o),this.shaderDirty(o),!0):(o.remove(),this.freeTextures(o._shader),!1)}endNavShader(e){let t=e?._navOverlay;t?._shader?.running&&this.endTransition(t)}paintHost(e,t,n,r,i){this.watchPaint(),this.touchAll(this._paintObserver.takeRecords());let a=0;for(let e=t;e;e=e.parentElement)a=Math.max(a,e._touched??0);let o=t.classList.contains(`nsh-fx`);o&&(t.classList.add(`nsh-painting`),t.classList.remove(`nsh-fx`));try{this.paintTree(e,t,n,1,r,i,a)}finally{o&&(t.classList.add(`nsh-fx`),t.classList.remove(`nsh-painting`)),this._paintObserver.takeRecords()}}watchPaint(){this._paintObserver||(this.paintGen=0,this.paintReset=0,this._paintObserver=new MutationObserver(e=>this.touchAll(e)),this._paintObserver.observe(this.root,{subtree:!0,childList:!0,attributes:!0}),this._paintScheme=()=>{this.paintReset=++this.paintGen},globalThis.matchMedia?.(`(prefers-color-scheme: dark)`).addEventListener?.(`change`,this._paintScheme))}touchAll(e){for(let t of e)t.type!==`characterData`&&(t.target._touched=++this.paintGen)}paintStyle(e,t){let n=e._paintStyle;if(n&&n.stamp>=t&&n.stamp>=this.paintReset)return n;let r=getComputedStyle(e),i=r.backgroundColor,a=parseFloat(r.borderTopWidth)||0,o={stamp:this.paintGen,shown:r.display!==`none`,opacity:Number(r.opacity),hidden:r.visibility===`hidden`,radii:[r.borderTopLeftRadius,r.borderTopRightRadius,r.borderBottomRightRadius,r.borderBottomLeftRadius].map(e=>parseFloat(e)||0),background:i&&i!==`transparent`&&!/rgba\([^)]*,\s*0\)$/.test(i)?i:null,border:a>0&&r.borderTopStyle!==`none`&&r.borderTopStyle!==`hidden`?[a,r.borderTopColor]:null,clips:r.overflowX!==`visible`||r.overflowY!==`visible`,font:r.font,color:r.color,objectFit:r.objectFit};return e._paintStyle=o,o}shaderBox(e){let t=e._shader;return t.layer.role>=3?this.size?.[0]>0?[this.size[0],this.size[1],0]:null:e._frame?[e._frame[2],e._frame[3],Math.max(0,t.layer.overflow||0)]:null}pictureCanvas(e,t,[n,r,i]){let a=e._shader,o=devicePixelRatio||1,s=a.pictures[t]??=document.createElement(`canvas`),c=Math.max(1,Math.round((n+2*i)*o)),l=Math.max(1,Math.round((r+2*i)*o)),u=s.getContext(`2d`);return s.width!==c||s.height!==l?(s.width=c,s.height=l):(u.setTransform(1,0,0,1,0,0),u.clearRect(0,0,c,l)),u.setTransform(o,0,0,o,i*o,i*o),a.fresh[t]=!0,{canvas:s,cx:u}}watchInputs(e){let t=e._shader,n=t.layer.role,r=this.shaderHost(e),i=n!==0&&t.reads&(n===2||n===4?8:1),a=t.reads&2;if(i&&!e._contentObserver){let t=t=>{(!t||this.shownChange(t))&&e._shader&&(e._shader.stale|=e._shader.reads&9,this.shaderDirty(e))};e._contentObserver=new MutationObserver(t),e._contentObserver.observe(r,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,characterData:!0}),e._contentMark=()=>t(),r.addEventListener(`scroll`,e._contentMark,!0),r.addEventListener(`load`,e._contentMark,!0)}this.backdrops??=new Set,a?this.backdrops.add(e):this.backdrops.delete(e),this.watchBackdrops(),t.stale|=t.reads}shownChange(e){let t=e=>(e??``).split(` `).filter(e=>e&&e!==`nsh-fx`&&e!==`nsh-painting`).join(` `);return e.some(e=>!(e.target._shaderOutput||e.target.parentElement?._shaderOutput||e.type===`attributes`&&e.attributeName===`class`&&t(e.oldValue)===t(e.target.getAttribute(`class`))))}watchBackdrops(){let e=this.backdrops??new Set;for(let t of e)t._shader||e.delete(t);let t=e.size>0;if(t&&!this._backdropObserver){let e=e=>{if(!e||this.shownChange(e))for(let e of this.backdrops)e._shader&&(e._shader.stale|=2,this.shaderDirty(e))};this._backdropObserver=new MutationObserver(e),this._backdropObserver.observe(this.root,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,characterData:!0}),this._backdropMark=()=>e(),this.root.addEventListener(`scroll`,this._backdropMark,!0),this.root.addEventListener(`load`,this._backdropMark,!0)}else!t&&this._backdropObserver&&(this._backdropObserver.disconnect(),this.root.removeEventListener(`scroll`,this._backdropMark,!0),this.root.removeEventListener(`load`,this._backdropMark,!0),this._backdropObserver=this._backdropMark=null)}paintInputs(e){let t=e._shader,n=t.stale;t.stale=0;let r=t.layer.role,i=this.shaderBox(e);if(!n||!i||t.nav)return;let a=r===2||r===4,o=this.shaderHost(e),s=o.getBoundingClientRect();if(a?t.running&&n&8:r!==0&&n&1){let{cx:t}=this.pictureCanvas(e,a?3:0,i);this.paintHost(t,o,s,null,o)}if(n&2){let{cx:t}=this.pictureCanvas(e,1,i);this.paintHost(t,this.root,e.getBoundingClientRect(),e,this.root)}}paintTree(e,t,n,r,i,a,o=1/0){for(let s of t.children){if(s===i)return!0;if(s._shaderOutput&&(s.parentElement===a||s.classList.contains(`nsh-fx-out`)&&!s.parentElement.classList.contains(`nsh-fx`))||s.classList.contains(`nsh-nav-shader`))continue;let t=Math.max(o,s._touched??0),c=this.paintStyle(s,t);if(!c.shown)continue;let l=r*c.opacity;if(l<=0||c.hidden){if(i&&s.contains(i))return!0;continue}let u=s.getBoundingClientRect(),d=u.left-n.left,f=u.top-n.top,p=u.width,m=u.height,h=c.radii.map(e=>Math.min(e,p/2,m/2)),g=()=>{e.beginPath(),e.roundRect(d,f,p,m,h)};if(e.save(),e.globalAlpha=l,c.background&&(e.fillStyle=c.background,g(),e.fill()),c.border){let[t,n]=c.border;e.strokeStyle=n,e.lineWidth=t,e.beginPath(),e.roundRect(d+t/2,f+t/2,Math.max(0,p-t),Math.max(0,m-t),h.map(e=>Math.max(0,e-t/2))),e.stroke()}if(s.tagName===`IMG`)s.complete&&s.naturalWidth&&this.paintable(s)&&this.paintImage(e,s,c,d,f,p,m,h);else if(s.tagName===`CANVAS`)s.width&&s.height&&!s._tainted&&(e.save(),g(),e.clip(),e.drawImage(s,d,f,p,m),e.restore());else if(s.classList.contains(`nsh-run`)){e.font=c.font,e.fillStyle=c.color,e.textBaseline=`alphabetic`;let t=s.textContent,n=e.measureText(t);e.fillText(t,d,f+(n.fontBoundingBoxAscent??n.actualBoundingBoxAscent))}c.clips&&(g(),e.clip());let _=this.paintTree(e,s,n,l,i,a,t);if(e.restore(),_)return!0}return!1}paintable(e){let t=e.currentSrc||e.src;if(t.startsWith(`data:`))return!0;try{return new URL(t,location.href).origin===location.origin||e.crossOrigin!=null}catch{return!1}}paintImage(e,t,n,r,i,a,o,s){let c=t.naturalWidth,l=t.naturalHeight,u=a,d=o,f=n.objectFit;if(f===`contain`||f===`cover`||f===`scale-down`){let e=f===`cover`?Math.max(a/c,o/l):Math.min(a/c,o/l,f===`scale-down`?1:1/0);u=c*e,d=l*e}else f===`none`&&(u=c,d=l);e.save(),e.beginPath(),e.roundRect(r,i,a,o,s),e.clip(),e.drawImage(t,r+(a-u)/2,i+(o-d)/2,u,d),e.restore()}shaderSlot(e,t,n){let r=e._shader;if(t===r.layer.progressSlot){r.progress=Number(n),r.moved=!0,this.shaderDirty(e);return}let i=r.layer.slots[t];if(!i)return;let[a,o]=i;r.f32?.buffer!==r.words.buffer&&(r.f32=new Float32Array(r.words.buffer));let s=r.f32;if(o>=3){let e=I(n);for(let t=0;t<(o===3?3:4);t++)s[a+t]=e[t]}else o===0?s[a]=Number(n):r.words[a]=o===1?Math.trunc(Number(n))|0:Math.max(0,Math.trunc(Number(n)))>>>0;this.shaderDirty(e)}shaderDirty(e){e._shader&&(e._shader.dirty=!0),!this.shaderFrameQueued&&(this.shaderFrameQueued=!0,requestAnimationFrame(e=>this.shaderFrame(e)))}shaderFrame(e){this.shaderFrameQueued=!1;let t=this._shaderGl;t&&t.isContextLost()!==!!this._shaderLost&&(this._shaderLost?this.shaderRestored():this.shaderLost());let n=!1,r=performance.now();for(let e of[...this.shaderViews]){let t=e._shader;if(!t){this.shaderViews.delete(e);continue}if(t.layer.role>=3&&!t.nav&&this.screenShown(e),!e.isConnected){(t.nav||t.running)&&this.endTransition(e);continue}if(t.running&&r-t.running.start>=t.running.ms){this.endTransition(e);continue}let i=t.layer.animated&&t.since!=null||!!t.running;e._shaderVisible&&(t.dirty||i||t.stale)&&(t.dirty=!1,!t.failed&&this.shaderDraws(t.layer)&&(t.stale&&this.paintInputs(e),this.renderShader(e,r)?n||=i:this.shaderFailed(e)))}n&&(this.shaderFrameQueued=!0,requestAnimationFrame(e=>this.shaderFrame(e)))}screenShown(e){let t=e.isConnected,n=e._shaderCanvas;n&&n.hidden!==!t&&(n.hidden=!t,e._shader.layer.role===3&&(t&&!e._shader.failed&&this.shaderDraws(e._shader.layer)?this.screenShader=e:this.screenShader===e&&(this.screenShader=null),this.root.classList.toggle(`nsh-fx`,!!this.screenShader)))}shaderFailed(e){e._shader.failed=!0,this.screenShader===e&&(this.screenShader=null),this.endTransition(e)}endTransition(e){let t=e._shader,n=t.running;if(t.running=null,t.nav){this.freeTextures(t),this.shaderViews.delete(e),n?.done?.();return}let r=this.shaderHost(e);(r!==this.root||!this.screenShader)&&r.classList.remove(`nsh-fx`),t.pictures[2]=t.pictures[3]=null,this.freeTextures(t,[2,3]);let i=e._shaderCanvas;i._bitmap?.transferFromImageBitmap(null),i.width=0}freeTextures(e,t=[0,1,2,3]){let n=this._shaderGl;for(let r of t){let t=e.textures[r];t&&n&&n.deleteTexture(t),e.textures[r]=null}}shaderGl(){if(this._shaderGl!==void 0)return this._shaderGl;let e=typeof OffscreenCanvas<`u`?new OffscreenCanvas(1,1):document.createElement(`canvas`),t=e.getContext(`webgl2`,{premultipliedAlpha:!0,antialias:!1,preserveDrawingBuffer:!1});return t?(e.addEventListener(`webglcontextlost`,e=>{e.preventDefault(),this.shaderLost()}),e.addEventListener(`webglcontextrestored`,()=>this.shaderRestored())):console.warn(`[nsh] shaders: no WebGL 2; shader views draw nothing`),this._shaderGl=t,this._shaderPrograms=new Map,t}shaderDraws(e){let t=this.shaderGl();return!!(t&&!t.isContextLost()&&this.shaderProgram(t,e))}shaderLost(){if(!this._shaderLost){this._shaderLost=!0,console.warn(`[nsh] shaders: the WebGL context was lost; shader views show their children until it is back`),this._shaderPrograms=new Map,this._emptyTexture=null,this.screenShader=null,this.root.classList.remove(`nsh-fx`);for(let e of[...this.shaderViews]){let t=e._shader;t&&(t.textures=[null,null,null,null],this.endTransition(e))}}}shaderRestored(){if(this._shaderLost){this._shaderLost=!1,this._shaderPrograms=new Map,this._emptyTexture=null;for(let e of this.shaderViews){let t=e._shader;if(!t)continue;t.textures=[null,null,null,null],t.stale|=t.reads;let n=t.layer.role;(n===1||n===3)&&!t.failed&&e.isConnected&&this.shaderDraws(t.layer)&&(n===3&&(this.screenShader=e),this.shaderHost(e).classList.add(`nsh-fx`)),this.shaderDirty(e)}}}shaderProgram(e,t){let n=this._shaderPrograms.get(t.key);if(n!==void 0)return n;let r=(t,n)=>{let r=e.createShader(t);return e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(console.warn(`[nsh] shader:`,e.getShaderInfoLog(r)),null)},i=null,a=r(e.VERTEX_SHADER,t.vs),o=a&&r(e.FRAGMENT_SHADER,t.fs);o&&(i=e.createProgram(),e.attachShader(i,a),e.attachShader(i,o),e.linkProgram(i),e.getProgramParameter(i,e.LINK_STATUS)||(console.warn(`[nsh] shader:`,e.getProgramInfoLog(i)),i=null));let s=null;if(i){let n=(t,n)=>{if(!t)return null;let r=e.getUniformBlockIndex(i,t);return r===e.INVALID_INDEX?null:(e.uniformBlockBinding(i,r,n),e.createBuffer())},r=(t.pictures??[]).map(([t,n])=>[e.getUniformLocation(i,t),n]);s={program:i,builtins:n(t.nsh,0),uniforms:n(t.u,1),samplers:r,vao:e.createVertexArray()}}return this._shaderPrograms.set(t.key,s),s}shaderTexture(e,t,n){let r=t.pictures[n];if(!r)return this._emptyTexture||(this._emptyTexture=e.createTexture(),e.bindTexture(e.TEXTURE_2D,this._emptyTexture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,1,1,0,e.RGBA,e.UNSIGNED_BYTE,new Uint8Array(4))),this._emptyTexture;let i=t.textures[n];if(i||(i=t.textures[n]=e.createTexture(),t.fresh[n]=!0),e.bindTexture(e.TEXTURE_2D,i),t.fresh[n]){t.fresh[n]=!1,e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0);try{e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,r)}finally{e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1)}for(let[t,n]of[[e.TEXTURE_MIN_FILTER,e.LINEAR],[e.TEXTURE_MAG_FILTER,e.LINEAR],[e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE],[e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE]])e.texParameteri(e.TEXTURE_2D,t,n)}return i}renderShader(e,t){try{return this.drawShader(e,t),!0}catch(e){return console.warn(`[nsh] shader:`,e),!1}}drawShader(e,t){let n=e._shader,r=this.shaderGl();if(!r)return;let i=this.shaderBox(e);if(!i)return;let a=this.shaderProgram(r,n.layer);if(!a)return;let o=n.layer.role;if((o===2||o===4)&&!n.running)return;let[s,c,l]=i,u=(devicePixelRatio||1)*Math.min(4,this.zoomOf(e));u=Math.min(u,4096/Math.max(s+2*l,c+2*l,1));let d=Math.max(1,Math.round((s+2*l)*u)),f=Math.max(1,Math.round((c+2*l)*u)),p=r.canvas;(p.width!==d||p.height!==f)&&(p.width=d,p.height=f);let m=(n.kept+(n.since==null?0:t-n.since))/1e3,h=n.progress;if(n.running){let e=Math.min(1,Math.max(0,(t-n.running.start)/n.running.ms));h=n.running.reverse?1-e:e}if(r.viewport(0,0,d,f),r.useProgram(a.program),r.bindVertexArray(a.vao),a.builtins){r.bindBuffer(r.UNIFORM_BUFFER,a.builtins);let e=n.builtins??=new Float32Array(8);e.set([s,c,Math.max(0,m),d/Math.max(s+2*l,1e-6),h,l,0,0]),r.bufferData(r.UNIFORM_BUFFER,e,r.DYNAMIC_DRAW),r.bindBufferBase(r.UNIFORM_BUFFER,0,a.builtins)}a.uniforms&&(r.bindBuffer(r.UNIFORM_BUFFER,a.uniforms),r.bufferData(r.UNIFORM_BUFFER,n.words,r.DYNAMIC_DRAW),r.bindBufferBase(r.UNIFORM_BUFFER,1,a.uniforms)),a.samplers.forEach(([e,t],i)=>{r.activeTexture(r.TEXTURE0+i),r.bindTexture(r.TEXTURE_2D,this.shaderTexture(r,n,t)),r.uniform1i(e,i)}),r.disable(r.BLEND),r.clearColor(0,0,0,0),r.clear(r.COLOR_BUFFER_BIT),r.drawArrays(r.TRIANGLES,0,3);let g=e._shaderCanvas;if((g.width!==d||g.height!==f)&&(g.width=d,g.height=f),o!==0&&o<3){let e=g.style,t=`${-l}px`;(e.left!==t||e.width!==`${s+2*l}px`||e.height!==`${c+2*l}px`)&&([e.left,e.top,e.width,e.height]=[t,t,`${s+2*l}px`,`${c+2*l}px`])}p.transferToImageBitmap?(g._bitmap??=g.getContext(`bitmaprenderer`),g._bitmap.transferFromImageBitmap(p.transferToImageBitmap())):(g._2d??=g.getContext(`2d`),g._2d.clearRect(0,0,d,f),g._2d.drawImage(p,0,0));let _=this.screenShader;_&&_!==e&&_._shader&&o!==3&&!n.nav&&(_._shader.stale|=1,_._shader.dirty||this.shaderDirty(_))}op_sc([,e,t,n,,r]){let i=this.view(e);i&&(i._horizontal=t,i._indicator=n,i._replaced=r,this.scrollOverflow(i),i.classList.toggle(`nsh-noindicator`,!n),i._bar&&!this.barShown(i)&&this.showBar(i))}op_scs([,e,t,n]){let r=this.view(e);if(r?._spacer){r._content=[t,n],this.placeLayer(r),this.snapMarkers(r);for(let e of r._tracks?.values()??[])this.placeTrack(e)}}op_sb([,e,t,n]){let r=this.view(e);if(!r)return;if(r._applied++,r._smooth){r._smooth=[r._smooth[0]+t,r._smooth[1]+n],r.scrollTo({left:r._smooth[0],top:r._smooth[1],behavior:`smooth`});return}let i=r._glide;i&&(i.x+=t,i.y+=n,i.at&&=[i.at[0]+t,i.at[1]+n]),r.scrollLeft+=t,r.scrollTop+=n}op_sbh([,e,t]){let n=this.view(e);if(!n)return;let r=n._behavior?.refreshIndicator?.height!==t.refreshIndicator?.height;n._behavior=t,r&&n._refreshing&&!n._pulling&&n._pull>0&&this.animatePull(n,this.refreshSpace(n)),r&&this.updateSpinner(n),this.zooms(n)&&(this.ensureLayer(n),n._zoom=Math.min(Math.max(n._zoom,t.minZoom),t.maxZoom),this.placeLayer(n)),this.scrollOverflow(n),this.snapMarkers(n)}scrollOverflow(e){let t=e._behavior?.enabled===!1?`hidden`:`auto`,n=this.zooms(e);y(e,`_overflow`,t===`hidden`?`nsh-onone`:n?`nsh-oxy`:e._horizontal?`nsh-ox`:`nsh-oy`),e.classList.toggle(`nsh-zoom`,n)}snapMarkers(e){let t=e._behavior;for(let t of e._markers??[])t.remove();if(e._markers=[],e._snapPoints=null,e.classList.remove(`nsh-snap-x`,`nsh-snap-y`),!t||!e._content||!e._frame)return;let n=+!e._horizontal,r=e._frame[2+n],i=Math.max(0,e._content[n]-r),a=[];if(t.snapInterval>0){let e=t.snapInterval,n=t.snapAlignment===`center`?(r-e)/2:t.snapAlignment===`end`?r-e:0,o=Math.max(0,Math.ceil((i+n)/e));for(let t=0;t<=o;t++)a.push(Math.min(i,Math.max(0,t*e-n)))}else if(t.snapOffsets.length)a=t.snapOffsets.map(e=>Math.min(i,Math.max(0,e)));else if(t.paging&&r>0)for(let e=0;e<=Math.ceil(i/r);e++)a.push(Math.min(i,e*r));if(a.length){e._snapPoints=[...a].sort((e,t)=>e-t),e.classList.add(e._horizontal?`nsh-snap-x`:`nsh-snap-y`);for(let n of a){let r=document.createElement(`div`);r.className=t.paging||t.snapInterval>0?`nsh-snap nsh-snap-stop`:`nsh-snap`,r.style.cssText=e._horizontal?`left:${n}px`:`top:${n}px`,e.append(r),e._markers.push(r)}}}op_sticky([,e,t]){let n=this.view(e);if(!n)return;let r=n._tracks??=new Map,i=new Map(t.map(([e,t,n])=>[e,[t,n]]));n.classList.toggle(`nsh-sticky`,i.size>0);for(let[e,t]of r)i.has(e)&&this.view(e)===t||(r.delete(e),this.unstick(t));for(let[e,t]of i){let i=this.view(e);if(i){if(!i._track){i._frameAnimation?.cancel(),i._frameAnimation=null;let t=document.createElement(`div`);t.className=`nsh-track`,t._list=n;let a=n._layer??n,o=i.parentNode??a;t._page=o!==a,t._page&&o.classList.add(`nsh-sticky`),o.insertBefore(t,i.parentNode===o?i:null),t.append(i),i._track=t,r.set(e,i)}i._range=t,i._stickyOffset=void 0,this.placeTrack(i)}}}unstick(e){let t=e._track;e._track=null,e._range=null,e.parentNode===t?t.replaceWith(e):t.remove(),this.placeFrame(e)}trackOrigin(e,t){let n=e._list,r=0;for(let i=e.parentNode;i&&i!==n&&i!==n._layer;i=i.parentNode){let e=i._frame;e&&(r+=t?e[0]:e[1])}return r}placeTrack(e){let t=e._frame,n=e._range;if(!t||!n)return;let r=e._track._list,i=!!r._horizontal,[a,o]=i?[t[0],t[2]]:[t[1],t[3]],s=e._track._page,c=s?this.trackOrigin(e._track,i):0,l=r._content?.[+!i]??0,u=s?n[1]-n[0]:Math.min(n[1]-n[0],l-a-o),d=o+Math.max(0,u),f=e._track.style;f.left=`${t[0]}px`,f.top=`${t[1]}px`,f.width=`${i?d:0}px`,f.height=`${i?0:d}px`;let p=e.style,m=`${a+c-n[0]+(e._stickyOffset??0)}px`;p.left=i?m:`auto`,p.top=i?`auto`:m,p.width=`${t[2]}px`,p.height=`${t[3]}px`}barShown(e){return this.desktopUI&&e._kind===`scroll`&&!this.zooms(e)&&e._behavior?.enabled!==!1&&!!(e._indicator||e._horizontal&&!e._replaced)}barThumb(e){let t=!!e._horizontal,n=t?e.clientWidth:e.clientHeight,r=t?e.scrollWidth:e.scrollHeight;if(r<=n+.5||n<=8)return null;let i=n-4,a=Math.min(i,Math.max(32,i*n/r)),o=r-n;return[2+Math.min(Math.max((t?e.scrollLeft:e.scrollTop)/o,0),1)*(i-a),a,i-a,o]}showBar(e){let t=this.barShown(e)?this.barThumb(e):null;if(!t){e._bar&&(e._bar.firstChild.style.opacity=`0`);return}e._bar||(e._bar=document.createElement(`div`),e._bar.className=`nsh-bar`,e._bar.append(document.createElement(`div`)),e.insertBefore(e._bar,e.firstChild));let[n,r]=t,i=(e._horizontal?e.clientHeight:e.clientWidth)-4-2;e._bar.firstChild.style.cssText=e._horizontal?`left:${n}px;top:${i}px;width:${r}px;height:4px`:`left:${i}px;top:${n}px;width:4px;height:${r}px`,clearTimeout(e._barTimer),e._barHeld||(e._barTimer=setTimeout(()=>e._bar&&(e._bar.firstChild.style.opacity=`0`),700))}barHit(e,t){if(!this.barShown(e))return!1;let n=this.barThumb(e);if(!n)return!1;let r=e.getBoundingClientRect(),[i,a]=[t.clientX-r.left,t.clientY-r.top],[o,s,c]=e._horizontal?[i,a,e.clientHeight]:[a,i,e.clientWidth];return s>=c-12&&s<=c&&o>=n[0]-4&&o<=n[0]+n[1]+4}hoverBar(e,t){this.barHit(e,t)&&this.showBar(e)}grabBar(e){let t=this.viewOf(e.target);if(!t)return!1;for(let n of this.ancestors(t)){if(!this.barHit(n,e))continue;let t=!!n._horizontal;return e.preventDefault(),n._barHeld=!0,n.style.scrollSnapType=`none`,this.drive(n,1),this.scrollEvent(n,`onScrollDragStart`),this.pointers.set(e.pointerId,{mode:`bar`,scroll:n,start:t?e.clientX:e.clientY,offset:t?n.scrollLeft:n.scrollTop,touchPath:[],states:[]}),this.showBar(n),!0}return!1}dragBar(e,t){let n=e.scroll,r=this.barThumb(n);if(!r||r[2]<=0)return;let i=((n._horizontal?t.clientX:t.clientY)-e.start)*(r[3]/r[2]);n._horizontal?n.scrollLeft=e.offset+i:n.scrollTop=e.offset+i}releaseBar(e){e._barHeld=!1,this.scrollEvent(e,`onScrollDragEnd`),this.drive(e,-1),e._restoreSnap=!0,(!e._snapPoints||!this.snapTo(e,this.snapPoint(e,0)))&&(e._restoreSnap=!1,e.style.scrollSnapType=``,this.ownEnd(e)),this.showBar(e)}scrolled(e){e._commandEnd&&this.waitCommandEnd(e),this.desktopUI&&this.showBar(e),e._released&&!e._momentum&&performance.now()-e._released<150&&(e._momentum=!0,this.scrollEvent(e,`onMomentumStart`)),this.call(t=>t.nsh_scroll(e._id,e.scrollLeft,e.scrollTop-(e._pull??0),e._applied))}scrollEnded(e){if(clearTimeout(e._commandEnd),e._commandEnd=0,e._smooth=null,e._driven||e._touchDrag)return;let t=e._ownEnd;e._ownEnd=null,!(t&&t[0]===e.scrollLeft&&t[1]===e.scrollTop)&&(e._released=0,e._restoreSnap&&(e._restoreSnap=!1,e.style.scrollSnapType=``),e._momentum&&(e._momentum=!1,this.scrollEvent(e,`onMomentumEnd`)),this.scrollEvent(e,`onScrollEnd`))}ensureLayer(e){if(e._layer)return e._layer;let t=document.createElement(`div`);t.className=`nsh-layer`;for(let n of[...e.children])(n._id!==void 0||n._list)&&t.append(n);return e.insertBefore(t,e._spacer.nextSibling),e._layer=t,e._zoom=1,e._pull=0,t}zooms(e){let t=e._behavior;return e._kind===`scroll`&&!!t&&t.maxZoom>t.minZoom}layerOffset(e){if(!e._behavior?.centerContent||!e._frame||!e._content)return[0,0];let t=e._zoom??1;return[Math.max(0,(e._frame[2]-e._content[0]*t)/2),Math.max(0,(e._frame[3]-e._content[1]*t)/2)]}placeLayer(e){let[t,n]=e._content??[1,1],r=e._zoom??1,i=e._pull??0;if(e._spacer.style.width=`${t*r}px`,e._spacer.style.height=`${n*r+i}px`,!e._layer)return;let[a,o]=this.layerOffset(e);e._layer.style.transform=`translate(${a}px, ${o+i}px)${r===1?``:` scale(${r})`}`}zoomOf(e){let t=1;for(let n=e.parentNode;n&&n!==this.root;n=n.parentNode)n._layer&&n._zoom&&(t*=n._zoom);return t}zoomContent(e,t,n,r,i,a){e._zoom=t,this.placeLayer(e);let[o,s]=this.layerOffset(e);e.scrollLeft=n*t+o-i,e.scrollTop=r*t+s-a,this.call(n=>n.nsh_zoom(e._id,t)),this.scrolled(e)}contentPoint(e,t,n){let[r,i]=this.layerOffset(e),a=e._zoom??1;return[(e.scrollLeft+t-r)/a,(e.scrollTop+n-i)/a]}limitZoom(e,t,n){let r=e._behavior,i=r.minZoom,a=Math.max(r.maxZoom,i);return t>a?n&&r.bouncesZoom?a*(t/a)**.3:a:t<i?n&&r.bouncesZoom?i*(t/i)**.3:i:t}animateZoom(e,t,n,r,i,a,o){cancelAnimationFrame(e._zoomAnimation);let s=e._zoom,[c,l]=this.contentPoint(e,i,a),u=performance.now(),d=f=>{let p=Math.min(1,(f-u)/250),m=1-(1-p)**3;this.zoomContent(e,s+(t-s)*m,c+(n-c)*m,l+(r-l)*m,i,a),p<1?e._zoomAnimation=requestAnimationFrame(d):o?.()};e._zoomAnimation=requestAnimationFrame(d)}zoomEnded(e,t,n){let r=()=>{for(let t of e._layer?.querySelectorAll(`canvas`)??[]){let e=this.viewOf(t);e&&this.drawSoon(e)}},i=this.limitZoom(e,e._zoom,!1);if(Math.abs(i-e._zoom)>.001){let[a,o]=this.contentPoint(e,t,n);this.animateZoom(e,i,a,o,t,n,r)}else r()}zoomCommand(e,t,n,r,i){if(!this.zooms(e)||!e._frame)return;let a=this.limitZoom(e,t,!1),o=e._frame[2]/2,s=e._frame[3]/2,[c,l]=this.contentPoint(e,o,s),u=n??c,d=r??l;i?this.animateZoom(e,a,u,d,o,s,()=>this.zoomEnded(e,o,s)):(this.zoomContent(e,a,u,d,o,s),this.zoomEnded(e,o,s))}wheelZoom(e){let t=this.ancestors(this.viewOf(e.target)).find(e=>this.zooms(e)&&e._behavior.pinch);if(!t)return!1;let n=t.getBoundingClientRect(),r=e.clientX-n.left,i=e.clientY-n.top,a=e.deltaMode===1?e.deltaY*33:e.deltaY,o=Math.abs(a)>=50?1.25**-Math.sign(a):Math.exp(-a*.01),[s,c]=this.contentPoint(t,r,i);return cancelAnimationFrame(t._zoomAnimation),this.zoomContent(t,this.limitZoom(t,t._zoom*o,!1),s,c,r,i),clearTimeout(t._wheelZoomTimer),t._wheelZoomTimer=setTimeout(()=>this.zoomEnded(t,r,i),200),!0}gestureZoom(e,t){let n=t===0?this.ancestors(this.viewOf(e.target)).find(e=>this.zooms(e)&&e._behavior.pinch):this.gesture;if(!n)return;e.preventDefault();let r=n.getBoundingClientRect(),i=(e.clientX??r.left+r.width/2)-r.left,a=(e.clientY??r.top+r.height/2)-r.top;t===0&&(this.gesture=n,n._gestureStart=n._zoom);let[o,s]=this.contentPoint(n,i,a);this.zoomContent(n,this.limitZoom(n,n._gestureStart*e.scale,!0),o,s,i,a),t===2&&(this.gesture=null,this.zoomEnded(n,i,a))}op_ref([,e,t]){let n=this.view(e);n&&n._kind===`scroll`&&!n._horizontal&&(this.ensureLayer(n),n._refreshing=t,n._pulling||(t&&n.scrollTop<=.5?this.animatePull(n,this.refreshSpace(n)):!t&&n._pull>0&&this.animatePull(n,0)),this.updateSpinner(n))}refreshThreshold(e){return e._behavior?.refreshIndicator?.height??64}refreshSpace(e){return e._behavior?.refreshIndicator?.height??56}refreshable(e){return e._kind===`scroll`&&!e._horizontal&&!this.zooms(e)&&(e._events.has(`onRefresh`)||e._refreshing)}installPull(e){if(this.ensureLayer(e),e._pullTouch)return;e._pullTouch=!0;let t=null;e.addEventListener(`touchstart`,n=>{t=n.touches.length===1&&this.refreshable(e)&&e._behavior?.enabled!==!1?{y:n.touches[0].clientY,v:e.scrollTop-e._pull,pulling:!1}:null},{passive:!0}),e.addEventListener(`touchmove`,n=>{if(!t||n.touches.length!==1)return;let r=t.v-(n.touches[0].clientY-t.y);r>=0&&e._pull<=0||(n.cancelable?(n.preventDefault(),t.pulling||(t.pulling=!0,e._pulling=!0,cancelAnimationFrame(e._pullAnimation)),this.dragPull(e,r)):t=null)},{passive:!1});let n=()=>{t?.pulling&&(e._pulling=!1,this.releasePull(e)),t=null};e.addEventListener(`touchend`,n),e.addEventListener(`touchcancel`,n)}dragPull(e,t){if(t>=0){this.setPull(e,0),e.scrollTop=t;return}e.scrollTop=0;let n=-t,r=this.refreshSpace(e);this.setPull(e,e._refreshing?Math.min(n,r)+Math.max(0,n-r)*.5:n*.5)}releasePull(e){!e._refreshing&&e._events.has(`onRefresh`)&&e._pull>=this.refreshThreshold(e)&&(e._refreshing=!0,this.event(e._id,`onRefresh`)),this.animatePull(e,e._refreshing&&e._pull>0?this.refreshSpace(e):0)}setPull(e,t){t!==e._pull&&(e._pull=t,this.placeLayer(e),this.updateSpinner(e),this.scrolled(e),this.call(n=>n.nsh_pull(e._id,t)))}animatePull(e,t){cancelAnimationFrame(e._pullAnimation);let n=e._pull??0;if(n===t)return;let r=performance.now(),i=a=>{let o=Math.min(1,(a-r)/250);this.setPull(e,n+(t-n)*(1-(1-o)**3)),o<1&&(e._pullAnimation=requestAnimationFrame(i))};e._pullAnimation=requestAnimationFrame(i)}updateSpinner(e){let t=e._pull>0&&!e._behavior?.refreshIndicator,n=e._spinner;if(!t){n?.classList.add(`nsh-gone`);return}if(!n){n=e._spinner=document.createElement(`div`),n.className=`nsh-spinner`;for(let e=0;e<8;e++)n.append(document.createElement(`i`));e.append(n)}n.classList.remove(`nsh-gone`),n.style.top=`${e._pull-this.refreshSpace(e)/2-10}px`;let r=e._refreshing?1:Math.min(1,e._pull/this.refreshThreshold(e)),i=Math.min(8,Math.ceil(r*8));[...n.children].forEach((e,t)=>e.classList.toggle(`nsh-hidden`,t>=i)),n.classList.toggle(`full`,r>=1),n.classList.toggle(`spin`,!!e._refreshing)}op_cv([,e,t]){let n=this.view(e);n&&(n._ops=t,this.drawSoon(n))}drawSoon(e){e._drawQueued||(e._drawQueued=!0,queueMicrotask(()=>{e._drawQueued=!1,this.draw(e)}))}draw(e){let t=e._canvas;if(!t||!e._frame||!e._ops)return;let n=(devicePixelRatio||1)*Math.min(4,this.zoomOf(e)),[,,r,i]=e._frame,a=Math.max(1,Math.round(r*n)),o=Math.max(1,Math.round(i*n));(t.width!==a||t.height!==o)&&(t.width=a,t.height=o);let s=t.getContext(`2d`);s.setTransform(n,0,0,n,0,0),s.clearRect(0,0,r,i),s.save();let c=e._slots,l=e=>Array.isArray(e)&&e[0]===`$`?c[e[1]]??0:e,u=e=>{if(Array.isArray(e)&&e[0]===`$`)return c[e[1]]??`transparent`;if(e&&typeof e==`object`&&e.g){let t=e.args,n=e.g===`linear`?s.createLinearGradient(t[0],t[1],t[2],t[3]):e.g===`radial`?s.createRadialGradient(t[0],t[1],t[2],t[3],t[4],t[5]):s.createConicGradient(t[0],t[1],t[2]);for(let[t,r]of e.stops)n.addColorStop(Math.min(1,Math.max(0,t)),r);return n}return e},d=e=>{let t=new Path2D;for(let[n,...r]of e)n===`roundRect`?t.roundRect(...r.slice(0,4).map(l),r[4].map(l)):t[n](...r.map(l));return t};for(let[n,...r]of e._ops)try{if(n.startsWith(`=`)){let e=n.slice(1);s[e]=e.endsWith(`Style`)?u(r[0]):l(r[0])}else if(n===`fill`||n===`clip`)r[0]?s[n](d(r[0]),r[1]):s[n](r[1]);else if(n===`stroke`)r[0]?s.stroke(d(r[0])):s.stroke();else if(n===`shadowOffset`)s.shadowOffsetX=r[0],s.shadowOffsetY=r[1];else if(n===`roundRect`)s.roundRect(...r.slice(0,4).map(l),r[4].map(l));else if(n===`drawImage`){let n=this.canvasImage(r[0],e);if(!n)continue;this.paintable(n)||(t._tainted=!0);let i=r.slice(2).map(l);r[1]?s.drawImage(n,...r[1],...i):s.drawImage(n,...i)}else n===`fillText`||n===`strokeText`?s[n](r[0],...r.slice(1).map(l)):n===`setLineDash`?s.setLineDash(r[0]):typeof s[n]==`function`&&s[n](...r.map(l))}catch(e){console.warn(`[nsh] canvas`,n,e)}s.restore()}canvasImage(e,t){let n=this.asset(e),r=this.images.get(n);if(!r){let e=new Image;r={img:e,ready:!1,waiting:new Set},e.onload=()=>{r.ready=!0;for(let e of r.waiting)this.drawSoon(e)},e.src=n,this.images.set(n,r)}return r.ready||r.waiting.add(t),r.ready?r.img:null}op_g([,e,t,n,r]){let i=this.view(e);i&&(i._gestures={pan:t,pinch:n,rotation:r},this.updateTouchAction(i))}op_in([,e,t,n]){let r=this.view(e);if(!r)return;let i=r._field,a=t.multiline?`TEXTAREA`:`INPUT`;(!i||i.tagName!==a)&&(i?.remove(),i=document.createElement(a),i.className=`nsh-field`,i._count=0,i._known=``,this.wireInput(r,i),r._field=i,r.append(i),r._content&&this.placeContent(r)),y(i,`_class`,this.styleClass(n)),i.classList.toggle(`nsh-inset`,!r._content),i.placeholder=t.placeholder,t.multiline||(i.type=t.secure?`password`:t.keyboard===`email-address`?`email`:t.keyboard===`url`?`url`:t.keyboard===`phone-pad`?`tel`:`text`,i.inputMode={"number-pad":`numeric`,numeric:`decimal`,"decimal-pad":`decimal`,"numbers-and-punctuation":`text`,"phone-pad":`tel`,"email-address":`email`,url:`url`}[t.keyboard]??`text`),!t.multiline||t.submit!==`newline`?i.enterKeyHint={done:`done`,go:`go`,next:`next`,search:`search`,send:`send`}[t.returnKey]??`enter`:i.removeAttribute(`enterkeyhint`),i.readOnly=!t.editable,i.autocapitalize=t.autoCapitalize===`none`?`off`:t.autoCapitalize,i.spellcheck=t.autoCorrect,t.autoComplete==null?i.removeAttribute(`autocomplete`):i.setAttribute(`autocomplete`,t.autoComplete),t.maxLength==null?i.removeAttribute(`maxlength`):i.maxLength=t.maxLength,r._config=t,i.classList.toggle(`nsh-ph`,!!t.placeholderColor),i.classList.toggle(`nsh-noindicator`,!!t.noIndicator),this.inputScrolled(r,i),t.autoFocus&&!r._autoFocused&&(r._autoFocused=!0,setTimeout(()=>i.focus(),0))}wireInput(e,t){t.addEventListener(`input`,()=>this.textChanged(e,t)),t.addEventListener(`scroll`,()=>this.inputScrolled(e,t),{passive:!0}),typeof ResizeObserver==`function`&&new ResizeObserver(()=>this.inputScrolled(e,t)).observe(t),t.addEventListener(`compositionstart`,n=>{t._composing=!0,this.compositionChanged(e,t,n.data??``)}),t.addEventListener(`compositionupdate`,n=>this.compositionChanged(e,t,n.data??``)),t.addEventListener(`compositionend`,()=>{t._composing=!1,this.textChanged(e,t),this.compositionChanged(e,t,``);let n=t._pending;t._pending=null,n&&this.op_iv([,e._id,...n])}),t.addEventListener(`keydown`,n=>{if(e._events.has(`onKeyPress`)&&this.shortcut(n,!0)===-1){let t=n.key===`Backspace`||n.key===`Enter`||n.key===`Escape`||n.key.length===1?n.key:null;t&&this.event(e._id,`onKeyPress`,{key:t})}let r=e._config?.submit??`blurAndSubmit`,i=t.tagName===`TEXTAREA`&&(r===`newline`||n.shiftKey||n.altKey);n.key===`Enter`&&!i&&!n.isComposing&&n.keyCode!==229&&(n.preventDefault(),this.event(e._id,`onSubmitEditing`,{text:t.value,count:t._count}),r===`blurAndSubmit`&&t.blur())}),t.addEventListener(`focus`,()=>{this.setState(e,4,!0),this.event(e._id,`onFocus`)}),t.addEventListener(`blur`,()=>{this.setState(e,4,!1),this.event(e._id,`onBlur`)}),t.addEventListener(`select`,()=>this.selectionChanged(e,t)),t.addEventListener(`keyup`,()=>this.selectionChanged(e,t)),t.addEventListener(`pointerup`,()=>this.selectionChanged(e,t)),t.addEventListener(`scroll`,()=>this.caretMoved(e,t)),t.addEventListener(`paste`,t=>this.pasted(e,t))}inputScrolled(e,t){if(!e._config?.replaced||t.tagName!==`TEXTAREA`)return;let n=[t.scrollTop,t.clientWidth,t.scrollHeight,t.clientHeight];t._scrolled?.every((e,t)=>e===n[t])||(t._scrolled=n,this.call(t=>t.nsh_input_scroll(e._id,...n)))}textChanged(e,t){this.inputScrolled(e,t),t.value!==t._known&&(t._known=t.value,t._count++,this.event(e._id,`onChangeText`,{text:t.value,count:t._count}))}compositionChanged(e,t,n){let r=!!t._composing,i=t._composition;i&&i[0]===r&&i[1]===n||(t._composition=[r,n],e._events.has(`onCompositionChange`)&&this.event(e._id,`onCompositionChange`,{composing:r,text:n}))}selectionChanged(e,t){if(this.caretMoved(e,t),!e._events.has(`onSelectionChange`))return;let n=[t.selectionStart??0,t.selectionEnd??0];e._selection&&e._selection[0]===n[0]&&e._selection[1]===n[1]||(e._selection=n,this.event(e._id,`onSelectionChange`,{start:n[0],end:n[1]}))}pasted(e,t){if(e._config?.pasteInserts===!1&&t.preventDefault(),!e._events.has(`onPaste`))return;let n=t.clipboardData,r=n?.getData(`text/plain`)??``,i=n?.getData(`text/html`)??``,a=[...n?.files??[]],o=(n?.getData(`text/uri-list`)??``).split(/\r?\n/).filter(e=>e.startsWith(`file:`));Promise.all(a.map(e=>e.arrayBuffer())).then(t=>{let n=t.reduce((e,t)=>e+t.byteLength,0),s=new Uint8Array(n),c=0;for(let e of t)s.set(new Uint8Array(e),c),c+=e.byteLength;let l=JSON.stringify({text:r,html:i,files:a.map((e,n)=>({name:e.name||`image.png`,type:e.type,size:t[n].byteLength})),uris:o});this.call(()=>this.withStrings([l,s],(t,n,r,i)=>this.wasm.nsh_paste(e._id,t,n,r,i)))})}caretMoved(e,t){if(!e._events.has(`onCaretMove`)||document.activeElement!==t)return;let n=this.caretBounds(e,t),r=n.join();if(e._caret===r)return;e._caret=r;let[i,a,o,s]=n;this.event(e._id,`onCaretMove`,{bounds:{origin:{x:i,y:a},size:{width:o,height:s}}})}caretBounds(e,t){let n=getComputedStyle(t),r=t.tagName===`TEXTAREA`,a=this._caretMirror??=document.createElement(`div`),o=a.style;for(let e of i)o[e]=n[e];o.position=`absolute`,o.visibility=`hidden`,o.top=`0`,o.left=`-9999px`,o.overflow=`hidden`,o.whiteSpace=r?`pre-wrap`:`pre`,o.overflowWrap=r?`break-word`:`normal`,document.body.appendChild(a);let s=t.selectionEnd??t.value.length,c=t.value.slice(0,s);a.textContent=t.type===`password`?`•`.repeat(c.length):c;let l=document.createElement(`span`);l.textContent=t.value.slice(s)||`.`,a.appendChild(l);let u=parseFloat(n.fontSize)||16,d=parseFloat(n.lineHeight)||u*1.2,f=e=>parseFloat(n[`border${e}Width`])||0,p=l.offsetLeft+f(`Left`)-t.scrollLeft,m=r?l.offsetTop+f(`Top`)-t.scrollTop:(t.clientHeight-d)/2+f(`Top`);return a.remove(),p+=t.offsetLeft,m+=t.offsetTop,[p,m,1,d]}op_iv([,e,t,n]){let r=this.view(e)?._field;!r||n<r._count||(r._composing?r._pending=[t,n]:(r._known=t,r.value!==t&&(r.value=t)))}op_ic([,e,t,n,r,i]){let a=this.view(e);a&&(a._content=[t,n,r,i],this.placeContent(a))}placeContent(e){let t=e._field;if(!t||!e._content)return;let[n,r,i,a]=e._content;t.classList.remove(`nsh-inset`),t.style.left=`${n}px`,t.style.top=`${r}px`,t.style.width=`${i}px`,t.style.height=`${a}px`,this.caretMoved(e,t)}op_scr([,e,t,n,r,i]){let a=this.view(e);if(!a)return;a._screen={height:t,preventBack:n,header:r,animation:i},this.placeHeader(a);let o=a.parentNode;o?._kind===`stack`&&o._frame&&this.reportRoot(a,o._frame[2],o._frame[3],this.screenInsets(a))}placeHeader(e){let t=e._screen?.header,n=t==null?null:this.view(t);e._header&&e._header!==n&&e._header.remove(),e._header=n,n&&(n.classList.add(`nsh-page-header`),n.parentNode!==e&&e.append(n))}screenInsets(e){let t=this.safeProbe?this.safeArea():[0,0,0,0];return e._screen?.header==null?t:[0,t[1],t[2],t[3]]}goBack(e){if(e._events?.has(`onBackRequest`)&&this.event(e._id,`onBackRequest`),e._screen?.preventBack)return;let t=e.parentNode,n=t?[...t.children].filter(e=>e._kind===`screen`):[],r=n[n.indexOf(e)-1];r&&(clearTimeout(t._hideTimer),r.classList.remove(`nsh-hidden`),r.style.transform=``),t._top=r??null,e._popping=!0,this.moveScreens(e,r,!1,()=>this.event(e._id,`onDismiss`)),this.syncHistorySoon()}screensOf(e){return[...e.children].filter(e=>e._kind===`screen`&&!e._popping&&!e._removedFrom)}screenMotion(e){let t=e?._screen?.animation??`default`;return t===`none`?null:t===`fade`||this.reduceMotion()?{duration:200,fade:!0}:{duration:300,fade:!1}}moveScreens(e,t,n,r){let i=n?t:e,a=(t??e)?.parentNode;if(this.endNavShader(a),i?._navShader&&a&&(n||(e.style.pointerEvents=`none`),this.shaderNav(a,i,i._navShader,!n,r)))return;let o=this.screenMotion(n?t:e);if(!o){!n&&e&&(e.style.visibility=`hidden`),r?.();return}let s={duration:o.duration,easing:`cubic-bezier(0.333,1,0.667,1)`},c=(e,t)=>[{transform:`translateX(${e}%)`},{transform:`translateX(${t}%)`}],l;n?(l=t.animate(o.fade?[{opacity:0},{opacity:1}]:c(100,0),s),!o.fade&&e&&(e.animate(c(0,-30),s),e.style.transform=`translateX(-30%)`)):(l=e.animate(o.fade?[{opacity:1},{opacity:0}]:c(0,100),{...s,fill:`forwards`}),e.style.pointerEvents=`none`,!o.fade&&t&&t.animate(c(-30,0),s)),r&&(l.onfinish=r)}reconcileStacks(){let e=this.changedStacks;this.changedStacks=new Set;for(let t of e){let e=this.screensOf(t),n=e[e.length-1]??null,r=t._top??null,i=t._shown??[];t._top=n,t._shown=e;let a=r?._removedFrom===t,o=null;r&&n&&r!==n&&t._frame?.[2]>0&&(i.includes(n)?a&&!r._popping&&(o=r,r._popping=!0,this.moveScreens(r,n,!1,()=>{r._popping=!1,r.style.pointerEvents=``,r._removedFrom===t&&(r._removedFrom=null,r.remove(),this.dropLeftWith(r))})):this.moveScreens(a?null:r,n,!0));for(let e of[...t.children])e._removedFrom===t&&e!==o&&(e._removedFrom=null,e._popping=!1,e.remove(),this.dropLeftWith(e))}}topModal(){let e=[...this.root.children].filter(e=>e._kind===`modal`&&!e._leaving);return e[e.length-1]??null}backStack(e){let t=e=>e.isConnected&&(e.checkVisibility?.({visibilityProperty:!0})??!0),n=[];for(let r of this.views.values()){if(r._kind!==`stack`||!t(r)||e&&!e.contains(r))continue;let i=this.screensOf(r);(i.length>1||i[i.length-1]?._screen?.preventBack)&&n.push(r)}return n.find(e=>!n.some(t=>t!==e&&e.contains(t)))??null}back(){return!this.topModal()&&this.root._events?.has(`onBackPress`)?(this.event(1,`onBackPress`),!0):this.defaultBack()}defaultBack(){let e=this.topModal(),t=this.backStack(e);if(t){let e=this.screensOf(t);return this.goBack(e[e.length-1]),!0}return e?(this.requestClose(e),!0):!1}installHistory(){this.historyDepth=0,this.ignoredPops=0,this.historySession=`${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`,history.replaceState(this.historyState(0),``),window.addEventListener(`popstate`,e=>this.popState(e))}historyState(e){return{...history.state??{},nsh:e,nshSession:this.historySession}}resetHistory(){this.history&&this.historyDepth&&(this.ignoredPops++,history.go(-this.historyDepth),this.historyDepth=0)}backDepth(){let e=[...this.root.children].filter(e=>e._kind===`modal`&&!e._leaving).length;for(let t of this.views.values())t._kind===`stack`&&t.isConnected&&(t.checkVisibility?.({visibilityProperty:!0})??!0)&&(e+=Math.max(0,this.screensOf(t).length-1));return e}syncHistorySoon(){this.history&&!this.historySync&&(this.historySync=setTimeout(()=>{this.historySync=0,this.syncHistory()},0))}syncHistory(){let e=this.backDepth(),t=this.historyDepth;for(let n=t+1;n<=e;n++)history.pushState(this.historyState(n),``);e<t&&(this.ignoredPops++,history.go(e-t)),this.historyDepth=e}popState(e){if(this.ignoredPops>0){this.ignoredPops--;return}let t=this.historyDepth;if(e.state?.nshSession!==this.historySession){this.historyDepth=0;for(let e=0;e<t&&this.back();e++);e.state?.nsh!=null&&history.back();return}let n=e.state.nsh??0;if(n<t){this.historyDepth=n;for(let e=n;e<t&&this.back();e++);this.syncHistorySoon()}else n>t&&(this.ignoredPops++,history.go(t-n))}stackChanged(e,t){let n=this.screensOf(e);clearTimeout(e._hideTimer),e._hideTimer=setTimeout(()=>{n.forEach((t,r)=>{r<n.length-1&&t.parentNode===e&&t.classList.add(`nsh-hidden`)})},400),n.forEach((e,r)=>{let i=r===n.length-1;if(e.classList.toggle(`nsh-hidden`,!(i||r===n.length-2)),e===t&&r>0){let e=document.activeElement;e&&e!==document.body&&this.root.contains(e)&&!t.contains(e)&&(t._restoreFocus=e)}i&&(e.style.transform=``),this.placeHeader(e)}),t&&e._frame&&this.reportRoot(t,e._frame[2],e._frame[3],this.screenInsets(t)),this.syncHistorySoon()}reportRoot(e,t,n,r=[0,0,0,0]){let[i,a,o,s]=r;this.call(r=>r.nsh_root_size(e._id,t,n,i,a,o,s))}op_mc([,e,t,n]){let r=this.view(e);r&&(r._modal={animation:t,closeOnEscape:n},r.isConnected&&!r._leaving&&this.placeModal(r),r._entering&&(r.style.transform=``,r.style.opacity=``,this.hideModal(r,this.modalMotion(r))))}placeModal(e){let t=this.viewportDialogs,[n,r]=t?[e.clientWidth,e.clientHeight]:this.size,[i,a]=t&&this.frameScale||[1,1],o=t?{left:0,top:0,right:n*i,bottom:r*a}:void 0,s=this.safeProbe?this.safeArea(o).map((e,t)=>Math.round(e/(t%2?i:a))):[0,0,0,0],c=[0,0,n,r];e._frame=c,t||this.placeFrame(e);let l=`${c[2]},${c[3]},${s}`;e._reported!==l&&(e._reported=l,this.reportRoot(e,c[2],c[3],s))}modalMotion(e){let t=e._modal?.animation??`slide`;return t===`slide`&&this.reducedMotion?.matches?`fade`:t}hideModal(e,t){let n=e._frame??[0,0,...this.size],r=(this.viewportDialogs?n[3]:this.size[1])-n[1];t===`slide`&&(e.style.transform=`translateY(${r}px)`),t===`fade`&&(e.style.opacity=`0`)}present(e){this.endNavShader(this.root);let t=this.modalMotion(e);e._leaving=!1,e.style.pointerEvents=``,this.dropLeftWith(e),e._closed=!1,e._reported=null;let n=document.activeElement;if(e._restoreFocus=n!==document.body&&this.root.contains(n)?n:null,e._restoreFocus?.blur(),e.setAttribute(`aria-modal`,`true`),this.root.append(e),this.viewportDialogs){this.raise(e);for(let e of this.dialogs??[])this.raise(e);(this.viewportObserver??=new ResizeObserver(e=>{for(let{target:t}of e)t.isConnected&&!t._leaving&&this.placeModal(t)})).observe(e)}this.placeModal(e),e.style.transition=`none`,this.hideModal(e,t),e._entering=!0,this.scopeFocus(),this.syncHistorySoon(),requestAnimationFrame(()=>requestAnimationFrame(()=>{e._entering&&(e._entering=!1,e._navShader&&!this.viewportDialogs&&(e.style.transform=``,e.style.opacity=``,this.shaderNav(this.root,e,e._navShader,!1,()=>this.event(e._id,`onShow`)))?requestAnimationFrame(()=>{e.style.transition=``}):(e.style.transition=``,e.style.transform=``,e.style.opacity=``,e._showTimer=setTimeout(()=>{e._showTimer=0,this.event(e._id,`onShow`)},t===`none`?0:350)))}))}endPresentation(e){(e._entering||e._showTimer)&&(e._entering=!1,clearTimeout(e._showTimer),e._showTimer=0,this.event(e._id,`onShow`))}dismiss(e,t=e._closed){if(e._leaving)return;this.endNavShader(this.root),this.endPresentation(e),e._leaving=!0;let n=this.modalMotion(e),r=e._navShader&&!this.viewportDialogs&&this.shaderNav(this.root,e,e._navShader,!0,()=>{e._leaving&&(e.remove(),this.viewportObserver?.unobserve(e),this.releaseFrame(e),this.dropLeftWith(e)),t||this.event(e._id,`onDismiss`)});r?(e.style.transition=`none`,e.style.opacity=`0`,e.style.pointerEvents=`none`):this.hideModal(e,n),this.scopeFocus(),this.syncHistorySoon();let i=e._restoreFocus;i?.isConnected&&!this.topModal()&&i.focus({preventScroll:!0}),!r&&setTimeout(()=>{e._leaving&&(e.remove(),this.viewportObserver?.unobserve(e),this.releaseFrame(e),this.dropLeftWith(e)),t||this.event(e._id,`onDismiss`)},n===`none`?0:350)}holdFrame(e){if(typeof window>`u`)return;let t=this.frameLayers??=new Set;if(t.has(e)||(t.add(e),t.size>1)||(this.viewportPageRelease=P(this.root),window.parent===window))return;let n=this.root,r=n.getBoundingClientRect(),i=[`position`,`left`,`top`,`width`,`height`,`transform`,`transform-origin`],a=i.map(e=>[e,n.style.getPropertyValue(e),n.style.getPropertyPriority(e)]),o=[document.documentElement,document.body].map(e=>[e,e.style.getPropertyValue(`background`),e.style.getPropertyPriority(`background`)]);for(let[e]of o)e.style.setProperty(`background`,`transparent`,`important`);let s=e=>{let t=[`fixed`,`${e.left+r.left*e.sx}px`,`${e.top+r.top*e.sy}px`,`${n.clientWidth}px`,`${n.clientHeight}px`,`scale(${e.sx},${e.sy})`,`0 0`];i.forEach((e,r)=>n.style.setProperty(e,t[r],`important`))};s({left:0,top:0,sx:1,sy:1});let c=this.frameSession={close:null},l=!1,u,d,f=c.close=()=>{if(!l){l=!0,clearTimeout(d),window.removeEventListener(`pagehide`,f);for(let[e,t,r]of a)n.style.setProperty(e,t,r);for(let[e,t,n]of o)e.style.setProperty(`background`,t,n);if(u?.(),this.frameSession===c){this.frameSession=null,this.frameScale=null;for(let e of t)this.scaleLayer(e)}}};window.addEventListener(`pagehide`,f,{once:!0});let p=e=>{if(l)e.release();else{u=e.release,s(e.rect),this.frameScale=[e.rect.sx,e.rect.sy];for(let e of t)this.scaleLayer(e),e._kind===`modal`&&this.placeModal(e)}};try{if(window.frameElement){p(F(window.frameElement,N(document)));return}}catch(e){console.warn(`[nsh] iframe viewport host:`,e)}let m=new MessageChannel;u=()=>{m.port1.postMessage(`release`),m.port1.close()},m.port1.onmessage=({data:e})=>{clearTimeout(d),e.error?(console.warn(`[nsh] iframe viewport host:`,e.error),f()):p({rect:e,release:u})};let h=()=>{l||(window.parent.postMessage({type:`nsh:viewport`,colorScheme:N(document)},`*`,[m.port2]),d=setTimeout(()=>{console.warn(`[nsh] install hostPlayerFrame(iframe) on the embedding page for viewport dialogs`),f()},1500))};document.readyState===`complete`?h():window.addEventListener(`load`,h,{once:!0})}releaseFrame(e){this.frameLayers?.delete(e),this.frameLayers?.size||(this.frameSession?.close(),this.viewportPageRelease?.(),this.viewportPageRelease=null)}raise(e){this.holdFrame(e),e.popover||(e.classList.add(`nsh-viewport`),e.popover=`manual`,e.addEventListener(`wheel`,()=>{},{passive:!1})),e.matches(`:popover-open`)&&e.hidePopover(),e.showPopover(),this.scaleLayer(e)}scaleLayer(e){let[t,n]=this.frameScale??[1,1],r=t!==1||n!==1;(r||e._scaled)&&(e._scaled=r,e.style.width=r?`${100/t}%`:``,e.style.height=r?`${100/n}%`:``,e.style.scale=r?`${t} ${n}`:``,e.style.transformOrigin=r?`0 0`:``)}requestClose(e){this.event(e._id,`onRequestClose`,{reason:`cancel`}),(e._modal?.closeOnEscape??!0)&&!e._leaving&&(e._closed=!0,this.event(e._id,`onDismiss`),this.dismiss(e,!0))}scopeFocus(){let e=this.dialogs?.[this.dialogs.length-1]??this.topModal();for(let t of this.root.children)t===this.live||t.classList.contains(`nsh-error`)||(t.inert=t._kind===`modal`&&!!t._leaving||!!e&&t!==e)}op_web([,e,t,n,r,i,a,o,s]){let c=this.view(e),l=c?._frameEl;if(!l)return;let u=JSON.stringify([t,n,r,i,a,o,s]);if(c._web===u)return;c._web=u,c._port?.close(),c._port=null,c._token=n!=null&&s?Math.random().toString(36).slice(2):null;let d=[`allow-forms`,`allow-popups`,`allow-popups-to-escape-sandbox`,`allow-modals`,`allow-downloads`];s&&d.push(`allow-scripts`);let f=!1;if(n==null&&t){try{f=new URL(t,location.href).origin===location.origin}catch{}f||d.push(`allow-same-origin`)}if(l.setAttribute(`sandbox`,d.join(` `)),n!=null){let e=``;r&&(e+=`<base href="${r.replace(/"/g,`&quot;`)}">`),c._token&&(e+=`<script>${D(c._token)}<\/script>`),o||(e+=`<style>html,body{overflow:hidden!important}</style>`),i&&(e+=`<script>${i.replace(/<\/script/gi,`<\\/script`)}<\/script>`);let t=a?`<script>${a.replace(/<\/script/gi,`<\\/script`)}<\/script>`:``,s=/^\s*<!doctype[^>]*>/i.exec(n)?.[0]??``;c._webUrl=r??`about:srcdoc`,c._webTitle=new DOMParser().parseFromString(n,`text/html`).title,l.removeAttribute(`src`),l.removeAttribute(`scrolling`),l.srcdoc=s+e+n.slice(s.length)+t}else c._webUrl=t??``,c._webTitle=``,l.removeAttribute(`srcdoc`),o?l.removeAttribute(`scrolling`):l.setAttribute(`scrolling`,`no`),t?l.src=t:l.removeAttribute(`src`);(n!=null||t)&&queueMicrotask(()=>this.webNavigation(c,`onLoadStart`,!0))}webNavigation(e,t,n){let r={url:e._webUrl??``,title:e._webTitle??``,loading:n,canGoBack:!1,canGoForward:!1};e._events.has(t)&&this.event(e._id,t,r),e._events.has(`onNavigationStateChange`)&&this.event(e._id,`onNavigationStateChange`,r)}webLoaded(e){let t=e._frameEl;if(t.getAttribute(`src`)||t.hasAttribute(`srcdoc`)){if(e._token){let n=new MessageChannel;n.port1.onmessage=t=>{e._events.has(`onMessage`)&&this.event(e._id,`onMessage`,{data:String(t.data)})},e._port?.close(),e._port=n.port1,t.contentWindow?.postMessage(e._token,`*`,[n.port2])}this.webNavigation(e,`onLoad`,!1)}}op_video([,e,t,n,r,i,a,o,s,c,l]){let u=this.view(e),d=u?._video;if(!d)return;let f=t?this.asset(t):``;f!==u._src&&(u._src=f,f?d.src=f:d.removeAttribute(`src`)),u._progressInterval=l>0?l:250,d.muted=r,d.volume=Math.min(1,Math.max(0,i)),d.playbackRate=a,d.loop=o,d.controls=c,d.className=`nsh-fill nsh-fit-${s}`,n?d.pause():f&&d.paused&&d.play().catch(e=>{e?.name===`NotAllowedError`&&!u._autoplayWarned&&(u._autoplayWarned=!0,console.warn(`[nsh] the browser did not let the video play before a user gesture (muted videos can)`))})}wireVideo(e,t){let n=(t,n)=>e._events.has(t)&&this.event(e._id,t,n),r=()=>n(`onProgress`,{currentTime:t.currentTime,duration:t.duration||0}),i=()=>{clearInterval(e._progressTimer),e._progressTimer=0},a=!1,o=e=>{a!==e&&(a=e,n(`onBuffer`,{isBuffering:e}))};t.addEventListener(`loadstart`,()=>{t.getAttribute(`src`)&&n(`onLoadStart`)}),t.addEventListener(`loadedmetadata`,()=>n(`onLoad`,{duration:t.duration||0,width:t.videoWidth,height:t.videoHeight})),t.addEventListener(`playing`,()=>{o(!1),i(),e._events.has(`onProgress`)&&(e._progressTimer=setInterval(r,e._progressInterval??250))}),t.addEventListener(`pause`,()=>{i(),r()}),t.addEventListener(`waiting`,()=>o(!0)),t.addEventListener(`canplay`,()=>o(!1)),t.addEventListener(`ended`,()=>{i(),r(),n(`onEnd`)}),t.addEventListener(`error`,()=>{i();let e=t.error;e&&t.getAttribute(`src`)&&n(`onError`,{message:e.message||`media error ${e.code}`})})}op_cmd([,e,t,...n]){let r=this.view(e);switch(t){case`focus`:r?._field?r._field.focus():r&&this.focusPressable(r);break;case`blur`:r?._field?r._field.blur():document.activeElement?.blur?.();break;case`setSelection`:r?._field?.setSelectionRange(n[0],n[1]);break;case`scrollTo`:if(!r)break;if(r._field){r._field.scrollTo({top:n[1],behavior:n[2]?`smooth`:`instant`});break}r._applied++,this.stopGlide(r,n[0],n[1]),r._smooth=n[2]?[n[0],n[1]]:null,r.scrollTo({left:n[0],top:n[1],behavior:n[2]?`smooth`:`instant`});break;case`scrollToEnd`:{if(!r)break;r._applied++;let[e,t]=r._horizontal?[r.scrollWidth,0]:[0,r.scrollHeight];this.stopGlide(r,e,t),r.scrollTo({left:e,top:t,behavior:n[0]?`smooth`:`instant`});break}case`zoomTo`:r&&this.zoomCommand(r,...n);break;case`dialog`:this.dialog(n[0],n[1],n[2],n[3],n[4]??[],n[5]??!0,n[6]??!1);break;case`reload`:{let e=r?._frameEl;if(!e)break;e.hasAttribute(`srcdoc`)?e.srcdoc=e.srcdoc:e.getAttribute(`src`)&&(e.src=e.getAttribute(`src`)),this.webNavigation(r,`onLoadStart`,!0);break}case`postMessage`:r?._frameEl?.contentWindow?.postMessage(n[0],`*`);break;case`injectJavaScript`:case`goBack`:case`goForward`:r?._port?r._port.postMessage(t===`injectJavaScript`?{eval:n[0]}:{go:t===`goBack`?-1:1}):r?._frameEl&&!r._noBridgeWarned&&(r._noBridgeWarned=!0,console.warn(`[nsh] web view: ${t} only reaches HTML sources (a page of another site is the browser's own)`));break;case`seek`:r?._video&&(r._video.currentTime=n[0]);break;case`openUrl`:this.event(1,`onOpenUrl`,{id:n[0],opened:this.openUrl(n[1])});break;case`setClipboard`:this.writeClipboard(n[0]);break;case`readClipboard`:this.readClipboard(n[0],n[1]);break;case`setClipboardImage`:this.writeClipboardImage(n[0]);break;case`readClipboardImage`:this.readClipboardImage(n[0],n[1]);break;case`readClipboardFiles`:this.event(1,`onClipboard`,{id:n[0],has:!1,files:``});break;case`pickScreenColor`:this.pickScreenColor(n[0]);break;case`pickImages`:this.pickImages(n[0],n[1],n[2],n[3],n[4]);break;case`hostCall`:this.hostCall(n[0],n[1],n[2]);break;case`imageInfo`:this.imageInfo(n[0],n[1]);break;case`back`:this.defaultBack();break;case`exitApp`:{let e=this.app;queueMicrotask(()=>{this.app===e&&this.reset()});break}case`announce`:this.live.textContent=``,setTimeout(()=>{this.live.textContent=n[0]},50);break;case`a11yFocus`:if(!r)break;r.hasAttribute(`tabindex`)||(r.tabIndex=-1,r._a11yFocus=!0),r.focus()}}writeClipboard(e){let t=()=>{let t=document.createElement(`textarea`);t.value=e,t.className=`nsh-offscreen`,document.body.append(t),t.select();try{document.execCommand(`copy`)}catch{}t.remove()};navigator.clipboard?.writeText?navigator.clipboard.writeText(e).catch(t):t()}async pickScreenColor(e){let t;try{let{sRGBHex:e}=await new EyeDropper().open();t=parseInt(e.slice(1,7),16)*256+255}catch{}this.event(1,`onScreenColor`,t===void 0?{id:e}:{id:e,color:t})}openUrl(e){let t=null;try{t=window.open(e,`_blank`)}catch(e){console.warn(`[nsh] openUrl: ${e}`)}if(t)try{t.opener=null}catch{}return!!t}async readClipboard(e,t){let n=``;try{n=await navigator.clipboard?.readText()??``}catch{}let r={id:e,has:n.length>0};!t&&n&&(r.text=n),this.event(1,`onClipboard`,r)}async writeClipboardImage(e){try{let t=await(await fetch(e)).blob();await navigator.clipboard.write([new ClipboardItem({[t.type]:t})])}catch{}}pickImages(e,t,n,r,i){let a=this.app,o=document.createElement(`input`);o.type=`file`,o.accept=i?`image/*`:`image/jpeg,image/png,image/gif,image/webp`,o.multiple=t>1,o.style.display=`none`;let s=!1,c=async i=>{if(s)return;s=!0,o.remove();let c=[];for(let e of i.slice(0,t))try{c.push(await this.preparePicked(e,n,r))}catch{}a===this.app&&this.call(t=>{for(let e of c)this.withStrings([e.name,e.type,e.bytes],(n,r,i,a,o,s)=>t.nsh_picked_file(n,r,i,a,o,s,e.width,e.height,e.lastModified));return t.nsh_picked(e)})};o.addEventListener(`change`,()=>c([...o.files??[]])),o.addEventListener(`cancel`,()=>c([])),this.root.append(o),o.click()}async preparePicked(e,t,n){let r=e.type.toLowerCase(),i=null;try{i=await createImageBitmap(e,{imageOrientation:`from-image`})}catch{}let a=i?.width??0,o=i?.height??0,s=Math.max(a,o),c=t>0&&s>t,l=n>=0&&r===`image/jpeg`,u={name:e.name,type:r,lastModified:e.lastModified,width:a,height:o};if(!i||!(c||l))return i?.close(),{...u,bytes:new Uint8Array(await e.arrayBuffer())};let d=c?t/s:1,f=Math.max(1,Math.round(a*d)),p=Math.max(1,Math.round(o*d)),m=new OffscreenCanvas(f,p);m.getContext(`2d`).drawImage(i,0,0,f,p),i.close();let h=r===`image/png`&&c,g=await m.convertToBlob(h?{type:`image/png`}:{type:`image/jpeg`,quality:n>=0?n:.9}),_=e.name.replace(/\.[^.]*$/,``)+(h?`.png`:`.jpg`);return{...u,name:_,type:g.type,width:f,height:p,bytes:new Uint8Array(await g.arrayBuffer())}}async readClipboardImage(e,t){let n=this.app,r=t=>n===this.app&&this.event(1,`onClipboard`,{id:e,...t}),i=null;try{for(let e of await navigator.clipboard?.read()??[]){let t=e.types.find(e=>e.startsWith(`image/`));if(t){i=await e.getType(t);break}}}catch{}if(!i||t)return r({has:!!i});let a=await new Promise(e=>{let t=new FileReader;t.onload=()=>e(t.result),t.onerror=()=>e(null),t.readAsDataURL(i)});if(!a)return r({has:!0});let o=new Image;o.onload=()=>r({has:!0,uri:a,width:o.naturalWidth,height:o.naturalHeight}),o.onerror=()=>r({has:!0}),o.src=a}async hostCall(e,t,n){let r=this.app,i;try{let r=this.options.host;if(typeof r?.call!=`function`)throw Error("this page has no host (createPlayer's `host`)");let a=await r.call(t,n)??null;i=JSON.stringify({type:`reply`,id:e,ok:!0,value:a})}catch(t){i=JSON.stringify({type:`reply`,id:e,ok:!1,error:String(t?.message??t)})}r===this.app&&this.eventJson(1,`onHost`,i)}hostEvent(e,t=null){let n=JSON.stringify({type:`event`,event:String(e),payload:t??null});this.started?this.eventJson(1,`onHost`,n):this.hostEvents?.push(n)}imageInfo(e,t){let n=new Image,r=this.app,i=t=>r===this.app&&this.event(1,`onImageInfo`,{id:e,...t});n.onload=()=>i({width:n.naturalWidth,height:n.naturalHeight}),n.onerror=()=>i({error:`failed to load ${t}`}),n.src=this.asset(t)}filesystemStart(e,t,n){let r={};this.fileOperations.set(e,r);let i=()=>this.fileOperations.get(e)===r,a=(e,t=e)=>Object.assign(Error(t),{code:e}),o=e=>{let t=e.split(`/`).filter(Boolean);if(t.some(e=>e===`.`||e===`..`||e.includes(`\\`)))throw a(`EACCES`);return t};(async()=>{if(!navigator.storage?.getDirectory)throw a(`ERR_FEATURE_UNAVAILABLE_ON_PLATFORM`,`This browser does not provide Origin Private File System storage`);let e=await navigator.storage.getDirectory(),r=await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(t.namespace)),s=Array.from(new Uint8Array(r),e=>e.toString(16).padStart(2,`0`)).join(``),c=await(await e.getDirectoryHandle(`nsh-files`,{create:!0})).getDirectoryHandle(s,{create:!0}),l=async(e,t=!1)=>{let n=c;for(let r of e)n=await n.getDirectoryHandle(r,{create:t});return n},u=async e=>{let t=o(e);if(!t.length)return{handle:c,parent:c,name:``};let n=t.pop(),r=await l(t),i;try{i=await r.getFileHandle(n)}catch(e){if(e.name!==`TypeMismatchError`)throw e;i=await r.getDirectoryHandle(n)}return{handle:i,parent:r,name:n}},d=o(t.path),f=d.at(-1);if(!i())return{};if(t.op===`mkdir`){if(!d.length){if(!t.recursive)throw a(`EEXIST`);return{}}if(t.recursive)return await l(d,!0),{};let e=await l(d.slice(0,-1));try{throw await u(t.path),a(`EEXIST`)}catch(e){if(e.name!==`NotFoundError`)throw e}return await e.getDirectoryHandle(f,{create:!0}),{}}if(t.op===`write`){if(!f)throw a(`EISDIR`);let e=await l(d.slice(0,-1)),t;try{t=await e.getFileHandle(f,{create:!0})}catch(e){throw e.name===`TypeMismatchError`?a(`EISDIR`):e}if(!i())return{};let r=await t.createWritable();try{if(!i()||(await r.write(n),!i()))return await r.abort(),{};await r.close()}catch(e){throw await r.abort().catch(()=>{}),e}return{}}let p;try{p=await u(t.path)}catch(e){if(t.op===`exists`&&e.name===`NotFoundError`)return{kind:`exists`,value:!1};throw e}let{handle:m,parent:h}=p,g=m.kind===`directory`;switch(t.op){case`exists`:return{kind:`exists`,value:!0};case`read`:{if(g)throw a(`EISDIR`);let e=await m.getFile();if(e.size>t.maxBytes)throw a(`EFBIG`,`File exceeds the configured read limit`);return{kind:`bytes`,bytes:new Uint8Array(await e.arrayBuffer())}}case`entries`:{if(!g)throw a(`ENOTDIR`);let e=[],n=0;for await(let[r,i]of m.entries()){if(n+=new TextEncoder().encode(r).length,e.length>=t.maxEntries||n>t.maxNameBytes)throw a(`EFBIG`,`Directory exceeds the configured listing limit`);e.push({name:r,directory:i.kind===`directory`})}return{kind:`entries`,entries:e}}case`stat`:{let e=g?null:await m.getFile();return{kind:`metadata`,file:!g,directory:g,size:e?.size??0,mtime:e?.lastModified??0}}case`readlink`:throw a(`EINVAL`,`OPFS entries are regular files and directories`);case`unlink`:if(g)throw a(`EISDIR`);return i()&&await h.removeEntry(p.name),{};case`rmdir`:if(!g)throw a(`ENOTDIR`);if(!p.name)throw a(`EBUSY`);for await(let e of m.keys())throw a(`ENOTEMPTY`);return i()&&await h.removeEntry(p.name),{};case`rename`:{let e=o(t.to),n=e.pop();if(!p.name||!n)throw a(`EBUSY`);let r=await l(e);if(await h.isSameEntry(r)&&p.name===n)return{};try{let e=(await u(t.to)).handle;if(e.kind===`directory`&&!g)throw a(`EISDIR`);if(e.kind===`file`&&g)throw a(`ENOTDIR`);if(e.kind===`directory`)for await(let t of e.keys())throw a(`ENOTEMPTY`)}catch(e){if(e.name!==`NotFoundError`)throw e}if(typeof m.move!=`function`)throw a(`ENOTSUP`,`This browser does not support atomic OPFS rename for this entry`);return i()&&await m.move(r,n),{}}default:throw a(`ENOTSUP`)}})().then(t=>{if(!i())return;let n=t.bytes??new Uint8Array;delete t.bytes,this.call(r=>this.withStrings([JSON.stringify(t),n],(t,n,i,a)=>r.nsh_filesystem_reply(e,t,n,i,a))),this.fileOperations.delete(e)},n=>{if(!i())return;let r={error:String(n?.message??n),code:n?.code&&typeof n.code==`string`?n.code:{NotFoundError:`ENOENT`,TypeMismatchError:`ENOTDIR`,NotAllowedError:`EACCES`,SecurityError:`EACCES`,QuotaExceededError:`ENOSPC`,InvalidModificationError:`ENOTEMPTY`,NotSupportedError:`ENOTSUP`}[n?.name]??`EIO`,syscall:t.op,path:t.path};this.call(t=>this.withStrings([JSON.stringify(r),new Uint8Array],(n,r,i,a)=>t.nsh_filesystem_reply(e,n,r,i,a))),this.fileOperations.delete(e)})}websocketOperation(e){try{return e(),1}catch(e){return this.withStrings([String(e?.message??e)],(e,t)=>this.wasm.nsh_websocket_reply(e,t)),0}}websocketStart(e,t){let n=new WebSocket(t.url,t.protocols);n.binaryType=`arraybuffer`,this.websockets.set(e,n);let r=(t,r,i=0,a=!1)=>{this.websockets.get(e)===n&&this.call(o=>{if(this.websockets.get(e)!==n)return o.nsh_pump();let s=8388608,c=typeof r==`string`?0:r.byteLength;if(typeof r==`string`)for(let e=0;e<r.length&&c<=s;e++){let t=r.charCodeAt(e);t<128?c++:t<2048?c+=2:t>=55296&&t<=56319&&e+1<r.length&&r.charCodeAt(e+1)>=56320&&r.charCodeAt(e+1)<=57343?(c+=4,e++):c+=3}return c>s?this.withStrings([`WebSocket message exceeds the 8 MiB limit`],(t,n)=>{try{return o.nsh_websocket_event(e,3,t,n,0,0),o.nsh_websocket_event(e,4,t,n,1009,0)}finally{this.websocketCancel(e)}}):this.withStrings([r],(n,r)=>o.nsh_websocket_event(e,t,n,r,i,+!!a))})},i={paused:!1,events:[],report:r};n.nshHold=i;let a=(...e)=>{i.paused||i.events.length?i.events.push(e):r(...e)};n.onopen=()=>a(0,n.protocol),n.onmessage=e=>a(typeof e.data==`string`?1:2,typeof e.data==`string`?e.data:new Uint8Array(e.data)),n.onerror=()=>a(3,`Browser WebSocket failed (network, TLS, origin or server handshake error)`),n.onclose=e=>a(4,e.reason,e.code,e.wasClean)}websocketPause(e,t){let n=this.websockets.get(e),r=n?.nshHold;r&&(r.paused=t,!t&&r.events.length&&setTimeout(()=>{for(;!r.paused&&r.events.length&&this.websockets.get(e)===n;)r.report(...r.events.shift())}))}websocketCancel(e){let t=this.websockets.get(e);if(t){this.websockets.delete(e),t.onopen=t.onmessage=t.onerror=t.onclose=null;try{t.close()}catch{}}}fetchStart(e,t,n,r,i,a,o){let s={controller:new AbortController,paused:!1,resume:null,reader:null,done:!1};this.requests.set(e,s);let c=t=>{this.requests.get(e)===s&&this.call(t)},l=t=>{c(n=>this.withStrings([t],(t,r)=>n.nsh_fetch_failed(e,t,r))),this.requests.delete(e)},u=async i=>{let a={method:t,headers:new Headers,body:i,redirect:o?`follow`:`manual`,signal:s.controller.signal};for(let[e,t]of r)try{a.headers.append(e,t)}catch{}let u;try{u=await fetch(n,a)}catch(e){if(s.controller.signal.aborted)return;l(`fetch ${t} ${n} failed: ${e?.message??e} (a network error, or a cross-origin server that does not allow this page's origin)`);return}if(u.type===`opaqueredirect`){l(`fetch ${t} ${n} was redirected: on the web a redirect is only followed by the browser, not delivered or checked hop by hop`);return}let d=[];if(u.headers.forEach((e,t)=>d.push([t,e])),c(t=>this.withStrings([u.url||n,u.statusText,JSON.stringify(d)],(n,r,i,a,o,s)=>t.nsh_fetch_head(e,u.status,n,r,i,a,o,s,+!!u.redirected))),!u.body)c(t=>t.nsh_fetch_end(e)),this.requests.delete(e);else{s.reader=u.body.getReader();try{for(;;){for(;s.paused;)await new Promise(e=>s.resume=e);if(this.requests.get(e)!==s)return;let{done:t,value:n}=await s.reader.read();if(t)break;c(t=>this.withStrings([n],(n,r)=>t.nsh_fetch_data(e,n,r)))}}catch(e){s.controller.signal.aborted||l(`fetch ${t} ${n}: the body broke off: ${e?.message??e}`);return}c(t=>t.nsh_fetch_end(e)),this.requests.delete(e)}};a?(s.chunks=[],s.wanted=()=>c(t=>t.nsh_fetch_body_wanted(e)),s.finish=()=>{let e=s.chunks;s.chunks=null,e&&u(new Blob(e))},s.wanted()):u(i??void 0)}fetchSend(e,t){let n=this.requests.get(e);n?.chunks&&(n.chunks.push(t),n.wanted())}fetchPause(e,t){let n=this.requests.get(e);n&&(n.paused=t,!t&&n.resume&&(n.resume(),n.resume=null))}fetchCancel(e){let t=this.requests.get(e);t&&(this.requests.delete(e),t.controller.abort(),t.resume?.())}dialog(e,t,n,r,i,a,o){let s=r,c=e=>i[e]??`default`,l=this.desktopUI,u=document.createElement(`div`);u.className=o?`nsh-dialog-backdrop nsh-sheet-backdrop`:`nsh-dialog-backdrop`;let d=document.activeElement,f=d!==document.body&&this.root.contains(d)?d:null,p=!1,m=null;u.addEventListener(`pointerdown`,e=>{m=e.target},!0);let h=(e,t)=>e.detail===0||m!==null&&t.contains(m),g=t=>{p||(p=!0,u.remove(),this.releaseFrame(u),this.dialogs=this.dialogs.filter(e=>e!==u),this.scopeFocus(),f?.isConnected&&f.focus({preventScroll:!0}),this.event(1,`onDialog`,{id:e,index:t}))},_=s.findIndex((e,t)=>c(t)===`cancel`);u._cancel=()=>_>=0?g(_):a&&g(-1);let v=e=>{let t=document.createElement(`button`);return t.textContent=s[e],c(e)!=="default"&&t.classList.add(c(e)),t.addEventListener(`click`,n=>h(n,t)&&g(e)),t},y=null,b=document.createElement(`div`);if(b.setAttribute(`role`,`alertdialog`),b.setAttribute(`aria-modal`,`true`),b.setAttribute(`aria-label`,t??n??``),o){b.className=`nsh-sheet`;let e=document.createElement(`div`);if(t||n){let r=document.createElement(`div`);if(r.className=`nsh-sheet-head`,t){let e=document.createElement(`b`);e.textContent=t,r.append(e)}n&&r.append(n),e.append(r)}if(s.forEach((t,n)=>{if(n===_)return;let r=v(n);y??=r,e.append(r)}),e.firstChild&&b.append(e),_>=0){let e=document.createElement(`div`),t=v(_);y??=t,e.append(t),b.append(e)}}else{if(b.className=`nsh-dialog`,t){let e=document.createElement(`h3`);e.textContent=t,b.append(e)}if(n){let e=document.createElement(`p`);e.textContent=n,b.append(e)}let e=document.createElement(`div`);e.className=`nsh-dialog-actions ${(l?s.length<=3:s.length===2)?`row`:`column`}`;let r=-1;for(let e=s.length-1;e>=0&&r<0;e--)c(e)==="default"&&(r=e);s.forEach((t,n)=>{let i=v(n);n===r&&(l&&i.classList.add(`default`),y=i),e.append(i)}),y??=e.firstChild,b.append(e)}u.addEventListener(`click`,e=>e.target===u&&m===u&&a&&g(-1)),u.append(b),this.root.append(u),this.viewportDialogs&&this.raise(u),(this.dialogs??=[]).push(u),this.scopeFocus(),y?.focus({preventScroll:!0})}get desktopUI(){return this.idiom===`desktop`}updateRootClasses(){this.root.classList.toggle(`nsh-dark`,this.shownDark),this.root.classList.toggle(`nsh-desktop`,this.desktopUI),this.root.classList.toggle(`nsh-reduce`,this.reduceMotion())}reduceMotion(){return!!this.reducedMotion?.matches}op_comp([,,e]){if(this.missingComponents?.has(e))return;(this.missingComponents??=new Set).add(e);let t=`native component "${e}" is not available on the web: its view stays empty`;console.warn(`[nsh]`,t),this.options.onLog?.(`warn`,t)}viewOf(e){let t=e;for(;t&&t!==this.root&&t._id===void 0;)t=t.parentNode;return t&&t._id!==void 0?t:null}ancestors(e){let t=[];for(let n=e;n&&n!==this.root.parentNode;n=n.parentNode)n._id!==void 0&&t.push(n);return t}mousePoint(e,t){let n=1,r=0,i=0,a=1;for(let t=e;t;t=t.parentElement){let e=getComputedStyle(t);if(e.transform!==`none`){let t=new DOMMatrix(e.transform);[n,r,i,a]=[t.a*n+t.c*r,t.b*n+t.d*r,t.a*i+t.c*a,t.b*i+t.d*a]}if(e.scale&&e.scale!==`none`){let[t,o=t]=e.scale.split(` `).map(Number);[n,r,i,a]=[t*n,o*r,t*i,o*a]}if(t.classList?.contains(`nsh-viewport`))break}let o=e.getBoundingClientRect(),s=n*a-r*i;if(!s)return null;let c=getComputedStyle(e),l=parseFloat(c.width),u=parseFloat(c.height),d=t.clientX-o.left+Math.min(0,n*l,i*u,n*l+i*u),f=t.clientY-o.top+Math.min(0,r*l,a*u,r*l+a*u);return[(a*d-i*f)/s,(n*f-r*d)/s]}mouseMoved(e){if(e.pointerType!==`mouse`||!this.mouseTracked.size)return;let t=document.elementFromPoint(e.clientX,e.clientY);if(t&&this.root.contains(t))for(let n of this.ancestors(this.viewOf(t))){if(!n._events?.has(`onMouseMove`))continue;let t=this.mouseEvent(n,e);t&&this.event(n._id,`onMouseMove`,t)}}installInput(){let e=this.root;e.addEventListener(`pointerdown`,e=>this.pointerDown(e)),window.addEventListener(`pointermove`,e=>this.pointerMove(e),{passive:!1}),window.addEventListener(`pointerup`,e=>this.pointerUp(e,!1)),window.addEventListener(`pointercancel`,e=>this.pointerUp(e,!0)),e.addEventListener(`dragstart`,e=>e.preventDefault()),e.addEventListener(`mousedown`,e=>{this.lastPointer===`touch`||this.editable(e.target)||(e.preventDefault(),document.hasFocus()||window.focus())}),e.addEventListener(`contextmenu`,e=>this.contextMenu(e)||this.editable(e.target)||e.preventDefault()),e.addEventListener(`copy`,e=>this.copyText(e)),e.addEventListener(`wheel`,e=>this.wheel(e),{passive:!1}),e.addEventListener(`gesturestart`,e=>this.gestureZoom(e,0)),e.addEventListener(`gesturechange`,e=>this.gesture&&this.gestureZoom(e,1)),e.addEventListener(`gestureend`,e=>this.gesture&&this.gestureZoom(e,2)),e.addEventListener(`pointermove`,e=>{if(this.mouseMoved(e),e.pointerType!==`mouse`||(this.hover=[e.clientX,e.clientY],this.hoverButtons=e.buttons,!this.desktopUI||e.buttons))return;let t=this.viewOf(e.target);if(t)for(let n of this.ancestors(t))n._kind===`scroll`&&this.hoverBar(n,e)}),e.addEventListener(`focusin`,()=>L.active=this),window.addEventListener(`keydown`,e=>this.keyDown(e)),window.addEventListener(`keyup`,e=>this.keyUp(e)),e.addEventListener(`mouseup`,e=>{e.button!==3||this.history||(e.preventDefault(),this.back())}),this.live=document.createElement(`div`),this.live.className=`nsh-live`,this.live.setAttribute(`aria-live`,`polite`),this.history&&this.installHistory()}contextMenu(e){let t=this.viewOf(e.target);if(!t)return!1;for(let n of this.ancestors(t)){if(n._events?.has(`onContextMenu`)){e.preventDefault();let[t,r]=this.point(e),i=n.getBoundingClientRect();return this.event(n._id,`onContextMenu`,{position:{x:e.clientX-i.left,y:e.clientY-i.top},pagePosition:{x:t,y:r},modifiers:{control:e.ctrlKey,alt:e.altKey,shift:e.shiftKey,platform:e.metaKey}}),!0}if(n.matches(`.nsh-field, .nsh-selectable`))return!1}return!1}editable(e){return!!e?.closest?.(`.nsh-field, .nsh-selectable, iframe, video`)||!!this.textAt(e)||this.areaGap(e)}areaGap(e){let t=e?.closest?.(`.nsh-area`);if(!t||e.closest(`.nsh-noselect`))return!1;let n=e.closest(`.nsh-press`);return!n||!t.contains(n)}textAt(e){let t=e?.closest?.(`.nsh-autoselect`);return t&&(t.closest(`.nsh-area`)||this.desktopUI&&!t.closest(`.nsh-press`))?t:null}areaOf(e){let t=null;for(let n=e?.closest?.(`.nsh-area`);n;n=n.parentElement?.closest(`.nsh-area`))t=n;return t}takesKeys(){let e=document.activeElement;return e&&e!==document.body?this.root.contains(e):(L.active??this)===this}modifiersChanged(e){if(!r.has(e.key)||e.repeat||!this.hover||this.hoverButtons||!this.mouseTracked.size)return;let[t,n]=this.hover,i=document.elementFromPoint(t,n);if(!i||!this.root.contains(i))return;let a={target:i,clientX:t,clientY:n,buttons:0,ctrlKey:e.ctrlKey,altKey:e.altKey,shiftKey:e.shiftKey,metaKey:e.metaKey};for(let e of this.ancestors(this.viewOf(i))){if(!e._hoverIn||!e._events?.has(`onMouseMove`))continue;let t=this.mouseEvent(e,a);t&&this.event(e._id,`onMouseMove`,t)}}shortcut(e,t){let n=e.isComposing?-1:f(e);if(n<0)return-1;let r=+!!e.ctrlKey|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0);return this.wasm.nsh_key(n,r,+!!t,+!!e.repeat)}keyDown(e){if(this.wasm&&this.modifiersChanged(e),!this.wasm||!this.takesKeys())return;let t=document.activeElement,n=t&&this.root.contains(t),r=n&&!!t.closest(`.nsh-field, iframe`),i=this.shortcut(e,r);if(i!==-1){e.preventDefault(),e.stopPropagation(),i>=0&&this.call(e=>e.nsh_key_command(i));return}if(e.defaultPrevented||e.isComposing)return;let a=!e.ctrlKey&&!e.altKey&&!e.metaKey,o=this.dialogs?.[this.dialogs.length-1];if(o){e.key===`Escape`&&(e.preventDefault(),o._cancel());return}if(r){e.key===`Escape`&&a&&t.classList.contains(`nsh-field`)&&(e.preventDefault(),t.blur());return}if(this.selectionKey(e))return;if(n&&t._pressable&&a&&!e.shiftKey&&(e.key===`Enter`||e.key===` `)){if(e.preventDefault(),e.repeat)return;this.keyPress={press:t,states:this.ancestors(t).filter(e=>e._tracked&1)},this.pressIn(this.keyPress);for(let e of this.keyPress.states)this.setState(e,1,!0);e.key===`Enter`&&this.keyPressEnd(!0);return}let c=e.key===`BrowserBack`||e.altKey&&!s&&e.key===`ArrowLeft`||e.metaKey&&s&&e.key===`[`;if(e.key===`Escape`&&a||c){if(c&&this.history)return;this.back()&&e.preventDefault()}else a&&this.scrollKey(e,n?t:null)&&e.preventDefault()}keyUp(e){this.wasm&&this.modifiersChanged(e),e.key===` `&&this.keyPress&&this.keyPressEnd(!0)}keyPressEnd(e){let t=this.keyPress;this.keyPress=null,this.pressOut(t,e);for(let e of t.states)this.setState(e,1,!1)}selectableText(e){return e?.closest(`.nsh-selectable`)??this.textAt(e)}copyText(e){let t=getSelection();if(e.target.closest?.(`.nsh-field`)||!t?.rangeCount||t.isCollapsed||!this.root.contains(t.anchorNode))return;let n=t.getRangeAt(0),r=``,i=null,a=null,o=null,s=!1;for(let e of this.root.querySelectorAll(`.nsh-run`)){if(!n.intersectsNode(e)||!this.selectableText(e))continue;let t=e.textContent;if(!t)continue;let c=e.contains(n.startContainer)?C(e,n.startContainer,n.startOffset):0,l=e.contains(n.endContainer)?C(e,n.endContainer,n.endOffset):t.length;if(c>=l)continue;s=!0;let u=this.areaOf(e.parentNode);if(i!==e.parentNode){let t=u?e.parentNode.getBoundingClientRect():null;i&&u&&u===a&&t.top<o.bottom&&o.top<t.bottom?r=r.replace(/\n$/,``)+` `:i&&!r.endsWith(`
258
258
  `)&&(r+=`
259
259
  `),i=e.parentNode,a=u,o=t}let d=t.slice(c,l);r+=u?d.replaceAll(``,``):d,l===t.length&&e._after&&(r+=e._after)}s&&(e.preventDefault(),e.clipboardData.setData(`text/plain`,r.replace(/\s+$/,``)))}selectionKey(e){let t=getSelection(),n=t?.anchorNode,r=t?.rangeCount&&!t.isCollapsed&&n&&this.root.contains(n)?this.selectableText(n.nodeType===1?n:n.parentElement):null;return r?e.key===`a`&&(e.ctrlKey||e.metaKey)&&!e.altKey&&!e.shiftKey?(e.preventDefault(),t.selectAllChildren(this.areaOf(r)??r),!0):e.key===`Escape`&&(e.preventDefault(),t.removeAllRanges(),!0):!1}scrollKey(e,t){let n=e.key,r=n===`ArrowLeft`||n===`ArrowRight`;if(![`ArrowUp`,`ArrowDown`,`ArrowLeft`,`ArrowRight`,`PageUp`,`PageDown`,` `,`Home`,`End`].includes(n)||e.shiftKey&&n!==` `)return!1;let i=t&&t!==this.root?t:null;!i&&this.hover&&(i=document.elementFromPoint(this.hover[0],this.hover[1]));let a=this.scrollChain(i),o=a.find(e=>!!e._horizontal===r)??(r?null:a[0]);if(!o)return!1;let s=!!o._horizontal,c=s?o.scrollLeft:o.scrollTop,l=s?o.scrollWidth-o.clientWidth:o.scrollHeight-o.clientHeight,u=(s?o.clientWidth:o.clientHeight)*.875,d={ArrowUp:-40,ArrowLeft:-40,ArrowDown:40,ArrowRight:40,PageUp:-u,PageDown:u," ":e.shiftKey?-u:u,Home:-c,End:l-c}[n];return o._snapPoints?this.snapStep(o,Math.sign(d)):this.scrollSmoothly(o,s?d:0,s?0:d,!0),!0}scrollChain(e){let t=e?this.viewOf(e):null;return t?this.ancestors(t).filter(e=>e._kind===`scroll`&&e._behavior?.enabled!==!1):[]}wheel(e){if(e.ctrlKey){e.preventDefault(),this.wheelZoom(e)||this.wheelPinch(e);return}let t=e.deltaMode===1?40:e.deltaMode===2?this.size[1]:1,n=e.deltaX*t,r=e.deltaY*t;e.shiftKey&&!n&&([n,r]=[r,0]);let i=performance.now(),a=this.wheelLock;if(!a||i-a.t>200||!a.el.isConnected){let t=this.scrollChain(e.target),i=Math.abs(n)>Math.abs(r),o=(e,t)=>{let n=!!e._horizontal,r=n?e.scrollLeft:e.scrollTop,i=n?e.scrollWidth-e.clientWidth:e.scrollHeight-e.clientHeight;return t<0?r>.5:t>0&&r<i-.5},s=t.find(e=>!!e._horizontal===i&&o(e,i?n:r))??(i?null:t.find(e=>e._horizontal&&o(e,r)));if(this.wheelLock=a=s?{el:s,total:0,snapped:!1}:null,!a){this.viewportDialogs&&e.target.closest?.(`.nsh-viewport`)&&e.preventDefault();return}}e.preventDefault(),a.t=i;let o=a.el,s=o._horizontal&&n||r;if(o._snapPoints){a.total+=s,!a.snapped&&Math.abs(a.total)>=20&&(a.snapped=!0,this.snapStep(o,Math.sign(a.total)));return}let c=e.deltaMode!==0||Math.abs(s)>=40;this.scrollSmoothly(o,o._horizontal?s:0,o._horizontal?0:s,c)}scrollSmoothly(e,t,n,r){let i=e._glide;i||(i=e._glide={x:e.scrollLeft,y:e.scrollTop,frame:0,timer:0,last:0},this.drive(e,1)),i.x=Math.min(Math.max(i.x+t,0),e.scrollWidth-e.clientWidth),i.y=Math.min(Math.max(i.y+n,0),e.scrollHeight-e.clientHeight);let a=()=>{i.frame||i.timer||(e._glide=null,this.drive(e,-1),this.ownEnd(e))};if(!r)cancelAnimationFrame(i.frame),i.frame=0,e.scrollLeft=i.x,e.scrollTop=i.y;else if(!i.frame){i.last=performance.now(),i.at=[e.scrollLeft,e.scrollTop];let t=n=>{let r=1-.75**((n-i.last)/16.7);i.last=n;let o=i.at[0]+(i.x-i.at[0])*r,s=i.at[1]+(i.y-i.at[1])*r,c=Math.abs(i.x-o)<.5&&Math.abs(i.y-s)<.5;i.at=c?[i.x,i.y]:[o,s],e.scrollLeft=i.at[0],e.scrollTop=i.at[1],i.frame=c?0:requestAnimationFrame(t),c&&a()};i.frame=requestAnimationFrame(t)}clearTimeout(i.timer),i.timer=setTimeout(()=>{i.timer=0,a()},200)}stopGlide(e,t,n){let r=e._glide;if(!r)return;cancelAnimationFrame(r.frame),clearTimeout(r.timer),e._glide=null,this.drive(e,-1);let i=(e,t,n)=>Math.min(Math.max(e,0),n)===t;i(t,e.scrollLeft,e.scrollWidth-e.clientWidth)&&i(n,e.scrollTop,e.scrollHeight-e.clientHeight)?this.ownEnd(e):this.waitCommandEnd(e)}waitCommandEnd(e){clearTimeout(e._commandEnd),e._commandEnd=setTimeout(()=>{this.scrollEnded(e),e._ownEnd=[e.scrollLeft,e.scrollTop]},200)}snapPoint(e,t){let n=e._horizontal?e.scrollLeft:e.scrollTop,r=e._snapPoints;return t>0?r.find(e=>e>n+1):t<0?[...r].reverse().find(e=>e<n-1):r.reduce((e,t)=>Math.abs(t-n)<Math.abs(e-n)?t:e)}snapStep(e,t){t&&this.snapTo(e,this.snapPoint(e,t))}snapTo(e,t){let n=!!e._horizontal;return t==null||Math.abs(t-(n?e.scrollLeft:e.scrollTop))<1?!1:(e._momentum=!0,this.scrollEvent(e,`onMomentumStart`),e.scrollTo({[n?`left`:`top`]:t,behavior:`smooth`}),!0)}wheelPinch(e){let t=this.wheelPinchState;if(!t){let n=this.viewOf(e.target),r=n&&this.ancestors(n).find(e=>e._gestures?.pinch);if(!r)return;t=this.wheelPinchState={el:r,scale:1,timer:0},this.call(e=>e.nsh_transform_gesture(r._id,0,0,1))}t.scale*=Math.exp(-e.deltaY/100),this.call(e=>e.nsh_transform_gesture(t.el._id,0,1,t.scale)),clearTimeout(t.timer),t.timer=setTimeout(()=>{this.wheelPinchState=null,this.call(e=>e.nsh_transform_gesture(t.el._id,0,2,t.scale))},150)}drive(e,t){e._driven=Math.max(0,(e._driven??0)+t)}ownEnd(e){e._ownEnd=[e.scrollLeft,e.scrollTop],this.scrollEvent(e,`onScrollEnd`)}scrollEvent(e,t){t===`onScrollEnd`&&this.call(t=>t.nsh_scroll_ended(e._id)),e._events.has(t)&&this.event(e._id,t,{x:e.scrollLeft,y:e.scrollTop})}point(e,t=this.windowLayer(e.target)){let[n,r]=this.origin(t),[i,a]=this.layerScale(t);return[e.clientX/i-n,e.clientY/a-r]}layerScale(e){return e&&this.frameScale||[1,1]}corner(e,t){let n=e.getBoundingClientRect(),[r,i]=this.origin(t),[a,o]=this.layerScale(t);return[n.left/a-r,n.top/o-i]}windowLayer(e){return this.viewportDialogs?e?.closest?.(`.nsh-modal.nsh-viewport`)??null:null}origin(e){if(e)return[0,0];let t=this.root.getBoundingClientRect();return[t.left,t.top]}touchEvent(e,t,n){let r=[];for(let[e,n]of this.pointers){if(!n.touchPath.length)continue;let i=n.touchPath[0],a=this.view(i),[o,s]=a?this.corner(a,n.layer):[0,0];r.push({id:e,target:i,path:n.touchPath,pageX:n.x,pageY:n.y,x:n.x-o,y:n.y-s,changed:e===t})}if(!r.length)return;let i=JSON.stringify({phase:e,time:performance.now(),points:r,activated:n});this.call(()=>this.withStrings([i],(e,t)=>this.wasm.nsh_touch(e,t)))}pointerDown(t){if(this.lastPointer=t.pointerType,t.pointerType===`mouse`&&(this.hoverButtons=t.buttons),L.active=this,t.button>0||t.pointerType===`mouse`&&this.desktopUI&&this.grabBar(t))return;let n=this.editable(t.target),r=getSelection();!n&&t.pointerType===`mouse`&&r?.rangeCount&&!r.isCollapsed&&this.root.contains(r.anchorNode)&&r.removeAllRanges();let i=this.viewOf(t.target);if(!i)return;let a=t.target.classList?.contains(`nsh-field`),o=this.ancestors(i),s=this.windowLayer(t.target),[c,l]=this.point(t,s),u=a?null:o.find(e=>e._kind===`scroll`)??null,d={x:c,y:l,layer:s,startX:c,startY:l,t:performance.now(),vx:0,vy:0,touchPath:o.filter(e=>e._events.has(`onTouch`)).map(e=>e._id),press:a?null:this.linkPress(t.target,i)??o.find(t=>e.some(e=>t._events.has(e))&&!t._props?.disabled)??null,modifiers:{control:t.ctrlKey,alt:t.altKey,shift:t.shiftKey,platform:t.metaKey},clicks:t.pointerType===`mouse`?this.clickCount(c,l):1,pan:o.find(e=>e._gestures?.pan||e._events.has(`onPanStart`)||e._events.has(`onPanEnd`))??null,scroll:!n&&u&&t.pointerType!==`mouse`&&this.zooms(u)?u:null,scrolls:t.pointerType===`touch`?o.filter(e=>e._kind===`scroll`):null,zoom:o.find(e=>this.zooms(e)&&e._behavior.pinch)??null,pinch:o.find(e=>e._gestures?.pinch||e._gestures?.rotation)??null,gate:o.find(e=>e._props?.panActivation)??null,gateState:0,states:o.filter(e=>e._tracked&1),mode:null};this.pointers.set(t.pointerId,d),d.touchPath.length&&this.touchEvent(0,t.pointerId),this.pointers.size===2&&this.startTwoFinger(),d.press&&this.pressIn(d);for(let e of d.states)this.setState(e,1,!0);(d.scroll||d.pan)&&!a&&t.preventDefault()}linkPress(t,n){let r=t?._link;return!r||!e.some(e=>r.events.has(e))?null:{_id:r.node,_events:r.events,_props:n._props,getBoundingClientRect:()=>n.getBoundingClientRect()}}pressIn(e){let t=e.press;e.pressed=!0,t._events.has(`onPressIn`)&&this.event(t._id,`onPressIn`,this.pressPayload(e)),t._events.has(`onLongPress`)&&(e.longTimer=setTimeout(()=>{e.long=!0,this.event(t._id,`onLongPress`,this.pressPayload(e))},t._props?.longPressDelay??500))}pressOut(e,t){let n=e.press;n&&e.pressed&&(e.pressed=!1,clearTimeout(e.longTimer),n._events.has(`onPressOut`)&&this.event(n._id,`onPressOut`,this.pressPayload(e)),t&&!e.long&&n._events.has(`onPress`)&&this.event(n._id,`onPress`,this.pressPayload(e)))}pressPayload(e){if(e.x===void 0)return null;let[t,n]=this.corner(e.press,e.layer);return{position:{x:e.x-t,y:e.y-n},pagePosition:{x:e.x,y:e.y},modifiers:e.modifiers,clicks:e.clicks}}clickCount(e,t){let n=performance.now(),r=this.lastClick,i=r&&n-r.t<=500&&Math.abs(e-r.x)<=5&&Math.abs(t-r.y)<=5?r.n%3+1:1;return this.lastClick={t:n,x:e,y:t,n:i},i}track(e,t){let n=e.samples??=[];n.push([t,e.x,e.y]),n.length>16&&n.shift()}velocity(e){let t=e.samples??[],n=t[t.length-1];if(!n)return[0,0];let r=n;for(let e=t.length-2;e>=0&&n[0]-t[e][0]<=100;e--)r=t[e];let i=n[0]-r[0];return i<1?[0,0]:[(n[1]-r[1])/i*1e3,(n[2]-r[2])/i*1e3]}pointerMove(e){let t=this.pointers.get(e.pointerId);if(!t)return;if(t.mode===`bar`){e.preventDefault(),this.dragBar(t,e);return}let[n,r]=this.point(e,t.layer),i=performance.now(),a=Math.max(1,i-t.t);t.vx=(n-t.x)/a*1e3,t.vy=(r-t.y)/a*1e3,n-t.lastX0,t.lastX0=n,t.x=n,t.y=r,t.t=i,this.track(t,i);let o=n-t.startX,s=r-t.startY,c=this.decideGate(t,o,s);if(t.touchPath.length&&this.touchEvent(1,e.pointerId,c),this.twoFinger){this.moveTwoFinger();return}let l=t.gate&&t.gateState!==2;if(l&&t.gateState===1&&e.preventDefault(),!t.mode&&Math.hypot(o,s)>6&&(t.pan?(t.mode=`pan`,this.call(e=>e.nsh_pan(t.pan._id,0,0,0,0,0))):t.scroll&&!l&&(t.mode=`scroll`,t.scrollStart=[t.scroll.scrollLeft,t.scroll.scrollTop],cancelAnimationFrame(t.scroll._zoomAnimation),this.drive(t.scroll,1),this.scrollEvent(t.scroll,`onScrollDragStart`)),t.mode||Math.hypot(o,s)>10)){this.pressOut(t,!1);for(let e of t.states)this.setState(e,1,!1)}if(t.mode===`pan`){e.preventDefault();let[n,r]=this.velocity(t);this.call(e=>e.nsh_pan(t.pan._id,1,o,s,n,r))}else if(t.mode===`scroll`){e.preventDefault();let n=t.scroll;n.scrollLeft=t.scrollStart[0]-o,n.scrollTop=t.scrollStart[1]-s}}decideGate(e,t,n){if(!e.gate||e.gateState!==0)return;let[r,i,a,o]=e.gate._props.panActivation,s=(e,t)=>e!=null&&Math.abs(t)>e;if(s(a,t)||s(o,n))e.gateState=2;else if(r==null&&i==null?Math.hypot(t,n)>10:s(r,t)||s(i,n))return e.gateState=1,this.pressOut(e,!1),e.gate._id}pointerUp(e,t){e.pointerType===`mouse`&&(this.hoverButtons=e.buttons);let n=this.pointers.get(e.pointerId);if(n){if(n.mode===`bar`)this.pointers.delete(e.pointerId),this.releaseBar(n.scroll);else if(t&&n.scrolls?.length&&this.touchScroll(n,this.point(e,n.layer)),n.touchPath.length&&this.touchEvent(t?3:2,e.pointerId),this.pointers.delete(e.pointerId),this.twoFinger)this.endTwoFinger();else{for(let e of n.states)this.setState(e,1,!1);if(n.mode===`pan`){this.track(n,performance.now());let[e,r]=this.velocity(n);this.call(i=>i.nsh_pan(n.pan._id,t?3:2,n.x-n.startX,n.y-n.startY,e,r))}else if(n.mode===`scroll`)this.scrollEvent(n.scroll,`onScrollDragEnd`),this.glide(n.scroll,-n.vx,-n.vy);else if(n.press){t||([n.x,n.y]=this.point(e,n.layer));let r=n.press.getBoundingClientRect(),i=e.clientX>=r.left-8&&e.clientX<=r.right+8&&e.clientY>=r.top-8&&e.clientY<=r.bottom+8;this.pressOut(n,i&&!t)}}}}touchScroll(e,[t,n]){let r=Math.abs(t-e.startX)>Math.abs(n-e.startY),i=e.scrolls.find(e=>!!e._horizontal===r)??e.scrolls[0];i._touchDrag||(i._touchDrag=!0,i._momentum=!1,(this.touchDrags??=new Set).add(i),this.scrollEvent(i,`onScrollDragStart`),this.touchEndListener||(this.touchEndListener=e=>{if(!e.touches.length){for(let e of this.touchDrags)e._touchDrag=!1,e._released=performance.now(),this.scrollEvent(e,`onScrollDragEnd`),setTimeout(()=>e._released&&!e._momentum&&this.scrollEnded(e),200);this.touchDrags.clear()}},window.addEventListener(`touchend`,this.touchEndListener),window.addEventListener(`touchcancel`,this.touchEndListener)))}glide(e,t,n){let r=Math.abs(t)>80?t/1e3:0,i=Math.abs(n)>80?n/1e3:0,a=performance.now(),o=i!==0||r!==0,s=()=>{this.drive(e,-1),this.snapMarkers(e),o&&this.scrollEvent(e,`onMomentumEnd`),this.ownEnd(e)};if(!i&&!r){s();return}this.scrollEvent(e,`onMomentumStart`);let c=t=>{let n=t-a;a=t,e.scrollTop+=i*n,e.scrollLeft+=r*n,i*=.995**n,r*=.995**n,Math.abs(i)>.02||Math.abs(r)>.02?requestAnimationFrame(c):s()};requestAnimationFrame(c)}startTwoFinger(){let[e,t]=[...this.pointers.values()],n=e.pinch??t.pinch;if(n){for(let n of[e,t])this.pressOut(n,!1);this.twoFinger={el:n,dist:Math.hypot(e.x-t.x,e.y-t.y),angle:Math.atan2(t.y-e.y,t.x-e.x)},n._gestures?.pinch&&this.call(e=>e.nsh_transform_gesture(n._id,0,0,1)),n._gestures?.rotation&&this.call(e=>e.nsh_transform_gesture(n._id,1,0,0))}else{let n=e.zoom??t.zoom;n&&this.startPinchZoom(n,e,t)}}twoFingerAmounts(){let[e,t]=[...this.pointers.values()],n=this.twoFinger;if(!e||!t)return[n.scale??1,n.rotation??0];let r=Math.hypot(e.x-t.x,e.y-t.y)/Math.max(1,n.dist),i=(Math.atan2(t.y-e.y,t.x-e.x)-n.angle)*180/Math.PI;return n.scale=r,n.rotation=i,[r,i]}startPinchZoom(e,t,n){for(let e of[t,n])this.pressOut(e,!1);cancelAnimationFrame(e._zoomAnimation);let[r,i]=this.corner(e,t.layer),a=(t.x+n.x)/2-r,o=(t.y+n.y)/2-i;this.twoFinger={zoom:e,dist:Math.hypot(t.x-n.x,t.y-n.y),scale:e._zoom,point:this.contentPoint(e,a,o)}}moveTwoFinger(){let e=this.twoFinger;if(e.zoom){let[t,n]=[...this.pointers.values()];if(!t||!n)return;let[r,i]=this.corner(e.zoom,t.layer);e.focus=[(t.x+n.x)/2-r,(t.y+n.y)/2-i];let a=this.limitZoom(e.zoom,e.scale*Math.hypot(t.x-n.x,t.y-n.y)/Math.max(1,e.dist),!0);this.zoomContent(e.zoom,a,e.point[0],e.point[1],e.focus[0],e.focus[1]);return}let[t,n]=this.twoFingerAmounts();e.el._gestures?.pinch&&this.call(n=>n.nsh_transform_gesture(e.el._id,0,1,t)),e.el._gestures?.rotation&&this.call(t=>t.nsh_transform_gesture(e.el._id,1,1,n))}endTwoFinger(){let e=this.twoFinger;if(this.twoFinger=null,e.zoom){let t=e.focus??[e.zoom.clientWidth/2,e.zoom.clientHeight/2];this.zoomEnded(e.zoom,t[0],t[1]),this.pointers.clear();return}let t=e.scale??1,n=e.rotation??0;e.el._gestures?.pinch&&this.call(n=>n.nsh_transform_gesture(e.el._id,0,2,t)),e.el._gestures?.rotation&&this.call(t=>t.nsh_transform_gesture(e.el._id,1,2,n)),this.pointers.clear()}}
Binary file
Binary file
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pikibun",
3
- "version": "0.24.0",
3
+ "version": "0.25.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pikibun",
9
- "version": "0.24.0",
9
+ "version": "0.25.0",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@earendil-works/chord": "1.5.0",