{"version":3,"names":["guid","replace","c","r","Math","random","v","toString","setCookie","cname","cvalue","exdays","d","Date","setTime","getTime","expires","toUTCString","document","cookie","randomId","slice","Object","freeze","_BREAKPOINTS_","xs","sm","md","lg","xl","xxl","giant","Infinity","getBreakpoint","cssLength","down","matchMedia","upExclusive","downInclusive","up","breakpoints","getCookie","name","value","parts","split","length","pop","shift","clamp","min","x","max","mod","n","unique","iterable","Set","domRectCenter","rect","left","width","y","top","height","domRectIntersection","a","b","right","bottom","DOMRectReadOnly","domRectIntersectionRatio","container","target","targetArea","intersection","distanceFromPointToPoint","hypot","distanceFromPointToDomRect","point","wait","ms","Promise","resolve","setTimeout","deferredPromise","result","promise","reject","debounce","f","timeout","args","undefined","clearTimeout","throttle","lastArgs","pointerHover","element","options","signal","aborted","enteredPointers","addEventListener","enterEvent","onlyTrueHovers","pointerType","onEachEnter","add","pointerId","onLeave","leaveEvent","onEachLeave","delete","size","onAllLeave","removeEventListener","useNaturalImageDimensions","img","naturalWidth","naturalHeight","imgRefSetDimensions","async","complete","once","getPreferredLocales","override","HTMLElement","lang","htmlLangs","currentElement","closest","locale","Intl","Locale","push","previousElement","parentElement","navigator","languages","toISOStringLocal","date","pad","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds"],"sources":["./src/global/utils.ts"],"sourcesContent":["/**\r\n * @deprecated\r\n */\r\n export function guid(): string {\r\n\treturn 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n\t\tvar r = (Math.random() * 16) | 0,\r\n\t\t\tv = c == 'x' ? r : (r & 0x3) | 0x8;\r\n\t\treturn v.toString(16);\r\n\t});\r\n};\r\n\r\nexport function setCookie(cname, cvalue, exdays) {\r\n const d = new Date();\r\n d.setTime(d.getTime() + (exdays*24*60*60*1000));\r\n const expires = \"expires=\"+d.toUTCString();\r\n document.cookie = cname + \"=\" + cvalue + \";\" + expires + \";path=/\";\r\n}\r\n\r\n/**\r\n * Get a random ID like `0fzzzzr726ed`\r\n */\r\nexport const randomId = () =>\r\n\tMath.random().toString(36).slice(2);\r\n\r\n/**\r\n * Theme Helpers\r\n */\r\nexport const _COLORS_ = Object.freeze({\r\n\t0: 'primary',\r\n\t1: 'secondary',\r\n\t2: 'tertiary',\r\n\t4: 'quarternary',\r\n\t5: 'quinary',\r\n\t6: 'senary',\r\n\t7: 'gray-lite',\r\n\t8: 'gray-dark',\r\n});\r\n\r\n/**\r\n * Window Helpers\r\n */\r\n\r\n/**\r\n * Breakpoints are situatued such that\r\n * comparison would be \"and down\" --\r\n * \r\n * if (window.innerWidth < _BREAKPOINTS_.sm) { ... }\r\n * @deprecated\r\n */\r\nexport const _BREAKPOINTS_ = Object.freeze({\r\n\txs: 576,\r\n\tsm: 767.98,\r\n\tmd: 991.98,\r\n\tlg: 1199.98,\r\n\txl: 1399.98,\r\n\txxl: 1799.98,\r\n\tgiant: Infinity\r\n});\r\n\r\n/**\r\n * ```ts\r\n * const tooSmall = getBreakpoint('500px').downInclusive;\r\n *\r\n * if (tooSmall.matches)\r\n * console.log('@media (max-width: 500px)');\r\n *\r\n * tooSmall.addEventListener('change', ({ matches }) => {\r\n * if (matches) console.log('@media (max-width: 500px)');\r\n * });\r\n * ```\r\n */\r\nexport const getBreakpoint = (cssLength: string) => ({\r\n\tdown: matchMedia(`(max-width:calc(${cssLength} - 0.02px))`),\r\n\tupExclusive: matchMedia(`(min-width:calc(${cssLength} - 0.02px))`),\r\n\tdownInclusive: matchMedia(`(max-width:${cssLength})`),\r\n\tup: matchMedia(`(min-width:${cssLength})`)\r\n}) as const;\r\n\r\n/**\r\n * Enables unified media query listeners, pre-filled with breakpoints.\r\n * ```ts\r\n * if (breakpoints.lg.up.matches)\r\n * console.log('@include media-breakpoint-up(lg)');\r\n *\r\n * breakpoints.lg.down.addEventListener('change', ({ matches }) => {\r\n * if (matches) console.log('@include media-breakpoint-down(lg)');\r\n * });\r\n * ```\r\n */\r\nexport const breakpoints = {\r\n\t/** 576px */\r\n\tsm: getBreakpoint('576px'),\r\n\t/** 768px */\r\n\tmd: getBreakpoint('768px'),\r\n\t/** 992px */\r\n\tlg: getBreakpoint('992px'),\r\n\t/** 1200px */\r\n\txl: getBreakpoint('1200px'),\r\n\t/** 1400px */\r\n\txxl: getBreakpoint('1400px'),\r\n\t/** 1800px */\r\n\tgiant: getBreakpoint('1800px')\r\n} as const;\r\n\r\nexport function getCookie(name: string) {\r\n\tconst value = `; ${document.cookie}`;\r\n\tconst parts = value.split(`; ${name}=`);\r\n\tif (parts.length === 2) return parts.pop()?.split(';').shift();\r\n}\r\n\r\nexport const clamp = (min: number, x: number, max: number) =>\r\n\tMath.max(min, Math.min(x, max));\r\n\r\n/** JS's `%` operator is the remainder operator. This is the real modulo function. */\r\nexport const mod = (n: number, d: number) =>\r\n\t((n % d) + d) % d;\r\n\r\n/** Gives an array of the unique items in an iterable */\r\nexport const unique = (iterable?: Iterable) =>\r\n\t[...new Set(iterable)];\r\n\r\nexport const domRectCenter = (rect: DOMRectReadOnly) => ({\r\n\tx: rect.left + rect.width / 2,\r\n\ty: rect.top + rect.height / 2\r\n});\r\n\r\nexport const domRectIntersection = (a: DOMRectReadOnly, b: DOMRectReadOnly) => {\r\n\tconst left = Math.max(a.left, b.left );\r\n\tconst right = Math.min(a.right, b.right );\r\n\tconst top = Math.max(a.top, b.top );\r\n\tconst bottom = Math.min(a.bottom, b.bottom);\r\n\r\n\tif (left <= right && top <= bottom)\r\n\t\treturn new DOMRectReadOnly(\r\n\t\t\tleft,\r\n\t\t\ttop,\r\n\t\t\tright - left,\r\n\t\t\tbottom - top\r\n\t\t);\r\n};\r\n\r\nexport const domRectIntersectionRatio = (container: DOMRectReadOnly, target: DOMRectReadOnly) => {\r\n\tconst targetArea = target.width * target.height;\r\n\tconst intersection = domRectIntersection(container, target);\r\n\tif (!intersection || targetArea === 0)\r\n\t\treturn 0;\r\n\r\n\treturn (intersection.width * intersection.height) / targetArea;\r\n};\r\n\r\nexport const distanceFromPointToPoint = (a: { x: number, y: number }, b: { x: number, y: number }) =>\r\n\tMath.hypot(\r\n\t\tb.x - a.x,\r\n\t\tb.y - a.y\r\n\t);\r\n\r\nexport const distanceFromPointToDomRect = (point: { x: number, y: number }, rect: DOMRectReadOnly) =>\r\n\tMath.hypot(\r\n\t\tMath.max(\r\n\t\t\trect.left - point.x,\r\n\t\t\t0,\r\n\t\t\tpoint.x - rect.right\r\n\t\t),\r\n\t\tMath.max(\r\n\t\t\trect.top - point.y,\r\n\t\t\t0,\r\n\t\t\tpoint.y - rect.bottom\r\n\t\t)\r\n\t);\r\n\r\nexport const scrollToTop = async (): Promise => {\r\n\twindow.scrollTo({\r\n\t\tbehavior: 'smooth',\r\n\t\ttop: 0\r\n\t});\r\n\r\n\treturn new Promise(resolve => {\r\n\t\tconst isDoneScrolling = () => {\r\n\t\t\tif (window.scrollY === 0) {\r\n\t\t\t\tresolve();\r\n\t\t\t\tremoveEventListener('scroll', isDoneScrolling);\r\n\t\t\t}\r\n\t\t}\r\n\t\taddEventListener('scroll', isDoneScrolling, { passive: true });\r\n\t\t// If the window is already scrolled to the top\r\n\t\tisDoneScrolling();\r\n\t});\r\n};\r\n\r\nexport const wait = (ms: number, value?: T) =>\r\n\tnew Promise(resolve => {\r\n\t\tsetTimeout(() => {\r\n\t\t\tresolve(value);\r\n\t\t}, ms)\r\n\t});\r\n\r\nexport const deferredPromise = () => {\r\n\tconst result: {\r\n\t\tresolve: (x: Resolved) => void,\r\n\t\treject: (x: Rejected) => void,\r\n\t\tpromise: Promise\r\n\t} = {} as any;\r\n\tresult.promise = new Promise((resolve, reject) => {\r\n\t\tresult.resolve = resolve;\r\n\t\tresult.reject = reject;\r\n\t});\r\n\treturn result;\r\n};\r\n\r\nexport const debounce = ) => unknown>(f: F, ms = 100) => {\r\n\tlet timeout: ReturnType | undefined;\r\n\r\n\treturn (...args: Parameters) => {\r\n\t\tif (timeout !== undefined)\r\n\t\t\tclearTimeout(timeout);\r\n\r\n\t\ttimeout =\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\ttimeout = undefined;\r\n\t\t\t\tf(...args);\r\n\t\t\t}, ms);\r\n\t};\r\n};\r\n\r\nexport const throttle = ) => unknown>(f: F, ms = 100) => {\r\n\tlet timeout: ReturnType | undefined;\r\n\tlet lastArgs: Parameters | undefined;\r\n\r\n\treturn (...args: Parameters) => {\r\n\t\tlastArgs = args;\r\n\r\n\t\tif (timeout !== undefined)\r\n\t\t\treturn;\r\n\r\n\t\ttimeout =\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\ttimeout = undefined;\r\n\t\t\t\tf(...lastArgs!);\r\n\t\t\t}, ms);\r\n\t};\r\n};\r\n\r\nexport const getUrlParams = () =>\r\n\tObject.fromEntries(new URL(location.href).searchParams) as Partial>;\r\n\r\n/** Media query for when the main input method can conveniently hover */\r\nexport const hoverQuery = matchMedia('(hover: hover)');\r\n\r\nexport const pointerHover = (\r\n\telement: Element,\r\n\toptions: {\r\n\t\t/** Only run for pointers that are truly hovering, not e.g. touching a screen. */\r\n\t\tonlyTrueHovers?: boolean,\r\n\t\t/** Runs each time a pointer `:hover`s. Return `false` to not attach any other listeners. */\r\n\t\tonEachEnter?(enterEvent: PointerEvent): void | false,\r\n\t\t/** Runs each time a pointer stops `:hover`ing. */\r\n\t\tonEachLeave?(leaveEvent: PointerEvent, enterEvent: PointerEvent): void,\r\n\t\t/** Runs when all pointers stop `:hover`ing or the signal is aborted. */\r\n\t\tonAllLeave?(): void,\r\n\t\t/** Abort all listeners */\r\n\t\tsignal?: AbortSignal\r\n\t}\r\n) => {\r\n\tif (options.signal?.aborted)\r\n\t\treturn;\r\n\r\n\tconst enteredPointers = new Set();\r\n\telement.addEventListener('pointerenter', (enterEvent: PointerEvent) => {\r\n\t\tif (options.onlyTrueHovers && enterEvent.pointerType === 'touch')\r\n\t\t\treturn;\r\n\r\n\t\tif (options.onEachEnter?.(enterEvent) === false)\r\n\t\t\treturn;\r\n\r\n\t\tenteredPointers.add(enterEvent.pointerId);\r\n\t\tconst onLeave = (leaveEvent: PointerEvent) => {\r\n\t\t\tif (enterEvent.pointerId !== leaveEvent.pointerId)\r\n\t\t\t\treturn;\r\n\r\n\t\t\toptions.onEachLeave?.(leaveEvent, enterEvent);\r\n\t\t\tenteredPointers.delete(leaveEvent.pointerId);\r\n\t\t\tif (!enteredPointers.size)\r\n\t\t\t\toptions.onAllLeave?.();\r\n\r\n\t\t\telement.removeEventListener('pointerleave', onLeave);\r\n\t\t};\r\n\t\telement.addEventListener('pointerleave', onLeave, { signal: options.signal });\r\n\t}, { signal: options.signal });\r\n\r\n\toptions.signal?.addEventListener('abort', () => {\r\n\t\toptions.onAllLeave?.();\r\n\t});\r\n};\r\n\r\n/** Returns the first (in order) non-error response */\r\nexport const getFirstSuccessfulResponse = async (requests: ReadonlyArray): Promise => {\r\n\tfor (const request of requests) {\r\n\t\ttry {\r\n\t\t\tconst res = await fetch(request);\r\n\t\t\tif (res.ok)\r\n\t\t\t\treturn res;\r\n\t\t}\r\n\t\tcatch {}\r\n\t}\r\n};\r\n\r\nexport const useNaturalImageDimensions = (img: HTMLImageElement) =>\r\n\t[img.width, img.height] = [img.naturalWidth, img.naturalHeight];\r\n\r\nexport const useNaturalVideoDimensions = (video: HTMLVideoElement) =>\r\n\t[video.width, video.height] = [video.videoWidth, video.videoHeight];\r\n\r\nexport const useNaturalDimensions = (e: HTMLImageElement | HTMLVideoElement) => {\r\n\tif (e instanceof HTMLImageElement)\r\n\t\tuseNaturalImageDimensions(e);\r\n\tif (e instanceof HTMLVideoElement)\r\n\t\tuseNaturalVideoDimensions(e);\r\n};\r\n\r\nexport const imgRefSetDimensions = async (img?: HTMLImageElement): Promise<[number, number] | undefined> => {\r\n\tif (!img)\r\n\t\treturn;\r\n\r\n\tif (img.complete)\r\n\t\treturn useNaturalImageDimensions(img);\r\n\r\n\treturn new Promise(resolve => {\r\n\t\timg.addEventListener('load', () => {\r\n\t\t\tresolve(useNaturalImageDimensions(img));\r\n\t\t}, { once: true });\r\n\t});\r\n};\r\n\r\nexport const getPreferredLocales = (element?: Element) => {\r\n\tlet override =\r\n\t\telement instanceof HTMLElement && element.lang\r\n\t\t\t? [element.lang]\r\n\t\t\t: [];\r\n\r\n\tconst htmlLangs: Array = [];\r\n\tlet currentElement = element?.closest('[lang]');\r\n\twhile (true) {\r\n\t\tif (!(currentElement instanceof HTMLElement))\r\n\t\t\tbreak;\r\n\r\n\t\ttry {\r\n\t\t\tconst locale = new Intl.Locale(currentElement.lang);\r\n\t\t\thtmlLangs.push(locale.toString());\r\n\t\t}\r\n\t\tcatch {\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tconst previousElement = currentElement;\r\n\t\tcurrentElement = previousElement.parentElement?.closest('[lang]');\r\n\t\tif (currentElement == previousElement)\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\treturn unique([\r\n\t\t...override,\r\n\t\t...navigator.languages,\r\n\t\t...htmlLangs\r\n\t]);\r\n};\r\n\r\nexport const toISOStringLocal = (date) => {\r\n\tconst pad = (n) => (n < 10 ? \"0\" + n : n);\r\n\r\n\treturn (\r\n\t\tdate.getFullYear() +\r\n\t\t\"-\" +\r\n\t\tpad(date.getMonth() + 1) +\r\n\t\t\"-\" +\r\n\t\tpad(date.getDate()) +\r\n\t\t\"T\" +\r\n\t\tpad(date.getHours()) +\r\n\t\t\":\" +\r\n\t\tpad(date.getMinutes()) +\r\n\t\t\":\" +\r\n\t\tpad(date.getSeconds())\r\n\t);\r\n};\r\n"],"mappings":"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"}