UNPKG

preact-missing-hooks

Version:

A lightweight, extendable collection of missing React-like hooks for Preact — plus fresh, powerful new ones designed specifically for modern Preact apps.

3 lines (2 loc) 30.5 kB
import{useState as e,useCallback as n,useEffect as t,useMemo as r,useRef as o}from"preact/hooks";import{isValidElement as i,cloneElement as a}from"preact";import{useRef as s,useEffect as c}from"preact/compat";function l(){const[t,r]=e(!1);return[n(e=>{r(!0),Promise.resolve().then(()=>{e(),r(!1)})},[]),t]}function u(e,n,r){t(()=>{const t=e.current;if(!t)return;const o=new MutationObserver(n);return o.observe(t,r),()=>o.disconnect()},[e,n,r])}const d=new Map;function f(){return{emit:n((e,...n)=>{const t=d.get(e);t&&t.forEach(e=>e(...n))},[]),on:n((e,n)=>{let t=d.get(e);return t||(t=new Set,d.set(e,t)),t.add(n),()=>{t.delete(n),0===t.size&&d.delete(e)}},[])}}function m(){return m=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)({}).hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},m.apply(null,arguments)}function p(e,n,t="preserve"){return r(()=>{if(!e)return e;const r=e=>{if(!i(e))return e;const r=e.props||{};let o;o="override"===t?m({},r,n):m({},n,r);const s=null==r?void 0:r.style,c=null==n?void 0:n.style;return s&&c&&"object"==typeof s&&"object"==typeof c&&(o.style="override"===t?m({},s,c):m({},c,s)),a(e,o)};return Array.isArray(e)?e.map(r):r(e)},[e,n,t])}function v(){const[n,r]=e(()=>{if("undefined"==typeof window)return"no-preference";const e=window.matchMedia("(prefers-color-scheme: dark)"),n=window.matchMedia("(prefers-color-scheme: light)");return e.matches?"dark":n.matches?"light":"no-preference"});return t(()=>{if("undefined"==typeof window)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),n=e=>{r(e.matches?"dark":"light")},t=()=>{const e=window.matchMedia("(prefers-color-scheme: dark)"),n=window.matchMedia("(prefers-color-scheme: light)");r(e.matches?"dark":n.matches?"light":"no-preference")};e.addEventListener("change",n);const o=window.matchMedia("(prefers-color-scheme: light)");return o.addEventListener("change",t),()=>{e.removeEventListener("change",n),o.removeEventListener("change",t)}},[]),n}function g(){if("undefined"==typeof navigator)return{online:!0};const e={online:navigator.onLine},n=navigator.connection;return n&&(void 0!==n.effectiveType&&(e.effectiveType=n.effectiveType),void 0!==n.downlink&&(e.downlink=n.downlink),void 0!==n.rtt&&(e.rtt=n.rtt),void 0!==n.saveData&&(e.saveData=n.saveData),void 0!==n.type&&(e.connectionType=n.type)),e}function h(){const[n,r]=e(g);return t(()=>{if("undefined"==typeof window)return;const e=()=>r(g());window.addEventListener("online",e),window.addEventListener("offline",e);const n=navigator.connection;return null!=n&&n.addEventListener&&n.addEventListener("change",e),()=>{window.removeEventListener("online",e),window.removeEventListener("offline",e),null!=n&&n.removeEventListener&&n.removeEventListener("change",e)}},[]),n}function w(t={}){const{resetDelay:r=2e3}=t,[o,i]=e(!1),[a,s]=e(null),c=n(()=>{i(!1),s(null)},[]);return{copy:n(async e=>{if(s(null),"undefined"==typeof navigator||!navigator.clipboard){const e=new Error("Clipboard API is not available");return s(e),!1}try{return await navigator.clipboard.writeText(e),i(!0),r>0&&setTimeout(()=>i(!1),r),!0}catch(e){const n=e instanceof Error?e:new Error(String(e));return s(n),!1}},[r]),paste:n(async()=>{if(s(null),"undefined"==typeof navigator||!navigator.clipboard){const e=new Error("Clipboard API is not available");return s(e),""}try{return await navigator.clipboard.readText()}catch(e){const n=e instanceof Error?e:new Error(String(e));return s(n),""}},[]),copied:o,error:a,reset:c}}function y(e,n){const{onRageClick:r,threshold:i=5,timeWindow:a=1e3,distanceThreshold:s=30}=n,c=o(r);c.current=r;const l=o([]);t(()=>{const n=e.current;if(!n)return;const t=e=>{const n=Date.now(),t={time:n,x:e.clientX,y:e.clientY},r=n-a,o=l.current.filter(e=>e.time>=r);if(o.push(t),Infinity!==s){const n=o.filter(e=>{return n=e,r=t,Math.hypot(r.x-n.x,r.y-n.y)<=s;var n,r});if(n.length>=i)return c.current({count:n.length,event:e}),void(l.current=[])}else if(o.length>=i)return c.current({count:o.length,event:e}),void(l.current=[]);l.current=o};return n.addEventListener("click",t),()=>n.removeEventListener("click",t)},[e,i,a,s])}function b(r,i){const{mode:a,concurrency:s=4}=i,c="sequential"===a?1:Math.max(1,s),[l,u]=e(!1),[d,f]=e(void 0),[m,p]=e(void 0),[v,g]=e(0),h=o([]),w=o(0),y=o(0),b=o(!1),E=o(r);E.current=r;const S=n(()=>{g(h.current.length+y.current)},[]),k=n(()=>{if(b.current)return;if(y.current>=c)return;if(0===h.current.length)return 0===y.current&&u(!1),void S();h.current.sort((e,n)=>e.priority!==n.priority?e.priority-n.priority:e.sequence-n.sequence);const e=h.current.shift();y.current+=1,u(!0),S(),(0,E.current)(e.data).then(n=>{f(n),p(void 0),e.resolve(n)}).catch(n=>{p(n),e.reject(n)}).finally(()=>{y.current-=1,S(),k()}),h.current.length>0&&y.current<c&&k()},[c,S]),x=n((e,n)=>{var t;if(b.current)return Promise.reject(new Error("Worker is terminated"));const r=null!=(t=null==n?void 0:n.priority)?t:1,o=++w.current,i=new Promise((n,t)=>{h.current.push({data:e,priority:r,sequence:o,resolve:n,reject:t})});return S(),u(!0),queueMicrotask(k),i},[k,S]),L=n(()=>{const e=h.current;h.current=[],e.forEach(e=>e.reject(new Error("Task cleared from queue"))),S(),0===y.current&&u(!1)},[S]),I=n(()=>{b.current=!0,L()},[L]);return t(()=>()=>{b.current=!0},[]),{run:x,loading:l,result:d,error:m,queueSize:v,clearQueue:L,terminate:I}}const E=new Map;function S(e){return new Promise((n,t)=>{e.onsuccess=()=>n(e.result),e.onerror=()=>{var n;return t(null!=(n=e.error)?n:new DOMException("Unknown IndexedDB error"))}})}function k(e,n){return n?e.then(e=>(null==n.onSuccess||n.onSuccess(e),e)).catch(e=>{throw null==n.onError||n.onError(e),e}):e}function x(n){const[r,i]=e(null),[a,s]=e(null),[c,l]=e(!1),u=o(n);return u.current=n,t(()=>{let e=!1;s(null),l(!1),i(null);const{name:n,version:t,tables:r}=u.current;return function(e){const n=`${e.name}_v${e.version}`;let t=E.get(n);return t||(t=function(e){return new Promise((n,t)=>{const r=indexedDB.open(e.name,e.version);r.onerror=()=>{var e;return t(null!=(e=r.error)?e:new DOMException("Failed to open database"))},r.onsuccess=()=>n(r.result),r.onupgradeneeded=n=>{const t=n.target.result,r=e.tables;for(const e of Object.keys(r)){const n=r[e];if(!t.objectStoreNames.contains(e)){var o;const r=t.createObjectStore(e,{keyPath:n.keyPath,autoIncrement:null!=(o=n.autoIncrement)&&o});if(n.indexes)for(const e of n.indexes)r.createIndex(e,e,{unique:!1})}}}})}(e),E.set(n,t),t)}({name:n,version:t,tables:r}).then(n=>{if(e)return void n.close();const t=function(e){return{get db(){return e},hasTable:n=>e.objectStoreNames.contains(n),table:n=>function(e,n){return function(e,n){function t(t){return e.transaction([n],t).objectStore(n)}return{insert:(e,n)=>k(S(t("readwrite").add(e)),n),update(e,n,r){const o=t("readwrite");return k(S(o.get(e)).then(e=>{if(void 0===e)throw new DOMException("Key not found","NotFoundError");const t=m({},e,n);return S(o.put(t))}).then(()=>{}),r)},delete:(e,n)=>k(S(t("readwrite").delete(e)).then(()=>{}),n),exists:e=>S(t("readonly").getKey(e)).then(e=>void 0!==e),query(e,n){const r=t("readonly").openCursor(),o=[];return k(new Promise((n,t)=>{r.onsuccess=()=>{const t=r.result;t?(e(t.value)&&o.push(t.value),t.continue()):n(o)},r.onerror=()=>{var e;return t(null!=(e=r.error)?e:new DOMException("Unknown error"))}}),n)},upsert:(e,n)=>k(S(t("readwrite").put(e)),n),bulkInsert(e,n){const r=t("readwrite"),o=[];if(0===e.length)return k(Promise.resolve(o),n);let i=0;return k(new Promise((n,t)=>{e.forEach((a,s)=>{const c=r.add(a);c.onsuccess=()=>{o[s]=c.result,i++,i===e.length&&n(o)},c.onerror=()=>{var e;return t(null!=(e=c.error)?e:new DOMException("Unknown error"))}})}),n)},clear:e=>k(S(t("readwrite").clear()).then(()=>{}),e),count:e=>k(S(t("readonly").count()),null!=e?e:{})}}(e,n)}(e,n),transaction(n,t,r,o){const i=e.transaction(n,t),a={table:e=>function(e,n){return function(e,n){function t(){return e.objectStore(n)}return{insert:(e,n)=>k(S(t().add(e)),n),update(e,n,r){const o=t();return k(S(o.get(e)).then(e=>{if(void 0===e)throw new DOMException("Key not found","NotFoundError");const t=m({},e,n);return S(o.put(t))}).then(()=>{}),r)},delete:(e,n)=>k(S(t().delete(e)).then(()=>{}),n),exists:e=>S(t().getKey(e)).then(e=>void 0!==e),query(e,n){const r=t().openCursor(),o=[];return k(new Promise((n,t)=>{r.onsuccess=()=>{const t=r.result;t?(e(t.value)&&o.push(t.value),t.continue()):n(o)},r.onerror=()=>{var e;return t(null!=(e=r.error)?e:new DOMException("Unknown error"))}}),n)},upsert:(e,n)=>k(S(t().put(e)),n),bulkInsert(e,n){const r=t(),o=[];if(0===e.length)return k(Promise.resolve(o),n);let i=0;return k(new Promise((n,t)=>{e.forEach((a,s)=>{const c=r.add(a);c.onsuccess=()=>{o[s]=c.result,i++,i===e.length&&n(o)},c.onerror=()=>{var e;return t(null!=(e=c.error)?e:new DOMException("Unknown error"))}})}),n)},clear:e=>k(S(t().clear()).then(()=>{}),e),count:e=>k(S(t().count()),null!=e?e:{})}}(e,n)}(i,e)},s=new Promise((e,n)=>{i.oncomplete=()=>e(),i.onerror=()=>{var e;return n(null!=(e=i.error)?e:new DOMException("Transaction failed"))}}),c=r(a);return function(e,n){return n?e.then(()=>null==n.onSuccess?void 0:n.onSuccess()).catch(e=>{throw null==n.onError||n.onError(e),e}):e}(Promise.resolve(c).then(()=>s),o)}}}(n);i(t),l(!0)}).catch(n=>{e||s(n)}),()=>{e=!0}},[n.name,n.version]),{db:r,isReady:c,error:a}}const L=/\b(?:25[0-5]|2[0-4]\d|1?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|1?\d{1,2})){3}\b/g,I=["stun:stun.l.google.com:19302"],T=3e3;function M(n={}){const{stunServers:r=I,timeout:i=T,onDetect:a}=n,[s,c]=e([]),[l,u]=e(!0),[d,f]=e(null),m=o(null),p=o(null),v=o(new Set),g=o(a);return g.current=a,t(()=>{if("undefined"==typeof window)return u(!1),void f("WebRTC IP detection is not available during SSR");if("undefined"==typeof RTCPeerConnection)return u(!1),void f("RTCPeerConnection is not available");const e=new Set;v.current=e;const n=()=>{p.current&&(clearTimeout(p.current),p.current=null),m.current&&(m.current.close(),m.current=null),u(!1)},t=n=>{e.has(n)||(e.add(n),c(e=>[...e,n]),null==g.current||g.current(n))};try{const e=new RTCPeerConnection({iceServers:[{urls:r}]});m.current=e,e.onicecandidate=e=>{const n=e.candidate;n&&n.candidate&&function(e){const n=e.match(L);return n?[...n]:[]}(n.candidate).forEach(t)},e.createDataChannel(""),e.createOffer().then(n=>e.setLocalDescription(n)).catch(e=>{f(e instanceof Error?e.message:"Failed to create offer"),n()}),p.current=setTimeout(()=>n(),i)}catch(e){f(e instanceof Error?e.message:"WebRTC setup failed"),n()}return()=>{n()}},[r.join(","),i]),{ips:s,loading:l,error:d}}function A(r){const{wasmUrl:i,exportName:a="compute",workerUrl:s,importObject:c}=r,[l,u]=e(void 0),[d,f]=e(!0),[m,p]=e(null),[v,g]=e(!1),h=o(null),w=o(null),y=o(null);return t(()=>{if("undefined"==typeof window)return p("useWasmCompute is not available during SSR"),void f(!1);if("undefined"==typeof Worker)return p("Worker is not supported in this environment"),void f(!1);if("undefined"==typeof WebAssembly||"function"!=typeof WebAssembly.instantiate)return p("WebAssembly is not supported in this environment"),void f(!1);p(null),g(!1);const e=function(e){if(e)return new Worker(e);const n=new Blob(["\nself.onmessage = async (e) => {\n const d = e.data;\n if (d.type === 'init') {\n try {\n const res = await fetch(d.wasmUrl);\n const buf = await res.arrayBuffer();\n const mod = await WebAssembly.instantiate(buf, d.importObject || {});\n self.wasmInstance = mod.instance;\n self.exportName = d.exportName || 'compute';\n self.postMessage({ type: 'ready' });\n } catch (err) {\n self.postMessage({ type: 'error', error: (err && err.message) || String(err) });\n }\n return;\n }\n if (d.type === 'compute') {\n try {\n const fn = self.wasmInstance.exports[self.exportName];\n if (typeof fn !== 'function') {\n self.postMessage({ type: 'error', error: 'Export \"' + self.exportName + '\" is not a function' });\n return;\n }\n const result = fn(d.input);\n self.postMessage({ type: 'result', result: result });\n } catch (err) {\n self.postMessage({ type: 'error', error: (err && err.message) || String(err) });\n }\n }\n};\n"],{type:"application/javascript"}),t=URL.createObjectURL(n),r=new Worker(t);return URL.revokeObjectURL(t),r}(s);h.current=e;const n=e=>{var n;const{type:t,result:r,error:o}=null!=(n=e.data)?n:{};return"ready"===t?(g(!0),void f(!1)):"error"===t?(p(null!=o?o:"Unknown error"),f(!1),void(y.current&&(y.current(new Error(o)),w.current=null,y.current=null))):void("result"===t&&(u(r),f(!1),w.current&&(w.current(r),w.current=null,y.current=null)))};return e.addEventListener("message",n),e.postMessage({type:"init",wasmUrl:i,exportName:a,importObject:null!=c?c:{}}),()=>{e.removeEventListener("message",n),e.terminate(),h.current=null,y.current&&(y.current(new Error("Worker terminated")),w.current=null,y.current=null)}},[i,a,s,c]),{compute:n(e=>new Promise((n,t)=>{h.current&&v?m?t(new Error(m)):(w.current=n,y.current=t,f(!0),h.current.postMessage({type:"compute",input:e})):t(new Error("WASM not ready"))}),[v,m]),result:l,loading:d,error:m,ready:v}}function O(n,i={}){const{maxHistory:a=100,throughputWindowMs:s=1e3}=i,[c,l]=e([]),[u,d]=e(0),[f,m]=e(0),[p,v]=e([]),[g,h]=e(0),w=o([]),y=o(0),b=o(0);t(()=>{if(!n)return;const e=e=>{const n=function(e){if(null==e||"object"!=typeof e)return null;const n=e.type;return"task_start"!==n&&"task_end"!==n&&"task_fail"!==n&&"queue_size"!==n?null:{type:n,taskId:"string"==typeof e.taskId?e.taskId:void 0,duration:"number"==typeof e.duration?e.duration:void 0,error:"string"==typeof e.error?e.error:void 0,size:"number"==typeof e.size?e.size:void 0,timestamp:Date.now()}}(e.data);if(n)if(v(e=>[...e,n].slice(-a)),"task_start"===n.type&&n.taskId)l(e=>e.includes(n.taskId)?e:[...e,n.taskId]);else if("task_end"===n.type){n.taskId&&l(e=>e.filter(e=>e!==n.taskId)),d(e=>e+1);const e=Date.now()-s;w.current=[...w.current.filter(n=>n>=e),n.timestamp],"number"==typeof n.duration&&(y.current+=n.duration,b.current+=1)}else"task_fail"===n.type?(n.taskId&&l(e=>e.filter(e=>e!==n.taskId)),m(e=>e+1)):"queue_size"===n.type&&"number"==typeof n.size&&h(n.size)};return n.addEventListener("message",e),()=>n.removeEventListener("message",e)},[n,a]);const E=r(()=>{const e=b.current;return e>0?y.current/e:0},[p]),S=r(()=>{const e=Date.now()-s;return w.current.filter(n=>n>=e).length/(s/1e3)},[p,s]),k=r(()=>({runningTasks:c,completedCount:u,failedCount:f,averageDurationMs:E,throughputPerSecond:S,currentQueueSize:g,totalProcessed:u+f,recentEventCount:p.length}),[c,u,f,E,S,g,p.length]);return{runningTasks:c,completedCount:u,failedCount:f,eventHistory:p,averageDurationMs:E,throughputPerSecond:S,currentQueueSize:g,progress:k}}function C(e,n){if(null==e)return"";const t=("string"==typeof e?e:String(e)).trim();return t.length>n?t.slice(0,n):t}function P(e){if(!Array.isArray(e))return[];const n=[];for(let t=0;t<e.length&&n.length<50;t++){const r=C(e[t],100);r&&n.push(r)}return n}function D(e){const n=C(e,2048);if(!n)return"";try{const e=new URL(n);if("http:"===e.protocol||"https:"===e.protocol)return n}catch(e){}return""}function j(e){try{if("undefined"==typeof window)return!1;const n=window.getComputedStyle(e);return"none"!==n.display&&"hidden"!==n.visibility&&"0"!==n.opacity}catch(e){return!1}}function U(e){const n={};try{for(const t of Object.keys(e).slice(0,20)){const r=C(t,50);if(!r)continue;const o=e[t];"string"==typeof o?n[r]=o.slice(0,500):"number"==typeof o&&Number.isFinite(o)||"boolean"==typeof o?n[r]=o:Array.isArray(o)&&(n[r]=o.map(e=>C(e,200)).filter(Boolean).slice(0,20))}}catch(e){}return n}function N(){try{if("undefined"==typeof document||!document.querySelectorAll)return;document.querySelectorAll('script[data-llm="true"]').forEach(e=>e.remove())}catch(e){}}function R(e){const n=s(null);c(()=>{try{if("undefined"==typeof window)return;const t=function(e){return null==e||"object"!=typeof e?{route:"/"}:{route:C(e.route,2048)||"/",mode:"auto-extract"===e.mode?"auto-extract":"manual",title:void 0!==e.title?C(e.title,200):void 0,description:void 0!==e.description?C(e.description,2e3):void 0,tags:void 0!==e.tags?P(e.tags):void 0,canonicalUrl:void 0!==e.canonicalUrl?D(e.canonicalUrl):void 0,language:void 0!==e.language?C(e.language,20):void 0,ogType:void 0!==e.ogType?C(e.ogType,50):void 0,ogImage:void 0!==e.ogImage?D(e.ogImage):void 0,ogImageAlt:void 0!==e.ogImageAlt?C(e.ogImageAlt,200):void 0,siteName:void 0!==e.siteName?C(e.siteName,100):void 0,author:void 0!==e.author?C(e.author,200):void 0,publishedTime:void 0!==e.publishedTime?C(e.publishedTime,50):void 0,modifiedTime:void 0!==e.modifiedTime?C(e.modifiedTime,50):void 0,robots:void 0!==e.robots?C(e.robots,100):void 0,extra:void 0===e.extra||"object"!=typeof e.extra||Array.isArray(e.extra)?void 0:U(e.extra)}}(e),r=function(e){try{const r=(new Date).toISOString(),o={route:e.route,generatedAt:r};if("auto-extract"===e.mode){var n,t;const r=function(){const e={title:"",outline:[],description:""};try{if("undefined"==typeof document)return e;const n=C(document.title,200),t=[];let r="";try{const e=document.querySelectorAll("nav, footer, [role='navigation'], [role='contentinfo'], script, style, noscript"),n=n=>{for(const t of e)if(t.contains(n))return!0;return!1},o=document.querySelectorAll("h1, h2");for(const e of o){if(t.length>=50)break;if(j(e)&&!n(e)){const n=C(e.textContent,300);n&&t.push(n)}}const i=document.querySelectorAll("p"),a=[];for(const e of i){if(a.length>=3)break;if(j(e)&&!n(e)){const n=C(e.textContent,1e3);n&&a.push(n)}}r=a.join(" ").trim().slice(0,2e3)||""}catch(e){}return{title:n,outline:t,description:r}}catch(n){return e}}();o.title=(null!=(n=e.title)?n:r.title)||void 0,o.description=(null!=(t=e.description)?t:r.description)||void 0,r.outline.length>0&&(o.outline=r.outline)}else void 0!==e.title&&""!==e.title&&(o.title=e.title),void 0!==e.description&&""!==e.description&&(o.description=e.description);return e.tags&&e.tags.length>0&&(o.tags=e.tags),e.canonicalUrl&&(o.canonicalUrl=e.canonicalUrl),e.language&&(o.language=e.language),e.ogType&&(o.ogType=e.ogType),e.ogImage&&(o.ogImage=e.ogImage),e.ogImageAlt&&(o.ogImageAlt=e.ogImageAlt),e.siteName&&(o.siteName=e.siteName),e.author&&(o.author=e.author),e.publishedTime&&(o.publishedTime=e.publishedTime),e.modifiedTime&&(o.modifiedTime=e.modifiedTime),e.robots&&(o.robots=e.robots),e.extra&&Object.keys(e.extra).length>0&&(o.extra=e.extra),o}catch(n){var r;return{route:null!=(r=null==e?void 0:e.route)?r:"/",generatedAt:(new Date).toISOString()}}}(t),o=JSON.stringify(r);if(n.current===o)return;return n.current=o,N(),function(e){try{if("undefined"==typeof document||!document.head)return;const n=document.createElement("script");n.type="application/llm+json",n.setAttribute("data-llm","true"),n.textContent=JSON.stringify(e),document.head.appendChild(n)}catch(e){}}(r),()=>{N(),n.current=null}}catch(e){}},[null==e?void 0:e.route,null==e?void 0:e.mode,null==e?void 0:e.title,null==e?void 0:e.description,null==e?void 0:e.tags,null==e?void 0:e.canonicalUrl,null==e?void 0:e.language,null==e?void 0:e.ogType,null==e?void 0:e.ogImage,null==e?void 0:e.ogImageAlt,null==e?void 0:e.siteName,null==e?void 0:e.author,null==e?void 0:e.publishedTime,null==e?void 0:e.modifiedTime,null==e?void 0:e.robots])}const W="use-ref-print-target",q="use-ref-print-styles",z=`\n@media print {\n body * {\n visibility: hidden;\n }\n .${W},\n .${W} * {\n visibility: visible;\n }\n .${W} {\n position: absolute !important;\n left: 0 !important;\n top: 0 !important;\n width: 100% !important;\n }\n}\n`;function _(e,t={}){const{documentTitle:r}=t,i=o("");return{print:n(()=>{const n=e.current;if(!n||"undefined"==typeof window||!window.print)return;let t=document.getElementById(q);t||(t=document.createElement("style"),t.id=q,t.textContent=z,document.head.appendChild(t)),n.classList.add(W),r&&(i.current=document.title,document.title=r);const o=()=>{n.classList.remove(W),r&&void 0!==i.current&&(document.title=i.current)};if("onafterprint"in window){const e=()=>{o(),window.removeEventListener("afterprint",e)};window.addEventListener("afterprint",e)}window.print(),setTimeout(o,1e3)},[e,r])}}function B(e,n){if("undefined"==typeof window)return null;const t="localStorage"===e?window.localStorage:window.sessionStorage;try{const e=t.getItem(n);if(null==e)return null;const r=JSON.parse(e);return r&&"object"==typeof r?r:null}catch(e){return null}}function H(e,n){if("undefined"==typeof window)return[];const t="localStorage"===e?window.localStorage:window.sessionStorage;try{const e=t.getItem(n);if(null==e)return[];const r=JSON.parse(e);return Array.isArray(r)?r.filter(e=>"string"==typeof e):[]}catch(e){return[]}}function V(e,n){return n.filter(n=>n.condition(e)).map(e=>e.role)}function F(e,n){const t=new Set;for(const r of e){const e=n[r];if(Array.isArray(e))for(const n of e)t.add(n)}return Array.from(t)}function J(r){const{userSource:i}=r,a=o(r);a.current=r;const[s,c]=e(null),[l,u]=e([]),[d,f]=e([]),[m,p]=e(!1),[v,g]=e(null),h=n(async()=>{const{userSource:e,roleDefinitions:n,roleCapabilities:t,capabilitiesOverride:r}=a.current;g(null);let o=null,i=[],s=[];try{if("localStorage"===e.type)o=B("localStorage",e.key),i=V(o,n),s=F(i,t);else if("sessionStorage"===e.type)o=B("sessionStorage",e.key),i=V(o,n),s=F(i,t);else if("api"===e.type)o=await e.fetch(),i=V(o,n),s=F(i,t);else if("memory"===e.type)o=e.getUser(),i=V(o,n),s=F(i,t);else if("custom"===e.type){var l,d,m;const r=await Promise.resolve(e.getAuth());o=null!=(l=r.user)?l:null,i=null!=(d=r.roles)?d:V(o,n),s=null!=(m=r.capabilities)?m:F(i,t)}if(r)if("localStorage"===r.type){const e=H("localStorage",r.key);e.length>0&&(s=e)}else if("sessionStorage"===r.type){const e=H("sessionStorage",r.key);e.length>0&&(s=e)}else"api"===r.type&&(s=await r.fetch());c(o),u(i),f(s)}catch(e){g(e instanceof Error?e:new Error(String(e))),c(null),u([]),f([])}finally{p(!0)}},[]);t(()=>{h()},[h]),t(()=>{if("undefined"==typeof window)return;const e="localStorage"===i.type||"sessionStorage"===i.type?i.key:null;if(!e)return;const n=n=>{n.key===e&&h()};return window.addEventListener("storage",n),()=>window.removeEventListener("storage",n)},[i.type,"localStorage"===i.type||"sessionStorage"===i.type?i.key:"",h]);const w=n(e=>l.includes(e),[l]),y=n(e=>function(e,n){return!!e.includes("*")||e.includes(n)}(d,e),[d]),b=y,E=n(()=>h(),[h]),S=n((e,n,t)=>{if("undefined"==typeof window)return;const r="localStorage"===n?window.localStorage:window.sessionStorage;null==e?r.removeItem(t):r.setItem(t,JSON.stringify(e)),("localStorage"===i.type&&"localStorage"===n&&i.key===t||"sessionStorage"===i.type&&"sessionStorage"===n&&i.key===t)&&h()},[i,h]),k=n((e,n,t)=>{"undefined"!=typeof window&&("localStorage"===n?window.localStorage:window.sessionStorage).setItem(t,JSON.stringify(e))},[]),x=n((e,n,t)=>{"undefined"!=typeof window&&("localStorage"===n?window.localStorage:window.sessionStorage).setItem(t,JSON.stringify(e))},[]);return{user:s,roles:l,capabilities:d,isReady:m,error:v,hasRole:w,hasCapability:y,can:b,refetch:E,setUserInStorage:S,setRolesInStorage:k,setCapabilitiesInStorage:x}}function $(){const t=o(new Set),[,r]=e(0);return{prefetch:n((e,n)=>{var o;const i=null==e?void 0:e.trim();i&&(t.current.has(i)||("document"===(null!=(o=null==n?void 0:n.as)?o:"document")?function(e){if("undefined"==typeof document)return;const n=document.querySelectorAll('link[rel="prefetch"]');for(let t=0;t<n.length;t++)if(n[t].href===e)return;const t=document.createElement("link");t.rel="prefetch",t.href=e,document.head.appendChild(t)}(i):function(e){"undefined"!=typeof fetch&&fetch(e,{method:"GET",mode:"cors"}).catch(()=>{})}(i),t.current.add(i),r(e=>e+1)))},[]),isPrefetched:n(e=>{var n;return t.current.has(null!=(n=null==e?void 0:e.trim())?n:"")},[])}}function K(r,i={}){const{intervalMs:a=1e3,immediate:s=!0,enabled:c=!0}=i,[l,u]=e(null),[d,f]=e(!1),[m,p]=e(null),[v,g]=e(0),[h,w]=e(!1),y=o(null),b=o(r);b.current=r;const E=n(()=>{null!=y.current&&(clearInterval(y.current),y.current=null),w(!1)},[]),S=n(async()=>{try{p(null);const e=await b.current();g(e=>e+1),e.done&&(E(),f(!0),void 0!==e.data&&u(e.data))}catch(e){const n=e instanceof Error?e:new Error(String(e));p(n),E()}},[E]),k=n(()=>{c&&!h&&(w(!0),s&&S(),y.current=setInterval(S,a))},[c,s,a,h,S]);return t(()=>(c&&k(),()=>{E()}),[c]),{data:l,done:d,error:m,pollCount:v,start:k,stop:E}}const Q={name:"Unknown",version:""},X={name:"Unknown",version:""},G={userAgent:"",language:"en",languages:["en"],platform:"",browser:Q,os:X,cookieEnabled:!1,online:!0,maxTouchPoints:0,vendor:"",touch:!1,screen:{width:0,height:0,availWidth:0,availHeight:0,colorDepth:24,pixelRatio:1},viewport:{width:0,height:0},reducedMotion:!1,colorScheme:"no-preference"},Y=/not.?a.?brand/i;function Z(e){const n=m({},Q),t=m({},X);if(!e)return{browser:n,os:t};const r=e.match(/Windows NT ([\d.]+)/);if(r)t.name="Windows",t.version=r[1];else{const n=e.match(/Mac OS X ([\d._]+)/);if(n)t.name="macOS",t.version=n[1].replace(/_/g,".");else{const n=e.match(/Android ([\d.]+)/);if(n)t.name="Android",t.version=n[1];else{const n=e.match(/(?:iPhone OS|CPU OS) ([\d_]+)/);if(n)t.name="iOS",t.version=n[1].replace(/_/g,".");else if(/Linux/.test(e)){var o;t.name="Linux";const n=e.match(/Linux ([\d.]+)/);t.version=null!=(o=null==n?void 0:n[1])?o:""}}}}const i=e.match(/Edg(?:A|iOS)?\/([\d.]+)/),a=e.match(/OPR\/([\d.]+)/),s=e.match(/Firefox\/([\d.]+)/),c=/Version\/([\d.]+)/.test(e)&&/Safari/.test(e)&&!/Chrome|Chromium|Edg|OPR/.test(e)?e.match(/Version\/([\d.]+)/):null,l=e.match(/Chrome\/([\d.]+)/);return i?(n.name="Edge",n.version=i[1]):a?(n.name="Opera",n.version=a[1]):s?(n.name="Firefox",n.version=s[1]):c?(n.name="Safari",n.version=c[1]):l&&(n.name="Chrome",n.version=l[1]),{browser:n,os:t}}function ee(e){const n=e.find(e=>!Y.test(e.brand)),t=null!=n?n:e[0];return t?{name:t.brand,version:t.version}:m({},Q)}function ne(){var e,n,t,r,o,i,a,s,c,l,u,d,f,p;if("undefined"==typeof navigator)return G;const v=navigator,g=void 0!==globalThis.screen?globalThis.screen:null,h=void 0!==globalThis.window?globalThis.window:null,w=null!=(e=v.userAgent)?e:"",y=Z(w),b=v.userAgentData,{browser:E,os:S}=b?function(e,n){var t,r;return{browser:null!=(t=e.brands)&&t.length?ee(e.brands):m({},n.browser),os:{name:(null==(r=e.platform)?void 0:r.trim())||n.os.name,version:n.os.version}}}(b,y):y,k={userAgent:w,language:null!=(n=v.language)?n:"",languages:v.languages?[...v.languages]:[],platform:null!=(t=v.platform)?t:"",browser:E,os:S,cookieEnabled:Boolean(v.cookieEnabled),online:Boolean(v.onLine),maxTouchPoints:null!=(r=v.maxTouchPoints)?r:0,vendor:null!=(o=v.vendor)?o:"",touch:(null!=(i=v.maxTouchPoints)?i:0)>0,screen:{width:null!=(a=null==g?void 0:g.width)?a:0,height:null!=(s=null==g?void 0:g.height)?s:0,availWidth:null!=(c=null==g?void 0:g.availWidth)?c:0,availHeight:null!=(l=null==g?void 0:g.availHeight)?l:0,colorDepth:null!=(u=null==g?void 0:g.colorDepth)?u:24,pixelRatio:null!=(d=null==h?void 0:h.devicePixelRatio)?d:1},viewport:{width:null!=(f=null==h?void 0:h.innerWidth)?f:0,height:null!=(p=null==h?void 0:h.innerHeight)?p:0},reducedMotion:!("undefined"==typeof window||!window.matchMedia)&&window.matchMedia("(prefers-reduced-motion: reduce)").matches,colorScheme:"undefined"!=typeof window&&window.matchMedia?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":window.matchMedia("(prefers-color-scheme: light)").matches?"light":"no-preference":"no-preference"};var x;return"number"==typeof v.hardwareConcurrency&&(k.hardwareConcurrency=v.hardwareConcurrency),"number"==typeof v.deviceMemory&&(k.deviceMemory=v.deviceMemory),b&&(k.userAgentData={mobile:Boolean(b.mobile),platform:null!=(x=b.platform)?x:"",brands:b.brands?[...b.brands]:[]}),k}function te(r={}){const{includeBattery:o=!0,batteryPollIntervalMs:i=6e4,includeHighEntropy:a=!0}=r,[s,c]=e(()=>ne()),l=n(()=>{c(e=>m({},ne(),e.battery?{battery:e.battery}:{}))},[]);return t(()=>{if("undefined"==typeof window)return;const e=()=>l();window.addEventListener("resize",e),window.addEventListener("orientationchange",e),window.addEventListener("online",l),window.addEventListener("offline",l);const n=null==window.matchMedia?void 0:window.matchMedia("(prefers-reduced-motion: reduce)"),t=null==window.matchMedia?void 0:window.matchMedia("(prefers-color-scheme: dark)"),r=null==window.matchMedia?void 0:window.matchMedia("(prefers-color-scheme: light)"),o=()=>l();return null==n||null==n.addEventListener||n.addEventListener("change",o),null==t||null==t.addEventListener||t.addEventListener("change",o),null==r||null==r.addEventListener||r.addEventListener("change",o),()=>{window.removeEventListener("resize",e),window.removeEventListener("orientationchange",e),window.removeEventListener("online",l),window.removeEventListener("offline",l),null==n||null==n.removeEventListener||n.removeEventListener("change",o),null==t||null==t.removeEventListener||t.removeEventListener("change",o),null==r||null==r.removeEventListener||r.removeEventListener("change",o)}},[l]),t(()=>{if(!a||"undefined"==typeof navigator)return;const e=navigator.userAgentData;if(null==e||!e.getHighEntropyValues)return;let n=!1;return(async()=>{const t=ne(),r=await async function(e,n){if(e.getHighEntropyValues)try{var t,r;const o=await e.getHighEntropyValues(["platformVersion","fullVersionList"]);return{browser:null!=(t=o.fullVersionList)&&t.length?ee(o.fullVersionList):m({},n.browser),os:{name:n.os.name,version:(null==(r=o.platformVersion)?void 0:r.trim())||n.os.version}}}catch(e){return}}(e,{browser:t.browser,os:t.os});!n&&r&&c(e=>m({},e,{browser:r.browser,os:r.os}))})(),()=>{n=!0}},[a]),t(()=>{if(!o||"undefined"==typeof navigator)return;let e,n=!1;const t=async()=>{const e=await async function(){if("undefined"==typeof navigator)return;const e=navigator.getBattery;if(e)try{const n=await e.call(navigator);return{charging:n.charging,level:n.level}}catch(e){return}}();n||void 0===e||c(n=>m({},n,{battery:e}))};return t(),i>0&&(e=setInterval(()=>{t()},i)),()=>{n=!0,void 0!==e&&clearInterval(e)}},[o,i]),s}export{ne as getDeviceData,Z as parseUserAgent,w as useClipboard,te as useDeviceData,f as useEventBus,x as useIndexedDB,R as useLLMMetadata,u as useMutationObserver,h as useNetworkState,K as usePoll,v as usePreferredTheme,$ as usePrefetch,J as useRBAC,y as useRageClick,_ as useRefPrint,b as useThreadedWorker,l as useTransition,A as useWasmCompute,M as useWebRTCIP,O as useWorkerNotifications,p as useWrappedChildren}; //# sourceMappingURL=index.modern.mjs.map