UNPKG

houser-js-utils

Version:

A comprehensive collection of TypeScript utility functions for common development tasks including array manipulation, string processing, date handling, random number generation, validation, and much more.

1 lines 97.9 kB
"use strict";var O=Object.defineProperty;var B=(e,t,r)=>t in e?O(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var D=(e,t,r)=>B(e,typeof t!="symbol"?t+"":t,r);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const F={getAriaDescribedBy(e){return e.getAttribute("aria-describedby")},setAriaDescribedBy(e,t){e.setAttribute("aria-describedby",t)},getAriaExpanded(e){const t=e.getAttribute("aria-expanded");return t===null?null:t==="true"},setAriaExpanded(e,t){e.setAttribute("aria-expanded",t.toString())},getAriaHidden(e){const t=e.getAttribute("aria-hidden");return t===null?null:t==="true"},setAriaHidden(e,t){e.setAttribute("aria-hidden",t.toString())},getAriaInvalid(e){const t=e.getAttribute("aria-invalid");return t===null?null:t==="true"},setAriaInvalid(e,t){e.setAttribute("aria-invalid",t.toString())},getAriaLabel(e){return e.getAttribute("aria-label")},setAriaLabel(e,t){e.setAttribute("aria-label",t)},getAriaRequired(e){const t=e.getAttribute("aria-required");return t===null?null:t==="true"},setAriaRequired(e,t){e.setAttribute("aria-required",t.toString())},getAriaRole(e){return e.getAttribute("role")},setAriaRole(e,t){e.setAttribute("role",t)},blurElement(e){e instanceof HTMLElement&&e.blur()},focusElement(e){e instanceof HTMLElement&&e.focus()},focusFirstElement(e){const t=this.getFocusableElements(e);t.length>0&&t[0].focus()},focusLastElement(e){const t=this.getFocusableElements(e);t.length>0&&t[t.length-1].focus()},focusNextElement(e){const t=this.getFocusableElements(document.body),r=t.indexOf(e);r<t.length-1&&t[r+1].focus()},focusPreviousElement(e){const t=this.getFocusableElements(document.body),r=t.indexOf(e);r>0&&t[r-1].focus()},getFocusableElements(e){const t=e.querySelectorAll("*");return Array.from(t).filter(r=>this.isFocusable(r))},getFocusedElement(){return document.activeElement},isFocusable(e){if(!(e instanceof HTMLElement)||e.tabIndex<0||"disabled"in e&&e.disabled)return!1;switch(e.tagName.toLowerCase()){case"a":case"button":case"input":case"select":case"textarea":return!0;default:return!1}},trapFocus(e){const t=this.getFocusableElements(e),r=t[0],n=t[t.length-1],a=o=>{!(o instanceof KeyboardEvent)||o.key!=="Tab"||(o.shiftKey?document.activeElement===r&&(o.preventDefault(),n.focus()):document.activeElement===n&&(o.preventDefault(),r.focus()))};return e.addEventListener("keydown",a),()=>e.removeEventListener("keydown",a)}},K={parsers:{number:e=>{if(typeof e.newValue=="string"&&e.newValue.trim()==="")return null;const t=Number(e.newValue);return isNaN(t)?null:t},string:e=>String(e.newValue).trim()},setters:{numberCeil:e=>t=>(t.data[e]=Math.ceil(t.newValue),!0),numberFloor:e=>t=>(t.data[e]=Math.floor(t.newValue),!0),numberFloat:e=>t=>{const r=Number(t.newValue);return t.data[e]=Number.isInteger(r)?r.toFixed(1):r,!0}}},j={animate(e,t,r=300,n="ease"){return new Promise(a=>{Object.keys(t).forEach(s=>{t[s]!==void 0&&parseFloat(getComputedStyle(e)[s])}),e.style.transition=`all ${r}ms ${n}`,Object.keys(t).forEach(s=>{const i=t[s];i!==void 0&&(e.style[s]=i)});const o=()=>{e.removeEventListener("transitionend",o),e.style.transition="",a()};e.addEventListener("transitionend",o),setTimeout(o,r)})},animateWithRAF(e,t,r=300,n=a=>a){return new Promise(a=>{const o=performance.now(),s={},i={};Object.keys(t).forEach(u=>{const l=t[u];if(l!==void 0){const h=parseFloat(getComputedStyle(e)[u]),d=parseFloat(l);!isNaN(h)&&!isNaN(d)&&(s[u]=h,i[u]=d)}});const c=u=>{const l=u-o,h=Math.min(l/r,1),d=n(h);Object.keys(s).forEach(f=>{const y=s[f],g=i[f],M=y+(g-y)*d;e.style[f]=`${M}px`}),h<1?requestAnimationFrame(c):a()};requestAnimationFrame(c)})},createKeyframeAnimation(e,t,r={}){return e.animate(t,{duration:300,easing:"ease",fill:"forwards",...r})},createSpringAnimation(e,t,r={}){const{stiffness:n=170,damping:a=26,mass:o=1,duration:s=300}=r;return new Promise(i=>{const c=performance.now(),u={},l={},h={};Object.keys(t).forEach(f=>{const y=t[f];if(y!==void 0){const g=parseFloat(getComputedStyle(e)[f]),M=parseFloat(y);!isNaN(g)&&!isNaN(M)&&(u[f]=g,l[f]=M,h[f]=0)}});const d=f=>{const y=f-c;if(y>=s){Object.keys(l).forEach(g=>{e.style[g]=`${l[g]}px`}),i();return}Object.keys(u).forEach(g=>{const M=u[g],E=l[g],A=parseFloat(e.style[g]||M),S=h[g],$=E-A,k=n*$,L=a*S,x=(k-L)/o;h[g]=S+x*(y/1e3);const P=A+h[g]*(y/1e3);e.style[g]=`${P}px`}),requestAnimationFrame(d)};requestAnimationFrame(d)})},getAnimations(e){return e.getAnimations()},getAnimationState(e){const t=e.getAnimations();return t.length===0?"idle":t.some(r=>r.playState==="running")?"running":"paused"},hasAnimations(e){return e.getAnimations().length>0},pauseAnimations(e){e.getAnimations().forEach(t=>t.pause())},resumeAnimations(e){e.getAnimations().forEach(t=>t.play())},reverseAnimations(e){e.getAnimations().forEach(t=>t.reverse())},stopAnimations(e){e.getAnimations().forEach(t=>t.cancel())},async waitForAnimations(e){const t=e.getAnimations();await Promise.all(t.map(r=>r.finished))}},q={average(e){return!Array.isArray(e)||e.length===0?0:this.sumArray(e)/e.length},arrayEquals(e,t){if(!Array.isArray(e)||!Array.isArray(t)||e.length!==t.length)return!1;const r=[...e].sort(this.sortCompare),n=[...t].sort(this.sortCompare);return r.every((a,o)=>a===n[o])},chunks(e,t){if(!Number.isInteger(t)||t<=0)throw new Error("Chunk size must be a positive integer");const r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r},compareArrays(e,t,r={}){if(!Array.isArray(e)||!Array.isArray(t))return!1;const{ordered:n=!1,deep:a=!1}=r;if(e.length!==t.length)return!1;if(n)return e.every((o,s)=>a?this.deepEqual(o,t[s]):o===t[s]);{const o=new Array(t.length).fill(!1);return e.every(s=>{const i=t.findIndex((c,u)=>!o[u]&&(a?this.deepEqual(s,c):s===c));return i===-1?!1:(o[i]=!0,!0)})}},deduplicate(e){return Array.isArray(e)?Array.from(new Set(e)):[]},deepEqual(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e=="object"&&e!==null&&t!==null){if(Array.isArray(e)!==Array.isArray(t))return!1;if(Array.isArray(e))return e.length!==t.length?!1:e.every((a,o)=>this.deepEqual(a,t[o]));const r=Object.keys(e),n=Object.keys(t);return r.length!==n.length?!1:r.every(a=>this.deepEqual(e[a],t[a]))}return!1},difference(e,t,r=n=>n.id){const n=new Set(t.map(r));return e.filter(a=>!n.has(r(a)))},findMax(e){if(!(!Array.isArray(e)||e.length===0))return e.reduce((t,r)=>r>t?r:t,e[0])},findMin(e){if(!(!Array.isArray(e)||e.length===0))return e.reduce((t,r)=>r<t?r:t,e[0])},findAndUpdate(e,t){const r=e.findIndex(n=>n.id===t.id);if(r===-1)throw new Error(`Item with id ${t.id} not found in collection`);return e.map((n,a)=>a===r?t:n)},flatten(e,t=1/0){return t<=0?e.slice():Array.isArray(e)?e.reduce((r,n)=>(Array.isArray(n)?r.push(...this.flatten(n,t-1)):r.push(n),r),[]):[e]},groupBy(e,t){return Array.isArray(e)?e.reduce((r,n)=>{const a=typeof t=="function"?t(n):String(n[t]);return r[a]=r[a]||[],r[a].push(n),r},{}):{}},hasCommonElement(e,t){if(!e?.length||!t?.length)return!1;const[r,n]=e.length<t.length?[e,t]:[t,e],a=new Set(r);return n.some(o=>a.has(o))},intersection(e,t){if(!Array.isArray(e)||!Array.isArray(t))return[];const r=new Set(t);return e.filter(n=>r.has(n))},moveItem(e,t,r){if(!Array.isArray(e))throw new Error("First argument must be an array");if(t<0||t>=e.length)throw new Error(`Source index ${t} is out of bounds`);if(r<0||r>=e.length)throw new Error(`Destination index ${r} is out of bounds`);const n=[...e],[a]=n.splice(t,1);return n.splice(r,0,a),n},random(e){if(!(!Array.isArray(e)||e.length===0))return e[Math.floor(Math.random()*e.length)]},remove(e,t){return Array.isArray(e)?e.filter(r=>!t(r)):[]},shuffle(e){if(!Array.isArray(e))return[];const t=[...e];for(let r=t.length-1;r>0;r--){const n=Math.floor(Math.random()*(r+1));[t[r],t[n]]=[t[n],t[r]]}return t},sortCompare(e,t){const r=["string","number","bool"];return typeof e!=typeof t?r.indexOf(typeof t)-r.indexOf(typeof e):e===t?0:e>t?1:-1},sumArray(e){return Array.isArray(e)?e.reduce((t,r)=>t+(Number(r)||0),0):0},takeFirst(e,t=1){return Array.isArray(e)?e.slice(0,t):[]},takeLast(e,t=1){return Array.isArray(e)?e.slice(-t):[]},union(...e){return this.deduplicate(e.flat())}},T=e=>{const{r:t,g:r,b:n}=e;if(t<0||t>255||r<0||r>255||n<0||n>255)throw new Error("RGB values must be between 0 and 255")},V=e=>{const{h:t,s:r,l:n}=e;if(t<0||t>360||r<0||r>100||n<0||n>100)throw new Error("HSL values must be between 0-360 for hue and 0-100 for saturation and lightness")},z=e=>{const{c:t,m:r,y:n,k:a}=e;if(t<0||t>100||r<0||r>100||n<0||n>100||a<0||a>100)throw new Error("CMYK values must be between 0 and 100")},Z={adjustBrightness(e,t){T(e);const r=n=>Math.max(0,Math.min(255,n+t));return{r:r(e.r),g:r(e.g),b:r(e.b)}},adjustSaturation(e,t){T(e);const r=this.rgbToHsl(e);return r.s=Math.max(0,Math.min(100,r.s+t)),this.hslToRgb(r)},blendColors(e,t,r){if(T(e),T(t),r<0||r>1)throw new Error("Blend ratio must be between 0 and 1");const n=(a,o)=>Math.round(a*(1-r)+o*r);return{r:n(e.r,t.r),g:n(e.g,t.g),b:n(e.b,t.b)}},cmykToRgb(e){z(e);const{c:t,m:r,y:n,k:a}=e,o=255*(1-t/100)*(1-a/100),s=255*(1-r/100)*(1-a/100),i=255*(1-n/100)*(1-a/100);return{r:Math.round(o),g:Math.round(s),b:Math.round(i)}},contrastRatio(e,t){T(e),T(t);const r=i=>{const[c,u,l]=[i.r,i.g,i.b].map(h=>(h=h/255,h<=.03928?h/12.92:Math.pow((h+.055)/1.055,2.4)));return .2126*c+.7152*u+.0722*l},n=r(e),a=r(t),o=Math.max(n,a),s=Math.min(n,a);return(o+.05)/(s+.05)},hexToRgb(e){if(!this.isValidHexColor(e))throw new Error("Invalid hex color format");const t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!t)throw new Error("Invalid hex color");return{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}},hslToRgb(e){V(e);const{h:t,s:r,l:n}=e,a=r/100,o=n/100,s=(1-Math.abs(2*o-1))*a,i=s*(1-Math.abs(t/60%2-1)),c=o-s/2;let u=0,l=0,h=0;return t>=0&&t<60?(u=s,l=i,h=0):t>=60&&t<120?(u=i,l=s,h=0):t>=120&&t<180?(u=0,l=s,h=i):t>=180&&t<240?(u=0,l=i,h=s):t>=240&&t<300?(u=i,l=0,h=s):t>=300&&t<360&&(u=s,l=0,h=i),{r:Math.round((u+c)*255),g:Math.round((l+c)*255),b:Math.round((h+c)*255)}},invertColor(e){return T(e),{r:255-e.r,g:255-e.g,b:255-e.b}},isValidHexColor(e){return/^#?([a-f\d]{3}|[a-f\d]{6})$/i.test(e)},randomColor(e="hex"){const t=r=>Math.floor(Math.random()*r);switch(e){case"rgb":const r=t(256),n=t(256),a=t(256);return`rgb(${r}, ${n}, ${a})`;case"hex":const o=t(256),s=t(256),i=t(256);return`#${[o,s,i].map(A=>A.toString(16).padStart(2,"0")).join("")}`;case"hsl":const c=t(361),u=t(101),l=t(101);return`hsl(${c}, ${u}%, ${l}%)`;case"cmyk":const h=t(101),d=t(101),f=t(101),y=t(101);return`cmyk(${h}%, ${d}%, ${f}%, ${y}%)`;default:const g=t(256),M=t(256),E=t(256);return`#${[g,M,E].map(A=>A.toString(16).padStart(2,"0")).join("")}`}},rgbToCmyk(e){T(e);const{r:t,g:r,b:n}=e,a=t/255,o=r/255,s=n/255,i=1-Math.max(a,o,s),c=(1-a-i)/(1-i)||0,u=(1-o-i)/(1-i)||0,l=(1-s-i)/(1-i)||0;return{c:Math.round(c*100),m:Math.round(u*100),y:Math.round(l*100),k:Math.round(i*100)}},rgbToHex(e){T(e);const{r:t,g:r,b:n}=e;return"#"+[t,r,n].map(a=>a.toString(16).padStart(2,"0")).join("")},rgbToHsl(e){T(e);const{r:t,g:r,b:n}=e,a=t/255,o=r/255,s=n/255,i=Math.max(a,o,s),c=Math.min(a,o,s);let u=0,l=0;const h=(i+c)/2;if(i!==c){const d=i-c;switch(l=h>.5?d/(2-i-c):d/(i+c),i){case a:u=(o-s)/d+(o<s?6:0);break;case o:u=(s-a)/d+2;break;case s:u=(a-o)/d+4;break}u/=6}return{h:Math.round(u*360),s:Math.round(l*100),l:Math.round(h*100)}}},U=1e3,H=U*60,_=H*60,G=_*24,W={add(e,t=new Date){this.validateTimeUnits(e);const r=this.convertToDate(t);return this.adjustDate(e,r,1)},adjustDate(e,t,r){const n=new Date(t.valueOf());return e.years&&n.setFullYear(n.getFullYear()+e.years*r),e.months&&n.setMonth(n.getMonth()+e.months*r),e.weeks&&n.setDate(n.getDate()+e.weeks*7*r),e.days&&n.setDate(n.getDate()+e.days*r),e.hours&&n.setHours(n.getHours()+e.hours*r),e.minutes&&n.setMinutes(n.getMinutes()+e.minutes*r),e.seconds&&n.setSeconds(n.getSeconds()+e.seconds*r),n},calculateAge(e){if(!e)return null;const t=new Date,r=e instanceof Date?e:new Date(e);let n=t.getFullYear()-r.getFullYear();const a=t.getMonth()-r.getMonth(),o=t.getDate()-r.getDate();return(a<0||a===0&&o<0)&&n--,n},calculateDaysBetween(e,t){const r=this.convertToDate(e),n=this.convertToDate(t),a=Date.UTC(r.getFullYear(),r.getMonth(),r.getDate()),o=Date.UTC(n.getFullYear(),n.getMonth(),n.getDate());return Math.abs(Math.floor((o-a)/G))},compareDates(e,t,r="asc"){const n=this.normalizeDate(e),a=this.normalizeDate(t);if(!n&&!a)return 0;if(!n)return r==="asc"?1:-1;if(!a)return r==="asc"?-1:1;const o=n.getTime()-a.getTime();return r==="asc"?o:-o},convertToDate(e){if(e instanceof Date)return new Date(e.valueOf());if(typeof e=="number")return e.toString().length===10?new Date(e*U):new Date(e);if(typeof e=="string"){const t=new Date(e);if(isNaN(t.getTime()))throw new Error(`Invalid date string: ${e}`);return t}throw new Error("Invalid date argument")},copyTimeToDate(e,t){const r=this.convertToDate(e),n=this.convertToDate(t);return n.setHours(r.getHours(),r.getMinutes(),r.getSeconds(),r.getMilliseconds()),n},getAge(e,t=new Date){const r=this.convertToDate(e),n=this.convertToDate(t);let a=n.getFullYear()-r.getFullYear();const o=n.getMonth()-r.getMonth();return(o<0||o===0&&n.getDate()<r.getDate())&&a--,a},getDaysInMonth(e,t){return new Date(e,t+1,0).getDate()},getDaysBetweenInclusive(e,t){return this.calculateDaysBetween(e,t)+1},getFirstDayOfMonth(e=new Date){const t=this.convertToDate(e);return t.setDate(1),this.getStartOfDay(t)},getFirstDayOfQuarter(e=new Date){const t=this.convertToDate(e),r=this.getQuarter(t);return t.setMonth((r-1)*3,1),this.getStartOfDay(t)},getFirstDayOfWeek(e=new Date){const t=this.convertToDate(e),r=t.getDay();return t.setDate(t.getDate()-r),this.getStartOfDay(t)},getFirstDayOfYear(e=new Date){const t=this.convertToDate(e);return t.setMonth(0,1),this.getStartOfDay(t)},getEndOfDay(e){const t=this.convertToDate(e||new Date);return t.setHours(23,59,59,999),t},getLastDayOfMonth(e=new Date){const t=this.convertToDate(e);return t.setMonth(t.getMonth()+1),t.setDate(0),this.getEndOfDay(t)},getLastDayOfQuarter(e=new Date){const t=this.convertToDate(e),r=this.getQuarter(t);return t.setMonth(r*3,0),this.getEndOfDay(t)},getLastDayOfWeek(e=new Date){const t=this.convertToDate(e),r=t.getDay();return t.setDate(t.getDate()+(6-r)),this.getEndOfDay(t)},getLastDayOfYear(e=new Date){const t=this.convertToDate(e);return t.setMonth(11,31),this.getEndOfDay(t)},getQuarter(e=new Date){const t=this.convertToDate(e).getMonth();return Math.floor(t/3)+1},getStartOfDay(e){const t=this.convertToDate(e||new Date);return t.setHours(0,0,0,0),t},getWeekNumber(e=new Date){const t=this.convertToDate(e),r=new Date(t.getFullYear(),0,1),n=(t.getTime()-r.getTime())/G;return Math.ceil((n+r.getDay()+1)/7)},isAfter(e,t){return this.convertToDate(e).valueOf()>this.convertToDate(t).valueOf()},isBefore(e,t){return this.convertToDate(e).valueOf()<this.convertToDate(t).valueOf()},isDateInThePast(e){return this.convertToDate(e)<=new Date},isSameDay(e,t){const r=this.convertToDate(e),n=this.convertToDate(t);return r.getDate()===n.getDate()&&r.getMonth()===n.getMonth()&&r.getFullYear()===n.getFullYear()},isSameTime(e,t){return this.convertToDate(e).valueOf()===this.convertToDate(t).valueOf()},isToday(e){const t=this.convertToDate(e);return!t||t.toLocaleDateString()===new Date().toLocaleDateString()},isTomorrow(e){const t=new Date;return t.setDate(t.getDate()+1),this.isSameDay(e,t)},isValidDate(e){try{return!Number.isNaN(this.convertToDate(e).getTime())}catch{return!1}},isWeekday(e){return!this.isWeekend(e)},isWeekend(e){const t=this.convertToDate(e).getUTCDay();return t===0||t===6},isYesterday(e){const t=new Date;return t.setDate(t.getDate()-1),this.isSameDay(e,t)},normalizeDate(e){if(!e)return null;try{if(typeof e=="string"){const r=e.split("/");if(r.length===2&&r[0].length===2&&r[1].length===4){const n=parseInt(r[0],10),a=parseInt(r[1],10);if(!isNaN(n)&&!isNaN(a)&&n>=1&&n<=12)return new Date(Date.UTC(a,n-1,1))}}const t=this.convertToDate(e);if(!isNaN(t.valueOf()))return new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate()))}catch{}return null},subtract(e,t=new Date){this.validateTimeUnits(e);const r=this.convertToDate(t);return this.adjustDate(e,r,-1)},toLocalISOString(e){const t=r=>String(r).padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}T${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}.${String(e.getMilliseconds()).padStart(3,"0")}`},validateTimeUnits(e){for(const[t,r]of Object.entries(e))if(r!==void 0&&r<0)throw new Error(`Negative values are not allowed for time unit: ${t}`)}},Y={addOnlineStatusListener(e){const t=()=>e(navigator.onLine);return window.addEventListener("online",t),window.addEventListener("offline",t),()=>{window.removeEventListener("online",t),window.removeEventListener("offline",t)}},async getBatteryLevel(){if(!("getBattery"in navigator))return null;try{return(await navigator.getBattery()).level}catch{return null}},getConnectionType(){return"connection"in navigator&&navigator.connection?.effectiveType||null},getDeviceType(){const e=navigator.userAgent;return/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(e)?"tablet":/Mobile|Android|iP(hone|od)|IEMobile|BlackBerry|Kindle|Silk-Accelerated|(hpw|web)OS|Opera M(obi|ini)/.test(e)?"mobile":"desktop"},getHardwareConcurrency(){return navigator.hardwareConcurrency||1},getLanguage(){return navigator.language},getMemory(){return"deviceMemory"in navigator&&navigator.deviceMemory||null},getOrientation(){return window.innerHeight>window.innerWidth?"portrait":"landscape"},getPixelRatio(){return window.devicePixelRatio||1},getPlatform(){return"userAgentData"in navigator?navigator.userAgentData.platform||"":navigator.userAgent},getScreenDimensions(){return{width:window.screen.width,height:window.screen.height}},getVendor(){return"userAgentData"in navigator?navigator.userAgentData.brands[0]?.brand||"":navigator.userAgent},isMacAddress(e){return/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/.test(e)},isMobile(){return this.getDeviceType()==="mobile"},isOnline(){return navigator.onLine},supportsTouch(){return"ontouchstart"in window||navigator.maxTouchPoints>0}},J={addClass(e,t){e&&(e.classList.contains(t)||e.classList.add(t))},getComputedStyle(e,t){return e?window.getComputedStyle(e).getPropertyValue(t):""},getElementDimensions(e){if(!e)return{width:0,height:0};const t=e.getBoundingClientRect(),r=window.getComputedStyle(e);return{width:t.width+parseFloat(r.marginLeft)+parseFloat(r.marginRight),height:t.height+parseFloat(r.marginTop)+parseFloat(r.marginBottom)}},getElementOffset(e){if(!e)return{top:0,left:0};const t=e.getBoundingClientRect();return{top:t.top+window.scrollY,left:t.left+window.scrollX}},getScrollPosition(e){return e?{scrollTop:e.scrollTop,scrollLeft:e.scrollLeft}:{scrollTop:0,scrollLeft:0}},hasClass(e,t){return e?.classList.contains(t)??!1},isElementInViewport(e){if(!e)return!1;const t=e.getBoundingClientRect(),r=window.innerHeight||document.documentElement.clientHeight,n=window.innerWidth||document.documentElement.clientWidth;return t.top>=0&&t.left>=0&&t.bottom<=r&&t.right<=n},isElementPartiallyVisible(e){if(!e)return!1;const t=e.getBoundingClientRect(),r=window.innerHeight||document.documentElement.clientHeight,n=window.innerWidth||document.documentElement.clientWidth;return!(t.bottom<0||t.top>r||t.right<0||t.left>n)},removeClass(e,t){e&&e.classList.contains(t)&&e.classList.remove(t)},scrollIntoView(e,t={behavior:"smooth"}){e?.scrollIntoView(t)},setScrollPosition(e,t){e&&(e.scrollTop=t.scrollTop,e.scrollLeft=t.scrollLeft)},setStyle(e,t,r){e&&e.style.setProperty(t,r)},toggleClass(e,t,r){e&&e.classList.toggle(t,r)},waitForElement(e,t=5e3){return new Promise(r=>{if(document.querySelector(e))return r(document.querySelector(e));const n=new MutationObserver(()=>{document.querySelector(e)&&(n.disconnect(),r(document.querySelector(e)))});n.observe(document.body,{childList:!0,subtree:!0}),setTimeout(()=>{n.disconnect(),r(null)},t)})}};class Q extends Error{constructor(t){super(t),this.name="AuthenticationError"}}class X extends Error{constructor(t){super(t),this.name="AuthorizationError"}}class ee extends Error{constructor(t){super(t),this.name="NetworkError"}}class te extends Error{constructor(t){super(t),this.name="NotFoundError"}}class re extends Error{constructor(t){super(t),this.name="TimeoutError"}}class m extends Error{constructor(t){super(t),this.name="ValidationError"}}const ne={captureError(e,t={}){const{log:r=!0,tags:n={},context:a={}}=t,o=e instanceof Error?e:new Error(String(e));typeof window<"u"&&window.DD_LOGS&&window.DD_LOGS.logger.error(o.message,{error:o,...a,tags:{error_name:o.name,error_stack:o.stack,...n}}),r&&console.error(o)},isErrorType(e,t){return e instanceof t},validateArray(e,t="Invalid array"){if(!Array.isArray(e))throw new m(t)},validateArrayLength(e,t,r,n="Invalid array length"){if(e.length<t||e.length>r)throw new m(n)},validateArrayNotEmpty(e,t){if(e.length===0)throw new m(t)},validateBigInt(e,t="Invalid bigint"){if(typeof e!="bigint")throw new m(t)},validateBoolean(e,t="Invalid boolean value"){if(typeof e!="boolean")throw new m(t)},validateCreditCard(e,t="Invalid credit card number"){const r=e.replace(/[\s-]/g,"");if(!/^\d+$/.test(r))throw new m(t);let n=0,a=!1;for(let o=r.length-1;o>=0;o--){let s=parseInt(r.charAt(o));a&&(s*=2,s>9&&(s-=9)),n+=s,a=!a}if(n%10!==0)throw new m(t)},validateDate(e,t="Invalid date"){const r=new Date(e);if(isNaN(r.getTime()))throw new m(t)},validateDateInstance(e,t="Invalid date"){if(!(e instanceof Date)||isNaN(e.getTime()))throw new m(t)},validateDateRange(e,t,r="Invalid date range"){const n=new Date(e),a=new Date(t);if(isNaN(n.getTime())||isNaN(a.getTime()))throw new m(r);if(n>a)throw new m(r)},validateEmail(e,t="Invalid email address"){const r=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;this.validateRegex(e,r,t)},validateEnum(e,t,r="Invalid enum value"){if(!Object.values(t).includes(e))throw new m(r)},validateFileSize(e,t,r="File size exceeds maximum allowed size"){if(e<0||e>t)throw new m(r)},validateFileType(e,t,r="Invalid file type"){if(!t.includes(e.type))throw new m(r)},validateFunction(e,t="Invalid function"){if(typeof e!="function")throw new m(t)},validateImageDimension(e,t,r,n,a="Invalid image dimension"){if(e<=0||t<=0||e>r||t>n)throw new m(a)},validateInteger(e,t="Invalid integer"){if(this.validateNumber(e,t),!Number.isInteger(e))throw new m(t)},validateIP(e,t=4,r="Invalid IP address"){const n={4:/^(\d{1,3}\.){3}\d{1,3}$/,6:/^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/};if(this.validateRegex(e,n[t],r),t===4){const a=e.split(".");for(const o of a){const s=parseInt(o);if(s<0||s>255)throw new m(r)}}},validateMAC(e,t="Invalid MAC address"){const r=/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/;this.validateRegex(e,r,t)},validateMap(e,t="Invalid map"){if(!(e instanceof Map))throw new m(t)},validateNegativeNumber(e,t="Invalid negative number"){if(this.validateNumber(e,t),e>=0)throw new m(t)},validateNonNull(e,t="Value must not be null"){if(e===null)throw new m(t)},validateNonNullOrUndefined(e,t="Value must not be null or undefined"){if(e==null)throw new m(t)},validateNonUndefined(e,t="Value must not be undefined"){if(e===void 0)throw new m(t)},validateNull(e,t="Value must be null"){if(e!==null)throw new m(t)},validateNullOrUndefined(e,t="Value must be null or undefined"){if(e!=null)throw new m(t)},validateNotNull(e,t){if(e==null)throw new m(t)},validateNotEmpty(e,t){if(!e.trim())throw new m(t)},validateNumber(e,t="Invalid number"){if(typeof e!="number"||isNaN(e))throw new m(t)},validateObject(e,t="Invalid object"){if(typeof e!="object"||e===null)throw new m(t)},validateObjectKey(e,t,r="Invalid object key"){if(!(t in e))throw new m(r)},validatePassword(e,t={}){const{minLength:r=8,requireUppercase:n=!0,requireLowercase:a=!0,requireNumber:o=!0,requireSpecialChar:s=!0,message:i="Invalid password"}=t;if(e.length<r)throw new m(`${i}: Minimum length is ${r}`);if(n&&!/[A-Z]/.test(e))throw new m(`${i}: Must contain uppercase letter`);if(a&&!/[a-z]/.test(e))throw new m(`${i}: Must contain lowercase letter`);if(o&&!/\d/.test(e))throw new m(`${i}: Must contain number`);if(s&&!/[!@#$%^&*(),.?":{}|<>]/.test(e))throw new m(`${i}: Must contain special character`)},validatePhone(e,t="Invalid phone number"){const r=/^\+?[\d\s-()]{10,}$/;this.validateRegex(e,r,t)},validatePositiveNumber(e,t="Invalid positive number"){if(this.validateNumber(e,t),e<=0)throw new m(t)},validatePostalCode(e,t="US",r="Invalid postal code"){const n={US:/^\d{5}(-\d{4})?$/,CA:/^[A-Z]\d[A-Z] \d[A-Z]\d$/,UK:/^[A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}$/};this.validateRegex(e,n[t],r)},validatePromise(e,t="Invalid promise"){if(!(e instanceof Promise))throw new m(t)},validateRange(e,t,r,n){if(e<t||e>r)throw new m(n)},validateRegex(e,t,r){if(!t.test(e))throw new m(r)},validateRegExp(e,t="Invalid regular expression"){if(!(e instanceof RegExp))throw new m(t)},validateSet(e,t="Invalid set"){if(!(e instanceof Set))throw new m(t)},validateSSN(e,t="Invalid SSN"){const r=/^(?!000|666)[0-8][0-9]{2}-(?!00)[0-9]{2}-(?!0000)[0-9]{4}$/;this.validateRegex(e,r,t)},validateString(e,t="Invalid string"){if(typeof e!="string")throw new m(t)},validateSymbol(e,t="Invalid symbol"){if(typeof e!="symbol")throw new m(t)},validateTime(e,t="24h",r="Invalid time"){const n={"12h":/^(0?[1-9]|1[0-2]):[0-5][0-9] (AM|PM)$/i,"24h":/^([01]?[0-9]|2[0-3]):[0-5][0-9]$/};this.validateRegex(e,n[t],r)},validateUndefined(e,t="Value must be undefined"){if(e!==void 0)throw new m(t)},validateUrl(e,t="Invalid URL"){try{new URL(e)}catch{throw new m(t)}},validateUUID(e,t=4,r="Invalid UUID"){if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e))throw new m(r);const a=e.charAt(14),o=parseInt(a,16);if(o!==t)throw new m(`${r}: Expected version ${t}, got version ${o}`);const s=parseInt(e.charAt(19),16);switch(t){case 1:if((s&192)!==128)throw new m(`${r}: Invalid version 1 UUID clock sequence`);break;case 2:if((s&192)!==128)throw new m(`${r}: Invalid version 2 UUID clock sequence`);break;case 3:if((s&192)!==64)throw new m(`${r}: Invalid version 3 UUID clock sequence`);break;case 4:if((s&192)!==64)throw new m(`${r}: Invalid version 4 UUID clock sequence`);break;case 5:if((s&192)!==64)throw new m(`${r}: Invalid version 5 UUID clock sequence`);break}},validateWeakMap(e,t="Invalid weak map"){if(!(e instanceof WeakMap))throw new m(t)},validateWeakSet(e,t="Invalid weak set"){if(!(e instanceof WeakSet))throw new m(t)},withAsyncErrorHandling(e,t){return async(...r)=>{try{return await e(...r)}catch(n){throw t(n),n}}},withErrorHandling(e,t){return(...r)=>{try{return e(...r)}catch(n){throw t(n),n}}}},C={image:"image.*",video:"video.*",audio:"audio.*"},ae={bytesToSize(e){const t=["Bytes","KB","MB","GB","TB"];if(e===0)return"0 Byte";const r=Math.floor(Math.log(e)/Math.log(1024));return`${Math.round(e/1024**r)} ${t[r]}`},downloadBlob(e,t){if(window.navigator.msSaveOrOpenBlob)window.navigator.msSaveOrOpenBlob(e,t);else{const r=window.URL.createObjectURL(e),n=document.createElement("a");n.href=r,n.style.display="none",n.download=t,document.body.appendChild(n),n.click(),window.URL.revokeObjectURL(r),document.body.removeChild(n)}},extractBase64FromLocalUrl(e){if(!e?.length)return e;const t=e.indexOf("base64,");return t===-1?e:e.substring(t+7)},fileIsAlreadyAttached(e,t){return t.find(r=>{const{mediaId:n,name:a}=r.data||{},{mediaId:o,name:s}=e.data||{};return o?n===o:a===s})},getBasicFileType(e){for(const t of Object.keys(C))if(e.type.match(C[t]))return t;return"document"},async getImagePreview(e){return e?.type.startsWith("image/")?new Promise((t,r)=>{const n=new FileReader;n.onload=a=>{const o=document.createElement("img");o.onload=()=>t(a.target?.result),o.onerror=()=>r(new Error("Failed to load image")),o.src=a.target?.result},n.onerror=()=>r(new Error("Failed to read file")),n.readAsDataURL(e)}):""},getLocalUrl(e,t){const r=new FileReader;r.onload=n=>t(n.target?.result),r.onerror=n=>console.error(n),r.readAsDataURL(e)},isFileExtension(e){return/^[a-zA-Z0-9]+$/.test(e)},sizeToBytes(e,t){if(!e)return 0;const r=parseFloat(String(e));if(Number.isNaN(r))return 0;switch(t.toUpperCase()){case"KB":return r*1024;case"MB":return r*1024*1024;case"GB":return r*1024*1024*1024;case"TB":return r*1024*1024*1024*1024;default:return r}}},oe={formatAddress:e=>{const t=[];return e.street&&t.push(e.street),e.city&&t.push(e.city),e.state&&t.push(e.state),e.zip&&t.push(e.zip),e.country&&t.push(e.country),t.join(", ")},formatCreditCard:e=>{const r=e.replace(/\D/g,"").match(/.{1,4}/g);return r?r.join(" "):e},formatCurrency:(e,t="USD",r="en-US")=>new Intl.NumberFormat(r,{style:"currency",currency:t}).format(e),formatFileSize:(e,t=2)=>{if(e===0)return"0 Bytes";const r=1024,n=["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"],a=Math.floor(Math.log(e)/Math.log(r));return`${parseFloat((e/Math.pow(r,a)).toFixed(t))} ${n[a]}`},formatNumber:e=>e.toString().replace(/\B(?=(\d{3})+(?!\d))/g,","),formatPercent:(e,t=1)=>`${e.toFixed(t)}%`,formatPhoneNumber:(e,t="US")=>{const r=e.replace(/\D/g,"");if(t==="US"){const n=r.match(/^(\d{3})(\d{3})(\d{4})$/);if(n)return`(${n[1]}) ${n[2]}-${n[3]}`}else if(t==="EU"){const n=r.match(/^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/);if(n)return`${n[1]} ${n[2]} ${n[3]} ${n[4]} ${n[5]}`}return e},formatDuration:(e,t="short")=>{if(e===0)return t==="short"?"0s":"0 seconds";const r=Math.floor(e/1e3),n=Math.floor(r/60),a=Math.floor(n/60),o=Math.floor(a/24);if(t==="short")return o>0?`${o}d`:a>0?`${a}h`:n>0?`${n}m`:`${r}s`;const s=r%60,i=n%60,c=a%24,u=[];return o>0&&u.push(`${o} day${o===1?"":"s"}`),c>0&&u.push(`${c} hour${c===1?"":"s"}`),i>0&&u.push(`${i} minute${i===1?"":"s"}`),s>0&&u.push(`${s} second${s===1?"":"s"}`),u.join(", ")},formatSSN:e=>{const r=e.replace(/\D/g,"").match(/^(\d{3})(\d{2})(\d{4})$/);return r?`${r[1]}-${r[2]}-${r[3]}`:e}},se={compose(...e){return function(t){return e.reduceRight((r,n)=>n(r),t)}},debounce(e,t=1e3,r=!1){let n=null;return function(...a){const o=this,s=function(){n=null,r||e.apply(o,a)},i=r&&!n;if(n&&clearTimeout(n),n=setTimeout(s,t),i)return e.apply(o,a)}},defer(e){return function(...t){setTimeout(()=>e.apply(this,t),0)}},once(e){let t=!1,r;return function(...n){return t||(t=!0,r=e.apply(this,n)),r}},throttle(e,t=1e3){let r=0;return function(...n){const a=Date.now();if(a-r>=t)return r=a,e.apply(this,n)}}},ie=/^data:image\/(png|jpg|jpeg|gif|svg|webp);base64,/,ce={async applyGrayscale(e){return new Promise((t,r)=>{const n=new Image;n.onload=()=>{const a=document.createElement("canvas"),o=a.getContext("2d");if(!o){r(new Error("Could not get canvas context"));return}a.width=n.width,a.height=n.height,o.drawImage(n,0,0);const s=o.getImageData(0,0,a.width,a.height),i=s.data;for(let c=0;c<i.length;c+=4){const u=(i[c]+i[c+1]+i[c+2])/3;i[c]=u,i[c+1]=u,i[c+2]=u}o.putImageData(s,0,0),a.toBlob(c=>{c?t(c):r(new Error("Failed to create blob"))},e.type)},n.onerror=r,n.src=URL.createObjectURL(e)})},calculateAspectRatio(e,t){return e/t},async base64ToBlob(e,t="image/jpeg"){return(await fetch(`data:${t};base64,${e}`)).blob()},async blobToBase64(e){return new Promise((t,r)=>{const n=new FileReader;n.onload=()=>{const a=n.result;t(a.split(",")[1])},n.onerror=r,n.readAsDataURL(e)})},async compressImage(e,t=.7){return new Promise((r,n)=>{const a=new Image;a.onload=()=>{const o=document.createElement("canvas"),s=o.getContext("2d");if(!s){n(new Error("Could not get canvas context"));return}o.width=a.width,o.height=a.height,s.drawImage(a,0,0),o.toBlob(i=>{i?r(i):n(new Error("Failed to create blob"))},e.type,t)},a.onerror=n,a.src=URL.createObjectURL(e)})},convertBase64ToFile(e,t){return ie.test(e)?this.base64ToBlob(e).then(r=>new File([r],t)):null},async createThumbnail(e,t=200){return new Promise((r,n)=>{const a=new Image;a.onload=()=>{const o=document.createElement("canvas"),s=o.getContext("2d");if(!s){n(new Error("Could not get canvas context"));return}let i=a.width,c=a.height;i>c?i>t&&(c=Math.round(c*t/i),i=t):c>t&&(i=Math.round(i*t/c),c=t),o.width=i,o.height=c,s.drawImage(a,0,0,i,c),r(o.toDataURL("image/jpeg",.7))},a.onerror=n,a.src=URL.createObjectURL(e)})},async cropImage(e,t,r,n,a){return new Promise((o,s)=>{const i=new Image;i.onload=()=>{const c=document.createElement("canvas"),u=c.getContext("2d");if(!u){s(new Error("Could not get canvas context"));return}c.width=n,c.height=a,u.drawImage(i,t,r,n,a,0,0,n,a),c.toBlob(l=>{l?o(l):s(new Error("Failed to create blob"))},e.type)},i.onerror=s,i.src=URL.createObjectURL(e)})},async getImageMetadata(e){return new Promise((t,r)=>{const n=new Image;n.onload=()=>{t({width:n.width,height:n.height,type:e.type,size:e.size})},n.onerror=r,n.src=URL.createObjectURL(e)})},async getDominantColor(e){return new Promise((t,r)=>{const n=new Image;n.onload=()=>{const a=document.createElement("canvas"),o=a.getContext("2d");if(!o){r(new Error("Could not get canvas context"));return}const s=Math.min(1,100/Math.max(n.width,n.height));a.width=n.width*s,a.height=n.height*s,o.drawImage(n,0,0,a.width,a.height);const c=o.getImageData(0,0,a.width,a.height).data,u={};for(let d=0;d<c.length;d+=4){const f=c[d],y=c[d+1],g=c[d+2],M=`#${f.toString(16).padStart(2,"0")}${y.toString(16).padStart(2,"0")}${g.toString(16).padStart(2,"0")}`;u[M]=(u[M]||0)+1}let l=0,h="#000000";for(const d in u)u[d]>l&&(l=u[d],h=d);t(h)},n.onerror=r,n.src=URL.createObjectURL(e)})},getScaledDimensions(e,t,r){const n=e.width,a=e.height;let o=n,s=a;if(t&&r){const i=n/a;(n>t||a>r)&&(i>1?(o=t,s=t/i):(s=r,o=r*i))}else if(t){const i=n/a;n>t&&(o=t,s=t/i)}else if(r){const i=n/a;a>r&&(s=r,o=r*i)}return{width:Math.round(o),height:Math.round(s)}},async imageExists(e){try{return(await fetch(e)).ok}catch{return!1}},isImageFile(e){return e.type.startsWith("image/")},loadImage(e){return new Promise((t,r)=>{const n=new Image;n.onload=()=>t(n),n.onerror=r,n.src=e})},async loadImageElement(e){const t=new Image;t.src=e;try{await t.decode()}catch(r){return console.error(r),null}return t},async resizeImage(e,t={}){const{maxWidth:r=1920,maxHeight:n=1080,quality:a=.8,format:o="jpeg"}=t;return new Promise((s,i)=>{const c=new Image;c.onload=()=>{const u=document.createElement("canvas"),l=u.getContext("2d");if(!l){i(new Error("Could not get canvas context"));return}let h=c.width,d=c.height;h>d?h>r&&(d=Math.round(d*r/h),h=r):d>n&&(h=Math.round(h*n/d),d=n),u.width=h,u.height=d,l.drawImage(c,0,0,h,d),u.toBlob(f=>{f?s(f):i(new Error("Failed to create blob"))},`image/${o}`,a)},c.onerror=i,c.src=URL.createObjectURL(e)})},async rotateImage(e,t){return new Promise((r,n)=>{const a=new Image;a.onload=()=>{const o=document.createElement("canvas"),s=o.getContext("2d");if(!s){n(new Error("Could not get canvas context"));return}const i=t*Math.PI/180,c=Math.abs(Math.sin(i)),u=Math.abs(Math.cos(i)),l=a.width*u+a.height*c,h=a.width*c+a.height*u;o.width=l,o.height=h,s.translate(l/2,h/2),s.rotate(i),s.drawImage(a,-a.width/2,-a.height/2),o.toBlob(d=>{d?r(d):n(new Error("Failed to create blob"))},e.type)},a.onerror=n,a.src=URL.createObjectURL(e)})},async urlToFile(e,t,r){const a=await(await fetch(e)).blob();return new File([a],t,{type:r})},validateImageDimensions(e,t,r,n){return e<=r&&t<=n}},w={formatCurrency(e,t="USD",r=w.getUserLocale(),n={}){return new Intl.NumberFormat(r,{style:"currency",currency:t,...n}).format(e)},formatDate(e,t=w.getUserLocale(),r={}){const n=typeof e=="string"?new Date(e):e;return new Intl.DateTimeFormat(t,r).format(n)},formatDateWithPattern(e,t="YYYY-MM-DD",r=navigator.language){const n=new Date(e),a=new Intl.DateTimeFormat(r,{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1,timeZone:"UTC"});let o;try{const s=a.formatToParts(n);o={},s.forEach(i=>{o[i.type]=i.value})}catch{const i=n.getUTCFullYear().toString(),c=(n.getUTCMonth()+1).toString().padStart(2,"0"),u=n.getUTCDate().toString().padStart(2,"0"),l=n.getUTCHours().toString().padStart(2,"0"),h=n.getUTCMinutes().toString().padStart(2,"0"),d=n.getUTCSeconds().toString().padStart(2,"0");o={year:i,month:c,day:u,hour:l,minute:h,second:d}}return t.replace(/YYYY|MM|DD|HH|mm|ss/g,s=>{switch(s){case"YYYY":return o.year;case"MM":return o.month;case"DD":return o.day;case"HH":return o.hour;case"mm":return o.minute;case"ss":return o.second;default:return s}})},formatList(e,t=w.getUserLocale(),r={}){return Intl.ListFormat(t,r).format(e)},formatNumber(e,t=w.getUserLocale(),r={}){return new Intl.NumberFormat(t,r).format(e)},formatPlural(e,t=w.getUserLocale(),r={}){return new Intl.PluralRules(t,r).select(e)},formatRelativeTime(e,t=w.getUserLocale(),r={}){const n=typeof e=="string"?new Date(e):e,a=new Date,o=(n instanceof Date?n.getTime():n)-a.getTime(),s=Math.round(o/1e3),i=Math.round(s/60),c=Math.round(i/60),u=Math.round(c/24),l=new Intl.RelativeTimeFormat(t,r);return Math.abs(s)<60?l.format(s,"second"):Math.abs(i)<60?l.format(i,"minute"):Math.abs(c)<24?l.format(c,"hour"):l.format(u,"day")},getCalendarDisplayName(e,t=w.getUserLocale(),r={}){return new Intl.DisplayNames(t,{type:"calendar",...r}).of(e)||e},getCurrencyDisplayName(e,t=w.getUserLocale(),r={}){return new Intl.DisplayNames(t,{type:"currency",...r}).of(e)||e},getDateTimeFieldDisplayName(e,t=w.getUserLocale(),r={}){return new Intl.DisplayNames(t,{type:"dateTimeField",...r}).of(e)||e},getLanguageDisplayName(e,t=w.getUserLocale(),r={}){return new Intl.DisplayNames(t,{type:"language",...r}).of(e)||e},getRegionDisplayName(e,t=w.getUserLocale(),r={}){return new Intl.DisplayNames(t,{type:"region",...r}).of(e)||e},getScriptDisplayName(e,t=w.getUserLocale(),r={}){return new Intl.DisplayNames(t,{type:"script",...r}).of(e)||e},getUnitDisplayName(e,t=w.getUserLocale(),r={}){return new Intl.DisplayNames(t,{type:"unit",...r}).of(e)||e},getUserLocale(){return Intl.DateTimeFormat().resolvedOptions().locale},getUserLanguage(){return navigator.language||"en-US"},getUserLanguages(){return navigator.languages||[navigator.language||"en-US"]},getUserTimezone(){return Intl.DateTimeFormat().resolvedOptions().timeZone}},ue={decodeToken(e){try{const t=e.split(".")[1];if(!t)throw new Error("Invalid JWT token format");const r=t.replace(/-/g,"+").replace(/_/g,"/"),n=decodeURIComponent(atob(r).split("").map(a=>"%"+("00"+a.charCodeAt(0).toString(16)).slice(-2)).join(""));return JSON.parse(n)}catch(t){throw new Error(`Failed to decode JWT token: ${t instanceof Error?t.message:"Unknown error"}`)}},getPayloadClaim(e,t){try{return this.decodeToken(e)[t]}catch(r){throw new Error(`Failed to get claim: ${r instanceof Error?r.message:"Unknown error"}`)}},getTokenTimeRemaining(e){try{const t=this.decodeToken(e);if(!t.exp)return null;const r=Math.floor(Date.now()/1e3);return Math.max(0,t.exp-r)}catch(t){throw new Error(`Failed to get token time remaining: ${t instanceof Error?t.message:"Unknown error"}`)}},isJwt(e){const t=e.split(".");if(t.length!==3)return!1;const r=/^[A-Za-z0-9-_]+$/;return t.every(n=>n.length>0&&r.test(n))},isTokenExpiringSoon(){const e=localStorage.getItem("token");if(!e)return null;try{const t=this.decodeToken(e);if(!t.exp)return!1;const r=(new Date(t.exp*1e3).getTime()-Date.now())/1e3;return r>0&&r<3600}catch(t){return console.error("Error checking JWT expiration:",t),!1}},isTokenExpired(e){try{const t=this.decodeToken(e);if(!t.exp)return!1;const r=Math.floor(Date.now()/1e3);return t.exp<r}catch(t){throw new Error(`Failed to check token expiration: ${t instanceof Error?t.message:"Unknown error"}`)}},isValidToken(e,t=[]){try{const r=this.decodeToken(e);return r.exp&&r.exp<Math.floor(Date.now()/1e3)?!1:t.every(n=>r[n]!==void 0)}catch(r){throw new Error(`Failed to validate token: ${r instanceof Error?r.message:"Unknown error"}`)}}},le={getKeyCategory(e){return this.isAlphanumericKey(e)?"alphanumeric":this.isArrowKey({key:e})?"arrow":this.isFunctionKey(e)?"function":this.isModifierKey({key:e})?"modifier":this.isNavigationKey(e)?"navigation":this.isPunctuationKey(e)?"punctuation":"special"},getKeyCombination(e){const t=[];e.ctrlKey&&t.push("Ctrl"),e.altKey&&t.push("Alt"),e.shiftKey&&t.push("Shift"),e.metaKey&&t.push("Meta");const r=e.key.length===1?e.key.toUpperCase():e.key;return t.length>0?`${t.join("+")}+${r}`:r},isAlphanumericKey(e){return/^[a-zA-Z0-9]$/.test(e)},isArrowKey(e){return["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].includes(e.key)},isBackspaceKey(e){return e.key==="Backspace"||e.keyCode===8},isDeleteKey(e){return e.key==="Delete"||e.keyCode===46},isEnterKey(e){return e.key==="Enter"||e.keyCode===13||e.charCode===13},isEscapeKey(e){return e.key==="Escape"||e.keyCode===27},isFunctionKey(e){return/^F[1-9]|F1[0-2]$/.test(e)},isModifierKey(e){return["Control","Alt","Shift","Meta"].includes(e.key)},isNavigationKey(e){return["Home","End","PageUp","PageDown","ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].includes(e)},isNumericKey(e){return/^[0-9]$/.test(e)},isPunctuationKey(e){return/^[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]$/.test(e)},isSpaceKey(e){return e.key===" "||e.keyCode===32},isTabKey(e){return e.key==="Tab"||e.keyCode===9},simulateClickOnEnter(e){this.isEnterKey(e)&&e.target.click()},stopEvent(e){e.preventDefault(),e.stopPropagation()}},me={calculateBearing(e,t,r,n){const a=this.toRad(n-t),o=this.toRad(e),s=this.toRad(r),i=Math.sin(a)*Math.cos(s),c=Math.cos(o)*Math.sin(s)-Math.sin(o)*Math.cos(s)*Math.cos(a);let u=this.toDeg(Math.atan2(i,c));return u=(u+360)%360,u},calculateDestination(e,t,r,n){const o=r/6371,s=this.toRad(e),i=this.toRad(t),c=this.toRad(n),u=Math.asin(Math.sin(s)*Math.cos(o)+Math.cos(s)*Math.sin(o)*Math.cos(c)),l=i+Math.atan2(Math.sin(c)*Math.sin(o)*Math.cos(s),Math.cos(o)-Math.sin(s)*Math.sin(u));return{latitude:this.toDeg(u),longitude:this.toDeg(l)}},calculateDistance(e,t,r,n){const o=this.toRad(r-e),s=this.toRad(n-t),i=Math.sin(o/2)*Math.sin(o/2)+Math.cos(this.toRad(e))*Math.cos(this.toRad(r))*Math.sin(s/2)*Math.sin(s/2);return 6371*(2*Math.atan2(Math.sqrt(i),Math.sqrt(1-i)))},clearWatch(e){if(!navigator.geolocation)throw new Error("Geolocation is not supported by your browser");navigator.geolocation.clearWatch(e)},formatCoordinate(e,t,r="DD"){if(r==="DD")return`${e.toFixed(6)}, ${t.toFixed(6)}`;const n=e>=0?"N":"S",a=t>=0?"E":"W",o=Math.abs(e),s=Math.abs(t),i=Math.floor(o),c=Math.floor((o-i)*60),u=((o-i)*60-c)*60,l=Math.floor(s),h=Math.floor((s-l)*60),d=((s-l)*60-h)*60;return`${i}° ${c}' ${u.toFixed(2)}" ${n}, ${l}° ${h}' ${d.toFixed(2)}" ${a}`},async getCurrentPosition(e={enableHighAccuracy:!0,timeout:5e3,maximumAge:0}){return new Promise((t,r)=>{if(!navigator.geolocation){r(new Error("Geolocation is not supported by your browser"));return}navigator.geolocation.getCurrentPosition(t,r,e)})},getBoundsCenter(e){return{latitude:(e.north+e.south)/2,longitude:(e.east+e.west)/2}},getBoundsForRadius(e,t,r){const a=this.toRad(e),o=this.toRad(t),s=r/6371,i=this.toDeg(a+s),c=this.toDeg(a-s),u=this.toDeg(o+s/Math.cos(a)),l=this.toDeg(o-s/Math.cos(a));return{north:i,south:c,east:u,west:l}},isWithinBounds(e,t,r){return e<=r.north&&e>=r.south&&t<=r.east&&t>=r.west},parseCoordinate(e){const t=e.split(",").map(a=>a.trim());if(t.length!==2)throw new Error("Invalid coordinate format");const r=parseFloat(t[0]),n=parseFloat(t[1]);if(isNaN(r)||isNaN(n))throw new Error("Invalid coordinate values");return{latitude:r,longitude:n}},toDeg(e){return e*180/Math.PI},toRad(e){return e*Math.PI/180},watchPosition(e,t={enableHighAccuracy:!0,timeout:5e3,maximumAge:0}){if(!navigator.geolocation)throw new Error("Geolocation is not supported by your browser");return navigator.geolocation.watchPosition(e,void 0,t)}},he={defaultOptions:{level:"info",timestamp:!0,prefix:"",group:!1,groupCollapsed:!1,stackTrace:!1},logEntries:[],maxLogEntries:1e3,clearLogEntries(){this.logEntries=[]},debug(e,t={}){this.log(e,{...t,level:"debug"})},error(e,t={}){this.log(e,{...t,level:"error",stackTrace:!0})},exportLogEntries(){return JSON.stringify(this.logEntries,null,2)},formatBytes(e){const t=["B","KB","MB","GB","TB"];let r=e,n=0;for(;r>=1024&&n<t.length-1;)r/=1024,n++;return`${r.toFixed(2)} ${t[n]}`},getLogEntries(){return[...this.logEntries]},getLogEntriesByLevel(e){return this.logEntries.filter(t=>t.level===e)},getLogEntriesByTimeRange(e,t){return this.logEntries.filter(r=>new Date(r.timestamp)>=e&&new Date(r.timestamp)<=t)},info(e,t={}){this.log(e,{...t,level:"info"})},importLogEntries(e){try{const t=JSON.parse(e);this.logEntries=t.slice(-this.maxLogEntries)}catch(t){this.error("Failed to import log entries",{data:t})}},log(e,t={}){const r={...this.defaultOptions,...t},n=new Date().toISOString(),o=`${r.prefix?`[${r.prefix}] `:""}${e}`,s={timestamp:n,level:r.level||"info",message:o,data:r.data};switch(r.stackTrace&&(s.stack=new Error().stack),this.logEntries.push(s),this.logEntries.length>this.maxLogEntries&&this.logEntries.shift(),r.group&&(r.groupCollapsed?console.groupCollapsed(o):console.group(o)),r.level){case"debug":console.debug(o,r.data||"");break;case"info":console.info(o,r.data||"");break;case"warn":console.warn(o,r.data||"");break;case"error":console.error(o,r.data||""),s.stack&&console.error(s.stack);break}r.group&&console.groupEnd()},measureMemory(e){if(performance.memory){const{usedJSHeapSize:t,totalJSHeapSize:r,jsHeapSizeLimit:n}=performance.memory;this.debug(`Memory: ${e}`,{data:{used:this.formatBytes(t),total:this.formatBytes(r),limit:this.formatBytes(n)}})}},measurePerformance(e){const t=performance.now();return()=>{const n=performance.now()-t;this.debug(`Performance: ${e}`,{data:{duration:`${n.toFixed(2)}ms`}})}},async measureAsyncPerformance(e,t){const r=performance.now();try{const n=await t(),o=performance.now()-r;return this.debug(`Performance: ${e}`,{data:{duration:`${o.toFixed(2)}ms`}}),n}catch(n){const o=performance.now()-r;throw this.error(`Performance: ${e}`,{data:{duration:`${o.toFixed(2)}ms`,error:n}}),n}},warn(e,t={}){this.log(e,{...t,level:"warn"})}},de={abs(e){return Math.abs(e)},angle(e,t,r,n){return Math.atan2(n-t,r-e)},average(e){if(e.length===0)throw new Error("Cannot calculate average of empty array");return e.reduce((t,r)=>t+r,0)/e.length},acos(e){return Math.acos(e)},acosh(e){return Math.acosh(e)},asin(e){return Math.asin(e)},asinh(e){return Math.asinh(e)},atan(e){return Math.atan(e)},atan2(e,t){return Math.atan2(e,t)},atanh(e){return Math.atanh(e)},ceil(e){return Math.ceil(e)},clamp(e,t,r){return Math.min(Math.max(e,t),r)},cos(e){return Math.cos(e)},cosh(e){return Math.cosh(e)},cbrt(e){return Math.cbrt(e)},distance(e,t,r,n){return Math.sqrt(Math.pow(r-e,2)+Math.pow(n-t,2))},isEven(e){return e%2===0},fibonacci(e){if(e<0)return NaN;if(e<=1)return e;let t=0,r=1;for(let n=2;n<=e;n++)[t,r]=[r,t+r];return r},factorial(e){return e<0?NaN:e===0||e===1?1:e*this.factorial(e-1)},floor(e){return Math.floor(e)},gcd(e,t){return t===0?e:this.gcd(t,e%t)},iqr(e){const{q1:t,q3:r}=this.quartiles(e);return r-t},isInteger(e){return Number.isInteger(e)},isInRange(e,t,r,n=!0){return n?e>=t&&e<=r:e>t&&e<r},isOdd(e){return e%2!==0},isPrime(e){if(e<=1)return!1;if(e<=3)return!0;if(e%2===0||e%3===0)return!1;for(let t=5;t*t<=e;t+=6)if(e%t===0||e%(t+2)===0)return!1;return!0},lcm(e,t){return Math.abs(e*t)/this.gcd(e,t)},lerp(e,t,r){return e+(t-e)*this.clamp(r,0,1)},log(e){return Math.log(e)},log10(e){return Math.log10(e)},log2(e){return Math.log2(e)},map(e,t,r,n,a){return(e-t)*(a-n)/(r-t)+n},max(e){if(e.length===0)throw new Error("Cannot find maximum of empty array");return Math.max(...e)},median(e){if(e.length===0)throw new Error("Cannot calculate median of empty array");const t=[...e].sort((n,a)=>n-a),r=Math.floor(t.length/2);return t.length%2===0?(t[r-1]+t[r])/2:t[r]},min(e){if(e.length===0)throw new Error("Cannot find minimum of empty array");return Math.min(...e)},mode(e){const t=new Map;let r=0;return e.forEach(n=>{const a=(t.get(n)||0)+1;t.set(n,a),r=Math.max(r,a)}),Array.from(t.entries()).filter(([n,a])=>a===r).map(([n])=>n)},percentile(e,t){const r=[...e].sort((a,o)=>a-o);return r.findIndex(a=>a>=t)/r.length*100},product(e){return e.reduce((t,r)=>t*r,1)},pow(e,t){return Math.pow(e,t)},quartiles(e){const t=[...e].sort((s,i)=>s-i),r=Math.floor(t.length/2),n=this.median(t),a=this.median(t.slice(0,r)),o=this.median(t.slice(r+(t.length%2===0?0:1)));return{q1:a,q2:n,q3:o}},random(e,t){return Math.random()*(t-e)+e},randomInt(e,t){return Math.floor(this.random(e,t+1))},range(e){return this.max(e)-this.min(e)},round(e,t){const r=Math.pow(10,t);return Math.round(e*r)/r},sign(e){return Math.sign(e)},sin(e){return Math.sin(e)},sinh(e){return Math.sinh(e)},sqrt(e){return Math.sqrt(e)},standardDeviation(e){const t=this.average(e),r=e.map(n=>Math.pow(n-t,2));return Math.sqrt(this.average(r))},sum(e){return e.reduce((t,r)=>t+r,0)},tan(e){return Math.tan(e)},tanh(e){return Math.tanh(e)},toRadians(e){return e*Math.PI/180},toDegrees(e){return e*180/Math.PI},variance(e){const t=this.average(e),r=e.map(n=>Math.pow(n-t,2));return this.average(r)}},ge={isMediaTypeSupported(e){return MediaRecorder.isTypeSupported(e)},getSupportedMediaTypes(){return["video/webm","video/mp4","video/ogg","audio/webm","audio/mp4","audio/ogg"].filter(t=>MediaRecorder.isTypeSupported(t))},async getMediaDevices(){return await navigator.mediaDevices.enumerateDevices()},async getCameras(){return(await navigator.mediaDevices.enumerateDevices()).filter(t=>t.kind==="videoinput")},async getMicrophones(){return(await navigator.mediaDevices.enumerateDevices()).filter(t=>t.kind==="audioinput")},async getSpeakers(){return(await navigator.mediaDevices.enumerateDevices()).filter(t=>t.kind==="audiooutput")},async requestCameraAccess(e={video:!0}){return navigator.mediaDevices.getUserMedia(e)},async requestMicrophoneAccess(e={audio:!0}){return navigator.mediaDevices.getUserMedia(e)},async requestScreenAccess(e={video:!0}){return navigator.mediaDevices.getDisplayMedia(e)},stopMediaStream(e){e.getTracks().forEach(t=>t.stop())},createMediaRecorder(e,t={}){return new MediaRecorder(e,t)},recordMediaStream(e,t={}){return new Promise((r,n)=>{const a=new MediaRecorder(e,t),o=[];a.ondataavailable=s=>{s.data.size>0&&o.push(s.data)},a.onstop=()=>{const s=new Blob(o,{type:t.mimeType});r(s)},a.onerror=s=>{n(s)},a.start()})},async takeScreenshot(e){const t=