diff --git a/demos/manifest.toml b/demos/manifest.toml index f0664e9..e91fac6 100644 --- a/demos/manifest.toml +++ b/demos/manifest.toml @@ -2,42 +2,42 @@ # You typically do not need to edit this file packages = [ - { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "" }, - { name = "booklet", version = "1.1.0", build_tools = ["gleam"], requirements = [], otp_app = "booklet", source = "hex", outer_checksum = "" }, - { name = "directories", version = "1.2.0", build_tools = ["gleam"], requirements = ["envoy", "gleam_stdlib", "platform", "simplifile"], otp_app = "directories", source = "hex", outer_checksum = "" }, - { name = "envoy", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "envoy", source = "hex", outer_checksum = "" }, - { name = "exception", version = "2.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "exception", source = "hex", outer_checksum = "" }, - { name = "filepath", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "" }, - { name = "gleam_community_ansi", version = "1.5.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_regexp", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "" }, - { name = "gleam_community_colour", version = "2.0.4", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "" }, - { name = "gleam_crypto", version = "1.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "" }, - { name = "gleam_erlang", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "" }, - { name = "gleam_http", version = "4.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "" }, - { name = "gleam_httpc", version = "5.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "" }, - { name = "gleam_json", version = "3.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "" }, - { name = "gleam_otp", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "" }, - { name = "gleam_regexp", version = "1.1.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_regexp", source = "hex", outer_checksum = "" }, - { name = "gleam_stdlib", version = "1.0.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "" }, - { name = "gleam_time", version = "1.8.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_time", source = "hex", outer_checksum = "" }, - { name = "glint", version = "1.2.1", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "" }, - { name = "glisten", version = "9.0.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib", "logging"], otp_app = "glisten", source = "hex", outer_checksum = "" }, - { name = "gramps", version = "6.0.1", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "" }, - { name = "group_registry", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "group_registry", source = "hex", outer_checksum = "" }, - { name = "houdini", version = "1.2.1", build_tools = ["gleam"], requirements = [], otp_app = "houdini", source = "hex", outer_checksum = "" }, - { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "" }, - { name = "justin", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "justin", source = "hex", outer_checksum = "" }, - { name = "logging", version = "1.5.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "" }, - { name = "lustre", version = "5.6.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib", "houdini"], otp_app = "lustre", source = "hex", outer_checksum = "" }, - { name = "lustre_dev_tools", version = "2.3.6", build_tools = ["gleam"], requirements = ["argv", "booklet", "filepath", "gleam_community_ansi", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_httpc", "gleam_json", "gleam_otp", "gleam_regexp", "gleam_stdlib", "glint", "group_registry", "justin", "lustre", "mist", "polly", "simplifile", "tom", "wisp"], otp_app = "lustre_dev_tools", source = "hex", outer_checksum = "" }, - { name = "marceau", version = "1.3.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "" }, - { name = "mist", version = "6.0.3", build_tools = ["gleam"], requirements = ["exception", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "" }, - { name = "off_topic", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib", "gleam_time", "lustre"], source = "local", path = ".." }, - { name = "platform", version = "1.0.0", build_tools = ["gleam"], requirements = [], otp_app = "platform", source = "hex", outer_checksum = "" }, - { name = "polly", version = "3.1.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_erlang", "gleam_otp", "gleam_stdlib", "simplifile"], otp_app = "polly", source = "hex", outer_checksum = "" }, - { name = "simplifile", version = "2.4.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "" }, - { name = "snag", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "" }, - { name = "tom", version = "2.0.2", build_tools = ["gleam"], requirements = ["gleam_stdlib", "gleam_time"], otp_app = "tom", source = "hex", outer_checksum = "" }, - { name = "wisp", version = "2.2.2", build_tools = ["gleam"], requirements = ["directories", "exception", "filepath", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "houdini", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "" }, + { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" }, + { name = "booklet", version = "1.1.0", build_tools = ["gleam"], requirements = [], otp_app = "booklet", source = "hex", outer_checksum = "08E0FDB78DC4D8A5D3C80295B021505C7D2A2E7B6C6D5EAB7286C36F4A53C851" }, + { name = "directories", version = "1.2.0", build_tools = ["gleam"], requirements = ["envoy", "gleam_stdlib", "platform", "simplifile"], otp_app = "directories", source = "hex", outer_checksum = "D13090CFCDF6759B87217E8DDD73A75903A700148A82C1D33799F333E249BF9E" }, + { name = "envoy", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "envoy", source = "hex", outer_checksum = "9C6FBB6BFA02A52798BEEC5977A738CAD6E4A057F4B67FD0C8061AD2502C191A" }, + { name = "exception", version = "2.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "exception", source = "hex", outer_checksum = "329D269D5C2A314F7364BD2711372B6F2C58FA6F39981572E5CA68624D291F8C" }, + { name = "filepath", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "B06A9AF0BF10E51401D64B98E4B627F1D2E48C154967DA7AF4D0914780A6D40A" }, + { name = "gleam_community_ansi", version = "1.5.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_regexp", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "B5AA433AF84313E23FDF90CCFF752B9380FE9FFCE02B2949D49B7AACCC77B16D" }, + { name = "gleam_community_colour", version = "2.0.4", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "6DB4665555D7D2B27F0EA32EF47E8BEBC4303821765F9C73D483F38EE24894F0" }, + { name = "gleam_crypto", version = "1.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "2DE9E4EF53CF6FEE049D4F765731F7178F7A11AEFAE00EEE63BF7536B354AD3F" }, + { name = "gleam_erlang", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "1124AD3AA21143E5AF0FC5CF3D9529F6DB8CA03E43A55711B60B6B7B3874375C" }, + { name = "gleam_http", version = "4.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "82EA6A717C842456188C190AFB372665EA56CE13D8559BF3B1DD9E40F619EE0C" }, + { name = "gleam_httpc", version = "5.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "C545172618D07811494E97AAA4A0FB34DA6F6D0061FDC8041C2F8E3BE2B2E48F" }, + { name = "gleam_json", version = "3.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "44FDAA8847BE8FC48CA7A1C089706BD54BADCC4C45B237A992EDDF9F2CDB2836" }, + { name = "gleam_otp", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "BA6A294E295E428EC1562DC1C11EA7530DCB981E8359134BEABC8493B7B2258E" }, + { name = "gleam_regexp", version = "1.1.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_regexp", source = "hex", outer_checksum = "9C215C6CA84A5B35BB934A9B61A9A306EC743153BE2B0425A0D032E477B062A9" }, + { name = "gleam_stdlib", version = "1.0.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "960090C2FB391784BB34267B099DC9315CC1B1F6013E7415BC763CEF1905D7D3" }, + { name = "gleam_time", version = "1.8.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_time", source = "hex", outer_checksum = "533D8723774D61AD4998324F5DD1DABDCDBFABAFB9E87CB5D03C6955448FC97D" }, + { name = "glint", version = "1.2.1", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "2214C7CEFDE457CEE62140C3D4899B964E05236DA74E4243DFADF4AF29C382BB" }, + { name = "glisten", version = "9.0.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib", "logging"], otp_app = "glisten", source = "hex", outer_checksum = "7795AA50830656F3A0316A6B26595F893C83272DA901B3405E31339CAA31A10B" }, + { name = "gramps", version = "6.0.1", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "D55636072DEE173F6586A5679D3C02EC7A0DE3F8646B78C351B72908FF223DF7" }, + { name = "group_registry", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "group_registry", source = "hex", outer_checksum = "BC798A53D6F2406DB94E27CB45C57052CB56B32ACF7CC16EA20F6BAEC7E36B90" }, + { name = "houdini", version = "1.2.1", build_tools = ["gleam"], requirements = [], otp_app = "houdini", source = "hex", outer_checksum = "6F8AC2F12974567FB744BEA66AC93CEB76AAEA19AD28564623F76CDA9BC26A85" }, + { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, + { name = "justin", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "justin", source = "hex", outer_checksum = "8B1C62269E8607D0A0ED698B7903984CE0BF7B6B3C0DEA3C6C8302B39402837B" }, + { name = "logging", version = "1.5.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "BC5F18CE5DD9686100229FE5409BDC3DD5C46D5A7DF2F804AD2D8F0DD6C5060E" }, + { name = "lustre", version = "5.6.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib", "houdini"], otp_app = "lustre", source = "hex", outer_checksum = "EE558CD4DB9F09FCC16417ADF0183A3C2DAC3E4B21ED3AC0CAE859792AB810CA" }, + { name = "lustre_dev_tools", version = "2.3.6", build_tools = ["gleam"], requirements = ["argv", "booklet", "filepath", "gleam_community_ansi", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_httpc", "gleam_json", "gleam_otp", "gleam_regexp", "gleam_stdlib", "glint", "group_registry", "justin", "lustre", "mist", "polly", "simplifile", "tom", "wisp"], otp_app = "lustre_dev_tools", source = "hex", outer_checksum = "7A650A107C7E767D902A8CB608460B927DE0CDD47D5BA04DED71F9F622FE6AD9" }, + { name = "marceau", version = "1.3.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "2D1C27504BEF45005F5DFB18591F8610FB4BFA91744878210BDC464412EC44E9" }, + { name = "mist", version = "6.0.3", build_tools = ["gleam"], requirements = ["exception", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "1B07F321D5FA0CB162D81496F2DE96AEB6EF8980F4F38230A4CC3F849497E020" }, + { name = "off_topic", version = "1.0.0-rc2", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib", "gleam_time", "lustre"], source = "local", path = ".." }, + { name = "platform", version = "1.0.0", build_tools = ["gleam"], requirements = [], otp_app = "platform", source = "hex", outer_checksum = "8339420A95AD89AAC0F82F4C3DB8DD401041742D6C3F46132A8739F6AEB75391" }, + { name = "polly", version = "3.1.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_erlang", "gleam_otp", "gleam_stdlib", "simplifile"], otp_app = "polly", source = "hex", outer_checksum = "51FB565D81FF6212FDF3306D44419601F2A7C4EDD1F00FC9DA5C376A00AED4FE" }, + { name = "simplifile", version = "2.4.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "7C18AFA4FED0B4CE1FA5B0B4BAC1FA1744427054EA993565F6F3F82E5453170D" }, + { name = "snag", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "274F41D6C3ECF99F7686FDCE54183333E41D2C1CA5A3A673F9A8B2C7A4401077" }, + { name = "tom", version = "2.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "gleam_time"], otp_app = "tom", source = "hex", outer_checksum = "DCF04CB7AB35D58CFC598C66EA2E1816D160759802C89B2BA6238780D59BC256" }, + { name = "wisp", version = "2.2.2", build_tools = ["gleam"], requirements = ["directories", "exception", "filepath", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "houdini", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "5FF5F1E288C3437252ABB93D8F9CF42FF652CE7AD54480CFE736038DC09C4F22" }, ] [requirements] diff --git a/gleam.toml b/gleam.toml index e4ea112..7c57ca4 100644 --- a/gleam.toml +++ b/gleam.toml @@ -1,5 +1,5 @@ name = "off_topic" -version = "1.0.0-rc1" +version = "1.0.0-rc2" target = "javascript" # Fill out these fields if you intend to generate HTML documentation or publish diff --git a/priv/static/off-topic.min.mjs b/priv/static/off-topic.min.mjs index 5b7b0e8..d1f5766 100644 --- a/priv/static/off-topic.min.mjs +++ b/priv/static/off-topic.min.mjs @@ -1,3 +1,3 @@ var de=e=>e.head,O=e=>e.tail;var ke=5,ct=(1<i.removeEventListener(t,r)}function U(e){let t=()=>document.visibilityState==="hidden"?"hidden":document.hasFocus()?"active":"passive",r=s=>{s!==n&&(e(s),n=s)},n=t();n!=="active"&&e(n);let i=new AbortController,o={capture:!0,signal:i.signal};return["pageshow","focus","blur","visibilitychange","resume"].forEach(s=>{window.addEventListener(s,()=>r(t()),o)}),window.addEventListener("freeze",()=>{r("frozen")},o),window.addEventListener("pagehide",s=>{r(s.persisted?"frozen":"terminated")},o),()=>i.abort()}function j(e){let t=()=>-new Date().getTimezoneOffset(),r=t();e(r);let n=setInterval(()=>{let i=t();i!==r&&(r=i,e(i))},6e4);return()=>clearInterval(n)}var et=ze(window,"online","offline",()=>navigator.onLine),D=ze(document.documentElement,"pointerenter","pointerleave",()=>document.documentElement.matches(":hover"));function F(e){let t=r=>{r.preventDefault(),e()};return window.addEventListener("beforeunload",t),()=>window.removeEventListener("beforeunload",t)}function R(e,t){let r=!1,n=null,i=()=>{r&&(r=!1,t(!1)),clearTimeout(n),n=setTimeout(()=>{r=!0,t(!0)},e)},o=()=>{document.hidden||i()},s=["pointermove","pointerdown","keydown","scroll","wheel","resize"];for(let l of s)window.addEventListener(l,i,{passive:!0});return document.addEventListener("visibilitychange",o),i(),()=>{clearTimeout(n);for(let l of s)window.removeEventListener(l,i);document.removeEventListener("visibilitychange",o)}}function P(e){return I(null,window,"resize",()=>e(window.innerWidth,window.innerHeight))}function V(e){return I(null,window,"scroll",()=>e(window.scrollX,window.scrollY))}function W(e){return I(null,screen.orientation,"change",()=>e(screen.orientation.type))}function G(e){return I(null,window,"languagechange",()=>e(navigator.language))}function H(e,t,r){let n=[];Se(t,([s,l])=>{n.push([window.matchMedia(s),l])});let i=()=>n.find(([s])=>s.matches)?.[1]??e,o=()=>r(i());o();for(let[s]of n)s.addEventListener("change",o);return()=>{for(let[s]of n)s.removeEventListener("change",o)}}var X=Ee(localStorage),K=Ee(sessionStorage);function Ee(e){return(t,r)=>{let n=e.getItem(t);return r(n!==null,n??""),$(window,"storage",o=>{if(o.storageArea===e&&o.key===t){let s=o.newValue;r(s!==null,s??"")}})}}function Y(e,t,r){let n=u(e,r);if(!n)return c;let{width:i,height:o}=n.getBoundingClientRect();t(Math.round(i),Math.round(o));let s=new ResizeObserver(l=>{let{width:p,height:y}=l[0].contentRect;t(Math.round(p),Math.round(y))});return s.observe(n),()=>s.disconnect()}function J(e,t,r){let n=u(e,r);if(!n)return c;let i=n.getBoundingClientRect();t(i.bottom>0&&i.right>0&&i.top{t(s[0].isIntersecting)});return o.observe(n),()=>o.disconnect()}function Q(e,t,r){let n=u(e,r);if(!n)return c;let i=()=>t(Math.round(n.scrollLeft),Math.round(n.scrollTop));return i(),n.addEventListener("scroll",i,{passive:!0}),()=>n.removeEventListener("scroll",i)}function Z(e){return document.title=e,c}function ee(e,t){let r=document.head.querySelector(`meta[name="${CSS.escape(e)}"]`);return r||(r=document.createElement("meta"),r.setAttribute("name",e),document.head.appendChild(r)),r.setAttribute("content",t),c}function te(e){let t=e.split(" ");return document.body.classList.add(...t),()=>document.body.classList.remove(...t)}function ne(e,t,r,n){let o=(n instanceof ShadowRoot?n.host:n)?.internals;if(o){let s=e==="role"?"role":"aria"+e.slice(5).replace(/-([a-z])/g,(l,p)=>p.toUpperCase()).replace(/^./,l=>l.toUpperCase());o[s]=t}return c}function re(e,t,r,n){let o=(n instanceof ShadowRoot?n.host:n)?.internals;return o&&(t?o.states.add(e):o.states.delete(e)),c}function ie(e,t,r,n){return(n instanceof ShadowRoot?n.host:n)?.internals?.setFormValue(e?t:void 0),c}function I(e,t,r,n){let i=u(t,e);return n(),$(i,r,n)}function ze(e,t,r,n){return i=>{i(n());let o=()=>i(!0),s=()=>i(!1);return e.addEventListener(t,o),e.addEventListener(r,s),()=>{e.removeEventListener(t,o),e.removeEventListener(r,s)}}}function c(){}function Be(e,t,r,n){window.dispatchEvent(new StorageEvent("storage",{key:t,oldValue:r,newValue:n,storageArea:e,url:window.location.href}))}function oe(e,t,r){let n=r?localStorage.getItem(e):null;localStorage.setItem(e,t),r&&Be(localStorage,e,n,t)}function se(e,t,r){let n=r?sessionStorage.getItem(e):null;sessionStorage.setItem(e,t),r&&Be(sessionStorage,e,n,t)}function le(e,t,r,n,i){u(e,i)?.scrollTo({left:t,top:r,behavior:n})}function fe(e,t,r,n,i){u(e,i)?.scrollIntoView({block:t,inline:r,behavior:n})}function ue(e,t){u(e,t)?.focus()}function ce(){document.activeElement?.blur()}var ae=class extends HTMLElement{#e=null;#t=new Map;connectedCallback(){this.#e=rt(this),this.#e&&(this.#e.addEventListener("off-topic:subscribe",this.#n),this.#e.addEventListener("off-topic:unsubscribe",this.#r),this.#e.addEventListener("off-topic:command",this.#i)),this.dispatchEvent(new CustomEvent("off-topic:mount"))}connectedMoveCallback(){}disconnectedCallback(){this.#e&&(this.#e.removeEventListener("off-topic:subscribe",this.#n),this.#e.removeEventListener("off-topic:unsubscribe",this.#r),this.#e=null),queueMicrotask(()=>{if(!this.isConnected){for(let t of this.#t.values())clearTimeout(t.delayTimeout),t.cleanup?.();this.#t.clear()}})}#n=t=>{let{detail:{tick:r,path:n,name:i,params:o,include:s,throttle:l=0,delay:p=0}}=t,y=`${r}:${n.join(":")}`;if(this.#t.has(y))return;let pe=window.OffTopic.subscriptions[i];if(!pe){console.warn(`off-topic: subscription '${i}' requested, but not registered`);return}let a={tick:r,path:n,params:o,cleanup:void 0,lastFired:0,lastThrottledData:void 0,delayTimeout:void 0},C=d=>{let _=Array.isArray(d)?d.map(Ie=>Ae(Ie,s)):Ae(d,s),S=new CustomEvent("off-topic:dispatch",{detail:{tick:r,path:n,message:_}});this.dispatchEvent(S)},ve=(...d)=>{let _=d.length===1?d[0]:d;if(l>0){let S=Date.now();S>=a.lastFired+l&&(a.lastFired=S,a.lastThrottledData=_,C(_))}p>0&&(clearTimeout(a.delayTimeout),a.delayTimeout=setTimeout(()=>{_!==a.lastThrottledData&&C(_)},p)),!l&&!p&&C(_)};a.cleanup=pe(...o,ve,this.#e),this.#t.set(y,a)};#r=t=>{let{detail:{tick:r,path:n}}=t,i=`${r}:${n.join(":")}`,o=this.#t.get(i);o&&(this.#t.delete(i),clearTimeout(o.delayTimeout),o.cleanup?.())};#i=t=>{let{detail:{name:r,params:n}}=t;window.OffTopic.commands[r]?.(...n,this.#e)}};function rt(e){for(;e!=null;){if(e instanceof ShadowRoot&&e.host.tagName.toLowerCase()==="lustre-server-component")return e.host;e=e.parentNode}return console.error(` is not mounted inside a Lustre server component and will not work! +`,"\v","\f","\r","\x85","\u2028","\u2029"].join(""),Rt=new RegExp(`^[${ge}]*`),Pt=new RegExp(`[${ge}]*$`);var Vt=-(2**31),Wt=2**31-1,Gt=2**32,Ht=Number.MAX_SAFE_INTEGER,Xt=Number.MIN_SAFE_INTEGER;function Se(e,t){if(Array.isArray(e))for(let r=0;ri.removeEventListener(t,r)}function U(e){let t=()=>document.visibilityState==="hidden"?"hidden":document.hasFocus()?"active":"passive",r=s=>{s!==n&&(e(s),n=s)},n=t();n!=="active"&&e(n);let i=new AbortController,o={capture:!0,signal:i.signal};return["pageshow","focus","blur","visibilitychange","resume"].forEach(s=>{window.addEventListener(s,()=>r(t()),o)}),window.addEventListener("freeze",()=>{r("frozen")},o),window.addEventListener("pagehide",s=>{r(s.persisted?"frozen":"terminated")},o),()=>i.abort()}function j(e){let t=()=>-new Date().getTimezoneOffset(),r=t();e(r);let n=setInterval(()=>{let i=t();i!==r&&(r=i,e(i))},6e4);return()=>clearInterval(n)}var et=ze(window,"online","offline",()=>navigator.onLine),D=ze(document.documentElement,"pointerenter","pointerleave",()=>document.documentElement.matches(":hover"));function F(e){let t=r=>{r.preventDefault(),e()};return window.addEventListener("beforeunload",t),()=>window.removeEventListener("beforeunload",t)}function R(e,t){let r=!1,n=null,i=()=>{r&&(r=!1,t(!1)),clearTimeout(n),n=setTimeout(()=>{r=!0,t(!0)},e)},o=()=>{document.hidden||i()},s=["pointermove","pointerdown","keydown","scroll","wheel","resize"];for(let l of s)window.addEventListener(l,i,{passive:!0});return document.addEventListener("visibilitychange",o),i(),()=>{clearTimeout(n);for(let l of s)window.removeEventListener(l,i);document.removeEventListener("visibilitychange",o)}}function P(e){return I(null,window,"resize",()=>e(window.innerWidth,window.innerHeight))}function V(e){return I(null,window,"scroll",()=>e(window.scrollX,window.scrollY))}function W(e){return I(null,screen.orientation,"change",()=>e(screen.orientation.type))}function G(e){return I(null,window,"languagechange",()=>e(navigator.language))}function H(e,t,r){let n=[];Se(t,([s,l])=>{n.push([window.matchMedia(s),l])});let i=()=>n.find(([s])=>s.matches)?.[1]??e,o=()=>r(i());o();for(let[s]of n)s.addEventListener("change",o);return()=>{for(let[s]of n)s.removeEventListener("change",o)}}var X=Ee(localStorage),K=Ee(sessionStorage);function Ee(e){return(t,r)=>{let n=e.getItem(t);return r(n!==null,n??""),$(window,"storage",o=>{if(o.storageArea===e&&o.key===t){let s=o.newValue;r(s!==null,s??"")}})}}function Y(e,t,r){let n=u(e,r);if(!n)return c;let{width:i,height:o}=n.getBoundingClientRect();t(i,o);let s=new ResizeObserver(l=>{let{width:p,height:y}=l[0].contentRect;t(p,y)});return s.observe(n),()=>s.disconnect()}function J(e,t,r){let n=u(e,r);if(!n)return c;let i=n.getBoundingClientRect();t(i.bottom>0&&i.right>0&&i.top{t(s[0].isIntersecting)});return o.observe(n),()=>o.disconnect()}function Q(e,t,r){let n=u(e,r);if(!n)return c;let i=()=>t(n.scrollLeft,n.scrollTop);return i(),n.addEventListener("scroll",i,{passive:!0}),()=>n.removeEventListener("scroll",i)}function Z(e){return document.title=e,c}function ee(e,t){let r=document.head.querySelector(`meta[name="${CSS.escape(e)}"]`);return r||(r=document.createElement("meta"),r.setAttribute("name",e),document.head.appendChild(r)),r.setAttribute("content",t),c}function te(e){let t=e.split(" ");return document.body.classList.add(...t),()=>document.body.classList.remove(...t)}function ne(e,t,r,n){let o=(n instanceof ShadowRoot?n.host:n)?.internals;if(o){let s=e==="role"?"role":"aria"+e.slice(5).replace(/-([a-z])/g,(l,p)=>p.toUpperCase()).replace(/^./,l=>l.toUpperCase());o[s]=t}return c}function re(e,t,r,n){let o=(n instanceof ShadowRoot?n.host:n)?.internals;return o&&(t?o.states.add(e):o.states.delete(e)),c}function ie(e,t,r,n){return(n instanceof ShadowRoot?n.host:n)?.internals?.setFormValue(e?t:void 0),c}function I(e,t,r,n){let i=u(t,e);return n(),$(i,r,n)}function ze(e,t,r,n){return i=>{i(n());let o=()=>i(!0),s=()=>i(!1);return e.addEventListener(t,o),e.addEventListener(r,s),()=>{e.removeEventListener(t,o),e.removeEventListener(r,s)}}}function c(){}function Be(e,t,r,n){window.dispatchEvent(new StorageEvent("storage",{key:t,oldValue:r,newValue:n,storageArea:e,url:window.location.href}))}function oe(e,t,r){let n=r?localStorage.getItem(e):null;localStorage.setItem(e,t),r&&Be(localStorage,e,n,t)}function se(e,t,r){let n=r?sessionStorage.getItem(e):null;sessionStorage.setItem(e,t),r&&Be(sessionStorage,e,n,t)}function le(e,t,r,n,i){u(e,i)?.scrollTo({left:t,top:r,behavior:n})}function fe(e,t,r,n,i){u(e,i)?.scrollIntoView({block:t,inline:r,behavior:n})}function ue(e,t){u(e,t)?.focus()}function ce(){document.activeElement?.blur()}var ae=class extends HTMLElement{#e=null;#t=new Map;#n=!1;connectedCallback(){this.#e=rt(this),this.#e&&(this.#e.addEventListener("off-topic:subscribe",this.#o),this.#e.addEventListener("off-topic:unsubscribe",this.#s),this.#e.addEventListener("off-topic:command",this.#l),this.#e.addEventListener("lustre:close",this.#i),this.#e.addEventListener("lustre:open",this.#r)),this.#n||this.#r()}connectedMoveCallback(){}disconnectedCallback(){this.#e&&(this.#e.removeEventListener("off-topic:subscribe",this.#o),this.#e.removeEventListener("off-topic:unsubscribe",this.#s),this.#e.removeEventListener("lustre:close",this.#i),this.#e.addEventListener("lustre:open",this.#r),this.#e=null),queueMicrotask(()=>{this.isConnected||this.#i()})}#o=t=>{let{detail:{tick:r,path:n,name:i,params:o,include:s,throttle:l=0,delay:p=0}}=t,y=`${r}:${n.join(":")}`;if(this.#t.has(y))return;let pe=window.OffTopic.subscriptions[i];if(!pe){console.warn(`off-topic: subscription '${i}' requested, but not registered`);return}let a={tick:r,path:n,params:o,cleanup:void 0,lastFired:0,lastThrottledData:void 0,delayTimeout:void 0},C=d=>{let _=Array.isArray(d)?d.map(Ie=>Ae(Ie,s)):Ae(d,s),S=new CustomEvent("off-topic:dispatch",{detail:{tick:r,path:n,message:_}});this.dispatchEvent(S)},ve=(...d)=>{let _=d.length===1?d[0]:d;if(l>0){let S=Date.now();S>=a.lastFired+l&&(a.lastFired=S,a.lastThrottledData=_,C(_))}p>0&&(clearTimeout(a.delayTimeout),a.delayTimeout=setTimeout(()=>{_!==a.lastThrottledData&&C(_)},p)),!l&&!p&&C(_)};a.cleanup=pe(...o,ve,this.#e),this.#t.set(y,a)};#s=t=>{let{detail:{tick:r,path:n}}=t,i=`${r}:${n.join(":")}`,o=this.#t.get(i);o&&(this.#t.delete(i),clearTimeout(o.delayTimeout),o.cleanup?.())};#l=t=>{let{detail:{name:r,params:n}}=t;window.OffTopic.commands[r]?.(...n,this.#e)};#r=()=>{this.dispatchEvent(new CustomEvent("off-topic:mount")),this.#n=!0};#i=()=>{for(let t of this.#t.values())clearTimeout(t.delayTimeout),t.cleanup?.();this.#t.clear(),this.#n=!1}};function rt(e){for(;e!=null;){if(e instanceof ShadowRoot&&e.host.tagName.toLowerCase()==="lustre-server-component")return e.host;e=e.parentNode}return console.error(` is not mounted inside a Lustre server component and will not work! If you are using lustre.start, you can use off_topic's effects directly and can remove this component.`),null}function Ae(e,t){if(typeof e!="object")return e;let r={};for(let n of t){let i=n.split(".");for(let o=0,s=e,l=r;o { const { width: width2, height: height2 } = entries[0].contentRect; - dispatch(Math.round(width2), Math.round(height2)); + dispatch(width2, height2); }); observer.observe(el); return () => observer.disconnect(); @@ -264,7 +264,7 @@ function element_visible(selector, dispatch, root) { function element_scroll(selector, dispatch, root) { const el = resolveElement(selector, root); if (!el) return noop; - const handler = () => dispatch(Math.round(el.scrollLeft), Math.round(el.scrollTop)); + const handler = () => dispatch(el.scrollLeft, el.scrollTop); handler(); el.addEventListener("scroll", handler, { passive: true }); return () => el.removeEventListener("scroll", handler); @@ -373,14 +373,19 @@ function blur() { var OffTopicClientRuntime = class extends HTMLElement { #root = null; #subscriptions = /* @__PURE__ */ new Map(); + #connected = false; connectedCallback() { this.#root = findRoot(this); if (this.#root) { this.#root.addEventListener("off-topic:subscribe", this.#onSubscribe); this.#root.addEventListener("off-topic:unsubscribe", this.#onUnsubscribe); this.#root.addEventListener("off-topic:command", this.#onCommand); + this.#root.addEventListener("lustre:close", this.#onClose); + this.#root.addEventListener("lustre:open", this.#onOpen); + } + if (!this.#connected) { + this.#onOpen(); } - this.dispatchEvent(new CustomEvent("off-topic:mount")); } connectedMoveCallback() { } @@ -391,15 +396,13 @@ var OffTopicClientRuntime = class extends HTMLElement { "off-topic:unsubscribe", this.#onUnsubscribe ); + this.#root.removeEventListener("lustre:close", this.#onClose); + this.#root.addEventListener("lustre:open", this.#onOpen); this.#root = null; } queueMicrotask(() => { if (this.isConnected) return; - for (const subscription of this.#subscriptions.values()) { - clearTimeout(subscription.delayTimeout); - subscription.cleanup?.(); - } - this.#subscriptions.clear(); + this.#onClose(); }); } #onSubscribe = (event) => { @@ -472,6 +475,18 @@ var OffTopicClientRuntime = class extends HTMLElement { } = event; window.OffTopic.commands[name]?.(...params, this.#root); }; + #onOpen = () => { + this.dispatchEvent(new CustomEvent("off-topic:mount")); + this.#connected = true; + }; + #onClose = () => { + for (const subscription of this.#subscriptions.values()) { + clearTimeout(subscription.delayTimeout); + subscription.cleanup?.(); + } + this.#subscriptions.clear(); + this.#connected = false; + }; }; function findRoot(node) { while (node != null) { diff --git a/src/off_topic.gleam b/src/off_topic.gleam index 86d550c..870020a 100644 --- a/src/off_topic.gleam +++ b/src/off_topic.gleam @@ -266,7 +266,7 @@ pub fn script() -> Element(message) { html.script( [attribute.type_("module")], // <> - "var de=e=>e.head,O=e=>e.tail;var ke=5,ct=(1<i.removeEventListener(t,r)}function U(e){let t=()=>document.visibilityState===\"hidden\"?\"hidden\":document.hasFocus()?\"active\":\"passive\",r=s=>{s!==n&&(e(s),n=s)},n=t();n!==\"active\"&&e(n);let i=new AbortController,o={capture:!0,signal:i.signal};return[\"pageshow\",\"focus\",\"blur\",\"visibilitychange\",\"resume\"].forEach(s=>{window.addEventListener(s,()=>r(t()),o)}),window.addEventListener(\"freeze\",()=>{r(\"frozen\")},o),window.addEventListener(\"pagehide\",s=>{r(s.persisted?\"frozen\":\"terminated\")},o),()=>i.abort()}function j(e){let t=()=>-new Date().getTimezoneOffset(),r=t();e(r);let n=setInterval(()=>{let i=t();i!==r&&(r=i,e(i))},6e4);return()=>clearInterval(n)}var et=ze(window,\"online\",\"offline\",()=>navigator.onLine),D=ze(document.documentElement,\"pointerenter\",\"pointerleave\",()=>document.documentElement.matches(\":hover\"));function F(e){let t=r=>{r.preventDefault(),e()};return window.addEventListener(\"beforeunload\",t),()=>window.removeEventListener(\"beforeunload\",t)}function R(e,t){let r=!1,n=null,i=()=>{r&&(r=!1,t(!1)),clearTimeout(n),n=setTimeout(()=>{r=!0,t(!0)},e)},o=()=>{document.hidden||i()},s=[\"pointermove\",\"pointerdown\",\"keydown\",\"scroll\",\"wheel\",\"resize\"];for(let l of s)window.addEventListener(l,i,{passive:!0});return document.addEventListener(\"visibilitychange\",o),i(),()=>{clearTimeout(n);for(let l of s)window.removeEventListener(l,i);document.removeEventListener(\"visibilitychange\",o)}}function P(e){return I(null,window,\"resize\",()=>e(window.innerWidth,window.innerHeight))}function V(e){return I(null,window,\"scroll\",()=>e(window.scrollX,window.scrollY))}function W(e){return I(null,screen.orientation,\"change\",()=>e(screen.orientation.type))}function G(e){return I(null,window,\"languagechange\",()=>e(navigator.language))}function H(e,t,r){let n=[];Se(t,([s,l])=>{n.push([window.matchMedia(s),l])});let i=()=>n.find(([s])=>s.matches)?.[1]??e,o=()=>r(i());o();for(let[s]of n)s.addEventListener(\"change\",o);return()=>{for(let[s]of n)s.removeEventListener(\"change\",o)}}var X=Ee(localStorage),K=Ee(sessionStorage);function Ee(e){return(t,r)=>{let n=e.getItem(t);return r(n!==null,n??\"\"),$(window,\"storage\",o=>{if(o.storageArea===e&&o.key===t){let s=o.newValue;r(s!==null,s??\"\")}})}}function Y(e,t,r){let n=u(e,r);if(!n)return c;let{width:i,height:o}=n.getBoundingClientRect();t(Math.round(i),Math.round(o));let s=new ResizeObserver(l=>{let{width:p,height:y}=l[0].contentRect;t(Math.round(p),Math.round(y))});return s.observe(n),()=>s.disconnect()}function J(e,t,r){let n=u(e,r);if(!n)return c;let i=n.getBoundingClientRect();t(i.bottom>0&&i.right>0&&i.top{t(s[0].isIntersecting)});return o.observe(n),()=>o.disconnect()}function Q(e,t,r){let n=u(e,r);if(!n)return c;let i=()=>t(Math.round(n.scrollLeft),Math.round(n.scrollTop));return i(),n.addEventListener(\"scroll\",i,{passive:!0}),()=>n.removeEventListener(\"scroll\",i)}function Z(e){return document.title=e,c}function ee(e,t){let r=document.head.querySelector(`meta[name=\"${CSS.escape(e)}\"]`);return r||(r=document.createElement(\"meta\"),r.setAttribute(\"name\",e),document.head.appendChild(r)),r.setAttribute(\"content\",t),c}function te(e){let t=e.split(\" \");return document.body.classList.add(...t),()=>document.body.classList.remove(...t)}function ne(e,t,r,n){let o=(n instanceof ShadowRoot?n.host:n)?.internals;if(o){let s=e===\"role\"?\"role\":\"aria\"+e.slice(5).replace(/-([a-z])/g,(l,p)=>p.toUpperCase()).replace(/^./,l=>l.toUpperCase());o[s]=t}return c}function re(e,t,r,n){let o=(n instanceof ShadowRoot?n.host:n)?.internals;return o&&(t?o.states.add(e):o.states.delete(e)),c}function ie(e,t,r,n){return(n instanceof ShadowRoot?n.host:n)?.internals?.setFormValue(e?t:void 0),c}function I(e,t,r,n){let i=u(t,e);return n(),$(i,r,n)}function ze(e,t,r,n){return i=>{i(n());let o=()=>i(!0),s=()=>i(!1);return e.addEventListener(t,o),e.addEventListener(r,s),()=>{e.removeEventListener(t,o),e.removeEventListener(r,s)}}}function c(){}function Be(e,t,r,n){window.dispatchEvent(new StorageEvent(\"storage\",{key:t,oldValue:r,newValue:n,storageArea:e,url:window.location.href}))}function oe(e,t,r){let n=r?localStorage.getItem(e):null;localStorage.setItem(e,t),r&&Be(localStorage,e,n,t)}function se(e,t,r){let n=r?sessionStorage.getItem(e):null;sessionStorage.setItem(e,t),r&&Be(sessionStorage,e,n,t)}function le(e,t,r,n,i){u(e,i)?.scrollTo({left:t,top:r,behavior:n})}function fe(e,t,r,n,i){u(e,i)?.scrollIntoView({block:t,inline:r,behavior:n})}function ue(e,t){u(e,t)?.focus()}function ce(){document.activeElement?.blur()}var ae=class extends HTMLElement{#e=null;#t=new Map;connectedCallback(){this.#e=rt(this),this.#e&&(this.#e.addEventListener(\"off-topic:subscribe\",this.#n),this.#e.addEventListener(\"off-topic:unsubscribe\",this.#r),this.#e.addEventListener(\"off-topic:command\",this.#i)),this.dispatchEvent(new CustomEvent(\"off-topic:mount\"))}connectedMoveCallback(){}disconnectedCallback(){this.#e&&(this.#e.removeEventListener(\"off-topic:subscribe\",this.#n),this.#e.removeEventListener(\"off-topic:unsubscribe\",this.#r),this.#e=null),queueMicrotask(()=>{if(!this.isConnected){for(let t of this.#t.values())clearTimeout(t.delayTimeout),t.cleanup?.();this.#t.clear()}})}#n=t=>{let{detail:{tick:r,path:n,name:i,params:o,include:s,throttle:l=0,delay:p=0}}=t,y=`${r}:${n.join(\":\")}`;if(this.#t.has(y))return;let pe=window.OffTopic.subscriptions[i];if(!pe){console.warn(`off-topic: subscription '${i}' requested, but not registered`);return}let a={tick:r,path:n,params:o,cleanup:void 0,lastFired:0,lastThrottledData:void 0,delayTimeout:void 0},C=d=>{let _=Array.isArray(d)?d.map(Ie=>Ae(Ie,s)):Ae(d,s),S=new CustomEvent(\"off-topic:dispatch\",{detail:{tick:r,path:n,message:_}});this.dispatchEvent(S)},ve=(...d)=>{let _=d.length===1?d[0]:d;if(l>0){let S=Date.now();S>=a.lastFired+l&&(a.lastFired=S,a.lastThrottledData=_,C(_))}p>0&&(clearTimeout(a.delayTimeout),a.delayTimeout=setTimeout(()=>{_!==a.lastThrottledData&&C(_)},p)),!l&&!p&&C(_)};a.cleanup=pe(...o,ve,this.#e),this.#t.set(y,a)};#r=t=>{let{detail:{tick:r,path:n}}=t,i=`${r}:${n.join(\":\")}`,o=this.#t.get(i);o&&(this.#t.delete(i),clearTimeout(o.delayTimeout),o.cleanup?.())};#i=t=>{let{detail:{name:r,params:n}}=t;window.OffTopic.commands[r]?.(...n,this.#e)}};function rt(e){for(;e!=null;){if(e instanceof ShadowRoot&&e.host.tagName.toLowerCase()===\"lustre-server-component\")return e.host;e=e.parentNode}return console.error(` is not mounted inside a Lustre server component and will not work!\\nIf you are using lustre.start, you can use off_topic's effects directly and can remove this component.`),null}function Ae(e,t){if(typeof e!=\"object\")return e;let r={};for(let n of t){let i=n.split(\".\");for(let o=0,s=e,l=r;oe.head,O=e=>e.tail;var ke=5,ct=(1<i.removeEventListener(t,r)}function U(e){let t=()=>document.visibilityState===\"hidden\"?\"hidden\":document.hasFocus()?\"active\":\"passive\",r=s=>{s!==n&&(e(s),n=s)},n=t();n!==\"active\"&&e(n);let i=new AbortController,o={capture:!0,signal:i.signal};return[\"pageshow\",\"focus\",\"blur\",\"visibilitychange\",\"resume\"].forEach(s=>{window.addEventListener(s,()=>r(t()),o)}),window.addEventListener(\"freeze\",()=>{r(\"frozen\")},o),window.addEventListener(\"pagehide\",s=>{r(s.persisted?\"frozen\":\"terminated\")},o),()=>i.abort()}function j(e){let t=()=>-new Date().getTimezoneOffset(),r=t();e(r);let n=setInterval(()=>{let i=t();i!==r&&(r=i,e(i))},6e4);return()=>clearInterval(n)}var et=ze(window,\"online\",\"offline\",()=>navigator.onLine),D=ze(document.documentElement,\"pointerenter\",\"pointerleave\",()=>document.documentElement.matches(\":hover\"));function F(e){let t=r=>{r.preventDefault(),e()};return window.addEventListener(\"beforeunload\",t),()=>window.removeEventListener(\"beforeunload\",t)}function R(e,t){let r=!1,n=null,i=()=>{r&&(r=!1,t(!1)),clearTimeout(n),n=setTimeout(()=>{r=!0,t(!0)},e)},o=()=>{document.hidden||i()},s=[\"pointermove\",\"pointerdown\",\"keydown\",\"scroll\",\"wheel\",\"resize\"];for(let l of s)window.addEventListener(l,i,{passive:!0});return document.addEventListener(\"visibilitychange\",o),i(),()=>{clearTimeout(n);for(let l of s)window.removeEventListener(l,i);document.removeEventListener(\"visibilitychange\",o)}}function P(e){return I(null,window,\"resize\",()=>e(window.innerWidth,window.innerHeight))}function V(e){return I(null,window,\"scroll\",()=>e(window.scrollX,window.scrollY))}function W(e){return I(null,screen.orientation,\"change\",()=>e(screen.orientation.type))}function G(e){return I(null,window,\"languagechange\",()=>e(navigator.language))}function H(e,t,r){let n=[];Se(t,([s,l])=>{n.push([window.matchMedia(s),l])});let i=()=>n.find(([s])=>s.matches)?.[1]??e,o=()=>r(i());o();for(let[s]of n)s.addEventListener(\"change\",o);return()=>{for(let[s]of n)s.removeEventListener(\"change\",o)}}var X=Ee(localStorage),K=Ee(sessionStorage);function Ee(e){return(t,r)=>{let n=e.getItem(t);return r(n!==null,n??\"\"),$(window,\"storage\",o=>{if(o.storageArea===e&&o.key===t){let s=o.newValue;r(s!==null,s??\"\")}})}}function Y(e,t,r){let n=u(e,r);if(!n)return c;let{width:i,height:o}=n.getBoundingClientRect();t(i,o);let s=new ResizeObserver(l=>{let{width:p,height:y}=l[0].contentRect;t(p,y)});return s.observe(n),()=>s.disconnect()}function J(e,t,r){let n=u(e,r);if(!n)return c;let i=n.getBoundingClientRect();t(i.bottom>0&&i.right>0&&i.top{t(s[0].isIntersecting)});return o.observe(n),()=>o.disconnect()}function Q(e,t,r){let n=u(e,r);if(!n)return c;let i=()=>t(n.scrollLeft,n.scrollTop);return i(),n.addEventListener(\"scroll\",i,{passive:!0}),()=>n.removeEventListener(\"scroll\",i)}function Z(e){return document.title=e,c}function ee(e,t){let r=document.head.querySelector(`meta[name=\"${CSS.escape(e)}\"]`);return r||(r=document.createElement(\"meta\"),r.setAttribute(\"name\",e),document.head.appendChild(r)),r.setAttribute(\"content\",t),c}function te(e){let t=e.split(\" \");return document.body.classList.add(...t),()=>document.body.classList.remove(...t)}function ne(e,t,r,n){let o=(n instanceof ShadowRoot?n.host:n)?.internals;if(o){let s=e===\"role\"?\"role\":\"aria\"+e.slice(5).replace(/-([a-z])/g,(l,p)=>p.toUpperCase()).replace(/^./,l=>l.toUpperCase());o[s]=t}return c}function re(e,t,r,n){let o=(n instanceof ShadowRoot?n.host:n)?.internals;return o&&(t?o.states.add(e):o.states.delete(e)),c}function ie(e,t,r,n){return(n instanceof ShadowRoot?n.host:n)?.internals?.setFormValue(e?t:void 0),c}function I(e,t,r,n){let i=u(t,e);return n(),$(i,r,n)}function ze(e,t,r,n){return i=>{i(n());let o=()=>i(!0),s=()=>i(!1);return e.addEventListener(t,o),e.addEventListener(r,s),()=>{e.removeEventListener(t,o),e.removeEventListener(r,s)}}}function c(){}function Be(e,t,r,n){window.dispatchEvent(new StorageEvent(\"storage\",{key:t,oldValue:r,newValue:n,storageArea:e,url:window.location.href}))}function oe(e,t,r){let n=r?localStorage.getItem(e):null;localStorage.setItem(e,t),r&&Be(localStorage,e,n,t)}function se(e,t,r){let n=r?sessionStorage.getItem(e):null;sessionStorage.setItem(e,t),r&&Be(sessionStorage,e,n,t)}function le(e,t,r,n,i){u(e,i)?.scrollTo({left:t,top:r,behavior:n})}function fe(e,t,r,n,i){u(e,i)?.scrollIntoView({block:t,inline:r,behavior:n})}function ue(e,t){u(e,t)?.focus()}function ce(){document.activeElement?.blur()}var ae=class extends HTMLElement{#e=null;#t=new Map;#n=!1;connectedCallback(){this.#e=rt(this),this.#e&&(this.#e.addEventListener(\"off-topic:subscribe\",this.#o),this.#e.addEventListener(\"off-topic:unsubscribe\",this.#s),this.#e.addEventListener(\"off-topic:command\",this.#l),this.#e.addEventListener(\"lustre:close\",this.#i),this.#e.addEventListener(\"lustre:open\",this.#r)),this.#n||this.#r()}connectedMoveCallback(){}disconnectedCallback(){this.#e&&(this.#e.removeEventListener(\"off-topic:subscribe\",this.#o),this.#e.removeEventListener(\"off-topic:unsubscribe\",this.#s),this.#e.removeEventListener(\"lustre:close\",this.#i),this.#e.addEventListener(\"lustre:open\",this.#r),this.#e=null),queueMicrotask(()=>{this.isConnected||this.#i()})}#o=t=>{let{detail:{tick:r,path:n,name:i,params:o,include:s,throttle:l=0,delay:p=0}}=t,y=`${r}:${n.join(\":\")}`;if(this.#t.has(y))return;let pe=window.OffTopic.subscriptions[i];if(!pe){console.warn(`off-topic: subscription '${i}' requested, but not registered`);return}let a={tick:r,path:n,params:o,cleanup:void 0,lastFired:0,lastThrottledData:void 0,delayTimeout:void 0},C=d=>{let _=Array.isArray(d)?d.map(Ie=>Ae(Ie,s)):Ae(d,s),S=new CustomEvent(\"off-topic:dispatch\",{detail:{tick:r,path:n,message:_}});this.dispatchEvent(S)},ve=(...d)=>{let _=d.length===1?d[0]:d;if(l>0){let S=Date.now();S>=a.lastFired+l&&(a.lastFired=S,a.lastThrottledData=_,C(_))}p>0&&(clearTimeout(a.delayTimeout),a.delayTimeout=setTimeout(()=>{_!==a.lastThrottledData&&C(_)},p)),!l&&!p&&C(_)};a.cleanup=pe(...o,ve,this.#e),this.#t.set(y,a)};#s=t=>{let{detail:{tick:r,path:n}}=t,i=`${r}:${n.join(\":\")}`,o=this.#t.get(i);o&&(this.#t.delete(i),clearTimeout(o.delayTimeout),o.cleanup?.())};#l=t=>{let{detail:{name:r,params:n}}=t;window.OffTopic.commands[r]?.(...n,this.#e)};#r=()=>{this.dispatchEvent(new CustomEvent(\"off-topic:mount\")),this.#n=!0};#i=()=>{for(let t of this.#t.values())clearTimeout(t.delayTimeout),t.cleanup?.();this.#t.clear(),this.#n=!1}};function rt(e){for(;e!=null;){if(e instanceof ShadowRoot&&e.host.tagName.toLowerCase()===\"lustre-server-component\")return e.host;e=e.parentNode}return console.error(` is not mounted inside a Lustre server component and will not work!\\nIf you are using lustre.start, you can use off_topic's effects directly and can remove this component.`),null}function Ae(e,t){if(typeof e!=\"object\")return e;let r={};for(let n of t){let i=n.split(\".\");for(let o=0,s=e,l=r;o { if (this.isConnected) return; - - for (const subscription of this.#subscriptions.values()) { - clearTimeout(subscription.delayTimeout); - subscription.cleanup?.(); - } - this.#subscriptions.clear(); + this.#onClose(); }); } @@ -129,6 +127,20 @@ class OffTopicClientRuntime extends HTMLElement { window.OffTopic.commands[name]?.(...params, this.#root); }; + + #onOpen = () => { + this.dispatchEvent(new CustomEvent("off-topic:mount")); + this.#connected = true; + }; + + #onClose = () => { + for (const subscription of this.#subscriptions.values()) { + clearTimeout(subscription.delayTimeout); + subscription.cleanup?.(); + } + this.#subscriptions.clear(); + this.#connected = false; + }; } function findRoot(node) { diff --git a/test_apps/test_app_sc/gleam.toml b/test_apps/test_app_sc/gleam.toml index e7b9c5e..6f6ac0b 100644 --- a/test_apps/test_app_sc/gleam.toml +++ b/test_apps/test_app_sc/gleam.toml @@ -14,7 +14,7 @@ gleam_json = ">= 3.0.0 and < 4.0.0" gleam_otp = ">= 1.0.0 and < 2.0.0" mist = ">= 6.0.2 and < 7.0.0" filepath = ">= 1.1.2 and < 2.0.0" -off_topic = { path = ".." } +off_topic = { path = "../.." } gleam_time = ">= 1.8.0 and < 2.0.0" [dev-dependencies] diff --git a/test_apps/test_app_sc/manifest.toml b/test_apps/test_app_sc/manifest.toml index 8114ab5..5605c2c 100644 --- a/test_apps/test_app_sc/manifest.toml +++ b/test_apps/test_app_sc/manifest.toml @@ -19,7 +19,7 @@ packages = [ { name = "logging", version = "1.5.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "BC5F18CE5DD9686100229FE5409BDC3DD5C46D5A7DF2F804AD2D8F0DD6C5060E" }, { name = "lustre", version = "5.6.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib", "houdini"], otp_app = "lustre", source = "hex", outer_checksum = "EE558CD4DB9F09FCC16417ADF0183A3C2DAC3E4B21ED3AC0CAE859792AB810CA" }, { name = "mist", version = "6.0.2", build_tools = ["gleam"], requirements = ["exception", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "6B03DEEA38A02F276333CB27B53B16D3D45BD741B89599085A601BAF635F2006" }, - { name = "off_topic", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib", "gleam_time", "lustre"], source = "local", path = ".." }, + { name = "off_topic", version = "1.0.0-rc2", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib", "gleam_time", "lustre"], source = "local", path = "../.." }, ] [requirements] @@ -33,4 +33,4 @@ gleam_time = { version = ">= 1.8.0 and < 2.0.0" } gleeunit = { version = ">= 1.0.0 and < 2.0.0" } lustre = { version = ">= 5.6.0 and < 6.0.0" } mist = { version = ">= 6.0.2 and < 7.0.0" } -off_topic = { path = ".." } +off_topic = { path = "../.." } diff --git a/test_apps/test_app_sc/src/test_app_sc/component.gleam b/test_apps/test_app_sc/src/test_app_sc/component.gleam index bb457f2..332e581 100644 --- a/test_apps/test_app_sc/src/test_app_sc/component.gleam +++ b/test_apps/test_app_sc/src/test_app_sc/component.gleam @@ -1,3 +1,4 @@ +import gleam/float import gleam/int import gleam/time/duration import gleam/time/timestamp.{type Timestamp} @@ -46,8 +47,8 @@ fn init(_) -> #(Model, Effect(Msg)) { Paused, Active, off_topic.Pointer( - x: 0, - y: 0, + x: 0.0, + y: 0.0, button: 0, pointer_type: Mouse, pointer_id: -1, @@ -85,8 +86,18 @@ fn update(model: Model, msg: Msg) -> #(Model, Effect(Msg)) { fn subscriptions(model: Model) -> Subscription(Msg) { let timer = case model.speed { Paused -> off_topic.none() - Slow -> off_topic.every(every: duration.seconds(1), immediate: False, on_elapsed: Tick) - Fast -> off_topic.every(every: duration.milliseconds(100), immediate: False, on_elapsed: Tick) + Slow -> + off_topic.every( + every: duration.seconds(1), + immediate: False, + on_elapsed: Tick, + ) + Fast -> + off_topic.every( + every: duration.milliseconds(100), + immediate: False, + on_elapsed: Tick, + ) } let mouse = case model.page_state { Active -> off_topic.on_pointer_move(MouseMoved) @@ -147,9 +158,9 @@ fn view(model: Model) -> Element(Msg) { [ html.text( "(" - <> int.to_string(model.mouse.x) + <> float.to_string(model.mouse.x) <> ", " - <> int.to_string(model.mouse.y) + <> float.to_string(model.mouse.y) <> ")", ), ],