var VueDemi = (function (VueDemi, Vue, VueCompositionAPI) { if (VueDemi.install) { return VueDemi } if (!Vue) { console.error('[vue-demi] no Vue instance found, please be sure to import `vue` before `vue-demi`.') return VueDemi } // Vue 2.7 if (Vue.version.slice(0, 4) === '2.7.') { for (var key in Vue) { VueDemi[key] = Vue[key] } VueDemi.isVue2 = true VueDemi.isVue3 = false VueDemi.install = function () {} VueDemi.Vue = Vue VueDemi.Vue2 = Vue VueDemi.version = Vue.version VueDemi.warn = Vue.util.warn function createApp(rootComponent, rootProps) { var vm var provide = {} var app = { config: Vue.config, use: Vue.use.bind(Vue), mixin: Vue.mixin.bind(Vue), component: Vue.component.bind(Vue), provide: function (key, value) { provide[key] = value return this }, directive: function (name, dir) { if (dir) { Vue.directive(name, dir) return app } else { return Vue.directive(name) } }, mount: function (el, hydrating) { if (!vm) { vm = new Vue(Object.assign({ propsData: rootProps }, rootComponent, { provide: Object.assign(provide, rootComponent.provide) })) vm.$mount(el, hydrating) return vm } else { return vm } }, unmount: function () { if (vm) { vm.$destroy() vm = undefined } }, } return app } VueDemi.createApp = createApp } // Vue 2.6.x else if (Vue.version.slice(0, 2) === '2.') { if (VueCompositionAPI) { for (var key in VueCompositionAPI) { VueDemi[key] = VueCompositionAPI[key] } VueDemi.isVue2 = true VueDemi.isVue3 = false VueDemi.install = function () {} VueDemi.Vue = Vue VueDemi.Vue2 = Vue VueDemi.version = Vue.version } else { console.error('[vue-demi] no VueCompositionAPI instance found, please be sure to import `@vue/composition-api` before `vue-demi`.') } } // Vue 3 else if (Vue.version.slice(0, 2) === '3.') { for (var key in Vue) { VueDemi[key] = Vue[key] } VueDemi.isVue2 = false VueDemi.isVue3 = true VueDemi.install = function () {} VueDemi.Vue = Vue VueDemi.Vue2 = undefined VueDemi.version = Vue.version VueDemi.set = function (target, key, val) { if (Array.isArray(target)) { target.length = Math.max(target.length, key) target.splice(key, 1, val) return val } target[key] = val return val } VueDemi.del = function (target, key) { if (Array.isArray(target)) { target.splice(key, 1) return } delete target[key] } } else { console.error('[vue-demi] Vue version ' + Vue.version + ' is unsupported.') } return VueDemi })( (this.VueDemi = this.VueDemi || (typeof VueDemi !== 'undefined' ? VueDemi : {})), this.Vue || (typeof Vue !== 'undefined' ? Vue : undefined), this.VueCompositionAPI || (typeof VueCompositionAPI !== 'undefined' ? VueCompositionAPI : undefined) ); ; ;(function (exports, shared, vueDemi) { 'use strict'; function computedAsync(evaluationCallback, initialState, optionsOrRef) { let options; if (vueDemi.isRef(optionsOrRef)) { options = { evaluating: optionsOrRef }; } else { options = optionsOrRef || {}; } const { lazy = false, evaluating = void 0, shallow = false, onError = shared.noop } = options; const started = vueDemi.ref(!lazy); const current = shallow ? vueDemi.shallowRef(initialState) : vueDemi.ref(initialState); let counter = 0; vueDemi.watchEffect(async (onInvalidate) => { if (!started.value) return; counter++; const counterAtBeginning = counter; let hasFinished = false; if (evaluating) { Promise.resolve().then(() => { evaluating.value = true; }); } try { const result = await evaluationCallback((cancelCallback) => { onInvalidate(() => { if (evaluating) evaluating.value = false; if (!hasFinished) cancelCallback(); }); }); if (counterAtBeginning === counter) current.value = result; } catch (e) { onError(e); } finally { if (evaluating && counterAtBeginning === counter) evaluating.value = false; hasFinished = true; } }); if (lazy) { return vueDemi.computed(() => { started.value = true; return current.value; }); } else { return current; } } function computedInject(key, options, defaultSource, treatDefaultAsFactory) { let source = vueDemi.inject(key); if (defaultSource) source = vueDemi.inject(key, defaultSource); if (treatDefaultAsFactory) source = vueDemi.inject(key, defaultSource, treatDefaultAsFactory); if (typeof options === "function") { return vueDemi.computed((ctx) => options(source, ctx)); } else { return vueDemi.computed({ get: (ctx) => options.get(source, ctx), set: options.set }); } } const createUnrefFn = (fn) => { return function(...args) { return fn.apply(this, args.map((i) => vueDemi.unref(i))); }; }; function unrefElement(elRef) { var _a; const plain = shared.resolveUnref(elRef); return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain; } const defaultWindow = shared.isClient ? window : void 0; const defaultDocument = shared.isClient ? window.document : void 0; const defaultNavigator = shared.isClient ? window.navigator : void 0; const defaultLocation = shared.isClient ? window.location : void 0; function useEventListener(...args) { let target; let events; let listeners; let options; if (shared.isString(args[0]) || Array.isArray(args[0])) { [events, listeners, options] = args; target = defaultWindow; } else { [target, events, listeners, options] = args; } if (!target) return shared.noop; if (!Array.isArray(events)) events = [events]; if (!Array.isArray(listeners)) listeners = [listeners]; const cleanups = []; const cleanup = () => { cleanups.forEach((fn) => fn()); cleanups.length = 0; }; const register = (el, event, listener, options2) => { el.addEventListener(event, listener, options2); return () => el.removeEventListener(event, listener, options2); }; const stopWatch = vueDemi.watch(() => [unrefElement(target), shared.resolveUnref(options)], ([el, options2]) => { cleanup(); if (!el) return; cleanups.push(...events.flatMap((event) => { return listeners.map((listener) => register(el, event, listener, options2)); })); }, { immediate: true, flush: "post" }); const stop = () => { stopWatch(); cleanup(); }; shared.tryOnScopeDispose(stop); return stop; } let _iOSWorkaround = false; function onClickOutside(target, handler, options = {}) { const { window = defaultWindow, ignore = [], capture = true, detectIframe = false } = options; if (!window) return; if (shared.isIOS && !_iOSWorkaround) { _iOSWorkaround = true; Array.from(window.document.body.children).forEach((el) => el.addEventListener("click", shared.noop)); } let shouldListen = true; const shouldIgnore = (event) => { return ignore.some((target2) => { if (typeof target2 === "string") { return Array.from(window.document.querySelectorAll(target2)).some((el) => el === event.target || event.composedPath().includes(el)); } else { const el = unrefElement(target2); return el && (event.target === el || event.composedPath().includes(el)); } }); }; const listener = (event) => { const el = unrefElement(target); if (!el || el === event.target || event.composedPath().includes(el)) return; if (event.detail === 0) shouldListen = !shouldIgnore(event); if (!shouldListen) { shouldListen = true; return; } handler(event); }; const cleanup = [ useEventListener(window, "click", listener, { passive: true, capture }), useEventListener(window, "pointerdown", (e) => { const el = unrefElement(target); if (el) shouldListen = !e.composedPath().includes(el) && !shouldIgnore(e); }, { passive: true }), detectIframe && useEventListener(window, "blur", (event) => { var _a; const el = unrefElement(target); if (((_a = window.document.activeElement) == null ? void 0 : _a.tagName) === "IFRAME" && !(el == null ? void 0 : el.contains(window.document.activeElement))) handler(event); }) ].filter(Boolean); const stop = () => cleanup.forEach((fn) => fn()); return stop; } var __defProp$n = Object.defineProperty; var __defProps$9 = Object.defineProperties; var __getOwnPropDescs$9 = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols$p = Object.getOwnPropertySymbols; var __hasOwnProp$p = Object.prototype.hasOwnProperty; var __propIsEnum$p = Object.prototype.propertyIsEnumerable; var __defNormalProp$n = (obj, key, value) => key in obj ? __defProp$n(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$n = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$p.call(b, prop)) __defNormalProp$n(a, prop, b[prop]); if (__getOwnPropSymbols$p) for (var prop of __getOwnPropSymbols$p(b)) { if (__propIsEnum$p.call(b, prop)) __defNormalProp$n(a, prop, b[prop]); } return a; }; var __spreadProps$9 = (a, b) => __defProps$9(a, __getOwnPropDescs$9(b)); const createKeyPredicate = (keyFilter) => { if (typeof keyFilter === "function") return keyFilter; else if (typeof keyFilter === "string") return (event) => event.key === keyFilter; else if (Array.isArray(keyFilter)) return (event) => keyFilter.includes(event.key); return () => true; }; function onKeyStroke(...args) { let key; let handler; let options = {}; if (args.length === 3) { key = args[0]; handler = args[1]; options = args[2]; } else if (args.length === 2) { if (typeof args[1] === "object") { key = true; handler = args[0]; options = args[1]; } else { key = args[0]; handler = args[1]; } } else { key = true; handler = args[0]; } const { target = defaultWindow, eventName = "keydown", passive = false } = options; const predicate = createKeyPredicate(key); const listener = (e) => { if (predicate(e)) handler(e); }; return useEventListener(target, eventName, listener, passive); } function onKeyDown(key, handler, options = {}) { return onKeyStroke(key, handler, __spreadProps$9(__spreadValues$n({}, options), { eventName: "keydown" })); } function onKeyPressed(key, handler, options = {}) { return onKeyStroke(key, handler, __spreadProps$9(__spreadValues$n({}, options), { eventName: "keypress" })); } function onKeyUp(key, handler, options = {}) { return onKeyStroke(key, handler, __spreadProps$9(__spreadValues$n({}, options), { eventName: "keyup" })); } const DEFAULT_DELAY = 500; function onLongPress(target, handler, options) { var _a, _b; const elementRef = vueDemi.computed(() => unrefElement(target)); let timeout; function clear() { if (timeout) { clearTimeout(timeout); timeout = void 0; } } function onDown(ev) { var _a2, _b2, _c, _d; if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value) return; clear(); if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent) ev.preventDefault(); if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop) ev.stopPropagation(); timeout = setTimeout(() => handler(ev), (_d = options == null ? void 0 : options.delay) != null ? _d : DEFAULT_DELAY); } const listenerOptions = { capture: (_a = options == null ? void 0 : options.modifiers) == null ? void 0 : _a.capture, once: (_b = options == null ? void 0 : options.modifiers) == null ? void 0 : _b.once }; useEventListener(elementRef, "pointerdown", onDown, listenerOptions); useEventListener(elementRef, "pointerup", clear, listenerOptions); useEventListener(elementRef, "pointerleave", clear, listenerOptions); } const isFocusedElementEditable = () => { const { activeElement, body } = document; if (!activeElement) return false; if (activeElement === body) return false; switch (activeElement.tagName) { case "INPUT": case "TEXTAREA": return true; } return activeElement.hasAttribute("contenteditable"); }; const isTypedCharValid = ({ keyCode, metaKey, ctrlKey, altKey }) => { if (metaKey || ctrlKey || altKey) return false; if (keyCode >= 48 && keyCode <= 57 || keyCode >= 96 && keyCode <= 105) return true; if (keyCode >= 65 && keyCode <= 90) return true; return false; }; function onStartTyping(callback, options = {}) { const { document: document2 = defaultDocument } = options; const keydown = (event) => { !isFocusedElementEditable() && isTypedCharValid(event) && callback(event); }; if (document2) useEventListener(document2, "keydown", keydown, { passive: true }); } function templateRef(key, initialValue = null) { const instance = vueDemi.getCurrentInstance(); let _trigger = () => { }; const element = vueDemi.customRef((track, trigger) => { _trigger = trigger; return { get() { var _a, _b; track(); return (_b = (_a = instance == null ? void 0 : instance.proxy) == null ? void 0 : _a.$refs[key]) != null ? _b : initialValue; }, set() { } }; }); shared.tryOnMounted(_trigger); vueDemi.onUpdated(_trigger); return element; } function useActiveElement(options = {}) { var _a; const { window = defaultWindow } = options; const document = (_a = options.document) != null ? _a : window == null ? void 0 : window.document; const activeElement = shared.computedWithControl(() => null, () => document == null ? void 0 : document.activeElement); if (window) { useEventListener(window, "blur", (event) => { if (event.relatedTarget !== null) return; activeElement.trigger(); }, true); useEventListener(window, "focus", activeElement.trigger, true); } return activeElement; } function useAsyncQueue(tasks, options = {}) { const { interrupt = true, onError = shared.noop, onFinished = shared.noop } = options; const promiseState = { pending: "pending", rejected: "rejected", fulfilled: "fulfilled" }; const initialResult = Array.from(new Array(tasks.length), () => ({ state: promiseState.pending, data: null })); const result = vueDemi.reactive(initialResult); const activeIndex = vueDemi.ref(-1); if (!tasks || tasks.length === 0) { onFinished(); return { activeIndex, result }; } function updateResult(state, res) { activeIndex.value++; result[activeIndex.value].data = res; result[activeIndex.value].state = state; } tasks.reduce((prev, curr) => { return prev.then((prevRes) => { var _a; if (((_a = result[activeIndex.value]) == null ? void 0 : _a.state) === promiseState.rejected && interrupt) { onFinished(); return; } return curr(prevRes).then((currentRes) => { updateResult(promiseState.fulfilled, currentRes); activeIndex.value === tasks.length - 1 && onFinished(); return currentRes; }); }).catch((e) => { updateResult(promiseState.rejected, e); onError(); return e; }); }, Promise.resolve()); return { activeIndex, result }; } function useAsyncState(promise, initialState, options) { const { immediate = true, delay = 0, onError = shared.noop, onSuccess = shared.noop, resetOnExecute = true, shallow = true, throwError } = options != null ? options : {}; const state = shallow ? vueDemi.shallowRef(initialState) : vueDemi.ref(initialState); const isReady = vueDemi.ref(false); const isLoading = vueDemi.ref(false); const error = vueDemi.ref(void 0); async function execute(delay2 = 0, ...args) { if (resetOnExecute) state.value = initialState; error.value = void 0; isReady.value = false; isLoading.value = true; if (delay2 > 0) await shared.promiseTimeout(delay2); const _promise = typeof promise === "function" ? promise(...args) : promise; try { const data = await _promise; state.value = data; isReady.value = true; onSuccess(data); } catch (e) { error.value = e; onError(e); if (throwError) throw error; } finally { isLoading.value = false; } return state.value; } if (immediate) execute(delay); return { state, isReady, isLoading, error, execute }; } const defaults = { array: (v) => JSON.stringify(v), object: (v) => JSON.stringify(v), set: (v) => JSON.stringify(Array.from(v)), map: (v) => JSON.stringify(Object.fromEntries(v)), null: () => "" }; function getDefaultSerialization(target) { if (!target) return defaults.null; if (target instanceof Map) return defaults.map; else if (target instanceof Set) return defaults.set; else if (Array.isArray(target)) return defaults.array; else return defaults.object; } function useBase64(target, options) { const base64 = vueDemi.ref(""); const promise = vueDemi.ref(); function execute() { if (!shared.isClient) return; promise.value = new Promise((resolve, reject) => { try { const _target = shared.resolveUnref(target); if (_target == null) { resolve(""); } else if (typeof _target === "string") { resolve(blobToBase64(new Blob([_target], { type: "text/plain" }))); } else if (_target instanceof Blob) { resolve(blobToBase64(_target)); } else if (_target instanceof ArrayBuffer) { resolve(window.btoa(String.fromCharCode(...new Uint8Array(_target)))); } else if (_target instanceof HTMLCanvasElement) { resolve(_target.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality)); } else if (_target instanceof HTMLImageElement) { const img = _target.cloneNode(false); img.crossOrigin = "Anonymous"; imgLoaded(img).then(() => { const canvas = document.createElement("canvas"); const ctx = canvas.getContext("2d"); canvas.width = img.width; canvas.height = img.height; ctx.drawImage(img, 0, 0, canvas.width, canvas.height); resolve(canvas.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality)); }).catch(reject); } else if (typeof _target === "object") { const _serializeFn = (options == null ? void 0 : options.serializer) || getDefaultSerialization(_target); const serialized = _serializeFn(_target); return resolve(blobToBase64(new Blob([serialized], { type: "application/json" }))); } else { reject(new Error("target is unsupported types")); } } catch (error) { reject(error); } }); promise.value.then((res) => base64.value = res); return promise.value; } if (vueDemi.isRef(target) || shared.isFunction(target)) vueDemi.watch(target, execute, { immediate: true }); else execute(); return { base64, promise, execute }; } function imgLoaded(img) { return new Promise((resolve, reject) => { if (!img.complete) { img.onload = () => { resolve(); }; img.onerror = reject; } else { resolve(); } }); } function blobToBase64(blob) { return new Promise((resolve, reject) => { const fr = new FileReader(); fr.onload = (e) => { resolve(e.target.result); }; fr.onerror = reject; fr.readAsDataURL(blob); }); } function useSupported(callback, sync = false) { const isSupported = vueDemi.ref(); const update = () => isSupported.value = Boolean(callback()); update(); shared.tryOnMounted(update, sync); return isSupported; } function useBattery({ navigator = defaultNavigator } = {}) { const events = ["chargingchange", "chargingtimechange", "dischargingtimechange", "levelchange"]; const isSupported = useSupported(() => navigator && "getBattery" in navigator); const charging = vueDemi.ref(false); const chargingTime = vueDemi.ref(0); const dischargingTime = vueDemi.ref(0); const level = vueDemi.ref(1); let battery; function updateBatteryInfo() { charging.value = this.charging; chargingTime.value = this.chargingTime || 0; dischargingTime.value = this.dischargingTime || 0; level.value = this.level; } if (isSupported.value) { navigator.getBattery().then((_battery) => { battery = _battery; updateBatteryInfo.call(battery); for (const event of events) useEventListener(battery, event, updateBatteryInfo, { passive: true }); }); } return { isSupported, charging, chargingTime, dischargingTime, level }; } function useBluetooth(options) { let { acceptAllDevices = false } = options || {}; const { filters = void 0, optionalServices = void 0, navigator = defaultNavigator } = options || {}; const isSupported = useSupported(() => navigator && "bluetooth" in navigator); const device = vueDemi.shallowRef(void 0); const error = vueDemi.shallowRef(null); vueDemi.watch(device, () => { connectToBluetoothGATTServer(); }); async function requestDevice() { if (!isSupported.value) return; error.value = null; if (filters && filters.length > 0) acceptAllDevices = false; try { device.value = await (navigator == null ? void 0 : navigator.bluetooth.requestDevice({ acceptAllDevices, filters, optionalServices })); } catch (err) { error.value = err; } } const server = vueDemi.ref(); const isConnected = vueDemi.computed(() => { var _a; return ((_a = server.value) == null ? void 0 : _a.connected) || false; }); async function connectToBluetoothGATTServer() { error.value = null; if (device.value && device.value.gatt) { device.value.addEventListener("gattserverdisconnected", () => { }); try { server.value = await device.value.gatt.connect(); } catch (err) { error.value = err; } } } shared.tryOnMounted(() => { var _a; if (device.value) (_a = device.value.gatt) == null ? void 0 : _a.connect(); }); shared.tryOnScopeDispose(() => { var _a; if (device.value) (_a = device.value.gatt) == null ? void 0 : _a.disconnect(); }); return { isSupported, isConnected, device, requestDevice, server, error }; } function useMediaQuery(query, options = {}) { const { window = defaultWindow } = options; const isSupported = useSupported(() => window && "matchMedia" in window && typeof window.matchMedia === "function"); let mediaQuery; const matches = vueDemi.ref(false); const cleanup = () => { if (!mediaQuery) return; if ("removeEventListener" in mediaQuery) mediaQuery.removeEventListener("change", update); else mediaQuery.removeListener(update); }; const update = () => { if (!isSupported.value) return; cleanup(); mediaQuery = window.matchMedia(shared.resolveRef(query).value); matches.value = mediaQuery.matches; if ("addEventListener" in mediaQuery) mediaQuery.addEventListener("change", update); else mediaQuery.addListener(update); }; vueDemi.watchEffect(update); shared.tryOnScopeDispose(() => cleanup()); return matches; } const breakpointsTailwind = { "sm": 640, "md": 768, "lg": 1024, "xl": 1280, "2xl": 1536 }; const breakpointsBootstrapV5 = { sm: 576, md: 768, lg: 992, xl: 1200, xxl: 1400 }; const breakpointsVuetify = { xs: 600, sm: 960, md: 1264, lg: 1904 }; const breakpointsAntDesign = { xs: 480, sm: 576, md: 768, lg: 992, xl: 1200, xxl: 1600 }; const breakpointsQuasar = { xs: 600, sm: 1024, md: 1440, lg: 1920 }; const breakpointsSematic = { mobileS: 320, mobileM: 375, mobileL: 425, tablet: 768, laptop: 1024, laptopL: 1440, desktop4K: 2560 }; const breakpointsMasterCss = { "3xs": 360, "2xs": 480, "xs": 600, "sm": 768, "md": 1024, "lg": 1280, "xl": 1440, "2xl": 1600, "3xl": 1920, "4xl": 2560 }; var __defProp$m = Object.defineProperty; var __getOwnPropSymbols$o = Object.getOwnPropertySymbols; var __hasOwnProp$o = Object.prototype.hasOwnProperty; var __propIsEnum$o = Object.prototype.propertyIsEnumerable; var __defNormalProp$m = (obj, key, value) => key in obj ? __defProp$m(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$m = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$o.call(b, prop)) __defNormalProp$m(a, prop, b[prop]); if (__getOwnPropSymbols$o) for (var prop of __getOwnPropSymbols$o(b)) { if (__propIsEnum$o.call(b, prop)) __defNormalProp$m(a, prop, b[prop]); } return a; }; function useBreakpoints(breakpoints, options = {}) { function getValue(k, delta) { let v = breakpoints[k]; if (delta != null) v = shared.increaseWithUnit(v, delta); if (typeof v === "number") v = `${v}px`; return v; } const { window = defaultWindow } = options; function match(query) { if (!window) return false; return window.matchMedia(query).matches; } const greaterOrEqual = (k) => { return useMediaQuery(`(min-width: ${getValue(k)})`, options); }; const shortcutMethods = Object.keys(breakpoints).reduce((shortcuts, k) => { Object.defineProperty(shortcuts, k, { get: () => greaterOrEqual(k), enumerable: true, configurable: true }); return shortcuts; }, {}); return __spreadValues$m({ greater(k) { return useMediaQuery(`(min-width: ${getValue(k, 0.1)})`, options); }, greaterOrEqual, smaller(k) { return useMediaQuery(`(max-width: ${getValue(k, -0.1)})`, options); }, smallerOrEqual(k) { return useMediaQuery(`(max-width: ${getValue(k)})`, options); }, between(a, b) { return useMediaQuery(`(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -0.1)})`, options); }, isGreater(k) { return match(`(min-width: ${getValue(k, 0.1)})`); }, isGreaterOrEqual(k) { return match(`(min-width: ${getValue(k)})`); }, isSmaller(k) { return match(`(max-width: ${getValue(k, -0.1)})`); }, isSmallerOrEqual(k) { return match(`(max-width: ${getValue(k)})`); }, isInBetween(a, b) { return match(`(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -0.1)})`); } }, shortcutMethods); } const useBroadcastChannel = (options) => { const { name, window = defaultWindow } = options; const isSupported = useSupported(() => window && "BroadcastChannel" in window); const isClosed = vueDemi.ref(false); const channel = vueDemi.ref(); const data = vueDemi.ref(); const error = vueDemi.ref(null); const post = (data2) => { if (channel.value) channel.value.postMessage(data2); }; const close = () => { if (channel.value) channel.value.close(); isClosed.value = true; }; if (isSupported.value) { shared.tryOnMounted(() => { error.value = null; channel.value = new BroadcastChannel(name); channel.value.addEventListener("message", (e) => { data.value = e.data; }, { passive: true }); channel.value.addEventListener("messageerror", (e) => { error.value = e; }, { passive: true }); channel.value.addEventListener("close", () => { isClosed.value = true; }); }); } shared.tryOnScopeDispose(() => { close(); }); return { isSupported, channel, data, post, close, error, isClosed }; }; function useBrowserLocation({ window = defaultWindow } = {}) { const buildState = (trigger) => { const { state: state2, length } = (window == null ? void 0 : window.history) || {}; const { hash, host, hostname, href, origin, pathname, port, protocol, search } = (window == null ? void 0 : window.location) || {}; return { trigger, state: state2, length, hash, host, hostname, href, origin, pathname, port, protocol, search }; }; const state = vueDemi.ref(buildState("load")); if (window) { useEventListener(window, "popstate", () => state.value = buildState("popstate"), { passive: true }); useEventListener(window, "hashchange", () => state.value = buildState("hashchange"), { passive: true }); } return state; } function useCached(refValue, comparator = (a, b) => a === b, watchOptions) { const cachedValue = vueDemi.ref(refValue.value); vueDemi.watch(() => refValue.value, (value) => { if (!comparator(value, cachedValue.value)) cachedValue.value = value; }, watchOptions); return cachedValue; } function useClipboard(options = {}) { const { navigator = defaultNavigator, read = false, source, copiedDuring = 1500, legacy = false } = options; const events = ["copy", "cut"]; const isClipboardApiSupported = useSupported(() => navigator && "clipboard" in navigator); const isSupported = vueDemi.computed(() => isClipboardApiSupported.value || legacy); const text = vueDemi.ref(""); const copied = vueDemi.ref(false); const timeout = shared.useTimeoutFn(() => copied.value = false, copiedDuring); function updateText() { if (isClipboardApiSupported.value) { navigator.clipboard.readText().then((value) => { text.value = value; }); } else { text.value = legacyRead(); } } if (isSupported.value && read) { for (const event of events) useEventListener(event, updateText); } async function copy(value = shared.resolveUnref(source)) { if (isSupported.value && value != null) { if (isClipboardApiSupported.value) await navigator.clipboard.writeText(value); else legacyCopy(value); text.value = value; copied.value = true; timeout.start(); } } function legacyCopy(value) { const ta = document.createElement("textarea"); ta.value = value != null ? value : ""; ta.style.position = "absolute"; ta.style.opacity = "0"; document.body.appendChild(ta); ta.select(); document.execCommand("copy"); ta.remove(); } function legacyRead() { var _a, _b, _c; return (_c = (_b = (_a = document == null ? void 0 : document.getSelection) == null ? void 0 : _a.call(document)) == null ? void 0 : _b.toString()) != null ? _c : ""; } return { isSupported, text, copied, copy }; } var __defProp$l = Object.defineProperty; var __defProps$8 = Object.defineProperties; var __getOwnPropDescs$8 = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols$n = Object.getOwnPropertySymbols; var __hasOwnProp$n = Object.prototype.hasOwnProperty; var __propIsEnum$n = Object.prototype.propertyIsEnumerable; var __defNormalProp$l = (obj, key, value) => key in obj ? __defProp$l(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$l = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$n.call(b, prop)) __defNormalProp$l(a, prop, b[prop]); if (__getOwnPropSymbols$n) for (var prop of __getOwnPropSymbols$n(b)) { if (__propIsEnum$n.call(b, prop)) __defNormalProp$l(a, prop, b[prop]); } return a; }; var __spreadProps$8 = (a, b) => __defProps$8(a, __getOwnPropDescs$8(b)); function cloneFnJSON(source) { return JSON.parse(JSON.stringify(source)); } function useCloned(source, options = {}) { const cloned = vueDemi.ref({}); const { manual, clone = cloneFnJSON, deep = true, immediate = true } = options; function sync() { cloned.value = clone(vueDemi.unref(source)); } if (!manual && vueDemi.isRef(source)) { vueDemi.watch(source, sync, __spreadProps$8(__spreadValues$l({}, options), { deep, immediate })); } else { sync(); } return { cloned, sync }; } const _global = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {}; const globalKey = "__vueuse_ssr_handlers__"; _global[globalKey] = _global[globalKey] || {}; const handlers = _global[globalKey]; function getSSRHandler(key, fallback) { return handlers[key] || fallback; } function setSSRHandler(key, fn) { handlers[key] = fn; } function guessSerializerType(rawInit) { return rawInit == null ? "any" : rawInit instanceof Set ? "set" : rawInit instanceof Map ? "map" : rawInit instanceof Date ? "date" : typeof rawInit === "boolean" ? "boolean" : typeof rawInit === "string" ? "string" : typeof rawInit === "object" ? "object" : !Number.isNaN(rawInit) ? "number" : "any"; } var __defProp$k = Object.defineProperty; var __getOwnPropSymbols$m = Object.getOwnPropertySymbols; var __hasOwnProp$m = Object.prototype.hasOwnProperty; var __propIsEnum$m = Object.prototype.propertyIsEnumerable; var __defNormalProp$k = (obj, key, value) => key in obj ? __defProp$k(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$k = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$m.call(b, prop)) __defNormalProp$k(a, prop, b[prop]); if (__getOwnPropSymbols$m) for (var prop of __getOwnPropSymbols$m(b)) { if (__propIsEnum$m.call(b, prop)) __defNormalProp$k(a, prop, b[prop]); } return a; }; const StorageSerializers = { boolean: { read: (v) => v === "true", write: (v) => String(v) }, object: { read: (v) => JSON.parse(v), write: (v) => JSON.stringify(v) }, number: { read: (v) => Number.parseFloat(v), write: (v) => String(v) }, any: { read: (v) => v, write: (v) => String(v) }, string: { read: (v) => v, write: (v) => String(v) }, map: { read: (v) => new Map(JSON.parse(v)), write: (v) => JSON.stringify(Array.from(v.entries())) }, set: { read: (v) => new Set(JSON.parse(v)), write: (v) => JSON.stringify(Array.from(v)) }, date: { read: (v) => new Date(v), write: (v) => v.toISOString() } }; const customStorageEventName = "vueuse-storage"; function useStorage(key, defaults, storage, options = {}) { var _a; const { flush = "pre", deep = true, listenToStorageChanges = true, writeDefaults = true, mergeDefaults = false, shallow, window = defaultWindow, eventFilter, onError = (e) => { console.error(e); } } = options; const data = (shallow ? vueDemi.shallowRef : vueDemi.ref)(defaults); if (!storage) { try { storage = getSSRHandler("getDefaultStorage", () => { var _a2; return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage; })(); } catch (e) { onError(e); } } if (!storage) return data; const rawInit = shared.resolveUnref(defaults); const type = guessSerializerType(rawInit); const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type]; const { pause: pauseWatch, resume: resumeWatch } = shared.pausableWatch(data, () => write(data.value), { flush, deep, eventFilter }); if (window && listenToStorageChanges) { useEventListener(window, "storage", update); useEventListener(window, customStorageEventName, updateFromCustomEvent); } update(); return data; function write(v) { try { if (v == null) { storage.removeItem(key); } else { const serialized = serializer.write(v); const oldValue = storage.getItem(key); if (oldValue !== serialized) { storage.setItem(key, serialized); if (window) { window.dispatchEvent(new CustomEvent(customStorageEventName, { detail: { key, oldValue, newValue: serialized, storageArea: storage } })); } } } } catch (e) { onError(e); } } function read(event) { const rawValue = event ? event.newValue : storage.getItem(key); if (rawValue == null) { if (writeDefaults && rawInit !== null) storage.setItem(key, serializer.write(rawInit)); return rawInit; } else if (!event && mergeDefaults) { const value = serializer.read(rawValue); if (shared.isFunction(mergeDefaults)) return mergeDefaults(value, rawInit); else if (type === "object" && !Array.isArray(value)) return __spreadValues$k(__spreadValues$k({}, rawInit), value); return value; } else if (typeof rawValue !== "string") { return rawValue; } else { return serializer.read(rawValue); } } function updateFromCustomEvent(event) { update(event.detail); } function update(event) { if (event && event.storageArea !== storage) return; if (event && event.key == null) { data.value = rawInit; return; } if (event && event.key !== key) return; pauseWatch(); try { data.value = read(event); } catch (e) { onError(e); } finally { if (event) vueDemi.nextTick(resumeWatch); else resumeWatch(); } } } function usePreferredDark(options) { return useMediaQuery("(prefers-color-scheme: dark)", options); } var __defProp$j = Object.defineProperty; var __getOwnPropSymbols$l = Object.getOwnPropertySymbols; var __hasOwnProp$l = Object.prototype.hasOwnProperty; var __propIsEnum$l = Object.prototype.propertyIsEnumerable; var __defNormalProp$j = (obj, key, value) => key in obj ? __defProp$j(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$j = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$l.call(b, prop)) __defNormalProp$j(a, prop, b[prop]); if (__getOwnPropSymbols$l) for (var prop of __getOwnPropSymbols$l(b)) { if (__propIsEnum$l.call(b, prop)) __defNormalProp$j(a, prop, b[prop]); } return a; }; function useColorMode(options = {}) { const { selector = "html", attribute = "class", initialValue = "auto", window = defaultWindow, storage, storageKey = "vueuse-color-scheme", listenToStorageChanges = true, storageRef, emitAuto } = options; const modes = __spreadValues$j({ auto: "", light: "light", dark: "dark" }, options.modes || {}); const preferredDark = usePreferredDark({ window }); const preferredMode = vueDemi.computed(() => preferredDark.value ? "dark" : "light"); const store = storageRef || (storageKey == null ? vueDemi.ref(initialValue) : useStorage(storageKey, initialValue, storage, { window, listenToStorageChanges })); const state = vueDemi.computed({ get() { return store.value === "auto" && !emitAuto ? preferredMode.value : store.value; }, set(v) { store.value = v; } }); const updateHTMLAttrs = getSSRHandler("updateHTMLAttrs", (selector2, attribute2, value) => { const el = window == null ? void 0 : window.document.querySelector(selector2); if (!el) return; if (attribute2 === "class") { const current = value.split(/\s/g); Object.values(modes).flatMap((i) => (i || "").split(/\s/g)).filter(Boolean).forEach((v) => { if (current.includes(v)) el.classList.add(v); else el.classList.remove(v); }); } else { el.setAttribute(attribute2, value); } }); function defaultOnChanged(mode) { var _a; const resolvedMode = mode === "auto" ? preferredMode.value : mode; updateHTMLAttrs(selector, attribute, (_a = modes[resolvedMode]) != null ? _a : resolvedMode); } function onChanged(mode) { if (options.onChanged) options.onChanged(mode, defaultOnChanged); else defaultOnChanged(mode); } vueDemi.watch(state, onChanged, { flush: "post", immediate: true }); if (emitAuto) vueDemi.watch(preferredMode, () => onChanged(state.value), { flush: "post" }); shared.tryOnMounted(() => onChanged(state.value)); return state; } function useConfirmDialog(revealed = vueDemi.ref(false)) { const confirmHook = shared.createEventHook(); const cancelHook = shared.createEventHook(); const revealHook = shared.createEventHook(); let _resolve = shared.noop; const reveal = (data) => { revealHook.trigger(data); revealed.value = true; return new Promise((resolve) => { _resolve = resolve; }); }; const confirm = (data) => { revealed.value = false; confirmHook.trigger(data); _resolve({ data, isCanceled: false }); }; const cancel = (data) => { revealed.value = false; cancelHook.trigger(data); _resolve({ data, isCanceled: true }); }; return { isRevealed: vueDemi.computed(() => revealed.value), reveal, confirm, cancel, onReveal: revealHook.on, onConfirm: confirmHook.on, onCancel: cancelHook.on }; } function useCssVar(prop, target, { window = defaultWindow, initialValue = "" } = {}) { const variable = vueDemi.ref(initialValue); const elRef = vueDemi.computed(() => { var _a; return unrefElement(target) || ((_a = window == null ? void 0 : window.document) == null ? void 0 : _a.documentElement); }); vueDemi.watch([elRef, () => shared.resolveUnref(prop)], ([el, prop2]) => { var _a; if (el && window) { const value = (_a = window.getComputedStyle(el).getPropertyValue(prop2)) == null ? void 0 : _a.trim(); variable.value = value || initialValue; } }, { immediate: true }); vueDemi.watch(variable, (val) => { var _a; if ((_a = elRef.value) == null ? void 0 : _a.style) elRef.value.style.setProperty(shared.resolveUnref(prop), val); }); return variable; } function useCurrentElement() { const vm = vueDemi.getCurrentInstance(); const currentElement = shared.computedWithControl(() => null, () => vm.proxy.$el); vueDemi.onUpdated(currentElement.trigger); vueDemi.onMounted(currentElement.trigger); return currentElement; } function useCycleList(list, options) { var _a; const state = vueDemi.shallowRef((_a = options == null ? void 0 : options.initialValue) != null ? _a : list[0]); const index = vueDemi.computed({ get() { var _a2; let index2 = (options == null ? void 0 : options.getIndexOf) ? options.getIndexOf(state.value, list) : list.indexOf(state.value); if (index2 < 0) index2 = (_a2 = options == null ? void 0 : options.fallbackIndex) != null ? _a2 : 0; return index2; }, set(v) { set(v); } }); function set(i) { const length = list.length; const index2 = (i % length + length) % length; const value = list[index2]; state.value = value; return value; } function shift(delta = 1) { return set(index.value + delta); } function next(n = 1) { return shift(n); } function prev(n = 1) { return shift(-n); } return { state, index, next, prev }; } var __defProp$i = Object.defineProperty; var __defProps$7 = Object.defineProperties; var __getOwnPropDescs$7 = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols$k = Object.getOwnPropertySymbols; var __hasOwnProp$k = Object.prototype.hasOwnProperty; var __propIsEnum$k = Object.prototype.propertyIsEnumerable; var __defNormalProp$i = (obj, key, value) => key in obj ? __defProp$i(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$i = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$k.call(b, prop)) __defNormalProp$i(a, prop, b[prop]); if (__getOwnPropSymbols$k) for (var prop of __getOwnPropSymbols$k(b)) { if (__propIsEnum$k.call(b, prop)) __defNormalProp$i(a, prop, b[prop]); } return a; }; var __spreadProps$7 = (a, b) => __defProps$7(a, __getOwnPropDescs$7(b)); function useDark(options = {}) { const { valueDark = "dark", valueLight = "", window = defaultWindow } = options; const mode = useColorMode(__spreadProps$7(__spreadValues$i({}, options), { onChanged: (mode2, defaultHandler) => { var _a; if (options.onChanged) (_a = options.onChanged) == null ? void 0 : _a.call(options, mode2 === "dark"); else defaultHandler(mode2); }, modes: { dark: valueDark, light: valueLight } })); const preferredDark = usePreferredDark({ window }); const isDark = vueDemi.computed({ get() { return mode.value === "dark"; }, set(v) { if (v === preferredDark.value) mode.value = "auto"; else mode.value = v ? "dark" : "light"; } }); return isDark; } const fnBypass = (v) => v; const fnSetSource = (source, value) => source.value = value; function defaultDump(clone) { return clone ? shared.isFunction(clone) ? clone : cloneFnJSON : fnBypass; } function defaultParse(clone) { return clone ? shared.isFunction(clone) ? clone : cloneFnJSON : fnBypass; } function useManualRefHistory(source, options = {}) { const { clone = false, dump = defaultDump(clone), parse = defaultParse(clone), setSource = fnSetSource } = options; function _createHistoryRecord() { return vueDemi.markRaw({ snapshot: dump(source.value), timestamp: shared.timestamp() }); } const last = vueDemi.ref(_createHistoryRecord()); const undoStack = vueDemi.ref([]); const redoStack = vueDemi.ref([]); const _setSource = (record) => { setSource(source, parse(record.snapshot)); last.value = record; }; const commit = () => { undoStack.value.unshift(last.value); last.value = _createHistoryRecord(); if (options.capacity && undoStack.value.length > options.capacity) undoStack.value.splice(options.capacity, Infinity); if (redoStack.value.length) redoStack.value.splice(0, redoStack.value.length); }; const clear = () => { undoStack.value.splice(0, undoStack.value.length); redoStack.value.splice(0, redoStack.value.length); }; const undo = () => { const state = undoStack.value.shift(); if (state) { redoStack.value.unshift(last.value); _setSource(state); } }; const redo = () => { const state = redoStack.value.shift(); if (state) { undoStack.value.unshift(last.value); _setSource(state); } }; const reset = () => { _setSource(last.value); }; const history = vueDemi.computed(() => [last.value, ...undoStack.value]); const canUndo = vueDemi.computed(() => undoStack.value.length > 0); const canRedo = vueDemi.computed(() => redoStack.value.length > 0); return { source, undoStack, redoStack, last, history, canUndo, canRedo, clear, commit, reset, undo, redo }; } var __defProp$h = Object.defineProperty; var __defProps$6 = Object.defineProperties; var __getOwnPropDescs$6 = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols$j = Object.getOwnPropertySymbols; var __hasOwnProp$j = Object.prototype.hasOwnProperty; var __propIsEnum$j = Object.prototype.propertyIsEnumerable; var __defNormalProp$h = (obj, key, value) => key in obj ? __defProp$h(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$h = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$j.call(b, prop)) __defNormalProp$h(a, prop, b[prop]); if (__getOwnPropSymbols$j) for (var prop of __getOwnPropSymbols$j(b)) { if (__propIsEnum$j.call(b, prop)) __defNormalProp$h(a, prop, b[prop]); } return a; }; var __spreadProps$6 = (a, b) => __defProps$6(a, __getOwnPropDescs$6(b)); function useRefHistory(source, options = {}) { const { deep = false, flush = "pre", eventFilter } = options; const { eventFilter: composedFilter, pause, resume: resumeTracking, isActive: isTracking } = shared.pausableFilter(eventFilter); const { ignoreUpdates, ignorePrevAsyncUpdates, stop } = shared.watchIgnorable(source, commit, { deep, flush, eventFilter: composedFilter }); function setSource(source2, value) { ignorePrevAsyncUpdates(); ignoreUpdates(() => { source2.value = value; }); } const manualHistory = useManualRefHistory(source, __spreadProps$6(__spreadValues$h({}, options), { clone: options.clone || deep, setSource })); const { clear, commit: manualCommit } = manualHistory; function commit() { ignorePrevAsyncUpdates(); manualCommit(); } function resume(commitNow) { resumeTracking(); if (commitNow) commit(); } function batch(fn) { let canceled = false; const cancel = () => canceled = true; ignoreUpdates(() => { fn(cancel); }); if (!canceled) commit(); } function dispose() { stop(); clear(); } return __spreadProps$6(__spreadValues$h({}, manualHistory), { isTracking, pause, resume, commit, batch, dispose }); } var __defProp$g = Object.defineProperty; var __defProps$5 = Object.defineProperties; var __getOwnPropDescs$5 = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols$i = Object.getOwnPropertySymbols; var __hasOwnProp$i = Object.prototype.hasOwnProperty; var __propIsEnum$i = Object.prototype.propertyIsEnumerable; var __defNormalProp$g = (obj, key, value) => key in obj ? __defProp$g(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$g = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$i.call(b, prop)) __defNormalProp$g(a, prop, b[prop]); if (__getOwnPropSymbols$i) for (var prop of __getOwnPropSymbols$i(b)) { if (__propIsEnum$i.call(b, prop)) __defNormalProp$g(a, prop, b[prop]); } return a; }; var __spreadProps$5 = (a, b) => __defProps$5(a, __getOwnPropDescs$5(b)); function useDebouncedRefHistory(source, options = {}) { const filter = options.debounce ? shared.debounceFilter(options.debounce) : void 0; const history = useRefHistory(source, __spreadProps$5(__spreadValues$g({}, options), { eventFilter: filter })); return __spreadValues$g({}, history); } function useDeviceMotion(options = {}) { const { window = defaultWindow, eventFilter = shared.bypassFilter } = options; const acceleration = vueDemi.ref({ x: null, y: null, z: null }); const rotationRate = vueDemi.ref({ alpha: null, beta: null, gamma: null }); const interval = vueDemi.ref(0); const accelerationIncludingGravity = vueDemi.ref({ x: null, y: null, z: null }); if (window) { const onDeviceMotion = shared.createFilterWrapper(eventFilter, (event) => { acceleration.value = event.acceleration; accelerationIncludingGravity.value = event.accelerationIncludingGravity; rotationRate.value = event.rotationRate; interval.value = event.interval; }); useEventListener(window, "devicemotion", onDeviceMotion); } return { acceleration, accelerationIncludingGravity, rotationRate, interval }; } function useDeviceOrientation(options = {}) { const { window = defaultWindow } = options; const isSupported = useSupported(() => window && "DeviceOrientationEvent" in window); const isAbsolute = vueDemi.ref(false); const alpha = vueDemi.ref(null); const beta = vueDemi.ref(null); const gamma = vueDemi.ref(null); if (window && isSupported.value) { useEventListener(window, "deviceorientation", (event) => { isAbsolute.value = event.absolute; alpha.value = event.alpha; beta.value = event.beta; gamma.value = event.gamma; }); } return { isSupported, isAbsolute, alpha, beta, gamma }; } function useDevicePixelRatio({ window = defaultWindow } = {}) { const pixelRatio = vueDemi.ref(1); if (window) { let observe = function() { pixelRatio.value = window.devicePixelRatio; cleanup(); media = window.matchMedia(`(resolution: ${pixelRatio.value}dppx)`); media.addEventListener("change", observe, { once: true }); }, cleanup = function() { media == null ? void 0 : media.removeEventListener("change", observe); }; let media; observe(); shared.tryOnScopeDispose(cleanup); } return { pixelRatio }; } function usePermission(permissionDesc, options = {}) { const { controls = false, navigator = defaultNavigator } = options; const isSupported = useSupported(() => navigator && "permissions" in navigator); let permissionStatus; const desc = typeof permissionDesc === "string" ? { name: permissionDesc } : permissionDesc; const state = vueDemi.ref(); const onChange = () => { if (permissionStatus) state.value = permissionStatus.state; }; const query = shared.createSingletonPromise(async () => { if (!isSupported.value) return; if (!permissionStatus) { try { permissionStatus = await navigator.permissions.query(desc); useEventListener(permissionStatus, "change", onChange); onChange(); } catch (e) { state.value = "prompt"; } } return permissionStatus; }); query(); if (controls) { return { state, isSupported, query }; } else { return state; } } function useDevicesList(options = {}) { const { navigator = defaultNavigator, requestPermissions = false, constraints = { audio: true, video: true }, onUpdated } = options; const devices = vueDemi.ref([]); const videoInputs = vueDemi.computed(() => devices.value.filter((i) => i.kind === "videoinput")); const audioInputs = vueDemi.computed(() => devices.value.filter((i) => i.kind === "audioinput")); const audioOutputs = vueDemi.computed(() => devices.value.filter((i) => i.kind === "audiooutput")); const isSupported = useSupported(() => navigator && navigator.mediaDevices && navigator.mediaDevices.enumerateDevices); const permissionGranted = vueDemi.ref(false); async function update() { if (!isSupported.value) return; devices.value = await navigator.mediaDevices.enumerateDevices(); onUpdated == null ? void 0 : onUpdated(devices.value); } async function ensurePermissions() { if (!isSupported.value) return false; if (permissionGranted.value) return true; const { state, query } = usePermission("camera", { controls: true }); await query(); if (state.value !== "granted") { const stream = await navigator.mediaDevices.getUserMedia(constraints); stream.getTracks().forEach((t) => t.stop()); update(); permissionGranted.value = true; } else { permissionGranted.value = true; } return permissionGranted.value; } if (isSupported.value) { if (requestPermissions) ensurePermissions(); useEventListener(navigator.mediaDevices, "devicechange", update); update(); } return { devices, ensurePermissions, permissionGranted, videoInputs, audioInputs, audioOutputs, isSupported }; } function useDisplayMedia(options = {}) { var _a; const enabled = vueDemi.ref((_a = options.enabled) != null ? _a : false); const video = options.video; const audio = options.audio; const { navigator = defaultNavigator } = options; const isSupported = useSupported(() => { var _a2; return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getDisplayMedia; }); const constraint = { audio, video }; const stream = vueDemi.shallowRef(); async function _start() { if (!isSupported.value || stream.value) return; stream.value = await navigator.mediaDevices.getDisplayMedia(constraint); return stream.value; } async function _stop() { var _a2; (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop()); stream.value = void 0; } function stop() { _stop(); enabled.value = false; } async function start() { await _start(); if (stream.value) enabled.value = true; return stream.value; } vueDemi.watch(enabled, (v) => { if (v) _start(); else _stop(); }, { immediate: true }); return { isSupported, stream, start, stop, enabled }; } function useDocumentVisibility({ document = defaultDocument } = {}) { if (!document) return vueDemi.ref("visible"); const visibility = vueDemi.ref(document.visibilityState); useEventListener(document, "visibilitychange", () => { visibility.value = document.visibilityState; }); return visibility; } var __defProp$f = Object.defineProperty; var __defProps$4 = Object.defineProperties; var __getOwnPropDescs$4 = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols$h = Object.getOwnPropertySymbols; var __hasOwnProp$h = Object.prototype.hasOwnProperty; var __propIsEnum$h = Object.prototype.propertyIsEnumerable; var __defNormalProp$f = (obj, key, value) => key in obj ? __defProp$f(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$f = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$h.call(b, prop)) __defNormalProp$f(a, prop, b[prop]); if (__getOwnPropSymbols$h) for (var prop of __getOwnPropSymbols$h(b)) { if (__propIsEnum$h.call(b, prop)) __defNormalProp$f(a, prop, b[prop]); } return a; }; var __spreadProps$4 = (a, b) => __defProps$4(a, __getOwnPropDescs$4(b)); function useDraggable(target, options = {}) { var _a, _b, _c; const draggingElement = (_a = options.draggingElement) != null ? _a : defaultWindow; const draggingHandle = (_b = options.handle) != null ? _b : target; const position = vueDemi.ref((_c = shared.resolveUnref(options.initialValue)) != null ? _c : { x: 0, y: 0 }); const pressedDelta = vueDemi.ref(); const filterEvent = (e) => { if (options.pointerTypes) return options.pointerTypes.includes(e.pointerType); return true; }; const handleEvent = (e) => { if (shared.resolveUnref(options.preventDefault)) e.preventDefault(); if (shared.resolveUnref(options.stopPropagation)) e.stopPropagation(); }; const start = (e) => { var _a2; if (!filterEvent(e)) return; if (shared.resolveUnref(options.exact) && e.target !== shared.resolveUnref(target)) return; const rect = shared.resolveUnref(target).getBoundingClientRect(); const pos = { x: e.clientX - rect.left, y: e.clientY - rect.top }; if (((_a2 = options.onStart) == null ? void 0 : _a2.call(options, pos, e)) === false) return; pressedDelta.value = pos; handleEvent(e); }; const move = (e) => { var _a2; if (!filterEvent(e)) return; if (!pressedDelta.value) return; position.value = { x: e.clientX - pressedDelta.value.x, y: e.clientY - pressedDelta.value.y }; (_a2 = options.onMove) == null ? void 0 : _a2.call(options, position.value, e); handleEvent(e); }; const end = (e) => { var _a2; if (!filterEvent(e)) return; if (!pressedDelta.value) return; pressedDelta.value = void 0; (_a2 = options.onEnd) == null ? void 0 : _a2.call(options, position.value, e); handleEvent(e); }; if (shared.isClient) { useEventListener(draggingHandle, "pointerdown", start, true); useEventListener(draggingElement, "pointermove", move, true); useEventListener(draggingElement, "pointerup", end, true); } return __spreadProps$4(__spreadValues$f({}, shared.toRefs(position)), { position, isDragging: vueDemi.computed(() => !!pressedDelta.value), style: vueDemi.computed(() => `left:${position.value.x}px;top:${position.value.y}px;`) }); } function useDropZone(target, onDrop) { const isOverDropZone = vueDemi.ref(false); let counter = 0; if (shared.isClient) { useEventListener(target, "dragenter", (event) => { event.preventDefault(); counter += 1; isOverDropZone.value = true; }); useEventListener(target, "dragover", (event) => { event.preventDefault(); }); useEventListener(target, "dragleave", (event) => { event.preventDefault(); counter -= 1; if (counter === 0) isOverDropZone.value = false; }); useEventListener(target, "drop", (event) => { var _a, _b; event.preventDefault(); counter = 0; isOverDropZone.value = false; const files = Array.from((_b = (_a = event.dataTransfer) == null ? void 0 : _a.files) != null ? _b : []); onDrop == null ? void 0 : onDrop(files.length === 0 ? null : files); }); } return { isOverDropZone }; } var __getOwnPropSymbols$g = Object.getOwnPropertySymbols; var __hasOwnProp$g = Object.prototype.hasOwnProperty; var __propIsEnum$g = Object.prototype.propertyIsEnumerable; var __objRest$2 = (source, exclude) => { var target = {}; for (var prop in source) if (__hasOwnProp$g.call(source, prop) && exclude.indexOf(prop) < 0) target[prop] = source[prop]; if (source != null && __getOwnPropSymbols$g) for (var prop of __getOwnPropSymbols$g(source)) { if (exclude.indexOf(prop) < 0 && __propIsEnum$g.call(source, prop)) target[prop] = source[prop]; } return target; }; function useResizeObserver(target, callback, options = {}) { const _a = options, { window = defaultWindow } = _a, observerOptions = __objRest$2(_a, ["window"]); let observer; const isSupported = useSupported(() => window && "ResizeObserver" in window); const cleanup = () => { if (observer) { observer.disconnect(); observer = void 0; } }; const stopWatch = vueDemi.watch(() => unrefElement(target), (el) => { cleanup(); if (isSupported.value && window && el) { observer = new ResizeObserver(callback); observer.observe(el, observerOptions); } }, { immediate: true, flush: "post" }); const stop = () => { cleanup(); stopWatch(); }; shared.tryOnScopeDispose(stop); return { isSupported, stop }; } function useElementBounding(target, options = {}) { const { reset = true, windowResize = true, windowScroll = true, immediate = true } = options; const height = vueDemi.ref(0); const bottom = vueDemi.ref(0); const left = vueDemi.ref(0); const right = vueDemi.ref(0); const top = vueDemi.ref(0); const width = vueDemi.ref(0); const x = vueDemi.ref(0); const y = vueDemi.ref(0); function update() { const el = unrefElement(target); if (!el) { if (reset) { height.value = 0; bottom.value = 0; left.value = 0; right.value = 0; top.value = 0; width.value = 0; x.value = 0; y.value = 0; } return; } const rect = el.getBoundingClientRect(); height.value = rect.height; bottom.value = rect.bottom; left.value = rect.left; right.value = rect.right; top.value = rect.top; width.value = rect.width; x.value = rect.x; y.value = rect.y; } useResizeObserver(target, update); vueDemi.watch(() => unrefElement(target), (ele) => !ele && update()); if (windowScroll) useEventListener("scroll", update, { capture: true, passive: true }); if (windowResize) useEventListener("resize", update, { passive: true }); shared.tryOnMounted(() => { if (immediate) update(); }); return { height, bottom, left, right, top, width, x, y, update }; } function useRafFn(fn, options = {}) { const { immediate = true, window = defaultWindow } = options; const isActive = vueDemi.ref(false); let previousFrameTimestamp = 0; let rafId = null; function loop(timestamp) { if (!isActive.value || !window) return; const delta = timestamp - previousFrameTimestamp; fn({ delta, timestamp }); previousFrameTimestamp = timestamp; rafId = window.requestAnimationFrame(loop); } function resume() { if (!isActive.value && window) { isActive.value = true; rafId = window.requestAnimationFrame(loop); } } function pause() { isActive.value = false; if (rafId != null && window) { window.cancelAnimationFrame(rafId); rafId = null; } } if (immediate) resume(); shared.tryOnScopeDispose(pause); return { isActive: vueDemi.readonly(isActive), pause, resume }; } var __defProp$e = Object.defineProperty; var __getOwnPropSymbols$f = Object.getOwnPropertySymbols; var __hasOwnProp$f = Object.prototype.hasOwnProperty; var __propIsEnum$f = Object.prototype.propertyIsEnumerable; var __defNormalProp$e = (obj, key, value) => key in obj ? __defProp$e(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$e = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$f.call(b, prop)) __defNormalProp$e(a, prop, b[prop]); if (__getOwnPropSymbols$f) for (var prop of __getOwnPropSymbols$f(b)) { if (__propIsEnum$f.call(b, prop)) __defNormalProp$e(a, prop, b[prop]); } return a; }; function useElementByPoint(options) { const element = vueDemi.ref(null); const { x, y, document = defaultDocument } = options; const controls = useRafFn(() => { element.value = (document == null ? void 0 : document.elementFromPoint(shared.resolveUnref(x), shared.resolveUnref(y))) || null; }); return __spreadValues$e({ element }, controls); } function useElementHover(el, options = {}) { const delayEnter = options ? options.delayEnter : 0; const delayLeave = options ? options.delayLeave : 0; const isHovered = vueDemi.ref(false); let timer; const toggle = (entering) => { const delay = entering ? delayEnter : delayLeave; if (timer) { clearTimeout(timer); timer = void 0; } if (delay) timer = setTimeout(() => isHovered.value = entering, delay); else isHovered.value = entering; }; if (!window) return isHovered; useEventListener(el, "mouseenter", () => toggle(true), { passive: true }); useEventListener(el, "mouseleave", () => toggle(false), { passive: true }); return isHovered; } function useElementSize(target, initialSize = { width: 0, height: 0 }, options = {}) { const { window = defaultWindow, box = "content-box" } = options; const isSVG = vueDemi.computed(() => { var _a, _b; return (_b = (_a = unrefElement(target)) == null ? void 0 : _a.namespaceURI) == null ? void 0 : _b.includes("svg"); }); const width = vueDemi.ref(initialSize.width); const height = vueDemi.ref(initialSize.height); useResizeObserver(target, ([entry]) => { const boxSize = box === "border-box" ? entry.borderBoxSize : box === "content-box" ? entry.contentBoxSize : entry.devicePixelContentBoxSize; if (window && isSVG.value) { const $elem = unrefElement(target); if ($elem) { const styles = window.getComputedStyle($elem); width.value = parseFloat(styles.width); height.value = parseFloat(styles.height); } } else { if (boxSize) { const formatBoxSize = Array.isArray(boxSize) ? boxSize : [boxSize]; width.value = formatBoxSize.reduce((acc, { inlineSize }) => acc + inlineSize, 0); height.value = formatBoxSize.reduce((acc, { blockSize }) => acc + blockSize, 0); } else { width.value = entry.contentRect.width; height.value = entry.contentRect.height; } } }, options); vueDemi.watch(() => unrefElement(target), (ele) => { width.value = ele ? initialSize.width : 0; height.value = ele ? initialSize.height : 0; }); return { width, height }; } function useElementVisibility(element, { window = defaultWindow, scrollTarget } = {}) { const elementIsVisible = vueDemi.ref(false); const testBounding = () => { if (!window) return; const document = window.document; const el = unrefElement(element); if (!el) { elementIsVisible.value = false; } else { const rect = el.getBoundingClientRect(); elementIsVisible.value = rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth) && rect.bottom >= 0 && rect.right >= 0; } }; vueDemi.watch(() => unrefElement(element), () => testBounding(), { immediate: true, flush: "post" }); if (window) { useEventListener(scrollTarget || window, "scroll", testBounding, { capture: false, passive: true }); } return elementIsVisible; } const events = new Map(); function useEventBus(key) { const scope = vueDemi.getCurrentScope(); function on(listener) { var _a; const listeners = events.get(key) || []; listeners.push(listener); events.set(key, listeners); const _off = () => off(listener); (_a = scope == null ? void 0 : scope.cleanups) == null ? void 0 : _a.push(_off); return _off; } function once(listener) { function _listener(...args) { off(_listener); listener(...args); } return on(_listener); } function off(listener) { const listeners = events.get(key); if (!listeners) return; const index = listeners.indexOf(listener); if (index > -1) listeners.splice(index, 1); if (!listeners.length) events.delete(key); } function reset() { events.delete(key); } function emit(event, payload) { var _a; (_a = events.get(key)) == null ? void 0 : _a.forEach((v) => v(event, payload)); } return { on, once, off, emit, reset }; } function useEventSource(url, events = [], options = {}) { const event = vueDemi.ref(null); const data = vueDemi.ref(null); const status = vueDemi.ref("CONNECTING"); const eventSource = vueDemi.ref(null); const error = vueDemi.ref(null); const { withCredentials = false } = options; const close = () => { if (eventSource.value) { eventSource.value.close(); eventSource.value = null; status.value = "CLOSED"; } }; const es = new EventSource(url, { withCredentials }); eventSource.value = es; es.onopen = () => { status.value = "OPEN"; error.value = null; }; es.onerror = (e) => { status.value = "CLOSED"; error.value = e; }; es.onmessage = (e) => { event.value = null; data.value = e.data; }; for (const event_name of events) { useEventListener(es, event_name, (e) => { event.value = event_name; data.value = e.data || null; }); } shared.tryOnScopeDispose(() => { close(); }); return { eventSource, event, data, status, error, close }; } function useEyeDropper(options = {}) { const { initialValue = "" } = options; const isSupported = useSupported(() => typeof window !== "undefined" && "EyeDropper" in window); const sRGBHex = vueDemi.ref(initialValue); async function open(openOptions) { if (!isSupported.value) return; const eyeDropper = new window.EyeDropper(); const result = await eyeDropper.open(openOptions); sRGBHex.value = result.sRGBHex; return result; } return { isSupported, sRGBHex, open }; } function useFavicon(newIcon = null, options = {}) { const { baseUrl = "", rel = "icon", document = defaultDocument } = options; const favicon = shared.resolveRef(newIcon); const applyIcon = (icon) => { document == null ? void 0 : document.head.querySelectorAll(`link[rel*="${rel}"]`).forEach((el) => el.href = `${baseUrl}${icon}`); }; vueDemi.watch(favicon, (i, o) => { if (shared.isString(i) && i !== o) applyIcon(i); }, { immediate: true }); return favicon; } var __defProp$d = Object.defineProperty; var __defProps$3 = Object.defineProperties; var __getOwnPropDescs$3 = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols$e = Object.getOwnPropertySymbols; var __hasOwnProp$e = Object.prototype.hasOwnProperty; var __propIsEnum$e = Object.prototype.propertyIsEnumerable; var __defNormalProp$d = (obj, key, value) => key in obj ? __defProp$d(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$d = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$e.call(b, prop)) __defNormalProp$d(a, prop, b[prop]); if (__getOwnPropSymbols$e) for (var prop of __getOwnPropSymbols$e(b)) { if (__propIsEnum$e.call(b, prop)) __defNormalProp$d(a, prop, b[prop]); } return a; }; var __spreadProps$3 = (a, b) => __defProps$3(a, __getOwnPropDescs$3(b)); const payloadMapping = { json: "application/json", text: "text/plain" }; function isFetchOptions(obj) { return obj && shared.containsProp(obj, "immediate", "refetch", "initialData", "timeout", "beforeFetch", "afterFetch", "onFetchError", "fetch"); } function isAbsoluteURL(url) { return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url); } function headersToObject(headers) { if (typeof Headers !== "undefined" && headers instanceof Headers) return Object.fromEntries([...headers.entries()]); return headers; } function combineCallbacks(combination, ...callbacks) { if (combination === "overwrite") { return async (ctx) => { const callback = callbacks[callbacks.length - 1]; if (callback !== void 0) await callback(ctx); return ctx; }; } else { return async (ctx) => { await callbacks.reduce((prevCallback, callback) => prevCallback.then(async () => { if (callback) ctx = __spreadValues$d(__spreadValues$d({}, ctx), await callback(ctx)); }), Promise.resolve()); return ctx; }; } } function createFetch(config = {}) { const _combination = config.combination || "chain"; const _options = config.options || {}; const _fetchOptions = config.fetchOptions || {}; function useFactoryFetch(url, ...args) { const computedUrl = vueDemi.computed(() => { const baseUrl = shared.resolveUnref(config.baseUrl); const targetUrl = shared.resolveUnref(url); return baseUrl && !isAbsoluteURL(targetUrl) ? joinPaths(baseUrl, targetUrl) : targetUrl; }); let options = _options; let fetchOptions = _fetchOptions; if (args.length > 0) { if (isFetchOptions(args[0])) { options = __spreadProps$3(__spreadValues$d(__spreadValues$d({}, options), args[0]), { beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[0].beforeFetch), afterFetch: combineCallbacks(_combination, _options.afterFetch, args[0].afterFetch), onFetchError: combineCallbacks(_combination, _options.onFetchError, args[0].onFetchError) }); } else { fetchOptions = __spreadProps$3(__spreadValues$d(__spreadValues$d({}, fetchOptions), args[0]), { headers: __spreadValues$d(__spreadValues$d({}, headersToObject(fetchOptions.headers) || {}), headersToObject(args[0].headers) || {}) }); } } if (args.length > 1 && isFetchOptions(args[1])) { options = __spreadProps$3(__spreadValues$d(__spreadValues$d({}, options), args[1]), { beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[1].beforeFetch), afterFetch: combineCallbacks(_combination, _options.afterFetch, args[1].afterFetch), onFetchError: combineCallbacks(_combination, _options.onFetchError, args[1].onFetchError) }); } return useFetch(computedUrl, fetchOptions, options); } return useFactoryFetch; } function useFetch(url, ...args) { var _a; const supportsAbort = typeof AbortController === "function"; let fetchOptions = {}; let options = { immediate: true, refetch: false, timeout: 0 }; const config = { method: "GET", type: "text", payload: void 0 }; if (args.length > 0) { if (isFetchOptions(args[0])) options = __spreadValues$d(__spreadValues$d({}, options), args[0]); else fetchOptions = args[0]; } if (args.length > 1) { if (isFetchOptions(args[1])) options = __spreadValues$d(__spreadValues$d({}, options), args[1]); } const { fetch = (_a = defaultWindow) == null ? void 0 : _a.fetch, initialData, timeout } = options; const responseEvent = shared.createEventHook(); const errorEvent = shared.createEventHook(); const finallyEvent = shared.createEventHook(); const isFinished = vueDemi.ref(false); const isFetching = vueDemi.ref(false); const aborted = vueDemi.ref(false); const statusCode = vueDemi.ref(null); const response = vueDemi.shallowRef(null); const error = vueDemi.shallowRef(null); const data = vueDemi.shallowRef(initialData); const canAbort = vueDemi.computed(() => supportsAbort && isFetching.value); let controller; let timer; const abort = () => { if (supportsAbort && controller) { controller.abort(); controller = void 0; } }; const loading = (isLoading) => { isFetching.value = isLoading; isFinished.value = !isLoading; }; if (timeout) timer = shared.useTimeoutFn(abort, timeout, { immediate: false }); const execute = async (throwOnFailed = false) => { var _a2; loading(true); error.value = null; statusCode.value = null; aborted.value = false; if (supportsAbort) { abort(); controller = new AbortController(); controller.signal.onabort = () => aborted.value = true; fetchOptions = __spreadProps$3(__spreadValues$d({}, fetchOptions), { signal: controller.signal }); } const defaultFetchOptions = { method: config.method, headers: {} }; if (config.payload) { const headers = headersToObject(defaultFetchOptions.headers); if (config.payloadType) headers["Content-Type"] = (_a2 = payloadMapping[config.payloadType]) != null ? _a2 : config.payloadType; const payload = shared.resolveUnref(config.payload); defaultFetchOptions.body = config.payloadType === "json" ? JSON.stringify(payload) : payload; } let isCanceled = false; const context = { url: shared.resolveUnref(url), options: __spreadValues$d(__spreadValues$d({}, defaultFetchOptions), fetchOptions), cancel: () => { isCanceled = true; } }; if (options.beforeFetch) Object.assign(context, await options.beforeFetch(context)); if (isCanceled || !fetch) { loading(false); return Promise.resolve(null); } let responseData = null; if (timer) timer.start(); return new Promise((resolve, reject) => { var _a3; fetch(context.url, __spreadProps$3(__spreadValues$d(__spreadValues$d({}, defaultFetchOptions), context.options), { headers: __spreadValues$d(__spreadValues$d({}, headersToObject(defaultFetchOptions.headers)), headersToObject((_a3 = context.options) == null ? void 0 : _a3.headers)) })).then(async (fetchResponse) => { response.value = fetchResponse; statusCode.value = fetchResponse.status; responseData = await fetchResponse[config.type](); if (options.afterFetch && statusCode.value >= 200 && statusCode.value < 300) ({ data: responseData } = await options.afterFetch({ data: responseData, response: fetchResponse })); data.value = responseData; if (!fetchResponse.ok) throw new Error(fetchResponse.statusText); responseEvent.trigger(fetchResponse); return resolve(fetchResponse); }).catch(async (fetchError) => { let errorData = fetchError.message || fetchError.name; if (options.onFetchError) ({ data: responseData, error: errorData } = await options.onFetchError({ data: responseData, error: fetchError, response: response.value })); data.value = responseData; error.value = errorData; errorEvent.trigger(fetchError); if (throwOnFailed) return reject(fetchError); return resolve(null); }).finally(() => { loading(false); if (timer) timer.stop(); finallyEvent.trigger(null); }); }); }; const refetch = shared.resolveRef(options.refetch); vueDemi.watch([ refetch, shared.resolveRef(url) ], ([refetch2]) => refetch2 && execute(), { deep: true }); const shell = { isFinished, statusCode, response, error, data, isFetching, canAbort, aborted, abort, execute, onFetchResponse: responseEvent.on, onFetchError: errorEvent.on, onFetchFinally: finallyEvent.on, get: setMethod("GET"), put: setMethod("PUT"), post: setMethod("POST"), delete: setMethod("DELETE"), patch: setMethod("PATCH"), head: setMethod("HEAD"), options: setMethod("OPTIONS"), json: setType("json"), text: setType("text"), blob: setType("blob"), arrayBuffer: setType("arrayBuffer"), formData: setType("formData") }; function setMethod(method) { return (payload, payloadType) => { if (!isFetching.value) { config.method = method; config.payload = payload; config.payloadType = payloadType; if (vueDemi.isRef(config.payload)) { vueDemi.watch([ refetch, shared.resolveRef(config.payload) ], ([refetch2]) => refetch2 && execute(), { deep: true }); } const rawPayload = shared.resolveUnref(config.payload); if (!payloadType && rawPayload && Object.getPrototypeOf(rawPayload) === Object.prototype && !(rawPayload instanceof FormData)) config.payloadType = "json"; return __spreadProps$3(__spreadValues$d({}, shell), { then(onFulfilled, onRejected) { return waitUntilFinished().then(onFulfilled, onRejected); } }); } return void 0; }; } function waitUntilFinished() { return new Promise((resolve, reject) => { shared.until(isFinished).toBe(true).then(() => resolve(shell)).catch((error2) => reject(error2)); }); } function setType(type) { return () => { if (!isFetching.value) { config.type = type; return __spreadProps$3(__spreadValues$d({}, shell), { then(onFulfilled, onRejected) { return waitUntilFinished().then(onFulfilled, onRejected); } }); } return void 0; }; } if (options.immediate) setTimeout(execute, 0); return __spreadProps$3(__spreadValues$d({}, shell), { then(onFulfilled, onRejected) { return waitUntilFinished().then(onFulfilled, onRejected); } }); } function joinPaths(start, end) { if (!start.endsWith("/") && !end.startsWith("/")) return `${start}/${end}`; return `${start}${end}`; } var __defProp$c = Object.defineProperty; var __getOwnPropSymbols$d = Object.getOwnPropertySymbols; var __hasOwnProp$d = Object.prototype.hasOwnProperty; var __propIsEnum$d = Object.prototype.propertyIsEnumerable; var __defNormalProp$c = (obj, key, value) => key in obj ? __defProp$c(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$c = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$d.call(b, prop)) __defNormalProp$c(a, prop, b[prop]); if (__getOwnPropSymbols$d) for (var prop of __getOwnPropSymbols$d(b)) { if (__propIsEnum$d.call(b, prop)) __defNormalProp$c(a, prop, b[prop]); } return a; }; const DEFAULT_OPTIONS = { multiple: true, accept: "*" }; function useFileDialog(options = {}) { const { document = defaultDocument } = options; const files = vueDemi.ref(null); let input; if (document) { input = document.createElement("input"); input.type = "file"; input.onchange = (event) => { const result = event.target; files.value = result.files; }; } const open = (localOptions) => { if (!input) return; const _options = __spreadValues$c(__spreadValues$c(__spreadValues$c({}, DEFAULT_OPTIONS), options), localOptions); input.multiple = _options.multiple; input.accept = _options.accept; if (shared.hasOwn(_options, "capture")) input.capture = _options.capture; input.click(); }; const reset = () => { files.value = null; if (input) input.value = ""; }; return { files: vueDemi.readonly(files), open, reset }; } var __defProp$b = Object.defineProperty; var __getOwnPropSymbols$c = Object.getOwnPropertySymbols; var __hasOwnProp$c = Object.prototype.hasOwnProperty; var __propIsEnum$c = Object.prototype.propertyIsEnumerable; var __defNormalProp$b = (obj, key, value) => key in obj ? __defProp$b(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$b = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$c.call(b, prop)) __defNormalProp$b(a, prop, b[prop]); if (__getOwnPropSymbols$c) for (var prop of __getOwnPropSymbols$c(b)) { if (__propIsEnum$c.call(b, prop)) __defNormalProp$b(a, prop, b[prop]); } return a; }; function useFileSystemAccess(options = {}) { const { window: _window = defaultWindow, dataType = "Text" } = vueDemi.unref(options); const window = _window; const isSupported = useSupported(() => window && "showSaveFilePicker" in window && "showOpenFilePicker" in window); const fileHandle = vueDemi.ref(); const data = vueDemi.ref(); const file = vueDemi.ref(); const fileName = vueDemi.computed(() => { var _a, _b; return (_b = (_a = file.value) == null ? void 0 : _a.name) != null ? _b : ""; }); const fileMIME = vueDemi.computed(() => { var _a, _b; return (_b = (_a = file.value) == null ? void 0 : _a.type) != null ? _b : ""; }); const fileSize = vueDemi.computed(() => { var _a, _b; return (_b = (_a = file.value) == null ? void 0 : _a.size) != null ? _b : 0; }); const fileLastModified = vueDemi.computed(() => { var _a, _b; return (_b = (_a = file.value) == null ? void 0 : _a.lastModified) != null ? _b : 0; }); async function open(_options = {}) { if (!isSupported.value) return; const [handle] = await window.showOpenFilePicker(__spreadValues$b(__spreadValues$b({}, vueDemi.unref(options)), _options)); fileHandle.value = handle; await updateFile(); await updateData(); } async function create(_options = {}) { if (!isSupported.value) return; fileHandle.value = await window.showSaveFilePicker(__spreadValues$b(__spreadValues$b({}, vueDemi.unref(options)), _options)); data.value = void 0; await updateFile(); await updateData(); } async function save(_options = {}) { if (!isSupported.value) return; if (!fileHandle.value) return saveAs(_options); if (data.value) { const writableStream = await fileHandle.value.createWritable(); await writableStream.write(data.value); await writableStream.close(); } await updateFile(); } async function saveAs(_options = {}) { if (!isSupported.value) return; fileHandle.value = await window.showSaveFilePicker(__spreadValues$b(__spreadValues$b({}, vueDemi.unref(options)), _options)); if (data.value) { const writableStream = await fileHandle.value.createWritable(); await writableStream.write(data.value); await writableStream.close(); } await updateFile(); } async function updateFile() { var _a; file.value = await ((_a = fileHandle.value) == null ? void 0 : _a.getFile()); } async function updateData() { var _a, _b; if (vueDemi.unref(dataType) === "Text") data.value = await ((_a = file.value) == null ? void 0 : _a.text()); if (vueDemi.unref(dataType) === "ArrayBuffer") data.value = await ((_b = file.value) == null ? void 0 : _b.arrayBuffer()); if (vueDemi.unref(dataType) === "Blob") data.value = file.value; } vueDemi.watch(() => vueDemi.unref(dataType), updateData); return { isSupported, data, file, fileName, fileMIME, fileSize, fileLastModified, open, create, save, saveAs, updateData }; } function useFocus(target, options = {}) { const { initialValue = false } = options; const innerFocused = vueDemi.ref(false); const targetElement = vueDemi.computed(() => unrefElement(target)); useEventListener(targetElement, "focus", () => innerFocused.value = true); useEventListener(targetElement, "blur", () => innerFocused.value = false); const focused = vueDemi.computed({ get: () => innerFocused.value, set(value) { var _a, _b; if (!value && innerFocused.value) (_a = targetElement.value) == null ? void 0 : _a.blur(); else if (value && !innerFocused.value) (_b = targetElement.value) == null ? void 0 : _b.focus(); } }); vueDemi.watch(targetElement, () => { focused.value = initialValue; }, { immediate: true, flush: "post" }); return { focused }; } function useFocusWithin(target, options = {}) { const activeElement = useActiveElement(options); const targetElement = vueDemi.computed(() => unrefElement(target)); const focused = vueDemi.computed(() => targetElement.value && activeElement.value ? targetElement.value.contains(activeElement.value) : false); return { focused }; } function useFps(options) { var _a; const fps = vueDemi.ref(0); if (typeof performance === "undefined") return fps; const every = (_a = options == null ? void 0 : options.every) != null ? _a : 10; let last = performance.now(); let ticks = 0; useRafFn(() => { ticks += 1; if (ticks >= every) { const now = performance.now(); const diff = now - last; fps.value = Math.round(1e3 / (diff / ticks)); last = now; ticks = 0; } }); return fps; } const functionsMap = [ [ "requestFullscreen", "exitFullscreen", "fullscreenElement", "fullscreenEnabled", "fullscreenchange", "fullscreenerror" ], [ "webkitRequestFullscreen", "webkitExitFullscreen", "webkitFullscreenElement", "webkitFullscreenEnabled", "webkitfullscreenchange", "webkitfullscreenerror" ], [ "webkitRequestFullScreen", "webkitCancelFullScreen", "webkitCurrentFullScreenElement", "webkitCancelFullScreen", "webkitfullscreenchange", "webkitfullscreenerror" ], [ "mozRequestFullScreen", "mozCancelFullScreen", "mozFullScreenElement", "mozFullScreenEnabled", "mozfullscreenchange", "mozfullscreenerror" ], [ "msRequestFullscreen", "msExitFullscreen", "msFullscreenElement", "msFullscreenEnabled", "MSFullscreenChange", "MSFullscreenError" ] ]; function useFullscreen(target, options = {}) { const { document = defaultDocument, autoExit = false } = options; const targetRef = target || (document == null ? void 0 : document.querySelector("html")); const isFullscreen = vueDemi.ref(false); let map = functionsMap[0]; const isSupported = useSupported(() => { if (!document) { return false; } else { for (const m of functionsMap) { if (m[1] in document) { map = m; return true; } } } return false; }); const [REQUEST, EXIT, ELEMENT, , EVENT] = map; async function exit() { if (!isSupported.value) return; if (document == null ? void 0 : document[ELEMENT]) await document[EXIT](); isFullscreen.value = false; } async function enter() { if (!isSupported.value) return; await exit(); const target2 = unrefElement(targetRef); if (target2) { await target2[REQUEST](); isFullscreen.value = true; } } async function toggle() { if (isFullscreen.value) await exit(); else await enter(); } if (document) { useEventListener(document, EVENT, () => { isFullscreen.value = !!(document == null ? void 0 : document[ELEMENT]); }, false); } if (autoExit) shared.tryOnScopeDispose(exit); return { isSupported, isFullscreen, enter, exit, toggle }; } function mapGamepadToXbox360Controller(gamepad) { return vueDemi.computed(() => { if (gamepad.value) { return { buttons: { a: gamepad.value.buttons[0], b: gamepad.value.buttons[1], x: gamepad.value.buttons[2], y: gamepad.value.buttons[3] }, bumper: { left: gamepad.value.buttons[4], right: gamepad.value.buttons[5] }, triggers: { left: gamepad.value.buttons[6], right: gamepad.value.buttons[7] }, stick: { left: { horizontal: gamepad.value.axes[0], vertical: gamepad.value.axes[1], button: gamepad.value.buttons[10] }, right: { horizontal: gamepad.value.axes[2], vertical: gamepad.value.axes[3], button: gamepad.value.buttons[11] } }, dpad: { up: gamepad.value.buttons[12], down: gamepad.value.buttons[13], left: gamepad.value.buttons[14], right: gamepad.value.buttons[15] }, back: gamepad.value.buttons[8], start: gamepad.value.buttons[9] }; } return null; }); } function useGamepad(options = {}) { const { navigator = defaultNavigator } = options; const isSupported = useSupported(() => navigator && "getGamepads" in navigator); const gamepads = vueDemi.ref([]); const onConnectedHook = shared.createEventHook(); const onDisconnectedHook = shared.createEventHook(); const stateFromGamepad = (gamepad) => { const hapticActuators = []; const vibrationActuator = "vibrationActuator" in gamepad ? gamepad.vibrationActuator : null; if (vibrationActuator) hapticActuators.push(vibrationActuator); if (gamepad.hapticActuators) hapticActuators.push(...gamepad.hapticActuators); return { id: gamepad.id, hapticActuators, index: gamepad.index, mapping: gamepad.mapping, connected: gamepad.connected, timestamp: gamepad.timestamp, axes: gamepad.axes.map((axes) => axes), buttons: gamepad.buttons.map((button) => ({ pressed: button.pressed, touched: button.touched, value: button.value })) }; }; const updateGamepadState = () => { const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || []; for (let i = 0; i < _gamepads.length; ++i) { const gamepad = _gamepads[i]; if (gamepad) { const index = gamepads.value.findIndex(({ index: index2 }) => index2 === gamepad.index); if (index > -1) gamepads.value[index] = stateFromGamepad(gamepad); } } }; const { isActive, pause, resume } = useRafFn(updateGamepadState); const onGamepadConnected = (gamepad) => { if (!gamepads.value.some(({ index }) => index === gamepad.index)) { gamepads.value.push(stateFromGamepad(gamepad)); onConnectedHook.trigger(gamepad.index); } resume(); }; const onGamepadDisconnected = (gamepad) => { gamepads.value = gamepads.value.filter((x) => x.index !== gamepad.index); onDisconnectedHook.trigger(gamepad.index); }; useEventListener("gamepadconnected", (e) => onGamepadConnected(e.gamepad)); useEventListener("gamepaddisconnected", (e) => onGamepadDisconnected(e.gamepad)); shared.tryOnMounted(() => { const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || []; if (_gamepads) { for (let i = 0; i < _gamepads.length; ++i) { const gamepad = _gamepads[i]; if (gamepad) onGamepadConnected(gamepad); } } }); pause(); return { isSupported, onConnected: onConnectedHook.on, onDisconnected: onDisconnectedHook.on, gamepads, pause, resume, isActive }; } function useGeolocation(options = {}) { const { enableHighAccuracy = true, maximumAge = 3e4, timeout = 27e3, navigator = defaultNavigator, immediate = true } = options; const isSupported = useSupported(() => navigator && "geolocation" in navigator); const locatedAt = vueDemi.ref(null); const error = vueDemi.ref(null); const coords = vueDemi.ref({ accuracy: 0, latitude: Infinity, longitude: Infinity, altitude: null, altitudeAccuracy: null, heading: null, speed: null }); function updatePosition(position) { locatedAt.value = position.timestamp; coords.value = position.coords; error.value = null; } let watcher; function resume() { if (isSupported.value) { watcher = navigator.geolocation.watchPosition(updatePosition, (err) => error.value = err, { enableHighAccuracy, maximumAge, timeout }); } } if (immediate) resume(); function pause() { if (watcher && navigator) navigator.geolocation.clearWatch(watcher); } shared.tryOnScopeDispose(() => { pause(); }); return { isSupported, coords, locatedAt, error, resume, pause }; } const defaultEvents$1 = ["mousemove", "mousedown", "resize", "keydown", "touchstart", "wheel"]; const oneMinute = 6e4; function useIdle(timeout = oneMinute, options = {}) { const { initialState = false, listenForVisibilityChange = true, events = defaultEvents$1, window = defaultWindow, eventFilter = shared.throttleFilter(50) } = options; const idle = vueDemi.ref(initialState); const lastActive = vueDemi.ref(shared.timestamp()); let timer; const onEvent = shared.createFilterWrapper(eventFilter, () => { idle.value = false; lastActive.value = shared.timestamp(); clearTimeout(timer); timer = setTimeout(() => idle.value = true, timeout); }); if (window) { const document = window.document; for (const event of events) useEventListener(window, event, onEvent, { passive: true }); if (listenForVisibilityChange) { useEventListener(document, "visibilitychange", () => { if (!document.hidden) onEvent(); }); } } timer = setTimeout(() => idle.value = true, timeout); return { idle, lastActive }; } var __defProp$a = Object.defineProperty; var __getOwnPropSymbols$b = Object.getOwnPropertySymbols; var __hasOwnProp$b = Object.prototype.hasOwnProperty; var __propIsEnum$b = Object.prototype.propertyIsEnumerable; var __defNormalProp$a = (obj, key, value) => key in obj ? __defProp$a(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$a = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$b.call(b, prop)) __defNormalProp$a(a, prop, b[prop]); if (__getOwnPropSymbols$b) for (var prop of __getOwnPropSymbols$b(b)) { if (__propIsEnum$b.call(b, prop)) __defNormalProp$a(a, prop, b[prop]); } return a; }; async function loadImage(options) { return new Promise((resolve, reject) => { const img = new Image(); const { src, srcset, sizes } = options; img.src = src; if (srcset) img.srcset = srcset; if (sizes) img.sizes = sizes; img.onload = () => resolve(img); img.onerror = reject; }); } const useImage = (options, asyncStateOptions = {}) => { const state = useAsyncState(() => loadImage(shared.resolveUnref(options)), void 0, __spreadValues$a({ resetOnExecute: true }, asyncStateOptions)); vueDemi.watch(() => shared.resolveUnref(options), () => state.execute(asyncStateOptions.delay), { deep: true }); return state; }; const ARRIVED_STATE_THRESHOLD_PIXELS = 1; function useScroll(element, options = {}) { const { throttle = 0, idle = 200, onStop = shared.noop, onScroll = shared.noop, offset = { left: 0, right: 0, top: 0, bottom: 0 }, eventListenerOptions = { capture: false, passive: true }, behavior = "auto" } = options; const internalX = vueDemi.ref(0); const internalY = vueDemi.ref(0); const x = vueDemi.computed({ get() { return internalX.value; }, set(x2) { scrollTo(x2, void 0); } }); const y = vueDemi.computed({ get() { return internalY.value; }, set(y2) { scrollTo(void 0, y2); } }); function scrollTo(_x, _y) { var _a, _b, _c; const _element = shared.resolveUnref(element); if (!_element) return; (_c = _element instanceof Document ? document.body : _element) == null ? void 0 : _c.scrollTo({ top: (_a = shared.resolveUnref(_y)) != null ? _a : y.value, left: (_b = shared.resolveUnref(_x)) != null ? _b : x.value, behavior: shared.resolveUnref(behavior) }); } const isScrolling = vueDemi.ref(false); const arrivedState = vueDemi.reactive({ left: true, right: false, top: true, bottom: false }); const directions = vueDemi.reactive({ left: false, right: false, top: false, bottom: false }); const onScrollEnd = (e) => { if (!isScrolling.value) return; isScrolling.value = false; directions.left = false; directions.right = false; directions.top = false; directions.bottom = false; onStop(e); }; const onScrollEndDebounced = shared.useDebounceFn(onScrollEnd, throttle + idle); const onScrollHandler = (e) => { const eventTarget = e.target === document ? e.target.documentElement : e.target; const scrollLeft = eventTarget.scrollLeft; directions.left = scrollLeft < internalX.value; directions.right = scrollLeft > internalY.value; arrivedState.left = scrollLeft <= 0 + (offset.left || 0); arrivedState.right = scrollLeft + eventTarget.clientWidth >= eventTarget.scrollWidth - (offset.right || 0) - ARRIVED_STATE_THRESHOLD_PIXELS; internalX.value = scrollLeft; let scrollTop = eventTarget.scrollTop; if (e.target === document && !scrollTop) scrollTop = document.body.scrollTop; directions.top = scrollTop < internalY.value; directions.bottom = scrollTop > internalY.value; arrivedState.top = scrollTop <= 0 + (offset.top || 0); arrivedState.bottom = scrollTop + eventTarget.clientHeight >= eventTarget.scrollHeight - (offset.bottom || 0) - ARRIVED_STATE_THRESHOLD_PIXELS; internalY.value = scrollTop; isScrolling.value = true; onScrollEndDebounced(e); onScroll(e); }; useEventListener(element, "scroll", throttle ? shared.useThrottleFn(onScrollHandler, throttle, true, false) : onScrollHandler, eventListenerOptions); useEventListener(element, "scrollend", onScrollEnd, eventListenerOptions); return { x, y, isScrolling, arrivedState, directions }; } var __defProp$9 = Object.defineProperty; var __defProps$2 = Object.defineProperties; var __getOwnPropDescs$2 = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols$a = Object.getOwnPropertySymbols; var __hasOwnProp$a = Object.prototype.hasOwnProperty; var __propIsEnum$a = Object.prototype.propertyIsEnumerable; var __defNormalProp$9 = (obj, key, value) => key in obj ? __defProp$9(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$9 = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$a.call(b, prop)) __defNormalProp$9(a, prop, b[prop]); if (__getOwnPropSymbols$a) for (var prop of __getOwnPropSymbols$a(b)) { if (__propIsEnum$a.call(b, prop)) __defNormalProp$9(a, prop, b[prop]); } return a; }; var __spreadProps$2 = (a, b) => __defProps$2(a, __getOwnPropDescs$2(b)); function useInfiniteScroll(element, onLoadMore, options = {}) { var _a, _b; const direction = (_a = options.direction) != null ? _a : "bottom"; const state = vueDemi.reactive(useScroll(element, __spreadProps$2(__spreadValues$9({}, options), { offset: __spreadValues$9({ [direction]: (_b = options.distance) != null ? _b : 0 }, options.offset) }))); vueDemi.watch(() => state.arrivedState[direction], async (v) => { var _a2, _b2; if (v) { const elem = shared.resolveUnref(element); const previous = { height: (_a2 = elem == null ? void 0 : elem.scrollHeight) != null ? _a2 : 0, width: (_b2 = elem == null ? void 0 : elem.scrollWidth) != null ? _b2 : 0 }; await onLoadMore(state); if (options.preserveScrollPosition && elem) { vueDemi.nextTick(() => { elem.scrollTo({ top: elem.scrollHeight - previous.height, left: elem.scrollWidth - previous.width }); }); } } }); } function useIntersectionObserver(target, callback, options = {}) { const { root, rootMargin = "0px", threshold = 0.1, window = defaultWindow } = options; const isSupported = useSupported(() => window && "IntersectionObserver" in window); let cleanup = shared.noop; const stopWatch = isSupported.value ? vueDemi.watch(() => ({ el: unrefElement(target), root: unrefElement(root) }), ({ el, root: root2 }) => { cleanup(); if (!el) return; const observer = new IntersectionObserver(callback, { root: root2, rootMargin, threshold }); observer.observe(el); cleanup = () => { observer.disconnect(); cleanup = shared.noop; }; }, { immediate: true, flush: "post" }) : shared.noop; const stop = () => { cleanup(); stopWatch(); }; shared.tryOnScopeDispose(stop); return { isSupported, stop }; } const defaultEvents = ["mousedown", "mouseup", "keydown", "keyup"]; function useKeyModifier(modifier, options = {}) { const { events = defaultEvents, document = defaultDocument, initial = null } = options; const state = vueDemi.ref(initial); if (document) { events.forEach((listenerEvent) => { useEventListener(document, listenerEvent, (evt) => { if (typeof evt.getModifierState === "function") state.value = evt.getModifierState(modifier); }); }); } return state; } function useLocalStorage(key, initialValue, options = {}) { const { window = defaultWindow } = options; return useStorage(key, initialValue, window == null ? void 0 : window.localStorage, options); } const DefaultMagicKeysAliasMap = { ctrl: "control", command: "meta", cmd: "meta", option: "alt", up: "arrowup", down: "arrowdown", left: "arrowleft", right: "arrowright" }; function useMagicKeys(options = {}) { const { reactive: useReactive = false, target = defaultWindow, aliasMap = DefaultMagicKeysAliasMap, passive = true, onEventFired = shared.noop } = options; const current = vueDemi.reactive(new Set()); const obj = { toJSON() { return {}; }, current }; const refs = useReactive ? vueDemi.reactive(obj) : obj; const metaDeps = new Set(); const usedKeys = new Set(); function setRefs(key, value) { if (key in refs) { if (useReactive) refs[key] = value; else refs[key].value = value; } } function reset() { current.clear(); for (const key of usedKeys) setRefs(key, false); } function updateRefs(e, value) { var _a, _b; const key = (_a = e.key) == null ? void 0 : _a.toLowerCase(); const code = (_b = e.code) == null ? void 0 : _b.toLowerCase(); const values = [code, key].filter(Boolean); if (key) { if (value) current.add(key); else current.delete(key); } for (const key2 of values) { usedKeys.add(key2); setRefs(key2, value); } if (key === "meta" && !value) { metaDeps.forEach((key2) => { current.delete(key2); setRefs(key2, false); }); metaDeps.clear(); } else if (typeof e.getModifierState === "function" && e.getModifierState("Meta") && value) { [...current, ...values].forEach((key2) => metaDeps.add(key2)); } } useEventListener(target, "keydown", (e) => { updateRefs(e, true); return onEventFired(e); }, { passive }); useEventListener(target, "keyup", (e) => { updateRefs(e, false); return onEventFired(e); }, { passive }); useEventListener("blur", reset, { passive: true }); useEventListener("focus", reset, { passive: true }); const proxy = new Proxy(refs, { get(target2, prop, rec) { if (typeof prop !== "string") return Reflect.get(target2, prop, rec); prop = prop.toLowerCase(); if (prop in aliasMap) prop = aliasMap[prop]; if (!(prop in refs)) { if (/[+_-]/.test(prop)) { const keys = prop.split(/[+_-]/g).map((i) => i.trim()); refs[prop] = vueDemi.computed(() => keys.every((key) => vueDemi.unref(proxy[key]))); } else { refs[prop] = vueDemi.ref(false); } } const r = Reflect.get(target2, prop, rec); return useReactive ? vueDemi.unref(r) : r; } }); return proxy; } var __defProp$8 = Object.defineProperty; var __getOwnPropSymbols$9 = Object.getOwnPropertySymbols; var __hasOwnProp$9 = Object.prototype.hasOwnProperty; var __propIsEnum$9 = Object.prototype.propertyIsEnumerable; var __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$8 = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$9.call(b, prop)) __defNormalProp$8(a, prop, b[prop]); if (__getOwnPropSymbols$9) for (var prop of __getOwnPropSymbols$9(b)) { if (__propIsEnum$9.call(b, prop)) __defNormalProp$8(a, prop, b[prop]); } return a; }; function usingElRef(source, cb) { if (shared.resolveUnref(source)) cb(shared.resolveUnref(source)); } function timeRangeToArray(timeRanges) { let ranges = []; for (let i = 0; i < timeRanges.length; ++i) ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]]; return ranges; } function tracksToArray(tracks) { return Array.from(tracks).map(({ label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }, id) => ({ id, label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType })); } const defaultOptions = { src: "", tracks: [] }; function useMediaControls(target, options = {}) { options = __spreadValues$8(__spreadValues$8({}, defaultOptions), options); const { document = defaultDocument } = options; const currentTime = vueDemi.ref(0); const duration = vueDemi.ref(0); const seeking = vueDemi.ref(false); const volume = vueDemi.ref(1); const waiting = vueDemi.ref(false); const ended = vueDemi.ref(false); const playing = vueDemi.ref(false); const rate = vueDemi.ref(1); const stalled = vueDemi.ref(false); const buffered = vueDemi.ref([]); const tracks = vueDemi.ref([]); const selectedTrack = vueDemi.ref(-1); const isPictureInPicture = vueDemi.ref(false); const muted = vueDemi.ref(false); const supportsPictureInPicture = document && "pictureInPictureEnabled" in document; const sourceErrorEvent = shared.createEventHook(); const disableTrack = (track) => { usingElRef(target, (el) => { if (track) { const id = shared.isNumber(track) ? track : track.id; el.textTracks[id].mode = "disabled"; } else { for (let i = 0; i < el.textTracks.length; ++i) el.textTracks[i].mode = "disabled"; } selectedTrack.value = -1; }); }; const enableTrack = (track, disableTracks = true) => { usingElRef(target, (el) => { const id = shared.isNumber(track) ? track : track.id; if (disableTracks) disableTrack(); el.textTracks[id].mode = "showing"; selectedTrack.value = id; }); }; const togglePictureInPicture = () => { return new Promise((resolve, reject) => { usingElRef(target, async (el) => { if (supportsPictureInPicture) { if (!isPictureInPicture.value) { el.requestPictureInPicture().then(resolve).catch(reject); } else { document.exitPictureInPicture().then(resolve).catch(reject); } } }); }); }; vueDemi.watchEffect(() => { if (!document) return; const el = shared.resolveUnref(target); if (!el) return; const src = shared.resolveUnref(options.src); let sources = []; if (!src) return; if (shared.isString(src)) sources = [{ src }]; else if (Array.isArray(src)) sources = src; else if (shared.isObject(src)) sources = [src]; el.querySelectorAll("source").forEach((e) => { e.removeEventListener("error", sourceErrorEvent.trigger); e.remove(); }); sources.forEach(({ src: src2, type }) => { const source = document.createElement("source"); source.setAttribute("src", src2); source.setAttribute("type", type || ""); source.addEventListener("error", sourceErrorEvent.trigger); el.appendChild(source); }); el.load(); }); shared.tryOnScopeDispose(() => { const el = shared.resolveUnref(target); if (!el) return; el.querySelectorAll("source").forEach((e) => e.removeEventListener("error", sourceErrorEvent.trigger)); }); vueDemi.watch(volume, (vol) => { const el = shared.resolveUnref(target); if (!el) return; el.volume = vol; }); vueDemi.watch(muted, (mute) => { const el = shared.resolveUnref(target); if (!el) return; el.muted = mute; }); vueDemi.watch(rate, (rate2) => { const el = shared.resolveUnref(target); if (!el) return; el.playbackRate = rate2; }); vueDemi.watchEffect(() => { if (!document) return; const textTracks = shared.resolveUnref(options.tracks); const el = shared.resolveUnref(target); if (!textTracks || !textTracks.length || !el) return; el.querySelectorAll("track").forEach((e) => e.remove()); textTracks.forEach(({ default: isDefault, kind, label, src, srcLang }, i) => { const track = document.createElement("track"); track.default = isDefault || false; track.kind = kind; track.label = label; track.src = src; track.srclang = srcLang; if (track.default) selectedTrack.value = i; el.appendChild(track); }); }); const { ignoreUpdates: ignoreCurrentTimeUpdates } = shared.watchIgnorable(currentTime, (time) => { const el = shared.resolveUnref(target); if (!el) return; el.currentTime = time; }); const { ignoreUpdates: ignorePlayingUpdates } = shared.watchIgnorable(playing, (isPlaying) => { const el = shared.resolveUnref(target); if (!el) return; isPlaying ? el.play() : el.pause(); }); useEventListener(target, "timeupdate", () => ignoreCurrentTimeUpdates(() => currentTime.value = shared.resolveUnref(target).currentTime)); useEventListener(target, "durationchange", () => duration.value = shared.resolveUnref(target).duration); useEventListener(target, "progress", () => buffered.value = timeRangeToArray(shared.resolveUnref(target).buffered)); useEventListener(target, "seeking", () => seeking.value = true); useEventListener(target, "seeked", () => seeking.value = false); useEventListener(target, "waiting", () => waiting.value = true); useEventListener(target, "playing", () => { waiting.value = false; ended.value = false; }); useEventListener(target, "ratechange", () => rate.value = shared.resolveUnref(target).playbackRate); useEventListener(target, "stalled", () => stalled.value = true); useEventListener(target, "ended", () => ended.value = true); useEventListener(target, "pause", () => ignorePlayingUpdates(() => playing.value = false)); useEventListener(target, "play", () => ignorePlayingUpdates(() => playing.value = true)); useEventListener(target, "enterpictureinpicture", () => isPictureInPicture.value = true); useEventListener(target, "leavepictureinpicture", () => isPictureInPicture.value = false); useEventListener(target, "volumechange", () => { const el = shared.resolveUnref(target); if (!el) return; volume.value = el.volume; muted.value = el.muted; }); const listeners = []; const stop = vueDemi.watch([target], () => { const el = shared.resolveUnref(target); if (!el) return; stop(); listeners[0] = useEventListener(el.textTracks, "addtrack", () => tracks.value = tracksToArray(el.textTracks)); listeners[1] = useEventListener(el.textTracks, "removetrack", () => tracks.value = tracksToArray(el.textTracks)); listeners[2] = useEventListener(el.textTracks, "change", () => tracks.value = tracksToArray(el.textTracks)); }); shared.tryOnScopeDispose(() => listeners.forEach((listener) => listener())); return { currentTime, duration, waiting, seeking, ended, stalled, buffered, playing, rate, volume, muted, tracks, selectedTrack, enableTrack, disableTrack, supportsPictureInPicture, togglePictureInPicture, isPictureInPicture, onSourceError: sourceErrorEvent.on }; } const getMapVue2Compat = () => { const data = vueDemi.reactive({}); return { get: (key) => data[key], set: (key, value) => vueDemi.set(data, key, value), has: (key) => shared.hasOwn(data, key), delete: (key) => vueDemi.del(data, key), clear: () => { Object.keys(data).forEach((key) => { vueDemi.del(data, key); }); } }; }; function useMemoize(resolver, options) { const initCache = () => { if (options == null ? void 0 : options.cache) return vueDemi.reactive(options.cache); if (vueDemi.isVue2) return getMapVue2Compat(); return vueDemi.reactive(new Map()); }; const cache = initCache(); const generateKey = (...args) => (options == null ? void 0 : options.getKey) ? options.getKey(...args) : JSON.stringify(args); const _loadData = (key, ...args) => { cache.set(key, resolver(...args)); return cache.get(key); }; const loadData = (...args) => _loadData(generateKey(...args), ...args); const deleteData = (...args) => { cache.delete(generateKey(...args)); }; const clearData = () => { cache.clear(); }; const memoized = (...args) => { const key = generateKey(...args); if (cache.has(key)) return cache.get(key); return _loadData(key, ...args); }; memoized.load = loadData; memoized.delete = deleteData; memoized.clear = clearData; memoized.generateKey = generateKey; memoized.cache = cache; return memoized; } function useMemory(options = {}) { const memory = vueDemi.ref(); const isSupported = useSupported(() => typeof performance !== "undefined" && "memory" in performance); if (isSupported.value) { const { interval = 1e3 } = options; shared.useIntervalFn(() => { memory.value = performance.memory; }, interval, { immediate: options.immediate, immediateCallback: options.immediateCallback }); } return { isSupported, memory }; } function useMounted() { const isMounted = vueDemi.ref(false); vueDemi.onMounted(() => { isMounted.value = true; }); return isMounted; } function useMouse(options = {}) { const { type = "page", touch = true, resetOnTouchEnds = false, initialValue = { x: 0, y: 0 }, window = defaultWindow, eventFilter } = options; const x = vueDemi.ref(initialValue.x); const y = vueDemi.ref(initialValue.y); const sourceType = vueDemi.ref(null); const mouseHandler = (event) => { if (type === "page") { x.value = event.pageX; y.value = event.pageY; } else if (type === "client") { x.value = event.clientX; y.value = event.clientY; } else if (type === "movement") { x.value = event.movementX; y.value = event.movementY; } sourceType.value = "mouse"; }; const reset = () => { x.value = initialValue.x; y.value = initialValue.y; }; const touchHandler = (event) => { if (event.touches.length > 0) { const touch2 = event.touches[0]; if (type === "page") { x.value = touch2.pageX; y.value = touch2.pageY; } else if (type === "client") { x.value = touch2.clientX; y.value = touch2.clientY; } sourceType.value = "touch"; } }; const mouseHandlerWrapper = (event) => { return eventFilter === void 0 ? mouseHandler(event) : eventFilter(() => mouseHandler(event), {}); }; const touchHandlerWrapper = (event) => { return eventFilter === void 0 ? touchHandler(event) : eventFilter(() => touchHandler(event), {}); }; if (window) { useEventListener(window, "mousemove", mouseHandlerWrapper, { passive: true }); useEventListener(window, "dragover", mouseHandlerWrapper, { passive: true }); if (touch && type !== "movement") { useEventListener(window, "touchstart", touchHandlerWrapper, { passive: true }); useEventListener(window, "touchmove", touchHandlerWrapper, { passive: true }); if (resetOnTouchEnds) useEventListener(window, "touchend", reset, { passive: true }); } } return { x, y, sourceType }; } function useMouseInElement(target, options = {}) { const { handleOutside = true, window = defaultWindow } = options; const { x, y, sourceType } = useMouse(options); const targetRef = vueDemi.ref(target != null ? target : window == null ? void 0 : window.document.body); const elementX = vueDemi.ref(0); const elementY = vueDemi.ref(0); const elementPositionX = vueDemi.ref(0); const elementPositionY = vueDemi.ref(0); const elementHeight = vueDemi.ref(0); const elementWidth = vueDemi.ref(0); const isOutside = vueDemi.ref(true); let stop = () => { }; if (window) { stop = vueDemi.watch([targetRef, x, y], () => { const el = unrefElement(targetRef); if (!el) return; const { left, top, width, height } = el.getBoundingClientRect(); elementPositionX.value = left + window.pageXOffset; elementPositionY.value = top + window.pageYOffset; elementHeight.value = height; elementWidth.value = width; const elX = x.value - elementPositionX.value; const elY = y.value - elementPositionY.value; isOutside.value = width === 0 || height === 0 || elX < 0 || elY < 0 || elX > width || elY > height; if (handleOutside || !isOutside.value) { elementX.value = elX; elementY.value = elY; } }, { immediate: true }); useEventListener(document, "mouseleave", () => { isOutside.value = true; }); } return { x, y, sourceType, elementX, elementY, elementPositionX, elementPositionY, elementHeight, elementWidth, isOutside, stop }; } function useMousePressed(options = {}) { const { touch = true, drag = true, initialValue = false, window = defaultWindow } = options; const pressed = vueDemi.ref(initialValue); const sourceType = vueDemi.ref(null); if (!window) { return { pressed, sourceType }; } const onPressed = (srcType) => () => { pressed.value = true; sourceType.value = srcType; }; const onReleased = () => { pressed.value = false; sourceType.value = null; }; const target = vueDemi.computed(() => unrefElement(options.target) || window); useEventListener(target, "mousedown", onPressed("mouse"), { passive: true }); useEventListener(window, "mouseleave", onReleased, { passive: true }); useEventListener(window, "mouseup", onReleased, { passive: true }); if (drag) { useEventListener(target, "dragstart", onPressed("mouse"), { passive: true }); useEventListener(window, "drop", onReleased, { passive: true }); useEventListener(window, "dragend", onReleased, { passive: true }); } if (touch) { useEventListener(target, "touchstart", onPressed("touch"), { passive: true }); useEventListener(window, "touchend", onReleased, { passive: true }); useEventListener(window, "touchcancel", onReleased, { passive: true }); } return { pressed, sourceType }; } var __getOwnPropSymbols$8 = Object.getOwnPropertySymbols; var __hasOwnProp$8 = Object.prototype.hasOwnProperty; var __propIsEnum$8 = Object.prototype.propertyIsEnumerable; var __objRest$1 = (source, exclude) => { var target = {}; for (var prop in source) if (__hasOwnProp$8.call(source, prop) && exclude.indexOf(prop) < 0) target[prop] = source[prop]; if (source != null && __getOwnPropSymbols$8) for (var prop of __getOwnPropSymbols$8(source)) { if (exclude.indexOf(prop) < 0 && __propIsEnum$8.call(source, prop)) target[prop] = source[prop]; } return target; }; function useMutationObserver(target, callback, options = {}) { const _a = options, { window = defaultWindow } = _a, mutationOptions = __objRest$1(_a, ["window"]); let observer; const isSupported = useSupported(() => window && "MutationObserver" in window); const cleanup = () => { if (observer) { observer.disconnect(); observer = void 0; } }; const stopWatch = vueDemi.watch(() => unrefElement(target), (el) => { cleanup(); if (isSupported.value && window && el) { observer = new MutationObserver(callback); observer.observe(el, mutationOptions); } }, { immediate: true }); const stop = () => { cleanup(); stopWatch(); }; shared.tryOnScopeDispose(stop); return { isSupported, stop }; } const useNavigatorLanguage = (options = {}) => { const { window = defaultWindow } = options; const navigator = window == null ? void 0 : window.navigator; const isSupported = useSupported(() => navigator && "language" in navigator); const language = vueDemi.ref(navigator == null ? void 0 : navigator.language); useEventListener(window, "languagechange", () => { if (navigator) language.value = navigator.language; }); return { isSupported, language }; }; function useNetwork(options = {}) { const { window = defaultWindow } = options; const navigator = window == null ? void 0 : window.navigator; const isSupported = useSupported(() => navigator && "connection" in navigator); const isOnline = vueDemi.ref(true); const saveData = vueDemi.ref(false); const offlineAt = vueDemi.ref(void 0); const onlineAt = vueDemi.ref(void 0); const downlink = vueDemi.ref(void 0); const downlinkMax = vueDemi.ref(void 0); const rtt = vueDemi.ref(void 0); const effectiveType = vueDemi.ref(void 0); const type = vueDemi.ref("unknown"); const connection = isSupported.value && navigator.connection; function updateNetworkInformation() { if (!navigator) return; isOnline.value = navigator.onLine; offlineAt.value = isOnline.value ? void 0 : Date.now(); onlineAt.value = isOnline.value ? Date.now() : void 0; if (connection) { downlink.value = connection.downlink; downlinkMax.value = connection.downlinkMax; effectiveType.value = connection.effectiveType; rtt.value = connection.rtt; saveData.value = connection.saveData; type.value = connection.type; } } if (window) { useEventListener(window, "offline", () => { isOnline.value = false; offlineAt.value = Date.now(); }); useEventListener(window, "online", () => { isOnline.value = true; onlineAt.value = Date.now(); }); } if (connection) useEventListener(connection, "change", updateNetworkInformation, false); updateNetworkInformation(); return { isSupported, isOnline, saveData, offlineAt, onlineAt, downlink, downlinkMax, effectiveType, rtt, type }; } var __defProp$7 = Object.defineProperty; var __getOwnPropSymbols$7 = Object.getOwnPropertySymbols; var __hasOwnProp$7 = Object.prototype.hasOwnProperty; var __propIsEnum$7 = Object.prototype.propertyIsEnumerable; var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$7 = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$7.call(b, prop)) __defNormalProp$7(a, prop, b[prop]); if (__getOwnPropSymbols$7) for (var prop of __getOwnPropSymbols$7(b)) { if (__propIsEnum$7.call(b, prop)) __defNormalProp$7(a, prop, b[prop]); } return a; }; function useNow(options = {}) { const { controls: exposeControls = false, interval = "requestAnimationFrame" } = options; const now = vueDemi.ref(new Date()); const update = () => now.value = new Date(); const controls = interval === "requestAnimationFrame" ? useRafFn(update, { immediate: true }) : shared.useIntervalFn(update, interval, { immediate: true }); if (exposeControls) { return __spreadValues$7({ now }, controls); } else { return now; } } function useObjectUrl(object) { const url = vueDemi.ref(); const release = () => { if (url.value) URL.revokeObjectURL(url.value); url.value = void 0; }; vueDemi.watch(() => vueDemi.unref(object), (newObject) => { release(); if (newObject) url.value = URL.createObjectURL(newObject); }, { immediate: true }); shared.tryOnScopeDispose(release); return vueDemi.readonly(url); } function useClamp(value, min, max) { if (shared.isFunction(value) || vueDemi.isReadonly(value)) return vueDemi.computed(() => shared.clamp(shared.resolveUnref(value), shared.resolveUnref(min), shared.resolveUnref(max))); const _value = vueDemi.ref(value); return vueDemi.computed({ get() { return _value.value = shared.clamp(_value.value, shared.resolveUnref(min), shared.resolveUnref(max)); }, set(value2) { _value.value = shared.clamp(value2, shared.resolveUnref(min), shared.resolveUnref(max)); } }); } function useOffsetPagination(options) { const { total = Infinity, pageSize = 10, page = 1, onPageChange = shared.noop, onPageSizeChange = shared.noop, onPageCountChange = shared.noop } = options; const currentPageSize = useClamp(pageSize, 1, Infinity); const pageCount = vueDemi.computed(() => Math.max(1, Math.ceil(vueDemi.unref(total) / vueDemi.unref(currentPageSize)))); const currentPage = useClamp(page, 1, pageCount); const isFirstPage = vueDemi.computed(() => currentPage.value === 1); const isLastPage = vueDemi.computed(() => currentPage.value === pageCount.value); if (vueDemi.isRef(page)) shared.syncRef(page, currentPage); if (vueDemi.isRef(pageSize)) shared.syncRef(pageSize, currentPageSize); function prev() { currentPage.value--; } function next() { currentPage.value++; } const returnValue = { currentPage, currentPageSize, pageCount, isFirstPage, isLastPage, prev, next }; vueDemi.watch(currentPage, () => { onPageChange(vueDemi.reactive(returnValue)); }); vueDemi.watch(currentPageSize, () => { onPageSizeChange(vueDemi.reactive(returnValue)); }); vueDemi.watch(pageCount, () => { onPageCountChange(vueDemi.reactive(returnValue)); }); return returnValue; } function useOnline(options = {}) { const { isOnline } = useNetwork(options); return isOnline; } function usePageLeave(options = {}) { const { window = defaultWindow } = options; const isLeft = vueDemi.ref(false); const handler = (event) => { if (!window) return; event = event || window.event; const from = event.relatedTarget || event.toElement; isLeft.value = !from; }; if (window) { useEventListener(window, "mouseout", handler, { passive: true }); useEventListener(window.document, "mouseleave", handler, { passive: true }); useEventListener(window.document, "mouseenter", handler, { passive: true }); } return isLeft; } function useParallax(target, options = {}) { const { deviceOrientationTiltAdjust = (i) => i, deviceOrientationRollAdjust = (i) => i, mouseTiltAdjust = (i) => i, mouseRollAdjust = (i) => i, window = defaultWindow } = options; const orientation = vueDemi.reactive(useDeviceOrientation({ window })); const { elementX: x, elementY: y, elementWidth: width, elementHeight: height } = useMouseInElement(target, { handleOutside: false, window }); const source = vueDemi.computed(() => { if (orientation.isSupported && (orientation.alpha != null && orientation.alpha !== 0 || orientation.gamma != null && orientation.gamma !== 0)) return "deviceOrientation"; return "mouse"; }); const roll = vueDemi.computed(() => { if (source.value === "deviceOrientation") { const value = -orientation.beta / 90; return deviceOrientationRollAdjust(value); } else { const value = -(y.value - height.value / 2) / height.value; return mouseRollAdjust(value); } }); const tilt = vueDemi.computed(() => { if (source.value === "deviceOrientation") { const value = orientation.gamma / 90; return deviceOrientationTiltAdjust(value); } else { const value = (x.value - width.value / 2) / width.value; return mouseTiltAdjust(value); } }); return { roll, tilt, source }; } var __defProp$6 = Object.defineProperty; var __defProps$1 = Object.defineProperties; var __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols$6 = Object.getOwnPropertySymbols; var __hasOwnProp$6 = Object.prototype.hasOwnProperty; var __propIsEnum$6 = Object.prototype.propertyIsEnumerable; var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$6 = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$6.call(b, prop)) __defNormalProp$6(a, prop, b[prop]); if (__getOwnPropSymbols$6) for (var prop of __getOwnPropSymbols$6(b)) { if (__propIsEnum$6.call(b, prop)) __defNormalProp$6(a, prop, b[prop]); } return a; }; var __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b)); const defaultState = { x: 0, y: 0, pointerId: 0, pressure: 0, tiltX: 0, tiltY: 0, width: 0, height: 0, twist: 0, pointerType: null }; const keys = /* @__PURE__ */ Object.keys(defaultState); function usePointer(options = {}) { const { target = defaultWindow } = options; const isInside = vueDemi.ref(false); const state = vueDemi.ref(options.initialValue || {}); Object.assign(state.value, defaultState, state.value); const handler = (event) => { isInside.value = true; if (options.pointerTypes && !options.pointerTypes.includes(event.pointerType)) return; state.value = shared.objectPick(event, keys, false); }; if (target) { useEventListener(target, "pointerdown", handler, { passive: true }); useEventListener(target, "pointermove", handler, { passive: true }); useEventListener(target, "pointerleave", () => isInside.value = false, { passive: true }); } return __spreadProps$1(__spreadValues$6({}, shared.toRefs(state)), { isInside }); } function usePointerLock(target, options = {}) { const { document = defaultDocument, pointerLockOptions } = options; const isSupported = useSupported(() => document && "pointerLockElement" in document); const element = vueDemi.ref(); const triggerElement = vueDemi.ref(); let targetElement; if (isSupported.value) { useEventListener(document, "pointerlockchange", () => { var _a; const currentElement = (_a = document.pointerLockElement) != null ? _a : element.value; if (targetElement && currentElement === targetElement) { element.value = document.pointerLockElement; if (!element.value) targetElement = triggerElement.value = null; } }); useEventListener(document, "pointerlockerror", () => { var _a; const currentElement = (_a = document.pointerLockElement) != null ? _a : element.value; if (targetElement && currentElement === targetElement) { const action = document.pointerLockElement ? "release" : "acquire"; throw new Error(`Failed to ${action} pointer lock.`); } }); } async function lock(e, options2) { var _a; if (!isSupported.value) throw new Error("Pointer Lock API is not supported by your browser."); triggerElement.value = e instanceof Event ? e.currentTarget : null; targetElement = e instanceof Event ? (_a = unrefElement(target)) != null ? _a : triggerElement.value : unrefElement(e); if (!targetElement) throw new Error("Target element undefined."); targetElement.requestPointerLock(options2 != null ? options2 : pointerLockOptions); return await shared.until(element).toBe(targetElement); } async function unlock() { if (!element.value) return false; document.exitPointerLock(); await shared.until(element).toBeNull(); return true; } return { isSupported, element, triggerElement, lock, unlock }; } exports.SwipeDirection = void 0; (function(SwipeDirection2) { SwipeDirection2["UP"] = "UP"; SwipeDirection2["RIGHT"] = "RIGHT"; SwipeDirection2["DOWN"] = "DOWN"; SwipeDirection2["LEFT"] = "LEFT"; SwipeDirection2["NONE"] = "NONE"; })(exports.SwipeDirection || (exports.SwipeDirection = {})); function useSwipe(target, options = {}) { const { threshold = 50, onSwipe, onSwipeEnd, onSwipeStart, passive = true, window = defaultWindow } = options; const coordsStart = vueDemi.reactive({ x: 0, y: 0 }); const coordsEnd = vueDemi.reactive({ x: 0, y: 0 }); const diffX = vueDemi.computed(() => coordsStart.x - coordsEnd.x); const diffY = vueDemi.computed(() => coordsStart.y - coordsEnd.y); const { max, abs } = Math; const isThresholdExceeded = vueDemi.computed(() => max(abs(diffX.value), abs(diffY.value)) >= threshold); const isSwiping = vueDemi.ref(false); const direction = vueDemi.computed(() => { if (!isThresholdExceeded.value) return exports.SwipeDirection.NONE; if (abs(diffX.value) > abs(diffY.value)) { return diffX.value > 0 ? exports.SwipeDirection.LEFT : exports.SwipeDirection.RIGHT; } else { return diffY.value > 0 ? exports.SwipeDirection.UP : exports.SwipeDirection.DOWN; } }); const getTouchEventCoords = (e) => [e.touches[0].clientX, e.touches[0].clientY]; const updateCoordsStart = (x, y) => { coordsStart.x = x; coordsStart.y = y; }; const updateCoordsEnd = (x, y) => { coordsEnd.x = x; coordsEnd.y = y; }; let listenerOptions; const isPassiveEventSupported = checkPassiveEventSupport(window == null ? void 0 : window.document); if (!passive) listenerOptions = isPassiveEventSupported ? { passive: false, capture: true } : { capture: true }; else listenerOptions = isPassiveEventSupported ? { passive: true } : { capture: false }; const onTouchEnd = (e) => { if (isSwiping.value) onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value); isSwiping.value = false; }; const stops = [ useEventListener(target, "touchstart", (e) => { if (listenerOptions.capture && !listenerOptions.passive) e.preventDefault(); const [x, y] = getTouchEventCoords(e); updateCoordsStart(x, y); updateCoordsEnd(x, y); onSwipeStart == null ? void 0 : onSwipeStart(e); }, listenerOptions), useEventListener(target, "touchmove", (e) => { const [x, y] = getTouchEventCoords(e); updateCoordsEnd(x, y); if (!isSwiping.value && isThresholdExceeded.value) isSwiping.value = true; if (isSwiping.value) onSwipe == null ? void 0 : onSwipe(e); }, listenerOptions), useEventListener(target, "touchend", onTouchEnd, listenerOptions), useEventListener(target, "touchcancel", onTouchEnd, listenerOptions) ]; const stop = () => stops.forEach((s) => s()); return { isPassiveEventSupported, isSwiping, direction, coordsStart, coordsEnd, lengthX: diffX, lengthY: diffY, stop }; } function checkPassiveEventSupport(document) { if (!document) return false; let supportsPassive = false; const optionsBlock = { get passive() { supportsPassive = true; return false; } }; document.addEventListener("x", shared.noop, optionsBlock); document.removeEventListener("x", shared.noop); return supportsPassive; } function usePointerSwipe(target, options = {}) { const targetRef = shared.resolveRef(target); const { threshold = 50, onSwipe, onSwipeEnd, onSwipeStart } = options; const posStart = vueDemi.reactive({ x: 0, y: 0 }); const updatePosStart = (x, y) => { posStart.x = x; posStart.y = y; }; const posEnd = vueDemi.reactive({ x: 0, y: 0 }); const updatePosEnd = (x, y) => { posEnd.x = x; posEnd.y = y; }; const distanceX = vueDemi.computed(() => posStart.x - posEnd.x); const distanceY = vueDemi.computed(() => posStart.y - posEnd.y); const { max, abs } = Math; const isThresholdExceeded = vueDemi.computed(() => max(abs(distanceX.value), abs(distanceY.value)) >= threshold); const isSwiping = vueDemi.ref(false); const isPointerDown = vueDemi.ref(false); const direction = vueDemi.computed(() => { if (!isThresholdExceeded.value) return exports.SwipeDirection.NONE; if (abs(distanceX.value) > abs(distanceY.value)) { return distanceX.value > 0 ? exports.SwipeDirection.LEFT : exports.SwipeDirection.RIGHT; } else { return distanceY.value > 0 ? exports.SwipeDirection.UP : exports.SwipeDirection.DOWN; } }); const eventIsAllowed = (e) => { var _a, _b, _c; const isReleasingButton = e.buttons === 0; const isPrimaryButton = e.buttons === 1; return (_c = (_b = (_a = options.pointerTypes) == null ? void 0 : _a.includes(e.pointerType)) != null ? _b : isReleasingButton || isPrimaryButton) != null ? _c : true; }; const stops = [ useEventListener(target, "pointerdown", (e) => { var _a, _b; if (!eventIsAllowed(e)) return; isPointerDown.value = true; (_b = (_a = targetRef.value) == null ? void 0 : _a.style) == null ? void 0 : _b.setProperty("touch-action", "none"); const eventTarget = e.target; eventTarget == null ? void 0 : eventTarget.setPointerCapture(e.pointerId); const { clientX: x, clientY: y } = e; updatePosStart(x, y); updatePosEnd(x, y); onSwipeStart == null ? void 0 : onSwipeStart(e); }), useEventListener(target, "pointermove", (e) => { if (!eventIsAllowed(e)) return; if (!isPointerDown.value) return; const { clientX: x, clientY: y } = e; updatePosEnd(x, y); if (!isSwiping.value && isThresholdExceeded.value) isSwiping.value = true; if (isSwiping.value) onSwipe == null ? void 0 : onSwipe(e); }), useEventListener(target, "pointerup", (e) => { var _a, _b; if (!eventIsAllowed(e)) return; if (isSwiping.value) onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value); isPointerDown.value = false; isSwiping.value = false; (_b = (_a = targetRef.value) == null ? void 0 : _a.style) == null ? void 0 : _b.setProperty("touch-action", "initial"); }) ]; const stop = () => stops.forEach((s) => s()); return { isSwiping: vueDemi.readonly(isSwiping), direction: vueDemi.readonly(direction), posStart: vueDemi.readonly(posStart), posEnd: vueDemi.readonly(posEnd), distanceX, distanceY, stop }; } function usePreferredColorScheme(options) { const isLight = useMediaQuery("(prefers-color-scheme: light)", options); const isDark = useMediaQuery("(prefers-color-scheme: dark)", options); return vueDemi.computed(() => { if (isDark.value) return "dark"; if (isLight.value) return "light"; return "no-preference"; }); } function usePreferredContrast(options) { const isMore = useMediaQuery("(prefers-contrast: more)", options); const isLess = useMediaQuery("(prefers-contrast: less)", options); const isCustom = useMediaQuery("(prefers-contrast: custom)", options); return vueDemi.computed(() => { if (isMore.value) return "more"; if (isLess.value) return "less"; if (isCustom.value) return "custom"; return "no-preference"; }); } function usePreferredLanguages(options = {}) { const { window = defaultWindow } = options; if (!window) return vueDemi.ref(["en"]); const navigator = window.navigator; const value = vueDemi.ref(navigator.languages); useEventListener(window, "languagechange", () => { value.value = navigator.languages; }); return value; } function usePreferredReducedMotion(options) { const isReduced = useMediaQuery("(prefers-reduced-motion: reduce)", options); return vueDemi.computed(() => { if (isReduced.value) return "reduce"; return "no-preference"; }); } function usePrevious(value, initialValue) { const previous = vueDemi.shallowRef(initialValue); vueDemi.watch(shared.resolveRef(value), (_, oldValue) => { previous.value = oldValue; }, { flush: "sync" }); return vueDemi.readonly(previous); } const useScreenOrientation = (options = {}) => { const { window = defaultWindow } = options; const isSupported = useSupported(() => window && "screen" in window && "orientation" in window.screen); const screenOrientation = isSupported.value ? window.screen.orientation : {}; const orientation = vueDemi.ref(screenOrientation.type); const angle = vueDemi.ref(screenOrientation.angle || 0); if (isSupported.value) { useEventListener(window, "orientationchange", () => { orientation.value = screenOrientation.type; angle.value = screenOrientation.angle; }); } const lockOrientation = (type) => { if (!isSupported.value) return Promise.reject(new Error("Not supported")); return screenOrientation.lock(type); }; const unlockOrientation = () => { if (isSupported.value) screenOrientation.unlock(); }; return { isSupported, orientation, angle, lockOrientation, unlockOrientation }; }; const topVarName = "--vueuse-safe-area-top"; const rightVarName = "--vueuse-safe-area-right"; const bottomVarName = "--vueuse-safe-area-bottom"; const leftVarName = "--vueuse-safe-area-left"; function useScreenSafeArea() { const top = vueDemi.ref(""); const right = vueDemi.ref(""); const bottom = vueDemi.ref(""); const left = vueDemi.ref(""); if (shared.isClient) { const topCssVar = useCssVar(topVarName); const rightCssVar = useCssVar(rightVarName); const bottomCssVar = useCssVar(bottomVarName); const leftCssVar = useCssVar(leftVarName); topCssVar.value = "env(safe-area-inset-top, 0px)"; rightCssVar.value = "env(safe-area-inset-right, 0px)"; bottomCssVar.value = "env(safe-area-inset-bottom, 0px)"; leftCssVar.value = "env(safe-area-inset-left, 0px)"; update(); useEventListener("resize", shared.useDebounceFn(update)); } function update() { top.value = getValue(topVarName); right.value = getValue(rightVarName); bottom.value = getValue(bottomVarName); left.value = getValue(leftVarName); } return { top, right, bottom, left, update }; } function getValue(position) { return getComputedStyle(document.documentElement).getPropertyValue(position); } function useScriptTag(src, onLoaded = shared.noop, options = {}) { const { immediate = true, manual = false, type = "text/javascript", async = true, crossOrigin, referrerPolicy, noModule, defer, document = defaultDocument, attrs = {} } = options; const scriptTag = vueDemi.ref(null); let _promise = null; const loadScript = (waitForScriptLoad) => new Promise((resolve, reject) => { const resolveWithElement = (el2) => { scriptTag.value = el2; resolve(el2); return el2; }; if (!document) { resolve(false); return; } let shouldAppend = false; let el = document.querySelector(`script[src="${shared.resolveUnref(src)}"]`); if (!el) { el = document.createElement("script"); el.type = type; el.async = async; el.src = shared.resolveUnref(src); if (defer) el.defer = defer; if (crossOrigin) el.crossOrigin = crossOrigin; if (noModule) el.noModule = noModule; if (referrerPolicy) el.referrerPolicy = referrerPolicy; Object.entries(attrs).forEach(([name, value]) => el == null ? void 0 : el.setAttribute(name, value)); shouldAppend = true; } else if (el.hasAttribute("data-loaded")) { resolveWithElement(el); } el.addEventListener("error", (event) => reject(event)); el.addEventListener("abort", (event) => reject(event)); el.addEventListener("load", () => { el.setAttribute("data-loaded", "true"); onLoaded(el); resolveWithElement(el); }); if (shouldAppend) el = document.head.appendChild(el); if (!waitForScriptLoad) resolveWithElement(el); }); const load = (waitForScriptLoad = true) => { if (!_promise) _promise = loadScript(waitForScriptLoad); return _promise; }; const unload = () => { if (!document) return; _promise = null; if (scriptTag.value) scriptTag.value = null; const el = document.querySelector(`script[src="${shared.resolveUnref(src)}"]`); if (el) document.head.removeChild(el); }; if (immediate && !manual) shared.tryOnMounted(load); if (!manual) shared.tryOnUnmounted(unload); return { scriptTag, load, unload }; } function checkOverflowScroll(ele) { const style = window.getComputedStyle(ele); if (style.overflowX === "scroll" || style.overflowY === "scroll" || style.overflowX === "auto" && ele.clientHeight < ele.scrollHeight || style.overflowY === "auto" && ele.clientWidth < ele.scrollWidth) { return true; } else { const parent = ele.parentNode; if (!parent || parent.tagName === "BODY") return false; return checkOverflowScroll(parent); } } function preventDefault(rawEvent) { const e = rawEvent || window.event; const _target = e.target; if (checkOverflowScroll(_target)) return false; if (e.touches.length > 1) return true; if (e.preventDefault) e.preventDefault(); return false; } function useScrollLock(element, initialState = false) { const isLocked = vueDemi.ref(initialState); let stopTouchMoveListener = null; let initialOverflow; vueDemi.watch(shared.resolveRef(element), (el) => { if (el) { const ele = el; initialOverflow = ele.style.overflow; if (isLocked.value) ele.style.overflow = "hidden"; } }, { immediate: true }); const lock = () => { const ele = shared.resolveUnref(element); if (!ele || isLocked.value) return; if (shared.isIOS) { stopTouchMoveListener = useEventListener(ele, "touchmove", (e) => { preventDefault(e); }, { passive: false }); } ele.style.overflow = "hidden"; isLocked.value = true; }; const unlock = () => { const ele = shared.resolveUnref(element); if (!ele || !isLocked.value) return; shared.isIOS && (stopTouchMoveListener == null ? void 0 : stopTouchMoveListener()); ele.style.overflow = initialOverflow; isLocked.value = false; }; shared.tryOnScopeDispose(unlock); return vueDemi.computed({ get() { return isLocked.value; }, set(v) { if (v) lock(); else unlock(); } }); } function useSessionStorage(key, initialValue, options = {}) { const { window = defaultWindow } = options; return useStorage(key, initialValue, window == null ? void 0 : window.sessionStorage, options); } var __defProp$5 = Object.defineProperty; var __getOwnPropSymbols$5 = Object.getOwnPropertySymbols; var __hasOwnProp$5 = Object.prototype.hasOwnProperty; var __propIsEnum$5 = Object.prototype.propertyIsEnumerable; var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$5 = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$5.call(b, prop)) __defNormalProp$5(a, prop, b[prop]); if (__getOwnPropSymbols$5) for (var prop of __getOwnPropSymbols$5(b)) { if (__propIsEnum$5.call(b, prop)) __defNormalProp$5(a, prop, b[prop]); } return a; }; function useShare(shareOptions = {}, options = {}) { const { navigator = defaultNavigator } = options; const _navigator = navigator; const isSupported = useSupported(() => _navigator && "canShare" in _navigator); const share = async (overrideOptions = {}) => { if (isSupported.value) { const data = __spreadValues$5(__spreadValues$5({}, shared.resolveUnref(shareOptions)), shared.resolveUnref(overrideOptions)); let granted = true; if (data.files && _navigator.canShare) granted = _navigator.canShare({ files: data.files }); if (granted) return _navigator.share(data); } }; return { isSupported, share }; } const defaultSortFn = (source, compareFn) => source.sort(compareFn); const defaultCompare = (a, b) => a - b; function useSorted(...args) { var _a, _b, _c, _d; const [source] = args; let compareFn = defaultCompare; let options = {}; if (args.length === 2) { if (typeof args[1] === "object") { options = args[1]; compareFn = (_a = options.compareFn) != null ? _a : defaultCompare; } else { compareFn = (_b = args[1]) != null ? _b : defaultCompare; } } else if (args.length > 2) { compareFn = (_c = args[1]) != null ? _c : defaultCompare; options = (_d = args[2]) != null ? _d : {}; } const { dirty = false, sortFn = defaultSortFn } = options; if (!dirty) return vueDemi.computed(() => sortFn([...vueDemi.unref(source)], compareFn)); vueDemi.watchEffect(() => { const result = sortFn(vueDemi.unref(source), compareFn); if (vueDemi.isRef(source)) source.value = result; else source.splice(0, source.length, ...result); }); return source; } function useSpeechRecognition(options = {}) { const { interimResults = true, continuous = true, window = defaultWindow } = options; const lang = shared.resolveRef(options.lang || "en-US"); const isListening = vueDemi.ref(false); const isFinal = vueDemi.ref(false); const result = vueDemi.ref(""); const error = vueDemi.shallowRef(void 0); const toggle = (value = !isListening.value) => { isListening.value = value; }; const start = () => { isListening.value = true; }; const stop = () => { isListening.value = false; }; const SpeechRecognition = window && (window.SpeechRecognition || window.webkitSpeechRecognition); const isSupported = useSupported(() => SpeechRecognition); let recognition; if (isSupported.value) { recognition = new SpeechRecognition(); recognition.continuous = continuous; recognition.interimResults = interimResults; recognition.lang = vueDemi.unref(lang); recognition.onstart = () => { isFinal.value = false; }; vueDemi.watch(lang, (lang2) => { if (recognition && !isListening.value) recognition.lang = lang2; }); recognition.onresult = (event) => { const transcript = Array.from(event.results).map((result2) => { isFinal.value = result2.isFinal; return result2[0]; }).map((result2) => result2.transcript).join(""); result.value = transcript; error.value = void 0; }; recognition.onerror = (event) => { error.value = event; }; recognition.onend = () => { isListening.value = false; recognition.lang = vueDemi.unref(lang); }; vueDemi.watch(isListening, () => { if (isListening.value) recognition.start(); else recognition.stop(); }); } shared.tryOnScopeDispose(() => { isListening.value = false; }); return { isSupported, isListening, isFinal, recognition, result, error, toggle, start, stop }; } function useSpeechSynthesis(text, options = {}) { const { pitch = 1, rate = 1, volume = 1, window = defaultWindow } = options; const synth = window && window.speechSynthesis; const isSupported = useSupported(() => synth); const isPlaying = vueDemi.ref(false); const status = vueDemi.ref("init"); const spokenText = shared.resolveRef(text || ""); const lang = shared.resolveRef(options.lang || "en-US"); const error = vueDemi.shallowRef(void 0); const toggle = (value = !isPlaying.value) => { isPlaying.value = value; }; const bindEventsForUtterance = (utterance2) => { utterance2.lang = vueDemi.unref(lang); utterance2.voice = vueDemi.unref(options.voice) || null; utterance2.pitch = pitch; utterance2.rate = rate; utterance2.volume = volume; utterance2.onstart = () => { isPlaying.value = true; status.value = "play"; }; utterance2.onpause = () => { isPlaying.value = false; status.value = "pause"; }; utterance2.onresume = () => { isPlaying.value = true; status.value = "play"; }; utterance2.onend = () => { isPlaying.value = false; status.value = "end"; }; utterance2.onerror = (event) => { error.value = event; }; }; const utterance = vueDemi.computed(() => { isPlaying.value = false; status.value = "init"; const newUtterance = new SpeechSynthesisUtterance(spokenText.value); bindEventsForUtterance(newUtterance); return newUtterance; }); const speak = () => { synth.cancel(); utterance && synth.speak(utterance.value); }; const stop = () => { synth.cancel(); isPlaying.value = false; }; if (isSupported.value) { bindEventsForUtterance(utterance.value); vueDemi.watch(lang, (lang2) => { if (utterance.value && !isPlaying.value) utterance.value.lang = lang2; }); if (options.voice) { vueDemi.watch(options.voice, () => { synth.cancel(); }); } vueDemi.watch(isPlaying, () => { if (isPlaying.value) synth.resume(); else synth.pause(); }); } shared.tryOnScopeDispose(() => { isPlaying.value = false; }); return { isSupported, isPlaying, status, utterance, error, stop, toggle, speak }; } function useStepper(steps, initialStep) { const stepsRef = vueDemi.ref(steps); const stepNames = vueDemi.computed(() => Array.isArray(stepsRef.value) ? stepsRef.value : Object.keys(stepsRef.value)); const index = vueDemi.ref(stepNames.value.indexOf(initialStep != null ? initialStep : stepNames.value[0])); const current = vueDemi.computed(() => at(index.value)); const isFirst = vueDemi.computed(() => index.value === 0); const isLast = vueDemi.computed(() => index.value === stepNames.value.length - 1); const next = vueDemi.computed(() => stepNames.value[index.value + 1]); const previous = vueDemi.computed(() => stepNames.value[index.value - 1]); function at(index2) { if (Array.isArray(stepsRef.value)) return stepsRef.value[index2]; return stepsRef.value[stepNames.value[index2]]; } function get(step) { if (!stepNames.value.includes(step)) return; return at(stepNames.value.indexOf(step)); } function goTo(step) { if (stepNames.value.includes(step)) index.value = stepNames.value.indexOf(step); } function goToNext() { if (isLast.value) return; index.value++; } function goToPrevious() { if (isFirst.value) return; index.value--; } function goBackTo(step) { if (isAfter(step)) goTo(step); } function isNext(step) { return stepNames.value.indexOf(step) === index.value + 1; } function isPrevious(step) { return stepNames.value.indexOf(step) === index.value - 1; } function isCurrent(step) { return stepNames.value.indexOf(step) === index.value; } function isBefore(step) { return index.value < stepNames.value.indexOf(step); } function isAfter(step) { return index.value > stepNames.value.indexOf(step); } return { steps: stepsRef, stepNames, index, current, next, previous, isFirst, isLast, at, get, goTo, goToNext, goToPrevious, goBackTo, isNext, isPrevious, isCurrent, isBefore, isAfter }; } var __defProp$4 = Object.defineProperty; var __getOwnPropSymbols$4 = Object.getOwnPropertySymbols; var __hasOwnProp$4 = Object.prototype.hasOwnProperty; var __propIsEnum$4 = Object.prototype.propertyIsEnumerable; var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$4 = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$4.call(b, prop)) __defNormalProp$4(a, prop, b[prop]); if (__getOwnPropSymbols$4) for (var prop of __getOwnPropSymbols$4(b)) { if (__propIsEnum$4.call(b, prop)) __defNormalProp$4(a, prop, b[prop]); } return a; }; function useStorageAsync(key, initialValue, storage, options = {}) { var _a; const { flush = "pre", deep = true, listenToStorageChanges = true, writeDefaults = true, mergeDefaults = false, shallow, window = defaultWindow, eventFilter, onError = (e) => { console.error(e); } } = options; const rawInit = shared.resolveUnref(initialValue); const type = guessSerializerType(rawInit); const data = (shallow ? vueDemi.shallowRef : vueDemi.ref)(initialValue); const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type]; if (!storage) { try { storage = getSSRHandler("getDefaultStorage", () => { var _a2; return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage; })(); } catch (e) { onError(e); } } async function read(event) { if (!storage || event && event.key !== key) return; try { const rawValue = event ? event.newValue : await storage.getItem(key); if (rawValue == null) { data.value = rawInit; if (writeDefaults && rawInit !== null) await storage.setItem(key, await serializer.write(rawInit)); } else if (mergeDefaults) { const value = await serializer.read(rawValue); if (shared.isFunction(mergeDefaults)) data.value = mergeDefaults(value, rawInit); else if (type === "object" && !Array.isArray(value)) data.value = __spreadValues$4(__spreadValues$4({}, rawInit), value); else data.value = value; } else { data.value = await serializer.read(rawValue); } } catch (e) { onError(e); } } read(); if (window && listenToStorageChanges) useEventListener(window, "storage", (e) => setTimeout(() => read(e), 0)); if (storage) { shared.watchWithFilter(data, async () => { try { if (data.value == null) await storage.removeItem(key); else await storage.setItem(key, await serializer.write(data.value)); } catch (e) { onError(e); } }, { flush, deep, eventFilter }); } return data; } let _id = 0; function useStyleTag(css, options = {}) { const isLoaded = vueDemi.ref(false); const { document = defaultDocument, immediate = true, manual = false, id = `vueuse_styletag_${++_id}` } = options; const cssRef = vueDemi.ref(css); let stop = () => { }; const load = () => { if (!document) return; const el = document.getElementById(id) || document.createElement("style"); if (!el.isConnected) { el.type = "text/css"; el.id = id; if (options.media) el.media = options.media; document.head.appendChild(el); } if (isLoaded.value) return; stop = vueDemi.watch(cssRef, (value) => { el.textContent = value; }, { immediate: true }); isLoaded.value = true; }; const unload = () => { if (!document || !isLoaded.value) return; stop(); document.head.removeChild(document.getElementById(id)); isLoaded.value = false; }; if (immediate && !manual) shared.tryOnMounted(load); if (!manual) shared.tryOnScopeDispose(unload); return { id, css: cssRef, unload, load, isLoaded: vueDemi.readonly(isLoaded) }; } function useTemplateRefsList() { const refs = vueDemi.ref([]); refs.value.set = (el) => { if (el) refs.value.push(el); }; vueDemi.onBeforeUpdate(() => { refs.value.length = 0; }); return refs; } function useTextDirection(options = {}) { const { document = defaultDocument, selector = "html", observe = false, initialValue = "ltr" } = options; function getValue() { var _a, _b; return (_b = (_a = document == null ? void 0 : document.querySelector(selector)) == null ? void 0 : _a.getAttribute("dir")) != null ? _b : initialValue; } const dir = vueDemi.ref(getValue()); shared.tryOnMounted(() => dir.value = getValue()); if (observe && document) { useMutationObserver(document.querySelector(selector), () => dir.value = getValue(), { attributes: true }); } return vueDemi.computed({ get() { return dir.value; }, set(v) { var _a, _b; dir.value = v; if (!document) return; if (dir.value) (_a = document.querySelector(selector)) == null ? void 0 : _a.setAttribute("dir", dir.value); else (_b = document.querySelector(selector)) == null ? void 0 : _b.removeAttribute("dir"); } }); } function getRangesFromSelection(selection) { var _a; const rangeCount = (_a = selection.rangeCount) != null ? _a : 0; const ranges = new Array(rangeCount); for (let i = 0; i < rangeCount; i++) { const range = selection.getRangeAt(i); ranges[i] = range; } return ranges; } function useTextSelection(options = {}) { const { window = defaultWindow } = options; const selection = vueDemi.ref(null); const text = vueDemi.computed(() => { var _a, _b; return (_b = (_a = selection.value) == null ? void 0 : _a.toString()) != null ? _b : ""; }); const ranges = vueDemi.computed(() => selection.value ? getRangesFromSelection(selection.value) : []); const rects = vueDemi.computed(() => ranges.value.map((range) => range.getBoundingClientRect())); function onSelectionChange() { selection.value = null; if (window) selection.value = window.getSelection(); } if (window) useEventListener(window.document, "selectionchange", onSelectionChange); return { text, rects, ranges, selection }; } function useTextareaAutosize(options) { const textarea = vueDemi.ref(options == null ? void 0 : options.element); const input = vueDemi.ref(options == null ? void 0 : options.input); function triggerResize() { var _a, _b; if (!textarea.value) return; textarea.value.style.height = "1px"; textarea.value.style.height = `${(_a = textarea.value) == null ? void 0 : _a.scrollHeight}px`; (_b = options == null ? void 0 : options.onResize) == null ? void 0 : _b.call(options); } vueDemi.watch([input, textarea], triggerResize, { immediate: true }); useResizeObserver(textarea, () => triggerResize()); if (options == null ? void 0 : options.watch) vueDemi.watch(options.watch, triggerResize, { immediate: true, deep: true }); return { textarea, input, triggerResize }; } var __defProp$3 = Object.defineProperty; var __defProps = Object.defineProperties; var __getOwnPropDescs = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols$3 = Object.getOwnPropertySymbols; var __hasOwnProp$3 = Object.prototype.hasOwnProperty; var __propIsEnum$3 = Object.prototype.propertyIsEnumerable; var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$3 = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$3.call(b, prop)) __defNormalProp$3(a, prop, b[prop]); if (__getOwnPropSymbols$3) for (var prop of __getOwnPropSymbols$3(b)) { if (__propIsEnum$3.call(b, prop)) __defNormalProp$3(a, prop, b[prop]); } return a; }; var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); function useThrottledRefHistory(source, options = {}) { const { throttle = 200, trailing = true } = options; const filter = shared.throttleFilter(throttle, trailing); const history = useRefHistory(source, __spreadProps(__spreadValues$3({}, options), { eventFilter: filter })); return __spreadValues$3({}, history); } var __defProp$2 = Object.defineProperty; var __getOwnPropSymbols$2 = Object.getOwnPropertySymbols; var __hasOwnProp$2 = Object.prototype.hasOwnProperty; var __propIsEnum$2 = Object.prototype.propertyIsEnumerable; var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$2 = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$2.call(b, prop)) __defNormalProp$2(a, prop, b[prop]); if (__getOwnPropSymbols$2) for (var prop of __getOwnPropSymbols$2(b)) { if (__propIsEnum$2.call(b, prop)) __defNormalProp$2(a, prop, b[prop]); } return a; }; var __objRest = (source, exclude) => { var target = {}; for (var prop in source) if (__hasOwnProp$2.call(source, prop) && exclude.indexOf(prop) < 0) target[prop] = source[prop]; if (source != null && __getOwnPropSymbols$2) for (var prop of __getOwnPropSymbols$2(source)) { if (exclude.indexOf(prop) < 0 && __propIsEnum$2.call(source, prop)) target[prop] = source[prop]; } return target; }; const DEFAULT_UNITS = [ { max: 6e4, value: 1e3, name: "second" }, { max: 276e4, value: 6e4, name: "minute" }, { max: 72e6, value: 36e5, name: "hour" }, { max: 5184e5, value: 864e5, name: "day" }, { max: 24192e5, value: 6048e5, name: "week" }, { max: 28512e6, value: 2592e6, name: "month" }, { max: Infinity, value: 31536e6, name: "year" } ]; const DEFAULT_MESSAGES = { justNow: "just now", past: (n) => n.match(/\d/) ? `${n} ago` : n, future: (n) => n.match(/\d/) ? `in ${n}` : n, month: (n, past) => n === 1 ? past ? "last month" : "next month" : `${n} month${n > 1 ? "s" : ""}`, year: (n, past) => n === 1 ? past ? "last year" : "next year" : `${n} year${n > 1 ? "s" : ""}`, day: (n, past) => n === 1 ? past ? "yesterday" : "tomorrow" : `${n} day${n > 1 ? "s" : ""}`, week: (n, past) => n === 1 ? past ? "last week" : "next week" : `${n} week${n > 1 ? "s" : ""}`, hour: (n) => `${n} hour${n > 1 ? "s" : ""}`, minute: (n) => `${n} minute${n > 1 ? "s" : ""}`, second: (n) => `${n} second${n > 1 ? "s" : ""}`, invalid: "" }; const DEFAULT_FORMATTER = (date) => date.toISOString().slice(0, 10); function useTimeAgo(time, options = {}) { const { controls: exposeControls = false, updateInterval = 3e4 } = options; const _a = useNow({ interval: updateInterval, controls: true }), { now } = _a, controls = __objRest(_a, ["now"]); const timeAgo = vueDemi.computed(() => formatTimeAgo(new Date(shared.resolveUnref(time)), options, vueDemi.unref(now.value))); if (exposeControls) { return __spreadValues$2({ timeAgo }, controls); } else { return timeAgo; } } function formatTimeAgo(from, options = {}, now = Date.now()) { var _a; const { max, messages = DEFAULT_MESSAGES, fullDateFormatter = DEFAULT_FORMATTER, units = DEFAULT_UNITS, showSecond = false, rounding = "round" } = options; const roundFn = typeof rounding === "number" ? (n) => +n.toFixed(rounding) : Math[rounding]; const diff = +now - +from; const absDiff = Math.abs(diff); function getValue(diff2, unit) { return roundFn(Math.abs(diff2) / unit.value); } function format(diff2, unit) { const val = getValue(diff2, unit); const past = diff2 > 0; const str = applyFormat(unit.name, val, past); return applyFormat(past ? "past" : "future", str, past); } function applyFormat(name, val, isPast) { const formatter = messages[name]; if (typeof formatter === "function") return formatter(val, isPast); return formatter.replace("{0}", val.toString()); } if (absDiff < 6e4 && !showSecond) return messages.justNow; if (typeof max === "number" && absDiff > max) return fullDateFormatter(new Date(from)); if (typeof max === "string") { const unitMax = (_a = units.find((i) => i.name === max)) == null ? void 0 : _a.max; if (unitMax && absDiff > unitMax) return fullDateFormatter(new Date(from)); } for (const [idx, unit] of units.entries()) { const val = getValue(diff, unit); if (val <= 0 && units[idx - 1]) return format(diff, units[idx - 1]); if (absDiff < unit.max) return format(diff, unit); } return messages.invalid; } function useTimeoutPoll(fn, interval, timeoutPollOptions) { const { start } = shared.useTimeoutFn(loop, interval); const isActive = vueDemi.ref(false); async function loop() { if (!isActive.value) return; await fn(); start(); } function resume() { if (!isActive.value) { isActive.value = true; loop(); } } function pause() { isActive.value = false; } if (timeoutPollOptions == null ? void 0 : timeoutPollOptions.immediate) resume(); shared.tryOnScopeDispose(pause); return { isActive, pause, resume }; } var __defProp$1 = Object.defineProperty; var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols; var __hasOwnProp$1 = Object.prototype.hasOwnProperty; var __propIsEnum$1 = Object.prototype.propertyIsEnumerable; var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues$1 = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp$1.call(b, prop)) __defNormalProp$1(a, prop, b[prop]); if (__getOwnPropSymbols$1) for (var prop of __getOwnPropSymbols$1(b)) { if (__propIsEnum$1.call(b, prop)) __defNormalProp$1(a, prop, b[prop]); } return a; }; function useTimestamp(options = {}) { const { controls: exposeControls = false, offset = 0, immediate = true, interval = "requestAnimationFrame", callback } = options; const ts = vueDemi.ref(shared.timestamp() + offset); const update = () => ts.value = shared.timestamp() + offset; const cb = callback ? () => { update(); callback(ts.value); } : update; const controls = interval === "requestAnimationFrame" ? useRafFn(cb, { immediate }) : shared.useIntervalFn(cb, interval, { immediate }); if (exposeControls) { return __spreadValues$1({ timestamp: ts }, controls); } else { return ts; } } function useTitle(newTitle = null, options = {}) { var _a, _b; const { document = defaultDocument } = options; const title = shared.resolveRef((_a = newTitle != null ? newTitle : document == null ? void 0 : document.title) != null ? _a : null); const isReadonly = newTitle && shared.isFunction(newTitle); function format(t) { if (!("titleTemplate" in options)) return t; const template = options.titleTemplate || "%s"; return shared.isFunction(template) ? template(t) : vueDemi.unref(template).replace(/%s/g, t); } vueDemi.watch(title, (t, o) => { if (t !== o && document) document.title = format(shared.isString(t) ? t : ""); }, { immediate: true }); if (options.observe && !options.titleTemplate && document && !isReadonly) { useMutationObserver((_b = document.head) == null ? void 0 : _b.querySelector("title"), () => { if (document && document.title !== title.value) title.value = format(document.title); }, { childList: true }); } return title; } var __defProp = Object.defineProperty; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __hasOwnProp = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]); if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) { if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]); } return a; }; const _TransitionPresets = { easeInSine: [0.12, 0, 0.39, 0], easeOutSine: [0.61, 1, 0.88, 1], easeInOutSine: [0.37, 0, 0.63, 1], easeInQuad: [0.11, 0, 0.5, 0], easeOutQuad: [0.5, 1, 0.89, 1], easeInOutQuad: [0.45, 0, 0.55, 1], easeInCubic: [0.32, 0, 0.67, 0], easeOutCubic: [0.33, 1, 0.68, 1], easeInOutCubic: [0.65, 0, 0.35, 1], easeInQuart: [0.5, 0, 0.75, 0], easeOutQuart: [0.25, 1, 0.5, 1], easeInOutQuart: [0.76, 0, 0.24, 1], easeInQuint: [0.64, 0, 0.78, 0], easeOutQuint: [0.22, 1, 0.36, 1], easeInOutQuint: [0.83, 0, 0.17, 1], easeInExpo: [0.7, 0, 0.84, 0], easeOutExpo: [0.16, 1, 0.3, 1], easeInOutExpo: [0.87, 0, 0.13, 1], easeInCirc: [0.55, 0, 1, 0.45], easeOutCirc: [0, 0.55, 0.45, 1], easeInOutCirc: [0.85, 0, 0.15, 1], easeInBack: [0.36, 0, 0.66, -0.56], easeOutBack: [0.34, 1.56, 0.64, 1], easeInOutBack: [0.68, -0.6, 0.32, 1.6] }; const TransitionPresets = __spreadValues({ linear: shared.identity }, _TransitionPresets); function createEasingFunction([p0, p1, p2, p3]) { const a = (a1, a2) => 1 - 3 * a2 + 3 * a1; const b = (a1, a2) => 3 * a2 - 6 * a1; const c = (a1) => 3 * a1; const calcBezier = (t, a1, a2) => ((a(a1, a2) * t + b(a1, a2)) * t + c(a1)) * t; const getSlope = (t, a1, a2) => 3 * a(a1, a2) * t * t + 2 * b(a1, a2) * t + c(a1); const getTforX = (x) => { let aGuessT = x; for (let i = 0; i < 4; ++i) { const currentSlope = getSlope(aGuessT, p0, p2); if (currentSlope === 0) return aGuessT; const currentX = calcBezier(aGuessT, p0, p2) - x; aGuessT -= currentX / currentSlope; } return aGuessT; }; return (x) => p0 === p1 && p2 === p3 ? x : calcBezier(getTforX(x), p1, p3); } function useTransition(source, options = {}) { const { delay = 0, disabled = false, duration = 1e3, onFinished = shared.noop, onStarted = shared.noop, transition = shared.identity } = options; const currentTransition = vueDemi.computed(() => { const t = vueDemi.unref(transition); return shared.isFunction(t) ? t : createEasingFunction(t); }); const sourceValue = vueDemi.computed(() => { const s = vueDemi.unref(source); return shared.isNumber(s) ? s : s.map(vueDemi.unref); }); const sourceVector = vueDemi.computed(() => shared.isNumber(sourceValue.value) ? [sourceValue.value] : sourceValue.value); const outputVector = vueDemi.ref(sourceVector.value.slice(0)); let currentDuration; let diffVector; let endAt; let startAt; let startVector; const { resume, pause } = useRafFn(() => { const now = Date.now(); const progress = shared.clamp(1 - (endAt - now) / currentDuration, 0, 1); outputVector.value = startVector.map((val, i) => { var _a; return val + ((_a = diffVector[i]) != null ? _a : 0) * currentTransition.value(progress); }); if (progress >= 1) { pause(); onFinished(); } }, { immediate: false }); const start = () => { pause(); currentDuration = vueDemi.unref(duration); diffVector = outputVector.value.map((n, i) => { var _a, _b; return ((_a = sourceVector.value[i]) != null ? _a : 0) - ((_b = outputVector.value[i]) != null ? _b : 0); }); startVector = outputVector.value.slice(0); startAt = Date.now(); endAt = startAt + currentDuration; resume(); onStarted(); }; const timeout = shared.useTimeoutFn(start, delay, { immediate: false }); vueDemi.watch(sourceVector, () => { if (vueDemi.unref(disabled)) return; if (vueDemi.unref(delay) <= 0) start(); else timeout.start(); }, { deep: true }); vueDemi.watch(() => vueDemi.unref(disabled), (v) => { if (v) { outputVector.value = sourceVector.value.slice(0); pause(); } }); return vueDemi.computed(() => { const targetVector = vueDemi.unref(disabled) ? sourceVector : outputVector; return shared.isNumber(sourceValue.value) ? targetVector.value[0] : targetVector.value; }); } function useUrlSearchParams(mode = "history", options = {}) { const { initialValue = {}, removeNullishValues = true, removeFalsyValues = false, write: enableWrite = true, window = defaultWindow } = options; if (!window) return vueDemi.reactive(initialValue); const state = vueDemi.reactive({}); function getRawParams() { if (mode === "history") { return window.location.search || ""; } else if (mode === "hash") { const hash = window.location.hash || ""; const index = hash.indexOf("?"); return index > 0 ? hash.slice(index) : ""; } else { return (window.location.hash || "").replace(/^#/, ""); } } function constructQuery(params) { const stringified = params.toString(); if (mode === "history") return `${stringified ? `?${stringified}` : ""}${window.location.hash || ""}`; if (mode === "hash-params") return `${window.location.search || ""}${stringified ? `#${stringified}` : ""}`; const hash = window.location.hash || "#"; const index = hash.indexOf("?"); if (index > 0) return `${hash.slice(0, index)}${stringified ? `?${stringified}` : ""}`; return `${hash}${stringified ? `?${stringified}` : ""}`; } function read() { return new URLSearchParams(getRawParams()); } function updateState(params) { const unusedKeys = new Set(Object.keys(state)); for (const key of params.keys()) { const paramsForKey = params.getAll(key); state[key] = paramsForKey.length > 1 ? paramsForKey : params.get(key) || ""; unusedKeys.delete(key); } Array.from(unusedKeys).forEach((key) => delete state[key]); } const { pause, resume } = shared.pausableWatch(state, () => { const params = new URLSearchParams(""); Object.keys(state).forEach((key) => { const mapEntry = state[key]; if (Array.isArray(mapEntry)) mapEntry.forEach((value) => params.append(key, value)); else if (removeNullishValues && mapEntry == null) params.delete(key); else if (removeFalsyValues && !mapEntry) params.delete(key); else params.set(key, mapEntry); }); write(params); }, { deep: true }); function write(params, shouldUpdate) { pause(); if (shouldUpdate) updateState(params); window.history.replaceState(window.history.state, window.document.title, window.location.pathname + constructQuery(params)); resume(); } function onChanged() { if (!enableWrite) return; write(read(), true); } useEventListener(window, "popstate", onChanged, false); if (mode !== "history") useEventListener(window, "hashchange", onChanged, false); const initial = read(); if (initial.keys().next().value) updateState(initial); else Object.assign(state, initialValue); return state; } function useUserMedia(options = {}) { var _a, _b; const enabled = vueDemi.ref((_a = options.enabled) != null ? _a : false); const autoSwitch = vueDemi.ref((_b = options.autoSwitch) != null ? _b : true); const videoDeviceId = vueDemi.ref(options.videoDeviceId); const audioDeviceId = vueDemi.ref(options.audioDeviceId); const { navigator = defaultNavigator } = options; const isSupported = useSupported(() => { var _a2; return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getUserMedia; }); const stream = vueDemi.shallowRef(); function getDeviceOptions(device) { if (device.value === "none" || device.value === false) return false; if (device.value == null) return true; return { deviceId: device.value }; } async function _start() { if (!isSupported.value || stream.value) return; stream.value = await navigator.mediaDevices.getUserMedia({ video: getDeviceOptions(videoDeviceId), audio: getDeviceOptions(audioDeviceId) }); return stream.value; } async function _stop() { var _a2; (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop()); stream.value = void 0; } function stop() { _stop(); enabled.value = false; } async function start() { await _start(); if (stream.value) enabled.value = true; return stream.value; } async function restart() { _stop(); return await start(); } vueDemi.watch(enabled, (v) => { if (v) _start(); else _stop(); }, { immediate: true }); vueDemi.watch([videoDeviceId, audioDeviceId], () => { if (autoSwitch.value && stream.value) restart(); }, { immediate: true }); return { isSupported, stream, start, stop, restart, videoDeviceId, audioDeviceId, enabled, autoSwitch }; } function useVModel(props, key, emit, options = {}) { var _a, _b, _c, _d, _e; const { clone = false, passive = false, eventName, deep = false, defaultValue } = options; const vm = vueDemi.getCurrentInstance(); const _emit = emit || (vm == null ? void 0 : vm.emit) || ((_a = vm == null ? void 0 : vm.$emit) == null ? void 0 : _a.bind(vm)) || ((_c = (_b = vm == null ? void 0 : vm.proxy) == null ? void 0 : _b.$emit) == null ? void 0 : _c.bind(vm == null ? void 0 : vm.proxy)); let event = eventName; if (!key) { if (vueDemi.isVue2) { const modelOptions = (_e = (_d = vm == null ? void 0 : vm.proxy) == null ? void 0 : _d.$options) == null ? void 0 : _e.model; key = (modelOptions == null ? void 0 : modelOptions.value) || "value"; if (!eventName) event = (modelOptions == null ? void 0 : modelOptions.event) || "input"; } else { key = "modelValue"; } } event = eventName || event || `update:${key.toString()}`; const cloneFn = (val) => !clone ? val : shared.isFunction(clone) ? clone(val) : cloneFnJSON(val); const getValue = () => shared.isDef(props[key]) ? cloneFn(props[key]) : defaultValue; if (passive) { const initialValue = getValue(); const proxy = vueDemi.ref(initialValue); vueDemi.watch(() => props[key], (v) => proxy.value = cloneFn(v)); vueDemi.watch(proxy, (v) => { if (v !== props[key] || deep) _emit(event, v); }, { deep }); return proxy; } else { return vueDemi.computed({ get() { return getValue(); }, set(value) { _emit(event, value); } }); } } function useVModels(props, emit, options = {}) { const ret = {}; for (const key in props) ret[key] = useVModel(props, key, emit, options); return ret; } function useVibrate(options) { const { pattern = [], interval = 0, navigator = defaultNavigator } = options || {}; const isSupported = useSupported(() => typeof navigator !== "undefined" && "vibrate" in navigator); const patternRef = shared.resolveRef(pattern); let intervalControls; const vibrate = (pattern2 = patternRef.value) => { if (isSupported.value) navigator.vibrate(pattern2); }; const stop = () => { if (isSupported.value) navigator.vibrate(0); intervalControls == null ? void 0 : intervalControls.pause(); }; if (interval > 0) { intervalControls = shared.useIntervalFn(vibrate, interval, { immediate: false, immediateCallback: false }); } return { isSupported, pattern, intervalControls, vibrate, stop }; } function useVirtualList(list, options) { const { containerStyle, wrapperProps, scrollTo, calculateRange, currentList, containerRef } = "itemHeight" in options ? useVerticalVirtualList(options, list) : useHorizontalVirtualList(options, list); return { list: currentList, scrollTo, containerProps: { ref: containerRef, onScroll: () => { calculateRange(); }, style: containerStyle }, wrapperProps }; } function useVirtualListResources(list) { const containerRef = vueDemi.ref(null); const size = useElementSize(containerRef); const currentList = vueDemi.ref([]); const source = vueDemi.shallowRef(list); const state = vueDemi.ref({ start: 0, end: 10 }); return { state, source, currentList, size, containerRef }; } function createGetViewCapacity(state, source, itemSize) { return (containerSize) => { if (typeof itemSize === "number") return Math.ceil(containerSize / itemSize); const { start = 0 } = state.value; let sum = 0; let capacity = 0; for (let i = start; i < source.value.length; i++) { const size = itemSize(i); sum += size; capacity = i; if (sum > containerSize) break; } return capacity - start; }; } function createGetOffset(source, itemSize) { return (scrollDirection) => { if (typeof itemSize === "number") return Math.floor(scrollDirection / itemSize) + 1; let sum = 0; let offset = 0; for (let i = 0; i < source.value.length; i++) { const size = itemSize(i); sum += size; if (sum >= scrollDirection) { offset = i; break; } } return offset + 1; }; } function createCalculateRange(type, overscan, getOffset, getViewCapacity, { containerRef, state, currentList, source }) { return () => { const element = containerRef.value; if (element) { const offset = getOffset(type === "vertical" ? element.scrollTop : element.scrollLeft); const viewCapacity = getViewCapacity(type === "vertical" ? element.clientHeight : element.clientWidth); const from = offset - overscan; const to = offset + viewCapacity + overscan; state.value = { start: from < 0 ? 0 : from, end: to > source.value.length ? source.value.length : to }; currentList.value = source.value.slice(state.value.start, state.value.end).map((ele, index) => ({ data: ele, index: index + state.value.start })); } }; } function createGetDistance(itemSize, source) { return (index) => { if (typeof itemSize === "number") { const size2 = index * itemSize; return size2; } const size = source.value.slice(0, index).reduce((sum, _, i) => sum + itemSize(i), 0); return size; }; } function useWatchForSizes(size, list, calculateRange) { vueDemi.watch([size.width, size.height, list], () => { calculateRange(); }); } function createComputedTotalSize(itemSize, source) { return vueDemi.computed(() => { if (typeof itemSize === "number") return source.value.length * itemSize; return source.value.reduce((sum, _, index) => sum + itemSize(index), 0); }); } const scrollToDictionaryForElementScrollKey = { horizontal: "scrollLeft", vertical: "scrollTop" }; function createScrollTo(type, calculateRange, getDistance, containerRef) { return (index) => { if (containerRef.value) { containerRef.value[scrollToDictionaryForElementScrollKey[type]] = getDistance(index); calculateRange(); } }; } function useHorizontalVirtualList(options, list) { const resources = useVirtualListResources(list); const { state, source, currentList, size, containerRef } = resources; const containerStyle = { overflowX: "auto" }; const { itemWidth, overscan = 5 } = options; const getViewCapacity = createGetViewCapacity(state, source, itemWidth); const getOffset = createGetOffset(source, itemWidth); const calculateRange = createCalculateRange("horizontal", overscan, getOffset, getViewCapacity, resources); const getDistanceLeft = createGetDistance(itemWidth, source); const offsetLeft = vueDemi.computed(() => getDistanceLeft(state.value.start)); const totalWidth = createComputedTotalSize(itemWidth, source); useWatchForSizes(size, list, calculateRange); const scrollTo = createScrollTo("horizontal", calculateRange, getDistanceLeft, containerRef); const wrapperProps = vueDemi.computed(() => { return { style: { height: "100%", width: `${totalWidth.value - offsetLeft.value}px`, marginLeft: `${offsetLeft.value}px`, display: "flex" } }; }); return { scrollTo, calculateRange, wrapperProps, containerStyle, currentList, containerRef }; } function useVerticalVirtualList(options, list) { const resources = useVirtualListResources(list); const { state, source, currentList, size, containerRef } = resources; const containerStyle = { overflowY: "auto" }; const { itemHeight, overscan = 5 } = options; const getViewCapacity = createGetViewCapacity(state, source, itemHeight); const getOffset = createGetOffset(source, itemHeight); const calculateRange = createCalculateRange("vertical", overscan, getOffset, getViewCapacity, resources); const getDistanceTop = createGetDistance(itemHeight, source); const offsetTop = vueDemi.computed(() => getDistanceTop(state.value.start)); const totalHeight = createComputedTotalSize(itemHeight, source); useWatchForSizes(size, list, calculateRange); const scrollTo = createScrollTo("vertical", calculateRange, getDistanceTop, containerRef); const wrapperProps = vueDemi.computed(() => { return { style: { width: "100%", height: `${totalHeight.value - offsetTop.value}px`, marginTop: `${offsetTop.value}px` } }; }); return { calculateRange, scrollTo, containerStyle, wrapperProps, currentList, containerRef }; } const useWakeLock = (options = {}) => { const { navigator = defaultNavigator, document = defaultDocument } = options; let wakeLock; const isSupported = useSupported(() => navigator && "wakeLock" in navigator); const isActive = vueDemi.ref(false); async function onVisibilityChange() { if (!isSupported.value || !wakeLock) return; if (document && document.visibilityState === "visible") wakeLock = await navigator.wakeLock.request("screen"); isActive.value = !wakeLock.released; } if (document) useEventListener(document, "visibilitychange", onVisibilityChange, { passive: true }); async function request(type) { if (!isSupported.value) return; wakeLock = await navigator.wakeLock.request(type); isActive.value = !wakeLock.released; } async function release() { if (!isSupported.value || !wakeLock) return; await wakeLock.release(); isActive.value = !wakeLock.released; wakeLock = null; } return { isSupported, isActive, request, release }; }; const useWebNotification = (defaultOptions = {}) => { const { window = defaultWindow } = defaultOptions; const isSupported = useSupported(() => !!window && "Notification" in window); const notification = vueDemi.ref(null); const requestPermission = async () => { if (!isSupported.value) return; if ("permission" in Notification && Notification.permission !== "denied") await Notification.requestPermission(); }; const onClick = shared.createEventHook(); const onShow = shared.createEventHook(); const onError = shared.createEventHook(); const onClose = shared.createEventHook(); const show = async (overrides) => { if (!isSupported.value) return; await requestPermission(); const options = Object.assign({}, defaultOptions, overrides); notification.value = new Notification(options.title || "", options); notification.value.onclick = (event) => onClick.trigger(event); notification.value.onshow = (event) => onShow.trigger(event); notification.value.onerror = (event) => onError.trigger(event); notification.value.onclose = (event) => onClose.trigger(event); return notification.value; }; const close = () => { if (notification.value) notification.value.close(); notification.value = null; }; shared.tryOnMounted(async () => { if (isSupported.value) await requestPermission(); }); shared.tryOnScopeDispose(close); if (isSupported.value && window) { const document = window.document; useEventListener(document, "visibilitychange", (e) => { e.preventDefault(); if (document.visibilityState === "visible") { close(); } }); } return { isSupported, notification, show, close, onClick, onShow, onError, onClose }; }; const DEFAULT_PING_MESSAGE = "ping"; function resolveNestedOptions(options) { if (options === true) return {}; return options; } function useWebSocket(url, options = {}) { const { onConnected, onDisconnected, onError, onMessage, immediate = true, autoClose = true, protocols = [] } = options; const data = vueDemi.ref(null); const status = vueDemi.ref("CLOSED"); const wsRef = vueDemi.ref(); const urlRef = shared.resolveRef(url); let heartbeatPause; let heartbeatResume; let explicitlyClosed = false; let retried = 0; let bufferedData = []; let pongTimeoutWait; const close = (code = 1e3, reason) => { if (!wsRef.value) return; explicitlyClosed = true; heartbeatPause == null ? void 0 : heartbeatPause(); wsRef.value.close(code, reason); }; const _sendBuffer = () => { if (bufferedData.length && wsRef.value && status.value === "OPEN") { for (const buffer of bufferedData) wsRef.value.send(buffer); bufferedData = []; } }; const resetHeartbeat = () => { clearTimeout(pongTimeoutWait); pongTimeoutWait = void 0; }; const send = (data2, useBuffer = true) => { if (!wsRef.value || status.value !== "OPEN") { if (useBuffer) bufferedData.push(data2); return false; } _sendBuffer(); wsRef.value.send(data2); return true; }; const _init = () => { if (explicitlyClosed || typeof urlRef.value === "undefined") return; const ws = new WebSocket(urlRef.value, protocols); wsRef.value = ws; status.value = "CONNECTING"; ws.onopen = () => { status.value = "OPEN"; onConnected == null ? void 0 : onConnected(ws); heartbeatResume == null ? void 0 : heartbeatResume(); _sendBuffer(); }; ws.onclose = (ev) => { status.value = "CLOSED"; wsRef.value = void 0; onDisconnected == null ? void 0 : onDisconnected(ws, ev); if (!explicitlyClosed && options.autoReconnect) { const { retries = -1, delay = 1e3, onFailed } = resolveNestedOptions(options.autoReconnect); retried += 1; if (typeof retries === "number" && (retries < 0 || retried < retries)) setTimeout(_init, delay); else if (typeof retries === "function" && retries()) setTimeout(_init, delay); else onFailed == null ? void 0 : onFailed(); } }; ws.onerror = (e) => { onError == null ? void 0 : onError(ws, e); }; ws.onmessage = (e) => { if (options.heartbeat) { resetHeartbeat(); const { message = DEFAULT_PING_MESSAGE } = resolveNestedOptions(options.heartbeat); if (e.data === message) return; } data.value = e.data; onMessage == null ? void 0 : onMessage(ws, e); }; }; if (options.heartbeat) { const { message = DEFAULT_PING_MESSAGE, interval = 1e3, pongTimeout = 1e3 } = resolveNestedOptions(options.heartbeat); const { pause, resume } = shared.useIntervalFn(() => { send(message, false); if (pongTimeoutWait != null) return; pongTimeoutWait = setTimeout(() => { close(); }, pongTimeout); }, interval, { immediate: false }); heartbeatPause = pause; heartbeatResume = resume; } if (autoClose) { useEventListener(window, "beforeunload", () => close()); shared.tryOnScopeDispose(close); } const open = () => { close(); explicitlyClosed = false; retried = 0; _init(); }; if (immediate) vueDemi.watch(urlRef, open, { immediate: true }); return { data, status, close, send, open, ws: wsRef }; } function useWebWorker(arg0, workerOptions, options) { const { window = defaultWindow } = options != null ? options : {}; const data = vueDemi.ref(null); const worker = vueDemi.shallowRef(); const post = function post2(val) { if (!worker.value) return; worker.value.postMessage(val); }; const terminate = function terminate2() { if (!worker.value) return; worker.value.terminate(); }; if (window) { if (shared.isString(arg0)) worker.value = new Worker(arg0, workerOptions); else if (shared.isFunction(arg0)) worker.value = arg0(); else worker.value = arg0; worker.value.onmessage = (e) => { data.value = e.data; }; shared.tryOnScopeDispose(() => { if (worker.value) worker.value.terminate(); }); } return { data, post, terminate, worker }; } const jobRunner = (userFunc) => (e) => { const userFuncArgs = e.data[0]; return Promise.resolve(userFunc.apply(void 0, userFuncArgs)).then((result) => { postMessage(["SUCCESS", result]); }).catch((error) => { postMessage(["ERROR", error]); }); }; const depsParser = (deps) => { if (deps.length === 0) return ""; const depsString = deps.map((dep) => `'${dep}'`).toString(); return `importScripts(${depsString})`; }; const createWorkerBlobUrl = (fn, deps) => { const blobCode = `${depsParser(deps)}; onmessage=(${jobRunner})(${fn})`; const blob = new Blob([blobCode], { type: "text/javascript" }); const url = URL.createObjectURL(blob); return url; }; const useWebWorkerFn = (fn, options = {}) => { const { dependencies = [], timeout, window = defaultWindow } = options; const worker = vueDemi.ref(); const workerStatus = vueDemi.ref("PENDING"); const promise = vueDemi.ref({}); const timeoutId = vueDemi.ref(); const workerTerminate = (status = "PENDING") => { if (worker.value && worker.value._url && window) { worker.value.terminate(); URL.revokeObjectURL(worker.value._url); promise.value = {}; worker.value = void 0; window.clearTimeout(timeoutId.value); workerStatus.value = status; } }; workerTerminate(); shared.tryOnScopeDispose(workerTerminate); const generateWorker = () => { const blobUrl = createWorkerBlobUrl(fn, dependencies); const newWorker = new Worker(blobUrl); newWorker._url = blobUrl; newWorker.onmessage = (e) => { const { resolve = () => { }, reject = () => { } } = promise.value; const [status, result] = e.data; switch (status) { case "SUCCESS": resolve(result); workerTerminate(status); break; default: reject(result); workerTerminate("ERROR"); break; } }; newWorker.onerror = (e) => { const { reject = () => { } } = promise.value; reject(e); workerTerminate("ERROR"); }; if (timeout) { timeoutId.value = setTimeout(() => workerTerminate("TIMEOUT_EXPIRED"), timeout); } return newWorker; }; const callWorker = (...fnArgs) => new Promise((resolve, reject) => { promise.value = { resolve, reject }; worker.value && worker.value.postMessage([[...fnArgs]]); workerStatus.value = "RUNNING"; }); const workerFn = (...fnArgs) => { if (workerStatus.value === "RUNNING") { console.error("[useWebWorkerFn] You can only run one instance of the worker at a time."); return Promise.reject(); } worker.value = generateWorker(); return callWorker(...fnArgs); }; return { workerFn, workerStatus, workerTerminate }; }; function useWindowFocus({ window = defaultWindow } = {}) { if (!window) return vueDemi.ref(false); const focused = vueDemi.ref(window.document.hasFocus()); useEventListener(window, "blur", () => { focused.value = false; }); useEventListener(window, "focus", () => { focused.value = true; }); return focused; } function useWindowScroll({ window = defaultWindow } = {}) { if (!window) { return { x: vueDemi.ref(0), y: vueDemi.ref(0) }; } const x = vueDemi.ref(window.scrollX); const y = vueDemi.ref(window.scrollY); useEventListener(window, "scroll", () => { x.value = window.scrollX; y.value = window.scrollY; }, { capture: false, passive: true }); return { x, y }; } function useWindowSize(options = {}) { const { window = defaultWindow, initialWidth = Infinity, initialHeight = Infinity, listenOrientation = true, includeScrollbar = true } = options; const width = vueDemi.ref(initialWidth); const height = vueDemi.ref(initialHeight); const update = () => { if (window) { if (includeScrollbar) { width.value = window.innerWidth; height.value = window.innerHeight; } else { width.value = window.document.documentElement.clientWidth; height.value = window.document.documentElement.clientHeight; } } }; update(); shared.tryOnMounted(update); useEventListener("resize", update, { passive: true }); if (listenOrientation) useEventListener("orientationchange", update, { passive: true }); return { width, height }; } exports.DefaultMagicKeysAliasMap = DefaultMagicKeysAliasMap; exports.StorageSerializers = StorageSerializers; exports.TransitionPresets = TransitionPresets; exports.asyncComputed = computedAsync; exports.breakpointsAntDesign = breakpointsAntDesign; exports.breakpointsBootstrapV5 = breakpointsBootstrapV5; exports.breakpointsMasterCss = breakpointsMasterCss; exports.breakpointsQuasar = breakpointsQuasar; exports.breakpointsSematic = breakpointsSematic; exports.breakpointsTailwind = breakpointsTailwind; exports.breakpointsVuetify = breakpointsVuetify; exports.cloneFnJSON = cloneFnJSON; exports.computedAsync = computedAsync; exports.computedInject = computedInject; exports.createFetch = createFetch; exports.createUnrefFn = createUnrefFn; exports.customStorageEventName = customStorageEventName; exports.defaultDocument = defaultDocument; exports.defaultLocation = defaultLocation; exports.defaultNavigator = defaultNavigator; exports.defaultWindow = defaultWindow; exports.formatTimeAgo = formatTimeAgo; exports.getSSRHandler = getSSRHandler; exports.mapGamepadToXbox360Controller = mapGamepadToXbox360Controller; exports.onClickOutside = onClickOutside; exports.onKeyDown = onKeyDown; exports.onKeyPressed = onKeyPressed; exports.onKeyStroke = onKeyStroke; exports.onKeyUp = onKeyUp; exports.onLongPress = onLongPress; exports.onStartTyping = onStartTyping; exports.setSSRHandler = setSSRHandler; exports.templateRef = templateRef; exports.unrefElement = unrefElement; exports.useActiveElement = useActiveElement; exports.useAsyncQueue = useAsyncQueue; exports.useAsyncState = useAsyncState; exports.useBase64 = useBase64; exports.useBattery = useBattery; exports.useBluetooth = useBluetooth; exports.useBreakpoints = useBreakpoints; exports.useBroadcastChannel = useBroadcastChannel; exports.useBrowserLocation = useBrowserLocation; exports.useCached = useCached; exports.useClipboard = useClipboard; exports.useCloned = useCloned; exports.useColorMode = useColorMode; exports.useConfirmDialog = useConfirmDialog; exports.useCssVar = useCssVar; exports.useCurrentElement = useCurrentElement; exports.useCycleList = useCycleList; exports.useDark = useDark; exports.useDebouncedRefHistory = useDebouncedRefHistory; exports.useDeviceMotion = useDeviceMotion; exports.useDeviceOrientation = useDeviceOrientation; exports.useDevicePixelRatio = useDevicePixelRatio; exports.useDevicesList = useDevicesList; exports.useDisplayMedia = useDisplayMedia; exports.useDocumentVisibility = useDocumentVisibility; exports.useDraggable = useDraggable; exports.useDropZone = useDropZone; exports.useElementBounding = useElementBounding; exports.useElementByPoint = useElementByPoint; exports.useElementHover = useElementHover; exports.useElementSize = useElementSize; exports.useElementVisibility = useElementVisibility; exports.useEventBus = useEventBus; exports.useEventListener = useEventListener; exports.useEventSource = useEventSource; exports.useEyeDropper = useEyeDropper; exports.useFavicon = useFavicon; exports.useFetch = useFetch; exports.useFileDialog = useFileDialog; exports.useFileSystemAccess = useFileSystemAccess; exports.useFocus = useFocus; exports.useFocusWithin = useFocusWithin; exports.useFps = useFps; exports.useFullscreen = useFullscreen; exports.useGamepad = useGamepad; exports.useGeolocation = useGeolocation; exports.useIdle = useIdle; exports.useImage = useImage; exports.useInfiniteScroll = useInfiniteScroll; exports.useIntersectionObserver = useIntersectionObserver; exports.useKeyModifier = useKeyModifier; exports.useLocalStorage = useLocalStorage; exports.useMagicKeys = useMagicKeys; exports.useManualRefHistory = useManualRefHistory; exports.useMediaControls = useMediaControls; exports.useMediaQuery = useMediaQuery; exports.useMemoize = useMemoize; exports.useMemory = useMemory; exports.useMounted = useMounted; exports.useMouse = useMouse; exports.useMouseInElement = useMouseInElement; exports.useMousePressed = useMousePressed; exports.useMutationObserver = useMutationObserver; exports.useNavigatorLanguage = useNavigatorLanguage; exports.useNetwork = useNetwork; exports.useNow = useNow; exports.useObjectUrl = useObjectUrl; exports.useOffsetPagination = useOffsetPagination; exports.useOnline = useOnline; exports.usePageLeave = usePageLeave; exports.useParallax = useParallax; exports.usePermission = usePermission; exports.usePointer = usePointer; exports.usePointerLock = usePointerLock; exports.usePointerSwipe = usePointerSwipe; exports.usePreferredColorScheme = usePreferredColorScheme; exports.usePreferredContrast = usePreferredContrast; exports.usePreferredDark = usePreferredDark; exports.usePreferredLanguages = usePreferredLanguages; exports.usePreferredReducedMotion = usePreferredReducedMotion; exports.usePrevious = usePrevious; exports.useRafFn = useRafFn; exports.useRefHistory = useRefHistory; exports.useResizeObserver = useResizeObserver; exports.useScreenOrientation = useScreenOrientation; exports.useScreenSafeArea = useScreenSafeArea; exports.useScriptTag = useScriptTag; exports.useScroll = useScroll; exports.useScrollLock = useScrollLock; exports.useSessionStorage = useSessionStorage; exports.useShare = useShare; exports.useSorted = useSorted; exports.useSpeechRecognition = useSpeechRecognition; exports.useSpeechSynthesis = useSpeechSynthesis; exports.useStepper = useStepper; exports.useStorage = useStorage; exports.useStorageAsync = useStorageAsync; exports.useStyleTag = useStyleTag; exports.useSupported = useSupported; exports.useSwipe = useSwipe; exports.useTemplateRefsList = useTemplateRefsList; exports.useTextDirection = useTextDirection; exports.useTextSelection = useTextSelection; exports.useTextareaAutosize = useTextareaAutosize; exports.useThrottledRefHistory = useThrottledRefHistory; exports.useTimeAgo = useTimeAgo; exports.useTimeoutPoll = useTimeoutPoll; exports.useTimestamp = useTimestamp; exports.useTitle = useTitle; exports.useTransition = useTransition; exports.useUrlSearchParams = useUrlSearchParams; exports.useUserMedia = useUserMedia; exports.useVModel = useVModel; exports.useVModels = useVModels; exports.useVibrate = useVibrate; exports.useVirtualList = useVirtualList; exports.useWakeLock = useWakeLock; exports.useWebNotification = useWebNotification; exports.useWebSocket = useWebSocket; exports.useWebWorker = useWebWorker; exports.useWebWorkerFn = useWebWorkerFn; exports.useWindowFocus = useWindowFocus; exports.useWindowScroll = useWindowScroll; exports.useWindowSize = useWindowSize; Object.keys(shared).forEach(function (k) { if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { enumerable: true, get: function () { return shared[k]; } }); }); })(this.VueUse = this.VueUse || {}, VueUse, VueDemi);