mechanica 1.0.21 → 1.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"editor.js","sources":["../../common/components/HoverFrame.vue","../../common/components/InsertedPlace.vue","../../common/components/icons/ChevronLeftIcon.vue","../../common/components/icons/ChevronRightIcon.vue","../../../node_modules/vuesix/src/utils/findParent.ts","../../../node_modules/vuesix/src/hooks/useClickOutside.ts","../../../node_modules/vuesix/src/utils/handleMove.ts","../../../node_modules/vuesix/src/hooks/useDraggableItem.ts","../../../node_modules/vuesix/src/utils/object.ts","../../../node_modules/vuesix/src/hooks/useForm.ts","../../../node_modules/vuesix/src/utils/multimap.ts","../../../node_modules/vuesix/src/utils/pairMap.ts","../../../node_modules/vuesix/src/hooks/useRequest.ts","../../../node_modules/vuesix/src/hooks/useSearch.ts","../../../node_modules/vuesix/src/hooks/useKeyDownLayer.ts","../../common/types.ts","../../common/components/VFormControl.vue","../../../node_modules/@vueuse/shared/index.mjs","../../../node_modules/@vueuse/core/index.mjs","../../common/components/VInput.vue","../../common/components/BlocksList.vue","../../common/utils/processBlock.ts","../../common/utils/walkTree.ts","../../common/utils/blocks.ts","../../common/components/VTabs.vue","../../common/components/VTabsPages.vue","../../common/components/icons/CollapseArrowIcon.vue","../../common/components/VCollapse.vue","../../common/components/VPopover.vue","../../common/components/icons/ArrowDownIcon.vue","../../common/components/VIconButton.vue","../../common/components/icons/CloseMinIcon.vue","../../common/components/VSelect.vue","../../common/components/JsonEditorArray.vue","../../common/components/icons/EmptyFileIcon.vue","../../common/components/icons/MoreIcon.vue","../../common/components/VButton.vue","../../common/components/VContextMenu.vue","../../common/components/VDialogProvider.vue","../../common/components/VDialog.vue","../../common/components/dialogs/ProjectImagesDialog.vue","../../common/components/VImageUploader.vue","../../common/components/icons/CheckIcon.vue","../../common/components/VCheckbox.vue","../../common/utils/lang.ts","../../common/components/icons/EditIcon.vue","../../common/components/VLinkEditor.vue","../../../node_modules/vuewrite/dist/vuewrite.js","../../common/utils/richTextComponents.ts","../../common/utils/richTextCodeComponents.ts","../../common/components/RichTextEditorCode.vue","../../common/components/RichTextEditorLinkPopover.vue","../../common/components/icons/TextBoldIcon.vue","../../common/components/icons/TextItalicIcon.vue","../../common/components/icons/TextUnderlineIcon.vue","../../common/components/icons/TextStrikethroughIcon.vue","../../common/components/icons/ImageSolidIcon.vue","../../common/components/icons/CodeIcon.vue","../../common/components/icons/LinkIcon.vue","../../common/components/dialogs/RichTextEditorDialog.vue","../../common/components/VRichTextEditor.vue","../../common/components/icons/FileIcon.vue","../../common/components/VFileUploader.vue","../../common/components/VMultiSelect.vue","../../common/components/JsonEditor.vue","../../common/components/BlocksEditor.vue","../../common/components/ContentHierarchy.vue","../../common/components/HierarchySidebar.vue","../../common/utils/controlComponent.ts","../../common/components/FormColumn.vue","../../common/components/dialogs/CreatePageDialog.vue","../../common/components/VTable.vue","../../common/components/dialogs/OpenPageDialog.vue","../../common/components/dialogs/PageSettingsDialog.vue","../../common/components/icons/SortIcon.vue","../src/editor/api.ts","../src/editor/PageSelector.vue","../src/editor/processState.ts","../src/editor/EditorApp.vue","../src/editor/editor.ts"],"sourcesContent":["<template>\r\n <div class=\"editor-component editor-hover-frame\" :style=\"style\">\r\n\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { CSSProperties, ref, watch } from 'vue';\r\n\r\nconst props = defineProps<{ element?: HTMLElement | null, resizable?: boolean }>()\r\n\r\nconst style = ref<CSSProperties>({ display: \"none\" })\r\n\r\nconst updateStyle = () => {\r\n if (props.element) {\r\n const rect = props.element.getBoundingClientRect()\r\n style.value = { \r\n top: rect.top + document.documentElement.scrollTop +\"px\", \r\n left: rect.left + document.documentElement.scrollLeft +\"px\", \r\n width: rect.width+\"px\", \r\n height: rect.height+\"px\" \r\n }\r\n } else {\r\n style.value = { display: \"none\" }\r\n }\r\n}\r\nconst resizeObserver = new ResizeObserver(updateStyle)\r\n\r\nwatch(() => props.element, (element, lastElement) => {\r\n updateStyle()\r\n if (element) {\r\n resizeObserver.observe(element)\r\n } else if (lastElement) {\r\n resizeObserver.unobserve(lastElement)\r\n }\r\n}, { immediate: true })\r\n\r\ndefineExpose({\r\n update: updateStyle\r\n})\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.editor-hover-frame\r\n position: absolute\r\n border: 2px solid var(--primary-color)\r\n pointer-events: none\r\n box-sizing: border-box\r\n</style>","<template>\r\n <div class=\"editor__inserted-place-marker\" :style=\"{ top: top+'px' }\"></div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\n\r\nconst props = defineProps<{ top: number }>()\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.editor__inserted-place-marker\r\n background-color: #0073E9\r\n height: 2px\r\n position: absolute\r\n left: 0\r\n right: 0\r\n margin-top: -1px\r\n\r\n</style>","<template>\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M10.707 14.364C10.8945 14.1764 10.9998 13.9221 10.9998 13.657C10.9998 13.3918 10.8945 13.1375 10.707 12.95L5.75705 7.99995L10.707 3.04995C10.8892 2.86135 10.99 2.60875 10.9877 2.34655C10.9854 2.08435 10.8803 1.83354 10.6949 1.64813C10.5095 1.46272 10.2586 1.35756 9.99645 1.35528C9.73425 1.353 9.48165 1.45379 9.29305 1.63595L3.63605 7.29295C3.44858 7.48048 3.34326 7.73479 3.34326 7.99995C3.34326 8.26512 3.44858 8.51942 3.63605 8.70695L9.29305 14.364C9.48058 14.5514 9.73488 14.6567 10 14.6567C10.2652 14.6567 10.5195 14.5514 10.707 14.364Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M5.29295 1.63605C5.10548 1.82358 5.00017 2.07788 5.00017 2.34305C5.00017 2.60821 5.10548 2.86252 5.29295 3.05005L10.243 8.00005L5.29295 12.95C5.11079 13.1387 5.01 13.3913 5.01228 13.6534C5.01456 13.9156 5.11972 14.1665 5.30513 14.3519C5.49054 14.5373 5.74135 14.6424 6.00355 14.6447C6.26575 14.647 6.51835 14.5462 6.70695 14.364L12.364 8.70705C12.5514 8.51952 12.6567 8.26521 12.6567 8.00005C12.6567 7.73488 12.5514 7.48058 12.364 7.29305L6.70695 1.63605C6.51942 1.44858 6.26512 1.34326 5.99995 1.34326C5.73479 1.34326 5.48048 1.44858 5.29295 1.63605Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","export const findParent = (el: HTMLElement, callback: (el: HTMLElement) => boolean): HTMLElement | null => {\r\n if (callback(el)) return el\r\n if (!el.parentElement) return null\r\n return findParent(el.parentElement, callback)\r\n}","import { type Ref, type ShallowRef, type WatchSource, watch } from \"vue\"\r\nimport { findParent } from \"../utils/findParent\"\r\n\r\ntype Item = Ref<HTMLElement | undefined> | ShallowRef<HTMLElement | undefined>\r\n\r\nconst clickOnIgnore = (target: HTMLElement, ignoreEl?: Item | Item[]) => {\r\n if (!ignoreEl) return false\r\n return !!findParent(target, (el) => {\r\n if (!Array.isArray(ignoreEl)) return el === ignoreEl.value\r\n for (const item of ignoreEl) {\r\n if (item.value === el) return true\r\n }\r\n return false\r\n })\r\n}\r\n\r\n/** Listen click outside element if condition true */\r\nexport const useClickOutside = (condition: WatchSource, onClick: () => void, ignoreEl?: Item | Item[]) => {\r\n\r\n const clickOutside = (e: MouseEvent) => {\r\n if (clickOnIgnore(e.target as HTMLElement, ignoreEl)) return\r\n\r\n document.addEventListener(\"mouseup\", (e) => {\r\n if (clickOnIgnore(e.target as HTMLElement, ignoreEl)) return \r\n onClick()\r\n }, { once: true })\r\n }\r\n \r\n watch(condition, value => {\r\n setTimeout(() => {\r\n if (value) {\r\n document.addEventListener(\"mousedown\", clickOutside)\r\n } else {\r\n document.removeEventListener(\"mousedown\", clickOutside)\r\n }\r\n }, 50)\r\n }, { flush: \"post\" })\r\n}\r\n\r\nexport const useMouseDownOutside = (condition: WatchSource, onMouseDown: () => void, ignoreEl?: Item | Item[]) => {\r\n\r\n const clickOutside = (e: MouseEvent) => {\r\n if (e.defaultPrevented) return\r\n if (clickOnIgnore(e.target as HTMLElement, ignoreEl)) return\r\n onMouseDown()\r\n }\r\n\r\n watch(condition, value => {\r\n setTimeout(() => {\r\n if (value) {\r\n document.addEventListener(\"mousedown\", clickOutside)\r\n } else {\r\n document.removeEventListener(\"mousedown\", clickOutside)\r\n }\r\n }, 50)\r\n }, { flush: \"post\" })\r\n\r\n}","export const isTouchEvent = (e: MouseEvent | TouchEvent | Touch): e is TouchEvent => {\r\n return \"touches\" in e\r\n}\r\n\r\nexport function getPos(_e: MouseEvent | TouchEvent | Touch, relativeRect?: DOMRect, type?: MoveType, touchIndex = -1) {\r\n const e = isTouchEvent(_e)? _e.touches[touchIndex < 0? _e.touches.length-1: touchIndex]: _e\r\n if (!e) return { x: 0, y: 0 }\r\n\r\n if (relativeRect && type !== \"absolute\") {\r\n if (type === \"threejs\") {\r\n const _x = (e.clientX-relativeRect.left)/relativeRect.width * 2 - 1\r\n const _y = -(e.clientY-relativeRect.top)/relativeRect.height * 2 + 1\r\n return { x: _x, y: _y }\r\n } else {\r\n return { x: e.clientX - relativeRect.x, y: e.clientY - relativeRect.y }\r\n }\r\n } else {\r\n return { x: e.clientX, y: e.clientY }\r\n }\r\n}\r\n\r\nconst getTouch = (e: MouseEvent | TouchEvent, touchId: number | null) => {\r\n if (isTouchEvent(e) && touchId !== null) {\r\n for (let touch of e.touches) {\r\n if (touch.identifier === touchId) return touch\r\n }\r\n }\r\n return e\r\n}\r\n\r\nexport const clamp = (val: number, min: number, max: number) => {\r\n if (val > max) return max\r\n if (val < min) return min\r\n return val\r\n}\r\n\r\ntype HandleCallbackProps = {\r\n e: MouseEvent | TouchEvent\r\n pos: { x: number, y: number },\r\n deltaPos: { x: number, y: number },\r\n startPos: { x: number, y: number }\r\n}\r\n\r\ntype MoveType = \"relative\" | \"absolute\" | \"threejs\"\r\n\r\ntype HandleEventOpts = {\r\n onStart?: (props: HandleCallbackProps) => void\r\n onMove?: (props: HandleCallbackProps) => void,\r\n onEnd?: (props: HandleCallbackProps) => void,\r\n type?: MoveType,\r\n prevent?: boolean,\r\n threshold?: number,\r\n relativeRect?: DOMRect\r\n}\r\n\r\n/** Add document listener to track mouse move */\r\nexport function handleMove(e: TouchEvent | MouseEvent, { onStart, onMove, onEnd, relativeRect, type, prevent, threshold }: HandleEventOpts = {}) {\r\n\r\n const box = relativeRect ?? (e.currentTarget as HTMLElement).getBoundingClientRect()\r\n const touchId = isTouchEvent(e)? ((e.changedTouches[0] ?? e.touches[e.touches.length-1]).identifier): null\r\n\r\n const startPos = getPos(getTouch(e, touchId), box, type ?? \"absolute\")\r\n let lastPos = startPos\r\n\r\n let moving = false\r\n const move = (e: MouseEvent | TouchEvent) => {\r\n const pos = getPos(getTouch(e, touchId), box, type ?? \"absolute\")\r\n if (moving === false && threshold && Math.abs(pos.x - startPos.x) < threshold) {\r\n return\r\n }\r\n if (moving === false && threshold) {\r\n startPos.x = pos.x\r\n startPos.y = pos.y\r\n moving = true\r\n }\r\n if (!e.defaultPrevented && prevent !== false) {\r\n e.preventDefault()\r\n e.stopImmediatePropagation()\r\n }\r\n if (onMove){\r\n const deltaPos = { x: pos.x - lastPos.x, y: pos.y - lastPos.y}\r\n onMove({ e, pos, deltaPos, startPos })\r\n }\r\n lastPos = pos\r\n }\r\n\r\n const end = (e: MouseEvent | TouchEvent) => {\r\n if (isTouchEvent(e) && e.touches.length > 0 && e.changedTouches[0].identifier !== touchId) return\r\n if (!e.defaultPrevented && prevent !== false) {\r\n e.preventDefault()\r\n e.stopImmediatePropagation()\r\n }\r\n dispose(e)\r\n }\r\n\r\n\r\n const dispose = (e: MouseEvent | TouchEvent) => {\r\n\r\n document.removeEventListener(\"touchmove\", move)\r\n document.removeEventListener(\"mousemove\", move)\r\n document.removeEventListener(\"touchend\", end)\r\n document.removeEventListener(\"touchcancel\", end)\r\n document.removeEventListener(\"mouseup\", end)\r\n\r\n if (onEnd){\r\n const pos = getPos(getTouch(e, touchId), box, type ?? \"absolute\")\r\n if (pos.x === 0 && pos.y === 0) {\r\n onEnd({ e, pos: lastPos, startPos, deltaPos: { x: 0, y: 0 }})\r\n return\r\n }\r\n const deltaPos = { x: pos.x - lastPos.x, y: pos.y - lastPos.y}\r\n onEnd({ e, pos, startPos, deltaPos })\r\n }\r\n }\r\n\r\n if (onStart){\r\n onStart({ e, pos: startPos, deltaPos: { x: 0, y: 0 }, startPos })\r\n }\r\n move(e)\r\n \r\n if (isTouchEvent(e)) {\r\n document.addEventListener(\"touchmove\", move, { passive: prevent !== true })\r\n document.addEventListener(\"touchend\", end, { passive: prevent !== true })\r\n document.addEventListener(\"touchcancel\", end, { passive: prevent !== true })\r\n } else {\r\n document.addEventListener(\"mousemove\", move)\r\n document.addEventListener(\"mouseup\", end)\r\n }\r\n}\r\n\r\ntype HandleRotateCallbackProps = {\r\n angle: number\r\n deltaAngle: number,\r\n e: MouseEvent\r\n}\r\n\r\ntype HandleRotateEventOpts = {\r\n onStart?: (props: HandleRotateCallbackProps) => void\r\n onMove?: (props: HandleRotateCallbackProps) => void,\r\n onEnd?: (props: HandleRotateCallbackProps) => void\r\n}\r\n\r\nexport function handleAngleMove(e: any, center: { x: number, y: number }, { onStart, onMove, onEnd }: HandleRotateEventOpts = {}) {\r\n\r\n const startPos = getPos(e)\r\n let startAngle = Math.atan2(startPos.y - center.y, startPos.x - center.x) \r\n\r\n let lastAngle = 0\r\n const move = (e: any) => {\r\n const pos = getPos(e)\r\n const angle = (Math.atan2(pos.y - center.y, pos.x - center.x) - startAngle) / Math.PI * 180\r\n if (onMove)\r\n onMove({ angle, deltaAngle: angle-lastAngle, e })\r\n lastAngle = angle\r\n }\r\n\r\n const end = (e: any) => {\r\n const pos = getPos(e)\r\n const angle = (Math.atan2(pos.y - center.y, pos.x - center.x) - startAngle) / Math.PI * 180\r\n document.removeEventListener(\"touchmove\", move)\r\n document.removeEventListener(\"mousemove\", move)\r\n if (onEnd)\r\n onEnd({ angle, deltaAngle: angle-lastAngle, e })\r\n }\r\n\r\n move(e)\r\n if (onStart)\r\n onStart({ angle: 0, deltaAngle: 0, e })\r\n\r\n if (e.touches) {\r\n document.addEventListener(\"touchmove\", move)\r\n document.addEventListener(\"touchend\", end, { once: true })\r\n } else {\r\n document.addEventListener(\"mousemove\", move)\r\n document.addEventListener(\"mouseup\", end, { once: true })\r\n }\r\n}\r\n\r\n\r\ntype HandleScaleCallbackProps = {\r\n scale: number\r\n deltaScale: number\r\n}\r\n\r\ntype HandleScaleEventOpts = {\r\n onStart?: (props: HandleScaleCallbackProps) => void\r\n onMove?: (props: HandleScaleCallbackProps) => void,\r\n onEnd?: (props: HandleScaleCallbackProps) => void\r\n}\r\n\r\nexport function handleScaleMove(e: any, center: { x: number, y: number }, { onStart, onMove, onEnd }: HandleScaleEventOpts = {}) {\r\n\r\n const startPos = getPos(e)\r\n let startScale = Math.hypot(startPos.y - center.y, startPos.x - center.x)\r\n\r\n let lastScale = 1\r\n const move = (e: any) => {\r\n const pos = getPos(e)\r\n const scale = Math.hypot(pos.y - center.y, pos.x - center.x) / startScale\r\n if (onMove)\r\n onMove({ scale, deltaScale: scale/lastScale })\r\n lastScale = scale\r\n }\r\n\r\n const end = (e: any) => {\r\n const pos = getPos(e)\r\n const scale = Math.hypot(pos.y - center.y, pos.x - center.x) / startScale\r\n document.removeEventListener(\"touchmove\", move)\r\n document.removeEventListener(\"mousemove\", move)\r\n if (onEnd)\r\n onEnd({ scale, deltaScale: scale/lastScale })\r\n }\r\n\r\n move(e)\r\n if (onStart)\r\n onStart({ scale: 1, deltaScale: 1 })\r\n\r\n if (e.touches) {\r\n document.addEventListener(\"touchmove\", move)\r\n document.addEventListener(\"touchend\", end, { once: true })\r\n } else {\r\n document.addEventListener(\"mousemove\", move)\r\n document.addEventListener(\"mouseup\", end, { once: true })\r\n }\r\n}","import { handleMove } from \"../utils/handleMove\"\r\n\r\ntype DraggableOptions = {\r\n onStart?: (item: HTMLElement) => void,\r\n onMove?: (e: MouseEvent, item: HTMLElement) => void,\r\n onEnd?: (e: MouseEvent) => void,\r\n threshold?: number,\r\n offset?: { left: number, top: number }\r\n}\r\n\r\n/** Clone element and move it follow mouse */\r\nexport const useDraggableItem = () => {\r\n let clonedItem: HTMLElement | null\r\n\r\n const drag = (e: MouseEvent, options: DraggableOptions) => {\r\n if (clonedItem) {\r\n clonedItem.remove()\r\n clonedItem = null\r\n }\r\n \r\n const el = (e.currentTarget as HTMLButtonElement)\r\n const rect = el.getBoundingClientRect()\r\n const offset = options.offset ?? { left: rect.left - e.clientX, top: rect.top - e.clientY }\r\n const width = el.clientWidth\r\n \r\n const onStart = () => {\r\n clonedItem = el.cloneNode(true) as HTMLElement\r\n clonedItem.setAttribute(\"style\", \"position: fixed; pointer-events: none;\")\r\n document.body.append(clonedItem)\r\n options.onStart?.(clonedItem)\r\n }\r\n const threshold = options.threshold ?? 10\r\n\r\n handleMove(e, {\r\n onMove({ e, pos, startPos }) {\r\n if (!clonedItem) {\r\n if (Math.abs(pos.x - startPos.x) > threshold || Math.abs(pos.y - startPos.y) > threshold) {\r\n onStart()\r\n }\r\n return\r\n }\r\n clonedItem.setAttribute(\r\n \"style\", \r\n `position: fixed; top: ${pos.y + offset.top}px; left: ${pos.x + offset.left}px; width: ${width}px; pointer-events: none;`\r\n )\r\n options.onMove?.(e as MouseEvent, clonedItem)\r\n },\r\n onEnd({ e }) {\r\n if (!clonedItem) return\r\n clonedItem.remove()\r\n clonedItem = null\r\n options.onEnd?.(e as MouseEvent)\r\n },\r\n type: \"absolute\",\r\n prevent: false\r\n })\r\n }\r\n\r\n return drag\r\n}","\r\nexport const cloneDeep = <T>(obj: T): T => {\r\n if (typeof obj !== \"object\" || obj === null) return obj\r\n if (Array.isArray(obj)) {\r\n return [ ...obj.map(cloneDeep) ] as T\r\n }\r\n return Object.fromEntries(Object.entries(obj).map(([ key, value ]) => [ key, cloneDeep(value) ])) as T\r\n}\r\n\r\n/** Simple deep comparsion. If b has'n keys from a its equals */\r\nexport const isEqual = (a: any, b: any) => {\r\n if (a === b) return true\r\n if (typeof a !== \"object\" || typeof b !== \"object\" || a === null || b === null) return false\r\n\r\n if (Array.isArray(a)) {\r\n if (!Array.isArray(b) || a.length !== b.length) return false\r\n for (let i = 0; i < a.length; i++) {\r\n if (!isEqual(a[i], b[i])) return false\r\n }\r\n return true\r\n }\r\n\r\n for (let key in a) {\r\n if (!isEqual(a[key], b[key])) return false\r\n }\r\n return true\r\n}","import { type WatchSource, computed, reactive, ref, watch } from \"vue\"\r\nimport { cloneDeep, isEqual } from \"../utils/object\"\r\n\r\ntype Options<T> = {\r\n required?: Array<keyof T>\r\n}\r\n\r\n\r\nlet globalErrorHandler = (_error: any, _errors: any) => {}\r\n\r\nexport const setUseFormErrorHandler = (handler: (error: any, errors: Record<string, string>) => void) => {\r\n globalErrorHandler = handler\r\n}\r\n\r\nexport const useForm = <T extends Record<string, any>>(defaultValues: T, options: Options<T> = {}) => {\r\n\r\n const pending = ref(false)\r\n const values = reactive(cloneDeep(defaultValues)) as T\r\n const errors = reactive<Partial<Record<keyof T | \"_global\", { code?: string, message?: string }>>>({})\r\n\r\n const oldValues: { [key: string]: string } = {}\r\n watch(values, () => {\r\n for (let [ key, value ] of Object.entries(values)) {\r\n if (key in errors && value !== oldValues[key]) {\r\n delete (errors as any)[key as keyof T]\r\n }\r\n }\r\n Object.assign(oldValues, values)\r\n })\r\n\r\n const requiredSet = computed(() => {\r\n return new Set(options.required)\r\n })\r\n\r\n const setError = (key: keyof T, error: { code?: string, message?: string }) => {\r\n (errors as any)[key] = error\r\n }\r\n\r\n const register = <K extends keyof T>(key: K) => {\r\n return {\r\n modelValue: values[key],\r\n \"onUpdate:modelValue\": (value: T[K]) => values[key] = value as any,\r\n error: (errors as any)[key],\r\n name: key,\r\n required: requiredSet.value.has(key)\r\n }\r\n }\r\n\r\n const checkRequired = (keys?: Array<keyof T>) => {\r\n for (let key of (keys ?? options.required ?? [])) {\r\n const val = values[key]\r\n if (val === null || (typeof val === \"string\" && !val.trim() || (Array.isArray(val) && val.length === 0))) {\r\n setError(key, { code: \"required\" })\r\n return false\r\n }\r\n }\r\n return true\r\n }\r\n\r\n const requiredFilled = computed(() => {\r\n for (let key of options.required ?? []) {\r\n const val = values[key]\r\n if (val === null || (typeof val === \"string\" && !val.trim()) || (Array.isArray(val) && val.length === 0)) {\r\n return false\r\n }\r\n }\r\n return true\r\n })\r\n\r\n const handleError = (e: any) => {\r\n globalErrorHandler(e, errors)\r\n for (let key in errors) {\r\n if (!(key in values) && key !== \"_global\") {\r\n delete (errors as any)[key]\r\n }\r\n }\r\n }\r\n\r\n const handleSubmit = (submit: (values: T) => void | Promise<void>) => async (e: Event) => {\r\n e.preventDefault()\r\n if (!checkRequired()) return\r\n\r\n delete (errors as any)[\"_global\"]\r\n pending.value = true\r\n try {\r\n await submit(values)\r\n } catch(e) {\r\n handleError(e)\r\n throw e\r\n } finally {\r\n pending.value = false\r\n }\r\n }\r\n\r\n const updateDefaultValues = (newValues: Partial<T>) => {\r\n for (let [ key, value ] of Object.entries(newValues)) {\r\n if (key in values) {\r\n (values as any)[key] = cloneDeep(value);\r\n (defaultValues as any)[key] = value\r\n }\r\n }\r\n changeFlag.value = true\r\n changeFlag.value = false\r\n }\r\n\r\n /** Watch value and update form default values if its change */\r\n const updateDefaultValuesWatch = <D>(data: WatchSource<D>, map?: (obj: D) => T) => {\r\n watch(data, (data) => {\r\n if (!data) return\r\n updateDefaultValues(map? map(data): data)\r\n }, { immediate: true })\r\n }\r\n\r\n const changeFlag = ref(false)\r\n const setChange = () => {\r\n changeFlag.value = true\r\n }\r\n\r\n const hasChange = computed(() => {\r\n if (changeFlag.value) return true\r\n return !isEqual(values, defaultValues)\r\n })\r\n\r\n return {\r\n handleSubmit,\r\n register,\r\n setError,\r\n errors,\r\n checkRequired,\r\n updateDefaultValues,\r\n updateDefaultValuesWatch,\r\n pending,\r\n values,\r\n hasChange,\r\n setChange,\r\n requiredFilled\r\n }\r\n}","/** Class for create two dimensial Map */\r\nexport class MultiMap<T, K> {\r\n _map = new Map<T, K[]>()\r\n\r\n get size() {\r\n return this._map.size\r\n }\r\n\r\n add(key: T, value: K) {\r\n const arr = this._map.get(key)\r\n if (!arr) {\r\n this._map.set(key, [ value ])\r\n } else {\r\n arr.push(value)\r\n }\r\n }\r\n\r\n remove(key: T, value: K) {\r\n const arr = this._map.get(key)\r\n if (!arr) return false\r\n const newArr = arr.filter(item => item !== value)\r\n if (newArr.length === arr.length) return false\r\n if (newArr.length === 0) {\r\n this._map.delete(key)\r\n } else {\r\n this._map.set(key, newArr)\r\n }\r\n return true\r\n }\r\n\r\n has(key: T) {\r\n return this._map.has(key)\r\n }\r\n\r\n get(key: T) {\r\n return this._map.get(key) || []\r\n }\r\n\r\n forEach(key: T, callback: (val: K) => void) {\r\n const arr = this._map.get(key)\r\n if (!arr) return\r\n arr.forEach(callback)\r\n }\r\n\r\n clear() {\r\n this._map.clear()\r\n }\r\n}\r\n","export class PairMap<T, P, K> {\r\n _map = new Map<T, Map<P, K>>()\r\n\r\n set(keyA: T, keyB: P, value: K) {\r\n const map = this._map.get(keyA)\r\n if (map) {\r\n map.set(keyB, value)\r\n return\r\n }\r\n this._map.set(keyA, new Map([[ keyB, value ]]))\r\n }\r\n\r\n get(keyA: T, keyB: P) {\r\n const map = this._map.get(keyA)\r\n if (!map) return null\r\n return map.get(keyB) ?? null\r\n }\r\n\r\n deletePair(keyA: T) {\r\n this._map.delete(keyA)\r\n }\r\n \r\n delete(keyA: T, keyB: P) {\r\n const map = this._map.get(keyA)\r\n if (!map) return\r\n map.delete(keyB)\r\n if (map.size === 0) {\r\n this.deletePair(keyA)\r\n }\r\n }\r\n\r\n clear() {\r\n this._map.clear()\r\n }\r\n\r\n}","import { type Ref, type UnwrapRef, type WatchSource, onBeforeUnmount, onMounted, ref, shallowRef, triggerRef, watch } from 'vue'\r\nimport { MultiMap } from '../utils/multimap'\r\nimport { PairMap } from '../utils/pairMap'\r\n\r\ntype DataEntry = { data: any, lastUpdate: number, updatedManually?: boolean, promise?: Promise<any> }\r\nconst dataMap = new PairMap<any, string, DataEntry>()\r\nconst events = new MultiMap<any, () => Promise<void>>() // eslint-disable-line func-call-spacing\r\n\r\nconst getArgKey = (args: any[]) => {\r\n return args.length === 0 ? '' : JSON.stringify(args)\r\n}\r\n\r\nconst getEntryOrCreate = <A extends any[]>(request: (...args: A) => Promise<any>, argKey: string, defaultValue: DataEntry) => {\r\n \r\n const existsValue = dataMap.get(request, argKey)\r\n if (existsValue) return existsValue\r\n\r\n dataMap.set(request, argKey, defaultValue)\r\n return defaultValue\r\n}\r\n\r\ntype RequestOptions = {\r\n deep?: boolean\r\n}\r\n\r\n// type UseRequest<A extends any[], R> = {\r\n// data: Ref<R | null>, \r\n// error: ShallowRef<any>, \r\n// pending: ShallowRef<boolean>, \r\n// mutate: (...args: A) => Promise<void>, \r\n// lazyMutate: (...args: A) => Promise<void>, \r\n// setReturnData: (callback: (...args: A) => any) => void\r\n// }\r\n\r\n/**\r\n * Extended version of useRequest with additional options.\r\n * @template A - The arguments type for the request function.\r\n * @template R - The return type of the request function.\r\n * @param {RequestOptions} options - Configuration options for the request.\r\n * @param {(...args: A) => Promise<R>} request - The async request function.\r\n * @param {...A} args - Arguments to pass to the request function.\r\n * @property {Ref<R|null>} data - Reactive reference to the request result.\r\n * @property {ShallowRef<any>} error - Reactive reference to any request error.\r\n * @property {ShallowRef<boolean>} pending - Reactive reference to the pending state.\r\n * @property {function} mutate - Function to manually trigger the request.\r\n * @property {function} lazyMutate - Function to conditionally trigger the request.\r\n * @property {function} setReturnData - Function to set a callback for custom data return.\r\n */\r\nexport const useRequestExt = <A extends any[], R>(options: RequestOptions, request: (...args: A) => Promise<R>, ...args: A) => {\r\n\r\n const defaultValue = dataMap.get(request, getArgKey(args))\r\n const pending = shallowRef(defaultValue === null)\r\n\r\n const data = (options.deep? ref: shallowRef)<R | null>(defaultValue?.data ?? null) as Ref<R | null>\r\n const error = shallowRef<any>(null)\r\n\r\n let lastArgs = [] as any[] as A\r\n let currentArgKey: string | null = null\r\n const mutate = async (...args: A) => {\r\n const argKey = getArgKey(args)\r\n currentArgKey = argKey\r\n\r\n error.value = null\r\n const returnDataValue = returnDataCallback?.(...args)\r\n if (returnDataValue !== undefined) {\r\n pending.value = false\r\n data.value = returnDataValue\r\n return\r\n }\r\n const entry = getEntryOrCreate(request, argKey, { data: null, lastUpdate: -1, updatedManually: false })\r\n data.value = entry.data\r\n pending.value = entry.data === null\r\n lastArgs = args\r\n\r\n if (entry.data && entry.updatedManually) {\r\n triggerRef(data)\r\n return\r\n }\r\n\r\n try {\r\n const resp = await makeRequestWithoutCache(entry, request, ...args)\r\n if (currentArgKey === argKey) {\r\n data.value = resp\r\n }\r\n } catch (e) {\r\n error.value = e\r\n // throw e\r\n } finally {\r\n delete entry.promise\r\n pending.value = false\r\n }\r\n }\r\n\r\n const lazyMutate = async (...args: A) => {\r\n const argKey = getArgKey(args)\r\n currentArgKey = argKey\r\n const entry = dataMap.get(request, argKey)\r\n if (entry !== null && entry.lastUpdate > 0 && Date.now() < entry.lastUpdate + 1000*30) {\r\n data.value = entry.data\r\n error.value = null\r\n lastArgs = args\r\n return\r\n }\r\n mutate(...args)\r\n }\r\n\r\n let returnDataCallback: (...args: A) => any\r\n const setReturnData = (callback: (...args: A) => any) => {\r\n returnDataCallback = callback\r\n }\r\n\r\n const mutateWithLastArgs = () => mutate(...lastArgs)\r\n\r\n onMounted(() => {\r\n lazyMutate(...args)\r\n })\r\n\r\n onMounted(() => {\r\n events.add(request, mutateWithLastArgs)\r\n })\r\n onBeforeUnmount(() => {\r\n events.remove(request, mutateWithLastArgs)\r\n })\r\n\r\n return { data, error, pending, mutate, lazyMutate, setReturnData }\r\n}\r\n\r\nexport const updateRequestData = async <A extends any[], R>(request: (...args: A) => Promise<R>, data: any, ...args: A) => {\r\n const argKey = getArgKey(args)\r\n const entry = getEntryOrCreate(request, argKey, { data, lastUpdate: Date.now() })\r\n entry.data = data\r\n entry.updatedManually = true\r\n\r\n if (events.get(request).length > 0) {\r\n await Promise.all((events.get(request) ?? []).map(callback => callback()))\r\n }\r\n entry.updatedManually = false\r\n}\r\n\r\n/**\r\n * Deep reactive version of useRequest.\r\n * @template A - The arguments type for the request function.\r\n * @template R - The return type of the request function.\r\n * @param {(...args: A) => Promise<R>} request - The async request function.\r\n * @param {...A} args - Arguments to pass to the request function.\r\n */\r\nexport const useRequestDeep = <A extends any[], R>(request: (...args: A) => Promise<R>, ...args: A) => \r\n useRequestExt({ deep: true }, request, ...args)\r\n\r\n/**\r\n * Basic version of useRequest with shallow reactivity.\r\n * @template A - The arguments type for the request function.\r\n * @template R - The return type of the request function.\r\n * @param {(...args: A) => Promise<R>} request - The async request function.\r\n * @param {...A} args - Arguments to pass to the request function.\r\n */\r\nexport const useRequest = <A extends any[], R>(request: (...args: A) => Promise<R>, ...args: A) => \r\n useRequestExt({ deep: false }, request, ...args)\r\n\r\ntype MapWatch <Type>= {\r\n [Key in keyof Type]: WatchSource<Type[Key]>;\r\n};\r\n\r\n/**\r\n * useRequest with reactive arguments that automatically re-fetches when args change.\r\n * @template A - The arguments type for the request function.\r\n * @template R - The return type of the request function.\r\n * @param {(...args: A) => Promise<R>} request - The async request function.\r\n * @param {...MapWatch<A>} args - Reactive arguments to watch.\r\n */\r\nexport const useRequestWatch = <A extends any[], R>(request: (...args: A) => Promise<R>, ...args: MapWatch<A>) => {\r\n const resp = useRequestExt({ deep: false }, request, ...args.map(item => typeof item === \"function\"? item(): item.value) as A)\r\n\r\n watch(args, (args) => {\r\n resp.lazyMutate(...args as A)\r\n })\r\n\r\n return resp\r\n}\r\n\r\n/**\r\n * Deep reactive version of useRequest with reactive arguments.\r\n * @template A - The arguments type for the request function.\r\n * @template R - The return type of the request function.\r\n * @param {(...args: A) => Promise<R>} request - The async request function.\r\n * @param {...MapWatch<A>} args - Reactive arguments to watch.\r\n */\r\nexport const useRequestDeepWatch = <A extends any[], R>(request: (...args: A) => Promise<R>, ...args: MapWatch<A>) => {\r\n const resp = useRequestExt({ deep: true }, request, ...args.map(item => typeof item === \"function\"? item(): item.value) as A)\r\n\r\n watch(args, (args) => {\r\n resp.lazyMutate(...args as A)\r\n })\r\n\r\n return resp\r\n}\r\n\r\n/**\r\n * Revalidates all cached data for a request function and optionally triggers updates.\r\n * @template A - The arguments type for the request function.\r\n * @param {(...args: A) => Promise<any>} request - The request function to revalidate.\r\n * @param {boolean} [triggerRequests=true] - Whether to trigger pending requests.\r\n * @returns {Promise<void>} A promise that resolves when revalidation is complete.\r\n */\r\nexport const mutateRequestFull = async <A extends any[]>(request: (...args: A) => Promise<any>, triggerRequests = true) => {\r\n dataMap.deletePair(request)\r\n if (triggerRequests && events.get(request).length > 0) {\r\n await Promise.all((events.get(request) ?? []).map(callback => callback()))\r\n }\r\n}\r\n\r\n// TODO: exec promise only for specific arguments\r\n/**\r\n * Revalidates cached data for specific arguments of a request function.\r\n * @template A - The arguments type for the request function.\r\n * @param {(...args: A) => Promise<any>} request - The request function to revalidate.\r\n * @param {...A} args - Specific arguments to revalidate.\r\n * @returns {Promise<void>} A promise that resolves when revalidation is complete.\r\n */\r\nexport const mutateRequest = async <A extends any[]>(request: (...args: A) => Promise<any>, ...args: A) => {\r\n dataMap.delete(request, getArgKey(args))\r\n if (events.get(request).length > 0) {\r\n await Promise.all((events.get(request) ?? []).map(callback => callback()))\r\n }\r\n}\r\n\r\n/**\r\n * Clears all cached request data and event listeners.\r\n */\r\nexport const resetRequestCache = () => {\r\n events._map.clear()\r\n dataMap.clear()\r\n}\r\n\r\nconst makeRequestWithoutCache = async <A extends any[], R>(entry: DataEntry, request: (...args: A) => Promise<R>, ...args: A) => {\r\n if (!entry.promise) {\r\n const promise = (async () => {\r\n const resp = await request(...args) as UnwrapRef<R>\r\n entry.data = resp\r\n entry.lastUpdate = Date.now()\r\n delete entry.promise\r\n })()\r\n entry.promise = promise\r\n }\r\n await entry.promise!\r\n return entry.data\r\n}\r\n\r\n/**\r\n * Makes a request with caching support.\r\n * @template A - The arguments type for the request function.\r\n * @template R - The return type of the request function.\r\n * @param {(...args: A) => Promise<R>} request - The async request function.\r\n * @param {...A} args - Arguments to pass to the request function.\r\n * @returns {Promise<R>} A promise that resolves with the request result.\r\n */\r\nexport const makeRequest = async <A extends any[], R>(request: (...args: A) => Promise<R>, ...args: A) => {\r\n const argKey = getArgKey(args)\r\n const entry = getEntryOrCreate(request, argKey, { data: null, lastUpdate: -1 })\r\n if (entry !== null && entry.lastUpdate > 0) {\r\n return entry.data\r\n }\r\n return await makeRequestWithoutCache(entry, request, ...args)\r\n}","import { type WatchSource, computed } from \"vue\"\r\n\r\nexport const getSearchFeed = (str: string, dotToSpace: boolean = true): string[] => {\r\n const reg = dotToSpace ? /[_\\-,()]/g : /[_\\-.,()]/g;\r\n const arr = str\r\n .toLowerCase()\r\n .replace(reg, \" \")\r\n .split(\" \")\r\n .filter(a => a.length > 0);\r\n return arr;\r\n};\r\n\r\nexport const compareSearchFeed = (source: string[], target: string[]): boolean => {\r\n for (const str2 of target) {\r\n let find = false;\r\n for (const str of source) {\r\n if (str.startsWith(str2)) {\r\n find = true;\r\n }\r\n }\r\n if (!find) return false;\r\n }\r\n return true;\r\n};\r\n\r\nexport const findByKeys = <T>(source: T[], keys: string[][], target: string[]) => {\r\n return source.filter((_, index) => compareSearchFeed(keys[index], target))\r\n}\r\n\r\nconst getValue = <T>(item: WatchSource<T>): T => {\r\n return (typeof item === 'function'? item(): item.value)\r\n}\r\n\r\n/** Complex reactivity search based on key */\r\nexport const useSearch = <T>(\r\n searchValue: WatchSource<string | string[]>, \r\n data: WatchSource<T[]>, \r\n keyExtractor: (item: T) => string | string[],\r\n) => {\r\n \r\n const searchKeys = computed(() => {\r\n return getValue(data)?.map(item => {\r\n const data = keyExtractor(item)\r\n return Array.isArray(data)? data: getSearchFeed(data)\r\n }) ?? []\r\n })\r\n\r\n const dataSearched = computed(() => {\r\n const val = getValue(searchValue)\r\n const searchFeed = Array.isArray(val)? val: getSearchFeed(val)\r\n \r\n const currentData = getValue(data)\r\n if (searchFeed.length === 0 || !currentData) return currentData\r\n\r\n return findByKeys(currentData, searchKeys.value, searchFeed)\r\n })\r\n\r\n return dataSearched\r\n}","import { type WatchSource, watch } from \"vue\";\r\nimport { MultiMap } from \"../utils/multimap\";\r\n\r\nlet listeners = new MultiMap<string, (e: KeyboardEvent) => void>()\r\n\r\nexport const getKeyDownListeners = () => {\r\n return listeners\r\n}\r\nexport const setKeyDownListeners = (_listeners: any) => {\r\n listeners = _listeners\r\n}\r\n\r\nexport const handleKeyDownLayer = (e: KeyboardEvent) => {\r\n if (!listeners.has(e.code)) return\r\n const _listeners = listeners.get(e.code)\r\n e.preventDefault()\r\n const callback = _listeners[_listeners.length-1]\r\n callback(e)\r\n}\r\n\r\n/** Add layout for keydown event */\r\nexport const useKeyDownLayer = (key: string, watcher: WatchSource<boolean>, callback: () => void) => {\r\n\r\n watch(watcher, (value) => {\r\n const hasEvent = listeners.size > 0\r\n if (value) {\r\n listeners.add(key, callback)\r\n } else {\r\n listeners.remove(key, callback)\r\n }\r\n if (listeners.size > 0 && !hasEvent) {\r\n document.addEventListener(\"keydown\", handleKeyDownLayer)\r\n }\r\n if (listeners.size === 0) {\r\n document.removeEventListener(\"keydown\", handleKeyDownLayer)\r\n }\r\n }, { immediate: true })\r\n}\r\n","import type { VNode } from \"vue\"\r\n\r\nexport type Block = {\r\n id: string,\r\n name: string,\r\n isDev?: boolean,\r\n hidden?: boolean,\r\n group?: string,\r\n order?: number,\r\n props?: any,\r\n slots?: Record<string, any> \r\n}\r\n\r\nexport type ContentBlock = {\r\n id: string,\r\n blockId: string,\r\n data: any,\r\n vnode?: VNode | (() => VNode),\r\n children?: ContentBlock[] | Record<string, ContentBlock[]>\r\n}\r\n\r\nexport type DataEntry = {\r\n id: string,\r\n title?: string,\r\n props?: any\r\n}\r\n\r\nexport type DataEntryScope = \"site\" | \"folder\" | \"page\"\r\n\r\nexport type State = {\r\n content: ContentBlock[], \r\n data: Record<string, any>,\r\n query: Record<string, any>,\r\n dataEntryScopes?: Record<string, DataEntryScope>\r\n}\r\n\r\nexport class BlockDropEvent extends Event {\r\n content: ContentBlock | null = null\r\n block: Block\r\n constructor(block: Block, content: ContentBlock | null = null) {\r\n super(\"blockdrop\", { bubbles: true })\r\n this.block = block\r\n this.content = content\r\n }\r\n}\r\n\r\nexport type PageLink = { id: string, url?: string, query?: string, title: string, external?: boolean, openNewTab?: boolean }\r\n","<template>\r\n <div class=\"v-form-control\" :class=\"{ error: !!props.error, disabled: props.disabled }\">\r\n <label v-if=\"!!props.label\" class=\"v-form-control__label\">\r\n {{ props.label }}<span v-if=\"props.required\" class=\"v-form-control__required-marker\">*</span>\r\n </label>\r\n <div v-if=\"props.outline\" class=\"v-form-control__outline\">\r\n <slot></slot>\r\n </div>\r\n <slot v-else></slot>\r\n <div v-if=\"$slots.actions\" class=\"v-form-control__actions\">\r\n <slot name=\"actions\"></slot>\r\n </div>\r\n <Transition>\r\n <div v-if=\"!!props.error\" class=\"v-form-control__error\">\r\n {{ error }}\r\n </div>\r\n </Transition>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\n\r\nexport type VFormControlProps = {\r\n error?: { message?: string, code?: string },\r\n label?: string\r\n required?: boolean,\r\n disabled?: boolean\r\n}\r\n\r\n</script>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { computed, inject } from 'vue';\r\n\r\nconst props = defineProps<VFormControlProps & { outline?: boolean }>()\r\n\r\nconst error = computed(() => {\r\n if (!props.error) return \"\"\r\n if (typeof props.error === \"string\") return errorMap[props.error] ?? props.error\r\n const code = props.error[\"code\"]\r\n if (code && code in errorMap) {\r\n return errorMap[code] ?? \"\"\r\n }\r\n return props.error.message ?? \"Произошла ошибка\"\r\n})\r\n\r\nconst errorMap = inject(\"errorMap\", {}) as Record<string, string>\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n\r\n.v-form-control\r\n display: flex\r\n flex-direction: column\r\n align-items: stretch\r\n position: relative\r\n transition: padding-bottom 0.12s cubic-bezier(0.4, 0, 0.2, 1)\r\n\r\n &.error\r\n &:not(.disablePadding)\r\n padding-bottom: 16px\r\n\r\n .v-form-control__label\r\n color: var(--error-color)\r\n\r\n .v-form-control__outline\r\n border-color: var(--error-color)\r\n\r\n &.disabled\r\n pointer-events: none\r\n opacity: 0.6\r\n\r\n.v-form-control .v-icon-button\r\n background-color: var(--placeholder-color)\r\n color: white\r\n width: 20px\r\n height: 20px\r\n border: 2px solid var(--blocks-color)\r\n\r\n &:hover\r\n background-color: var(--input-border-color)\r\n\r\n &:focus-within\r\n background-color: var(--input-border-color)\r\n\r\n.v-form-control__outline\r\n display: flex\r\n border-radius: 8px\r\n // transition: border-color 0.12s\r\n font-size: 13px\r\n position: relative\r\n box-sizing: border-box\r\n border: 1px solid var(--input-border-color)\r\n box-sizing: border-box\r\n\r\n &:focus-within\r\n border-color: var(--primary-color)\r\n box-shadow: 0 0 0 2px var(--shadow-color)\r\n\r\n.v-form-control__label\r\n font-size: 13px\r\n margin-bottom: 4px\r\n white-space: nowrap\r\n font-weight: 500\r\n user-select: none\r\n color: var(--text-color-alt)\r\n\r\n.v-form-control__required-marker\r\n color: var(--primary-color)\r\n user-select: none\r\n margin-left: 0.15em\r\n\r\n.v-form-control__error\r\n position: absolute\r\n bottom: 0\r\n font-size: 12px\r\n color: var(--error-color)\r\n transition: opacity 0.12s, transform 0.12s cubic-bezier(0.4, 0, 0.2, 1)\r\n width: 100%\r\n\r\n &.v-enter-from, &.v-leave-to\r\n opacity: 0\r\n\r\n.v-form-control.disablePadding .v-form-control__error\r\n bottom: -16px\r\n &.v-enter-from, &.v-leave-to\r\n transform: translateY(-16px)\r\n\r\n.v-form-control__actions\r\n position: absolute\r\n top: -4px\r\n right: 0\r\n display: flex\r\n align-items: center\r\n\r\n .v-icon-button\r\n width: 24px\r\n height: 24px\r\n color: var(--text-secondary-color)\r\n\r\n svg\r\n max-width: 16px\r\n max-height: 16px\r\n\r\n</style>","import { shallowRef, watchEffect, readonly, watch, customRef, getCurrentScope, onScopeDispose, effectScope, getCurrentInstance, hasInjectionContext, inject, provide, ref, isRef, unref, toValue as toValue$1, computed, reactive, toRefs as toRefs$1, toRef as toRef$1, onBeforeMount, nextTick, onBeforeUnmount, onMounted, onUnmounted, isReactive } from 'vue';\n\nfunction computedEager(fn, options) {\n var _a;\n const result = shallowRef();\n watchEffect(() => {\n result.value = fn();\n }, {\n ...options,\n flush: (_a = options == null ? void 0 : options.flush) != null ? _a : \"sync\"\n });\n return readonly(result);\n}\n\nfunction computedWithControl(source, fn) {\n let v = void 0;\n let track;\n let trigger;\n const dirty = shallowRef(true);\n const update = () => {\n dirty.value = true;\n trigger();\n };\n watch(source, update, { flush: \"sync\" });\n const get = typeof fn === \"function\" ? fn : fn.get;\n const set = typeof fn === \"function\" ? void 0 : fn.set;\n const result = customRef((_track, _trigger) => {\n track = _track;\n trigger = _trigger;\n return {\n get() {\n if (dirty.value) {\n v = get(v);\n dirty.value = false;\n }\n track();\n return v;\n },\n set(v2) {\n set == null ? void 0 : set(v2);\n }\n };\n });\n if (Object.isExtensible(result))\n result.trigger = update;\n return result;\n}\n\nfunction tryOnScopeDispose(fn) {\n if (getCurrentScope()) {\n onScopeDispose(fn);\n return true;\n }\n return false;\n}\n\nfunction createEventHook() {\n const fns = /* @__PURE__ */ new Set();\n const off = (fn) => {\n fns.delete(fn);\n };\n const clear = () => {\n fns.clear();\n };\n const on = (fn) => {\n fns.add(fn);\n const offFn = () => off(fn);\n tryOnScopeDispose(offFn);\n return {\n off: offFn\n };\n };\n const trigger = (...args) => {\n return Promise.all(Array.from(fns).map((fn) => fn(...args)));\n };\n return {\n on,\n off,\n trigger,\n clear\n };\n}\n\nfunction createGlobalState(stateFactory) {\n let initialized = false;\n let state;\n const scope = effectScope(true);\n return (...args) => {\n if (!initialized) {\n state = scope.run(() => stateFactory(...args));\n initialized = true;\n }\n return state;\n };\n}\n\nconst localProvidedStateMap = /* @__PURE__ */ new WeakMap();\n\nconst injectLocal = (...args) => {\n var _a;\n const key = args[0];\n const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy;\n if (instance == null && !hasInjectionContext())\n throw new Error(\"injectLocal must be called in setup\");\n if (instance && localProvidedStateMap.has(instance) && key in localProvidedStateMap.get(instance))\n return localProvidedStateMap.get(instance)[key];\n return inject(...args);\n};\n\nconst provideLocal = (key, value) => {\n var _a;\n const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy;\n if (instance == null)\n throw new Error(\"provideLocal must be called in setup\");\n if (!localProvidedStateMap.has(instance))\n localProvidedStateMap.set(instance, /* @__PURE__ */ Object.create(null));\n const localProvidedState = localProvidedStateMap.get(instance);\n localProvidedState[key] = value;\n provide(key, value);\n};\n\nfunction createInjectionState(composable, options) {\n const key = (options == null ? void 0 : options.injectionKey) || Symbol(composable.name || \"InjectionState\");\n const defaultValue = options == null ? void 0 : options.defaultValue;\n const useProvidingState = (...args) => {\n const state = composable(...args);\n provideLocal(key, state);\n return state;\n };\n const useInjectedState = () => injectLocal(key, defaultValue);\n return [useProvidingState, useInjectedState];\n}\n\nfunction createRef(value, deep) {\n if (deep === true) {\n return ref(value);\n } else {\n return shallowRef(value);\n }\n}\n\nfunction createSharedComposable(composable) {\n let subscribers = 0;\n let state;\n let scope;\n const dispose = () => {\n subscribers -= 1;\n if (scope && subscribers <= 0) {\n scope.stop();\n state = void 0;\n scope = void 0;\n }\n };\n return (...args) => {\n subscribers += 1;\n if (!scope) {\n scope = effectScope(true);\n state = scope.run(() => composable(...args));\n }\n tryOnScopeDispose(dispose);\n return state;\n };\n}\n\nfunction extendRef(ref, extend, { enumerable = false, unwrap = true } = {}) {\n for (const [key, value] of Object.entries(extend)) {\n if (key === \"value\")\n continue;\n if (isRef(value) && unwrap) {\n Object.defineProperty(ref, key, {\n get() {\n return value.value;\n },\n set(v) {\n value.value = v;\n },\n enumerable\n });\n } else {\n Object.defineProperty(ref, key, { value, enumerable });\n }\n }\n return ref;\n}\n\nfunction get(obj, key) {\n if (key == null)\n return unref(obj);\n return unref(obj)[key];\n}\n\nfunction isDefined(v) {\n return unref(v) != null;\n}\n\nfunction makeDestructurable(obj, arr) {\n if (typeof Symbol !== \"undefined\") {\n const clone = { ...obj };\n Object.defineProperty(clone, Symbol.iterator, {\n enumerable: false,\n value() {\n let index = 0;\n return {\n next: () => ({\n value: arr[index++],\n done: index > arr.length\n })\n };\n }\n });\n return clone;\n } else {\n return Object.assign([...arr], obj);\n }\n}\n\nfunction reactify(fn, options) {\n const unrefFn = (options == null ? void 0 : options.computedGetter) === false ? unref : toValue$1;\n return function(...args) {\n return computed(() => fn.apply(this, args.map((i) => unrefFn(i))));\n };\n}\n\nfunction reactifyObject(obj, optionsOrKeys = {}) {\n let keys = [];\n let options;\n if (Array.isArray(optionsOrKeys)) {\n keys = optionsOrKeys;\n } else {\n options = optionsOrKeys;\n const { includeOwnProperties = true } = optionsOrKeys;\n keys.push(...Object.keys(obj));\n if (includeOwnProperties)\n keys.push(...Object.getOwnPropertyNames(obj));\n }\n return Object.fromEntries(\n keys.map((key) => {\n const value = obj[key];\n return [\n key,\n typeof value === \"function\" ? reactify(value.bind(obj), options) : value\n ];\n })\n );\n}\n\nfunction toReactive(objectRef) {\n if (!isRef(objectRef))\n return reactive(objectRef);\n const proxy = new Proxy({}, {\n get(_, p, receiver) {\n return unref(Reflect.get(objectRef.value, p, receiver));\n },\n set(_, p, value) {\n if (isRef(objectRef.value[p]) && !isRef(value))\n objectRef.value[p].value = value;\n else\n objectRef.value[p] = value;\n return true;\n },\n deleteProperty(_, p) {\n return Reflect.deleteProperty(objectRef.value, p);\n },\n has(_, p) {\n return Reflect.has(objectRef.value, p);\n },\n ownKeys() {\n return Object.keys(objectRef.value);\n },\n getOwnPropertyDescriptor() {\n return {\n enumerable: true,\n configurable: true\n };\n }\n });\n return reactive(proxy);\n}\n\nfunction reactiveComputed(fn) {\n return toReactive(computed(fn));\n}\n\nfunction reactiveOmit(obj, ...keys) {\n const flatKeys = keys.flat();\n const predicate = flatKeys[0];\n return reactiveComputed(() => typeof predicate === \"function\" ? Object.fromEntries(Object.entries(toRefs$1(obj)).filter(([k, v]) => !predicate(toValue$1(v), k))) : Object.fromEntries(Object.entries(toRefs$1(obj)).filter((e) => !flatKeys.includes(e[0]))));\n}\n\nconst isClient = typeof window !== \"undefined\" && typeof document !== \"undefined\";\nconst isWorker = typeof WorkerGlobalScope !== \"undefined\" && globalThis instanceof WorkerGlobalScope;\nconst isDef = (val) => typeof val !== \"undefined\";\nconst notNullish = (val) => val != null;\nconst assert = (condition, ...infos) => {\n if (!condition)\n console.warn(...infos);\n};\nconst toString = Object.prototype.toString;\nconst isObject = (val) => toString.call(val) === \"[object Object]\";\nconst now = () => Date.now();\nconst timestamp = () => +Date.now();\nconst clamp = (n, min, max) => Math.min(max, Math.max(min, n));\nconst noop = () => {\n};\nconst rand = (min, max) => {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n};\nconst hasOwn = (val, key) => Object.prototype.hasOwnProperty.call(val, key);\nconst isIOS = /* @__PURE__ */ getIsIOS();\nfunction getIsIOS() {\n var _a, _b;\n return isClient && ((_a = window == null ? void 0 : window.navigator) == null ? void 0 : _a.userAgent) && (/iP(?:ad|hone|od)/.test(window.navigator.userAgent) || ((_b = window == null ? void 0 : window.navigator) == null ? void 0 : _b.maxTouchPoints) > 2 && /iPad|Macintosh/.test(window == null ? void 0 : window.navigator.userAgent));\n}\n\nfunction createFilterWrapper(filter, fn) {\n function wrapper(...args) {\n return new Promise((resolve, reject) => {\n Promise.resolve(filter(() => fn.apply(this, args), { fn, thisArg: this, args })).then(resolve).catch(reject);\n });\n }\n return wrapper;\n}\nconst bypassFilter = (invoke) => {\n return invoke();\n};\nfunction debounceFilter(ms, options = {}) {\n let timer;\n let maxTimer;\n let lastRejector = noop;\n const _clearTimeout = (timer2) => {\n clearTimeout(timer2);\n lastRejector();\n lastRejector = noop;\n };\n let lastInvoker;\n const filter = (invoke) => {\n const duration = toValue$1(ms);\n const maxDuration = toValue$1(options.maxWait);\n if (timer)\n _clearTimeout(timer);\n if (duration <= 0 || maxDuration !== void 0 && maxDuration <= 0) {\n if (maxTimer) {\n _clearTimeout(maxTimer);\n maxTimer = null;\n }\n return Promise.resolve(invoke());\n }\n return new Promise((resolve, reject) => {\n lastRejector = options.rejectOnCancel ? reject : resolve;\n lastInvoker = invoke;\n if (maxDuration && !maxTimer) {\n maxTimer = setTimeout(() => {\n if (timer)\n _clearTimeout(timer);\n maxTimer = null;\n resolve(lastInvoker());\n }, maxDuration);\n }\n timer = setTimeout(() => {\n if (maxTimer)\n _clearTimeout(maxTimer);\n maxTimer = null;\n resolve(invoke());\n }, duration);\n });\n };\n return filter;\n}\nfunction throttleFilter(...args) {\n let lastExec = 0;\n let timer;\n let isLeading = true;\n let lastRejector = noop;\n let lastValue;\n let ms;\n let trailing;\n let leading;\n let rejectOnCancel;\n if (!isRef(args[0]) && typeof args[0] === \"object\")\n ({ delay: ms, trailing = true, leading = true, rejectOnCancel = false } = args[0]);\n else\n [ms, trailing = true, leading = true, rejectOnCancel = false] = args;\n const clear = () => {\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n lastRejector();\n lastRejector = noop;\n }\n };\n const filter = (_invoke) => {\n const duration = toValue$1(ms);\n const elapsed = Date.now() - lastExec;\n const invoke = () => {\n return lastValue = _invoke();\n };\n clear();\n if (duration <= 0) {\n lastExec = Date.now();\n return invoke();\n }\n if (elapsed > duration && (leading || !isLeading)) {\n lastExec = Date.now();\n invoke();\n } else if (trailing) {\n lastValue = new Promise((resolve, reject) => {\n lastRejector = rejectOnCancel ? reject : resolve;\n timer = setTimeout(() => {\n lastExec = Date.now();\n isLeading = true;\n resolve(invoke());\n clear();\n }, Math.max(0, duration - elapsed));\n });\n }\n if (!leading && !timer)\n timer = setTimeout(() => isLeading = true, duration);\n isLeading = false;\n return lastValue;\n };\n return filter;\n}\nfunction pausableFilter(extendFilter = bypassFilter, options = {}) {\n const {\n initialState = \"active\"\n } = options;\n const isActive = toRef(initialState === \"active\");\n function pause() {\n isActive.value = false;\n }\n function resume() {\n isActive.value = true;\n }\n const eventFilter = (...args) => {\n if (isActive.value)\n extendFilter(...args);\n };\n return { isActive: readonly(isActive), pause, resume, eventFilter };\n}\n\nfunction cacheStringFunction(fn) {\n const cache = /* @__PURE__ */ Object.create(null);\n return (str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n };\n}\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, \"-$1\").toLowerCase());\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction((str) => {\n return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n});\n\nfunction promiseTimeout(ms, throwOnTimeout = false, reason = \"Timeout\") {\n return new Promise((resolve, reject) => {\n if (throwOnTimeout)\n setTimeout(() => reject(reason), ms);\n else\n setTimeout(resolve, ms);\n });\n}\nfunction identity(arg) {\n return arg;\n}\nfunction createSingletonPromise(fn) {\n let _promise;\n function wrapper() {\n if (!_promise)\n _promise = fn();\n return _promise;\n }\n wrapper.reset = async () => {\n const _prev = _promise;\n _promise = void 0;\n if (_prev)\n await _prev;\n };\n return wrapper;\n}\nfunction invoke(fn) {\n return fn();\n}\nfunction containsProp(obj, ...props) {\n return props.some((k) => k in obj);\n}\nfunction increaseWithUnit(target, delta) {\n var _a;\n if (typeof target === \"number\")\n return target + delta;\n const value = ((_a = target.match(/^-?\\d+\\.?\\d*/)) == null ? void 0 : _a[0]) || \"\";\n const unit = target.slice(value.length);\n const result = Number.parseFloat(value) + delta;\n if (Number.isNaN(result))\n return target;\n return result + unit;\n}\nfunction pxValue(px) {\n return px.endsWith(\"rem\") ? Number.parseFloat(px) * 16 : Number.parseFloat(px);\n}\nfunction objectPick(obj, keys, omitUndefined = false) {\n return keys.reduce((n, k) => {\n if (k in obj) {\n if (!omitUndefined || obj[k] !== void 0)\n n[k] = obj[k];\n }\n return n;\n }, {});\n}\nfunction objectOmit(obj, keys, omitUndefined = false) {\n return Object.fromEntries(Object.entries(obj).filter(([key, value]) => {\n return (!omitUndefined || value !== void 0) && !keys.includes(key);\n }));\n}\nfunction objectEntries(obj) {\n return Object.entries(obj);\n}\nfunction getLifeCycleTarget(target) {\n return target || getCurrentInstance();\n}\nfunction toArray(value) {\n return Array.isArray(value) ? value : [value];\n}\n\nfunction toRef(...args) {\n if (args.length !== 1)\n return toRef$1(...args);\n const r = args[0];\n return typeof r === \"function\" ? readonly(customRef(() => ({ get: r, set: noop }))) : ref(r);\n}\nconst resolveRef = toRef;\n\nfunction reactivePick(obj, ...keys) {\n const flatKeys = keys.flat();\n const predicate = flatKeys[0];\n return reactiveComputed(() => typeof predicate === \"function\" ? Object.fromEntries(Object.entries(toRefs$1(obj)).filter(([k, v]) => predicate(toValue$1(v), k))) : Object.fromEntries(flatKeys.map((k) => [k, toRef(obj, k)])));\n}\n\nfunction refAutoReset(defaultValue, afterMs = 1e4) {\n return customRef((track, trigger) => {\n let value = toValue$1(defaultValue);\n let timer;\n const resetAfter = () => setTimeout(() => {\n value = toValue$1(defaultValue);\n trigger();\n }, toValue$1(afterMs));\n tryOnScopeDispose(() => {\n clearTimeout(timer);\n });\n return {\n get() {\n track();\n return value;\n },\n set(newValue) {\n value = newValue;\n trigger();\n clearTimeout(timer);\n timer = resetAfter();\n }\n };\n });\n}\n\nfunction useDebounceFn(fn, ms = 200, options = {}) {\n return createFilterWrapper(\n debounceFilter(ms, options),\n fn\n );\n}\n\nfunction refDebounced(value, ms = 200, options = {}) {\n const debounced = ref(value.value);\n const updater = useDebounceFn(() => {\n debounced.value = value.value;\n }, ms, options);\n watch(value, () => updater());\n return debounced;\n}\n\nfunction refDefault(source, defaultValue) {\n return computed({\n get() {\n var _a;\n return (_a = source.value) != null ? _a : defaultValue;\n },\n set(value) {\n source.value = value;\n }\n });\n}\n\nfunction useThrottleFn(fn, ms = 200, trailing = false, leading = true, rejectOnCancel = false) {\n return createFilterWrapper(\n throttleFilter(ms, trailing, leading, rejectOnCancel),\n fn\n );\n}\n\nfunction refThrottled(value, delay = 200, trailing = true, leading = true) {\n if (delay <= 0)\n return value;\n const throttled = ref(value.value);\n const updater = useThrottleFn(() => {\n throttled.value = value.value;\n }, delay, trailing, leading);\n watch(value, () => updater());\n return throttled;\n}\n\nfunction refWithControl(initial, options = {}) {\n let source = initial;\n let track;\n let trigger;\n const ref = customRef((_track, _trigger) => {\n track = _track;\n trigger = _trigger;\n return {\n get() {\n return get();\n },\n set(v) {\n set(v);\n }\n };\n });\n function get(tracking = true) {\n if (tracking)\n track();\n return source;\n }\n function set(value, triggering = true) {\n var _a, _b;\n if (value === source)\n return;\n const old = source;\n if (((_a = options.onBeforeChange) == null ? void 0 : _a.call(options, value, old)) === false)\n return;\n source = value;\n (_b = options.onChanged) == null ? void 0 : _b.call(options, value, old);\n if (triggering)\n trigger();\n }\n const untrackedGet = () => get(false);\n const silentSet = (v) => set(v, false);\n const peek = () => get(false);\n const lay = (v) => set(v, false);\n return extendRef(\n ref,\n {\n get,\n set,\n untrackedGet,\n silentSet,\n peek,\n lay\n },\n { enumerable: true }\n );\n}\nconst controlledRef = refWithControl;\n\nfunction set(...args) {\n if (args.length === 2) {\n const [ref, value] = args;\n ref.value = value;\n }\n if (args.length === 3) {\n const [target, key, value] = args;\n target[key] = value;\n }\n}\n\nfunction watchWithFilter(source, cb, options = {}) {\n const {\n eventFilter = bypassFilter,\n ...watchOptions\n } = options;\n return watch(\n source,\n createFilterWrapper(\n eventFilter,\n cb\n ),\n watchOptions\n );\n}\n\nfunction watchPausable(source, cb, options = {}) {\n const {\n eventFilter: filter,\n initialState = \"active\",\n ...watchOptions\n } = options;\n const { eventFilter, pause, resume, isActive } = pausableFilter(filter, { initialState });\n const stop = watchWithFilter(\n source,\n cb,\n {\n ...watchOptions,\n eventFilter\n }\n );\n return { stop, pause, resume, isActive };\n}\n\nfunction syncRef(left, right, ...[options]) {\n const {\n flush = \"sync\",\n deep = false,\n immediate = true,\n direction = \"both\",\n transform = {}\n } = options || {};\n const watchers = [];\n const transformLTR = \"ltr\" in transform && transform.ltr || ((v) => v);\n const transformRTL = \"rtl\" in transform && transform.rtl || ((v) => v);\n if (direction === \"both\" || direction === \"ltr\") {\n watchers.push(watchPausable(\n left,\n (newValue) => {\n watchers.forEach((w) => w.pause());\n right.value = transformLTR(newValue);\n watchers.forEach((w) => w.resume());\n },\n { flush, deep, immediate }\n ));\n }\n if (direction === \"both\" || direction === \"rtl\") {\n watchers.push(watchPausable(\n right,\n (newValue) => {\n watchers.forEach((w) => w.pause());\n left.value = transformRTL(newValue);\n watchers.forEach((w) => w.resume());\n },\n { flush, deep, immediate }\n ));\n }\n const stop = () => {\n watchers.forEach((w) => w.stop());\n };\n return stop;\n}\n\nfunction syncRefs(source, targets, options = {}) {\n const {\n flush = \"sync\",\n deep = false,\n immediate = true\n } = options;\n const targetsArray = toArray(targets);\n return watch(\n source,\n (newValue) => targetsArray.forEach((target) => target.value = newValue),\n { flush, deep, immediate }\n );\n}\n\nfunction toRefs(objectRef, options = {}) {\n if (!isRef(objectRef))\n return toRefs$1(objectRef);\n const result = Array.isArray(objectRef.value) ? Array.from({ length: objectRef.value.length }) : {};\n for (const key in objectRef.value) {\n result[key] = customRef(() => ({\n get() {\n return objectRef.value[key];\n },\n set(v) {\n var _a;\n const replaceRef = (_a = toValue$1(options.replaceRef)) != null ? _a : true;\n if (replaceRef) {\n if (Array.isArray(objectRef.value)) {\n const copy = [...objectRef.value];\n copy[key] = v;\n objectRef.value = copy;\n } else {\n const newObject = { ...objectRef.value, [key]: v };\n Object.setPrototypeOf(newObject, Object.getPrototypeOf(objectRef.value));\n objectRef.value = newObject;\n }\n } else {\n objectRef.value[key] = v;\n }\n }\n }));\n }\n return result;\n}\n\nconst toValue = toValue$1;\nconst resolveUnref = toValue$1;\n\nfunction tryOnBeforeMount(fn, sync = true, target) {\n const instance = getLifeCycleTarget(target);\n if (instance)\n onBeforeMount(fn, target);\n else if (sync)\n fn();\n else\n nextTick(fn);\n}\n\nfunction tryOnBeforeUnmount(fn, target) {\n const instance = getLifeCycleTarget(target);\n if (instance)\n onBeforeUnmount(fn, target);\n}\n\nfunction tryOnMounted(fn, sync = true, target) {\n const instance = getLifeCycleTarget();\n if (instance)\n onMounted(fn, target);\n else if (sync)\n fn();\n else\n nextTick(fn);\n}\n\nfunction tryOnUnmounted(fn, target) {\n const instance = getLifeCycleTarget(target);\n if (instance)\n onUnmounted(fn, target);\n}\n\nfunction createUntil(r, isNot = false) {\n function toMatch(condition, { flush = \"sync\", deep = false, timeout, throwOnTimeout } = {}) {\n let stop = null;\n const watcher = new Promise((resolve) => {\n stop = watch(\n r,\n (v) => {\n if (condition(v) !== isNot) {\n if (stop)\n stop();\n else\n nextTick(() => stop == null ? void 0 : stop());\n resolve(v);\n }\n },\n {\n flush,\n deep,\n immediate: true\n }\n );\n });\n const promises = [watcher];\n if (timeout != null) {\n promises.push(\n promiseTimeout(timeout, throwOnTimeout).then(() => toValue$1(r)).finally(() => stop == null ? void 0 : stop())\n );\n }\n return Promise.race(promises);\n }\n function toBe(value, options) {\n if (!isRef(value))\n return toMatch((v) => v === value, options);\n const { flush = \"sync\", deep = false, timeout, throwOnTimeout } = options != null ? options : {};\n let stop = null;\n const watcher = new Promise((resolve) => {\n stop = watch(\n [r, value],\n ([v1, v2]) => {\n if (isNot !== (v1 === v2)) {\n if (stop)\n stop();\n else\n nextTick(() => stop == null ? void 0 : stop());\n resolve(v1);\n }\n },\n {\n flush,\n deep,\n immediate: true\n }\n );\n });\n const promises = [watcher];\n if (timeout != null) {\n promises.push(\n promiseTimeout(timeout, throwOnTimeout).then(() => toValue$1(r)).finally(() => {\n stop == null ? void 0 : stop();\n return toValue$1(r);\n })\n );\n }\n return Promise.race(promises);\n }\n function toBeTruthy(options) {\n return toMatch((v) => Boolean(v), options);\n }\n function toBeNull(options) {\n return toBe(null, options);\n }\n function toBeUndefined(options) {\n return toBe(void 0, options);\n }\n function toBeNaN(options) {\n return toMatch(Number.isNaN, options);\n }\n function toContains(value, options) {\n return toMatch((v) => {\n const array = Array.from(v);\n return array.includes(value) || array.includes(toValue$1(value));\n }, options);\n }\n function changed(options) {\n return changedTimes(1, options);\n }\n function changedTimes(n = 1, options) {\n let count = -1;\n return toMatch(() => {\n count += 1;\n return count >= n;\n }, options);\n }\n if (Array.isArray(toValue$1(r))) {\n const instance = {\n toMatch,\n toContains,\n changed,\n changedTimes,\n get not() {\n return createUntil(r, !isNot);\n }\n };\n return instance;\n } else {\n const instance = {\n toMatch,\n toBe,\n toBeTruthy,\n toBeNull,\n toBeNaN,\n toBeUndefined,\n changed,\n changedTimes,\n get not() {\n return createUntil(r, !isNot);\n }\n };\n return instance;\n }\n}\nfunction until(r) {\n return createUntil(r);\n}\n\nfunction defaultComparator(value, othVal) {\n return value === othVal;\n}\nfunction useArrayDifference(...args) {\n var _a, _b;\n const list = args[0];\n const values = args[1];\n let compareFn = (_a = args[2]) != null ? _a : defaultComparator;\n const {\n symmetric = false\n } = (_b = args[3]) != null ? _b : {};\n if (typeof compareFn === \"string\") {\n const key = compareFn;\n compareFn = (value, othVal) => value[key] === othVal[key];\n }\n const diff1 = computed(() => toValue$1(list).filter((x) => toValue$1(values).findIndex((y) => compareFn(x, y)) === -1));\n if (symmetric) {\n const diff2 = computed(() => toValue$1(values).filter((x) => toValue$1(list).findIndex((y) => compareFn(x, y)) === -1));\n return computed(() => symmetric ? [...toValue$1(diff1), ...toValue$1(diff2)] : toValue$1(diff1));\n } else {\n return diff1;\n }\n}\n\nfunction useArrayEvery(list, fn) {\n return computed(() => toValue$1(list).every((element, index, array) => fn(toValue$1(element), index, array)));\n}\n\nfunction useArrayFilter(list, fn) {\n return computed(() => toValue$1(list).map((i) => toValue$1(i)).filter(fn));\n}\n\nfunction useArrayFind(list, fn) {\n return computed(() => toValue$1(\n toValue$1(list).find((element, index, array) => fn(toValue$1(element), index, array))\n ));\n}\n\nfunction useArrayFindIndex(list, fn) {\n return computed(() => toValue$1(list).findIndex((element, index, array) => fn(toValue$1(element), index, array)));\n}\n\nfunction findLast(arr, cb) {\n let index = arr.length;\n while (index-- > 0) {\n if (cb(arr[index], index, arr))\n return arr[index];\n }\n return void 0;\n}\nfunction useArrayFindLast(list, fn) {\n return computed(() => toValue$1(\n !Array.prototype.findLast ? findLast(toValue$1(list), (element, index, array) => fn(toValue$1(element), index, array)) : toValue$1(list).findLast((element, index, array) => fn(toValue$1(element), index, array))\n ));\n}\n\nfunction isArrayIncludesOptions(obj) {\n return isObject(obj) && containsProp(obj, \"formIndex\", \"comparator\");\n}\nfunction useArrayIncludes(...args) {\n var _a;\n const list = args[0];\n const value = args[1];\n let comparator = args[2];\n let formIndex = 0;\n if (isArrayIncludesOptions(comparator)) {\n formIndex = (_a = comparator.fromIndex) != null ? _a : 0;\n comparator = comparator.comparator;\n }\n if (typeof comparator === \"string\") {\n const key = comparator;\n comparator = (element, value2) => element[key] === toValue$1(value2);\n }\n comparator = comparator != null ? comparator : (element, value2) => element === toValue$1(value2);\n return computed(() => toValue$1(list).slice(formIndex).some((element, index, array) => comparator(\n toValue$1(element),\n toValue$1(value),\n index,\n toValue$1(array)\n )));\n}\n\nfunction useArrayJoin(list, separator) {\n return computed(() => toValue$1(list).map((i) => toValue$1(i)).join(toValue$1(separator)));\n}\n\nfunction useArrayMap(list, fn) {\n return computed(() => toValue$1(list).map((i) => toValue$1(i)).map(fn));\n}\n\nfunction useArrayReduce(list, reducer, ...args) {\n const reduceCallback = (sum, value, index) => reducer(toValue$1(sum), toValue$1(value), index);\n return computed(() => {\n const resolved = toValue$1(list);\n return args.length ? resolved.reduce(reduceCallback, typeof args[0] === \"function\" ? toValue$1(args[0]()) : toValue$1(args[0])) : resolved.reduce(reduceCallback);\n });\n}\n\nfunction useArraySome(list, fn) {\n return computed(() => toValue$1(list).some((element, index, array) => fn(toValue$1(element), index, array)));\n}\n\nfunction uniq(array) {\n return Array.from(new Set(array));\n}\nfunction uniqueElementsBy(array, fn) {\n return array.reduce((acc, v) => {\n if (!acc.some((x) => fn(v, x, array)))\n acc.push(v);\n return acc;\n }, []);\n}\nfunction useArrayUnique(list, compareFn) {\n return computed(() => {\n const resolvedList = toValue$1(list).map((element) => toValue$1(element));\n return compareFn ? uniqueElementsBy(resolvedList, compareFn) : uniq(resolvedList);\n });\n}\n\nfunction useCounter(initialValue = 0, options = {}) {\n let _initialValue = unref(initialValue);\n const count = shallowRef(initialValue);\n const {\n max = Number.POSITIVE_INFINITY,\n min = Number.NEGATIVE_INFINITY\n } = options;\n const inc = (delta = 1) => count.value = Math.max(Math.min(max, count.value + delta), min);\n const dec = (delta = 1) => count.value = Math.min(Math.max(min, count.value - delta), max);\n const get = () => count.value;\n const set = (val) => count.value = Math.max(min, Math.min(max, val));\n const reset = (val = _initialValue) => {\n _initialValue = val;\n return set(val);\n };\n return { count, inc, dec, get, set, reset };\n}\n\nconst REGEX_PARSE = /^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[T\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/i;\nconst REGEX_FORMAT = /[YMDHhms]o|\\[([^\\]]+)\\]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a{1,2}|A{1,2}|m{1,2}|s{1,2}|Z{1,2}|z{1,4}|SSS/g;\nfunction defaultMeridiem(hours, minutes, isLowercase, hasPeriod) {\n let m = hours < 12 ? \"AM\" : \"PM\";\n if (hasPeriod)\n m = m.split(\"\").reduce((acc, curr) => acc += `${curr}.`, \"\");\n return isLowercase ? m.toLowerCase() : m;\n}\nfunction formatOrdinal(num) {\n const suffixes = [\"th\", \"st\", \"nd\", \"rd\"];\n const v = num % 100;\n return num + (suffixes[(v - 20) % 10] || suffixes[v] || suffixes[0]);\n}\nfunction formatDate(date, formatStr, options = {}) {\n var _a;\n const years = date.getFullYear();\n const month = date.getMonth();\n const days = date.getDate();\n const hours = date.getHours();\n const minutes = date.getMinutes();\n const seconds = date.getSeconds();\n const milliseconds = date.getMilliseconds();\n const day = date.getDay();\n const meridiem = (_a = options.customMeridiem) != null ? _a : defaultMeridiem;\n const stripTimeZone = (dateString) => {\n var _a2;\n return (_a2 = dateString.split(\" \")[1]) != null ? _a2 : \"\";\n };\n const matches = {\n Yo: () => formatOrdinal(years),\n YY: () => String(years).slice(-2),\n YYYY: () => years,\n M: () => month + 1,\n Mo: () => formatOrdinal(month + 1),\n MM: () => `${month + 1}`.padStart(2, \"0\"),\n MMM: () => date.toLocaleDateString(toValue$1(options.locales), { month: \"short\" }),\n MMMM: () => date.toLocaleDateString(toValue$1(options.locales), { month: \"long\" }),\n D: () => String(days),\n Do: () => formatOrdinal(days),\n DD: () => `${days}`.padStart(2, \"0\"),\n H: () => String(hours),\n Ho: () => formatOrdinal(hours),\n HH: () => `${hours}`.padStart(2, \"0\"),\n h: () => `${hours % 12 || 12}`.padStart(1, \"0\"),\n ho: () => formatOrdinal(hours % 12 || 12),\n hh: () => `${hours % 12 || 12}`.padStart(2, \"0\"),\n m: () => String(minutes),\n mo: () => formatOrdinal(minutes),\n mm: () => `${minutes}`.padStart(2, \"0\"),\n s: () => String(seconds),\n so: () => formatOrdinal(seconds),\n ss: () => `${seconds}`.padStart(2, \"0\"),\n SSS: () => `${milliseconds}`.padStart(3, \"0\"),\n d: () => day,\n dd: () => date.toLocaleDateString(toValue$1(options.locales), { weekday: \"narrow\" }),\n ddd: () => date.toLocaleDateString(toValue$1(options.locales), { weekday: \"short\" }),\n dddd: () => date.toLocaleDateString(toValue$1(options.locales), { weekday: \"long\" }),\n A: () => meridiem(hours, minutes),\n AA: () => meridiem(hours, minutes, false, true),\n a: () => meridiem(hours, minutes, true),\n aa: () => meridiem(hours, minutes, true, true),\n z: () => stripTimeZone(date.toLocaleDateString(toValue$1(options.locales), { timeZoneName: \"shortOffset\" })),\n zz: () => stripTimeZone(date.toLocaleDateString(toValue$1(options.locales), { timeZoneName: \"shortOffset\" })),\n zzz: () => stripTimeZone(date.toLocaleDateString(toValue$1(options.locales), { timeZoneName: \"shortOffset\" })),\n zzzz: () => stripTimeZone(date.toLocaleDateString(toValue$1(options.locales), { timeZoneName: \"longOffset\" }))\n };\n return formatStr.replace(REGEX_FORMAT, (match, $1) => {\n var _a2, _b;\n return (_b = $1 != null ? $1 : (_a2 = matches[match]) == null ? void 0 : _a2.call(matches)) != null ? _b : match;\n });\n}\nfunction normalizeDate(date) {\n if (date === null)\n return new Date(Number.NaN);\n if (date === void 0)\n return /* @__PURE__ */ new Date();\n if (date instanceof Date)\n return new Date(date);\n if (typeof date === \"string\" && !/Z$/i.test(date)) {\n const d = date.match(REGEX_PARSE);\n if (d) {\n const m = d[2] - 1 || 0;\n const ms = (d[7] || \"0\").substring(0, 3);\n return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);\n }\n }\n return new Date(date);\n}\nfunction useDateFormat(date, formatStr = \"HH:mm:ss\", options = {}) {\n return computed(() => formatDate(normalizeDate(toValue$1(date)), toValue$1(formatStr), options));\n}\n\nfunction useIntervalFn(cb, interval = 1e3, options = {}) {\n const {\n immediate = true,\n immediateCallback = false\n } = options;\n let timer = null;\n const isActive = shallowRef(false);\n function clean() {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n }\n function pause() {\n isActive.value = false;\n clean();\n }\n function resume() {\n const intervalValue = toValue$1(interval);\n if (intervalValue <= 0)\n return;\n isActive.value = true;\n if (immediateCallback)\n cb();\n clean();\n if (isActive.value)\n timer = setInterval(cb, intervalValue);\n }\n if (immediate && isClient)\n resume();\n if (isRef(interval) || typeof interval === \"function\") {\n const stopWatch = watch(interval, () => {\n if (isActive.value && isClient)\n resume();\n });\n tryOnScopeDispose(stopWatch);\n }\n tryOnScopeDispose(pause);\n return {\n isActive,\n pause,\n resume\n };\n}\n\nfunction useInterval(interval = 1e3, options = {}) {\n const {\n controls: exposeControls = false,\n immediate = true,\n callback\n } = options;\n const counter = shallowRef(0);\n const update = () => counter.value += 1;\n const reset = () => {\n counter.value = 0;\n };\n const controls = useIntervalFn(\n callback ? () => {\n update();\n callback(counter.value);\n } : update,\n interval,\n { immediate }\n );\n if (exposeControls) {\n return {\n counter,\n reset,\n ...controls\n };\n } else {\n return counter;\n }\n}\n\nfunction useLastChanged(source, options = {}) {\n var _a;\n const ms = shallowRef((_a = options.initialValue) != null ? _a : null);\n watch(\n source,\n () => ms.value = timestamp(),\n options\n );\n return ms;\n}\n\nfunction useTimeoutFn(cb, interval, options = {}) {\n const {\n immediate = true,\n immediateCallback = false\n } = options;\n const isPending = shallowRef(false);\n let timer = null;\n function clear() {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n }\n function stop() {\n isPending.value = false;\n clear();\n }\n function start(...args) {\n if (immediateCallback)\n cb();\n clear();\n isPending.value = true;\n timer = setTimeout(() => {\n isPending.value = false;\n timer = null;\n cb(...args);\n }, toValue$1(interval));\n }\n if (immediate) {\n isPending.value = true;\n if (isClient)\n start();\n }\n tryOnScopeDispose(stop);\n return {\n isPending: readonly(isPending),\n start,\n stop\n };\n}\n\nfunction useTimeout(interval = 1e3, options = {}) {\n const {\n controls: exposeControls = false,\n callback\n } = options;\n const controls = useTimeoutFn(\n callback != null ? callback : noop,\n interval,\n options\n );\n const ready = computed(() => !controls.isPending.value);\n if (exposeControls) {\n return {\n ready,\n ...controls\n };\n } else {\n return ready;\n }\n}\n\nfunction useToNumber(value, options = {}) {\n const {\n method = \"parseFloat\",\n radix,\n nanToZero\n } = options;\n return computed(() => {\n let resolved = toValue$1(value);\n if (typeof method === \"function\")\n resolved = method(resolved);\n else if (typeof resolved === \"string\")\n resolved = Number[method](resolved, radix);\n if (nanToZero && Number.isNaN(resolved))\n resolved = 0;\n return resolved;\n });\n}\n\nfunction useToString(value) {\n return computed(() => `${toValue$1(value)}`);\n}\n\nfunction useToggle(initialValue = false, options = {}) {\n const {\n truthyValue = true,\n falsyValue = false\n } = options;\n const valueIsRef = isRef(initialValue);\n const _value = shallowRef(initialValue);\n function toggle(value) {\n if (arguments.length) {\n _value.value = value;\n return _value.value;\n } else {\n const truthy = toValue$1(truthyValue);\n _value.value = _value.value === truthy ? toValue$1(falsyValue) : truthy;\n return _value.value;\n }\n }\n if (valueIsRef)\n return toggle;\n else\n return [_value, toggle];\n}\n\nfunction watchArray(source, cb, options) {\n let oldList = (options == null ? void 0 : options.immediate) ? [] : [...typeof source === \"function\" ? source() : Array.isArray(source) ? source : toValue$1(source)];\n return watch(source, (newList, _, onCleanup) => {\n const oldListRemains = Array.from({ length: oldList.length });\n const added = [];\n for (const obj of newList) {\n let found = false;\n for (let i = 0; i < oldList.length; i++) {\n if (!oldListRemains[i] && obj === oldList[i]) {\n oldListRemains[i] = true;\n found = true;\n break;\n }\n }\n if (!found)\n added.push(obj);\n }\n const removed = oldList.filter((_2, i) => !oldListRemains[i]);\n cb(newList, oldList, added, removed, onCleanup);\n oldList = [...newList];\n }, options);\n}\n\nfunction watchAtMost(source, cb, options) {\n const {\n count,\n ...watchOptions\n } = options;\n const current = shallowRef(0);\n const stop = watchWithFilter(\n source,\n (...args) => {\n current.value += 1;\n if (current.value >= toValue$1(count))\n nextTick(() => stop());\n cb(...args);\n },\n watchOptions\n );\n return { count: current, stop };\n}\n\nfunction watchDebounced(source, cb, options = {}) {\n const {\n debounce = 0,\n maxWait = void 0,\n ...watchOptions\n } = options;\n return watchWithFilter(\n source,\n cb,\n {\n ...watchOptions,\n eventFilter: debounceFilter(debounce, { maxWait })\n }\n );\n}\n\nfunction watchDeep(source, cb, options) {\n return watch(\n source,\n cb,\n {\n ...options,\n deep: true\n }\n );\n}\n\nfunction watchIgnorable(source, cb, options = {}) {\n const {\n eventFilter = bypassFilter,\n ...watchOptions\n } = options;\n const filteredCb = createFilterWrapper(\n eventFilter,\n cb\n );\n let ignoreUpdates;\n let ignorePrevAsyncUpdates;\n let stop;\n if (watchOptions.flush === \"sync\") {\n const ignore = shallowRef(false);\n ignorePrevAsyncUpdates = () => {\n };\n ignoreUpdates = (updater) => {\n ignore.value = true;\n updater();\n ignore.value = false;\n };\n stop = watch(\n source,\n (...args) => {\n if (!ignore.value)\n filteredCb(...args);\n },\n watchOptions\n );\n } else {\n const disposables = [];\n const ignoreCounter = shallowRef(0);\n const syncCounter = shallowRef(0);\n ignorePrevAsyncUpdates = () => {\n ignoreCounter.value = syncCounter.value;\n };\n disposables.push(\n watch(\n source,\n () => {\n syncCounter.value++;\n },\n { ...watchOptions, flush: \"sync\" }\n )\n );\n ignoreUpdates = (updater) => {\n const syncCounterPrev = syncCounter.value;\n updater();\n ignoreCounter.value += syncCounter.value - syncCounterPrev;\n };\n disposables.push(\n watch(\n source,\n (...args) => {\n const ignore = ignoreCounter.value > 0 && ignoreCounter.value === syncCounter.value;\n ignoreCounter.value = 0;\n syncCounter.value = 0;\n if (ignore)\n return;\n filteredCb(...args);\n },\n watchOptions\n )\n );\n stop = () => {\n disposables.forEach((fn) => fn());\n };\n }\n return { stop, ignoreUpdates, ignorePrevAsyncUpdates };\n}\n\nfunction watchImmediate(source, cb, options) {\n return watch(\n source,\n cb,\n {\n ...options,\n immediate: true\n }\n );\n}\n\nfunction watchOnce(source, cb, options) {\n const stop = watch(source, (...args) => {\n nextTick(() => stop());\n return cb(...args);\n }, options);\n return stop;\n}\n\nfunction watchThrottled(source, cb, options = {}) {\n const {\n throttle = 0,\n trailing = true,\n leading = true,\n ...watchOptions\n } = options;\n return watchWithFilter(\n source,\n cb,\n {\n ...watchOptions,\n eventFilter: throttleFilter(throttle, trailing, leading)\n }\n );\n}\n\nfunction watchTriggerable(source, cb, options = {}) {\n let cleanupFn;\n function onEffect() {\n if (!cleanupFn)\n return;\n const fn = cleanupFn;\n cleanupFn = void 0;\n fn();\n }\n function onCleanup(callback) {\n cleanupFn = callback;\n }\n const _cb = (value, oldValue) => {\n onEffect();\n return cb(value, oldValue, onCleanup);\n };\n const res = watchIgnorable(source, _cb, options);\n const { ignoreUpdates } = res;\n const trigger = () => {\n let res2;\n ignoreUpdates(() => {\n res2 = _cb(getWatchSources(source), getOldValue(source));\n });\n return res2;\n };\n return {\n ...res,\n trigger\n };\n}\nfunction getWatchSources(sources) {\n if (isReactive(sources))\n return sources;\n if (Array.isArray(sources))\n return sources.map((item) => toValue$1(item));\n return toValue$1(sources);\n}\nfunction getOldValue(source) {\n return Array.isArray(source) ? source.map(() => void 0) : void 0;\n}\n\nfunction whenever(source, cb, options) {\n const stop = watch(\n source,\n (v, ov, onInvalidate) => {\n if (v) {\n if (options == null ? void 0 : options.once)\n nextTick(() => stop());\n cb(v, ov, onInvalidate);\n }\n },\n {\n ...options,\n once: false\n }\n );\n return stop;\n}\n\nexport { assert, refAutoReset as autoResetRef, bypassFilter, camelize, clamp, computedEager, computedWithControl, containsProp, computedWithControl as controlledComputed, controlledRef, createEventHook, createFilterWrapper, createGlobalState, createInjectionState, reactify as createReactiveFn, createRef, createSharedComposable, createSingletonPromise, debounceFilter, refDebounced as debouncedRef, watchDebounced as debouncedWatch, computedEager as eagerComputed, extendRef, formatDate, get, getLifeCycleTarget, hasOwn, hyphenate, identity, watchIgnorable as ignorableWatch, increaseWithUnit, injectLocal, invoke, isClient, isDef, isDefined, isIOS, isObject, isWorker, makeDestructurable, noop, normalizeDate, notNullish, now, objectEntries, objectOmit, objectPick, pausableFilter, watchPausable as pausableWatch, promiseTimeout, provideLocal, pxValue, rand, reactify, reactifyObject, reactiveComputed, reactiveOmit, reactivePick, refAutoReset, refDebounced, refDefault, refThrottled, refWithControl, resolveRef, resolveUnref, set, syncRef, syncRefs, throttleFilter, refThrottled as throttledRef, watchThrottled as throttledWatch, timestamp, toArray, toReactive, toRef, toRefs, toValue, tryOnBeforeMount, tryOnBeforeUnmount, tryOnMounted, tryOnScopeDispose, tryOnUnmounted, until, useArrayDifference, useArrayEvery, useArrayFilter, useArrayFind, useArrayFindIndex, useArrayFindLast, useArrayIncludes, useArrayJoin, useArrayMap, useArrayReduce, useArraySome, useArrayUnique, useCounter, useDateFormat, refDebounced as useDebounce, useDebounceFn, useInterval, useIntervalFn, useLastChanged, refThrottled as useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useToNumber, useToString, useToggle, watchArray, watchAtMost, watchDebounced, watchDeep, watchIgnorable, watchImmediate, watchOnce, watchPausable, watchThrottled, watchTriggerable, watchWithFilter, whenever };\n","import { noop, makeDestructurable, camelize, isClient, toArray, watchImmediate, isObject, tryOnScopeDispose, isIOS, notNullish, tryOnMounted, objectOmit, promiseTimeout, until, injectLocal, provideLocal, pxValue, increaseWithUnit, objectEntries, createRef, createSingletonPromise, useTimeoutFn, pausableWatch, toRef, createEventHook, useIntervalFn, computedWithControl, timestamp, pausableFilter, watchIgnorable, debounceFilter, bypassFilter, createFilterWrapper, toRefs, watchOnce, containsProp, hasOwn, throttleFilter, useDebounceFn, useThrottleFn, tryOnUnmounted, clamp, syncRef, objectPick, watchWithFilter, identity, isDef, whenever, isWorker } from '@vueuse/shared';\nexport * from '@vueuse/shared';\nimport { isRef, shallowRef, ref, watchEffect, computed, inject, defineComponent, h, TransitionGroup, shallowReactive, Fragment, toValue, unref, getCurrentInstance, onMounted, watch, customRef, onUpdated, readonly, reactive, hasInjectionContext, toRaw, nextTick, markRaw, getCurrentScope, isReadonly, onBeforeUpdate } from 'vue';\n\nfunction computedAsync(evaluationCallback, initialState, optionsOrRef) {\n let options;\n if (isRef(optionsOrRef)) {\n options = {\n evaluating: optionsOrRef\n };\n } else {\n options = optionsOrRef || {};\n }\n const {\n lazy = false,\n evaluating = void 0,\n shallow = true,\n onError = noop\n } = options;\n const started = shallowRef(!lazy);\n const current = shallow ? shallowRef(initialState) : ref(initialState);\n let counter = 0;\n watchEffect(async (onInvalidate) => {\n if (!started.value)\n return;\n counter++;\n const counterAtBeginning = counter;\n let hasFinished = false;\n if (evaluating) {\n Promise.resolve().then(() => {\n evaluating.value = true;\n });\n }\n try {\n const result = await evaluationCallback((cancelCallback) => {\n onInvalidate(() => {\n if (evaluating)\n evaluating.value = false;\n if (!hasFinished)\n cancelCallback();\n });\n });\n if (counterAtBeginning === counter)\n current.value = result;\n } catch (e) {\n onError(e);\n } finally {\n if (evaluating && counterAtBeginning === counter)\n evaluating.value = false;\n hasFinished = true;\n }\n });\n if (lazy) {\n return computed(() => {\n started.value = true;\n return current.value;\n });\n } else {\n return current;\n }\n}\n\nfunction computedInject(key, options, defaultSource, treatDefaultAsFactory) {\n let source = inject(key);\n if (defaultSource)\n source = inject(key, defaultSource);\n if (treatDefaultAsFactory)\n source = inject(key, defaultSource, treatDefaultAsFactory);\n if (typeof options === \"function\") {\n return computed((ctx) => options(source, ctx));\n } else {\n return computed({\n get: (ctx) => options.get(source, ctx),\n set: options.set\n });\n }\n}\n\nfunction createReusableTemplate(options = {}) {\n const {\n inheritAttrs = true\n } = options;\n const render = shallowRef();\n const define = /*@__PURE__*/ defineComponent({\n setup(_, { slots }) {\n return () => {\n render.value = slots.default;\n };\n }\n });\n const reuse = /*@__PURE__*/ defineComponent({\n inheritAttrs,\n props: options.props,\n setup(props, { attrs, slots }) {\n return () => {\n var _a;\n if (!render.value && process.env.NODE_ENV !== \"production\")\n throw new Error(\"[VueUse] Failed to find the definition of reusable template\");\n const vnode = (_a = render.value) == null ? void 0 : _a.call(render, {\n ...options.props == null ? keysToCamelKebabCase(attrs) : props,\n $slots: slots\n });\n return inheritAttrs && (vnode == null ? void 0 : vnode.length) === 1 ? vnode[0] : vnode;\n };\n }\n });\n return makeDestructurable(\n { define, reuse },\n [define, reuse]\n );\n}\nfunction keysToCamelKebabCase(obj) {\n const newObj = {};\n for (const key in obj)\n newObj[camelize(key)] = obj[key];\n return newObj;\n}\n\nfunction createTemplatePromise(options = {}) {\n let index = 0;\n const instances = ref([]);\n function create(...args) {\n const props = shallowReactive({\n key: index++,\n args,\n promise: void 0,\n resolve: () => {\n },\n reject: () => {\n },\n isResolving: false,\n options\n });\n instances.value.push(props);\n props.promise = new Promise((_resolve, _reject) => {\n props.resolve = (v) => {\n props.isResolving = true;\n return _resolve(v);\n };\n props.reject = _reject;\n }).finally(() => {\n props.promise = void 0;\n const index2 = instances.value.indexOf(props);\n if (index2 !== -1)\n instances.value.splice(index2, 1);\n });\n return props.promise;\n }\n function start(...args) {\n if (options.singleton && instances.value.length > 0)\n return instances.value[0].promise;\n return create(...args);\n }\n const component = /*@__PURE__*/ defineComponent((_, { slots }) => {\n const renderList = () => instances.value.map((props) => {\n var _a;\n return h(Fragment, { key: props.key }, (_a = slots.default) == null ? void 0 : _a.call(slots, props));\n });\n if (options.transition)\n return () => h(TransitionGroup, options.transition, renderList);\n return renderList;\n });\n component.start = start;\n return component;\n}\n\nfunction createUnrefFn(fn) {\n return function(...args) {\n return fn.apply(this, args.map((i) => toValue(i)));\n };\n}\n\nconst defaultWindow = isClient ? window : void 0;\nconst defaultDocument = isClient ? window.document : void 0;\nconst defaultNavigator = isClient ? window.navigator : void 0;\nconst defaultLocation = isClient ? window.location : void 0;\n\nfunction unrefElement(elRef) {\n var _a;\n const plain = toValue(elRef);\n return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;\n}\n\nfunction useEventListener(...args) {\n const cleanups = [];\n const cleanup = () => {\n cleanups.forEach((fn) => fn());\n cleanups.length = 0;\n };\n const register = (el, event, listener, options) => {\n el.addEventListener(event, listener, options);\n return () => el.removeEventListener(event, listener, options);\n };\n const firstParamTargets = computed(() => {\n const test = toArray(toValue(args[0])).filter((e) => e != null);\n return test.every((e) => typeof e !== \"string\") ? test : void 0;\n });\n const stopWatch = watchImmediate(\n () => {\n var _a, _b;\n return [\n (_b = (_a = firstParamTargets.value) == null ? void 0 : _a.map((e) => unrefElement(e))) != null ? _b : [defaultWindow].filter((e) => e != null),\n toArray(toValue(firstParamTargets.value ? args[1] : args[0])),\n toArray(unref(firstParamTargets.value ? args[2] : args[1])),\n // @ts-expect-error - TypeScript gets the correct types, but somehow still complains\n toValue(firstParamTargets.value ? args[3] : args[2])\n ];\n },\n ([raw_targets, raw_events, raw_listeners, raw_options]) => {\n cleanup();\n if (!(raw_targets == null ? void 0 : raw_targets.length) || !(raw_events == null ? void 0 : raw_events.length) || !(raw_listeners == null ? void 0 : raw_listeners.length))\n return;\n const optionsClone = isObject(raw_options) ? { ...raw_options } : raw_options;\n cleanups.push(\n ...raw_targets.flatMap(\n (el) => raw_events.flatMap(\n (event) => raw_listeners.map((listener) => register(el, event, listener, optionsClone))\n )\n )\n );\n },\n { flush: \"post\" }\n );\n const stop = () => {\n stopWatch();\n cleanup();\n };\n tryOnScopeDispose(cleanup);\n return stop;\n}\n\nlet _iOSWorkaround = false;\nfunction onClickOutside(target, handler, options = {}) {\n const { window = defaultWindow, ignore = [], capture = true, detectIframe = false, controls = false } = options;\n if (!window) {\n return controls ? { stop: noop, cancel: noop, trigger: noop } : noop;\n }\n if (isIOS && !_iOSWorkaround) {\n _iOSWorkaround = true;\n const listenerOptions = { passive: true };\n Array.from(window.document.body.children).forEach((el) => useEventListener(el, \"click\", noop, listenerOptions));\n useEventListener(window.document.documentElement, \"click\", noop, listenerOptions);\n }\n let shouldListen = true;\n const shouldIgnore = (event) => {\n return toValue(ignore).some((target2) => {\n if (typeof target2 === \"string\") {\n return Array.from(window.document.querySelectorAll(target2)).some((el) => el === event.target || event.composedPath().includes(el));\n } else {\n const el = unrefElement(target2);\n return el && (event.target === el || event.composedPath().includes(el));\n }\n });\n };\n function hasMultipleRoots(target2) {\n const vm = toValue(target2);\n return vm && vm.$.subTree.shapeFlag === 16;\n }\n function checkMultipleRoots(target2, event) {\n const vm = toValue(target2);\n const children = vm.$.subTree && vm.$.subTree.children;\n if (children == null || !Array.isArray(children))\n return false;\n return children.some((child) => child.el === event.target || event.composedPath().includes(child.el));\n }\n const listener = (event) => {\n const el = unrefElement(target);\n if (event.target == null)\n return;\n if (!(el instanceof Element) && hasMultipleRoots(target) && checkMultipleRoots(target, event))\n return;\n if (!el || el === event.target || event.composedPath().includes(el))\n return;\n if (\"detail\" in event && event.detail === 0)\n shouldListen = !shouldIgnore(event);\n if (!shouldListen) {\n shouldListen = true;\n return;\n }\n handler(event);\n };\n let isProcessingClick = false;\n const cleanup = [\n useEventListener(window, \"click\", (event) => {\n if (!isProcessingClick) {\n isProcessingClick = true;\n setTimeout(() => {\n isProcessingClick = false;\n }, 0);\n listener(event);\n }\n }, { passive: true, capture }),\n useEventListener(window, \"pointerdown\", (e) => {\n const el = unrefElement(target);\n shouldListen = !shouldIgnore(e) && !!(el && !e.composedPath().includes(el));\n }, { passive: true }),\n detectIframe && useEventListener(window, \"blur\", (event) => {\n setTimeout(() => {\n var _a;\n const el = unrefElement(target);\n if (((_a = window.document.activeElement) == null ? void 0 : _a.tagName) === \"IFRAME\" && !(el == null ? void 0 : el.contains(window.document.activeElement))) {\n handler(event);\n }\n }, 0);\n }, { passive: true })\n ].filter(Boolean);\n const stop = () => cleanup.forEach((fn) => fn());\n if (controls) {\n return {\n stop,\n cancel: () => {\n shouldListen = false;\n },\n trigger: (event) => {\n shouldListen = true;\n listener(event);\n shouldListen = false;\n }\n };\n }\n return stop;\n}\n\nfunction useMounted() {\n const isMounted = shallowRef(false);\n const instance = getCurrentInstance();\n if (instance) {\n onMounted(() => {\n isMounted.value = true;\n }, instance);\n }\n return isMounted;\n}\n\nfunction useSupported(callback) {\n const isMounted = useMounted();\n return computed(() => {\n isMounted.value;\n return Boolean(callback());\n });\n}\n\nfunction useMutationObserver(target, callback, options = {}) {\n const { window = defaultWindow, ...mutationOptions } = options;\n let observer;\n const isSupported = useSupported(() => window && \"MutationObserver\" in window);\n const cleanup = () => {\n if (observer) {\n observer.disconnect();\n observer = void 0;\n }\n };\n const targets = computed(() => {\n const value = toValue(target);\n const items = toArray(value).map(unrefElement).filter(notNullish);\n return new Set(items);\n });\n const stopWatch = watch(\n () => targets.value,\n (targets2) => {\n cleanup();\n if (isSupported.value && targets2.size) {\n observer = new MutationObserver(callback);\n targets2.forEach((el) => observer.observe(el, mutationOptions));\n }\n },\n { immediate: true, flush: \"post\" }\n );\n const takeRecords = () => {\n return observer == null ? void 0 : observer.takeRecords();\n };\n const stop = () => {\n stopWatch();\n cleanup();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop,\n takeRecords\n };\n}\n\nfunction onElementRemoval(target, callback, options = {}) {\n const {\n window = defaultWindow,\n document = window == null ? void 0 : window.document,\n flush = \"sync\"\n } = options;\n if (!window || !document)\n return noop;\n let stopFn;\n const cleanupAndUpdate = (fn) => {\n stopFn == null ? void 0 : stopFn();\n stopFn = fn;\n };\n const stopWatch = watchEffect(() => {\n const el = unrefElement(target);\n if (el) {\n const { stop } = useMutationObserver(\n document,\n (mutationsList) => {\n const targetRemoved = mutationsList.map((mutation) => [...mutation.removedNodes]).flat().some((node) => node === el || node.contains(el));\n if (targetRemoved) {\n callback(mutationsList);\n }\n },\n {\n window,\n childList: true,\n subtree: true\n }\n );\n cleanupAndUpdate(stop);\n }\n }, { flush });\n const stopHandle = () => {\n stopWatch();\n cleanupAndUpdate();\n };\n tryOnScopeDispose(stopHandle);\n return stopHandle;\n}\n\nfunction createKeyPredicate(keyFilter) {\n if (typeof keyFilter === \"function\")\n return keyFilter;\n else if (typeof keyFilter === \"string\")\n return (event) => event.key === keyFilter;\n else if (Array.isArray(keyFilter))\n return (event) => keyFilter.includes(event.key);\n return () => true;\n}\nfunction onKeyStroke(...args) {\n let key;\n let handler;\n let options = {};\n if (args.length === 3) {\n key = args[0];\n handler = args[1];\n options = args[2];\n } else if (args.length === 2) {\n if (typeof args[1] === \"object\") {\n key = true;\n handler = args[0];\n options = args[1];\n } else {\n key = args[0];\n handler = args[1];\n }\n } else {\n key = true;\n handler = args[0];\n }\n const {\n target = defaultWindow,\n eventName = \"keydown\",\n passive = false,\n dedupe = false\n } = options;\n const predicate = createKeyPredicate(key);\n const listener = (e) => {\n if (e.repeat && toValue(dedupe))\n return;\n if (predicate(e))\n handler(e);\n };\n return useEventListener(target, eventName, listener, passive);\n}\nfunction onKeyDown(key, handler, options = {}) {\n return onKeyStroke(key, handler, { ...options, eventName: \"keydown\" });\n}\nfunction onKeyPressed(key, handler, options = {}) {\n return onKeyStroke(key, handler, { ...options, eventName: \"keypress\" });\n}\nfunction onKeyUp(key, handler, options = {}) {\n return onKeyStroke(key, handler, { ...options, eventName: \"keyup\" });\n}\n\nconst DEFAULT_DELAY = 500;\nconst DEFAULT_THRESHOLD = 10;\nfunction onLongPress(target, handler, options) {\n var _a, _b;\n const elementRef = computed(() => unrefElement(target));\n let timeout;\n let posStart;\n let startTimestamp;\n let hasLongPressed = false;\n function clear() {\n if (timeout) {\n clearTimeout(timeout);\n timeout = void 0;\n }\n posStart = void 0;\n startTimestamp = void 0;\n hasLongPressed = false;\n }\n function onRelease(ev) {\n var _a2, _b2, _c;\n const [_startTimestamp, _posStart, _hasLongPressed] = [startTimestamp, posStart, hasLongPressed];\n clear();\n if (!(options == null ? void 0 : options.onMouseUp) || !_posStart || !_startTimestamp)\n return;\n if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n return;\n if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n ev.preventDefault();\n if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n ev.stopPropagation();\n const dx = ev.x - _posStart.x;\n const dy = ev.y - _posStart.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n options.onMouseUp(ev.timeStamp - _startTimestamp, distance, _hasLongPressed);\n }\n function onDown(ev) {\n var _a2, _b2, _c, _d;\n if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n return;\n clear();\n if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n ev.preventDefault();\n if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n ev.stopPropagation();\n posStart = {\n x: ev.x,\n y: ev.y\n };\n startTimestamp = ev.timeStamp;\n timeout = setTimeout(\n () => {\n hasLongPressed = true;\n handler(ev);\n },\n (_d = options == null ? void 0 : options.delay) != null ? _d : DEFAULT_DELAY\n );\n }\n function onMove(ev) {\n var _a2, _b2, _c, _d;\n if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n return;\n if (!posStart || (options == null ? void 0 : options.distanceThreshold) === false)\n return;\n if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n ev.preventDefault();\n if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n ev.stopPropagation();\n const dx = ev.x - posStart.x;\n const dy = ev.y - posStart.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n if (distance >= ((_d = options == null ? void 0 : options.distanceThreshold) != null ? _d : DEFAULT_THRESHOLD))\n clear();\n }\n const listenerOptions = {\n capture: (_a = options == null ? void 0 : options.modifiers) == null ? void 0 : _a.capture,\n once: (_b = options == null ? void 0 : options.modifiers) == null ? void 0 : _b.once\n };\n const cleanup = [\n useEventListener(elementRef, \"pointerdown\", onDown, listenerOptions),\n useEventListener(elementRef, \"pointermove\", onMove, listenerOptions),\n useEventListener(elementRef, [\"pointerup\", \"pointerleave\"], onRelease, listenerOptions)\n ];\n const stop = () => cleanup.forEach((fn) => fn());\n return stop;\n}\n\nfunction isFocusedElementEditable() {\n const { activeElement, body } = document;\n if (!activeElement)\n return false;\n if (activeElement === body)\n return false;\n switch (activeElement.tagName) {\n case \"INPUT\":\n case \"TEXTAREA\":\n return true;\n }\n return activeElement.hasAttribute(\"contenteditable\");\n}\nfunction isTypedCharValid({\n keyCode,\n metaKey,\n ctrlKey,\n altKey\n}) {\n if (metaKey || ctrlKey || altKey)\n return false;\n if (keyCode >= 48 && keyCode <= 57 || keyCode >= 96 && keyCode <= 105)\n return true;\n if (keyCode >= 65 && keyCode <= 90)\n return true;\n return false;\n}\nfunction onStartTyping(callback, options = {}) {\n const { document: document2 = defaultDocument } = options;\n const keydown = (event) => {\n if (!isFocusedElementEditable() && isTypedCharValid(event)) {\n callback(event);\n }\n };\n if (document2)\n useEventListener(document2, \"keydown\", keydown, { passive: true });\n}\n\nfunction templateRef(key, initialValue = null) {\n const instance = getCurrentInstance();\n let _trigger = () => {\n };\n const element = customRef((track, trigger) => {\n _trigger = trigger;\n return {\n get() {\n var _a, _b;\n track();\n return (_b = (_a = instance == null ? void 0 : instance.proxy) == null ? void 0 : _a.$refs[key]) != null ? _b : initialValue;\n },\n set() {\n }\n };\n });\n tryOnMounted(_trigger);\n onUpdated(_trigger);\n return element;\n}\n\nfunction useActiveElement(options = {}) {\n var _a;\n const {\n window = defaultWindow,\n deep = true,\n triggerOnRemoval = false\n } = options;\n const document = (_a = options.document) != null ? _a : window == null ? void 0 : window.document;\n const getDeepActiveElement = () => {\n var _a2;\n let element = document == null ? void 0 : document.activeElement;\n if (deep) {\n while (element == null ? void 0 : element.shadowRoot)\n element = (_a2 = element == null ? void 0 : element.shadowRoot) == null ? void 0 : _a2.activeElement;\n }\n return element;\n };\n const activeElement = shallowRef();\n const trigger = () => {\n activeElement.value = getDeepActiveElement();\n };\n if (window) {\n const listenerOptions = {\n capture: true,\n passive: true\n };\n useEventListener(\n window,\n \"blur\",\n (event) => {\n if (event.relatedTarget !== null)\n return;\n trigger();\n },\n listenerOptions\n );\n useEventListener(\n window,\n \"focus\",\n trigger,\n listenerOptions\n );\n }\n if (triggerOnRemoval) {\n onElementRemoval(activeElement, trigger, { document });\n }\n trigger();\n return activeElement;\n}\n\nfunction useRafFn(fn, options = {}) {\n const {\n immediate = true,\n fpsLimit = void 0,\n window = defaultWindow,\n once = false\n } = options;\n const isActive = shallowRef(false);\n const intervalLimit = computed(() => {\n return fpsLimit ? 1e3 / toValue(fpsLimit) : null;\n });\n let previousFrameTimestamp = 0;\n let rafId = null;\n function loop(timestamp) {\n if (!isActive.value || !window)\n return;\n if (!previousFrameTimestamp)\n previousFrameTimestamp = timestamp;\n const delta = timestamp - previousFrameTimestamp;\n if (intervalLimit.value && delta < intervalLimit.value) {\n rafId = window.requestAnimationFrame(loop);\n return;\n }\n previousFrameTimestamp = timestamp;\n fn({ delta, timestamp });\n if (once) {\n isActive.value = false;\n rafId = null;\n return;\n }\n rafId = window.requestAnimationFrame(loop);\n }\n function resume() {\n if (!isActive.value && window) {\n isActive.value = true;\n previousFrameTimestamp = 0;\n rafId = window.requestAnimationFrame(loop);\n }\n }\n function pause() {\n isActive.value = false;\n if (rafId != null && window) {\n window.cancelAnimationFrame(rafId);\n rafId = null;\n }\n }\n if (immediate)\n resume();\n tryOnScopeDispose(pause);\n return {\n isActive: readonly(isActive),\n pause,\n resume\n };\n}\n\nfunction useAnimate(target, keyframes, options) {\n let config;\n let animateOptions;\n if (isObject(options)) {\n config = options;\n animateOptions = objectOmit(options, [\"window\", \"immediate\", \"commitStyles\", \"persist\", \"onReady\", \"onError\"]);\n } else {\n config = { duration: options };\n animateOptions = options;\n }\n const {\n window = defaultWindow,\n immediate = true,\n commitStyles,\n persist,\n playbackRate: _playbackRate = 1,\n onReady,\n onError = (e) => {\n console.error(e);\n }\n } = config;\n const isSupported = useSupported(() => window && HTMLElement && \"animate\" in HTMLElement.prototype);\n const animate = shallowRef(void 0);\n const store = shallowReactive({\n startTime: null,\n currentTime: null,\n timeline: null,\n playbackRate: _playbackRate,\n pending: false,\n playState: immediate ? \"idle\" : \"paused\",\n replaceState: \"active\"\n });\n const pending = computed(() => store.pending);\n const playState = computed(() => store.playState);\n const replaceState = computed(() => store.replaceState);\n const startTime = computed({\n get() {\n return store.startTime;\n },\n set(value) {\n store.startTime = value;\n if (animate.value)\n animate.value.startTime = value;\n }\n });\n const currentTime = computed({\n get() {\n return store.currentTime;\n },\n set(value) {\n store.currentTime = value;\n if (animate.value) {\n animate.value.currentTime = value;\n syncResume();\n }\n }\n });\n const timeline = computed({\n get() {\n return store.timeline;\n },\n set(value) {\n store.timeline = value;\n if (animate.value)\n animate.value.timeline = value;\n }\n });\n const playbackRate = computed({\n get() {\n return store.playbackRate;\n },\n set(value) {\n store.playbackRate = value;\n if (animate.value)\n animate.value.playbackRate = value;\n }\n });\n const play = () => {\n if (animate.value) {\n try {\n animate.value.play();\n syncResume();\n } catch (e) {\n syncPause();\n onError(e);\n }\n } else {\n update();\n }\n };\n const pause = () => {\n var _a;\n try {\n (_a = animate.value) == null ? void 0 : _a.pause();\n syncPause();\n } catch (e) {\n onError(e);\n }\n };\n const reverse = () => {\n var _a;\n if (!animate.value)\n update();\n try {\n (_a = animate.value) == null ? void 0 : _a.reverse();\n syncResume();\n } catch (e) {\n syncPause();\n onError(e);\n }\n };\n const finish = () => {\n var _a;\n try {\n (_a = animate.value) == null ? void 0 : _a.finish();\n syncPause();\n } catch (e) {\n onError(e);\n }\n };\n const cancel = () => {\n var _a;\n try {\n (_a = animate.value) == null ? void 0 : _a.cancel();\n syncPause();\n } catch (e) {\n onError(e);\n }\n };\n watch(() => unrefElement(target), (el) => {\n if (el) {\n update();\n } else {\n animate.value = void 0;\n }\n });\n watch(() => keyframes, (value) => {\n if (animate.value) {\n update();\n const targetEl = unrefElement(target);\n if (targetEl) {\n animate.value.effect = new KeyframeEffect(\n targetEl,\n toValue(value),\n animateOptions\n );\n }\n }\n }, { deep: true });\n tryOnMounted(() => update(true), false);\n tryOnScopeDispose(cancel);\n function update(init) {\n const el = unrefElement(target);\n if (!isSupported.value || !el)\n return;\n if (!animate.value)\n animate.value = el.animate(toValue(keyframes), animateOptions);\n if (persist)\n animate.value.persist();\n if (_playbackRate !== 1)\n animate.value.playbackRate = _playbackRate;\n if (init && !immediate)\n animate.value.pause();\n else\n syncResume();\n onReady == null ? void 0 : onReady(animate.value);\n }\n const listenerOptions = { passive: true };\n useEventListener(animate, [\"cancel\", \"finish\", \"remove\"], syncPause, listenerOptions);\n useEventListener(animate, \"finish\", () => {\n var _a;\n if (commitStyles)\n (_a = animate.value) == null ? void 0 : _a.commitStyles();\n }, listenerOptions);\n const { resume: resumeRef, pause: pauseRef } = useRafFn(() => {\n if (!animate.value)\n return;\n store.pending = animate.value.pending;\n store.playState = animate.value.playState;\n store.replaceState = animate.value.replaceState;\n store.startTime = animate.value.startTime;\n store.currentTime = animate.value.currentTime;\n store.timeline = animate.value.timeline;\n store.playbackRate = animate.value.playbackRate;\n }, { immediate: false });\n function syncResume() {\n if (isSupported.value)\n resumeRef();\n }\n function syncPause() {\n if (isSupported.value && window)\n window.requestAnimationFrame(pauseRef);\n }\n return {\n isSupported,\n animate,\n // actions\n play,\n pause,\n reverse,\n finish,\n cancel,\n // state\n pending,\n playState,\n replaceState,\n startTime,\n currentTime,\n timeline,\n playbackRate\n };\n}\n\nfunction useAsyncQueue(tasks, options) {\n const {\n interrupt = true,\n onError = noop,\n onFinished = noop,\n signal\n } = options || {};\n const promiseState = {\n aborted: \"aborted\",\n fulfilled: \"fulfilled\",\n pending: \"pending\",\n rejected: \"rejected\"\n };\n const initialResult = Array.from(Array.from({ length: tasks.length }), () => ({ state: promiseState.pending, data: null }));\n const result = reactive(initialResult);\n const activeIndex = shallowRef(-1);\n if (!tasks || tasks.length === 0) {\n onFinished();\n return {\n activeIndex,\n result\n };\n }\n function updateResult(state, res) {\n activeIndex.value++;\n result[activeIndex.value].data = res;\n result[activeIndex.value].state = state;\n }\n tasks.reduce((prev, curr) => {\n return prev.then((prevRes) => {\n var _a;\n if (signal == null ? void 0 : signal.aborted) {\n updateResult(promiseState.aborted, new Error(\"aborted\"));\n return;\n }\n if (((_a = result[activeIndex.value]) == null ? void 0 : _a.state) === promiseState.rejected && interrupt) {\n onFinished();\n return;\n }\n const done = curr(prevRes).then((currentRes) => {\n updateResult(promiseState.fulfilled, currentRes);\n if (activeIndex.value === tasks.length - 1)\n onFinished();\n return currentRes;\n });\n if (!signal)\n return done;\n return Promise.race([done, whenAborted(signal)]);\n }).catch((e) => {\n if (signal == null ? void 0 : signal.aborted) {\n updateResult(promiseState.aborted, e);\n return e;\n }\n updateResult(promiseState.rejected, e);\n onError();\n return e;\n });\n }, Promise.resolve());\n return {\n activeIndex,\n result\n };\n}\nfunction whenAborted(signal) {\n return new Promise((resolve, reject) => {\n const error = new Error(\"aborted\");\n if (signal.aborted)\n reject(error);\n else\n signal.addEventListener(\"abort\", () => reject(error), { once: true });\n });\n}\n\nfunction useAsyncState(promise, initialState, options) {\n const {\n immediate = true,\n delay = 0,\n onError = noop,\n onSuccess = noop,\n resetOnExecute = true,\n shallow = true,\n throwError\n } = options != null ? options : {};\n const state = shallow ? shallowRef(initialState) : ref(initialState);\n const isReady = shallowRef(false);\n const isLoading = shallowRef(false);\n const error = shallowRef(void 0);\n async function execute(delay2 = 0, ...args) {\n if (resetOnExecute)\n state.value = initialState;\n error.value = void 0;\n isReady.value = false;\n isLoading.value = true;\n if (delay2 > 0)\n await promiseTimeout(delay2);\n const _promise = typeof promise === \"function\" ? promise(...args) : promise;\n try {\n const data = await _promise;\n state.value = data;\n isReady.value = true;\n onSuccess(data);\n } catch (e) {\n error.value = e;\n onError(e);\n if (throwError)\n throw e;\n } finally {\n isLoading.value = false;\n }\n return state.value;\n }\n if (immediate) {\n execute(delay);\n }\n const shell = {\n state,\n isReady,\n isLoading,\n error,\n execute\n };\n function waitUntilIsLoaded() {\n return new Promise((resolve, reject) => {\n until(isLoading).toBe(false).then(() => resolve(shell)).catch(reject);\n });\n }\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilIsLoaded().then(onFulfilled, onRejected);\n }\n };\n}\n\nconst defaults = {\n array: (v) => JSON.stringify(v),\n object: (v) => JSON.stringify(v),\n set: (v) => JSON.stringify(Array.from(v)),\n map: (v) => JSON.stringify(Object.fromEntries(v)),\n null: () => \"\"\n};\nfunction getDefaultSerialization(target) {\n if (!target)\n return defaults.null;\n if (target instanceof Map)\n return defaults.map;\n else if (target instanceof Set)\n return defaults.set;\n else if (Array.isArray(target))\n return defaults.array;\n else\n return defaults.object;\n}\n\nfunction useBase64(target, options) {\n const base64 = shallowRef(\"\");\n const promise = shallowRef();\n function execute() {\n if (!isClient)\n return;\n promise.value = new Promise((resolve, reject) => {\n try {\n const _target = toValue(target);\n if (_target == null) {\n resolve(\"\");\n } else if (typeof _target === \"string\") {\n resolve(blobToBase64(new Blob([_target], { type: \"text/plain\" })));\n } else if (_target instanceof Blob) {\n resolve(blobToBase64(_target));\n } else if (_target instanceof ArrayBuffer) {\n resolve(window.btoa(String.fromCharCode(...new Uint8Array(_target))));\n } else if (_target instanceof HTMLCanvasElement) {\n resolve(_target.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));\n } else if (_target instanceof HTMLImageElement) {\n const img = _target.cloneNode(false);\n img.crossOrigin = \"Anonymous\";\n imgLoaded(img).then(() => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n resolve(canvas.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));\n }).catch(reject);\n } else if (typeof _target === \"object\") {\n const _serializeFn = (options == null ? void 0 : options.serializer) || getDefaultSerialization(_target);\n const serialized = _serializeFn(_target);\n return resolve(blobToBase64(new Blob([serialized], { type: \"application/json\" })));\n } else {\n reject(new Error(\"target is unsupported types\"));\n }\n } catch (error) {\n reject(error);\n }\n });\n promise.value.then((res) => {\n base64.value = (options == null ? void 0 : options.dataUrl) === false ? res.replace(/^data:.*?;base64,/, \"\") : res;\n });\n return promise.value;\n }\n if (isRef(target) || typeof target === \"function\")\n watch(target, execute, { immediate: true });\n else\n execute();\n return {\n base64,\n promise,\n execute\n };\n}\nfunction imgLoaded(img) {\n return new Promise((resolve, reject) => {\n if (!img.complete) {\n img.onload = () => {\n resolve();\n };\n img.onerror = reject;\n } else {\n resolve();\n }\n });\n}\nfunction blobToBase64(blob) {\n return new Promise((resolve, reject) => {\n const fr = new FileReader();\n fr.onload = (e) => {\n resolve(e.target.result);\n };\n fr.onerror = reject;\n fr.readAsDataURL(blob);\n });\n}\n\nfunction useBattery(options = {}) {\n const { navigator = defaultNavigator } = options;\n const events = [\"chargingchange\", \"chargingtimechange\", \"dischargingtimechange\", \"levelchange\"];\n const isSupported = useSupported(() => navigator && \"getBattery\" in navigator && typeof navigator.getBattery === \"function\");\n const charging = shallowRef(false);\n const chargingTime = shallowRef(0);\n const dischargingTime = shallowRef(0);\n const level = shallowRef(1);\n let battery;\n function updateBatteryInfo() {\n charging.value = this.charging;\n chargingTime.value = this.chargingTime || 0;\n dischargingTime.value = this.dischargingTime || 0;\n level.value = this.level;\n }\n if (isSupported.value) {\n navigator.getBattery().then((_battery) => {\n battery = _battery;\n updateBatteryInfo.call(battery);\n useEventListener(battery, events, updateBatteryInfo, { passive: true });\n });\n }\n return {\n isSupported,\n charging,\n chargingTime,\n dischargingTime,\n level\n };\n}\n\nfunction useBluetooth(options) {\n let {\n acceptAllDevices = false\n } = options || {};\n const {\n filters = void 0,\n optionalServices = void 0,\n navigator = defaultNavigator\n } = options || {};\n const isSupported = useSupported(() => navigator && \"bluetooth\" in navigator);\n const device = shallowRef();\n const error = shallowRef(null);\n watch(device, () => {\n connectToBluetoothGATTServer();\n });\n async function requestDevice() {\n if (!isSupported.value)\n return;\n error.value = null;\n if (filters && filters.length > 0)\n acceptAllDevices = false;\n try {\n device.value = await (navigator == null ? void 0 : navigator.bluetooth.requestDevice({\n acceptAllDevices,\n filters,\n optionalServices\n }));\n } catch (err) {\n error.value = err;\n }\n }\n const server = shallowRef();\n const isConnected = shallowRef(false);\n function reset() {\n isConnected.value = false;\n device.value = void 0;\n server.value = void 0;\n }\n async function connectToBluetoothGATTServer() {\n error.value = null;\n if (device.value && device.value.gatt) {\n useEventListener(device, \"gattserverdisconnected\", reset, { passive: true });\n try {\n server.value = await device.value.gatt.connect();\n isConnected.value = server.value.connected;\n } catch (err) {\n error.value = err;\n }\n }\n }\n tryOnMounted(() => {\n var _a;\n if (device.value)\n (_a = device.value.gatt) == null ? void 0 : _a.connect();\n });\n tryOnScopeDispose(() => {\n var _a;\n if (device.value)\n (_a = device.value.gatt) == null ? void 0 : _a.disconnect();\n });\n return {\n isSupported,\n isConnected: readonly(isConnected),\n // Device:\n device,\n requestDevice,\n // Server:\n server,\n // Errors:\n error\n };\n}\n\nconst ssrWidthSymbol = Symbol(\"vueuse-ssr-width\");\nfunction useSSRWidth() {\n const ssrWidth = hasInjectionContext() ? injectLocal(ssrWidthSymbol, null) : null;\n return typeof ssrWidth === \"number\" ? ssrWidth : void 0;\n}\nfunction provideSSRWidth(width, app) {\n if (app !== void 0) {\n app.provide(ssrWidthSymbol, width);\n } else {\n provideLocal(ssrWidthSymbol, width);\n }\n}\n\nfunction useMediaQuery(query, options = {}) {\n const { window = defaultWindow, ssrWidth = useSSRWidth() } = options;\n const isSupported = useSupported(() => window && \"matchMedia\" in window && typeof window.matchMedia === \"function\");\n const ssrSupport = shallowRef(typeof ssrWidth === \"number\");\n const mediaQuery = shallowRef();\n const matches = shallowRef(false);\n const handler = (event) => {\n matches.value = event.matches;\n };\n watchEffect(() => {\n if (ssrSupport.value) {\n ssrSupport.value = !isSupported.value;\n const queryStrings = toValue(query).split(\",\");\n matches.value = queryStrings.some((queryString) => {\n const not = queryString.includes(\"not all\");\n const minWidth = queryString.match(/\\(\\s*min-width:\\s*(-?\\d+(?:\\.\\d*)?[a-z]+\\s*)\\)/);\n const maxWidth = queryString.match(/\\(\\s*max-width:\\s*(-?\\d+(?:\\.\\d*)?[a-z]+\\s*)\\)/);\n let res = Boolean(minWidth || maxWidth);\n if (minWidth && res) {\n res = ssrWidth >= pxValue(minWidth[1]);\n }\n if (maxWidth && res) {\n res = ssrWidth <= pxValue(maxWidth[1]);\n }\n return not ? !res : res;\n });\n return;\n }\n if (!isSupported.value)\n return;\n mediaQuery.value = window.matchMedia(toValue(query));\n matches.value = mediaQuery.value.matches;\n });\n useEventListener(mediaQuery, \"change\", handler, { passive: true });\n return computed(() => matches.value);\n}\n\nconst breakpointsTailwind = {\n \"sm\": 640,\n \"md\": 768,\n \"lg\": 1024,\n \"xl\": 1280,\n \"2xl\": 1536\n};\nconst breakpointsBootstrapV5 = {\n xs: 0,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1400\n};\nconst breakpointsVuetifyV2 = {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1264,\n xl: 1904\n};\nconst breakpointsVuetifyV3 = {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1280,\n xl: 1920,\n xxl: 2560\n};\nconst breakpointsVuetify = breakpointsVuetifyV2;\nconst breakpointsAntDesign = {\n xs: 480,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1600\n};\nconst breakpointsQuasar = {\n xs: 0,\n sm: 600,\n md: 1024,\n lg: 1440,\n xl: 1920\n};\nconst breakpointsSematic = {\n mobileS: 320,\n mobileM: 375,\n mobileL: 425,\n tablet: 768,\n laptop: 1024,\n laptopL: 1440,\n desktop4K: 2560\n};\nconst breakpointsMasterCss = {\n \"3xs\": 360,\n \"2xs\": 480,\n \"xs\": 600,\n \"sm\": 768,\n \"md\": 1024,\n \"lg\": 1280,\n \"xl\": 1440,\n \"2xl\": 1600,\n \"3xl\": 1920,\n \"4xl\": 2560\n};\nconst breakpointsPrimeFlex = {\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200\n};\nconst breakpointsElement = {\n xs: 0,\n sm: 768,\n md: 992,\n lg: 1200,\n xl: 1920\n};\n\nfunction useBreakpoints(breakpoints, options = {}) {\n function getValue(k, delta) {\n let v = toValue(breakpoints[toValue(k)]);\n if (delta != null)\n v = increaseWithUnit(v, delta);\n if (typeof v === \"number\")\n v = `${v}px`;\n return v;\n }\n const { window = defaultWindow, strategy = \"min-width\", ssrWidth = useSSRWidth() } = options;\n const ssrSupport = typeof ssrWidth === \"number\";\n const mounted = ssrSupport ? shallowRef(false) : { value: true };\n if (ssrSupport) {\n tryOnMounted(() => mounted.value = !!window);\n }\n function match(query, size) {\n if (!mounted.value && ssrSupport) {\n return query === \"min\" ? ssrWidth >= pxValue(size) : ssrWidth <= pxValue(size);\n }\n if (!window)\n return false;\n return window.matchMedia(`(${query}-width: ${size})`).matches;\n }\n const greaterOrEqual = (k) => {\n return useMediaQuery(() => `(min-width: ${getValue(k)})`, options);\n };\n const smallerOrEqual = (k) => {\n return useMediaQuery(() => `(max-width: ${getValue(k)})`, options);\n };\n const shortcutMethods = Object.keys(breakpoints).reduce((shortcuts, k) => {\n Object.defineProperty(shortcuts, k, {\n get: () => strategy === \"min-width\" ? greaterOrEqual(k) : smallerOrEqual(k),\n enumerable: true,\n configurable: true\n });\n return shortcuts;\n }, {});\n function current() {\n const points = Object.keys(breakpoints).map((k) => [k, shortcutMethods[k], pxValue(getValue(k))]).sort((a, b) => a[2] - b[2]);\n return computed(() => points.filter(([, v]) => v.value).map(([k]) => k));\n }\n return Object.assign(shortcutMethods, {\n greaterOrEqual,\n smallerOrEqual,\n greater(k) {\n return useMediaQuery(() => `(min-width: ${getValue(k, 0.1)})`, options);\n },\n smaller(k) {\n return useMediaQuery(() => `(max-width: ${getValue(k, -0.1)})`, options);\n },\n between(a, b) {\n return useMediaQuery(() => `(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -0.1)})`, options);\n },\n isGreater(k) {\n return match(\"min\", getValue(k, 0.1));\n },\n isGreaterOrEqual(k) {\n return match(\"min\", getValue(k));\n },\n isSmaller(k) {\n return match(\"max\", getValue(k, -0.1));\n },\n isSmallerOrEqual(k) {\n return match(\"max\", getValue(k));\n },\n isInBetween(a, b) {\n return match(\"min\", getValue(a)) && match(\"max\", getValue(b, -0.1));\n },\n current,\n active() {\n const bps = current();\n return computed(() => bps.value.length === 0 ? \"\" : bps.value.at(strategy === \"min-width\" ? -1 : 0));\n }\n });\n}\n\nfunction useBroadcastChannel(options) {\n const {\n name,\n window = defaultWindow\n } = options;\n const isSupported = useSupported(() => window && \"BroadcastChannel\" in window);\n const isClosed = shallowRef(false);\n const channel = ref();\n const data = ref();\n const error = shallowRef(null);\n const post = (data2) => {\n if (channel.value)\n channel.value.postMessage(data2);\n };\n const close = () => {\n if (channel.value)\n channel.value.close();\n isClosed.value = true;\n };\n if (isSupported.value) {\n tryOnMounted(() => {\n error.value = null;\n channel.value = new BroadcastChannel(name);\n const listenerOptions = {\n passive: true\n };\n useEventListener(channel, \"message\", (e) => {\n data.value = e.data;\n }, listenerOptions);\n useEventListener(channel, \"messageerror\", (e) => {\n error.value = e;\n }, listenerOptions);\n useEventListener(channel, \"close\", () => {\n isClosed.value = true;\n }, listenerOptions);\n });\n }\n tryOnScopeDispose(() => {\n close();\n });\n return {\n isSupported,\n channel,\n data,\n post,\n close,\n error,\n isClosed\n };\n}\n\nconst WRITABLE_PROPERTIES = [\n \"hash\",\n \"host\",\n \"hostname\",\n \"href\",\n \"pathname\",\n \"port\",\n \"protocol\",\n \"search\"\n];\nfunction useBrowserLocation(options = {}) {\n const { window = defaultWindow } = options;\n const refs = Object.fromEntries(\n WRITABLE_PROPERTIES.map((key) => [key, ref()])\n );\n for (const [key, ref] of objectEntries(refs)) {\n watch(ref, (value) => {\n if (!(window == null ? void 0 : window.location) || window.location[key] === value)\n return;\n window.location[key] = value;\n });\n }\n const buildState = (trigger) => {\n var _a;\n const { state: state2, length } = (window == null ? void 0 : window.history) || {};\n const { origin } = (window == null ? void 0 : window.location) || {};\n for (const key of WRITABLE_PROPERTIES)\n refs[key].value = (_a = window == null ? void 0 : window.location) == null ? void 0 : _a[key];\n return reactive({\n trigger,\n state: state2,\n length,\n origin,\n ...refs\n });\n };\n const state = ref(buildState(\"load\"));\n if (window) {\n const listenerOptions = { passive: true };\n useEventListener(window, \"popstate\", () => state.value = buildState(\"popstate\"), listenerOptions);\n useEventListener(window, \"hashchange\", () => state.value = buildState(\"hashchange\"), listenerOptions);\n }\n return state;\n}\n\nfunction useCached(refValue, comparator = (a, b) => a === b, options) {\n const { deepRefs = true, ...watchOptions } = options || {};\n const cachedValue = createRef(refValue.value, deepRefs);\n watch(() => refValue.value, (value) => {\n if (!comparator(value, cachedValue.value))\n cachedValue.value = value;\n }, watchOptions);\n return cachedValue;\n}\n\nfunction usePermission(permissionDesc, options = {}) {\n const {\n controls = false,\n navigator = defaultNavigator\n } = options;\n const isSupported = useSupported(() => navigator && \"permissions\" in navigator);\n const permissionStatus = shallowRef();\n const desc = typeof permissionDesc === \"string\" ? { name: permissionDesc } : permissionDesc;\n const state = shallowRef();\n const update = () => {\n var _a, _b;\n state.value = (_b = (_a = permissionStatus.value) == null ? void 0 : _a.state) != null ? _b : \"prompt\";\n };\n useEventListener(permissionStatus, \"change\", update, { passive: true });\n const query = createSingletonPromise(async () => {\n if (!isSupported.value)\n return;\n if (!permissionStatus.value) {\n try {\n permissionStatus.value = await navigator.permissions.query(desc);\n } catch (e) {\n permissionStatus.value = void 0;\n } finally {\n update();\n }\n }\n if (controls)\n return toRaw(permissionStatus.value);\n });\n query();\n if (controls) {\n return {\n state,\n isSupported,\n query\n };\n } else {\n return state;\n }\n}\n\nfunction useClipboard(options = {}) {\n const {\n navigator = defaultNavigator,\n read = false,\n source,\n copiedDuring = 1500,\n legacy = false\n } = options;\n const isClipboardApiSupported = useSupported(() => navigator && \"clipboard\" in navigator);\n const permissionRead = usePermission(\"clipboard-read\");\n const permissionWrite = usePermission(\"clipboard-write\");\n const isSupported = computed(() => isClipboardApiSupported.value || legacy);\n const text = shallowRef(\"\");\n const copied = shallowRef(false);\n const timeout = useTimeoutFn(() => copied.value = false, copiedDuring, { immediate: false });\n async function updateText() {\n let useLegacy = !(isClipboardApiSupported.value && isAllowed(permissionRead.value));\n if (!useLegacy) {\n try {\n text.value = await navigator.clipboard.readText();\n } catch (e) {\n useLegacy = true;\n }\n }\n if (useLegacy) {\n text.value = legacyRead();\n }\n }\n if (isSupported.value && read)\n useEventListener([\"copy\", \"cut\"], updateText, { passive: true });\n async function copy(value = toValue(source)) {\n if (isSupported.value && value != null) {\n let useLegacy = !(isClipboardApiSupported.value && isAllowed(permissionWrite.value));\n if (!useLegacy) {\n try {\n await navigator.clipboard.writeText(value);\n } catch (e) {\n useLegacy = true;\n }\n }\n if (useLegacy)\n legacyCopy(value);\n text.value = value;\n copied.value = true;\n timeout.start();\n }\n }\n function legacyCopy(value) {\n const ta = document.createElement(\"textarea\");\n ta.value = value != null ? value : \"\";\n ta.style.position = \"absolute\";\n ta.style.opacity = \"0\";\n document.body.appendChild(ta);\n ta.select();\n document.execCommand(\"copy\");\n ta.remove();\n }\n function legacyRead() {\n var _a, _b, _c;\n return (_c = (_b = (_a = document == null ? void 0 : document.getSelection) == null ? void 0 : _a.call(document)) == null ? void 0 : _b.toString()) != null ? _c : \"\";\n }\n function isAllowed(status) {\n return status === \"granted\" || status === \"prompt\";\n }\n return {\n isSupported,\n text,\n copied,\n copy\n };\n}\n\nfunction useClipboardItems(options = {}) {\n const {\n navigator = defaultNavigator,\n read = false,\n source,\n copiedDuring = 1500\n } = options;\n const isSupported = useSupported(() => navigator && \"clipboard\" in navigator);\n const content = ref([]);\n const copied = shallowRef(false);\n const timeout = useTimeoutFn(() => copied.value = false, copiedDuring, { immediate: false });\n function updateContent() {\n if (isSupported.value) {\n navigator.clipboard.read().then((items) => {\n content.value = items;\n });\n }\n }\n if (isSupported.value && read)\n useEventListener([\"copy\", \"cut\"], updateContent, { passive: true });\n async function copy(value = toValue(source)) {\n if (isSupported.value && value != null) {\n await navigator.clipboard.write(value);\n content.value = value;\n copied.value = true;\n timeout.start();\n }\n }\n return {\n isSupported,\n content,\n copied,\n copy\n };\n}\n\nfunction cloneFnJSON(source) {\n return JSON.parse(JSON.stringify(source));\n}\nfunction useCloned(source, options = {}) {\n const cloned = ref({});\n const isModified = shallowRef(false);\n let _lastSync = false;\n const {\n manual,\n clone = cloneFnJSON,\n // watch options\n deep = true,\n immediate = true\n } = options;\n watch(cloned, () => {\n if (_lastSync) {\n _lastSync = false;\n return;\n }\n isModified.value = true;\n }, {\n deep: true,\n flush: \"sync\"\n });\n function sync() {\n _lastSync = true;\n isModified.value = false;\n cloned.value = clone(toValue(source));\n }\n if (!manual && (isRef(source) || typeof source === \"function\")) {\n watch(source, sync, {\n ...options,\n deep,\n immediate\n });\n } else {\n sync();\n }\n return { cloned, isModified, sync };\n}\n\nconst _global = typeof globalThis !== \"undefined\" ? globalThis : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : {};\nconst globalKey = \"__vueuse_ssr_handlers__\";\nconst handlers = /* @__PURE__ */ getHandlers();\nfunction getHandlers() {\n if (!(globalKey in _global))\n _global[globalKey] = _global[globalKey] || {};\n return _global[globalKey];\n}\nfunction getSSRHandler(key, fallback) {\n return handlers[key] || fallback;\n}\nfunction setSSRHandler(key, fn) {\n handlers[key] = fn;\n}\n\nfunction usePreferredDark(options) {\n return useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n}\n\nfunction guessSerializerType(rawInit) {\n 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\";\n}\n\nconst StorageSerializers = {\n boolean: {\n read: (v) => v === \"true\",\n write: (v) => String(v)\n },\n object: {\n read: (v) => JSON.parse(v),\n write: (v) => JSON.stringify(v)\n },\n number: {\n read: (v) => Number.parseFloat(v),\n write: (v) => String(v)\n },\n any: {\n read: (v) => v,\n write: (v) => String(v)\n },\n string: {\n read: (v) => v,\n write: (v) => String(v)\n },\n map: {\n read: (v) => new Map(JSON.parse(v)),\n write: (v) => JSON.stringify(Array.from(v.entries()))\n },\n set: {\n read: (v) => new Set(JSON.parse(v)),\n write: (v) => JSON.stringify(Array.from(v))\n },\n date: {\n read: (v) => new Date(v),\n write: (v) => v.toISOString()\n }\n};\nconst customStorageEventName = \"vueuse-storage\";\nfunction useStorage(key, defaults, storage, options = {}) {\n var _a;\n const {\n flush = \"pre\",\n deep = true,\n listenToStorageChanges = true,\n writeDefaults = true,\n mergeDefaults = false,\n shallow,\n window = defaultWindow,\n eventFilter,\n onError = (e) => {\n console.error(e);\n },\n initOnMounted\n } = options;\n const data = (shallow ? shallowRef : ref)(typeof defaults === \"function\" ? defaults() : defaults);\n const keyComputed = computed(() => toValue(key));\n if (!storage) {\n try {\n storage = getSSRHandler(\"getDefaultStorage\", () => {\n var _a2;\n return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n })();\n } catch (e) {\n onError(e);\n }\n }\n if (!storage)\n return data;\n const rawInit = toValue(defaults);\n const type = guessSerializerType(rawInit);\n const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n const { pause: pauseWatch, resume: resumeWatch } = pausableWatch(\n data,\n () => write(data.value),\n { flush, deep, eventFilter }\n );\n watch(keyComputed, () => update(), { flush });\n if (window && listenToStorageChanges) {\n tryOnMounted(() => {\n if (storage instanceof Storage)\n useEventListener(window, \"storage\", update, { passive: true });\n else\n useEventListener(window, customStorageEventName, updateFromCustomEvent);\n if (initOnMounted)\n update();\n });\n }\n if (!initOnMounted)\n update();\n function dispatchWriteEvent(oldValue, newValue) {\n if (window) {\n const payload = {\n key: keyComputed.value,\n oldValue,\n newValue,\n storageArea: storage\n };\n window.dispatchEvent(storage instanceof Storage ? new StorageEvent(\"storage\", payload) : new CustomEvent(customStorageEventName, {\n detail: payload\n }));\n }\n }\n function write(v) {\n try {\n const oldValue = storage.getItem(keyComputed.value);\n if (v == null) {\n dispatchWriteEvent(oldValue, null);\n storage.removeItem(keyComputed.value);\n } else {\n const serialized = serializer.write(v);\n if (oldValue !== serialized) {\n storage.setItem(keyComputed.value, serialized);\n dispatchWriteEvent(oldValue, serialized);\n }\n }\n } catch (e) {\n onError(e);\n }\n }\n function read(event) {\n const rawValue = event ? event.newValue : storage.getItem(keyComputed.value);\n if (rawValue == null) {\n if (writeDefaults && rawInit != null)\n storage.setItem(keyComputed.value, serializer.write(rawInit));\n return rawInit;\n } else if (!event && mergeDefaults) {\n const value = serializer.read(rawValue);\n if (typeof mergeDefaults === \"function\")\n return mergeDefaults(value, rawInit);\n else if (type === \"object\" && !Array.isArray(value))\n return { ...rawInit, ...value };\n return value;\n } else if (typeof rawValue !== \"string\") {\n return rawValue;\n } else {\n return serializer.read(rawValue);\n }\n }\n function update(event) {\n if (event && event.storageArea !== storage)\n return;\n if (event && event.key == null) {\n data.value = rawInit;\n return;\n }\n if (event && event.key !== keyComputed.value)\n return;\n pauseWatch();\n try {\n if ((event == null ? void 0 : event.newValue) !== serializer.write(data.value))\n data.value = read(event);\n } catch (e) {\n onError(e);\n } finally {\n if (event)\n nextTick(resumeWatch);\n else\n resumeWatch();\n }\n }\n function updateFromCustomEvent(event) {\n update(event.detail);\n }\n return data;\n}\n\nconst CSS_DISABLE_TRANS = \"*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}\";\nfunction useColorMode(options = {}) {\n const {\n selector = \"html\",\n attribute = \"class\",\n initialValue = \"auto\",\n window = defaultWindow,\n storage,\n storageKey = \"vueuse-color-scheme\",\n listenToStorageChanges = true,\n storageRef,\n emitAuto,\n disableTransition = true\n } = options;\n const modes = {\n auto: \"\",\n light: \"light\",\n dark: \"dark\",\n ...options.modes || {}\n };\n const preferredDark = usePreferredDark({ window });\n const system = computed(() => preferredDark.value ? \"dark\" : \"light\");\n const store = storageRef || (storageKey == null ? toRef(initialValue) : useStorage(storageKey, initialValue, storage, { window, listenToStorageChanges }));\n const state = computed(() => store.value === \"auto\" ? system.value : store.value);\n const updateHTMLAttrs = getSSRHandler(\n \"updateHTMLAttrs\",\n (selector2, attribute2, value) => {\n const el = typeof selector2 === \"string\" ? window == null ? void 0 : window.document.querySelector(selector2) : unrefElement(selector2);\n if (!el)\n return;\n const classesToAdd = /* @__PURE__ */ new Set();\n const classesToRemove = /* @__PURE__ */ new Set();\n let attributeToChange = null;\n if (attribute2 === \"class\") {\n const current = value.split(/\\s/g);\n Object.values(modes).flatMap((i) => (i || \"\").split(/\\s/g)).filter(Boolean).forEach((v) => {\n if (current.includes(v))\n classesToAdd.add(v);\n else\n classesToRemove.add(v);\n });\n } else {\n attributeToChange = { key: attribute2, value };\n }\n if (classesToAdd.size === 0 && classesToRemove.size === 0 && attributeToChange === null)\n return;\n let style;\n if (disableTransition) {\n style = window.document.createElement(\"style\");\n style.appendChild(document.createTextNode(CSS_DISABLE_TRANS));\n window.document.head.appendChild(style);\n }\n for (const c of classesToAdd) {\n el.classList.add(c);\n }\n for (const c of classesToRemove) {\n el.classList.remove(c);\n }\n if (attributeToChange) {\n el.setAttribute(attributeToChange.key, attributeToChange.value);\n }\n if (disableTransition) {\n window.getComputedStyle(style).opacity;\n document.head.removeChild(style);\n }\n }\n );\n function defaultOnChanged(mode) {\n var _a;\n updateHTMLAttrs(selector, attribute, (_a = modes[mode]) != null ? _a : mode);\n }\n function onChanged(mode) {\n if (options.onChanged)\n options.onChanged(mode, defaultOnChanged);\n else\n defaultOnChanged(mode);\n }\n watch(state, onChanged, { flush: \"post\", immediate: true });\n tryOnMounted(() => onChanged(state.value));\n const auto = computed({\n get() {\n return emitAuto ? store.value : state.value;\n },\n set(v) {\n store.value = v;\n }\n });\n return Object.assign(auto, { store, system, state });\n}\n\nfunction useConfirmDialog(revealed = shallowRef(false)) {\n const confirmHook = createEventHook();\n const cancelHook = createEventHook();\n const revealHook = createEventHook();\n let _resolve = noop;\n const reveal = (data) => {\n revealHook.trigger(data);\n revealed.value = true;\n return new Promise((resolve) => {\n _resolve = resolve;\n });\n };\n const confirm = (data) => {\n revealed.value = false;\n confirmHook.trigger(data);\n _resolve({ data, isCanceled: false });\n };\n const cancel = (data) => {\n revealed.value = false;\n cancelHook.trigger(data);\n _resolve({ data, isCanceled: true });\n };\n return {\n isRevealed: computed(() => revealed.value),\n reveal,\n confirm,\n cancel,\n onReveal: revealHook.on,\n onConfirm: confirmHook.on,\n onCancel: cancelHook.on\n };\n}\n\nfunction useCountdown(initialCountdown, options) {\n var _a, _b;\n const remaining = shallowRef(toValue(initialCountdown));\n const intervalController = useIntervalFn(() => {\n var _a2, _b2;\n const value = remaining.value - 1;\n remaining.value = value < 0 ? 0 : value;\n (_a2 = options == null ? void 0 : options.onTick) == null ? void 0 : _a2.call(options);\n if (remaining.value <= 0) {\n intervalController.pause();\n (_b2 = options == null ? void 0 : options.onComplete) == null ? void 0 : _b2.call(options);\n }\n }, (_a = options == null ? void 0 : options.interval) != null ? _a : 1e3, { immediate: (_b = options == null ? void 0 : options.immediate) != null ? _b : false });\n const reset = (countdown) => {\n var _a2;\n remaining.value = (_a2 = toValue(countdown)) != null ? _a2 : toValue(initialCountdown);\n };\n const stop = () => {\n intervalController.pause();\n reset();\n };\n const resume = () => {\n if (!intervalController.isActive.value) {\n if (remaining.value > 0) {\n intervalController.resume();\n }\n }\n };\n const start = (countdown) => {\n reset(countdown);\n intervalController.resume();\n };\n return {\n remaining,\n reset,\n stop,\n start,\n pause: intervalController.pause,\n resume,\n isActive: intervalController.isActive\n };\n}\n\nfunction useCssVar(prop, target, options = {}) {\n const { window = defaultWindow, initialValue, observe = false } = options;\n const variable = shallowRef(initialValue);\n const elRef = computed(() => {\n var _a;\n return unrefElement(target) || ((_a = window == null ? void 0 : window.document) == null ? void 0 : _a.documentElement);\n });\n function updateCssVar() {\n var _a;\n const key = toValue(prop);\n const el = toValue(elRef);\n if (el && window && key) {\n const value = (_a = window.getComputedStyle(el).getPropertyValue(key)) == null ? void 0 : _a.trim();\n variable.value = value || variable.value || initialValue;\n }\n }\n if (observe) {\n useMutationObserver(elRef, updateCssVar, {\n attributeFilter: [\"style\", \"class\"],\n window\n });\n }\n watch(\n [elRef, () => toValue(prop)],\n (_, old) => {\n if (old[0] && old[1])\n old[0].style.removeProperty(old[1]);\n updateCssVar();\n },\n { immediate: true }\n );\n watch(\n [variable, elRef],\n ([val, el]) => {\n const raw_prop = toValue(prop);\n if ((el == null ? void 0 : el.style) && raw_prop) {\n if (val == null)\n el.style.removeProperty(raw_prop);\n else\n el.style.setProperty(raw_prop, val);\n }\n },\n { immediate: true }\n );\n return variable;\n}\n\nfunction useCurrentElement(rootComponent) {\n const vm = getCurrentInstance();\n const currentElement = computedWithControl(\n () => null,\n () => rootComponent ? unrefElement(rootComponent) : vm.proxy.$el\n );\n onUpdated(currentElement.trigger);\n onMounted(currentElement.trigger);\n return currentElement;\n}\n\nfunction useCycleList(list, options) {\n const state = shallowRef(getInitialValue());\n const listRef = toRef(list);\n const index = computed({\n get() {\n var _a;\n const targetList = listRef.value;\n let index2 = (options == null ? void 0 : options.getIndexOf) ? options.getIndexOf(state.value, targetList) : targetList.indexOf(state.value);\n if (index2 < 0)\n index2 = (_a = options == null ? void 0 : options.fallbackIndex) != null ? _a : 0;\n return index2;\n },\n set(v) {\n set(v);\n }\n });\n function set(i) {\n const targetList = listRef.value;\n const length = targetList.length;\n const index2 = (i % length + length) % length;\n const value = targetList[index2];\n state.value = value;\n return value;\n }\n function shift(delta = 1) {\n return set(index.value + delta);\n }\n function next(n = 1) {\n return shift(n);\n }\n function prev(n = 1) {\n return shift(-n);\n }\n function getInitialValue() {\n var _a, _b;\n return (_b = toValue((_a = options == null ? void 0 : options.initialValue) != null ? _a : toValue(list)[0])) != null ? _b : void 0;\n }\n watch(listRef, () => set(index.value));\n return {\n state,\n index,\n next,\n prev,\n go: set\n };\n}\n\nfunction useDark(options = {}) {\n const {\n valueDark = \"dark\",\n valueLight = \"\"\n } = options;\n const mode = useColorMode({\n ...options,\n onChanged: (mode2, defaultHandler) => {\n var _a;\n if (options.onChanged)\n (_a = options.onChanged) == null ? void 0 : _a.call(options, mode2 === \"dark\", defaultHandler, mode2);\n else\n defaultHandler(mode2);\n },\n modes: {\n dark: valueDark,\n light: valueLight\n }\n });\n const system = computed(() => mode.system.value);\n const isDark = computed({\n get() {\n return mode.value === \"dark\";\n },\n set(v) {\n const modeVal = v ? \"dark\" : \"light\";\n if (system.value === modeVal)\n mode.value = \"auto\";\n else\n mode.value = modeVal;\n }\n });\n return isDark;\n}\n\nfunction fnBypass(v) {\n return v;\n}\nfunction fnSetSource(source, value) {\n return source.value = value;\n}\nfunction defaultDump(clone) {\n return clone ? typeof clone === \"function\" ? clone : cloneFnJSON : fnBypass;\n}\nfunction defaultParse(clone) {\n return clone ? typeof clone === \"function\" ? clone : cloneFnJSON : fnBypass;\n}\nfunction useManualRefHistory(source, options = {}) {\n const {\n clone = false,\n dump = defaultDump(clone),\n parse = defaultParse(clone),\n setSource = fnSetSource\n } = options;\n function _createHistoryRecord() {\n return markRaw({\n snapshot: dump(source.value),\n timestamp: timestamp()\n });\n }\n const last = ref(_createHistoryRecord());\n const undoStack = ref([]);\n const redoStack = ref([]);\n const _setSource = (record) => {\n setSource(source, parse(record.snapshot));\n last.value = record;\n };\n const commit = () => {\n undoStack.value.unshift(last.value);\n last.value = _createHistoryRecord();\n if (options.capacity && undoStack.value.length > options.capacity)\n undoStack.value.splice(options.capacity, Number.POSITIVE_INFINITY);\n if (redoStack.value.length)\n redoStack.value.splice(0, redoStack.value.length);\n };\n const clear = () => {\n undoStack.value.splice(0, undoStack.value.length);\n redoStack.value.splice(0, redoStack.value.length);\n };\n const undo = () => {\n const state = undoStack.value.shift();\n if (state) {\n redoStack.value.unshift(last.value);\n _setSource(state);\n }\n };\n const redo = () => {\n const state = redoStack.value.shift();\n if (state) {\n undoStack.value.unshift(last.value);\n _setSource(state);\n }\n };\n const reset = () => {\n _setSource(last.value);\n };\n const history = computed(() => [last.value, ...undoStack.value]);\n const canUndo = computed(() => undoStack.value.length > 0);\n const canRedo = computed(() => redoStack.value.length > 0);\n return {\n source,\n undoStack,\n redoStack,\n last,\n history,\n canUndo,\n canRedo,\n clear,\n commit,\n reset,\n undo,\n redo\n };\n}\n\nfunction useRefHistory(source, options = {}) {\n const {\n deep = false,\n flush = \"pre\",\n eventFilter\n } = options;\n const {\n eventFilter: composedFilter,\n pause,\n resume: resumeTracking,\n isActive: isTracking\n } = pausableFilter(eventFilter);\n const {\n ignoreUpdates,\n ignorePrevAsyncUpdates,\n stop\n } = watchIgnorable(\n source,\n commit,\n { deep, flush, eventFilter: composedFilter }\n );\n function setSource(source2, value) {\n ignorePrevAsyncUpdates();\n ignoreUpdates(() => {\n source2.value = value;\n });\n }\n const manualHistory = useManualRefHistory(source, { ...options, clone: options.clone || deep, setSource });\n const { clear, commit: manualCommit } = manualHistory;\n function commit() {\n ignorePrevAsyncUpdates();\n manualCommit();\n }\n function resume(commitNow) {\n resumeTracking();\n if (commitNow)\n commit();\n }\n function batch(fn) {\n let canceled = false;\n const cancel = () => canceled = true;\n ignoreUpdates(() => {\n fn(cancel);\n });\n if (!canceled)\n commit();\n }\n function dispose() {\n stop();\n clear();\n }\n return {\n ...manualHistory,\n isTracking,\n pause,\n resume,\n commit,\n batch,\n dispose\n };\n}\n\nfunction useDebouncedRefHistory(source, options = {}) {\n const filter = options.debounce ? debounceFilter(options.debounce) : void 0;\n const history = useRefHistory(source, { ...options, eventFilter: filter });\n return {\n ...history\n };\n}\n\nfunction useDeviceMotion(options = {}) {\n const {\n window = defaultWindow,\n requestPermissions = false,\n eventFilter = bypassFilter\n } = options;\n const isSupported = useSupported(() => typeof DeviceMotionEvent !== \"undefined\");\n const requirePermissions = useSupported(() => isSupported.value && \"requestPermission\" in DeviceMotionEvent && typeof DeviceMotionEvent.requestPermission === \"function\");\n const permissionGranted = shallowRef(false);\n const acceleration = ref({ x: null, y: null, z: null });\n const rotationRate = ref({ alpha: null, beta: null, gamma: null });\n const interval = shallowRef(0);\n const accelerationIncludingGravity = ref({\n x: null,\n y: null,\n z: null\n });\n function init() {\n if (window) {\n const onDeviceMotion = createFilterWrapper(\n eventFilter,\n (event) => {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i;\n acceleration.value = {\n x: ((_a = event.acceleration) == null ? void 0 : _a.x) || null,\n y: ((_b = event.acceleration) == null ? void 0 : _b.y) || null,\n z: ((_c = event.acceleration) == null ? void 0 : _c.z) || null\n };\n accelerationIncludingGravity.value = {\n x: ((_d = event.accelerationIncludingGravity) == null ? void 0 : _d.x) || null,\n y: ((_e = event.accelerationIncludingGravity) == null ? void 0 : _e.y) || null,\n z: ((_f = event.accelerationIncludingGravity) == null ? void 0 : _f.z) || null\n };\n rotationRate.value = {\n alpha: ((_g = event.rotationRate) == null ? void 0 : _g.alpha) || null,\n beta: ((_h = event.rotationRate) == null ? void 0 : _h.beta) || null,\n gamma: ((_i = event.rotationRate) == null ? void 0 : _i.gamma) || null\n };\n interval.value = event.interval;\n }\n );\n useEventListener(window, \"devicemotion\", onDeviceMotion, { passive: true });\n }\n }\n const ensurePermissions = async () => {\n if (!requirePermissions.value)\n permissionGranted.value = true;\n if (permissionGranted.value)\n return;\n if (requirePermissions.value) {\n const requestPermission = DeviceMotionEvent.requestPermission;\n try {\n const response = await requestPermission();\n if (response === \"granted\") {\n permissionGranted.value = true;\n init();\n }\n } catch (error) {\n console.error(error);\n }\n }\n };\n if (isSupported.value) {\n if (requestPermissions && requirePermissions.value) {\n ensurePermissions().then(() => init());\n } else {\n init();\n }\n }\n return {\n acceleration,\n accelerationIncludingGravity,\n rotationRate,\n interval,\n isSupported,\n requirePermissions,\n ensurePermissions,\n permissionGranted\n };\n}\n\nfunction useDeviceOrientation(options = {}) {\n const { window = defaultWindow } = options;\n const isSupported = useSupported(() => window && \"DeviceOrientationEvent\" in window);\n const isAbsolute = shallowRef(false);\n const alpha = shallowRef(null);\n const beta = shallowRef(null);\n const gamma = shallowRef(null);\n if (window && isSupported.value) {\n useEventListener(window, \"deviceorientation\", (event) => {\n isAbsolute.value = event.absolute;\n alpha.value = event.alpha;\n beta.value = event.beta;\n gamma.value = event.gamma;\n }, { passive: true });\n }\n return {\n isSupported,\n isAbsolute,\n alpha,\n beta,\n gamma\n };\n}\n\nfunction useDevicePixelRatio(options = {}) {\n const {\n window = defaultWindow\n } = options;\n const pixelRatio = shallowRef(1);\n const query = useMediaQuery(() => `(resolution: ${pixelRatio.value}dppx)`, options);\n let stop = noop;\n if (window) {\n stop = watchImmediate(query, () => pixelRatio.value = window.devicePixelRatio);\n }\n return {\n pixelRatio: readonly(pixelRatio),\n stop\n };\n}\n\nfunction useDevicesList(options = {}) {\n const {\n navigator = defaultNavigator,\n requestPermissions = false,\n constraints = { audio: true, video: true },\n onUpdated\n } = options;\n const devices = ref([]);\n const videoInputs = computed(() => devices.value.filter((i) => i.kind === \"videoinput\"));\n const audioInputs = computed(() => devices.value.filter((i) => i.kind === \"audioinput\"));\n const audioOutputs = computed(() => devices.value.filter((i) => i.kind === \"audiooutput\"));\n const isSupported = useSupported(() => navigator && navigator.mediaDevices && navigator.mediaDevices.enumerateDevices);\n const permissionGranted = shallowRef(false);\n let stream;\n async function update() {\n if (!isSupported.value)\n return;\n devices.value = await navigator.mediaDevices.enumerateDevices();\n onUpdated == null ? void 0 : onUpdated(devices.value);\n if (stream) {\n stream.getTracks().forEach((t) => t.stop());\n stream = null;\n }\n }\n async function ensurePermissions() {\n const deviceName = constraints.video ? \"camera\" : \"microphone\";\n if (!isSupported.value)\n return false;\n if (permissionGranted.value)\n return true;\n const { state, query } = usePermission(deviceName, { controls: true });\n await query();\n if (state.value !== \"granted\") {\n let granted = true;\n try {\n stream = await navigator.mediaDevices.getUserMedia(constraints);\n } catch (e) {\n stream = null;\n granted = false;\n }\n update();\n permissionGranted.value = granted;\n } else {\n permissionGranted.value = true;\n }\n return permissionGranted.value;\n }\n if (isSupported.value) {\n if (requestPermissions)\n ensurePermissions();\n useEventListener(navigator.mediaDevices, \"devicechange\", update, { passive: true });\n update();\n }\n return {\n devices,\n ensurePermissions,\n permissionGranted,\n videoInputs,\n audioInputs,\n audioOutputs,\n isSupported\n };\n}\n\nfunction useDisplayMedia(options = {}) {\n var _a;\n const enabled = shallowRef((_a = options.enabled) != null ? _a : false);\n const video = options.video;\n const audio = options.audio;\n const { navigator = defaultNavigator } = options;\n const isSupported = useSupported(() => {\n var _a2;\n return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getDisplayMedia;\n });\n const constraint = { audio, video };\n const stream = shallowRef();\n async function _start() {\n var _a2;\n if (!isSupported.value || stream.value)\n return;\n stream.value = await navigator.mediaDevices.getDisplayMedia(constraint);\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => useEventListener(t, \"ended\", stop, { passive: true }));\n return stream.value;\n }\n async function _stop() {\n var _a2;\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());\n stream.value = void 0;\n }\n function stop() {\n _stop();\n enabled.value = false;\n }\n async function start() {\n await _start();\n if (stream.value)\n enabled.value = true;\n return stream.value;\n }\n watch(\n enabled,\n (v) => {\n if (v)\n _start();\n else\n _stop();\n },\n { immediate: true }\n );\n return {\n isSupported,\n stream,\n start,\n stop,\n enabled\n };\n}\n\nfunction useDocumentVisibility(options = {}) {\n const { document = defaultDocument } = options;\n if (!document)\n return shallowRef(\"visible\");\n const visibility = shallowRef(document.visibilityState);\n useEventListener(document, \"visibilitychange\", () => {\n visibility.value = document.visibilityState;\n }, { passive: true });\n return visibility;\n}\n\nfunction useDraggable(target, options = {}) {\n var _a;\n const {\n pointerTypes,\n preventDefault,\n stopPropagation,\n exact,\n onMove,\n onEnd,\n onStart,\n initialValue,\n axis = \"both\",\n draggingElement = defaultWindow,\n containerElement,\n handle: draggingHandle = target,\n buttons = [0]\n } = options;\n const position = ref(\n (_a = toValue(initialValue)) != null ? _a : { x: 0, y: 0 }\n );\n const pressedDelta = ref();\n const filterEvent = (e) => {\n if (pointerTypes)\n return pointerTypes.includes(e.pointerType);\n return true;\n };\n const handleEvent = (e) => {\n if (toValue(preventDefault))\n e.preventDefault();\n if (toValue(stopPropagation))\n e.stopPropagation();\n };\n const start = (e) => {\n var _a2;\n if (!toValue(buttons).includes(e.button))\n return;\n if (toValue(options.disabled) || !filterEvent(e))\n return;\n if (toValue(exact) && e.target !== toValue(target))\n return;\n const container = toValue(containerElement);\n const containerRect = (_a2 = container == null ? void 0 : container.getBoundingClientRect) == null ? void 0 : _a2.call(container);\n const targetRect = toValue(target).getBoundingClientRect();\n const pos = {\n x: e.clientX - (container ? targetRect.left - containerRect.left + container.scrollLeft : targetRect.left),\n y: e.clientY - (container ? targetRect.top - containerRect.top + container.scrollTop : targetRect.top)\n };\n if ((onStart == null ? void 0 : onStart(pos, e)) === false)\n return;\n pressedDelta.value = pos;\n handleEvent(e);\n };\n const move = (e) => {\n if (toValue(options.disabled) || !filterEvent(e))\n return;\n if (!pressedDelta.value)\n return;\n const container = toValue(containerElement);\n const targetRect = toValue(target).getBoundingClientRect();\n let { x, y } = position.value;\n if (axis === \"x\" || axis === \"both\") {\n x = e.clientX - pressedDelta.value.x;\n if (container)\n x = Math.min(Math.max(0, x), container.scrollWidth - targetRect.width);\n }\n if (axis === \"y\" || axis === \"both\") {\n y = e.clientY - pressedDelta.value.y;\n if (container)\n y = Math.min(Math.max(0, y), container.scrollHeight - targetRect.height);\n }\n position.value = {\n x,\n y\n };\n onMove == null ? void 0 : onMove(position.value, e);\n handleEvent(e);\n };\n const end = (e) => {\n if (toValue(options.disabled) || !filterEvent(e))\n return;\n if (!pressedDelta.value)\n return;\n pressedDelta.value = void 0;\n onEnd == null ? void 0 : onEnd(position.value, e);\n handleEvent(e);\n };\n if (isClient) {\n const config = () => {\n var _a2;\n return {\n capture: (_a2 = options.capture) != null ? _a2 : true,\n passive: !toValue(preventDefault)\n };\n };\n useEventListener(draggingHandle, \"pointerdown\", start, config);\n useEventListener(draggingElement, \"pointermove\", move, config);\n useEventListener(draggingElement, \"pointerup\", end, config);\n }\n return {\n ...toRefs(position),\n position,\n isDragging: computed(() => !!pressedDelta.value),\n style: computed(\n () => `left:${position.value.x}px;top:${position.value.y}px;`\n )\n };\n}\n\nfunction useDropZone(target, options = {}) {\n var _a, _b;\n const isOverDropZone = shallowRef(false);\n const files = shallowRef(null);\n let counter = 0;\n let isValid = true;\n if (isClient) {\n const _options = typeof options === \"function\" ? { onDrop: options } : options;\n const multiple = (_a = _options.multiple) != null ? _a : true;\n const preventDefaultForUnhandled = (_b = _options.preventDefaultForUnhandled) != null ? _b : false;\n const getFiles = (event) => {\n var _a2, _b2;\n const list = Array.from((_b2 = (_a2 = event.dataTransfer) == null ? void 0 : _a2.files) != null ? _b2 : []);\n return list.length === 0 ? null : multiple ? list : [list[0]];\n };\n const checkDataTypes = (types) => {\n const dataTypes = unref(_options.dataTypes);\n if (typeof dataTypes === \"function\")\n return dataTypes(types);\n if (!(dataTypes == null ? void 0 : dataTypes.length))\n return true;\n if (types.length === 0)\n return false;\n return types.every(\n (type) => dataTypes.some((allowedType) => type.includes(allowedType))\n );\n };\n const checkValidity = (items) => {\n const types = Array.from(items != null ? items : []).map((item) => item.type);\n const dataTypesValid = checkDataTypes(types);\n const multipleFilesValid = multiple || items.length <= 1;\n return dataTypesValid && multipleFilesValid;\n };\n const isSafari = () => /^(?:(?!chrome|android).)*safari/i.test(navigator.userAgent) && !(\"chrome\" in window);\n const handleDragEvent = (event, eventType) => {\n var _a2, _b2, _c, _d, _e, _f;\n const dataTransferItemList = (_a2 = event.dataTransfer) == null ? void 0 : _a2.items;\n isValid = (_b2 = dataTransferItemList && checkValidity(dataTransferItemList)) != null ? _b2 : false;\n if (preventDefaultForUnhandled) {\n event.preventDefault();\n }\n if (!isSafari() && !isValid) {\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = \"none\";\n }\n return;\n }\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = \"copy\";\n }\n const currentFiles = getFiles(event);\n switch (eventType) {\n case \"enter\":\n counter += 1;\n isOverDropZone.value = true;\n (_c = _options.onEnter) == null ? void 0 : _c.call(_options, null, event);\n break;\n case \"over\":\n (_d = _options.onOver) == null ? void 0 : _d.call(_options, null, event);\n break;\n case \"leave\":\n counter -= 1;\n if (counter === 0)\n isOverDropZone.value = false;\n (_e = _options.onLeave) == null ? void 0 : _e.call(_options, null, event);\n break;\n case \"drop\":\n counter = 0;\n isOverDropZone.value = false;\n if (isValid) {\n files.value = currentFiles;\n (_f = _options.onDrop) == null ? void 0 : _f.call(_options, currentFiles, event);\n }\n break;\n }\n };\n useEventListener(target, \"dragenter\", (event) => handleDragEvent(event, \"enter\"));\n useEventListener(target, \"dragover\", (event) => handleDragEvent(event, \"over\"));\n useEventListener(target, \"dragleave\", (event) => handleDragEvent(event, \"leave\"));\n useEventListener(target, \"drop\", (event) => handleDragEvent(event, \"drop\"));\n }\n return {\n files,\n isOverDropZone\n };\n}\n\nfunction useResizeObserver(target, callback, options = {}) {\n const { window = defaultWindow, ...observerOptions } = options;\n let observer;\n const isSupported = useSupported(() => window && \"ResizeObserver\" in window);\n const cleanup = () => {\n if (observer) {\n observer.disconnect();\n observer = void 0;\n }\n };\n const targets = computed(() => {\n const _targets = toValue(target);\n return Array.isArray(_targets) ? _targets.map((el) => unrefElement(el)) : [unrefElement(_targets)];\n });\n const stopWatch = watch(\n targets,\n (els) => {\n cleanup();\n if (isSupported.value && window) {\n observer = new ResizeObserver(callback);\n for (const _el of els) {\n if (_el)\n observer.observe(_el, observerOptions);\n }\n }\n },\n { immediate: true, flush: \"post\" }\n );\n const stop = () => {\n cleanup();\n stopWatch();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop\n };\n}\n\nfunction useElementBounding(target, options = {}) {\n const {\n reset = true,\n windowResize = true,\n windowScroll = true,\n immediate = true,\n updateTiming = \"sync\"\n } = options;\n const height = shallowRef(0);\n const bottom = shallowRef(0);\n const left = shallowRef(0);\n const right = shallowRef(0);\n const top = shallowRef(0);\n const width = shallowRef(0);\n const x = shallowRef(0);\n const y = shallowRef(0);\n function recalculate() {\n const el = unrefElement(target);\n if (!el) {\n if (reset) {\n height.value = 0;\n bottom.value = 0;\n left.value = 0;\n right.value = 0;\n top.value = 0;\n width.value = 0;\n x.value = 0;\n y.value = 0;\n }\n return;\n }\n const rect = el.getBoundingClientRect();\n height.value = rect.height;\n bottom.value = rect.bottom;\n left.value = rect.left;\n right.value = rect.right;\n top.value = rect.top;\n width.value = rect.width;\n x.value = rect.x;\n y.value = rect.y;\n }\n function update() {\n if (updateTiming === \"sync\")\n recalculate();\n else if (updateTiming === \"next-frame\")\n requestAnimationFrame(() => recalculate());\n }\n useResizeObserver(target, update);\n watch(() => unrefElement(target), (ele) => !ele && update());\n useMutationObserver(target, update, {\n attributeFilter: [\"style\", \"class\"]\n });\n if (windowScroll)\n useEventListener(\"scroll\", update, { capture: true, passive: true });\n if (windowResize)\n useEventListener(\"resize\", update, { passive: true });\n tryOnMounted(() => {\n if (immediate)\n update();\n });\n return {\n height,\n bottom,\n left,\n right,\n top,\n width,\n x,\n y,\n update\n };\n}\n\nfunction useElementByPoint(options) {\n const {\n x,\n y,\n document = defaultDocument,\n multiple,\n interval = \"requestAnimationFrame\",\n immediate = true\n } = options;\n const isSupported = useSupported(() => {\n if (toValue(multiple))\n return document && \"elementsFromPoint\" in document;\n return document && \"elementFromPoint\" in document;\n });\n const element = shallowRef(null);\n const cb = () => {\n var _a, _b;\n element.value = toValue(multiple) ? (_a = document == null ? void 0 : document.elementsFromPoint(toValue(x), toValue(y))) != null ? _a : [] : (_b = document == null ? void 0 : document.elementFromPoint(toValue(x), toValue(y))) != null ? _b : null;\n };\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(cb, { immediate }) : useIntervalFn(cb, interval, { immediate });\n return {\n isSupported,\n element,\n ...controls\n };\n}\n\nfunction useElementHover(el, options = {}) {\n const {\n delayEnter = 0,\n delayLeave = 0,\n triggerOnRemoval = false,\n window = defaultWindow\n } = options;\n const isHovered = shallowRef(false);\n let timer;\n const toggle = (entering) => {\n const delay = entering ? delayEnter : delayLeave;\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n }\n if (delay)\n timer = setTimeout(() => isHovered.value = entering, delay);\n else\n isHovered.value = entering;\n };\n if (!window)\n return isHovered;\n useEventListener(el, \"mouseenter\", () => toggle(true), { passive: true });\n useEventListener(el, \"mouseleave\", () => toggle(false), { passive: true });\n if (triggerOnRemoval) {\n onElementRemoval(\n computed(() => unrefElement(el)),\n () => toggle(false)\n );\n }\n return isHovered;\n}\n\nfunction useElementSize(target, initialSize = { width: 0, height: 0 }, options = {}) {\n const { window = defaultWindow, box = \"content-box\" } = options;\n const isSVG = computed(() => {\n var _a, _b;\n return (_b = (_a = unrefElement(target)) == null ? void 0 : _a.namespaceURI) == null ? void 0 : _b.includes(\"svg\");\n });\n const width = shallowRef(initialSize.width);\n const height = shallowRef(initialSize.height);\n const { stop: stop1 } = useResizeObserver(\n target,\n ([entry]) => {\n const boxSize = box === \"border-box\" ? entry.borderBoxSize : box === \"content-box\" ? entry.contentBoxSize : entry.devicePixelContentBoxSize;\n if (window && isSVG.value) {\n const $elem = unrefElement(target);\n if ($elem) {\n const rect = $elem.getBoundingClientRect();\n width.value = rect.width;\n height.value = rect.height;\n }\n } else {\n if (boxSize) {\n const formatBoxSize = toArray(boxSize);\n width.value = formatBoxSize.reduce((acc, { inlineSize }) => acc + inlineSize, 0);\n height.value = formatBoxSize.reduce((acc, { blockSize }) => acc + blockSize, 0);\n } else {\n width.value = entry.contentRect.width;\n height.value = entry.contentRect.height;\n }\n }\n },\n options\n );\n tryOnMounted(() => {\n const ele = unrefElement(target);\n if (ele) {\n width.value = \"offsetWidth\" in ele ? ele.offsetWidth : initialSize.width;\n height.value = \"offsetHeight\" in ele ? ele.offsetHeight : initialSize.height;\n }\n });\n const stop2 = watch(\n () => unrefElement(target),\n (ele) => {\n width.value = ele ? initialSize.width : 0;\n height.value = ele ? initialSize.height : 0;\n }\n );\n function stop() {\n stop1();\n stop2();\n }\n return {\n width,\n height,\n stop\n };\n}\n\nfunction useIntersectionObserver(target, callback, options = {}) {\n const {\n root,\n rootMargin = \"0px\",\n threshold = 0,\n window = defaultWindow,\n immediate = true\n } = options;\n const isSupported = useSupported(() => window && \"IntersectionObserver\" in window);\n const targets = computed(() => {\n const _target = toValue(target);\n return toArray(_target).map(unrefElement).filter(notNullish);\n });\n let cleanup = noop;\n const isActive = shallowRef(immediate);\n const stopWatch = isSupported.value ? watch(\n () => [targets.value, unrefElement(root), isActive.value],\n ([targets2, root2]) => {\n cleanup();\n if (!isActive.value)\n return;\n if (!targets2.length)\n return;\n const observer = new IntersectionObserver(\n callback,\n {\n root: unrefElement(root2),\n rootMargin,\n threshold\n }\n );\n targets2.forEach((el) => el && observer.observe(el));\n cleanup = () => {\n observer.disconnect();\n cleanup = noop;\n };\n },\n { immediate, flush: \"post\" }\n ) : noop;\n const stop = () => {\n cleanup();\n stopWatch();\n isActive.value = false;\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n isActive,\n pause() {\n cleanup();\n isActive.value = false;\n },\n resume() {\n isActive.value = true;\n },\n stop\n };\n}\n\nfunction useElementVisibility(element, options = {}) {\n const {\n window = defaultWindow,\n scrollTarget,\n threshold = 0,\n rootMargin,\n once = false\n } = options;\n const elementIsVisible = shallowRef(false);\n const { stop } = useIntersectionObserver(\n element,\n (intersectionObserverEntries) => {\n let isIntersecting = elementIsVisible.value;\n let latestTime = 0;\n for (const entry of intersectionObserverEntries) {\n if (entry.time >= latestTime) {\n latestTime = entry.time;\n isIntersecting = entry.isIntersecting;\n }\n }\n elementIsVisible.value = isIntersecting;\n if (once) {\n watchOnce(elementIsVisible, () => {\n stop();\n });\n }\n },\n {\n root: scrollTarget,\n window,\n threshold,\n rootMargin: toValue(rootMargin)\n }\n );\n return elementIsVisible;\n}\n\nconst events = /* @__PURE__ */ new Map();\n\nfunction useEventBus(key) {\n const scope = getCurrentScope();\n function on(listener) {\n var _a;\n const listeners = events.get(key) || /* @__PURE__ */ new Set();\n listeners.add(listener);\n events.set(key, listeners);\n const _off = () => off(listener);\n (_a = scope == null ? void 0 : scope.cleanups) == null ? void 0 : _a.push(_off);\n return _off;\n }\n function once(listener) {\n function _listener(...args) {\n off(_listener);\n listener(...args);\n }\n return on(_listener);\n }\n function off(listener) {\n const listeners = events.get(key);\n if (!listeners)\n return;\n listeners.delete(listener);\n if (!listeners.size)\n reset();\n }\n function reset() {\n events.delete(key);\n }\n function emit(event, payload) {\n var _a;\n (_a = events.get(key)) == null ? void 0 : _a.forEach((v) => v(event, payload));\n }\n return { on, once, off, emit, reset };\n}\n\nfunction resolveNestedOptions$1(options) {\n if (options === true)\n return {};\n return options;\n}\nfunction useEventSource(url, events = [], options = {}) {\n const event = shallowRef(null);\n const data = shallowRef(null);\n const status = shallowRef(\"CONNECTING\");\n const eventSource = ref(null);\n const error = shallowRef(null);\n const urlRef = toRef(url);\n const lastEventId = shallowRef(null);\n let explicitlyClosed = false;\n let retried = 0;\n const {\n withCredentials = false,\n immediate = true,\n autoConnect = true,\n autoReconnect\n } = options;\n const close = () => {\n if (isClient && eventSource.value) {\n eventSource.value.close();\n eventSource.value = null;\n status.value = \"CLOSED\";\n explicitlyClosed = true;\n }\n };\n const _init = () => {\n if (explicitlyClosed || typeof urlRef.value === \"undefined\")\n return;\n const es = new EventSource(urlRef.value, { withCredentials });\n status.value = \"CONNECTING\";\n eventSource.value = es;\n es.onopen = () => {\n status.value = \"OPEN\";\n error.value = null;\n };\n es.onerror = (e) => {\n status.value = \"CLOSED\";\n error.value = e;\n if (es.readyState === 2 && !explicitlyClosed && autoReconnect) {\n es.close();\n const {\n retries = -1,\n delay = 1e3,\n onFailed\n } = resolveNestedOptions$1(autoReconnect);\n retried += 1;\n if (typeof retries === \"number\" && (retries < 0 || retried < retries))\n setTimeout(_init, delay);\n else if (typeof retries === \"function\" && retries())\n setTimeout(_init, delay);\n else\n onFailed == null ? void 0 : onFailed();\n }\n };\n es.onmessage = (e) => {\n event.value = null;\n data.value = e.data;\n lastEventId.value = e.lastEventId;\n };\n for (const event_name of events) {\n useEventListener(es, event_name, (e) => {\n event.value = event_name;\n data.value = e.data || null;\n }, { passive: true });\n }\n };\n const open = () => {\n if (!isClient)\n return;\n close();\n explicitlyClosed = false;\n retried = 0;\n _init();\n };\n if (immediate)\n open();\n if (autoConnect)\n watch(urlRef, open);\n tryOnScopeDispose(close);\n return {\n eventSource,\n event,\n data,\n status,\n error,\n open,\n close,\n lastEventId\n };\n}\n\nfunction useEyeDropper(options = {}) {\n const { initialValue = \"\" } = options;\n const isSupported = useSupported(() => typeof window !== \"undefined\" && \"EyeDropper\" in window);\n const sRGBHex = shallowRef(initialValue);\n async function open(openOptions) {\n if (!isSupported.value)\n return;\n const eyeDropper = new window.EyeDropper();\n const result = await eyeDropper.open(openOptions);\n sRGBHex.value = result.sRGBHex;\n return result;\n }\n return { isSupported, sRGBHex, open };\n}\n\nfunction useFavicon(newIcon = null, options = {}) {\n const {\n baseUrl = \"\",\n rel = \"icon\",\n document = defaultDocument\n } = options;\n const favicon = toRef(newIcon);\n const applyIcon = (icon) => {\n const elements = document == null ? void 0 : document.head.querySelectorAll(`link[rel*=\"${rel}\"]`);\n if (!elements || elements.length === 0) {\n const link = document == null ? void 0 : document.createElement(\"link\");\n if (link) {\n link.rel = rel;\n link.href = `${baseUrl}${icon}`;\n link.type = `image/${icon.split(\".\").pop()}`;\n document == null ? void 0 : document.head.append(link);\n }\n return;\n }\n elements == null ? void 0 : elements.forEach((el) => el.href = `${baseUrl}${icon}`);\n };\n watch(\n favicon,\n (i, o) => {\n if (typeof i === \"string\" && i !== o)\n applyIcon(i);\n },\n { immediate: true }\n );\n return favicon;\n}\n\nconst payloadMapping = {\n json: \"application/json\",\n text: \"text/plain\"\n};\nfunction isFetchOptions(obj) {\n return obj && containsProp(obj, \"immediate\", \"refetch\", \"initialData\", \"timeout\", \"beforeFetch\", \"afterFetch\", \"onFetchError\", \"fetch\", \"updateDataOnError\");\n}\nconst reAbsolute = /^(?:[a-z][a-z\\d+\\-.]*:)?\\/\\//i;\nfunction isAbsoluteURL(url) {\n return reAbsolute.test(url);\n}\nfunction headersToObject(headers) {\n if (typeof Headers !== \"undefined\" && headers instanceof Headers)\n return Object.fromEntries(headers.entries());\n return headers;\n}\nfunction combineCallbacks(combination, ...callbacks) {\n if (combination === \"overwrite\") {\n return async (ctx) => {\n let callback;\n for (let i = callbacks.length - 1; i >= 0; i--) {\n if (callbacks[i] != null) {\n callback = callbacks[i];\n break;\n }\n }\n if (callback)\n return { ...ctx, ...await callback(ctx) };\n return ctx;\n };\n } else {\n return async (ctx) => {\n for (const callback of callbacks) {\n if (callback)\n ctx = { ...ctx, ...await callback(ctx) };\n }\n return ctx;\n };\n }\n}\nfunction createFetch(config = {}) {\n const _combination = config.combination || \"chain\";\n const _options = config.options || {};\n const _fetchOptions = config.fetchOptions || {};\n function useFactoryFetch(url, ...args) {\n const computedUrl = computed(() => {\n const baseUrl = toValue(config.baseUrl);\n const targetUrl = toValue(url);\n return baseUrl && !isAbsoluteURL(targetUrl) ? joinPaths(baseUrl, targetUrl) : targetUrl;\n });\n let options = _options;\n let fetchOptions = _fetchOptions;\n if (args.length > 0) {\n if (isFetchOptions(args[0])) {\n options = {\n ...options,\n ...args[0],\n beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[0].beforeFetch),\n afterFetch: combineCallbacks(_combination, _options.afterFetch, args[0].afterFetch),\n onFetchError: combineCallbacks(_combination, _options.onFetchError, args[0].onFetchError)\n };\n } else {\n fetchOptions = {\n ...fetchOptions,\n ...args[0],\n headers: {\n ...headersToObject(fetchOptions.headers) || {},\n ...headersToObject(args[0].headers) || {}\n }\n };\n }\n }\n if (args.length > 1 && isFetchOptions(args[1])) {\n options = {\n ...options,\n ...args[1],\n beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[1].beforeFetch),\n afterFetch: combineCallbacks(_combination, _options.afterFetch, args[1].afterFetch),\n onFetchError: combineCallbacks(_combination, _options.onFetchError, args[1].onFetchError)\n };\n }\n return useFetch(computedUrl, fetchOptions, options);\n }\n return useFactoryFetch;\n}\nfunction useFetch(url, ...args) {\n var _a;\n const supportsAbort = typeof AbortController === \"function\";\n let fetchOptions = {};\n let options = {\n immediate: true,\n refetch: false,\n timeout: 0,\n updateDataOnError: false\n };\n const config = {\n method: \"GET\",\n type: \"text\",\n payload: void 0\n };\n if (args.length > 0) {\n if (isFetchOptions(args[0]))\n options = { ...options, ...args[0] };\n else\n fetchOptions = args[0];\n }\n if (args.length > 1) {\n if (isFetchOptions(args[1]))\n options = { ...options, ...args[1] };\n }\n const {\n fetch = (_a = defaultWindow) == null ? void 0 : _a.fetch,\n initialData,\n timeout\n } = options;\n const responseEvent = createEventHook();\n const errorEvent = createEventHook();\n const finallyEvent = createEventHook();\n const isFinished = shallowRef(false);\n const isFetching = shallowRef(false);\n const aborted = shallowRef(false);\n const statusCode = shallowRef(null);\n const response = shallowRef(null);\n const error = shallowRef(null);\n const data = shallowRef(initialData || null);\n const canAbort = computed(() => supportsAbort && isFetching.value);\n let controller;\n let timer;\n const abort = () => {\n if (supportsAbort) {\n controller == null ? void 0 : controller.abort();\n controller = new AbortController();\n controller.signal.onabort = () => aborted.value = true;\n fetchOptions = {\n ...fetchOptions,\n signal: controller.signal\n };\n }\n };\n const loading = (isLoading) => {\n isFetching.value = isLoading;\n isFinished.value = !isLoading;\n };\n if (timeout)\n timer = useTimeoutFn(abort, timeout, { immediate: false });\n let executeCounter = 0;\n const execute = async (throwOnFailed = false) => {\n var _a2, _b;\n abort();\n loading(true);\n error.value = null;\n statusCode.value = null;\n aborted.value = false;\n executeCounter += 1;\n const currentExecuteCounter = executeCounter;\n const defaultFetchOptions = {\n method: config.method,\n headers: {}\n };\n const payload = toValue(config.payload);\n if (payload) {\n const headers = headersToObject(defaultFetchOptions.headers);\n const proto = Object.getPrototypeOf(payload);\n if (!config.payloadType && payload && (proto === Object.prototype || Array.isArray(proto)) && !(payload instanceof FormData))\n config.payloadType = \"json\";\n if (config.payloadType)\n headers[\"Content-Type\"] = (_a2 = payloadMapping[config.payloadType]) != null ? _a2 : config.payloadType;\n defaultFetchOptions.body = config.payloadType === \"json\" ? JSON.stringify(payload) : payload;\n }\n let isCanceled = false;\n const context = {\n url: toValue(url),\n options: {\n ...defaultFetchOptions,\n ...fetchOptions\n },\n cancel: () => {\n isCanceled = true;\n }\n };\n if (options.beforeFetch)\n Object.assign(context, await options.beforeFetch(context));\n if (isCanceled || !fetch) {\n loading(false);\n return Promise.resolve(null);\n }\n let responseData = null;\n if (timer)\n timer.start();\n return fetch(\n context.url,\n {\n ...defaultFetchOptions,\n ...context.options,\n headers: {\n ...headersToObject(defaultFetchOptions.headers),\n ...headersToObject((_b = context.options) == null ? void 0 : _b.headers)\n }\n }\n ).then(async (fetchResponse) => {\n response.value = fetchResponse;\n statusCode.value = fetchResponse.status;\n responseData = await fetchResponse.clone()[config.type]();\n if (!fetchResponse.ok) {\n data.value = initialData || null;\n throw new Error(fetchResponse.statusText);\n }\n if (options.afterFetch) {\n ({ data: responseData } = await options.afterFetch({\n data: responseData,\n response: fetchResponse,\n context,\n execute\n }));\n }\n data.value = responseData;\n responseEvent.trigger(fetchResponse);\n return fetchResponse;\n }).catch(async (fetchError) => {\n let errorData = fetchError.message || fetchError.name;\n if (options.onFetchError) {\n ({ error: errorData, data: responseData } = await options.onFetchError({\n data: responseData,\n error: fetchError,\n response: response.value,\n context,\n execute\n }));\n }\n error.value = errorData;\n if (options.updateDataOnError)\n data.value = responseData;\n errorEvent.trigger(fetchError);\n if (throwOnFailed)\n throw fetchError;\n return null;\n }).finally(() => {\n if (currentExecuteCounter === executeCounter)\n loading(false);\n if (timer)\n timer.stop();\n finallyEvent.trigger(null);\n });\n };\n const refetch = toRef(options.refetch);\n watch(\n [\n refetch,\n toRef(url)\n ],\n ([refetch2]) => refetch2 && execute(),\n { deep: true }\n );\n const shell = {\n isFinished: readonly(isFinished),\n isFetching: readonly(isFetching),\n statusCode,\n response,\n error,\n data,\n canAbort,\n aborted,\n abort,\n execute,\n onFetchResponse: responseEvent.on,\n onFetchError: errorEvent.on,\n onFetchFinally: finallyEvent.on,\n // method\n get: setMethod(\"GET\"),\n put: setMethod(\"PUT\"),\n post: setMethod(\"POST\"),\n delete: setMethod(\"DELETE\"),\n patch: setMethod(\"PATCH\"),\n head: setMethod(\"HEAD\"),\n options: setMethod(\"OPTIONS\"),\n // type\n json: setType(\"json\"),\n text: setType(\"text\"),\n blob: setType(\"blob\"),\n arrayBuffer: setType(\"arrayBuffer\"),\n formData: setType(\"formData\")\n };\n function setMethod(method) {\n return (payload, payloadType) => {\n if (!isFetching.value) {\n config.method = method;\n config.payload = payload;\n config.payloadType = payloadType;\n if (isRef(config.payload)) {\n watch(\n [\n refetch,\n toRef(config.payload)\n ],\n ([refetch2]) => refetch2 && execute(),\n { deep: true }\n );\n }\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n };\n }\n return void 0;\n };\n }\n function waitUntilFinished() {\n return new Promise((resolve, reject) => {\n until(isFinished).toBe(true).then(() => resolve(shell)).catch(reject);\n });\n }\n function setType(type) {\n return () => {\n if (!isFetching.value) {\n config.type = type;\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n };\n }\n return void 0;\n };\n }\n if (options.immediate)\n Promise.resolve().then(() => execute());\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n };\n}\nfunction joinPaths(start, end) {\n if (!start.endsWith(\"/\") && !end.startsWith(\"/\")) {\n return `${start}/${end}`;\n }\n if (start.endsWith(\"/\") && end.startsWith(\"/\")) {\n return `${start.slice(0, -1)}${end}`;\n }\n return `${start}${end}`;\n}\n\nconst DEFAULT_OPTIONS = {\n multiple: true,\n accept: \"*\",\n reset: false,\n directory: false\n};\nfunction prepareInitialFiles(files) {\n if (!files)\n return null;\n if (files instanceof FileList)\n return files;\n const dt = new DataTransfer();\n for (const file of files) {\n dt.items.add(file);\n }\n return dt.files;\n}\nfunction useFileDialog(options = {}) {\n const {\n document = defaultDocument\n } = options;\n const files = ref(prepareInitialFiles(options.initialFiles));\n const { on: onChange, trigger: changeTrigger } = createEventHook();\n const { on: onCancel, trigger: cancelTrigger } = createEventHook();\n let input;\n if (document) {\n input = document.createElement(\"input\");\n input.type = \"file\";\n input.onchange = (event) => {\n const result = event.target;\n files.value = result.files;\n changeTrigger(files.value);\n };\n input.oncancel = () => {\n cancelTrigger();\n };\n }\n const reset = () => {\n files.value = null;\n if (input && input.value) {\n input.value = \"\";\n changeTrigger(null);\n }\n };\n const open = (localOptions) => {\n if (!input)\n return;\n const _options = {\n ...DEFAULT_OPTIONS,\n ...options,\n ...localOptions\n };\n input.multiple = _options.multiple;\n input.accept = _options.accept;\n input.webkitdirectory = _options.directory;\n if (hasOwn(_options, \"capture\"))\n input.capture = _options.capture;\n if (_options.reset)\n reset();\n input.click();\n };\n return {\n files: readonly(files),\n open,\n reset,\n onCancel,\n onChange\n };\n}\n\nfunction useFileSystemAccess(options = {}) {\n const {\n window: _window = defaultWindow,\n dataType = \"Text\"\n } = options;\n const window = _window;\n const isSupported = useSupported(() => window && \"showSaveFilePicker\" in window && \"showOpenFilePicker\" in window);\n const fileHandle = shallowRef();\n const data = shallowRef();\n const file = shallowRef();\n const fileName = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.name) != null ? _b : \"\";\n });\n const fileMIME = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.type) != null ? _b : \"\";\n });\n const fileSize = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.size) != null ? _b : 0;\n });\n const fileLastModified = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.lastModified) != null ? _b : 0;\n });\n async function open(_options = {}) {\n if (!isSupported.value)\n return;\n const [handle] = await window.showOpenFilePicker({ ...toValue(options), ..._options });\n fileHandle.value = handle;\n await updateData();\n }\n async function create(_options = {}) {\n if (!isSupported.value)\n return;\n fileHandle.value = await window.showSaveFilePicker({ ...options, ..._options });\n data.value = void 0;\n await updateData();\n }\n async function save(_options = {}) {\n if (!isSupported.value)\n return;\n if (!fileHandle.value)\n return saveAs(_options);\n if (data.value) {\n const writableStream = await fileHandle.value.createWritable();\n await writableStream.write(data.value);\n await writableStream.close();\n }\n await updateFile();\n }\n async function saveAs(_options = {}) {\n if (!isSupported.value)\n return;\n fileHandle.value = await window.showSaveFilePicker({ ...options, ..._options });\n if (data.value) {\n const writableStream = await fileHandle.value.createWritable();\n await writableStream.write(data.value);\n await writableStream.close();\n }\n await updateFile();\n }\n async function updateFile() {\n var _a;\n file.value = await ((_a = fileHandle.value) == null ? void 0 : _a.getFile());\n }\n async function updateData() {\n var _a, _b;\n await updateFile();\n const type = toValue(dataType);\n if (type === \"Text\")\n data.value = await ((_a = file.value) == null ? void 0 : _a.text());\n else if (type === \"ArrayBuffer\")\n data.value = await ((_b = file.value) == null ? void 0 : _b.arrayBuffer());\n else if (type === \"Blob\")\n data.value = file.value;\n }\n watch(() => toValue(dataType), updateData);\n return {\n isSupported,\n data,\n file,\n fileName,\n fileMIME,\n fileSize,\n fileLastModified,\n open,\n create,\n save,\n saveAs,\n updateData\n };\n}\n\nfunction useFocus(target, options = {}) {\n const { initialValue = false, focusVisible = false, preventScroll = false } = options;\n const innerFocused = shallowRef(false);\n const targetElement = computed(() => unrefElement(target));\n const listenerOptions = { passive: true };\n useEventListener(targetElement, \"focus\", (event) => {\n var _a, _b;\n if (!focusVisible || ((_b = (_a = event.target).matches) == null ? void 0 : _b.call(_a, \":focus-visible\")))\n innerFocused.value = true;\n }, listenerOptions);\n useEventListener(targetElement, \"blur\", () => innerFocused.value = false, listenerOptions);\n const focused = computed({\n get: () => innerFocused.value,\n set(value) {\n var _a, _b;\n if (!value && innerFocused.value)\n (_a = targetElement.value) == null ? void 0 : _a.blur();\n else if (value && !innerFocused.value)\n (_b = targetElement.value) == null ? void 0 : _b.focus({ preventScroll });\n }\n });\n watch(\n targetElement,\n () => {\n focused.value = initialValue;\n },\n { immediate: true, flush: \"post\" }\n );\n return { focused };\n}\n\nconst EVENT_FOCUS_IN = \"focusin\";\nconst EVENT_FOCUS_OUT = \"focusout\";\nconst PSEUDO_CLASS_FOCUS_WITHIN = \":focus-within\";\nfunction useFocusWithin(target, options = {}) {\n const { window = defaultWindow } = options;\n const targetElement = computed(() => unrefElement(target));\n const _focused = shallowRef(false);\n const focused = computed(() => _focused.value);\n const activeElement = useActiveElement(options);\n if (!window || !activeElement.value) {\n return { focused };\n }\n const listenerOptions = { passive: true };\n useEventListener(targetElement, EVENT_FOCUS_IN, () => _focused.value = true, listenerOptions);\n useEventListener(targetElement, EVENT_FOCUS_OUT, () => {\n var _a, _b, _c;\n return _focused.value = (_c = (_b = (_a = targetElement.value) == null ? void 0 : _a.matches) == null ? void 0 : _b.call(_a, PSEUDO_CLASS_FOCUS_WITHIN)) != null ? _c : false;\n }, listenerOptions);\n return { focused };\n}\n\nfunction useFps(options) {\n var _a;\n const fps = shallowRef(0);\n if (typeof performance === \"undefined\")\n return fps;\n const every = (_a = options == null ? void 0 : options.every) != null ? _a : 10;\n let last = performance.now();\n let ticks = 0;\n useRafFn(() => {\n ticks += 1;\n if (ticks >= every) {\n const now = performance.now();\n const diff = now - last;\n fps.value = Math.round(1e3 / (diff / ticks));\n last = now;\n ticks = 0;\n }\n });\n return fps;\n}\n\nconst eventHandlers = [\n \"fullscreenchange\",\n \"webkitfullscreenchange\",\n \"webkitendfullscreen\",\n \"mozfullscreenchange\",\n \"MSFullscreenChange\"\n];\nfunction useFullscreen(target, options = {}) {\n const {\n document = defaultDocument,\n autoExit = false\n } = options;\n const targetRef = computed(() => {\n var _a;\n return (_a = unrefElement(target)) != null ? _a : document == null ? void 0 : document.documentElement;\n });\n const isFullscreen = shallowRef(false);\n const requestMethod = computed(() => {\n return [\n \"requestFullscreen\",\n \"webkitRequestFullscreen\",\n \"webkitEnterFullscreen\",\n \"webkitEnterFullScreen\",\n \"webkitRequestFullScreen\",\n \"mozRequestFullScreen\",\n \"msRequestFullscreen\"\n ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n });\n const exitMethod = computed(() => {\n return [\n \"exitFullscreen\",\n \"webkitExitFullscreen\",\n \"webkitExitFullScreen\",\n \"webkitCancelFullScreen\",\n \"mozCancelFullScreen\",\n \"msExitFullscreen\"\n ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n });\n const fullscreenEnabled = computed(() => {\n return [\n \"fullScreen\",\n \"webkitIsFullScreen\",\n \"webkitDisplayingFullscreen\",\n \"mozFullScreen\",\n \"msFullscreenElement\"\n ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n });\n const fullscreenElementMethod = [\n \"fullscreenElement\",\n \"webkitFullscreenElement\",\n \"mozFullScreenElement\",\n \"msFullscreenElement\"\n ].find((m) => document && m in document);\n const isSupported = useSupported(() => targetRef.value && document && requestMethod.value !== void 0 && exitMethod.value !== void 0 && fullscreenEnabled.value !== void 0);\n const isCurrentElementFullScreen = () => {\n if (fullscreenElementMethod)\n return (document == null ? void 0 : document[fullscreenElementMethod]) === targetRef.value;\n return false;\n };\n const isElementFullScreen = () => {\n if (fullscreenEnabled.value) {\n if (document && document[fullscreenEnabled.value] != null) {\n return document[fullscreenEnabled.value];\n } else {\n const target2 = targetRef.value;\n if ((target2 == null ? void 0 : target2[fullscreenEnabled.value]) != null) {\n return Boolean(target2[fullscreenEnabled.value]);\n }\n }\n }\n return false;\n };\n async function exit() {\n if (!isSupported.value || !isFullscreen.value)\n return;\n if (exitMethod.value) {\n if ((document == null ? void 0 : document[exitMethod.value]) != null) {\n await document[exitMethod.value]();\n } else {\n const target2 = targetRef.value;\n if ((target2 == null ? void 0 : target2[exitMethod.value]) != null)\n await target2[exitMethod.value]();\n }\n }\n isFullscreen.value = false;\n }\n async function enter() {\n if (!isSupported.value || isFullscreen.value)\n return;\n if (isElementFullScreen())\n await exit();\n const target2 = targetRef.value;\n if (requestMethod.value && (target2 == null ? void 0 : target2[requestMethod.value]) != null) {\n await target2[requestMethod.value]();\n isFullscreen.value = true;\n }\n }\n async function toggle() {\n await (isFullscreen.value ? exit() : enter());\n }\n const handlerCallback = () => {\n const isElementFullScreenValue = isElementFullScreen();\n if (!isElementFullScreenValue || isElementFullScreenValue && isCurrentElementFullScreen())\n isFullscreen.value = isElementFullScreenValue;\n };\n const listenerOptions = { capture: false, passive: true };\n useEventListener(document, eventHandlers, handlerCallback, listenerOptions);\n useEventListener(() => unrefElement(targetRef), eventHandlers, handlerCallback, listenerOptions);\n if (autoExit)\n tryOnScopeDispose(exit);\n return {\n isSupported,\n isFullscreen,\n enter,\n exit,\n toggle\n };\n}\n\nfunction mapGamepadToXbox360Controller(gamepad) {\n return computed(() => {\n if (gamepad.value) {\n return {\n buttons: {\n a: gamepad.value.buttons[0],\n b: gamepad.value.buttons[1],\n x: gamepad.value.buttons[2],\n y: gamepad.value.buttons[3]\n },\n bumper: {\n left: gamepad.value.buttons[4],\n right: gamepad.value.buttons[5]\n },\n triggers: {\n left: gamepad.value.buttons[6],\n right: gamepad.value.buttons[7]\n },\n stick: {\n left: {\n horizontal: gamepad.value.axes[0],\n vertical: gamepad.value.axes[1],\n button: gamepad.value.buttons[10]\n },\n right: {\n horizontal: gamepad.value.axes[2],\n vertical: gamepad.value.axes[3],\n button: gamepad.value.buttons[11]\n }\n },\n dpad: {\n up: gamepad.value.buttons[12],\n down: gamepad.value.buttons[13],\n left: gamepad.value.buttons[14],\n right: gamepad.value.buttons[15]\n },\n back: gamepad.value.buttons[8],\n start: gamepad.value.buttons[9]\n };\n }\n return null;\n });\n}\nfunction useGamepad(options = {}) {\n const {\n navigator = defaultNavigator\n } = options;\n const isSupported = useSupported(() => navigator && \"getGamepads\" in navigator);\n const gamepads = ref([]);\n const onConnectedHook = createEventHook();\n const onDisconnectedHook = createEventHook();\n const stateFromGamepad = (gamepad) => {\n const hapticActuators = [];\n const vibrationActuator = \"vibrationActuator\" in gamepad ? gamepad.vibrationActuator : null;\n if (vibrationActuator)\n hapticActuators.push(vibrationActuator);\n if (gamepad.hapticActuators)\n hapticActuators.push(...gamepad.hapticActuators);\n return {\n id: gamepad.id,\n index: gamepad.index,\n connected: gamepad.connected,\n mapping: gamepad.mapping,\n timestamp: gamepad.timestamp,\n vibrationActuator: gamepad.vibrationActuator,\n hapticActuators,\n axes: gamepad.axes.map((axes) => axes),\n buttons: gamepad.buttons.map((button) => ({ pressed: button.pressed, touched: button.touched, value: button.value }))\n };\n };\n const updateGamepadState = () => {\n const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || [];\n for (const gamepad of _gamepads) {\n if (gamepad && gamepads.value[gamepad.index])\n gamepads.value[gamepad.index] = stateFromGamepad(gamepad);\n }\n };\n const { isActive, pause, resume } = useRafFn(updateGamepadState);\n const onGamepadConnected = (gamepad) => {\n if (!gamepads.value.some(({ index }) => index === gamepad.index)) {\n gamepads.value.push(stateFromGamepad(gamepad));\n onConnectedHook.trigger(gamepad.index);\n }\n resume();\n };\n const onGamepadDisconnected = (gamepad) => {\n gamepads.value = gamepads.value.filter((x) => x.index !== gamepad.index);\n onDisconnectedHook.trigger(gamepad.index);\n };\n const listenerOptions = { passive: true };\n useEventListener(\"gamepadconnected\", (e) => onGamepadConnected(e.gamepad), listenerOptions);\n useEventListener(\"gamepaddisconnected\", (e) => onGamepadDisconnected(e.gamepad), listenerOptions);\n tryOnMounted(() => {\n const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || [];\n for (const gamepad of _gamepads) {\n if (gamepad && gamepads.value[gamepad.index])\n onGamepadConnected(gamepad);\n }\n });\n pause();\n return {\n isSupported,\n onConnected: onConnectedHook.on,\n onDisconnected: onDisconnectedHook.on,\n gamepads,\n pause,\n resume,\n isActive\n };\n}\n\nfunction useGeolocation(options = {}) {\n const {\n enableHighAccuracy = true,\n maximumAge = 3e4,\n timeout = 27e3,\n navigator = defaultNavigator,\n immediate = true\n } = options;\n const isSupported = useSupported(() => navigator && \"geolocation\" in navigator);\n const locatedAt = shallowRef(null);\n const error = shallowRef(null);\n const coords = ref({\n accuracy: 0,\n latitude: Number.POSITIVE_INFINITY,\n longitude: Number.POSITIVE_INFINITY,\n altitude: null,\n altitudeAccuracy: null,\n heading: null,\n speed: null\n });\n function updatePosition(position) {\n locatedAt.value = position.timestamp;\n coords.value = position.coords;\n error.value = null;\n }\n let watcher;\n function resume() {\n if (isSupported.value) {\n watcher = navigator.geolocation.watchPosition(\n updatePosition,\n (err) => error.value = err,\n {\n enableHighAccuracy,\n maximumAge,\n timeout\n }\n );\n }\n }\n if (immediate)\n resume();\n function pause() {\n if (watcher && navigator)\n navigator.geolocation.clearWatch(watcher);\n }\n tryOnScopeDispose(() => {\n pause();\n });\n return {\n isSupported,\n coords,\n locatedAt,\n error,\n resume,\n pause\n };\n}\n\nconst defaultEvents$1 = [\"mousemove\", \"mousedown\", \"resize\", \"keydown\", \"touchstart\", \"wheel\"];\nconst oneMinute = 6e4;\nfunction useIdle(timeout = oneMinute, options = {}) {\n const {\n initialState = false,\n listenForVisibilityChange = true,\n events = defaultEvents$1,\n window = defaultWindow,\n eventFilter = throttleFilter(50)\n } = options;\n const idle = shallowRef(initialState);\n const lastActive = shallowRef(timestamp());\n let timer;\n const reset = () => {\n idle.value = false;\n clearTimeout(timer);\n timer = setTimeout(() => idle.value = true, timeout);\n };\n const onEvent = createFilterWrapper(\n eventFilter,\n () => {\n lastActive.value = timestamp();\n reset();\n }\n );\n if (window) {\n const document = window.document;\n const listenerOptions = { passive: true };\n for (const event of events)\n useEventListener(window, event, onEvent, listenerOptions);\n if (listenForVisibilityChange) {\n useEventListener(document, \"visibilitychange\", () => {\n if (!document.hidden)\n onEvent();\n }, listenerOptions);\n }\n reset();\n }\n return {\n idle,\n lastActive,\n reset\n };\n}\n\nasync function loadImage(options) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n const { src, srcset, sizes, class: clazz, loading, crossorigin, referrerPolicy, width, height, decoding, fetchPriority, ismap, usemap } = options;\n img.src = src;\n if (srcset != null)\n img.srcset = srcset;\n if (sizes != null)\n img.sizes = sizes;\n if (clazz != null)\n img.className = clazz;\n if (loading != null)\n img.loading = loading;\n if (crossorigin != null)\n img.crossOrigin = crossorigin;\n if (referrerPolicy != null)\n img.referrerPolicy = referrerPolicy;\n if (width != null)\n img.width = width;\n if (height != null)\n img.height = height;\n if (decoding != null)\n img.decoding = decoding;\n if (fetchPriority != null)\n img.fetchPriority = fetchPriority;\n if (ismap != null)\n img.isMap = ismap;\n if (usemap != null)\n img.useMap = usemap;\n img.onload = () => resolve(img);\n img.onerror = reject;\n });\n}\nfunction useImage(options, asyncStateOptions = {}) {\n const state = useAsyncState(\n () => loadImage(toValue(options)),\n void 0,\n {\n resetOnExecute: true,\n ...asyncStateOptions\n }\n );\n watch(\n () => toValue(options),\n () => state.execute(asyncStateOptions.delay),\n { deep: true }\n );\n return state;\n}\n\nfunction resolveElement(el) {\n if (typeof Window !== \"undefined\" && el instanceof Window)\n return el.document.documentElement;\n if (typeof Document !== \"undefined\" && el instanceof Document)\n return el.documentElement;\n return el;\n}\n\nconst ARRIVED_STATE_THRESHOLD_PIXELS = 1;\nfunction useScroll(element, options = {}) {\n const {\n throttle = 0,\n idle = 200,\n onStop = noop,\n onScroll = noop,\n offset = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n },\n eventListenerOptions = {\n capture: false,\n passive: true\n },\n behavior = \"auto\",\n window = defaultWindow,\n onError = (e) => {\n console.error(e);\n }\n } = options;\n const internalX = shallowRef(0);\n const internalY = shallowRef(0);\n const x = computed({\n get() {\n return internalX.value;\n },\n set(x2) {\n scrollTo(x2, void 0);\n }\n });\n const y = computed({\n get() {\n return internalY.value;\n },\n set(y2) {\n scrollTo(void 0, y2);\n }\n });\n function scrollTo(_x, _y) {\n var _a, _b, _c, _d;\n if (!window)\n return;\n const _element = toValue(element);\n if (!_element)\n return;\n (_c = _element instanceof Document ? window.document.body : _element) == null ? void 0 : _c.scrollTo({\n top: (_a = toValue(_y)) != null ? _a : y.value,\n left: (_b = toValue(_x)) != null ? _b : x.value,\n behavior: toValue(behavior)\n });\n const scrollContainer = ((_d = _element == null ? void 0 : _element.document) == null ? void 0 : _d.documentElement) || (_element == null ? void 0 : _element.documentElement) || _element;\n if (x != null)\n internalX.value = scrollContainer.scrollLeft;\n if (y != null)\n internalY.value = scrollContainer.scrollTop;\n }\n const isScrolling = shallowRef(false);\n const arrivedState = reactive({\n left: true,\n right: false,\n top: true,\n bottom: false\n });\n const directions = reactive({\n left: false,\n right: false,\n top: false,\n bottom: false\n });\n const onScrollEnd = (e) => {\n if (!isScrolling.value)\n return;\n isScrolling.value = false;\n directions.left = false;\n directions.right = false;\n directions.top = false;\n directions.bottom = false;\n onStop(e);\n };\n const onScrollEndDebounced = useDebounceFn(onScrollEnd, throttle + idle);\n const setArrivedState = (target) => {\n var _a;\n if (!window)\n return;\n const el = ((_a = target == null ? void 0 : target.document) == null ? void 0 : _a.documentElement) || (target == null ? void 0 : target.documentElement) || unrefElement(target);\n const { display, flexDirection, direction } = getComputedStyle(el);\n const directionMultipler = direction === \"rtl\" ? -1 : 1;\n const scrollLeft = el.scrollLeft;\n directions.left = scrollLeft < internalX.value;\n directions.right = scrollLeft > internalX.value;\n const left = Math.abs(scrollLeft * directionMultipler) <= (offset.left || 0);\n const right = Math.abs(scrollLeft * directionMultipler) + el.clientWidth >= el.scrollWidth - (offset.right || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n if (display === \"flex\" && flexDirection === \"row-reverse\") {\n arrivedState.left = right;\n arrivedState.right = left;\n } else {\n arrivedState.left = left;\n arrivedState.right = right;\n }\n internalX.value = scrollLeft;\n let scrollTop = el.scrollTop;\n if (target === window.document && !scrollTop)\n scrollTop = window.document.body.scrollTop;\n directions.top = scrollTop < internalY.value;\n directions.bottom = scrollTop > internalY.value;\n const top = Math.abs(scrollTop) <= (offset.top || 0);\n const bottom = Math.abs(scrollTop) + el.clientHeight >= el.scrollHeight - (offset.bottom || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n if (display === \"flex\" && flexDirection === \"column-reverse\") {\n arrivedState.top = bottom;\n arrivedState.bottom = top;\n } else {\n arrivedState.top = top;\n arrivedState.bottom = bottom;\n }\n internalY.value = scrollTop;\n };\n const onScrollHandler = (e) => {\n var _a;\n if (!window)\n return;\n const eventTarget = (_a = e.target.documentElement) != null ? _a : e.target;\n setArrivedState(eventTarget);\n isScrolling.value = true;\n onScrollEndDebounced(e);\n onScroll(e);\n };\n useEventListener(\n element,\n \"scroll\",\n throttle ? useThrottleFn(onScrollHandler, throttle, true, false) : onScrollHandler,\n eventListenerOptions\n );\n tryOnMounted(() => {\n try {\n const _element = toValue(element);\n if (!_element)\n return;\n setArrivedState(_element);\n } catch (e) {\n onError(e);\n }\n });\n useEventListener(\n element,\n \"scrollend\",\n onScrollEnd,\n eventListenerOptions\n );\n return {\n x,\n y,\n isScrolling,\n arrivedState,\n directions,\n measure() {\n const _element = toValue(element);\n if (window && _element)\n setArrivedState(_element);\n }\n };\n}\n\nfunction useInfiniteScroll(element, onLoadMore, options = {}) {\n var _a;\n const {\n direction = \"bottom\",\n interval = 100,\n canLoadMore = () => true\n } = options;\n const state = reactive(useScroll(\n element,\n {\n ...options,\n offset: {\n [direction]: (_a = options.distance) != null ? _a : 0,\n ...options.offset\n }\n }\n ));\n const promise = ref();\n const isLoading = computed(() => !!promise.value);\n const observedElement = computed(() => {\n return resolveElement(toValue(element));\n });\n const isElementVisible = useElementVisibility(observedElement);\n function checkAndLoad() {\n state.measure();\n if (!observedElement.value || !isElementVisible.value || !canLoadMore(observedElement.value))\n return;\n const { scrollHeight, clientHeight, scrollWidth, clientWidth } = observedElement.value;\n const isNarrower = direction === \"bottom\" || direction === \"top\" ? scrollHeight <= clientHeight : scrollWidth <= clientWidth;\n if (state.arrivedState[direction] || isNarrower) {\n if (!promise.value) {\n promise.value = Promise.all([\n onLoadMore(state),\n new Promise((resolve) => setTimeout(resolve, interval))\n ]).finally(() => {\n promise.value = null;\n nextTick(() => checkAndLoad());\n });\n }\n }\n }\n const stop = watch(\n () => [state.arrivedState[direction], isElementVisible.value],\n checkAndLoad,\n { immediate: true }\n );\n tryOnUnmounted(stop);\n return {\n isLoading,\n reset() {\n nextTick(() => checkAndLoad());\n }\n };\n}\n\nconst defaultEvents = [\"mousedown\", \"mouseup\", \"keydown\", \"keyup\"];\nfunction useKeyModifier(modifier, options = {}) {\n const {\n events = defaultEvents,\n document = defaultDocument,\n initial = null\n } = options;\n const state = shallowRef(initial);\n if (document) {\n events.forEach((listenerEvent) => {\n useEventListener(document, listenerEvent, (evt) => {\n if (typeof evt.getModifierState === \"function\")\n state.value = evt.getModifierState(modifier);\n }, { passive: true });\n });\n }\n return state;\n}\n\nfunction useLocalStorage(key, initialValue, options = {}) {\n const { window = defaultWindow } = options;\n return useStorage(key, initialValue, window == null ? void 0 : window.localStorage, options);\n}\n\nconst DefaultMagicKeysAliasMap = {\n ctrl: \"control\",\n command: \"meta\",\n cmd: \"meta\",\n option: \"alt\",\n up: \"arrowup\",\n down: \"arrowdown\",\n left: \"arrowleft\",\n right: \"arrowright\"\n};\n\nfunction useMagicKeys(options = {}) {\n const {\n reactive: useReactive = false,\n target = defaultWindow,\n aliasMap = DefaultMagicKeysAliasMap,\n passive = true,\n onEventFired = noop\n } = options;\n const current = reactive(/* @__PURE__ */ new Set());\n const obj = {\n toJSON() {\n return {};\n },\n current\n };\n const refs = useReactive ? reactive(obj) : obj;\n const metaDeps = /* @__PURE__ */ new Set();\n const usedKeys = /* @__PURE__ */ new Set();\n function setRefs(key, value) {\n if (key in refs) {\n if (useReactive)\n refs[key] = value;\n else\n refs[key].value = value;\n }\n }\n function reset() {\n current.clear();\n for (const key of usedKeys)\n setRefs(key, false);\n }\n function updateRefs(e, value) {\n var _a, _b;\n const key = (_a = e.key) == null ? void 0 : _a.toLowerCase();\n const code = (_b = e.code) == null ? void 0 : _b.toLowerCase();\n const values = [code, key].filter(Boolean);\n if (key) {\n if (value)\n current.add(key);\n else\n current.delete(key);\n }\n for (const key2 of values) {\n usedKeys.add(key2);\n setRefs(key2, value);\n }\n if (key === \"meta\" && !value) {\n metaDeps.forEach((key2) => {\n current.delete(key2);\n setRefs(key2, false);\n });\n metaDeps.clear();\n } else if (typeof e.getModifierState === \"function\" && e.getModifierState(\"Meta\") && value) {\n [...current, ...values].forEach((key2) => metaDeps.add(key2));\n }\n }\n useEventListener(target, \"keydown\", (e) => {\n updateRefs(e, true);\n return onEventFired(e);\n }, { passive });\n useEventListener(target, \"keyup\", (e) => {\n updateRefs(e, false);\n return onEventFired(e);\n }, { passive });\n useEventListener(\"blur\", reset, { passive });\n useEventListener(\"focus\", reset, { passive });\n const proxy = new Proxy(\n refs,\n {\n get(target2, prop, rec) {\n if (typeof prop !== \"string\")\n return Reflect.get(target2, prop, rec);\n prop = prop.toLowerCase();\n if (prop in aliasMap)\n prop = aliasMap[prop];\n if (!(prop in refs)) {\n if (/[+_-]/.test(prop)) {\n const keys = prop.split(/[+_-]/g).map((i) => i.trim());\n refs[prop] = computed(() => keys.map((key) => toValue(proxy[key])).every(Boolean));\n } else {\n refs[prop] = shallowRef(false);\n }\n }\n const r = Reflect.get(target2, prop, rec);\n return useReactive ? toValue(r) : r;\n }\n }\n );\n return proxy;\n}\n\nfunction usingElRef(source, cb) {\n if (toValue(source))\n cb(toValue(source));\n}\nfunction timeRangeToArray(timeRanges) {\n let ranges = [];\n for (let i = 0; i < timeRanges.length; ++i)\n ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]];\n return ranges;\n}\nfunction tracksToArray(tracks) {\n return Array.from(tracks).map(({ label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }, id) => ({ id, label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }));\n}\nconst defaultOptions = {\n src: \"\",\n tracks: []\n};\nfunction useMediaControls(target, options = {}) {\n target = toRef(target);\n options = {\n ...defaultOptions,\n ...options\n };\n const {\n document = defaultDocument\n } = options;\n const listenerOptions = { passive: true };\n const currentTime = shallowRef(0);\n const duration = shallowRef(0);\n const seeking = shallowRef(false);\n const volume = shallowRef(1);\n const waiting = shallowRef(false);\n const ended = shallowRef(false);\n const playing = shallowRef(false);\n const rate = shallowRef(1);\n const stalled = shallowRef(false);\n const buffered = ref([]);\n const tracks = ref([]);\n const selectedTrack = shallowRef(-1);\n const isPictureInPicture = shallowRef(false);\n const muted = shallowRef(false);\n const supportsPictureInPicture = document && \"pictureInPictureEnabled\" in document;\n const sourceErrorEvent = createEventHook();\n const playbackErrorEvent = createEventHook();\n const disableTrack = (track) => {\n usingElRef(target, (el) => {\n if (track) {\n const id = typeof track === \"number\" ? track : track.id;\n el.textTracks[id].mode = \"disabled\";\n } else {\n for (let i = 0; i < el.textTracks.length; ++i)\n el.textTracks[i].mode = \"disabled\";\n }\n selectedTrack.value = -1;\n });\n };\n const enableTrack = (track, disableTracks = true) => {\n usingElRef(target, (el) => {\n const id = typeof track === \"number\" ? track : track.id;\n if (disableTracks)\n disableTrack();\n el.textTracks[id].mode = \"showing\";\n selectedTrack.value = id;\n });\n };\n const togglePictureInPicture = () => {\n return new Promise((resolve, reject) => {\n usingElRef(target, async (el) => {\n if (supportsPictureInPicture) {\n if (!isPictureInPicture.value) {\n el.requestPictureInPicture().then(resolve).catch(reject);\n } else {\n document.exitPictureInPicture().then(resolve).catch(reject);\n }\n }\n });\n });\n };\n watchEffect(() => {\n if (!document)\n return;\n const el = toValue(target);\n if (!el)\n return;\n const src = toValue(options.src);\n let sources = [];\n if (!src)\n return;\n if (typeof src === \"string\")\n sources = [{ src }];\n else if (Array.isArray(src))\n sources = src;\n else if (isObject(src))\n sources = [src];\n el.querySelectorAll(\"source\").forEach((e) => {\n e.remove();\n });\n sources.forEach(({ src: src2, type, media }) => {\n const source = document.createElement(\"source\");\n source.setAttribute(\"src\", src2);\n source.setAttribute(\"type\", type || \"\");\n source.setAttribute(\"media\", media || \"\");\n useEventListener(source, \"error\", sourceErrorEvent.trigger, listenerOptions);\n el.appendChild(source);\n });\n el.load();\n });\n watch([target, volume], () => {\n const el = toValue(target);\n if (!el)\n return;\n el.volume = volume.value;\n });\n watch([target, muted], () => {\n const el = toValue(target);\n if (!el)\n return;\n el.muted = muted.value;\n });\n watch([target, rate], () => {\n const el = toValue(target);\n if (!el)\n return;\n el.playbackRate = rate.value;\n });\n watchEffect(() => {\n if (!document)\n return;\n const textTracks = toValue(options.tracks);\n const el = toValue(target);\n if (!textTracks || !textTracks.length || !el)\n return;\n el.querySelectorAll(\"track\").forEach((e) => e.remove());\n textTracks.forEach(({ default: isDefault, kind, label, src, srcLang }, i) => {\n const track = document.createElement(\"track\");\n track.default = isDefault || false;\n track.kind = kind;\n track.label = label;\n track.src = src;\n track.srclang = srcLang;\n if (track.default)\n selectedTrack.value = i;\n el.appendChild(track);\n });\n });\n const { ignoreUpdates: ignoreCurrentTimeUpdates } = watchIgnorable(currentTime, (time) => {\n const el = toValue(target);\n if (!el)\n return;\n el.currentTime = time;\n });\n const { ignoreUpdates: ignorePlayingUpdates } = watchIgnorable(playing, (isPlaying) => {\n const el = toValue(target);\n if (!el)\n return;\n if (isPlaying) {\n el.play().catch((e) => {\n playbackErrorEvent.trigger(e);\n throw e;\n });\n } else {\n el.pause();\n }\n });\n useEventListener(\n target,\n \"timeupdate\",\n () => ignoreCurrentTimeUpdates(() => currentTime.value = toValue(target).currentTime),\n listenerOptions\n );\n useEventListener(\n target,\n \"durationchange\",\n () => duration.value = toValue(target).duration,\n listenerOptions\n );\n useEventListener(\n target,\n \"progress\",\n () => buffered.value = timeRangeToArray(toValue(target).buffered),\n listenerOptions\n );\n useEventListener(\n target,\n \"seeking\",\n () => seeking.value = true,\n listenerOptions\n );\n useEventListener(\n target,\n \"seeked\",\n () => seeking.value = false,\n listenerOptions\n );\n useEventListener(\n target,\n [\"waiting\", \"loadstart\"],\n () => {\n waiting.value = true;\n ignorePlayingUpdates(() => playing.value = false);\n },\n listenerOptions\n );\n useEventListener(\n target,\n \"loadeddata\",\n () => waiting.value = false,\n listenerOptions\n );\n useEventListener(\n target,\n \"playing\",\n () => {\n waiting.value = false;\n ended.value = false;\n ignorePlayingUpdates(() => playing.value = true);\n },\n listenerOptions\n );\n useEventListener(\n target,\n \"ratechange\",\n () => rate.value = toValue(target).playbackRate,\n listenerOptions\n );\n useEventListener(\n target,\n \"stalled\",\n () => stalled.value = true,\n listenerOptions\n );\n useEventListener(\n target,\n \"ended\",\n () => ended.value = true,\n listenerOptions\n );\n useEventListener(\n target,\n \"pause\",\n () => ignorePlayingUpdates(() => playing.value = false),\n listenerOptions\n );\n useEventListener(\n target,\n \"play\",\n () => ignorePlayingUpdates(() => playing.value = true),\n listenerOptions\n );\n useEventListener(\n target,\n \"enterpictureinpicture\",\n () => isPictureInPicture.value = true,\n listenerOptions\n );\n useEventListener(\n target,\n \"leavepictureinpicture\",\n () => isPictureInPicture.value = false,\n listenerOptions\n );\n useEventListener(\n target,\n \"volumechange\",\n () => {\n const el = toValue(target);\n if (!el)\n return;\n volume.value = el.volume;\n muted.value = el.muted;\n },\n listenerOptions\n );\n const listeners = [];\n const stop = watch([target], () => {\n const el = toValue(target);\n if (!el)\n return;\n stop();\n listeners[0] = useEventListener(el.textTracks, \"addtrack\", () => tracks.value = tracksToArray(el.textTracks), listenerOptions);\n listeners[1] = useEventListener(el.textTracks, \"removetrack\", () => tracks.value = tracksToArray(el.textTracks), listenerOptions);\n listeners[2] = useEventListener(el.textTracks, \"change\", () => tracks.value = tracksToArray(el.textTracks), listenerOptions);\n });\n tryOnScopeDispose(() => listeners.forEach((listener) => listener()));\n return {\n currentTime,\n duration,\n waiting,\n seeking,\n ended,\n stalled,\n buffered,\n playing,\n rate,\n // Volume\n volume,\n muted,\n // Tracks\n tracks,\n selectedTrack,\n enableTrack,\n disableTrack,\n // Picture in Picture\n supportsPictureInPicture,\n togglePictureInPicture,\n isPictureInPicture,\n // Events\n onSourceError: sourceErrorEvent.on,\n onPlaybackError: playbackErrorEvent.on\n };\n}\n\nfunction useMemoize(resolver, options) {\n const initCache = () => {\n if (options == null ? void 0 : options.cache)\n return shallowReactive(options.cache);\n return shallowReactive(/* @__PURE__ */ new Map());\n };\n const cache = initCache();\n const generateKey = (...args) => (options == null ? void 0 : options.getKey) ? options.getKey(...args) : JSON.stringify(args);\n const _loadData = (key, ...args) => {\n cache.set(key, resolver(...args));\n return cache.get(key);\n };\n const loadData = (...args) => _loadData(generateKey(...args), ...args);\n const deleteData = (...args) => {\n cache.delete(generateKey(...args));\n };\n const clearData = () => {\n cache.clear();\n };\n const memoized = (...args) => {\n const key = generateKey(...args);\n if (cache.has(key))\n return cache.get(key);\n return _loadData(key, ...args);\n };\n memoized.load = loadData;\n memoized.delete = deleteData;\n memoized.clear = clearData;\n memoized.generateKey = generateKey;\n memoized.cache = cache;\n return memoized;\n}\n\nfunction useMemory(options = {}) {\n const memory = ref();\n const isSupported = useSupported(() => typeof performance !== \"undefined\" && \"memory\" in performance);\n if (isSupported.value) {\n const { interval = 1e3 } = options;\n useIntervalFn(() => {\n memory.value = performance.memory;\n }, interval, { immediate: options.immediate, immediateCallback: options.immediateCallback });\n }\n return { isSupported, memory };\n}\n\nconst UseMouseBuiltinExtractors = {\n page: (event) => [event.pageX, event.pageY],\n client: (event) => [event.clientX, event.clientY],\n screen: (event) => [event.screenX, event.screenY],\n movement: (event) => event instanceof MouseEvent ? [event.movementX, event.movementY] : null\n};\nfunction useMouse(options = {}) {\n const {\n type = \"page\",\n touch = true,\n resetOnTouchEnds = false,\n initialValue = { x: 0, y: 0 },\n window = defaultWindow,\n target = window,\n scroll = true,\n eventFilter\n } = options;\n let _prevMouseEvent = null;\n let _prevScrollX = 0;\n let _prevScrollY = 0;\n const x = shallowRef(initialValue.x);\n const y = shallowRef(initialValue.y);\n const sourceType = shallowRef(null);\n const extractor = typeof type === \"function\" ? type : UseMouseBuiltinExtractors[type];\n const mouseHandler = (event) => {\n const result = extractor(event);\n _prevMouseEvent = event;\n if (result) {\n [x.value, y.value] = result;\n sourceType.value = \"mouse\";\n }\n if (window) {\n _prevScrollX = window.scrollX;\n _prevScrollY = window.scrollY;\n }\n };\n const touchHandler = (event) => {\n if (event.touches.length > 0) {\n const result = extractor(event.touches[0]);\n if (result) {\n [x.value, y.value] = result;\n sourceType.value = \"touch\";\n }\n }\n };\n const scrollHandler = () => {\n if (!_prevMouseEvent || !window)\n return;\n const pos = extractor(_prevMouseEvent);\n if (_prevMouseEvent instanceof MouseEvent && pos) {\n x.value = pos[0] + window.scrollX - _prevScrollX;\n y.value = pos[1] + window.scrollY - _prevScrollY;\n }\n };\n const reset = () => {\n x.value = initialValue.x;\n y.value = initialValue.y;\n };\n const mouseHandlerWrapper = eventFilter ? (event) => eventFilter(() => mouseHandler(event), {}) : (event) => mouseHandler(event);\n const touchHandlerWrapper = eventFilter ? (event) => eventFilter(() => touchHandler(event), {}) : (event) => touchHandler(event);\n const scrollHandlerWrapper = eventFilter ? () => eventFilter(() => scrollHandler(), {}) : () => scrollHandler();\n if (target) {\n const listenerOptions = { passive: true };\n useEventListener(target, [\"mousemove\", \"dragover\"], mouseHandlerWrapper, listenerOptions);\n if (touch && type !== \"movement\") {\n useEventListener(target, [\"touchstart\", \"touchmove\"], touchHandlerWrapper, listenerOptions);\n if (resetOnTouchEnds)\n useEventListener(target, \"touchend\", reset, listenerOptions);\n }\n if (scroll && type === \"page\")\n useEventListener(window, \"scroll\", scrollHandlerWrapper, listenerOptions);\n }\n return {\n x,\n y,\n sourceType\n };\n}\n\nfunction useMouseInElement(target, options = {}) {\n const {\n handleOutside = true,\n window = defaultWindow\n } = options;\n const type = options.type || \"page\";\n const { x, y, sourceType } = useMouse(options);\n const targetRef = shallowRef(target != null ? target : window == null ? void 0 : window.document.body);\n const elementX = shallowRef(0);\n const elementY = shallowRef(0);\n const elementPositionX = shallowRef(0);\n const elementPositionY = shallowRef(0);\n const elementHeight = shallowRef(0);\n const elementWidth = shallowRef(0);\n const isOutside = shallowRef(true);\n let stop = () => {\n };\n if (window) {\n stop = watch(\n [targetRef, x, y],\n () => {\n const el = unrefElement(targetRef);\n if (!el || !(el instanceof Element))\n return;\n const {\n left,\n top,\n width,\n height\n } = el.getBoundingClientRect();\n elementPositionX.value = left + (type === \"page\" ? window.pageXOffset : 0);\n elementPositionY.value = top + (type === \"page\" ? window.pageYOffset : 0);\n elementHeight.value = height;\n elementWidth.value = width;\n const elX = x.value - elementPositionX.value;\n const elY = y.value - elementPositionY.value;\n isOutside.value = width === 0 || height === 0 || elX < 0 || elY < 0 || elX > width || elY > height;\n if (handleOutside || !isOutside.value) {\n elementX.value = elX;\n elementY.value = elY;\n }\n },\n { immediate: true }\n );\n useEventListener(\n document,\n \"mouseleave\",\n () => isOutside.value = true,\n { passive: true }\n );\n }\n return {\n x,\n y,\n sourceType,\n elementX,\n elementY,\n elementPositionX,\n elementPositionY,\n elementHeight,\n elementWidth,\n isOutside,\n stop\n };\n}\n\nfunction useMousePressed(options = {}) {\n const {\n touch = true,\n drag = true,\n capture = false,\n initialValue = false,\n window = defaultWindow\n } = options;\n const pressed = shallowRef(initialValue);\n const sourceType = shallowRef(null);\n if (!window) {\n return {\n pressed,\n sourceType\n };\n }\n const onPressed = (srcType) => (event) => {\n var _a;\n pressed.value = true;\n sourceType.value = srcType;\n (_a = options.onPressed) == null ? void 0 : _a.call(options, event);\n };\n const onReleased = (event) => {\n var _a;\n pressed.value = false;\n sourceType.value = null;\n (_a = options.onReleased) == null ? void 0 : _a.call(options, event);\n };\n const target = computed(() => unrefElement(options.target) || window);\n const listenerOptions = { passive: true, capture };\n useEventListener(target, \"mousedown\", onPressed(\"mouse\"), listenerOptions);\n useEventListener(window, \"mouseleave\", onReleased, listenerOptions);\n useEventListener(window, \"mouseup\", onReleased, listenerOptions);\n if (drag) {\n useEventListener(target, \"dragstart\", onPressed(\"mouse\"), listenerOptions);\n useEventListener(window, \"drop\", onReleased, listenerOptions);\n useEventListener(window, \"dragend\", onReleased, listenerOptions);\n }\n if (touch) {\n useEventListener(target, \"touchstart\", onPressed(\"touch\"), listenerOptions);\n useEventListener(window, \"touchend\", onReleased, listenerOptions);\n useEventListener(window, \"touchcancel\", onReleased, listenerOptions);\n }\n return {\n pressed,\n sourceType\n };\n}\n\nfunction useNavigatorLanguage(options = {}) {\n const { window = defaultWindow } = options;\n const navigator = window == null ? void 0 : window.navigator;\n const isSupported = useSupported(() => navigator && \"language\" in navigator);\n const language = shallowRef(navigator == null ? void 0 : navigator.language);\n useEventListener(window, \"languagechange\", () => {\n if (navigator)\n language.value = navigator.language;\n }, { passive: true });\n return {\n isSupported,\n language\n };\n}\n\nfunction useNetwork(options = {}) {\n const { window = defaultWindow } = options;\n const navigator = window == null ? void 0 : window.navigator;\n const isSupported = useSupported(() => navigator && \"connection\" in navigator);\n const isOnline = shallowRef(true);\n const saveData = shallowRef(false);\n const offlineAt = shallowRef(void 0);\n const onlineAt = shallowRef(void 0);\n const downlink = shallowRef(void 0);\n const downlinkMax = shallowRef(void 0);\n const rtt = shallowRef(void 0);\n const effectiveType = shallowRef(void 0);\n const type = shallowRef(\"unknown\");\n const connection = isSupported.value && navigator.connection;\n function updateNetworkInformation() {\n if (!navigator)\n return;\n isOnline.value = navigator.onLine;\n offlineAt.value = isOnline.value ? void 0 : Date.now();\n onlineAt.value = isOnline.value ? Date.now() : void 0;\n if (connection) {\n downlink.value = connection.downlink;\n downlinkMax.value = connection.downlinkMax;\n effectiveType.value = connection.effectiveType;\n rtt.value = connection.rtt;\n saveData.value = connection.saveData;\n type.value = connection.type;\n }\n }\n const listenerOptions = { passive: true };\n if (window) {\n useEventListener(window, \"offline\", () => {\n isOnline.value = false;\n offlineAt.value = Date.now();\n }, listenerOptions);\n useEventListener(window, \"online\", () => {\n isOnline.value = true;\n onlineAt.value = Date.now();\n }, listenerOptions);\n }\n if (connection)\n useEventListener(connection, \"change\", updateNetworkInformation, listenerOptions);\n updateNetworkInformation();\n return {\n isSupported,\n isOnline: readonly(isOnline),\n saveData: readonly(saveData),\n offlineAt: readonly(offlineAt),\n onlineAt: readonly(onlineAt),\n downlink: readonly(downlink),\n downlinkMax: readonly(downlinkMax),\n effectiveType: readonly(effectiveType),\n rtt: readonly(rtt),\n type: readonly(type)\n };\n}\n\nfunction useNow(options = {}) {\n const {\n controls: exposeControls = false,\n interval = \"requestAnimationFrame\"\n } = options;\n const now = ref(/* @__PURE__ */ new Date());\n const update = () => now.value = /* @__PURE__ */ new Date();\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(update, { immediate: true }) : useIntervalFn(update, interval, { immediate: true });\n if (exposeControls) {\n return {\n now,\n ...controls\n };\n } else {\n return now;\n }\n}\n\nfunction useObjectUrl(object) {\n const url = shallowRef();\n const release = () => {\n if (url.value)\n URL.revokeObjectURL(url.value);\n url.value = void 0;\n };\n watch(\n () => toValue(object),\n (newObject) => {\n release();\n if (newObject)\n url.value = URL.createObjectURL(newObject);\n },\n { immediate: true }\n );\n tryOnScopeDispose(release);\n return readonly(url);\n}\n\nfunction useClamp(value, min, max) {\n if (typeof value === \"function\" || isReadonly(value))\n return computed(() => clamp(toValue(value), toValue(min), toValue(max)));\n const _value = ref(value);\n return computed({\n get() {\n return _value.value = clamp(_value.value, toValue(min), toValue(max));\n },\n set(value2) {\n _value.value = clamp(value2, toValue(min), toValue(max));\n }\n });\n}\n\nfunction useOffsetPagination(options) {\n const {\n total = Number.POSITIVE_INFINITY,\n pageSize = 10,\n page = 1,\n onPageChange = noop,\n onPageSizeChange = noop,\n onPageCountChange = noop\n } = options;\n const currentPageSize = useClamp(pageSize, 1, Number.POSITIVE_INFINITY);\n const pageCount = computed(() => Math.max(\n 1,\n Math.ceil(toValue(total) / toValue(currentPageSize))\n ));\n const currentPage = useClamp(page, 1, pageCount);\n const isFirstPage = computed(() => currentPage.value === 1);\n const isLastPage = computed(() => currentPage.value === pageCount.value);\n if (isRef(page)) {\n syncRef(page, currentPage, {\n direction: isReadonly(page) ? \"ltr\" : \"both\"\n });\n }\n if (isRef(pageSize)) {\n syncRef(pageSize, currentPageSize, {\n direction: isReadonly(pageSize) ? \"ltr\" : \"both\"\n });\n }\n function prev() {\n currentPage.value--;\n }\n function next() {\n currentPage.value++;\n }\n const returnValue = {\n currentPage,\n currentPageSize,\n pageCount,\n isFirstPage,\n isLastPage,\n prev,\n next\n };\n watch(currentPage, () => {\n onPageChange(reactive(returnValue));\n });\n watch(currentPageSize, () => {\n onPageSizeChange(reactive(returnValue));\n });\n watch(pageCount, () => {\n onPageCountChange(reactive(returnValue));\n });\n return returnValue;\n}\n\nfunction useOnline(options = {}) {\n const { isOnline } = useNetwork(options);\n return isOnline;\n}\n\nfunction usePageLeave(options = {}) {\n const { window = defaultWindow } = options;\n const isLeft = shallowRef(false);\n const handler = (event) => {\n if (!window)\n return;\n event = event || window.event;\n const from = event.relatedTarget || event.toElement;\n isLeft.value = !from;\n };\n if (window) {\n const listenerOptions = { passive: true };\n useEventListener(window, \"mouseout\", handler, listenerOptions);\n useEventListener(window.document, \"mouseleave\", handler, listenerOptions);\n useEventListener(window.document, \"mouseenter\", handler, listenerOptions);\n }\n return isLeft;\n}\n\nfunction useScreenOrientation(options = {}) {\n const {\n window = defaultWindow\n } = options;\n const isSupported = useSupported(() => window && \"screen\" in window && \"orientation\" in window.screen);\n const screenOrientation = isSupported.value ? window.screen.orientation : {};\n const orientation = ref(screenOrientation.type);\n const angle = shallowRef(screenOrientation.angle || 0);\n if (isSupported.value) {\n useEventListener(window, \"orientationchange\", () => {\n orientation.value = screenOrientation.type;\n angle.value = screenOrientation.angle;\n }, { passive: true });\n }\n const lockOrientation = (type) => {\n if (isSupported.value && typeof screenOrientation.lock === \"function\")\n return screenOrientation.lock(type);\n return Promise.reject(new Error(\"Not supported\"));\n };\n const unlockOrientation = () => {\n if (isSupported.value && typeof screenOrientation.unlock === \"function\")\n screenOrientation.unlock();\n };\n return {\n isSupported,\n orientation,\n angle,\n lockOrientation,\n unlockOrientation\n };\n}\n\nfunction useParallax(target, options = {}) {\n const {\n deviceOrientationTiltAdjust = (i) => i,\n deviceOrientationRollAdjust = (i) => i,\n mouseTiltAdjust = (i) => i,\n mouseRollAdjust = (i) => i,\n window = defaultWindow\n } = options;\n const orientation = reactive(useDeviceOrientation({ window }));\n const screenOrientation = reactive(useScreenOrientation({ window }));\n const {\n elementX: x,\n elementY: y,\n elementWidth: width,\n elementHeight: height\n } = useMouseInElement(target, { handleOutside: false, window });\n const source = computed(() => {\n if (orientation.isSupported && (orientation.alpha != null && orientation.alpha !== 0 || orientation.gamma != null && orientation.gamma !== 0)) {\n return \"deviceOrientation\";\n }\n return \"mouse\";\n });\n const roll = computed(() => {\n if (source.value === \"deviceOrientation\") {\n let value;\n switch (screenOrientation.orientation) {\n case \"landscape-primary\":\n value = orientation.gamma / 90;\n break;\n case \"landscape-secondary\":\n value = -orientation.gamma / 90;\n break;\n case \"portrait-primary\":\n value = -orientation.beta / 90;\n break;\n case \"portrait-secondary\":\n value = orientation.beta / 90;\n break;\n default:\n value = -orientation.beta / 90;\n }\n return deviceOrientationRollAdjust(value);\n } else {\n const value = -(y.value - height.value / 2) / height.value;\n return mouseRollAdjust(value);\n }\n });\n const tilt = computed(() => {\n if (source.value === \"deviceOrientation\") {\n let value;\n switch (screenOrientation.orientation) {\n case \"landscape-primary\":\n value = orientation.beta / 90;\n break;\n case \"landscape-secondary\":\n value = -orientation.beta / 90;\n break;\n case \"portrait-primary\":\n value = orientation.gamma / 90;\n break;\n case \"portrait-secondary\":\n value = -orientation.gamma / 90;\n break;\n default:\n value = orientation.gamma / 90;\n }\n return deviceOrientationTiltAdjust(value);\n } else {\n const value = (x.value - width.value / 2) / width.value;\n return mouseTiltAdjust(value);\n }\n });\n return { roll, tilt, source };\n}\n\nfunction useParentElement(element = useCurrentElement()) {\n const parentElement = shallowRef();\n const update = () => {\n const el = unrefElement(element);\n if (el)\n parentElement.value = el.parentElement;\n };\n tryOnMounted(update);\n watch(() => toValue(element), update);\n return parentElement;\n}\n\nfunction usePerformanceObserver(options, callback) {\n const {\n window = defaultWindow,\n immediate = true,\n ...performanceOptions\n } = options;\n const isSupported = useSupported(() => window && \"PerformanceObserver\" in window);\n let observer;\n const stop = () => {\n observer == null ? void 0 : observer.disconnect();\n };\n const start = () => {\n if (isSupported.value) {\n stop();\n observer = new PerformanceObserver(callback);\n observer.observe(performanceOptions);\n }\n };\n tryOnScopeDispose(stop);\n if (immediate)\n start();\n return {\n isSupported,\n start,\n stop\n };\n}\n\nconst defaultState = {\n x: 0,\n y: 0,\n pointerId: 0,\n pressure: 0,\n tiltX: 0,\n tiltY: 0,\n width: 0,\n height: 0,\n twist: 0,\n pointerType: null\n};\nconst keys = /* @__PURE__ */ Object.keys(defaultState);\nfunction usePointer(options = {}) {\n const {\n target = defaultWindow\n } = options;\n const isInside = shallowRef(false);\n const state = ref(options.initialValue || {});\n Object.assign(state.value, defaultState, state.value);\n const handler = (event) => {\n isInside.value = true;\n if (options.pointerTypes && !options.pointerTypes.includes(event.pointerType))\n return;\n state.value = objectPick(event, keys, false);\n };\n if (target) {\n const listenerOptions = { passive: true };\n useEventListener(target, [\"pointerdown\", \"pointermove\", \"pointerup\"], handler, listenerOptions);\n useEventListener(target, \"pointerleave\", () => isInside.value = false, listenerOptions);\n }\n return {\n ...toRefs(state),\n isInside\n };\n}\n\nfunction usePointerLock(target, options = {}) {\n const { document = defaultDocument } = options;\n const isSupported = useSupported(() => document && \"pointerLockElement\" in document);\n const element = shallowRef();\n const triggerElement = shallowRef();\n let targetElement;\n if (isSupported.value) {\n const listenerOptions = { passive: true };\n useEventListener(document, \"pointerlockchange\", () => {\n var _a;\n const currentElement = (_a = document.pointerLockElement) != null ? _a : element.value;\n if (targetElement && currentElement === targetElement) {\n element.value = document.pointerLockElement;\n if (!element.value)\n targetElement = triggerElement.value = null;\n }\n }, listenerOptions);\n useEventListener(document, \"pointerlockerror\", () => {\n var _a;\n const currentElement = (_a = document.pointerLockElement) != null ? _a : element.value;\n if (targetElement && currentElement === targetElement) {\n const action = document.pointerLockElement ? \"release\" : \"acquire\";\n throw new Error(`Failed to ${action} pointer lock.`);\n }\n }, listenerOptions);\n }\n async function lock(e) {\n var _a;\n if (!isSupported.value)\n throw new Error(\"Pointer Lock API is not supported by your browser.\");\n triggerElement.value = e instanceof Event ? e.currentTarget : null;\n targetElement = e instanceof Event ? (_a = unrefElement(target)) != null ? _a : triggerElement.value : unrefElement(e);\n if (!targetElement)\n throw new Error(\"Target element undefined.\");\n targetElement.requestPointerLock();\n return await until(element).toBe(targetElement);\n }\n async function unlock() {\n if (!element.value)\n return false;\n document.exitPointerLock();\n await until(element).toBeNull();\n return true;\n }\n return {\n isSupported,\n element,\n triggerElement,\n lock,\n unlock\n };\n}\n\nfunction usePointerSwipe(target, options = {}) {\n const targetRef = toRef(target);\n const {\n threshold = 50,\n onSwipe,\n onSwipeEnd,\n onSwipeStart,\n disableTextSelect = false\n } = options;\n const posStart = reactive({ x: 0, y: 0 });\n const updatePosStart = (x, y) => {\n posStart.x = x;\n posStart.y = y;\n };\n const posEnd = reactive({ x: 0, y: 0 });\n const updatePosEnd = (x, y) => {\n posEnd.x = x;\n posEnd.y = y;\n };\n const distanceX = computed(() => posStart.x - posEnd.x);\n const distanceY = computed(() => posStart.y - posEnd.y);\n const { max, abs } = Math;\n const isThresholdExceeded = computed(() => max(abs(distanceX.value), abs(distanceY.value)) >= threshold);\n const isSwiping = shallowRef(false);\n const isPointerDown = shallowRef(false);\n const direction = computed(() => {\n if (!isThresholdExceeded.value)\n return \"none\";\n if (abs(distanceX.value) > abs(distanceY.value)) {\n return distanceX.value > 0 ? \"left\" : \"right\";\n } else {\n return distanceY.value > 0 ? \"up\" : \"down\";\n }\n });\n const eventIsAllowed = (e) => {\n var _a, _b, _c;\n const isReleasingButton = e.buttons === 0;\n const isPrimaryButton = e.buttons === 1;\n return (_c = (_b = (_a = options.pointerTypes) == null ? void 0 : _a.includes(e.pointerType)) != null ? _b : isReleasingButton || isPrimaryButton) != null ? _c : true;\n };\n const listenerOptions = { passive: true };\n const stops = [\n useEventListener(target, \"pointerdown\", (e) => {\n if (!eventIsAllowed(e))\n return;\n isPointerDown.value = true;\n const eventTarget = e.target;\n eventTarget == null ? void 0 : eventTarget.setPointerCapture(e.pointerId);\n const { clientX: x, clientY: y } = e;\n updatePosStart(x, y);\n updatePosEnd(x, y);\n onSwipeStart == null ? void 0 : onSwipeStart(e);\n }, listenerOptions),\n useEventListener(target, \"pointermove\", (e) => {\n if (!eventIsAllowed(e))\n return;\n if (!isPointerDown.value)\n return;\n const { clientX: x, clientY: y } = e;\n updatePosEnd(x, y);\n if (!isSwiping.value && isThresholdExceeded.value)\n isSwiping.value = true;\n if (isSwiping.value)\n onSwipe == null ? void 0 : onSwipe(e);\n }, listenerOptions),\n useEventListener(target, \"pointerup\", (e) => {\n if (!eventIsAllowed(e))\n return;\n if (isSwiping.value)\n onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);\n isPointerDown.value = false;\n isSwiping.value = false;\n }, listenerOptions)\n ];\n tryOnMounted(() => {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n (_b = (_a = targetRef.value) == null ? void 0 : _a.style) == null ? void 0 : _b.setProperty(\"touch-action\", \"none\");\n if (disableTextSelect) {\n (_d = (_c = targetRef.value) == null ? void 0 : _c.style) == null ? void 0 : _d.setProperty(\"-webkit-user-select\", \"none\");\n (_f = (_e = targetRef.value) == null ? void 0 : _e.style) == null ? void 0 : _f.setProperty(\"-ms-user-select\", \"none\");\n (_h = (_g = targetRef.value) == null ? void 0 : _g.style) == null ? void 0 : _h.setProperty(\"user-select\", \"none\");\n }\n });\n const stop = () => stops.forEach((s) => s());\n return {\n isSwiping: readonly(isSwiping),\n direction: readonly(direction),\n posStart: readonly(posStart),\n posEnd: readonly(posEnd),\n distanceX,\n distanceY,\n stop\n };\n}\n\nfunction usePreferredColorScheme(options) {\n const isLight = useMediaQuery(\"(prefers-color-scheme: light)\", options);\n const isDark = useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n return computed(() => {\n if (isDark.value)\n return \"dark\";\n if (isLight.value)\n return \"light\";\n return \"no-preference\";\n });\n}\n\nfunction usePreferredContrast(options) {\n const isMore = useMediaQuery(\"(prefers-contrast: more)\", options);\n const isLess = useMediaQuery(\"(prefers-contrast: less)\", options);\n const isCustom = useMediaQuery(\"(prefers-contrast: custom)\", options);\n return computed(() => {\n if (isMore.value)\n return \"more\";\n if (isLess.value)\n return \"less\";\n if (isCustom.value)\n return \"custom\";\n return \"no-preference\";\n });\n}\n\nfunction usePreferredLanguages(options = {}) {\n const { window = defaultWindow } = options;\n if (!window)\n return ref([\"en\"]);\n const navigator = window.navigator;\n const value = ref(navigator.languages);\n useEventListener(window, \"languagechange\", () => {\n value.value = navigator.languages;\n }, { passive: true });\n return value;\n}\n\nfunction usePreferredReducedMotion(options) {\n const isReduced = useMediaQuery(\"(prefers-reduced-motion: reduce)\", options);\n return computed(() => {\n if (isReduced.value)\n return \"reduce\";\n return \"no-preference\";\n });\n}\n\nfunction usePreferredReducedTransparency(options) {\n const isReduced = useMediaQuery(\"(prefers-reduced-transparency: reduce)\", options);\n return computed(() => {\n if (isReduced.value)\n return \"reduce\";\n return \"no-preference\";\n });\n}\n\nfunction usePrevious(value, initialValue) {\n const previous = shallowRef(initialValue);\n watch(\n toRef(value),\n (_, oldValue) => {\n previous.value = oldValue;\n },\n { flush: \"sync\" }\n );\n return readonly(previous);\n}\n\nconst topVarName = \"--vueuse-safe-area-top\";\nconst rightVarName = \"--vueuse-safe-area-right\";\nconst bottomVarName = \"--vueuse-safe-area-bottom\";\nconst leftVarName = \"--vueuse-safe-area-left\";\nfunction useScreenSafeArea() {\n const top = shallowRef(\"\");\n const right = shallowRef(\"\");\n const bottom = shallowRef(\"\");\n const left = shallowRef(\"\");\n if (isClient) {\n const topCssVar = useCssVar(topVarName);\n const rightCssVar = useCssVar(rightVarName);\n const bottomCssVar = useCssVar(bottomVarName);\n const leftCssVar = useCssVar(leftVarName);\n topCssVar.value = \"env(safe-area-inset-top, 0px)\";\n rightCssVar.value = \"env(safe-area-inset-right, 0px)\";\n bottomCssVar.value = \"env(safe-area-inset-bottom, 0px)\";\n leftCssVar.value = \"env(safe-area-inset-left, 0px)\";\n update();\n useEventListener(\"resize\", useDebounceFn(update), { passive: true });\n }\n function update() {\n top.value = getValue(topVarName);\n right.value = getValue(rightVarName);\n bottom.value = getValue(bottomVarName);\n left.value = getValue(leftVarName);\n }\n return {\n top,\n right,\n bottom,\n left,\n update\n };\n}\nfunction getValue(position) {\n return getComputedStyle(document.documentElement).getPropertyValue(position);\n}\n\nfunction useScriptTag(src, onLoaded = noop, options = {}) {\n const {\n immediate = true,\n manual = false,\n type = \"text/javascript\",\n async = true,\n crossOrigin,\n referrerPolicy,\n noModule,\n defer,\n document = defaultDocument,\n attrs = {}\n } = options;\n const scriptTag = shallowRef(null);\n let _promise = null;\n const loadScript = (waitForScriptLoad) => new Promise((resolve, reject) => {\n const resolveWithElement = (el2) => {\n scriptTag.value = el2;\n resolve(el2);\n return el2;\n };\n if (!document) {\n resolve(false);\n return;\n }\n let shouldAppend = false;\n let el = document.querySelector(`script[src=\"${toValue(src)}\"]`);\n if (!el) {\n el = document.createElement(\"script\");\n el.type = type;\n el.async = async;\n el.src = toValue(src);\n if (defer)\n el.defer = defer;\n if (crossOrigin)\n el.crossOrigin = crossOrigin;\n if (noModule)\n el.noModule = noModule;\n if (referrerPolicy)\n el.referrerPolicy = referrerPolicy;\n Object.entries(attrs).forEach(([name, value]) => el == null ? void 0 : el.setAttribute(name, value));\n shouldAppend = true;\n } else if (el.hasAttribute(\"data-loaded\")) {\n resolveWithElement(el);\n }\n const listenerOptions = {\n passive: true\n };\n useEventListener(el, \"error\", (event) => reject(event), listenerOptions);\n useEventListener(el, \"abort\", (event) => reject(event), listenerOptions);\n useEventListener(el, \"load\", () => {\n el.setAttribute(\"data-loaded\", \"true\");\n onLoaded(el);\n resolveWithElement(el);\n }, listenerOptions);\n if (shouldAppend)\n el = document.head.appendChild(el);\n if (!waitForScriptLoad)\n resolveWithElement(el);\n });\n const load = (waitForScriptLoad = true) => {\n if (!_promise)\n _promise = loadScript(waitForScriptLoad);\n return _promise;\n };\n const unload = () => {\n if (!document)\n return;\n _promise = null;\n if (scriptTag.value)\n scriptTag.value = null;\n const el = document.querySelector(`script[src=\"${toValue(src)}\"]`);\n if (el)\n document.head.removeChild(el);\n };\n if (immediate && !manual)\n tryOnMounted(load);\n if (!manual)\n tryOnUnmounted(unload);\n return { scriptTag, load, unload };\n}\n\nfunction checkOverflowScroll(ele) {\n const style = window.getComputedStyle(ele);\n if (style.overflowX === \"scroll\" || style.overflowY === \"scroll\" || style.overflowX === \"auto\" && ele.clientWidth < ele.scrollWidth || style.overflowY === \"auto\" && ele.clientHeight < ele.scrollHeight) {\n return true;\n } else {\n const parent = ele.parentNode;\n if (!parent || parent.tagName === \"BODY\")\n return false;\n return checkOverflowScroll(parent);\n }\n}\nfunction preventDefault(rawEvent) {\n const e = rawEvent || window.event;\n const _target = e.target;\n if (checkOverflowScroll(_target))\n return false;\n if (e.touches.length > 1)\n return true;\n if (e.preventDefault)\n e.preventDefault();\n return false;\n}\nconst elInitialOverflow = /* @__PURE__ */ new WeakMap();\nfunction useScrollLock(element, initialState = false) {\n const isLocked = shallowRef(initialState);\n let stopTouchMoveListener = null;\n let initialOverflow = \"\";\n watch(toRef(element), (el) => {\n const target = resolveElement(toValue(el));\n if (target) {\n const ele = target;\n if (!elInitialOverflow.get(ele))\n elInitialOverflow.set(ele, ele.style.overflow);\n if (ele.style.overflow !== \"hidden\")\n initialOverflow = ele.style.overflow;\n if (ele.style.overflow === \"hidden\")\n return isLocked.value = true;\n if (isLocked.value)\n return ele.style.overflow = \"hidden\";\n }\n }, {\n immediate: true\n });\n const lock = () => {\n const el = resolveElement(toValue(element));\n if (!el || isLocked.value)\n return;\n if (isIOS) {\n stopTouchMoveListener = useEventListener(\n el,\n \"touchmove\",\n (e) => {\n preventDefault(e);\n },\n { passive: false }\n );\n }\n el.style.overflow = \"hidden\";\n isLocked.value = true;\n };\n const unlock = () => {\n const el = resolveElement(toValue(element));\n if (!el || !isLocked.value)\n return;\n if (isIOS)\n stopTouchMoveListener == null ? void 0 : stopTouchMoveListener();\n el.style.overflow = initialOverflow;\n elInitialOverflow.delete(el);\n isLocked.value = false;\n };\n tryOnScopeDispose(unlock);\n return computed({\n get() {\n return isLocked.value;\n },\n set(v) {\n if (v)\n lock();\n else unlock();\n }\n });\n}\n\nfunction useSessionStorage(key, initialValue, options = {}) {\n const { window = defaultWindow } = options;\n return useStorage(key, initialValue, window == null ? void 0 : window.sessionStorage, options);\n}\n\nfunction useShare(shareOptions = {}, options = {}) {\n const { navigator = defaultNavigator } = options;\n const _navigator = navigator;\n const isSupported = useSupported(() => _navigator && \"canShare\" in _navigator);\n const share = async (overrideOptions = {}) => {\n if (isSupported.value) {\n const data = {\n ...toValue(shareOptions),\n ...toValue(overrideOptions)\n };\n let granted = true;\n if (data.files && _navigator.canShare)\n granted = _navigator.canShare({ files: data.files });\n if (granted)\n return _navigator.share(data);\n }\n };\n return {\n isSupported,\n share\n };\n}\n\nconst defaultSortFn = (source, compareFn) => source.sort(compareFn);\nconst defaultCompare = (a, b) => a - b;\nfunction useSorted(...args) {\n var _a, _b, _c, _d;\n const [source] = args;\n let compareFn = defaultCompare;\n let options = {};\n if (args.length === 2) {\n if (typeof args[1] === \"object\") {\n options = args[1];\n compareFn = (_a = options.compareFn) != null ? _a : defaultCompare;\n } else {\n compareFn = (_b = args[1]) != null ? _b : defaultCompare;\n }\n } else if (args.length > 2) {\n compareFn = (_c = args[1]) != null ? _c : defaultCompare;\n options = (_d = args[2]) != null ? _d : {};\n }\n const {\n dirty = false,\n sortFn = defaultSortFn\n } = options;\n if (!dirty)\n return computed(() => sortFn([...toValue(source)], compareFn));\n watchEffect(() => {\n const result = sortFn(toValue(source), compareFn);\n if (isRef(source))\n source.value = result;\n else\n source.splice(0, source.length, ...result);\n });\n return source;\n}\n\nfunction useSpeechRecognition(options = {}) {\n const {\n interimResults = true,\n continuous = true,\n maxAlternatives = 1,\n window = defaultWindow\n } = options;\n const lang = toRef(options.lang || \"en-US\");\n const isListening = shallowRef(false);\n const isFinal = shallowRef(false);\n const result = shallowRef(\"\");\n const error = shallowRef(void 0);\n let recognition;\n const start = () => {\n isListening.value = true;\n };\n const stop = () => {\n isListening.value = false;\n };\n const toggle = (value = !isListening.value) => {\n if (value) {\n start();\n } else {\n stop();\n }\n };\n const SpeechRecognition = window && (window.SpeechRecognition || window.webkitSpeechRecognition);\n const isSupported = useSupported(() => SpeechRecognition);\n if (isSupported.value) {\n recognition = new SpeechRecognition();\n recognition.continuous = continuous;\n recognition.interimResults = interimResults;\n recognition.lang = toValue(lang);\n recognition.maxAlternatives = maxAlternatives;\n recognition.onstart = () => {\n isListening.value = true;\n isFinal.value = false;\n };\n watch(lang, (lang2) => {\n if (recognition && !isListening.value)\n recognition.lang = lang2;\n });\n recognition.onresult = (event) => {\n const currentResult = event.results[event.resultIndex];\n const { transcript } = currentResult[0];\n isFinal.value = currentResult.isFinal;\n result.value = transcript;\n error.value = void 0;\n };\n recognition.onerror = (event) => {\n error.value = event;\n };\n recognition.onend = () => {\n isListening.value = false;\n recognition.lang = toValue(lang);\n };\n watch(isListening, (newValue, oldValue) => {\n if (newValue === oldValue)\n return;\n if (newValue)\n recognition.start();\n else\n recognition.stop();\n });\n }\n tryOnScopeDispose(() => {\n stop();\n });\n return {\n isSupported,\n isListening,\n isFinal,\n recognition,\n result,\n error,\n toggle,\n start,\n stop\n };\n}\n\nfunction useSpeechSynthesis(text, options = {}) {\n const {\n pitch = 1,\n rate = 1,\n volume = 1,\n window = defaultWindow\n } = options;\n const synth = window && window.speechSynthesis;\n const isSupported = useSupported(() => synth);\n const isPlaying = shallowRef(false);\n const status = shallowRef(\"init\");\n const spokenText = toRef(text || \"\");\n const lang = toRef(options.lang || \"en-US\");\n const error = shallowRef(void 0);\n const toggle = (value = !isPlaying.value) => {\n isPlaying.value = value;\n };\n const bindEventsForUtterance = (utterance2) => {\n utterance2.lang = toValue(lang);\n utterance2.voice = toValue(options.voice) || null;\n utterance2.pitch = toValue(pitch);\n utterance2.rate = toValue(rate);\n utterance2.volume = volume;\n utterance2.onstart = () => {\n isPlaying.value = true;\n status.value = \"play\";\n };\n utterance2.onpause = () => {\n isPlaying.value = false;\n status.value = \"pause\";\n };\n utterance2.onresume = () => {\n isPlaying.value = true;\n status.value = \"play\";\n };\n utterance2.onend = () => {\n isPlaying.value = false;\n status.value = \"end\";\n };\n utterance2.onerror = (event) => {\n error.value = event;\n };\n };\n const utterance = computed(() => {\n isPlaying.value = false;\n status.value = \"init\";\n const newUtterance = new SpeechSynthesisUtterance(spokenText.value);\n bindEventsForUtterance(newUtterance);\n return newUtterance;\n });\n const speak = () => {\n synth.cancel();\n if (utterance)\n synth.speak(utterance.value);\n };\n const stop = () => {\n synth.cancel();\n isPlaying.value = false;\n };\n if (isSupported.value) {\n bindEventsForUtterance(utterance.value);\n watch(lang, (lang2) => {\n if (utterance.value && !isPlaying.value)\n utterance.value.lang = lang2;\n });\n if (options.voice) {\n watch(options.voice, () => {\n synth.cancel();\n });\n }\n watch(isPlaying, () => {\n if (isPlaying.value)\n synth.resume();\n else\n synth.pause();\n });\n }\n tryOnScopeDispose(() => {\n isPlaying.value = false;\n });\n return {\n isSupported,\n isPlaying,\n status,\n utterance,\n error,\n stop,\n toggle,\n speak\n };\n}\n\nfunction useStepper(steps, initialStep) {\n const stepsRef = ref(steps);\n const stepNames = computed(() => Array.isArray(stepsRef.value) ? stepsRef.value : Object.keys(stepsRef.value));\n const index = ref(stepNames.value.indexOf(initialStep != null ? initialStep : stepNames.value[0]));\n const current = computed(() => at(index.value));\n const isFirst = computed(() => index.value === 0);\n const isLast = computed(() => index.value === stepNames.value.length - 1);\n const next = computed(() => stepNames.value[index.value + 1]);\n const previous = computed(() => stepNames.value[index.value - 1]);\n function at(index2) {\n if (Array.isArray(stepsRef.value))\n return stepsRef.value[index2];\n return stepsRef.value[stepNames.value[index2]];\n }\n function get(step) {\n if (!stepNames.value.includes(step))\n return;\n return at(stepNames.value.indexOf(step));\n }\n function goTo(step) {\n if (stepNames.value.includes(step))\n index.value = stepNames.value.indexOf(step);\n }\n function goToNext() {\n if (isLast.value)\n return;\n index.value++;\n }\n function goToPrevious() {\n if (isFirst.value)\n return;\n index.value--;\n }\n function goBackTo(step) {\n if (isAfter(step))\n goTo(step);\n }\n function isNext(step) {\n return stepNames.value.indexOf(step) === index.value + 1;\n }\n function isPrevious(step) {\n return stepNames.value.indexOf(step) === index.value - 1;\n }\n function isCurrent(step) {\n return stepNames.value.indexOf(step) === index.value;\n }\n function isBefore(step) {\n return index.value < stepNames.value.indexOf(step);\n }\n function isAfter(step) {\n return index.value > stepNames.value.indexOf(step);\n }\n return {\n steps: stepsRef,\n stepNames,\n index,\n current,\n next,\n previous,\n isFirst,\n isLast,\n at,\n get,\n goTo,\n goToNext,\n goToPrevious,\n goBackTo,\n isNext,\n isPrevious,\n isCurrent,\n isBefore,\n isAfter\n };\n}\n\nfunction useStorageAsync(key, initialValue, storage, options = {}) {\n var _a;\n const {\n flush = \"pre\",\n deep = true,\n listenToStorageChanges = true,\n writeDefaults = true,\n mergeDefaults = false,\n shallow,\n window = defaultWindow,\n eventFilter,\n onError = (e) => {\n console.error(e);\n }\n } = options;\n const rawInit = toValue(initialValue);\n const type = guessSerializerType(rawInit);\n const data = (shallow ? shallowRef : ref)(toValue(initialValue));\n const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n if (!storage) {\n try {\n storage = getSSRHandler(\"getDefaultStorageAsync\", () => {\n var _a2;\n return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n })();\n } catch (e) {\n onError(e);\n }\n }\n async function read(event) {\n if (!storage || event && event.key !== key)\n return;\n try {\n const rawValue = event ? event.newValue : await storage.getItem(key);\n if (rawValue == null) {\n data.value = rawInit;\n if (writeDefaults && rawInit !== null)\n await storage.setItem(key, await serializer.write(rawInit));\n } else if (mergeDefaults) {\n const value = await serializer.read(rawValue);\n if (typeof mergeDefaults === \"function\")\n data.value = mergeDefaults(value, rawInit);\n else if (type === \"object\" && !Array.isArray(value))\n data.value = { ...rawInit, ...value };\n else data.value = value;\n } else {\n data.value = await serializer.read(rawValue);\n }\n } catch (e) {\n onError(e);\n }\n }\n read();\n if (window && listenToStorageChanges)\n useEventListener(window, \"storage\", (e) => Promise.resolve().then(() => read(e)), { passive: true });\n if (storage) {\n watchWithFilter(\n data,\n async () => {\n try {\n if (data.value == null)\n await storage.removeItem(key);\n else\n await storage.setItem(key, await serializer.write(data.value));\n } catch (e) {\n onError(e);\n }\n },\n {\n flush,\n deep,\n eventFilter\n }\n );\n }\n return data;\n}\n\nlet _id = 0;\nfunction useStyleTag(css, options = {}) {\n const isLoaded = shallowRef(false);\n const {\n document = defaultDocument,\n immediate = true,\n manual = false,\n id = `vueuse_styletag_${++_id}`\n } = options;\n const cssRef = shallowRef(css);\n let stop = () => {\n };\n const load = () => {\n if (!document)\n return;\n const el = document.getElementById(id) || document.createElement(\"style\");\n if (!el.isConnected) {\n el.id = id;\n if (options.media)\n el.media = options.media;\n document.head.appendChild(el);\n }\n if (isLoaded.value)\n return;\n stop = watch(\n cssRef,\n (value) => {\n el.textContent = value;\n },\n { immediate: true }\n );\n isLoaded.value = true;\n };\n const unload = () => {\n if (!document || !isLoaded.value)\n return;\n stop();\n document.head.removeChild(document.getElementById(id));\n isLoaded.value = false;\n };\n if (immediate && !manual)\n tryOnMounted(load);\n if (!manual)\n tryOnScopeDispose(unload);\n return {\n id,\n css: cssRef,\n unload,\n load,\n isLoaded: readonly(isLoaded)\n };\n}\n\nfunction useSwipe(target, options = {}) {\n const {\n threshold = 50,\n onSwipe,\n onSwipeEnd,\n onSwipeStart,\n passive = true\n } = options;\n const coordsStart = reactive({ x: 0, y: 0 });\n const coordsEnd = reactive({ x: 0, y: 0 });\n const diffX = computed(() => coordsStart.x - coordsEnd.x);\n const diffY = computed(() => coordsStart.y - coordsEnd.y);\n const { max, abs } = Math;\n const isThresholdExceeded = computed(() => max(abs(diffX.value), abs(diffY.value)) >= threshold);\n const isSwiping = shallowRef(false);\n const direction = computed(() => {\n if (!isThresholdExceeded.value)\n return \"none\";\n if (abs(diffX.value) > abs(diffY.value)) {\n return diffX.value > 0 ? \"left\" : \"right\";\n } else {\n return diffY.value > 0 ? \"up\" : \"down\";\n }\n });\n const getTouchEventCoords = (e) => [e.touches[0].clientX, e.touches[0].clientY];\n const updateCoordsStart = (x, y) => {\n coordsStart.x = x;\n coordsStart.y = y;\n };\n const updateCoordsEnd = (x, y) => {\n coordsEnd.x = x;\n coordsEnd.y = y;\n };\n const listenerOptions = { passive, capture: !passive };\n const onTouchEnd = (e) => {\n if (isSwiping.value)\n onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);\n isSwiping.value = false;\n };\n const stops = [\n useEventListener(target, \"touchstart\", (e) => {\n if (e.touches.length !== 1)\n return;\n const [x, y] = getTouchEventCoords(e);\n updateCoordsStart(x, y);\n updateCoordsEnd(x, y);\n onSwipeStart == null ? void 0 : onSwipeStart(e);\n }, listenerOptions),\n useEventListener(target, \"touchmove\", (e) => {\n if (e.touches.length !== 1)\n return;\n const [x, y] = getTouchEventCoords(e);\n updateCoordsEnd(x, y);\n if (listenerOptions.capture && !listenerOptions.passive && Math.abs(diffX.value) > Math.abs(diffY.value))\n e.preventDefault();\n if (!isSwiping.value && isThresholdExceeded.value)\n isSwiping.value = true;\n if (isSwiping.value)\n onSwipe == null ? void 0 : onSwipe(e);\n }, listenerOptions),\n useEventListener(target, [\"touchend\", \"touchcancel\"], onTouchEnd, listenerOptions)\n ];\n const stop = () => stops.forEach((s) => s());\n return {\n isSwiping,\n direction,\n coordsStart,\n coordsEnd,\n lengthX: diffX,\n lengthY: diffY,\n stop,\n // TODO: Remove in the next major version\n isPassiveEventSupported: true\n };\n}\n\nfunction useTemplateRefsList() {\n const refs = ref([]);\n refs.value.set = (el) => {\n if (el)\n refs.value.push(el);\n };\n onBeforeUpdate(() => {\n refs.value.length = 0;\n });\n return refs;\n}\n\nfunction useTextDirection(options = {}) {\n const {\n document = defaultDocument,\n selector = \"html\",\n observe = false,\n initialValue = \"ltr\"\n } = options;\n function getValue() {\n var _a, _b;\n return (_b = (_a = document == null ? void 0 : document.querySelector(selector)) == null ? void 0 : _a.getAttribute(\"dir\")) != null ? _b : initialValue;\n }\n const dir = ref(getValue());\n tryOnMounted(() => dir.value = getValue());\n if (observe && document) {\n useMutationObserver(\n document.querySelector(selector),\n () => dir.value = getValue(),\n { attributes: true }\n );\n }\n return computed({\n get() {\n return dir.value;\n },\n set(v) {\n var _a, _b;\n dir.value = v;\n if (!document)\n return;\n if (dir.value)\n (_a = document.querySelector(selector)) == null ? void 0 : _a.setAttribute(\"dir\", dir.value);\n else\n (_b = document.querySelector(selector)) == null ? void 0 : _b.removeAttribute(\"dir\");\n }\n });\n}\n\nfunction getRangesFromSelection(selection) {\n var _a;\n const rangeCount = (_a = selection.rangeCount) != null ? _a : 0;\n return Array.from({ length: rangeCount }, (_, i) => selection.getRangeAt(i));\n}\nfunction useTextSelection(options = {}) {\n const {\n window = defaultWindow\n } = options;\n const selection = ref(null);\n const text = computed(() => {\n var _a, _b;\n return (_b = (_a = selection.value) == null ? void 0 : _a.toString()) != null ? _b : \"\";\n });\n const ranges = computed(() => selection.value ? getRangesFromSelection(selection.value) : []);\n const rects = computed(() => ranges.value.map((range) => range.getBoundingClientRect()));\n function onSelectionChange() {\n selection.value = null;\n if (window)\n selection.value = window.getSelection();\n }\n if (window)\n useEventListener(window.document, \"selectionchange\", onSelectionChange, { passive: true });\n return {\n text,\n rects,\n ranges,\n selection\n };\n}\n\nfunction tryRequestAnimationFrame(window = defaultWindow, fn) {\n if (window && typeof window.requestAnimationFrame === \"function\") {\n window.requestAnimationFrame(fn);\n } else {\n fn();\n }\n}\nfunction useTextareaAutosize(options = {}) {\n var _a, _b;\n const { window = defaultWindow } = options;\n const textarea = toRef(options == null ? void 0 : options.element);\n const input = toRef((_a = options == null ? void 0 : options.input) != null ? _a : \"\");\n const styleProp = (_b = options == null ? void 0 : options.styleProp) != null ? _b : \"height\";\n const textareaScrollHeight = shallowRef(1);\n const textareaOldWidth = shallowRef(0);\n function triggerResize() {\n var _a2;\n if (!textarea.value)\n return;\n let height = \"\";\n textarea.value.style[styleProp] = \"1px\";\n textareaScrollHeight.value = (_a2 = textarea.value) == null ? void 0 : _a2.scrollHeight;\n const _styleTarget = toValue(options == null ? void 0 : options.styleTarget);\n if (_styleTarget)\n _styleTarget.style[styleProp] = `${textareaScrollHeight.value}px`;\n else\n height = `${textareaScrollHeight.value}px`;\n textarea.value.style[styleProp] = height;\n }\n watch([input, textarea], () => nextTick(triggerResize), { immediate: true });\n watch(textareaScrollHeight, () => {\n var _a2;\n return (_a2 = options == null ? void 0 : options.onResize) == null ? void 0 : _a2.call(options);\n });\n useResizeObserver(textarea, ([{ contentRect }]) => {\n if (textareaOldWidth.value === contentRect.width)\n return;\n tryRequestAnimationFrame(window, () => {\n textareaOldWidth.value = contentRect.width;\n triggerResize();\n });\n });\n if (options == null ? void 0 : options.watch)\n watch(options.watch, triggerResize, { immediate: true, deep: true });\n return {\n textarea,\n input,\n triggerResize\n };\n}\n\nfunction useThrottledRefHistory(source, options = {}) {\n const { throttle = 200, trailing = true } = options;\n const filter = throttleFilter(throttle, trailing);\n const history = useRefHistory(source, { ...options, eventFilter: filter });\n return {\n ...history\n };\n}\n\nconst DEFAULT_UNITS = [\n { max: 6e4, value: 1e3, name: \"second\" },\n { max: 276e4, value: 6e4, name: \"minute\" },\n { max: 72e6, value: 36e5, name: \"hour\" },\n { max: 5184e5, value: 864e5, name: \"day\" },\n { max: 24192e5, value: 6048e5, name: \"week\" },\n { max: 28512e6, value: 2592e6, name: \"month\" },\n { max: Number.POSITIVE_INFINITY, value: 31536e6, name: \"year\" }\n];\nconst DEFAULT_MESSAGES = {\n justNow: \"just now\",\n past: (n) => n.match(/\\d/) ? `${n} ago` : n,\n future: (n) => n.match(/\\d/) ? `in ${n}` : n,\n month: (n, past) => n === 1 ? past ? \"last month\" : \"next month\" : `${n} month${n > 1 ? \"s\" : \"\"}`,\n year: (n, past) => n === 1 ? past ? \"last year\" : \"next year\" : `${n} year${n > 1 ? \"s\" : \"\"}`,\n day: (n, past) => n === 1 ? past ? \"yesterday\" : \"tomorrow\" : `${n} day${n > 1 ? \"s\" : \"\"}`,\n week: (n, past) => n === 1 ? past ? \"last week\" : \"next week\" : `${n} week${n > 1 ? \"s\" : \"\"}`,\n hour: (n) => `${n} hour${n > 1 ? \"s\" : \"\"}`,\n minute: (n) => `${n} minute${n > 1 ? \"s\" : \"\"}`,\n second: (n) => `${n} second${n > 1 ? \"s\" : \"\"}`,\n invalid: \"\"\n};\nfunction DEFAULT_FORMATTER(date) {\n return date.toISOString().slice(0, 10);\n}\nfunction useTimeAgo(time, options = {}) {\n const {\n controls: exposeControls = false,\n updateInterval = 3e4\n } = options;\n const { now, ...controls } = useNow({ interval: updateInterval, controls: true });\n const timeAgo = computed(() => formatTimeAgo(new Date(toValue(time)), options, toValue(now)));\n if (exposeControls) {\n return {\n timeAgo,\n ...controls\n };\n } else {\n return timeAgo;\n }\n}\nfunction formatTimeAgo(from, options = {}, now = Date.now()) {\n var _a;\n const {\n max,\n messages = DEFAULT_MESSAGES,\n fullDateFormatter = DEFAULT_FORMATTER,\n units = DEFAULT_UNITS,\n showSecond = false,\n rounding = \"round\"\n } = options;\n const roundFn = typeof rounding === \"number\" ? (n) => +n.toFixed(rounding) : Math[rounding];\n const diff = +now - +from;\n const absDiff = Math.abs(diff);\n function getValue(diff2, unit) {\n return roundFn(Math.abs(diff2) / unit.value);\n }\n function format(diff2, unit) {\n const val = getValue(diff2, unit);\n const past = diff2 > 0;\n const str = applyFormat(unit.name, val, past);\n return applyFormat(past ? \"past\" : \"future\", str, past);\n }\n function applyFormat(name, val, isPast) {\n const formatter = messages[name];\n if (typeof formatter === \"function\")\n return formatter(val, isPast);\n return formatter.replace(\"{0}\", val.toString());\n }\n if (absDiff < 6e4 && !showSecond)\n return messages.justNow;\n if (typeof max === \"number\" && absDiff > max)\n return fullDateFormatter(new Date(from));\n if (typeof max === \"string\") {\n const unitMax = (_a = units.find((i) => i.name === max)) == null ? void 0 : _a.max;\n if (unitMax && absDiff > unitMax)\n return fullDateFormatter(new Date(from));\n }\n for (const [idx, unit] of units.entries()) {\n const val = getValue(diff, unit);\n if (val <= 0 && units[idx - 1])\n return format(diff, units[idx - 1]);\n if (absDiff < unit.max)\n return format(diff, unit);\n }\n return messages.invalid;\n}\n\nfunction useTimeoutPoll(fn, interval, options = {}) {\n const {\n immediate = true,\n immediateCallback = false\n } = options;\n const { start } = useTimeoutFn(loop, interval, { immediate });\n const isActive = shallowRef(false);\n async function loop() {\n if (!isActive.value)\n return;\n await fn();\n start();\n }\n function resume() {\n if (!isActive.value) {\n isActive.value = true;\n if (immediateCallback)\n fn();\n start();\n }\n }\n function pause() {\n isActive.value = false;\n }\n if (immediate && isClient)\n resume();\n tryOnScopeDispose(pause);\n return {\n isActive,\n pause,\n resume\n };\n}\n\nfunction useTimestamp(options = {}) {\n const {\n controls: exposeControls = false,\n offset = 0,\n immediate = true,\n interval = \"requestAnimationFrame\",\n callback\n } = options;\n const ts = shallowRef(timestamp() + offset);\n const update = () => ts.value = timestamp() + offset;\n const cb = callback ? () => {\n update();\n callback(ts.value);\n } : update;\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(cb, { immediate }) : useIntervalFn(cb, interval, { immediate });\n if (exposeControls) {\n return {\n timestamp: ts,\n ...controls\n };\n } else {\n return ts;\n }\n}\n\nfunction useTitle(newTitle = null, options = {}) {\n var _a, _b, _c;\n const {\n document = defaultDocument,\n restoreOnUnmount = (t) => t\n } = options;\n const originalTitle = (_a = document == null ? void 0 : document.title) != null ? _a : \"\";\n const title = toRef((_b = newTitle != null ? newTitle : document == null ? void 0 : document.title) != null ? _b : null);\n const isReadonly = !!(newTitle && typeof newTitle === \"function\");\n function format(t) {\n if (!(\"titleTemplate\" in options))\n return t;\n const template = options.titleTemplate || \"%s\";\n return typeof template === \"function\" ? template(t) : toValue(template).replace(/%s/g, t);\n }\n watch(\n title,\n (newValue, oldValue) => {\n if (newValue !== oldValue && document)\n document.title = format(newValue != null ? newValue : \"\");\n },\n { immediate: true }\n );\n if (options.observe && !options.titleTemplate && document && !isReadonly) {\n useMutationObserver(\n (_c = document.head) == null ? void 0 : _c.querySelector(\"title\"),\n () => {\n if (document && document.title !== title.value)\n title.value = format(document.title);\n },\n { childList: true }\n );\n }\n tryOnScopeDispose(() => {\n if (restoreOnUnmount) {\n const restoredTitle = restoreOnUnmount(originalTitle, title.value || \"\");\n if (restoredTitle != null && document)\n document.title = restoredTitle;\n }\n });\n return title;\n}\n\nconst _TransitionPresets = {\n easeInSine: [0.12, 0, 0.39, 0],\n easeOutSine: [0.61, 1, 0.88, 1],\n easeInOutSine: [0.37, 0, 0.63, 1],\n easeInQuad: [0.11, 0, 0.5, 0],\n easeOutQuad: [0.5, 1, 0.89, 1],\n easeInOutQuad: [0.45, 0, 0.55, 1],\n easeInCubic: [0.32, 0, 0.67, 0],\n easeOutCubic: [0.33, 1, 0.68, 1],\n easeInOutCubic: [0.65, 0, 0.35, 1],\n easeInQuart: [0.5, 0, 0.75, 0],\n easeOutQuart: [0.25, 1, 0.5, 1],\n easeInOutQuart: [0.76, 0, 0.24, 1],\n easeInQuint: [0.64, 0, 0.78, 0],\n easeOutQuint: [0.22, 1, 0.36, 1],\n easeInOutQuint: [0.83, 0, 0.17, 1],\n easeInExpo: [0.7, 0, 0.84, 0],\n easeOutExpo: [0.16, 1, 0.3, 1],\n easeInOutExpo: [0.87, 0, 0.13, 1],\n easeInCirc: [0.55, 0, 1, 0.45],\n easeOutCirc: [0, 0.55, 0.45, 1],\n easeInOutCirc: [0.85, 0, 0.15, 1],\n easeInBack: [0.36, 0, 0.66, -0.56],\n easeOutBack: [0.34, 1.56, 0.64, 1],\n easeInOutBack: [0.68, -0.6, 0.32, 1.6]\n};\nconst TransitionPresets = /* @__PURE__ */ Object.assign({}, { linear: identity }, _TransitionPresets);\nfunction createEasingFunction([p0, p1, p2, p3]) {\n const a = (a1, a2) => 1 - 3 * a2 + 3 * a1;\n const b = (a1, a2) => 3 * a2 - 6 * a1;\n const c = (a1) => 3 * a1;\n const calcBezier = (t, a1, a2) => ((a(a1, a2) * t + b(a1, a2)) * t + c(a1)) * t;\n const getSlope = (t, a1, a2) => 3 * a(a1, a2) * t * t + 2 * b(a1, a2) * t + c(a1);\n const getTforX = (x) => {\n let aGuessT = x;\n for (let i = 0; i < 4; ++i) {\n const currentSlope = getSlope(aGuessT, p0, p2);\n if (currentSlope === 0)\n return aGuessT;\n const currentX = calcBezier(aGuessT, p0, p2) - x;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n };\n return (x) => p0 === p1 && p2 === p3 ? x : calcBezier(getTforX(x), p1, p3);\n}\nfunction lerp(a, b, alpha) {\n return a + alpha * (b - a);\n}\nfunction toVec(t) {\n return (typeof t === \"number\" ? [t] : t) || [];\n}\nfunction executeTransition(source, from, to, options = {}) {\n var _a, _b;\n const fromVal = toValue(from);\n const toVal = toValue(to);\n const v1 = toVec(fromVal);\n const v2 = toVec(toVal);\n const duration = (_a = toValue(options.duration)) != null ? _a : 1e3;\n const startedAt = Date.now();\n const endAt = Date.now() + duration;\n const trans = typeof options.transition === \"function\" ? options.transition : (_b = toValue(options.transition)) != null ? _b : identity;\n const ease = typeof trans === \"function\" ? trans : createEasingFunction(trans);\n return new Promise((resolve) => {\n source.value = fromVal;\n const tick = () => {\n var _a2;\n if ((_a2 = options.abort) == null ? void 0 : _a2.call(options)) {\n resolve();\n return;\n }\n const now = Date.now();\n const alpha = ease((now - startedAt) / duration);\n const arr = toVec(source.value).map((n, i) => lerp(v1[i], v2[i], alpha));\n if (Array.isArray(source.value))\n source.value = arr.map((n, i) => {\n var _a3, _b2;\n return lerp((_a3 = v1[i]) != null ? _a3 : 0, (_b2 = v2[i]) != null ? _b2 : 0, alpha);\n });\n else if (typeof source.value === \"number\")\n source.value = arr[0];\n if (now < endAt) {\n requestAnimationFrame(tick);\n } else {\n source.value = toVal;\n resolve();\n }\n };\n tick();\n });\n}\nfunction useTransition(source, options = {}) {\n let currentId = 0;\n const sourceVal = () => {\n const v = toValue(source);\n return typeof v === \"number\" ? v : v.map(toValue);\n };\n const outputRef = ref(sourceVal());\n watch(sourceVal, async (to) => {\n var _a, _b;\n if (toValue(options.disabled))\n return;\n const id = ++currentId;\n if (options.delay)\n await promiseTimeout(toValue(options.delay));\n if (id !== currentId)\n return;\n const toVal = Array.isArray(to) ? to.map(toValue) : toValue(to);\n (_a = options.onStarted) == null ? void 0 : _a.call(options);\n await executeTransition(outputRef, outputRef.value, toVal, {\n ...options,\n abort: () => {\n var _a2;\n return id !== currentId || ((_a2 = options.abort) == null ? void 0 : _a2.call(options));\n }\n });\n (_b = options.onFinished) == null ? void 0 : _b.call(options);\n }, { deep: true });\n watch(() => toValue(options.disabled), (disabled) => {\n if (disabled) {\n currentId++;\n outputRef.value = sourceVal();\n }\n });\n tryOnScopeDispose(() => {\n currentId++;\n });\n return computed(() => toValue(options.disabled) ? sourceVal() : outputRef.value);\n}\n\nfunction useUrlSearchParams(mode = \"history\", options = {}) {\n const {\n initialValue = {},\n removeNullishValues = true,\n removeFalsyValues = false,\n write: enableWrite = true,\n writeMode = \"replace\",\n window = defaultWindow\n } = options;\n if (!window)\n return reactive(initialValue);\n const state = reactive({});\n function getRawParams() {\n if (mode === \"history\") {\n return window.location.search || \"\";\n } else if (mode === \"hash\") {\n const hash = window.location.hash || \"\";\n const index = hash.indexOf(\"?\");\n return index > 0 ? hash.slice(index) : \"\";\n } else {\n return (window.location.hash || \"\").replace(/^#/, \"\");\n }\n }\n function constructQuery(params) {\n const stringified = params.toString();\n if (mode === \"history\")\n return `${stringified ? `?${stringified}` : \"\"}${window.location.hash || \"\"}`;\n if (mode === \"hash-params\")\n return `${window.location.search || \"\"}${stringified ? `#${stringified}` : \"\"}`;\n const hash = window.location.hash || \"#\";\n const index = hash.indexOf(\"?\");\n if (index > 0)\n return `${window.location.search || \"\"}${hash.slice(0, index)}${stringified ? `?${stringified}` : \"\"}`;\n return `${window.location.search || \"\"}${hash}${stringified ? `?${stringified}` : \"\"}`;\n }\n function read() {\n return new URLSearchParams(getRawParams());\n }\n function updateState(params) {\n const unusedKeys = new Set(Object.keys(state));\n for (const key of params.keys()) {\n const paramsForKey = params.getAll(key);\n state[key] = paramsForKey.length > 1 ? paramsForKey : params.get(key) || \"\";\n unusedKeys.delete(key);\n }\n Array.from(unusedKeys).forEach((key) => delete state[key]);\n }\n const { pause, resume } = pausableWatch(\n state,\n () => {\n const params = new URLSearchParams(\"\");\n Object.keys(state).forEach((key) => {\n const mapEntry = state[key];\n if (Array.isArray(mapEntry))\n mapEntry.forEach((value) => params.append(key, value));\n else if (removeNullishValues && mapEntry == null)\n params.delete(key);\n else if (removeFalsyValues && !mapEntry)\n params.delete(key);\n else\n params.set(key, mapEntry);\n });\n write(params, false);\n },\n { deep: true }\n );\n function write(params, shouldUpdate) {\n pause();\n if (shouldUpdate)\n updateState(params);\n if (writeMode === \"replace\") {\n window.history.replaceState(\n window.history.state,\n window.document.title,\n window.location.pathname + constructQuery(params)\n );\n } else {\n window.history.pushState(\n window.history.state,\n window.document.title,\n window.location.pathname + constructQuery(params)\n );\n }\n resume();\n }\n function onChanged() {\n if (!enableWrite)\n return;\n write(read(), true);\n }\n const listenerOptions = { passive: true };\n useEventListener(window, \"popstate\", onChanged, listenerOptions);\n if (mode !== \"history\")\n useEventListener(window, \"hashchange\", onChanged, listenerOptions);\n const initial = read();\n if (initial.keys().next().value)\n updateState(initial);\n else\n Object.assign(state, initialValue);\n return state;\n}\n\nfunction useUserMedia(options = {}) {\n var _a, _b;\n const enabled = shallowRef((_a = options.enabled) != null ? _a : false);\n const autoSwitch = shallowRef((_b = options.autoSwitch) != null ? _b : true);\n const constraints = ref(options.constraints);\n const { navigator = defaultNavigator } = options;\n const isSupported = useSupported(() => {\n var _a2;\n return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getUserMedia;\n });\n const stream = shallowRef();\n function getDeviceOptions(type) {\n switch (type) {\n case \"video\": {\n if (constraints.value)\n return constraints.value.video || false;\n break;\n }\n case \"audio\": {\n if (constraints.value)\n return constraints.value.audio || false;\n break;\n }\n }\n }\n async function _start() {\n if (!isSupported.value || stream.value)\n return;\n stream.value = await navigator.mediaDevices.getUserMedia({\n video: getDeviceOptions(\"video\"),\n audio: getDeviceOptions(\"audio\")\n });\n return stream.value;\n }\n function _stop() {\n var _a2;\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());\n stream.value = void 0;\n }\n function stop() {\n _stop();\n enabled.value = false;\n }\n async function start() {\n await _start();\n if (stream.value)\n enabled.value = true;\n return stream.value;\n }\n async function restart() {\n _stop();\n return await start();\n }\n watch(\n enabled,\n (v) => {\n if (v)\n _start();\n else _stop();\n },\n { immediate: true }\n );\n watch(\n constraints,\n () => {\n if (autoSwitch.value && stream.value)\n restart();\n },\n { immediate: true }\n );\n tryOnScopeDispose(() => {\n stop();\n });\n return {\n isSupported,\n stream,\n start,\n stop,\n restart,\n constraints,\n enabled,\n autoSwitch\n };\n}\n\nfunction useVModel(props, key, emit, options = {}) {\n var _a, _b, _c;\n const {\n clone = false,\n passive = false,\n eventName,\n deep = false,\n defaultValue,\n shouldEmit\n } = options;\n const vm = getCurrentInstance();\n 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));\n let event = eventName;\n if (!key) {\n key = \"modelValue\";\n }\n event = event || `update:${key.toString()}`;\n const cloneFn = (val) => !clone ? val : typeof clone === \"function\" ? clone(val) : cloneFnJSON(val);\n const getValue = () => isDef(props[key]) ? cloneFn(props[key]) : defaultValue;\n const triggerEmit = (value) => {\n if (shouldEmit) {\n if (shouldEmit(value))\n _emit(event, value);\n } else {\n _emit(event, value);\n }\n };\n if (passive) {\n const initialValue = getValue();\n const proxy = ref(initialValue);\n let isUpdating = false;\n watch(\n () => props[key],\n (v) => {\n if (!isUpdating) {\n isUpdating = true;\n proxy.value = cloneFn(v);\n nextTick(() => isUpdating = false);\n }\n }\n );\n watch(\n proxy,\n (v) => {\n if (!isUpdating && (v !== props[key] || deep))\n triggerEmit(v);\n },\n { deep }\n );\n return proxy;\n } else {\n return computed({\n get() {\n return getValue();\n },\n set(value) {\n triggerEmit(value);\n }\n });\n }\n}\n\nfunction useVModels(props, emit, options = {}) {\n const ret = {};\n for (const key in props) {\n ret[key] = useVModel(\n props,\n key,\n emit,\n options\n );\n }\n return ret;\n}\n\nfunction useVibrate(options) {\n const {\n pattern = [],\n interval = 0,\n navigator = defaultNavigator\n } = options || {};\n const isSupported = useSupported(() => typeof navigator !== \"undefined\" && \"vibrate\" in navigator);\n const patternRef = toRef(pattern);\n let intervalControls;\n const vibrate = (pattern2 = patternRef.value) => {\n if (isSupported.value)\n navigator.vibrate(pattern2);\n };\n const stop = () => {\n if (isSupported.value)\n navigator.vibrate(0);\n intervalControls == null ? void 0 : intervalControls.pause();\n };\n if (interval > 0) {\n intervalControls = useIntervalFn(\n vibrate,\n interval,\n {\n immediate: false,\n immediateCallback: false\n }\n );\n }\n return {\n isSupported,\n pattern,\n intervalControls,\n vibrate,\n stop\n };\n}\n\nfunction useVirtualList(list, options) {\n const { containerStyle, wrapperProps, scrollTo, calculateRange, currentList, containerRef } = \"itemHeight\" in options ? useVerticalVirtualList(options, list) : useHorizontalVirtualList(options, list);\n return {\n list: currentList,\n scrollTo,\n containerProps: {\n ref: containerRef,\n onScroll: () => {\n calculateRange();\n },\n style: containerStyle\n },\n wrapperProps\n };\n}\nfunction useVirtualListResources(list) {\n const containerRef = shallowRef(null);\n const size = useElementSize(containerRef);\n const currentList = ref([]);\n const source = shallowRef(list);\n const state = ref({ start: 0, end: 10 });\n return { state, source, currentList, size, containerRef };\n}\nfunction createGetViewCapacity(state, source, itemSize) {\n return (containerSize) => {\n if (typeof itemSize === \"number\")\n return Math.ceil(containerSize / itemSize);\n const { start = 0 } = state.value;\n let sum = 0;\n let capacity = 0;\n for (let i = start; i < source.value.length; i++) {\n const size = itemSize(i);\n sum += size;\n capacity = i;\n if (sum > containerSize)\n break;\n }\n return capacity - start;\n };\n}\nfunction createGetOffset(source, itemSize) {\n return (scrollDirection) => {\n if (typeof itemSize === \"number\")\n return Math.floor(scrollDirection / itemSize) + 1;\n let sum = 0;\n let offset = 0;\n for (let i = 0; i < source.value.length; i++) {\n const size = itemSize(i);\n sum += size;\n if (sum >= scrollDirection) {\n offset = i;\n break;\n }\n }\n return offset + 1;\n };\n}\nfunction createCalculateRange(type, overscan, getOffset, getViewCapacity, { containerRef, state, currentList, source }) {\n return () => {\n const element = containerRef.value;\n if (element) {\n const offset = getOffset(type === \"vertical\" ? element.scrollTop : element.scrollLeft);\n const viewCapacity = getViewCapacity(type === \"vertical\" ? element.clientHeight : element.clientWidth);\n const from = offset - overscan;\n const to = offset + viewCapacity + overscan;\n state.value = {\n start: from < 0 ? 0 : from,\n end: to > source.value.length ? source.value.length : to\n };\n currentList.value = source.value.slice(state.value.start, state.value.end).map((ele, index) => ({\n data: ele,\n index: index + state.value.start\n }));\n }\n };\n}\nfunction createGetDistance(itemSize, source) {\n return (index) => {\n if (typeof itemSize === \"number\") {\n const size2 = index * itemSize;\n return size2;\n }\n const size = source.value.slice(0, index).reduce((sum, _, i) => sum + itemSize(i), 0);\n return size;\n };\n}\nfunction useWatchForSizes(size, list, containerRef, calculateRange) {\n watch([size.width, size.height, list, containerRef], () => {\n calculateRange();\n });\n}\nfunction createComputedTotalSize(itemSize, source) {\n return computed(() => {\n if (typeof itemSize === \"number\")\n return source.value.length * itemSize;\n return source.value.reduce((sum, _, index) => sum + itemSize(index), 0);\n });\n}\nconst scrollToDictionaryForElementScrollKey = {\n horizontal: \"scrollLeft\",\n vertical: \"scrollTop\"\n};\nfunction createScrollTo(type, calculateRange, getDistance, containerRef) {\n return (index) => {\n if (containerRef.value) {\n containerRef.value[scrollToDictionaryForElementScrollKey[type]] = getDistance(index);\n calculateRange();\n }\n };\n}\nfunction useHorizontalVirtualList(options, list) {\n const resources = useVirtualListResources(list);\n const { state, source, currentList, size, containerRef } = resources;\n const containerStyle = { overflowX: \"auto\" };\n const { itemWidth, overscan = 5 } = options;\n const getViewCapacity = createGetViewCapacity(state, source, itemWidth);\n const getOffset = createGetOffset(source, itemWidth);\n const calculateRange = createCalculateRange(\"horizontal\", overscan, getOffset, getViewCapacity, resources);\n const getDistanceLeft = createGetDistance(itemWidth, source);\n const offsetLeft = computed(() => getDistanceLeft(state.value.start));\n const totalWidth = createComputedTotalSize(itemWidth, source);\n useWatchForSizes(size, list, containerRef, calculateRange);\n const scrollTo = createScrollTo(\"horizontal\", calculateRange, getDistanceLeft, containerRef);\n const wrapperProps = computed(() => {\n return {\n style: {\n height: \"100%\",\n width: `${totalWidth.value - offsetLeft.value}px`,\n marginLeft: `${offsetLeft.value}px`,\n display: \"flex\"\n }\n };\n });\n return {\n scrollTo,\n calculateRange,\n wrapperProps,\n containerStyle,\n currentList,\n containerRef\n };\n}\nfunction useVerticalVirtualList(options, list) {\n const resources = useVirtualListResources(list);\n const { state, source, currentList, size, containerRef } = resources;\n const containerStyle = { overflowY: \"auto\" };\n const { itemHeight, overscan = 5 } = options;\n const getViewCapacity = createGetViewCapacity(state, source, itemHeight);\n const getOffset = createGetOffset(source, itemHeight);\n const calculateRange = createCalculateRange(\"vertical\", overscan, getOffset, getViewCapacity, resources);\n const getDistanceTop = createGetDistance(itemHeight, source);\n const offsetTop = computed(() => getDistanceTop(state.value.start));\n const totalHeight = createComputedTotalSize(itemHeight, source);\n useWatchForSizes(size, list, containerRef, calculateRange);\n const scrollTo = createScrollTo(\"vertical\", calculateRange, getDistanceTop, containerRef);\n const wrapperProps = computed(() => {\n return {\n style: {\n width: \"100%\",\n height: `${totalHeight.value - offsetTop.value}px`,\n marginTop: `${offsetTop.value}px`\n }\n };\n });\n return {\n calculateRange,\n scrollTo,\n containerStyle,\n wrapperProps,\n currentList,\n containerRef\n };\n}\n\nfunction useWakeLock(options = {}) {\n const {\n navigator = defaultNavigator,\n document = defaultDocument\n } = options;\n const requestedType = shallowRef(false);\n const sentinel = shallowRef(null);\n const documentVisibility = useDocumentVisibility({ document });\n const isSupported = useSupported(() => navigator && \"wakeLock\" in navigator);\n const isActive = computed(() => !!sentinel.value && documentVisibility.value === \"visible\");\n if (isSupported.value) {\n useEventListener(sentinel, \"release\", () => {\n var _a, _b;\n requestedType.value = (_b = (_a = sentinel.value) == null ? void 0 : _a.type) != null ? _b : false;\n }, { passive: true });\n whenever(\n () => documentVisibility.value === \"visible\" && (document == null ? void 0 : document.visibilityState) === \"visible\" && requestedType.value,\n (type) => {\n requestedType.value = false;\n forceRequest(type);\n }\n );\n }\n async function forceRequest(type) {\n var _a;\n await ((_a = sentinel.value) == null ? void 0 : _a.release());\n sentinel.value = isSupported.value ? await navigator.wakeLock.request(type) : null;\n }\n async function request(type) {\n if (documentVisibility.value === \"visible\")\n await forceRequest(type);\n else\n requestedType.value = type;\n }\n async function release() {\n requestedType.value = false;\n const s = sentinel.value;\n sentinel.value = null;\n await (s == null ? void 0 : s.release());\n }\n return {\n sentinel,\n isSupported,\n isActive,\n request,\n forceRequest,\n release\n };\n}\n\nfunction useWebNotification(options = {}) {\n const {\n window = defaultWindow,\n requestPermissions: _requestForPermissions = true\n } = options;\n const defaultWebNotificationOptions = options;\n const isSupported = useSupported(() => {\n if (!window || !(\"Notification\" in window))\n return false;\n if (Notification.permission === \"granted\")\n return true;\n try {\n const notification2 = new Notification(\"\");\n notification2.onshow = () => {\n notification2.close();\n };\n } catch (e) {\n if (e.name === \"TypeError\")\n return false;\n }\n return true;\n });\n const permissionGranted = shallowRef(isSupported.value && \"permission\" in Notification && Notification.permission === \"granted\");\n const notification = ref(null);\n const ensurePermissions = async () => {\n if (!isSupported.value)\n return;\n if (!permissionGranted.value && Notification.permission !== \"denied\") {\n const result = await Notification.requestPermission();\n if (result === \"granted\")\n permissionGranted.value = true;\n }\n return permissionGranted.value;\n };\n const { on: onClick, trigger: clickTrigger } = createEventHook();\n const { on: onShow, trigger: showTrigger } = createEventHook();\n const { on: onError, trigger: errorTrigger } = createEventHook();\n const { on: onClose, trigger: closeTrigger } = createEventHook();\n const show = async (overrides) => {\n if (!isSupported.value || !permissionGranted.value)\n return;\n const options2 = Object.assign({}, defaultWebNotificationOptions, overrides);\n notification.value = new Notification(options2.title || \"\", options2);\n notification.value.onclick = clickTrigger;\n notification.value.onshow = showTrigger;\n notification.value.onerror = errorTrigger;\n notification.value.onclose = closeTrigger;\n return notification.value;\n };\n const close = () => {\n if (notification.value)\n notification.value.close();\n notification.value = null;\n };\n if (_requestForPermissions)\n tryOnMounted(ensurePermissions);\n tryOnScopeDispose(close);\n if (isSupported.value && window) {\n const document = window.document;\n useEventListener(document, \"visibilitychange\", (e) => {\n e.preventDefault();\n if (document.visibilityState === \"visible\") {\n close();\n }\n });\n }\n return {\n isSupported,\n notification,\n ensurePermissions,\n permissionGranted,\n show,\n close,\n onClick,\n onShow,\n onError,\n onClose\n };\n}\n\nconst DEFAULT_PING_MESSAGE = \"ping\";\nfunction resolveNestedOptions(options) {\n if (options === true)\n return {};\n return options;\n}\nfunction useWebSocket(url, options = {}) {\n const {\n onConnected,\n onDisconnected,\n onError,\n onMessage,\n immediate = true,\n autoConnect = true,\n autoClose = true,\n protocols = []\n } = options;\n const data = ref(null);\n const status = shallowRef(\"CLOSED\");\n const wsRef = ref();\n const urlRef = toRef(url);\n let heartbeatPause;\n let heartbeatResume;\n let explicitlyClosed = false;\n let retried = 0;\n let bufferedData = [];\n let retryTimeout;\n let pongTimeoutWait;\n const _sendBuffer = () => {\n if (bufferedData.length && wsRef.value && status.value === \"OPEN\") {\n for (const buffer of bufferedData)\n wsRef.value.send(buffer);\n bufferedData = [];\n }\n };\n const resetRetry = () => {\n if (retryTimeout != null) {\n clearTimeout(retryTimeout);\n retryTimeout = void 0;\n }\n };\n const resetHeartbeat = () => {\n clearTimeout(pongTimeoutWait);\n pongTimeoutWait = void 0;\n };\n const close = (code = 1e3, reason) => {\n resetRetry();\n if (!isClient && !isWorker || !wsRef.value)\n return;\n explicitlyClosed = true;\n resetHeartbeat();\n heartbeatPause == null ? void 0 : heartbeatPause();\n wsRef.value.close(code, reason);\n wsRef.value = void 0;\n };\n const send = (data2, useBuffer = true) => {\n if (!wsRef.value || status.value !== \"OPEN\") {\n if (useBuffer)\n bufferedData.push(data2);\n return false;\n }\n _sendBuffer();\n wsRef.value.send(data2);\n return true;\n };\n const _init = () => {\n if (explicitlyClosed || typeof urlRef.value === \"undefined\")\n return;\n const ws = new WebSocket(urlRef.value, protocols);\n wsRef.value = ws;\n status.value = \"CONNECTING\";\n ws.onopen = () => {\n status.value = \"OPEN\";\n retried = 0;\n onConnected == null ? void 0 : onConnected(ws);\n heartbeatResume == null ? void 0 : heartbeatResume();\n _sendBuffer();\n };\n ws.onclose = (ev) => {\n status.value = \"CLOSED\";\n resetHeartbeat();\n heartbeatPause == null ? void 0 : heartbeatPause();\n onDisconnected == null ? void 0 : onDisconnected(ws, ev);\n if (!explicitlyClosed && options.autoReconnect && (wsRef.value == null || ws === wsRef.value)) {\n const {\n retries = -1,\n delay = 1e3,\n onFailed\n } = resolveNestedOptions(options.autoReconnect);\n const checkRetires = typeof retries === \"function\" ? retries : () => typeof retries === \"number\" && (retries < 0 || retried < retries);\n if (checkRetires(retried)) {\n retried += 1;\n retryTimeout = setTimeout(_init, delay);\n } else {\n onFailed == null ? void 0 : onFailed();\n }\n }\n };\n ws.onerror = (e) => {\n onError == null ? void 0 : onError(ws, e);\n };\n ws.onmessage = (e) => {\n if (options.heartbeat) {\n resetHeartbeat();\n const {\n message = DEFAULT_PING_MESSAGE,\n responseMessage = message\n } = resolveNestedOptions(options.heartbeat);\n if (e.data === toValue(responseMessage))\n return;\n }\n data.value = e.data;\n onMessage == null ? void 0 : onMessage(ws, e);\n };\n };\n if (options.heartbeat) {\n const {\n message = DEFAULT_PING_MESSAGE,\n interval = 1e3,\n pongTimeout = 1e3\n } = resolveNestedOptions(options.heartbeat);\n const { pause, resume } = useIntervalFn(\n () => {\n send(toValue(message), false);\n if (pongTimeoutWait != null)\n return;\n pongTimeoutWait = setTimeout(() => {\n close();\n explicitlyClosed = false;\n }, pongTimeout);\n },\n interval,\n { immediate: false }\n );\n heartbeatPause = pause;\n heartbeatResume = resume;\n }\n if (autoClose) {\n if (isClient)\n useEventListener(\"beforeunload\", () => close(), { passive: true });\n tryOnScopeDispose(close);\n }\n const open = () => {\n if (!isClient && !isWorker)\n return;\n close();\n explicitlyClosed = false;\n retried = 0;\n _init();\n };\n if (immediate)\n open();\n if (autoConnect)\n watch(urlRef, open);\n return {\n data,\n status,\n close,\n send,\n open,\n ws: wsRef\n };\n}\n\nfunction useWebWorker(arg0, workerOptions, options) {\n const {\n window = defaultWindow\n } = options != null ? options : {};\n const data = ref(null);\n const worker = shallowRef();\n const post = (...args) => {\n if (!worker.value)\n return;\n worker.value.postMessage(...args);\n };\n const terminate = function terminate2() {\n if (!worker.value)\n return;\n worker.value.terminate();\n };\n if (window) {\n if (typeof arg0 === \"string\")\n worker.value = new Worker(arg0, workerOptions);\n else if (typeof arg0 === \"function\")\n worker.value = arg0();\n else\n worker.value = arg0;\n worker.value.onmessage = (e) => {\n data.value = e.data;\n };\n tryOnScopeDispose(() => {\n if (worker.value)\n worker.value.terminate();\n });\n }\n return {\n data,\n post,\n terminate,\n worker\n };\n}\n\nfunction depsParser(deps, localDeps) {\n if (deps.length === 0 && localDeps.length === 0)\n return \"\";\n const depsString = deps.map((dep) => `'${dep}'`).toString();\n const depsFunctionString = localDeps.filter((dep) => typeof dep === \"function\").map((fn) => {\n const str = fn.toString();\n if (str.trim().startsWith(\"function\")) {\n return str;\n } else {\n const name = fn.name;\n return `const ${name} = ${str}`;\n }\n }).join(\";\");\n const importString = `importScripts(${depsString});`;\n return `${depsString.trim() === \"\" ? \"\" : importString} ${depsFunctionString}`;\n}\n\nfunction jobRunner(userFunc) {\n return (e) => {\n const userFuncArgs = e.data[0];\n return Promise.resolve(userFunc.apply(void 0, userFuncArgs)).then((result) => {\n postMessage([\"SUCCESS\", result]);\n }).catch((error) => {\n postMessage([\"ERROR\", error]);\n });\n };\n}\n\nfunction createWorkerBlobUrl(fn, deps, localDeps) {\n const blobCode = `${depsParser(deps, localDeps)}; onmessage=(${jobRunner})(${fn})`;\n const blob = new Blob([blobCode], { type: \"text/javascript\" });\n const url = URL.createObjectURL(blob);\n return url;\n}\n\nfunction useWebWorkerFn(fn, options = {}) {\n const {\n dependencies = [],\n localDependencies = [],\n timeout,\n window = defaultWindow\n } = options;\n const worker = ref();\n const workerStatus = shallowRef(\"PENDING\");\n const promise = ref({});\n const timeoutId = shallowRef();\n const workerTerminate = (status = \"PENDING\") => {\n if (worker.value && worker.value._url && window) {\n worker.value.terminate();\n URL.revokeObjectURL(worker.value._url);\n promise.value = {};\n worker.value = void 0;\n window.clearTimeout(timeoutId.value);\n workerStatus.value = status;\n }\n };\n workerTerminate();\n tryOnScopeDispose(workerTerminate);\n const generateWorker = () => {\n const blobUrl = createWorkerBlobUrl(fn, dependencies, localDependencies);\n const newWorker = new Worker(blobUrl);\n newWorker._url = blobUrl;\n newWorker.onmessage = (e) => {\n const { resolve = () => {\n }, reject = () => {\n } } = promise.value;\n const [status, result] = e.data;\n switch (status) {\n case \"SUCCESS\":\n resolve(result);\n workerTerminate(status);\n break;\n default:\n reject(result);\n workerTerminate(\"ERROR\");\n break;\n }\n };\n newWorker.onerror = (e) => {\n const { reject = () => {\n } } = promise.value;\n e.preventDefault();\n reject(e);\n workerTerminate(\"ERROR\");\n };\n if (timeout) {\n timeoutId.value = setTimeout(\n () => workerTerminate(\"TIMEOUT_EXPIRED\"),\n timeout\n );\n }\n return newWorker;\n };\n const callWorker = (...fnArgs) => new Promise((resolve, reject) => {\n var _a;\n promise.value = {\n resolve,\n reject\n };\n (_a = worker.value) == null ? void 0 : _a.postMessage([[...fnArgs]]);\n workerStatus.value = \"RUNNING\";\n });\n const workerFn = (...fnArgs) => {\n if (workerStatus.value === \"RUNNING\") {\n console.error(\n \"[useWebWorkerFn] You can only run one instance of the worker at a time.\"\n );\n return Promise.reject();\n }\n worker.value = generateWorker();\n return callWorker(...fnArgs);\n };\n return {\n workerFn,\n workerStatus,\n workerTerminate\n };\n}\n\nfunction useWindowFocus(options = {}) {\n const { window = defaultWindow } = options;\n if (!window)\n return shallowRef(false);\n const focused = shallowRef(window.document.hasFocus());\n const listenerOptions = { passive: true };\n useEventListener(window, \"blur\", () => {\n focused.value = false;\n }, listenerOptions);\n useEventListener(window, \"focus\", () => {\n focused.value = true;\n }, listenerOptions);\n return focused;\n}\n\nfunction useWindowScroll(options = {}) {\n const { window = defaultWindow, ...rest } = options;\n return useScroll(window, rest);\n}\n\nfunction useWindowSize(options = {}) {\n const {\n window = defaultWindow,\n initialWidth = Number.POSITIVE_INFINITY,\n initialHeight = Number.POSITIVE_INFINITY,\n listenOrientation = true,\n includeScrollbar = true,\n type = \"inner\"\n } = options;\n const width = shallowRef(initialWidth);\n const height = shallowRef(initialHeight);\n const update = () => {\n if (window) {\n if (type === \"outer\") {\n width.value = window.outerWidth;\n height.value = window.outerHeight;\n } else if (type === \"visual\" && window.visualViewport) {\n const { width: visualViewportWidth, height: visualViewportHeight, scale } = window.visualViewport;\n width.value = Math.round(visualViewportWidth * scale);\n height.value = Math.round(visualViewportHeight * scale);\n } else if (includeScrollbar) {\n width.value = window.innerWidth;\n height.value = window.innerHeight;\n } else {\n width.value = window.document.documentElement.clientWidth;\n height.value = window.document.documentElement.clientHeight;\n }\n }\n };\n update();\n tryOnMounted(update);\n const listenerOptions = { passive: true };\n useEventListener(\"resize\", update, listenerOptions);\n if (window && type === \"visual\" && window.visualViewport) {\n useEventListener(window.visualViewport, \"resize\", update, listenerOptions);\n }\n if (listenOrientation) {\n const matches = useMediaQuery(\"(orientation: portrait)\");\n watch(matches, () => update());\n }\n return { width, height };\n}\n\nexport { DefaultMagicKeysAliasMap, StorageSerializers, TransitionPresets, computedAsync as asyncComputed, breakpointsAntDesign, breakpointsBootstrapV5, breakpointsElement, breakpointsMasterCss, breakpointsPrimeFlex, breakpointsQuasar, breakpointsSematic, breakpointsTailwind, breakpointsVuetify, breakpointsVuetifyV2, breakpointsVuetifyV3, cloneFnJSON, computedAsync, computedInject, createFetch, createReusableTemplate, createTemplatePromise, createUnrefFn, customStorageEventName, defaultDocument, defaultLocation, defaultNavigator, defaultWindow, executeTransition, formatTimeAgo, getSSRHandler, mapGamepadToXbox360Controller, onClickOutside, onElementRemoval, onKeyDown, onKeyPressed, onKeyStroke, onKeyUp, onLongPress, onStartTyping, provideSSRWidth, setSSRHandler, templateRef, unrefElement, useActiveElement, useAnimate, useAsyncQueue, useAsyncState, useBase64, useBattery, useBluetooth, useBreakpoints, useBroadcastChannel, useBrowserLocation, useCached, useClipboard, useClipboardItems, useCloned, useColorMode, useConfirmDialog, useCountdown, useCssVar, useCurrentElement, useCycleList, useDark, useDebouncedRefHistory, useDeviceMotion, useDeviceOrientation, useDevicePixelRatio, useDevicesList, useDisplayMedia, useDocumentVisibility, useDraggable, useDropZone, useElementBounding, useElementByPoint, useElementHover, useElementSize, useElementVisibility, useEventBus, useEventListener, useEventSource, useEyeDropper, useFavicon, useFetch, useFileDialog, useFileSystemAccess, useFocus, useFocusWithin, useFps, useFullscreen, useGamepad, useGeolocation, useIdle, useImage, useInfiniteScroll, useIntersectionObserver, useKeyModifier, useLocalStorage, useMagicKeys, useManualRefHistory, useMediaControls, useMediaQuery, useMemoize, useMemory, useMounted, useMouse, useMouseInElement, useMousePressed, useMutationObserver, useNavigatorLanguage, useNetwork, useNow, useObjectUrl, useOffsetPagination, useOnline, usePageLeave, useParallax, useParentElement, usePerformanceObserver, usePermission, usePointer, usePointerLock, usePointerSwipe, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePreferredLanguages, usePreferredReducedMotion, usePreferredReducedTransparency, usePrevious, useRafFn, useRefHistory, useResizeObserver, useSSRWidth, useScreenOrientation, useScreenSafeArea, useScriptTag, useScroll, useScrollLock, useSessionStorage, useShare, useSorted, useSpeechRecognition, useSpeechSynthesis, useStepper, useStorage, useStorageAsync, useStyleTag, useSupported, useSwipe, useTemplateRefsList, useTextDirection, useTextSelection, useTextareaAutosize, useThrottledRefHistory, useTimeAgo, useTimeoutPoll, useTimestamp, useTitle, useTransition, useUrlSearchParams, useUserMedia, useVModel, useVModels, useVibrate, useVirtualList, useWakeLock, useWebNotification, useWebSocket, useWebWorker, useWebWorkerFn, useWindowFocus, useWindowScroll, useWindowSize };\n","<template>\r\n <VFormControl class=\"mech-v-input\" :error=\"error\" :label=\"label\" :required=\"required\" :disabled=\"disabled\" :class=\"{ large, multiline }\" outline>\r\n <template v-if=\"$slots.actions\" #actions><slot name=\"actions\"></slot></template>\r\n <slot name=\"start-adornment\"></slot>\r\n <div v-if=\"props.prefix\" class=\"mech-v-input__start-adornment\">{{ props.prefix }}</div>\r\n <textarea \r\n v-if=\"props.multiline\" \r\n ref=\"inputRef\" \r\n v-model=\"model\" \r\n :placeholder=\"props.placeholder\" \r\n :rows=\"props.rows\" \r\n class=\"scroll\"\r\n :name=\"props.name\"\r\n ></textarea>\r\n <input \r\n v-else \r\n ref=\"inputRef\" \r\n v-model=\"model\" \r\n :placeholder=\"props.placeholder\" \r\n :type=\"inputType\"\r\n :name=\"props.name\"\r\n />\r\n <div v-if=\"props.maxLength\" class=\"mech-v-input__max-length\">{{ model.length }} / {{ props.maxLength }}</div>\r\n <slot name=\"end-adornment\"></slot>\r\n </VFormControl>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { Ref, computed, onMounted, ref, watch } from 'vue';\r\nimport VFormControl, { VFormControlProps } from './VFormControl.vue';\r\nimport { useTextareaAutosize } from '@vueuse/core';\r\n\r\nconst props = defineProps<{ \r\n modelValue?: string | number | null,\r\n multiline?: boolean, \r\n autofocus?: boolean,\r\n rows?: number, \r\n placeholder?: string, \r\n type?: \"phone\" | \"number\" | \"integer\" | \"password\", \r\n name?: string,\r\n large?: boolean,\r\n maxLength?: number,\r\n prefix?: string,\r\n validator?: (inputValue: string) => null | any\r\n} & VFormControlProps>()\r\n\r\nconst emit = defineEmits([\"update:modelValue\"])\r\n\r\nconst parse = (value: string) => {\r\n if (props.validator) {\r\n return props.validator(value)\r\n }\r\n if (props.type === \"number\") {\r\n const val = parseFloat(value)\r\n if (isNaN(val)) return null\r\n return val\r\n }\r\n if (props.type === \"integer\") {\r\n const val = parseInt(value)\r\n if (isNaN(val)) return null\r\n return val\r\n }\r\n return value\r\n}\r\n\r\nlet lastValue: number | null | string = \"\"\r\n\r\nconst model = ref(\"\")\r\nwatch(() => props.modelValue, (value) => {\r\n if (value === lastValue) return\r\n model.value = (value ?? \"\").toString()\r\n}, { immediate: true })\r\n\r\nwatch(() => model.value, (modelValue) => {\r\n const val = parse(modelValue)\r\n lastValue = val\r\n emit(\"update:modelValue\", val)\r\n})\r\n\r\nconst error = computed(() => {\r\n if ((props.type === \"number\" || props.type === \"integer\") && model.value && props.modelValue === null) {\r\n return { message: \"Введите числовое значение\" }\r\n }\r\n return props.error\r\n})\r\n\r\nconst inputType = computed(() => {\r\n if (props.type !== \"phone\" && props.type !== \"number\" && props.type !== \"integer\") return props.type\r\n return undefined\r\n})\r\n\r\nconst inputRef = ref<HTMLInputElement | HTMLTextAreaElement>()\r\nonMounted(() => {\r\n if (props.autofocus || props.error) {\r\n inputRef.value?.focus()\r\n }\r\n})\r\n\r\nif (props.multiline) {\r\n useTextareaAutosize({ element: inputRef as Ref<HTMLTextAreaElement>, input: model })\r\n}\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n\r\n.mech-v-input\r\n min-width: 240px\r\n .v-form-control__outline\r\n height: 40px\r\n &>svg\r\n align-self: center\r\n color: #CED4DA\r\n\r\n input, textarea\r\n height: 100%\r\n flex-grow: 1\r\n background: none\r\n border: none\r\n padding: 0 12px\r\n outline: none\r\n position: relative\r\n z-index: 1\r\n width: 20px\r\n color: var(--text-color)\r\n font-size: 13px\r\n border-radius: 7px\r\n\r\n &::placeholder\r\n color: var(--placeholder-color)\r\n\r\n input\r\n padding-right: 4px\r\n\r\n &.multiline\r\n .v-form-control__outline\r\n height: auto\r\n\r\n textarea\r\n box-sizing: border-box\r\n line-height: 1.4em\r\n padding: 10px 14px\r\n resize: none\r\n min-height: 60px\r\n\r\n.mech-v-input__start-adornment\r\n padding: 0 16px\r\n border-right: 1px solid #CED4DA\r\n display: flex\r\n align-items: center\r\n justify-content: center\r\n\r\n.mech-v-input__max-length\r\n position: absolute\r\n bottom: 2px\r\n right: 10px\r\n font-size: 12px\r\n color: #C8CCD0\r\n\r\n.mech-v-input.disabled .mech-v-input__input-wrapper\r\n background-color: #F2F2F4\r\n pointer-events: none\r\n\r\n\r\n\r\n</style>","<template>\r\n <div class=\"blocks-list\">\r\n <VInput v-model=\"searchValue\" placeholder=\"Поиск...\" class=\"page-editor-blocks__search\"/>\r\n <div v-for=\"group in groupBlocks\" class=\"page-editor-blocks__group\">\r\n <div class=\"title\">{{ groupNames[group.name] ?? group.name }}</div>\r\n <div class=\"blocks-list__blocks\">\r\n <button \r\n v-for=\"item in group.blocks\" \r\n class=\"blocks-list__block editor-component\" \r\n :key=\"item.id\" \r\n @mousedown=\"onItemMouseDown($event, item)\"\r\n >\r\n {{ item.name }}\r\n </button>\r\n </div>\r\n </div>\r\n <div v-if=\"filteredBlocks.length === 0\" class=\"page-editor__nothing-found\">Блоки не найдены</div>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { computed, inject, ref, Ref } from 'vue'\r\nimport { MultiMap, useDraggableItem, useSearch } from 'vuesix'\r\nimport { Block, BlockDropEvent } from '../types'\r\nimport VInput from '../../common/components/VInput.vue'\r\n\r\nconst props = defineProps<{ blocks: Block[] }>()\r\n\r\nconst searchValue = ref(\"\")\r\nconst filteredBlocks = useSearch(searchValue, () => props.blocks, item => item.name + \" \" + item.id)\r\n\r\nconst groupBlocks = computed(() => {\r\n const groups = new MultiMap<string, Block>()\r\n for (let block of filteredBlocks.value) {\r\n if (block.hidden || block.isDev) continue\r\n groups.add(block.group ?? 'default', block)\r\n }\r\n const output: Array<{ name: string, blocks: Block[] }> = []\r\n for (let [ groupName, blocks ] of groups._map) {\r\n blocks.sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\r\n output.push({ name: groupName, blocks: blocks })\r\n }\r\n output.sort((a, b) => {\r\n if (a.name === \"default\") return 1\r\n if (b.name === \"default\") return -1\r\n return a.name.localeCompare(b.name)\r\n })\r\n return output\r\n})\r\nconst groupNames: Record<string, string> = {\r\n default: \"Доступные блоки\",\r\n layout: \"Макет\"\r\n}\r\n\r\nconst drag = useDraggableItem()\r\nconst dragMode = inject(\"dragMode\") as Ref<boolean>\r\n\r\nconst onItemMouseDown = (e: MouseEvent, item: any) => {\r\n drag(e, {\r\n onStart(item) {\r\n item.classList.add(\"drag\")\r\n document.body.classList.add(\"mousedrag\")\r\n dragMode.value = true\r\n },\r\n onEnd(e) {\r\n document.body.classList.remove(\"mousedrag\")\r\n e.target?.dispatchEvent(new BlockDropEvent(item))\r\n dragMode.value = false\r\n }\r\n })\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.page-editor-blocks__search\r\n margin-bottom: 16px\r\n\r\n.page-editor-blocks__group\r\n .title\r\n font-size: 13px\r\n font-weight: 500\r\n color: var(--text-secondary-color)\r\n\r\n.blocks-list__blocks\r\n display: grid\r\n grid-template-columns: repeat(2, 1fr)\r\n margin-top: 6px\r\n gap: 8px\r\n margin-bottom: 16px\r\n\r\n.blocks-list__block.editor-component\r\n height: 60px\r\n background: none\r\n border: 1px solid var(--input-border-color)\r\n border-radius: 6px\r\n font-size: 13px\r\n cursor: pointer\r\n z-index: 10000\r\n color: var(--text-color-alt)\r\n font-weight: 500\r\n padding: 0 8px\r\n\r\n &:hover\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12)\r\n\r\n &.drag\r\n background-color: var(--paper-color)\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12)\r\n\r\n.page-editor__nothing-found\r\n color: var(--text-secondary-color)\r\n font-weight: 500\r\n font-size: 13px\r\n\r\n</style>","import { isEqual } from \"vuesix\"\r\nimport type { ContentBlock, Block, DataEntryScope } from \"../types\"\r\nimport { uid, walkSchema, onUpdateBlockChildren, walkTree } from \"./blocks\"\r\nimport { defaultImageSrc, getDefaultValue, passDefaultValue } from \"./passDefaultValue\"\r\n\r\n/** Process production block to dev state */\r\nexport const processBlock = (contentBlock: ContentBlock, schema?: Block) => {\r\n \r\n if (!contentBlock.id) {\r\n contentBlock.id = uid()\r\n }\r\n if (!contentBlock.data) {\r\n contentBlock.data = {}\r\n }\r\n\r\n contentBlock.data['data-block-id'] = contentBlock.id\r\n\r\n if (schema) {\r\n passDefaultValue(contentBlock.data, schema.props)\r\n\r\n if (schema.slots) {\r\n if (Object.keys(schema.slots).join() === 'default') {\r\n if (contentBlock.children && !Array.isArray(contentBlock.children)) {\r\n contentBlock.children = contentBlock.children[\"default\"] ?? []\r\n } else {\r\n contentBlock.children = contentBlock.children ?? []\r\n }\r\n } else {\r\n if (contentBlock.children && Array.isArray(contentBlock.children)) {\r\n const arr = contentBlock.children\r\n contentBlock.children = Object.fromEntries(Object.keys(schema.slots).map(key => [ key, [] ]))\r\n contentBlock.children[\"default\"] = arr\r\n } else {\r\n contentBlock.children = contentBlock.children ?? Object.fromEntries(Object.keys(schema.slots).map(key => [ key, [] ]))\r\n }\r\n }\r\n onUpdateBlockChildren(contentBlock)\r\n }\r\n }\r\n return contentBlock\r\n}\r\n\r\n/** Process dev block to production state */\r\nexport const saveBlock = (contentBlock: ContentBlock, schema?: Block) => {\r\n\r\n if (contentBlock.children) {\r\n if (Array.isArray(contentBlock.children)) {\r\n contentBlock.children = contentBlock.children.filter(item => !item.blockId.startsWith(\"__dev\"))\r\n } else {\r\n for (let key in contentBlock.children) {\r\n contentBlock.children[key] = contentBlock.children[key].filter(item => !item.blockId.startsWith(\"__dev\"))\r\n }\r\n }\r\n }\r\n\r\n if (!contentBlock.data) return\r\n delete contentBlock.data['data-block-id']\r\n if (!schema) return\r\n walkSchema(contentBlock.data, schema.props, (value, schema, key, parent) => {\r\n if (schema.type === 'object' && schema.format === 'image' && value.src === defaultImageSrc && key && parent) {\r\n parent[key] = null\r\n }\r\n if (schema.type === 'object' && schema.format === 'file' && value.src === \"\" && key && parent) {\r\n parent[key] = null\r\n }\r\n })\r\n}\r\n\r\n/** Функция проходит по всем блокам и назначает пропс data-block-id и значения по умолчанию */\r\nexport const processBlocks = (state: ContentBlock[], blocksMap: Map<string, Block>) => {\r\n walkTree(state, block => {\r\n processBlock(block, blocksMap.get(block.blockId)!)\r\n })\r\n\r\n return state\r\n}\r\n\r\nexport const saveBlocks = (state: ContentBlock[], blocksMap: Map<string, Block>) => {\r\n walkTree(state, (block) => {\r\n saveBlock(block, blocksMap.get(block.blockId))\r\n })\r\n return state\r\n}\r\n\r\nexport const splitData = (data: Record<string, any>, scopes: Record<string, DataEntryScope>) => {\r\n const groupedData: Record<DataEntryScope, Record<string, any>> = { \"site\": {}, \"folder\": {}, \"page\": {} }\r\n for (let [key, scope] of Object.entries(scopes)) {\r\n groupedData[scope][key] = data[key]\r\n }\r\n return groupedData\r\n}\r\n\r\n\r\nexport const splitDataAndFilter = (data: Record<string, any>, scopes: Record<string, DataEntryScope>, defaultData: any) => {\r\n const groupedData: Record<DataEntryScope, Record<string, any>> = { \"site\": {}, \"folder\": {}, \"page\": {} }\r\n for (let [key, scope] of Object.entries(scopes)) {\r\n if (isEqual(data[key], defaultData)) continue\r\n groupedData[scope][key] = data[key]\r\n }\r\n return groupedData\r\n}\r\n","import type { ContentBlock, Block } from \"../types\"\r\n\r\nexport const walkTree = (blocks: ContentBlock[], callback: (block: ContentBlock) => void) => {\r\n for (let block of blocks) {\r\n callback(block)\r\n if (!block.children) continue\r\n if (Array.isArray(block.children)) {\r\n walkTree(block.children, callback)\r\n } else {\r\n for (let value of Object.values(block.children)) {\r\n walkTree(value, callback)\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport const walkSchema = (\r\n obj: any, \r\n schema: Block[\"props\"], \r\n callback: (value: any, schema: any, key?: string, parent?: any, isRequired?: boolean) => void, \r\n) => { \r\n if (schema.type === \"object\" && schema.properties) {\r\n if (!obj) {\r\n return\r\n }\r\n for (let [ key, childSchema ] of Object.entries(schema.properties)) {\r\n\r\n const isRequired = schema.required.includes(key)\r\n callback(obj[key], childSchema, key, obj, isRequired)\r\n\r\n if ((childSchema as any).type === 'array' || (childSchema as any).type === 'object') {\r\n walkSchema(obj[key], childSchema, callback)\r\n }\r\n }\r\n }\r\n\r\n if (schema.type === \"array\" && schema.items) {\r\n for (let value of obj) {\r\n callback(value, schema.items)\r\n if (schema.items.type === 'array' || schema.items.type === 'object') {\r\n walkSchema(value, schema.items, callback)\r\n }\r\n }\r\n }\r\n}","import { h } from \"vue\"\r\nimport { ContentBlock, Block } from \"../types\"\r\nimport { processBlock } from \"./processBlock\"\r\nimport { walkTree } from \"./walkTree\"\r\nexport { walkTree, walkSchema } from './walkTree'\r\n\r\nexport const findBlock = (blocks: ContentBlock[], callback: (block: ContentBlock) => boolean): ContentBlock | null => {\r\n for (let block of blocks) {\r\n if (callback(block)) {\r\n return block\r\n }\r\n if (!block.children) continue\r\n if (Array.isArray(block.children)) {\r\n const result = findBlock(block.children, callback)\r\n if (result) return result\r\n } else {\r\n for (let value of Object.values(block.children)) {\r\n const result = findBlock(value, callback)\r\n if (result) return result\r\n }\r\n }\r\n }\r\n return null\r\n}\r\n\r\nexport const hasSlots = (block: Block) => {\r\n return !!block.slots && Object.keys(block.slots).length > 0\r\n}\r\n\r\nexport const hasMultipleSlots = (block: Block) => {\r\n if (!block.slots || Object.keys(block.slots).length === 0) return false\r\n return Object.keys(block.slots).join() !== 'default'\r\n}\r\n\r\nexport const forEachChildren = (block: Block, content: ContentBlock, callback: (blocks: ContentBlock[]) => void) => {\r\n if (!hasSlots(block)) {\r\n /** ToDo - remove this delete method */\r\n if (content.children) {\r\n delete content.children\r\n }\r\n return\r\n }\r\n if (hasMultipleSlots(block)) {\r\n if (!content.children) content.children = {}\r\n if (Array.isArray(content.children)) content.children = { default: content.children }\r\n for (let key in block.slots) {\r\n if (!content.children[key]) content.children[key] = []\r\n callback(content.children[key])\r\n }\r\n } else {\r\n if (!content.children) content.children = []\r\n if (!Array.isArray(content.children)) content.children = content.children.default ?? []\r\n callback(content.children)\r\n }\r\n}\r\n\r\n\r\n/** Delete content block */\r\nexport const deleteBlock = (blocks: ContentBlock[], target: ContentBlock) => {\r\n\r\n let isDeleted = false\r\n walkTree(blocks, block => {\r\n if (!block.children) return\r\n if (Array.isArray(block.children)) {\r\n if (deleteFromArray(block.children, target)) {\r\n isDeleted = true\r\n onUpdateBlockChildren(block)\r\n }\r\n } else {\r\n for (let children of Object.values(block.children)) {\r\n if (deleteFromArray(children, target)) {\r\n isDeleted = true\r\n onUpdateBlockChildren(block)\r\n }\r\n }\r\n }\r\n })\r\n\r\n if (!isDeleted) {\r\n deleteFromArray(blocks, target)\r\n }\r\n}\r\n\r\nexport const createContentBlockChild = (blocksMap: Map<string, Block>, contentBlock: ContentBlock, parent: ContentBlock, index: number = -1) => {\r\n const parentBlock = blocksMap.get(parent.blockId)!\r\n if (!parentBlock.slots) return\r\n\r\n if (Object.keys(parentBlock.slots).join() === 'default') {\r\n if (!parent.children) parent.children = []\r\n if (!Array.isArray(parent.children)) parent.children = parent.children.default ?? []\r\n if (index < 0) {\r\n parent.children.push(contentBlock)\r\n } else {\r\n parent.children.splice(index, 0, contentBlock)\r\n }\r\n } else {\r\n if (!parent.children || Array.isArray(parent.children)) parent.children = {}\r\n if (index < 0) {\r\n const key = 'default' in parentBlock.slots? 'default': Object.keys(parentBlock.slots)[0]\r\n if (!parent.children[key]) parent.children[key] = []\r\n parent.children[key].push(contentBlock)\r\n } else {\r\n let startIndex = 0\r\n for (let children of Object.values(parent.children)) {\r\n if (index-startIndex <= children.length) {\r\n children.splice(index-startIndex, 0, contentBlock)\r\n }\r\n startIndex += children.length\r\n }\r\n }\r\n }\r\n\r\n onUpdateBlockChildren(parent)\r\n}\r\n\r\nexport const getBlockIndex = (parent: ContentBlock, target: ContentBlock) => {\r\n if (!parent.children) return -1\r\n if (Array.isArray(parent.children)) {\r\n return parent.children.indexOf(target)\r\n } else {\r\n let startIndex = 0\r\n for (let children of Object.values(parent.children)) {\r\n const index = children.indexOf(target)\r\n if (index >= 0) {\r\n return startIndex + index\r\n }\r\n startIndex += children.length\r\n }\r\n return -1\r\n }\r\n}\r\n\r\nexport const createContentBlock = (block: Block) => {\r\n const id = uid()\r\n return processBlock({ id, blockId: block.id, data: {} }, block)\r\n}\r\n\r\nexport const insertBlockBefore = (block: Block, contentBlocks: ContentBlock[], prependBlockId?: string | null) => {\r\n const contentBlock = createContentBlock(block)\r\n if (!prependBlockId) {\r\n contentBlocks.push(contentBlock)\r\n } else {\r\n const index = contentBlocks.findIndex(item => item.id === prependBlockId)\r\n if (index < 0) {\r\n contentBlocks.push(contentBlock)\r\n } else {\r\n contentBlocks.splice(index, 0, contentBlock)\r\n }\r\n }\r\n return contentBlock\r\n}\r\n\r\nconst _onUpdateBlockChildren = (children: ContentBlock[]) => {\r\n if (children.length === 0) {\r\n children.push(createDevBlock())\r\n } else {\r\n const index = children.findIndex(item => item.blockId === '__dev-block')\r\n if (index >= 0) {\r\n children.splice(index, 1)\r\n }\r\n }\r\n}\r\n\r\n/** Filter block childrens to remove dev block or add dev block if its empty */\r\nexport const onUpdateBlockChildren = (block: ContentBlock) => {\r\n if (!block.children) return\r\n if (Array.isArray(block.children)) {\r\n _onUpdateBlockChildren(block.children)\r\n } else {\r\n for (let children of Object.values(block.children)) {\r\n _onUpdateBlockChildren(children)\r\n }\r\n }\r\n}\r\n\r\n/** Change block id and his children */\r\nexport const changeBlockId = (content: ContentBlock, schema: Block) => {\r\n content.id = uid()\r\n processBlock(content)\r\n forEachChildren(schema, content, contents => {\r\n for (let content of contents) {\r\n content.id = uid()\r\n processBlock(content)\r\n }\r\n })\r\n}\r\n\r\nexport const createDevBlock = () => {\r\n const id = uid()\r\n\r\n const style = `\r\n min-width: 60px;\r\n min-height: 60px;\r\n background-color: #0073E920;\r\n background-image: url(\"data:image/svg+xml,%3csvg width='100%25' height='100%25' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='100%25' height='100%25' fill='none' rx='4' ry='4' stroke='%230073E9FF' stroke-width='4' stroke-dasharray='6%2c 14' stroke-dashoffset='0' stroke-linecap='square'/%3e%3c/svg%3e\");\r\n border-radius: 4px;\r\n`\r\n\r\n return { id, data: {}, blockId: \"__dev-block\", vnode: h('div', { class: \"dev-empty-slot-block\", style }) } \r\n}\r\n\r\nconst deleteFromArray = <T>(arr: T[], item: T) => {\r\n const index = arr.indexOf(item)\r\n if (index < 0) return false\r\n arr.splice(index, 1)\r\n return true\r\n}\r\n\r\nexport const uid = () => {\r\n return Math.trunc(Math.random() * 100000).toString(16)\r\n}","<template>\r\n <div ref=\"tabsRef\" class=\"v-tabs\">\r\n <TransitionGroup>\r\n <button v-for=\"item in props.items\" :key=\"item.id\" class=\"v-tabs__tab\" :class=\"{ active: model === item.id }\" @click=\"model = item.id\">\r\n {{ item.title }}\r\n </button>\r\n </TransitionGroup>\r\n <div class=\"v-tabs__marker\" :style=\"markerStyle\"></div>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup generic=\"K extends number | string\">\r\nimport { useVModel } from '@vueuse/core';\r\nimport { CSSProperties, Ref, nextTick, onMounted, ref, watch } from 'vue';\r\n\r\ntype Item = { id: K, title: string }\r\nconst props = defineProps<{ items: Item[], modelValue?: K }>()\r\nconst emit = defineEmits([ \"update:modelValue\" ])\r\n\r\nconst model = useVModel(props, \"modelValue\", emit, { passive: true }) as Ref<K>\r\n\r\nwatch(() => props.items, (items) => {\r\n if ((model.value === undefined || model.value === null) && items.length > 0) {\r\n model.value = items[0].id\r\n }\r\n}, { immediate: true })\r\n\r\nconst tabsRef = ref<HTMLDivElement>()\r\nconst markerStyle = ref<CSSProperties>({})\r\n\r\nconst placeMarker = () => {\r\n const id = model.value\r\n if (!tabsRef.value) return\r\n const index = props.items.findIndex(item => item.id === id)\r\n if (index < 0) {\r\n markerStyle.value = { width: \"0px\" }\r\n return\r\n }\r\n const child = tabsRef.value.children[index] as HTMLElement\r\n \r\n const p = 0\r\n markerStyle.value = { left: child.offsetLeft+p+\"px\", width: child.clientWidth-p*2+\"px\" }\r\n\r\n for (let child of tabsRef.value.children) {\r\n const item = child as HTMLElement\r\n item.style.left = item.offsetLeft + \"px\"\r\n }\r\n\r\n // setTimeout(() => {\r\n // tabsRef.value!.scrollTo(child.offsetLeft-60, child.offsetLeft + child.clientWidth+60)\r\n // }, 0)\r\n}\r\n\r\nonMounted(() => {\r\n placeMarker()\r\n})\r\nwatch(() => props.items, () => {\r\n placeMarker()\r\n}, { deep: true, flush: \"post\" })\r\n// useResizeObserver(tabsRef, () => {\r\n// placeMarker()\r\n// })\r\n\r\nwatch(model, placeMarker, { flush: \"post\" })\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-tabs\r\n border-bottom: 1px solid rgba(255, 255, 255, 0.1)\r\n overflow: hidden\r\n white-space: nowrap\r\n position: relative\r\n gap: 8px\r\n display: flex\r\n z-index: 2\r\n\r\n.v-tabs__tab\r\n background: none\r\n height: 36px\r\n padding: 0 8px\r\n font-size: 13px\r\n border: none\r\n font-weight: 500\r\n cursor: pointer\r\n color: var(--text-secondary-color)\r\n transition: color 0.2s\r\n outline: none\r\n\r\n &.v-enter-active, &.v-leave-active\r\n transition: transform 0.225s cubic-bezier(0, 0, 0.2, 1), opacity 0.225s\r\n\r\n &.v-enter-from, &.v-leave-to\r\n transform: translateY(-20px)\r\n opacity: 0\r\n\r\n &.v-leave-active\r\n position: absolute\r\n\r\n &.active\r\n color: var(--text-color)\r\n\r\n.v-tabs__marker\r\n position: absolute\r\n top: 0\r\n bottom: 0\r\n background-color: var(--active-color)\r\n border-radius: 1px\r\n transition: left 0.225s cubic-bezier(0.4, 0, 0.2, 1), width 0.225s cubic-bezier(0.4, 0, 0.2, 1)\r\n z-index: -1\r\n border-radius: 6px\r\n\r\n</style>","<template>\r\n <div ref=\"containerRef\" class=\"v-tabs-pages\">\r\n <Transition :name=\"transitionClass\" @before-leave=\"onBeforeLeave\" @enter=\"onEnter\" @after-enter=\"onAfterEnter\">\r\n <div :key=\"props.page\" class=\"v-tabs-pages__page\" :class=\"props['page:class']\">\r\n <slot :name=\"props.page\" />\r\n </div>\r\n </Transition>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { nextTick, ref, useSlots, watch } from 'vue';\r\n\r\nconst props = defineProps<{ page: string, \"page:class\"?: string }>()\r\n\r\nconst slots = useSlots()\r\n\r\nconst containerRef = ref<HTMLDivElement>()\r\nconst transitionClass = ref(\"slide-right\")\r\nwatch(() => props.page, (value, lastValue) => {\r\n const keys = Object.keys(slots)\r\n if (keys.indexOf(value) > keys.indexOf(lastValue)) {\r\n transitionClass.value = \"slide-left\"\r\n } else {\r\n transitionClass.value = \"slide-right\"\r\n }\r\n})\r\n\r\nconst onBeforeLeave = (el: Element) => {\r\n containerRef.value!.style.height = el.scrollHeight + \"px\"\r\n containerRef.value?.classList.add(\"transition-active\")\r\n}\r\nconst onEnter = (el: Element) => {\r\n containerRef.value!.style.height = el.scrollHeight + \"px\"\r\n}\r\nconst onAfterEnter = () => {\r\n containerRef.value!.style.height = \"\"\r\n containerRef.value?.classList.remove(\"transition-active\")\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-tabs-pages\r\n position: relative\r\n\r\n &.transition-active\r\n overflow: hidden\r\n transition: height 0.225s cubic-bezier(0.8, 0, 0.2, 1)\r\n\r\n.v-tabs-pages__page\r\n inset: 0\r\n height: fit-content\r\n\r\n &.slide-left-enter-active, &.slide-left-leave-active, &.slide-right-enter-active, &.slide-right-leave-active\r\n transition: transform 0.225s cubic-bezier(0.8, 0, 0.2, 1)\r\n position: absolute\r\n\r\n &.slide-left-enter-from, &.slide-right-leave-to\r\n transform: translateX(100%)\r\n\r\n &.slide-right-enter-from, &.slide-left-leave-to\r\n transform: translateX(-100%)\r\n\r\n</style>","<template>\n<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7.5001 14.1665C7.50013 14.3313 7.54902 14.4924 7.64059 14.6294C7.73217 14.7664 7.8623 14.8732 8.01455 14.9362C8.1668 14.9993 8.33433 15.0158 8.49596 14.9836C8.65758 14.9515 8.80605 14.8722 8.9226 14.7557L13.0893 10.589C13.2455 10.4327 13.3333 10.2208 13.3333 9.99982C13.3333 9.77885 13.2455 9.56693 13.0893 9.41066L8.9226 5.24399C8.80605 5.12748 8.65758 5.04814 8.49596 5.016C8.33433 4.98386 8.1668 5.00037 8.01455 5.06342C7.8623 5.12648 7.73217 5.23327 7.6406 5.37027C7.54902 5.50728 7.50013 5.66836 7.5001 5.83316L7.5001 14.1665Z\" fill=\"currentColor\"/>\r\n</svg>\n</template>\n","<template>\r\n <div class=\"v-collapse\" :class=\"{ open }\">\r\n <slot name=\"activator\" :props=\"{ onClick, open }\">\r\n <div \r\n class=\"v-collapse__activator\" \r\n :class=\"{ open }\"\r\n @mousedown=\"onClick\" \r\n @mouseenter=\"onMouseEnter\"\r\n >\r\n <CollapseArrowIcon/>\r\n <div>{{ props.label }}</div>\r\n </div>\r\n </slot>\r\n <div \r\n class=\"v-collapse__content\" \r\n :class=\"{ 'v-transition': transition, withPadding: props.withPadding }\" \r\n :style=\"transition? { height: `${height}px` }: undefined\"\r\n >\r\n <div v-if=\"transition || open\" ref=\"innerRef\" class=\"v-collapse__content-inner\">\r\n <slot></slot>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { useEventListener } from '@vueuse/core';\r\nimport { nextTick, ref, watch } from 'vue';\r\nimport CollapseArrowIcon from './icons/CollapseArrowIcon.vue'\r\n\r\nconst props = defineProps<{ open?: boolean, label?: string, withPadding?: boolean }>()\r\nconst emit = defineEmits([ \"update:open\" ])\r\n\r\nconst height = ref(0)\r\n\r\nconst open = ref(props.open ?? false)\r\nconst transition = ref(false)\r\nconst innerRef = ref<HTMLElement>()\r\n\r\nlet hideTimeout: ReturnType<typeof setTimeout> | null = null\r\nconst setOpen = async (value: boolean) => {\r\n open.value = value\r\n if (hideTimeout !== null) {\r\n clearTimeout(hideTimeout)\r\n hideTimeout = null\r\n }\r\n\r\n if (open.value === false && innerRef.value) {\r\n height.value = innerRef.value!.clientHeight\r\n }\r\n \r\n transition.value = true\r\n await nextTick()\r\n await new Promise(res => requestAnimationFrame(res))\r\n\r\n if (open.value) {\r\n height.value = innerRef.value!.clientHeight\r\n } else {\r\n height.value = 0\r\n }\r\n \r\n hideTimeout = setTimeout(() => {\r\n transition.value = false\r\n }, 200)\r\n\r\n setTimeout(() => mouseMove = true, 0)\r\n emit(\"update:open\", open.value)\r\n}\r\n\r\nconst onClick = async () => {\r\n setOpen(!open.value)\r\n}\r\nwatch(() => props.open, (value) => {\r\n if (typeof value !== 'boolean' || open.value === value) return\r\n setOpen(value) \r\n})\r\n\r\nlet mouseMove = false\r\nuseEventListener(\"mousedown\", () => mouseMove = false)\r\n\r\nconst onMouseEnter = (e: MouseEvent) => {\r\n if (e.buttons > 0 && !mouseMove && !document.body.classList.contains('mousedrag')) {\r\n mouseMove = true\r\n onClick()\r\n }\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-collapse\r\n -webkit-user-drag: none\r\n\r\n.v-collapse__activator\r\n cursor: pointer\r\n user-select: none\r\n display: flex\r\n align-items: center\r\n gap: 4px\r\n height: 30px\r\n font-size: 14px\r\n padding-top: 6px\r\n box-sizing: border-box\r\n\r\n svg\r\n margin-left: -4px\r\n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1)\r\n\r\n &.open\r\n svg\r\n transform: rotate(90deg)\r\n\r\n.v-collapse__content\r\n overflow: hidden\r\n\r\n &.v-transition\r\n transition: height 0.2s cubic-bezier(0.4, 0, 0.2, 1)\r\n\r\n &.withPadding\r\n padding: 4px\r\n margin: -4px\r\n\r\n</style>","<template>\r\n <Teleport to=\"body\">\r\n <Transition>\r\n <div \r\n v-if=\"open\"\r\n v-bind=\"$attrs\"\r\n class=\"v-popover editor-component\" \r\n :class=\"[ isHorizontal? 'horizontal': 'vertical', props.fitAnchor && 'fit-anchor', props.class ]\"\r\n :style=\"style\"\r\n ref=\"popoverRef\"\r\n @mousedown.stop\r\n >\r\n <slot></slot>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n <slot name=\"activator\" :props=\"activatorProps\"></slot>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { computed, ref, watch } from 'vue';\r\nimport { onKeyDown, useEventListener, useResizeObserver, useVModel } from '@vueuse/core'\r\nimport { useMouseDownOutside } from 'vuesix/src/hooks/useClickOutside';\r\nimport { useKeyDownLayer } from 'vuesix/src/hooks/useKeyDownLayer';\r\n\r\nexport type Placement = \r\n \"top-start\" | \"top\" | \"top-end\" |\r\n \"right-start\" | \"right\" | \"right-end\" |\r\n \"bottom-start\" | \"bottom\" | \"bottom-end\" |\r\n \"left-start\" | \"left\" | \"left-end\"\r\n\r\nconst props = defineProps<{ \r\n open?: boolean, \r\n element?: HTMLElement | null,\r\n placement: Placement,\r\n offset?: number,\r\n fitAnchor?: boolean,\r\n class?: string,\r\n anchorPosition?: { x: number, y: number }\r\n}>()\r\n\r\ndefineOptions({\r\n inheritAttrs: false\r\n})\r\n\r\nconst emit = defineEmits([ \"update:open\" ])\r\n\r\nconst popoverRef = ref<HTMLDivElement>()\r\nconst position = ref<{ top: number, left: number, width?: number, height?: number }>({ top: 0, left: 0 })\r\nconst origin = ref(\"center\")\r\n\r\nconst open = useVModel(props, \"open\", emit, { passive: true })\r\nconst activatorElement = ref<HTMLElement>()\r\n\r\nconst clamp = (value: number, min: number, max: number) => {\r\n if (value < min) return min\r\n if (value > max) return max\r\n return value\r\n}\r\n\r\nconst calcPrimary = (pos: \"start\" | \"end\", start: number, end: number, size: number, min: number, max: number) => {\r\n const fitStart = start-size >= min\r\n const fitEnd = end + size <= max\r\n\r\n if ((!fitEnd || pos === \"start\") && fitStart) return start - size\r\n if ((!fitStart || pos === \"end\") && fitEnd) return end\r\n return pos === \"start\"? min: (max-size)\r\n}\r\n\r\nconst calcSub = (pos: string | undefined, start: number, end: number, size: number, min: number, max: number) => {\r\n if (pos === \"start\") return clamp(start, min, max-size)\r\n if (pos === \"end\") return clamp(end - size, min, max-size)\r\n\r\n return clamp((start+end)/2 - size/2, min, max-size)\r\n}\r\n\r\nconst calcOrigin = (start: number, end: number, point: number) => {\r\n return clamp(Math.round((point-start) / (end-start) * 100), 0, 100) + \"%\"\r\n}\r\n\r\nconst getRect = () => {\r\n if (props.anchorPosition) {\r\n return {\r\n top: props.anchorPosition.y, bottom: props.anchorPosition.y,\r\n left: props.anchorPosition.x, right: props.anchorPosition.x,\r\n width: 0, height: 0\r\n }\r\n }\r\n const element = props.element ?? activatorElement.value\r\n if (!element) return null\r\n return element.getBoundingClientRect()\r\n}\r\n\r\nconst isHorizontal = computed(() => props.placement.startsWith(\"left\") || props.placement.startsWith(\"right\"))\r\n\r\nconst margin = 8\r\nconst calcPosition = () => {\r\n if (!popoverRef.value) return\r\n const rect = getRect()\r\n if (!rect) return\r\n\r\n const placement = props.placement.split(\"-\")\r\n\r\n const offset = props.offset ?? 0\r\n const width = popoverRef.value.clientWidth\r\n const height = popoverRef.value.clientHeight\r\n\r\n if (placement[0] === \"top\" || placement[0] === \"bottom\") {\r\n const top = calcPrimary(placement[0] === \"top\"? \"start\": \"end\", rect.top-offset, rect.bottom+offset, height, margin, window.innerHeight - margin)\r\n if (props.fitAnchor) {\r\n position.value = { \r\n top, \r\n left: calcSub('start', rect.left, rect.right, rect.width, margin, window.innerWidth - margin),\r\n width: rect.width\r\n }\r\n } else {\r\n position.value = { top, left: calcSub(placement[1], rect.left, rect.right, width, margin, window.innerWidth - margin) }\r\n }\r\n } else {\r\n const left = calcPrimary(placement[0] === \"left\"? \"start\": \"end\", rect.left-offset, rect.right+offset, width, margin, window.innerWidth - margin)\r\n if (props.fitAnchor) {\r\n position.value = { \r\n left, \r\n top: calcSub('start', rect.top, rect.bottom, rect.height, margin, window.innerHeight - margin),\r\n height: rect.height\r\n }\r\n } else {\r\n position.value = { left, top: calcSub(placement[1], rect.top, rect.bottom, height, margin, window.innerHeight - margin) }\r\n }\r\n }\r\n origin.value = \r\n calcOrigin(position.value.left, position.value.left + width, rect.left + rect.width/2) +\r\n calcOrigin(position.value.top, position.value.top + height, rect.top + rect.height/2)\r\n}\r\n\r\nwatch([() => props.element, () => props.anchorPosition], () => {\r\n calcPosition()\r\n})\r\n\r\nuseResizeObserver(popoverRef, calcPosition)\r\nuseEventListener(window, \"resize\", calcPosition)\r\n\r\nconst close = () => {\r\n open.value = false\r\n}\r\nconst closeDelayed = () => {\r\n setTimeout(close, 0)\r\n}\r\n\r\nuseKeyDownLayer(\"Escape\", open, close)\r\nuseMouseDownOutside(open, closeDelayed, popoverRef)\r\n\r\nwatch(open, (open) => {\r\n if (!props.element) return\r\n if (open) {\r\n props.element.classList.add(\"popoverHover\")\r\n } else {\r\n props.element.classList.remove(\"popoverHover\")\r\n }\r\n})\r\n\r\nconst activatorProps = {\r\n onMousedown: (e: MouseEvent) => {\r\n open.value = !open.value\r\n if (open.value) {\r\n activatorElement.value = e.currentTarget as HTMLElement\r\n }\r\n },\r\n // onTouchstart: (e: TouchEvent) => {\r\n // open.value = !open.value\r\n // if (open.value) {\r\n // activatorElement.value = e.currentTarget as HTMLElement\r\n // }\r\n // },\r\n onKeydown(e: KeyboardEvent) {\r\n if (e.code === \"Enter\") {\r\n open.value = !open.value\r\n if (open.value) {\r\n activatorElement.value = e.currentTarget as HTMLElement\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst style = computed(() => {\r\n return { \r\n left: position.value.left + 'px', \r\n top: position.value.top +'px', \r\n width: position.value.width? (position.value.width + 'px'): undefined,\r\n height: position.value.height? (position.value.height + 'px'): undefined,\r\n transformOrigin: origin.value \r\n }\r\n})\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-popover\r\n position: fixed\r\n background-color: var(--popover-color)\r\n box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2)\r\n border-radius: 8px\r\n min-width: 40px\r\n min-height: 40px\r\n transform: none\r\n z-index: 2000\r\n box-sizing: border-box\r\n width: fit-content\r\n\r\n &.v-enter-active, &.v-leave-active \r\n transition: opacity 0.12s, transform 0.12s cubic-bezier(0.4, 0, 0.2, 1)\r\n\r\n &.v-enter-from, &.v-leave-to\r\n opacity: 0\r\n\r\n &.vertical\r\n transform: scale(0.9, 0.7)\r\n\r\n &.fit-anchor\r\n transform: scale(1, 0.7)\r\n\r\n &.horizontal\r\n transform: scale(0.7, 0.9)\r\n\r\n &.fit-anchor\r\n transform: scale(0.7, 1)\r\n\r\n</style>","<template>\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M14.364 5.293C14.1764 5.10553 13.9221 5.00021 13.657 5.00021C13.3918 5.00021 13.1375 5.10553 12.95 5.293L7.99995 10.243L3.04995 5.293C2.86135 5.11084 2.60875 5.01005 2.34655 5.01232C2.08435 5.0146 1.83354 5.11977 1.64813 5.30518C1.46272 5.49059 1.35756 5.7414 1.35528 6.0036C1.353 6.26579 1.45379 6.5184 1.63595 6.707L7.29295 12.364C7.48048 12.5515 7.73479 12.6568 7.99995 12.6568C8.26512 12.6568 8.51942 12.5515 8.70695 12.364L14.364 6.707C14.5514 6.51947 14.6567 6.26516 14.6567 6C14.6567 5.73483 14.5514 5.48053 14.364 5.293Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\r\n <button class=\"v-icon-button\">\r\n <slot></slot>\r\n </button>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-icon-button\r\n background: none\r\n border: none\r\n color: var(--icon-color)\r\n display: flex\r\n align-items: center\r\n justify-content: center\r\n width: 28px\r\n height: 28px\r\n border-radius: 9999px\r\n cursor: pointer\r\n padding: 0\r\n outline: none\r\n flex-shrink: 0\r\n\r\n &:hover\r\n background-color: var(--hover-color)\r\n\r\n</style>","<template>\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M9.31382 7.9L12.8488 4.364C12.9443 4.27176 13.0205 4.16141 13.0729 4.03941C13.1253 3.9174 13.1529 3.78618 13.1541 3.6534C13.1552 3.52062 13.1299 3.38894 13.0796 3.26605C13.0294 3.14315 12.9551 3.0315 12.8612 2.93761C12.7673 2.84371 12.6557 2.76946 12.5328 2.71918C12.4099 2.6689 12.2782 2.6436 12.1454 2.64475C12.0126 2.64591 11.8814 2.67349 11.7594 2.7259C11.6374 2.77831 11.5271 2.85449 11.4348 2.95L7.89882 6.485L4.36382 2.95C4.27157 2.85449 4.16123 2.77831 4.03922 2.7259C3.91722 2.67349 3.786 2.64591 3.65322 2.64475C3.52044 2.6436 3.38876 2.6689 3.26587 2.71918C3.14297 2.76946 3.03132 2.84371 2.93742 2.93761C2.84353 3.0315 2.76928 3.14315 2.719 3.26605C2.66872 3.38894 2.64342 3.52062 2.64457 3.6534C2.64572 3.78618 2.67331 3.9174 2.72572 4.03941C2.77813 4.16141 2.85431 4.27176 2.94982 4.364L6.48482 7.899L2.94982 11.435C2.85431 11.5273 2.77813 11.6376 2.72572 11.7596C2.67331 11.8816 2.64572 12.0128 2.64457 12.1456C2.64342 12.2784 2.66872 12.4101 2.719 12.533C2.76928 12.6559 2.84353 12.7675 2.93742 12.8614C3.03132 12.9553 3.14297 13.0295 3.26587 13.0798C3.38876 13.1301 3.52044 13.1554 3.65322 13.1543C3.786 13.1531 3.91722 13.1255 4.03922 13.0731C4.16123 13.0207 4.27157 12.9445 4.36382 12.849L7.89882 9.314L11.4348 12.849C11.5271 12.9445 11.6374 13.0207 11.7594 13.0731C11.8814 13.1255 12.0126 13.1531 12.1454 13.1543C12.2782 13.1554 12.4099 13.1301 12.5328 13.0798C12.6557 13.0295 12.7673 12.9553 12.8612 12.8614C12.9551 12.7675 13.0294 12.6559 13.0796 12.533C13.1299 12.4101 13.1552 12.2784 13.1541 12.1456C13.1529 12.0128 13.1253 11.8816 13.0729 11.7596C13.0205 11.6376 12.9443 11.5273 12.8488 11.435L9.31382 7.9Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\r\n <VFormControl outline class=\"v-select\" :label=\"props.label\" :error=\"props.error\" :disabled=\"props.disabled\" :required=\"props.required\">\r\n <VPopover v-model:open=\"opened\" placement=\"bottom\" fit-anchor :offset=\"8\">\r\n <template #activator=\"{ props: activatorProps }\">\r\n <button class=\"v-select__activator\" :class=\"{ opened }\" v-bind=\"activatorProps\">\r\n <div v-if=\"currentItem\">{{ currentItem.title }}</div>\r\n <div v-else class=\"v-select__placeholder\">{{ props.placeholder ?? 'Выберите значение' }}</div>\r\n <ArrowDownIcon/>\r\n </button>\r\n <div class=\"v-select__actions\">\r\n <slot></slot>\r\n <VIconButton v-if=\"nullable && model\" title=\"Очистить значение\" class=\"v-select__delete-button\" @click=\"resetValue\">\r\n <CloseMinIcon/>\r\n </VIconButton>\r\n </div>\r\n </template>\r\n <div class=\"v-select__menu\">\r\n <template v-for=\"item in items\">\r\n <div v-if=\"item === ''\" class=\"v-select__divider\"></div>\r\n <div v-else-if=\"typeof item === 'string'\" class=\"group-title\">{{ item }}</div>\r\n <button v-else :class=\"{ active: item.id === model }\" @click=\"onItemClick(item)\" >\r\n <slot name=\"item\" :item=\"item\">\r\n {{ item.title }}\r\n </slot>\r\n </button>\r\n </template>\r\n </div>\r\n </VPopover>\r\n </VFormControl>\r\n</template>\r\n\r\n<script lang=\"ts\" setup generic=\"T extends { id: number | string, title?: string }\">\r\nimport { computed, ref } from 'vue';\r\nimport VFormControl, { VFormControlProps } from './VFormControl.vue';\r\nimport VPopover from './VPopover.vue';\r\nimport ArrowDownIcon from './icons/ArrowDownIcon.vue'\r\nimport VIconButton from './VIconButton.vue'\r\nimport CloseMinIcon from './icons/CloseMinIcon.vue';\r\n\r\nconst props = defineProps<{ \r\n items: (T | string)[], \r\n placeholder?: string,\r\n nullable?: boolean,\r\n visualValue?: string,\r\n} & VFormControlProps>()\r\n\r\nconst model = defineModel<T['id'] | null>({ default: null })\r\n\r\nconst currentItem = computed<T | null>(() => {\r\n if (model.value === null) return null\r\n return props.items.find(item => typeof item !== \"string\" && item.id === model.value) as T ?? null\r\n})\r\n\r\nconst items = computed(() => {\r\n return props.items\r\n})\r\n\r\nconst opened = ref(false)\r\nconst onItemClick = (item: T) => {\r\n model.value = item.id\r\n opened.value = false\r\n}\r\n\r\nconst resetValue = () => {\r\n model.value = null\r\n opened.value = false\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-select\r\n .v-form-control__outline\r\n height: 40px\r\n\r\n.v-select__actions\r\n position: absolute\r\n right: 0\r\n display: flex\r\n align-items: center\r\n right: 28px\r\n bottom: 9px\r\n gap: 2px\r\n height: 20px\r\n\r\n.v-select__delete-button\r\n svg\r\n width: 10px\r\n height: 10px\r\n\r\n.v-select__placeholder\r\n color: var(--text-secondary-color)\r\n\r\n.v-select__activator\r\n background: none\r\n border: none\r\n display: flex\r\n align-items: center\r\n padding: 0 12px\r\n width: 100%\r\n color: var(--text-color)\r\n text-align: left\r\n cursor: pointer\r\n outline: none\r\n &>div\r\n flex: 1 1 auto\r\n\r\n svg\r\n margin-right: -2px\r\n color: var(--icon-color)\r\n width: 12px\r\n pointer-events: none\r\n\r\n &.opened\r\n svg\r\n transform: rotate(180deg)\r\n\r\n.v-select__menu\r\n display: flex\r\n flex-direction: column\r\n padding: 6px\r\n\r\n &>button\r\n background: none\r\n border: none\r\n color: var(--text-color-alt)\r\n height: 32px\r\n display: flex\r\n align-items: center\r\n padding: 0 8px\r\n cursor: pointer\r\n font-weight: 500\r\n border-radius: 6px\r\n\r\n &.active\r\n color: var(--text-color)\r\n \r\n &:hover\r\n background-color: var(--hover-color)\r\n\r\n .group-title\r\n padding: 0 8px\r\n font-size: 13px\r\n color: var(--text-secondary-color)\r\n padding-top: 4px\r\n\r\n .nullable-item\r\n color: var(--text-secondary-color)\r\n\r\n\r\n.v-select__divider\r\n border-bottom: 1px solid var(--border-color)\r\n margin: 4px 8px\r\n\r\n</style>","<template>\r\n <div class=\"json-editor__array\">\r\n <VCollapse :label=\"label\" :open=\"props.expanded\">\r\n <VInput label=\"Количество элементов\" v-model=\"length\" type=\"number\"/>\r\n <JsonEditor \r\n v-for=\"index in length\"\r\n :key=\"index\"\r\n :schema=\"props.schema.items\" \r\n :name=\"`${props.schema.itemName ?? 'Элемент'} ${index}`\"\r\n v-model=\"tempArray[index-1]\" \r\n :expanded=\"childExpanded\"\r\n @edit=\"emit('edit', join(index-1, $event))\"\r\n />\r\n </VCollapse>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { computed, ref, watch } from 'vue';\r\nimport JsonEditor, { join } from './JsonEditor.vue';\r\nimport VInput from './VInput.vue';\r\nimport VCollapse from './VCollapse.vue';\r\nimport { getDefaultValue } from '../utils/passDefaultValue'\r\n\r\nconst props = defineProps<{\r\n label?: string,\r\n schema: any,\r\n modelValue?: any,\r\n expanded?: boolean\r\n}>()\r\n\r\nconst emit = defineEmits([ \"update:modelValue\", \"edit\" ])\r\n\r\nconst childExpanded = props.schema.items?.type === 'object' && Object.keys(props.schema.items.properties).length < 2\r\n\r\nconst length = ref(0)\r\nconst tempArray = ref<any[]>([])\r\n\r\nif (props.schema.type === 'array' && props.modelValue) {\r\n length.value = props.modelValue.length ?? 0\r\n tempArray.value = [ ...props.modelValue ]\r\n}\r\n\r\nlet ignoreUpdate = false\r\nwatch(tempArray, () => {\r\n emit(\"update:modelValue\", tempArray.value.slice(0, length.value))\r\n}, { deep: true })\r\n\r\nwatch(length, (length) => {\r\n for (let i = tempArray.value.length; i < length; i++) {\r\n ignoreUpdate = true\r\n tempArray.value[i] = props.schema.items? getDefaultValue(props.schema.items): null\r\n }\r\n\r\n emit(\"update:modelValue\", tempArray.value.slice(0, length))\r\n})\r\n\r\nconst label = computed(() => {\r\n return `${props.label} (${length.value})`\r\n})\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.json-editor__array\r\n display: flex\r\n flex-direction: column\r\n gap: 8px\r\n\r\n &>.v-collapse>.v-collapse__content>.v-collapse__content-inner>.v-form-control\r\n margin-top: 6px\r\n\r\n</style>","<template>\r\n<svg width=\"46\" height=\"28\" viewBox=\"0 0 46 28\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n<mask id=\"mask0_1044_6\" style=\"mask-type:luminance\" maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"46\" height=\"28\">\r\n<path d=\"M45.5 0H0.5V28H45.5V0Z\" fill=\"white\"/>\r\n</mask>\r\n<g mask=\"url(#mask0_1044_6)\">\r\n<path d=\"M23.5 27.8537C35.9264 27.8537 46 25.6664 46 22.9683C46 20.2702 35.9264 18.083 23.5 18.083C11.0736 18.083 1 20.2702 1 22.9683C1 25.6664 11.0736 27.8537 23.5 27.8537Z\" fill=\"#D7D7D7\"/>\r\n<path d=\"M39.6719 9.5459L32.538 1.51859C32.1955 0.971432 31.6956 0.640625 31.169 0.640625H15.831C15.3044 0.640625 14.8045 0.971432 14.462 1.51789L7.32812 9.5466V15.9946H39.6719V9.5459Z\" stroke=\"#A0A0A0\" stroke-width=\"0.703125\"/>\r\n<path d=\"M30.2591 11.7594C30.2591 10.6393 30.958 9.71457 31.825 9.71387H39.6719V22.3718C39.6719 23.8534 38.7437 25.0678 37.5977 25.0678H9.40234C8.25625 25.0678 7.32812 23.8527 7.32812 22.3718V9.71387H15.175C16.042 9.71387 16.7409 10.6372 16.7409 11.7573V11.7727C16.7409 12.8928 17.4475 13.7973 18.3138 13.7973H28.6862C29.5525 13.7973 30.2591 12.8845 30.2591 11.7643V11.7594Z\" fill=\"#FAFAFA\" stroke=\"#A0A0A0\" stroke-width=\"0.703125\"/>\r\n</g>\r\n</svg>\r\n</template>\r\n\r\n","<template>\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M14 18C14 18.5304 13.7893 19.0391 13.4142 19.4142C13.0391 19.7893 12.5304 20 12 20C11.4696 20 10.9609 19.7893 10.5858 19.4142C10.2107 19.0391 10 18.5304 10 18C10 17.4696 10.2107 16.9609 10.5858 16.5858C10.9609 16.2107 11.4696 16 12 16C12.5304 16 13.0391 16.2107 13.4142 16.5858C13.7893 16.9609 14 17.4696 14 18ZM14 12C14 12.5304 13.7893 13.0391 13.4142 13.4142C13.0391 13.7893 12.5304 14 12 14C11.4696 14 10.9609 13.7893 10.5858 13.4142C10.2107 13.0391 10 12.5304 10 12C10 11.4696 10.2107 10.9609 10.5858 10.5858C10.9609 10.2107 11.4696 10 12 10C12.5304 10 13.0391 10.2107 13.4142 10.5858C13.7893 10.9609 14 11.4696 14 12ZM12 8C12.5304 8 13.0391 7.78929 13.4142 7.41421C13.7893 7.03914 14 6.53043 14 6C14 5.46957 13.7893 4.96086 13.4142 4.58579C13.0391 4.21071 12.5304 4 12 4C11.4696 4 10.9609 4.21071 10.5858 4.58579C10.2107 4.96086 10 5.46957 10 6C10 6.53043 10.2107 7.03914 10.5858 7.41421C10.9609 7.78929 11.4696 8 12 8Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\r\n <component :is=\"component ?? 'button'\" class=\"mech-v-button\" :class=\"{ disabled, flat, outline, large }\">\r\n <slot></slot>\r\n </component>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\n\r\nconst props = defineProps<{ component?: string, disabled?: boolean, flat?: boolean, outline?: boolean, large?: boolean }>()\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n\r\n.mech-v-button\r\n background-color: var(--button-color)\r\n color: var(--button-text-color)\r\n height: 36px\r\n font-weight: 700\r\n border-radius: 9999px\r\n font-size: 13px\r\n padding: 0 28px\r\n text-decoration: none\r\n display: flex\r\n justify-content: center\r\n align-items: center\r\n border: none\r\n gap: 6px\r\n cursor: pointer\r\n\r\n &:hover\r\n background-color: var(--button-color-hover)\r\n \r\n &:active \r\n background-color: var(--button-color-pressed)\r\n\r\n &.disabled\r\n opacity: 0.5\r\n pointer-events: none\r\n\r\n &.flat\r\n background: none\r\n color: var(--text-color)\r\n padding: 0 20px\r\n &.large\r\n padding: 0 24px\r\n &:hover\r\n background-color: var(--hover-color)\r\n\r\n &.outline\r\n background: none\r\n border: 1px solid var(--button-color)\r\n color: var(--button-color)\r\n\r\n &:hover\r\n border-color: var(--button-color-hover)\r\n color: var(--button-color-hover)\r\n\r\n &:active\r\n border-color: var(--button-color-pressed)\r\n color: var(--button-color-pressed)\r\n \r\n &.large\r\n height: 44px\r\n font-size: 15px\r\n border-radius: 22px\r\n padding: 0 32px\r\n font-weight: 500\r\n font-family: 'RF Dewi', sans-serif\r\n\r\n\r\n &:focus-visible\r\n box-shadow: 0 0 0 4px #0D6EFD40\r\n \r\n &.color-red.outline\r\n border-color: var(--error-color)\r\n color: var(--error-color)\r\n\r\n svg\r\n max-width: 20px\r\n max-height: 20px\r\n\r\n</style>","<template>\r\n <slot name=\"activator\" :props=\"activatorProps\"></slot>\r\n <VPopover\r\n v-model:open=\"open\" \r\n :element=\"activatorElement\" \r\n :anchorPosition=\"props.anchorPosition\"\r\n :placement=\"props.placement ?? 'bottom-start'\" \r\n :offset=\"offset\" \r\n :fitAnchor=\"props.fitAnchor\"\r\n class=\"v-context-menu\"\r\n v-bind=\"$attrs\"\r\n >\r\n <VButton \r\n v-for=\"item in items\" \r\n v-bind=\"item.props\"\r\n class=\"v-context-menu__item\" \r\n @mouseenter=\"onItemHover($event, item)\"\r\n @click=\"onItemClick(item)\"\r\n >\r\n {{ item.title }}\r\n <ChevronRightIcon v-if=\"!!item.children\" class=\"v-context-menu__item-more-icon\"/>\r\n </VButton>\r\n </VPopover>\r\n <VContextMenu \r\n v-if=\"hasChildren\" \r\n :open=\"!!menuChildrenElement\" \r\n :items=\"menuChildrenItems\" \r\n :element=\"menuChildrenElement\" \r\n placement=\"right-start\"\r\n style=\"margin-top: -8px; margin-left: -1px\"\r\n @itemclick=\"onChildrenClick\"\r\n />\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport VPopover, { Placement } from './VPopover.vue';\r\nimport { computed, reactive, ref, shallowRef, watch } from 'vue';\r\nimport VButton from './VButton.vue';\r\nimport ChevronRightIcon from './icons/ChevronRightIcon.vue';\r\n\r\ntype NullableItem = (ContextMenuItem | undefined | null | false)\r\n\r\nconst props = defineProps<{\r\n element?: HTMLElement | null,\r\n placement?: Placement,\r\n anchorPosition?: { x: number, y: number },\r\n offset?: number,\r\n fitAnchor?: boolean,\r\n items: NullableItem[] | (() => NullableItem[]),\r\n}>()\r\n\r\nconst emit = defineEmits([ \"itemclick\" ])\r\n\r\nconst activatorElement = ref<HTMLElement | null>(null)\r\nwatch(() => props.element, (element) => {\r\n activatorElement.value = element ?? null\r\n}, { immediate: true })\r\n\r\nconst open = defineModel<boolean>(\"open\", { default: false })\r\n\r\nconst items = shallowRef<ContextMenuItem[]>([])\r\n\r\nwatch(open, (open) => {\r\n if (!open) return\r\n const _items = typeof props.items === \"function\"? props.items(): props.items\r\n items.value = _items.filter(item => !!item) as ContextMenuItem[]\r\n})\r\n\r\nconst activatorProps = {\r\n onClick: (e: MouseEvent) => {\r\n open.value = true\r\n activatorElement.value = e.currentTarget as HTMLElement\r\n }\r\n}\r\n\r\nconst onItemClick = (item: ContextMenuItem) => {\r\n if (item.onClick) {\r\n item.onClick()\r\n open.value = false\r\n emit('itemclick')\r\n }\r\n if (item.props?.to || item.props?.href) {\r\n open.value = false\r\n emit('itemclick')\r\n }\r\n}\r\n\r\nconst hasChildren = computed(() => items.value.find(item => !!item.children))\r\n\r\nlet openTimeout: ReturnType<typeof setTimeout> | null = null\r\nconst menuChildrenItems = ref<ContextMenuItem[]>([])\r\nconst menuChildrenElement = ref<HTMLElement | null>(null)\r\nconst onItemHover = (e: MouseEvent, item: ContextMenuItem,) => {\r\n if (openTimeout) {\r\n clearTimeout(openTimeout)\r\n openTimeout = null\r\n }\r\n if (!item.children && menuChildrenElement.value !== null) {\r\n menuChildrenElement.value.classList.remove(\"hover\")\r\n openTimeout = setTimeout(() => {\r\n menuChildrenElement.value = null\r\n }, 200)\r\n return\r\n }\r\n if (item.children) {\r\n let target = e.currentTarget as HTMLElement\r\n openTimeout = setTimeout(() => {\r\n menuChildrenElement.value = target\r\n menuChildrenElement.value.classList.add(\"hover\")\r\n menuChildrenItems.value = item.children!\r\n }, 150)\r\n }\r\n}\r\nwatch(open, (open) => {\r\n if (open === false) {\r\n if (openTimeout) {\r\n clearTimeout(openTimeout)\r\n openTimeout = null\r\n }\r\n menuChildrenElement.value?.classList.remove(\"hover\")\r\n menuChildrenElement.value = null\r\n }\r\n})\r\n\r\nconst onChildrenClick = () => {\r\n open.value = false\r\n}\r\n\r\ndefineOptions({\r\n inheritAttrs: false\r\n})\r\n\r\n</script>\r\n\r\n<script lang=\"ts\">\r\nexport type ContextMenuItem = {\r\n title?: string,\r\n onClick?: () => void,\r\n props?: Record<string, any>,\r\n children?: ContextMenuItem[],\r\n}\r\n\r\nexport type NullableItem = (ContextMenuItem | undefined | null | false)\r\n\r\nexport const useContextMenu = <T extends Array<any>>(creator: (...args: T) => NullableItem[]) => {\r\n\r\n let target: HTMLElement | null = null\r\n const props = reactive({\r\n items: [] as NullableItem[],\r\n open: false,\r\n anchorPosition: { x: 0, y: 0 },\r\n \"onUpdate:open\": (value: boolean) => {\r\n if (value === false && target !== null) {\r\n target.removeAttribute(\"data-popover-target\")\r\n target = null\r\n }\r\n props.open = value\r\n }\r\n })\r\n \r\n const open = (e: MouseEvent, ...args: T) => {\r\n e.preventDefault()\r\n props.items = creator(...args)\r\n props.anchorPosition = { x: e.clientX, y: e.clientY }\r\n props.open = true\r\n\r\n if (target !== null) {\r\n target.removeAttribute(\"data-popover-target\")\r\n target = null\r\n }\r\n target = e.currentTarget as HTMLElement\r\n target.setAttribute(\"data-popover-target\", \"true\")\r\n }\r\n\r\n return {\r\n props,\r\n open\r\n }\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n\r\n.v-context-menu\r\n padding: 6px\r\n display: flex\r\n flex-direction: column\r\n\r\n.v-context-menu__item\r\n height: 32px\r\n display: flex\r\n align-items: center\r\n background: none\r\n border: none\r\n outline: none\r\n cursor: pointer\r\n padding: 0 8px\r\n cursor: pointer\r\n font-weight: 500\r\n border-radius: 6px \r\n padding-right: 24px\r\n text-decoration: none\r\n min-width: 180px\r\n box-sizing: border-box\r\n text-align: start\r\n font-weight: 500\r\n justify-content: flex-start\r\n color: var(--text-color-alt)\r\n\r\n\r\n &:hover, &.hover\r\n background-color: var(--hover-color)\r\n\r\n.v-context-menu__item-more-icon\r\n margin-left: auto\r\n height: 10px\r\n width: 10px\r\n margin-right: -14px\r\n\r\n</style>","<template>\r\n <Teleport to=\"body\">\r\n <Transition>\r\n <div v-if=\"dialogStore.isOpen.value\" class=\"v-dialog-backdrop editor-component\" @mousedown=\"onMouseDown\" @mouseup=\"onMouseUp\">\r\n <component \r\n v-for=\"(dialog, index) in dialogStore.dialogHistory\" \r\n v-show=\"index === dialogStore.dialogHistory.length-1\" \r\n class=\"bd-scale scroll\"\r\n role=\"dialog\"\r\n :is=\"dialog.dialog\" \r\n v-bind=\"dialog.props\"\r\n >\r\n\r\n </component>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { useKeyDownLayer } from 'vuesix/src/hooks/useKeyDownLayer';\r\nimport { inject, Plugin, Ref, watch } from 'vue';\r\n\r\nconst dialogStore = inject(\"dialogStore\") as DialogStore & { isOpen: Ref<boolean>, dialogHistory: any[] }\r\n\r\nlet mouseDown = false\r\nconst onMouseDown = (e: MouseEvent) => {\r\n mouseDown = e.target === e.currentTarget\r\n}\r\nconst onMouseUp = (e: MouseEvent) => {\r\n if (!mouseDown || e.target !== e.currentTarget) {\r\n mouseDown = false\r\n return\r\n }\r\n dialogStore.back()\r\n}\r\n\r\nuseKeyDownLayer(\"Escape\", dialogStore.isOpen, () => {\r\n dialogStore.back()\r\n})\r\n\r\nwatch(dialogStore.isOpen, (isOpen) => {\r\n if (isOpen) {\r\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\r\n document.body.style.overflowY = \"hidden\"\r\n document.body.style.paddingRight = scrollbarWidth+\"px\"\r\n document.getElementById(\"app\")?.setAttribute(\"inert\", \"\")\r\n } else {\r\n document.body.style.paddingRight = \"\"\r\n document.body.style.overflowY = \"auto\"\r\n document.getElementById(\"app\")?.removeAttribute(\"inert\")\r\n }\r\n})\r\n\r\n</script>\r\n\r\n<script lang=\"ts\">\r\nimport { computed, DefineComponent, ExtractPropTypes, shallowReactive } from \"vue\";\r\n\r\ntype OpenDialog = <T>(_dialog: DefineComponent<T, {}, any>, props?: ExtractPropTypes<T>) => void\r\n\r\nexport type DialogStore = { open: OpenDialog, close: () => void, back: () => void }\r\n\r\nexport const createDialogSystem = (): Plugin => {\r\n return { \r\n install: (app) => {\r\n const dialogHistory = shallowReactive<{ dialog: DefineComponent<any, {}, any>, props: any }[]>([])\r\n\r\n const open: OpenDialog = (dialog, props) => {\r\n dialogHistory.push({ dialog: dialog as any, props })\r\n }\r\n\r\n const close = () => {\r\n dialogHistory.length = 0\r\n }\r\n\r\n const back = () => {\r\n if (dialogHistory.length === 0) return\r\n dialogHistory.pop()\r\n }\r\n\r\n const dialog = computed(() => {\r\n if (dialogHistory.length === 0) return { dialog: null, props: {} }\r\n return dialogHistory[dialogHistory.length-1]\r\n })\r\n\r\n const isOpen = computed(() => dialogHistory.length > 0)\r\n\r\n app.provide(\"dialogStore\", { open, close, back, dialogHistory, dialog, isOpen })\r\n }\r\n }\r\n}\r\n\r\nexport const useDialog = () => inject(\"dialogStore\") as DialogStore\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-dialog-backdrop\r\n position: fixed\r\n top: 0\r\n bottom: 0\r\n width: 100vw\r\n background-color: rgba(0, 0, 0, 0.75)\r\n display: flex\r\n align-items: center\r\n flex-direction: column\r\n justify-content: flex-start\r\n padding-top: 12vh\r\n z-index: 2000\r\n box-sizing: border-box\r\n\r\n &.v-enter-active, &.v-leave-active \r\n transition: opacity 0.14s ease\r\n .v-dialog\r\n transition: transform 0.1s cubic-bezier(0, 0, 0.2, 1)\r\n\r\n &.v-enter-from, &.v-leave-to \r\n opacity: 0\r\n\r\n .v-dialog\r\n transform: scale(0.8)\r\n\r\n</style>","<template>\r\n <component :is=\"props.component ?? 'div'\" class=\"v-dialog scroll editor-component\" role=\"dialog\">\r\n <div v-if=\"slots.header\" class=\"v-dialog__header heading\">\r\n <slot name=\"header\"></slot>\r\n <VIconButton role=\"button\" class=\"close-icon\" @click=\"dialog.close\">\r\n <CloseMinIcon/>\r\n </VIconButton>\r\n </div>\r\n <div class=\"v-dialog__content\" :class=\"[props['content:class'], slots.actions? '': 'bottom-padding']\" >\r\n <slot></slot>\r\n </div>\r\n <div v-if=\"slots.actions\" class=\"v-dialog__actions\">\r\n <slot name=\"actions\"></slot>\r\n </div>\r\n </component>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { useSlots } from 'vue';\r\nimport { useDialog } from './VDialogProvider.vue';\r\nimport VIconButton from './VIconButton.vue';\r\nimport CloseMinIcon from './icons/CloseMinIcon.vue';\r\n\r\nconst slots = useSlots()\r\n\r\nconst props = defineProps<{ \"content:class\"?: string, component?: string }>()\r\n\r\nconst dialog = useDialog()\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-dialog\r\n background-color: var(--paper-color)\r\n border-radius: 16px\r\n position: relative\r\n max-height: 86vh\r\n max-width: 94vw\r\n --padding: 0 24px\r\n min-width: 250px\r\n overflow-y: auto\r\n\r\n &.standart\r\n width: 650px\r\n\r\n @media(max-width: 800px)\r\n position: fixed\r\n max-width: unset\r\n max-height: unset\r\n top: 0\r\n bottom: 0\r\n right: 0\r\n left: 0\r\n max-height: 100%\r\n max-width: 100%\r\n margin: 0\r\n border-radius: 0\r\n\r\n &.standart\r\n width: 100%\r\n\r\n.v-dialog__header\r\n font-size: 18px\r\n // font-weight: 700\r\n padding: var(--padding)\r\n display: flex\r\n align-items: center\r\n height: 60px\r\n border-bottom: 1px solid var(--border-color)\r\n position: relative\r\n width: 100%\r\n box-sizing: border-box\r\n gap: 8px\r\n\r\n .close-icon\r\n margin-right: -8px\r\n width: 32px\r\n height: 32px\r\n margin-left: auto\r\n \r\n.v-dialog__content\r\n padding: var(--padding)\r\n padding-top: 16px\r\n padding-bottom: 4px\r\n\r\n &.bottom-padding\r\n padding-bottom: 16px\r\n\r\n.v-dialog__actions\r\n padding: var(--padding)\r\n padding-top: 0\r\n display: flex\r\n justify-content: flex-end\r\n align-items: center\r\n height: 82px\r\n gap: 8px\r\n\r\n</style>","<template>\r\n <VDialog style=\"width: 900px\">\r\n <template #header>Изображения проекта</template>\r\n <div v-if=\"data\" class=\"project-images__grid\">\r\n <button v-for=\"item in data\" @click=\"openImage(item)\">\r\n <img :src=\"item.previewSrc ?? item.src\" />\r\n </button>\r\n </div>\r\n </VDialog>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport VDialog from '../VDialog.vue';\r\nimport { useRequest } from 'vuesix'\r\nimport { useDialog } from '../VDialogProvider.vue';\r\n\r\nconst props = defineProps<{ fileRequest: () => Promise<any>, onOpenImage: (image: any) => void }>()\r\nconst { data } = useRequest(props.fileRequest)\r\n\r\nconst dialog = useDialog()\r\n\r\nconst openImage = (item: any) => {\r\n props.onOpenImage(item)\r\n dialog.back()\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.project-images__grid\r\n display: grid\r\n grid-template-columns: repeat(6, 1fr)\r\n min-height: 200px\r\n \r\n button\r\n overflow: hidden\r\n border: none\r\n background: none\r\n position: relative\r\n cursor: pointer\r\n min-height: 60px\r\n\r\n img\r\n width: 100%\r\n height: 100%\r\n object-fit: contain\r\n border-radius: 8px\r\n display: block\r\n\r\n button:hover\r\n &:after\r\n content: \"\"\r\n position: absolute\r\n inset: 0\r\n background-color: rgba(255, 255, 255, 0.25)\r\n \r\n\r\n</style>","<template>\n <VFormControl \n class=\"v-image-uploader\" \n :class=\"{ drag }\"\n :error=\"error\" \n :label=\"label\" \n :required=\"required\" \n :disabled=\"disabled\" \n outline\n @drop=\"onDrop\"\n @dragover=\"onDragOver\" \n @dragleave=\"onDragLeave\"\n >\n <template v-if=\"drag\">\n <div class=\"v-image-uploader__drag-label\">Отпустите файл здесь</div>\n </template>\n <template v-else-if=\"!props.modelValue || props.modelValue.src === defaultImageSrc\">\n <EmptyFileIcon/>\n <div>\n <a @click=\"fileDialog.open()\">Загрузите изображение</a>\n <br/>или перетащите сюда\n <VContextMenu v-if=\"contextMenuItems.length > 0\" :items=\"contextMenuItems\" placement=\"bottom-end\">\n <template #activator=\"{ props }\">\n <VIconButton v-bind=\"props\" class=\"v-image-uploader__more-button\"><MoreIcon/></VIconButton>\n </template>\n </VContextMenu>\n </div>\n </template>\n <template v-else>\n <div class=\"v-image-uploader__image-preview\" >\n <img :src=\"props.modelValue.previewSrc ?? props.modelValue.src\" alt=\"Preview Image\" />\n <VIconButton class=\"v-image-uploader__delete-button\" @click=\"removeImage\"><CloseMinIcon/></VIconButton>\n </div>\n <div class=\"v-image-uploader__image-info\">\n <div>{{ props.modelValue.name }}</div>\n </div>\n </template>\n </VFormControl>\n</template>\n\n<script lang=\"ts\" setup>\nimport { inject, ref } from 'vue';\nimport VFormControl, { VFormControlProps } from './VFormControl.vue';\nimport EmptyFileIcon from './icons/EmptyFileIcon.vue'\nimport CloseMinIcon from './icons/CloseMinIcon.vue'\nimport { useFileDialog } from '@vueuse/core'\nimport { defaultImageSrc, getDefaultValue } from '../utils/passDefaultValue';\nimport VIconButton from './VIconButton.vue';\nimport MoreIcon from './icons/MoreIcon.vue';\nimport VContextMenu from './VContextMenu.vue';\nimport { useDialog } from './VDialogProvider.vue';\nimport ProjectImagesDialog from './dialogs/ProjectImagesDialog.vue'\n\nconst props = defineProps<{ \n accept?: string,\n schema?: any,\n modelValue?: FileInfo | null,\n} & VFormControlProps>()\nconst emit = defineEmits([ \"update:modelValue\" ])\n\nconst fileUploader = inject(\"fileUploader\") as (file: File) => Promise<any>\nconst fileRequest = inject(\"fileRequest\", null) as (() => Promise<any>) | null\n\nconst addFile = async (file: File) => {\n emit(\"update:modelValue\", { src: URL.createObjectURL(file), file, name: file.name })\n if (fileUploader) {\n const resp = await fileUploader(file)\n emit(\"update:modelValue\", { src: resp.src, previewSrc: resp.previewSrc, name: resp.name })\n }\n // emit(\"loadFile\", file)\n}\n\nconst drag = ref(false)\nconst onDragOver = (e: DragEvent) => {\n if (e.dataTransfer?.types?.[0]?.startsWith('text')) return\n e.preventDefault()\n drag.value = true\n}\n\nconst onDragLeave = (e: DragEvent) => {\n if (e.relatedTarget === e.currentTarget || (e.relatedTarget as HTMLElement)?.parentElement === e.currentTarget) return\n drag.value = false\n}\n\nconst onDrop = (e: DragEvent) => {\n e.preventDefault()\n drag.value = false\n\n for (const item of (e as any).dataTransfer.items) {\n if (item.kind !== 'file') continue\n const file = item.getAsFile() as File\n if (!file) continue\n\n addFile(file)\n }\n}\n\nconst fileDialog = useFileDialog({\n accept: props.accept ?? 'image/*',\n multiple: false\n})\n\nfileDialog.onChange((files) => {\n if (!files || files.length === 0) return\n for (const file of files) {\n addFile(file)\n }\n fileDialog.reset()\n})\n\nconst removeImage = () => {\n emit(\"update:modelValue\", getDefaultValue(props.schema ?? { type: \"object\", format: \"image\" }))\n}\n\nconst dialog = useDialog()\nconst contextMenuItems: any[] = []\n\nconst onOpenImage = (image: any) => {\n emit(\"update:modelValue\", image)\n}\n\nif (fileRequest) {\n contextMenuItems.push({ title: \"Выбрать из файлов проекта\", onClick: () => dialog.open(ProjectImagesDialog as any, { fileRequest, onOpenImage }) })\n}\n\n</script>\n\n<script lang=\"ts\">\nexport type FileInfo = {\n id?: string,\n file?: File,\n src: string,\n name: string,\n previewSrc?: string,\n progress?: number | null\n}\n\n</script>\n\n\n<style lang=\"sass\">\n.v-image-uploader .v-form-control__outline\n height: 80px\n display: flex\n align-items: center\n padding: 0 12px\n font-size: 13px\n color: var(--text-secondary-color)\n gap: 16px\n\n &:focus-within\n border-color: var(--input-border-color)\n box-shadow: none\n\n a\n color: var(--accent-color)\n font-weight: 500\n cursor: pointer\n &:hover\n text-decoration: underline\n\n.v-image-uploader__drag-label\n text-align: center\n flex: 1 1 auto\n color: var(--text-secondary-color)\n font-size: 13px\n pointer-events: none\n\n.v-image-uploader__image-preview\n width: fit-content\n position: relative\n img\n max-width: 90px\n max-height: 60px\n display: block\n border-radius: 4px\n\n.v-image-uploader__delete-button\n top: -10px\n right: -10px\n position: absolute\n svg\n width: 10px\n height: 10px\n\n.v-image-uploader__image-info\n color: var(--text-color)\n\n.v-image-uploader.drag .v-form-control__outline\n pointer-events: none\n border-color: var(--primary-color)\n box-shadow: 0 0 0 2px var(--shadow-color)\n\n.v-image-uploader__more-button.v-icon-button\n position: absolute\n top: 4px\n right: 4px\n width: 24px\n height: 24px\n svg\n width: 18px\n height: 18px\n\n</style>","<template>\n<svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n<path d=\"M14.0326 5.40749C13.9629 5.33719 13.8799 5.28139 13.7885 5.24332C13.6971 5.20524 13.5991 5.18564 13.5001 5.18564C13.4011 5.18564 13.303 5.20524 13.2117 5.24332C13.1203 5.28139 13.0373 5.33719 12.9676 5.40749L7.38008 11.0025L5.03258 8.64749C4.96019 8.57756 4.87474 8.52257 4.7811 8.48567C4.68745 8.44877 4.58746 8.43067 4.48683 8.43241C4.38619 8.43415 4.28688 8.4557 4.19457 8.49582C4.10227 8.53594 4.01876 8.59385 3.94883 8.66624C3.87891 8.73863 3.82392 8.82408 3.78702 8.91773C3.75011 9.01137 3.73202 9.11136 3.73376 9.212C3.7355 9.31263 3.75704 9.41194 3.79716 9.50425C3.83728 9.59656 3.89519 9.68006 3.96758 9.74999L6.84758 12.63C6.91731 12.7003 7.00026 12.7561 7.09165 12.7942C7.18305 12.8322 7.28108 12.8518 7.38008 12.8518C7.47909 12.8518 7.57712 12.8322 7.66852 12.7942C7.75991 12.7561 7.84286 12.7003 7.91258 12.63L14.0326 6.50999C14.1087 6.43976 14.1695 6.35452 14.211 6.25964C14.2526 6.16477 14.274 6.06231 14.274 5.95874C14.274 5.85516 14.2526 5.75271 14.211 5.65783C14.1695 5.56296 14.1087 5.47772 14.0326 5.40749Z\" fill=\"currentColor\"/>\r\n</svg>\n</template>\n","<template>\r\n <div class=\"mech-v-checkbox\" :class=\"{ active: model }\" role=\"checkbox\" @click=\"onClick\" @keydown=\"onClick\">\r\n <div v-if=\"labelPosition === 'left'\" class=\"mech-v-checkbox__label left\">\r\n <slot name=\"label\">{{ props.label }}</slot>\r\n </div>\r\n <div class=\"mech-v-checkbox__icon\" :class=\"{ active: model }\">\r\n <CheckIcon/>\r\n </div>\r\n <input v-model=\"model\" type=\"checkbox\" :name=\"props.name\"/>\r\n <div v-if=\"labelPosition === 'right'\" class=\"mech-v-checkbox__label\">\r\n <slot name=\"label\">{{ props.label }}</slot>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { computed, useSlots } from 'vue';\r\nimport CheckIcon from './icons/CheckIcon.vue';\r\n\r\nconst props = defineProps<{ label?: string, name?: string, labelPosition?: \"left\" | \"right\" }>()\r\nconst model = defineModel<boolean>()\r\n\r\nconst onClick = (e: MouseEvent | KeyboardEvent) => {\r\n if (e instanceof KeyboardEvent && e.code !== \"Enter\") return\r\n (e.currentTarget as HTMLEmbedElement).querySelector(\"input\")?.click()\r\n // model.value = !model.value\r\n}\r\n\r\nconst slots = useSlots()\r\nconst labelPosition = computed(() => {\r\n if (!props.label && !slots.label) return \"none\"\r\n if (props.labelPosition === \"left\") return \"left\"\r\n return \"right\"\r\n})\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n\r\n.mech-v-checkbox\r\n display: flex\r\n align-items: center\r\n cursor: pointer\r\n gap: 10px\r\n position: relative\r\n \r\n input\r\n position: absolute\r\n top: 0\r\n left: 0\r\n opacity: 0\r\n pointer-events: none\r\n\r\n &:focus-within\r\n .mech-v-checkbox__icon\r\n border-color: var(--primary-color)\r\n box-shadow: 0 0 0 2px var(--shadow-color)\r\n\r\n.mech-v-checkbox__label\r\n color: var(--text-color)\r\n font-size: 13px\r\n\r\n a\r\n color: var(--text-color)\r\n text-decoration: underline\r\n\r\n &.left\r\n margin-left: 0\r\n\r\n\r\n.mech-v-checkbox__icon.active\r\n color: white\r\n background-color: var(--button-color)\r\n border-color: var(--button-color)\r\n\r\n svg\r\n opacity: 1\r\n\r\n &:hover\r\n background-color: var(--button-color-hover)\r\n border-color: var(--button-color-hover)\r\n\r\n &:active\r\n background-color: var(--button-color)\r\n\r\n.mech-v-checkbox__icon\r\n width: 16px\r\n height: 16px\r\n border: 1px solid #CCCCCC\r\n border-radius: 4px\r\n display: flex\r\n align-items: center\r\n justify-content: center\r\n transition: background-color 0.1s\r\n\r\n &:hover\r\n border-color: #999999\r\n\r\n &:active\r\n border-color: #777777\r\n\r\n @media(max-width: 800px)\r\n margin-top: 0\r\n \r\n svg\r\n width: 18px\r\n height: 18px\r\n opacity: 0\r\n\r\n</style>","export const getBlockName = (path?: string) => {\r\n if (!path) return undefined\r\n const str = path.split(\"/\").at(-1)\r\n return str?.split(\".\", 1)[0].replace(/([A-Z])/g, \" $1\").trimStart() ?? \"Unnamed block\"\r\n}\r\n\r\nexport const capitalize = (text: string) => {\r\n return text[0].toUpperCase() + text.slice(1)\r\n}\r\n\r\nexport const spaceCamelCase = (str: string) => {\r\n return capitalize(str.replace(/([A-Z])/g, \" $1\").trimStart())\r\n}\r\n\r\n\r\nexport function bytesForHuman (bytes: number | undefined): string {\r\n if (typeof (bytes) !== 'number') {\r\n return 'Unknown'\r\n }\r\n\r\n const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']\r\n\r\n let i = 0\r\n\r\n for (i; bytes >= 1024; i++) {\r\n bytes /= 1024\r\n }\r\n\r\n return `${Math.trunc(bytes * 10) / 10} ${units[i]}`\r\n}\r\n","<template>\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M13.8961 3.02922C14.25 2.67528 14.7238 2.4669 15.2238 2.44523C15.7239 2.42357 16.2139 2.5902 16.5971 2.91222L16.7241 3.02922L20.9671 7.27222C21.3208 7.62608 21.529 8.09964 21.5506 8.59947C21.5723 9.0993 21.4058 9.5891 21.0841 9.97222L20.9671 10.1002L10.6531 20.4142C10.3211 20.7462 9.88282 20.9509 9.41509 20.9922L9.23909 20.9992H4.00609C3.75727 20.9992 3.5172 20.9074 3.33192 20.7413C3.14664 20.5752 3.02919 20.3466 3.00209 20.0992L2.99609 19.9892V14.7562C2.99621 14.2867 3.16153 13.8321 3.46309 13.4722L3.58309 13.3422L13.8961 3.02922ZM12.1701 7.58322L4.99609 14.7572V18.9992H9.24009L16.4141 11.8252L12.1711 7.58222L12.1701 7.58322ZM15.3101 4.44322L13.5841 6.16922L17.8271 10.4122L19.5531 8.68622L15.3101 4.44322Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\r\n <VSelect class=\"v-link-editor\" v-model=\"linkType\" :items=\"linkTypes\" :nullable=\"props.nullable\">\r\n <VPopover v-if=\"model && model.id\" :offset=\"4\" placement=\"bottom-end\">\r\n <template #activator=\"{ props }\">\r\n <VIconButton v-bind=\"props\" class=\"edit-button\"><EditIcon/> </VIconButton>\r\n </template>\r\n <div class=\"v-link-editor__custom\">\r\n <VInput v-if=\"model.id === '_external'\" v-model=\"model.url\" label=\"URL ссылки\" autofocus/>\r\n <VInput v-if=\"model.id !== '_external'\" v-model=\"model.query\" label=\"Якорь\" :prefix=\"model?.url\"/>\r\n <VInput v-model=\"model.title\" label=\"Заголовок\" />\r\n <VCheckbox v-model=\"model.openNewTab\" label=\"Открывать в новой вкладке\"/>\r\n </div>\r\n </VPopover>\r\n </VSelect>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { useRequest } from 'vuesix';\r\nimport VSelect from './VSelect.vue';\r\nimport { computed, getCurrentInstance, inject, nextTick, ref, watch } from 'vue';\r\nimport VIconButton from './VIconButton.vue';\r\nimport EditIcon from './icons/EditIcon.vue';\r\nimport VInput from './VInput.vue';\r\nimport VPopover from './VPopover.vue';\r\nimport VCheckbox from './VCheckbox.vue';\r\nimport { PageLink } from '../types';\r\n\r\nconst props = defineProps<{ nullable?: boolean }>()\r\nconst model = defineModel<PageLink | null>()\r\n\r\nconst pagesRequest = inject(\"pagesRequest\") as (() => Promise<any>)\r\nconst { data } = useRequest(pagesRequest)\r\n\r\nconst linkType = ref<string>()\r\nif (model.value && model.value.id) {\r\n linkType.value = model.value.id\r\n}\r\n\r\nconst current = getCurrentInstance()\r\n\r\nwatch(linkType, (type) => {\r\n if (type === \"_external\") return\r\n if (type === null) {\r\n if (props.nullable) {\r\n model.value = null\r\n } else {\r\n model.value = { id: \"\", title: \"\" }\r\n }\r\n return\r\n }\r\n if (type === \"_externalNew\") {\r\n model.value = { id: \"_external\", url: \"\", title: \"\", external: true }\r\n nextTick(() => {\r\n const editButton = (current?.vnode.el as HTMLElement).querySelector(\".edit-button\") as HTMLButtonElement\r\n editButton?.dispatchEvent(new MouseEvent(\"mousedown\"))\r\n linkType.value = \"_external\"\r\n })\r\n } else {\r\n const page = data.value.find((item: any) => item.id === type)\r\n model.value = { ...page }\r\n }\r\n})\r\n\r\nconst linkTypes = computed(() => {\r\n const arr: Array<{ id: string, title: string } | string> = [\r\n { id: \"_externalNew\", title: \"Внешняя страница...\" },\r\n ]\r\n\r\n if (model.value && model.value.id === \"_external\") {\r\n arr.push({ id: \"_external\", title: model.value.title? `${model.value.title} [${model.value.url}]`: (model.value.url || \"Внешняя страница\") })\r\n }\r\n\r\n if (data.value) {\r\n arr.push(\"\")\r\n arr.push(...data.value)\r\n }\r\n\r\n return arr\r\n})\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-link-editor\r\n .edit-button\r\n flex-shrink: 0\r\n\r\n svg\r\n width: 12px\r\n height: 12px\r\n\r\n.v-link-editor__custom\r\n width: 280px\r\n display: flex\r\n flex-direction: column\r\n gap: 6px\r\n padding: 14px\r\n box-sizing: border-box\r\n\r\n .v-form-control__outline\r\n height: 34px\r\n\r\n .mech-v-checkbox\r\n margin-top: 6px\r\n\r\n</style>","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => {\n __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\nimport { getCurrentScope, onScopeDispose, unref, watch, reactive, computed, ref, defineComponent, getCurrentInstance, h, nextTick, useSlots, isProxy, toRaw, onMounted, openBlock, createElementBlock, Fragment, renderList, createBlock, renderSlot, createCommentVNode } from \"vue\";\nfunction tryOnScopeDispose(fn) {\n if (getCurrentScope()) {\n onScopeDispose(fn);\n return true;\n }\n return false;\n}\nfunction toValue(r) {\n return typeof r === \"function\" ? r() : unref(r);\n}\nconst isClient = typeof window !== \"undefined\" && typeof document !== \"undefined\";\ntypeof WorkerGlobalScope !== \"undefined\" && globalThis instanceof WorkerGlobalScope;\nconst toString = Object.prototype.toString;\nconst isObject = (val) => toString.call(val) === \"[object Object]\";\nconst noop = () => {\n};\nfunction unrefElement(elRef) {\n var _a;\n const plain = toValue(elRef);\n return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;\n}\nconst defaultWindow = isClient ? window : void 0;\nfunction useEventListener(...args) {\n let target;\n let events;\n let listeners;\n let options;\n if (typeof args[0] === \"string\" || Array.isArray(args[0])) {\n [events, listeners, options] = args;\n target = defaultWindow;\n } else {\n [target, events, listeners, options] = args;\n }\n if (!target)\n return noop;\n if (!Array.isArray(events))\n events = [events];\n if (!Array.isArray(listeners))\n listeners = [listeners];\n const cleanups = [];\n const cleanup = () => {\n cleanups.forEach((fn) => fn());\n cleanups.length = 0;\n };\n const register = (el, event, listener, options2) => {\n el.addEventListener(event, listener, options2);\n return () => el.removeEventListener(event, listener, options2);\n };\n const stopWatch = watch(\n () => [unrefElement(target), toValue(options)],\n ([el, options2]) => {\n cleanup();\n if (!el)\n return;\n const optionsClone = isObject(options2) ? { ...options2 } : options2;\n cleanups.push(\n ...events.flatMap((event) => {\n return listeners.map((listener) => register(el, event, listener, optionsClone));\n })\n );\n },\n { immediate: true, flush: \"post\" }\n );\n const stop = () => {\n stopWatch();\n cleanup();\n };\n tryOnScopeDispose(stop);\n return stop;\n}\nconst findParent = (el, callback) => {\n if (!el)\n return null;\n if (el.nodeType === Node.ELEMENT_NODE) {\n if (callback(el))\n return el;\n }\n if (!el.parentElement)\n return null;\n return findParent(el.parentElement, callback);\n};\nconst calcOffsetToNode = (parent, target) => {\n let offset = 0;\n for (let child of parent.childNodes) {\n if (child.nodeName === \"BR\")\n continue;\n const ch = child.nodeType === Node.TEXT_NODE ? child : child.childNodes[0];\n if (ch === target)\n return offset;\n offset += ch.length;\n }\n return offset;\n};\nconst calcNodeByOffset = (parent, offset) => {\n let currentOffset = offset;\n if (offset === 0)\n return [parent, 0];\n for (let child of parent.childNodes) {\n if (child.nodeName === \"BR\")\n continue;\n const ch = child.nodeType === Node.TEXT_NODE ? child : child.childNodes[0];\n if (currentOffset - ch.length <= 0) {\n return [ch, currentOffset];\n }\n currentOffset -= ch.length;\n }\n return [parent, 0];\n};\nconst clamp = (val, min, max) => {\n if (val > max)\n return max;\n if (val < min)\n return min;\n return val;\n};\nconst isEqual = (a, b) => {\n if (a === b)\n return true;\n if (typeof a !== \"object\" || typeof b !== \"object\" || a === null || b === null)\n return false;\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++) {\n if (!isEqual(a[i], b[i]))\n return false;\n }\n return true;\n }\n for (let key in a) {\n if (!isEqual(a[key], b[key]))\n return false;\n }\n return true;\n};\nclass TextEditorHistory {\n constructor(store) {\n __publicField(this, \"actions\", []);\n __publicField(this, \"currentCursor\", 0);\n __publicField(this, \"blocksIds\", \"\");\n __publicField(this, \"cachedBlocksJson\", \"\");\n __publicField(this, \"store\");\n __publicField(this, \"tickStarted\", false);\n this.store = store;\n window.showHistory = () => console.log(this.actions);\n }\n cacheBlockIds() {\n this.blocksIds = this.store.blocks.map((item) => item.id).join(\",\");\n }\n blockIdsChanged() {\n return this.blocksIds !== this.store.blocks.map((item) => item.id).join(\",\");\n }\n push(type) {\n var _a;\n if (this.currentCursor + 1 < this.actions.length) {\n this.actions.length = this.currentCursor + 1;\n }\n const lastAction = this.actions.length > 0 ? this.actions[this.actions.length - 1] : null;\n const selection = JSON.parse(JSON.stringify(this.store.selection));\n const fullUpdate = type === \"setText\" || type === \"addNewLine\" || this.blockIdsChanged();\n const blocksJson = JSON.stringify(this.store.blocks);\n if (!fullUpdate && this.store.currentBlock) {\n const currentBlock = JSON.parse(JSON.stringify(this.store.currentBlock));\n if (lastAction && lastAction.type === type && ((_a = lastAction.blocks[0]) == null ? void 0 : _a.id) === currentBlock.id && (lastAction.type === \"insertText\" || lastAction.type === \"deleteContentBackward\" || lastAction.type === \"deleteContentForward\")) {\n lastAction.blocks = [currentBlock];\n lastAction.selection = selection;\n } else {\n this.actions.push({ type, blocks: [currentBlock], selection, fullUpdate });\n }\n } else {\n this.actions.push({ type, blocks: JSON.parse(blocksJson), selection, fullUpdate });\n }\n this.currentCursor = this.actions.length - 1;\n if (fullUpdate) {\n if (lastAction && !lastAction.fullUpdate) {\n lastAction.fullUpdate = true;\n lastAction.blocks = JSON.parse(this.cachedBlocksJson);\n }\n this.cacheBlockIds();\n }\n this.cachedBlocksJson = blocksJson;\n }\n applyAction(action) {\n if (action.fullUpdate) {\n for (let i = 0; i < action.blocks.length; i++) {\n if (i >= this.store.blocks.length) {\n this.store.blocks.push({ ...action.blocks[i] });\n } else {\n Object.assign(this.store.blocks[i], action.blocks[i]);\n this.store.blocks[i].type = action.blocks[i].type;\n }\n }\n if (this.store.blocks.length > action.blocks.length) {\n this.store.blocks.length = action.blocks.length;\n }\n } else {\n for (let _block of action.blocks) {\n const block = this.store.blocks.find((block2) => block2.id === _block.id);\n if (block) {\n block.text = _block.text;\n block.styles = _block.styles;\n block.type = _block.type;\n }\n }\n }\n Object.assign(this.store.selection, action.selection);\n this.cacheBlockIds();\n }\n undo() {\n if (this.currentCursor === 0)\n return;\n this.currentCursor--;\n this.applyAction(this.actions[this.currentCursor]);\n }\n redo() {\n if (this.currentCursor >= this.actions.length - 1)\n return;\n this.currentCursor++;\n this.applyAction(this.actions[this.currentCursor]);\n }\n}\nclass TextEditorStore {\n constructor() {\n __publicField(this, \"history\", new TextEditorHistory(this));\n __publicField(this, \"blocks\", reactive([{ id: uid(), text: \"\", styles: [] }]));\n __publicField(this, \"selection\", reactive({\n anchor: { blockId: this.blocks[0].id, offset: 0 },\n focus: { blockId: this.blocks[0].id, offset: 0 }\n }));\n __publicField(this, \"_isCollapsed\", computed(() => {\n return this.selection.anchor.blockId === this.selection.focus.blockId && this.selection.anchor.offset === this.selection.focus.offset;\n }));\n __publicField(this, \"isFocused\", ref(false));\n __publicField(this, \"_currentBlock\", computed(() => {\n if (this.selection.anchor.blockId !== this.selection.focus.blockId)\n return null;\n return this.blocks.find((item) => item.id === this.selection.anchor.blockId) ?? null;\n }));\n __publicField(this, \"_selectedText\", computed(() => {\n if (this.isCollapsed)\n return \"\";\n const [start, end, startIndex, endIndex] = this.startAndEnd;\n if (startIndex === endIndex) {\n return this.blocks[startIndex].text.slice(start.offset, end.offset);\n }\n const startText = this.blocks[startIndex].text.slice(start.offset);\n const endText = this.blocks[endIndex].text.slice(0, end.offset);\n const arr = [startText, ...this.blocks.slice(startIndex + 1, endIndex).map((block) => block.text), endText];\n return arr.join(\"\\n\");\n }));\n __publicField(this, \"_currentStyles\", computed(() => {\n const [start, end, startIndex, endIndex] = this.startAndEnd;\n const styles = /* @__PURE__ */ new Map();\n if (startIndex < 0)\n return styles;\n for (let i = startIndex; i <= endIndex; i++) {\n const blockStyles = this.blocks[i].styles;\n if (!blockStyles)\n continue;\n for (let style of blockStyles) {\n if (i === startIndex && start.offset < style.start)\n continue;\n if (i === endIndex && end.offset > style.end)\n continue;\n styles.set(style.style, style);\n }\n }\n return styles;\n }));\n }\n get isCollapsed() {\n return this._isCollapsed.value;\n }\n get currentBlock() {\n return this._currentBlock.value;\n }\n *getCurrentBlocks() {\n const blockAnchorIndex = this.blocks.findIndex((item) => item.id === this.selection.anchor.blockId);\n const focusAnchorIndex = this.blocks.findIndex((item) => item.id === this.selection.focus.blockId);\n if (blockAnchorIndex === -1 || focusAnchorIndex === -1)\n return;\n const start = Math.min(blockAnchorIndex, focusAnchorIndex);\n const end = Math.max(blockAnchorIndex, focusAnchorIndex);\n for (let i = start; i <= end; i++) {\n yield this.blocks[i];\n }\n }\n get selectedText() {\n return this._selectedText.value;\n }\n moveOffset(newOffset) {\n const delta = newOffset - this.selection.anchor.offset;\n if (delta === 0)\n return;\n this.moveStyles(this.currentBlock, this.selection.focus.offset, -delta);\n this.selection.anchor.offset = newOffset;\n this.selection.focus.offset = newOffset;\n }\n addStyleToBlock(block, style) {\n if (!block.styles) {\n block.styles = [style];\n } else {\n block.styles.push(style);\n }\n block.styles.sort((a, b) => a.start - b.start);\n }\n concatBlocks(start, end) {\n if (end.styles) {\n for (let style of end.styles) {\n style.start += start.text.length;\n style.end += start.text.length;\n this.addStyleToBlock(start, style);\n }\n }\n start.text = start.text + end.text;\n }\n removeCurrentBlock() {\n const blockIndex = this.blocks.findIndex((item) => item.id === this.selection.anchor.blockId);\n if (blockIndex < 0)\n return;\n this.blocks.splice(blockIndex, 1);\n if (this.blocks.length === 0) {\n this.blocks.push({ id: uid(), text: \"\" });\n }\n const newBlockIndex = Math.max(blockIndex - 1, 0);\n this.selection.anchor.blockId = this.blocks[newBlockIndex].id;\n this.selection.focus.blockId = this.blocks[newBlockIndex].id;\n this.selection.anchor.offset = blockIndex === 0 ? 0 : this.blocks[newBlockIndex].text.length;\n this.selection.focus.offset = blockIndex === 0 ? 0 : this.blocks[newBlockIndex].text.length;\n this.history.push(\"removeBlock\");\n }\n removeNewLine() {\n const blockIndex = this.blocks.findIndex((item) => item.id === this.selection.anchor.blockId);\n if (blockIndex < 1)\n return;\n if (this.blocks[blockIndex - 1].editable === false) {\n if (this.blocks[blockIndex].text === \"\") {\n this.blocks.splice(blockIndex, 1);\n }\n this.selection.anchor.blockId = this.blocks[blockIndex - 1].id;\n this.selection.focus.blockId = this.blocks[blockIndex - 1].id;\n this.selection.anchor.offset = 0;\n this.selection.focus.offset = 0;\n } else {\n this.selection.anchor.blockId = this.blocks[blockIndex - 1].id;\n this.selection.focus.blockId = this.blocks[blockIndex - 1].id;\n this.selection.anchor.offset = this.blocks[blockIndex - 1].text.length;\n this.selection.focus.offset = this.blocks[blockIndex - 1].text.length;\n this.concatBlocks(this.blocks[blockIndex - 1], this.blocks[blockIndex]);\n this.blocks.splice(blockIndex, 1);\n }\n }\n onInput(_e) {\n const ev = _e;\n if (ev.defaultPrevented)\n return;\n ev.preventDefault();\n const collapsed = this.isCollapsed;\n if (!collapsed)\n this.deleteSelected();\n const block = this.currentBlock;\n if (!block)\n return;\n if ((ev.inputType === \"deleteContentBackward\" || ev.inputType === \"deleteContentForward\") && collapsed) {\n if (ev.inputType === \"deleteContentBackward\") {\n if (this.selection.anchor.offset === 0) {\n if (block.type) {\n delete block.type;\n } else {\n this.removeNewLine();\n }\n } else {\n const offset = Math.max(0, this.selection.focus.offset - 1);\n block.text = block.text.slice(0, offset) + block.text.slice(this.selection.focus.offset);\n this.moveOffset(offset);\n }\n this.history.push(\"deleteContentBackward\");\n }\n if (ev.inputType === \"deleteContentForward\") {\n const blockIndex = this.blocks.findIndex((item) => item.id === this.selection.anchor.blockId);\n if (this.selection.anchor.offset === this.blocks[blockIndex].text.length) {\n const nextBlock = this.blocks[blockIndex + 1];\n if (nextBlock) {\n this.blocks.splice(blockIndex + 1, 1);\n this.concatBlocks(this.blocks[blockIndex], nextBlock);\n }\n } else {\n block.text = block.text.slice(0, this.selection.focus.offset) + block.text.slice(this.selection.focus.offset + 1);\n this.moveStyles(block, this.selection.focus.offset + 1, 1);\n }\n this.history.push(\"deleteContentForward\");\n }\n }\n if (ev.inputType === \"insertText\") {\n this.insertText(ev.data);\n this.history.push(\"insertText\");\n }\n }\n addNewLineBefore() {\n const index = this.blocks.findIndex((item) => item.id === this.selection.anchor.blockId);\n const block = { id: uid(), text: \"\" };\n this.blocks.splice(index, 0, block);\n this.history.push(\"addNewLine\");\n }\n addNewLine() {\n var _a;\n if (this.isCollapsed && this.selection.anchor.offset === 0 && ((_a = this.currentBlock) == null ? void 0 : _a.editable) !== false) {\n this.addNewLineBefore();\n return;\n }\n this.deleteSelected();\n if (!this.currentBlock)\n return;\n const endText = this.currentBlock.editable === false ? \"\" : this.currentBlock.text.slice(this.selection.anchor.offset);\n this.currentBlock.text = this.currentBlock.text.slice(0, this.selection.anchor.offset);\n const block = { id: uid(), text: endText || \"\" };\n const index = this.blocks.findIndex((item) => item.id === this.selection.anchor.blockId);\n this.blocks.splice(index + 1, 0, block);\n this.selection.anchor = { blockId: block.id, offset: 0 };\n this.selection.focus = { blockId: block.id, offset: 0 };\n this.history.push(\"addNewLine\");\n }\n addNewLineAfter() {\n const index = this.blocks.findIndex((item) => item.id === this.selection.anchor.blockId);\n const block = { id: uid(), text: \"\" };\n this.blocks.splice(index + 1, 0, block);\n return block;\n }\n insertText(data) {\n const block = this.currentBlock;\n if (!block)\n return;\n const text = data.replace(/\\r/g, \"\");\n block.text = block.text.slice(0, this.selection.focus.offset) + text + block.text.slice(this.selection.focus.offset);\n this.moveOffset(clamp(this.selection.focus.offset + text.length, 0, block.text.length));\n }\n insertBlock(blockData) {\n if (!this.currentBlock)\n return;\n this.deleteSelected();\n if (this.currentBlock.text !== \"\") {\n this.addNewLine();\n }\n if (this.currentBlock.text !== \"\") {\n const selection = JSON.parse(JSON.stringify(this.selection));\n this.addNewLine();\n Object.assign(this.selection, selection);\n }\n Object.assign(this.currentBlock, blockData);\n if (blockData.editable === false && this.currentBlock === this.blocks[this.blocks.length - 1]) {\n const newLine = this.addNewLineAfter();\n this.selection.focus.blockId = newLine.id;\n this.selection.focus.offset = 0;\n this.selection.anchor.blockId = newLine.id;\n this.selection.anchor.offset = 0;\n }\n this.history.push(\"setText\");\n }\n get startAndEnd() {\n const a = this.blocks.findIndex((block) => block.id === this.selection.anchor.blockId);\n const f = this.blocks.findIndex((block) => block.id === this.selection.focus.blockId);\n if (a < f || a === f && this.selection.anchor.offset < this.selection.focus.offset) {\n return [this.selection.anchor, this.selection.focus, a, f];\n } else {\n return [this.selection.focus, this.selection.anchor, f, a];\n }\n }\n moveStyles(block, offset, delta) {\n if (!block.styles)\n return;\n for (let i = 0; i < block.styles.length; i++) {\n const style = block.styles[i];\n if (style.start >= offset)\n style.start -= delta;\n if (style.end >= offset)\n style.end -= delta;\n if (style.end <= style.start) {\n block.styles.splice(i, 1);\n i--;\n }\n }\n }\n deleteSelected() {\n if (this.isCollapsed)\n return;\n const [start, end, startIndex, endIndex] = this.startAndEnd;\n const startText = this.blocks[startIndex].text.slice(0, start.offset);\n const endText = this.blocks[endIndex].text.slice(end.offset);\n this.removeAllStyles();\n const delta = end.offset - (startIndex === endIndex ? start.offset : 0);\n this.moveStyles(this.blocks[endIndex], end.offset, delta);\n if (this.selection.anchor.blockId !== this.selection.focus.blockId) {\n this.blocks.splice(startIndex + 1, endIndex - startIndex);\n }\n if (start !== this.selection.anchor) {\n this.selection.anchor = { ...start };\n }\n if (start !== this.selection.focus) {\n this.selection.focus = { ...start };\n }\n this.blocks[startIndex].text = startText + endText;\n }\n get currentStyles() {\n return this._currentStyles.value;\n }\n applyStyle(_style, meta) {\n if (this.isCollapsed)\n return;\n const [start, end, startIndex, endIndex] = this.startAndEnd;\n for (let i = startIndex; i <= endIndex; i++) {\n const block = this.blocks[i];\n const _start = i === startIndex ? start.offset : 0;\n const _end = i === endIndex ? end.offset : block.text.length;\n let createNewStyle = true;\n if (block.styles) {\n for (let style of block.styles) {\n if (style.style !== _style)\n continue;\n if (style.start > _end || style.end < _start)\n continue;\n if (meta && !isEqual(meta, style.meta) && (style.start !== _start || style.end !== _end)) {\n if (_start === style.end || _end === style.start)\n continue;\n this.removeStyleAt(block, _start, _end, _style);\n } else {\n style.start = Math.min(style.start, _start);\n style.end = Math.max(style.end, _end);\n createNewStyle = false;\n style.meta = meta;\n }\n }\n }\n if (createNewStyle) {\n const newStyle = {\n start: i === startIndex ? start.offset : 0,\n end: i === endIndex ? end.offset : block.text.length,\n style: _style,\n meta\n };\n this.addStyleToBlock(block, newStyle);\n }\n }\n this.history.push(\"applyStyle\");\n }\n removeStyleAt(block, _start, _end, _style) {\n const removeAll = typeof _style !== \"string\";\n if (!block.styles)\n return;\n for (let i = 0; i < block.styles.length; i++) {\n const style = block.styles[i];\n if (!removeAll && style.style !== _style)\n continue;\n if (style.start > _end || style.end < _start)\n continue;\n if (style.start >= _start && style.end <= _end) {\n block.styles.splice(i, 1);\n i--;\n } else if (style.start < _start && style.end > _end) {\n block.styles.push({ ...style, start: _end });\n style.end = _start;\n } else if (style.start < _start) {\n style.end = _start;\n } else if (style.end > _end) {\n style.start = _end;\n }\n }\n if (block.styles.length === 0) {\n delete block.styles;\n }\n }\n removeStyle(_style) {\n const [start, end, startIndex, endIndex] = this.startAndEnd;\n for (let i = startIndex; i <= endIndex; i++) {\n const block = this.blocks[i];\n const _start = i === startIndex ? start.offset : 0;\n const _end = i === endIndex ? end.offset : block.text.length;\n this.removeStyleAt(block, _start, _end, _style);\n }\n this.history.push(\"applyStyle\");\n }\n removeAllStyles() {\n const [start, end, startIndex, endIndex] = this.startAndEnd;\n for (let i = startIndex; i <= endIndex; i++) {\n const block = this.blocks[i];\n if (i > startIndex && i < endIndex) {\n delete block.styles;\n return;\n }\n const _start = i === startIndex ? start.offset : 0;\n const _end = i === endIndex ? end.offset : block.text.length;\n this.removeStyleAt(block, _start, _end);\n }\n }\n toggleStyle(style) {\n if (this.currentStyles.has(style)) {\n this.removeStyle(style);\n } else {\n this.applyStyle(style);\n }\n }\n selectAll() {\n this.selection.anchor = { blockId: this.blocks[0].id, offset: 0 };\n const lastBlock = this.blocks[this.blocks.length - 1];\n this.selection.focus = { blockId: lastBlock.id, offset: lastBlock.text.length };\n }\n}\nlet uidCounter = 0;\nconst uid = () => (uidCounter++).toString();\nconst _sfc_main$2 = defineComponent({\n props: [\"block\", \"slots\", \"static\", \"decorator\", \"renderer\", \"parser\"],\n emits: [\"postrender\"],\n setup(props, { emit }) {\n const slot = computed(() => {\n if (!props.block.type)\n return props.slots[\"default\"] ?? null;\n return props.slots[props.block.type] ?? null;\n });\n const instance = getCurrentInstance();\n const getRef = () => {\n if (!instance)\n return null;\n const el = instance.vnode.el;\n if (!el)\n return null;\n if (el.nodeType === Node.TEXT_NODE && el.nextSibling !== null) {\n return el.nextSibling;\n }\n return el;\n };\n const cacheNodes = [];\n let cacheEl = null;\n const cleanTree = (count) => {\n if (props.static === true)\n return;\n const el = getRef();\n if (!el)\n return;\n if (el === cacheEl && cacheNodes.length > 0) {\n el.prepend(cacheNodes[0]);\n el.append(cacheNodes[1]);\n }\n nextTick(() => {\n var _a;\n cacheEl = getRef();\n if (el === cacheEl) {\n if (el.childNodes.length > count + 2) {\n for (let i = 0; i < el.childNodes.length; i++) {\n const child = el.childNodes[i];\n if (i === 0 && child.nodeType === Node.TEXT_NODE && child.textContent === \"\")\n continue;\n if (\"__vnode\" in child)\n continue;\n if (child.nodeType === Node.TEXT_NODE && ((_a = child.textContent) == null ? void 0 : _a.endsWith(\"\\n\")))\n continue;\n el.removeChild(child);\n break;\n }\n }\n }\n if (cacheEl) {\n cacheNodes[0] = cacheEl.childNodes[0];\n cacheNodes[1] = cacheEl.childNodes[cacheEl.childNodes.length - 1];\n }\n emit(\"postrender\");\n });\n };\n const content = () => {\n const block = props.block;\n if (block.editable === false)\n return [];\n if (block.text.length === 0) {\n cleanTree(1);\n return [h(\"br\")];\n }\n let text = block.text;\n if (text.endsWith(\"\\n\")) {\n text = text + \"\\n\";\n }\n const markers = [];\n if (block.styles) {\n for (let style of block.styles) {\n if (style.end <= style.start)\n continue;\n markers.push([style.start, style]);\n markers.push([style.end, style]);\n }\n }\n if (props.parser) {\n for (let style of props.parser(text)) {\n if (style.end <= style.start)\n continue;\n markers.push([style.start, style]);\n markers.push([style.end, style]);\n }\n }\n markers.sort((a, b) => a[0] - b[0]);\n let currentIndex = 0;\n const activeStyles = /* @__PURE__ */ new Set();\n const blocks = [];\n for (let marker of markers) {\n if (currentIndex !== marker[0]) {\n const str = text.slice(currentIndex, marker[0]);\n blocks.push(renderBlockPart(str, Array.from(activeStyles.values())));\n currentIndex = marker[0];\n }\n if (marker[0] === marker[1].start) {\n activeStyles.add(marker[1]);\n }\n if (marker[0] === marker[1].end) {\n activeStyles.delete(marker[1]);\n }\n }\n if (currentIndex !== text.length) {\n const str = text.slice(currentIndex, text.length);\n blocks.push(renderBlockPart(str, Array.from(activeStyles.values())));\n }\n cleanTree(blocks.length);\n return blocks;\n };\n const renderBlockPart = (text, styles) => {\n if (!props.decorator)\n return text;\n let elementTag = \"span\";\n const attrs = {};\n for (let style of styles) {\n const partProps = props.decorator(style);\n if (!partProps)\n continue;\n const { class: _class, style: _style, tag, ...otherProps } = partProps;\n Object.assign(attrs, otherProps);\n if (_class) {\n attrs.class = attrs.class ? attrs.class + \" \" + _class : _class;\n }\n if (_style) {\n attrs.style = attrs.style ? attrs.style + \" \" + _style : _style;\n }\n if (tag) {\n elementTag = tag;\n }\n }\n if (Object.keys(attrs).length === 0 && elementTag === \"span\")\n return text;\n return h(elementTag, attrs, text);\n };\n return () => {\n let elementTag = \"div\";\n const blockProps = {\n \"data-vw-block-id\": props.block.id\n };\n const additionalProps = props.renderer && props.renderer(props.block);\n if (additionalProps) {\n if (additionalProps.tag) {\n elementTag = additionalProps.tag;\n delete additionalProps.tag;\n }\n Object.assign(blockProps, additionalProps);\n }\n if (slot.value) {\n const component = slot.value({ content, props: blockProps, block: props.block });\n if (Array.isArray(component) && component.length === 1)\n return component[0];\n return component;\n }\n return h(elementTag, blockProps, content());\n };\n }\n});\nconst createClipboardEvents = (store, props) => {\n const getSelected = () => {\n const [start, end, startIndex, endIndex] = store.startAndEnd;\n if (startIndex === endIndex) {\n const text2 = store.blocks[startIndex].text.slice(start.offset, end.offset);\n return [\n new ClipboardItem({\n \"text/plain\": new Blob([text2], { type: \"text/plain\" })\n })\n ];\n }\n const startText = store.blocks[startIndex].text.slice(start.offset);\n const endText = store.blocks[endIndex].text.slice(0, end.offset);\n const arr = [\n { type: store.blocks[startIndex].type, text: startText },\n ...store.blocks.slice(startIndex + 1, endIndex),\n { type: store.blocks[endIndex].type, text: endText }\n ];\n const html = arr.map((item) => `<div>${item.text}</div>`).join(\"\\n\");\n const text = arr.map((item) => item.text).join(\"\\n\");\n return [\n new ClipboardItem({\n \"text/html\": new Blob([html], { type: \"text/html\" }),\n \"text/plain\": new Blob([text], { type: \"text/plain\" })\n })\n ];\n };\n const onCopy = (e) => {\n if (e.defaultPrevented)\n return;\n e.preventDefault();\n navigator.clipboard.write(getSelected());\n store.history.push(\"setText\");\n };\n const onCut = (e) => {\n if (e.defaultPrevented)\n return;\n e.preventDefault();\n navigator.clipboard.write(getSelected());\n store.deleteSelected();\n store.history.push(\"setText\");\n };\n const insertText = (text, type) => {\n if (props.preventMultiline) {\n const blocks = text.split(\"\\n\");\n store.insertText(blocks[0]);\n for (let i = 1; i < blocks.length; i++) {\n store.addNewLine();\n store.insertText(blocks[i]);\n }\n } else {\n if (type && store.currentBlock) {\n store.currentBlock.type = type;\n }\n store.insertText(text);\n }\n };\n const parseHtml = (node, type) => {\n var _a, _b, _c, _d;\n let isTextNode = false;\n for (let _node of node.childNodes) {\n if (_node.nodeType === Node.TEXT_NODE && ((_a = _node.textContent) == null ? void 0 : _a.trim()) || _node.nodeType == Node.ELEMENT_NODE && _node.tagName === \"SPAN\") {\n isTextNode = true;\n break;\n }\n }\n if (isTextNode) {\n const text = node.textContent;\n if (!text)\n return;\n insertText(text, type ?? ((_b = props.htmlParser) == null ? void 0 : _b.call(props, node)) ?? void 0);\n store.addNewLine();\n return;\n }\n for (let child of node.children) {\n if (child.tagName === \"DIV\") {\n parseHtml(child, type);\n } else if (child.tagName === \"UL\" || child.tagName === \"OL\") {\n for (let li of child.children) {\n parseHtml(li, ((_c = props.htmlParser) == null ? void 0 : _c.call(props, li)) ?? void 0);\n }\n } else {\n insertText(child.textContent ?? \"\", type ?? ((_d = props.htmlParser) == null ? void 0 : _d.call(props, child)) ?? void 0);\n store.addNewLine();\n }\n }\n };\n const parser = new DOMParser();\n const onPaste = (e) => {\n var _a, _b;\n if (e.defaultPrevented)\n return;\n e.preventDefault();\n const html = (_a = e.clipboardData) == null ? void 0 : _a.getData(\"text/html\");\n if (html) {\n store.deleteSelected();\n const dom = parser.parseFromString(html, \"text/html\");\n parseHtml(dom.body);\n } else {\n const text = (_b = e.clipboardData) == null ? void 0 : _b.getData(\"text\");\n if (!text)\n return;\n store.deleteSelected();\n insertText(text);\n }\n store.history.push(\"setText\");\n };\n return {\n onCopy,\n onCut,\n onPaste\n };\n};\nconst _sfc_main$1 = /* @__PURE__ */ defineComponent({\n __name: \"TextEditor\",\n props: {\n decorator: { type: Function },\n renderer: { type: Function },\n single: { type: Boolean },\n modelValue: {},\n parser: { type: Function },\n styles: {},\n autofocus: { type: Boolean },\n autoselect: { type: Boolean },\n preventMultiline: { type: Boolean },\n htmlParser: { type: Function }\n },\n emits: [\"keydown\", \"update:modelValue\", \"update:styles\"],\n setup(__props, { expose: __expose, emit: __emit }) {\n const props = __props;\n const emit = __emit;\n const slots = useSlots();\n const textEditorRef = ref();\n const store = new TextEditorStore();\n let modelValue = \"\";\n watch(() => props.modelValue, (newValue) => {\n if (isProxy(newValue) && toRaw(newValue) === modelValue)\n return;\n if (newValue === void 0 || newValue === null || newValue === modelValue)\n return;\n if (!Array.isArray(newValue)) {\n store.blocks[0].text = newValue;\n return;\n } else {\n for (let i = store.blocks.length; i < newValue.length; i++) {\n store.blocks.push({ id: uid(), text: \"\" });\n }\n store.blocks.length = newValue.length;\n for (let i = 0; i < newValue.length; i++) {\n store.blocks[i] = { ...newValue[i], id: uid() };\n }\n }\n }, { immediate: true });\n let styles;\n watch(() => props.styles, (newStyles) => {\n if (!newStyles || newStyles.length === 0 || newStyles === styles)\n return;\n for (let i = 0; i < store.blocks.length; i++) {\n if (newStyles.length <= i)\n break;\n store.blocks[i].styles = newStyles;\n }\n }, { immediate: true });\n watch(() => store.blocks, () => {\n if (props.single) {\n modelValue = store.blocks[0].text;\n styles = store.blocks[0].styles;\n emit(\"update:styles\", styles);\n emit(\"update:modelValue\", modelValue);\n } else {\n modelValue = store.blocks;\n emit(\"update:modelValue\", store.blocks);\n }\n }, { deep: true });\n const onKeyDown = (e) => {\n emit(\"keydown\", e);\n if (e.defaultPrevented)\n return;\n if (e.code === \"Enter\") {\n e.preventDefault();\n if (!props.preventMultiline && (e.shiftKey || props.single)) {\n store.insertText(\"\\n\");\n } else {\n store.addNewLine();\n }\n }\n if ((e.ctrlKey || e.metaKey) && !e.shiftKey && !e.altKey) {\n if (e.code === \"KeyB\" || e.code === \"KeyI\" || e.code === \"KeyU\") {\n e.preventDefault();\n }\n }\n if ((e.ctrlKey || e.metaKey) && e.code === \"KeyZ\" && !e.shiftKey) {\n e.preventDefault();\n store.history.undo();\n }\n if ((e.ctrlKey || e.metaKey) && (e.code === \"KeyY\" || e.shiftKey && e.code === \"KeyZ\")) {\n e.preventDefault();\n store.history.redo();\n }\n };\n let cachedSelection = {};\n useEventListener(document, \"selectionchange\", () => {\n const sel = window.getSelection();\n const anchor = findParent(sel.anchorNode, (el) => el.hasAttribute(\"data-vw-block-id\") && el.parentElement === textEditorRef.value);\n if (anchor) {\n const isNonEditable = anchor.getAttribute(\"contenteditable\") === \"false\";\n const offset = isNonEditable || anchor === sel.focusNode ? 0 : calcOffsetToNode(anchor, sel.anchorNode) + sel.anchorOffset;\n store.selection.anchor = { blockId: anchor.getAttribute(\"data-vw-block-id\"), offset };\n }\n const focus = findParent(sel.focusNode, (el) => el.hasAttribute(\"data-vw-block-id\") && el.parentElement === textEditorRef.value);\n if (focus) {\n const isNonEditable = focus.getAttribute(\"contenteditable\") === \"false\";\n const offset = isNonEditable || focus === sel.focusNode ? 0 : calcOffsetToNode(focus, sel.focusNode) + sel.focusOffset;\n store.selection.focus = { blockId: focus.getAttribute(\"data-vw-block-id\"), offset };\n }\n if (store.isFocused.value !== (!!focus || !!anchor)) {\n store.isFocused.value = !!focus || !!anchor;\n }\n if (anchor && focus) {\n cachedSelection = JSON.parse(JSON.stringify(store.selection));\n }\n });\n let postRendered = false;\n const onPostRender = () => {\n if (postRendered)\n return;\n cachedSelection = {};\n postRendered = true;\n applySelection();\n nextTick(() => {\n postRendered = false;\n });\n };\n const getNode = (blockId) => {\n for (let item of textEditorRef.value.children) {\n if (item.getAttribute(\"data-vw-block-id\") === blockId) {\n return item;\n }\n }\n return null;\n };\n const applySelection = () => {\n var _a;\n if (!store.isFocused.value) {\n cachedSelection = JSON.parse(JSON.stringify(store.selection));\n return;\n }\n if (isEqual(store.selection, cachedSelection))\n return;\n const anchor = getNode(store.selection.anchor.blockId);\n const focus = getNode(store.selection.focus.blockId);\n const nativeSelection = window.getSelection();\n if (anchor && focus) {\n nativeSelection.setBaseAndExtent(\n ...calcNodeByOffset(anchor, store.selection.anchor.offset),\n ...calcNodeByOffset(focus, store.selection.focus.offset)\n );\n }\n if (store.selection.anchor.blockId === store.selection.focus.blockId && ((_a = store.currentBlock) == null ? void 0 : _a.editable) === false) {\n const innerText = anchor == null ? void 0 : anchor.querySelector(\"[data-vw-block-id]\");\n if (innerText) {\n nativeSelection.setBaseAndExtent(innerText, 0, innerText, 0);\n }\n }\n cachedSelection = JSON.parse(JSON.stringify(store.selection));\n };\n watch(() => store.selection, applySelection, { deep: true, flush: \"post\" });\n onMounted(() => {\n var _a, _b;\n if (props.autofocus) {\n (_a = textEditorRef.value) == null ? void 0 : _a.focus();\n applySelection();\n }\n if (props.autoselect) {\n (_b = textEditorRef.value) == null ? void 0 : _b.focus();\n store.selectAll();\n }\n store.history.push(\"setText\");\n });\n const { onCut, onCopy, onPaste } = createClipboardEvents(store, props);\n const getClientRects = (selection) => {\n const anchor = getNode(selection.anchor.blockId);\n const focus = getNode(selection.focus.blockId);\n if (anchor && focus) {\n const range = new Range();\n range.setStart(...calcNodeByOffset(anchor, selection.anchor.offset));\n range.setEnd(...calcNodeByOffset(focus, selection.focus.offset));\n return range.getClientRects();\n }\n return new DOMRectList();\n };\n __expose({\n currentStyles: store._currentStyles,\n currentBlock: store._currentBlock,\n isCollapsed: store._isCollapsed,\n selection: store.selection,\n isFocused: store.isFocused,\n getCurrentBlocks: store.getCurrentBlocks.bind(store),\n toggleStyle: store.toggleStyle.bind(store),\n applyStyle: store.applyStyle.bind(store),\n removeStyle: store.removeStyle.bind(store),\n insertText: store.insertText.bind(store),\n insertBlock: store.insertBlock.bind(store),\n addNewLine: store.addNewLine.bind(store),\n removeNewLine: store.removeNewLine.bind(store),\n removeCurrentBlock: store.removeCurrentBlock.bind(store),\n selectAll: store.selectAll.bind(store),\n pushHistory: store.history.push.bind(store.history),\n getClientRects\n });\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n ref_key: \"textEditorRef\",\n ref: textEditorRef,\n contenteditable: \"\",\n onBeforeinput: _cache[0] || (_cache[0] = //@ts-ignore\n (...args) => unref(store).onInput && unref(store).onInput(...args)),\n onKeydown: onKeyDown,\n onCopy: _cache[1] || (_cache[1] = //@ts-ignore\n (...args) => unref(onCopy) && unref(onCopy)(...args)),\n onPaste: _cache[2] || (_cache[2] = //@ts-ignore\n (...args) => unref(onPaste) && unref(onPaste)(...args)),\n onCut: _cache[3] || (_cache[3] = //@ts-ignore\n (...args) => unref(onCut) && unref(onCut)(...args))\n }, [\n (openBlock(true), createElementBlock(Fragment, null, renderList(unref(store).blocks, (block) => {\n return openBlock(), createBlock(_sfc_main$2, {\n key: block.id,\n block,\n slots: unref(slots),\n renderer: props.renderer,\n decorator: props.decorator,\n parser: props.parser,\n onPostrender: onPostRender\n }, null, 8, [\"block\", \"slots\", \"renderer\", \"decorator\", \"parser\"]);\n }), 128)),\n unref(store).blocks.length === 1 && unref(store).blocks[0].text === \"\" && !unref(store).blocks[0].type ? renderSlot(_ctx.$slots, \"placeholder\", { key: 0 }) : createCommentVNode(\"\", true)\n ], 544);\n };\n }\n});\nconst wrapLists = (blocks, creator) => {\n if (!blocks.some((i) => !!creator(i))) {\n return blocks;\n }\n const arr = [];\n let liArray = [];\n let currentListTag = null;\n for (let i of blocks) {\n let listTag = creator(i);\n if (listTag) {\n if (currentListTag == null || listTag !== currentListTag) {\n liArray = [];\n arr.push(liArray);\n currentListTag = listTag;\n }\n liArray.push(i);\n } else {\n arr.push(i);\n currentListTag = null;\n }\n }\n return arr;\n};\nconst _sfc_main = defineComponent({\n props: [\"modelValue\", \"decorator\", \"parser\", \"styles\", \"renderer\", \"listParser\"],\n setup(props, { slots }) {\n const blocks = computed(() => {\n if (Array.isArray(props.modelValue)) {\n if (props.listParser && props.modelValue.some((i) => props.listParser(i))) {\n return wrapLists(props.modelValue, props.listParser);\n }\n return props.modelValue;\n }\n return [{ text: props.modelValue, styles: props.styles ?? [] }];\n });\n return () => h(\"div\", blocks.value.map((block) => {\n var _a;\n return Array.isArray(block) ? h(((_a = props.listParser) == null ? void 0 : _a.call(props, block[0])) ?? \"ul\", { key: block[0].id }, block.map((block2) => h(_sfc_main$2, {\n key: block2.id,\n block: block2,\n slots,\n decorator: props.decorator,\n renderer: props.renderer,\n parser: props.parser,\n static: true\n }))) : h(_sfc_main$2, {\n key: block.id,\n block,\n slots,\n decorator: props.decorator,\n renderer: props.renderer,\n parser: props.parser,\n static: true\n });\n }));\n }\n});\nexport {\n _sfc_main$1 as TextEditor,\n _sfc_main as TextEditorView\n};\n","import type { Block, Style } from \"vuewrite\"\r\n\r\nexport const defaultDecorator = (style: Style) => {\r\n if (style.style === 'color') {\r\n return { style: `color: ${style.meta!.color};` }\r\n }\r\n if (style.style === 'bold') {\r\n return { tag: \"b\", class: \"bold\" }\r\n }\r\n if (style.style === \"underline\") {\r\n return { tag: \"u\", class: \"underline\" }\r\n }\r\n if (style.style === \"italic\") {\r\n return { tag: \"i\", class: \"italic\" }\r\n }\r\n if (style.style === \"strikethrough\") {\r\n return { tag: \"s\", class: \"strikethrough\" }\r\n }\r\n if (style.style === \"code\") {\r\n return { class: style.style }\r\n }\r\n if (style.style === 'link') {\r\n return { tag: \"a\", href: style.meta.url, title: style.meta.pageName ?? style.meta.url, target: style.meta.blank? \"_blank\": undefined }\r\n }\r\n}\r\n\r\nexport const defaultRenderer = (block: Block) => {\r\n if (block.type === 'h1' || block.type === 'h2' || block.type === 'h3' || block.type === 'li') {\r\n return { tag: block.type }\r\n }\r\n if (block.type === 'callout') {\r\n return { class: \"callout\" }\r\n }\r\n return { tag: 'p' }\r\n}\r\n\r\n","import type { Style } from \"vuewrite\"\r\n\r\nexport const codeDecorator = (style: Style) => {\r\n if (!style.meta) return {}\r\n return { style: `color: ${style.meta!.color};` }\r\n}\r\n\r\nconst colors: { [ key: string ]: string} = {\r\n \"const\": \"#FF457D\",\r\n \"let\": \"#FF457D\",\r\n \"var\": \"#FF457D\",\r\n \"new\": \"#FF457D\",\r\n \"class\": \"#FF457D\",\r\n \"else\": \"#FF457D\",\r\n \"if\": \"#FF457D\",\r\n \"for\": \"#FF457D\",\r\n \"continue\": \"#FF457D\",\r\n \"break\": \"#FF457D\",\r\n \"return\": \"#FF457D\",\r\n \"function\": \"#FF457D\",\r\n \"import\": \"#FF457D\",\r\n \"from\": \"#FF457D\"\r\n}\r\nconst quoteColor = \"#032F62\"\r\n\r\nconst nextChar = (str: string, pos: number) => {\r\n for (let i = pos; i < str.length; i++) {\r\n if (str[i] !== \" \") return str[i]\r\n }\r\n return null\r\n}\r\n\r\nexport const codeParser = (text: string) => {\r\n const arr: (Style)[] = []\r\n\r\n let j = 0\r\n let quotes = \"\"\r\n let comment = false\r\n for (let i = 0; i <= text.length; i++) {\r\n if (comment && i === text.length) {\r\n arr.push ({ start: j, end: i, style: \"code\", meta: { color: \"#71808F\" } } )\r\n }\r\n if (comment) continue\r\n if (text[i] === \"/\" && text[i+1] === \"/\" && !quotes) {\r\n comment = true\r\n j = i\r\n continue\r\n }\r\n\r\n if (quotes !== \"\" && text[i] === \"\\\\\") {\r\n i++\r\n continue\r\n }\r\n if ((i === text.length && quotes !== \"\") || \"\\\"'\".includes(text[i])) {\r\n if (quotes !== \"\") {\r\n if (text[i] !== quotes && i !== text.length) continue\r\n arr.push({ start: j, end: i+1, style: \"code\", meta: { color: quoteColor } })\r\n j = i+1\r\n quotes = \"\"\r\n } else {\r\n quotes = text[i]\r\n j = i\r\n }\r\n }\r\n if (quotes !== \"\") continue\r\n\r\n if (i === text.length || \" ()!-=.,;'\\\"/*\".includes(text[i])) {\r\n if (i < j) {\r\n continue\r\n }\r\n const word = text.slice(j, i)\r\n if (nextChar(text, i) === \"(\") {\r\n arr.push({ start: j, end: i, style: \"code\", meta: { color: \"#005CC5\" }}) // Function\r\n } else if (word in colors) {\r\n arr.push({ start: j, end: i, style: \"code\", meta: { color: colors[word] } }) // Key words\r\n } else if (/^-?\\d*\\.?\\d*$/.test(word)) {\r\n if (text[i] === \".\") continue\r\n arr.push({ start: j, end: i, style: \"code\", meta: { color: \"#005CC5\" }}) // Numbers\r\n } else if (text[j-1] === \".\") {\r\n arr.push({ start: j, end: i, style: \"code\", meta: { color: \"#6F42C1\" }}) // Methods\r\n }\r\n j = i+1\r\n }\r\n }\r\n return arr\r\n}\r\n","<template>\r\n <div class=\"code-editor\" :contenteditable=\"false\">\r\n <TextEditor v-model=\"model\" tabindex=\"2\" :parser=\"codeParser\" :decorator=\"codeDecorator\" preventMultiline spellcheck=\"false\" @keydown=\"onKeyDown\"/>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ref, watch } from 'vue';\r\nimport { Style, TextEditor } from 'vuewrite';\r\nimport { codeDecorator, codeParser } from '../utils/richTextCodeComponents';\r\n\r\nconst props = defineProps<{ modelValue?: string }>()\r\nconst emit = defineEmits([ \"update:modelValue\", \"newblock\", \"remove\" ])\r\n\r\nconst model = ref([{ text: \"\" }])\r\nif (props.modelValue) {\r\n model.value = props.modelValue.split(\"\\n\").map(text => ({ text }))\r\n}\r\nwatch(model, () => {\r\n emit(\"update:modelValue\", model.value.map(item => item.text).join(\"\\n\"))\r\n}, { deep: true })\r\n\r\nconst onKeyDown = (e: KeyboardEvent) => {\r\n if ((e.ctrlKey || e.metaKey) && e.code === \"Enter\") {\r\n e.preventDefault()\r\n emit(\"newblock\")\r\n }\r\n if (e.code === \"Backspace\" && !e.shiftKey && model.value.length <= 1 && model.value[0]?.text === \"\") {\r\n e.preventDefault()\r\n emit(\"remove\")\r\n }\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n\r\n.code-editor\r\n background-color: var(--background-color)\r\n border-radius: 6px\r\n font-size: 14px\r\n user-select: none\r\n\r\n &>div\r\n padding: 20px\r\n outline: none\r\n user-select: contain\r\n\r\n</style>","<template>\r\n <template v-if=\"props.state.url\">\r\n <div class=\"rich-text-editor-link-popover__current-item\">\r\n <div class=\"title\">{{ props.state.pageName ?? \"Внешняя ссылка\" }}</div>\r\n <div class=\"path\">{{ props.state.url }}</div>\r\n </div>\r\n <VButton style=\"margin-top: 8px; margin-bottom: 4px\" @click=\"deleteLink\">Удалить ссылку</VButton>\r\n </template>\r\n <template v-else>\r\n <VInput v-model=\"searchValue\" autofocus placeholder=\"Введите URL или название страницы\"/>\r\n <div class=\"rich-text-editor-link-popover__items\">\r\n <button v-for=\"item in items\" class=\"rich-text-editor-link-popover__item\" @click=\"onButtonClick(item)\">\r\n <div class=\"title\">{{ item.name }}</div>\r\n <div class=\"path\">{{ item.path }}</div>\r\n </button>\r\n <button v-if=\"searchValue.length > 0\" class=\"rich-text-editor-link-popover__item\" @click=\"createExternalLink\">\r\n <div class=\"title\">Создать внешнюю ссылку</div>\r\n <div class=\"path\">{{ searchValue }}</div>\r\n </button>\r\n <VCheckbox \r\n v-if=\"searchValue.startsWith('http')\" \r\n v-model=\"openInNewPage\" \r\n label=\"Открывать в новой вкладке\" class=\"rich-text-editor-link-popover__checkbox\"\r\n />\r\n </div>\r\n </template>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { useRequest, useSearch } from 'vuesix';\r\nimport VInput from './VInput.vue';\r\nimport { computed, inject, ref } from 'vue';\r\nimport VButton from './VButton.vue';\r\nimport VCheckbox from './VCheckbox.vue';\r\n\r\nconst props = defineProps<{ state: { url: string, isInternal?: boolean, pageName?: string, blank?: boolean } }>()\r\nconst emit = defineEmits([\"apply\"])\r\n\r\nconst pagesRequest = inject(\"pagesRequest\") as (() => Promise<any>)\r\nconst { data } = useRequest(pagesRequest)\r\n\r\nconst searchValue = ref(\"\")\r\n\r\nconst dataSearchFeed = (item: any) => {\r\n return [\r\n ...item.name.toLowerCase().split(\" \"),\r\n ...item.path.split(\"/\")\r\n ].filter(i => !!i)\r\n}\r\nconst searchFeed = (str: string) => {\r\n return str.replace(/[_\\-,()\\/]/g, \" \").split(\" \")\r\n}\r\n\r\nconst searchData = useSearch(() => searchFeed(searchValue.value), data, dataSearchFeed)\r\nconst openInNewPage = ref(false)\r\n\r\nconst items = computed(() => {\r\n return searchData.value\r\n})\r\n\r\nconst onButtonClick = (item: any) => { \r\n props.state.isInternal = true\r\n props.state.url = item.path\r\n props.state.pageName = item.name\r\n delete props.state.blank\r\n emit(\"apply\")\r\n}\r\n\r\nconst createExternalLink = () => {\r\n delete props.state.isInternal\r\n delete props.state.pageName\r\n props.state.url = searchValue.value.trim()\r\n if (openInNewPage.value) {\r\n props.state.blank = true\r\n } else {\r\n delete props.state.blank\r\n }\r\n emit(\"apply\")\r\n}\r\n\r\nconst deleteLink = () => {\r\n props.state.url = \"\"\r\n emit(\"apply\")\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.rich-text-editor-link-popover\r\n padding: 16px\r\n width: 320px\r\n padding-bottom: 8px\r\n max-height: 300px\r\n\r\n .mech-v-input\r\n margin-right: -4px\r\n\r\n.rich-text-editor-link-popover__items\r\n display: flex\r\n flex-direction: column\r\n margin-top: 8px\r\n margin-left: -12px\r\n margin-right: -12px\r\n\r\n.rich-text-editor-link-popover__item\r\n display: flex\r\n flex-direction: column\r\n height: 48px\r\n justify-content: center\r\n background: none\r\n border: none\r\n text-align: left\r\n padding: 0 12px\r\n border-radius: 12px\r\n cursor: pointer\r\n &:hover\r\n background-color: var(--hover-color)\r\n\r\n .path\r\n color: var(--text-secondary-color)\r\n font-size: 12px\r\n\r\n\r\n.rich-text-editor-link-popover__current-item\r\n display: flex\r\n flex-direction: column\r\n gap: 4px\r\n padding-bottom: 4px\r\n .path\r\n color: var(--text-secondary-color)\r\n font-size: 12px\r\n\r\n.rich-text-editor-link-popover__checkbox\r\n margin-left: 12px\r\n margin-top: 4px\r\n margin-bottom: 6px\r\n gap: 8px\r\n\r\n</style>","<template>\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M4 2H8.5C9.14255 2.0002 9.77266 2.17723 10.3213 2.51171C10.8699 2.84618 11.3159 3.32519 11.6105 3.89627C11.905 4.46734 12.0367 5.10846 11.9911 5.7494C11.9455 6.39033 11.7244 7.00636 11.352 7.53C11.9979 7.93183 12.4953 8.53322 12.7688 9.24307C13.0423 9.95292 13.077 10.7326 12.8676 11.4639C12.6583 12.1952 12.2163 12.8384 11.6086 13.2961C11.001 13.7537 10.2607 14.0008 9.5 14H4C3.73478 14 3.48043 13.8946 3.29289 13.7071C3.10536 13.5196 3 13.2652 3 13V3C3 2.73478 3.10536 2.48043 3.29289 2.29289C3.48043 2.10536 3.73478 2 4 2ZM5 9V12H9.5C9.89782 12 10.2794 11.842 10.5607 11.5607C10.842 11.2794 11 10.8978 11 10.5C11 10.1022 10.842 9.72064 10.5607 9.43934C10.2794 9.15804 9.89782 9 9.5 9H5ZM8.5 7C8.89782 7 9.27936 6.84196 9.56066 6.56066C9.84196 6.27936 10 5.89782 10 5.5C10 5.10218 9.84196 4.72064 9.56066 4.43934C9.27936 4.15804 8.89782 4 8.5 4H5V7H8.5Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M6 2.75C6 2.55109 6.07902 2.36032 6.21967 2.21967C6.36032 2.07902 6.55109 2 6.75 2H13.25C13.4489 2 13.6397 2.07902 13.7803 2.21967C13.921 2.36032 14 2.55109 14 2.75C14 2.94891 13.921 3.13968 13.7803 3.28033C13.6397 3.42098 13.4489 3.5 13.25 3.5H10.745L6.887 12.5H9.25C9.44891 12.5 9.63968 12.579 9.78033 12.7197C9.92098 12.8603 10 13.0511 10 13.25C10 13.4489 9.92098 13.6397 9.78033 13.7803C9.63968 13.921 9.44891 14 9.25 14H2.75C2.55109 14 2.36032 13.921 2.21967 13.7803C2.07902 13.6397 2 13.4489 2 13.25C2 13.0511 2.07902 12.8603 2.21967 12.7197C2.36032 12.579 2.55109 12.5 2.75 12.5H5.255L9.113 3.5H6.75C6.55109 3.5 6.36032 3.42098 6.21967 3.28033C6.07902 3.13968 6 2.94891 6 2.75Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M8 11.0625C9.16032 11.0625 10.2731 10.6016 11.0936 9.78109C11.9141 8.96062 12.375 7.84782 12.375 6.6875V2.3125C12.375 2.08044 12.2828 1.85788 12.1187 1.69378C11.9546 1.52969 11.7321 1.4375 11.5 1.4375C11.2679 1.4375 11.0454 1.52969 10.8813 1.69378C10.7172 1.85788 10.625 2.08044 10.625 2.3125V6.6875C10.625 7.38369 10.3484 8.05137 9.85616 8.54366C9.36387 9.03594 8.69619 9.3125 8 9.3125C7.30381 9.3125 6.63613 9.03594 6.14384 8.54366C5.65156 8.05137 5.375 7.38369 5.375 6.6875V2.3125C5.375 2.08044 5.28281 1.85788 5.11872 1.69378C4.95462 1.52969 4.73206 1.4375 4.5 1.4375C4.26794 1.4375 4.04538 1.52969 3.88128 1.69378C3.71719 1.85788 3.625 2.08044 3.625 2.3125V6.6875C3.625 7.84782 4.08594 8.96062 4.90641 9.78109C5.72688 10.6016 6.83968 11.0625 8 11.0625ZM12.375 12.8125H3.625C3.39294 12.8125 3.17038 12.9047 3.00628 13.0688C2.84219 13.2329 2.75 13.4554 2.75 13.6875C2.75 13.9196 2.84219 14.1421 3.00628 14.3062C3.17038 14.4703 3.39294 14.5625 3.625 14.5625H12.375C12.6071 14.5625 12.8296 14.4703 12.9937 14.3062C13.1578 14.1421 13.25 13.9196 13.25 13.6875C13.25 13.4554 13.1578 13.2329 12.9937 13.0688C12.8296 12.9047 12.6071 12.8125 12.375 12.8125Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M11.055 8.5C11.579 9.036 11.87 9.757 11.866 10.507C11.8673 10.9659 11.7676 11.4195 11.574 11.8357C11.3805 12.2518 11.0978 12.6203 10.746 12.915C9.948 13.597 8.748 14 7.096 14C5.39 14 3.992 13.393 3.194 12.623C3.06263 12.4823 2.99028 12.2966 2.99188 12.1041C2.99349 11.9117 3.06893 11.7272 3.20264 11.5887C3.33634 11.4503 3.5181 11.3684 3.7104 11.3601C3.90269 11.3518 4.09084 11.4176 4.236 11.544C4.716 12.007 5.723 12.5 7.096 12.5C8.518 12.5 9.328 12.154 9.772 11.774C10.207 11.402 10.366 10.935 10.366 10.507C10.366 10.035 10.158 9.65 9.719 9.31C9.271 8.964 8.603 8.687 7.768 8.5H1.75C1.55109 8.5 1.36032 8.42098 1.21967 8.28033C1.07902 8.13968 1 7.94891 1 7.75C1 7.55109 1.07902 7.36032 1.21967 7.21967C1.36032 7.07902 1.55109 7 1.75 7H14.25C14.4489 7 14.6397 7.07902 14.7803 7.21967C14.921 7.36032 15 7.55109 15 7.75C15 7.94891 14.921 8.13968 14.7803 8.28033C14.6397 8.42098 14.4489 8.5 14.25 8.5H11.055ZM7.581 3.25C5.545 3.25 4.803 4.332 4.803 5.036C4.803 5.09067 4.805 5.143 4.809 5.193C4.82412 5.39138 4.75981 5.58764 4.63022 5.73861C4.50063 5.88958 4.31638 5.98288 4.118 5.998C3.91962 6.01312 3.72336 5.94881 3.57239 5.81922C3.42142 5.68963 3.32812 5.50538 3.313 5.307C3.3066 5.21681 3.30327 5.12642 3.303 5.036C3.303 3.204 5.053 1.75 7.581 1.75C8.999 1.75 10.302 2.33 11.095 2.843C11.1777 2.89645 11.2491 2.96567 11.3051 3.04671C11.3611 3.12775 11.4006 3.21902 11.4213 3.31532C11.442 3.41161 11.4435 3.51104 11.4258 3.60793C11.4081 3.70482 11.3714 3.79727 11.318 3.88C11.2646 3.96273 11.1953 4.03413 11.1143 4.09011C11.0333 4.14609 10.942 4.18556 10.8457 4.20627C10.7494 4.22698 10.65 4.22852 10.5531 4.2108C10.4562 4.19308 10.3637 4.15645 10.281 4.103C9.641 3.689 8.619 3.25 7.581 3.25Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M14.8574 13.3334V2.66669C14.8574 1.8286 14.1716 1.14288 13.3335 1.14288H2.66688C1.82878 1.14288 1.14307 1.8286 1.14307 2.66669V13.3334C1.14307 14.1715 1.82878 14.8572 2.66688 14.8572H13.3335C14.1716 14.8572 14.8574 14.1715 14.8574 13.3334ZM5.33354 9.14288L7.2383 11.4362L9.90497 8.00003L13.3335 12.5715H2.66688L5.33354 9.14288Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M10.189 2.04806C10.605 2.19806 10.8186 2.65181 10.6674 3.06281L6.83704 13.4788C6.68504 13.8898 6.22664 14.1013 5.81144 13.9521C5.39544 13.8021 5.18184 13.3483 5.33304 12.9373L9.16344 2.52131C9.31544 2.11031 9.77384 1.89881 10.189 2.04806ZM1.93144 8.19206L4.76024 10.9926C5.07224 11.3016 5.07224 11.8026 4.76024 12.1116C4.68811 12.1847 4.60063 12.243 4.50329 12.2829C4.40596 12.3228 4.30087 12.3434 4.19464 12.3434C4.08841 12.3434 3.98332 12.3228 3.88599 12.2829C3.78865 12.243 3.70117 12.1847 3.62904 12.1116L0.234639 8.75231C0.084409 8.59988 0.000976562 8.39997 0.000976562 8.19244C0.000976562 7.9849 0.084409 7.78499 0.234639 7.63256L3.62904 4.27256C3.70117 4.19944 3.78865 4.1411 3.88599 4.1012C3.98332 4.0613 4.08841 4.0407 4.19464 4.0407C4.30087 4.0407 4.40596 4.0613 4.50329 4.1012C4.60063 4.1411 4.68811 4.19944 4.76024 4.27256C4.9107 4.42503 4.99427 4.6251 4.99427 4.83281C4.99427 5.04052 4.9107 5.24059 4.76024 5.39306L1.93144 8.19206ZM14.069 8.19206L11.2402 5.39306C11.09 5.24063 11.0066 5.04072 11.0066 4.83319C11.0066 4.62565 11.09 4.42574 11.2402 4.27331C11.3124 4.20019 11.3998 4.14185 11.4972 4.10195C11.5945 4.06205 11.6996 4.04145 11.8058 4.04145C11.9121 4.04145 12.0172 4.06205 12.1145 4.10195C12.2118 4.14185 12.2993 4.20019 12.3714 4.27331L15.7658 7.63256C16.0778 7.94156 16.0778 8.44256 15.7658 8.75231L12.3714 12.1108C12.2993 12.1839 12.2118 12.2423 12.1145 12.2822C12.0172 12.3221 11.9121 12.3427 11.8058 12.3427C11.6996 12.3427 11.5945 12.3221 11.4972 12.2822C11.3998 12.2423 11.3124 12.1839 11.2402 12.1108C11.0902 11.9584 11.0069 11.7587 11.0069 11.5513C11.0069 11.344 11.0902 11.1442 11.2402 10.9918L14.069 8.19206Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M11 17H7C5.61667 17 4.43767 16.5123 3.463 15.537C2.48833 14.5617 2.00067 13.3827 2 12C1.99933 10.6173 2.487 9.43833 3.463 8.463C4.439 7.48767 5.618 7 7 7H11V9H7C6.16667 9 5.45833 9.29167 4.875 9.875C4.29167 10.4583 4 11.1667 4 12C4 12.8333 4.29167 13.5417 4.875 14.125C5.45833 14.7083 6.16667 15 7 15H11V17ZM8 13V11H16V13H8ZM13 17V15H17C17.8333 15 18.5417 14.7083 19.125 14.125C19.7083 13.5417 20 12.8333 20 12C20 11.1667 19.7083 10.4583 19.125 9.875C18.5417 9.29167 17.8333 9 17 9H13V7H17C18.3833 7 19.5627 7.48767 20.538 8.463C21.5133 9.43833 22.0007 10.6173 22 12C21.9993 13.3827 21.5117 14.562 20.537 15.538C19.5623 16.514 18.3833 17.0013 17 17H13Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\r\n <VDialog class=\"rich-text-editor__dialog\">\r\n <template #header>\r\n {{ props.label ?? \"Редактирование текста\" }}\r\n </template>\r\n <div class=\"rich-text-editor__controls\">\r\n <VSelect v-model=\"blockType\" :items=\"blockTypes\" style=\"width: 200px\"/>\r\n <div class=\"rich-text-editor__actions-group\">\r\n <button v-for=\"item in styles\" :class=\"{ active: item.active }\" @click=\"item.onClick\">\r\n <component :is=\"item.icon\" />\r\n </button>\r\n </div>\r\n <div class=\"rich-text-editor__actions-group\" >\r\n <button :class=\"{ active: textEditorRef?.currentStyles.has('link') }\" @click=\"insertLink\">\r\n <LinkIcon/>\r\n </button>\r\n </div>\r\n <div class=\"rich-text-editor__actions-group\">\r\n <button title=\"Вставить изображение\" @click=\"insertImage\"><ImageSolidIcon/></button>\r\n <button title=\"Вставить элемент кода\" @click=\"insertCodeBlock\"><CodeIcon/></button>\r\n </div>\r\n </div>\r\n <TextEditor \r\n ref=\"textEditorRef\" \r\n v-model=\"model\" \r\n class=\"text-editor\" \r\n :renderer=\"defaultRenderer\" \r\n :decorator=\"defaultDecorator\" \r\n @keydown=\"onKeyDown\"\r\n :html-parser=\"htmlParser\"\r\n >\r\n <template #code=\"{ props, block }\">\r\n <RichTextEditorCode \r\n v-model=\"block.text\" \r\n v-bind=\"props\" \r\n @newblock=\"textEditorRef?.addNewLine()\" \r\n @remove=\"textEditorRef?.removeCurrentBlock()\"\r\n />\r\n </template>\r\n <template #image=\"{ props, block }\">\r\n <VImageUploader \r\n v-model=\"block.image\" \r\n v-bind=\"props\" \r\n :class=\"{ selected: textEditorRef?.selection.focus.blockId === block.id }\" \r\n contenteditable=\"false\"\r\n @keydown=\"onKeyDown\"\r\n />\r\n </template>\r\n <template #placeholder>\r\n <div class=\"rich-text-editor__placeholder\" :contenteditable=\"false\">Введите текст...</div>\r\n </template>\r\n </TextEditor>\r\n <VPopover\r\n class=\"rich-text-editor-link-popover scroll\"\r\n :open=\"linkPopoverState != null\"\r\n placement=\"bottom-start\"\r\n :anchor-position=\"linkPopoverPosition\"\r\n :offset=\"4\"\r\n @update:open=\"onUpdateLinkPopoverOpen\"\r\n >\r\n <RichTextEditorLinkPopover \r\n v-if=\"linkPopoverState !== null\" \r\n :state=\"linkPopoverState\"\r\n @apply=\"onLinkApply\"\r\n />\r\n </VPopover>\r\n <div v-if=\"cachedSelection\" :style=\"cachedSelection\" class=\"rich-text-editor__cached-selection\"></div>\r\n </VDialog>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { TextEditor, TextEditorRef } from 'vuewrite';\r\nimport VDialog from '../VDialog.vue';\r\nimport VSelect from '../VSelect.vue';\r\nimport { computed, CSSProperties, getCurrentInstance, nextTick, ref, shallowRef } from 'vue';\r\nimport { defaultDecorator, defaultRenderer } from '../../utils/richTextComponents';\r\nimport RichTextEditorCode from '../RichTextEditorCode.vue';\r\nimport VImageUploader from '../VImageUploader.vue'\r\nimport RichTextEditorLinkPopover from '../RichTextEditorLinkPopover.vue'\r\n\r\nimport TextBoldIcon from '../icons/TextBoldIcon.vue'\r\nimport TextItalicIcon from '../icons/TextItalicIcon.vue'\r\nimport TextUnderlineIcon from '../icons/TextUnderlineIcon.vue'\r\nimport TextStrikethroughIcon from '../icons/TextStrikethroughIcon.vue'\r\nimport ImageSolidIcon from '../icons/ImageSolidIcon.vue'\r\nimport CodeIcon from '../icons/CodeIcon.vue'\r\nimport LinkIcon from '../icons/LinkIcon.vue'\r\nimport VPopover from '../VPopover.vue';\r\n\r\nconst props = defineProps<{ label?: string }>()\r\nconst model = defineModel<any[]>()\r\nif (!model.value || model.value.length === 0) {\r\n model.value = [{ text: \"\" }]\r\n}\r\n\r\nconst blockTypes = [\r\n { id: \"default\", title: \"Обычный текст\" },\r\n { id: \"h1\", title: \"Заголовок 1\" },\r\n { id: \"h2\", title: \"Заголовок 2\" },\r\n { id: \"h3\", title: \"Заголовок 3\" },\r\n { id: \"li\", title: \"Список\" },\r\n { id: \"callout\", title: \"Callout\" },\r\n { id: \"code\", title: \"Элемент кода\" }\r\n]\r\nconst textEditorRef = shallowRef<TextEditorRef>()\r\n\r\nconst blockType = computed({\r\n get() {\r\n if (!textEditorRef.value) return \"default\"\r\n let type: string | undefined | null = null\r\n for (let block of textEditorRef.value.getCurrentBlocks()) {\r\n if (type === null) {\r\n type = block.type\r\n } else if (type !== block.type) {\r\n type = \"mixed\"\r\n break\r\n }\r\n }\r\n return type ?? \"default\"\r\n },\r\n set(type) {\r\n if (!model.value || !textEditorRef.value) return\r\n for (let block of textEditorRef.value.getCurrentBlocks()) {\r\n if (type === \"default\") {\r\n delete block.type\r\n } else {\r\n block.type = type ?? undefined\r\n }\r\n if (type === \"code\") {\r\n block.editable = false\r\n } else {\r\n delete block.editable\r\n }\r\n }\r\n }\r\n})\r\n\r\nconst styles = computed(() => {\r\n const textEditor = textEditorRef.value\r\n if (!textEditor) return []\r\n const currentStyles = textEditor.currentStyles\r\n return [\r\n { icon: TextBoldIcon, active: currentStyles.has(\"bold\"), onClick: () => textEditor.toggleStyle(\"bold\") },\r\n { icon: TextItalicIcon, active: currentStyles.has(\"italic\"), onClick: () => textEditor.toggleStyle(\"italic\") },\r\n { icon: TextUnderlineIcon, active: currentStyles.has(\"underline\"), onClick: () => textEditor.toggleStyle(\"underline\") },\r\n { icon: TextStrikethroughIcon, active: currentStyles.has(\"strikethrough\"), onClick: () => textEditor.toggleStyle(\"strikethrough\") }\r\n ]\r\n})\r\n\r\nconst canInsertLink = computed(() => {\r\n if (!textEditorRef.value) return false\r\n return !textEditorRef.value.isCollapsed && \r\n textEditorRef.value.selection.anchor.blockId === textEditorRef.value.selection.focus.blockId\r\n})\r\n\r\nconst linkPopoverPosition = shallowRef({ x: 0, y: 0 })\r\nconst cachedSelection = shallowRef<CSSProperties | null>(null)\r\nconst linkPopoverState = shallowRef<null | { url: \"\", isInternal?: boolean, pageName?: string }>(null)\r\n\r\nconst el = getCurrentInstance()\r\n\r\nlet lastSelection: any\r\nconst insertLink = () => {\r\n\r\n const currentLink = textEditorRef.value!.currentStyles.get(\"link\")\r\n if (!currentLink && !canInsertLink.value) return\r\n\r\n const selection = window.getSelection()\r\n let range = selection?.getRangeAt(0)\r\n if (!selection || !range) return\r\n\r\n lastSelection = JSON.parse(JSON.stringify(textEditorRef.value!.selection))\r\n if (currentLink && range && textEditorRef.value?.isCollapsed) {\r\n const newRange = document.createRange();\r\n newRange.selectNodeContents(range.startContainer.parentElement!);\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n \r\n lastSelection.anchor.offset -= range.startOffset\r\n lastSelection.focus.offset += range.startContainer.textContent!.length - range.endOffset\r\n }\r\n\r\n const rect = selection?.getRangeAt(0)?.getBoundingClientRect()\r\n if (!rect) return\r\n\r\n linkPopoverPosition.value = { x: rect.left, y: rect.bottom }\r\n linkPopoverState.value = currentLink?.meta? { ...currentLink.meta }: { url: \"\" }\r\n\r\n const container = el!.vnode.el!\r\n const containerRect = container.getBoundingClientRect()\r\n\r\n\r\n cachedSelection.value = { \r\n top: rect.top - containerRect.top + container.scrollTop +'px', \r\n left: rect.left - containerRect.left + 'px', \r\n width: rect.width+'px', \r\n height: rect.height+'px' \r\n }\r\n}\r\n\r\nconst onUpdateLinkPopoverOpen = (val: boolean) => {\r\n if (val === false) {\r\n linkPopoverState.value = null\r\n cachedSelection.value = null\r\n el!.vnode.el!.querySelector(\".text-editor\").focus()\r\n setTimeout(() =>{ \r\n Object.assign(textEditorRef.value!.selection, lastSelection)\r\n }, 0)\r\n }\r\n}\r\nconst onLinkApply = () => {\r\n const state = linkPopoverState.value\r\n linkPopoverState.value = null\r\n \r\n Object.assign(textEditorRef.value!.selection, lastSelection)\r\n if (!state || state.url === \"\") {\r\n textEditorRef.value?.removeStyle(\"link\")\r\n } else {\r\n textEditorRef.value?.applyStyle(\"link\", state)\r\n }\r\n onUpdateLinkPopoverOpen(false)\r\n}\r\n\r\nconst onKeyDown = (e: KeyboardEvent) => {\r\n if ((e.ctrlKey || e.metaKey) && !e.shiftKey && !e.altKey) {\r\n if (e.code === \"KeyB\") {\r\n textEditorRef.value?.toggleStyle(\"bold\")\r\n }\r\n if (e.code === \"KeyI\") {\r\n textEditorRef.value?.toggleStyle(\"italic\")\r\n }\r\n if (e.code === \"KeyU\") {\r\n textEditorRef.value?.toggleStyle(\"underline\")\r\n }\r\n if (e.code === \"KeyK\") {\r\n e.preventDefault()\r\n if (textEditorRef.value?.currentStyles.has('link')) {\r\n textEditorRef.value.removeStyle(\"link\")\r\n } else {\r\n insertLink()\r\n }\r\n }\r\n }\r\n // if (e.key === \"Enter\" && popoverOpen.value && activeItem.value) {\r\n // e.preventDefault()\r\n // activeItem.value.onClick()\r\n // return\r\n // }\r\n if (e.key === \"Enter\" && !e.shiftKey && textEditorRef.value?.currentBlock?.type === \"li\") {\r\n e.preventDefault()\r\n textEditorRef.value.addNewLine()\r\n textEditorRef.value!.currentBlock.type = \"li\"\r\n textEditorRef.value.pushHistory(\"setText\")\r\n }\r\n if (textEditorRef.value?.currentBlock?.editable === false && textEditorRef.value.currentBlock.type !== 'code' && (e.code === \"Backspace\" || e.code === \"Delete\")) {\r\n textEditorRef.value.removeCurrentBlock()\r\n e.preventDefault()\r\n }\r\n // if ((e.key === \"ArrowUp\" || e.key === \"ArrowDown\") && popoverOpen.value && visibleBlocks.value.length > 0) {\r\n // e.preventDefault()\r\n // const index = visibleBlocks.value.indexOf(activeItem.value!)\r\n // let newIndex = index + (e.key === \"ArrowUp\"? -1: 1)\r\n // if (newIndex < 0) newIndex = visibleBlocks.value.length-1\r\n // if (newIndex >= visibleBlocks.value.length) newIndex = 0\r\n // activeItem.value = visibleBlocks.value[newIndex]\r\n // }\r\n}\r\n\r\nconst htmlParser = (el: Element) => {\r\n if (el.tagName === \"LI\") return 'li'\r\n if (el.tagName === \"H1\") return \"h1\"\r\n if (el.tagName === \"H2\") return \"h2\"\r\n if (el.tagName === \"H3\") return \"h3\"\r\n}\r\n\r\nconst insertCodeBlock = () => {\r\n textEditorRef.value?.insertBlock({ type: \"code\", editable: false, text: \"\" })\r\n}\r\n\r\nconst insertImage = () => {\r\n textEditorRef.value?.insertBlock({ type: \"image\", editable: false, text: \"\" })\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.rich-text-editor__dialog\r\n width: 800px\r\n .v-dialog__content\r\n padding: 0\r\n\r\n .text-editor\r\n padding: 20px 24px\r\n outline: none\r\n white-space: pre-wrap\r\n word-break: break-all\r\n min-height: 400px\r\n padding-top: 16px\r\n position: relative\r\n\r\n .bold\r\n font-weight: 700\r\n .italic\r\n font-style: italic\r\n .underline\r\n text-decoration: underline\r\n .strikethrough\r\n text-decoration: line-through\r\n \r\n .callout\r\n background-color: rgba(#0073E9, 0.1)\r\n border: 1px solid var(--primary-color)\r\n border-radius: 8px\r\n padding: 16px\r\n margin-bottom: 8px\r\n margin-top: 8px\r\n\r\n .v-image-uploader\r\n width: 320px\r\n margin-top: 12px\r\n margin-bottom: 12px\r\n &.selected .v-form-control__outline\r\n border-color: var(--primary-color)\r\n box-shadow: 0 0 0 2px var(--shadow-color)\r\n\r\n.rich-text-editor__placeholder\r\n position: absolute\r\n top: 16px\r\n left: 24px\r\n color: var(--text-secondary-color)\r\n margin-top: 1em\r\n \r\n.rich-text-editor__controls\r\n height: 40px\r\n padding: 0 24px\r\n display: flex\r\n align-items: center\r\n padding-top: 12px\r\n gap: 12px\r\n\r\n.rich-text-editor__cached-selection\r\n position: absolute\r\n background-color: rgba(0, 0, 0, 0.25)\r\n\r\n.rich-text-editor__actions-group\r\n height: 40px\r\n // background-color: var(--blocks-color)\r\n border: 1px solid var(--input-border-color)\r\n border-radius: 8px\r\n padding: 3px\r\n box-sizing: border-box\r\n display: flex\r\n button\r\n background: none\r\n border: none\r\n height: 32px\r\n width: 32px\r\n cursor: pointer\r\n border-radius: 6px\r\n color: var(--text-secondary-color)\r\n display: flex\r\n align-items: center\r\n justify-content: center\r\n\r\n &:hover\r\n background-color: var(--hover-color)\r\n\r\n &.active\r\n background-color: var(--background-active-color)\r\n color: var(--text-color)\r\n\r\n &.disabled\r\n pointer-events: none\r\n opacity: 0.6\r\n\r\n</style>","<template>\r\n <VFormControl :label=\"props.label\" class=\"rich-text-editor\">\r\n <div class=\"v-form-control__outline\">\r\n <TextEditor v-model=\"model\" class=\"rich-text-editor__editor\"/>\r\n </div>\r\n <VButton @click=\"openTextEditor\">Редактировать</VButton>\r\n </VFormControl>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { TextEditor } from 'vuewrite';\r\nimport VFormControl from './VFormControl.vue';\r\nimport VButton from './VButton.vue';\r\nimport { useDialog } from './VDialogProvider.vue';\r\nimport RichTextEditorDialog from './dialogs/RichTextEditorDialog.vue';\r\n\r\nconst props = defineProps<{ label?: string }>()\r\nconst model = defineModel<any[]>()\r\n\r\nconst dialog = useDialog()\r\nconst openTextEditor = () => {\r\n dialog.open(RichTextEditorDialog, { \r\n label: props.label,\r\n modelValue: model.value, \r\n [\"onUpdate:modelValue\"]: (val: any) => model.value = val \r\n } as any)\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.rich-text-editor\r\n\r\n .v-form-control__outline\r\n height: 60px\r\n overflow-x: hidden\r\n overflow-y: auto\r\n display: block\r\n\r\n .rich-text-editor__editor\r\n width: 100%\r\n outline: none\r\n padding: 8px 12px\r\n overflow: hidden\r\n box-sizing: border-box\r\n word-break: break-all\r\n min-height: 100%\r\n white-space: pre-wrap\r\n\r\n .mech-v-button\r\n margin-top: 8px\r\n height: 32px\r\n font-size: 12px\r\n width: fit-content\r\n\r\n\r\n</style>","<template>\n<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M6.25 1.25C5.58696 1.25 4.95107 1.51339 4.48223 1.98223C4.01339 2.45107 3.75 3.08696 3.75 3.75V16.25C3.75 16.913 4.01339 17.5489 4.48223 18.0178C4.95107 18.4866 5.58696 18.75 6.25 18.75H13.75C14.413 18.75 15.0489 18.4866 15.5178 18.0178C15.9866 17.5489 16.25 16.913 16.25 16.25V6.7675C16.2496 6.27039 16.0517 5.79379 15.7 5.4425L12.0588 1.79875C11.8846 1.62467 11.6778 1.4866 11.4502 1.39245C11.2227 1.29829 10.9788 1.24989 10.7325 1.25H6.25ZM5 3.75C5 3.41848 5.1317 3.10054 5.36612 2.86612C5.60054 2.6317 5.91848 2.5 6.25 2.5H10V5.625C10 6.12228 10.1975 6.59919 10.5492 6.95083C10.9008 7.30246 11.3777 7.5 11.875 7.5H15V16.25C15 16.5815 14.8683 16.8995 14.6339 17.1339C14.3995 17.3683 14.0815 17.5 13.75 17.5H6.25C5.91848 17.5 5.60054 17.3683 5.36612 17.1339C5.1317 16.8995 5 16.5815 5 16.25V3.75ZM14.7413 6.25H11.875C11.7092 6.25 11.5503 6.18415 11.4331 6.06694C11.3158 5.94973 11.25 5.79076 11.25 5.625V2.75875L14.7413 6.25Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\r\n <VFormControl \r\n class=\"v-image-uploader v-file-uploader\" \r\n :class=\"{ drag }\"\r\n :error=\"error\" \r\n :label=\"label\" \r\n :required=\"required\" \r\n :disabled=\"disabled\" \r\n outline\r\n @drop=\"onDrop\"\r\n @dragover=\"onDragOver\" \r\n @dragleave=\"onDragLeave\"\r\n >\r\n <template v-if=\"drag\">\r\n <div class=\"v-image-uploader__drag-label\">Отпустите файл здесь</div>\r\n </template>\r\n <template v-else-if=\"!props.modelValue || props.modelValue.src === ''\">\r\n <EmptyFileIcon/>\r\n <div>\r\n <a @click=\"fileDialog.open()\">Загрузите файл</a>\r\n <br/>или перетащите сюда\r\n </div>\r\n </template>\r\n <template v-else>\r\n <div class=\"v-file-uploader__file-name\" >\r\n <FileIcon/>\r\n {{ props.modelValue.name }}\r\n <!-- <img :src=\"props.modelValue.previewSrc ?? props.modelValue.src\" alt=\"Preview Image\" /> -->\r\n </div>\r\n <VIconButton class=\"v-file-uploader__delete-button\" @click=\"removeImage\"><CloseMinIcon/></VIconButton>\r\n </template>\r\n </VFormControl>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { inject, ref } from 'vue';\r\nimport VFormControl, { VFormControlProps } from './VFormControl.vue';\r\nimport EmptyFileIcon from './icons/EmptyFileIcon.vue'\r\nimport CloseMinIcon from './icons/CloseMinIcon.vue'\r\nimport FileIcon from './icons/FileIcon.vue'\r\nimport { useFileDialog } from '@vueuse/core'\r\nimport { getDefaultValue } from '../utils/passDefaultValue';\r\nimport VIconButton from './VIconButton.vue';\r\nimport { useDialog } from './VDialogProvider.vue';\r\nimport ProjectImagesDialog from './dialogs/ProjectImagesDialog.vue'\r\n\r\nconst props = defineProps<{ \r\n accept?: string,\r\n schema?: any,\r\n modelValue?: FileInfo | null,\r\n} & VFormControlProps>()\r\nconst emit = defineEmits([ \"update:modelValue\" ])\r\n\r\nconst fileUploader = inject(\"fileUploader\") as (file: File) => Promise<any>\r\nconst fileRequest = inject(\"fileRequest\", null) as (() => Promise<any>) | null\r\n\r\nconst addFile = async (file: File) => {\r\n emit(\"update:modelValue\", { src: URL.createObjectURL(file), file, name: file.name })\r\n if (fileUploader) {\r\n const resp = await fileUploader(file)\r\n emit(\"update:modelValue\", { src: resp.src, previewSrc: resp.previewSrc, name: resp.name })\r\n }\r\n // emit(\"loadFile\", file)\r\n}\r\n\r\nconst drag = ref(false)\r\nconst onDragOver = (e: DragEvent) => {\r\n if (e.dataTransfer?.types?.[0]?.startsWith('text')) return\r\n e.preventDefault()\r\n drag.value = true\r\n}\r\n\r\nconst onDragLeave = (e: DragEvent) => {\r\n if (e.relatedTarget === e.currentTarget || (e.relatedTarget as HTMLElement)?.parentElement === e.currentTarget) return\r\n drag.value = false\r\n}\r\n\r\nconst onDrop = (e: DragEvent) => {\r\n e.preventDefault()\r\n drag.value = false\r\n\r\n for (const item of (e as any).dataTransfer.items) {\r\n if (item.kind !== 'file') continue\r\n const file = item.getAsFile() as File\r\n if (!file) continue\r\n\r\n addFile(file)\r\n }\r\n}\r\n\r\nconst fileDialog = useFileDialog({\r\n accept: props.accept,\r\n multiple: false\r\n})\r\n\r\nfileDialog.onChange((files) => {\r\n if (!files || files.length === 0) return\r\n for (const file of files) {\r\n addFile(file)\r\n }\r\n fileDialog.reset()\r\n})\r\n\r\nconst removeImage = () => {\r\n emit(\"update:modelValue\", getDefaultValue(props.schema ?? { type: \"object\", format: \"file\" }))\r\n}\r\n\r\nconst dialog = useDialog()\r\nconst contextMenuItems: any[] = []\r\n\r\nconst onOpenImage = (image: any) => {\r\n emit(\"update:modelValue\", image)\r\n}\r\n\r\nif (fileRequest) {\r\n contextMenuItems.push({ title: \"Выбрать из файлов проекта\", onClick: () => dialog.open(ProjectImagesDialog as any, { fileRequest, onOpenImage }) })\r\n}\r\n\r\n</script>\r\n\r\n<script lang=\"ts\">\r\nexport type FileInfo = {\r\n id?: string,\r\n file?: File,\r\n src: string,\r\n name: string,\r\n previewSrc?: string,\r\n progress?: number | null\r\n}\r\n\r\n</script>\r\n\r\n\r\n<style lang=\"sass\">\r\n\r\n.v-file-uploader__file-name\r\n word-break: break-all\r\n color: var(--text-color)\r\n display: flex\r\n align-items: center\r\n gap: 4px\r\n\r\n svg\r\n color: var(--icon-color)\r\n margin-left: -2px\r\n flex-shrink: 0\r\n\r\n.v-file-uploader__delete-button\r\n top: -10px\r\n right: -10px\r\n flex-shrink: 0\r\n margin-left: -8px\r\n svg\r\n width: 10px\r\n height: 10px\r\n\r\n</style>","<template>\r\n <VFormControl\r\n outline\r\n class=\"v-multiselect\"\r\n :label=\"props.label\"\r\n :error=\"props.error\"\r\n :disabled=\"props.disabled\"\r\n :required=\"props.required\"\r\n >\r\n <VPopover v-model:open=\"opened\" placement=\"bottom\" fit-anchor :offset=\"8\">\r\n \r\n <!-- ACTIVATOR -->\r\n <template #activator=\"{ props: activatorProps }\">\r\n <button\r\n class=\"v-multiselect__activator\"\r\n :class=\"{ opened }\"\r\n v-bind=\"activatorProps\"\r\n >\r\n <div v-if=\"selectedItems.length\">\r\n {{ displayValue }}\r\n </div>\r\n <div v-else class=\"v-multiselect__placeholder\">\r\n {{ props.placeholder ?? 'Выберите значения' }}\r\n </div>\r\n <ArrowDownIcon/>\r\n </button>\r\n\r\n <div class=\"v-multiselect__actions\">\r\n <slot></slot>\r\n\r\n <VIconButton\r\n v-if=\"nullable && model.length\"\r\n title=\"Очистить\"\r\n class=\"v-multiselect__delete-button\"\r\n @click=\"resetValue\"\r\n >\r\n <CloseMinIcon/>\r\n </VIconButton>\r\n </div>\r\n </template>\r\n\r\n <!-- MENU -->\r\n <div class=\"v-multiselect__menu\">\r\n <template v-for=\"item in items\">\r\n \r\n <div v-if=\"item === ''\" class=\"v-multiselect__divider\"></div>\r\n\r\n <div v-else-if=\"typeof item === 'string'\" class=\"group-title\">\r\n {{ item }}\r\n </div>\r\n\r\n <label v-else class=\"v-multiselect__item\">\r\n <VCheckbox\r\n :model-value=\"isSelected(item)\"\r\n @update:model-value=\"() => toggleItem(item)\"\r\n />\r\n \r\n <span>\r\n <slot name=\"item\" :item=\"item\">\r\n {{ item.title }}\r\n </slot>\r\n </span>\r\n </label>\r\n\r\n </template>\r\n </div>\r\n\r\n </VPopover>\r\n </VFormControl>\r\n</template>\r\n\r\n<script lang=\"ts\" setup generic=\"T extends { id: number | string, title?: string }\">\r\nimport { computed, ref } from 'vue'\r\n\r\nimport VFormControl, { VFormControlProps } from './VFormControl.vue'\r\nimport VPopover from './VPopover.vue'\r\nimport VCheckbox from './VCheckbox.vue'\r\nimport VIconButton from './VIconButton.vue'\r\n\r\nimport ArrowDownIcon from './icons/ArrowDownIcon.vue'\r\nimport CloseMinIcon from './icons/CloseMinIcon.vue'\r\n\r\nconst props = defineProps<{\r\n items: (T | string)[]\r\n placeholder?: string\r\n nullable?: boolean\r\n visualValue?: string\r\n} & VFormControlProps>()\r\n\r\nconst model = defineModel<T['id'][]>({ default: [] })\r\nif (!Array.isArray(model.value)) {\r\n model.value = []\r\n}\r\n\r\nconst opened = ref(false)\r\n\r\n/* -----------------------------\r\n COMPUTED\r\n----------------------------- */\r\n\r\nconst items = computed(() => props.items)\r\n\r\nconst selectedItems = computed<T[]>(() => {\r\n return props.items.filter(\r\n (item): item is T =>\r\n typeof item !== 'string' && model.value.includes(item.id)\r\n )\r\n})\r\n\r\nconst displayValue = computed(() => {\r\n if (props.visualValue) return props.visualValue\r\n return selectedItems.value.map(i => i.title).join(', ')\r\n})\r\n\r\n/* -----------------------------\r\n METHODS\r\n----------------------------- */\r\n\r\nconst isSelected = (item: T) => {\r\n return model.value.includes(item.id)\r\n}\r\n\r\nconst toggleItem = (item: T) => {\r\n if (isSelected(item)) {\r\n model.value = model.value.filter(id => id !== item.id)\r\n } else {\r\n model.value = [...model.value, item.id]\r\n }\r\n}\r\n\r\nconst resetValue = () => {\r\n model.value = []\r\n}\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-multiselect\r\n .v-form-control__outline\r\n height: 40px\r\n\r\n.v-multiselect__activator\r\n background: none\r\n border: none\r\n display: flex\r\n align-items: center\r\n padding: 0 12px\r\n width: 100%\r\n color: var(--text-color)\r\n text-align: left\r\n cursor: pointer\r\n outline: none\r\n\r\n &>div\r\n flex: 1 1 auto\r\n\r\n svg\r\n margin-right: -2px\r\n color: var(--icon-color)\r\n width: 12px\r\n pointer-events: none\r\n\r\n &.opened\r\n svg\r\n transform: rotate(180deg)\r\n\r\n.v-multiselect__placeholder\r\n color: var(--text-secondary-color)\r\n\r\n.v-multiselect__actions\r\n position: absolute\r\n right: 28px\r\n bottom: 9px\r\n display: flex\r\n align-items: center\r\n gap: 2px\r\n height: 20px\r\n\r\n.v-multiselect__delete-button\r\n svg\r\n width: 10px\r\n height: 10px\r\n\r\n.v-multiselect__menu\r\n display: flex\r\n flex-direction: column\r\n padding: 6px\r\n\r\n.v-multiselect__item\r\n display: flex\r\n align-items: center\r\n gap: 8px\r\n padding: 6px 8px\r\n cursor: pointer\r\n border-radius: 6px\r\n\r\n &:hover\r\n background-color: var(--hover-color)\r\n\r\n.group-title\r\n padding: 4px 8px 0\r\n font-size: 13px\r\n color: var(--text-secondary-color)\r\n\r\n.v-multiselect__divider\r\n border-bottom: 1px solid var(--border-color)\r\n margin: 4px 8px\r\n</style>","<template>\r\n <VImageUploader \r\n v-if=\"props.schema.type === 'object' && props.schema.format === 'image'\" \r\n v-model=\"vModel\" \r\n :label=\"props.schema.name ?? props.name\"\r\n :schema=\"props.schema\"\r\n />\r\n <VFileUploader\r\n v-else-if=\"props.schema.type === 'object' && props.schema.format === 'file'\" \r\n v-model=\"vModel\" \r\n :accept=\"props.schema.accept\"\r\n :label=\"props.schema.name ?? props.name\"\r\n :schema=\"props.schema\"\r\n />\r\n <VMultiSelect\r\n v-else-if=\"props.schema.type === 'array' && props.schema.format === 'multiselect'\" \r\n v-model=\"vModel\" \r\n :items=\"getItemsMultiselect(props.schema)\"\r\n :label=\"props.schema.name ?? props.name\"\r\n />\r\n <VLinkEditor \r\n v-else-if=\"props.schema.type === 'object' && props.schema.format === 'smartLink'\" \r\n v-model=\"vModel\" \r\n :label=\"props.schema.name ?? props.name\"\r\n :schema=\"props.schema\"\r\n :nullable=\"props.schema.nullable || props.nullable\"\r\n />\r\n <VRichTextEditor\r\n v-else-if=\"props.schema.type === 'array' && props.schema.format === 'richText'\"\r\n v-model=\"vModel\" \r\n :label=\"props.schema.name ?? props.name\"\r\n :schema=\"props.schema\"\r\n />\r\n <div v-else-if=\"props.schema.type === 'object'\" class=\"json-editor__object\">\r\n <template v-if=\"props.flat\">\r\n <JsonEditor \r\n v-for=\"(item, key) in (props.schema.properties as object)\" \r\n v-model=\"vModel[key]\"\r\n :key=\"key\" \r\n :schema=\"item\"\r\n :expanded=\"childExpanded\"\r\n :name=\"spaceCamelCase(key)\"\r\n :nullable=\"!props.schema.required?.includes(key)\"\r\n @edit=\"emit('edit', join(key, $event))\"\r\n />\r\n </template>\r\n <VCollapse v-else :label=\"props.schema.name ?? props.name\" :open=\"props.expanded\">\r\n <JsonEditor \r\n v-for=\"(item, key) in (props.schema.properties as object)\" \r\n v-model=\"vModel[key]\"\r\n :key=\"key\" \r\n :schema=\"item\"\r\n :expanded=\"childExpanded\"\r\n :name=\"spaceCamelCase(key)\"\r\n :nullable=\"!props.schema.required?.includes(key)\"\r\n @edit=\"emit('edit', join(key, $event))\"\r\n />\r\n </VCollapse>\r\n </div>\r\n <JsonEditorArray \r\n v-else-if=\"props.schema.type === 'array'\" \r\n v-model=\"vModel\" \r\n :schema=\"props.schema\"\r\n :label=\"props.schema.name ?? props.name\"\r\n :expanded=\"props.expanded\"\r\n @edit=\"emit('edit', $event)\"\r\n />\r\n <VSelect \r\n v-else-if=\"props.schema.type === 'string' && props.schema.enum\" \r\n :nullable=\"props.schema.nullable || props.nullable\"\r\n :items=\"getItems(props.schema)\"\r\n v-model=\"vModel\"\r\n :label=\"props.schema.name ?? props.name\"\r\n />\r\n <VCheckbox\r\n v-else-if=\"props.schema.type === 'boolean'\"\r\n v-model=\"vModel\"\r\n :label=\"props.schema.name ?? props.name\"\r\n />\r\n <VInput \r\n v-else\r\n v-model=\"vModel\"\r\n :label=\"props.schema.name ?? props.name\"\r\n :multiline=\"props.schema.multiline\"\r\n :placeholder=\"props.schema.placeholder\"\r\n >\r\n <!-- <template #actions><JsonEditorActions v-model=\"vModel\" :defaultValue=\"getDefaultValue(props.schema)\"/></template> -->\r\n </VInput>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport VInput from './VInput.vue';\r\nimport VCollapse from './VCollapse.vue'\r\nimport VSelect from './VSelect.vue'\r\nimport JsonEditorArray from './JsonEditorArray.vue'\r\nimport VImageUploader from './VImageUploader.vue'\r\nimport VCheckbox from './VCheckbox.vue'\r\nimport { spaceCamelCase } from '../utils/lang'\r\nimport { getDefaultValue } from '../utils/passDefaultValue';\r\nimport VLinkEditor from './VLinkEditor.vue';\r\nimport VRichTextEditor from './VRichTextEditor.vue';\r\nimport { watch } from 'vue';\r\nimport VFileUploader from './VFileUploader.vue';\r\nimport VMultiSelect from './VMultiSelect.vue';\r\n\r\nconst props = defineProps<{ schema: any, name?: string, flat?: boolean, expanded?: boolean, nullable?: boolean }>()\r\nconst emit = defineEmits([ \"edit\" ])\r\n\r\nconst childExpanded = props.schema.type === 'object' && Object.keys(props.schema.properties).length < 2\r\n\r\nconst vModel = defineModel<any>()\r\n\r\nif (vModel.value !== null && vModel.value !== undefined) {\r\n if (props.schema.type === 'object' && typeof vModel.value !== \"object\") {\r\n vModel.value = getDefaultValue(props.schema)\r\n }\r\n}\r\n\r\nwatch(vModel, () => emit(\"edit\"))\r\n\r\n// const onPropertyUpdate = (key: string, value: any) => {\r\n// if (!props.modelValue) {\r\n// emit(\"update:modelValue\", { [key]: value })\r\n// } else {\r\n// props.modelValue[key] = value\r\n// }\r\n// }\r\n\r\n</script>\r\n\r\n<script lang=\"ts\">\r\n\r\nconst getItems = (schema: { enum: string[], enumAlias?: string[] }) => {\r\n return schema.enum.map((item, index) => ({\r\n id: item,\r\n title: schema.enumAlias?.[index] ?? spaceCamelCase(item)\r\n }))\r\n}\r\n\r\nconst getItemsMultiselect = (schema: { enum: string[], enumAlias?: string[], items: any }) => {\r\n const enumValues = schema.enum ?? schema.items.enum ?? []\r\n const enumAlias = schema.enumAlias ?? schema.items.enumAlias ?? []\r\n return enumValues.map((item, index) => ({\r\n id: item,\r\n title: enumAlias?.[index] ?? spaceCamelCase(item)\r\n }))\r\n}\r\n\r\nexport const join = (baseKey: string | number, key: string | undefined) => {\r\n if (key) {\r\n return `${baseKey}.${key}`\r\n } else {\r\n return baseKey.toString()\r\n }\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.json-editor__object\r\n display: flex\r\n flex-direction: column\r\n gap: 12px\r\n\r\n .v-collapse.open>.v-collapse__content\r\n border-bottom: 1px solid var(--border-color)\r\n \r\n &>.v-collapse>.v-collapse__content>.v-collapse__content-inner\r\n display: flex\r\n flex-direction: column\r\n gap: 12px\r\n\r\n .v-collapse__content-inner\r\n padding-bottom: 12px\r\n padding-left: 2px\r\n padding-right: 2px\r\n\r\n .v-collapse__activator\r\n font-size: 13px\r\n font-weight: 500\r\n\r\n</style>","<template>\r\n <div class=\" editor-blocks-sidebar\" @blockdrop.stop>\r\n <slot></slot>\r\n <VTabs v-model=\"currentTab\" :items=\"tabs\"/>\r\n <VTabsPages :page=\"currentTab\">\r\n <template #blocks>\r\n <BlocksList :blocks=\"blocksList\"/>\r\n </template>\r\n <template #blockEdit>\r\n <JsonEditor \r\n v-if=\"currentBlock && currentContentBlock\" \r\n :key=\"currentContentBlock.id\" \r\n :schema=\"currentBlock.props\" \r\n v-model=\"currentContentBlock.data\" \r\n flat\r\n />\r\n <template v-else-if=\"currentDataEntry\">\r\n <VSelect \r\n v-if=\"props.dataEntryScopes\" \r\n v-model=\"props.dataEntryScopes[currentDataEntry.id]\" \r\n style=\"margin-bottom: 8px\" \r\n label=\"Применить настройки\" \r\n :items=\"settingSelectItems\"\r\n />\r\n <JsonEditor \r\n :key=\"currentDataEntry.id\" \r\n :schema=\"currentDataEntry.props\" \r\n v-model=\"state.data[currentDataEntry.id]\" \r\n flat\r\n />\r\n </template>\r\n <div v-else>Схема для блока не найдена</div>\r\n </template>\r\n </VTabsPages>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ref, computed, watch } from 'vue'\r\nimport BlocksList from './BlocksList.vue'\r\nimport { Block, ContentBlock, DataEntry, DataEntryScope, State } from '../types';\r\nimport { findBlock } from '../utils/blocks';\r\nimport VTabs from './VTabs.vue';\r\nimport VTabsPages from './VTabsPages.vue';\r\nimport JsonEditor from './JsonEditor.vue';\r\nimport VSelect from './VSelect.vue';\r\n\r\nconst props = defineProps<{ \r\n blocksList: Block[], \r\n blocksMap: Map<string, Block>,\r\n dataEntries: DataEntry[],\r\n dataEntryScopes?: Record<string, DataEntryScope>,\r\n activeBlockId?: string | null,\r\n state: State\r\n}>()\r\n\r\nconst currentTab = ref(\"blocks\")\r\n\r\nconst currentContentBlock = computed(() => {\r\n if (!props.activeBlockId) return null\r\n return findBlock(props.state.content, block => block.id === props.activeBlockId)\r\n})\r\nconst currentBlock = computed(() => {\r\n if (!currentContentBlock.value) return null\r\n return props.blocksMap.get(currentContentBlock.value.blockId)\r\n})\r\nconst currentDataEntry = computed(() => {\r\n if (props.activeBlockId?.startsWith(\"data:\")) {\r\n const id = props.activeBlockId.slice(5)\r\n return props.dataEntries.find(item => item.id === id)\r\n }\r\n return null\r\n})\r\nconst tabs = computed(() => {\r\n const arr = [\r\n { id: \"blocks\", title: \"Блоки\" }\r\n ]\r\n if (currentBlock.value) {\r\n arr.push({\r\n id: \"blockEdit\",\r\n title: currentBlock.value?.name ?? \"Unknown Block\"\r\n })\r\n }\r\n if (currentDataEntry.value) {\r\n arr.push({\r\n id: \"blockEdit\",\r\n title: currentDataEntry.value?.title ?? \"Settings\"\r\n })\r\n }\r\n return arr\r\n})\r\n\r\n\r\nwatch(() => props.activeBlockId, (blockId, oldBlockId) => {\r\n if (blockId && blockId !== oldBlockId) {\r\n currentTab.value = \"blockEdit\"\r\n }\r\n if (!blockId && (currentTab.value === \"blockEdit\" || currentTab.value === \"settingEdit\")) {\r\n currentTab.value = \"blocks\"\r\n }\r\n\r\n if (currentTab.value === \"blockEdit\" && currentDataEntry.value && props.dataEntryScopes && !props.dataEntryScopes[currentDataEntry.value.id]) {\r\n props.dataEntryScopes[currentDataEntry.value.id] = 'site'\r\n }\r\n}, { immediate: true })\r\n\r\nconst settingSelectItems = [\r\n { id: \"page\", title: \"Только для этой страницы\" },\r\n { id: \"site\", title: \"Для всего сайта\" },\r\n]\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n\r\n.editor-blocks-sidebar\r\n width: 340px\r\n border-left: 1px solid var(--border-color)\r\n background-color: white\r\n display: flex\r\n flex-direction: column\r\n\r\n .v-tabs\r\n padding: 0 16px\r\n margin-top: 12px\r\n\r\n .v-tabs-pages\r\n flex: 1 1 auto\r\n\r\n .v-tabs-pages__page\r\n padding: 16px 16px\r\n\r\n.editor-sidebar__title\r\n margin-bottom: 8px\r\n color: var(--text-secondary-color)\r\n\r\n</style>","<template>\r\n <div ref=\"containerRef\" class=\"page-editor-hierarchy\" @click.self=\"emit('update:activeBlockId', null)\">\r\n <div \r\n v-for=\"item in flatBlocks\" \r\n class=\"page-editor-hierarchy__item\" \r\n :class=\"{ active: props.activeBlockId === item.content.id, hover: props.hoverBlockId === item.content.id }\"\r\n :style=\"{ paddingLeft: `${16 + item.intent*16}px` }\"\r\n @blockdrop=\"onItemBlockDrop($event, item)\"\r\n @mousedown=\"onItemMouseDown($event, item)\"\r\n @mouseenter=\"emit('update:hoverBlockId', item.content.id)\"\r\n @mouseleave=\"emit('update:hoverBlockId', null)\"\r\n @click=\"emit('update:activeBlockId', item.content.id)\"\r\n @contextmenu.stop=\"contextMenu.open($event, item.content)\"\r\n >\r\n {{ item.block.name }}\r\n </div>\r\n\r\n <div \r\n v-for=\"item in places\" \r\n class=\"page-editor-hierarhy__place\" \r\n :style=\"item.style\"\r\n @blockdrop=\"onPlaceBlockDrop($event, item.index)\"\r\n >\r\n </div>\r\n <VContextMenu v-bind=\"contextMenu.props\" />\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { computed, CSSProperties, inject, Ref, ref, shallowReactive, watch } from 'vue';\r\nimport { Block, BlockDropEvent, ContentBlock } from '../../common/types'\r\nimport { hasSlots, hasMultipleSlots, forEachChildren, uid, deleteBlock, createContentBlockChild, getBlockIndex, createContentBlock, changeBlockId } from '../utils/blocks';\r\nimport { cloneDeep, useDraggableItem } from 'vuesix'\r\nimport VContextMenu, { useContextMenu } from './VContextMenu.vue'\r\n\r\ntype FlatBlockEntry = { \r\n content: ContentBlock, \r\n parent: ContentBlock | null,\r\n block: Block, \r\n key: string, \r\n intent: number, \r\n hasSlots: boolean,\r\n hasMultipleSlots: boolean\r\n}\r\n\r\nconst props = defineProps<{ contentBlocks: ContentBlock[], blocksMap: Map<string, Block>, hoverBlockId: string | null, activeBlockId: string | null }>()\r\nconst emit = defineEmits([ \"update:hoverBlockId\", \"update:activeBlockId\" ])\r\n\r\nconst flatBlocks = computed(() => {\r\n const arr: Array<FlatBlockEntry> = []\r\n\r\n const collectBlocks = (items: ContentBlock[], intent = 0, parent: ContentBlock | null = null) => {\r\n for (let i = 0; i < items.length; i++) {\r\n const data = items[i]\r\n if (data.blockId.startsWith(\"__dev\")) continue\r\n const block = props.blocksMap.get(data.blockId)\r\n if (!block) {\r\n arr.push({\r\n content: data, key: data.id, intent, hasSlots: false, hasMultipleSlots: false, block: {} as Block, parent\r\n })\r\n continue\r\n }\r\n arr.push({ \r\n content: data, \r\n key: data.id, \r\n intent, \r\n hasSlots: hasSlots(block),\r\n hasMultipleSlots: hasMultipleSlots(block),\r\n block: block,\r\n parent\r\n })\r\n forEachChildren(block, data, blocks => {\r\n collectBlocks(blocks, intent+1, data)\r\n })\r\n }\r\n }\r\n\r\n collectBlocks(props.contentBlocks)\r\n return arr\r\n})\r\n\r\nconst drag = useDraggableItem()\r\nconst dragMode = inject(\"dragMode\") as Ref<boolean>\r\n\r\nconst onItemMouseDown = (e: MouseEvent, item: FlatBlockEntry) => {\r\n if (e.button !== 0) return\r\n const target = e.currentTarget as HTMLElement\r\n drag(e, {\r\n onStart(item) {\r\n target.setAttribute(\"data-source-drag\", \"\")\r\n item.classList.add(\"drag\")\r\n document.body.classList.add(\"mousedrag\")\r\n dragMode.value = true\r\n },\r\n onEnd(e) {\r\n document.body.classList.remove(\"mousedrag\")\r\n target.removeAttribute(\"data-source-drag\")\r\n if (e.target !== target) {\r\n e.target?.dispatchEvent(new BlockDropEvent(item.block, item.content))\r\n }\r\n dragMode.value = false\r\n }\r\n })\r\n}\r\n\r\nconst containerRef = ref<HTMLElement>()\r\nconst places = shallowReactive<{ style: CSSProperties, index: number }[]>([])\r\n\r\nwatch(dragMode, (dragMode) => {\r\n if (!dragMode || !containerRef.value) {\r\n places.length = 0\r\n return\r\n }\r\n const containerRect = containerRef.value.getBoundingClientRect()\r\n\r\n places.length = 0\r\n\r\n const children = Array.from(containerRef.value.children).filter(child => child.classList.contains(\"page-editor-hierarchy__item\"))\r\n let lastRectHeight = 0\r\n let lastRectBottom = containerRect.top\r\n for (let i = 0; i < children.length+1; i++) {\r\n const child = children[i]\r\n const rect = i === children.length? \r\n { top: lastRectBottom, height: containerRect.bottom - lastRectBottom, bottom: 0 }: \r\n child.getBoundingClientRect()\r\n\r\n let top = lastRectHeight * 0.2\r\n let bottom = rect.height * 0.2\r\n\r\n if (i > 0 && !flatBlocks.value[i-1].hasSlots) {\r\n top = lastRectHeight * 0.5\r\n } \r\n if (i === children.length) {\r\n bottom = rect.height\r\n } else if (!flatBlocks.value[i].hasSlots) {\r\n bottom = rect.height * 0.5\r\n }\r\n\r\n places.push({\r\n index: i,\r\n style: {\r\n top: rect.top - containerRect.top + containerRef.value.scrollTop - top + \"px\",\r\n paddingTop: top - 1 + \"px\",\r\n height: (top+bottom) + \"px\"\r\n }\r\n })\r\n\r\n lastRectHeight = rect.height\r\n lastRectBottom = rect.bottom\r\n }\r\n})\r\n\r\nconst onItemBlockDrop = (e: BlockDropEvent, item: FlatBlockEntry) => {\r\n if (e.content) {\r\n deleteBlock(props.contentBlocks, e.content)\r\n }\r\n if (item.hasSlots) {\r\n const contentBlock: ContentBlock = e.content ?? createContentBlock(e.block)\r\n createContentBlockChild(props.blocksMap, contentBlock, item.content, -1)\r\n }\r\n}\r\n\r\nconst onPlaceBlockDrop = (e: BlockDropEvent, _index: number, dublicate = false) => {\r\n e.stopPropagation()\r\n let index = _index\r\n \r\n let content = e.content\r\n if (content && !dublicate) {\r\n const sourceIndex = flatBlocks.value.findIndex(item => item.content === content)!\r\n if (sourceIndex === index || sourceIndex === index-1) return\r\n if (index > sourceIndex && sourceIndex !== -1) index--\r\n deleteBlock(props.contentBlocks, content)\r\n }\r\n if (content && dublicate) {\r\n content = cloneDeep(content)\r\n changeBlockId(content, e.block)\r\n }\r\n\r\n const contentBlock: ContentBlock = content ?? createContentBlock(e.block)\r\n\r\n if (index >= flatBlocks.value.length) {\r\n props.contentBlocks.push(contentBlock)\r\n } else {\r\n const blockEntry = flatBlocks.value[index]\r\n if (blockEntry.parent === null) {\r\n const index = props.contentBlocks.indexOf(blockEntry.content)\r\n props.contentBlocks.splice(index, 0, contentBlock)\r\n } else {\r\n const index = getBlockIndex(blockEntry.parent, blockEntry.content)\r\n createContentBlockChild(props.blocksMap, contentBlock, blockEntry.parent, index)\r\n }\r\n }\r\n}\r\n\r\nconst contextMenu = useContextMenu((content: ContentBlock | null) => [\r\n content !== null && { title: \"Дублировать блок\", onClick() {\r\n const index = flatBlocks.value.findIndex(item => item.content === content)\r\n const block = props.blocksMap.get(content.blockId)!\r\n onPlaceBlockDrop(new BlockDropEvent(block, content), index, true)\r\n } },\r\n content !== null && { title: \"Копировать блок\", async onClick() {\r\n const blob = new Blob([ JSON.stringify(content) ], { type: \"text/plain\" })\r\n await navigator.clipboard.write([\r\n new ClipboardItem({ \"text/plain\": blob })\r\n ])\r\n }},\r\n content && props.blocksMap.get(content.blockId)?.slots && { \r\n title: `Вставить блок как дочерний`,\r\n onClick: () => placeBlockFromClipboard(content)\r\n },\r\n {\r\n title: \"Вставить блок ниже\",\r\n onClick: async () => {\r\n const index = flatBlocks.value.findIndex(item => item.content === content)\r\n const [contentData, block] = await getBlockFromClipboard()\r\n if (!contentData || !block) return\r\n onPlaceBlockDrop(new BlockDropEvent(block, contentData), index+1, false)\r\n }\r\n },\r\n content !== null && { \r\n title: \"Удалить блок\", \r\n onClick: () => {\r\n deleteBlock(props.contentBlocks, content) \r\n if (props.activeBlockId === content.id) {\r\n emit(\"update:activeBlockId\", null)\r\n }\r\n if (props.hoverBlockId === content.id) {\r\n emit(\"update:hoverBlockId\", null)\r\n }\r\n }\r\n },\r\n])\r\n\r\nconst getBlockFromClipboard = async (): Promise<[ ContentBlock | null, Block | null ]> => {\r\n const resp = await navigator.clipboard.read()\r\n if (!resp[0].types.includes(\"text/plain\")) return [null, null]\r\n const entry = await resp[0].getType(\"text/plain\")\r\n const text = await entry.text()\r\n if (!text.startsWith(\"{\")) return [null, null]\r\n\r\n const contentData = JSON.parse(text)\r\n const block = props.blocksMap.get(contentData.blockId) ?? null\r\n if (block) {\r\n changeBlockId(contentData, block)\r\n }\r\n return [contentData as ContentBlock, block]\r\n}\r\n\r\n\r\nconst placeBlockFromClipboard = async (content: ContentBlock | null) => {\r\n\r\n const [contentData, block] = await getBlockFromClipboard()\r\n if (!contentData || !block) return\r\n\r\n try {\r\n if (content !== null) {\r\n const index = flatBlocks.value.findIndex(item => item.content === content)\r\n if (flatBlocks.value[index].hasSlots) {\r\n onItemBlockDrop(new BlockDropEvent(block, contentData), flatBlocks.value[index])\r\n } else {\r\n onPlaceBlockDrop(new BlockDropEvent(block, contentData), index)\r\n }\r\n } else {\r\n onPlaceBlockDrop(new BlockDropEvent(block, contentData), flatBlocks.value.length)\r\n }\r\n } catch(e) {\r\n console.warn(e)\r\n }\r\n}\r\n\r\n</script>\r\n\r\n<script lang=\"ts\">\r\n\r\n</script>\r\n\r\n\r\n<style lang=\"sass\">\r\n.page-editor-hierarchy\r\n background-color: var(--paper-color)\r\n position: relative\r\n flex: 1 1 auto\r\n user-select: none\r\n\r\n.page-editor-hierarchy__item\r\n display: flex\r\n align-items: center\r\n height: 42px\r\n padding: 0 16px\r\n font-size: 13px\r\n cursor: pointer\r\n font-weight: 500\r\n box-sizing: border-box\r\n color: var(--text-color-alt)\r\n user-select: none\r\n\r\n &:hover, &.hover, &[data-popover-target]\r\n background-color: var(--hover-color)\r\n\r\n &.active, &[data-source-drag]\r\n background-color: var(--background-active-color)\r\n color: var(--text-active-color)\r\n\r\n &.hoverBlock\r\n box-shadow: inset 0 0 0 2px var(--primary-color)\r\n\r\n &.drag\r\n display: none\r\n\r\n.page-editor-hierarhy__place\r\n position: absolute\r\n left: 0\r\n right: 0\r\n box-sizing: border-box\r\n // border: 1px solid var(--primary-color)\r\n\r\n &::after\r\n content: \"\"\r\n width: 100%\r\n display: block\r\n height: 2px\r\n\r\n &:hover::after\r\n background-color: var(--primary-color)\r\n\r\n</style>","<template>\r\n <div class=\"editor-hierarchy\" @blockdrop.stop>\r\n <slot></slot>\r\n <!-- <div class=\"title\">Настройки</div>\r\n <ContentSettings \r\n v-model=\"props.control.activeBlockId.value\" \r\n :dataEntries=\"props.dataEntries\"\r\n /> -->\r\n <div class=\"title\">Блоки</div>\r\n <ContentHierarchy \r\n v-model:hover-block-id=\"props.control.hoverBlockId.value\"\r\n v-model:active-block-id=\"props.control.activeBlockId.value\"\r\n :content-blocks=\"props.state.content\" \r\n :blocks-map=\"props.blocksMap\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { Block, DataEntry, State } from '../types';\r\nimport { useControlComponent } from '../utils/controlComponent';\r\nimport ContentHierarchy from './ContentHierarchy.vue';\r\nimport ContentSettings from './ContentSettings.vue';\r\n\r\nconst props = defineProps<{ \r\n state: State, \r\n blocksMap: Map<string, Block>,\r\n control: ReturnType<typeof useControlComponent>,\r\n dataEntries: DataEntry[]\r\n}>()\r\n\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n\r\n.editor-hierarchy\r\n width: 250px\r\n border-right: 1px solid var(--border-color)\r\n background-color: white\r\n display: flex\r\n flex-direction: column\r\n\r\n .title\r\n color: var(--text-secondary-color)\r\n padding: 0 16px\r\n font-size: 13px\r\n font-weight: 500\r\n margin-top: 12px\r\n\r\n.editor-hierarchy__header\r\n padding: 12px 16px\r\n display: flex\r\n align-items: center\r\n gap: 8px\r\n padding-bottom: 4px\r\n \r\n .v-select\r\n flex: 1 1 auto\r\n\r\n .v-icon-button\r\n width: 32px\r\n height: 32px\r\n \r\n</style>","import { shallowRef, watch } from \"vue\"\r\nimport { findParent } from \"vuesix\"\r\n\r\n/** Создает необходимые функции для подсвечивания блоков в текущем DOM */\r\nexport const useControlComponent = (_activeBlockId?: string) => {\r\n\r\n let dragMode = false\r\n let lastRoot: HTMLElement = document.body\r\n\r\n const hoverBlockId = shallowRef<string | null>(null)\r\n const activeBlockId = shallowRef<string | null>(_activeBlockId ?? null)\r\n\r\n const hoverBlockElement = shallowRef<HTMLElement | null>(null)\r\n const activeBlockElement = shallowRef<HTMLElement | null>(null)\r\n \r\n let lastStateKey = \"\" \r\n\r\n let blocksHover: HTMLElement[] = []\r\n const onIframeBlockMouseEnter = (e: MouseEvent) => {\r\n if (dragMode) return\r\n\r\n hoverBlockElement.value = e.currentTarget as HTMLElement\r\n const blockId = hoverBlockElement.value.getAttribute(\"data-block-id\") ?? null\r\n hoverBlockId.value = blockId\r\n\r\n blocksHover.push(e.currentTarget as HTMLElement)\r\n }\r\n\r\n const onIframeBlockMouseLeave = (e: MouseEvent) => {\r\n const el = e.currentTarget as HTMLElement\r\n if (el && blocksHover.indexOf(el) >= 0) {\r\n blocksHover = blocksHover.slice(0, blocksHover.indexOf(el))\r\n }\r\n setTimeout(() => {\r\n if (hoverBlockElement.value !== el) return\r\n hoverBlockElement.value = blocksHover[blocksHover.length-1] ?? null\r\n const blockId = hoverBlockElement.value?.getAttribute(\"data-block-id\") ?? null\r\n hoverBlockId.value = blockId\r\n }, 0) \r\n }\r\n\r\n const onIframeBlockClick = (e: MouseEvent) => {\r\n hoverBlockElement.value = e.currentTarget as HTMLElement\r\n const blockId = hoverBlockElement.value.getAttribute(\"data-block-id\") ?? null\r\n hoverBlockId.value = blockId\r\n\r\n activeBlockId.value = blockId\r\n\r\n if (!blockId) return\r\n\r\n activeBlockElement.value = hoverBlockElement.value\r\n\r\n e.stopPropagation()\r\n e.preventDefault()\r\n }\r\n \r\n const elements = shallowRef<HTMLElement[]>([])\r\n const update = (root: HTMLElement) => {\r\n lastRoot = root\r\n const arr = Array.from(root.querySelectorAll<HTMLDivElement>(\"[data-block-id]\"))\r\n \r\n const key = arr.map(item => item.getAttribute(\"data-block-id\") ?? \"\").join(\",\")\r\n if (lastStateKey === key) return\r\n\r\n for (let item of arr) {\r\n if (item.hasAttribute(\"data-dev\")) continue\r\n item.addEventListener(\"mouseenter\", onIframeBlockMouseEnter)\r\n item.addEventListener(\"mouseleave\", onIframeBlockMouseLeave)\r\n item.addEventListener(\"click\", onIframeBlockClick)\r\n }\r\n elements.value = arr\r\n } \r\n\r\n \r\n watch(hoverBlockId, (hoverBlockId) => {\r\n if (hoverBlockId === null) {\r\n hoverBlockElement.value = null\r\n return\r\n }\r\n if (hoverBlockId === hoverBlockElement.value?.getAttribute(\"data-block-id\")) {\r\n return\r\n }\r\n hoverBlockElement.value = lastRoot?.querySelector(`[data-block-id=\"${hoverBlockId}\"]`) ?? null\r\n })\r\n \r\n watch(activeBlockId, (activeBlockId) => {\r\n if (activeBlockId === null) {\r\n activeBlockElement.value = null\r\n return\r\n }\r\n if (activeBlockId === activeBlockElement.value?.getAttribute(\"data-block-id\")) {\r\n return\r\n }\r\n updateActiveElement()\r\n }, { immediate: true })\r\n\r\n const updateActiveElement = () => {\r\n const blockId = activeBlockId.value\r\n if (!blockId) return\r\n activeBlockElement.value = lastRoot.querySelector(`[data-block-id=\"${blockId}\"]`) ?? null\r\n }\r\n\r\n // Тут и ниже: методы для вставки элемента \r\n let placeElements: { id: string, top: number, bottom: number, width: number }[] = []\r\n const insertedPlace = shallowRef<{ prepentBlockId: string | null, top: number } | null>(null)\r\n const onMouseMove = (e: MouseEvent) => {\r\n if (!dragMode) {\r\n return\r\n }\r\n if (e.currentTarget !== e.target && findParent(e.target as HTMLElement, item => item.classList.contains('editor-component'))) {\r\n insertedPlace.value = null\r\n return\r\n }\r\n let index = 0\r\n for (let item of placeElements) {\r\n if (e.clientY + window.scrollY < (item.top + item.bottom) * 0.5) {\r\n break\r\n }\r\n index++\r\n }\r\n if (index === placeElements.length) {\r\n insertedPlace.value = { prepentBlockId: null, top: placeElements[index-1]?.bottom ?? 0 }\r\n } else {\r\n insertedPlace.value = { prepentBlockId: placeElements[index].id, top: placeElements[index].top }\r\n }\r\n }\r\n const onMouseLeave = () => {\r\n insertedPlace.value = null\r\n }\r\n\r\n const updatePlaceElements = () => {\r\n placeElements = elements.value.map(item => {\r\n const rect = item.getBoundingClientRect()\r\n const width = item.parentElement?.scrollWidth ?? rect.width\r\n\r\n const style = window.getComputedStyle(item)\r\n const top = rect.top + window.scrollY - parseInt(style.marginTop)\r\n const bottom = rect.bottom + window.scrollY\r\n return { id: item.getAttribute(\"data-block-id\")!, top, bottom, width }\r\n })\r\n placeElements.sort((a, b) => a.top - b.top)\r\n }\r\n\r\n let mouseMoveRoot: HTMLElement | null = null\r\n const setDragMode = (_dragMode: boolean) => {\r\n dragMode = _dragMode\r\n if (dragMode) {\r\n updatePlaceElements()\r\n lastRoot.addEventListener(\"mousemove\", onMouseMove)\r\n mouseMoveRoot = lastRoot\r\n } else {\r\n mouseMoveRoot?.removeEventListener(\"mousemove\", onMouseMove)\r\n insertedPlace.value = null\r\n }\r\n }\r\n\r\n const onScroll = () => {\r\n if (dragMode) {\r\n updatePlaceElements()\r\n if (insertedPlace.value?.prepentBlockId) {\r\n const index = placeElements.findIndex(item => item.id === insertedPlace.value!.prepentBlockId)\r\n insertedPlace.value = { ...insertedPlace.value, top: placeElements[index].top }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n update,\r\n hoverBlockElement,\r\n activeBlockElement,\r\n activeBlockId,\r\n hoverBlockId,\r\n updateActiveElement,\r\n elements,\r\n insertedPlace,\r\n onMouseMove,\r\n onMouseLeave,\r\n setDragMode,\r\n onScroll\r\n }\r\n}","<template>\r\n <div class=\"form-column\" :class=\"[\r\n props.spacing? `spacing-${props.spacing}`: undefined, \r\n props.size? `size-${props.size}`: undefined \r\n ]\">\r\n <slot></slot>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\n\r\nconst props = defineProps<{ spacing?: \"large\", size?: \"small\" }>()\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.form-column\r\n display: flex\r\n flex-direction: column\r\n gap: 8px\r\n\r\n &.spacing-large\r\n gap: 16px\r\n\r\n &.size-small\r\n width: 600px\r\n\r\n .form-row\r\n display: flex\r\n gap: 16px\r\n\r\n &>*\r\n flex: 1 1 50px\r\n \r\n</style>","<template>\r\n <VDialog style=\"width: 500px\">\r\n <template #header>{{ props.item? \"Редактировать\": \"Создать\" }} страницу</template>\r\n <FormColumn>\r\n <VInput v-bind=\"register('name')\" label=\"Название страницы\" autofocus/>\r\n <VInput v-bind=\"register('path')\" :prefix=\"currentFoler?.path\" label=\"URL адрес\"/>\r\n <VSelect v-if=\"folders.length > 0\" nullable v-bind=\"register('folderId')\" :items=\"folders\" label=\"Папка\"/>\r\n </FormColumn>\r\n <template #actions>\r\n <VButton :disabled=\"pending\" large @click=\"apply\">{{ props.item? \"Сохранить\": \"Создать\" }}</VButton>\r\n </template> \r\n </VDialog>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { computed } from 'vue';\r\nimport type { ProjectPage, ProjectPageFolder } from '../../../frontend/src/api/projectPagesApi';\r\nimport { useForm } from 'vuesix';\r\nimport FormColumn from '../FormColumn.vue';\r\nimport VInput from '../VInput.vue';\r\nimport VSelect from '../VSelect.vue';\r\nimport VButton from '../VButton.vue';\r\nimport { useDialog } from '../VDialogProvider.vue';\r\nimport VDialog from '../VDialog.vue';\r\n\r\nconst props = defineProps<{ \r\n folders: ProjectPageFolder[],\r\n folderId?: number, \r\n item?: ProjectPage,\r\n onCreate: (data: { name: string, path: string, folderId: number | null }) => Promise<void>\r\n}>()\r\n\r\nconst { register, handleSubmit, pending, values, updateDefaultValues } = useForm({\r\n name: \"\",\r\n path: \"/\",\r\n folderId: (props.folderId ?? null) as number | null\r\n})\r\nif (props.item) {\r\n updateDefaultValues(props.item)\r\n}\r\n\r\nconst folders = computed(() => {\r\n const addItem = { id: \"_add\", title: \"Создать папку...\" }\r\n const arr = props.folders? props.folders.map(item => ({ id: item.id, title: item.name })): []\r\n // arr.push(addItem)\r\n return arr\r\n})\r\n\r\nconst currentFoler = computed(() => {\r\n if (!values.folderId) return null\r\n return props.folders.find(item => item.id === values.folderId)\r\n})\r\n\r\nconst dialog = useDialog()\r\nconst apply = handleSubmit(async (values) => {\r\n await props.onCreate(values)\r\n dialog.close()\r\n})\r\n\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n\r\n</style>","<template>\r\n <div class=\"v-table\" :style=\"gridStyle\">\r\n <div class=\"v-table__header\">\r\n <div v-if=\"props.checkable\"></div>\r\n <div v-for=\"item in columns\">\r\n {{ item.title }}\r\n </div>\r\n </div>\r\n <component \r\n v-for=\"(item, index) in data\" \r\n :key=\"index\" \r\n :is=\"is(item)\" \r\n v-bind=\"bind(item)\" \r\n class=\"v-table__row\" \r\n :class=\"{ hasGroup: props.groupBy && item[props.groupBy] && item[props.groupBy] !== data[index-1]?.[props.groupBy] }\"\r\n @click=\"emit('itemclick', item)\"\r\n @contextmenu=\"emit('itemcontext', $event, item)\"\r\n >\r\n <div v-if=\"props.groupBy && item[props.groupBy] && item[props.groupBy] !== data[index-1]?.[props.groupBy]\" class=\"v-table__group-label\">\r\n Папка {{ item[props.groupBy] }}\r\n </div>\r\n <div v-if=\"props.checkable\" class=\"v-table__check\" @click.prevent.stop=\"checkboxClick\">\r\n <VCheckbox \r\n :modelValue=\"modelValue.has(item)\" \r\n @update:modelValue=\"modelValue.has(item)? modelValue.delete(item): modelValue.add(item)\"\r\n />\r\n </div>\r\n <div v-for=\"(column, key) in columns\" :key=\"key\" :class=\"column.class\" >\r\n <slot :name=\"key\" :item=\"item\" :cell=\"item[key as keyof T]\">\r\n {{ column.map? column.map(item): item[key as keyof T] }}\r\n </slot>\r\n </div>\r\n </component>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup generic=\"T\">\r\nimport { CSSProperties, computed } from 'vue';\r\nimport VCheckbox from './VCheckbox.vue';\r\n\r\nconst props = defineProps<{ \r\n data: T[],\r\n clickable?: boolean,\r\n checkable?: boolean,\r\n to?: (item: T) => string,\r\n useHref?: boolean,\r\n groupBy?: keyof T,\r\n columns: Columns<T>\r\n}>()\r\n\r\nconst emit = defineEmits([ \"itemclick\", \"itemcontext\" ])\r\nconst modelValue = defineModel({ default: new Set() })\r\n\r\nconst is = (item: T) => {\r\n const to = props.to?.(item)\r\n if (to) {\r\n return props.useHref? 'a': 'router-link'\r\n }\r\n if (props.clickable) return 'button'\r\n return 'div'\r\n}\r\n\r\nconst bind = (item: T) => {\r\n const to = props.to?.(item)\r\n if (to) {\r\n return props.useHref? { href: to }: { to }\r\n } else {\r\n return {}\r\n }\r\n}\r\n\r\nconst gridStyle = computed<CSSProperties>(() => {\r\n const arr = Object.values(props.columns).map(item => item.width ?? '1fr')\r\n if (props.checkable) {\r\n arr.unshift(\"52px\")\r\n }\r\n return {\r\n gridTemplateColumns: arr.join(\" \")\r\n }\r\n})\r\n\r\nconst checkboxClick = (e: MouseEvent) => {\r\n if (e.target === e.currentTarget) {\r\n (e.target as HTMLElement).querySelector(\".mech-v-checkbox\")?.dispatchEvent(new MouseEvent(\"click\"))\r\n }\r\n}\r\n\r\n</script>\r\n\r\n<script lang=\"ts\">\r\n\r\ntype Column<T> = {\r\n title?: string,\r\n class?: string,\r\n width?: string,\r\n map?: (item: T) => string\r\n}\r\n\r\nexport type Columns<T> = Record<string, Column<T>>\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-table\r\n display: grid\r\n grid-template-columns: 1fr 1fr 1fr\r\n\r\n.v-table__header, .v-table__row\r\n display: grid\r\n grid-template-columns: subgrid\r\n grid-column: 1 / -1\r\n align-items: center\r\n padding: 0 20px\r\n\r\n.v-table__header\r\n font-size: 13px\r\n font-weight: 500\r\n color: var(--text-secondary-color)\r\n height: 24px\r\n\r\n.v-table__row\r\n height: 50px\r\n text-decoration: none\r\n color: var(--text-color)\r\n font-weight: 500\r\n text-align: left\r\n background: none\r\n border: none\r\n font-size: 14px\r\n user-drag: none\r\n -webkit-user-drag: none\r\n\r\n\r\n &:hover\r\n background-color: var(--hover-color)\r\n\r\na.v-table__row\r\n text-decoration: none\r\n\r\n.v-table__check\r\n height: 100%\r\n display: flex\r\n align-items: center\r\n user-drag: none\r\n -webkit-user-drag: none\r\n margin-left: -20px\r\n padding-left: 20px\r\n\r\n.v-table__actions\r\n display: flex\r\n align-items: center\r\n justify-content: flex-end\r\n gap: 4px\r\n display: none\r\n .v-icon-button\r\n width: 32px\r\n height: 32px\r\n\r\n svg\r\n width: 20px\r\n height: 20px\r\n\r\n.v-table__row:hover .v-table__actions\r\n display: flex\r\n \r\n.v-table__row.hasGroup\r\n margin-top: 30px\r\n position: relative\r\n \r\n.v-table__group-label\r\n position: absolute\r\n top: -16px\r\n left: 20px\r\n color: var(--text-secondary-color)\r\n font-size: 13px\r\n\r\n</style>","<template>\r\n <VDialog class=\"standart\">\r\n <template #header>\r\n Страницы проекта\r\n </template>\r\n <VTable \r\n v-if=\"data\" \r\n :data=\"data\" \r\n :columns=\"columns\" \r\n group-by=\"folderPath\" \r\n class=\"open-page-dialog__table\"\r\n useHref\r\n :to=\"item => item.path\"\r\n >\r\n\r\n </VTable>\r\n </VDialog>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { useRequest } from 'vuesix';\r\nimport VDialog from '../VDialog.vue';\r\nimport VTable, { Columns } from '../VTable.vue'\r\nimport { inject } from 'vue';\r\n\r\nconst pagesRequest = inject(\"pagesRequest\") as (() => Promise<any>)\r\nconst { data } = useRequest(pagesRequest)\r\n\r\nconst columns: Columns<any> = {\r\n name: { title: \"Название страницы\" },\r\n path: { title: \"Путь\" }\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.open-page-dialog__table\r\n margin-left: -20px\r\n margin-right: -20px\r\n</style>","<template>\r\n <VDialog class=\"standart\">\r\n <template #header>Настройки страницы</template>\r\n <VTabs v-model=\"currentTab\" :items=\"tabs\" style=\"margin-bottom: 12px\" />\r\n <VTabsPages :page=\"currentTab\">\r\n <template #_main>\r\n <FormColumn>\r\n <div class=\"form-row\">\r\n <VInput v-bind=\"register('name')\" label=\"Название страницы\"/>\r\n <VInput v-bind=\"register('path')\" label=\"Путь к странице\"/>\r\n </div>\r\n </FormColumn>\r\n </template>\r\n <template v-for=\"tab in tabs.slice(1)\" #[tab.id]>\r\n <JsonEditor :schema=\"tab.props\" v-model=\"state.data[tab.id]\" flat @edit=\"onEdit\"/>\r\n </template>\r\n </VTabsPages>\r\n <template #actions>\r\n <VButton large @click=\"apply\">Сохранить</VButton>\r\n </template>\r\n </VDIalog>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { cloneDeep, isEqual, useForm } from 'vuesix';\r\nimport FormColumn from '../FormColumn.vue';\r\nimport VButton from '../VButton.vue';\r\nimport VDialog from '../VDialog.vue';\r\nimport VInput from '../VInput.vue';\r\nimport { useDialog } from '../VDialogProvider.vue';\r\nimport { computed, inject, shallowRef, watch } from 'vue';\r\nimport VTabs from '../VTabs.vue';\r\nimport VTabsPages from '../VTabsPages.vue';\r\nimport JsonEditor from '../JsonEditor.vue';\r\n\r\ntype Page = { name: string, path: string, meta?: { title?: string, description?: string } }\r\nconst props = defineProps<{ page: Page, onConfirm: (values: any) => Promise<void> }>()\r\nconst { register, handleSubmit } = useForm({\r\n name: props.page.name,\r\n path: props.page.path,\r\n // title: props.page.meta?.title ?? \"\",\r\n // description: props.page.meta?.description ?? \"\",\r\n})\r\n\r\nconst dataEntries = inject(\"dataEntries\") as any[]\r\n\r\nconst currentTab = shallowRef(\"_main\")\r\nconst tabs = computed(() => {\r\n return [\r\n { id: \"_main\", title: \"Основное\" } as any,\r\n ...dataEntries\r\n .map(item => ({ id: item.id, title: item.title ?? item.id, order: item.order ?? 0, props: item.props }))\r\n .sort((a, b) => a.order - b.order)\r\n ]\r\n})\r\nconst state = inject(\"state\") as any\r\n\r\nconst onEdit = (key: string) => {\r\n if (!state.dataEntryScopes[currentTab.value]) {\r\n state.dataEntryScopes[currentTab.value] = 'page'\r\n }\r\n}\r\n\r\nconst dialog = useDialog()\r\nconst apply = handleSubmit(async (values) => {\r\n await props.onConfirm(values)\r\n dialog.close()\r\n})\r\n\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n\r\n</style>","<template>\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M8 15L12 19L16 15M16 9L12 5L8 9\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n</svg>\n</template>\n","import { setUseFormErrorHandler } from \"vuesix\"\r\n\r\nexport class HTTPError extends Error {\r\n body: any\r\n statusCode: number\r\n\r\n constructor(body: any, statusCode: number = 401) {\r\n super()\r\n this.body = body\r\n this.statusCode = statusCode\r\n }\r\n}\r\n\r\nsetUseFormErrorHandler((e, errors) => {\r\n if (e instanceof HTTPError && typeof e.body?.error === \"object\") {\r\n for (let [key, error] of Object.entries(e.body.error)) {\r\n if (typeof error === \"string\") {\r\n (errors as any)[key] = error as string\r\n } else if (typeof error === \"object\" && error) {\r\n (errors as any)[key] = error\r\n }\r\n }\r\n } else {\r\n (errors as any)[\"_global\"] = e.body ?? \"Error\"\r\n }\r\n})\r\n\r\ntype RequestOptions = Partial<{\r\n method: \"GET\" | \"POST\" | \"DELETE\" | \"PUT\",\r\n responseContentType: \"json\" | \"blob\",\r\n ignoreJwt?: boolean\r\n}>\r\n\r\nexport const request = async <T = any>(url: string, body?: any, options: RequestOptions = {}) => {\r\n const headers: { [key: string]: string} = {}\r\n if (body && !(body instanceof FormData)) {\r\n headers[\"Content-Type\"] = \"application/json\"\r\n }\r\n\r\n const resp = await fetch(url, {\r\n method: options.method || (body? \"POST\": \"GET\"),\r\n body: !body || body instanceof FormData || typeof body === \"string\"? body: JSON.stringify(body),\r\n headers\r\n })\r\n\r\n let response = null as T\r\n if ((resp as any).headers.get(\"content-type\")?.startsWith(\"application/json\")) {\r\n response = await resp.json() as T\r\n }\r\n if ((resp as any).headers.get(\"content-type\")?.startsWith(\"text/plain\")) {\r\n response = await resp.text() as T\r\n }\r\n\r\n if (resp.status >= 400) {\r\n throw new HTTPError(response, resp.status)\r\n }\r\n\r\n if (options.responseContentType === \"blob\"){\r\n response = await (resp as any).blob() as T\r\n }\r\n\r\n return response as T\r\n}","<template>\r\n <VContextMenu placement=\"bottom\" fitAnchor :offset=\"4\" :items=\"menuItems\">\r\n <template #activator=\"{ props }\">\r\n <button v-bind=\"$attrs\" class=\"pages-selector\" @click=\"props.onClick\">\r\n <div class=\"pages-selector__title\">{{ currentPage?.name }}</div>\r\n <div class=\"pages-selector__subtitle\">Текущая страница</div>\r\n <SortIcon/>\r\n </button>\r\n </template>\r\n </VContextMenu>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { computed, inject } from 'vue';\r\nimport { mutateRequest, useRequest } from 'vuesix';\r\nimport { useDialog } from '../../../common/components/VDialogProvider.vue';\r\nimport CreatePageDialog from '../../../common/components/dialogs/CreatePageDialog.vue';\r\nimport OpenPageDialog from '../../../common/components/dialogs/OpenPageDialog.vue';\r\nimport PageSettingsDialog from '../../../common/components/dialogs/PageSettingsDialog.vue';\r\nimport VContextMenu, { ContextMenuItem } from '../../../common/components/VContextMenu.vue';\r\nimport SortIcon from '../../../common/components/icons/SortIcon.vue';\r\nimport type { ProjectPage, ProjectPageFolder } from '../../../frontend/src/api/projectPagesApi';\r\nimport { request } from './api';\r\n\r\nconst props = defineProps<{ state?: any }>()\r\n\r\n\r\nconst pagesRequest = inject(\"pagesRequest\") as () => Promise<ProjectPage[]>\r\nconst foldersRequest = inject(\"foldersRequest\") as () => Promise<ProjectPageFolder[]>\r\nconst { data: pages } = useRequest(pagesRequest)\r\nconst { data: folders } = useRequest(foldersRequest)\r\n\r\nconst currentPage = computed(() => {\r\n return props.state.currentPage\r\n})\r\n\r\n\r\nconst dialog = useDialog()\r\nconst createNewPage = () => {\r\n dialog.open(CreatePageDialog, { folders: folders.value! as any, onCreate: async (values: any) => {\r\n const pageData = await request(\"/@mechanica/pages\", values)\r\n mutateRequest(pagesRequest)\r\n // window.location.href = pageData.path\r\n } })\r\n}\r\n\r\nconst openPage = () => {\r\n dialog.open(OpenPageDialog)\r\n}\r\n\r\nconst openPageSettingsDialog = () => {\r\n dialog.open(PageSettingsDialog, { page: props.state.currentPage, onConfirm: async(values: any) => {\r\n await request(`/@mechanica/pages?path=${encodeURIComponent(props.state.currentPage.path)}`, values)\r\n props.state.currentPage.name = values.name\r\n } })\r\n}\r\n\r\nconst menuItems = computed(() => {\r\n const arr: ContextMenuItem[] = [\r\n { title: \"Настройки страницы\", onClick: openPageSettingsDialog },\r\n { title: \"Открыть страницу...\", onClick: openPage },\r\n { title: \"Новая страница...\", onClick: createNewPage }\r\n ]\r\n\r\n if ((window as any).__mechanicaConfig__?.languages) {\r\n arr.push({\r\n title: \"Язык\",\r\n children: Object.entries<any>((window as any).__mechanicaConfig__.languages).map(i => ({\r\n title: i[1].title,\r\n onClick() {\r\n \r\n }\r\n }))\r\n })\r\n }\r\n\r\n return arr\r\n})\r\n\r\n// watch(currentPage, async (newPage) => {\r\n// const resp = await fetch(`/${newPage}`)\r\n// const html = await resp.text()\r\n// const _state = html.match(/window\\.state=({.+})/)?.[1]\r\n// const state = _state && JSON.parse(_state)\r\n// processState(state)\r\n\r\n// Object.assign((window as any).state, state)\r\n// window.history.pushState({}, \"\", newPage === 'index'? '/': `/${newPage}`)\r\n// })\r\n\r\ndefineOptions({\r\n inheritAttrs: false\r\n})\r\n\r\n</script>\r\n\r\n\r\n<style lang=\"sass\">\r\n.pages-selector\r\n display: flex\r\n height: 46px\r\n color: var(--placeholder-color)\r\n width: 100%\r\n background: none\r\n text-align: left\r\n border: none\r\n cursor: pointer\r\n padding: 0 \r\n border-bottom: 1px solid var(--border-color)\r\n margin-top: -4px\r\n flex-direction: column\r\n position: relative\r\n justify-content: center\r\n gap: 2px\r\n outline: none\r\n\r\n svg\r\n position: absolute\r\n right: 0\r\n width: 20px\r\n height: 20px\r\n top: calc(50% - 10px)\r\n \r\n.pages-selector__title\r\n color: var(--text-color-alt)\r\n font-weight: 600\r\n\r\n.pages-selector__subtitle\r\n font-size: 12px\r\n\r\n</style>","import { blocksList as _blocksList, addUpdateListener } from 'virtual:builder-blocks'\r\nimport { getBlockName } from '../../../common/utils/lang'\r\nimport { unfoldSchema, registerAlias } from 'compact-json-schema';\r\nimport { computed, shallowRef } from \"vue\";\r\nimport type { State } from \"../../../common/types\";\r\nimport { processBlocks } from \"../../../common/utils/processBlock\";\r\nimport { registerAliases } from '../../../common/utils/schemaAliases';\r\n\r\nregisterAliases(registerAlias)\r\n\r\nexport const blocksList = shallowRef(_blocksList.map(file => ({\r\n ...file.blockSchema,\r\n id: file.blockSchema.id ?? file.__name!,\r\n order: file.blockSchema.order,\r\n name: file.blockSchema.name ?? getBlockName(file.__name) ?? \"Unnamed block\",\r\n props: file.blockSchema.props? unfoldSchema(file.blockSchema.props): {}\r\n})))\r\n\r\nexport const blocksMap = computed(() => new Map(blocksList.value.map(item => [ item.id, item ])))\r\n\r\naddUpdateListener((module: any) => {\r\n blocksList.value = module.blocksList.map((file: any) => ({\r\n ...file.blockSchema,\r\n id: file.blockSchema.id ?? file.__name!,\r\n order: file.blockSchema.order,\r\n name: file.blockSchema.name ?? getBlockName(file.__name) ?? \"Unnamed block\",\r\n props: file.blockSchema.props? unfoldSchema(file.blockSchema.props): {}\r\n }))\r\n})\r\n\r\n/** Функция проходит по всем блокам и назначает пропс data-block-id и значения по умолчанию */\r\nexport const processState = (state: State) => {\r\n processBlocks(state.content, blocksMap.value)\r\n return state\r\n}\r\n","<template>\r\n <Transition>\r\n <HierarchySidebar \r\n v-if=\"controlsOpened\" \r\n :control=\"control\"\r\n :state=\"state\"\r\n :blocks-map=\"blocksMap\"\r\n :data-entries=\"dataEntries\"\r\n class=\"editor-sidebar-left editor-component\" \r\n >\r\n <div class=\"editor-hierarchy__header\">\r\n <PageSelector :state=\"state\"/>\r\n </div>\r\n \r\n <button class=\"editor-sidebar__close-button\" @click=\"controlsOpened = false\"><ChevronLeftIcon/></button>\r\n </HierarchySidebar>\r\n </Transition>\r\n <HoverFrame v-if=\"controlsOpened\" :element=\"control.hoverBlockElement.value\"/>\r\n <HoverFrame v-if=\"controlsOpened\" :element=\"control.activeBlockElement.value\" resizable/>\r\n <InsertedPlace v-if=\"control.insertedPlace.value\" :top=\"control.insertedPlace.value.top\"/>\r\n <Transition>\r\n <BlocksEditor \r\n v-if=\"controlsOpened\"\r\n class=\"editor-sidebar-right editor-component\" @blockdrop.stop\r\n :state=\"state\" \r\n :blocks-list=\"blocksList\" \r\n :blocks-map=\"blocksMap\" \r\n :active-block-id=\"control.activeBlockId.value\"\r\n :data-entries=\"dataEntries\"\r\n :dataEntryScopes=\"dataEntryScopes\"\r\n >\r\n <button class=\"editor-sidebar__close-button right\" @click=\"controlsOpened = false\"><ChevronRightIcon/></button>\r\n </BlocksEditor>\r\n </Transition>\r\n <Transition>\r\n <div v-if=\"!controlsOpened\" class=\"editor-sidebar__close-button editor-component fixed\" @click=\"controlsOpened = true\"><ChevronRightIcon/></div>\r\n </Transition>\r\n <Transition>\r\n <div v-if=\"!controlsOpened\" class=\"editor-sidebar__close-button editor-component right fixed\" @click=\"controlsOpened = true\"><ChevronLeftIcon/></div>\r\n </Transition>\r\n <VDialogProvider/>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport HoverFrame from '../../../common/components/HoverFrame.vue'\r\nimport InsertedPlace from '../../../common/components/InsertedPlace.vue'\r\nimport ChevronLeftIcon from '../../../common/components/icons/ChevronLeftIcon.vue'\r\nimport ChevronRightIcon from '../../../common/components/icons/ChevronRightIcon.vue'\r\nimport BlocksEditor from '../../../common/components/BlocksEditor.vue'\r\nimport HierarchySidebar from '../../../common/components/HierarchySidebar.vue'\r\n\r\nimport { useEventListener, watchDebounced } from '@vueuse/core'\r\nimport { BlockDropEvent, ContentBlock, DataEntryScope, State } from '../../../common/types';\r\nimport { useControlComponent } from '../../../common/utils/controlComponent'\r\nimport { computed, inject, onMounted, provide, reactive, ref, watch } from 'vue';\r\nimport { insertBlockBefore } from '../../../common/utils/blocks'\r\nimport { cloneDeep, useKeyDownLayer } from 'vuesix'\r\nimport PageSelector from './PageSelector.vue'\r\nimport { blocksList, blocksMap, processState } from './processState'\r\nimport VDialogProvider from '../../../common/components/VDialogProvider.vue'\r\nimport { saveBlocks, splitData } from '../../../common/utils/processBlock'\r\nimport { passDefaultValue } from '../../../common/utils/passDefaultValue'\r\nimport { request } from './api'\r\n\r\nconst controlsOpened = ref(true)\r\n\r\nconst dragMode = ref(false)\r\nprovide(\"dragMode\", dragMode)\r\n\r\nconst state = reactive<State>(processState(JSON.parse(JSON.stringify((window as any).state))))\r\nprovide(\"state\", state)\r\n\r\nconst contentBlocks = computed(() => state.content as ContentBlock[])\r\n\r\nuseEventListener(document, \"blockdrop\", (e: BlockDropEvent) => {\r\n if (e.content) return\r\n insertBlockBefore(e.block, contentBlocks.value, control.insertedPlace.value?.prepentBlockId)\r\n})\r\n\r\nlet ignoreChanges = false\r\nuseEventListener(document, \"openpage\", (e: Event) => {\r\n Object.assign(state, processState(cloneDeep((e as any).data)))\r\n ignoreChanges = true\r\n})\r\n\r\nconst control = useControlComponent()\r\nwatch(dragMode, control.setDragMode)\r\n\r\nwatch(blocksList, () => {\r\n control.update(window.document.body)\r\n control.updateActiveElement()\r\n}, { flush: \"post\" })\r\nonMounted(() => {\r\n control.update(window.document.body)\r\n})\r\n\r\n// watch(currentTab, (currentTab) => {\r\n// Object.assign(import.meta.hot!.data, { currentTab })\r\n// })\r\n\r\n// watch(control.activeBlockId, (activeBlockId) => {\r\n// Object.assign(import.meta.hot!.data, { activeBlockId })\r\n// })\r\n\r\nwatchDebounced(state, (newState, oldState) => {\r\n if (ignoreChanges) {\r\n ignoreChanges = false\r\n return\r\n }\r\n\r\n const state = cloneDeep(newState)\r\n const scopedData = splitData(state.data, dataEntryScopes.value)\r\n\r\n state.data = scopedData['page']\r\n saveBlocks(state.content, blocksMap.value)\r\n\r\n request(`/@mechanica/save?path=${window.location.pathname}`, state)\r\n}, { debounce: 500 })\r\n\r\nprovide(\"fileUploader\", async (file: File) => {\r\n const resp = await fetch(\"/@mechanica/upload\", {\r\n method: \"POST\",\r\n body: file,\r\n headers: { \"x-file-name\": file.name, \"content-type\": \"application/octet-stream\" }\r\n })\r\n const obj = await resp.json()\r\n return obj\r\n})\r\nprovide(\"fileRequest\", async () => {\r\n return await request(\"/@mechanica/images\")\r\n})\r\nprovide(\"pagesRequest\", async () => {\r\n return await request(\"/@mechanica/pages\")\r\n})\r\nprovide(\"foldersRequest\", async () => {\r\n return await request(\"/@mechanica/folders\")\r\n})\r\n\r\nconst dataEntries = inject(\"dataEntries\") as any[]\r\nconst dataEntryScopes = ref<Record<string, DataEntryScope>>(state.dataEntryScopes ?? {})\r\n\r\nuseKeyDownLayer(\"Escape\", () => !!control.activeBlockId.value, () => control.activeBlockId.value = null)\r\n\r\nfor (let entry of dataEntries) {\r\n state.data[entry.id] = passDefaultValue(state.data[entry.id], entry.props)\r\n}\r\n\r\nwatch(state, (state) => {\r\n const val = JSON.parse(JSON.stringify(state))\r\n window.postMessage({ type: \"update:state\", payload: val })\r\n setTimeout(() => control.update(window.document.body), 50)\r\n}, { immediate: true })\r\n\r\n// import.meta.hot?.accept()\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n@import ../../../common/styles/variables\r\n@import ../../../common/styles/typography\r\n@import ../../../common/styles/components\r\n\r\n.editor-component\r\n @include variables\r\n @include typography\r\n &.scroll, .scroll\r\n @include scroll-mixin \r\n \r\n color: var(--text-color)\r\n\r\n.editor-sidebar-right\r\n position: fixed\r\n right: 0\r\n top: 0\r\n bottom: 0\r\n z-index: 1000\r\n\r\n.editor-sidebar-left \r\n position: fixed\r\n left: 0\r\n top: 0\r\n bottom: 0\r\n z-index: 1000\r\n\r\n.editor-control-component\r\n position: absolute\r\n top: 0\r\n left: 0\r\n width: 300px\r\n height: 200px\r\n border: 2px solid var(--primary-color)\r\n\r\n.editor-sidebar__close-button\r\n position: absolute\r\n right: -12px\r\n top: calc(50% - 12px)\r\n width: 24px\r\n height: 24px\r\n display: flex\r\n align-items: center\r\n justify-content: center\r\n padding: 0\r\n background-color: var(--text-secondary-color)\r\n color: white\r\n border: none\r\n border-radius: 9999px\r\n cursor: pointer\r\n z-index: 1\r\n opacity: 0.2\r\n &:hover\r\n opacity: 1\r\n\r\n &.right\r\n right: auto\r\n left: -12px\r\n\r\n &.fixed\r\n right: auto\r\n left: 20px\r\n z-index: 100\r\n position: fixed\r\n\r\n &.fixed.right\r\n left: auto\r\n right: 20px\r\n\r\n &.v-enter-active\r\n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1)\r\n transition-delay: 0.4s\r\n\r\n &.v-enter-from\r\n transform: translateX(-60px)\r\n\r\n &.right\r\n &.v-enter-from\r\n transform: translateX(60px)\r\n\r\n\r\n.editor-sidebar-left, .editor-sidebar-right\r\n &.v-enter-active, &.v-leave-active \r\n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1)\r\n\r\n.editor-sidebar-left\r\n &.v-enter-from, &.v-leave-to\r\n transform: translateX(-100%)\r\n\r\n.editor-sidebar-right\r\n &.v-enter-from, &.v-leave-to\r\n transform: translateX(100%)\r\n\r\n// .editor-hierarchy:hover .editor-sidebar__close-button\r\n// opacity: 1\r\n\r\n// .editor-blocks-sidebar:hover .editor-sidebar__close-button\r\n// opacity: 1\r\n\r\n</style>","import { createApp, reactive } from 'vue'\r\nimport EditorApp from './EditorApp.vue'\r\nimport { createDialogSystem } from '../../../common/components/VDialogProvider.vue'\r\nimport { unfoldSchema } from 'compact-json-schema'\r\nimport { passDefaultValue } from '../../../common/utils/passDefaultValue'\r\n\r\nconst mountDiv = document.createElement(\"div\")\r\nmountDiv.id = \"data-mechanics-editor\"\r\ndocument.body.append(mountDiv)\r\n\r\nconst dataEntries = reactive<any[]>([])\r\ndocument.addEventListener(\"DOMContentLoaded\", () => {\r\n createApp(EditorApp)\r\n .provide(\"dataEntries\", dataEntries)\r\n .use(createDialogSystem())\r\n .mount(mountDiv)\r\n})\r\n\r\n// @ts-ignore\r\nglobalThis._registerData = (dataEntry) => {\r\n dataEntry.props = unfoldSchema(dataEntry.props);\r\n const exists = dataEntries.find((item: any) => item.id === dataEntry.id)\r\n if (exists) {\r\n Object.assign(exists, dataEntry)\r\n } else {\r\n dataEntries.push(dataEntry)\r\n }\r\n}"],"names":["_createElementBlock","top","_openBlock","_hoisted_1","_createElementVNode","findParent","e","isEqual","data","request","args","_normalizeClass","_createTextVNode","_toDisplayString","_hoisted_2","_hoisted_3","_renderSlot","$slots","_hoisted_4","_createVNode","_Transition","_hoisted_5","tryOnScopeDispose","isClient","toString","isObject","noop","defaultWindow","unrefElement","toValue","useEventListener","window","document","getValue","_createBlock","VFormControl","large","multiline","label","required","disabled","item","VInput","_Fragment","_renderList","_unref","_hoisted_6","uid","schema","blocksMap","content","child","_TransitionGroup","_normalizeStyle","clamp","open","_Teleport","_mergeProps","$attrs","_useModel","VPopover","_withCtx","nullable","length","VCollapse","JsonEditor","_resolveDynamicComponent","component","flat","outline","offset","VButton","dialog","_withDirectives","_vShow","VDialog","ProjectImagesDialog","error","VContextMenu","props","VSelect","VCheckbox","__defProp","__defNormalProp","__publicField","events","listeners","_sfc_main$2","_sfc_main$1","TextEditor","_hoisted_7","el","RichTextEditorCode","_a","VImageUploader","RichTextEditorLinkPopover","RichTextEditorDialog","VFileUploader","VMultiSelect","VLinkEditor","VRichTextEditor","JsonEditorArray","VTabs","VTabsPages","BlocksList","blocksList","state","dragMode","index","_withModifiers","_normalizeProps","_guardReactiveProps","ContentHierarchy","hoverBlockId","activeBlockId","values","FormColumn","columns","VTable","dataEntries","_createSlots","CreatePageDialog","OpenPageDialog","PageSettingsDialog","_blocksList","HierarchySidebar","PageSelector","HoverFrame","InsertedPlace","BlocksEditor","VDialogProvider","EditorApp"],"mappings":"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","x_google_ignoreList":[4,5,6,7,8,9,10,11,12,13,14,17,18,47]}
1
+ {"version":3,"file":"editor.js","sources":["../../common/components/HoverFrame.vue","../../common/components/InsertedPlace.vue","../../common/components/icons/ChevronLeftIcon.vue","../../common/components/icons/ChevronRightIcon.vue","../../../node_modules/vuesix/src/utils/findParent.ts","../../../node_modules/vuesix/src/hooks/useClickOutside.ts","../../../node_modules/vuesix/src/utils/handleMove.ts","../../../node_modules/vuesix/src/hooks/useDraggableItem.ts","../../../node_modules/vuesix/src/utils/object.ts","../../../node_modules/vuesix/src/hooks/useForm.ts","../../../node_modules/vuesix/src/utils/multimap.ts","../../../node_modules/vuesix/src/utils/pairMap.ts","../../../node_modules/vuesix/src/hooks/useRequest.ts","../../../node_modules/vuesix/src/hooks/useSearch.ts","../../../node_modules/vuesix/src/hooks/useKeyDownLayer.ts","../../common/types.ts","../../common/components/VFormControl.vue","../../../node_modules/@vueuse/shared/index.mjs","../../../node_modules/@vueuse/core/index.mjs","../../common/components/VInput.vue","../../common/components/BlocksList.vue","../../common/utils/processBlock.ts","../../common/utils/walkTree.ts","../../common/utils/blocks.ts","../../common/components/VTabs.vue","../../common/components/VTabsPages.vue","../../common/components/icons/CollapseArrowIcon.vue","../../common/components/VCollapse.vue","../../common/components/VPopover.vue","../../common/components/icons/ArrowDownIcon.vue","../../common/components/VIconButton.vue","../../common/components/icons/CloseMinIcon.vue","../../common/components/VSelect.vue","../../common/components/JsonEditorArray.vue","../../common/components/icons/EmptyFileIcon.vue","../../common/components/icons/MoreIcon.vue","../../common/components/VButton.vue","../../common/components/VContextMenu.vue","../../common/components/VDialogProvider.vue","../../common/components/VDialog.vue","../../common/components/dialogs/ProjectImagesDialog.vue","../../common/components/VImageUploader.vue","../../common/components/icons/CheckIcon.vue","../../common/components/VCheckbox.vue","../../common/utils/lang.ts","../../common/components/icons/EditIcon.vue","../../common/components/VLinkEditor.vue","../../../node_modules/vuewrite/dist/vuewrite.js","../../common/utils/richTextComponents.ts","../../common/utils/richTextCodeComponents.ts","../../common/components/RichTextEditorCode.vue","../../common/components/RichTextEditorLinkPopover.vue","../../common/components/icons/TextBoldIcon.vue","../../common/components/icons/TextItalicIcon.vue","../../common/components/icons/TextUnderlineIcon.vue","../../common/components/icons/TextStrikethroughIcon.vue","../../common/components/icons/ImageSolidIcon.vue","../../common/components/icons/CodeIcon.vue","../../common/components/icons/LinkIcon.vue","../../common/components/dialogs/RichTextEditorDialog.vue","../../common/components/VRichTextEditor.vue","../../common/components/icons/FileIcon.vue","../../common/components/VFileUploader.vue","../../common/components/VMultiSelect.vue","../../common/components/JsonEditor.vue","../../common/components/BlocksEditor.vue","../../common/components/ContentHierarchy.vue","../../common/components/HierarchySidebar.vue","../../common/utils/controlComponent.ts","../../common/components/FormColumn.vue","../../common/components/dialogs/CreatePageDialog.vue","../../common/components/VTable.vue","../../common/components/dialogs/OpenPageDialog.vue","../../common/components/dialogs/PageSettingsDialog.vue","../../common/components/icons/SortIcon.vue","../src/editor/api.ts","../src/editor/PageSelector.vue","../src/editor/processState.ts","../src/editor/EditorApp.vue","../src/editor/editor.ts"],"sourcesContent":["<template>\r\n <div class=\"editor-component editor-hover-frame\" :style=\"style\">\r\n\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { CSSProperties, ref, watch } from 'vue';\r\n\r\nconst props = defineProps<{ element?: HTMLElement | null, resizable?: boolean }>()\r\n\r\nconst style = ref<CSSProperties>({ display: \"none\" })\r\n\r\nconst updateStyle = () => {\r\n if (props.element) {\r\n const rect = props.element.getBoundingClientRect()\r\n style.value = { \r\n top: rect.top + document.documentElement.scrollTop +\"px\", \r\n left: rect.left + document.documentElement.scrollLeft +\"px\", \r\n width: rect.width+\"px\", \r\n height: rect.height+\"px\" \r\n }\r\n } else {\r\n style.value = { display: \"none\" }\r\n }\r\n}\r\nconst resizeObserver = new ResizeObserver(updateStyle)\r\n\r\nwatch(() => props.element, (element, lastElement) => {\r\n updateStyle()\r\n if (element) {\r\n resizeObserver.observe(element)\r\n } else if (lastElement) {\r\n resizeObserver.unobserve(lastElement)\r\n }\r\n}, { immediate: true })\r\n\r\ndefineExpose({\r\n update: updateStyle\r\n})\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.editor-hover-frame\r\n position: absolute\r\n border: 2px solid var(--primary-color)\r\n pointer-events: none\r\n box-sizing: border-box\r\n</style>","<template>\r\n <div class=\"editor__inserted-place-marker\" :style=\"{ top: top+'px' }\"></div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\n\r\nconst props = defineProps<{ top: number }>()\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.editor__inserted-place-marker\r\n background-color: #0073E9\r\n height: 2px\r\n position: absolute\r\n left: 0\r\n right: 0\r\n margin-top: -1px\r\n\r\n</style>","<template>\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M10.707 14.364C10.8945 14.1764 10.9998 13.9221 10.9998 13.657C10.9998 13.3918 10.8945 13.1375 10.707 12.95L5.75705 7.99995L10.707 3.04995C10.8892 2.86135 10.99 2.60875 10.9877 2.34655C10.9854 2.08435 10.8803 1.83354 10.6949 1.64813C10.5095 1.46272 10.2586 1.35756 9.99645 1.35528C9.73425 1.353 9.48165 1.45379 9.29305 1.63595L3.63605 7.29295C3.44858 7.48048 3.34326 7.73479 3.34326 7.99995C3.34326 8.26512 3.44858 8.51942 3.63605 8.70695L9.29305 14.364C9.48058 14.5514 9.73488 14.6567 10 14.6567C10.2652 14.6567 10.5195 14.5514 10.707 14.364Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M5.29295 1.63605C5.10548 1.82358 5.00017 2.07788 5.00017 2.34305C5.00017 2.60821 5.10548 2.86252 5.29295 3.05005L10.243 8.00005L5.29295 12.95C5.11079 13.1387 5.01 13.3913 5.01228 13.6534C5.01456 13.9156 5.11972 14.1665 5.30513 14.3519C5.49054 14.5373 5.74135 14.6424 6.00355 14.6447C6.26575 14.647 6.51835 14.5462 6.70695 14.364L12.364 8.70705C12.5514 8.51952 12.6567 8.26521 12.6567 8.00005C12.6567 7.73488 12.5514 7.48058 12.364 7.29305L6.70695 1.63605C6.51942 1.44858 6.26512 1.34326 5.99995 1.34326C5.73479 1.34326 5.48048 1.44858 5.29295 1.63605Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","export const findParent = (el: HTMLElement, callback: (el: HTMLElement) => boolean): HTMLElement | null => {\r\n if (callback(el)) return el\r\n if (!el.parentElement) return null\r\n return findParent(el.parentElement, callback)\r\n}","import { type Ref, type ShallowRef, type WatchSource, watch } from \"vue\"\r\nimport { findParent } from \"../utils/findParent\"\r\n\r\ntype Item = Ref<HTMLElement | undefined> | ShallowRef<HTMLElement | undefined>\r\n\r\nconst clickOnIgnore = (target: HTMLElement, ignoreEl?: Item | Item[]) => {\r\n if (!ignoreEl) return false\r\n return !!findParent(target, (el) => {\r\n if (!Array.isArray(ignoreEl)) return el === ignoreEl.value\r\n for (const item of ignoreEl) {\r\n if (item.value === el) return true\r\n }\r\n return false\r\n })\r\n}\r\n\r\n/** Listen click outside element if condition true */\r\nexport const useClickOutside = (condition: WatchSource, onClick: () => void, ignoreEl?: Item | Item[]) => {\r\n\r\n const clickOutside = (e: MouseEvent) => {\r\n if (clickOnIgnore(e.target as HTMLElement, ignoreEl)) return\r\n\r\n document.addEventListener(\"mouseup\", (e) => {\r\n if (clickOnIgnore(e.target as HTMLElement, ignoreEl)) return \r\n onClick()\r\n }, { once: true })\r\n }\r\n \r\n watch(condition, value => {\r\n setTimeout(() => {\r\n if (value) {\r\n document.addEventListener(\"mousedown\", clickOutside)\r\n } else {\r\n document.removeEventListener(\"mousedown\", clickOutside)\r\n }\r\n }, 50)\r\n }, { flush: \"post\" })\r\n}\r\n\r\nexport const useMouseDownOutside = (condition: WatchSource, onMouseDown: () => void, ignoreEl?: Item | Item[]) => {\r\n\r\n const clickOutside = (e: MouseEvent) => {\r\n if (e.defaultPrevented) return\r\n if (clickOnIgnore(e.target as HTMLElement, ignoreEl)) return\r\n onMouseDown()\r\n }\r\n\r\n watch(condition, value => {\r\n setTimeout(() => {\r\n if (value) {\r\n document.addEventListener(\"mousedown\", clickOutside)\r\n } else {\r\n document.removeEventListener(\"mousedown\", clickOutside)\r\n }\r\n }, 50)\r\n }, { flush: \"post\" })\r\n\r\n}","export const isTouchEvent = (e: MouseEvent | TouchEvent | Touch): e is TouchEvent => {\r\n return \"touches\" in e\r\n}\r\n\r\nexport function getPos(_e: MouseEvent | TouchEvent | Touch, relativeRect?: DOMRect, type?: MoveType, touchIndex = -1) {\r\n const e = isTouchEvent(_e)? _e.touches[touchIndex < 0? _e.touches.length-1: touchIndex]: _e\r\n if (!e) return { x: 0, y: 0 }\r\n\r\n if (relativeRect && type !== \"absolute\") {\r\n if (type === \"threejs\") {\r\n const _x = (e.clientX-relativeRect.left)/relativeRect.width * 2 - 1\r\n const _y = -(e.clientY-relativeRect.top)/relativeRect.height * 2 + 1\r\n return { x: _x, y: _y }\r\n } else {\r\n return { x: e.clientX - relativeRect.x, y: e.clientY - relativeRect.y }\r\n }\r\n } else {\r\n return { x: e.clientX, y: e.clientY }\r\n }\r\n}\r\n\r\nconst getTouch = (e: MouseEvent | TouchEvent, touchId: number | null) => {\r\n if (isTouchEvent(e) && touchId !== null) {\r\n for (let touch of e.touches) {\r\n if (touch.identifier === touchId) return touch\r\n }\r\n }\r\n return e\r\n}\r\n\r\nexport const clamp = (val: number, min: number, max: number) => {\r\n if (val > max) return max\r\n if (val < min) return min\r\n return val\r\n}\r\n\r\ntype HandleCallbackProps = {\r\n e: MouseEvent | TouchEvent\r\n pos: { x: number, y: number },\r\n deltaPos: { x: number, y: number },\r\n startPos: { x: number, y: number }\r\n}\r\n\r\ntype MoveType = \"relative\" | \"absolute\" | \"threejs\"\r\n\r\ntype HandleEventOpts = {\r\n onStart?: (props: HandleCallbackProps) => void\r\n onMove?: (props: HandleCallbackProps) => void,\r\n onEnd?: (props: HandleCallbackProps) => void,\r\n type?: MoveType,\r\n prevent?: boolean,\r\n threshold?: number,\r\n relativeRect?: DOMRect\r\n}\r\n\r\n/** Add document listener to track mouse move */\r\nexport function handleMove(e: TouchEvent | MouseEvent, { onStart, onMove, onEnd, relativeRect, type, prevent, threshold }: HandleEventOpts = {}) {\r\n\r\n const box = relativeRect ?? (e.currentTarget as HTMLElement).getBoundingClientRect()\r\n const touchId = isTouchEvent(e)? ((e.changedTouches[0] ?? e.touches[e.touches.length-1]).identifier): null\r\n\r\n const startPos = getPos(getTouch(e, touchId), box, type ?? \"absolute\")\r\n let lastPos = startPos\r\n\r\n let moving = false\r\n const move = (e: MouseEvent | TouchEvent) => {\r\n const pos = getPos(getTouch(e, touchId), box, type ?? \"absolute\")\r\n if (moving === false && threshold && Math.abs(pos.x - startPos.x) < threshold) {\r\n return\r\n }\r\n if (moving === false && threshold) {\r\n startPos.x = pos.x\r\n startPos.y = pos.y\r\n moving = true\r\n }\r\n if (!e.defaultPrevented && prevent !== false) {\r\n e.preventDefault()\r\n e.stopImmediatePropagation()\r\n }\r\n if (onMove){\r\n const deltaPos = { x: pos.x - lastPos.x, y: pos.y - lastPos.y}\r\n onMove({ e, pos, deltaPos, startPos })\r\n }\r\n lastPos = pos\r\n }\r\n\r\n const end = (e: MouseEvent | TouchEvent) => {\r\n if (isTouchEvent(e) && e.touches.length > 0 && e.changedTouches[0].identifier !== touchId) return\r\n if (!e.defaultPrevented && prevent !== false) {\r\n e.preventDefault()\r\n e.stopImmediatePropagation()\r\n }\r\n dispose(e)\r\n }\r\n\r\n\r\n const dispose = (e: MouseEvent | TouchEvent) => {\r\n\r\n document.removeEventListener(\"touchmove\", move)\r\n document.removeEventListener(\"mousemove\", move)\r\n document.removeEventListener(\"touchend\", end)\r\n document.removeEventListener(\"touchcancel\", end)\r\n document.removeEventListener(\"mouseup\", end)\r\n\r\n if (onEnd){\r\n const pos = getPos(getTouch(e, touchId), box, type ?? \"absolute\")\r\n if (pos.x === 0 && pos.y === 0) {\r\n onEnd({ e, pos: lastPos, startPos, deltaPos: { x: 0, y: 0 }})\r\n return\r\n }\r\n const deltaPos = { x: pos.x - lastPos.x, y: pos.y - lastPos.y}\r\n onEnd({ e, pos, startPos, deltaPos })\r\n }\r\n }\r\n\r\n if (onStart){\r\n onStart({ e, pos: startPos, deltaPos: { x: 0, y: 0 }, startPos })\r\n }\r\n move(e)\r\n \r\n if (isTouchEvent(e)) {\r\n document.addEventListener(\"touchmove\", move, { passive: prevent !== true })\r\n document.addEventListener(\"touchend\", end, { passive: prevent !== true })\r\n document.addEventListener(\"touchcancel\", end, { passive: prevent !== true })\r\n } else {\r\n document.addEventListener(\"mousemove\", move)\r\n document.addEventListener(\"mouseup\", end)\r\n }\r\n}\r\n\r\ntype HandleRotateCallbackProps = {\r\n angle: number\r\n deltaAngle: number,\r\n e: MouseEvent\r\n}\r\n\r\ntype HandleRotateEventOpts = {\r\n onStart?: (props: HandleRotateCallbackProps) => void\r\n onMove?: (props: HandleRotateCallbackProps) => void,\r\n onEnd?: (props: HandleRotateCallbackProps) => void\r\n}\r\n\r\nexport function handleAngleMove(e: any, center: { x: number, y: number }, { onStart, onMove, onEnd }: HandleRotateEventOpts = {}) {\r\n\r\n const startPos = getPos(e)\r\n let startAngle = Math.atan2(startPos.y - center.y, startPos.x - center.x) \r\n\r\n let lastAngle = 0\r\n const move = (e: any) => {\r\n const pos = getPos(e)\r\n const angle = (Math.atan2(pos.y - center.y, pos.x - center.x) - startAngle) / Math.PI * 180\r\n if (onMove)\r\n onMove({ angle, deltaAngle: angle-lastAngle, e })\r\n lastAngle = angle\r\n }\r\n\r\n const end = (e: any) => {\r\n const pos = getPos(e)\r\n const angle = (Math.atan2(pos.y - center.y, pos.x - center.x) - startAngle) / Math.PI * 180\r\n document.removeEventListener(\"touchmove\", move)\r\n document.removeEventListener(\"mousemove\", move)\r\n if (onEnd)\r\n onEnd({ angle, deltaAngle: angle-lastAngle, e })\r\n }\r\n\r\n move(e)\r\n if (onStart)\r\n onStart({ angle: 0, deltaAngle: 0, e })\r\n\r\n if (e.touches) {\r\n document.addEventListener(\"touchmove\", move)\r\n document.addEventListener(\"touchend\", end, { once: true })\r\n } else {\r\n document.addEventListener(\"mousemove\", move)\r\n document.addEventListener(\"mouseup\", end, { once: true })\r\n }\r\n}\r\n\r\n\r\ntype HandleScaleCallbackProps = {\r\n scale: number\r\n deltaScale: number\r\n}\r\n\r\ntype HandleScaleEventOpts = {\r\n onStart?: (props: HandleScaleCallbackProps) => void\r\n onMove?: (props: HandleScaleCallbackProps) => void,\r\n onEnd?: (props: HandleScaleCallbackProps) => void\r\n}\r\n\r\nexport function handleScaleMove(e: any, center: { x: number, y: number }, { onStart, onMove, onEnd }: HandleScaleEventOpts = {}) {\r\n\r\n const startPos = getPos(e)\r\n let startScale = Math.hypot(startPos.y - center.y, startPos.x - center.x)\r\n\r\n let lastScale = 1\r\n const move = (e: any) => {\r\n const pos = getPos(e)\r\n const scale = Math.hypot(pos.y - center.y, pos.x - center.x) / startScale\r\n if (onMove)\r\n onMove({ scale, deltaScale: scale/lastScale })\r\n lastScale = scale\r\n }\r\n\r\n const end = (e: any) => {\r\n const pos = getPos(e)\r\n const scale = Math.hypot(pos.y - center.y, pos.x - center.x) / startScale\r\n document.removeEventListener(\"touchmove\", move)\r\n document.removeEventListener(\"mousemove\", move)\r\n if (onEnd)\r\n onEnd({ scale, deltaScale: scale/lastScale })\r\n }\r\n\r\n move(e)\r\n if (onStart)\r\n onStart({ scale: 1, deltaScale: 1 })\r\n\r\n if (e.touches) {\r\n document.addEventListener(\"touchmove\", move)\r\n document.addEventListener(\"touchend\", end, { once: true })\r\n } else {\r\n document.addEventListener(\"mousemove\", move)\r\n document.addEventListener(\"mouseup\", end, { once: true })\r\n }\r\n}","import { handleMove } from \"../utils/handleMove\"\r\n\r\ntype DraggableOptions = {\r\n onStart?: (item: HTMLElement) => void,\r\n onMove?: (e: MouseEvent, item: HTMLElement) => void,\r\n onEnd?: (e: MouseEvent) => void,\r\n threshold?: number,\r\n offset?: { left: number, top: number }\r\n}\r\n\r\n/** Clone element and move it follow mouse */\r\nexport const useDraggableItem = () => {\r\n let clonedItem: HTMLElement | null\r\n\r\n const drag = (e: MouseEvent, options: DraggableOptions) => {\r\n if (clonedItem) {\r\n clonedItem.remove()\r\n clonedItem = null\r\n }\r\n \r\n const el = (e.currentTarget as HTMLButtonElement)\r\n const rect = el.getBoundingClientRect()\r\n const offset = options.offset ?? { left: rect.left - e.clientX, top: rect.top - e.clientY }\r\n const width = el.clientWidth\r\n \r\n const onStart = () => {\r\n clonedItem = el.cloneNode(true) as HTMLElement\r\n clonedItem.setAttribute(\"style\", \"position: fixed; pointer-events: none;\")\r\n document.body.append(clonedItem)\r\n options.onStart?.(clonedItem)\r\n }\r\n const threshold = options.threshold ?? 10\r\n\r\n handleMove(e, {\r\n onMove({ e, pos, startPos }) {\r\n if (!clonedItem) {\r\n if (Math.abs(pos.x - startPos.x) > threshold || Math.abs(pos.y - startPos.y) > threshold) {\r\n onStart()\r\n }\r\n return\r\n }\r\n clonedItem.setAttribute(\r\n \"style\", \r\n `position: fixed; top: ${pos.y + offset.top}px; left: ${pos.x + offset.left}px; width: ${width}px; pointer-events: none;`\r\n )\r\n options.onMove?.(e as MouseEvent, clonedItem)\r\n },\r\n onEnd({ e }) {\r\n if (!clonedItem) return\r\n clonedItem.remove()\r\n clonedItem = null\r\n options.onEnd?.(e as MouseEvent)\r\n },\r\n type: \"absolute\",\r\n prevent: false\r\n })\r\n }\r\n\r\n return drag\r\n}","\r\nexport const cloneDeep = <T>(obj: T): T => {\r\n if (typeof obj !== \"object\" || obj === null) return obj\r\n if (Array.isArray(obj)) {\r\n return [ ...obj.map(cloneDeep) ] as T\r\n }\r\n return Object.fromEntries(Object.entries(obj).map(([ key, value ]) => [ key, cloneDeep(value) ])) as T\r\n}\r\n\r\n/** Simple deep comparsion. If b has'n keys from a its equals */\r\nexport const isEqual = (a: any, b: any) => {\r\n if (a === b) return true\r\n if (typeof a !== \"object\" || typeof b !== \"object\" || a === null || b === null) return false\r\n\r\n if (Array.isArray(a)) {\r\n if (!Array.isArray(b) || a.length !== b.length) return false\r\n for (let i = 0; i < a.length; i++) {\r\n if (!isEqual(a[i], b[i])) return false\r\n }\r\n return true\r\n }\r\n\r\n for (let key in a) {\r\n if (!isEqual(a[key], b[key])) return false\r\n }\r\n return true\r\n}","import { type WatchSource, computed, reactive, ref, watch } from \"vue\"\r\nimport { cloneDeep, isEqual } from \"../utils/object\"\r\n\r\ntype Options<T> = {\r\n required?: Array<keyof T>\r\n}\r\n\r\n\r\nlet globalErrorHandler = (_error: any, _errors: any) => {}\r\n\r\nexport const setUseFormErrorHandler = (handler: (error: any, errors: Record<string, string>) => void) => {\r\n globalErrorHandler = handler\r\n}\r\n\r\nexport const useForm = <T extends Record<string, any>>(defaultValues: T, options: Options<T> = {}) => {\r\n\r\n const pending = ref(false)\r\n const values = reactive(cloneDeep(defaultValues)) as T\r\n const errors = reactive<Partial<Record<keyof T | \"_global\", { code?: string, message?: string }>>>({})\r\n\r\n const oldValues: { [key: string]: string } = {}\r\n watch(values, () => {\r\n for (let [ key, value ] of Object.entries(values)) {\r\n if (key in errors && value !== oldValues[key]) {\r\n delete (errors as any)[key as keyof T]\r\n }\r\n }\r\n Object.assign(oldValues, values)\r\n })\r\n\r\n const requiredSet = computed(() => {\r\n return new Set(options.required)\r\n })\r\n\r\n const setError = (key: keyof T, error: { code?: string, message?: string }) => {\r\n (errors as any)[key] = error\r\n }\r\n\r\n const register = <K extends keyof T>(key: K) => {\r\n return {\r\n modelValue: values[key],\r\n \"onUpdate:modelValue\": (value: T[K]) => values[key] = value as any,\r\n error: (errors as any)[key],\r\n name: key,\r\n required: requiredSet.value.has(key)\r\n }\r\n }\r\n\r\n const checkRequired = (keys?: Array<keyof T>) => {\r\n for (let key of (keys ?? options.required ?? [])) {\r\n const val = values[key]\r\n if (val === null || (typeof val === \"string\" && !val.trim() || (Array.isArray(val) && val.length === 0))) {\r\n setError(key, { code: \"required\" })\r\n return false\r\n }\r\n }\r\n return true\r\n }\r\n\r\n const requiredFilled = computed(() => {\r\n for (let key of options.required ?? []) {\r\n const val = values[key]\r\n if (val === null || (typeof val === \"string\" && !val.trim()) || (Array.isArray(val) && val.length === 0)) {\r\n return false\r\n }\r\n }\r\n return true\r\n })\r\n\r\n const handleError = (e: any) => {\r\n globalErrorHandler(e, errors)\r\n for (let key in errors) {\r\n if (!(key in values) && key !== \"_global\") {\r\n delete (errors as any)[key]\r\n }\r\n }\r\n }\r\n\r\n const handleSubmit = (submit: (values: T) => void | Promise<void>) => async (e: Event) => {\r\n e.preventDefault()\r\n if (!checkRequired()) return\r\n\r\n delete (errors as any)[\"_global\"]\r\n pending.value = true\r\n try {\r\n await submit(values)\r\n } catch(e) {\r\n handleError(e)\r\n throw e\r\n } finally {\r\n pending.value = false\r\n }\r\n }\r\n\r\n const updateDefaultValues = (newValues: Partial<T>) => {\r\n for (let [ key, value ] of Object.entries(newValues)) {\r\n if (key in values) {\r\n (values as any)[key] = cloneDeep(value);\r\n (defaultValues as any)[key] = value\r\n }\r\n }\r\n changeFlag.value = true\r\n changeFlag.value = false\r\n }\r\n\r\n /** Watch value and update form default values if its change */\r\n const updateDefaultValuesWatch = <D>(data: WatchSource<D>, map?: (obj: D) => T) => {\r\n watch(data, (data) => {\r\n if (!data) return\r\n updateDefaultValues(map? map(data): data)\r\n }, { immediate: true })\r\n }\r\n\r\n const changeFlag = ref(false)\r\n const setChange = () => {\r\n changeFlag.value = true\r\n }\r\n\r\n const hasChange = computed(() => {\r\n if (changeFlag.value) return true\r\n return !isEqual(values, defaultValues)\r\n })\r\n\r\n return {\r\n handleSubmit,\r\n register,\r\n setError,\r\n errors,\r\n checkRequired,\r\n updateDefaultValues,\r\n updateDefaultValuesWatch,\r\n pending,\r\n values,\r\n hasChange,\r\n setChange,\r\n requiredFilled\r\n }\r\n}","/** Class for create two dimensial Map */\r\nexport class MultiMap<T, K> {\r\n _map = new Map<T, K[]>()\r\n\r\n get size() {\r\n return this._map.size\r\n }\r\n\r\n add(key: T, value: K) {\r\n const arr = this._map.get(key)\r\n if (!arr) {\r\n this._map.set(key, [ value ])\r\n } else {\r\n arr.push(value)\r\n }\r\n }\r\n\r\n remove(key: T, value: K) {\r\n const arr = this._map.get(key)\r\n if (!arr) return false\r\n const newArr = arr.filter(item => item !== value)\r\n if (newArr.length === arr.length) return false\r\n if (newArr.length === 0) {\r\n this._map.delete(key)\r\n } else {\r\n this._map.set(key, newArr)\r\n }\r\n return true\r\n }\r\n\r\n has(key: T) {\r\n return this._map.has(key)\r\n }\r\n\r\n get(key: T) {\r\n return this._map.get(key) || []\r\n }\r\n\r\n forEach(key: T, callback: (val: K) => void) {\r\n const arr = this._map.get(key)\r\n if (!arr) return\r\n arr.forEach(callback)\r\n }\r\n\r\n clear() {\r\n this._map.clear()\r\n }\r\n}\r\n","export class PairMap<T, P, K> {\r\n _map = new Map<T, Map<P, K>>()\r\n\r\n set(keyA: T, keyB: P, value: K) {\r\n const map = this._map.get(keyA)\r\n if (map) {\r\n map.set(keyB, value)\r\n return\r\n }\r\n this._map.set(keyA, new Map([[ keyB, value ]]))\r\n }\r\n\r\n get(keyA: T, keyB: P) {\r\n const map = this._map.get(keyA)\r\n if (!map) return null\r\n return map.get(keyB) ?? null\r\n }\r\n\r\n deletePair(keyA: T) {\r\n this._map.delete(keyA)\r\n }\r\n \r\n delete(keyA: T, keyB: P) {\r\n const map = this._map.get(keyA)\r\n if (!map) return\r\n map.delete(keyB)\r\n if (map.size === 0) {\r\n this.deletePair(keyA)\r\n }\r\n }\r\n\r\n clear() {\r\n this._map.clear()\r\n }\r\n\r\n}","import { type Ref, type UnwrapRef, type WatchSource, onBeforeUnmount, onMounted, ref, shallowRef, triggerRef, watch } from 'vue'\r\nimport { MultiMap } from '../utils/multimap'\r\nimport { PairMap } from '../utils/pairMap'\r\n\r\ntype DataEntry = { data: any, lastUpdate: number, updatedManually?: boolean, promise?: Promise<any> }\r\nconst dataMap = new PairMap<any, string, DataEntry>()\r\nconst events = new MultiMap<any, () => Promise<void>>() // eslint-disable-line func-call-spacing\r\n\r\nconst getArgKey = (args: any[]) => {\r\n return args.length === 0 ? '' : JSON.stringify(args)\r\n}\r\n\r\nconst getEntryOrCreate = <A extends any[]>(request: (...args: A) => Promise<any>, argKey: string, defaultValue: DataEntry) => {\r\n \r\n const existsValue = dataMap.get(request, argKey)\r\n if (existsValue) return existsValue\r\n\r\n dataMap.set(request, argKey, defaultValue)\r\n return defaultValue\r\n}\r\n\r\ntype RequestOptions = {\r\n deep?: boolean\r\n}\r\n\r\n// type UseRequest<A extends any[], R> = {\r\n// data: Ref<R | null>, \r\n// error: ShallowRef<any>, \r\n// pending: ShallowRef<boolean>, \r\n// mutate: (...args: A) => Promise<void>, \r\n// lazyMutate: (...args: A) => Promise<void>, \r\n// setReturnData: (callback: (...args: A) => any) => void\r\n// }\r\n\r\n/**\r\n * Extended version of useRequest with additional options.\r\n * @template A - The arguments type for the request function.\r\n * @template R - The return type of the request function.\r\n * @param {RequestOptions} options - Configuration options for the request.\r\n * @param {(...args: A) => Promise<R>} request - The async request function.\r\n * @param {...A} args - Arguments to pass to the request function.\r\n * @property {Ref<R|null>} data - Reactive reference to the request result.\r\n * @property {ShallowRef<any>} error - Reactive reference to any request error.\r\n * @property {ShallowRef<boolean>} pending - Reactive reference to the pending state.\r\n * @property {function} mutate - Function to manually trigger the request.\r\n * @property {function} lazyMutate - Function to conditionally trigger the request.\r\n * @property {function} setReturnData - Function to set a callback for custom data return.\r\n */\r\nexport const useRequestExt = <A extends any[], R>(options: RequestOptions, request: (...args: A) => Promise<R>, ...args: A) => {\r\n\r\n const defaultValue = dataMap.get(request, getArgKey(args))\r\n const pending = shallowRef(defaultValue === null)\r\n\r\n const data = (options.deep? ref: shallowRef)<R | null>(defaultValue?.data ?? null) as Ref<R | null>\r\n const error = shallowRef<any>(null)\r\n\r\n let lastArgs = [] as any[] as A\r\n let currentArgKey: string | null = null\r\n const mutate = async (...args: A) => {\r\n const argKey = getArgKey(args)\r\n currentArgKey = argKey\r\n\r\n error.value = null\r\n const returnDataValue = returnDataCallback?.(...args)\r\n if (returnDataValue !== undefined) {\r\n pending.value = false\r\n data.value = returnDataValue\r\n return\r\n }\r\n const entry = getEntryOrCreate(request, argKey, { data: null, lastUpdate: -1, updatedManually: false })\r\n data.value = entry.data\r\n pending.value = entry.data === null\r\n lastArgs = args\r\n\r\n if (entry.data && entry.updatedManually) {\r\n triggerRef(data)\r\n return\r\n }\r\n\r\n try {\r\n const resp = await makeRequestWithoutCache(entry, request, ...args)\r\n if (currentArgKey === argKey) {\r\n data.value = resp\r\n }\r\n } catch (e) {\r\n error.value = e\r\n // throw e\r\n } finally {\r\n delete entry.promise\r\n pending.value = false\r\n }\r\n }\r\n\r\n const lazyMutate = async (...args: A) => {\r\n const argKey = getArgKey(args)\r\n currentArgKey = argKey\r\n const entry = dataMap.get(request, argKey)\r\n if (entry !== null && entry.lastUpdate > 0 && Date.now() < entry.lastUpdate + 1000*30) {\r\n data.value = entry.data\r\n error.value = null\r\n lastArgs = args\r\n return\r\n }\r\n mutate(...args)\r\n }\r\n\r\n let returnDataCallback: (...args: A) => any\r\n const setReturnData = (callback: (...args: A) => any) => {\r\n returnDataCallback = callback\r\n }\r\n\r\n const mutateWithLastArgs = () => mutate(...lastArgs)\r\n\r\n onMounted(() => {\r\n lazyMutate(...args)\r\n })\r\n\r\n onMounted(() => {\r\n events.add(request, mutateWithLastArgs)\r\n })\r\n onBeforeUnmount(() => {\r\n events.remove(request, mutateWithLastArgs)\r\n })\r\n\r\n return { data, error, pending, mutate, lazyMutate, setReturnData }\r\n}\r\n\r\nexport const updateRequestData = async <A extends any[], R>(request: (...args: A) => Promise<R>, data: any, ...args: A) => {\r\n const argKey = getArgKey(args)\r\n const entry = getEntryOrCreate(request, argKey, { data, lastUpdate: Date.now() })\r\n entry.data = data\r\n entry.updatedManually = true\r\n\r\n if (events.get(request).length > 0) {\r\n await Promise.all((events.get(request) ?? []).map(callback => callback()))\r\n }\r\n entry.updatedManually = false\r\n}\r\n\r\n/**\r\n * Deep reactive version of useRequest.\r\n * @template A - The arguments type for the request function.\r\n * @template R - The return type of the request function.\r\n * @param {(...args: A) => Promise<R>} request - The async request function.\r\n * @param {...A} args - Arguments to pass to the request function.\r\n */\r\nexport const useRequestDeep = <A extends any[], R>(request: (...args: A) => Promise<R>, ...args: A) => \r\n useRequestExt({ deep: true }, request, ...args)\r\n\r\n/**\r\n * Basic version of useRequest with shallow reactivity.\r\n * @template A - The arguments type for the request function.\r\n * @template R - The return type of the request function.\r\n * @param {(...args: A) => Promise<R>} request - The async request function.\r\n * @param {...A} args - Arguments to pass to the request function.\r\n */\r\nexport const useRequest = <A extends any[], R>(request: (...args: A) => Promise<R>, ...args: A) => \r\n useRequestExt({ deep: false }, request, ...args)\r\n\r\ntype MapWatch <Type>= {\r\n [Key in keyof Type]: WatchSource<Type[Key]>;\r\n};\r\n\r\n/**\r\n * useRequest with reactive arguments that automatically re-fetches when args change.\r\n * @template A - The arguments type for the request function.\r\n * @template R - The return type of the request function.\r\n * @param {(...args: A) => Promise<R>} request - The async request function.\r\n * @param {...MapWatch<A>} args - Reactive arguments to watch.\r\n */\r\nexport const useRequestWatch = <A extends any[], R>(request: (...args: A) => Promise<R>, ...args: MapWatch<A>) => {\r\n const resp = useRequestExt({ deep: false }, request, ...args.map(item => typeof item === \"function\"? item(): item.value) as A)\r\n\r\n watch(args, (args) => {\r\n resp.lazyMutate(...args as A)\r\n })\r\n\r\n return resp\r\n}\r\n\r\n/**\r\n * Deep reactive version of useRequest with reactive arguments.\r\n * @template A - The arguments type for the request function.\r\n * @template R - The return type of the request function.\r\n * @param {(...args: A) => Promise<R>} request - The async request function.\r\n * @param {...MapWatch<A>} args - Reactive arguments to watch.\r\n */\r\nexport const useRequestDeepWatch = <A extends any[], R>(request: (...args: A) => Promise<R>, ...args: MapWatch<A>) => {\r\n const resp = useRequestExt({ deep: true }, request, ...args.map(item => typeof item === \"function\"? item(): item.value) as A)\r\n\r\n watch(args, (args) => {\r\n resp.lazyMutate(...args as A)\r\n })\r\n\r\n return resp\r\n}\r\n\r\n/**\r\n * Revalidates all cached data for a request function and optionally triggers updates.\r\n * @template A - The arguments type for the request function.\r\n * @param {(...args: A) => Promise<any>} request - The request function to revalidate.\r\n * @param {boolean} [triggerRequests=true] - Whether to trigger pending requests.\r\n * @returns {Promise<void>} A promise that resolves when revalidation is complete.\r\n */\r\nexport const mutateRequestFull = async <A extends any[]>(request: (...args: A) => Promise<any>, triggerRequests = true) => {\r\n dataMap.deletePair(request)\r\n if (triggerRequests && events.get(request).length > 0) {\r\n await Promise.all((events.get(request) ?? []).map(callback => callback()))\r\n }\r\n}\r\n\r\n// TODO: exec promise only for specific arguments\r\n/**\r\n * Revalidates cached data for specific arguments of a request function.\r\n * @template A - The arguments type for the request function.\r\n * @param {(...args: A) => Promise<any>} request - The request function to revalidate.\r\n * @param {...A} args - Specific arguments to revalidate.\r\n * @returns {Promise<void>} A promise that resolves when revalidation is complete.\r\n */\r\nexport const mutateRequest = async <A extends any[]>(request: (...args: A) => Promise<any>, ...args: A) => {\r\n dataMap.delete(request, getArgKey(args))\r\n if (events.get(request).length > 0) {\r\n await Promise.all((events.get(request) ?? []).map(callback => callback()))\r\n }\r\n}\r\n\r\n/**\r\n * Clears all cached request data and event listeners.\r\n */\r\nexport const resetRequestCache = () => {\r\n events._map.clear()\r\n dataMap.clear()\r\n}\r\n\r\nconst makeRequestWithoutCache = async <A extends any[], R>(entry: DataEntry, request: (...args: A) => Promise<R>, ...args: A) => {\r\n if (!entry.promise) {\r\n const promise = (async () => {\r\n const resp = await request(...args) as UnwrapRef<R>\r\n entry.data = resp\r\n entry.lastUpdate = Date.now()\r\n delete entry.promise\r\n })()\r\n entry.promise = promise\r\n }\r\n await entry.promise!\r\n return entry.data\r\n}\r\n\r\n/**\r\n * Makes a request with caching support.\r\n * @template A - The arguments type for the request function.\r\n * @template R - The return type of the request function.\r\n * @param {(...args: A) => Promise<R>} request - The async request function.\r\n * @param {...A} args - Arguments to pass to the request function.\r\n * @returns {Promise<R>} A promise that resolves with the request result.\r\n */\r\nexport const makeRequest = async <A extends any[], R>(request: (...args: A) => Promise<R>, ...args: A) => {\r\n const argKey = getArgKey(args)\r\n const entry = getEntryOrCreate(request, argKey, { data: null, lastUpdate: -1 })\r\n if (entry !== null && entry.lastUpdate > 0) {\r\n return entry.data\r\n }\r\n return await makeRequestWithoutCache(entry, request, ...args)\r\n}","import { type WatchSource, computed } from \"vue\"\r\n\r\nexport const getSearchFeed = (str: string, dotToSpace: boolean = true): string[] => {\r\n const reg = dotToSpace ? /[_\\-,()]/g : /[_\\-.,()]/g;\r\n const arr = str\r\n .toLowerCase()\r\n .replace(reg, \" \")\r\n .split(\" \")\r\n .filter(a => a.length > 0);\r\n return arr;\r\n};\r\n\r\nexport const compareSearchFeed = (source: string[], target: string[]): boolean => {\r\n for (const str2 of target) {\r\n let find = false;\r\n for (const str of source) {\r\n if (str.startsWith(str2)) {\r\n find = true;\r\n }\r\n }\r\n if (!find) return false;\r\n }\r\n return true;\r\n};\r\n\r\nexport const findByKeys = <T>(source: T[], keys: string[][], target: string[]) => {\r\n return source.filter((_, index) => compareSearchFeed(keys[index], target))\r\n}\r\n\r\nconst getValue = <T>(item: WatchSource<T>): T => {\r\n return (typeof item === 'function'? item(): item.value)\r\n}\r\n\r\n/** Complex reactivity search based on key */\r\nexport const useSearch = <T>(\r\n searchValue: WatchSource<string | string[]>, \r\n data: WatchSource<T[]>, \r\n keyExtractor: (item: T) => string | string[],\r\n) => {\r\n \r\n const searchKeys = computed(() => {\r\n return getValue(data)?.map(item => {\r\n const data = keyExtractor(item)\r\n return Array.isArray(data)? data: getSearchFeed(data)\r\n }) ?? []\r\n })\r\n\r\n const dataSearched = computed(() => {\r\n const val = getValue(searchValue)\r\n const searchFeed = Array.isArray(val)? val: getSearchFeed(val)\r\n \r\n const currentData = getValue(data)\r\n if (searchFeed.length === 0 || !currentData) return currentData\r\n\r\n return findByKeys(currentData, searchKeys.value, searchFeed)\r\n })\r\n\r\n return dataSearched\r\n}","import { type WatchSource, watch } from \"vue\";\r\nimport { MultiMap } from \"../utils/multimap\";\r\n\r\nlet listeners = new MultiMap<string, (e: KeyboardEvent) => void>()\r\n\r\nexport const getKeyDownListeners = () => {\r\n return listeners\r\n}\r\nexport const setKeyDownListeners = (_listeners: any) => {\r\n listeners = _listeners\r\n}\r\n\r\nexport const handleKeyDownLayer = (e: KeyboardEvent) => {\r\n if (!listeners.has(e.code)) return\r\n const _listeners = listeners.get(e.code)\r\n e.preventDefault()\r\n const callback = _listeners[_listeners.length-1]\r\n callback(e)\r\n}\r\n\r\n/** Add layout for keydown event */\r\nexport const useKeyDownLayer = (key: string, watcher: WatchSource<boolean>, callback: () => void) => {\r\n\r\n watch(watcher, (value) => {\r\n const hasEvent = listeners.size > 0\r\n if (value) {\r\n listeners.add(key, callback)\r\n } else {\r\n listeners.remove(key, callback)\r\n }\r\n if (listeners.size > 0 && !hasEvent) {\r\n document.addEventListener(\"keydown\", handleKeyDownLayer)\r\n }\r\n if (listeners.size === 0) {\r\n document.removeEventListener(\"keydown\", handleKeyDownLayer)\r\n }\r\n }, { immediate: true })\r\n}\r\n","import type { VNode } from \"vue\"\r\n\r\nexport type Block = {\r\n id: string,\r\n name: string,\r\n isDev?: boolean,\r\n hidden?: boolean,\r\n group?: string,\r\n order?: number,\r\n props?: any,\r\n slots?: Record<string, any> \r\n}\r\n\r\nexport type ContentBlock = {\r\n id: string,\r\n blockId: string,\r\n data: any,\r\n vnode?: VNode | (() => VNode),\r\n children?: ContentBlock[] | Record<string, ContentBlock[]>\r\n}\r\n\r\nexport type DataEntry = {\r\n id: string,\r\n title?: string,\r\n props?: any\r\n}\r\n\r\nexport type DataEntryScope = \"site\" | \"folder\" | \"page\"\r\n\r\nexport type State = {\r\n content: ContentBlock[], \r\n data: Record<string, any>,\r\n query: Record<string, any>,\r\n dataEntryScopes?: Record<string, DataEntryScope>\r\n}\r\n\r\nexport class BlockDropEvent extends Event {\r\n content: ContentBlock | null = null\r\n block: Block\r\n constructor(block: Block, content: ContentBlock | null = null) {\r\n super(\"blockdrop\", { bubbles: true })\r\n this.block = block\r\n this.content = content\r\n }\r\n}\r\n\r\nexport type PageLink = { id: string, url?: string, query?: string, title: string, external?: boolean, openNewTab?: boolean }\r\n","<template>\r\n <div class=\"v-form-control\" :class=\"{ error: !!props.error, disabled: props.disabled }\">\r\n <label v-if=\"!!props.label\" class=\"v-form-control__label\">\r\n {{ props.label }}<span v-if=\"props.required\" class=\"v-form-control__required-marker\">*</span>\r\n </label>\r\n <div v-if=\"props.outline\" class=\"v-form-control__outline\">\r\n <slot></slot>\r\n </div>\r\n <slot v-else></slot>\r\n <div v-if=\"$slots.actions\" class=\"v-form-control__actions\">\r\n <slot name=\"actions\"></slot>\r\n </div>\r\n <Transition>\r\n <div v-if=\"!!props.error\" class=\"v-form-control__error\">\r\n {{ error }}\r\n </div>\r\n </Transition>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\n\r\nexport type VFormControlProps = {\r\n error?: { message?: string, code?: string },\r\n label?: string\r\n required?: boolean,\r\n disabled?: boolean\r\n}\r\n\r\n</script>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { computed, inject } from 'vue';\r\n\r\nconst props = defineProps<VFormControlProps & { outline?: boolean }>()\r\n\r\nconst error = computed(() => {\r\n if (!props.error) return \"\"\r\n if (typeof props.error === \"string\") return errorMap[props.error] ?? props.error\r\n const code = props.error[\"code\"]\r\n if (code && code in errorMap) {\r\n return errorMap[code] ?? \"\"\r\n }\r\n return props.error.message ?? \"Произошла ошибка\"\r\n})\r\n\r\nconst errorMap = inject(\"errorMap\", {}) as Record<string, string>\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n\r\n.v-form-control\r\n display: flex\r\n flex-direction: column\r\n align-items: stretch\r\n position: relative\r\n transition: padding-bottom 0.12s cubic-bezier(0.4, 0, 0.2, 1)\r\n\r\n &.error\r\n &:not(.disablePadding)\r\n padding-bottom: 16px\r\n\r\n .v-form-control__label\r\n color: var(--error-color)\r\n\r\n .v-form-control__outline\r\n border-color: var(--error-color)\r\n\r\n &.disabled\r\n pointer-events: none\r\n opacity: 0.6\r\n\r\n.v-form-control .v-icon-button\r\n background-color: var(--placeholder-color)\r\n color: white\r\n width: 20px\r\n height: 20px\r\n border: 2px solid var(--blocks-color)\r\n\r\n &:hover\r\n background-color: var(--input-border-color)\r\n\r\n &:focus-within\r\n background-color: var(--input-border-color)\r\n\r\n.v-form-control__outline\r\n display: flex\r\n border-radius: 8px\r\n // transition: border-color 0.12s\r\n font-size: 13px\r\n position: relative\r\n box-sizing: border-box\r\n border: 1px solid var(--input-border-color)\r\n box-sizing: border-box\r\n\r\n &:focus-within\r\n border-color: var(--primary-color)\r\n box-shadow: 0 0 0 2px var(--shadow-color)\r\n\r\n.v-form-control__label\r\n font-size: 13px\r\n margin-bottom: 4px\r\n white-space: nowrap\r\n font-weight: 500\r\n user-select: none\r\n color: var(--text-color-alt)\r\n\r\n.v-form-control__required-marker\r\n color: var(--primary-color)\r\n user-select: none\r\n margin-left: 0.15em\r\n\r\n.v-form-control__error\r\n position: absolute\r\n bottom: 0\r\n font-size: 12px\r\n color: var(--error-color)\r\n transition: opacity 0.12s, transform 0.12s cubic-bezier(0.4, 0, 0.2, 1)\r\n width: 100%\r\n\r\n &.v-enter-from, &.v-leave-to\r\n opacity: 0\r\n\r\n.v-form-control.disablePadding .v-form-control__error\r\n bottom: -16px\r\n &.v-enter-from, &.v-leave-to\r\n transform: translateY(-16px)\r\n\r\n.v-form-control__actions\r\n position: absolute\r\n top: -4px\r\n right: 0\r\n display: flex\r\n align-items: center\r\n\r\n .v-icon-button\r\n width: 24px\r\n height: 24px\r\n color: var(--text-secondary-color)\r\n\r\n svg\r\n max-width: 16px\r\n max-height: 16px\r\n\r\n</style>","import { shallowRef, watchEffect, readonly, watch, customRef, getCurrentScope, onScopeDispose, effectScope, getCurrentInstance, hasInjectionContext, inject, provide, ref, isRef, unref, toValue as toValue$1, computed, reactive, toRefs as toRefs$1, toRef as toRef$1, onBeforeMount, nextTick, onBeforeUnmount, onMounted, onUnmounted, isReactive } from 'vue';\n\nfunction computedEager(fn, options) {\n var _a;\n const result = shallowRef();\n watchEffect(() => {\n result.value = fn();\n }, {\n ...options,\n flush: (_a = options == null ? void 0 : options.flush) != null ? _a : \"sync\"\n });\n return readonly(result);\n}\n\nfunction computedWithControl(source, fn) {\n let v = void 0;\n let track;\n let trigger;\n const dirty = shallowRef(true);\n const update = () => {\n dirty.value = true;\n trigger();\n };\n watch(source, update, { flush: \"sync\" });\n const get = typeof fn === \"function\" ? fn : fn.get;\n const set = typeof fn === \"function\" ? void 0 : fn.set;\n const result = customRef((_track, _trigger) => {\n track = _track;\n trigger = _trigger;\n return {\n get() {\n if (dirty.value) {\n v = get(v);\n dirty.value = false;\n }\n track();\n return v;\n },\n set(v2) {\n set == null ? void 0 : set(v2);\n }\n };\n });\n if (Object.isExtensible(result))\n result.trigger = update;\n return result;\n}\n\nfunction tryOnScopeDispose(fn) {\n if (getCurrentScope()) {\n onScopeDispose(fn);\n return true;\n }\n return false;\n}\n\nfunction createEventHook() {\n const fns = /* @__PURE__ */ new Set();\n const off = (fn) => {\n fns.delete(fn);\n };\n const clear = () => {\n fns.clear();\n };\n const on = (fn) => {\n fns.add(fn);\n const offFn = () => off(fn);\n tryOnScopeDispose(offFn);\n return {\n off: offFn\n };\n };\n const trigger = (...args) => {\n return Promise.all(Array.from(fns).map((fn) => fn(...args)));\n };\n return {\n on,\n off,\n trigger,\n clear\n };\n}\n\nfunction createGlobalState(stateFactory) {\n let initialized = false;\n let state;\n const scope = effectScope(true);\n return (...args) => {\n if (!initialized) {\n state = scope.run(() => stateFactory(...args));\n initialized = true;\n }\n return state;\n };\n}\n\nconst localProvidedStateMap = /* @__PURE__ */ new WeakMap();\n\nconst injectLocal = (...args) => {\n var _a;\n const key = args[0];\n const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy;\n if (instance == null && !hasInjectionContext())\n throw new Error(\"injectLocal must be called in setup\");\n if (instance && localProvidedStateMap.has(instance) && key in localProvidedStateMap.get(instance))\n return localProvidedStateMap.get(instance)[key];\n return inject(...args);\n};\n\nconst provideLocal = (key, value) => {\n var _a;\n const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy;\n if (instance == null)\n throw new Error(\"provideLocal must be called in setup\");\n if (!localProvidedStateMap.has(instance))\n localProvidedStateMap.set(instance, /* @__PURE__ */ Object.create(null));\n const localProvidedState = localProvidedStateMap.get(instance);\n localProvidedState[key] = value;\n provide(key, value);\n};\n\nfunction createInjectionState(composable, options) {\n const key = (options == null ? void 0 : options.injectionKey) || Symbol(composable.name || \"InjectionState\");\n const defaultValue = options == null ? void 0 : options.defaultValue;\n const useProvidingState = (...args) => {\n const state = composable(...args);\n provideLocal(key, state);\n return state;\n };\n const useInjectedState = () => injectLocal(key, defaultValue);\n return [useProvidingState, useInjectedState];\n}\n\nfunction createRef(value, deep) {\n if (deep === true) {\n return ref(value);\n } else {\n return shallowRef(value);\n }\n}\n\nfunction createSharedComposable(composable) {\n let subscribers = 0;\n let state;\n let scope;\n const dispose = () => {\n subscribers -= 1;\n if (scope && subscribers <= 0) {\n scope.stop();\n state = void 0;\n scope = void 0;\n }\n };\n return (...args) => {\n subscribers += 1;\n if (!scope) {\n scope = effectScope(true);\n state = scope.run(() => composable(...args));\n }\n tryOnScopeDispose(dispose);\n return state;\n };\n}\n\nfunction extendRef(ref, extend, { enumerable = false, unwrap = true } = {}) {\n for (const [key, value] of Object.entries(extend)) {\n if (key === \"value\")\n continue;\n if (isRef(value) && unwrap) {\n Object.defineProperty(ref, key, {\n get() {\n return value.value;\n },\n set(v) {\n value.value = v;\n },\n enumerable\n });\n } else {\n Object.defineProperty(ref, key, { value, enumerable });\n }\n }\n return ref;\n}\n\nfunction get(obj, key) {\n if (key == null)\n return unref(obj);\n return unref(obj)[key];\n}\n\nfunction isDefined(v) {\n return unref(v) != null;\n}\n\nfunction makeDestructurable(obj, arr) {\n if (typeof Symbol !== \"undefined\") {\n const clone = { ...obj };\n Object.defineProperty(clone, Symbol.iterator, {\n enumerable: false,\n value() {\n let index = 0;\n return {\n next: () => ({\n value: arr[index++],\n done: index > arr.length\n })\n };\n }\n });\n return clone;\n } else {\n return Object.assign([...arr], obj);\n }\n}\n\nfunction reactify(fn, options) {\n const unrefFn = (options == null ? void 0 : options.computedGetter) === false ? unref : toValue$1;\n return function(...args) {\n return computed(() => fn.apply(this, args.map((i) => unrefFn(i))));\n };\n}\n\nfunction reactifyObject(obj, optionsOrKeys = {}) {\n let keys = [];\n let options;\n if (Array.isArray(optionsOrKeys)) {\n keys = optionsOrKeys;\n } else {\n options = optionsOrKeys;\n const { includeOwnProperties = true } = optionsOrKeys;\n keys.push(...Object.keys(obj));\n if (includeOwnProperties)\n keys.push(...Object.getOwnPropertyNames(obj));\n }\n return Object.fromEntries(\n keys.map((key) => {\n const value = obj[key];\n return [\n key,\n typeof value === \"function\" ? reactify(value.bind(obj), options) : value\n ];\n })\n );\n}\n\nfunction toReactive(objectRef) {\n if (!isRef(objectRef))\n return reactive(objectRef);\n const proxy = new Proxy({}, {\n get(_, p, receiver) {\n return unref(Reflect.get(objectRef.value, p, receiver));\n },\n set(_, p, value) {\n if (isRef(objectRef.value[p]) && !isRef(value))\n objectRef.value[p].value = value;\n else\n objectRef.value[p] = value;\n return true;\n },\n deleteProperty(_, p) {\n return Reflect.deleteProperty(objectRef.value, p);\n },\n has(_, p) {\n return Reflect.has(objectRef.value, p);\n },\n ownKeys() {\n return Object.keys(objectRef.value);\n },\n getOwnPropertyDescriptor() {\n return {\n enumerable: true,\n configurable: true\n };\n }\n });\n return reactive(proxy);\n}\n\nfunction reactiveComputed(fn) {\n return toReactive(computed(fn));\n}\n\nfunction reactiveOmit(obj, ...keys) {\n const flatKeys = keys.flat();\n const predicate = flatKeys[0];\n return reactiveComputed(() => typeof predicate === \"function\" ? Object.fromEntries(Object.entries(toRefs$1(obj)).filter(([k, v]) => !predicate(toValue$1(v), k))) : Object.fromEntries(Object.entries(toRefs$1(obj)).filter((e) => !flatKeys.includes(e[0]))));\n}\n\nconst isClient = typeof window !== \"undefined\" && typeof document !== \"undefined\";\nconst isWorker = typeof WorkerGlobalScope !== \"undefined\" && globalThis instanceof WorkerGlobalScope;\nconst isDef = (val) => typeof val !== \"undefined\";\nconst notNullish = (val) => val != null;\nconst assert = (condition, ...infos) => {\n if (!condition)\n console.warn(...infos);\n};\nconst toString = Object.prototype.toString;\nconst isObject = (val) => toString.call(val) === \"[object Object]\";\nconst now = () => Date.now();\nconst timestamp = () => +Date.now();\nconst clamp = (n, min, max) => Math.min(max, Math.max(min, n));\nconst noop = () => {\n};\nconst rand = (min, max) => {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n};\nconst hasOwn = (val, key) => Object.prototype.hasOwnProperty.call(val, key);\nconst isIOS = /* @__PURE__ */ getIsIOS();\nfunction getIsIOS() {\n var _a, _b;\n return isClient && ((_a = window == null ? void 0 : window.navigator) == null ? void 0 : _a.userAgent) && (/iP(?:ad|hone|od)/.test(window.navigator.userAgent) || ((_b = window == null ? void 0 : window.navigator) == null ? void 0 : _b.maxTouchPoints) > 2 && /iPad|Macintosh/.test(window == null ? void 0 : window.navigator.userAgent));\n}\n\nfunction createFilterWrapper(filter, fn) {\n function wrapper(...args) {\n return new Promise((resolve, reject) => {\n Promise.resolve(filter(() => fn.apply(this, args), { fn, thisArg: this, args })).then(resolve).catch(reject);\n });\n }\n return wrapper;\n}\nconst bypassFilter = (invoke) => {\n return invoke();\n};\nfunction debounceFilter(ms, options = {}) {\n let timer;\n let maxTimer;\n let lastRejector = noop;\n const _clearTimeout = (timer2) => {\n clearTimeout(timer2);\n lastRejector();\n lastRejector = noop;\n };\n let lastInvoker;\n const filter = (invoke) => {\n const duration = toValue$1(ms);\n const maxDuration = toValue$1(options.maxWait);\n if (timer)\n _clearTimeout(timer);\n if (duration <= 0 || maxDuration !== void 0 && maxDuration <= 0) {\n if (maxTimer) {\n _clearTimeout(maxTimer);\n maxTimer = null;\n }\n return Promise.resolve(invoke());\n }\n return new Promise((resolve, reject) => {\n lastRejector = options.rejectOnCancel ? reject : resolve;\n lastInvoker = invoke;\n if (maxDuration && !maxTimer) {\n maxTimer = setTimeout(() => {\n if (timer)\n _clearTimeout(timer);\n maxTimer = null;\n resolve(lastInvoker());\n }, maxDuration);\n }\n timer = setTimeout(() => {\n if (maxTimer)\n _clearTimeout(maxTimer);\n maxTimer = null;\n resolve(invoke());\n }, duration);\n });\n };\n return filter;\n}\nfunction throttleFilter(...args) {\n let lastExec = 0;\n let timer;\n let isLeading = true;\n let lastRejector = noop;\n let lastValue;\n let ms;\n let trailing;\n let leading;\n let rejectOnCancel;\n if (!isRef(args[0]) && typeof args[0] === \"object\")\n ({ delay: ms, trailing = true, leading = true, rejectOnCancel = false } = args[0]);\n else\n [ms, trailing = true, leading = true, rejectOnCancel = false] = args;\n const clear = () => {\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n lastRejector();\n lastRejector = noop;\n }\n };\n const filter = (_invoke) => {\n const duration = toValue$1(ms);\n const elapsed = Date.now() - lastExec;\n const invoke = () => {\n return lastValue = _invoke();\n };\n clear();\n if (duration <= 0) {\n lastExec = Date.now();\n return invoke();\n }\n if (elapsed > duration && (leading || !isLeading)) {\n lastExec = Date.now();\n invoke();\n } else if (trailing) {\n lastValue = new Promise((resolve, reject) => {\n lastRejector = rejectOnCancel ? reject : resolve;\n timer = setTimeout(() => {\n lastExec = Date.now();\n isLeading = true;\n resolve(invoke());\n clear();\n }, Math.max(0, duration - elapsed));\n });\n }\n if (!leading && !timer)\n timer = setTimeout(() => isLeading = true, duration);\n isLeading = false;\n return lastValue;\n };\n return filter;\n}\nfunction pausableFilter(extendFilter = bypassFilter, options = {}) {\n const {\n initialState = \"active\"\n } = options;\n const isActive = toRef(initialState === \"active\");\n function pause() {\n isActive.value = false;\n }\n function resume() {\n isActive.value = true;\n }\n const eventFilter = (...args) => {\n if (isActive.value)\n extendFilter(...args);\n };\n return { isActive: readonly(isActive), pause, resume, eventFilter };\n}\n\nfunction cacheStringFunction(fn) {\n const cache = /* @__PURE__ */ Object.create(null);\n return (str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n };\n}\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, \"-$1\").toLowerCase());\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction((str) => {\n return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n});\n\nfunction promiseTimeout(ms, throwOnTimeout = false, reason = \"Timeout\") {\n return new Promise((resolve, reject) => {\n if (throwOnTimeout)\n setTimeout(() => reject(reason), ms);\n else\n setTimeout(resolve, ms);\n });\n}\nfunction identity(arg) {\n return arg;\n}\nfunction createSingletonPromise(fn) {\n let _promise;\n function wrapper() {\n if (!_promise)\n _promise = fn();\n return _promise;\n }\n wrapper.reset = async () => {\n const _prev = _promise;\n _promise = void 0;\n if (_prev)\n await _prev;\n };\n return wrapper;\n}\nfunction invoke(fn) {\n return fn();\n}\nfunction containsProp(obj, ...props) {\n return props.some((k) => k in obj);\n}\nfunction increaseWithUnit(target, delta) {\n var _a;\n if (typeof target === \"number\")\n return target + delta;\n const value = ((_a = target.match(/^-?\\d+\\.?\\d*/)) == null ? void 0 : _a[0]) || \"\";\n const unit = target.slice(value.length);\n const result = Number.parseFloat(value) + delta;\n if (Number.isNaN(result))\n return target;\n return result + unit;\n}\nfunction pxValue(px) {\n return px.endsWith(\"rem\") ? Number.parseFloat(px) * 16 : Number.parseFloat(px);\n}\nfunction objectPick(obj, keys, omitUndefined = false) {\n return keys.reduce((n, k) => {\n if (k in obj) {\n if (!omitUndefined || obj[k] !== void 0)\n n[k] = obj[k];\n }\n return n;\n }, {});\n}\nfunction objectOmit(obj, keys, omitUndefined = false) {\n return Object.fromEntries(Object.entries(obj).filter(([key, value]) => {\n return (!omitUndefined || value !== void 0) && !keys.includes(key);\n }));\n}\nfunction objectEntries(obj) {\n return Object.entries(obj);\n}\nfunction getLifeCycleTarget(target) {\n return target || getCurrentInstance();\n}\nfunction toArray(value) {\n return Array.isArray(value) ? value : [value];\n}\n\nfunction toRef(...args) {\n if (args.length !== 1)\n return toRef$1(...args);\n const r = args[0];\n return typeof r === \"function\" ? readonly(customRef(() => ({ get: r, set: noop }))) : ref(r);\n}\nconst resolveRef = toRef;\n\nfunction reactivePick(obj, ...keys) {\n const flatKeys = keys.flat();\n const predicate = flatKeys[0];\n return reactiveComputed(() => typeof predicate === \"function\" ? Object.fromEntries(Object.entries(toRefs$1(obj)).filter(([k, v]) => predicate(toValue$1(v), k))) : Object.fromEntries(flatKeys.map((k) => [k, toRef(obj, k)])));\n}\n\nfunction refAutoReset(defaultValue, afterMs = 1e4) {\n return customRef((track, trigger) => {\n let value = toValue$1(defaultValue);\n let timer;\n const resetAfter = () => setTimeout(() => {\n value = toValue$1(defaultValue);\n trigger();\n }, toValue$1(afterMs));\n tryOnScopeDispose(() => {\n clearTimeout(timer);\n });\n return {\n get() {\n track();\n return value;\n },\n set(newValue) {\n value = newValue;\n trigger();\n clearTimeout(timer);\n timer = resetAfter();\n }\n };\n });\n}\n\nfunction useDebounceFn(fn, ms = 200, options = {}) {\n return createFilterWrapper(\n debounceFilter(ms, options),\n fn\n );\n}\n\nfunction refDebounced(value, ms = 200, options = {}) {\n const debounced = ref(value.value);\n const updater = useDebounceFn(() => {\n debounced.value = value.value;\n }, ms, options);\n watch(value, () => updater());\n return debounced;\n}\n\nfunction refDefault(source, defaultValue) {\n return computed({\n get() {\n var _a;\n return (_a = source.value) != null ? _a : defaultValue;\n },\n set(value) {\n source.value = value;\n }\n });\n}\n\nfunction useThrottleFn(fn, ms = 200, trailing = false, leading = true, rejectOnCancel = false) {\n return createFilterWrapper(\n throttleFilter(ms, trailing, leading, rejectOnCancel),\n fn\n );\n}\n\nfunction refThrottled(value, delay = 200, trailing = true, leading = true) {\n if (delay <= 0)\n return value;\n const throttled = ref(value.value);\n const updater = useThrottleFn(() => {\n throttled.value = value.value;\n }, delay, trailing, leading);\n watch(value, () => updater());\n return throttled;\n}\n\nfunction refWithControl(initial, options = {}) {\n let source = initial;\n let track;\n let trigger;\n const ref = customRef((_track, _trigger) => {\n track = _track;\n trigger = _trigger;\n return {\n get() {\n return get();\n },\n set(v) {\n set(v);\n }\n };\n });\n function get(tracking = true) {\n if (tracking)\n track();\n return source;\n }\n function set(value, triggering = true) {\n var _a, _b;\n if (value === source)\n return;\n const old = source;\n if (((_a = options.onBeforeChange) == null ? void 0 : _a.call(options, value, old)) === false)\n return;\n source = value;\n (_b = options.onChanged) == null ? void 0 : _b.call(options, value, old);\n if (triggering)\n trigger();\n }\n const untrackedGet = () => get(false);\n const silentSet = (v) => set(v, false);\n const peek = () => get(false);\n const lay = (v) => set(v, false);\n return extendRef(\n ref,\n {\n get,\n set,\n untrackedGet,\n silentSet,\n peek,\n lay\n },\n { enumerable: true }\n );\n}\nconst controlledRef = refWithControl;\n\nfunction set(...args) {\n if (args.length === 2) {\n const [ref, value] = args;\n ref.value = value;\n }\n if (args.length === 3) {\n const [target, key, value] = args;\n target[key] = value;\n }\n}\n\nfunction watchWithFilter(source, cb, options = {}) {\n const {\n eventFilter = bypassFilter,\n ...watchOptions\n } = options;\n return watch(\n source,\n createFilterWrapper(\n eventFilter,\n cb\n ),\n watchOptions\n );\n}\n\nfunction watchPausable(source, cb, options = {}) {\n const {\n eventFilter: filter,\n initialState = \"active\",\n ...watchOptions\n } = options;\n const { eventFilter, pause, resume, isActive } = pausableFilter(filter, { initialState });\n const stop = watchWithFilter(\n source,\n cb,\n {\n ...watchOptions,\n eventFilter\n }\n );\n return { stop, pause, resume, isActive };\n}\n\nfunction syncRef(left, right, ...[options]) {\n const {\n flush = \"sync\",\n deep = false,\n immediate = true,\n direction = \"both\",\n transform = {}\n } = options || {};\n const watchers = [];\n const transformLTR = \"ltr\" in transform && transform.ltr || ((v) => v);\n const transformRTL = \"rtl\" in transform && transform.rtl || ((v) => v);\n if (direction === \"both\" || direction === \"ltr\") {\n watchers.push(watchPausable(\n left,\n (newValue) => {\n watchers.forEach((w) => w.pause());\n right.value = transformLTR(newValue);\n watchers.forEach((w) => w.resume());\n },\n { flush, deep, immediate }\n ));\n }\n if (direction === \"both\" || direction === \"rtl\") {\n watchers.push(watchPausable(\n right,\n (newValue) => {\n watchers.forEach((w) => w.pause());\n left.value = transformRTL(newValue);\n watchers.forEach((w) => w.resume());\n },\n { flush, deep, immediate }\n ));\n }\n const stop = () => {\n watchers.forEach((w) => w.stop());\n };\n return stop;\n}\n\nfunction syncRefs(source, targets, options = {}) {\n const {\n flush = \"sync\",\n deep = false,\n immediate = true\n } = options;\n const targetsArray = toArray(targets);\n return watch(\n source,\n (newValue) => targetsArray.forEach((target) => target.value = newValue),\n { flush, deep, immediate }\n );\n}\n\nfunction toRefs(objectRef, options = {}) {\n if (!isRef(objectRef))\n return toRefs$1(objectRef);\n const result = Array.isArray(objectRef.value) ? Array.from({ length: objectRef.value.length }) : {};\n for (const key in objectRef.value) {\n result[key] = customRef(() => ({\n get() {\n return objectRef.value[key];\n },\n set(v) {\n var _a;\n const replaceRef = (_a = toValue$1(options.replaceRef)) != null ? _a : true;\n if (replaceRef) {\n if (Array.isArray(objectRef.value)) {\n const copy = [...objectRef.value];\n copy[key] = v;\n objectRef.value = copy;\n } else {\n const newObject = { ...objectRef.value, [key]: v };\n Object.setPrototypeOf(newObject, Object.getPrototypeOf(objectRef.value));\n objectRef.value = newObject;\n }\n } else {\n objectRef.value[key] = v;\n }\n }\n }));\n }\n return result;\n}\n\nconst toValue = toValue$1;\nconst resolveUnref = toValue$1;\n\nfunction tryOnBeforeMount(fn, sync = true, target) {\n const instance = getLifeCycleTarget(target);\n if (instance)\n onBeforeMount(fn, target);\n else if (sync)\n fn();\n else\n nextTick(fn);\n}\n\nfunction tryOnBeforeUnmount(fn, target) {\n const instance = getLifeCycleTarget(target);\n if (instance)\n onBeforeUnmount(fn, target);\n}\n\nfunction tryOnMounted(fn, sync = true, target) {\n const instance = getLifeCycleTarget();\n if (instance)\n onMounted(fn, target);\n else if (sync)\n fn();\n else\n nextTick(fn);\n}\n\nfunction tryOnUnmounted(fn, target) {\n const instance = getLifeCycleTarget(target);\n if (instance)\n onUnmounted(fn, target);\n}\n\nfunction createUntil(r, isNot = false) {\n function toMatch(condition, { flush = \"sync\", deep = false, timeout, throwOnTimeout } = {}) {\n let stop = null;\n const watcher = new Promise((resolve) => {\n stop = watch(\n r,\n (v) => {\n if (condition(v) !== isNot) {\n if (stop)\n stop();\n else\n nextTick(() => stop == null ? void 0 : stop());\n resolve(v);\n }\n },\n {\n flush,\n deep,\n immediate: true\n }\n );\n });\n const promises = [watcher];\n if (timeout != null) {\n promises.push(\n promiseTimeout(timeout, throwOnTimeout).then(() => toValue$1(r)).finally(() => stop == null ? void 0 : stop())\n );\n }\n return Promise.race(promises);\n }\n function toBe(value, options) {\n if (!isRef(value))\n return toMatch((v) => v === value, options);\n const { flush = \"sync\", deep = false, timeout, throwOnTimeout } = options != null ? options : {};\n let stop = null;\n const watcher = new Promise((resolve) => {\n stop = watch(\n [r, value],\n ([v1, v2]) => {\n if (isNot !== (v1 === v2)) {\n if (stop)\n stop();\n else\n nextTick(() => stop == null ? void 0 : stop());\n resolve(v1);\n }\n },\n {\n flush,\n deep,\n immediate: true\n }\n );\n });\n const promises = [watcher];\n if (timeout != null) {\n promises.push(\n promiseTimeout(timeout, throwOnTimeout).then(() => toValue$1(r)).finally(() => {\n stop == null ? void 0 : stop();\n return toValue$1(r);\n })\n );\n }\n return Promise.race(promises);\n }\n function toBeTruthy(options) {\n return toMatch((v) => Boolean(v), options);\n }\n function toBeNull(options) {\n return toBe(null, options);\n }\n function toBeUndefined(options) {\n return toBe(void 0, options);\n }\n function toBeNaN(options) {\n return toMatch(Number.isNaN, options);\n }\n function toContains(value, options) {\n return toMatch((v) => {\n const array = Array.from(v);\n return array.includes(value) || array.includes(toValue$1(value));\n }, options);\n }\n function changed(options) {\n return changedTimes(1, options);\n }\n function changedTimes(n = 1, options) {\n let count = -1;\n return toMatch(() => {\n count += 1;\n return count >= n;\n }, options);\n }\n if (Array.isArray(toValue$1(r))) {\n const instance = {\n toMatch,\n toContains,\n changed,\n changedTimes,\n get not() {\n return createUntil(r, !isNot);\n }\n };\n return instance;\n } else {\n const instance = {\n toMatch,\n toBe,\n toBeTruthy,\n toBeNull,\n toBeNaN,\n toBeUndefined,\n changed,\n changedTimes,\n get not() {\n return createUntil(r, !isNot);\n }\n };\n return instance;\n }\n}\nfunction until(r) {\n return createUntil(r);\n}\n\nfunction defaultComparator(value, othVal) {\n return value === othVal;\n}\nfunction useArrayDifference(...args) {\n var _a, _b;\n const list = args[0];\n const values = args[1];\n let compareFn = (_a = args[2]) != null ? _a : defaultComparator;\n const {\n symmetric = false\n } = (_b = args[3]) != null ? _b : {};\n if (typeof compareFn === \"string\") {\n const key = compareFn;\n compareFn = (value, othVal) => value[key] === othVal[key];\n }\n const diff1 = computed(() => toValue$1(list).filter((x) => toValue$1(values).findIndex((y) => compareFn(x, y)) === -1));\n if (symmetric) {\n const diff2 = computed(() => toValue$1(values).filter((x) => toValue$1(list).findIndex((y) => compareFn(x, y)) === -1));\n return computed(() => symmetric ? [...toValue$1(diff1), ...toValue$1(diff2)] : toValue$1(diff1));\n } else {\n return diff1;\n }\n}\n\nfunction useArrayEvery(list, fn) {\n return computed(() => toValue$1(list).every((element, index, array) => fn(toValue$1(element), index, array)));\n}\n\nfunction useArrayFilter(list, fn) {\n return computed(() => toValue$1(list).map((i) => toValue$1(i)).filter(fn));\n}\n\nfunction useArrayFind(list, fn) {\n return computed(() => toValue$1(\n toValue$1(list).find((element, index, array) => fn(toValue$1(element), index, array))\n ));\n}\n\nfunction useArrayFindIndex(list, fn) {\n return computed(() => toValue$1(list).findIndex((element, index, array) => fn(toValue$1(element), index, array)));\n}\n\nfunction findLast(arr, cb) {\n let index = arr.length;\n while (index-- > 0) {\n if (cb(arr[index], index, arr))\n return arr[index];\n }\n return void 0;\n}\nfunction useArrayFindLast(list, fn) {\n return computed(() => toValue$1(\n !Array.prototype.findLast ? findLast(toValue$1(list), (element, index, array) => fn(toValue$1(element), index, array)) : toValue$1(list).findLast((element, index, array) => fn(toValue$1(element), index, array))\n ));\n}\n\nfunction isArrayIncludesOptions(obj) {\n return isObject(obj) && containsProp(obj, \"formIndex\", \"comparator\");\n}\nfunction useArrayIncludes(...args) {\n var _a;\n const list = args[0];\n const value = args[1];\n let comparator = args[2];\n let formIndex = 0;\n if (isArrayIncludesOptions(comparator)) {\n formIndex = (_a = comparator.fromIndex) != null ? _a : 0;\n comparator = comparator.comparator;\n }\n if (typeof comparator === \"string\") {\n const key = comparator;\n comparator = (element, value2) => element[key] === toValue$1(value2);\n }\n comparator = comparator != null ? comparator : (element, value2) => element === toValue$1(value2);\n return computed(() => toValue$1(list).slice(formIndex).some((element, index, array) => comparator(\n toValue$1(element),\n toValue$1(value),\n index,\n toValue$1(array)\n )));\n}\n\nfunction useArrayJoin(list, separator) {\n return computed(() => toValue$1(list).map((i) => toValue$1(i)).join(toValue$1(separator)));\n}\n\nfunction useArrayMap(list, fn) {\n return computed(() => toValue$1(list).map((i) => toValue$1(i)).map(fn));\n}\n\nfunction useArrayReduce(list, reducer, ...args) {\n const reduceCallback = (sum, value, index) => reducer(toValue$1(sum), toValue$1(value), index);\n return computed(() => {\n const resolved = toValue$1(list);\n return args.length ? resolved.reduce(reduceCallback, typeof args[0] === \"function\" ? toValue$1(args[0]()) : toValue$1(args[0])) : resolved.reduce(reduceCallback);\n });\n}\n\nfunction useArraySome(list, fn) {\n return computed(() => toValue$1(list).some((element, index, array) => fn(toValue$1(element), index, array)));\n}\n\nfunction uniq(array) {\n return Array.from(new Set(array));\n}\nfunction uniqueElementsBy(array, fn) {\n return array.reduce((acc, v) => {\n if (!acc.some((x) => fn(v, x, array)))\n acc.push(v);\n return acc;\n }, []);\n}\nfunction useArrayUnique(list, compareFn) {\n return computed(() => {\n const resolvedList = toValue$1(list).map((element) => toValue$1(element));\n return compareFn ? uniqueElementsBy(resolvedList, compareFn) : uniq(resolvedList);\n });\n}\n\nfunction useCounter(initialValue = 0, options = {}) {\n let _initialValue = unref(initialValue);\n const count = shallowRef(initialValue);\n const {\n max = Number.POSITIVE_INFINITY,\n min = Number.NEGATIVE_INFINITY\n } = options;\n const inc = (delta = 1) => count.value = Math.max(Math.min(max, count.value + delta), min);\n const dec = (delta = 1) => count.value = Math.min(Math.max(min, count.value - delta), max);\n const get = () => count.value;\n const set = (val) => count.value = Math.max(min, Math.min(max, val));\n const reset = (val = _initialValue) => {\n _initialValue = val;\n return set(val);\n };\n return { count, inc, dec, get, set, reset };\n}\n\nconst REGEX_PARSE = /^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[T\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/i;\nconst REGEX_FORMAT = /[YMDHhms]o|\\[([^\\]]+)\\]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a{1,2}|A{1,2}|m{1,2}|s{1,2}|Z{1,2}|z{1,4}|SSS/g;\nfunction defaultMeridiem(hours, minutes, isLowercase, hasPeriod) {\n let m = hours < 12 ? \"AM\" : \"PM\";\n if (hasPeriod)\n m = m.split(\"\").reduce((acc, curr) => acc += `${curr}.`, \"\");\n return isLowercase ? m.toLowerCase() : m;\n}\nfunction formatOrdinal(num) {\n const suffixes = [\"th\", \"st\", \"nd\", \"rd\"];\n const v = num % 100;\n return num + (suffixes[(v - 20) % 10] || suffixes[v] || suffixes[0]);\n}\nfunction formatDate(date, formatStr, options = {}) {\n var _a;\n const years = date.getFullYear();\n const month = date.getMonth();\n const days = date.getDate();\n const hours = date.getHours();\n const minutes = date.getMinutes();\n const seconds = date.getSeconds();\n const milliseconds = date.getMilliseconds();\n const day = date.getDay();\n const meridiem = (_a = options.customMeridiem) != null ? _a : defaultMeridiem;\n const stripTimeZone = (dateString) => {\n var _a2;\n return (_a2 = dateString.split(\" \")[1]) != null ? _a2 : \"\";\n };\n const matches = {\n Yo: () => formatOrdinal(years),\n YY: () => String(years).slice(-2),\n YYYY: () => years,\n M: () => month + 1,\n Mo: () => formatOrdinal(month + 1),\n MM: () => `${month + 1}`.padStart(2, \"0\"),\n MMM: () => date.toLocaleDateString(toValue$1(options.locales), { month: \"short\" }),\n MMMM: () => date.toLocaleDateString(toValue$1(options.locales), { month: \"long\" }),\n D: () => String(days),\n Do: () => formatOrdinal(days),\n DD: () => `${days}`.padStart(2, \"0\"),\n H: () => String(hours),\n Ho: () => formatOrdinal(hours),\n HH: () => `${hours}`.padStart(2, \"0\"),\n h: () => `${hours % 12 || 12}`.padStart(1, \"0\"),\n ho: () => formatOrdinal(hours % 12 || 12),\n hh: () => `${hours % 12 || 12}`.padStart(2, \"0\"),\n m: () => String(minutes),\n mo: () => formatOrdinal(minutes),\n mm: () => `${minutes}`.padStart(2, \"0\"),\n s: () => String(seconds),\n so: () => formatOrdinal(seconds),\n ss: () => `${seconds}`.padStart(2, \"0\"),\n SSS: () => `${milliseconds}`.padStart(3, \"0\"),\n d: () => day,\n dd: () => date.toLocaleDateString(toValue$1(options.locales), { weekday: \"narrow\" }),\n ddd: () => date.toLocaleDateString(toValue$1(options.locales), { weekday: \"short\" }),\n dddd: () => date.toLocaleDateString(toValue$1(options.locales), { weekday: \"long\" }),\n A: () => meridiem(hours, minutes),\n AA: () => meridiem(hours, minutes, false, true),\n a: () => meridiem(hours, minutes, true),\n aa: () => meridiem(hours, minutes, true, true),\n z: () => stripTimeZone(date.toLocaleDateString(toValue$1(options.locales), { timeZoneName: \"shortOffset\" })),\n zz: () => stripTimeZone(date.toLocaleDateString(toValue$1(options.locales), { timeZoneName: \"shortOffset\" })),\n zzz: () => stripTimeZone(date.toLocaleDateString(toValue$1(options.locales), { timeZoneName: \"shortOffset\" })),\n zzzz: () => stripTimeZone(date.toLocaleDateString(toValue$1(options.locales), { timeZoneName: \"longOffset\" }))\n };\n return formatStr.replace(REGEX_FORMAT, (match, $1) => {\n var _a2, _b;\n return (_b = $1 != null ? $1 : (_a2 = matches[match]) == null ? void 0 : _a2.call(matches)) != null ? _b : match;\n });\n}\nfunction normalizeDate(date) {\n if (date === null)\n return new Date(Number.NaN);\n if (date === void 0)\n return /* @__PURE__ */ new Date();\n if (date instanceof Date)\n return new Date(date);\n if (typeof date === \"string\" && !/Z$/i.test(date)) {\n const d = date.match(REGEX_PARSE);\n if (d) {\n const m = d[2] - 1 || 0;\n const ms = (d[7] || \"0\").substring(0, 3);\n return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);\n }\n }\n return new Date(date);\n}\nfunction useDateFormat(date, formatStr = \"HH:mm:ss\", options = {}) {\n return computed(() => formatDate(normalizeDate(toValue$1(date)), toValue$1(formatStr), options));\n}\n\nfunction useIntervalFn(cb, interval = 1e3, options = {}) {\n const {\n immediate = true,\n immediateCallback = false\n } = options;\n let timer = null;\n const isActive = shallowRef(false);\n function clean() {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n }\n function pause() {\n isActive.value = false;\n clean();\n }\n function resume() {\n const intervalValue = toValue$1(interval);\n if (intervalValue <= 0)\n return;\n isActive.value = true;\n if (immediateCallback)\n cb();\n clean();\n if (isActive.value)\n timer = setInterval(cb, intervalValue);\n }\n if (immediate && isClient)\n resume();\n if (isRef(interval) || typeof interval === \"function\") {\n const stopWatch = watch(interval, () => {\n if (isActive.value && isClient)\n resume();\n });\n tryOnScopeDispose(stopWatch);\n }\n tryOnScopeDispose(pause);\n return {\n isActive,\n pause,\n resume\n };\n}\n\nfunction useInterval(interval = 1e3, options = {}) {\n const {\n controls: exposeControls = false,\n immediate = true,\n callback\n } = options;\n const counter = shallowRef(0);\n const update = () => counter.value += 1;\n const reset = () => {\n counter.value = 0;\n };\n const controls = useIntervalFn(\n callback ? () => {\n update();\n callback(counter.value);\n } : update,\n interval,\n { immediate }\n );\n if (exposeControls) {\n return {\n counter,\n reset,\n ...controls\n };\n } else {\n return counter;\n }\n}\n\nfunction useLastChanged(source, options = {}) {\n var _a;\n const ms = shallowRef((_a = options.initialValue) != null ? _a : null);\n watch(\n source,\n () => ms.value = timestamp(),\n options\n );\n return ms;\n}\n\nfunction useTimeoutFn(cb, interval, options = {}) {\n const {\n immediate = true,\n immediateCallback = false\n } = options;\n const isPending = shallowRef(false);\n let timer = null;\n function clear() {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n }\n function stop() {\n isPending.value = false;\n clear();\n }\n function start(...args) {\n if (immediateCallback)\n cb();\n clear();\n isPending.value = true;\n timer = setTimeout(() => {\n isPending.value = false;\n timer = null;\n cb(...args);\n }, toValue$1(interval));\n }\n if (immediate) {\n isPending.value = true;\n if (isClient)\n start();\n }\n tryOnScopeDispose(stop);\n return {\n isPending: readonly(isPending),\n start,\n stop\n };\n}\n\nfunction useTimeout(interval = 1e3, options = {}) {\n const {\n controls: exposeControls = false,\n callback\n } = options;\n const controls = useTimeoutFn(\n callback != null ? callback : noop,\n interval,\n options\n );\n const ready = computed(() => !controls.isPending.value);\n if (exposeControls) {\n return {\n ready,\n ...controls\n };\n } else {\n return ready;\n }\n}\n\nfunction useToNumber(value, options = {}) {\n const {\n method = \"parseFloat\",\n radix,\n nanToZero\n } = options;\n return computed(() => {\n let resolved = toValue$1(value);\n if (typeof method === \"function\")\n resolved = method(resolved);\n else if (typeof resolved === \"string\")\n resolved = Number[method](resolved, radix);\n if (nanToZero && Number.isNaN(resolved))\n resolved = 0;\n return resolved;\n });\n}\n\nfunction useToString(value) {\n return computed(() => `${toValue$1(value)}`);\n}\n\nfunction useToggle(initialValue = false, options = {}) {\n const {\n truthyValue = true,\n falsyValue = false\n } = options;\n const valueIsRef = isRef(initialValue);\n const _value = shallowRef(initialValue);\n function toggle(value) {\n if (arguments.length) {\n _value.value = value;\n return _value.value;\n } else {\n const truthy = toValue$1(truthyValue);\n _value.value = _value.value === truthy ? toValue$1(falsyValue) : truthy;\n return _value.value;\n }\n }\n if (valueIsRef)\n return toggle;\n else\n return [_value, toggle];\n}\n\nfunction watchArray(source, cb, options) {\n let oldList = (options == null ? void 0 : options.immediate) ? [] : [...typeof source === \"function\" ? source() : Array.isArray(source) ? source : toValue$1(source)];\n return watch(source, (newList, _, onCleanup) => {\n const oldListRemains = Array.from({ length: oldList.length });\n const added = [];\n for (const obj of newList) {\n let found = false;\n for (let i = 0; i < oldList.length; i++) {\n if (!oldListRemains[i] && obj === oldList[i]) {\n oldListRemains[i] = true;\n found = true;\n break;\n }\n }\n if (!found)\n added.push(obj);\n }\n const removed = oldList.filter((_2, i) => !oldListRemains[i]);\n cb(newList, oldList, added, removed, onCleanup);\n oldList = [...newList];\n }, options);\n}\n\nfunction watchAtMost(source, cb, options) {\n const {\n count,\n ...watchOptions\n } = options;\n const current = shallowRef(0);\n const stop = watchWithFilter(\n source,\n (...args) => {\n current.value += 1;\n if (current.value >= toValue$1(count))\n nextTick(() => stop());\n cb(...args);\n },\n watchOptions\n );\n return { count: current, stop };\n}\n\nfunction watchDebounced(source, cb, options = {}) {\n const {\n debounce = 0,\n maxWait = void 0,\n ...watchOptions\n } = options;\n return watchWithFilter(\n source,\n cb,\n {\n ...watchOptions,\n eventFilter: debounceFilter(debounce, { maxWait })\n }\n );\n}\n\nfunction watchDeep(source, cb, options) {\n return watch(\n source,\n cb,\n {\n ...options,\n deep: true\n }\n );\n}\n\nfunction watchIgnorable(source, cb, options = {}) {\n const {\n eventFilter = bypassFilter,\n ...watchOptions\n } = options;\n const filteredCb = createFilterWrapper(\n eventFilter,\n cb\n );\n let ignoreUpdates;\n let ignorePrevAsyncUpdates;\n let stop;\n if (watchOptions.flush === \"sync\") {\n const ignore = shallowRef(false);\n ignorePrevAsyncUpdates = () => {\n };\n ignoreUpdates = (updater) => {\n ignore.value = true;\n updater();\n ignore.value = false;\n };\n stop = watch(\n source,\n (...args) => {\n if (!ignore.value)\n filteredCb(...args);\n },\n watchOptions\n );\n } else {\n const disposables = [];\n const ignoreCounter = shallowRef(0);\n const syncCounter = shallowRef(0);\n ignorePrevAsyncUpdates = () => {\n ignoreCounter.value = syncCounter.value;\n };\n disposables.push(\n watch(\n source,\n () => {\n syncCounter.value++;\n },\n { ...watchOptions, flush: \"sync\" }\n )\n );\n ignoreUpdates = (updater) => {\n const syncCounterPrev = syncCounter.value;\n updater();\n ignoreCounter.value += syncCounter.value - syncCounterPrev;\n };\n disposables.push(\n watch(\n source,\n (...args) => {\n const ignore = ignoreCounter.value > 0 && ignoreCounter.value === syncCounter.value;\n ignoreCounter.value = 0;\n syncCounter.value = 0;\n if (ignore)\n return;\n filteredCb(...args);\n },\n watchOptions\n )\n );\n stop = () => {\n disposables.forEach((fn) => fn());\n };\n }\n return { stop, ignoreUpdates, ignorePrevAsyncUpdates };\n}\n\nfunction watchImmediate(source, cb, options) {\n return watch(\n source,\n cb,\n {\n ...options,\n immediate: true\n }\n );\n}\n\nfunction watchOnce(source, cb, options) {\n const stop = watch(source, (...args) => {\n nextTick(() => stop());\n return cb(...args);\n }, options);\n return stop;\n}\n\nfunction watchThrottled(source, cb, options = {}) {\n const {\n throttle = 0,\n trailing = true,\n leading = true,\n ...watchOptions\n } = options;\n return watchWithFilter(\n source,\n cb,\n {\n ...watchOptions,\n eventFilter: throttleFilter(throttle, trailing, leading)\n }\n );\n}\n\nfunction watchTriggerable(source, cb, options = {}) {\n let cleanupFn;\n function onEffect() {\n if (!cleanupFn)\n return;\n const fn = cleanupFn;\n cleanupFn = void 0;\n fn();\n }\n function onCleanup(callback) {\n cleanupFn = callback;\n }\n const _cb = (value, oldValue) => {\n onEffect();\n return cb(value, oldValue, onCleanup);\n };\n const res = watchIgnorable(source, _cb, options);\n const { ignoreUpdates } = res;\n const trigger = () => {\n let res2;\n ignoreUpdates(() => {\n res2 = _cb(getWatchSources(source), getOldValue(source));\n });\n return res2;\n };\n return {\n ...res,\n trigger\n };\n}\nfunction getWatchSources(sources) {\n if (isReactive(sources))\n return sources;\n if (Array.isArray(sources))\n return sources.map((item) => toValue$1(item));\n return toValue$1(sources);\n}\nfunction getOldValue(source) {\n return Array.isArray(source) ? source.map(() => void 0) : void 0;\n}\n\nfunction whenever(source, cb, options) {\n const stop = watch(\n source,\n (v, ov, onInvalidate) => {\n if (v) {\n if (options == null ? void 0 : options.once)\n nextTick(() => stop());\n cb(v, ov, onInvalidate);\n }\n },\n {\n ...options,\n once: false\n }\n );\n return stop;\n}\n\nexport { assert, refAutoReset as autoResetRef, bypassFilter, camelize, clamp, computedEager, computedWithControl, containsProp, computedWithControl as controlledComputed, controlledRef, createEventHook, createFilterWrapper, createGlobalState, createInjectionState, reactify as createReactiveFn, createRef, createSharedComposable, createSingletonPromise, debounceFilter, refDebounced as debouncedRef, watchDebounced as debouncedWatch, computedEager as eagerComputed, extendRef, formatDate, get, getLifeCycleTarget, hasOwn, hyphenate, identity, watchIgnorable as ignorableWatch, increaseWithUnit, injectLocal, invoke, isClient, isDef, isDefined, isIOS, isObject, isWorker, makeDestructurable, noop, normalizeDate, notNullish, now, objectEntries, objectOmit, objectPick, pausableFilter, watchPausable as pausableWatch, promiseTimeout, provideLocal, pxValue, rand, reactify, reactifyObject, reactiveComputed, reactiveOmit, reactivePick, refAutoReset, refDebounced, refDefault, refThrottled, refWithControl, resolveRef, resolveUnref, set, syncRef, syncRefs, throttleFilter, refThrottled as throttledRef, watchThrottled as throttledWatch, timestamp, toArray, toReactive, toRef, toRefs, toValue, tryOnBeforeMount, tryOnBeforeUnmount, tryOnMounted, tryOnScopeDispose, tryOnUnmounted, until, useArrayDifference, useArrayEvery, useArrayFilter, useArrayFind, useArrayFindIndex, useArrayFindLast, useArrayIncludes, useArrayJoin, useArrayMap, useArrayReduce, useArraySome, useArrayUnique, useCounter, useDateFormat, refDebounced as useDebounce, useDebounceFn, useInterval, useIntervalFn, useLastChanged, refThrottled as useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useToNumber, useToString, useToggle, watchArray, watchAtMost, watchDebounced, watchDeep, watchIgnorable, watchImmediate, watchOnce, watchPausable, watchThrottled, watchTriggerable, watchWithFilter, whenever };\n","import { noop, makeDestructurable, camelize, isClient, toArray, watchImmediate, isObject, tryOnScopeDispose, isIOS, notNullish, tryOnMounted, objectOmit, promiseTimeout, until, injectLocal, provideLocal, pxValue, increaseWithUnit, objectEntries, createRef, createSingletonPromise, useTimeoutFn, pausableWatch, toRef, createEventHook, useIntervalFn, computedWithControl, timestamp, pausableFilter, watchIgnorable, debounceFilter, bypassFilter, createFilterWrapper, toRefs, watchOnce, containsProp, hasOwn, throttleFilter, useDebounceFn, useThrottleFn, tryOnUnmounted, clamp, syncRef, objectPick, watchWithFilter, identity, isDef, whenever, isWorker } from '@vueuse/shared';\nexport * from '@vueuse/shared';\nimport { isRef, shallowRef, ref, watchEffect, computed, inject, defineComponent, h, TransitionGroup, shallowReactive, Fragment, toValue, unref, getCurrentInstance, onMounted, watch, customRef, onUpdated, readonly, reactive, hasInjectionContext, toRaw, nextTick, markRaw, getCurrentScope, isReadonly, onBeforeUpdate } from 'vue';\n\nfunction computedAsync(evaluationCallback, initialState, optionsOrRef) {\n let options;\n if (isRef(optionsOrRef)) {\n options = {\n evaluating: optionsOrRef\n };\n } else {\n options = optionsOrRef || {};\n }\n const {\n lazy = false,\n evaluating = void 0,\n shallow = true,\n onError = noop\n } = options;\n const started = shallowRef(!lazy);\n const current = shallow ? shallowRef(initialState) : ref(initialState);\n let counter = 0;\n watchEffect(async (onInvalidate) => {\n if (!started.value)\n return;\n counter++;\n const counterAtBeginning = counter;\n let hasFinished = false;\n if (evaluating) {\n Promise.resolve().then(() => {\n evaluating.value = true;\n });\n }\n try {\n const result = await evaluationCallback((cancelCallback) => {\n onInvalidate(() => {\n if (evaluating)\n evaluating.value = false;\n if (!hasFinished)\n cancelCallback();\n });\n });\n if (counterAtBeginning === counter)\n current.value = result;\n } catch (e) {\n onError(e);\n } finally {\n if (evaluating && counterAtBeginning === counter)\n evaluating.value = false;\n hasFinished = true;\n }\n });\n if (lazy) {\n return computed(() => {\n started.value = true;\n return current.value;\n });\n } else {\n return current;\n }\n}\n\nfunction computedInject(key, options, defaultSource, treatDefaultAsFactory) {\n let source = inject(key);\n if (defaultSource)\n source = inject(key, defaultSource);\n if (treatDefaultAsFactory)\n source = inject(key, defaultSource, treatDefaultAsFactory);\n if (typeof options === \"function\") {\n return computed((ctx) => options(source, ctx));\n } else {\n return computed({\n get: (ctx) => options.get(source, ctx),\n set: options.set\n });\n }\n}\n\nfunction createReusableTemplate(options = {}) {\n const {\n inheritAttrs = true\n } = options;\n const render = shallowRef();\n const define = /*@__PURE__*/ defineComponent({\n setup(_, { slots }) {\n return () => {\n render.value = slots.default;\n };\n }\n });\n const reuse = /*@__PURE__*/ defineComponent({\n inheritAttrs,\n props: options.props,\n setup(props, { attrs, slots }) {\n return () => {\n var _a;\n if (!render.value && process.env.NODE_ENV !== \"production\")\n throw new Error(\"[VueUse] Failed to find the definition of reusable template\");\n const vnode = (_a = render.value) == null ? void 0 : _a.call(render, {\n ...options.props == null ? keysToCamelKebabCase(attrs) : props,\n $slots: slots\n });\n return inheritAttrs && (vnode == null ? void 0 : vnode.length) === 1 ? vnode[0] : vnode;\n };\n }\n });\n return makeDestructurable(\n { define, reuse },\n [define, reuse]\n );\n}\nfunction keysToCamelKebabCase(obj) {\n const newObj = {};\n for (const key in obj)\n newObj[camelize(key)] = obj[key];\n return newObj;\n}\n\nfunction createTemplatePromise(options = {}) {\n let index = 0;\n const instances = ref([]);\n function create(...args) {\n const props = shallowReactive({\n key: index++,\n args,\n promise: void 0,\n resolve: () => {\n },\n reject: () => {\n },\n isResolving: false,\n options\n });\n instances.value.push(props);\n props.promise = new Promise((_resolve, _reject) => {\n props.resolve = (v) => {\n props.isResolving = true;\n return _resolve(v);\n };\n props.reject = _reject;\n }).finally(() => {\n props.promise = void 0;\n const index2 = instances.value.indexOf(props);\n if (index2 !== -1)\n instances.value.splice(index2, 1);\n });\n return props.promise;\n }\n function start(...args) {\n if (options.singleton && instances.value.length > 0)\n return instances.value[0].promise;\n return create(...args);\n }\n const component = /*@__PURE__*/ defineComponent((_, { slots }) => {\n const renderList = () => instances.value.map((props) => {\n var _a;\n return h(Fragment, { key: props.key }, (_a = slots.default) == null ? void 0 : _a.call(slots, props));\n });\n if (options.transition)\n return () => h(TransitionGroup, options.transition, renderList);\n return renderList;\n });\n component.start = start;\n return component;\n}\n\nfunction createUnrefFn(fn) {\n return function(...args) {\n return fn.apply(this, args.map((i) => toValue(i)));\n };\n}\n\nconst defaultWindow = isClient ? window : void 0;\nconst defaultDocument = isClient ? window.document : void 0;\nconst defaultNavigator = isClient ? window.navigator : void 0;\nconst defaultLocation = isClient ? window.location : void 0;\n\nfunction unrefElement(elRef) {\n var _a;\n const plain = toValue(elRef);\n return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;\n}\n\nfunction useEventListener(...args) {\n const cleanups = [];\n const cleanup = () => {\n cleanups.forEach((fn) => fn());\n cleanups.length = 0;\n };\n const register = (el, event, listener, options) => {\n el.addEventListener(event, listener, options);\n return () => el.removeEventListener(event, listener, options);\n };\n const firstParamTargets = computed(() => {\n const test = toArray(toValue(args[0])).filter((e) => e != null);\n return test.every((e) => typeof e !== \"string\") ? test : void 0;\n });\n const stopWatch = watchImmediate(\n () => {\n var _a, _b;\n return [\n (_b = (_a = firstParamTargets.value) == null ? void 0 : _a.map((e) => unrefElement(e))) != null ? _b : [defaultWindow].filter((e) => e != null),\n toArray(toValue(firstParamTargets.value ? args[1] : args[0])),\n toArray(unref(firstParamTargets.value ? args[2] : args[1])),\n // @ts-expect-error - TypeScript gets the correct types, but somehow still complains\n toValue(firstParamTargets.value ? args[3] : args[2])\n ];\n },\n ([raw_targets, raw_events, raw_listeners, raw_options]) => {\n cleanup();\n if (!(raw_targets == null ? void 0 : raw_targets.length) || !(raw_events == null ? void 0 : raw_events.length) || !(raw_listeners == null ? void 0 : raw_listeners.length))\n return;\n const optionsClone = isObject(raw_options) ? { ...raw_options } : raw_options;\n cleanups.push(\n ...raw_targets.flatMap(\n (el) => raw_events.flatMap(\n (event) => raw_listeners.map((listener) => register(el, event, listener, optionsClone))\n )\n )\n );\n },\n { flush: \"post\" }\n );\n const stop = () => {\n stopWatch();\n cleanup();\n };\n tryOnScopeDispose(cleanup);\n return stop;\n}\n\nlet _iOSWorkaround = false;\nfunction onClickOutside(target, handler, options = {}) {\n const { window = defaultWindow, ignore = [], capture = true, detectIframe = false, controls = false } = options;\n if (!window) {\n return controls ? { stop: noop, cancel: noop, trigger: noop } : noop;\n }\n if (isIOS && !_iOSWorkaround) {\n _iOSWorkaround = true;\n const listenerOptions = { passive: true };\n Array.from(window.document.body.children).forEach((el) => useEventListener(el, \"click\", noop, listenerOptions));\n useEventListener(window.document.documentElement, \"click\", noop, listenerOptions);\n }\n let shouldListen = true;\n const shouldIgnore = (event) => {\n return toValue(ignore).some((target2) => {\n if (typeof target2 === \"string\") {\n return Array.from(window.document.querySelectorAll(target2)).some((el) => el === event.target || event.composedPath().includes(el));\n } else {\n const el = unrefElement(target2);\n return el && (event.target === el || event.composedPath().includes(el));\n }\n });\n };\n function hasMultipleRoots(target2) {\n const vm = toValue(target2);\n return vm && vm.$.subTree.shapeFlag === 16;\n }\n function checkMultipleRoots(target2, event) {\n const vm = toValue(target2);\n const children = vm.$.subTree && vm.$.subTree.children;\n if (children == null || !Array.isArray(children))\n return false;\n return children.some((child) => child.el === event.target || event.composedPath().includes(child.el));\n }\n const listener = (event) => {\n const el = unrefElement(target);\n if (event.target == null)\n return;\n if (!(el instanceof Element) && hasMultipleRoots(target) && checkMultipleRoots(target, event))\n return;\n if (!el || el === event.target || event.composedPath().includes(el))\n return;\n if (\"detail\" in event && event.detail === 0)\n shouldListen = !shouldIgnore(event);\n if (!shouldListen) {\n shouldListen = true;\n return;\n }\n handler(event);\n };\n let isProcessingClick = false;\n const cleanup = [\n useEventListener(window, \"click\", (event) => {\n if (!isProcessingClick) {\n isProcessingClick = true;\n setTimeout(() => {\n isProcessingClick = false;\n }, 0);\n listener(event);\n }\n }, { passive: true, capture }),\n useEventListener(window, \"pointerdown\", (e) => {\n const el = unrefElement(target);\n shouldListen = !shouldIgnore(e) && !!(el && !e.composedPath().includes(el));\n }, { passive: true }),\n detectIframe && useEventListener(window, \"blur\", (event) => {\n setTimeout(() => {\n var _a;\n const el = unrefElement(target);\n if (((_a = window.document.activeElement) == null ? void 0 : _a.tagName) === \"IFRAME\" && !(el == null ? void 0 : el.contains(window.document.activeElement))) {\n handler(event);\n }\n }, 0);\n }, { passive: true })\n ].filter(Boolean);\n const stop = () => cleanup.forEach((fn) => fn());\n if (controls) {\n return {\n stop,\n cancel: () => {\n shouldListen = false;\n },\n trigger: (event) => {\n shouldListen = true;\n listener(event);\n shouldListen = false;\n }\n };\n }\n return stop;\n}\n\nfunction useMounted() {\n const isMounted = shallowRef(false);\n const instance = getCurrentInstance();\n if (instance) {\n onMounted(() => {\n isMounted.value = true;\n }, instance);\n }\n return isMounted;\n}\n\nfunction useSupported(callback) {\n const isMounted = useMounted();\n return computed(() => {\n isMounted.value;\n return Boolean(callback());\n });\n}\n\nfunction useMutationObserver(target, callback, options = {}) {\n const { window = defaultWindow, ...mutationOptions } = options;\n let observer;\n const isSupported = useSupported(() => window && \"MutationObserver\" in window);\n const cleanup = () => {\n if (observer) {\n observer.disconnect();\n observer = void 0;\n }\n };\n const targets = computed(() => {\n const value = toValue(target);\n const items = toArray(value).map(unrefElement).filter(notNullish);\n return new Set(items);\n });\n const stopWatch = watch(\n () => targets.value,\n (targets2) => {\n cleanup();\n if (isSupported.value && targets2.size) {\n observer = new MutationObserver(callback);\n targets2.forEach((el) => observer.observe(el, mutationOptions));\n }\n },\n { immediate: true, flush: \"post\" }\n );\n const takeRecords = () => {\n return observer == null ? void 0 : observer.takeRecords();\n };\n const stop = () => {\n stopWatch();\n cleanup();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop,\n takeRecords\n };\n}\n\nfunction onElementRemoval(target, callback, options = {}) {\n const {\n window = defaultWindow,\n document = window == null ? void 0 : window.document,\n flush = \"sync\"\n } = options;\n if (!window || !document)\n return noop;\n let stopFn;\n const cleanupAndUpdate = (fn) => {\n stopFn == null ? void 0 : stopFn();\n stopFn = fn;\n };\n const stopWatch = watchEffect(() => {\n const el = unrefElement(target);\n if (el) {\n const { stop } = useMutationObserver(\n document,\n (mutationsList) => {\n const targetRemoved = mutationsList.map((mutation) => [...mutation.removedNodes]).flat().some((node) => node === el || node.contains(el));\n if (targetRemoved) {\n callback(mutationsList);\n }\n },\n {\n window,\n childList: true,\n subtree: true\n }\n );\n cleanupAndUpdate(stop);\n }\n }, { flush });\n const stopHandle = () => {\n stopWatch();\n cleanupAndUpdate();\n };\n tryOnScopeDispose(stopHandle);\n return stopHandle;\n}\n\nfunction createKeyPredicate(keyFilter) {\n if (typeof keyFilter === \"function\")\n return keyFilter;\n else if (typeof keyFilter === \"string\")\n return (event) => event.key === keyFilter;\n else if (Array.isArray(keyFilter))\n return (event) => keyFilter.includes(event.key);\n return () => true;\n}\nfunction onKeyStroke(...args) {\n let key;\n let handler;\n let options = {};\n if (args.length === 3) {\n key = args[0];\n handler = args[1];\n options = args[2];\n } else if (args.length === 2) {\n if (typeof args[1] === \"object\") {\n key = true;\n handler = args[0];\n options = args[1];\n } else {\n key = args[0];\n handler = args[1];\n }\n } else {\n key = true;\n handler = args[0];\n }\n const {\n target = defaultWindow,\n eventName = \"keydown\",\n passive = false,\n dedupe = false\n } = options;\n const predicate = createKeyPredicate(key);\n const listener = (e) => {\n if (e.repeat && toValue(dedupe))\n return;\n if (predicate(e))\n handler(e);\n };\n return useEventListener(target, eventName, listener, passive);\n}\nfunction onKeyDown(key, handler, options = {}) {\n return onKeyStroke(key, handler, { ...options, eventName: \"keydown\" });\n}\nfunction onKeyPressed(key, handler, options = {}) {\n return onKeyStroke(key, handler, { ...options, eventName: \"keypress\" });\n}\nfunction onKeyUp(key, handler, options = {}) {\n return onKeyStroke(key, handler, { ...options, eventName: \"keyup\" });\n}\n\nconst DEFAULT_DELAY = 500;\nconst DEFAULT_THRESHOLD = 10;\nfunction onLongPress(target, handler, options) {\n var _a, _b;\n const elementRef = computed(() => unrefElement(target));\n let timeout;\n let posStart;\n let startTimestamp;\n let hasLongPressed = false;\n function clear() {\n if (timeout) {\n clearTimeout(timeout);\n timeout = void 0;\n }\n posStart = void 0;\n startTimestamp = void 0;\n hasLongPressed = false;\n }\n function onRelease(ev) {\n var _a2, _b2, _c;\n const [_startTimestamp, _posStart, _hasLongPressed] = [startTimestamp, posStart, hasLongPressed];\n clear();\n if (!(options == null ? void 0 : options.onMouseUp) || !_posStart || !_startTimestamp)\n return;\n if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n return;\n if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n ev.preventDefault();\n if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n ev.stopPropagation();\n const dx = ev.x - _posStart.x;\n const dy = ev.y - _posStart.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n options.onMouseUp(ev.timeStamp - _startTimestamp, distance, _hasLongPressed);\n }\n function onDown(ev) {\n var _a2, _b2, _c, _d;\n if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n return;\n clear();\n if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n ev.preventDefault();\n if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n ev.stopPropagation();\n posStart = {\n x: ev.x,\n y: ev.y\n };\n startTimestamp = ev.timeStamp;\n timeout = setTimeout(\n () => {\n hasLongPressed = true;\n handler(ev);\n },\n (_d = options == null ? void 0 : options.delay) != null ? _d : DEFAULT_DELAY\n );\n }\n function onMove(ev) {\n var _a2, _b2, _c, _d;\n if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n return;\n if (!posStart || (options == null ? void 0 : options.distanceThreshold) === false)\n return;\n if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n ev.preventDefault();\n if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n ev.stopPropagation();\n const dx = ev.x - posStart.x;\n const dy = ev.y - posStart.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n if (distance >= ((_d = options == null ? void 0 : options.distanceThreshold) != null ? _d : DEFAULT_THRESHOLD))\n clear();\n }\n const listenerOptions = {\n capture: (_a = options == null ? void 0 : options.modifiers) == null ? void 0 : _a.capture,\n once: (_b = options == null ? void 0 : options.modifiers) == null ? void 0 : _b.once\n };\n const cleanup = [\n useEventListener(elementRef, \"pointerdown\", onDown, listenerOptions),\n useEventListener(elementRef, \"pointermove\", onMove, listenerOptions),\n useEventListener(elementRef, [\"pointerup\", \"pointerleave\"], onRelease, listenerOptions)\n ];\n const stop = () => cleanup.forEach((fn) => fn());\n return stop;\n}\n\nfunction isFocusedElementEditable() {\n const { activeElement, body } = document;\n if (!activeElement)\n return false;\n if (activeElement === body)\n return false;\n switch (activeElement.tagName) {\n case \"INPUT\":\n case \"TEXTAREA\":\n return true;\n }\n return activeElement.hasAttribute(\"contenteditable\");\n}\nfunction isTypedCharValid({\n keyCode,\n metaKey,\n ctrlKey,\n altKey\n}) {\n if (metaKey || ctrlKey || altKey)\n return false;\n if (keyCode >= 48 && keyCode <= 57 || keyCode >= 96 && keyCode <= 105)\n return true;\n if (keyCode >= 65 && keyCode <= 90)\n return true;\n return false;\n}\nfunction onStartTyping(callback, options = {}) {\n const { document: document2 = defaultDocument } = options;\n const keydown = (event) => {\n if (!isFocusedElementEditable() && isTypedCharValid(event)) {\n callback(event);\n }\n };\n if (document2)\n useEventListener(document2, \"keydown\", keydown, { passive: true });\n}\n\nfunction templateRef(key, initialValue = null) {\n const instance = getCurrentInstance();\n let _trigger = () => {\n };\n const element = customRef((track, trigger) => {\n _trigger = trigger;\n return {\n get() {\n var _a, _b;\n track();\n return (_b = (_a = instance == null ? void 0 : instance.proxy) == null ? void 0 : _a.$refs[key]) != null ? _b : initialValue;\n },\n set() {\n }\n };\n });\n tryOnMounted(_trigger);\n onUpdated(_trigger);\n return element;\n}\n\nfunction useActiveElement(options = {}) {\n var _a;\n const {\n window = defaultWindow,\n deep = true,\n triggerOnRemoval = false\n } = options;\n const document = (_a = options.document) != null ? _a : window == null ? void 0 : window.document;\n const getDeepActiveElement = () => {\n var _a2;\n let element = document == null ? void 0 : document.activeElement;\n if (deep) {\n while (element == null ? void 0 : element.shadowRoot)\n element = (_a2 = element == null ? void 0 : element.shadowRoot) == null ? void 0 : _a2.activeElement;\n }\n return element;\n };\n const activeElement = shallowRef();\n const trigger = () => {\n activeElement.value = getDeepActiveElement();\n };\n if (window) {\n const listenerOptions = {\n capture: true,\n passive: true\n };\n useEventListener(\n window,\n \"blur\",\n (event) => {\n if (event.relatedTarget !== null)\n return;\n trigger();\n },\n listenerOptions\n );\n useEventListener(\n window,\n \"focus\",\n trigger,\n listenerOptions\n );\n }\n if (triggerOnRemoval) {\n onElementRemoval(activeElement, trigger, { document });\n }\n trigger();\n return activeElement;\n}\n\nfunction useRafFn(fn, options = {}) {\n const {\n immediate = true,\n fpsLimit = void 0,\n window = defaultWindow,\n once = false\n } = options;\n const isActive = shallowRef(false);\n const intervalLimit = computed(() => {\n return fpsLimit ? 1e3 / toValue(fpsLimit) : null;\n });\n let previousFrameTimestamp = 0;\n let rafId = null;\n function loop(timestamp) {\n if (!isActive.value || !window)\n return;\n if (!previousFrameTimestamp)\n previousFrameTimestamp = timestamp;\n const delta = timestamp - previousFrameTimestamp;\n if (intervalLimit.value && delta < intervalLimit.value) {\n rafId = window.requestAnimationFrame(loop);\n return;\n }\n previousFrameTimestamp = timestamp;\n fn({ delta, timestamp });\n if (once) {\n isActive.value = false;\n rafId = null;\n return;\n }\n rafId = window.requestAnimationFrame(loop);\n }\n function resume() {\n if (!isActive.value && window) {\n isActive.value = true;\n previousFrameTimestamp = 0;\n rafId = window.requestAnimationFrame(loop);\n }\n }\n function pause() {\n isActive.value = false;\n if (rafId != null && window) {\n window.cancelAnimationFrame(rafId);\n rafId = null;\n }\n }\n if (immediate)\n resume();\n tryOnScopeDispose(pause);\n return {\n isActive: readonly(isActive),\n pause,\n resume\n };\n}\n\nfunction useAnimate(target, keyframes, options) {\n let config;\n let animateOptions;\n if (isObject(options)) {\n config = options;\n animateOptions = objectOmit(options, [\"window\", \"immediate\", \"commitStyles\", \"persist\", \"onReady\", \"onError\"]);\n } else {\n config = { duration: options };\n animateOptions = options;\n }\n const {\n window = defaultWindow,\n immediate = true,\n commitStyles,\n persist,\n playbackRate: _playbackRate = 1,\n onReady,\n onError = (e) => {\n console.error(e);\n }\n } = config;\n const isSupported = useSupported(() => window && HTMLElement && \"animate\" in HTMLElement.prototype);\n const animate = shallowRef(void 0);\n const store = shallowReactive({\n startTime: null,\n currentTime: null,\n timeline: null,\n playbackRate: _playbackRate,\n pending: false,\n playState: immediate ? \"idle\" : \"paused\",\n replaceState: \"active\"\n });\n const pending = computed(() => store.pending);\n const playState = computed(() => store.playState);\n const replaceState = computed(() => store.replaceState);\n const startTime = computed({\n get() {\n return store.startTime;\n },\n set(value) {\n store.startTime = value;\n if (animate.value)\n animate.value.startTime = value;\n }\n });\n const currentTime = computed({\n get() {\n return store.currentTime;\n },\n set(value) {\n store.currentTime = value;\n if (animate.value) {\n animate.value.currentTime = value;\n syncResume();\n }\n }\n });\n const timeline = computed({\n get() {\n return store.timeline;\n },\n set(value) {\n store.timeline = value;\n if (animate.value)\n animate.value.timeline = value;\n }\n });\n const playbackRate = computed({\n get() {\n return store.playbackRate;\n },\n set(value) {\n store.playbackRate = value;\n if (animate.value)\n animate.value.playbackRate = value;\n }\n });\n const play = () => {\n if (animate.value) {\n try {\n animate.value.play();\n syncResume();\n } catch (e) {\n syncPause();\n onError(e);\n }\n } else {\n update();\n }\n };\n const pause = () => {\n var _a;\n try {\n (_a = animate.value) == null ? void 0 : _a.pause();\n syncPause();\n } catch (e) {\n onError(e);\n }\n };\n const reverse = () => {\n var _a;\n if (!animate.value)\n update();\n try {\n (_a = animate.value) == null ? void 0 : _a.reverse();\n syncResume();\n } catch (e) {\n syncPause();\n onError(e);\n }\n };\n const finish = () => {\n var _a;\n try {\n (_a = animate.value) == null ? void 0 : _a.finish();\n syncPause();\n } catch (e) {\n onError(e);\n }\n };\n const cancel = () => {\n var _a;\n try {\n (_a = animate.value) == null ? void 0 : _a.cancel();\n syncPause();\n } catch (e) {\n onError(e);\n }\n };\n watch(() => unrefElement(target), (el) => {\n if (el) {\n update();\n } else {\n animate.value = void 0;\n }\n });\n watch(() => keyframes, (value) => {\n if (animate.value) {\n update();\n const targetEl = unrefElement(target);\n if (targetEl) {\n animate.value.effect = new KeyframeEffect(\n targetEl,\n toValue(value),\n animateOptions\n );\n }\n }\n }, { deep: true });\n tryOnMounted(() => update(true), false);\n tryOnScopeDispose(cancel);\n function update(init) {\n const el = unrefElement(target);\n if (!isSupported.value || !el)\n return;\n if (!animate.value)\n animate.value = el.animate(toValue(keyframes), animateOptions);\n if (persist)\n animate.value.persist();\n if (_playbackRate !== 1)\n animate.value.playbackRate = _playbackRate;\n if (init && !immediate)\n animate.value.pause();\n else\n syncResume();\n onReady == null ? void 0 : onReady(animate.value);\n }\n const listenerOptions = { passive: true };\n useEventListener(animate, [\"cancel\", \"finish\", \"remove\"], syncPause, listenerOptions);\n useEventListener(animate, \"finish\", () => {\n var _a;\n if (commitStyles)\n (_a = animate.value) == null ? void 0 : _a.commitStyles();\n }, listenerOptions);\n const { resume: resumeRef, pause: pauseRef } = useRafFn(() => {\n if (!animate.value)\n return;\n store.pending = animate.value.pending;\n store.playState = animate.value.playState;\n store.replaceState = animate.value.replaceState;\n store.startTime = animate.value.startTime;\n store.currentTime = animate.value.currentTime;\n store.timeline = animate.value.timeline;\n store.playbackRate = animate.value.playbackRate;\n }, { immediate: false });\n function syncResume() {\n if (isSupported.value)\n resumeRef();\n }\n function syncPause() {\n if (isSupported.value && window)\n window.requestAnimationFrame(pauseRef);\n }\n return {\n isSupported,\n animate,\n // actions\n play,\n pause,\n reverse,\n finish,\n cancel,\n // state\n pending,\n playState,\n replaceState,\n startTime,\n currentTime,\n timeline,\n playbackRate\n };\n}\n\nfunction useAsyncQueue(tasks, options) {\n const {\n interrupt = true,\n onError = noop,\n onFinished = noop,\n signal\n } = options || {};\n const promiseState = {\n aborted: \"aborted\",\n fulfilled: \"fulfilled\",\n pending: \"pending\",\n rejected: \"rejected\"\n };\n const initialResult = Array.from(Array.from({ length: tasks.length }), () => ({ state: promiseState.pending, data: null }));\n const result = reactive(initialResult);\n const activeIndex = shallowRef(-1);\n if (!tasks || tasks.length === 0) {\n onFinished();\n return {\n activeIndex,\n result\n };\n }\n function updateResult(state, res) {\n activeIndex.value++;\n result[activeIndex.value].data = res;\n result[activeIndex.value].state = state;\n }\n tasks.reduce((prev, curr) => {\n return prev.then((prevRes) => {\n var _a;\n if (signal == null ? void 0 : signal.aborted) {\n updateResult(promiseState.aborted, new Error(\"aborted\"));\n return;\n }\n if (((_a = result[activeIndex.value]) == null ? void 0 : _a.state) === promiseState.rejected && interrupt) {\n onFinished();\n return;\n }\n const done = curr(prevRes).then((currentRes) => {\n updateResult(promiseState.fulfilled, currentRes);\n if (activeIndex.value === tasks.length - 1)\n onFinished();\n return currentRes;\n });\n if (!signal)\n return done;\n return Promise.race([done, whenAborted(signal)]);\n }).catch((e) => {\n if (signal == null ? void 0 : signal.aborted) {\n updateResult(promiseState.aborted, e);\n return e;\n }\n updateResult(promiseState.rejected, e);\n onError();\n return e;\n });\n }, Promise.resolve());\n return {\n activeIndex,\n result\n };\n}\nfunction whenAborted(signal) {\n return new Promise((resolve, reject) => {\n const error = new Error(\"aborted\");\n if (signal.aborted)\n reject(error);\n else\n signal.addEventListener(\"abort\", () => reject(error), { once: true });\n });\n}\n\nfunction useAsyncState(promise, initialState, options) {\n const {\n immediate = true,\n delay = 0,\n onError = noop,\n onSuccess = noop,\n resetOnExecute = true,\n shallow = true,\n throwError\n } = options != null ? options : {};\n const state = shallow ? shallowRef(initialState) : ref(initialState);\n const isReady = shallowRef(false);\n const isLoading = shallowRef(false);\n const error = shallowRef(void 0);\n async function execute(delay2 = 0, ...args) {\n if (resetOnExecute)\n state.value = initialState;\n error.value = void 0;\n isReady.value = false;\n isLoading.value = true;\n if (delay2 > 0)\n await promiseTimeout(delay2);\n const _promise = typeof promise === \"function\" ? promise(...args) : promise;\n try {\n const data = await _promise;\n state.value = data;\n isReady.value = true;\n onSuccess(data);\n } catch (e) {\n error.value = e;\n onError(e);\n if (throwError)\n throw e;\n } finally {\n isLoading.value = false;\n }\n return state.value;\n }\n if (immediate) {\n execute(delay);\n }\n const shell = {\n state,\n isReady,\n isLoading,\n error,\n execute\n };\n function waitUntilIsLoaded() {\n return new Promise((resolve, reject) => {\n until(isLoading).toBe(false).then(() => resolve(shell)).catch(reject);\n });\n }\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilIsLoaded().then(onFulfilled, onRejected);\n }\n };\n}\n\nconst defaults = {\n array: (v) => JSON.stringify(v),\n object: (v) => JSON.stringify(v),\n set: (v) => JSON.stringify(Array.from(v)),\n map: (v) => JSON.stringify(Object.fromEntries(v)),\n null: () => \"\"\n};\nfunction getDefaultSerialization(target) {\n if (!target)\n return defaults.null;\n if (target instanceof Map)\n return defaults.map;\n else if (target instanceof Set)\n return defaults.set;\n else if (Array.isArray(target))\n return defaults.array;\n else\n return defaults.object;\n}\n\nfunction useBase64(target, options) {\n const base64 = shallowRef(\"\");\n const promise = shallowRef();\n function execute() {\n if (!isClient)\n return;\n promise.value = new Promise((resolve, reject) => {\n try {\n const _target = toValue(target);\n if (_target == null) {\n resolve(\"\");\n } else if (typeof _target === \"string\") {\n resolve(blobToBase64(new Blob([_target], { type: \"text/plain\" })));\n } else if (_target instanceof Blob) {\n resolve(blobToBase64(_target));\n } else if (_target instanceof ArrayBuffer) {\n resolve(window.btoa(String.fromCharCode(...new Uint8Array(_target))));\n } else if (_target instanceof HTMLCanvasElement) {\n resolve(_target.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));\n } else if (_target instanceof HTMLImageElement) {\n const img = _target.cloneNode(false);\n img.crossOrigin = \"Anonymous\";\n imgLoaded(img).then(() => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n resolve(canvas.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));\n }).catch(reject);\n } else if (typeof _target === \"object\") {\n const _serializeFn = (options == null ? void 0 : options.serializer) || getDefaultSerialization(_target);\n const serialized = _serializeFn(_target);\n return resolve(blobToBase64(new Blob([serialized], { type: \"application/json\" })));\n } else {\n reject(new Error(\"target is unsupported types\"));\n }\n } catch (error) {\n reject(error);\n }\n });\n promise.value.then((res) => {\n base64.value = (options == null ? void 0 : options.dataUrl) === false ? res.replace(/^data:.*?;base64,/, \"\") : res;\n });\n return promise.value;\n }\n if (isRef(target) || typeof target === \"function\")\n watch(target, execute, { immediate: true });\n else\n execute();\n return {\n base64,\n promise,\n execute\n };\n}\nfunction imgLoaded(img) {\n return new Promise((resolve, reject) => {\n if (!img.complete) {\n img.onload = () => {\n resolve();\n };\n img.onerror = reject;\n } else {\n resolve();\n }\n });\n}\nfunction blobToBase64(blob) {\n return new Promise((resolve, reject) => {\n const fr = new FileReader();\n fr.onload = (e) => {\n resolve(e.target.result);\n };\n fr.onerror = reject;\n fr.readAsDataURL(blob);\n });\n}\n\nfunction useBattery(options = {}) {\n const { navigator = defaultNavigator } = options;\n const events = [\"chargingchange\", \"chargingtimechange\", \"dischargingtimechange\", \"levelchange\"];\n const isSupported = useSupported(() => navigator && \"getBattery\" in navigator && typeof navigator.getBattery === \"function\");\n const charging = shallowRef(false);\n const chargingTime = shallowRef(0);\n const dischargingTime = shallowRef(0);\n const level = shallowRef(1);\n let battery;\n function updateBatteryInfo() {\n charging.value = this.charging;\n chargingTime.value = this.chargingTime || 0;\n dischargingTime.value = this.dischargingTime || 0;\n level.value = this.level;\n }\n if (isSupported.value) {\n navigator.getBattery().then((_battery) => {\n battery = _battery;\n updateBatteryInfo.call(battery);\n useEventListener(battery, events, updateBatteryInfo, { passive: true });\n });\n }\n return {\n isSupported,\n charging,\n chargingTime,\n dischargingTime,\n level\n };\n}\n\nfunction useBluetooth(options) {\n let {\n acceptAllDevices = false\n } = options || {};\n const {\n filters = void 0,\n optionalServices = void 0,\n navigator = defaultNavigator\n } = options || {};\n const isSupported = useSupported(() => navigator && \"bluetooth\" in navigator);\n const device = shallowRef();\n const error = shallowRef(null);\n watch(device, () => {\n connectToBluetoothGATTServer();\n });\n async function requestDevice() {\n if (!isSupported.value)\n return;\n error.value = null;\n if (filters && filters.length > 0)\n acceptAllDevices = false;\n try {\n device.value = await (navigator == null ? void 0 : navigator.bluetooth.requestDevice({\n acceptAllDevices,\n filters,\n optionalServices\n }));\n } catch (err) {\n error.value = err;\n }\n }\n const server = shallowRef();\n const isConnected = shallowRef(false);\n function reset() {\n isConnected.value = false;\n device.value = void 0;\n server.value = void 0;\n }\n async function connectToBluetoothGATTServer() {\n error.value = null;\n if (device.value && device.value.gatt) {\n useEventListener(device, \"gattserverdisconnected\", reset, { passive: true });\n try {\n server.value = await device.value.gatt.connect();\n isConnected.value = server.value.connected;\n } catch (err) {\n error.value = err;\n }\n }\n }\n tryOnMounted(() => {\n var _a;\n if (device.value)\n (_a = device.value.gatt) == null ? void 0 : _a.connect();\n });\n tryOnScopeDispose(() => {\n var _a;\n if (device.value)\n (_a = device.value.gatt) == null ? void 0 : _a.disconnect();\n });\n return {\n isSupported,\n isConnected: readonly(isConnected),\n // Device:\n device,\n requestDevice,\n // Server:\n server,\n // Errors:\n error\n };\n}\n\nconst ssrWidthSymbol = Symbol(\"vueuse-ssr-width\");\nfunction useSSRWidth() {\n const ssrWidth = hasInjectionContext() ? injectLocal(ssrWidthSymbol, null) : null;\n return typeof ssrWidth === \"number\" ? ssrWidth : void 0;\n}\nfunction provideSSRWidth(width, app) {\n if (app !== void 0) {\n app.provide(ssrWidthSymbol, width);\n } else {\n provideLocal(ssrWidthSymbol, width);\n }\n}\n\nfunction useMediaQuery(query, options = {}) {\n const { window = defaultWindow, ssrWidth = useSSRWidth() } = options;\n const isSupported = useSupported(() => window && \"matchMedia\" in window && typeof window.matchMedia === \"function\");\n const ssrSupport = shallowRef(typeof ssrWidth === \"number\");\n const mediaQuery = shallowRef();\n const matches = shallowRef(false);\n const handler = (event) => {\n matches.value = event.matches;\n };\n watchEffect(() => {\n if (ssrSupport.value) {\n ssrSupport.value = !isSupported.value;\n const queryStrings = toValue(query).split(\",\");\n matches.value = queryStrings.some((queryString) => {\n const not = queryString.includes(\"not all\");\n const minWidth = queryString.match(/\\(\\s*min-width:\\s*(-?\\d+(?:\\.\\d*)?[a-z]+\\s*)\\)/);\n const maxWidth = queryString.match(/\\(\\s*max-width:\\s*(-?\\d+(?:\\.\\d*)?[a-z]+\\s*)\\)/);\n let res = Boolean(minWidth || maxWidth);\n if (minWidth && res) {\n res = ssrWidth >= pxValue(minWidth[1]);\n }\n if (maxWidth && res) {\n res = ssrWidth <= pxValue(maxWidth[1]);\n }\n return not ? !res : res;\n });\n return;\n }\n if (!isSupported.value)\n return;\n mediaQuery.value = window.matchMedia(toValue(query));\n matches.value = mediaQuery.value.matches;\n });\n useEventListener(mediaQuery, \"change\", handler, { passive: true });\n return computed(() => matches.value);\n}\n\nconst breakpointsTailwind = {\n \"sm\": 640,\n \"md\": 768,\n \"lg\": 1024,\n \"xl\": 1280,\n \"2xl\": 1536\n};\nconst breakpointsBootstrapV5 = {\n xs: 0,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1400\n};\nconst breakpointsVuetifyV2 = {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1264,\n xl: 1904\n};\nconst breakpointsVuetifyV3 = {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1280,\n xl: 1920,\n xxl: 2560\n};\nconst breakpointsVuetify = breakpointsVuetifyV2;\nconst breakpointsAntDesign = {\n xs: 480,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1600\n};\nconst breakpointsQuasar = {\n xs: 0,\n sm: 600,\n md: 1024,\n lg: 1440,\n xl: 1920\n};\nconst breakpointsSematic = {\n mobileS: 320,\n mobileM: 375,\n mobileL: 425,\n tablet: 768,\n laptop: 1024,\n laptopL: 1440,\n desktop4K: 2560\n};\nconst breakpointsMasterCss = {\n \"3xs\": 360,\n \"2xs\": 480,\n \"xs\": 600,\n \"sm\": 768,\n \"md\": 1024,\n \"lg\": 1280,\n \"xl\": 1440,\n \"2xl\": 1600,\n \"3xl\": 1920,\n \"4xl\": 2560\n};\nconst breakpointsPrimeFlex = {\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200\n};\nconst breakpointsElement = {\n xs: 0,\n sm: 768,\n md: 992,\n lg: 1200,\n xl: 1920\n};\n\nfunction useBreakpoints(breakpoints, options = {}) {\n function getValue(k, delta) {\n let v = toValue(breakpoints[toValue(k)]);\n if (delta != null)\n v = increaseWithUnit(v, delta);\n if (typeof v === \"number\")\n v = `${v}px`;\n return v;\n }\n const { window = defaultWindow, strategy = \"min-width\", ssrWidth = useSSRWidth() } = options;\n const ssrSupport = typeof ssrWidth === \"number\";\n const mounted = ssrSupport ? shallowRef(false) : { value: true };\n if (ssrSupport) {\n tryOnMounted(() => mounted.value = !!window);\n }\n function match(query, size) {\n if (!mounted.value && ssrSupport) {\n return query === \"min\" ? ssrWidth >= pxValue(size) : ssrWidth <= pxValue(size);\n }\n if (!window)\n return false;\n return window.matchMedia(`(${query}-width: ${size})`).matches;\n }\n const greaterOrEqual = (k) => {\n return useMediaQuery(() => `(min-width: ${getValue(k)})`, options);\n };\n const smallerOrEqual = (k) => {\n return useMediaQuery(() => `(max-width: ${getValue(k)})`, options);\n };\n const shortcutMethods = Object.keys(breakpoints).reduce((shortcuts, k) => {\n Object.defineProperty(shortcuts, k, {\n get: () => strategy === \"min-width\" ? greaterOrEqual(k) : smallerOrEqual(k),\n enumerable: true,\n configurable: true\n });\n return shortcuts;\n }, {});\n function current() {\n const points = Object.keys(breakpoints).map((k) => [k, shortcutMethods[k], pxValue(getValue(k))]).sort((a, b) => a[2] - b[2]);\n return computed(() => points.filter(([, v]) => v.value).map(([k]) => k));\n }\n return Object.assign(shortcutMethods, {\n greaterOrEqual,\n smallerOrEqual,\n greater(k) {\n return useMediaQuery(() => `(min-width: ${getValue(k, 0.1)})`, options);\n },\n smaller(k) {\n return useMediaQuery(() => `(max-width: ${getValue(k, -0.1)})`, options);\n },\n between(a, b) {\n return useMediaQuery(() => `(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -0.1)})`, options);\n },\n isGreater(k) {\n return match(\"min\", getValue(k, 0.1));\n },\n isGreaterOrEqual(k) {\n return match(\"min\", getValue(k));\n },\n isSmaller(k) {\n return match(\"max\", getValue(k, -0.1));\n },\n isSmallerOrEqual(k) {\n return match(\"max\", getValue(k));\n },\n isInBetween(a, b) {\n return match(\"min\", getValue(a)) && match(\"max\", getValue(b, -0.1));\n },\n current,\n active() {\n const bps = current();\n return computed(() => bps.value.length === 0 ? \"\" : bps.value.at(strategy === \"min-width\" ? -1 : 0));\n }\n });\n}\n\nfunction useBroadcastChannel(options) {\n const {\n name,\n window = defaultWindow\n } = options;\n const isSupported = useSupported(() => window && \"BroadcastChannel\" in window);\n const isClosed = shallowRef(false);\n const channel = ref();\n const data = ref();\n const error = shallowRef(null);\n const post = (data2) => {\n if (channel.value)\n channel.value.postMessage(data2);\n };\n const close = () => {\n if (channel.value)\n channel.value.close();\n isClosed.value = true;\n };\n if (isSupported.value) {\n tryOnMounted(() => {\n error.value = null;\n channel.value = new BroadcastChannel(name);\n const listenerOptions = {\n passive: true\n };\n useEventListener(channel, \"message\", (e) => {\n data.value = e.data;\n }, listenerOptions);\n useEventListener(channel, \"messageerror\", (e) => {\n error.value = e;\n }, listenerOptions);\n useEventListener(channel, \"close\", () => {\n isClosed.value = true;\n }, listenerOptions);\n });\n }\n tryOnScopeDispose(() => {\n close();\n });\n return {\n isSupported,\n channel,\n data,\n post,\n close,\n error,\n isClosed\n };\n}\n\nconst WRITABLE_PROPERTIES = [\n \"hash\",\n \"host\",\n \"hostname\",\n \"href\",\n \"pathname\",\n \"port\",\n \"protocol\",\n \"search\"\n];\nfunction useBrowserLocation(options = {}) {\n const { window = defaultWindow } = options;\n const refs = Object.fromEntries(\n WRITABLE_PROPERTIES.map((key) => [key, ref()])\n );\n for (const [key, ref] of objectEntries(refs)) {\n watch(ref, (value) => {\n if (!(window == null ? void 0 : window.location) || window.location[key] === value)\n return;\n window.location[key] = value;\n });\n }\n const buildState = (trigger) => {\n var _a;\n const { state: state2, length } = (window == null ? void 0 : window.history) || {};\n const { origin } = (window == null ? void 0 : window.location) || {};\n for (const key of WRITABLE_PROPERTIES)\n refs[key].value = (_a = window == null ? void 0 : window.location) == null ? void 0 : _a[key];\n return reactive({\n trigger,\n state: state2,\n length,\n origin,\n ...refs\n });\n };\n const state = ref(buildState(\"load\"));\n if (window) {\n const listenerOptions = { passive: true };\n useEventListener(window, \"popstate\", () => state.value = buildState(\"popstate\"), listenerOptions);\n useEventListener(window, \"hashchange\", () => state.value = buildState(\"hashchange\"), listenerOptions);\n }\n return state;\n}\n\nfunction useCached(refValue, comparator = (a, b) => a === b, options) {\n const { deepRefs = true, ...watchOptions } = options || {};\n const cachedValue = createRef(refValue.value, deepRefs);\n watch(() => refValue.value, (value) => {\n if (!comparator(value, cachedValue.value))\n cachedValue.value = value;\n }, watchOptions);\n return cachedValue;\n}\n\nfunction usePermission(permissionDesc, options = {}) {\n const {\n controls = false,\n navigator = defaultNavigator\n } = options;\n const isSupported = useSupported(() => navigator && \"permissions\" in navigator);\n const permissionStatus = shallowRef();\n const desc = typeof permissionDesc === \"string\" ? { name: permissionDesc } : permissionDesc;\n const state = shallowRef();\n const update = () => {\n var _a, _b;\n state.value = (_b = (_a = permissionStatus.value) == null ? void 0 : _a.state) != null ? _b : \"prompt\";\n };\n useEventListener(permissionStatus, \"change\", update, { passive: true });\n const query = createSingletonPromise(async () => {\n if (!isSupported.value)\n return;\n if (!permissionStatus.value) {\n try {\n permissionStatus.value = await navigator.permissions.query(desc);\n } catch (e) {\n permissionStatus.value = void 0;\n } finally {\n update();\n }\n }\n if (controls)\n return toRaw(permissionStatus.value);\n });\n query();\n if (controls) {\n return {\n state,\n isSupported,\n query\n };\n } else {\n return state;\n }\n}\n\nfunction useClipboard(options = {}) {\n const {\n navigator = defaultNavigator,\n read = false,\n source,\n copiedDuring = 1500,\n legacy = false\n } = options;\n const isClipboardApiSupported = useSupported(() => navigator && \"clipboard\" in navigator);\n const permissionRead = usePermission(\"clipboard-read\");\n const permissionWrite = usePermission(\"clipboard-write\");\n const isSupported = computed(() => isClipboardApiSupported.value || legacy);\n const text = shallowRef(\"\");\n const copied = shallowRef(false);\n const timeout = useTimeoutFn(() => copied.value = false, copiedDuring, { immediate: false });\n async function updateText() {\n let useLegacy = !(isClipboardApiSupported.value && isAllowed(permissionRead.value));\n if (!useLegacy) {\n try {\n text.value = await navigator.clipboard.readText();\n } catch (e) {\n useLegacy = true;\n }\n }\n if (useLegacy) {\n text.value = legacyRead();\n }\n }\n if (isSupported.value && read)\n useEventListener([\"copy\", \"cut\"], updateText, { passive: true });\n async function copy(value = toValue(source)) {\n if (isSupported.value && value != null) {\n let useLegacy = !(isClipboardApiSupported.value && isAllowed(permissionWrite.value));\n if (!useLegacy) {\n try {\n await navigator.clipboard.writeText(value);\n } catch (e) {\n useLegacy = true;\n }\n }\n if (useLegacy)\n legacyCopy(value);\n text.value = value;\n copied.value = true;\n timeout.start();\n }\n }\n function legacyCopy(value) {\n const ta = document.createElement(\"textarea\");\n ta.value = value != null ? value : \"\";\n ta.style.position = \"absolute\";\n ta.style.opacity = \"0\";\n document.body.appendChild(ta);\n ta.select();\n document.execCommand(\"copy\");\n ta.remove();\n }\n function legacyRead() {\n var _a, _b, _c;\n return (_c = (_b = (_a = document == null ? void 0 : document.getSelection) == null ? void 0 : _a.call(document)) == null ? void 0 : _b.toString()) != null ? _c : \"\";\n }\n function isAllowed(status) {\n return status === \"granted\" || status === \"prompt\";\n }\n return {\n isSupported,\n text,\n copied,\n copy\n };\n}\n\nfunction useClipboardItems(options = {}) {\n const {\n navigator = defaultNavigator,\n read = false,\n source,\n copiedDuring = 1500\n } = options;\n const isSupported = useSupported(() => navigator && \"clipboard\" in navigator);\n const content = ref([]);\n const copied = shallowRef(false);\n const timeout = useTimeoutFn(() => copied.value = false, copiedDuring, { immediate: false });\n function updateContent() {\n if (isSupported.value) {\n navigator.clipboard.read().then((items) => {\n content.value = items;\n });\n }\n }\n if (isSupported.value && read)\n useEventListener([\"copy\", \"cut\"], updateContent, { passive: true });\n async function copy(value = toValue(source)) {\n if (isSupported.value && value != null) {\n await navigator.clipboard.write(value);\n content.value = value;\n copied.value = true;\n timeout.start();\n }\n }\n return {\n isSupported,\n content,\n copied,\n copy\n };\n}\n\nfunction cloneFnJSON(source) {\n return JSON.parse(JSON.stringify(source));\n}\nfunction useCloned(source, options = {}) {\n const cloned = ref({});\n const isModified = shallowRef(false);\n let _lastSync = false;\n const {\n manual,\n clone = cloneFnJSON,\n // watch options\n deep = true,\n immediate = true\n } = options;\n watch(cloned, () => {\n if (_lastSync) {\n _lastSync = false;\n return;\n }\n isModified.value = true;\n }, {\n deep: true,\n flush: \"sync\"\n });\n function sync() {\n _lastSync = true;\n isModified.value = false;\n cloned.value = clone(toValue(source));\n }\n if (!manual && (isRef(source) || typeof source === \"function\")) {\n watch(source, sync, {\n ...options,\n deep,\n immediate\n });\n } else {\n sync();\n }\n return { cloned, isModified, sync };\n}\n\nconst _global = typeof globalThis !== \"undefined\" ? globalThis : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : {};\nconst globalKey = \"__vueuse_ssr_handlers__\";\nconst handlers = /* @__PURE__ */ getHandlers();\nfunction getHandlers() {\n if (!(globalKey in _global))\n _global[globalKey] = _global[globalKey] || {};\n return _global[globalKey];\n}\nfunction getSSRHandler(key, fallback) {\n return handlers[key] || fallback;\n}\nfunction setSSRHandler(key, fn) {\n handlers[key] = fn;\n}\n\nfunction usePreferredDark(options) {\n return useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n}\n\nfunction guessSerializerType(rawInit) {\n 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\";\n}\n\nconst StorageSerializers = {\n boolean: {\n read: (v) => v === \"true\",\n write: (v) => String(v)\n },\n object: {\n read: (v) => JSON.parse(v),\n write: (v) => JSON.stringify(v)\n },\n number: {\n read: (v) => Number.parseFloat(v),\n write: (v) => String(v)\n },\n any: {\n read: (v) => v,\n write: (v) => String(v)\n },\n string: {\n read: (v) => v,\n write: (v) => String(v)\n },\n map: {\n read: (v) => new Map(JSON.parse(v)),\n write: (v) => JSON.stringify(Array.from(v.entries()))\n },\n set: {\n read: (v) => new Set(JSON.parse(v)),\n write: (v) => JSON.stringify(Array.from(v))\n },\n date: {\n read: (v) => new Date(v),\n write: (v) => v.toISOString()\n }\n};\nconst customStorageEventName = \"vueuse-storage\";\nfunction useStorage(key, defaults, storage, options = {}) {\n var _a;\n const {\n flush = \"pre\",\n deep = true,\n listenToStorageChanges = true,\n writeDefaults = true,\n mergeDefaults = false,\n shallow,\n window = defaultWindow,\n eventFilter,\n onError = (e) => {\n console.error(e);\n },\n initOnMounted\n } = options;\n const data = (shallow ? shallowRef : ref)(typeof defaults === \"function\" ? defaults() : defaults);\n const keyComputed = computed(() => toValue(key));\n if (!storage) {\n try {\n storage = getSSRHandler(\"getDefaultStorage\", () => {\n var _a2;\n return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n })();\n } catch (e) {\n onError(e);\n }\n }\n if (!storage)\n return data;\n const rawInit = toValue(defaults);\n const type = guessSerializerType(rawInit);\n const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n const { pause: pauseWatch, resume: resumeWatch } = pausableWatch(\n data,\n () => write(data.value),\n { flush, deep, eventFilter }\n );\n watch(keyComputed, () => update(), { flush });\n if (window && listenToStorageChanges) {\n tryOnMounted(() => {\n if (storage instanceof Storage)\n useEventListener(window, \"storage\", update, { passive: true });\n else\n useEventListener(window, customStorageEventName, updateFromCustomEvent);\n if (initOnMounted)\n update();\n });\n }\n if (!initOnMounted)\n update();\n function dispatchWriteEvent(oldValue, newValue) {\n if (window) {\n const payload = {\n key: keyComputed.value,\n oldValue,\n newValue,\n storageArea: storage\n };\n window.dispatchEvent(storage instanceof Storage ? new StorageEvent(\"storage\", payload) : new CustomEvent(customStorageEventName, {\n detail: payload\n }));\n }\n }\n function write(v) {\n try {\n const oldValue = storage.getItem(keyComputed.value);\n if (v == null) {\n dispatchWriteEvent(oldValue, null);\n storage.removeItem(keyComputed.value);\n } else {\n const serialized = serializer.write(v);\n if (oldValue !== serialized) {\n storage.setItem(keyComputed.value, serialized);\n dispatchWriteEvent(oldValue, serialized);\n }\n }\n } catch (e) {\n onError(e);\n }\n }\n function read(event) {\n const rawValue = event ? event.newValue : storage.getItem(keyComputed.value);\n if (rawValue == null) {\n if (writeDefaults && rawInit != null)\n storage.setItem(keyComputed.value, serializer.write(rawInit));\n return rawInit;\n } else if (!event && mergeDefaults) {\n const value = serializer.read(rawValue);\n if (typeof mergeDefaults === \"function\")\n return mergeDefaults(value, rawInit);\n else if (type === \"object\" && !Array.isArray(value))\n return { ...rawInit, ...value };\n return value;\n } else if (typeof rawValue !== \"string\") {\n return rawValue;\n } else {\n return serializer.read(rawValue);\n }\n }\n function update(event) {\n if (event && event.storageArea !== storage)\n return;\n if (event && event.key == null) {\n data.value = rawInit;\n return;\n }\n if (event && event.key !== keyComputed.value)\n return;\n pauseWatch();\n try {\n if ((event == null ? void 0 : event.newValue) !== serializer.write(data.value))\n data.value = read(event);\n } catch (e) {\n onError(e);\n } finally {\n if (event)\n nextTick(resumeWatch);\n else\n resumeWatch();\n }\n }\n function updateFromCustomEvent(event) {\n update(event.detail);\n }\n return data;\n}\n\nconst CSS_DISABLE_TRANS = \"*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}\";\nfunction useColorMode(options = {}) {\n const {\n selector = \"html\",\n attribute = \"class\",\n initialValue = \"auto\",\n window = defaultWindow,\n storage,\n storageKey = \"vueuse-color-scheme\",\n listenToStorageChanges = true,\n storageRef,\n emitAuto,\n disableTransition = true\n } = options;\n const modes = {\n auto: \"\",\n light: \"light\",\n dark: \"dark\",\n ...options.modes || {}\n };\n const preferredDark = usePreferredDark({ window });\n const system = computed(() => preferredDark.value ? \"dark\" : \"light\");\n const store = storageRef || (storageKey == null ? toRef(initialValue) : useStorage(storageKey, initialValue, storage, { window, listenToStorageChanges }));\n const state = computed(() => store.value === \"auto\" ? system.value : store.value);\n const updateHTMLAttrs = getSSRHandler(\n \"updateHTMLAttrs\",\n (selector2, attribute2, value) => {\n const el = typeof selector2 === \"string\" ? window == null ? void 0 : window.document.querySelector(selector2) : unrefElement(selector2);\n if (!el)\n return;\n const classesToAdd = /* @__PURE__ */ new Set();\n const classesToRemove = /* @__PURE__ */ new Set();\n let attributeToChange = null;\n if (attribute2 === \"class\") {\n const current = value.split(/\\s/g);\n Object.values(modes).flatMap((i) => (i || \"\").split(/\\s/g)).filter(Boolean).forEach((v) => {\n if (current.includes(v))\n classesToAdd.add(v);\n else\n classesToRemove.add(v);\n });\n } else {\n attributeToChange = { key: attribute2, value };\n }\n if (classesToAdd.size === 0 && classesToRemove.size === 0 && attributeToChange === null)\n return;\n let style;\n if (disableTransition) {\n style = window.document.createElement(\"style\");\n style.appendChild(document.createTextNode(CSS_DISABLE_TRANS));\n window.document.head.appendChild(style);\n }\n for (const c of classesToAdd) {\n el.classList.add(c);\n }\n for (const c of classesToRemove) {\n el.classList.remove(c);\n }\n if (attributeToChange) {\n el.setAttribute(attributeToChange.key, attributeToChange.value);\n }\n if (disableTransition) {\n window.getComputedStyle(style).opacity;\n document.head.removeChild(style);\n }\n }\n );\n function defaultOnChanged(mode) {\n var _a;\n updateHTMLAttrs(selector, attribute, (_a = modes[mode]) != null ? _a : mode);\n }\n function onChanged(mode) {\n if (options.onChanged)\n options.onChanged(mode, defaultOnChanged);\n else\n defaultOnChanged(mode);\n }\n watch(state, onChanged, { flush: \"post\", immediate: true });\n tryOnMounted(() => onChanged(state.value));\n const auto = computed({\n get() {\n return emitAuto ? store.value : state.value;\n },\n set(v) {\n store.value = v;\n }\n });\n return Object.assign(auto, { store, system, state });\n}\n\nfunction useConfirmDialog(revealed = shallowRef(false)) {\n const confirmHook = createEventHook();\n const cancelHook = createEventHook();\n const revealHook = createEventHook();\n let _resolve = noop;\n const reveal = (data) => {\n revealHook.trigger(data);\n revealed.value = true;\n return new Promise((resolve) => {\n _resolve = resolve;\n });\n };\n const confirm = (data) => {\n revealed.value = false;\n confirmHook.trigger(data);\n _resolve({ data, isCanceled: false });\n };\n const cancel = (data) => {\n revealed.value = false;\n cancelHook.trigger(data);\n _resolve({ data, isCanceled: true });\n };\n return {\n isRevealed: computed(() => revealed.value),\n reveal,\n confirm,\n cancel,\n onReveal: revealHook.on,\n onConfirm: confirmHook.on,\n onCancel: cancelHook.on\n };\n}\n\nfunction useCountdown(initialCountdown, options) {\n var _a, _b;\n const remaining = shallowRef(toValue(initialCountdown));\n const intervalController = useIntervalFn(() => {\n var _a2, _b2;\n const value = remaining.value - 1;\n remaining.value = value < 0 ? 0 : value;\n (_a2 = options == null ? void 0 : options.onTick) == null ? void 0 : _a2.call(options);\n if (remaining.value <= 0) {\n intervalController.pause();\n (_b2 = options == null ? void 0 : options.onComplete) == null ? void 0 : _b2.call(options);\n }\n }, (_a = options == null ? void 0 : options.interval) != null ? _a : 1e3, { immediate: (_b = options == null ? void 0 : options.immediate) != null ? _b : false });\n const reset = (countdown) => {\n var _a2;\n remaining.value = (_a2 = toValue(countdown)) != null ? _a2 : toValue(initialCountdown);\n };\n const stop = () => {\n intervalController.pause();\n reset();\n };\n const resume = () => {\n if (!intervalController.isActive.value) {\n if (remaining.value > 0) {\n intervalController.resume();\n }\n }\n };\n const start = (countdown) => {\n reset(countdown);\n intervalController.resume();\n };\n return {\n remaining,\n reset,\n stop,\n start,\n pause: intervalController.pause,\n resume,\n isActive: intervalController.isActive\n };\n}\n\nfunction useCssVar(prop, target, options = {}) {\n const { window = defaultWindow, initialValue, observe = false } = options;\n const variable = shallowRef(initialValue);\n const elRef = computed(() => {\n var _a;\n return unrefElement(target) || ((_a = window == null ? void 0 : window.document) == null ? void 0 : _a.documentElement);\n });\n function updateCssVar() {\n var _a;\n const key = toValue(prop);\n const el = toValue(elRef);\n if (el && window && key) {\n const value = (_a = window.getComputedStyle(el).getPropertyValue(key)) == null ? void 0 : _a.trim();\n variable.value = value || variable.value || initialValue;\n }\n }\n if (observe) {\n useMutationObserver(elRef, updateCssVar, {\n attributeFilter: [\"style\", \"class\"],\n window\n });\n }\n watch(\n [elRef, () => toValue(prop)],\n (_, old) => {\n if (old[0] && old[1])\n old[0].style.removeProperty(old[1]);\n updateCssVar();\n },\n { immediate: true }\n );\n watch(\n [variable, elRef],\n ([val, el]) => {\n const raw_prop = toValue(prop);\n if ((el == null ? void 0 : el.style) && raw_prop) {\n if (val == null)\n el.style.removeProperty(raw_prop);\n else\n el.style.setProperty(raw_prop, val);\n }\n },\n { immediate: true }\n );\n return variable;\n}\n\nfunction useCurrentElement(rootComponent) {\n const vm = getCurrentInstance();\n const currentElement = computedWithControl(\n () => null,\n () => rootComponent ? unrefElement(rootComponent) : vm.proxy.$el\n );\n onUpdated(currentElement.trigger);\n onMounted(currentElement.trigger);\n return currentElement;\n}\n\nfunction useCycleList(list, options) {\n const state = shallowRef(getInitialValue());\n const listRef = toRef(list);\n const index = computed({\n get() {\n var _a;\n const targetList = listRef.value;\n let index2 = (options == null ? void 0 : options.getIndexOf) ? options.getIndexOf(state.value, targetList) : targetList.indexOf(state.value);\n if (index2 < 0)\n index2 = (_a = options == null ? void 0 : options.fallbackIndex) != null ? _a : 0;\n return index2;\n },\n set(v) {\n set(v);\n }\n });\n function set(i) {\n const targetList = listRef.value;\n const length = targetList.length;\n const index2 = (i % length + length) % length;\n const value = targetList[index2];\n state.value = value;\n return value;\n }\n function shift(delta = 1) {\n return set(index.value + delta);\n }\n function next(n = 1) {\n return shift(n);\n }\n function prev(n = 1) {\n return shift(-n);\n }\n function getInitialValue() {\n var _a, _b;\n return (_b = toValue((_a = options == null ? void 0 : options.initialValue) != null ? _a : toValue(list)[0])) != null ? _b : void 0;\n }\n watch(listRef, () => set(index.value));\n return {\n state,\n index,\n next,\n prev,\n go: set\n };\n}\n\nfunction useDark(options = {}) {\n const {\n valueDark = \"dark\",\n valueLight = \"\"\n } = options;\n const mode = useColorMode({\n ...options,\n onChanged: (mode2, defaultHandler) => {\n var _a;\n if (options.onChanged)\n (_a = options.onChanged) == null ? void 0 : _a.call(options, mode2 === \"dark\", defaultHandler, mode2);\n else\n defaultHandler(mode2);\n },\n modes: {\n dark: valueDark,\n light: valueLight\n }\n });\n const system = computed(() => mode.system.value);\n const isDark = computed({\n get() {\n return mode.value === \"dark\";\n },\n set(v) {\n const modeVal = v ? \"dark\" : \"light\";\n if (system.value === modeVal)\n mode.value = \"auto\";\n else\n mode.value = modeVal;\n }\n });\n return isDark;\n}\n\nfunction fnBypass(v) {\n return v;\n}\nfunction fnSetSource(source, value) {\n return source.value = value;\n}\nfunction defaultDump(clone) {\n return clone ? typeof clone === \"function\" ? clone : cloneFnJSON : fnBypass;\n}\nfunction defaultParse(clone) {\n return clone ? typeof clone === \"function\" ? clone : cloneFnJSON : fnBypass;\n}\nfunction useManualRefHistory(source, options = {}) {\n const {\n clone = false,\n dump = defaultDump(clone),\n parse = defaultParse(clone),\n setSource = fnSetSource\n } = options;\n function _createHistoryRecord() {\n return markRaw({\n snapshot: dump(source.value),\n timestamp: timestamp()\n });\n }\n const last = ref(_createHistoryRecord());\n const undoStack = ref([]);\n const redoStack = ref([]);\n const _setSource = (record) => {\n setSource(source, parse(record.snapshot));\n last.value = record;\n };\n const commit = () => {\n undoStack.value.unshift(last.value);\n last.value = _createHistoryRecord();\n if (options.capacity && undoStack.value.length > options.capacity)\n undoStack.value.splice(options.capacity, Number.POSITIVE_INFINITY);\n if (redoStack.value.length)\n redoStack.value.splice(0, redoStack.value.length);\n };\n const clear = () => {\n undoStack.value.splice(0, undoStack.value.length);\n redoStack.value.splice(0, redoStack.value.length);\n };\n const undo = () => {\n const state = undoStack.value.shift();\n if (state) {\n redoStack.value.unshift(last.value);\n _setSource(state);\n }\n };\n const redo = () => {\n const state = redoStack.value.shift();\n if (state) {\n undoStack.value.unshift(last.value);\n _setSource(state);\n }\n };\n const reset = () => {\n _setSource(last.value);\n };\n const history = computed(() => [last.value, ...undoStack.value]);\n const canUndo = computed(() => undoStack.value.length > 0);\n const canRedo = computed(() => redoStack.value.length > 0);\n return {\n source,\n undoStack,\n redoStack,\n last,\n history,\n canUndo,\n canRedo,\n clear,\n commit,\n reset,\n undo,\n redo\n };\n}\n\nfunction useRefHistory(source, options = {}) {\n const {\n deep = false,\n flush = \"pre\",\n eventFilter\n } = options;\n const {\n eventFilter: composedFilter,\n pause,\n resume: resumeTracking,\n isActive: isTracking\n } = pausableFilter(eventFilter);\n const {\n ignoreUpdates,\n ignorePrevAsyncUpdates,\n stop\n } = watchIgnorable(\n source,\n commit,\n { deep, flush, eventFilter: composedFilter }\n );\n function setSource(source2, value) {\n ignorePrevAsyncUpdates();\n ignoreUpdates(() => {\n source2.value = value;\n });\n }\n const manualHistory = useManualRefHistory(source, { ...options, clone: options.clone || deep, setSource });\n const { clear, commit: manualCommit } = manualHistory;\n function commit() {\n ignorePrevAsyncUpdates();\n manualCommit();\n }\n function resume(commitNow) {\n resumeTracking();\n if (commitNow)\n commit();\n }\n function batch(fn) {\n let canceled = false;\n const cancel = () => canceled = true;\n ignoreUpdates(() => {\n fn(cancel);\n });\n if (!canceled)\n commit();\n }\n function dispose() {\n stop();\n clear();\n }\n return {\n ...manualHistory,\n isTracking,\n pause,\n resume,\n commit,\n batch,\n dispose\n };\n}\n\nfunction useDebouncedRefHistory(source, options = {}) {\n const filter = options.debounce ? debounceFilter(options.debounce) : void 0;\n const history = useRefHistory(source, { ...options, eventFilter: filter });\n return {\n ...history\n };\n}\n\nfunction useDeviceMotion(options = {}) {\n const {\n window = defaultWindow,\n requestPermissions = false,\n eventFilter = bypassFilter\n } = options;\n const isSupported = useSupported(() => typeof DeviceMotionEvent !== \"undefined\");\n const requirePermissions = useSupported(() => isSupported.value && \"requestPermission\" in DeviceMotionEvent && typeof DeviceMotionEvent.requestPermission === \"function\");\n const permissionGranted = shallowRef(false);\n const acceleration = ref({ x: null, y: null, z: null });\n const rotationRate = ref({ alpha: null, beta: null, gamma: null });\n const interval = shallowRef(0);\n const accelerationIncludingGravity = ref({\n x: null,\n y: null,\n z: null\n });\n function init() {\n if (window) {\n const onDeviceMotion = createFilterWrapper(\n eventFilter,\n (event) => {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i;\n acceleration.value = {\n x: ((_a = event.acceleration) == null ? void 0 : _a.x) || null,\n y: ((_b = event.acceleration) == null ? void 0 : _b.y) || null,\n z: ((_c = event.acceleration) == null ? void 0 : _c.z) || null\n };\n accelerationIncludingGravity.value = {\n x: ((_d = event.accelerationIncludingGravity) == null ? void 0 : _d.x) || null,\n y: ((_e = event.accelerationIncludingGravity) == null ? void 0 : _e.y) || null,\n z: ((_f = event.accelerationIncludingGravity) == null ? void 0 : _f.z) || null\n };\n rotationRate.value = {\n alpha: ((_g = event.rotationRate) == null ? void 0 : _g.alpha) || null,\n beta: ((_h = event.rotationRate) == null ? void 0 : _h.beta) || null,\n gamma: ((_i = event.rotationRate) == null ? void 0 : _i.gamma) || null\n };\n interval.value = event.interval;\n }\n );\n useEventListener(window, \"devicemotion\", onDeviceMotion, { passive: true });\n }\n }\n const ensurePermissions = async () => {\n if (!requirePermissions.value)\n permissionGranted.value = true;\n if (permissionGranted.value)\n return;\n if (requirePermissions.value) {\n const requestPermission = DeviceMotionEvent.requestPermission;\n try {\n const response = await requestPermission();\n if (response === \"granted\") {\n permissionGranted.value = true;\n init();\n }\n } catch (error) {\n console.error(error);\n }\n }\n };\n if (isSupported.value) {\n if (requestPermissions && requirePermissions.value) {\n ensurePermissions().then(() => init());\n } else {\n init();\n }\n }\n return {\n acceleration,\n accelerationIncludingGravity,\n rotationRate,\n interval,\n isSupported,\n requirePermissions,\n ensurePermissions,\n permissionGranted\n };\n}\n\nfunction useDeviceOrientation(options = {}) {\n const { window = defaultWindow } = options;\n const isSupported = useSupported(() => window && \"DeviceOrientationEvent\" in window);\n const isAbsolute = shallowRef(false);\n const alpha = shallowRef(null);\n const beta = shallowRef(null);\n const gamma = shallowRef(null);\n if (window && isSupported.value) {\n useEventListener(window, \"deviceorientation\", (event) => {\n isAbsolute.value = event.absolute;\n alpha.value = event.alpha;\n beta.value = event.beta;\n gamma.value = event.gamma;\n }, { passive: true });\n }\n return {\n isSupported,\n isAbsolute,\n alpha,\n beta,\n gamma\n };\n}\n\nfunction useDevicePixelRatio(options = {}) {\n const {\n window = defaultWindow\n } = options;\n const pixelRatio = shallowRef(1);\n const query = useMediaQuery(() => `(resolution: ${pixelRatio.value}dppx)`, options);\n let stop = noop;\n if (window) {\n stop = watchImmediate(query, () => pixelRatio.value = window.devicePixelRatio);\n }\n return {\n pixelRatio: readonly(pixelRatio),\n stop\n };\n}\n\nfunction useDevicesList(options = {}) {\n const {\n navigator = defaultNavigator,\n requestPermissions = false,\n constraints = { audio: true, video: true },\n onUpdated\n } = options;\n const devices = ref([]);\n const videoInputs = computed(() => devices.value.filter((i) => i.kind === \"videoinput\"));\n const audioInputs = computed(() => devices.value.filter((i) => i.kind === \"audioinput\"));\n const audioOutputs = computed(() => devices.value.filter((i) => i.kind === \"audiooutput\"));\n const isSupported = useSupported(() => navigator && navigator.mediaDevices && navigator.mediaDevices.enumerateDevices);\n const permissionGranted = shallowRef(false);\n let stream;\n async function update() {\n if (!isSupported.value)\n return;\n devices.value = await navigator.mediaDevices.enumerateDevices();\n onUpdated == null ? void 0 : onUpdated(devices.value);\n if (stream) {\n stream.getTracks().forEach((t) => t.stop());\n stream = null;\n }\n }\n async function ensurePermissions() {\n const deviceName = constraints.video ? \"camera\" : \"microphone\";\n if (!isSupported.value)\n return false;\n if (permissionGranted.value)\n return true;\n const { state, query } = usePermission(deviceName, { controls: true });\n await query();\n if (state.value !== \"granted\") {\n let granted = true;\n try {\n stream = await navigator.mediaDevices.getUserMedia(constraints);\n } catch (e) {\n stream = null;\n granted = false;\n }\n update();\n permissionGranted.value = granted;\n } else {\n permissionGranted.value = true;\n }\n return permissionGranted.value;\n }\n if (isSupported.value) {\n if (requestPermissions)\n ensurePermissions();\n useEventListener(navigator.mediaDevices, \"devicechange\", update, { passive: true });\n update();\n }\n return {\n devices,\n ensurePermissions,\n permissionGranted,\n videoInputs,\n audioInputs,\n audioOutputs,\n isSupported\n };\n}\n\nfunction useDisplayMedia(options = {}) {\n var _a;\n const enabled = shallowRef((_a = options.enabled) != null ? _a : false);\n const video = options.video;\n const audio = options.audio;\n const { navigator = defaultNavigator } = options;\n const isSupported = useSupported(() => {\n var _a2;\n return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getDisplayMedia;\n });\n const constraint = { audio, video };\n const stream = shallowRef();\n async function _start() {\n var _a2;\n if (!isSupported.value || stream.value)\n return;\n stream.value = await navigator.mediaDevices.getDisplayMedia(constraint);\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => useEventListener(t, \"ended\", stop, { passive: true }));\n return stream.value;\n }\n async function _stop() {\n var _a2;\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());\n stream.value = void 0;\n }\n function stop() {\n _stop();\n enabled.value = false;\n }\n async function start() {\n await _start();\n if (stream.value)\n enabled.value = true;\n return stream.value;\n }\n watch(\n enabled,\n (v) => {\n if (v)\n _start();\n else\n _stop();\n },\n { immediate: true }\n );\n return {\n isSupported,\n stream,\n start,\n stop,\n enabled\n };\n}\n\nfunction useDocumentVisibility(options = {}) {\n const { document = defaultDocument } = options;\n if (!document)\n return shallowRef(\"visible\");\n const visibility = shallowRef(document.visibilityState);\n useEventListener(document, \"visibilitychange\", () => {\n visibility.value = document.visibilityState;\n }, { passive: true });\n return visibility;\n}\n\nfunction useDraggable(target, options = {}) {\n var _a;\n const {\n pointerTypes,\n preventDefault,\n stopPropagation,\n exact,\n onMove,\n onEnd,\n onStart,\n initialValue,\n axis = \"both\",\n draggingElement = defaultWindow,\n containerElement,\n handle: draggingHandle = target,\n buttons = [0]\n } = options;\n const position = ref(\n (_a = toValue(initialValue)) != null ? _a : { x: 0, y: 0 }\n );\n const pressedDelta = ref();\n const filterEvent = (e) => {\n if (pointerTypes)\n return pointerTypes.includes(e.pointerType);\n return true;\n };\n const handleEvent = (e) => {\n if (toValue(preventDefault))\n e.preventDefault();\n if (toValue(stopPropagation))\n e.stopPropagation();\n };\n const start = (e) => {\n var _a2;\n if (!toValue(buttons).includes(e.button))\n return;\n if (toValue(options.disabled) || !filterEvent(e))\n return;\n if (toValue(exact) && e.target !== toValue(target))\n return;\n const container = toValue(containerElement);\n const containerRect = (_a2 = container == null ? void 0 : container.getBoundingClientRect) == null ? void 0 : _a2.call(container);\n const targetRect = toValue(target).getBoundingClientRect();\n const pos = {\n x: e.clientX - (container ? targetRect.left - containerRect.left + container.scrollLeft : targetRect.left),\n y: e.clientY - (container ? targetRect.top - containerRect.top + container.scrollTop : targetRect.top)\n };\n if ((onStart == null ? void 0 : onStart(pos, e)) === false)\n return;\n pressedDelta.value = pos;\n handleEvent(e);\n };\n const move = (e) => {\n if (toValue(options.disabled) || !filterEvent(e))\n return;\n if (!pressedDelta.value)\n return;\n const container = toValue(containerElement);\n const targetRect = toValue(target).getBoundingClientRect();\n let { x, y } = position.value;\n if (axis === \"x\" || axis === \"both\") {\n x = e.clientX - pressedDelta.value.x;\n if (container)\n x = Math.min(Math.max(0, x), container.scrollWidth - targetRect.width);\n }\n if (axis === \"y\" || axis === \"both\") {\n y = e.clientY - pressedDelta.value.y;\n if (container)\n y = Math.min(Math.max(0, y), container.scrollHeight - targetRect.height);\n }\n position.value = {\n x,\n y\n };\n onMove == null ? void 0 : onMove(position.value, e);\n handleEvent(e);\n };\n const end = (e) => {\n if (toValue(options.disabled) || !filterEvent(e))\n return;\n if (!pressedDelta.value)\n return;\n pressedDelta.value = void 0;\n onEnd == null ? void 0 : onEnd(position.value, e);\n handleEvent(e);\n };\n if (isClient) {\n const config = () => {\n var _a2;\n return {\n capture: (_a2 = options.capture) != null ? _a2 : true,\n passive: !toValue(preventDefault)\n };\n };\n useEventListener(draggingHandle, \"pointerdown\", start, config);\n useEventListener(draggingElement, \"pointermove\", move, config);\n useEventListener(draggingElement, \"pointerup\", end, config);\n }\n return {\n ...toRefs(position),\n position,\n isDragging: computed(() => !!pressedDelta.value),\n style: computed(\n () => `left:${position.value.x}px;top:${position.value.y}px;`\n )\n };\n}\n\nfunction useDropZone(target, options = {}) {\n var _a, _b;\n const isOverDropZone = shallowRef(false);\n const files = shallowRef(null);\n let counter = 0;\n let isValid = true;\n if (isClient) {\n const _options = typeof options === \"function\" ? { onDrop: options } : options;\n const multiple = (_a = _options.multiple) != null ? _a : true;\n const preventDefaultForUnhandled = (_b = _options.preventDefaultForUnhandled) != null ? _b : false;\n const getFiles = (event) => {\n var _a2, _b2;\n const list = Array.from((_b2 = (_a2 = event.dataTransfer) == null ? void 0 : _a2.files) != null ? _b2 : []);\n return list.length === 0 ? null : multiple ? list : [list[0]];\n };\n const checkDataTypes = (types) => {\n const dataTypes = unref(_options.dataTypes);\n if (typeof dataTypes === \"function\")\n return dataTypes(types);\n if (!(dataTypes == null ? void 0 : dataTypes.length))\n return true;\n if (types.length === 0)\n return false;\n return types.every(\n (type) => dataTypes.some((allowedType) => type.includes(allowedType))\n );\n };\n const checkValidity = (items) => {\n const types = Array.from(items != null ? items : []).map((item) => item.type);\n const dataTypesValid = checkDataTypes(types);\n const multipleFilesValid = multiple || items.length <= 1;\n return dataTypesValid && multipleFilesValid;\n };\n const isSafari = () => /^(?:(?!chrome|android).)*safari/i.test(navigator.userAgent) && !(\"chrome\" in window);\n const handleDragEvent = (event, eventType) => {\n var _a2, _b2, _c, _d, _e, _f;\n const dataTransferItemList = (_a2 = event.dataTransfer) == null ? void 0 : _a2.items;\n isValid = (_b2 = dataTransferItemList && checkValidity(dataTransferItemList)) != null ? _b2 : false;\n if (preventDefaultForUnhandled) {\n event.preventDefault();\n }\n if (!isSafari() && !isValid) {\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = \"none\";\n }\n return;\n }\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = \"copy\";\n }\n const currentFiles = getFiles(event);\n switch (eventType) {\n case \"enter\":\n counter += 1;\n isOverDropZone.value = true;\n (_c = _options.onEnter) == null ? void 0 : _c.call(_options, null, event);\n break;\n case \"over\":\n (_d = _options.onOver) == null ? void 0 : _d.call(_options, null, event);\n break;\n case \"leave\":\n counter -= 1;\n if (counter === 0)\n isOverDropZone.value = false;\n (_e = _options.onLeave) == null ? void 0 : _e.call(_options, null, event);\n break;\n case \"drop\":\n counter = 0;\n isOverDropZone.value = false;\n if (isValid) {\n files.value = currentFiles;\n (_f = _options.onDrop) == null ? void 0 : _f.call(_options, currentFiles, event);\n }\n break;\n }\n };\n useEventListener(target, \"dragenter\", (event) => handleDragEvent(event, \"enter\"));\n useEventListener(target, \"dragover\", (event) => handleDragEvent(event, \"over\"));\n useEventListener(target, \"dragleave\", (event) => handleDragEvent(event, \"leave\"));\n useEventListener(target, \"drop\", (event) => handleDragEvent(event, \"drop\"));\n }\n return {\n files,\n isOverDropZone\n };\n}\n\nfunction useResizeObserver(target, callback, options = {}) {\n const { window = defaultWindow, ...observerOptions } = options;\n let observer;\n const isSupported = useSupported(() => window && \"ResizeObserver\" in window);\n const cleanup = () => {\n if (observer) {\n observer.disconnect();\n observer = void 0;\n }\n };\n const targets = computed(() => {\n const _targets = toValue(target);\n return Array.isArray(_targets) ? _targets.map((el) => unrefElement(el)) : [unrefElement(_targets)];\n });\n const stopWatch = watch(\n targets,\n (els) => {\n cleanup();\n if (isSupported.value && window) {\n observer = new ResizeObserver(callback);\n for (const _el of els) {\n if (_el)\n observer.observe(_el, observerOptions);\n }\n }\n },\n { immediate: true, flush: \"post\" }\n );\n const stop = () => {\n cleanup();\n stopWatch();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop\n };\n}\n\nfunction useElementBounding(target, options = {}) {\n const {\n reset = true,\n windowResize = true,\n windowScroll = true,\n immediate = true,\n updateTiming = \"sync\"\n } = options;\n const height = shallowRef(0);\n const bottom = shallowRef(0);\n const left = shallowRef(0);\n const right = shallowRef(0);\n const top = shallowRef(0);\n const width = shallowRef(0);\n const x = shallowRef(0);\n const y = shallowRef(0);\n function recalculate() {\n const el = unrefElement(target);\n if (!el) {\n if (reset) {\n height.value = 0;\n bottom.value = 0;\n left.value = 0;\n right.value = 0;\n top.value = 0;\n width.value = 0;\n x.value = 0;\n y.value = 0;\n }\n return;\n }\n const rect = el.getBoundingClientRect();\n height.value = rect.height;\n bottom.value = rect.bottom;\n left.value = rect.left;\n right.value = rect.right;\n top.value = rect.top;\n width.value = rect.width;\n x.value = rect.x;\n y.value = rect.y;\n }\n function update() {\n if (updateTiming === \"sync\")\n recalculate();\n else if (updateTiming === \"next-frame\")\n requestAnimationFrame(() => recalculate());\n }\n useResizeObserver(target, update);\n watch(() => unrefElement(target), (ele) => !ele && update());\n useMutationObserver(target, update, {\n attributeFilter: [\"style\", \"class\"]\n });\n if (windowScroll)\n useEventListener(\"scroll\", update, { capture: true, passive: true });\n if (windowResize)\n useEventListener(\"resize\", update, { passive: true });\n tryOnMounted(() => {\n if (immediate)\n update();\n });\n return {\n height,\n bottom,\n left,\n right,\n top,\n width,\n x,\n y,\n update\n };\n}\n\nfunction useElementByPoint(options) {\n const {\n x,\n y,\n document = defaultDocument,\n multiple,\n interval = \"requestAnimationFrame\",\n immediate = true\n } = options;\n const isSupported = useSupported(() => {\n if (toValue(multiple))\n return document && \"elementsFromPoint\" in document;\n return document && \"elementFromPoint\" in document;\n });\n const element = shallowRef(null);\n const cb = () => {\n var _a, _b;\n element.value = toValue(multiple) ? (_a = document == null ? void 0 : document.elementsFromPoint(toValue(x), toValue(y))) != null ? _a : [] : (_b = document == null ? void 0 : document.elementFromPoint(toValue(x), toValue(y))) != null ? _b : null;\n };\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(cb, { immediate }) : useIntervalFn(cb, interval, { immediate });\n return {\n isSupported,\n element,\n ...controls\n };\n}\n\nfunction useElementHover(el, options = {}) {\n const {\n delayEnter = 0,\n delayLeave = 0,\n triggerOnRemoval = false,\n window = defaultWindow\n } = options;\n const isHovered = shallowRef(false);\n let timer;\n const toggle = (entering) => {\n const delay = entering ? delayEnter : delayLeave;\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n }\n if (delay)\n timer = setTimeout(() => isHovered.value = entering, delay);\n else\n isHovered.value = entering;\n };\n if (!window)\n return isHovered;\n useEventListener(el, \"mouseenter\", () => toggle(true), { passive: true });\n useEventListener(el, \"mouseleave\", () => toggle(false), { passive: true });\n if (triggerOnRemoval) {\n onElementRemoval(\n computed(() => unrefElement(el)),\n () => toggle(false)\n );\n }\n return isHovered;\n}\n\nfunction useElementSize(target, initialSize = { width: 0, height: 0 }, options = {}) {\n const { window = defaultWindow, box = \"content-box\" } = options;\n const isSVG = computed(() => {\n var _a, _b;\n return (_b = (_a = unrefElement(target)) == null ? void 0 : _a.namespaceURI) == null ? void 0 : _b.includes(\"svg\");\n });\n const width = shallowRef(initialSize.width);\n const height = shallowRef(initialSize.height);\n const { stop: stop1 } = useResizeObserver(\n target,\n ([entry]) => {\n const boxSize = box === \"border-box\" ? entry.borderBoxSize : box === \"content-box\" ? entry.contentBoxSize : entry.devicePixelContentBoxSize;\n if (window && isSVG.value) {\n const $elem = unrefElement(target);\n if ($elem) {\n const rect = $elem.getBoundingClientRect();\n width.value = rect.width;\n height.value = rect.height;\n }\n } else {\n if (boxSize) {\n const formatBoxSize = toArray(boxSize);\n width.value = formatBoxSize.reduce((acc, { inlineSize }) => acc + inlineSize, 0);\n height.value = formatBoxSize.reduce((acc, { blockSize }) => acc + blockSize, 0);\n } else {\n width.value = entry.contentRect.width;\n height.value = entry.contentRect.height;\n }\n }\n },\n options\n );\n tryOnMounted(() => {\n const ele = unrefElement(target);\n if (ele) {\n width.value = \"offsetWidth\" in ele ? ele.offsetWidth : initialSize.width;\n height.value = \"offsetHeight\" in ele ? ele.offsetHeight : initialSize.height;\n }\n });\n const stop2 = watch(\n () => unrefElement(target),\n (ele) => {\n width.value = ele ? initialSize.width : 0;\n height.value = ele ? initialSize.height : 0;\n }\n );\n function stop() {\n stop1();\n stop2();\n }\n return {\n width,\n height,\n stop\n };\n}\n\nfunction useIntersectionObserver(target, callback, options = {}) {\n const {\n root,\n rootMargin = \"0px\",\n threshold = 0,\n window = defaultWindow,\n immediate = true\n } = options;\n const isSupported = useSupported(() => window && \"IntersectionObserver\" in window);\n const targets = computed(() => {\n const _target = toValue(target);\n return toArray(_target).map(unrefElement).filter(notNullish);\n });\n let cleanup = noop;\n const isActive = shallowRef(immediate);\n const stopWatch = isSupported.value ? watch(\n () => [targets.value, unrefElement(root), isActive.value],\n ([targets2, root2]) => {\n cleanup();\n if (!isActive.value)\n return;\n if (!targets2.length)\n return;\n const observer = new IntersectionObserver(\n callback,\n {\n root: unrefElement(root2),\n rootMargin,\n threshold\n }\n );\n targets2.forEach((el) => el && observer.observe(el));\n cleanup = () => {\n observer.disconnect();\n cleanup = noop;\n };\n },\n { immediate, flush: \"post\" }\n ) : noop;\n const stop = () => {\n cleanup();\n stopWatch();\n isActive.value = false;\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n isActive,\n pause() {\n cleanup();\n isActive.value = false;\n },\n resume() {\n isActive.value = true;\n },\n stop\n };\n}\n\nfunction useElementVisibility(element, options = {}) {\n const {\n window = defaultWindow,\n scrollTarget,\n threshold = 0,\n rootMargin,\n once = false\n } = options;\n const elementIsVisible = shallowRef(false);\n const { stop } = useIntersectionObserver(\n element,\n (intersectionObserverEntries) => {\n let isIntersecting = elementIsVisible.value;\n let latestTime = 0;\n for (const entry of intersectionObserverEntries) {\n if (entry.time >= latestTime) {\n latestTime = entry.time;\n isIntersecting = entry.isIntersecting;\n }\n }\n elementIsVisible.value = isIntersecting;\n if (once) {\n watchOnce(elementIsVisible, () => {\n stop();\n });\n }\n },\n {\n root: scrollTarget,\n window,\n threshold,\n rootMargin: toValue(rootMargin)\n }\n );\n return elementIsVisible;\n}\n\nconst events = /* @__PURE__ */ new Map();\n\nfunction useEventBus(key) {\n const scope = getCurrentScope();\n function on(listener) {\n var _a;\n const listeners = events.get(key) || /* @__PURE__ */ new Set();\n listeners.add(listener);\n events.set(key, listeners);\n const _off = () => off(listener);\n (_a = scope == null ? void 0 : scope.cleanups) == null ? void 0 : _a.push(_off);\n return _off;\n }\n function once(listener) {\n function _listener(...args) {\n off(_listener);\n listener(...args);\n }\n return on(_listener);\n }\n function off(listener) {\n const listeners = events.get(key);\n if (!listeners)\n return;\n listeners.delete(listener);\n if (!listeners.size)\n reset();\n }\n function reset() {\n events.delete(key);\n }\n function emit(event, payload) {\n var _a;\n (_a = events.get(key)) == null ? void 0 : _a.forEach((v) => v(event, payload));\n }\n return { on, once, off, emit, reset };\n}\n\nfunction resolveNestedOptions$1(options) {\n if (options === true)\n return {};\n return options;\n}\nfunction useEventSource(url, events = [], options = {}) {\n const event = shallowRef(null);\n const data = shallowRef(null);\n const status = shallowRef(\"CONNECTING\");\n const eventSource = ref(null);\n const error = shallowRef(null);\n const urlRef = toRef(url);\n const lastEventId = shallowRef(null);\n let explicitlyClosed = false;\n let retried = 0;\n const {\n withCredentials = false,\n immediate = true,\n autoConnect = true,\n autoReconnect\n } = options;\n const close = () => {\n if (isClient && eventSource.value) {\n eventSource.value.close();\n eventSource.value = null;\n status.value = \"CLOSED\";\n explicitlyClosed = true;\n }\n };\n const _init = () => {\n if (explicitlyClosed || typeof urlRef.value === \"undefined\")\n return;\n const es = new EventSource(urlRef.value, { withCredentials });\n status.value = \"CONNECTING\";\n eventSource.value = es;\n es.onopen = () => {\n status.value = \"OPEN\";\n error.value = null;\n };\n es.onerror = (e) => {\n status.value = \"CLOSED\";\n error.value = e;\n if (es.readyState === 2 && !explicitlyClosed && autoReconnect) {\n es.close();\n const {\n retries = -1,\n delay = 1e3,\n onFailed\n } = resolveNestedOptions$1(autoReconnect);\n retried += 1;\n if (typeof retries === \"number\" && (retries < 0 || retried < retries))\n setTimeout(_init, delay);\n else if (typeof retries === \"function\" && retries())\n setTimeout(_init, delay);\n else\n onFailed == null ? void 0 : onFailed();\n }\n };\n es.onmessage = (e) => {\n event.value = null;\n data.value = e.data;\n lastEventId.value = e.lastEventId;\n };\n for (const event_name of events) {\n useEventListener(es, event_name, (e) => {\n event.value = event_name;\n data.value = e.data || null;\n }, { passive: true });\n }\n };\n const open = () => {\n if (!isClient)\n return;\n close();\n explicitlyClosed = false;\n retried = 0;\n _init();\n };\n if (immediate)\n open();\n if (autoConnect)\n watch(urlRef, open);\n tryOnScopeDispose(close);\n return {\n eventSource,\n event,\n data,\n status,\n error,\n open,\n close,\n lastEventId\n };\n}\n\nfunction useEyeDropper(options = {}) {\n const { initialValue = \"\" } = options;\n const isSupported = useSupported(() => typeof window !== \"undefined\" && \"EyeDropper\" in window);\n const sRGBHex = shallowRef(initialValue);\n async function open(openOptions) {\n if (!isSupported.value)\n return;\n const eyeDropper = new window.EyeDropper();\n const result = await eyeDropper.open(openOptions);\n sRGBHex.value = result.sRGBHex;\n return result;\n }\n return { isSupported, sRGBHex, open };\n}\n\nfunction useFavicon(newIcon = null, options = {}) {\n const {\n baseUrl = \"\",\n rel = \"icon\",\n document = defaultDocument\n } = options;\n const favicon = toRef(newIcon);\n const applyIcon = (icon) => {\n const elements = document == null ? void 0 : document.head.querySelectorAll(`link[rel*=\"${rel}\"]`);\n if (!elements || elements.length === 0) {\n const link = document == null ? void 0 : document.createElement(\"link\");\n if (link) {\n link.rel = rel;\n link.href = `${baseUrl}${icon}`;\n link.type = `image/${icon.split(\".\").pop()}`;\n document == null ? void 0 : document.head.append(link);\n }\n return;\n }\n elements == null ? void 0 : elements.forEach((el) => el.href = `${baseUrl}${icon}`);\n };\n watch(\n favicon,\n (i, o) => {\n if (typeof i === \"string\" && i !== o)\n applyIcon(i);\n },\n { immediate: true }\n );\n return favicon;\n}\n\nconst payloadMapping = {\n json: \"application/json\",\n text: \"text/plain\"\n};\nfunction isFetchOptions(obj) {\n return obj && containsProp(obj, \"immediate\", \"refetch\", \"initialData\", \"timeout\", \"beforeFetch\", \"afterFetch\", \"onFetchError\", \"fetch\", \"updateDataOnError\");\n}\nconst reAbsolute = /^(?:[a-z][a-z\\d+\\-.]*:)?\\/\\//i;\nfunction isAbsoluteURL(url) {\n return reAbsolute.test(url);\n}\nfunction headersToObject(headers) {\n if (typeof Headers !== \"undefined\" && headers instanceof Headers)\n return Object.fromEntries(headers.entries());\n return headers;\n}\nfunction combineCallbacks(combination, ...callbacks) {\n if (combination === \"overwrite\") {\n return async (ctx) => {\n let callback;\n for (let i = callbacks.length - 1; i >= 0; i--) {\n if (callbacks[i] != null) {\n callback = callbacks[i];\n break;\n }\n }\n if (callback)\n return { ...ctx, ...await callback(ctx) };\n return ctx;\n };\n } else {\n return async (ctx) => {\n for (const callback of callbacks) {\n if (callback)\n ctx = { ...ctx, ...await callback(ctx) };\n }\n return ctx;\n };\n }\n}\nfunction createFetch(config = {}) {\n const _combination = config.combination || \"chain\";\n const _options = config.options || {};\n const _fetchOptions = config.fetchOptions || {};\n function useFactoryFetch(url, ...args) {\n const computedUrl = computed(() => {\n const baseUrl = toValue(config.baseUrl);\n const targetUrl = toValue(url);\n return baseUrl && !isAbsoluteURL(targetUrl) ? joinPaths(baseUrl, targetUrl) : targetUrl;\n });\n let options = _options;\n let fetchOptions = _fetchOptions;\n if (args.length > 0) {\n if (isFetchOptions(args[0])) {\n options = {\n ...options,\n ...args[0],\n beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[0].beforeFetch),\n afterFetch: combineCallbacks(_combination, _options.afterFetch, args[0].afterFetch),\n onFetchError: combineCallbacks(_combination, _options.onFetchError, args[0].onFetchError)\n };\n } else {\n fetchOptions = {\n ...fetchOptions,\n ...args[0],\n headers: {\n ...headersToObject(fetchOptions.headers) || {},\n ...headersToObject(args[0].headers) || {}\n }\n };\n }\n }\n if (args.length > 1 && isFetchOptions(args[1])) {\n options = {\n ...options,\n ...args[1],\n beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[1].beforeFetch),\n afterFetch: combineCallbacks(_combination, _options.afterFetch, args[1].afterFetch),\n onFetchError: combineCallbacks(_combination, _options.onFetchError, args[1].onFetchError)\n };\n }\n return useFetch(computedUrl, fetchOptions, options);\n }\n return useFactoryFetch;\n}\nfunction useFetch(url, ...args) {\n var _a;\n const supportsAbort = typeof AbortController === \"function\";\n let fetchOptions = {};\n let options = {\n immediate: true,\n refetch: false,\n timeout: 0,\n updateDataOnError: false\n };\n const config = {\n method: \"GET\",\n type: \"text\",\n payload: void 0\n };\n if (args.length > 0) {\n if (isFetchOptions(args[0]))\n options = { ...options, ...args[0] };\n else\n fetchOptions = args[0];\n }\n if (args.length > 1) {\n if (isFetchOptions(args[1]))\n options = { ...options, ...args[1] };\n }\n const {\n fetch = (_a = defaultWindow) == null ? void 0 : _a.fetch,\n initialData,\n timeout\n } = options;\n const responseEvent = createEventHook();\n const errorEvent = createEventHook();\n const finallyEvent = createEventHook();\n const isFinished = shallowRef(false);\n const isFetching = shallowRef(false);\n const aborted = shallowRef(false);\n const statusCode = shallowRef(null);\n const response = shallowRef(null);\n const error = shallowRef(null);\n const data = shallowRef(initialData || null);\n const canAbort = computed(() => supportsAbort && isFetching.value);\n let controller;\n let timer;\n const abort = () => {\n if (supportsAbort) {\n controller == null ? void 0 : controller.abort();\n controller = new AbortController();\n controller.signal.onabort = () => aborted.value = true;\n fetchOptions = {\n ...fetchOptions,\n signal: controller.signal\n };\n }\n };\n const loading = (isLoading) => {\n isFetching.value = isLoading;\n isFinished.value = !isLoading;\n };\n if (timeout)\n timer = useTimeoutFn(abort, timeout, { immediate: false });\n let executeCounter = 0;\n const execute = async (throwOnFailed = false) => {\n var _a2, _b;\n abort();\n loading(true);\n error.value = null;\n statusCode.value = null;\n aborted.value = false;\n executeCounter += 1;\n const currentExecuteCounter = executeCounter;\n const defaultFetchOptions = {\n method: config.method,\n headers: {}\n };\n const payload = toValue(config.payload);\n if (payload) {\n const headers = headersToObject(defaultFetchOptions.headers);\n const proto = Object.getPrototypeOf(payload);\n if (!config.payloadType && payload && (proto === Object.prototype || Array.isArray(proto)) && !(payload instanceof FormData))\n config.payloadType = \"json\";\n if (config.payloadType)\n headers[\"Content-Type\"] = (_a2 = payloadMapping[config.payloadType]) != null ? _a2 : config.payloadType;\n defaultFetchOptions.body = config.payloadType === \"json\" ? JSON.stringify(payload) : payload;\n }\n let isCanceled = false;\n const context = {\n url: toValue(url),\n options: {\n ...defaultFetchOptions,\n ...fetchOptions\n },\n cancel: () => {\n isCanceled = true;\n }\n };\n if (options.beforeFetch)\n Object.assign(context, await options.beforeFetch(context));\n if (isCanceled || !fetch) {\n loading(false);\n return Promise.resolve(null);\n }\n let responseData = null;\n if (timer)\n timer.start();\n return fetch(\n context.url,\n {\n ...defaultFetchOptions,\n ...context.options,\n headers: {\n ...headersToObject(defaultFetchOptions.headers),\n ...headersToObject((_b = context.options) == null ? void 0 : _b.headers)\n }\n }\n ).then(async (fetchResponse) => {\n response.value = fetchResponse;\n statusCode.value = fetchResponse.status;\n responseData = await fetchResponse.clone()[config.type]();\n if (!fetchResponse.ok) {\n data.value = initialData || null;\n throw new Error(fetchResponse.statusText);\n }\n if (options.afterFetch) {\n ({ data: responseData } = await options.afterFetch({\n data: responseData,\n response: fetchResponse,\n context,\n execute\n }));\n }\n data.value = responseData;\n responseEvent.trigger(fetchResponse);\n return fetchResponse;\n }).catch(async (fetchError) => {\n let errorData = fetchError.message || fetchError.name;\n if (options.onFetchError) {\n ({ error: errorData, data: responseData } = await options.onFetchError({\n data: responseData,\n error: fetchError,\n response: response.value,\n context,\n execute\n }));\n }\n error.value = errorData;\n if (options.updateDataOnError)\n data.value = responseData;\n errorEvent.trigger(fetchError);\n if (throwOnFailed)\n throw fetchError;\n return null;\n }).finally(() => {\n if (currentExecuteCounter === executeCounter)\n loading(false);\n if (timer)\n timer.stop();\n finallyEvent.trigger(null);\n });\n };\n const refetch = toRef(options.refetch);\n watch(\n [\n refetch,\n toRef(url)\n ],\n ([refetch2]) => refetch2 && execute(),\n { deep: true }\n );\n const shell = {\n isFinished: readonly(isFinished),\n isFetching: readonly(isFetching),\n statusCode,\n response,\n error,\n data,\n canAbort,\n aborted,\n abort,\n execute,\n onFetchResponse: responseEvent.on,\n onFetchError: errorEvent.on,\n onFetchFinally: finallyEvent.on,\n // method\n get: setMethod(\"GET\"),\n put: setMethod(\"PUT\"),\n post: setMethod(\"POST\"),\n delete: setMethod(\"DELETE\"),\n patch: setMethod(\"PATCH\"),\n head: setMethod(\"HEAD\"),\n options: setMethod(\"OPTIONS\"),\n // type\n json: setType(\"json\"),\n text: setType(\"text\"),\n blob: setType(\"blob\"),\n arrayBuffer: setType(\"arrayBuffer\"),\n formData: setType(\"formData\")\n };\n function setMethod(method) {\n return (payload, payloadType) => {\n if (!isFetching.value) {\n config.method = method;\n config.payload = payload;\n config.payloadType = payloadType;\n if (isRef(config.payload)) {\n watch(\n [\n refetch,\n toRef(config.payload)\n ],\n ([refetch2]) => refetch2 && execute(),\n { deep: true }\n );\n }\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n };\n }\n return void 0;\n };\n }\n function waitUntilFinished() {\n return new Promise((resolve, reject) => {\n until(isFinished).toBe(true).then(() => resolve(shell)).catch(reject);\n });\n }\n function setType(type) {\n return () => {\n if (!isFetching.value) {\n config.type = type;\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n };\n }\n return void 0;\n };\n }\n if (options.immediate)\n Promise.resolve().then(() => execute());\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n };\n}\nfunction joinPaths(start, end) {\n if (!start.endsWith(\"/\") && !end.startsWith(\"/\")) {\n return `${start}/${end}`;\n }\n if (start.endsWith(\"/\") && end.startsWith(\"/\")) {\n return `${start.slice(0, -1)}${end}`;\n }\n return `${start}${end}`;\n}\n\nconst DEFAULT_OPTIONS = {\n multiple: true,\n accept: \"*\",\n reset: false,\n directory: false\n};\nfunction prepareInitialFiles(files) {\n if (!files)\n return null;\n if (files instanceof FileList)\n return files;\n const dt = new DataTransfer();\n for (const file of files) {\n dt.items.add(file);\n }\n return dt.files;\n}\nfunction useFileDialog(options = {}) {\n const {\n document = defaultDocument\n } = options;\n const files = ref(prepareInitialFiles(options.initialFiles));\n const { on: onChange, trigger: changeTrigger } = createEventHook();\n const { on: onCancel, trigger: cancelTrigger } = createEventHook();\n let input;\n if (document) {\n input = document.createElement(\"input\");\n input.type = \"file\";\n input.onchange = (event) => {\n const result = event.target;\n files.value = result.files;\n changeTrigger(files.value);\n };\n input.oncancel = () => {\n cancelTrigger();\n };\n }\n const reset = () => {\n files.value = null;\n if (input && input.value) {\n input.value = \"\";\n changeTrigger(null);\n }\n };\n const open = (localOptions) => {\n if (!input)\n return;\n const _options = {\n ...DEFAULT_OPTIONS,\n ...options,\n ...localOptions\n };\n input.multiple = _options.multiple;\n input.accept = _options.accept;\n input.webkitdirectory = _options.directory;\n if (hasOwn(_options, \"capture\"))\n input.capture = _options.capture;\n if (_options.reset)\n reset();\n input.click();\n };\n return {\n files: readonly(files),\n open,\n reset,\n onCancel,\n onChange\n };\n}\n\nfunction useFileSystemAccess(options = {}) {\n const {\n window: _window = defaultWindow,\n dataType = \"Text\"\n } = options;\n const window = _window;\n const isSupported = useSupported(() => window && \"showSaveFilePicker\" in window && \"showOpenFilePicker\" in window);\n const fileHandle = shallowRef();\n const data = shallowRef();\n const file = shallowRef();\n const fileName = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.name) != null ? _b : \"\";\n });\n const fileMIME = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.type) != null ? _b : \"\";\n });\n const fileSize = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.size) != null ? _b : 0;\n });\n const fileLastModified = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.lastModified) != null ? _b : 0;\n });\n async function open(_options = {}) {\n if (!isSupported.value)\n return;\n const [handle] = await window.showOpenFilePicker({ ...toValue(options), ..._options });\n fileHandle.value = handle;\n await updateData();\n }\n async function create(_options = {}) {\n if (!isSupported.value)\n return;\n fileHandle.value = await window.showSaveFilePicker({ ...options, ..._options });\n data.value = void 0;\n await updateData();\n }\n async function save(_options = {}) {\n if (!isSupported.value)\n return;\n if (!fileHandle.value)\n return saveAs(_options);\n if (data.value) {\n const writableStream = await fileHandle.value.createWritable();\n await writableStream.write(data.value);\n await writableStream.close();\n }\n await updateFile();\n }\n async function saveAs(_options = {}) {\n if (!isSupported.value)\n return;\n fileHandle.value = await window.showSaveFilePicker({ ...options, ..._options });\n if (data.value) {\n const writableStream = await fileHandle.value.createWritable();\n await writableStream.write(data.value);\n await writableStream.close();\n }\n await updateFile();\n }\n async function updateFile() {\n var _a;\n file.value = await ((_a = fileHandle.value) == null ? void 0 : _a.getFile());\n }\n async function updateData() {\n var _a, _b;\n await updateFile();\n const type = toValue(dataType);\n if (type === \"Text\")\n data.value = await ((_a = file.value) == null ? void 0 : _a.text());\n else if (type === \"ArrayBuffer\")\n data.value = await ((_b = file.value) == null ? void 0 : _b.arrayBuffer());\n else if (type === \"Blob\")\n data.value = file.value;\n }\n watch(() => toValue(dataType), updateData);\n return {\n isSupported,\n data,\n file,\n fileName,\n fileMIME,\n fileSize,\n fileLastModified,\n open,\n create,\n save,\n saveAs,\n updateData\n };\n}\n\nfunction useFocus(target, options = {}) {\n const { initialValue = false, focusVisible = false, preventScroll = false } = options;\n const innerFocused = shallowRef(false);\n const targetElement = computed(() => unrefElement(target));\n const listenerOptions = { passive: true };\n useEventListener(targetElement, \"focus\", (event) => {\n var _a, _b;\n if (!focusVisible || ((_b = (_a = event.target).matches) == null ? void 0 : _b.call(_a, \":focus-visible\")))\n innerFocused.value = true;\n }, listenerOptions);\n useEventListener(targetElement, \"blur\", () => innerFocused.value = false, listenerOptions);\n const focused = computed({\n get: () => innerFocused.value,\n set(value) {\n var _a, _b;\n if (!value && innerFocused.value)\n (_a = targetElement.value) == null ? void 0 : _a.blur();\n else if (value && !innerFocused.value)\n (_b = targetElement.value) == null ? void 0 : _b.focus({ preventScroll });\n }\n });\n watch(\n targetElement,\n () => {\n focused.value = initialValue;\n },\n { immediate: true, flush: \"post\" }\n );\n return { focused };\n}\n\nconst EVENT_FOCUS_IN = \"focusin\";\nconst EVENT_FOCUS_OUT = \"focusout\";\nconst PSEUDO_CLASS_FOCUS_WITHIN = \":focus-within\";\nfunction useFocusWithin(target, options = {}) {\n const { window = defaultWindow } = options;\n const targetElement = computed(() => unrefElement(target));\n const _focused = shallowRef(false);\n const focused = computed(() => _focused.value);\n const activeElement = useActiveElement(options);\n if (!window || !activeElement.value) {\n return { focused };\n }\n const listenerOptions = { passive: true };\n useEventListener(targetElement, EVENT_FOCUS_IN, () => _focused.value = true, listenerOptions);\n useEventListener(targetElement, EVENT_FOCUS_OUT, () => {\n var _a, _b, _c;\n return _focused.value = (_c = (_b = (_a = targetElement.value) == null ? void 0 : _a.matches) == null ? void 0 : _b.call(_a, PSEUDO_CLASS_FOCUS_WITHIN)) != null ? _c : false;\n }, listenerOptions);\n return { focused };\n}\n\nfunction useFps(options) {\n var _a;\n const fps = shallowRef(0);\n if (typeof performance === \"undefined\")\n return fps;\n const every = (_a = options == null ? void 0 : options.every) != null ? _a : 10;\n let last = performance.now();\n let ticks = 0;\n useRafFn(() => {\n ticks += 1;\n if (ticks >= every) {\n const now = performance.now();\n const diff = now - last;\n fps.value = Math.round(1e3 / (diff / ticks));\n last = now;\n ticks = 0;\n }\n });\n return fps;\n}\n\nconst eventHandlers = [\n \"fullscreenchange\",\n \"webkitfullscreenchange\",\n \"webkitendfullscreen\",\n \"mozfullscreenchange\",\n \"MSFullscreenChange\"\n];\nfunction useFullscreen(target, options = {}) {\n const {\n document = defaultDocument,\n autoExit = false\n } = options;\n const targetRef = computed(() => {\n var _a;\n return (_a = unrefElement(target)) != null ? _a : document == null ? void 0 : document.documentElement;\n });\n const isFullscreen = shallowRef(false);\n const requestMethod = computed(() => {\n return [\n \"requestFullscreen\",\n \"webkitRequestFullscreen\",\n \"webkitEnterFullscreen\",\n \"webkitEnterFullScreen\",\n \"webkitRequestFullScreen\",\n \"mozRequestFullScreen\",\n \"msRequestFullscreen\"\n ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n });\n const exitMethod = computed(() => {\n return [\n \"exitFullscreen\",\n \"webkitExitFullscreen\",\n \"webkitExitFullScreen\",\n \"webkitCancelFullScreen\",\n \"mozCancelFullScreen\",\n \"msExitFullscreen\"\n ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n });\n const fullscreenEnabled = computed(() => {\n return [\n \"fullScreen\",\n \"webkitIsFullScreen\",\n \"webkitDisplayingFullscreen\",\n \"mozFullScreen\",\n \"msFullscreenElement\"\n ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n });\n const fullscreenElementMethod = [\n \"fullscreenElement\",\n \"webkitFullscreenElement\",\n \"mozFullScreenElement\",\n \"msFullscreenElement\"\n ].find((m) => document && m in document);\n const isSupported = useSupported(() => targetRef.value && document && requestMethod.value !== void 0 && exitMethod.value !== void 0 && fullscreenEnabled.value !== void 0);\n const isCurrentElementFullScreen = () => {\n if (fullscreenElementMethod)\n return (document == null ? void 0 : document[fullscreenElementMethod]) === targetRef.value;\n return false;\n };\n const isElementFullScreen = () => {\n if (fullscreenEnabled.value) {\n if (document && document[fullscreenEnabled.value] != null) {\n return document[fullscreenEnabled.value];\n } else {\n const target2 = targetRef.value;\n if ((target2 == null ? void 0 : target2[fullscreenEnabled.value]) != null) {\n return Boolean(target2[fullscreenEnabled.value]);\n }\n }\n }\n return false;\n };\n async function exit() {\n if (!isSupported.value || !isFullscreen.value)\n return;\n if (exitMethod.value) {\n if ((document == null ? void 0 : document[exitMethod.value]) != null) {\n await document[exitMethod.value]();\n } else {\n const target2 = targetRef.value;\n if ((target2 == null ? void 0 : target2[exitMethod.value]) != null)\n await target2[exitMethod.value]();\n }\n }\n isFullscreen.value = false;\n }\n async function enter() {\n if (!isSupported.value || isFullscreen.value)\n return;\n if (isElementFullScreen())\n await exit();\n const target2 = targetRef.value;\n if (requestMethod.value && (target2 == null ? void 0 : target2[requestMethod.value]) != null) {\n await target2[requestMethod.value]();\n isFullscreen.value = true;\n }\n }\n async function toggle() {\n await (isFullscreen.value ? exit() : enter());\n }\n const handlerCallback = () => {\n const isElementFullScreenValue = isElementFullScreen();\n if (!isElementFullScreenValue || isElementFullScreenValue && isCurrentElementFullScreen())\n isFullscreen.value = isElementFullScreenValue;\n };\n const listenerOptions = { capture: false, passive: true };\n useEventListener(document, eventHandlers, handlerCallback, listenerOptions);\n useEventListener(() => unrefElement(targetRef), eventHandlers, handlerCallback, listenerOptions);\n if (autoExit)\n tryOnScopeDispose(exit);\n return {\n isSupported,\n isFullscreen,\n enter,\n exit,\n toggle\n };\n}\n\nfunction mapGamepadToXbox360Controller(gamepad) {\n return computed(() => {\n if (gamepad.value) {\n return {\n buttons: {\n a: gamepad.value.buttons[0],\n b: gamepad.value.buttons[1],\n x: gamepad.value.buttons[2],\n y: gamepad.value.buttons[3]\n },\n bumper: {\n left: gamepad.value.buttons[4],\n right: gamepad.value.buttons[5]\n },\n triggers: {\n left: gamepad.value.buttons[6],\n right: gamepad.value.buttons[7]\n },\n stick: {\n left: {\n horizontal: gamepad.value.axes[0],\n vertical: gamepad.value.axes[1],\n button: gamepad.value.buttons[10]\n },\n right: {\n horizontal: gamepad.value.axes[2],\n vertical: gamepad.value.axes[3],\n button: gamepad.value.buttons[11]\n }\n },\n dpad: {\n up: gamepad.value.buttons[12],\n down: gamepad.value.buttons[13],\n left: gamepad.value.buttons[14],\n right: gamepad.value.buttons[15]\n },\n back: gamepad.value.buttons[8],\n start: gamepad.value.buttons[9]\n };\n }\n return null;\n });\n}\nfunction useGamepad(options = {}) {\n const {\n navigator = defaultNavigator\n } = options;\n const isSupported = useSupported(() => navigator && \"getGamepads\" in navigator);\n const gamepads = ref([]);\n const onConnectedHook = createEventHook();\n const onDisconnectedHook = createEventHook();\n const stateFromGamepad = (gamepad) => {\n const hapticActuators = [];\n const vibrationActuator = \"vibrationActuator\" in gamepad ? gamepad.vibrationActuator : null;\n if (vibrationActuator)\n hapticActuators.push(vibrationActuator);\n if (gamepad.hapticActuators)\n hapticActuators.push(...gamepad.hapticActuators);\n return {\n id: gamepad.id,\n index: gamepad.index,\n connected: gamepad.connected,\n mapping: gamepad.mapping,\n timestamp: gamepad.timestamp,\n vibrationActuator: gamepad.vibrationActuator,\n hapticActuators,\n axes: gamepad.axes.map((axes) => axes),\n buttons: gamepad.buttons.map((button) => ({ pressed: button.pressed, touched: button.touched, value: button.value }))\n };\n };\n const updateGamepadState = () => {\n const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || [];\n for (const gamepad of _gamepads) {\n if (gamepad && gamepads.value[gamepad.index])\n gamepads.value[gamepad.index] = stateFromGamepad(gamepad);\n }\n };\n const { isActive, pause, resume } = useRafFn(updateGamepadState);\n const onGamepadConnected = (gamepad) => {\n if (!gamepads.value.some(({ index }) => index === gamepad.index)) {\n gamepads.value.push(stateFromGamepad(gamepad));\n onConnectedHook.trigger(gamepad.index);\n }\n resume();\n };\n const onGamepadDisconnected = (gamepad) => {\n gamepads.value = gamepads.value.filter((x) => x.index !== gamepad.index);\n onDisconnectedHook.trigger(gamepad.index);\n };\n const listenerOptions = { passive: true };\n useEventListener(\"gamepadconnected\", (e) => onGamepadConnected(e.gamepad), listenerOptions);\n useEventListener(\"gamepaddisconnected\", (e) => onGamepadDisconnected(e.gamepad), listenerOptions);\n tryOnMounted(() => {\n const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || [];\n for (const gamepad of _gamepads) {\n if (gamepad && gamepads.value[gamepad.index])\n onGamepadConnected(gamepad);\n }\n });\n pause();\n return {\n isSupported,\n onConnected: onConnectedHook.on,\n onDisconnected: onDisconnectedHook.on,\n gamepads,\n pause,\n resume,\n isActive\n };\n}\n\nfunction useGeolocation(options = {}) {\n const {\n enableHighAccuracy = true,\n maximumAge = 3e4,\n timeout = 27e3,\n navigator = defaultNavigator,\n immediate = true\n } = options;\n const isSupported = useSupported(() => navigator && \"geolocation\" in navigator);\n const locatedAt = shallowRef(null);\n const error = shallowRef(null);\n const coords = ref({\n accuracy: 0,\n latitude: Number.POSITIVE_INFINITY,\n longitude: Number.POSITIVE_INFINITY,\n altitude: null,\n altitudeAccuracy: null,\n heading: null,\n speed: null\n });\n function updatePosition(position) {\n locatedAt.value = position.timestamp;\n coords.value = position.coords;\n error.value = null;\n }\n let watcher;\n function resume() {\n if (isSupported.value) {\n watcher = navigator.geolocation.watchPosition(\n updatePosition,\n (err) => error.value = err,\n {\n enableHighAccuracy,\n maximumAge,\n timeout\n }\n );\n }\n }\n if (immediate)\n resume();\n function pause() {\n if (watcher && navigator)\n navigator.geolocation.clearWatch(watcher);\n }\n tryOnScopeDispose(() => {\n pause();\n });\n return {\n isSupported,\n coords,\n locatedAt,\n error,\n resume,\n pause\n };\n}\n\nconst defaultEvents$1 = [\"mousemove\", \"mousedown\", \"resize\", \"keydown\", \"touchstart\", \"wheel\"];\nconst oneMinute = 6e4;\nfunction useIdle(timeout = oneMinute, options = {}) {\n const {\n initialState = false,\n listenForVisibilityChange = true,\n events = defaultEvents$1,\n window = defaultWindow,\n eventFilter = throttleFilter(50)\n } = options;\n const idle = shallowRef(initialState);\n const lastActive = shallowRef(timestamp());\n let timer;\n const reset = () => {\n idle.value = false;\n clearTimeout(timer);\n timer = setTimeout(() => idle.value = true, timeout);\n };\n const onEvent = createFilterWrapper(\n eventFilter,\n () => {\n lastActive.value = timestamp();\n reset();\n }\n );\n if (window) {\n const document = window.document;\n const listenerOptions = { passive: true };\n for (const event of events)\n useEventListener(window, event, onEvent, listenerOptions);\n if (listenForVisibilityChange) {\n useEventListener(document, \"visibilitychange\", () => {\n if (!document.hidden)\n onEvent();\n }, listenerOptions);\n }\n reset();\n }\n return {\n idle,\n lastActive,\n reset\n };\n}\n\nasync function loadImage(options) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n const { src, srcset, sizes, class: clazz, loading, crossorigin, referrerPolicy, width, height, decoding, fetchPriority, ismap, usemap } = options;\n img.src = src;\n if (srcset != null)\n img.srcset = srcset;\n if (sizes != null)\n img.sizes = sizes;\n if (clazz != null)\n img.className = clazz;\n if (loading != null)\n img.loading = loading;\n if (crossorigin != null)\n img.crossOrigin = crossorigin;\n if (referrerPolicy != null)\n img.referrerPolicy = referrerPolicy;\n if (width != null)\n img.width = width;\n if (height != null)\n img.height = height;\n if (decoding != null)\n img.decoding = decoding;\n if (fetchPriority != null)\n img.fetchPriority = fetchPriority;\n if (ismap != null)\n img.isMap = ismap;\n if (usemap != null)\n img.useMap = usemap;\n img.onload = () => resolve(img);\n img.onerror = reject;\n });\n}\nfunction useImage(options, asyncStateOptions = {}) {\n const state = useAsyncState(\n () => loadImage(toValue(options)),\n void 0,\n {\n resetOnExecute: true,\n ...asyncStateOptions\n }\n );\n watch(\n () => toValue(options),\n () => state.execute(asyncStateOptions.delay),\n { deep: true }\n );\n return state;\n}\n\nfunction resolveElement(el) {\n if (typeof Window !== \"undefined\" && el instanceof Window)\n return el.document.documentElement;\n if (typeof Document !== \"undefined\" && el instanceof Document)\n return el.documentElement;\n return el;\n}\n\nconst ARRIVED_STATE_THRESHOLD_PIXELS = 1;\nfunction useScroll(element, options = {}) {\n const {\n throttle = 0,\n idle = 200,\n onStop = noop,\n onScroll = noop,\n offset = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n },\n eventListenerOptions = {\n capture: false,\n passive: true\n },\n behavior = \"auto\",\n window = defaultWindow,\n onError = (e) => {\n console.error(e);\n }\n } = options;\n const internalX = shallowRef(0);\n const internalY = shallowRef(0);\n const x = computed({\n get() {\n return internalX.value;\n },\n set(x2) {\n scrollTo(x2, void 0);\n }\n });\n const y = computed({\n get() {\n return internalY.value;\n },\n set(y2) {\n scrollTo(void 0, y2);\n }\n });\n function scrollTo(_x, _y) {\n var _a, _b, _c, _d;\n if (!window)\n return;\n const _element = toValue(element);\n if (!_element)\n return;\n (_c = _element instanceof Document ? window.document.body : _element) == null ? void 0 : _c.scrollTo({\n top: (_a = toValue(_y)) != null ? _a : y.value,\n left: (_b = toValue(_x)) != null ? _b : x.value,\n behavior: toValue(behavior)\n });\n const scrollContainer = ((_d = _element == null ? void 0 : _element.document) == null ? void 0 : _d.documentElement) || (_element == null ? void 0 : _element.documentElement) || _element;\n if (x != null)\n internalX.value = scrollContainer.scrollLeft;\n if (y != null)\n internalY.value = scrollContainer.scrollTop;\n }\n const isScrolling = shallowRef(false);\n const arrivedState = reactive({\n left: true,\n right: false,\n top: true,\n bottom: false\n });\n const directions = reactive({\n left: false,\n right: false,\n top: false,\n bottom: false\n });\n const onScrollEnd = (e) => {\n if (!isScrolling.value)\n return;\n isScrolling.value = false;\n directions.left = false;\n directions.right = false;\n directions.top = false;\n directions.bottom = false;\n onStop(e);\n };\n const onScrollEndDebounced = useDebounceFn(onScrollEnd, throttle + idle);\n const setArrivedState = (target) => {\n var _a;\n if (!window)\n return;\n const el = ((_a = target == null ? void 0 : target.document) == null ? void 0 : _a.documentElement) || (target == null ? void 0 : target.documentElement) || unrefElement(target);\n const { display, flexDirection, direction } = getComputedStyle(el);\n const directionMultipler = direction === \"rtl\" ? -1 : 1;\n const scrollLeft = el.scrollLeft;\n directions.left = scrollLeft < internalX.value;\n directions.right = scrollLeft > internalX.value;\n const left = Math.abs(scrollLeft * directionMultipler) <= (offset.left || 0);\n const right = Math.abs(scrollLeft * directionMultipler) + el.clientWidth >= el.scrollWidth - (offset.right || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n if (display === \"flex\" && flexDirection === \"row-reverse\") {\n arrivedState.left = right;\n arrivedState.right = left;\n } else {\n arrivedState.left = left;\n arrivedState.right = right;\n }\n internalX.value = scrollLeft;\n let scrollTop = el.scrollTop;\n if (target === window.document && !scrollTop)\n scrollTop = window.document.body.scrollTop;\n directions.top = scrollTop < internalY.value;\n directions.bottom = scrollTop > internalY.value;\n const top = Math.abs(scrollTop) <= (offset.top || 0);\n const bottom = Math.abs(scrollTop) + el.clientHeight >= el.scrollHeight - (offset.bottom || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n if (display === \"flex\" && flexDirection === \"column-reverse\") {\n arrivedState.top = bottom;\n arrivedState.bottom = top;\n } else {\n arrivedState.top = top;\n arrivedState.bottom = bottom;\n }\n internalY.value = scrollTop;\n };\n const onScrollHandler = (e) => {\n var _a;\n if (!window)\n return;\n const eventTarget = (_a = e.target.documentElement) != null ? _a : e.target;\n setArrivedState(eventTarget);\n isScrolling.value = true;\n onScrollEndDebounced(e);\n onScroll(e);\n };\n useEventListener(\n element,\n \"scroll\",\n throttle ? useThrottleFn(onScrollHandler, throttle, true, false) : onScrollHandler,\n eventListenerOptions\n );\n tryOnMounted(() => {\n try {\n const _element = toValue(element);\n if (!_element)\n return;\n setArrivedState(_element);\n } catch (e) {\n onError(e);\n }\n });\n useEventListener(\n element,\n \"scrollend\",\n onScrollEnd,\n eventListenerOptions\n );\n return {\n x,\n y,\n isScrolling,\n arrivedState,\n directions,\n measure() {\n const _element = toValue(element);\n if (window && _element)\n setArrivedState(_element);\n }\n };\n}\n\nfunction useInfiniteScroll(element, onLoadMore, options = {}) {\n var _a;\n const {\n direction = \"bottom\",\n interval = 100,\n canLoadMore = () => true\n } = options;\n const state = reactive(useScroll(\n element,\n {\n ...options,\n offset: {\n [direction]: (_a = options.distance) != null ? _a : 0,\n ...options.offset\n }\n }\n ));\n const promise = ref();\n const isLoading = computed(() => !!promise.value);\n const observedElement = computed(() => {\n return resolveElement(toValue(element));\n });\n const isElementVisible = useElementVisibility(observedElement);\n function checkAndLoad() {\n state.measure();\n if (!observedElement.value || !isElementVisible.value || !canLoadMore(observedElement.value))\n return;\n const { scrollHeight, clientHeight, scrollWidth, clientWidth } = observedElement.value;\n const isNarrower = direction === \"bottom\" || direction === \"top\" ? scrollHeight <= clientHeight : scrollWidth <= clientWidth;\n if (state.arrivedState[direction] || isNarrower) {\n if (!promise.value) {\n promise.value = Promise.all([\n onLoadMore(state),\n new Promise((resolve) => setTimeout(resolve, interval))\n ]).finally(() => {\n promise.value = null;\n nextTick(() => checkAndLoad());\n });\n }\n }\n }\n const stop = watch(\n () => [state.arrivedState[direction], isElementVisible.value],\n checkAndLoad,\n { immediate: true }\n );\n tryOnUnmounted(stop);\n return {\n isLoading,\n reset() {\n nextTick(() => checkAndLoad());\n }\n };\n}\n\nconst defaultEvents = [\"mousedown\", \"mouseup\", \"keydown\", \"keyup\"];\nfunction useKeyModifier(modifier, options = {}) {\n const {\n events = defaultEvents,\n document = defaultDocument,\n initial = null\n } = options;\n const state = shallowRef(initial);\n if (document) {\n events.forEach((listenerEvent) => {\n useEventListener(document, listenerEvent, (evt) => {\n if (typeof evt.getModifierState === \"function\")\n state.value = evt.getModifierState(modifier);\n }, { passive: true });\n });\n }\n return state;\n}\n\nfunction useLocalStorage(key, initialValue, options = {}) {\n const { window = defaultWindow } = options;\n return useStorage(key, initialValue, window == null ? void 0 : window.localStorage, options);\n}\n\nconst DefaultMagicKeysAliasMap = {\n ctrl: \"control\",\n command: \"meta\",\n cmd: \"meta\",\n option: \"alt\",\n up: \"arrowup\",\n down: \"arrowdown\",\n left: \"arrowleft\",\n right: \"arrowright\"\n};\n\nfunction useMagicKeys(options = {}) {\n const {\n reactive: useReactive = false,\n target = defaultWindow,\n aliasMap = DefaultMagicKeysAliasMap,\n passive = true,\n onEventFired = noop\n } = options;\n const current = reactive(/* @__PURE__ */ new Set());\n const obj = {\n toJSON() {\n return {};\n },\n current\n };\n const refs = useReactive ? reactive(obj) : obj;\n const metaDeps = /* @__PURE__ */ new Set();\n const usedKeys = /* @__PURE__ */ new Set();\n function setRefs(key, value) {\n if (key in refs) {\n if (useReactive)\n refs[key] = value;\n else\n refs[key].value = value;\n }\n }\n function reset() {\n current.clear();\n for (const key of usedKeys)\n setRefs(key, false);\n }\n function updateRefs(e, value) {\n var _a, _b;\n const key = (_a = e.key) == null ? void 0 : _a.toLowerCase();\n const code = (_b = e.code) == null ? void 0 : _b.toLowerCase();\n const values = [code, key].filter(Boolean);\n if (key) {\n if (value)\n current.add(key);\n else\n current.delete(key);\n }\n for (const key2 of values) {\n usedKeys.add(key2);\n setRefs(key2, value);\n }\n if (key === \"meta\" && !value) {\n metaDeps.forEach((key2) => {\n current.delete(key2);\n setRefs(key2, false);\n });\n metaDeps.clear();\n } else if (typeof e.getModifierState === \"function\" && e.getModifierState(\"Meta\") && value) {\n [...current, ...values].forEach((key2) => metaDeps.add(key2));\n }\n }\n useEventListener(target, \"keydown\", (e) => {\n updateRefs(e, true);\n return onEventFired(e);\n }, { passive });\n useEventListener(target, \"keyup\", (e) => {\n updateRefs(e, false);\n return onEventFired(e);\n }, { passive });\n useEventListener(\"blur\", reset, { passive });\n useEventListener(\"focus\", reset, { passive });\n const proxy = new Proxy(\n refs,\n {\n get(target2, prop, rec) {\n if (typeof prop !== \"string\")\n return Reflect.get(target2, prop, rec);\n prop = prop.toLowerCase();\n if (prop in aliasMap)\n prop = aliasMap[prop];\n if (!(prop in refs)) {\n if (/[+_-]/.test(prop)) {\n const keys = prop.split(/[+_-]/g).map((i) => i.trim());\n refs[prop] = computed(() => keys.map((key) => toValue(proxy[key])).every(Boolean));\n } else {\n refs[prop] = shallowRef(false);\n }\n }\n const r = Reflect.get(target2, prop, rec);\n return useReactive ? toValue(r) : r;\n }\n }\n );\n return proxy;\n}\n\nfunction usingElRef(source, cb) {\n if (toValue(source))\n cb(toValue(source));\n}\nfunction timeRangeToArray(timeRanges) {\n let ranges = [];\n for (let i = 0; i < timeRanges.length; ++i)\n ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]];\n return ranges;\n}\nfunction tracksToArray(tracks) {\n return Array.from(tracks).map(({ label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }, id) => ({ id, label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }));\n}\nconst defaultOptions = {\n src: \"\",\n tracks: []\n};\nfunction useMediaControls(target, options = {}) {\n target = toRef(target);\n options = {\n ...defaultOptions,\n ...options\n };\n const {\n document = defaultDocument\n } = options;\n const listenerOptions = { passive: true };\n const currentTime = shallowRef(0);\n const duration = shallowRef(0);\n const seeking = shallowRef(false);\n const volume = shallowRef(1);\n const waiting = shallowRef(false);\n const ended = shallowRef(false);\n const playing = shallowRef(false);\n const rate = shallowRef(1);\n const stalled = shallowRef(false);\n const buffered = ref([]);\n const tracks = ref([]);\n const selectedTrack = shallowRef(-1);\n const isPictureInPicture = shallowRef(false);\n const muted = shallowRef(false);\n const supportsPictureInPicture = document && \"pictureInPictureEnabled\" in document;\n const sourceErrorEvent = createEventHook();\n const playbackErrorEvent = createEventHook();\n const disableTrack = (track) => {\n usingElRef(target, (el) => {\n if (track) {\n const id = typeof track === \"number\" ? track : track.id;\n el.textTracks[id].mode = \"disabled\";\n } else {\n for (let i = 0; i < el.textTracks.length; ++i)\n el.textTracks[i].mode = \"disabled\";\n }\n selectedTrack.value = -1;\n });\n };\n const enableTrack = (track, disableTracks = true) => {\n usingElRef(target, (el) => {\n const id = typeof track === \"number\" ? track : track.id;\n if (disableTracks)\n disableTrack();\n el.textTracks[id].mode = \"showing\";\n selectedTrack.value = id;\n });\n };\n const togglePictureInPicture = () => {\n return new Promise((resolve, reject) => {\n usingElRef(target, async (el) => {\n if (supportsPictureInPicture) {\n if (!isPictureInPicture.value) {\n el.requestPictureInPicture().then(resolve).catch(reject);\n } else {\n document.exitPictureInPicture().then(resolve).catch(reject);\n }\n }\n });\n });\n };\n watchEffect(() => {\n if (!document)\n return;\n const el = toValue(target);\n if (!el)\n return;\n const src = toValue(options.src);\n let sources = [];\n if (!src)\n return;\n if (typeof src === \"string\")\n sources = [{ src }];\n else if (Array.isArray(src))\n sources = src;\n else if (isObject(src))\n sources = [src];\n el.querySelectorAll(\"source\").forEach((e) => {\n e.remove();\n });\n sources.forEach(({ src: src2, type, media }) => {\n const source = document.createElement(\"source\");\n source.setAttribute(\"src\", src2);\n source.setAttribute(\"type\", type || \"\");\n source.setAttribute(\"media\", media || \"\");\n useEventListener(source, \"error\", sourceErrorEvent.trigger, listenerOptions);\n el.appendChild(source);\n });\n el.load();\n });\n watch([target, volume], () => {\n const el = toValue(target);\n if (!el)\n return;\n el.volume = volume.value;\n });\n watch([target, muted], () => {\n const el = toValue(target);\n if (!el)\n return;\n el.muted = muted.value;\n });\n watch([target, rate], () => {\n const el = toValue(target);\n if (!el)\n return;\n el.playbackRate = rate.value;\n });\n watchEffect(() => {\n if (!document)\n return;\n const textTracks = toValue(options.tracks);\n const el = toValue(target);\n if (!textTracks || !textTracks.length || !el)\n return;\n el.querySelectorAll(\"track\").forEach((e) => e.remove());\n textTracks.forEach(({ default: isDefault, kind, label, src, srcLang }, i) => {\n const track = document.createElement(\"track\");\n track.default = isDefault || false;\n track.kind = kind;\n track.label = label;\n track.src = src;\n track.srclang = srcLang;\n if (track.default)\n selectedTrack.value = i;\n el.appendChild(track);\n });\n });\n const { ignoreUpdates: ignoreCurrentTimeUpdates } = watchIgnorable(currentTime, (time) => {\n const el = toValue(target);\n if (!el)\n return;\n el.currentTime = time;\n });\n const { ignoreUpdates: ignorePlayingUpdates } = watchIgnorable(playing, (isPlaying) => {\n const el = toValue(target);\n if (!el)\n return;\n if (isPlaying) {\n el.play().catch((e) => {\n playbackErrorEvent.trigger(e);\n throw e;\n });\n } else {\n el.pause();\n }\n });\n useEventListener(\n target,\n \"timeupdate\",\n () => ignoreCurrentTimeUpdates(() => currentTime.value = toValue(target).currentTime),\n listenerOptions\n );\n useEventListener(\n target,\n \"durationchange\",\n () => duration.value = toValue(target).duration,\n listenerOptions\n );\n useEventListener(\n target,\n \"progress\",\n () => buffered.value = timeRangeToArray(toValue(target).buffered),\n listenerOptions\n );\n useEventListener(\n target,\n \"seeking\",\n () => seeking.value = true,\n listenerOptions\n );\n useEventListener(\n target,\n \"seeked\",\n () => seeking.value = false,\n listenerOptions\n );\n useEventListener(\n target,\n [\"waiting\", \"loadstart\"],\n () => {\n waiting.value = true;\n ignorePlayingUpdates(() => playing.value = false);\n },\n listenerOptions\n );\n useEventListener(\n target,\n \"loadeddata\",\n () => waiting.value = false,\n listenerOptions\n );\n useEventListener(\n target,\n \"playing\",\n () => {\n waiting.value = false;\n ended.value = false;\n ignorePlayingUpdates(() => playing.value = true);\n },\n listenerOptions\n );\n useEventListener(\n target,\n \"ratechange\",\n () => rate.value = toValue(target).playbackRate,\n listenerOptions\n );\n useEventListener(\n target,\n \"stalled\",\n () => stalled.value = true,\n listenerOptions\n );\n useEventListener(\n target,\n \"ended\",\n () => ended.value = true,\n listenerOptions\n );\n useEventListener(\n target,\n \"pause\",\n () => ignorePlayingUpdates(() => playing.value = false),\n listenerOptions\n );\n useEventListener(\n target,\n \"play\",\n () => ignorePlayingUpdates(() => playing.value = true),\n listenerOptions\n );\n useEventListener(\n target,\n \"enterpictureinpicture\",\n () => isPictureInPicture.value = true,\n listenerOptions\n );\n useEventListener(\n target,\n \"leavepictureinpicture\",\n () => isPictureInPicture.value = false,\n listenerOptions\n );\n useEventListener(\n target,\n \"volumechange\",\n () => {\n const el = toValue(target);\n if (!el)\n return;\n volume.value = el.volume;\n muted.value = el.muted;\n },\n listenerOptions\n );\n const listeners = [];\n const stop = watch([target], () => {\n const el = toValue(target);\n if (!el)\n return;\n stop();\n listeners[0] = useEventListener(el.textTracks, \"addtrack\", () => tracks.value = tracksToArray(el.textTracks), listenerOptions);\n listeners[1] = useEventListener(el.textTracks, \"removetrack\", () => tracks.value = tracksToArray(el.textTracks), listenerOptions);\n listeners[2] = useEventListener(el.textTracks, \"change\", () => tracks.value = tracksToArray(el.textTracks), listenerOptions);\n });\n tryOnScopeDispose(() => listeners.forEach((listener) => listener()));\n return {\n currentTime,\n duration,\n waiting,\n seeking,\n ended,\n stalled,\n buffered,\n playing,\n rate,\n // Volume\n volume,\n muted,\n // Tracks\n tracks,\n selectedTrack,\n enableTrack,\n disableTrack,\n // Picture in Picture\n supportsPictureInPicture,\n togglePictureInPicture,\n isPictureInPicture,\n // Events\n onSourceError: sourceErrorEvent.on,\n onPlaybackError: playbackErrorEvent.on\n };\n}\n\nfunction useMemoize(resolver, options) {\n const initCache = () => {\n if (options == null ? void 0 : options.cache)\n return shallowReactive(options.cache);\n return shallowReactive(/* @__PURE__ */ new Map());\n };\n const cache = initCache();\n const generateKey = (...args) => (options == null ? void 0 : options.getKey) ? options.getKey(...args) : JSON.stringify(args);\n const _loadData = (key, ...args) => {\n cache.set(key, resolver(...args));\n return cache.get(key);\n };\n const loadData = (...args) => _loadData(generateKey(...args), ...args);\n const deleteData = (...args) => {\n cache.delete(generateKey(...args));\n };\n const clearData = () => {\n cache.clear();\n };\n const memoized = (...args) => {\n const key = generateKey(...args);\n if (cache.has(key))\n return cache.get(key);\n return _loadData(key, ...args);\n };\n memoized.load = loadData;\n memoized.delete = deleteData;\n memoized.clear = clearData;\n memoized.generateKey = generateKey;\n memoized.cache = cache;\n return memoized;\n}\n\nfunction useMemory(options = {}) {\n const memory = ref();\n const isSupported = useSupported(() => typeof performance !== \"undefined\" && \"memory\" in performance);\n if (isSupported.value) {\n const { interval = 1e3 } = options;\n useIntervalFn(() => {\n memory.value = performance.memory;\n }, interval, { immediate: options.immediate, immediateCallback: options.immediateCallback });\n }\n return { isSupported, memory };\n}\n\nconst UseMouseBuiltinExtractors = {\n page: (event) => [event.pageX, event.pageY],\n client: (event) => [event.clientX, event.clientY],\n screen: (event) => [event.screenX, event.screenY],\n movement: (event) => event instanceof MouseEvent ? [event.movementX, event.movementY] : null\n};\nfunction useMouse(options = {}) {\n const {\n type = \"page\",\n touch = true,\n resetOnTouchEnds = false,\n initialValue = { x: 0, y: 0 },\n window = defaultWindow,\n target = window,\n scroll = true,\n eventFilter\n } = options;\n let _prevMouseEvent = null;\n let _prevScrollX = 0;\n let _prevScrollY = 0;\n const x = shallowRef(initialValue.x);\n const y = shallowRef(initialValue.y);\n const sourceType = shallowRef(null);\n const extractor = typeof type === \"function\" ? type : UseMouseBuiltinExtractors[type];\n const mouseHandler = (event) => {\n const result = extractor(event);\n _prevMouseEvent = event;\n if (result) {\n [x.value, y.value] = result;\n sourceType.value = \"mouse\";\n }\n if (window) {\n _prevScrollX = window.scrollX;\n _prevScrollY = window.scrollY;\n }\n };\n const touchHandler = (event) => {\n if (event.touches.length > 0) {\n const result = extractor(event.touches[0]);\n if (result) {\n [x.value, y.value] = result;\n sourceType.value = \"touch\";\n }\n }\n };\n const scrollHandler = () => {\n if (!_prevMouseEvent || !window)\n return;\n const pos = extractor(_prevMouseEvent);\n if (_prevMouseEvent instanceof MouseEvent && pos) {\n x.value = pos[0] + window.scrollX - _prevScrollX;\n y.value = pos[1] + window.scrollY - _prevScrollY;\n }\n };\n const reset = () => {\n x.value = initialValue.x;\n y.value = initialValue.y;\n };\n const mouseHandlerWrapper = eventFilter ? (event) => eventFilter(() => mouseHandler(event), {}) : (event) => mouseHandler(event);\n const touchHandlerWrapper = eventFilter ? (event) => eventFilter(() => touchHandler(event), {}) : (event) => touchHandler(event);\n const scrollHandlerWrapper = eventFilter ? () => eventFilter(() => scrollHandler(), {}) : () => scrollHandler();\n if (target) {\n const listenerOptions = { passive: true };\n useEventListener(target, [\"mousemove\", \"dragover\"], mouseHandlerWrapper, listenerOptions);\n if (touch && type !== \"movement\") {\n useEventListener(target, [\"touchstart\", \"touchmove\"], touchHandlerWrapper, listenerOptions);\n if (resetOnTouchEnds)\n useEventListener(target, \"touchend\", reset, listenerOptions);\n }\n if (scroll && type === \"page\")\n useEventListener(window, \"scroll\", scrollHandlerWrapper, listenerOptions);\n }\n return {\n x,\n y,\n sourceType\n };\n}\n\nfunction useMouseInElement(target, options = {}) {\n const {\n handleOutside = true,\n window = defaultWindow\n } = options;\n const type = options.type || \"page\";\n const { x, y, sourceType } = useMouse(options);\n const targetRef = shallowRef(target != null ? target : window == null ? void 0 : window.document.body);\n const elementX = shallowRef(0);\n const elementY = shallowRef(0);\n const elementPositionX = shallowRef(0);\n const elementPositionY = shallowRef(0);\n const elementHeight = shallowRef(0);\n const elementWidth = shallowRef(0);\n const isOutside = shallowRef(true);\n let stop = () => {\n };\n if (window) {\n stop = watch(\n [targetRef, x, y],\n () => {\n const el = unrefElement(targetRef);\n if (!el || !(el instanceof Element))\n return;\n const {\n left,\n top,\n width,\n height\n } = el.getBoundingClientRect();\n elementPositionX.value = left + (type === \"page\" ? window.pageXOffset : 0);\n elementPositionY.value = top + (type === \"page\" ? window.pageYOffset : 0);\n elementHeight.value = height;\n elementWidth.value = width;\n const elX = x.value - elementPositionX.value;\n const elY = y.value - elementPositionY.value;\n isOutside.value = width === 0 || height === 0 || elX < 0 || elY < 0 || elX > width || elY > height;\n if (handleOutside || !isOutside.value) {\n elementX.value = elX;\n elementY.value = elY;\n }\n },\n { immediate: true }\n );\n useEventListener(\n document,\n \"mouseleave\",\n () => isOutside.value = true,\n { passive: true }\n );\n }\n return {\n x,\n y,\n sourceType,\n elementX,\n elementY,\n elementPositionX,\n elementPositionY,\n elementHeight,\n elementWidth,\n isOutside,\n stop\n };\n}\n\nfunction useMousePressed(options = {}) {\n const {\n touch = true,\n drag = true,\n capture = false,\n initialValue = false,\n window = defaultWindow\n } = options;\n const pressed = shallowRef(initialValue);\n const sourceType = shallowRef(null);\n if (!window) {\n return {\n pressed,\n sourceType\n };\n }\n const onPressed = (srcType) => (event) => {\n var _a;\n pressed.value = true;\n sourceType.value = srcType;\n (_a = options.onPressed) == null ? void 0 : _a.call(options, event);\n };\n const onReleased = (event) => {\n var _a;\n pressed.value = false;\n sourceType.value = null;\n (_a = options.onReleased) == null ? void 0 : _a.call(options, event);\n };\n const target = computed(() => unrefElement(options.target) || window);\n const listenerOptions = { passive: true, capture };\n useEventListener(target, \"mousedown\", onPressed(\"mouse\"), listenerOptions);\n useEventListener(window, \"mouseleave\", onReleased, listenerOptions);\n useEventListener(window, \"mouseup\", onReleased, listenerOptions);\n if (drag) {\n useEventListener(target, \"dragstart\", onPressed(\"mouse\"), listenerOptions);\n useEventListener(window, \"drop\", onReleased, listenerOptions);\n useEventListener(window, \"dragend\", onReleased, listenerOptions);\n }\n if (touch) {\n useEventListener(target, \"touchstart\", onPressed(\"touch\"), listenerOptions);\n useEventListener(window, \"touchend\", onReleased, listenerOptions);\n useEventListener(window, \"touchcancel\", onReleased, listenerOptions);\n }\n return {\n pressed,\n sourceType\n };\n}\n\nfunction useNavigatorLanguage(options = {}) {\n const { window = defaultWindow } = options;\n const navigator = window == null ? void 0 : window.navigator;\n const isSupported = useSupported(() => navigator && \"language\" in navigator);\n const language = shallowRef(navigator == null ? void 0 : navigator.language);\n useEventListener(window, \"languagechange\", () => {\n if (navigator)\n language.value = navigator.language;\n }, { passive: true });\n return {\n isSupported,\n language\n };\n}\n\nfunction useNetwork(options = {}) {\n const { window = defaultWindow } = options;\n const navigator = window == null ? void 0 : window.navigator;\n const isSupported = useSupported(() => navigator && \"connection\" in navigator);\n const isOnline = shallowRef(true);\n const saveData = shallowRef(false);\n const offlineAt = shallowRef(void 0);\n const onlineAt = shallowRef(void 0);\n const downlink = shallowRef(void 0);\n const downlinkMax = shallowRef(void 0);\n const rtt = shallowRef(void 0);\n const effectiveType = shallowRef(void 0);\n const type = shallowRef(\"unknown\");\n const connection = isSupported.value && navigator.connection;\n function updateNetworkInformation() {\n if (!navigator)\n return;\n isOnline.value = navigator.onLine;\n offlineAt.value = isOnline.value ? void 0 : Date.now();\n onlineAt.value = isOnline.value ? Date.now() : void 0;\n if (connection) {\n downlink.value = connection.downlink;\n downlinkMax.value = connection.downlinkMax;\n effectiveType.value = connection.effectiveType;\n rtt.value = connection.rtt;\n saveData.value = connection.saveData;\n type.value = connection.type;\n }\n }\n const listenerOptions = { passive: true };\n if (window) {\n useEventListener(window, \"offline\", () => {\n isOnline.value = false;\n offlineAt.value = Date.now();\n }, listenerOptions);\n useEventListener(window, \"online\", () => {\n isOnline.value = true;\n onlineAt.value = Date.now();\n }, listenerOptions);\n }\n if (connection)\n useEventListener(connection, \"change\", updateNetworkInformation, listenerOptions);\n updateNetworkInformation();\n return {\n isSupported,\n isOnline: readonly(isOnline),\n saveData: readonly(saveData),\n offlineAt: readonly(offlineAt),\n onlineAt: readonly(onlineAt),\n downlink: readonly(downlink),\n downlinkMax: readonly(downlinkMax),\n effectiveType: readonly(effectiveType),\n rtt: readonly(rtt),\n type: readonly(type)\n };\n}\n\nfunction useNow(options = {}) {\n const {\n controls: exposeControls = false,\n interval = \"requestAnimationFrame\"\n } = options;\n const now = ref(/* @__PURE__ */ new Date());\n const update = () => now.value = /* @__PURE__ */ new Date();\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(update, { immediate: true }) : useIntervalFn(update, interval, { immediate: true });\n if (exposeControls) {\n return {\n now,\n ...controls\n };\n } else {\n return now;\n }\n}\n\nfunction useObjectUrl(object) {\n const url = shallowRef();\n const release = () => {\n if (url.value)\n URL.revokeObjectURL(url.value);\n url.value = void 0;\n };\n watch(\n () => toValue(object),\n (newObject) => {\n release();\n if (newObject)\n url.value = URL.createObjectURL(newObject);\n },\n { immediate: true }\n );\n tryOnScopeDispose(release);\n return readonly(url);\n}\n\nfunction useClamp(value, min, max) {\n if (typeof value === \"function\" || isReadonly(value))\n return computed(() => clamp(toValue(value), toValue(min), toValue(max)));\n const _value = ref(value);\n return computed({\n get() {\n return _value.value = clamp(_value.value, toValue(min), toValue(max));\n },\n set(value2) {\n _value.value = clamp(value2, toValue(min), toValue(max));\n }\n });\n}\n\nfunction useOffsetPagination(options) {\n const {\n total = Number.POSITIVE_INFINITY,\n pageSize = 10,\n page = 1,\n onPageChange = noop,\n onPageSizeChange = noop,\n onPageCountChange = noop\n } = options;\n const currentPageSize = useClamp(pageSize, 1, Number.POSITIVE_INFINITY);\n const pageCount = computed(() => Math.max(\n 1,\n Math.ceil(toValue(total) / toValue(currentPageSize))\n ));\n const currentPage = useClamp(page, 1, pageCount);\n const isFirstPage = computed(() => currentPage.value === 1);\n const isLastPage = computed(() => currentPage.value === pageCount.value);\n if (isRef(page)) {\n syncRef(page, currentPage, {\n direction: isReadonly(page) ? \"ltr\" : \"both\"\n });\n }\n if (isRef(pageSize)) {\n syncRef(pageSize, currentPageSize, {\n direction: isReadonly(pageSize) ? \"ltr\" : \"both\"\n });\n }\n function prev() {\n currentPage.value--;\n }\n function next() {\n currentPage.value++;\n }\n const returnValue = {\n currentPage,\n currentPageSize,\n pageCount,\n isFirstPage,\n isLastPage,\n prev,\n next\n };\n watch(currentPage, () => {\n onPageChange(reactive(returnValue));\n });\n watch(currentPageSize, () => {\n onPageSizeChange(reactive(returnValue));\n });\n watch(pageCount, () => {\n onPageCountChange(reactive(returnValue));\n });\n return returnValue;\n}\n\nfunction useOnline(options = {}) {\n const { isOnline } = useNetwork(options);\n return isOnline;\n}\n\nfunction usePageLeave(options = {}) {\n const { window = defaultWindow } = options;\n const isLeft = shallowRef(false);\n const handler = (event) => {\n if (!window)\n return;\n event = event || window.event;\n const from = event.relatedTarget || event.toElement;\n isLeft.value = !from;\n };\n if (window) {\n const listenerOptions = { passive: true };\n useEventListener(window, \"mouseout\", handler, listenerOptions);\n useEventListener(window.document, \"mouseleave\", handler, listenerOptions);\n useEventListener(window.document, \"mouseenter\", handler, listenerOptions);\n }\n return isLeft;\n}\n\nfunction useScreenOrientation(options = {}) {\n const {\n window = defaultWindow\n } = options;\n const isSupported = useSupported(() => window && \"screen\" in window && \"orientation\" in window.screen);\n const screenOrientation = isSupported.value ? window.screen.orientation : {};\n const orientation = ref(screenOrientation.type);\n const angle = shallowRef(screenOrientation.angle || 0);\n if (isSupported.value) {\n useEventListener(window, \"orientationchange\", () => {\n orientation.value = screenOrientation.type;\n angle.value = screenOrientation.angle;\n }, { passive: true });\n }\n const lockOrientation = (type) => {\n if (isSupported.value && typeof screenOrientation.lock === \"function\")\n return screenOrientation.lock(type);\n return Promise.reject(new Error(\"Not supported\"));\n };\n const unlockOrientation = () => {\n if (isSupported.value && typeof screenOrientation.unlock === \"function\")\n screenOrientation.unlock();\n };\n return {\n isSupported,\n orientation,\n angle,\n lockOrientation,\n unlockOrientation\n };\n}\n\nfunction useParallax(target, options = {}) {\n const {\n deviceOrientationTiltAdjust = (i) => i,\n deviceOrientationRollAdjust = (i) => i,\n mouseTiltAdjust = (i) => i,\n mouseRollAdjust = (i) => i,\n window = defaultWindow\n } = options;\n const orientation = reactive(useDeviceOrientation({ window }));\n const screenOrientation = reactive(useScreenOrientation({ window }));\n const {\n elementX: x,\n elementY: y,\n elementWidth: width,\n elementHeight: height\n } = useMouseInElement(target, { handleOutside: false, window });\n const source = computed(() => {\n if (orientation.isSupported && (orientation.alpha != null && orientation.alpha !== 0 || orientation.gamma != null && orientation.gamma !== 0)) {\n return \"deviceOrientation\";\n }\n return \"mouse\";\n });\n const roll = computed(() => {\n if (source.value === \"deviceOrientation\") {\n let value;\n switch (screenOrientation.orientation) {\n case \"landscape-primary\":\n value = orientation.gamma / 90;\n break;\n case \"landscape-secondary\":\n value = -orientation.gamma / 90;\n break;\n case \"portrait-primary\":\n value = -orientation.beta / 90;\n break;\n case \"portrait-secondary\":\n value = orientation.beta / 90;\n break;\n default:\n value = -orientation.beta / 90;\n }\n return deviceOrientationRollAdjust(value);\n } else {\n const value = -(y.value - height.value / 2) / height.value;\n return mouseRollAdjust(value);\n }\n });\n const tilt = computed(() => {\n if (source.value === \"deviceOrientation\") {\n let value;\n switch (screenOrientation.orientation) {\n case \"landscape-primary\":\n value = orientation.beta / 90;\n break;\n case \"landscape-secondary\":\n value = -orientation.beta / 90;\n break;\n case \"portrait-primary\":\n value = orientation.gamma / 90;\n break;\n case \"portrait-secondary\":\n value = -orientation.gamma / 90;\n break;\n default:\n value = orientation.gamma / 90;\n }\n return deviceOrientationTiltAdjust(value);\n } else {\n const value = (x.value - width.value / 2) / width.value;\n return mouseTiltAdjust(value);\n }\n });\n return { roll, tilt, source };\n}\n\nfunction useParentElement(element = useCurrentElement()) {\n const parentElement = shallowRef();\n const update = () => {\n const el = unrefElement(element);\n if (el)\n parentElement.value = el.parentElement;\n };\n tryOnMounted(update);\n watch(() => toValue(element), update);\n return parentElement;\n}\n\nfunction usePerformanceObserver(options, callback) {\n const {\n window = defaultWindow,\n immediate = true,\n ...performanceOptions\n } = options;\n const isSupported = useSupported(() => window && \"PerformanceObserver\" in window);\n let observer;\n const stop = () => {\n observer == null ? void 0 : observer.disconnect();\n };\n const start = () => {\n if (isSupported.value) {\n stop();\n observer = new PerformanceObserver(callback);\n observer.observe(performanceOptions);\n }\n };\n tryOnScopeDispose(stop);\n if (immediate)\n start();\n return {\n isSupported,\n start,\n stop\n };\n}\n\nconst defaultState = {\n x: 0,\n y: 0,\n pointerId: 0,\n pressure: 0,\n tiltX: 0,\n tiltY: 0,\n width: 0,\n height: 0,\n twist: 0,\n pointerType: null\n};\nconst keys = /* @__PURE__ */ Object.keys(defaultState);\nfunction usePointer(options = {}) {\n const {\n target = defaultWindow\n } = options;\n const isInside = shallowRef(false);\n const state = ref(options.initialValue || {});\n Object.assign(state.value, defaultState, state.value);\n const handler = (event) => {\n isInside.value = true;\n if (options.pointerTypes && !options.pointerTypes.includes(event.pointerType))\n return;\n state.value = objectPick(event, keys, false);\n };\n if (target) {\n const listenerOptions = { passive: true };\n useEventListener(target, [\"pointerdown\", \"pointermove\", \"pointerup\"], handler, listenerOptions);\n useEventListener(target, \"pointerleave\", () => isInside.value = false, listenerOptions);\n }\n return {\n ...toRefs(state),\n isInside\n };\n}\n\nfunction usePointerLock(target, options = {}) {\n const { document = defaultDocument } = options;\n const isSupported = useSupported(() => document && \"pointerLockElement\" in document);\n const element = shallowRef();\n const triggerElement = shallowRef();\n let targetElement;\n if (isSupported.value) {\n const listenerOptions = { passive: true };\n useEventListener(document, \"pointerlockchange\", () => {\n var _a;\n const currentElement = (_a = document.pointerLockElement) != null ? _a : element.value;\n if (targetElement && currentElement === targetElement) {\n element.value = document.pointerLockElement;\n if (!element.value)\n targetElement = triggerElement.value = null;\n }\n }, listenerOptions);\n useEventListener(document, \"pointerlockerror\", () => {\n var _a;\n const currentElement = (_a = document.pointerLockElement) != null ? _a : element.value;\n if (targetElement && currentElement === targetElement) {\n const action = document.pointerLockElement ? \"release\" : \"acquire\";\n throw new Error(`Failed to ${action} pointer lock.`);\n }\n }, listenerOptions);\n }\n async function lock(e) {\n var _a;\n if (!isSupported.value)\n throw new Error(\"Pointer Lock API is not supported by your browser.\");\n triggerElement.value = e instanceof Event ? e.currentTarget : null;\n targetElement = e instanceof Event ? (_a = unrefElement(target)) != null ? _a : triggerElement.value : unrefElement(e);\n if (!targetElement)\n throw new Error(\"Target element undefined.\");\n targetElement.requestPointerLock();\n return await until(element).toBe(targetElement);\n }\n async function unlock() {\n if (!element.value)\n return false;\n document.exitPointerLock();\n await until(element).toBeNull();\n return true;\n }\n return {\n isSupported,\n element,\n triggerElement,\n lock,\n unlock\n };\n}\n\nfunction usePointerSwipe(target, options = {}) {\n const targetRef = toRef(target);\n const {\n threshold = 50,\n onSwipe,\n onSwipeEnd,\n onSwipeStart,\n disableTextSelect = false\n } = options;\n const posStart = reactive({ x: 0, y: 0 });\n const updatePosStart = (x, y) => {\n posStart.x = x;\n posStart.y = y;\n };\n const posEnd = reactive({ x: 0, y: 0 });\n const updatePosEnd = (x, y) => {\n posEnd.x = x;\n posEnd.y = y;\n };\n const distanceX = computed(() => posStart.x - posEnd.x);\n const distanceY = computed(() => posStart.y - posEnd.y);\n const { max, abs } = Math;\n const isThresholdExceeded = computed(() => max(abs(distanceX.value), abs(distanceY.value)) >= threshold);\n const isSwiping = shallowRef(false);\n const isPointerDown = shallowRef(false);\n const direction = computed(() => {\n if (!isThresholdExceeded.value)\n return \"none\";\n if (abs(distanceX.value) > abs(distanceY.value)) {\n return distanceX.value > 0 ? \"left\" : \"right\";\n } else {\n return distanceY.value > 0 ? \"up\" : \"down\";\n }\n });\n const eventIsAllowed = (e) => {\n var _a, _b, _c;\n const isReleasingButton = e.buttons === 0;\n const isPrimaryButton = e.buttons === 1;\n return (_c = (_b = (_a = options.pointerTypes) == null ? void 0 : _a.includes(e.pointerType)) != null ? _b : isReleasingButton || isPrimaryButton) != null ? _c : true;\n };\n const listenerOptions = { passive: true };\n const stops = [\n useEventListener(target, \"pointerdown\", (e) => {\n if (!eventIsAllowed(e))\n return;\n isPointerDown.value = true;\n const eventTarget = e.target;\n eventTarget == null ? void 0 : eventTarget.setPointerCapture(e.pointerId);\n const { clientX: x, clientY: y } = e;\n updatePosStart(x, y);\n updatePosEnd(x, y);\n onSwipeStart == null ? void 0 : onSwipeStart(e);\n }, listenerOptions),\n useEventListener(target, \"pointermove\", (e) => {\n if (!eventIsAllowed(e))\n return;\n if (!isPointerDown.value)\n return;\n const { clientX: x, clientY: y } = e;\n updatePosEnd(x, y);\n if (!isSwiping.value && isThresholdExceeded.value)\n isSwiping.value = true;\n if (isSwiping.value)\n onSwipe == null ? void 0 : onSwipe(e);\n }, listenerOptions),\n useEventListener(target, \"pointerup\", (e) => {\n if (!eventIsAllowed(e))\n return;\n if (isSwiping.value)\n onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);\n isPointerDown.value = false;\n isSwiping.value = false;\n }, listenerOptions)\n ];\n tryOnMounted(() => {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n (_b = (_a = targetRef.value) == null ? void 0 : _a.style) == null ? void 0 : _b.setProperty(\"touch-action\", \"none\");\n if (disableTextSelect) {\n (_d = (_c = targetRef.value) == null ? void 0 : _c.style) == null ? void 0 : _d.setProperty(\"-webkit-user-select\", \"none\");\n (_f = (_e = targetRef.value) == null ? void 0 : _e.style) == null ? void 0 : _f.setProperty(\"-ms-user-select\", \"none\");\n (_h = (_g = targetRef.value) == null ? void 0 : _g.style) == null ? void 0 : _h.setProperty(\"user-select\", \"none\");\n }\n });\n const stop = () => stops.forEach((s) => s());\n return {\n isSwiping: readonly(isSwiping),\n direction: readonly(direction),\n posStart: readonly(posStart),\n posEnd: readonly(posEnd),\n distanceX,\n distanceY,\n stop\n };\n}\n\nfunction usePreferredColorScheme(options) {\n const isLight = useMediaQuery(\"(prefers-color-scheme: light)\", options);\n const isDark = useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n return computed(() => {\n if (isDark.value)\n return \"dark\";\n if (isLight.value)\n return \"light\";\n return \"no-preference\";\n });\n}\n\nfunction usePreferredContrast(options) {\n const isMore = useMediaQuery(\"(prefers-contrast: more)\", options);\n const isLess = useMediaQuery(\"(prefers-contrast: less)\", options);\n const isCustom = useMediaQuery(\"(prefers-contrast: custom)\", options);\n return computed(() => {\n if (isMore.value)\n return \"more\";\n if (isLess.value)\n return \"less\";\n if (isCustom.value)\n return \"custom\";\n return \"no-preference\";\n });\n}\n\nfunction usePreferredLanguages(options = {}) {\n const { window = defaultWindow } = options;\n if (!window)\n return ref([\"en\"]);\n const navigator = window.navigator;\n const value = ref(navigator.languages);\n useEventListener(window, \"languagechange\", () => {\n value.value = navigator.languages;\n }, { passive: true });\n return value;\n}\n\nfunction usePreferredReducedMotion(options) {\n const isReduced = useMediaQuery(\"(prefers-reduced-motion: reduce)\", options);\n return computed(() => {\n if (isReduced.value)\n return \"reduce\";\n return \"no-preference\";\n });\n}\n\nfunction usePreferredReducedTransparency(options) {\n const isReduced = useMediaQuery(\"(prefers-reduced-transparency: reduce)\", options);\n return computed(() => {\n if (isReduced.value)\n return \"reduce\";\n return \"no-preference\";\n });\n}\n\nfunction usePrevious(value, initialValue) {\n const previous = shallowRef(initialValue);\n watch(\n toRef(value),\n (_, oldValue) => {\n previous.value = oldValue;\n },\n { flush: \"sync\" }\n );\n return readonly(previous);\n}\n\nconst topVarName = \"--vueuse-safe-area-top\";\nconst rightVarName = \"--vueuse-safe-area-right\";\nconst bottomVarName = \"--vueuse-safe-area-bottom\";\nconst leftVarName = \"--vueuse-safe-area-left\";\nfunction useScreenSafeArea() {\n const top = shallowRef(\"\");\n const right = shallowRef(\"\");\n const bottom = shallowRef(\"\");\n const left = shallowRef(\"\");\n if (isClient) {\n const topCssVar = useCssVar(topVarName);\n const rightCssVar = useCssVar(rightVarName);\n const bottomCssVar = useCssVar(bottomVarName);\n const leftCssVar = useCssVar(leftVarName);\n topCssVar.value = \"env(safe-area-inset-top, 0px)\";\n rightCssVar.value = \"env(safe-area-inset-right, 0px)\";\n bottomCssVar.value = \"env(safe-area-inset-bottom, 0px)\";\n leftCssVar.value = \"env(safe-area-inset-left, 0px)\";\n update();\n useEventListener(\"resize\", useDebounceFn(update), { passive: true });\n }\n function update() {\n top.value = getValue(topVarName);\n right.value = getValue(rightVarName);\n bottom.value = getValue(bottomVarName);\n left.value = getValue(leftVarName);\n }\n return {\n top,\n right,\n bottom,\n left,\n update\n };\n}\nfunction getValue(position) {\n return getComputedStyle(document.documentElement).getPropertyValue(position);\n}\n\nfunction useScriptTag(src, onLoaded = noop, options = {}) {\n const {\n immediate = true,\n manual = false,\n type = \"text/javascript\",\n async = true,\n crossOrigin,\n referrerPolicy,\n noModule,\n defer,\n document = defaultDocument,\n attrs = {}\n } = options;\n const scriptTag = shallowRef(null);\n let _promise = null;\n const loadScript = (waitForScriptLoad) => new Promise((resolve, reject) => {\n const resolveWithElement = (el2) => {\n scriptTag.value = el2;\n resolve(el2);\n return el2;\n };\n if (!document) {\n resolve(false);\n return;\n }\n let shouldAppend = false;\n let el = document.querySelector(`script[src=\"${toValue(src)}\"]`);\n if (!el) {\n el = document.createElement(\"script\");\n el.type = type;\n el.async = async;\n el.src = toValue(src);\n if (defer)\n el.defer = defer;\n if (crossOrigin)\n el.crossOrigin = crossOrigin;\n if (noModule)\n el.noModule = noModule;\n if (referrerPolicy)\n el.referrerPolicy = referrerPolicy;\n Object.entries(attrs).forEach(([name, value]) => el == null ? void 0 : el.setAttribute(name, value));\n shouldAppend = true;\n } else if (el.hasAttribute(\"data-loaded\")) {\n resolveWithElement(el);\n }\n const listenerOptions = {\n passive: true\n };\n useEventListener(el, \"error\", (event) => reject(event), listenerOptions);\n useEventListener(el, \"abort\", (event) => reject(event), listenerOptions);\n useEventListener(el, \"load\", () => {\n el.setAttribute(\"data-loaded\", \"true\");\n onLoaded(el);\n resolveWithElement(el);\n }, listenerOptions);\n if (shouldAppend)\n el = document.head.appendChild(el);\n if (!waitForScriptLoad)\n resolveWithElement(el);\n });\n const load = (waitForScriptLoad = true) => {\n if (!_promise)\n _promise = loadScript(waitForScriptLoad);\n return _promise;\n };\n const unload = () => {\n if (!document)\n return;\n _promise = null;\n if (scriptTag.value)\n scriptTag.value = null;\n const el = document.querySelector(`script[src=\"${toValue(src)}\"]`);\n if (el)\n document.head.removeChild(el);\n };\n if (immediate && !manual)\n tryOnMounted(load);\n if (!manual)\n tryOnUnmounted(unload);\n return { scriptTag, load, unload };\n}\n\nfunction checkOverflowScroll(ele) {\n const style = window.getComputedStyle(ele);\n if (style.overflowX === \"scroll\" || style.overflowY === \"scroll\" || style.overflowX === \"auto\" && ele.clientWidth < ele.scrollWidth || style.overflowY === \"auto\" && ele.clientHeight < ele.scrollHeight) {\n return true;\n } else {\n const parent = ele.parentNode;\n if (!parent || parent.tagName === \"BODY\")\n return false;\n return checkOverflowScroll(parent);\n }\n}\nfunction preventDefault(rawEvent) {\n const e = rawEvent || window.event;\n const _target = e.target;\n if (checkOverflowScroll(_target))\n return false;\n if (e.touches.length > 1)\n return true;\n if (e.preventDefault)\n e.preventDefault();\n return false;\n}\nconst elInitialOverflow = /* @__PURE__ */ new WeakMap();\nfunction useScrollLock(element, initialState = false) {\n const isLocked = shallowRef(initialState);\n let stopTouchMoveListener = null;\n let initialOverflow = \"\";\n watch(toRef(element), (el) => {\n const target = resolveElement(toValue(el));\n if (target) {\n const ele = target;\n if (!elInitialOverflow.get(ele))\n elInitialOverflow.set(ele, ele.style.overflow);\n if (ele.style.overflow !== \"hidden\")\n initialOverflow = ele.style.overflow;\n if (ele.style.overflow === \"hidden\")\n return isLocked.value = true;\n if (isLocked.value)\n return ele.style.overflow = \"hidden\";\n }\n }, {\n immediate: true\n });\n const lock = () => {\n const el = resolveElement(toValue(element));\n if (!el || isLocked.value)\n return;\n if (isIOS) {\n stopTouchMoveListener = useEventListener(\n el,\n \"touchmove\",\n (e) => {\n preventDefault(e);\n },\n { passive: false }\n );\n }\n el.style.overflow = \"hidden\";\n isLocked.value = true;\n };\n const unlock = () => {\n const el = resolveElement(toValue(element));\n if (!el || !isLocked.value)\n return;\n if (isIOS)\n stopTouchMoveListener == null ? void 0 : stopTouchMoveListener();\n el.style.overflow = initialOverflow;\n elInitialOverflow.delete(el);\n isLocked.value = false;\n };\n tryOnScopeDispose(unlock);\n return computed({\n get() {\n return isLocked.value;\n },\n set(v) {\n if (v)\n lock();\n else unlock();\n }\n });\n}\n\nfunction useSessionStorage(key, initialValue, options = {}) {\n const { window = defaultWindow } = options;\n return useStorage(key, initialValue, window == null ? void 0 : window.sessionStorage, options);\n}\n\nfunction useShare(shareOptions = {}, options = {}) {\n const { navigator = defaultNavigator } = options;\n const _navigator = navigator;\n const isSupported = useSupported(() => _navigator && \"canShare\" in _navigator);\n const share = async (overrideOptions = {}) => {\n if (isSupported.value) {\n const data = {\n ...toValue(shareOptions),\n ...toValue(overrideOptions)\n };\n let granted = true;\n if (data.files && _navigator.canShare)\n granted = _navigator.canShare({ files: data.files });\n if (granted)\n return _navigator.share(data);\n }\n };\n return {\n isSupported,\n share\n };\n}\n\nconst defaultSortFn = (source, compareFn) => source.sort(compareFn);\nconst defaultCompare = (a, b) => a - b;\nfunction useSorted(...args) {\n var _a, _b, _c, _d;\n const [source] = args;\n let compareFn = defaultCompare;\n let options = {};\n if (args.length === 2) {\n if (typeof args[1] === \"object\") {\n options = args[1];\n compareFn = (_a = options.compareFn) != null ? _a : defaultCompare;\n } else {\n compareFn = (_b = args[1]) != null ? _b : defaultCompare;\n }\n } else if (args.length > 2) {\n compareFn = (_c = args[1]) != null ? _c : defaultCompare;\n options = (_d = args[2]) != null ? _d : {};\n }\n const {\n dirty = false,\n sortFn = defaultSortFn\n } = options;\n if (!dirty)\n return computed(() => sortFn([...toValue(source)], compareFn));\n watchEffect(() => {\n const result = sortFn(toValue(source), compareFn);\n if (isRef(source))\n source.value = result;\n else\n source.splice(0, source.length, ...result);\n });\n return source;\n}\n\nfunction useSpeechRecognition(options = {}) {\n const {\n interimResults = true,\n continuous = true,\n maxAlternatives = 1,\n window = defaultWindow\n } = options;\n const lang = toRef(options.lang || \"en-US\");\n const isListening = shallowRef(false);\n const isFinal = shallowRef(false);\n const result = shallowRef(\"\");\n const error = shallowRef(void 0);\n let recognition;\n const start = () => {\n isListening.value = true;\n };\n const stop = () => {\n isListening.value = false;\n };\n const toggle = (value = !isListening.value) => {\n if (value) {\n start();\n } else {\n stop();\n }\n };\n const SpeechRecognition = window && (window.SpeechRecognition || window.webkitSpeechRecognition);\n const isSupported = useSupported(() => SpeechRecognition);\n if (isSupported.value) {\n recognition = new SpeechRecognition();\n recognition.continuous = continuous;\n recognition.interimResults = interimResults;\n recognition.lang = toValue(lang);\n recognition.maxAlternatives = maxAlternatives;\n recognition.onstart = () => {\n isListening.value = true;\n isFinal.value = false;\n };\n watch(lang, (lang2) => {\n if (recognition && !isListening.value)\n recognition.lang = lang2;\n });\n recognition.onresult = (event) => {\n const currentResult = event.results[event.resultIndex];\n const { transcript } = currentResult[0];\n isFinal.value = currentResult.isFinal;\n result.value = transcript;\n error.value = void 0;\n };\n recognition.onerror = (event) => {\n error.value = event;\n };\n recognition.onend = () => {\n isListening.value = false;\n recognition.lang = toValue(lang);\n };\n watch(isListening, (newValue, oldValue) => {\n if (newValue === oldValue)\n return;\n if (newValue)\n recognition.start();\n else\n recognition.stop();\n });\n }\n tryOnScopeDispose(() => {\n stop();\n });\n return {\n isSupported,\n isListening,\n isFinal,\n recognition,\n result,\n error,\n toggle,\n start,\n stop\n };\n}\n\nfunction useSpeechSynthesis(text, options = {}) {\n const {\n pitch = 1,\n rate = 1,\n volume = 1,\n window = defaultWindow\n } = options;\n const synth = window && window.speechSynthesis;\n const isSupported = useSupported(() => synth);\n const isPlaying = shallowRef(false);\n const status = shallowRef(\"init\");\n const spokenText = toRef(text || \"\");\n const lang = toRef(options.lang || \"en-US\");\n const error = shallowRef(void 0);\n const toggle = (value = !isPlaying.value) => {\n isPlaying.value = value;\n };\n const bindEventsForUtterance = (utterance2) => {\n utterance2.lang = toValue(lang);\n utterance2.voice = toValue(options.voice) || null;\n utterance2.pitch = toValue(pitch);\n utterance2.rate = toValue(rate);\n utterance2.volume = volume;\n utterance2.onstart = () => {\n isPlaying.value = true;\n status.value = \"play\";\n };\n utterance2.onpause = () => {\n isPlaying.value = false;\n status.value = \"pause\";\n };\n utterance2.onresume = () => {\n isPlaying.value = true;\n status.value = \"play\";\n };\n utterance2.onend = () => {\n isPlaying.value = false;\n status.value = \"end\";\n };\n utterance2.onerror = (event) => {\n error.value = event;\n };\n };\n const utterance = computed(() => {\n isPlaying.value = false;\n status.value = \"init\";\n const newUtterance = new SpeechSynthesisUtterance(spokenText.value);\n bindEventsForUtterance(newUtterance);\n return newUtterance;\n });\n const speak = () => {\n synth.cancel();\n if (utterance)\n synth.speak(utterance.value);\n };\n const stop = () => {\n synth.cancel();\n isPlaying.value = false;\n };\n if (isSupported.value) {\n bindEventsForUtterance(utterance.value);\n watch(lang, (lang2) => {\n if (utterance.value && !isPlaying.value)\n utterance.value.lang = lang2;\n });\n if (options.voice) {\n watch(options.voice, () => {\n synth.cancel();\n });\n }\n watch(isPlaying, () => {\n if (isPlaying.value)\n synth.resume();\n else\n synth.pause();\n });\n }\n tryOnScopeDispose(() => {\n isPlaying.value = false;\n });\n return {\n isSupported,\n isPlaying,\n status,\n utterance,\n error,\n stop,\n toggle,\n speak\n };\n}\n\nfunction useStepper(steps, initialStep) {\n const stepsRef = ref(steps);\n const stepNames = computed(() => Array.isArray(stepsRef.value) ? stepsRef.value : Object.keys(stepsRef.value));\n const index = ref(stepNames.value.indexOf(initialStep != null ? initialStep : stepNames.value[0]));\n const current = computed(() => at(index.value));\n const isFirst = computed(() => index.value === 0);\n const isLast = computed(() => index.value === stepNames.value.length - 1);\n const next = computed(() => stepNames.value[index.value + 1]);\n const previous = computed(() => stepNames.value[index.value - 1]);\n function at(index2) {\n if (Array.isArray(stepsRef.value))\n return stepsRef.value[index2];\n return stepsRef.value[stepNames.value[index2]];\n }\n function get(step) {\n if (!stepNames.value.includes(step))\n return;\n return at(stepNames.value.indexOf(step));\n }\n function goTo(step) {\n if (stepNames.value.includes(step))\n index.value = stepNames.value.indexOf(step);\n }\n function goToNext() {\n if (isLast.value)\n return;\n index.value++;\n }\n function goToPrevious() {\n if (isFirst.value)\n return;\n index.value--;\n }\n function goBackTo(step) {\n if (isAfter(step))\n goTo(step);\n }\n function isNext(step) {\n return stepNames.value.indexOf(step) === index.value + 1;\n }\n function isPrevious(step) {\n return stepNames.value.indexOf(step) === index.value - 1;\n }\n function isCurrent(step) {\n return stepNames.value.indexOf(step) === index.value;\n }\n function isBefore(step) {\n return index.value < stepNames.value.indexOf(step);\n }\n function isAfter(step) {\n return index.value > stepNames.value.indexOf(step);\n }\n return {\n steps: stepsRef,\n stepNames,\n index,\n current,\n next,\n previous,\n isFirst,\n isLast,\n at,\n get,\n goTo,\n goToNext,\n goToPrevious,\n goBackTo,\n isNext,\n isPrevious,\n isCurrent,\n isBefore,\n isAfter\n };\n}\n\nfunction useStorageAsync(key, initialValue, storage, options = {}) {\n var _a;\n const {\n flush = \"pre\",\n deep = true,\n listenToStorageChanges = true,\n writeDefaults = true,\n mergeDefaults = false,\n shallow,\n window = defaultWindow,\n eventFilter,\n onError = (e) => {\n console.error(e);\n }\n } = options;\n const rawInit = toValue(initialValue);\n const type = guessSerializerType(rawInit);\n const data = (shallow ? shallowRef : ref)(toValue(initialValue));\n const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n if (!storage) {\n try {\n storage = getSSRHandler(\"getDefaultStorageAsync\", () => {\n var _a2;\n return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n })();\n } catch (e) {\n onError(e);\n }\n }\n async function read(event) {\n if (!storage || event && event.key !== key)\n return;\n try {\n const rawValue = event ? event.newValue : await storage.getItem(key);\n if (rawValue == null) {\n data.value = rawInit;\n if (writeDefaults && rawInit !== null)\n await storage.setItem(key, await serializer.write(rawInit));\n } else if (mergeDefaults) {\n const value = await serializer.read(rawValue);\n if (typeof mergeDefaults === \"function\")\n data.value = mergeDefaults(value, rawInit);\n else if (type === \"object\" && !Array.isArray(value))\n data.value = { ...rawInit, ...value };\n else data.value = value;\n } else {\n data.value = await serializer.read(rawValue);\n }\n } catch (e) {\n onError(e);\n }\n }\n read();\n if (window && listenToStorageChanges)\n useEventListener(window, \"storage\", (e) => Promise.resolve().then(() => read(e)), { passive: true });\n if (storage) {\n watchWithFilter(\n data,\n async () => {\n try {\n if (data.value == null)\n await storage.removeItem(key);\n else\n await storage.setItem(key, await serializer.write(data.value));\n } catch (e) {\n onError(e);\n }\n },\n {\n flush,\n deep,\n eventFilter\n }\n );\n }\n return data;\n}\n\nlet _id = 0;\nfunction useStyleTag(css, options = {}) {\n const isLoaded = shallowRef(false);\n const {\n document = defaultDocument,\n immediate = true,\n manual = false,\n id = `vueuse_styletag_${++_id}`\n } = options;\n const cssRef = shallowRef(css);\n let stop = () => {\n };\n const load = () => {\n if (!document)\n return;\n const el = document.getElementById(id) || document.createElement(\"style\");\n if (!el.isConnected) {\n el.id = id;\n if (options.media)\n el.media = options.media;\n document.head.appendChild(el);\n }\n if (isLoaded.value)\n return;\n stop = watch(\n cssRef,\n (value) => {\n el.textContent = value;\n },\n { immediate: true }\n );\n isLoaded.value = true;\n };\n const unload = () => {\n if (!document || !isLoaded.value)\n return;\n stop();\n document.head.removeChild(document.getElementById(id));\n isLoaded.value = false;\n };\n if (immediate && !manual)\n tryOnMounted(load);\n if (!manual)\n tryOnScopeDispose(unload);\n return {\n id,\n css: cssRef,\n unload,\n load,\n isLoaded: readonly(isLoaded)\n };\n}\n\nfunction useSwipe(target, options = {}) {\n const {\n threshold = 50,\n onSwipe,\n onSwipeEnd,\n onSwipeStart,\n passive = true\n } = options;\n const coordsStart = reactive({ x: 0, y: 0 });\n const coordsEnd = reactive({ x: 0, y: 0 });\n const diffX = computed(() => coordsStart.x - coordsEnd.x);\n const diffY = computed(() => coordsStart.y - coordsEnd.y);\n const { max, abs } = Math;\n const isThresholdExceeded = computed(() => max(abs(diffX.value), abs(diffY.value)) >= threshold);\n const isSwiping = shallowRef(false);\n const direction = computed(() => {\n if (!isThresholdExceeded.value)\n return \"none\";\n if (abs(diffX.value) > abs(diffY.value)) {\n return diffX.value > 0 ? \"left\" : \"right\";\n } else {\n return diffY.value > 0 ? \"up\" : \"down\";\n }\n });\n const getTouchEventCoords = (e) => [e.touches[0].clientX, e.touches[0].clientY];\n const updateCoordsStart = (x, y) => {\n coordsStart.x = x;\n coordsStart.y = y;\n };\n const updateCoordsEnd = (x, y) => {\n coordsEnd.x = x;\n coordsEnd.y = y;\n };\n const listenerOptions = { passive, capture: !passive };\n const onTouchEnd = (e) => {\n if (isSwiping.value)\n onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);\n isSwiping.value = false;\n };\n const stops = [\n useEventListener(target, \"touchstart\", (e) => {\n if (e.touches.length !== 1)\n return;\n const [x, y] = getTouchEventCoords(e);\n updateCoordsStart(x, y);\n updateCoordsEnd(x, y);\n onSwipeStart == null ? void 0 : onSwipeStart(e);\n }, listenerOptions),\n useEventListener(target, \"touchmove\", (e) => {\n if (e.touches.length !== 1)\n return;\n const [x, y] = getTouchEventCoords(e);\n updateCoordsEnd(x, y);\n if (listenerOptions.capture && !listenerOptions.passive && Math.abs(diffX.value) > Math.abs(diffY.value))\n e.preventDefault();\n if (!isSwiping.value && isThresholdExceeded.value)\n isSwiping.value = true;\n if (isSwiping.value)\n onSwipe == null ? void 0 : onSwipe(e);\n }, listenerOptions),\n useEventListener(target, [\"touchend\", \"touchcancel\"], onTouchEnd, listenerOptions)\n ];\n const stop = () => stops.forEach((s) => s());\n return {\n isSwiping,\n direction,\n coordsStart,\n coordsEnd,\n lengthX: diffX,\n lengthY: diffY,\n stop,\n // TODO: Remove in the next major version\n isPassiveEventSupported: true\n };\n}\n\nfunction useTemplateRefsList() {\n const refs = ref([]);\n refs.value.set = (el) => {\n if (el)\n refs.value.push(el);\n };\n onBeforeUpdate(() => {\n refs.value.length = 0;\n });\n return refs;\n}\n\nfunction useTextDirection(options = {}) {\n const {\n document = defaultDocument,\n selector = \"html\",\n observe = false,\n initialValue = \"ltr\"\n } = options;\n function getValue() {\n var _a, _b;\n return (_b = (_a = document == null ? void 0 : document.querySelector(selector)) == null ? void 0 : _a.getAttribute(\"dir\")) != null ? _b : initialValue;\n }\n const dir = ref(getValue());\n tryOnMounted(() => dir.value = getValue());\n if (observe && document) {\n useMutationObserver(\n document.querySelector(selector),\n () => dir.value = getValue(),\n { attributes: true }\n );\n }\n return computed({\n get() {\n return dir.value;\n },\n set(v) {\n var _a, _b;\n dir.value = v;\n if (!document)\n return;\n if (dir.value)\n (_a = document.querySelector(selector)) == null ? void 0 : _a.setAttribute(\"dir\", dir.value);\n else\n (_b = document.querySelector(selector)) == null ? void 0 : _b.removeAttribute(\"dir\");\n }\n });\n}\n\nfunction getRangesFromSelection(selection) {\n var _a;\n const rangeCount = (_a = selection.rangeCount) != null ? _a : 0;\n return Array.from({ length: rangeCount }, (_, i) => selection.getRangeAt(i));\n}\nfunction useTextSelection(options = {}) {\n const {\n window = defaultWindow\n } = options;\n const selection = ref(null);\n const text = computed(() => {\n var _a, _b;\n return (_b = (_a = selection.value) == null ? void 0 : _a.toString()) != null ? _b : \"\";\n });\n const ranges = computed(() => selection.value ? getRangesFromSelection(selection.value) : []);\n const rects = computed(() => ranges.value.map((range) => range.getBoundingClientRect()));\n function onSelectionChange() {\n selection.value = null;\n if (window)\n selection.value = window.getSelection();\n }\n if (window)\n useEventListener(window.document, \"selectionchange\", onSelectionChange, { passive: true });\n return {\n text,\n rects,\n ranges,\n selection\n };\n}\n\nfunction tryRequestAnimationFrame(window = defaultWindow, fn) {\n if (window && typeof window.requestAnimationFrame === \"function\") {\n window.requestAnimationFrame(fn);\n } else {\n fn();\n }\n}\nfunction useTextareaAutosize(options = {}) {\n var _a, _b;\n const { window = defaultWindow } = options;\n const textarea = toRef(options == null ? void 0 : options.element);\n const input = toRef((_a = options == null ? void 0 : options.input) != null ? _a : \"\");\n const styleProp = (_b = options == null ? void 0 : options.styleProp) != null ? _b : \"height\";\n const textareaScrollHeight = shallowRef(1);\n const textareaOldWidth = shallowRef(0);\n function triggerResize() {\n var _a2;\n if (!textarea.value)\n return;\n let height = \"\";\n textarea.value.style[styleProp] = \"1px\";\n textareaScrollHeight.value = (_a2 = textarea.value) == null ? void 0 : _a2.scrollHeight;\n const _styleTarget = toValue(options == null ? void 0 : options.styleTarget);\n if (_styleTarget)\n _styleTarget.style[styleProp] = `${textareaScrollHeight.value}px`;\n else\n height = `${textareaScrollHeight.value}px`;\n textarea.value.style[styleProp] = height;\n }\n watch([input, textarea], () => nextTick(triggerResize), { immediate: true });\n watch(textareaScrollHeight, () => {\n var _a2;\n return (_a2 = options == null ? void 0 : options.onResize) == null ? void 0 : _a2.call(options);\n });\n useResizeObserver(textarea, ([{ contentRect }]) => {\n if (textareaOldWidth.value === contentRect.width)\n return;\n tryRequestAnimationFrame(window, () => {\n textareaOldWidth.value = contentRect.width;\n triggerResize();\n });\n });\n if (options == null ? void 0 : options.watch)\n watch(options.watch, triggerResize, { immediate: true, deep: true });\n return {\n textarea,\n input,\n triggerResize\n };\n}\n\nfunction useThrottledRefHistory(source, options = {}) {\n const { throttle = 200, trailing = true } = options;\n const filter = throttleFilter(throttle, trailing);\n const history = useRefHistory(source, { ...options, eventFilter: filter });\n return {\n ...history\n };\n}\n\nconst DEFAULT_UNITS = [\n { max: 6e4, value: 1e3, name: \"second\" },\n { max: 276e4, value: 6e4, name: \"minute\" },\n { max: 72e6, value: 36e5, name: \"hour\" },\n { max: 5184e5, value: 864e5, name: \"day\" },\n { max: 24192e5, value: 6048e5, name: \"week\" },\n { max: 28512e6, value: 2592e6, name: \"month\" },\n { max: Number.POSITIVE_INFINITY, value: 31536e6, name: \"year\" }\n];\nconst DEFAULT_MESSAGES = {\n justNow: \"just now\",\n past: (n) => n.match(/\\d/) ? `${n} ago` : n,\n future: (n) => n.match(/\\d/) ? `in ${n}` : n,\n month: (n, past) => n === 1 ? past ? \"last month\" : \"next month\" : `${n} month${n > 1 ? \"s\" : \"\"}`,\n year: (n, past) => n === 1 ? past ? \"last year\" : \"next year\" : `${n} year${n > 1 ? \"s\" : \"\"}`,\n day: (n, past) => n === 1 ? past ? \"yesterday\" : \"tomorrow\" : `${n} day${n > 1 ? \"s\" : \"\"}`,\n week: (n, past) => n === 1 ? past ? \"last week\" : \"next week\" : `${n} week${n > 1 ? \"s\" : \"\"}`,\n hour: (n) => `${n} hour${n > 1 ? \"s\" : \"\"}`,\n minute: (n) => `${n} minute${n > 1 ? \"s\" : \"\"}`,\n second: (n) => `${n} second${n > 1 ? \"s\" : \"\"}`,\n invalid: \"\"\n};\nfunction DEFAULT_FORMATTER(date) {\n return date.toISOString().slice(0, 10);\n}\nfunction useTimeAgo(time, options = {}) {\n const {\n controls: exposeControls = false,\n updateInterval = 3e4\n } = options;\n const { now, ...controls } = useNow({ interval: updateInterval, controls: true });\n const timeAgo = computed(() => formatTimeAgo(new Date(toValue(time)), options, toValue(now)));\n if (exposeControls) {\n return {\n timeAgo,\n ...controls\n };\n } else {\n return timeAgo;\n }\n}\nfunction formatTimeAgo(from, options = {}, now = Date.now()) {\n var _a;\n const {\n max,\n messages = DEFAULT_MESSAGES,\n fullDateFormatter = DEFAULT_FORMATTER,\n units = DEFAULT_UNITS,\n showSecond = false,\n rounding = \"round\"\n } = options;\n const roundFn = typeof rounding === \"number\" ? (n) => +n.toFixed(rounding) : Math[rounding];\n const diff = +now - +from;\n const absDiff = Math.abs(diff);\n function getValue(diff2, unit) {\n return roundFn(Math.abs(diff2) / unit.value);\n }\n function format(diff2, unit) {\n const val = getValue(diff2, unit);\n const past = diff2 > 0;\n const str = applyFormat(unit.name, val, past);\n return applyFormat(past ? \"past\" : \"future\", str, past);\n }\n function applyFormat(name, val, isPast) {\n const formatter = messages[name];\n if (typeof formatter === \"function\")\n return formatter(val, isPast);\n return formatter.replace(\"{0}\", val.toString());\n }\n if (absDiff < 6e4 && !showSecond)\n return messages.justNow;\n if (typeof max === \"number\" && absDiff > max)\n return fullDateFormatter(new Date(from));\n if (typeof max === \"string\") {\n const unitMax = (_a = units.find((i) => i.name === max)) == null ? void 0 : _a.max;\n if (unitMax && absDiff > unitMax)\n return fullDateFormatter(new Date(from));\n }\n for (const [idx, unit] of units.entries()) {\n const val = getValue(diff, unit);\n if (val <= 0 && units[idx - 1])\n return format(diff, units[idx - 1]);\n if (absDiff < unit.max)\n return format(diff, unit);\n }\n return messages.invalid;\n}\n\nfunction useTimeoutPoll(fn, interval, options = {}) {\n const {\n immediate = true,\n immediateCallback = false\n } = options;\n const { start } = useTimeoutFn(loop, interval, { immediate });\n const isActive = shallowRef(false);\n async function loop() {\n if (!isActive.value)\n return;\n await fn();\n start();\n }\n function resume() {\n if (!isActive.value) {\n isActive.value = true;\n if (immediateCallback)\n fn();\n start();\n }\n }\n function pause() {\n isActive.value = false;\n }\n if (immediate && isClient)\n resume();\n tryOnScopeDispose(pause);\n return {\n isActive,\n pause,\n resume\n };\n}\n\nfunction useTimestamp(options = {}) {\n const {\n controls: exposeControls = false,\n offset = 0,\n immediate = true,\n interval = \"requestAnimationFrame\",\n callback\n } = options;\n const ts = shallowRef(timestamp() + offset);\n const update = () => ts.value = timestamp() + offset;\n const cb = callback ? () => {\n update();\n callback(ts.value);\n } : update;\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(cb, { immediate }) : useIntervalFn(cb, interval, { immediate });\n if (exposeControls) {\n return {\n timestamp: ts,\n ...controls\n };\n } else {\n return ts;\n }\n}\n\nfunction useTitle(newTitle = null, options = {}) {\n var _a, _b, _c;\n const {\n document = defaultDocument,\n restoreOnUnmount = (t) => t\n } = options;\n const originalTitle = (_a = document == null ? void 0 : document.title) != null ? _a : \"\";\n const title = toRef((_b = newTitle != null ? newTitle : document == null ? void 0 : document.title) != null ? _b : null);\n const isReadonly = !!(newTitle && typeof newTitle === \"function\");\n function format(t) {\n if (!(\"titleTemplate\" in options))\n return t;\n const template = options.titleTemplate || \"%s\";\n return typeof template === \"function\" ? template(t) : toValue(template).replace(/%s/g, t);\n }\n watch(\n title,\n (newValue, oldValue) => {\n if (newValue !== oldValue && document)\n document.title = format(newValue != null ? newValue : \"\");\n },\n { immediate: true }\n );\n if (options.observe && !options.titleTemplate && document && !isReadonly) {\n useMutationObserver(\n (_c = document.head) == null ? void 0 : _c.querySelector(\"title\"),\n () => {\n if (document && document.title !== title.value)\n title.value = format(document.title);\n },\n { childList: true }\n );\n }\n tryOnScopeDispose(() => {\n if (restoreOnUnmount) {\n const restoredTitle = restoreOnUnmount(originalTitle, title.value || \"\");\n if (restoredTitle != null && document)\n document.title = restoredTitle;\n }\n });\n return title;\n}\n\nconst _TransitionPresets = {\n easeInSine: [0.12, 0, 0.39, 0],\n easeOutSine: [0.61, 1, 0.88, 1],\n easeInOutSine: [0.37, 0, 0.63, 1],\n easeInQuad: [0.11, 0, 0.5, 0],\n easeOutQuad: [0.5, 1, 0.89, 1],\n easeInOutQuad: [0.45, 0, 0.55, 1],\n easeInCubic: [0.32, 0, 0.67, 0],\n easeOutCubic: [0.33, 1, 0.68, 1],\n easeInOutCubic: [0.65, 0, 0.35, 1],\n easeInQuart: [0.5, 0, 0.75, 0],\n easeOutQuart: [0.25, 1, 0.5, 1],\n easeInOutQuart: [0.76, 0, 0.24, 1],\n easeInQuint: [0.64, 0, 0.78, 0],\n easeOutQuint: [0.22, 1, 0.36, 1],\n easeInOutQuint: [0.83, 0, 0.17, 1],\n easeInExpo: [0.7, 0, 0.84, 0],\n easeOutExpo: [0.16, 1, 0.3, 1],\n easeInOutExpo: [0.87, 0, 0.13, 1],\n easeInCirc: [0.55, 0, 1, 0.45],\n easeOutCirc: [0, 0.55, 0.45, 1],\n easeInOutCirc: [0.85, 0, 0.15, 1],\n easeInBack: [0.36, 0, 0.66, -0.56],\n easeOutBack: [0.34, 1.56, 0.64, 1],\n easeInOutBack: [0.68, -0.6, 0.32, 1.6]\n};\nconst TransitionPresets = /* @__PURE__ */ Object.assign({}, { linear: identity }, _TransitionPresets);\nfunction createEasingFunction([p0, p1, p2, p3]) {\n const a = (a1, a2) => 1 - 3 * a2 + 3 * a1;\n const b = (a1, a2) => 3 * a2 - 6 * a1;\n const c = (a1) => 3 * a1;\n const calcBezier = (t, a1, a2) => ((a(a1, a2) * t + b(a1, a2)) * t + c(a1)) * t;\n const getSlope = (t, a1, a2) => 3 * a(a1, a2) * t * t + 2 * b(a1, a2) * t + c(a1);\n const getTforX = (x) => {\n let aGuessT = x;\n for (let i = 0; i < 4; ++i) {\n const currentSlope = getSlope(aGuessT, p0, p2);\n if (currentSlope === 0)\n return aGuessT;\n const currentX = calcBezier(aGuessT, p0, p2) - x;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n };\n return (x) => p0 === p1 && p2 === p3 ? x : calcBezier(getTforX(x), p1, p3);\n}\nfunction lerp(a, b, alpha) {\n return a + alpha * (b - a);\n}\nfunction toVec(t) {\n return (typeof t === \"number\" ? [t] : t) || [];\n}\nfunction executeTransition(source, from, to, options = {}) {\n var _a, _b;\n const fromVal = toValue(from);\n const toVal = toValue(to);\n const v1 = toVec(fromVal);\n const v2 = toVec(toVal);\n const duration = (_a = toValue(options.duration)) != null ? _a : 1e3;\n const startedAt = Date.now();\n const endAt = Date.now() + duration;\n const trans = typeof options.transition === \"function\" ? options.transition : (_b = toValue(options.transition)) != null ? _b : identity;\n const ease = typeof trans === \"function\" ? trans : createEasingFunction(trans);\n return new Promise((resolve) => {\n source.value = fromVal;\n const tick = () => {\n var _a2;\n if ((_a2 = options.abort) == null ? void 0 : _a2.call(options)) {\n resolve();\n return;\n }\n const now = Date.now();\n const alpha = ease((now - startedAt) / duration);\n const arr = toVec(source.value).map((n, i) => lerp(v1[i], v2[i], alpha));\n if (Array.isArray(source.value))\n source.value = arr.map((n, i) => {\n var _a3, _b2;\n return lerp((_a3 = v1[i]) != null ? _a3 : 0, (_b2 = v2[i]) != null ? _b2 : 0, alpha);\n });\n else if (typeof source.value === \"number\")\n source.value = arr[0];\n if (now < endAt) {\n requestAnimationFrame(tick);\n } else {\n source.value = toVal;\n resolve();\n }\n };\n tick();\n });\n}\nfunction useTransition(source, options = {}) {\n let currentId = 0;\n const sourceVal = () => {\n const v = toValue(source);\n return typeof v === \"number\" ? v : v.map(toValue);\n };\n const outputRef = ref(sourceVal());\n watch(sourceVal, async (to) => {\n var _a, _b;\n if (toValue(options.disabled))\n return;\n const id = ++currentId;\n if (options.delay)\n await promiseTimeout(toValue(options.delay));\n if (id !== currentId)\n return;\n const toVal = Array.isArray(to) ? to.map(toValue) : toValue(to);\n (_a = options.onStarted) == null ? void 0 : _a.call(options);\n await executeTransition(outputRef, outputRef.value, toVal, {\n ...options,\n abort: () => {\n var _a2;\n return id !== currentId || ((_a2 = options.abort) == null ? void 0 : _a2.call(options));\n }\n });\n (_b = options.onFinished) == null ? void 0 : _b.call(options);\n }, { deep: true });\n watch(() => toValue(options.disabled), (disabled) => {\n if (disabled) {\n currentId++;\n outputRef.value = sourceVal();\n }\n });\n tryOnScopeDispose(() => {\n currentId++;\n });\n return computed(() => toValue(options.disabled) ? sourceVal() : outputRef.value);\n}\n\nfunction useUrlSearchParams(mode = \"history\", options = {}) {\n const {\n initialValue = {},\n removeNullishValues = true,\n removeFalsyValues = false,\n write: enableWrite = true,\n writeMode = \"replace\",\n window = defaultWindow\n } = options;\n if (!window)\n return reactive(initialValue);\n const state = reactive({});\n function getRawParams() {\n if (mode === \"history\") {\n return window.location.search || \"\";\n } else if (mode === \"hash\") {\n const hash = window.location.hash || \"\";\n const index = hash.indexOf(\"?\");\n return index > 0 ? hash.slice(index) : \"\";\n } else {\n return (window.location.hash || \"\").replace(/^#/, \"\");\n }\n }\n function constructQuery(params) {\n const stringified = params.toString();\n if (mode === \"history\")\n return `${stringified ? `?${stringified}` : \"\"}${window.location.hash || \"\"}`;\n if (mode === \"hash-params\")\n return `${window.location.search || \"\"}${stringified ? `#${stringified}` : \"\"}`;\n const hash = window.location.hash || \"#\";\n const index = hash.indexOf(\"?\");\n if (index > 0)\n return `${window.location.search || \"\"}${hash.slice(0, index)}${stringified ? `?${stringified}` : \"\"}`;\n return `${window.location.search || \"\"}${hash}${stringified ? `?${stringified}` : \"\"}`;\n }\n function read() {\n return new URLSearchParams(getRawParams());\n }\n function updateState(params) {\n const unusedKeys = new Set(Object.keys(state));\n for (const key of params.keys()) {\n const paramsForKey = params.getAll(key);\n state[key] = paramsForKey.length > 1 ? paramsForKey : params.get(key) || \"\";\n unusedKeys.delete(key);\n }\n Array.from(unusedKeys).forEach((key) => delete state[key]);\n }\n const { pause, resume } = pausableWatch(\n state,\n () => {\n const params = new URLSearchParams(\"\");\n Object.keys(state).forEach((key) => {\n const mapEntry = state[key];\n if (Array.isArray(mapEntry))\n mapEntry.forEach((value) => params.append(key, value));\n else if (removeNullishValues && mapEntry == null)\n params.delete(key);\n else if (removeFalsyValues && !mapEntry)\n params.delete(key);\n else\n params.set(key, mapEntry);\n });\n write(params, false);\n },\n { deep: true }\n );\n function write(params, shouldUpdate) {\n pause();\n if (shouldUpdate)\n updateState(params);\n if (writeMode === \"replace\") {\n window.history.replaceState(\n window.history.state,\n window.document.title,\n window.location.pathname + constructQuery(params)\n );\n } else {\n window.history.pushState(\n window.history.state,\n window.document.title,\n window.location.pathname + constructQuery(params)\n );\n }\n resume();\n }\n function onChanged() {\n if (!enableWrite)\n return;\n write(read(), true);\n }\n const listenerOptions = { passive: true };\n useEventListener(window, \"popstate\", onChanged, listenerOptions);\n if (mode !== \"history\")\n useEventListener(window, \"hashchange\", onChanged, listenerOptions);\n const initial = read();\n if (initial.keys().next().value)\n updateState(initial);\n else\n Object.assign(state, initialValue);\n return state;\n}\n\nfunction useUserMedia(options = {}) {\n var _a, _b;\n const enabled = shallowRef((_a = options.enabled) != null ? _a : false);\n const autoSwitch = shallowRef((_b = options.autoSwitch) != null ? _b : true);\n const constraints = ref(options.constraints);\n const { navigator = defaultNavigator } = options;\n const isSupported = useSupported(() => {\n var _a2;\n return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getUserMedia;\n });\n const stream = shallowRef();\n function getDeviceOptions(type) {\n switch (type) {\n case \"video\": {\n if (constraints.value)\n return constraints.value.video || false;\n break;\n }\n case \"audio\": {\n if (constraints.value)\n return constraints.value.audio || false;\n break;\n }\n }\n }\n async function _start() {\n if (!isSupported.value || stream.value)\n return;\n stream.value = await navigator.mediaDevices.getUserMedia({\n video: getDeviceOptions(\"video\"),\n audio: getDeviceOptions(\"audio\")\n });\n return stream.value;\n }\n function _stop() {\n var _a2;\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());\n stream.value = void 0;\n }\n function stop() {\n _stop();\n enabled.value = false;\n }\n async function start() {\n await _start();\n if (stream.value)\n enabled.value = true;\n return stream.value;\n }\n async function restart() {\n _stop();\n return await start();\n }\n watch(\n enabled,\n (v) => {\n if (v)\n _start();\n else _stop();\n },\n { immediate: true }\n );\n watch(\n constraints,\n () => {\n if (autoSwitch.value && stream.value)\n restart();\n },\n { immediate: true }\n );\n tryOnScopeDispose(() => {\n stop();\n });\n return {\n isSupported,\n stream,\n start,\n stop,\n restart,\n constraints,\n enabled,\n autoSwitch\n };\n}\n\nfunction useVModel(props, key, emit, options = {}) {\n var _a, _b, _c;\n const {\n clone = false,\n passive = false,\n eventName,\n deep = false,\n defaultValue,\n shouldEmit\n } = options;\n const vm = getCurrentInstance();\n 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));\n let event = eventName;\n if (!key) {\n key = \"modelValue\";\n }\n event = event || `update:${key.toString()}`;\n const cloneFn = (val) => !clone ? val : typeof clone === \"function\" ? clone(val) : cloneFnJSON(val);\n const getValue = () => isDef(props[key]) ? cloneFn(props[key]) : defaultValue;\n const triggerEmit = (value) => {\n if (shouldEmit) {\n if (shouldEmit(value))\n _emit(event, value);\n } else {\n _emit(event, value);\n }\n };\n if (passive) {\n const initialValue = getValue();\n const proxy = ref(initialValue);\n let isUpdating = false;\n watch(\n () => props[key],\n (v) => {\n if (!isUpdating) {\n isUpdating = true;\n proxy.value = cloneFn(v);\n nextTick(() => isUpdating = false);\n }\n }\n );\n watch(\n proxy,\n (v) => {\n if (!isUpdating && (v !== props[key] || deep))\n triggerEmit(v);\n },\n { deep }\n );\n return proxy;\n } else {\n return computed({\n get() {\n return getValue();\n },\n set(value) {\n triggerEmit(value);\n }\n });\n }\n}\n\nfunction useVModels(props, emit, options = {}) {\n const ret = {};\n for (const key in props) {\n ret[key] = useVModel(\n props,\n key,\n emit,\n options\n );\n }\n return ret;\n}\n\nfunction useVibrate(options) {\n const {\n pattern = [],\n interval = 0,\n navigator = defaultNavigator\n } = options || {};\n const isSupported = useSupported(() => typeof navigator !== \"undefined\" && \"vibrate\" in navigator);\n const patternRef = toRef(pattern);\n let intervalControls;\n const vibrate = (pattern2 = patternRef.value) => {\n if (isSupported.value)\n navigator.vibrate(pattern2);\n };\n const stop = () => {\n if (isSupported.value)\n navigator.vibrate(0);\n intervalControls == null ? void 0 : intervalControls.pause();\n };\n if (interval > 0) {\n intervalControls = useIntervalFn(\n vibrate,\n interval,\n {\n immediate: false,\n immediateCallback: false\n }\n );\n }\n return {\n isSupported,\n pattern,\n intervalControls,\n vibrate,\n stop\n };\n}\n\nfunction useVirtualList(list, options) {\n const { containerStyle, wrapperProps, scrollTo, calculateRange, currentList, containerRef } = \"itemHeight\" in options ? useVerticalVirtualList(options, list) : useHorizontalVirtualList(options, list);\n return {\n list: currentList,\n scrollTo,\n containerProps: {\n ref: containerRef,\n onScroll: () => {\n calculateRange();\n },\n style: containerStyle\n },\n wrapperProps\n };\n}\nfunction useVirtualListResources(list) {\n const containerRef = shallowRef(null);\n const size = useElementSize(containerRef);\n const currentList = ref([]);\n const source = shallowRef(list);\n const state = ref({ start: 0, end: 10 });\n return { state, source, currentList, size, containerRef };\n}\nfunction createGetViewCapacity(state, source, itemSize) {\n return (containerSize) => {\n if (typeof itemSize === \"number\")\n return Math.ceil(containerSize / itemSize);\n const { start = 0 } = state.value;\n let sum = 0;\n let capacity = 0;\n for (let i = start; i < source.value.length; i++) {\n const size = itemSize(i);\n sum += size;\n capacity = i;\n if (sum > containerSize)\n break;\n }\n return capacity - start;\n };\n}\nfunction createGetOffset(source, itemSize) {\n return (scrollDirection) => {\n if (typeof itemSize === \"number\")\n return Math.floor(scrollDirection / itemSize) + 1;\n let sum = 0;\n let offset = 0;\n for (let i = 0; i < source.value.length; i++) {\n const size = itemSize(i);\n sum += size;\n if (sum >= scrollDirection) {\n offset = i;\n break;\n }\n }\n return offset + 1;\n };\n}\nfunction createCalculateRange(type, overscan, getOffset, getViewCapacity, { containerRef, state, currentList, source }) {\n return () => {\n const element = containerRef.value;\n if (element) {\n const offset = getOffset(type === \"vertical\" ? element.scrollTop : element.scrollLeft);\n const viewCapacity = getViewCapacity(type === \"vertical\" ? element.clientHeight : element.clientWidth);\n const from = offset - overscan;\n const to = offset + viewCapacity + overscan;\n state.value = {\n start: from < 0 ? 0 : from,\n end: to > source.value.length ? source.value.length : to\n };\n currentList.value = source.value.slice(state.value.start, state.value.end).map((ele, index) => ({\n data: ele,\n index: index + state.value.start\n }));\n }\n };\n}\nfunction createGetDistance(itemSize, source) {\n return (index) => {\n if (typeof itemSize === \"number\") {\n const size2 = index * itemSize;\n return size2;\n }\n const size = source.value.slice(0, index).reduce((sum, _, i) => sum + itemSize(i), 0);\n return size;\n };\n}\nfunction useWatchForSizes(size, list, containerRef, calculateRange) {\n watch([size.width, size.height, list, containerRef], () => {\n calculateRange();\n });\n}\nfunction createComputedTotalSize(itemSize, source) {\n return computed(() => {\n if (typeof itemSize === \"number\")\n return source.value.length * itemSize;\n return source.value.reduce((sum, _, index) => sum + itemSize(index), 0);\n });\n}\nconst scrollToDictionaryForElementScrollKey = {\n horizontal: \"scrollLeft\",\n vertical: \"scrollTop\"\n};\nfunction createScrollTo(type, calculateRange, getDistance, containerRef) {\n return (index) => {\n if (containerRef.value) {\n containerRef.value[scrollToDictionaryForElementScrollKey[type]] = getDistance(index);\n calculateRange();\n }\n };\n}\nfunction useHorizontalVirtualList(options, list) {\n const resources = useVirtualListResources(list);\n const { state, source, currentList, size, containerRef } = resources;\n const containerStyle = { overflowX: \"auto\" };\n const { itemWidth, overscan = 5 } = options;\n const getViewCapacity = createGetViewCapacity(state, source, itemWidth);\n const getOffset = createGetOffset(source, itemWidth);\n const calculateRange = createCalculateRange(\"horizontal\", overscan, getOffset, getViewCapacity, resources);\n const getDistanceLeft = createGetDistance(itemWidth, source);\n const offsetLeft = computed(() => getDistanceLeft(state.value.start));\n const totalWidth = createComputedTotalSize(itemWidth, source);\n useWatchForSizes(size, list, containerRef, calculateRange);\n const scrollTo = createScrollTo(\"horizontal\", calculateRange, getDistanceLeft, containerRef);\n const wrapperProps = computed(() => {\n return {\n style: {\n height: \"100%\",\n width: `${totalWidth.value - offsetLeft.value}px`,\n marginLeft: `${offsetLeft.value}px`,\n display: \"flex\"\n }\n };\n });\n return {\n scrollTo,\n calculateRange,\n wrapperProps,\n containerStyle,\n currentList,\n containerRef\n };\n}\nfunction useVerticalVirtualList(options, list) {\n const resources = useVirtualListResources(list);\n const { state, source, currentList, size, containerRef } = resources;\n const containerStyle = { overflowY: \"auto\" };\n const { itemHeight, overscan = 5 } = options;\n const getViewCapacity = createGetViewCapacity(state, source, itemHeight);\n const getOffset = createGetOffset(source, itemHeight);\n const calculateRange = createCalculateRange(\"vertical\", overscan, getOffset, getViewCapacity, resources);\n const getDistanceTop = createGetDistance(itemHeight, source);\n const offsetTop = computed(() => getDistanceTop(state.value.start));\n const totalHeight = createComputedTotalSize(itemHeight, source);\n useWatchForSizes(size, list, containerRef, calculateRange);\n const scrollTo = createScrollTo(\"vertical\", calculateRange, getDistanceTop, containerRef);\n const wrapperProps = computed(() => {\n return {\n style: {\n width: \"100%\",\n height: `${totalHeight.value - offsetTop.value}px`,\n marginTop: `${offsetTop.value}px`\n }\n };\n });\n return {\n calculateRange,\n scrollTo,\n containerStyle,\n wrapperProps,\n currentList,\n containerRef\n };\n}\n\nfunction useWakeLock(options = {}) {\n const {\n navigator = defaultNavigator,\n document = defaultDocument\n } = options;\n const requestedType = shallowRef(false);\n const sentinel = shallowRef(null);\n const documentVisibility = useDocumentVisibility({ document });\n const isSupported = useSupported(() => navigator && \"wakeLock\" in navigator);\n const isActive = computed(() => !!sentinel.value && documentVisibility.value === \"visible\");\n if (isSupported.value) {\n useEventListener(sentinel, \"release\", () => {\n var _a, _b;\n requestedType.value = (_b = (_a = sentinel.value) == null ? void 0 : _a.type) != null ? _b : false;\n }, { passive: true });\n whenever(\n () => documentVisibility.value === \"visible\" && (document == null ? void 0 : document.visibilityState) === \"visible\" && requestedType.value,\n (type) => {\n requestedType.value = false;\n forceRequest(type);\n }\n );\n }\n async function forceRequest(type) {\n var _a;\n await ((_a = sentinel.value) == null ? void 0 : _a.release());\n sentinel.value = isSupported.value ? await navigator.wakeLock.request(type) : null;\n }\n async function request(type) {\n if (documentVisibility.value === \"visible\")\n await forceRequest(type);\n else\n requestedType.value = type;\n }\n async function release() {\n requestedType.value = false;\n const s = sentinel.value;\n sentinel.value = null;\n await (s == null ? void 0 : s.release());\n }\n return {\n sentinel,\n isSupported,\n isActive,\n request,\n forceRequest,\n release\n };\n}\n\nfunction useWebNotification(options = {}) {\n const {\n window = defaultWindow,\n requestPermissions: _requestForPermissions = true\n } = options;\n const defaultWebNotificationOptions = options;\n const isSupported = useSupported(() => {\n if (!window || !(\"Notification\" in window))\n return false;\n if (Notification.permission === \"granted\")\n return true;\n try {\n const notification2 = new Notification(\"\");\n notification2.onshow = () => {\n notification2.close();\n };\n } catch (e) {\n if (e.name === \"TypeError\")\n return false;\n }\n return true;\n });\n const permissionGranted = shallowRef(isSupported.value && \"permission\" in Notification && Notification.permission === \"granted\");\n const notification = ref(null);\n const ensurePermissions = async () => {\n if (!isSupported.value)\n return;\n if (!permissionGranted.value && Notification.permission !== \"denied\") {\n const result = await Notification.requestPermission();\n if (result === \"granted\")\n permissionGranted.value = true;\n }\n return permissionGranted.value;\n };\n const { on: onClick, trigger: clickTrigger } = createEventHook();\n const { on: onShow, trigger: showTrigger } = createEventHook();\n const { on: onError, trigger: errorTrigger } = createEventHook();\n const { on: onClose, trigger: closeTrigger } = createEventHook();\n const show = async (overrides) => {\n if (!isSupported.value || !permissionGranted.value)\n return;\n const options2 = Object.assign({}, defaultWebNotificationOptions, overrides);\n notification.value = new Notification(options2.title || \"\", options2);\n notification.value.onclick = clickTrigger;\n notification.value.onshow = showTrigger;\n notification.value.onerror = errorTrigger;\n notification.value.onclose = closeTrigger;\n return notification.value;\n };\n const close = () => {\n if (notification.value)\n notification.value.close();\n notification.value = null;\n };\n if (_requestForPermissions)\n tryOnMounted(ensurePermissions);\n tryOnScopeDispose(close);\n if (isSupported.value && window) {\n const document = window.document;\n useEventListener(document, \"visibilitychange\", (e) => {\n e.preventDefault();\n if (document.visibilityState === \"visible\") {\n close();\n }\n });\n }\n return {\n isSupported,\n notification,\n ensurePermissions,\n permissionGranted,\n show,\n close,\n onClick,\n onShow,\n onError,\n onClose\n };\n}\n\nconst DEFAULT_PING_MESSAGE = \"ping\";\nfunction resolveNestedOptions(options) {\n if (options === true)\n return {};\n return options;\n}\nfunction useWebSocket(url, options = {}) {\n const {\n onConnected,\n onDisconnected,\n onError,\n onMessage,\n immediate = true,\n autoConnect = true,\n autoClose = true,\n protocols = []\n } = options;\n const data = ref(null);\n const status = shallowRef(\"CLOSED\");\n const wsRef = ref();\n const urlRef = toRef(url);\n let heartbeatPause;\n let heartbeatResume;\n let explicitlyClosed = false;\n let retried = 0;\n let bufferedData = [];\n let retryTimeout;\n let pongTimeoutWait;\n const _sendBuffer = () => {\n if (bufferedData.length && wsRef.value && status.value === \"OPEN\") {\n for (const buffer of bufferedData)\n wsRef.value.send(buffer);\n bufferedData = [];\n }\n };\n const resetRetry = () => {\n if (retryTimeout != null) {\n clearTimeout(retryTimeout);\n retryTimeout = void 0;\n }\n };\n const resetHeartbeat = () => {\n clearTimeout(pongTimeoutWait);\n pongTimeoutWait = void 0;\n };\n const close = (code = 1e3, reason) => {\n resetRetry();\n if (!isClient && !isWorker || !wsRef.value)\n return;\n explicitlyClosed = true;\n resetHeartbeat();\n heartbeatPause == null ? void 0 : heartbeatPause();\n wsRef.value.close(code, reason);\n wsRef.value = void 0;\n };\n const send = (data2, useBuffer = true) => {\n if (!wsRef.value || status.value !== \"OPEN\") {\n if (useBuffer)\n bufferedData.push(data2);\n return false;\n }\n _sendBuffer();\n wsRef.value.send(data2);\n return true;\n };\n const _init = () => {\n if (explicitlyClosed || typeof urlRef.value === \"undefined\")\n return;\n const ws = new WebSocket(urlRef.value, protocols);\n wsRef.value = ws;\n status.value = \"CONNECTING\";\n ws.onopen = () => {\n status.value = \"OPEN\";\n retried = 0;\n onConnected == null ? void 0 : onConnected(ws);\n heartbeatResume == null ? void 0 : heartbeatResume();\n _sendBuffer();\n };\n ws.onclose = (ev) => {\n status.value = \"CLOSED\";\n resetHeartbeat();\n heartbeatPause == null ? void 0 : heartbeatPause();\n onDisconnected == null ? void 0 : onDisconnected(ws, ev);\n if (!explicitlyClosed && options.autoReconnect && (wsRef.value == null || ws === wsRef.value)) {\n const {\n retries = -1,\n delay = 1e3,\n onFailed\n } = resolveNestedOptions(options.autoReconnect);\n const checkRetires = typeof retries === \"function\" ? retries : () => typeof retries === \"number\" && (retries < 0 || retried < retries);\n if (checkRetires(retried)) {\n retried += 1;\n retryTimeout = setTimeout(_init, delay);\n } else {\n onFailed == null ? void 0 : onFailed();\n }\n }\n };\n ws.onerror = (e) => {\n onError == null ? void 0 : onError(ws, e);\n };\n ws.onmessage = (e) => {\n if (options.heartbeat) {\n resetHeartbeat();\n const {\n message = DEFAULT_PING_MESSAGE,\n responseMessage = message\n } = resolveNestedOptions(options.heartbeat);\n if (e.data === toValue(responseMessage))\n return;\n }\n data.value = e.data;\n onMessage == null ? void 0 : onMessage(ws, e);\n };\n };\n if (options.heartbeat) {\n const {\n message = DEFAULT_PING_MESSAGE,\n interval = 1e3,\n pongTimeout = 1e3\n } = resolveNestedOptions(options.heartbeat);\n const { pause, resume } = useIntervalFn(\n () => {\n send(toValue(message), false);\n if (pongTimeoutWait != null)\n return;\n pongTimeoutWait = setTimeout(() => {\n close();\n explicitlyClosed = false;\n }, pongTimeout);\n },\n interval,\n { immediate: false }\n );\n heartbeatPause = pause;\n heartbeatResume = resume;\n }\n if (autoClose) {\n if (isClient)\n useEventListener(\"beforeunload\", () => close(), { passive: true });\n tryOnScopeDispose(close);\n }\n const open = () => {\n if (!isClient && !isWorker)\n return;\n close();\n explicitlyClosed = false;\n retried = 0;\n _init();\n };\n if (immediate)\n open();\n if (autoConnect)\n watch(urlRef, open);\n return {\n data,\n status,\n close,\n send,\n open,\n ws: wsRef\n };\n}\n\nfunction useWebWorker(arg0, workerOptions, options) {\n const {\n window = defaultWindow\n } = options != null ? options : {};\n const data = ref(null);\n const worker = shallowRef();\n const post = (...args) => {\n if (!worker.value)\n return;\n worker.value.postMessage(...args);\n };\n const terminate = function terminate2() {\n if (!worker.value)\n return;\n worker.value.terminate();\n };\n if (window) {\n if (typeof arg0 === \"string\")\n worker.value = new Worker(arg0, workerOptions);\n else if (typeof arg0 === \"function\")\n worker.value = arg0();\n else\n worker.value = arg0;\n worker.value.onmessage = (e) => {\n data.value = e.data;\n };\n tryOnScopeDispose(() => {\n if (worker.value)\n worker.value.terminate();\n });\n }\n return {\n data,\n post,\n terminate,\n worker\n };\n}\n\nfunction depsParser(deps, localDeps) {\n if (deps.length === 0 && localDeps.length === 0)\n return \"\";\n const depsString = deps.map((dep) => `'${dep}'`).toString();\n const depsFunctionString = localDeps.filter((dep) => typeof dep === \"function\").map((fn) => {\n const str = fn.toString();\n if (str.trim().startsWith(\"function\")) {\n return str;\n } else {\n const name = fn.name;\n return `const ${name} = ${str}`;\n }\n }).join(\";\");\n const importString = `importScripts(${depsString});`;\n return `${depsString.trim() === \"\" ? \"\" : importString} ${depsFunctionString}`;\n}\n\nfunction jobRunner(userFunc) {\n return (e) => {\n const userFuncArgs = e.data[0];\n return Promise.resolve(userFunc.apply(void 0, userFuncArgs)).then((result) => {\n postMessage([\"SUCCESS\", result]);\n }).catch((error) => {\n postMessage([\"ERROR\", error]);\n });\n };\n}\n\nfunction createWorkerBlobUrl(fn, deps, localDeps) {\n const blobCode = `${depsParser(deps, localDeps)}; onmessage=(${jobRunner})(${fn})`;\n const blob = new Blob([blobCode], { type: \"text/javascript\" });\n const url = URL.createObjectURL(blob);\n return url;\n}\n\nfunction useWebWorkerFn(fn, options = {}) {\n const {\n dependencies = [],\n localDependencies = [],\n timeout,\n window = defaultWindow\n } = options;\n const worker = ref();\n const workerStatus = shallowRef(\"PENDING\");\n const promise = ref({});\n const timeoutId = shallowRef();\n const workerTerminate = (status = \"PENDING\") => {\n if (worker.value && worker.value._url && window) {\n worker.value.terminate();\n URL.revokeObjectURL(worker.value._url);\n promise.value = {};\n worker.value = void 0;\n window.clearTimeout(timeoutId.value);\n workerStatus.value = status;\n }\n };\n workerTerminate();\n tryOnScopeDispose(workerTerminate);\n const generateWorker = () => {\n const blobUrl = createWorkerBlobUrl(fn, dependencies, localDependencies);\n const newWorker = new Worker(blobUrl);\n newWorker._url = blobUrl;\n newWorker.onmessage = (e) => {\n const { resolve = () => {\n }, reject = () => {\n } } = promise.value;\n const [status, result] = e.data;\n switch (status) {\n case \"SUCCESS\":\n resolve(result);\n workerTerminate(status);\n break;\n default:\n reject(result);\n workerTerminate(\"ERROR\");\n break;\n }\n };\n newWorker.onerror = (e) => {\n const { reject = () => {\n } } = promise.value;\n e.preventDefault();\n reject(e);\n workerTerminate(\"ERROR\");\n };\n if (timeout) {\n timeoutId.value = setTimeout(\n () => workerTerminate(\"TIMEOUT_EXPIRED\"),\n timeout\n );\n }\n return newWorker;\n };\n const callWorker = (...fnArgs) => new Promise((resolve, reject) => {\n var _a;\n promise.value = {\n resolve,\n reject\n };\n (_a = worker.value) == null ? void 0 : _a.postMessage([[...fnArgs]]);\n workerStatus.value = \"RUNNING\";\n });\n const workerFn = (...fnArgs) => {\n if (workerStatus.value === \"RUNNING\") {\n console.error(\n \"[useWebWorkerFn] You can only run one instance of the worker at a time.\"\n );\n return Promise.reject();\n }\n worker.value = generateWorker();\n return callWorker(...fnArgs);\n };\n return {\n workerFn,\n workerStatus,\n workerTerminate\n };\n}\n\nfunction useWindowFocus(options = {}) {\n const { window = defaultWindow } = options;\n if (!window)\n return shallowRef(false);\n const focused = shallowRef(window.document.hasFocus());\n const listenerOptions = { passive: true };\n useEventListener(window, \"blur\", () => {\n focused.value = false;\n }, listenerOptions);\n useEventListener(window, \"focus\", () => {\n focused.value = true;\n }, listenerOptions);\n return focused;\n}\n\nfunction useWindowScroll(options = {}) {\n const { window = defaultWindow, ...rest } = options;\n return useScroll(window, rest);\n}\n\nfunction useWindowSize(options = {}) {\n const {\n window = defaultWindow,\n initialWidth = Number.POSITIVE_INFINITY,\n initialHeight = Number.POSITIVE_INFINITY,\n listenOrientation = true,\n includeScrollbar = true,\n type = \"inner\"\n } = options;\n const width = shallowRef(initialWidth);\n const height = shallowRef(initialHeight);\n const update = () => {\n if (window) {\n if (type === \"outer\") {\n width.value = window.outerWidth;\n height.value = window.outerHeight;\n } else if (type === \"visual\" && window.visualViewport) {\n const { width: visualViewportWidth, height: visualViewportHeight, scale } = window.visualViewport;\n width.value = Math.round(visualViewportWidth * scale);\n height.value = Math.round(visualViewportHeight * scale);\n } else if (includeScrollbar) {\n width.value = window.innerWidth;\n height.value = window.innerHeight;\n } else {\n width.value = window.document.documentElement.clientWidth;\n height.value = window.document.documentElement.clientHeight;\n }\n }\n };\n update();\n tryOnMounted(update);\n const listenerOptions = { passive: true };\n useEventListener(\"resize\", update, listenerOptions);\n if (window && type === \"visual\" && window.visualViewport) {\n useEventListener(window.visualViewport, \"resize\", update, listenerOptions);\n }\n if (listenOrientation) {\n const matches = useMediaQuery(\"(orientation: portrait)\");\n watch(matches, () => update());\n }\n return { width, height };\n}\n\nexport { DefaultMagicKeysAliasMap, StorageSerializers, TransitionPresets, computedAsync as asyncComputed, breakpointsAntDesign, breakpointsBootstrapV5, breakpointsElement, breakpointsMasterCss, breakpointsPrimeFlex, breakpointsQuasar, breakpointsSematic, breakpointsTailwind, breakpointsVuetify, breakpointsVuetifyV2, breakpointsVuetifyV3, cloneFnJSON, computedAsync, computedInject, createFetch, createReusableTemplate, createTemplatePromise, createUnrefFn, customStorageEventName, defaultDocument, defaultLocation, defaultNavigator, defaultWindow, executeTransition, formatTimeAgo, getSSRHandler, mapGamepadToXbox360Controller, onClickOutside, onElementRemoval, onKeyDown, onKeyPressed, onKeyStroke, onKeyUp, onLongPress, onStartTyping, provideSSRWidth, setSSRHandler, templateRef, unrefElement, useActiveElement, useAnimate, useAsyncQueue, useAsyncState, useBase64, useBattery, useBluetooth, useBreakpoints, useBroadcastChannel, useBrowserLocation, useCached, useClipboard, useClipboardItems, useCloned, useColorMode, useConfirmDialog, useCountdown, useCssVar, useCurrentElement, useCycleList, useDark, useDebouncedRefHistory, useDeviceMotion, useDeviceOrientation, useDevicePixelRatio, useDevicesList, useDisplayMedia, useDocumentVisibility, useDraggable, useDropZone, useElementBounding, useElementByPoint, useElementHover, useElementSize, useElementVisibility, useEventBus, useEventListener, useEventSource, useEyeDropper, useFavicon, useFetch, useFileDialog, useFileSystemAccess, useFocus, useFocusWithin, useFps, useFullscreen, useGamepad, useGeolocation, useIdle, useImage, useInfiniteScroll, useIntersectionObserver, useKeyModifier, useLocalStorage, useMagicKeys, useManualRefHistory, useMediaControls, useMediaQuery, useMemoize, useMemory, useMounted, useMouse, useMouseInElement, useMousePressed, useMutationObserver, useNavigatorLanguage, useNetwork, useNow, useObjectUrl, useOffsetPagination, useOnline, usePageLeave, useParallax, useParentElement, usePerformanceObserver, usePermission, usePointer, usePointerLock, usePointerSwipe, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePreferredLanguages, usePreferredReducedMotion, usePreferredReducedTransparency, usePrevious, useRafFn, useRefHistory, useResizeObserver, useSSRWidth, useScreenOrientation, useScreenSafeArea, useScriptTag, useScroll, useScrollLock, useSessionStorage, useShare, useSorted, useSpeechRecognition, useSpeechSynthesis, useStepper, useStorage, useStorageAsync, useStyleTag, useSupported, useSwipe, useTemplateRefsList, useTextDirection, useTextSelection, useTextareaAutosize, useThrottledRefHistory, useTimeAgo, useTimeoutPoll, useTimestamp, useTitle, useTransition, useUrlSearchParams, useUserMedia, useVModel, useVModels, useVibrate, useVirtualList, useWakeLock, useWebNotification, useWebSocket, useWebWorker, useWebWorkerFn, useWindowFocus, useWindowScroll, useWindowSize };\n","<template>\r\n <VFormControl class=\"mech-v-input\" :error=\"error\" :label=\"label\" :required=\"required\" :disabled=\"disabled\" :class=\"{ large, multiline }\" outline>\r\n <template v-if=\"$slots.actions\" #actions><slot name=\"actions\"></slot></template>\r\n <slot name=\"start-adornment\"></slot>\r\n <div v-if=\"props.prefix\" class=\"mech-v-input__start-adornment\">{{ props.prefix }}</div>\r\n <textarea \r\n v-if=\"props.multiline\" \r\n ref=\"inputRef\" \r\n v-model=\"model\" \r\n :placeholder=\"props.placeholder\" \r\n :rows=\"props.rows\" \r\n class=\"scroll\"\r\n :name=\"props.name\"\r\n ></textarea>\r\n <input \r\n v-else \r\n ref=\"inputRef\" \r\n v-model=\"model\" \r\n :placeholder=\"props.placeholder\" \r\n :type=\"inputType\"\r\n :name=\"props.name\"\r\n />\r\n <div v-if=\"props.maxLength\" class=\"mech-v-input__max-length\">{{ model.length }} / {{ props.maxLength }}</div>\r\n <slot name=\"end-adornment\"></slot>\r\n </VFormControl>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { Ref, computed, onMounted, ref, watch } from 'vue';\r\nimport VFormControl, { VFormControlProps } from './VFormControl.vue';\r\nimport { useTextareaAutosize } from '@vueuse/core';\r\n\r\nconst props = defineProps<{ \r\n modelValue?: string | number | null,\r\n multiline?: boolean, \r\n autofocus?: boolean,\r\n rows?: number, \r\n placeholder?: string, \r\n type?: \"phone\" | \"number\" | \"integer\" | \"password\", \r\n name?: string,\r\n large?: boolean,\r\n maxLength?: number,\r\n prefix?: string,\r\n validator?: (inputValue: string) => null | any\r\n} & VFormControlProps>()\r\n\r\nconst emit = defineEmits([\"update:modelValue\"])\r\n\r\nconst parse = (value: string) => {\r\n if (props.validator) {\r\n return props.validator(value)\r\n }\r\n if (props.type === \"number\") {\r\n const val = parseFloat(value)\r\n if (isNaN(val)) return null\r\n return val\r\n }\r\n if (props.type === \"integer\") {\r\n const val = parseInt(value)\r\n if (isNaN(val)) return null\r\n return val\r\n }\r\n return value\r\n}\r\n\r\nlet lastValue: number | null | string = \"\"\r\n\r\nconst model = ref(\"\")\r\nwatch(() => props.modelValue, (value) => {\r\n if (value === lastValue) return\r\n model.value = (value ?? \"\").toString()\r\n}, { immediate: true })\r\n\r\nwatch(() => model.value, (modelValue) => {\r\n const val = parse(modelValue)\r\n lastValue = val\r\n emit(\"update:modelValue\", val)\r\n})\r\n\r\nconst error = computed(() => {\r\n if ((props.type === \"number\" || props.type === \"integer\") && model.value && props.modelValue === null) {\r\n return { message: \"Введите числовое значение\" }\r\n }\r\n return props.error\r\n})\r\n\r\nconst inputType = computed(() => {\r\n if (props.type !== \"phone\" && props.type !== \"number\" && props.type !== \"integer\") return props.type\r\n return undefined\r\n})\r\n\r\nconst inputRef = ref<HTMLInputElement | HTMLTextAreaElement>()\r\nonMounted(() => {\r\n if (props.autofocus || props.error) {\r\n inputRef.value?.focus()\r\n }\r\n})\r\n\r\nif (props.multiline) {\r\n useTextareaAutosize({ element: inputRef as Ref<HTMLTextAreaElement>, input: model })\r\n}\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n\r\n.mech-v-input\r\n min-width: 240px\r\n .v-form-control__outline\r\n height: 40px\r\n &>svg\r\n align-self: center\r\n color: #CED4DA\r\n\r\n input, textarea\r\n height: 100%\r\n flex-grow: 1\r\n background: none\r\n border: none\r\n padding: 0 12px\r\n outline: none\r\n position: relative\r\n z-index: 1\r\n width: 20px\r\n color: var(--text-color)\r\n font-size: 13px\r\n border-radius: 7px\r\n\r\n &::placeholder\r\n color: var(--placeholder-color)\r\n\r\n input\r\n padding-right: 4px\r\n\r\n &.multiline\r\n .v-form-control__outline\r\n height: auto\r\n\r\n textarea\r\n box-sizing: border-box\r\n line-height: 1.4em\r\n padding: 10px 14px\r\n resize: none\r\n min-height: 60px\r\n\r\n.mech-v-input__start-adornment\r\n padding: 0 16px\r\n border-right: 1px solid #CED4DA\r\n display: flex\r\n align-items: center\r\n justify-content: center\r\n\r\n.mech-v-input__max-length\r\n position: absolute\r\n bottom: 2px\r\n right: 10px\r\n font-size: 12px\r\n color: #C8CCD0\r\n\r\n.mech-v-input.disabled .mech-v-input__input-wrapper\r\n background-color: #F2F2F4\r\n pointer-events: none\r\n\r\n\r\n\r\n</style>","<template>\r\n <div class=\"blocks-list\">\r\n <VInput v-model=\"searchValue\" placeholder=\"Поиск...\" class=\"page-editor-blocks__search\"/>\r\n <div v-for=\"group in groupBlocks\" class=\"page-editor-blocks__group\">\r\n <div class=\"title\">{{ groupNames[group.name] ?? group.name }}</div>\r\n <div class=\"blocks-list__blocks\">\r\n <button \r\n v-for=\"item in group.blocks\" \r\n class=\"blocks-list__block editor-component\" \r\n :key=\"item.id\" \r\n @mousedown=\"onItemMouseDown($event, item)\"\r\n >\r\n {{ item.name }}\r\n </button>\r\n </div>\r\n </div>\r\n <div v-if=\"filteredBlocks.length === 0\" class=\"page-editor__nothing-found\">Блоки не найдены</div>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { computed, inject, ref, Ref } from 'vue'\r\nimport { MultiMap, useDraggableItem, useSearch } from 'vuesix'\r\nimport { Block, BlockDropEvent } from '../types'\r\nimport VInput from '../../common/components/VInput.vue'\r\n\r\nconst props = defineProps<{ blocks: Block[] }>()\r\n\r\nconst searchValue = ref(\"\")\r\nconst filteredBlocks = useSearch(searchValue, () => props.blocks, item => item.name + \" \" + item.id)\r\n\r\nconst groupBlocks = computed(() => {\r\n const groups = new MultiMap<string, Block>()\r\n for (let block of filteredBlocks.value) {\r\n if (block.hidden || block.isDev) continue\r\n groups.add(block.group ?? 'default', block)\r\n }\r\n const output: Array<{ name: string, blocks: Block[] }> = []\r\n for (let [ groupName, blocks ] of groups._map) {\r\n blocks.sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\r\n output.push({ name: groupName, blocks: blocks })\r\n }\r\n output.sort((a, b) => {\r\n if (a.name === \"default\") return 1\r\n if (b.name === \"default\") return -1\r\n return a.name.localeCompare(b.name)\r\n })\r\n return output\r\n})\r\nconst groupNames: Record<string, string> = {\r\n default: \"Доступные блоки\",\r\n layout: \"Макет\"\r\n}\r\n\r\nconst drag = useDraggableItem()\r\nconst dragMode = inject(\"dragMode\") as Ref<boolean>\r\n\r\nconst onItemMouseDown = (e: MouseEvent, item: any) => {\r\n drag(e, {\r\n onStart(item) {\r\n item.classList.add(\"drag\")\r\n document.body.classList.add(\"mousedrag\")\r\n dragMode.value = true\r\n },\r\n onEnd(e) {\r\n document.body.classList.remove(\"mousedrag\")\r\n e.target?.dispatchEvent(new BlockDropEvent(item))\r\n dragMode.value = false\r\n }\r\n })\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.page-editor-blocks__search\r\n margin-bottom: 16px\r\n\r\n.page-editor-blocks__group\r\n .title\r\n font-size: 13px\r\n font-weight: 500\r\n color: var(--text-secondary-color)\r\n\r\n.blocks-list__blocks\r\n display: grid\r\n grid-template-columns: repeat(2, 1fr)\r\n margin-top: 6px\r\n gap: 8px\r\n margin-bottom: 16px\r\n\r\n.blocks-list__block.editor-component\r\n height: 60px\r\n background: none\r\n border: 1px solid var(--input-border-color)\r\n border-radius: 6px\r\n font-size: 13px\r\n cursor: pointer\r\n z-index: 10000\r\n color: var(--text-color-alt)\r\n font-weight: 500\r\n padding: 0 8px\r\n\r\n &:hover\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12)\r\n\r\n &.drag\r\n background-color: var(--paper-color)\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12)\r\n\r\n.page-editor__nothing-found\r\n color: var(--text-secondary-color)\r\n font-weight: 500\r\n font-size: 13px\r\n\r\n</style>","import { isEqual } from \"vuesix\"\r\nimport type { ContentBlock, Block, DataEntryScope } from \"../types\"\r\nimport { uid, walkSchema, onUpdateBlockChildren, walkTree } from \"./blocks\"\r\nimport { defaultImageSrc, getDefaultValue, passDefaultValue } from \"./passDefaultValue\"\r\n\r\n/** Process production block to dev state */\r\nexport const processBlock = (contentBlock: ContentBlock, schema?: Block) => {\r\n \r\n if (!contentBlock.id) {\r\n contentBlock.id = uid()\r\n }\r\n if (!contentBlock.data) {\r\n contentBlock.data = {}\r\n }\r\n\r\n contentBlock.data['data-block-id'] = contentBlock.id\r\n\r\n if (schema) {\r\n passDefaultValue(contentBlock.data, schema.props)\r\n\r\n if (schema.slots) {\r\n if (Object.keys(schema.slots).join() === 'default') {\r\n if (contentBlock.children && !Array.isArray(contentBlock.children)) {\r\n contentBlock.children = contentBlock.children[\"default\"] ?? []\r\n } else {\r\n contentBlock.children = contentBlock.children ?? []\r\n }\r\n } else {\r\n if (contentBlock.children && Array.isArray(contentBlock.children)) {\r\n const arr = contentBlock.children\r\n contentBlock.children = Object.fromEntries(Object.keys(schema.slots).map(key => [ key, [] ]))\r\n contentBlock.children[\"default\"] = arr\r\n } else {\r\n contentBlock.children = contentBlock.children ?? Object.fromEntries(Object.keys(schema.slots).map(key => [ key, [] ]))\r\n }\r\n }\r\n onUpdateBlockChildren(contentBlock)\r\n }\r\n }\r\n return contentBlock\r\n}\r\n\r\n/** Process dev block to production state */\r\nexport const saveBlock = (contentBlock: ContentBlock, schema?: Block) => {\r\n\r\n if (contentBlock.children) {\r\n if (Array.isArray(contentBlock.children)) {\r\n contentBlock.children = contentBlock.children.filter(item => !item.blockId.startsWith(\"__dev\"))\r\n } else {\r\n for (let key in contentBlock.children) {\r\n contentBlock.children[key] = contentBlock.children[key].filter(item => !item.blockId.startsWith(\"__dev\"))\r\n }\r\n }\r\n }\r\n\r\n if (!contentBlock.data) return\r\n delete contentBlock.data['data-block-id']\r\n if (!schema) return\r\n walkSchema(contentBlock.data, schema.props, (value, schema, key, parent) => {\r\n if (schema.type === 'object' && schema.format === 'image' && value.src === defaultImageSrc && key && parent) {\r\n parent[key] = null\r\n }\r\n if (schema.type === 'object' && schema.format === 'file' && value.src === \"\" && key && parent) {\r\n parent[key] = null\r\n }\r\n })\r\n}\r\n\r\n/** Функция проходит по всем блокам и назначает пропс data-block-id и значения по умолчанию */\r\nexport const processBlocks = (state: ContentBlock[], blocksMap: Map<string, Block>) => {\r\n walkTree(state, block => {\r\n processBlock(block, blocksMap.get(block.blockId)!)\r\n })\r\n\r\n return state\r\n}\r\n\r\nexport const saveBlocks = (state: ContentBlock[], blocksMap: Map<string, Block>) => {\r\n walkTree(state, (block) => {\r\n saveBlock(block, blocksMap.get(block.blockId))\r\n })\r\n return state\r\n}\r\n\r\nexport const splitData = (data: Record<string, any>, scopes: Record<string, DataEntryScope>) => {\r\n const groupedData: Record<DataEntryScope, Record<string, any>> = { \"site\": {}, \"folder\": {}, \"page\": {} }\r\n for (let [key, scope] of Object.entries(scopes)) {\r\n groupedData[scope][key] = data[key]\r\n }\r\n return groupedData\r\n}\r\n\r\n\r\nexport const splitDataAndFilter = (data: Record<string, any>, scopes: Record<string, DataEntryScope>, defaultData: any) => {\r\n const groupedData: Record<DataEntryScope, Record<string, any>> = { \"site\": {}, \"folder\": {}, \"page\": {} }\r\n for (let [key, scope] of Object.entries(scopes)) {\r\n if (isEqual(data[key], defaultData)) continue\r\n groupedData[scope][key] = data[key]\r\n }\r\n return groupedData\r\n}\r\n","import type { ContentBlock, Block } from \"../types\"\r\n\r\nexport const walkTree = (blocks: ContentBlock[], callback: (block: ContentBlock) => void) => {\r\n for (let block of blocks) {\r\n callback(block)\r\n if (!block.children) continue\r\n if (Array.isArray(block.children)) {\r\n walkTree(block.children, callback)\r\n } else {\r\n for (let value of Object.values(block.children)) {\r\n walkTree(value, callback)\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport const walkSchema = (\r\n obj: any, \r\n schema: Block[\"props\"], \r\n callback: (value: any, schema: any, key?: string, parent?: any, isRequired?: boolean) => void, \r\n) => { \r\n if (schema.type === \"object\" && schema.properties) {\r\n if (!obj) {\r\n return\r\n }\r\n for (let [ key, childSchema ] of Object.entries(schema.properties)) {\r\n\r\n const isRequired = schema.required.includes(key)\r\n callback(obj[key], childSchema, key, obj, isRequired)\r\n\r\n if ((childSchema as any).type === 'array' || (childSchema as any).type === 'object') {\r\n walkSchema(obj[key], childSchema, callback)\r\n }\r\n }\r\n }\r\n\r\n if (schema.type === \"array\" && schema.items) {\r\n for (let value of obj) {\r\n callback(value, schema.items)\r\n if (schema.items.type === 'array' || schema.items.type === 'object') {\r\n walkSchema(value, schema.items, callback)\r\n }\r\n }\r\n }\r\n}","import { h } from \"vue\"\r\nimport { ContentBlock, Block } from \"../types\"\r\nimport { processBlock } from \"./processBlock\"\r\nimport { walkTree } from \"./walkTree\"\r\nexport { walkTree, walkSchema } from './walkTree'\r\n\r\nexport const findBlock = (blocks: ContentBlock[], callback: (block: ContentBlock) => boolean): ContentBlock | null => {\r\n for (let block of blocks) {\r\n if (callback(block)) {\r\n return block\r\n }\r\n if (!block.children) continue\r\n if (Array.isArray(block.children)) {\r\n const result = findBlock(block.children, callback)\r\n if (result) return result\r\n } else {\r\n for (let value of Object.values(block.children)) {\r\n const result = findBlock(value, callback)\r\n if (result) return result\r\n }\r\n }\r\n }\r\n return null\r\n}\r\n\r\nexport const hasSlots = (block: Block) => {\r\n return !!block.slots && Object.keys(block.slots).length > 0\r\n}\r\n\r\nexport const hasMultipleSlots = (block: Block) => {\r\n if (!block.slots || Object.keys(block.slots).length === 0) return false\r\n return Object.keys(block.slots).join() !== 'default'\r\n}\r\n\r\nexport const forEachChildren = (block: Block, content: ContentBlock, callback: (blocks: ContentBlock[]) => void) => {\r\n if (!hasSlots(block)) {\r\n /** ToDo - remove this delete method */\r\n if (content.children) {\r\n delete content.children\r\n }\r\n return\r\n }\r\n if (hasMultipleSlots(block)) {\r\n if (!content.children) content.children = {}\r\n if (Array.isArray(content.children)) content.children = { default: content.children }\r\n for (let key in block.slots) {\r\n if (!content.children[key]) content.children[key] = []\r\n callback(content.children[key])\r\n }\r\n } else {\r\n if (!content.children) content.children = []\r\n if (!Array.isArray(content.children)) content.children = content.children.default ?? []\r\n callback(content.children)\r\n }\r\n}\r\n\r\n\r\n/** Delete content block */\r\nexport const deleteBlock = (blocks: ContentBlock[], target: ContentBlock) => {\r\n\r\n let isDeleted = false\r\n walkTree(blocks, block => {\r\n if (!block.children) return\r\n if (Array.isArray(block.children)) {\r\n if (deleteFromArray(block.children, target)) {\r\n isDeleted = true\r\n onUpdateBlockChildren(block)\r\n }\r\n } else {\r\n for (let children of Object.values(block.children)) {\r\n if (deleteFromArray(children, target)) {\r\n isDeleted = true\r\n onUpdateBlockChildren(block)\r\n }\r\n }\r\n }\r\n })\r\n\r\n if (!isDeleted) {\r\n deleteFromArray(blocks, target)\r\n }\r\n}\r\n\r\nexport const createContentBlockChild = (blocksMap: Map<string, Block>, contentBlock: ContentBlock, parent: ContentBlock, index: number = -1) => {\r\n const parentBlock = blocksMap.get(parent.blockId)!\r\n if (!parentBlock.slots) return\r\n\r\n if (Object.keys(parentBlock.slots).join() === 'default') {\r\n if (!parent.children) parent.children = []\r\n if (!Array.isArray(parent.children)) parent.children = parent.children.default ?? []\r\n if (index < 0) {\r\n parent.children.push(contentBlock)\r\n } else {\r\n parent.children.splice(index, 0, contentBlock)\r\n }\r\n } else {\r\n if (!parent.children || Array.isArray(parent.children)) parent.children = {}\r\n if (index < 0) {\r\n const key = 'default' in parentBlock.slots? 'default': Object.keys(parentBlock.slots)[0]\r\n if (!parent.children[key]) parent.children[key] = []\r\n parent.children[key].push(contentBlock)\r\n } else {\r\n let startIndex = 0\r\n for (let children of Object.values(parent.children)) {\r\n if (index-startIndex <= children.length) {\r\n children.splice(index-startIndex, 0, contentBlock)\r\n }\r\n startIndex += children.length\r\n }\r\n }\r\n }\r\n\r\n onUpdateBlockChildren(parent)\r\n}\r\n\r\nexport const getBlockIndex = (parent: ContentBlock, target: ContentBlock) => {\r\n if (!parent.children) return -1\r\n if (Array.isArray(parent.children)) {\r\n return parent.children.indexOf(target)\r\n } else {\r\n let startIndex = 0\r\n for (let children of Object.values(parent.children)) {\r\n const index = children.indexOf(target)\r\n if (index >= 0) {\r\n return startIndex + index\r\n }\r\n startIndex += children.length\r\n }\r\n return -1\r\n }\r\n}\r\n\r\nexport const createContentBlock = (block: Block) => {\r\n const id = uid()\r\n return processBlock({ id, blockId: block.id, data: {} }, block)\r\n}\r\n\r\nexport const insertBlockBefore = (block: Block, contentBlocks: ContentBlock[], prependBlockId?: string | null) => {\r\n const contentBlock = createContentBlock(block)\r\n if (!prependBlockId) {\r\n contentBlocks.push(contentBlock)\r\n } else {\r\n const index = contentBlocks.findIndex(item => item.id === prependBlockId)\r\n if (index < 0) {\r\n contentBlocks.push(contentBlock)\r\n } else {\r\n contentBlocks.splice(index, 0, contentBlock)\r\n }\r\n }\r\n return contentBlock\r\n}\r\n\r\nconst _onUpdateBlockChildren = (children: ContentBlock[]) => {\r\n if (children.length === 0) {\r\n children.push(createDevBlock())\r\n } else {\r\n const index = children.findIndex(item => item.blockId === '__dev-block')\r\n if (index >= 0) {\r\n children.splice(index, 1)\r\n }\r\n }\r\n}\r\n\r\n/** Filter block childrens to remove dev block or add dev block if its empty */\r\nexport const onUpdateBlockChildren = (block: ContentBlock) => {\r\n if (!block.children) return\r\n if (Array.isArray(block.children)) {\r\n _onUpdateBlockChildren(block.children)\r\n } else {\r\n for (let children of Object.values(block.children)) {\r\n _onUpdateBlockChildren(children)\r\n }\r\n }\r\n}\r\n\r\n/** Change block id and his children */\r\nexport const changeBlockId = (content: ContentBlock, schema: Block) => {\r\n content.id = uid()\r\n processBlock(content)\r\n forEachChildren(schema, content, contents => {\r\n for (let content of contents) {\r\n content.id = uid()\r\n processBlock(content)\r\n }\r\n })\r\n}\r\n\r\nexport const createDevBlock = () => {\r\n const id = uid()\r\n\r\n const style = `\r\n min-width: 60px;\r\n min-height: 60px;\r\n background-color: #0073E920;\r\n background-image: url(\"data:image/svg+xml,%3csvg width='100%25' height='100%25' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='100%25' height='100%25' fill='none' rx='4' ry='4' stroke='%230073E9FF' stroke-width='4' stroke-dasharray='6%2c 14' stroke-dashoffset='0' stroke-linecap='square'/%3e%3c/svg%3e\");\r\n border-radius: 4px;\r\n`\r\n\r\n return { id, data: {}, blockId: \"__dev-block\", vnode: h('div', { class: \"dev-empty-slot-block\", style }) } \r\n}\r\n\r\nconst deleteFromArray = <T>(arr: T[], item: T) => {\r\n const index = arr.indexOf(item)\r\n if (index < 0) return false\r\n arr.splice(index, 1)\r\n return true\r\n}\r\n\r\nexport const uid = () => {\r\n return Math.trunc(Math.random() * 100000).toString(16)\r\n}","<template>\r\n <div ref=\"tabsRef\" class=\"v-tabs\">\r\n <TransitionGroup>\r\n <button v-for=\"item in props.items\" :key=\"item.id\" class=\"v-tabs__tab\" :class=\"{ active: model === item.id }\" @click=\"model = item.id\">\r\n {{ item.title }}\r\n </button>\r\n </TransitionGroup>\r\n <div class=\"v-tabs__marker\" :style=\"markerStyle\"></div>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup generic=\"K extends number | string\">\r\nimport { useVModel } from '@vueuse/core';\r\nimport { CSSProperties, Ref, nextTick, onMounted, ref, watch } from 'vue';\r\n\r\ntype Item = { id: K, title: string }\r\nconst props = defineProps<{ items: Item[], modelValue?: K }>()\r\nconst emit = defineEmits([ \"update:modelValue\" ])\r\n\r\nconst model = useVModel(props, \"modelValue\", emit, { passive: true }) as Ref<K>\r\n\r\nwatch(() => props.items, (items) => {\r\n if ((model.value === undefined || model.value === null) && items.length > 0) {\r\n model.value = items[0].id\r\n }\r\n}, { immediate: true })\r\n\r\nconst tabsRef = ref<HTMLDivElement>()\r\nconst markerStyle = ref<CSSProperties>({})\r\n\r\nconst placeMarker = () => {\r\n const id = model.value\r\n if (!tabsRef.value) return\r\n const index = props.items.findIndex(item => item.id === id)\r\n if (index < 0) {\r\n markerStyle.value = { width: \"0px\" }\r\n return\r\n }\r\n const child = tabsRef.value.children[index] as HTMLElement\r\n \r\n const p = 0\r\n markerStyle.value = { left: child.offsetLeft+p+\"px\", width: child.clientWidth-p*2+\"px\" }\r\n\r\n for (let child of tabsRef.value.children) {\r\n const item = child as HTMLElement\r\n item.style.left = item.offsetLeft + \"px\"\r\n }\r\n\r\n // setTimeout(() => {\r\n // tabsRef.value!.scrollTo(child.offsetLeft-60, child.offsetLeft + child.clientWidth+60)\r\n // }, 0)\r\n}\r\n\r\nonMounted(() => {\r\n placeMarker()\r\n})\r\nwatch(() => props.items, () => {\r\n placeMarker()\r\n}, { deep: true, flush: \"post\" })\r\n// useResizeObserver(tabsRef, () => {\r\n// placeMarker()\r\n// })\r\n\r\nwatch(model, placeMarker, { flush: \"post\" })\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-tabs\r\n border-bottom: 1px solid rgba(255, 255, 255, 0.1)\r\n overflow: hidden\r\n white-space: nowrap\r\n position: relative\r\n gap: 8px\r\n display: flex\r\n z-index: 2\r\n flex-shrink: 0\r\n\r\n.v-tabs__tab\r\n background: none\r\n height: 36px\r\n padding: 0 8px\r\n font-size: 13px\r\n border: none\r\n font-weight: 500\r\n cursor: pointer\r\n color: var(--text-secondary-color)\r\n transition: color 0.2s\r\n outline: none\r\n\r\n &.v-enter-active, &.v-leave-active\r\n transition: transform 0.225s cubic-bezier(0, 0, 0.2, 1), opacity 0.225s\r\n\r\n &.v-enter-from, &.v-leave-to\r\n transform: translateY(-20px)\r\n opacity: 0\r\n\r\n &.v-leave-active\r\n position: absolute\r\n\r\n &.active\r\n color: var(--text-color)\r\n\r\n.v-tabs__marker\r\n position: absolute\r\n top: 0\r\n bottom: 0\r\n background-color: var(--active-color)\r\n border-radius: 1px\r\n transition: left 0.225s cubic-bezier(0.4, 0, 0.2, 1), width 0.225s cubic-bezier(0.4, 0, 0.2, 1)\r\n z-index: -1\r\n border-radius: 6px\r\n\r\n</style>","<template>\r\n <div ref=\"containerRef\" class=\"v-tabs-pages\">\r\n <Transition :name=\"transitionClass\" @before-leave=\"onBeforeLeave\" @enter=\"onEnter\" @after-enter=\"onAfterEnter\">\r\n <div :key=\"props.page\" class=\"v-tabs-pages__page scroll\" :class=\"props['page:class']\">\r\n <slot :name=\"props.page\" />\r\n </div>\r\n </Transition>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { nextTick, ref, useSlots, watch } from 'vue';\r\n\r\nconst props = defineProps<{ page: string, \"page:class\"?: string }>()\r\n\r\nconst slots = useSlots()\r\n\r\nconst containerRef = ref<HTMLDivElement>()\r\nconst transitionClass = ref(\"slide-right\")\r\nwatch(() => props.page, (value, lastValue) => {\r\n const keys = Object.keys(slots)\r\n if (keys.indexOf(value) > keys.indexOf(lastValue)) {\r\n transitionClass.value = \"slide-left\"\r\n } else {\r\n transitionClass.value = \"slide-right\"\r\n }\r\n})\r\n\r\nconst onBeforeLeave = (el: Element) => {\r\n containerRef.value!.style.height = el.scrollHeight + \"px\"\r\n containerRef.value?.classList.add(\"transition-active\")\r\n}\r\nconst onEnter = (el: Element) => {\r\n containerRef.value!.style.height = el.scrollHeight + \"px\"\r\n}\r\nconst onAfterEnter = () => {\r\n containerRef.value!.style.height = \"\"\r\n containerRef.value?.classList.remove(\"transition-active\")\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-tabs-pages\r\n position: relative\r\n overflow: hidden\r\n\r\n &.transition-active\r\n overflow: hidden\r\n transition: height 0.225s cubic-bezier(0.8, 0, 0.2, 1)\r\n\r\n.v-tabs-pages__page\r\n inset: 0\r\n height: fit-content\r\n max-height: 100%\r\n box-sizing: border-box\r\n overflow-y: auto\r\n overflow-x: hidden\r\n\r\n &.slide-left-enter-active, &.slide-left-leave-active, &.slide-right-enter-active, &.slide-right-leave-active\r\n transition: transform 0.225s cubic-bezier(0.8, 0, 0.2, 1)\r\n position: absolute\r\n\r\n &.slide-left-enter-from, &.slide-right-leave-to\r\n transform: translateX(100%)\r\n\r\n &.slide-right-enter-from, &.slide-left-leave-to\r\n transform: translateX(-100%)\r\n\r\n</style>","<template>\n<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7.5001 14.1665C7.50013 14.3313 7.54902 14.4924 7.64059 14.6294C7.73217 14.7664 7.8623 14.8732 8.01455 14.9362C8.1668 14.9993 8.33433 15.0158 8.49596 14.9836C8.65758 14.9515 8.80605 14.8722 8.9226 14.7557L13.0893 10.589C13.2455 10.4327 13.3333 10.2208 13.3333 9.99982C13.3333 9.77885 13.2455 9.56693 13.0893 9.41066L8.9226 5.24399C8.80605 5.12748 8.65758 5.04814 8.49596 5.016C8.33433 4.98386 8.1668 5.00037 8.01455 5.06342C7.8623 5.12648 7.73217 5.23327 7.6406 5.37027C7.54902 5.50728 7.50013 5.66836 7.5001 5.83316L7.5001 14.1665Z\" fill=\"currentColor\"/>\r\n</svg>\n</template>\n","<template>\r\n <div class=\"v-collapse\" :class=\"{ open }\">\r\n <slot name=\"activator\" :props=\"{ onClick, open }\">\r\n <div \r\n class=\"v-collapse__activator\" \r\n :class=\"{ open }\"\r\n @mousedown=\"onClick\" \r\n @mouseenter=\"onMouseEnter\"\r\n >\r\n <CollapseArrowIcon/>\r\n <div>{{ props.label }}</div>\r\n </div>\r\n </slot>\r\n <div \r\n class=\"v-collapse__content\" \r\n :class=\"{ 'v-transition': transition, withPadding: props.withPadding }\" \r\n :style=\"transition? { height: `${height}px` }: undefined\"\r\n >\r\n <div v-if=\"transition || open\" ref=\"innerRef\" class=\"v-collapse__content-inner\">\r\n <slot></slot>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { useEventListener } from '@vueuse/core';\r\nimport { nextTick, ref, watch } from 'vue';\r\nimport CollapseArrowIcon from './icons/CollapseArrowIcon.vue'\r\n\r\nconst props = defineProps<{ open?: boolean, label?: string, withPadding?: boolean }>()\r\nconst emit = defineEmits([ \"update:open\" ])\r\n\r\nconst height = ref(0)\r\n\r\nconst open = ref(props.open ?? false)\r\nconst transition = ref(false)\r\nconst innerRef = ref<HTMLElement>()\r\n\r\nlet hideTimeout: ReturnType<typeof setTimeout> | null = null\r\nconst setOpen = async (value: boolean) => {\r\n open.value = value\r\n if (hideTimeout !== null) {\r\n clearTimeout(hideTimeout)\r\n hideTimeout = null\r\n }\r\n\r\n if (open.value === false && innerRef.value) {\r\n height.value = innerRef.value!.clientHeight\r\n }\r\n \r\n transition.value = true\r\n await nextTick()\r\n await new Promise(res => requestAnimationFrame(res))\r\n\r\n if (open.value) {\r\n height.value = innerRef.value!.clientHeight\r\n } else {\r\n height.value = 0\r\n }\r\n \r\n hideTimeout = setTimeout(() => {\r\n transition.value = false\r\n }, 200)\r\n\r\n setTimeout(() => mouseMove = true, 0)\r\n emit(\"update:open\", open.value)\r\n}\r\n\r\nconst onClick = async () => {\r\n setOpen(!open.value)\r\n}\r\nwatch(() => props.open, (value) => {\r\n if (typeof value !== 'boolean' || open.value === value) return\r\n setOpen(value) \r\n})\r\n\r\nlet mouseMove = false\r\nuseEventListener(\"mousedown\", () => mouseMove = false)\r\n\r\nconst onMouseEnter = (e: MouseEvent) => {\r\n if (e.buttons > 0 && !mouseMove && !document.body.classList.contains('mousedrag')) {\r\n mouseMove = true\r\n onClick()\r\n }\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-collapse\r\n -webkit-user-drag: none\r\n\r\n.v-collapse__activator\r\n cursor: pointer\r\n user-select: none\r\n display: flex\r\n align-items: center\r\n gap: 4px\r\n height: 30px\r\n font-size: 14px\r\n padding-top: 6px\r\n box-sizing: border-box\r\n\r\n svg\r\n margin-left: -4px\r\n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1)\r\n\r\n &.open\r\n svg\r\n transform: rotate(90deg)\r\n\r\n.v-collapse__content\r\n overflow: hidden\r\n\r\n &.v-transition\r\n transition: height 0.2s cubic-bezier(0.4, 0, 0.2, 1)\r\n\r\n &.withPadding\r\n padding: 4px\r\n margin: -4px\r\n\r\n</style>","<template>\r\n <Teleport to=\"body\">\r\n <Transition>\r\n <div \r\n v-if=\"open\"\r\n v-bind=\"$attrs\"\r\n class=\"v-popover editor-component\" \r\n :class=\"[ isHorizontal? 'horizontal': 'vertical', props.fitAnchor && 'fit-anchor', props.class ]\"\r\n :style=\"style\"\r\n ref=\"popoverRef\"\r\n @mousedown.stop\r\n >\r\n <slot></slot>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n <slot name=\"activator\" :props=\"activatorProps\"></slot>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { computed, ref, watch } from 'vue';\r\nimport { onKeyDown, useEventListener, useResizeObserver, useVModel } from '@vueuse/core'\r\nimport { useMouseDownOutside } from 'vuesix/src/hooks/useClickOutside';\r\nimport { useKeyDownLayer } from 'vuesix/src/hooks/useKeyDownLayer';\r\n\r\nexport type Placement = \r\n \"top-start\" | \"top\" | \"top-end\" |\r\n \"right-start\" | \"right\" | \"right-end\" |\r\n \"bottom-start\" | \"bottom\" | \"bottom-end\" |\r\n \"left-start\" | \"left\" | \"left-end\"\r\n\r\nconst props = defineProps<{ \r\n open?: boolean, \r\n element?: HTMLElement | null,\r\n placement: Placement,\r\n offset?: number,\r\n fitAnchor?: boolean,\r\n class?: string,\r\n anchorPosition?: { x: number, y: number }\r\n}>()\r\n\r\ndefineOptions({\r\n inheritAttrs: false\r\n})\r\n\r\nconst emit = defineEmits([ \"update:open\" ])\r\n\r\nconst popoverRef = ref<HTMLDivElement>()\r\nconst position = ref<{ top: number, left: number, width?: number, height?: number }>({ top: 0, left: 0 })\r\nconst origin = ref(\"center\")\r\n\r\nconst open = useVModel(props, \"open\", emit, { passive: true })\r\nconst activatorElement = ref<HTMLElement>()\r\n\r\nconst clamp = (value: number, min: number, max: number) => {\r\n if (value < min) return min\r\n if (value > max) return max\r\n return value\r\n}\r\n\r\nconst calcPrimary = (pos: \"start\" | \"end\", start: number, end: number, size: number, min: number, max: number) => {\r\n const fitStart = start-size >= min\r\n const fitEnd = end + size <= max\r\n\r\n if ((!fitEnd || pos === \"start\") && fitStart) return start - size\r\n if ((!fitStart || pos === \"end\") && fitEnd) return end\r\n return pos === \"start\"? min: (max-size)\r\n}\r\n\r\nconst calcSub = (pos: string | undefined, start: number, end: number, size: number, min: number, max: number) => {\r\n if (pos === \"start\") return clamp(start, min, max-size)\r\n if (pos === \"end\") return clamp(end - size, min, max-size)\r\n\r\n return clamp((start+end)/2 - size/2, min, max-size)\r\n}\r\n\r\nconst calcOrigin = (start: number, end: number, point: number) => {\r\n return clamp(Math.round((point-start) / (end-start) * 100), 0, 100) + \"%\"\r\n}\r\n\r\nconst getRect = () => {\r\n if (props.anchorPosition) {\r\n return {\r\n top: props.anchorPosition.y, bottom: props.anchorPosition.y,\r\n left: props.anchorPosition.x, right: props.anchorPosition.x,\r\n width: 0, height: 0\r\n }\r\n }\r\n const element = props.element ?? activatorElement.value\r\n if (!element) return null\r\n return element.getBoundingClientRect()\r\n}\r\n\r\nconst isHorizontal = computed(() => props.placement.startsWith(\"left\") || props.placement.startsWith(\"right\"))\r\n\r\nconst margin = 8\r\nconst calcPosition = () => {\r\n if (!popoverRef.value) return\r\n const rect = getRect()\r\n if (!rect) return\r\n\r\n const placement = props.placement.split(\"-\")\r\n\r\n const offset = props.offset ?? 0\r\n const width = popoverRef.value.clientWidth\r\n const height = popoverRef.value.clientHeight\r\n\r\n if (placement[0] === \"top\" || placement[0] === \"bottom\") {\r\n const top = calcPrimary(placement[0] === \"top\"? \"start\": \"end\", rect.top-offset, rect.bottom+offset, height, margin, window.innerHeight - margin)\r\n if (props.fitAnchor) {\r\n position.value = { \r\n top, \r\n left: calcSub('start', rect.left, rect.right, rect.width, margin, window.innerWidth - margin),\r\n width: rect.width\r\n }\r\n } else {\r\n position.value = { top, left: calcSub(placement[1], rect.left, rect.right, width, margin, window.innerWidth - margin) }\r\n }\r\n } else {\r\n const left = calcPrimary(placement[0] === \"left\"? \"start\": \"end\", rect.left-offset, rect.right+offset, width, margin, window.innerWidth - margin)\r\n if (props.fitAnchor) {\r\n position.value = { \r\n left, \r\n top: calcSub('start', rect.top, rect.bottom, rect.height, margin, window.innerHeight - margin),\r\n height: rect.height\r\n }\r\n } else {\r\n position.value = { left, top: calcSub(placement[1], rect.top, rect.bottom, height, margin, window.innerHeight - margin) }\r\n }\r\n }\r\n origin.value = \r\n calcOrigin(position.value.left, position.value.left + width, rect.left + rect.width/2) +\r\n calcOrigin(position.value.top, position.value.top + height, rect.top + rect.height/2)\r\n}\r\n\r\nwatch([() => props.element, () => props.anchorPosition], () => {\r\n calcPosition()\r\n})\r\n\r\nuseResizeObserver(popoverRef, calcPosition)\r\nuseEventListener(window, \"resize\", calcPosition)\r\n\r\nconst close = () => {\r\n open.value = false\r\n}\r\nconst closeDelayed = () => {\r\n setTimeout(close, 0)\r\n}\r\n\r\nuseKeyDownLayer(\"Escape\", open, close)\r\nuseMouseDownOutside(open, closeDelayed, popoverRef)\r\n\r\nwatch(open, (open) => {\r\n if (!props.element) return\r\n if (open) {\r\n props.element.classList.add(\"popoverHover\")\r\n } else {\r\n props.element.classList.remove(\"popoverHover\")\r\n }\r\n})\r\n\r\nconst activatorProps = {\r\n onMousedown: (e: MouseEvent) => {\r\n open.value = !open.value\r\n if (open.value) {\r\n activatorElement.value = e.currentTarget as HTMLElement\r\n }\r\n },\r\n // onTouchstart: (e: TouchEvent) => {\r\n // open.value = !open.value\r\n // if (open.value) {\r\n // activatorElement.value = e.currentTarget as HTMLElement\r\n // }\r\n // },\r\n onKeydown(e: KeyboardEvent) {\r\n if (e.code === \"Enter\") {\r\n open.value = !open.value\r\n if (open.value) {\r\n activatorElement.value = e.currentTarget as HTMLElement\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst style = computed(() => {\r\n return { \r\n left: position.value.left + 'px', \r\n top: position.value.top +'px', \r\n width: position.value.width? (position.value.width + 'px'): undefined,\r\n height: position.value.height? (position.value.height + 'px'): undefined,\r\n transformOrigin: origin.value \r\n }\r\n})\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-popover\r\n position: fixed\r\n background-color: var(--popover-color)\r\n box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2)\r\n border-radius: 8px\r\n min-width: 40px\r\n min-height: 40px\r\n transform: none\r\n z-index: 2000\r\n box-sizing: border-box\r\n width: fit-content\r\n\r\n &.v-enter-active, &.v-leave-active \r\n transition: opacity 0.12s, transform 0.12s cubic-bezier(0.4, 0, 0.2, 1)\r\n\r\n &.v-enter-from, &.v-leave-to\r\n opacity: 0\r\n\r\n &.vertical\r\n transform: scale(0.9, 0.7)\r\n\r\n &.fit-anchor\r\n transform: scale(1, 0.7)\r\n\r\n &.horizontal\r\n transform: scale(0.7, 0.9)\r\n\r\n &.fit-anchor\r\n transform: scale(0.7, 1)\r\n\r\n</style>","<template>\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M14.364 5.293C14.1764 5.10553 13.9221 5.00021 13.657 5.00021C13.3918 5.00021 13.1375 5.10553 12.95 5.293L7.99995 10.243L3.04995 5.293C2.86135 5.11084 2.60875 5.01005 2.34655 5.01232C2.08435 5.0146 1.83354 5.11977 1.64813 5.30518C1.46272 5.49059 1.35756 5.7414 1.35528 6.0036C1.353 6.26579 1.45379 6.5184 1.63595 6.707L7.29295 12.364C7.48048 12.5515 7.73479 12.6568 7.99995 12.6568C8.26512 12.6568 8.51942 12.5515 8.70695 12.364L14.364 6.707C14.5514 6.51947 14.6567 6.26516 14.6567 6C14.6567 5.73483 14.5514 5.48053 14.364 5.293Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\r\n <button class=\"v-icon-button\">\r\n <slot></slot>\r\n </button>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-icon-button\r\n background: none\r\n border: none\r\n color: var(--icon-color)\r\n display: flex\r\n align-items: center\r\n justify-content: center\r\n width: 28px\r\n height: 28px\r\n border-radius: 9999px\r\n cursor: pointer\r\n padding: 0\r\n outline: none\r\n flex-shrink: 0\r\n\r\n &:hover\r\n background-color: var(--hover-color)\r\n\r\n</style>","<template>\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M9.31382 7.9L12.8488 4.364C12.9443 4.27176 13.0205 4.16141 13.0729 4.03941C13.1253 3.9174 13.1529 3.78618 13.1541 3.6534C13.1552 3.52062 13.1299 3.38894 13.0796 3.26605C13.0294 3.14315 12.9551 3.0315 12.8612 2.93761C12.7673 2.84371 12.6557 2.76946 12.5328 2.71918C12.4099 2.6689 12.2782 2.6436 12.1454 2.64475C12.0126 2.64591 11.8814 2.67349 11.7594 2.7259C11.6374 2.77831 11.5271 2.85449 11.4348 2.95L7.89882 6.485L4.36382 2.95C4.27157 2.85449 4.16123 2.77831 4.03922 2.7259C3.91722 2.67349 3.786 2.64591 3.65322 2.64475C3.52044 2.6436 3.38876 2.6689 3.26587 2.71918C3.14297 2.76946 3.03132 2.84371 2.93742 2.93761C2.84353 3.0315 2.76928 3.14315 2.719 3.26605C2.66872 3.38894 2.64342 3.52062 2.64457 3.6534C2.64572 3.78618 2.67331 3.9174 2.72572 4.03941C2.77813 4.16141 2.85431 4.27176 2.94982 4.364L6.48482 7.899L2.94982 11.435C2.85431 11.5273 2.77813 11.6376 2.72572 11.7596C2.67331 11.8816 2.64572 12.0128 2.64457 12.1456C2.64342 12.2784 2.66872 12.4101 2.719 12.533C2.76928 12.6559 2.84353 12.7675 2.93742 12.8614C3.03132 12.9553 3.14297 13.0295 3.26587 13.0798C3.38876 13.1301 3.52044 13.1554 3.65322 13.1543C3.786 13.1531 3.91722 13.1255 4.03922 13.0731C4.16123 13.0207 4.27157 12.9445 4.36382 12.849L7.89882 9.314L11.4348 12.849C11.5271 12.9445 11.6374 13.0207 11.7594 13.0731C11.8814 13.1255 12.0126 13.1531 12.1454 13.1543C12.2782 13.1554 12.4099 13.1301 12.5328 13.0798C12.6557 13.0295 12.7673 12.9553 12.8612 12.8614C12.9551 12.7675 13.0294 12.6559 13.0796 12.533C13.1299 12.4101 13.1552 12.2784 13.1541 12.1456C13.1529 12.0128 13.1253 11.8816 13.0729 11.7596C13.0205 11.6376 12.9443 11.5273 12.8488 11.435L9.31382 7.9Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\r\n <VFormControl outline class=\"v-select\" :label=\"props.label\" :error=\"props.error\" :disabled=\"props.disabled\" :required=\"props.required\">\r\n <VPopover v-model:open=\"opened\" placement=\"bottom\" fit-anchor :offset=\"8\">\r\n <template #activator=\"{ props: activatorProps }\">\r\n <button class=\"v-select__activator\" :class=\"{ opened }\" v-bind=\"activatorProps\">\r\n <div v-if=\"currentItem\">{{ currentItem.title }}</div>\r\n <div v-else class=\"v-select__placeholder\">{{ props.placeholder ?? 'Выберите значение' }}</div>\r\n <ArrowDownIcon/>\r\n </button>\r\n <div class=\"v-select__actions\">\r\n <slot></slot>\r\n <VIconButton v-if=\"nullable && model\" title=\"Очистить значение\" class=\"v-select__delete-button\" @click=\"resetValue\">\r\n <CloseMinIcon/>\r\n </VIconButton>\r\n </div>\r\n </template>\r\n <div class=\"v-select__menu\">\r\n <template v-for=\"item in items\">\r\n <div v-if=\"item === ''\" class=\"v-select__divider\"></div>\r\n <div v-else-if=\"typeof item === 'string'\" class=\"group-title\">{{ item }}</div>\r\n <button v-else :class=\"{ active: item.id === model }\" @click=\"onItemClick(item)\" >\r\n <slot name=\"item\" :item=\"item\">\r\n {{ item.title }}\r\n </slot>\r\n </button>\r\n </template>\r\n </div>\r\n </VPopover>\r\n </VFormControl>\r\n</template>\r\n\r\n<script lang=\"ts\" setup generic=\"T extends { id: number | string, title?: string }\">\r\nimport { computed, ref } from 'vue';\r\nimport VFormControl, { VFormControlProps } from './VFormControl.vue';\r\nimport VPopover from './VPopover.vue';\r\nimport ArrowDownIcon from './icons/ArrowDownIcon.vue'\r\nimport VIconButton from './VIconButton.vue'\r\nimport CloseMinIcon from './icons/CloseMinIcon.vue';\r\n\r\nconst props = defineProps<{ \r\n items: (T | string)[], \r\n placeholder?: string,\r\n nullable?: boolean,\r\n visualValue?: string,\r\n} & VFormControlProps>()\r\n\r\nconst model = defineModel<T['id'] | null>({ default: null })\r\n\r\nconst currentItem = computed<T | null>(() => {\r\n if (model.value === null) return null\r\n return props.items.find(item => typeof item !== \"string\" && item.id === model.value) as T ?? null\r\n})\r\n\r\nconst items = computed(() => {\r\n return props.items\r\n})\r\n\r\nconst opened = ref(false)\r\nconst onItemClick = (item: T) => {\r\n model.value = item.id\r\n opened.value = false\r\n}\r\n\r\nconst resetValue = () => {\r\n model.value = null\r\n opened.value = false\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-select\r\n .v-form-control__outline\r\n height: 40px\r\n\r\n.v-select__actions\r\n position: absolute\r\n right: 0\r\n display: flex\r\n align-items: center\r\n right: 28px\r\n bottom: 9px\r\n gap: 2px\r\n height: 20px\r\n\r\n.v-select__delete-button\r\n svg\r\n width: 10px\r\n height: 10px\r\n\r\n.v-select__placeholder\r\n color: var(--text-secondary-color)\r\n\r\n.v-select__activator\r\n background: none\r\n border: none\r\n display: flex\r\n align-items: center\r\n padding: 0 12px\r\n width: 100%\r\n color: var(--text-color)\r\n text-align: left\r\n cursor: pointer\r\n outline: none\r\n &>div\r\n flex: 1 1 auto\r\n\r\n svg\r\n margin-right: -2px\r\n color: var(--icon-color)\r\n width: 12px\r\n pointer-events: none\r\n\r\n &.opened\r\n svg\r\n transform: rotate(180deg)\r\n\r\n.v-select__menu\r\n display: flex\r\n flex-direction: column\r\n padding: 6px\r\n\r\n &>button\r\n background: none\r\n border: none\r\n color: var(--text-color-alt)\r\n height: 32px\r\n display: flex\r\n align-items: center\r\n padding: 0 8px\r\n cursor: pointer\r\n font-weight: 500\r\n border-radius: 6px\r\n\r\n &.active\r\n color: var(--text-color)\r\n \r\n &:hover\r\n background-color: var(--hover-color)\r\n\r\n .group-title\r\n padding: 0 8px\r\n font-size: 13px\r\n color: var(--text-secondary-color)\r\n padding-top: 4px\r\n\r\n .nullable-item\r\n color: var(--text-secondary-color)\r\n\r\n\r\n.v-select__divider\r\n border-bottom: 1px solid var(--border-color)\r\n margin: 4px 8px\r\n\r\n</style>","<template>\r\n <div class=\"json-editor__array\">\r\n <VCollapse :label=\"label\" :open=\"props.expanded\">\r\n <VInput label=\"Количество элементов\" v-model=\"length\" type=\"number\"/>\r\n <JsonEditor \r\n v-for=\"index in length\"\r\n :key=\"index\"\r\n :schema=\"props.schema.items\" \r\n :name=\"`${props.schema.itemName ?? 'Элемент'} ${index}`\"\r\n v-model=\"tempArray[index-1]\" \r\n :expanded=\"childExpanded\"\r\n @edit=\"emit('edit', join(index-1, $event))\"\r\n />\r\n </VCollapse>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { computed, ref, watch } from 'vue';\r\nimport JsonEditor, { join } from './JsonEditor.vue';\r\nimport VInput from './VInput.vue';\r\nimport VCollapse from './VCollapse.vue';\r\nimport { getDefaultValue } from '../utils/passDefaultValue'\r\n\r\nconst props = defineProps<{\r\n label?: string,\r\n schema: any,\r\n modelValue?: any,\r\n expanded?: boolean\r\n}>()\r\n\r\nconst emit = defineEmits([ \"update:modelValue\", \"edit\" ])\r\n\r\nconst childExpanded = props.schema.items?.type === 'object' && Object.keys(props.schema.items.properties).length < 2\r\n\r\nconst length = ref(0)\r\nconst tempArray = ref<any[]>([])\r\n\r\nif (props.schema.type === 'array' && props.modelValue) {\r\n length.value = props.modelValue.length ?? 0\r\n tempArray.value = [ ...props.modelValue ]\r\n}\r\n\r\nlet ignoreUpdate = false\r\nwatch(tempArray, () => {\r\n emit(\"update:modelValue\", tempArray.value.slice(0, length.value))\r\n}, { deep: true })\r\n\r\nwatch(length, (length) => {\r\n for (let i = tempArray.value.length; i < length; i++) {\r\n ignoreUpdate = true\r\n tempArray.value[i] = props.schema.items? getDefaultValue(props.schema.items): null\r\n }\r\n\r\n emit(\"update:modelValue\", tempArray.value.slice(0, length))\r\n})\r\n\r\nconst label = computed(() => {\r\n return `${props.label} (${length.value})`\r\n})\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.json-editor__array\r\n display: flex\r\n flex-direction: column\r\n gap: 8px\r\n\r\n &>.v-collapse>.v-collapse__content>.v-collapse__content-inner>.v-form-control\r\n margin-top: 6px\r\n\r\n</style>","<template>\r\n<svg width=\"46\" height=\"28\" viewBox=\"0 0 46 28\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n<mask id=\"mask0_1044_6\" style=\"mask-type:luminance\" maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"46\" height=\"28\">\r\n<path d=\"M45.5 0H0.5V28H45.5V0Z\" fill=\"white\"/>\r\n</mask>\r\n<g mask=\"url(#mask0_1044_6)\">\r\n<path d=\"M23.5 27.8537C35.9264 27.8537 46 25.6664 46 22.9683C46 20.2702 35.9264 18.083 23.5 18.083C11.0736 18.083 1 20.2702 1 22.9683C1 25.6664 11.0736 27.8537 23.5 27.8537Z\" fill=\"#D7D7D7\"/>\r\n<path d=\"M39.6719 9.5459L32.538 1.51859C32.1955 0.971432 31.6956 0.640625 31.169 0.640625H15.831C15.3044 0.640625 14.8045 0.971432 14.462 1.51789L7.32812 9.5466V15.9946H39.6719V9.5459Z\" stroke=\"#A0A0A0\" stroke-width=\"0.703125\"/>\r\n<path d=\"M30.2591 11.7594C30.2591 10.6393 30.958 9.71457 31.825 9.71387H39.6719V22.3718C39.6719 23.8534 38.7437 25.0678 37.5977 25.0678H9.40234C8.25625 25.0678 7.32812 23.8527 7.32812 22.3718V9.71387H15.175C16.042 9.71387 16.7409 10.6372 16.7409 11.7573V11.7727C16.7409 12.8928 17.4475 13.7973 18.3138 13.7973H28.6862C29.5525 13.7973 30.2591 12.8845 30.2591 11.7643V11.7594Z\" fill=\"#FAFAFA\" stroke=\"#A0A0A0\" stroke-width=\"0.703125\"/>\r\n</g>\r\n</svg>\r\n</template>\r\n\r\n","<template>\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M14 18C14 18.5304 13.7893 19.0391 13.4142 19.4142C13.0391 19.7893 12.5304 20 12 20C11.4696 20 10.9609 19.7893 10.5858 19.4142C10.2107 19.0391 10 18.5304 10 18C10 17.4696 10.2107 16.9609 10.5858 16.5858C10.9609 16.2107 11.4696 16 12 16C12.5304 16 13.0391 16.2107 13.4142 16.5858C13.7893 16.9609 14 17.4696 14 18ZM14 12C14 12.5304 13.7893 13.0391 13.4142 13.4142C13.0391 13.7893 12.5304 14 12 14C11.4696 14 10.9609 13.7893 10.5858 13.4142C10.2107 13.0391 10 12.5304 10 12C10 11.4696 10.2107 10.9609 10.5858 10.5858C10.9609 10.2107 11.4696 10 12 10C12.5304 10 13.0391 10.2107 13.4142 10.5858C13.7893 10.9609 14 11.4696 14 12ZM12 8C12.5304 8 13.0391 7.78929 13.4142 7.41421C13.7893 7.03914 14 6.53043 14 6C14 5.46957 13.7893 4.96086 13.4142 4.58579C13.0391 4.21071 12.5304 4 12 4C11.4696 4 10.9609 4.21071 10.5858 4.58579C10.2107 4.96086 10 5.46957 10 6C10 6.53043 10.2107 7.03914 10.5858 7.41421C10.9609 7.78929 11.4696 8 12 8Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\r\n <component :is=\"component ?? 'button'\" class=\"mech-v-button\" :class=\"{ disabled, flat, outline, large }\">\r\n <slot></slot>\r\n </component>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\n\r\nconst props = defineProps<{ component?: string, disabled?: boolean, flat?: boolean, outline?: boolean, large?: boolean }>()\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n\r\n.mech-v-button\r\n background-color: var(--button-color)\r\n color: var(--button-text-color)\r\n height: 36px\r\n font-weight: 700\r\n border-radius: 9999px\r\n font-size: 13px\r\n padding: 0 28px\r\n text-decoration: none\r\n display: flex\r\n justify-content: center\r\n align-items: center\r\n border: none\r\n gap: 6px\r\n cursor: pointer\r\n\r\n &:hover\r\n background-color: var(--button-color-hover)\r\n \r\n &:active \r\n background-color: var(--button-color-pressed)\r\n\r\n &.disabled\r\n opacity: 0.5\r\n pointer-events: none\r\n\r\n &.flat\r\n background: none\r\n color: var(--text-color)\r\n padding: 0 20px\r\n &.large\r\n padding: 0 24px\r\n &:hover\r\n background-color: var(--hover-color)\r\n\r\n &.outline\r\n background: none\r\n border: 1px solid var(--button-color)\r\n color: var(--button-color)\r\n\r\n &:hover\r\n border-color: var(--button-color-hover)\r\n color: var(--button-color-hover)\r\n\r\n &:active\r\n border-color: var(--button-color-pressed)\r\n color: var(--button-color-pressed)\r\n \r\n &.large\r\n height: 44px\r\n font-size: 15px\r\n border-radius: 22px\r\n padding: 0 32px\r\n font-weight: 500\r\n font-family: 'RF Dewi', sans-serif\r\n\r\n\r\n &:focus-visible\r\n box-shadow: 0 0 0 4px #0D6EFD40\r\n \r\n &.color-red.outline\r\n border-color: var(--error-color)\r\n color: var(--error-color)\r\n\r\n svg\r\n max-width: 20px\r\n max-height: 20px\r\n\r\n</style>","<template>\r\n <slot name=\"activator\" :props=\"activatorProps\"></slot>\r\n <VPopover\r\n v-model:open=\"open\" \r\n :element=\"activatorElement\" \r\n :anchorPosition=\"props.anchorPosition\"\r\n :placement=\"props.placement ?? 'bottom-start'\" \r\n :offset=\"offset\" \r\n :fitAnchor=\"props.fitAnchor\"\r\n class=\"v-context-menu\"\r\n v-bind=\"$attrs\"\r\n >\r\n <VButton \r\n v-for=\"item in items\" \r\n v-bind=\"item.props\"\r\n class=\"v-context-menu__item\" \r\n @mouseenter=\"onItemHover($event, item)\"\r\n @click=\"onItemClick(item)\"\r\n >\r\n {{ item.title }}\r\n <ChevronRightIcon v-if=\"!!item.children\" class=\"v-context-menu__item-more-icon\"/>\r\n </VButton>\r\n </VPopover>\r\n <VContextMenu \r\n v-if=\"hasChildren\" \r\n :open=\"!!menuChildrenElement\" \r\n :items=\"menuChildrenItems\" \r\n :element=\"menuChildrenElement\" \r\n placement=\"right-start\"\r\n style=\"margin-top: -8px; margin-left: -1px\"\r\n @itemclick=\"onChildrenClick\"\r\n />\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport VPopover, { Placement } from './VPopover.vue';\r\nimport { computed, reactive, ref, shallowRef, watch } from 'vue';\r\nimport VButton from './VButton.vue';\r\nimport ChevronRightIcon from './icons/ChevronRightIcon.vue';\r\n\r\ntype NullableItem = (ContextMenuItem | undefined | null | false)\r\n\r\nconst props = defineProps<{\r\n element?: HTMLElement | null,\r\n placement?: Placement,\r\n anchorPosition?: { x: number, y: number },\r\n offset?: number,\r\n fitAnchor?: boolean,\r\n items: NullableItem[] | (() => NullableItem[]),\r\n}>()\r\n\r\nconst emit = defineEmits([ \"itemclick\" ])\r\n\r\nconst activatorElement = ref<HTMLElement | null>(null)\r\nwatch(() => props.element, (element) => {\r\n activatorElement.value = element ?? null\r\n}, { immediate: true })\r\n\r\nconst open = defineModel<boolean>(\"open\", { default: false })\r\n\r\nconst items = shallowRef<ContextMenuItem[]>([])\r\n\r\nwatch(open, (open) => {\r\n if (!open) return\r\n const _items = typeof props.items === \"function\"? props.items(): props.items\r\n items.value = _items.filter(item => !!item) as ContextMenuItem[]\r\n})\r\n\r\nconst activatorProps = {\r\n onClick: (e: MouseEvent) => {\r\n open.value = true\r\n activatorElement.value = e.currentTarget as HTMLElement\r\n }\r\n}\r\n\r\nconst onItemClick = (item: ContextMenuItem) => {\r\n if (item.onClick) {\r\n item.onClick()\r\n open.value = false\r\n emit('itemclick')\r\n }\r\n if (item.props?.to || item.props?.href) {\r\n open.value = false\r\n emit('itemclick')\r\n }\r\n}\r\n\r\nconst hasChildren = computed(() => items.value.find(item => !!item.children))\r\n\r\nlet openTimeout: ReturnType<typeof setTimeout> | null = null\r\nconst menuChildrenItems = ref<ContextMenuItem[]>([])\r\nconst menuChildrenElement = ref<HTMLElement | null>(null)\r\nconst onItemHover = (e: MouseEvent, item: ContextMenuItem,) => {\r\n if (openTimeout) {\r\n clearTimeout(openTimeout)\r\n openTimeout = null\r\n }\r\n if (!item.children && menuChildrenElement.value !== null) {\r\n menuChildrenElement.value.classList.remove(\"hover\")\r\n openTimeout = setTimeout(() => {\r\n menuChildrenElement.value = null\r\n }, 200)\r\n return\r\n }\r\n if (item.children) {\r\n let target = e.currentTarget as HTMLElement\r\n openTimeout = setTimeout(() => {\r\n menuChildrenElement.value = target\r\n menuChildrenElement.value.classList.add(\"hover\")\r\n menuChildrenItems.value = item.children!\r\n }, 150)\r\n }\r\n}\r\nwatch(open, (open) => {\r\n if (open === false) {\r\n if (openTimeout) {\r\n clearTimeout(openTimeout)\r\n openTimeout = null\r\n }\r\n menuChildrenElement.value?.classList.remove(\"hover\")\r\n menuChildrenElement.value = null\r\n }\r\n})\r\n\r\nconst onChildrenClick = () => {\r\n open.value = false\r\n}\r\n\r\ndefineOptions({\r\n inheritAttrs: false\r\n})\r\n\r\n</script>\r\n\r\n<script lang=\"ts\">\r\nexport type ContextMenuItem = {\r\n title?: string,\r\n onClick?: () => void,\r\n props?: Record<string, any>,\r\n children?: ContextMenuItem[],\r\n}\r\n\r\nexport type NullableItem = (ContextMenuItem | undefined | null | false)\r\n\r\nexport const useContextMenu = <T extends Array<any>>(creator: (...args: T) => NullableItem[]) => {\r\n\r\n let target: HTMLElement | null = null\r\n const props = reactive({\r\n items: [] as NullableItem[],\r\n open: false,\r\n anchorPosition: { x: 0, y: 0 },\r\n \"onUpdate:open\": (value: boolean) => {\r\n if (value === false && target !== null) {\r\n target.removeAttribute(\"data-popover-target\")\r\n target = null\r\n }\r\n props.open = value\r\n }\r\n })\r\n \r\n const open = (e: MouseEvent, ...args: T) => {\r\n e.preventDefault()\r\n props.items = creator(...args)\r\n props.anchorPosition = { x: e.clientX, y: e.clientY }\r\n props.open = true\r\n\r\n if (target !== null) {\r\n target.removeAttribute(\"data-popover-target\")\r\n target = null\r\n }\r\n target = e.currentTarget as HTMLElement\r\n target.setAttribute(\"data-popover-target\", \"true\")\r\n }\r\n\r\n return {\r\n props,\r\n open\r\n }\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n\r\n.v-context-menu\r\n padding: 6px\r\n display: flex\r\n flex-direction: column\r\n\r\n.v-context-menu__item\r\n height: 32px\r\n display: flex\r\n align-items: center\r\n background: none\r\n border: none\r\n outline: none\r\n cursor: pointer\r\n padding: 0 8px\r\n cursor: pointer\r\n font-weight: 500\r\n border-radius: 6px \r\n padding-right: 24px\r\n text-decoration: none\r\n min-width: 180px\r\n box-sizing: border-box\r\n text-align: start\r\n font-weight: 500\r\n justify-content: flex-start\r\n color: var(--text-color-alt)\r\n\r\n\r\n &:hover, &.hover\r\n background-color: var(--hover-color)\r\n\r\n.v-context-menu__item-more-icon\r\n margin-left: auto\r\n height: 10px\r\n width: 10px\r\n margin-right: -14px\r\n\r\n</style>","<template>\r\n <Teleport to=\"body\">\r\n <Transition>\r\n <div v-if=\"dialogStore.isOpen.value\" class=\"v-dialog-backdrop editor-component\" @mousedown=\"onMouseDown\" @mouseup=\"onMouseUp\">\r\n <component \r\n v-for=\"(dialog, index) in dialogStore.dialogHistory\" \r\n v-show=\"index === dialogStore.dialogHistory.length-1\" \r\n class=\"bd-scale scroll\"\r\n role=\"dialog\"\r\n :is=\"dialog.dialog\" \r\n v-bind=\"dialog.props\"\r\n >\r\n\r\n </component>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { useKeyDownLayer } from 'vuesix/src/hooks/useKeyDownLayer';\r\nimport { inject, Plugin, Ref, watch } from 'vue';\r\n\r\nconst dialogStore = inject(\"dialogStore\") as DialogStore & { isOpen: Ref<boolean>, dialogHistory: any[] }\r\n\r\nlet mouseDown = false\r\nconst onMouseDown = (e: MouseEvent) => {\r\n mouseDown = e.target === e.currentTarget\r\n}\r\nconst onMouseUp = (e: MouseEvent) => {\r\n if (!mouseDown || e.target !== e.currentTarget) {\r\n mouseDown = false\r\n return\r\n }\r\n dialogStore.back()\r\n}\r\n\r\nuseKeyDownLayer(\"Escape\", dialogStore.isOpen, () => {\r\n dialogStore.back()\r\n})\r\n\r\nwatch(dialogStore.isOpen, (isOpen) => {\r\n if (isOpen) {\r\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\r\n document.body.style.overflowY = \"hidden\"\r\n document.body.style.paddingRight = scrollbarWidth+\"px\"\r\n document.getElementById(\"app\")?.setAttribute(\"inert\", \"\")\r\n } else {\r\n document.body.style.paddingRight = \"\"\r\n document.body.style.overflowY = \"auto\"\r\n document.getElementById(\"app\")?.removeAttribute(\"inert\")\r\n }\r\n})\r\n\r\n</script>\r\n\r\n<script lang=\"ts\">\r\nimport { computed, DefineComponent, ExtractPropTypes, shallowReactive } from \"vue\";\r\n\r\ntype OpenDialog = <T>(_dialog: DefineComponent<T, {}, any>, props?: ExtractPropTypes<T>) => void\r\n\r\nexport type DialogStore = { open: OpenDialog, close: () => void, back: () => void }\r\n\r\nexport const createDialogSystem = (): Plugin => {\r\n return { \r\n install: (app) => {\r\n const dialogHistory = shallowReactive<{ dialog: DefineComponent<any, {}, any>, props: any }[]>([])\r\n\r\n const open: OpenDialog = (dialog, props) => {\r\n dialogHistory.push({ dialog: dialog as any, props })\r\n }\r\n\r\n const close = () => {\r\n dialogHistory.length = 0\r\n }\r\n\r\n const back = () => {\r\n if (dialogHistory.length === 0) return\r\n dialogHistory.pop()\r\n }\r\n\r\n const dialog = computed(() => {\r\n if (dialogHistory.length === 0) return { dialog: null, props: {} }\r\n return dialogHistory[dialogHistory.length-1]\r\n })\r\n\r\n const isOpen = computed(() => dialogHistory.length > 0)\r\n\r\n app.provide(\"dialogStore\", { open, close, back, dialogHistory, dialog, isOpen })\r\n }\r\n }\r\n}\r\n\r\nexport const useDialog = () => inject(\"dialogStore\") as DialogStore\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-dialog-backdrop\r\n position: fixed\r\n top: 0\r\n bottom: 0\r\n width: 100vw\r\n background-color: rgba(0, 0, 0, 0.75)\r\n display: flex\r\n align-items: center\r\n flex-direction: column\r\n justify-content: flex-start\r\n padding-top: 12vh\r\n z-index: 2000\r\n box-sizing: border-box\r\n\r\n &.v-enter-active, &.v-leave-active \r\n transition: opacity 0.14s ease\r\n .v-dialog\r\n transition: transform 0.1s cubic-bezier(0, 0, 0.2, 1)\r\n\r\n &.v-enter-from, &.v-leave-to \r\n opacity: 0\r\n\r\n .v-dialog\r\n transform: scale(0.8)\r\n\r\n</style>","<template>\r\n <component :is=\"props.component ?? 'div'\" class=\"v-dialog scroll editor-component\" role=\"dialog\">\r\n <div v-if=\"slots.header\" class=\"v-dialog__header heading\">\r\n <slot name=\"header\"></slot>\r\n <VIconButton role=\"button\" class=\"close-icon\" @click=\"dialog.close\">\r\n <CloseMinIcon/>\r\n </VIconButton>\r\n </div>\r\n <div class=\"v-dialog__content\" :class=\"[props['content:class'], slots.actions? '': 'bottom-padding']\" >\r\n <slot></slot>\r\n </div>\r\n <div v-if=\"slots.actions\" class=\"v-dialog__actions\">\r\n <slot name=\"actions\"></slot>\r\n </div>\r\n </component>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { useSlots } from 'vue';\r\nimport { useDialog } from './VDialogProvider.vue';\r\nimport VIconButton from './VIconButton.vue';\r\nimport CloseMinIcon from './icons/CloseMinIcon.vue';\r\n\r\nconst slots = useSlots()\r\n\r\nconst props = defineProps<{ \"content:class\"?: string, component?: string }>()\r\n\r\nconst dialog = useDialog()\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-dialog\r\n background-color: var(--paper-color)\r\n border-radius: 16px\r\n position: relative\r\n max-height: 86vh\r\n max-width: 94vw\r\n --padding: 0 24px\r\n min-width: 250px\r\n overflow-y: auto\r\n\r\n &.standart\r\n width: 650px\r\n\r\n @media(max-width: 800px)\r\n position: fixed\r\n max-width: unset\r\n max-height: unset\r\n top: 0\r\n bottom: 0\r\n right: 0\r\n left: 0\r\n max-height: 100%\r\n max-width: 100%\r\n margin: 0\r\n border-radius: 0\r\n\r\n &.standart\r\n width: 100%\r\n\r\n.v-dialog__header\r\n font-size: 18px\r\n // font-weight: 700\r\n padding: var(--padding)\r\n display: flex\r\n align-items: center\r\n height: 60px\r\n border-bottom: 1px solid var(--border-color)\r\n position: relative\r\n width: 100%\r\n box-sizing: border-box\r\n gap: 8px\r\n\r\n .close-icon\r\n margin-right: -8px\r\n width: 32px\r\n height: 32px\r\n margin-left: auto\r\n \r\n.v-dialog__content\r\n padding: var(--padding)\r\n padding-top: 16px\r\n padding-bottom: 4px\r\n\r\n &.bottom-padding\r\n padding-bottom: 16px\r\n\r\n.v-dialog__actions\r\n padding: var(--padding)\r\n padding-top: 0\r\n display: flex\r\n justify-content: flex-end\r\n align-items: center\r\n height: 82px\r\n gap: 8px\r\n\r\n</style>","<template>\r\n <VDialog style=\"width: 900px\">\r\n <template #header>Изображения проекта</template>\r\n <div v-if=\"data\" class=\"project-images__grid\">\r\n <button v-for=\"item in data\" @click=\"openImage(item)\">\r\n <img :src=\"item.previewSrc ?? item.src\" />\r\n </button>\r\n </div>\r\n </VDialog>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport VDialog from '../VDialog.vue';\r\nimport { useRequest } from 'vuesix'\r\nimport { useDialog } from '../VDialogProvider.vue';\r\n\r\nconst props = defineProps<{ fileRequest: () => Promise<any>, onOpenImage: (image: any) => void }>()\r\nconst { data } = useRequest(props.fileRequest)\r\n\r\nconst dialog = useDialog()\r\n\r\nconst openImage = (item: any) => {\r\n props.onOpenImage(item)\r\n dialog.back()\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.project-images__grid\r\n display: grid\r\n grid-template-columns: repeat(6, 1fr)\r\n min-height: 200px\r\n \r\n button\r\n overflow: hidden\r\n border: none\r\n background: none\r\n position: relative\r\n cursor: pointer\r\n min-height: 60px\r\n\r\n img\r\n width: 100%\r\n height: 100%\r\n object-fit: contain\r\n border-radius: 8px\r\n display: block\r\n\r\n button:hover\r\n &:after\r\n content: \"\"\r\n position: absolute\r\n inset: 0\r\n background-color: rgba(255, 255, 255, 0.25)\r\n \r\n\r\n</style>","<template>\n <VFormControl \n class=\"v-image-uploader\" \n :class=\"{ drag }\"\n :error=\"error\" \n :label=\"label\" \n :required=\"required\" \n :disabled=\"disabled\" \n outline\n @drop=\"onDrop\"\n @dragover=\"onDragOver\" \n @dragleave=\"onDragLeave\"\n >\n <template v-if=\"drag\">\n <div class=\"v-image-uploader__drag-label\">Отпустите файл здесь</div>\n </template>\n <template v-else-if=\"!props.modelValue || props.modelValue.src === defaultImageSrc\">\n <EmptyFileIcon/>\n <div>\n <a @click=\"fileDialog.open()\">Загрузите изображение</a>\n <br/>или перетащите сюда\n <VContextMenu v-if=\"contextMenuItems.length > 0\" :items=\"contextMenuItems\" placement=\"bottom-end\">\n <template #activator=\"{ props }\">\n <VIconButton v-bind=\"props\" class=\"v-image-uploader__more-button\"><MoreIcon/></VIconButton>\n </template>\n </VContextMenu>\n </div>\n </template>\n <template v-else>\n <div class=\"v-image-uploader__image-preview\" >\n <img :src=\"props.modelValue.previewSrc ?? props.modelValue.src\" alt=\"Preview Image\" />\n <VIconButton class=\"v-image-uploader__delete-button\" @click=\"removeImage\"><CloseMinIcon/></VIconButton>\n </div>\n <div class=\"v-image-uploader__image-info\">\n <div>{{ props.modelValue.name }}</div>\n </div>\n </template>\n </VFormControl>\n</template>\n\n<script lang=\"ts\" setup>\nimport { inject, ref } from 'vue';\nimport VFormControl, { VFormControlProps } from './VFormControl.vue';\nimport EmptyFileIcon from './icons/EmptyFileIcon.vue'\nimport CloseMinIcon from './icons/CloseMinIcon.vue'\nimport { useFileDialog } from '@vueuse/core'\nimport { defaultImageSrc, getDefaultValue } from '../utils/passDefaultValue';\nimport VIconButton from './VIconButton.vue';\nimport MoreIcon from './icons/MoreIcon.vue';\nimport VContextMenu from './VContextMenu.vue';\nimport { useDialog } from './VDialogProvider.vue';\nimport ProjectImagesDialog from './dialogs/ProjectImagesDialog.vue'\n\nconst props = defineProps<{ \n accept?: string,\n schema?: any,\n modelValue?: FileInfo | null,\n} & VFormControlProps>()\nconst emit = defineEmits([ \"update:modelValue\" ])\n\nconst fileUploader = inject(\"fileUploader\") as (file: File) => Promise<any>\nconst fileRequest = inject(\"fileRequest\", null) as (() => Promise<any>) | null\n\nconst addFile = async (file: File) => {\n emit(\"update:modelValue\", { src: URL.createObjectURL(file), file, name: file.name })\n if (fileUploader) {\n const resp = await fileUploader(file)\n emit(\"update:modelValue\", { src: resp.src, previewSrc: resp.previewSrc, name: resp.name })\n }\n // emit(\"loadFile\", file)\n}\n\nconst drag = ref(false)\nconst onDragOver = (e: DragEvent) => {\n if (e.dataTransfer?.types?.[0]?.startsWith('text')) return\n e.preventDefault()\n drag.value = true\n}\n\nconst onDragLeave = (e: DragEvent) => {\n if (e.relatedTarget === e.currentTarget || (e.relatedTarget as HTMLElement)?.parentElement === e.currentTarget) return\n drag.value = false\n}\n\nconst onDrop = (e: DragEvent) => {\n e.preventDefault()\n drag.value = false\n\n for (const item of (e as any).dataTransfer.items) {\n if (item.kind !== 'file') continue\n const file = item.getAsFile() as File\n if (!file) continue\n\n addFile(file)\n }\n}\n\nconst fileDialog = useFileDialog({\n accept: props.accept ?? 'image/*',\n multiple: false\n})\n\nfileDialog.onChange((files) => {\n if (!files || files.length === 0) return\n for (const file of files) {\n addFile(file)\n }\n fileDialog.reset()\n})\n\nconst removeImage = () => {\n emit(\"update:modelValue\", getDefaultValue(props.schema ?? { type: \"object\", format: \"image\" }))\n}\n\nconst dialog = useDialog()\nconst contextMenuItems: any[] = []\n\nconst onOpenImage = (image: any) => {\n emit(\"update:modelValue\", image)\n}\n\nif (fileRequest) {\n contextMenuItems.push({ title: \"Выбрать из файлов проекта\", onClick: () => dialog.open(ProjectImagesDialog as any, { fileRequest, onOpenImage }) })\n}\n\n</script>\n\n<script lang=\"ts\">\nexport type FileInfo = {\n id?: string,\n file?: File,\n src: string,\n name: string,\n previewSrc?: string,\n progress?: number | null\n}\n\n</script>\n\n\n<style lang=\"sass\">\n.v-image-uploader .v-form-control__outline\n height: 80px\n display: flex\n align-items: center\n padding: 0 12px\n font-size: 13px\n color: var(--text-secondary-color)\n gap: 16px\n\n &:focus-within\n border-color: var(--input-border-color)\n box-shadow: none\n\n a\n color: var(--accent-color)\n font-weight: 500\n cursor: pointer\n &:hover\n text-decoration: underline\n\n.v-image-uploader__drag-label\n text-align: center\n flex: 1 1 auto\n color: var(--text-secondary-color)\n font-size: 13px\n pointer-events: none\n\n.v-image-uploader__image-preview\n width: fit-content\n position: relative\n img\n max-width: 90px\n max-height: 60px\n display: block\n border-radius: 4px\n\n.v-image-uploader__delete-button\n top: -10px\n right: -10px\n position: absolute\n svg\n width: 10px\n height: 10px\n\n.v-image-uploader__image-info\n color: var(--text-color)\n\n.v-image-uploader.drag .v-form-control__outline\n pointer-events: none\n border-color: var(--primary-color)\n box-shadow: 0 0 0 2px var(--shadow-color)\n\n.v-image-uploader__more-button.v-icon-button\n position: absolute\n top: 4px\n right: 4px\n width: 24px\n height: 24px\n svg\n width: 18px\n height: 18px\n\n</style>","<template>\n<svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n<path d=\"M14.0326 5.40749C13.9629 5.33719 13.8799 5.28139 13.7885 5.24332C13.6971 5.20524 13.5991 5.18564 13.5001 5.18564C13.4011 5.18564 13.303 5.20524 13.2117 5.24332C13.1203 5.28139 13.0373 5.33719 12.9676 5.40749L7.38008 11.0025L5.03258 8.64749C4.96019 8.57756 4.87474 8.52257 4.7811 8.48567C4.68745 8.44877 4.58746 8.43067 4.48683 8.43241C4.38619 8.43415 4.28688 8.4557 4.19457 8.49582C4.10227 8.53594 4.01876 8.59385 3.94883 8.66624C3.87891 8.73863 3.82392 8.82408 3.78702 8.91773C3.75011 9.01137 3.73202 9.11136 3.73376 9.212C3.7355 9.31263 3.75704 9.41194 3.79716 9.50425C3.83728 9.59656 3.89519 9.68006 3.96758 9.74999L6.84758 12.63C6.91731 12.7003 7.00026 12.7561 7.09165 12.7942C7.18305 12.8322 7.28108 12.8518 7.38008 12.8518C7.47909 12.8518 7.57712 12.8322 7.66852 12.7942C7.75991 12.7561 7.84286 12.7003 7.91258 12.63L14.0326 6.50999C14.1087 6.43976 14.1695 6.35452 14.211 6.25964C14.2526 6.16477 14.274 6.06231 14.274 5.95874C14.274 5.85516 14.2526 5.75271 14.211 5.65783C14.1695 5.56296 14.1087 5.47772 14.0326 5.40749Z\" fill=\"currentColor\"/>\r\n</svg>\n</template>\n","<template>\r\n <div class=\"mech-v-checkbox\" :class=\"{ active: model }\" role=\"checkbox\" @click=\"onClick\" @keydown=\"onClick\">\r\n <div v-if=\"labelPosition === 'left'\" class=\"mech-v-checkbox__label left\">\r\n <slot name=\"label\">{{ props.label }}</slot>\r\n </div>\r\n <div class=\"mech-v-checkbox__icon\" :class=\"{ active: model }\">\r\n <CheckIcon/>\r\n </div>\r\n <input v-model=\"model\" type=\"checkbox\" :name=\"props.name\"/>\r\n <div v-if=\"labelPosition === 'right'\" class=\"mech-v-checkbox__label\">\r\n <slot name=\"label\">{{ props.label }}</slot>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { computed, useSlots } from 'vue';\r\nimport CheckIcon from './icons/CheckIcon.vue';\r\n\r\nconst props = defineProps<{ label?: string, name?: string, labelPosition?: \"left\" | \"right\" }>()\r\nconst model = defineModel<boolean>()\r\n\r\nconst onClick = (e: MouseEvent | KeyboardEvent) => {\r\n if (e instanceof KeyboardEvent && e.code !== \"Enter\") return\r\n (e.currentTarget as HTMLEmbedElement).querySelector(\"input\")?.click()\r\n // model.value = !model.value\r\n}\r\n\r\nconst slots = useSlots()\r\nconst labelPosition = computed(() => {\r\n if (!props.label && !slots.label) return \"none\"\r\n if (props.labelPosition === \"left\") return \"left\"\r\n return \"right\"\r\n})\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n\r\n.mech-v-checkbox\r\n display: flex\r\n align-items: center\r\n cursor: pointer\r\n gap: 10px\r\n position: relative\r\n \r\n input\r\n position: absolute\r\n top: 0\r\n left: 0\r\n opacity: 0\r\n pointer-events: none\r\n\r\n &:focus-within\r\n .mech-v-checkbox__icon\r\n border-color: var(--primary-color)\r\n box-shadow: 0 0 0 2px var(--shadow-color)\r\n\r\n.mech-v-checkbox__label\r\n color: var(--text-color)\r\n font-size: 13px\r\n\r\n a\r\n color: var(--text-color)\r\n text-decoration: underline\r\n\r\n &.left\r\n margin-left: 0\r\n\r\n\r\n.mech-v-checkbox__icon.active\r\n color: white\r\n background-color: var(--button-color)\r\n border-color: var(--button-color)\r\n\r\n svg\r\n opacity: 1\r\n\r\n &:hover\r\n background-color: var(--button-color-hover)\r\n border-color: var(--button-color-hover)\r\n\r\n &:active\r\n background-color: var(--button-color)\r\n\r\n.mech-v-checkbox__icon\r\n width: 16px\r\n height: 16px\r\n border: 1px solid #CCCCCC\r\n border-radius: 4px\r\n display: flex\r\n align-items: center\r\n justify-content: center\r\n transition: background-color 0.1s\r\n\r\n &:hover\r\n border-color: #999999\r\n\r\n &:active\r\n border-color: #777777\r\n\r\n @media(max-width: 800px)\r\n margin-top: 0\r\n \r\n svg\r\n width: 18px\r\n height: 18px\r\n opacity: 0\r\n\r\n</style>","export const getBlockName = (path?: string) => {\r\n if (!path) return undefined\r\n const str = path.split(\"/\").at(-1)\r\n return str?.split(\".\", 1)[0].replace(/([A-Z])/g, \" $1\").trimStart() ?? \"Unnamed block\"\r\n}\r\n\r\nexport const capitalize = (text: string) => {\r\n return text[0].toUpperCase() + text.slice(1)\r\n}\r\n\r\nexport const spaceCamelCase = (str: string) => {\r\n return capitalize(str.replace(/([A-Z])/g, \" $1\").trimStart())\r\n}\r\n\r\n\r\nexport function bytesForHuman (bytes: number | undefined): string {\r\n if (typeof (bytes) !== 'number') {\r\n return 'Unknown'\r\n }\r\n\r\n const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']\r\n\r\n let i = 0\r\n\r\n for (i; bytes >= 1024; i++) {\r\n bytes /= 1024\r\n }\r\n\r\n return `${Math.trunc(bytes * 10) / 10} ${units[i]}`\r\n}\r\n","<template>\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M13.8961 3.02922C14.25 2.67528 14.7238 2.4669 15.2238 2.44523C15.7239 2.42357 16.2139 2.5902 16.5971 2.91222L16.7241 3.02922L20.9671 7.27222C21.3208 7.62608 21.529 8.09964 21.5506 8.59947C21.5723 9.0993 21.4058 9.5891 21.0841 9.97222L20.9671 10.1002L10.6531 20.4142C10.3211 20.7462 9.88282 20.9509 9.41509 20.9922L9.23909 20.9992H4.00609C3.75727 20.9992 3.5172 20.9074 3.33192 20.7413C3.14664 20.5752 3.02919 20.3466 3.00209 20.0992L2.99609 19.9892V14.7562C2.99621 14.2867 3.16153 13.8321 3.46309 13.4722L3.58309 13.3422L13.8961 3.02922ZM12.1701 7.58322L4.99609 14.7572V18.9992H9.24009L16.4141 11.8252L12.1711 7.58222L12.1701 7.58322ZM15.3101 4.44322L13.5841 6.16922L17.8271 10.4122L19.5531 8.68622L15.3101 4.44322Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\r\n <VSelect class=\"v-link-editor\" v-model=\"linkType\" :items=\"linkTypes\" :nullable=\"props.nullable\">\r\n <VPopover v-if=\"model && model.id\" :offset=\"4\" placement=\"bottom-end\">\r\n <template #activator=\"{ props }\">\r\n <VIconButton v-bind=\"props\" class=\"edit-button\"><EditIcon/> </VIconButton>\r\n </template>\r\n <div class=\"v-link-editor__custom\">\r\n <VInput v-if=\"model.id === '_external'\" v-model=\"model.url\" label=\"URL ссылки\" autofocus/>\r\n <VInput v-if=\"model.id !== '_external'\" v-model=\"model.query\" label=\"Якорь\" :prefix=\"model?.url\"/>\r\n <VInput v-model=\"model.title\" label=\"Заголовок\" />\r\n <VCheckbox v-model=\"model.openNewTab\" label=\"Открывать в новой вкладке\"/>\r\n </div>\r\n </VPopover>\r\n </VSelect>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { useRequest } from 'vuesix';\r\nimport VSelect from './VSelect.vue';\r\nimport { computed, getCurrentInstance, inject, nextTick, ref, watch } from 'vue';\r\nimport VIconButton from './VIconButton.vue';\r\nimport EditIcon from './icons/EditIcon.vue';\r\nimport VInput from './VInput.vue';\r\nimport VPopover from './VPopover.vue';\r\nimport VCheckbox from './VCheckbox.vue';\r\nimport { PageLink } from '../types';\r\n\r\nconst props = defineProps<{ nullable?: boolean }>()\r\nconst model = defineModel<PageLink | null>()\r\n\r\nconst pagesRequest = inject(\"pagesRequest\") as (() => Promise<any>)\r\nconst { data } = useRequest(pagesRequest)\r\n\r\nconst linkType = ref<string>()\r\nif (model.value && model.value.id) {\r\n linkType.value = model.value.id\r\n}\r\n\r\nconst current = getCurrentInstance()\r\n\r\nwatch(linkType, (type) => {\r\n if (type === \"_external\") return\r\n if (type === null) {\r\n if (props.nullable) {\r\n model.value = null\r\n } else {\r\n model.value = { id: \"\", title: \"\" }\r\n }\r\n return\r\n }\r\n if (type === \"_externalNew\") {\r\n model.value = { id: \"_external\", url: \"\", title: \"\", external: true }\r\n nextTick(() => {\r\n const editButton = (current?.vnode.el as HTMLElement).querySelector(\".edit-button\") as HTMLButtonElement\r\n editButton?.dispatchEvent(new MouseEvent(\"mousedown\"))\r\n linkType.value = \"_external\"\r\n })\r\n } else {\r\n const page = data.value.find((item: any) => item.id === type)\r\n model.value = { ...page }\r\n }\r\n})\r\n\r\nconst linkTypes = computed(() => {\r\n const arr: Array<{ id: string, title: string } | string> = [\r\n { id: \"_externalNew\", title: \"Внешняя страница...\" },\r\n ]\r\n\r\n if (model.value && model.value.id === \"_external\") {\r\n arr.push({ id: \"_external\", title: model.value.title? `${model.value.title} [${model.value.url}]`: (model.value.url || \"Внешняя страница\") })\r\n }\r\n\r\n if (data.value) {\r\n arr.push(\"\")\r\n arr.push(...data.value)\r\n }\r\n\r\n return arr\r\n})\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-link-editor\r\n .edit-button\r\n flex-shrink: 0\r\n\r\n svg\r\n width: 12px\r\n height: 12px\r\n\r\n.v-link-editor__custom\r\n width: 280px\r\n display: flex\r\n flex-direction: column\r\n gap: 6px\r\n padding: 14px\r\n box-sizing: border-box\r\n\r\n .v-form-control__outline\r\n height: 34px\r\n\r\n .mech-v-checkbox\r\n margin-top: 6px\r\n\r\n</style>","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => {\n __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\nimport { getCurrentScope, onScopeDispose, unref, watch, reactive, computed, ref, defineComponent, getCurrentInstance, h, nextTick, useSlots, isProxy, toRaw, onMounted, openBlock, createElementBlock, Fragment, renderList, createBlock, renderSlot, createCommentVNode } from \"vue\";\nfunction tryOnScopeDispose(fn) {\n if (getCurrentScope()) {\n onScopeDispose(fn);\n return true;\n }\n return false;\n}\nfunction toValue(r) {\n return typeof r === \"function\" ? r() : unref(r);\n}\nconst isClient = typeof window !== \"undefined\" && typeof document !== \"undefined\";\ntypeof WorkerGlobalScope !== \"undefined\" && globalThis instanceof WorkerGlobalScope;\nconst toString = Object.prototype.toString;\nconst isObject = (val) => toString.call(val) === \"[object Object]\";\nconst noop = () => {\n};\nfunction unrefElement(elRef) {\n var _a;\n const plain = toValue(elRef);\n return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;\n}\nconst defaultWindow = isClient ? window : void 0;\nfunction useEventListener(...args) {\n let target;\n let events;\n let listeners;\n let options;\n if (typeof args[0] === \"string\" || Array.isArray(args[0])) {\n [events, listeners, options] = args;\n target = defaultWindow;\n } else {\n [target, events, listeners, options] = args;\n }\n if (!target)\n return noop;\n if (!Array.isArray(events))\n events = [events];\n if (!Array.isArray(listeners))\n listeners = [listeners];\n const cleanups = [];\n const cleanup = () => {\n cleanups.forEach((fn) => fn());\n cleanups.length = 0;\n };\n const register = (el, event, listener, options2) => {\n el.addEventListener(event, listener, options2);\n return () => el.removeEventListener(event, listener, options2);\n };\n const stopWatch = watch(\n () => [unrefElement(target), toValue(options)],\n ([el, options2]) => {\n cleanup();\n if (!el)\n return;\n const optionsClone = isObject(options2) ? { ...options2 } : options2;\n cleanups.push(\n ...events.flatMap((event) => {\n return listeners.map((listener) => register(el, event, listener, optionsClone));\n })\n );\n },\n { immediate: true, flush: \"post\" }\n );\n const stop = () => {\n stopWatch();\n cleanup();\n };\n tryOnScopeDispose(stop);\n return stop;\n}\nconst findParent = (el, callback) => {\n if (!el)\n return null;\n if (el.nodeType === Node.ELEMENT_NODE) {\n if (callback(el))\n return el;\n }\n if (!el.parentElement)\n return null;\n return findParent(el.parentElement, callback);\n};\nconst calcOffsetToNode = (parent, target) => {\n let offset = 0;\n for (let child of parent.childNodes) {\n if (child.nodeName === \"BR\")\n continue;\n const ch = child.nodeType === Node.TEXT_NODE ? child : child.childNodes[0];\n if (ch === target)\n return offset;\n offset += ch.length;\n }\n return offset;\n};\nconst calcNodeByOffset = (parent, offset) => {\n let currentOffset = offset;\n if (offset === 0)\n return [parent, 0];\n for (let child of parent.childNodes) {\n if (child.nodeName === \"BR\")\n continue;\n const ch = child.nodeType === Node.TEXT_NODE ? child : child.childNodes[0];\n if (currentOffset - ch.length <= 0) {\n return [ch, currentOffset];\n }\n currentOffset -= ch.length;\n }\n return [parent, 0];\n};\nconst clamp = (val, min, max) => {\n if (val > max)\n return max;\n if (val < min)\n return min;\n return val;\n};\nconst isEqual = (a, b) => {\n if (a === b)\n return true;\n if (typeof a !== \"object\" || typeof b !== \"object\" || a === null || b === null)\n return false;\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++) {\n if (!isEqual(a[i], b[i]))\n return false;\n }\n return true;\n }\n for (let key in a) {\n if (!isEqual(a[key], b[key]))\n return false;\n }\n return true;\n};\nclass TextEditorHistory {\n constructor(store) {\n __publicField(this, \"actions\", []);\n __publicField(this, \"currentCursor\", 0);\n __publicField(this, \"blocksIds\", \"\");\n __publicField(this, \"cachedBlocksJson\", \"\");\n __publicField(this, \"store\");\n __publicField(this, \"tickStarted\", false);\n this.store = store;\n window.showHistory = () => console.log(this.actions);\n }\n cacheBlockIds() {\n this.blocksIds = this.store.blocks.map((item) => item.id).join(\",\");\n }\n blockIdsChanged() {\n return this.blocksIds !== this.store.blocks.map((item) => item.id).join(\",\");\n }\n push(type) {\n var _a;\n if (this.currentCursor + 1 < this.actions.length) {\n this.actions.length = this.currentCursor + 1;\n }\n const lastAction = this.actions.length > 0 ? this.actions[this.actions.length - 1] : null;\n const selection = JSON.parse(JSON.stringify(this.store.selection));\n const fullUpdate = type === \"setText\" || type === \"addNewLine\" || this.blockIdsChanged();\n const blocksJson = JSON.stringify(this.store.blocks);\n if (!fullUpdate && this.store.currentBlock) {\n const currentBlock = JSON.parse(JSON.stringify(this.store.currentBlock));\n if (lastAction && lastAction.type === type && ((_a = lastAction.blocks[0]) == null ? void 0 : _a.id) === currentBlock.id && (lastAction.type === \"insertText\" || lastAction.type === \"deleteContentBackward\" || lastAction.type === \"deleteContentForward\")) {\n lastAction.blocks = [currentBlock];\n lastAction.selection = selection;\n } else {\n this.actions.push({ type, blocks: [currentBlock], selection, fullUpdate });\n }\n } else {\n this.actions.push({ type, blocks: JSON.parse(blocksJson), selection, fullUpdate });\n }\n this.currentCursor = this.actions.length - 1;\n if (fullUpdate) {\n if (lastAction && !lastAction.fullUpdate) {\n lastAction.fullUpdate = true;\n lastAction.blocks = JSON.parse(this.cachedBlocksJson);\n }\n this.cacheBlockIds();\n }\n this.cachedBlocksJson = blocksJson;\n }\n applyAction(action) {\n if (action.fullUpdate) {\n for (let i = 0; i < action.blocks.length; i++) {\n if (i >= this.store.blocks.length) {\n this.store.blocks.push({ ...action.blocks[i] });\n } else {\n Object.assign(this.store.blocks[i], action.blocks[i]);\n this.store.blocks[i].type = action.blocks[i].type;\n }\n }\n if (this.store.blocks.length > action.blocks.length) {\n this.store.blocks.length = action.blocks.length;\n }\n } else {\n for (let _block of action.blocks) {\n const block = this.store.blocks.find((block2) => block2.id === _block.id);\n if (block) {\n block.text = _block.text;\n block.styles = _block.styles;\n block.type = _block.type;\n }\n }\n }\n Object.assign(this.store.selection, action.selection);\n this.cacheBlockIds();\n }\n undo() {\n if (this.currentCursor === 0)\n return;\n this.currentCursor--;\n this.applyAction(this.actions[this.currentCursor]);\n }\n redo() {\n if (this.currentCursor >= this.actions.length - 1)\n return;\n this.currentCursor++;\n this.applyAction(this.actions[this.currentCursor]);\n }\n}\nclass TextEditorStore {\n constructor() {\n __publicField(this, \"history\", new TextEditorHistory(this));\n __publicField(this, \"blocks\", reactive([{ id: uid(), text: \"\", styles: [] }]));\n __publicField(this, \"selection\", reactive({\n anchor: { blockId: this.blocks[0].id, offset: 0 },\n focus: { blockId: this.blocks[0].id, offset: 0 }\n }));\n __publicField(this, \"_isCollapsed\", computed(() => {\n return this.selection.anchor.blockId === this.selection.focus.blockId && this.selection.anchor.offset === this.selection.focus.offset;\n }));\n __publicField(this, \"isFocused\", ref(false));\n __publicField(this, \"_currentBlock\", computed(() => {\n if (this.selection.anchor.blockId !== this.selection.focus.blockId)\n return null;\n return this.blocks.find((item) => item.id === this.selection.anchor.blockId) ?? null;\n }));\n __publicField(this, \"_selectedText\", computed(() => {\n if (this.isCollapsed)\n return \"\";\n const [start, end, startIndex, endIndex] = this.startAndEnd;\n if (startIndex === endIndex) {\n return this.blocks[startIndex].text.slice(start.offset, end.offset);\n }\n const startText = this.blocks[startIndex].text.slice(start.offset);\n const endText = this.blocks[endIndex].text.slice(0, end.offset);\n const arr = [startText, ...this.blocks.slice(startIndex + 1, endIndex).map((block) => block.text), endText];\n return arr.join(\"\\n\");\n }));\n __publicField(this, \"_currentStyles\", computed(() => {\n const [start, end, startIndex, endIndex] = this.startAndEnd;\n const styles = /* @__PURE__ */ new Map();\n if (startIndex < 0)\n return styles;\n for (let i = startIndex; i <= endIndex; i++) {\n const blockStyles = this.blocks[i].styles;\n if (!blockStyles)\n continue;\n for (let style of blockStyles) {\n if (i === startIndex && start.offset < style.start)\n continue;\n if (i === endIndex && end.offset > style.end)\n continue;\n styles.set(style.style, style);\n }\n }\n return styles;\n }));\n }\n get isCollapsed() {\n return this._isCollapsed.value;\n }\n get currentBlock() {\n return this._currentBlock.value;\n }\n *getCurrentBlocks() {\n const blockAnchorIndex = this.blocks.findIndex((item) => item.id === this.selection.anchor.blockId);\n const focusAnchorIndex = this.blocks.findIndex((item) => item.id === this.selection.focus.blockId);\n if (blockAnchorIndex === -1 || focusAnchorIndex === -1)\n return;\n const start = Math.min(blockAnchorIndex, focusAnchorIndex);\n const end = Math.max(blockAnchorIndex, focusAnchorIndex);\n for (let i = start; i <= end; i++) {\n yield this.blocks[i];\n }\n }\n get selectedText() {\n return this._selectedText.value;\n }\n moveOffset(newOffset) {\n const delta = newOffset - this.selection.anchor.offset;\n if (delta === 0)\n return;\n this.moveStyles(this.currentBlock, this.selection.focus.offset, -delta);\n this.selection.anchor.offset = newOffset;\n this.selection.focus.offset = newOffset;\n }\n addStyleToBlock(block, style) {\n if (!block.styles) {\n block.styles = [style];\n } else {\n block.styles.push(style);\n }\n block.styles.sort((a, b) => a.start - b.start);\n }\n concatBlocks(start, end) {\n if (end.styles) {\n for (let style of end.styles) {\n style.start += start.text.length;\n style.end += start.text.length;\n this.addStyleToBlock(start, style);\n }\n }\n start.text = start.text + end.text;\n }\n removeCurrentBlock() {\n const blockIndex = this.blocks.findIndex((item) => item.id === this.selection.anchor.blockId);\n if (blockIndex < 0)\n return;\n this.blocks.splice(blockIndex, 1);\n if (this.blocks.length === 0) {\n this.blocks.push({ id: uid(), text: \"\" });\n }\n const newBlockIndex = Math.max(blockIndex - 1, 0);\n this.selection.anchor.blockId = this.blocks[newBlockIndex].id;\n this.selection.focus.blockId = this.blocks[newBlockIndex].id;\n this.selection.anchor.offset = blockIndex === 0 ? 0 : this.blocks[newBlockIndex].text.length;\n this.selection.focus.offset = blockIndex === 0 ? 0 : this.blocks[newBlockIndex].text.length;\n this.history.push(\"removeBlock\");\n }\n removeNewLine() {\n const blockIndex = this.blocks.findIndex((item) => item.id === this.selection.anchor.blockId);\n if (blockIndex < 1)\n return;\n if (this.blocks[blockIndex - 1].editable === false) {\n if (this.blocks[blockIndex].text === \"\") {\n this.blocks.splice(blockIndex, 1);\n }\n this.selection.anchor.blockId = this.blocks[blockIndex - 1].id;\n this.selection.focus.blockId = this.blocks[blockIndex - 1].id;\n this.selection.anchor.offset = 0;\n this.selection.focus.offset = 0;\n } else {\n this.selection.anchor.blockId = this.blocks[blockIndex - 1].id;\n this.selection.focus.blockId = this.blocks[blockIndex - 1].id;\n this.selection.anchor.offset = this.blocks[blockIndex - 1].text.length;\n this.selection.focus.offset = this.blocks[blockIndex - 1].text.length;\n this.concatBlocks(this.blocks[blockIndex - 1], this.blocks[blockIndex]);\n this.blocks.splice(blockIndex, 1);\n }\n }\n onInput(_e) {\n const ev = _e;\n if (ev.defaultPrevented)\n return;\n ev.preventDefault();\n const collapsed = this.isCollapsed;\n if (!collapsed)\n this.deleteSelected();\n const block = this.currentBlock;\n if (!block)\n return;\n if ((ev.inputType === \"deleteContentBackward\" || ev.inputType === \"deleteContentForward\") && collapsed) {\n if (ev.inputType === \"deleteContentBackward\") {\n if (this.selection.anchor.offset === 0) {\n if (block.type) {\n delete block.type;\n } else {\n this.removeNewLine();\n }\n } else {\n const offset = Math.max(0, this.selection.focus.offset - 1);\n block.text = block.text.slice(0, offset) + block.text.slice(this.selection.focus.offset);\n this.moveOffset(offset);\n }\n this.history.push(\"deleteContentBackward\");\n }\n if (ev.inputType === \"deleteContentForward\") {\n const blockIndex = this.blocks.findIndex((item) => item.id === this.selection.anchor.blockId);\n if (this.selection.anchor.offset === this.blocks[blockIndex].text.length) {\n const nextBlock = this.blocks[blockIndex + 1];\n if (nextBlock) {\n this.blocks.splice(blockIndex + 1, 1);\n this.concatBlocks(this.blocks[blockIndex], nextBlock);\n }\n } else {\n block.text = block.text.slice(0, this.selection.focus.offset) + block.text.slice(this.selection.focus.offset + 1);\n this.moveStyles(block, this.selection.focus.offset + 1, 1);\n }\n this.history.push(\"deleteContentForward\");\n }\n }\n if (ev.inputType === \"insertText\") {\n this.insertText(ev.data);\n this.history.push(\"insertText\");\n }\n }\n addNewLineBefore() {\n const index = this.blocks.findIndex((item) => item.id === this.selection.anchor.blockId);\n const block = { id: uid(), text: \"\" };\n this.blocks.splice(index, 0, block);\n this.history.push(\"addNewLine\");\n }\n addNewLine() {\n var _a;\n if (this.isCollapsed && this.selection.anchor.offset === 0 && ((_a = this.currentBlock) == null ? void 0 : _a.editable) !== false) {\n this.addNewLineBefore();\n return;\n }\n this.deleteSelected();\n if (!this.currentBlock)\n return;\n const endText = this.currentBlock.editable === false ? \"\" : this.currentBlock.text.slice(this.selection.anchor.offset);\n this.currentBlock.text = this.currentBlock.text.slice(0, this.selection.anchor.offset);\n const block = { id: uid(), text: endText || \"\" };\n const index = this.blocks.findIndex((item) => item.id === this.selection.anchor.blockId);\n this.blocks.splice(index + 1, 0, block);\n this.selection.anchor = { blockId: block.id, offset: 0 };\n this.selection.focus = { blockId: block.id, offset: 0 };\n this.history.push(\"addNewLine\");\n }\n addNewLineAfter() {\n const index = this.blocks.findIndex((item) => item.id === this.selection.anchor.blockId);\n const block = { id: uid(), text: \"\" };\n this.blocks.splice(index + 1, 0, block);\n return block;\n }\n insertText(data) {\n const block = this.currentBlock;\n if (!block)\n return;\n const text = data.replace(/\\r/g, \"\");\n block.text = block.text.slice(0, this.selection.focus.offset) + text + block.text.slice(this.selection.focus.offset);\n this.moveOffset(clamp(this.selection.focus.offset + text.length, 0, block.text.length));\n }\n insertBlock(blockData) {\n if (!this.currentBlock)\n return;\n this.deleteSelected();\n if (this.currentBlock.text !== \"\") {\n this.addNewLine();\n }\n if (this.currentBlock.text !== \"\") {\n const selection = JSON.parse(JSON.stringify(this.selection));\n this.addNewLine();\n Object.assign(this.selection, selection);\n }\n Object.assign(this.currentBlock, blockData);\n if (blockData.editable === false && this.currentBlock === this.blocks[this.blocks.length - 1]) {\n const newLine = this.addNewLineAfter();\n this.selection.focus.blockId = newLine.id;\n this.selection.focus.offset = 0;\n this.selection.anchor.blockId = newLine.id;\n this.selection.anchor.offset = 0;\n }\n this.history.push(\"setText\");\n }\n get startAndEnd() {\n const a = this.blocks.findIndex((block) => block.id === this.selection.anchor.blockId);\n const f = this.blocks.findIndex((block) => block.id === this.selection.focus.blockId);\n if (a < f || a === f && this.selection.anchor.offset < this.selection.focus.offset) {\n return [this.selection.anchor, this.selection.focus, a, f];\n } else {\n return [this.selection.focus, this.selection.anchor, f, a];\n }\n }\n moveStyles(block, offset, delta) {\n if (!block.styles)\n return;\n for (let i = 0; i < block.styles.length; i++) {\n const style = block.styles[i];\n if (style.start >= offset)\n style.start -= delta;\n if (style.end >= offset)\n style.end -= delta;\n if (style.end <= style.start) {\n block.styles.splice(i, 1);\n i--;\n }\n }\n }\n deleteSelected() {\n if (this.isCollapsed)\n return;\n const [start, end, startIndex, endIndex] = this.startAndEnd;\n const startText = this.blocks[startIndex].text.slice(0, start.offset);\n const endText = this.blocks[endIndex].text.slice(end.offset);\n this.removeAllStyles();\n const delta = end.offset - (startIndex === endIndex ? start.offset : 0);\n this.moveStyles(this.blocks[endIndex], end.offset, delta);\n if (this.selection.anchor.blockId !== this.selection.focus.blockId) {\n this.blocks.splice(startIndex + 1, endIndex - startIndex);\n }\n if (start !== this.selection.anchor) {\n this.selection.anchor = { ...start };\n }\n if (start !== this.selection.focus) {\n this.selection.focus = { ...start };\n }\n this.blocks[startIndex].text = startText + endText;\n }\n get currentStyles() {\n return this._currentStyles.value;\n }\n applyStyle(_style, meta) {\n if (this.isCollapsed)\n return;\n const [start, end, startIndex, endIndex] = this.startAndEnd;\n for (let i = startIndex; i <= endIndex; i++) {\n const block = this.blocks[i];\n const _start = i === startIndex ? start.offset : 0;\n const _end = i === endIndex ? end.offset : block.text.length;\n let createNewStyle = true;\n if (block.styles) {\n for (let style of block.styles) {\n if (style.style !== _style)\n continue;\n if (style.start > _end || style.end < _start)\n continue;\n if (meta && !isEqual(meta, style.meta) && (style.start !== _start || style.end !== _end)) {\n if (_start === style.end || _end === style.start)\n continue;\n this.removeStyleAt(block, _start, _end, _style);\n } else {\n style.start = Math.min(style.start, _start);\n style.end = Math.max(style.end, _end);\n createNewStyle = false;\n style.meta = meta;\n }\n }\n }\n if (createNewStyle) {\n const newStyle = {\n start: i === startIndex ? start.offset : 0,\n end: i === endIndex ? end.offset : block.text.length,\n style: _style,\n meta\n };\n this.addStyleToBlock(block, newStyle);\n }\n }\n this.history.push(\"applyStyle\");\n }\n removeStyleAt(block, _start, _end, _style) {\n const removeAll = typeof _style !== \"string\";\n if (!block.styles)\n return;\n for (let i = 0; i < block.styles.length; i++) {\n const style = block.styles[i];\n if (!removeAll && style.style !== _style)\n continue;\n if (style.start > _end || style.end < _start)\n continue;\n if (style.start >= _start && style.end <= _end) {\n block.styles.splice(i, 1);\n i--;\n } else if (style.start < _start && style.end > _end) {\n block.styles.push({ ...style, start: _end });\n style.end = _start;\n } else if (style.start < _start) {\n style.end = _start;\n } else if (style.end > _end) {\n style.start = _end;\n }\n }\n if (block.styles.length === 0) {\n delete block.styles;\n }\n }\n removeStyle(_style) {\n const [start, end, startIndex, endIndex] = this.startAndEnd;\n for (let i = startIndex; i <= endIndex; i++) {\n const block = this.blocks[i];\n const _start = i === startIndex ? start.offset : 0;\n const _end = i === endIndex ? end.offset : block.text.length;\n this.removeStyleAt(block, _start, _end, _style);\n }\n this.history.push(\"applyStyle\");\n }\n removeAllStyles() {\n const [start, end, startIndex, endIndex] = this.startAndEnd;\n for (let i = startIndex; i <= endIndex; i++) {\n const block = this.blocks[i];\n if (i > startIndex && i < endIndex) {\n delete block.styles;\n return;\n }\n const _start = i === startIndex ? start.offset : 0;\n const _end = i === endIndex ? end.offset : block.text.length;\n this.removeStyleAt(block, _start, _end);\n }\n }\n toggleStyle(style) {\n if (this.currentStyles.has(style)) {\n this.removeStyle(style);\n } else {\n this.applyStyle(style);\n }\n }\n selectAll() {\n this.selection.anchor = { blockId: this.blocks[0].id, offset: 0 };\n const lastBlock = this.blocks[this.blocks.length - 1];\n this.selection.focus = { blockId: lastBlock.id, offset: lastBlock.text.length };\n }\n}\nlet uidCounter = 0;\nconst uid = () => (uidCounter++).toString();\nconst _sfc_main$2 = defineComponent({\n props: [\"block\", \"slots\", \"static\", \"decorator\", \"renderer\", \"parser\"],\n emits: [\"postrender\"],\n setup(props, { emit }) {\n const slot = computed(() => {\n if (!props.block.type)\n return props.slots[\"default\"] ?? null;\n return props.slots[props.block.type] ?? null;\n });\n const instance = getCurrentInstance();\n const getRef = () => {\n if (!instance)\n return null;\n const el = instance.vnode.el;\n if (!el)\n return null;\n if (el.nodeType === Node.TEXT_NODE && el.nextSibling !== null) {\n return el.nextSibling;\n }\n return el;\n };\n const cacheNodes = [];\n let cacheEl = null;\n const cleanTree = (count) => {\n if (props.static === true)\n return;\n const el = getRef();\n if (!el)\n return;\n if (el === cacheEl && cacheNodes.length > 0) {\n el.prepend(cacheNodes[0]);\n el.append(cacheNodes[1]);\n }\n nextTick(() => {\n var _a;\n cacheEl = getRef();\n if (el === cacheEl) {\n if (el.childNodes.length > count + 2) {\n for (let i = 0; i < el.childNodes.length; i++) {\n const child = el.childNodes[i];\n if (i === 0 && child.nodeType === Node.TEXT_NODE && child.textContent === \"\")\n continue;\n if (\"__vnode\" in child)\n continue;\n if (child.nodeType === Node.TEXT_NODE && ((_a = child.textContent) == null ? void 0 : _a.endsWith(\"\\n\")))\n continue;\n el.removeChild(child);\n break;\n }\n }\n }\n if (cacheEl) {\n cacheNodes[0] = cacheEl.childNodes[0];\n cacheNodes[1] = cacheEl.childNodes[cacheEl.childNodes.length - 1];\n }\n emit(\"postrender\");\n });\n };\n const content = () => {\n const block = props.block;\n if (block.editable === false)\n return [];\n if (block.text.length === 0) {\n cleanTree(1);\n return [h(\"br\")];\n }\n let text = block.text;\n if (text.endsWith(\"\\n\")) {\n text = text + \"\\n\";\n }\n const markers = [];\n if (block.styles) {\n for (let style of block.styles) {\n if (style.end <= style.start)\n continue;\n markers.push([style.start, style]);\n markers.push([style.end, style]);\n }\n }\n if (props.parser) {\n for (let style of props.parser(text)) {\n if (style.end <= style.start)\n continue;\n markers.push([style.start, style]);\n markers.push([style.end, style]);\n }\n }\n markers.sort((a, b) => a[0] - b[0]);\n let currentIndex = 0;\n const activeStyles = /* @__PURE__ */ new Set();\n const blocks = [];\n for (let marker of markers) {\n if (currentIndex !== marker[0]) {\n const str = text.slice(currentIndex, marker[0]);\n blocks.push(renderBlockPart(str, Array.from(activeStyles.values())));\n currentIndex = marker[0];\n }\n if (marker[0] === marker[1].start) {\n activeStyles.add(marker[1]);\n }\n if (marker[0] === marker[1].end) {\n activeStyles.delete(marker[1]);\n }\n }\n if (currentIndex !== text.length) {\n const str = text.slice(currentIndex, text.length);\n blocks.push(renderBlockPart(str, Array.from(activeStyles.values())));\n }\n cleanTree(blocks.length);\n return blocks;\n };\n const renderBlockPart = (text, styles) => {\n if (!props.decorator)\n return text;\n let elementTag = \"span\";\n const attrs = {};\n for (let style of styles) {\n const partProps = props.decorator(style);\n if (!partProps)\n continue;\n const { class: _class, style: _style, tag, ...otherProps } = partProps;\n Object.assign(attrs, otherProps);\n if (_class) {\n attrs.class = attrs.class ? attrs.class + \" \" + _class : _class;\n }\n if (_style) {\n attrs.style = attrs.style ? attrs.style + \" \" + _style : _style;\n }\n if (tag) {\n elementTag = tag;\n }\n }\n if (Object.keys(attrs).length === 0 && elementTag === \"span\")\n return text;\n return h(elementTag, attrs, text);\n };\n return () => {\n let elementTag = \"div\";\n const blockProps = {\n \"data-vw-block-id\": props.block.id\n };\n const additionalProps = props.renderer && props.renderer(props.block);\n if (additionalProps) {\n if (additionalProps.tag) {\n elementTag = additionalProps.tag;\n delete additionalProps.tag;\n }\n Object.assign(blockProps, additionalProps);\n }\n if (slot.value) {\n const component = slot.value({ content, props: blockProps, block: props.block });\n if (Array.isArray(component) && component.length === 1)\n return component[0];\n return component;\n }\n return h(elementTag, blockProps, content());\n };\n }\n});\nconst createClipboardEvents = (store, props) => {\n const getSelected = () => {\n const [start, end, startIndex, endIndex] = store.startAndEnd;\n if (startIndex === endIndex) {\n const text2 = store.blocks[startIndex].text.slice(start.offset, end.offset);\n return [\n new ClipboardItem({\n \"text/plain\": new Blob([text2], { type: \"text/plain\" })\n })\n ];\n }\n const startText = store.blocks[startIndex].text.slice(start.offset);\n const endText = store.blocks[endIndex].text.slice(0, end.offset);\n const arr = [\n { type: store.blocks[startIndex].type, text: startText },\n ...store.blocks.slice(startIndex + 1, endIndex),\n { type: store.blocks[endIndex].type, text: endText }\n ];\n const html = arr.map((item) => `<div>${item.text}</div>`).join(\"\\n\");\n const text = arr.map((item) => item.text).join(\"\\n\");\n return [\n new ClipboardItem({\n \"text/html\": new Blob([html], { type: \"text/html\" }),\n \"text/plain\": new Blob([text], { type: \"text/plain\" })\n })\n ];\n };\n const onCopy = (e) => {\n if (e.defaultPrevented)\n return;\n e.preventDefault();\n navigator.clipboard.write(getSelected());\n store.history.push(\"setText\");\n };\n const onCut = (e) => {\n if (e.defaultPrevented)\n return;\n e.preventDefault();\n navigator.clipboard.write(getSelected());\n store.deleteSelected();\n store.history.push(\"setText\");\n };\n const insertText = (text, type) => {\n if (props.preventMultiline) {\n const blocks = text.split(\"\\n\");\n store.insertText(blocks[0]);\n for (let i = 1; i < blocks.length; i++) {\n store.addNewLine();\n store.insertText(blocks[i]);\n }\n } else {\n if (type && store.currentBlock) {\n store.currentBlock.type = type;\n }\n store.insertText(text);\n }\n };\n const parseHtml = (node, type) => {\n var _a, _b, _c, _d;\n let isTextNode = false;\n for (let _node of node.childNodes) {\n if (_node.nodeType === Node.TEXT_NODE && ((_a = _node.textContent) == null ? void 0 : _a.trim()) || _node.nodeType == Node.ELEMENT_NODE && _node.tagName === \"SPAN\") {\n isTextNode = true;\n break;\n }\n }\n if (isTextNode) {\n const text = node.textContent;\n if (!text)\n return;\n insertText(text, type ?? ((_b = props.htmlParser) == null ? void 0 : _b.call(props, node)) ?? void 0);\n store.addNewLine();\n return;\n }\n for (let child of node.children) {\n if (child.tagName === \"DIV\") {\n parseHtml(child, type);\n } else if (child.tagName === \"UL\" || child.tagName === \"OL\") {\n for (let li of child.children) {\n parseHtml(li, ((_c = props.htmlParser) == null ? void 0 : _c.call(props, li)) ?? void 0);\n }\n } else {\n insertText(child.textContent ?? \"\", type ?? ((_d = props.htmlParser) == null ? void 0 : _d.call(props, child)) ?? void 0);\n store.addNewLine();\n }\n }\n };\n const parser = new DOMParser();\n const onPaste = (e) => {\n var _a, _b;\n if (e.defaultPrevented)\n return;\n e.preventDefault();\n const html = (_a = e.clipboardData) == null ? void 0 : _a.getData(\"text/html\");\n if (html) {\n store.deleteSelected();\n const dom = parser.parseFromString(html, \"text/html\");\n parseHtml(dom.body);\n } else {\n const text = (_b = e.clipboardData) == null ? void 0 : _b.getData(\"text\");\n if (!text)\n return;\n store.deleteSelected();\n insertText(text);\n }\n store.history.push(\"setText\");\n };\n return {\n onCopy,\n onCut,\n onPaste\n };\n};\nconst _sfc_main$1 = /* @__PURE__ */ defineComponent({\n __name: \"TextEditor\",\n props: {\n decorator: { type: Function },\n renderer: { type: Function },\n single: { type: Boolean },\n modelValue: {},\n parser: { type: Function },\n styles: {},\n autofocus: { type: Boolean },\n autoselect: { type: Boolean },\n preventMultiline: { type: Boolean },\n htmlParser: { type: Function }\n },\n emits: [\"keydown\", \"update:modelValue\", \"update:styles\"],\n setup(__props, { expose: __expose, emit: __emit }) {\n const props = __props;\n const emit = __emit;\n const slots = useSlots();\n const textEditorRef = ref();\n const store = new TextEditorStore();\n let modelValue = \"\";\n watch(() => props.modelValue, (newValue) => {\n if (isProxy(newValue) && toRaw(newValue) === modelValue)\n return;\n if (newValue === void 0 || newValue === null || newValue === modelValue)\n return;\n if (!Array.isArray(newValue)) {\n store.blocks[0].text = newValue;\n return;\n } else {\n for (let i = store.blocks.length; i < newValue.length; i++) {\n store.blocks.push({ id: uid(), text: \"\" });\n }\n store.blocks.length = newValue.length;\n for (let i = 0; i < newValue.length; i++) {\n store.blocks[i] = { ...newValue[i], id: uid() };\n }\n }\n }, { immediate: true });\n let styles;\n watch(() => props.styles, (newStyles) => {\n if (!newStyles || newStyles.length === 0 || newStyles === styles)\n return;\n for (let i = 0; i < store.blocks.length; i++) {\n if (newStyles.length <= i)\n break;\n store.blocks[i].styles = newStyles;\n }\n }, { immediate: true });\n watch(() => store.blocks, () => {\n if (props.single) {\n modelValue = store.blocks[0].text;\n styles = store.blocks[0].styles;\n emit(\"update:styles\", styles);\n emit(\"update:modelValue\", modelValue);\n } else {\n modelValue = store.blocks;\n emit(\"update:modelValue\", store.blocks);\n }\n }, { deep: true });\n const onKeyDown = (e) => {\n emit(\"keydown\", e);\n if (e.defaultPrevented)\n return;\n if (e.code === \"Enter\") {\n e.preventDefault();\n if (!props.preventMultiline && (e.shiftKey || props.single)) {\n store.insertText(\"\\n\");\n } else {\n store.addNewLine();\n }\n }\n if ((e.ctrlKey || e.metaKey) && !e.shiftKey && !e.altKey) {\n if (e.code === \"KeyB\" || e.code === \"KeyI\" || e.code === \"KeyU\") {\n e.preventDefault();\n }\n }\n if ((e.ctrlKey || e.metaKey) && e.code === \"KeyZ\" && !e.shiftKey) {\n e.preventDefault();\n store.history.undo();\n }\n if ((e.ctrlKey || e.metaKey) && (e.code === \"KeyY\" || e.shiftKey && e.code === \"KeyZ\")) {\n e.preventDefault();\n store.history.redo();\n }\n };\n let cachedSelection = {};\n useEventListener(document, \"selectionchange\", () => {\n const sel = window.getSelection();\n const anchor = findParent(sel.anchorNode, (el) => el.hasAttribute(\"data-vw-block-id\") && el.parentElement === textEditorRef.value);\n if (anchor) {\n const isNonEditable = anchor.getAttribute(\"contenteditable\") === \"false\";\n const offset = isNonEditable || anchor === sel.focusNode ? 0 : calcOffsetToNode(anchor, sel.anchorNode) + sel.anchorOffset;\n store.selection.anchor = { blockId: anchor.getAttribute(\"data-vw-block-id\"), offset };\n }\n const focus = findParent(sel.focusNode, (el) => el.hasAttribute(\"data-vw-block-id\") && el.parentElement === textEditorRef.value);\n if (focus) {\n const isNonEditable = focus.getAttribute(\"contenteditable\") === \"false\";\n const offset = isNonEditable || focus === sel.focusNode ? 0 : calcOffsetToNode(focus, sel.focusNode) + sel.focusOffset;\n store.selection.focus = { blockId: focus.getAttribute(\"data-vw-block-id\"), offset };\n }\n if (store.isFocused.value !== (!!focus || !!anchor)) {\n store.isFocused.value = !!focus || !!anchor;\n }\n if (anchor && focus) {\n cachedSelection = JSON.parse(JSON.stringify(store.selection));\n }\n });\n let postRendered = false;\n const onPostRender = () => {\n if (postRendered)\n return;\n cachedSelection = {};\n postRendered = true;\n applySelection();\n nextTick(() => {\n postRendered = false;\n });\n };\n const getNode = (blockId) => {\n for (let item of textEditorRef.value.children) {\n if (item.getAttribute(\"data-vw-block-id\") === blockId) {\n return item;\n }\n }\n return null;\n };\n const applySelection = () => {\n var _a;\n if (!store.isFocused.value) {\n cachedSelection = JSON.parse(JSON.stringify(store.selection));\n return;\n }\n if (isEqual(store.selection, cachedSelection))\n return;\n const anchor = getNode(store.selection.anchor.blockId);\n const focus = getNode(store.selection.focus.blockId);\n const nativeSelection = window.getSelection();\n if (anchor && focus) {\n nativeSelection.setBaseAndExtent(\n ...calcNodeByOffset(anchor, store.selection.anchor.offset),\n ...calcNodeByOffset(focus, store.selection.focus.offset)\n );\n }\n if (store.selection.anchor.blockId === store.selection.focus.blockId && ((_a = store.currentBlock) == null ? void 0 : _a.editable) === false) {\n const innerText = anchor == null ? void 0 : anchor.querySelector(\"[data-vw-block-id]\");\n if (innerText) {\n nativeSelection.setBaseAndExtent(innerText, 0, innerText, 0);\n }\n }\n cachedSelection = JSON.parse(JSON.stringify(store.selection));\n };\n watch(() => store.selection, applySelection, { deep: true, flush: \"post\" });\n onMounted(() => {\n var _a, _b;\n if (props.autofocus) {\n (_a = textEditorRef.value) == null ? void 0 : _a.focus();\n applySelection();\n }\n if (props.autoselect) {\n (_b = textEditorRef.value) == null ? void 0 : _b.focus();\n store.selectAll();\n }\n store.history.push(\"setText\");\n });\n const { onCut, onCopy, onPaste } = createClipboardEvents(store, props);\n const getClientRects = (selection) => {\n const anchor = getNode(selection.anchor.blockId);\n const focus = getNode(selection.focus.blockId);\n if (anchor && focus) {\n const range = new Range();\n range.setStart(...calcNodeByOffset(anchor, selection.anchor.offset));\n range.setEnd(...calcNodeByOffset(focus, selection.focus.offset));\n return range.getClientRects();\n }\n return new DOMRectList();\n };\n __expose({\n currentStyles: store._currentStyles,\n currentBlock: store._currentBlock,\n isCollapsed: store._isCollapsed,\n selection: store.selection,\n isFocused: store.isFocused,\n getCurrentBlocks: store.getCurrentBlocks.bind(store),\n toggleStyle: store.toggleStyle.bind(store),\n applyStyle: store.applyStyle.bind(store),\n removeStyle: store.removeStyle.bind(store),\n insertText: store.insertText.bind(store),\n insertBlock: store.insertBlock.bind(store),\n addNewLine: store.addNewLine.bind(store),\n removeNewLine: store.removeNewLine.bind(store),\n removeCurrentBlock: store.removeCurrentBlock.bind(store),\n selectAll: store.selectAll.bind(store),\n pushHistory: store.history.push.bind(store.history),\n getClientRects\n });\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n ref_key: \"textEditorRef\",\n ref: textEditorRef,\n contenteditable: \"\",\n onBeforeinput: _cache[0] || (_cache[0] = //@ts-ignore\n (...args) => unref(store).onInput && unref(store).onInput(...args)),\n onKeydown: onKeyDown,\n onCopy: _cache[1] || (_cache[1] = //@ts-ignore\n (...args) => unref(onCopy) && unref(onCopy)(...args)),\n onPaste: _cache[2] || (_cache[2] = //@ts-ignore\n (...args) => unref(onPaste) && unref(onPaste)(...args)),\n onCut: _cache[3] || (_cache[3] = //@ts-ignore\n (...args) => unref(onCut) && unref(onCut)(...args))\n }, [\n (openBlock(true), createElementBlock(Fragment, null, renderList(unref(store).blocks, (block) => {\n return openBlock(), createBlock(_sfc_main$2, {\n key: block.id,\n block,\n slots: unref(slots),\n renderer: props.renderer,\n decorator: props.decorator,\n parser: props.parser,\n onPostrender: onPostRender\n }, null, 8, [\"block\", \"slots\", \"renderer\", \"decorator\", \"parser\"]);\n }), 128)),\n unref(store).blocks.length === 1 && unref(store).blocks[0].text === \"\" && !unref(store).blocks[0].type ? renderSlot(_ctx.$slots, \"placeholder\", { key: 0 }) : createCommentVNode(\"\", true)\n ], 544);\n };\n }\n});\nconst wrapLists = (blocks, creator) => {\n if (!blocks.some((i) => !!creator(i))) {\n return blocks;\n }\n const arr = [];\n let liArray = [];\n let currentListTag = null;\n for (let i of blocks) {\n let listTag = creator(i);\n if (listTag) {\n if (currentListTag == null || listTag !== currentListTag) {\n liArray = [];\n arr.push(liArray);\n currentListTag = listTag;\n }\n liArray.push(i);\n } else {\n arr.push(i);\n currentListTag = null;\n }\n }\n return arr;\n};\nconst _sfc_main = defineComponent({\n props: [\"modelValue\", \"decorator\", \"parser\", \"styles\", \"renderer\", \"listParser\"],\n setup(props, { slots }) {\n const blocks = computed(() => {\n if (Array.isArray(props.modelValue)) {\n if (props.listParser && props.modelValue.some((i) => props.listParser(i))) {\n return wrapLists(props.modelValue, props.listParser);\n }\n return props.modelValue;\n }\n return [{ text: props.modelValue, styles: props.styles ?? [] }];\n });\n return () => h(\"div\", blocks.value.map((block) => {\n var _a;\n return Array.isArray(block) ? h(((_a = props.listParser) == null ? void 0 : _a.call(props, block[0])) ?? \"ul\", { key: block[0].id }, block.map((block2) => h(_sfc_main$2, {\n key: block2.id,\n block: block2,\n slots,\n decorator: props.decorator,\n renderer: props.renderer,\n parser: props.parser,\n static: true\n }))) : h(_sfc_main$2, {\n key: block.id,\n block,\n slots,\n decorator: props.decorator,\n renderer: props.renderer,\n parser: props.parser,\n static: true\n });\n }));\n }\n});\nexport {\n _sfc_main$1 as TextEditor,\n _sfc_main as TextEditorView\n};\n","import type { Block, Style } from \"vuewrite\"\r\n\r\nexport const defaultDecorator = (style: Style) => {\r\n if (style.style === 'color') {\r\n return { style: `color: ${style.meta!.color};` }\r\n }\r\n if (style.style === 'bold') {\r\n return { tag: \"b\", class: \"bold\" }\r\n }\r\n if (style.style === \"underline\") {\r\n return { tag: \"u\", class: \"underline\" }\r\n }\r\n if (style.style === \"italic\") {\r\n return { tag: \"i\", class: \"italic\" }\r\n }\r\n if (style.style === \"strikethrough\") {\r\n return { tag: \"s\", class: \"strikethrough\" }\r\n }\r\n if (style.style === \"code\") {\r\n return { class: style.style }\r\n }\r\n if (style.style === 'link') {\r\n return { tag: \"a\", href: style.meta.url, title: style.meta.pageName ?? style.meta.url, target: style.meta.blank? \"_blank\": undefined }\r\n }\r\n}\r\n\r\nexport const defaultRenderer = (block: Block) => {\r\n if (block.type === 'h1' || block.type === 'h2' || block.type === 'h3' || block.type === 'li') {\r\n return { tag: block.type }\r\n }\r\n if (block.type === 'callout') {\r\n return { class: \"callout\" }\r\n }\r\n return { tag: 'p' }\r\n}\r\n\r\n","import type { Style } from \"vuewrite\"\r\n\r\nexport const codeDecorator = (style: Style) => {\r\n if (!style.meta) return {}\r\n return { style: `color: ${style.meta!.color};` }\r\n}\r\n\r\nconst colors: { [ key: string ]: string} = {\r\n \"const\": \"#FF457D\",\r\n \"let\": \"#FF457D\",\r\n \"var\": \"#FF457D\",\r\n \"new\": \"#FF457D\",\r\n \"class\": \"#FF457D\",\r\n \"else\": \"#FF457D\",\r\n \"if\": \"#FF457D\",\r\n \"for\": \"#FF457D\",\r\n \"continue\": \"#FF457D\",\r\n \"break\": \"#FF457D\",\r\n \"return\": \"#FF457D\",\r\n \"function\": \"#FF457D\",\r\n \"import\": \"#FF457D\",\r\n \"from\": \"#FF457D\"\r\n}\r\nconst quoteColor = \"#032F62\"\r\n\r\nconst nextChar = (str: string, pos: number) => {\r\n for (let i = pos; i < str.length; i++) {\r\n if (str[i] !== \" \") return str[i]\r\n }\r\n return null\r\n}\r\n\r\nexport const codeParser = (text: string) => {\r\n const arr: (Style)[] = []\r\n\r\n let j = 0\r\n let quotes = \"\"\r\n let comment = false\r\n for (let i = 0; i <= text.length; i++) {\r\n if (comment && i === text.length) {\r\n arr.push ({ start: j, end: i, style: \"code\", meta: { color: \"#71808F\" } } )\r\n }\r\n if (comment) continue\r\n if (text[i] === \"/\" && text[i+1] === \"/\" && !quotes) {\r\n comment = true\r\n j = i\r\n continue\r\n }\r\n\r\n if (quotes !== \"\" && text[i] === \"\\\\\") {\r\n i++\r\n continue\r\n }\r\n if ((i === text.length && quotes !== \"\") || \"\\\"'\".includes(text[i])) {\r\n if (quotes !== \"\") {\r\n if (text[i] !== quotes && i !== text.length) continue\r\n arr.push({ start: j, end: i+1, style: \"code\", meta: { color: quoteColor } })\r\n j = i+1\r\n quotes = \"\"\r\n } else {\r\n quotes = text[i]\r\n j = i\r\n }\r\n }\r\n if (quotes !== \"\") continue\r\n\r\n if (i === text.length || \" ()!-=.,;'\\\"/*\".includes(text[i])) {\r\n if (i < j) {\r\n continue\r\n }\r\n const word = text.slice(j, i)\r\n if (nextChar(text, i) === \"(\") {\r\n arr.push({ start: j, end: i, style: \"code\", meta: { color: \"#005CC5\" }}) // Function\r\n } else if (word in colors) {\r\n arr.push({ start: j, end: i, style: \"code\", meta: { color: colors[word] } }) // Key words\r\n } else if (/^-?\\d*\\.?\\d*$/.test(word)) {\r\n if (text[i] === \".\") continue\r\n arr.push({ start: j, end: i, style: \"code\", meta: { color: \"#005CC5\" }}) // Numbers\r\n } else if (text[j-1] === \".\") {\r\n arr.push({ start: j, end: i, style: \"code\", meta: { color: \"#6F42C1\" }}) // Methods\r\n }\r\n j = i+1\r\n }\r\n }\r\n return arr\r\n}\r\n","<template>\r\n <div class=\"code-editor\" :contenteditable=\"false\">\r\n <TextEditor v-model=\"model\" tabindex=\"2\" :parser=\"codeParser\" :decorator=\"codeDecorator\" preventMultiline spellcheck=\"false\" @keydown=\"onKeyDown\"/>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ref, watch } from 'vue';\r\nimport { Style, TextEditor } from 'vuewrite';\r\nimport { codeDecorator, codeParser } from '../utils/richTextCodeComponents';\r\n\r\nconst props = defineProps<{ modelValue?: string }>()\r\nconst emit = defineEmits([ \"update:modelValue\", \"newblock\", \"remove\" ])\r\n\r\nconst model = ref([{ text: \"\" }])\r\nif (props.modelValue) {\r\n model.value = props.modelValue.split(\"\\n\").map(text => ({ text }))\r\n}\r\nwatch(model, () => {\r\n emit(\"update:modelValue\", model.value.map(item => item.text).join(\"\\n\"))\r\n}, { deep: true })\r\n\r\nconst onKeyDown = (e: KeyboardEvent) => {\r\n if ((e.ctrlKey || e.metaKey) && e.code === \"Enter\") {\r\n e.preventDefault()\r\n emit(\"newblock\")\r\n }\r\n if (e.code === \"Backspace\" && !e.shiftKey && model.value.length <= 1 && model.value[0]?.text === \"\") {\r\n e.preventDefault()\r\n emit(\"remove\")\r\n }\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n\r\n.code-editor\r\n background-color: var(--background-color)\r\n border-radius: 6px\r\n font-size: 14px\r\n user-select: none\r\n\r\n &>div\r\n padding: 20px\r\n outline: none\r\n user-select: contain\r\n\r\n</style>","<template>\r\n <template v-if=\"props.state.url\">\r\n <div class=\"rich-text-editor-link-popover__current-item\">\r\n <div class=\"title\">{{ props.state.pageName ?? \"Внешняя ссылка\" }}</div>\r\n <div class=\"path\">{{ props.state.url }}</div>\r\n </div>\r\n <VButton style=\"margin-top: 8px; margin-bottom: 4px\" @click=\"deleteLink\">Удалить ссылку</VButton>\r\n </template>\r\n <template v-else>\r\n <VInput v-model=\"searchValue\" autofocus placeholder=\"Введите URL или название страницы\"/>\r\n <div class=\"rich-text-editor-link-popover__items\">\r\n <button v-for=\"item in items\" class=\"rich-text-editor-link-popover__item\" @click=\"onButtonClick(item)\">\r\n <div class=\"title\">{{ item.name }}</div>\r\n <div class=\"path\">{{ item.path }}</div>\r\n </button>\r\n <button v-if=\"searchValue.length > 0\" class=\"rich-text-editor-link-popover__item\" @click=\"createExternalLink\">\r\n <div class=\"title\">Создать внешнюю ссылку</div>\r\n <div class=\"path\">{{ searchValue }}</div>\r\n </button>\r\n <VCheckbox \r\n v-if=\"searchValue.startsWith('http')\" \r\n v-model=\"openInNewPage\" \r\n label=\"Открывать в новой вкладке\" class=\"rich-text-editor-link-popover__checkbox\"\r\n />\r\n </div>\r\n </template>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { useRequest, useSearch } from 'vuesix';\r\nimport VInput from './VInput.vue';\r\nimport { computed, inject, ref } from 'vue';\r\nimport VButton from './VButton.vue';\r\nimport VCheckbox from './VCheckbox.vue';\r\n\r\nconst props = defineProps<{ state: { url: string, isInternal?: boolean, pageName?: string, blank?: boolean } }>()\r\nconst emit = defineEmits([\"apply\"])\r\n\r\nconst pagesRequest = inject(\"pagesRequest\") as (() => Promise<any>)\r\nconst { data } = useRequest(pagesRequest)\r\n\r\nconst searchValue = ref(\"\")\r\n\r\nconst dataSearchFeed = (item: any) => {\r\n return [\r\n ...item.name.toLowerCase().split(\" \"),\r\n ...item.path.split(\"/\")\r\n ].filter(i => !!i)\r\n}\r\nconst searchFeed = (str: string) => {\r\n return str.replace(/[_\\-,()\\/]/g, \" \").split(\" \")\r\n}\r\n\r\nconst searchData = useSearch(() => searchFeed(searchValue.value), data, dataSearchFeed)\r\nconst openInNewPage = ref(false)\r\n\r\nconst items = computed(() => {\r\n return searchData.value\r\n})\r\n\r\nconst onButtonClick = (item: any) => { \r\n props.state.isInternal = true\r\n props.state.url = item.path\r\n props.state.pageName = item.name\r\n delete props.state.blank\r\n emit(\"apply\")\r\n}\r\n\r\nconst createExternalLink = () => {\r\n delete props.state.isInternal\r\n delete props.state.pageName\r\n props.state.url = searchValue.value.trim()\r\n if (openInNewPage.value) {\r\n props.state.blank = true\r\n } else {\r\n delete props.state.blank\r\n }\r\n emit(\"apply\")\r\n}\r\n\r\nconst deleteLink = () => {\r\n props.state.url = \"\"\r\n emit(\"apply\")\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.rich-text-editor-link-popover\r\n padding: 16px\r\n width: 320px\r\n padding-bottom: 8px\r\n max-height: 300px\r\n\r\n .mech-v-input\r\n margin-right: -4px\r\n\r\n.rich-text-editor-link-popover__items\r\n display: flex\r\n flex-direction: column\r\n margin-top: 8px\r\n margin-left: -12px\r\n margin-right: -12px\r\n\r\n.rich-text-editor-link-popover__item\r\n display: flex\r\n flex-direction: column\r\n height: 48px\r\n justify-content: center\r\n background: none\r\n border: none\r\n text-align: left\r\n padding: 0 12px\r\n border-radius: 12px\r\n cursor: pointer\r\n &:hover\r\n background-color: var(--hover-color)\r\n\r\n .path\r\n color: var(--text-secondary-color)\r\n font-size: 12px\r\n\r\n\r\n.rich-text-editor-link-popover__current-item\r\n display: flex\r\n flex-direction: column\r\n gap: 4px\r\n padding-bottom: 4px\r\n .path\r\n color: var(--text-secondary-color)\r\n font-size: 12px\r\n\r\n.rich-text-editor-link-popover__checkbox\r\n margin-left: 12px\r\n margin-top: 4px\r\n margin-bottom: 6px\r\n gap: 8px\r\n\r\n</style>","<template>\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M4 2H8.5C9.14255 2.0002 9.77266 2.17723 10.3213 2.51171C10.8699 2.84618 11.3159 3.32519 11.6105 3.89627C11.905 4.46734 12.0367 5.10846 11.9911 5.7494C11.9455 6.39033 11.7244 7.00636 11.352 7.53C11.9979 7.93183 12.4953 8.53322 12.7688 9.24307C13.0423 9.95292 13.077 10.7326 12.8676 11.4639C12.6583 12.1952 12.2163 12.8384 11.6086 13.2961C11.001 13.7537 10.2607 14.0008 9.5 14H4C3.73478 14 3.48043 13.8946 3.29289 13.7071C3.10536 13.5196 3 13.2652 3 13V3C3 2.73478 3.10536 2.48043 3.29289 2.29289C3.48043 2.10536 3.73478 2 4 2ZM5 9V12H9.5C9.89782 12 10.2794 11.842 10.5607 11.5607C10.842 11.2794 11 10.8978 11 10.5C11 10.1022 10.842 9.72064 10.5607 9.43934C10.2794 9.15804 9.89782 9 9.5 9H5ZM8.5 7C8.89782 7 9.27936 6.84196 9.56066 6.56066C9.84196 6.27936 10 5.89782 10 5.5C10 5.10218 9.84196 4.72064 9.56066 4.43934C9.27936 4.15804 8.89782 4 8.5 4H5V7H8.5Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M6 2.75C6 2.55109 6.07902 2.36032 6.21967 2.21967C6.36032 2.07902 6.55109 2 6.75 2H13.25C13.4489 2 13.6397 2.07902 13.7803 2.21967C13.921 2.36032 14 2.55109 14 2.75C14 2.94891 13.921 3.13968 13.7803 3.28033C13.6397 3.42098 13.4489 3.5 13.25 3.5H10.745L6.887 12.5H9.25C9.44891 12.5 9.63968 12.579 9.78033 12.7197C9.92098 12.8603 10 13.0511 10 13.25C10 13.4489 9.92098 13.6397 9.78033 13.7803C9.63968 13.921 9.44891 14 9.25 14H2.75C2.55109 14 2.36032 13.921 2.21967 13.7803C2.07902 13.6397 2 13.4489 2 13.25C2 13.0511 2.07902 12.8603 2.21967 12.7197C2.36032 12.579 2.55109 12.5 2.75 12.5H5.255L9.113 3.5H6.75C6.55109 3.5 6.36032 3.42098 6.21967 3.28033C6.07902 3.13968 6 2.94891 6 2.75Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M8 11.0625C9.16032 11.0625 10.2731 10.6016 11.0936 9.78109C11.9141 8.96062 12.375 7.84782 12.375 6.6875V2.3125C12.375 2.08044 12.2828 1.85788 12.1187 1.69378C11.9546 1.52969 11.7321 1.4375 11.5 1.4375C11.2679 1.4375 11.0454 1.52969 10.8813 1.69378C10.7172 1.85788 10.625 2.08044 10.625 2.3125V6.6875C10.625 7.38369 10.3484 8.05137 9.85616 8.54366C9.36387 9.03594 8.69619 9.3125 8 9.3125C7.30381 9.3125 6.63613 9.03594 6.14384 8.54366C5.65156 8.05137 5.375 7.38369 5.375 6.6875V2.3125C5.375 2.08044 5.28281 1.85788 5.11872 1.69378C4.95462 1.52969 4.73206 1.4375 4.5 1.4375C4.26794 1.4375 4.04538 1.52969 3.88128 1.69378C3.71719 1.85788 3.625 2.08044 3.625 2.3125V6.6875C3.625 7.84782 4.08594 8.96062 4.90641 9.78109C5.72688 10.6016 6.83968 11.0625 8 11.0625ZM12.375 12.8125H3.625C3.39294 12.8125 3.17038 12.9047 3.00628 13.0688C2.84219 13.2329 2.75 13.4554 2.75 13.6875C2.75 13.9196 2.84219 14.1421 3.00628 14.3062C3.17038 14.4703 3.39294 14.5625 3.625 14.5625H12.375C12.6071 14.5625 12.8296 14.4703 12.9937 14.3062C13.1578 14.1421 13.25 13.9196 13.25 13.6875C13.25 13.4554 13.1578 13.2329 12.9937 13.0688C12.8296 12.9047 12.6071 12.8125 12.375 12.8125Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M11.055 8.5C11.579 9.036 11.87 9.757 11.866 10.507C11.8673 10.9659 11.7676 11.4195 11.574 11.8357C11.3805 12.2518 11.0978 12.6203 10.746 12.915C9.948 13.597 8.748 14 7.096 14C5.39 14 3.992 13.393 3.194 12.623C3.06263 12.4823 2.99028 12.2966 2.99188 12.1041C2.99349 11.9117 3.06893 11.7272 3.20264 11.5887C3.33634 11.4503 3.5181 11.3684 3.7104 11.3601C3.90269 11.3518 4.09084 11.4176 4.236 11.544C4.716 12.007 5.723 12.5 7.096 12.5C8.518 12.5 9.328 12.154 9.772 11.774C10.207 11.402 10.366 10.935 10.366 10.507C10.366 10.035 10.158 9.65 9.719 9.31C9.271 8.964 8.603 8.687 7.768 8.5H1.75C1.55109 8.5 1.36032 8.42098 1.21967 8.28033C1.07902 8.13968 1 7.94891 1 7.75C1 7.55109 1.07902 7.36032 1.21967 7.21967C1.36032 7.07902 1.55109 7 1.75 7H14.25C14.4489 7 14.6397 7.07902 14.7803 7.21967C14.921 7.36032 15 7.55109 15 7.75C15 7.94891 14.921 8.13968 14.7803 8.28033C14.6397 8.42098 14.4489 8.5 14.25 8.5H11.055ZM7.581 3.25C5.545 3.25 4.803 4.332 4.803 5.036C4.803 5.09067 4.805 5.143 4.809 5.193C4.82412 5.39138 4.75981 5.58764 4.63022 5.73861C4.50063 5.88958 4.31638 5.98288 4.118 5.998C3.91962 6.01312 3.72336 5.94881 3.57239 5.81922C3.42142 5.68963 3.32812 5.50538 3.313 5.307C3.3066 5.21681 3.30327 5.12642 3.303 5.036C3.303 3.204 5.053 1.75 7.581 1.75C8.999 1.75 10.302 2.33 11.095 2.843C11.1777 2.89645 11.2491 2.96567 11.3051 3.04671C11.3611 3.12775 11.4006 3.21902 11.4213 3.31532C11.442 3.41161 11.4435 3.51104 11.4258 3.60793C11.4081 3.70482 11.3714 3.79727 11.318 3.88C11.2646 3.96273 11.1953 4.03413 11.1143 4.09011C11.0333 4.14609 10.942 4.18556 10.8457 4.20627C10.7494 4.22698 10.65 4.22852 10.5531 4.2108C10.4562 4.19308 10.3637 4.15645 10.281 4.103C9.641 3.689 8.619 3.25 7.581 3.25Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M14.8574 13.3334V2.66669C14.8574 1.8286 14.1716 1.14288 13.3335 1.14288H2.66688C1.82878 1.14288 1.14307 1.8286 1.14307 2.66669V13.3334C1.14307 14.1715 1.82878 14.8572 2.66688 14.8572H13.3335C14.1716 14.8572 14.8574 14.1715 14.8574 13.3334ZM5.33354 9.14288L7.2383 11.4362L9.90497 8.00003L13.3335 12.5715H2.66688L5.33354 9.14288Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M10.189 2.04806C10.605 2.19806 10.8186 2.65181 10.6674 3.06281L6.83704 13.4788C6.68504 13.8898 6.22664 14.1013 5.81144 13.9521C5.39544 13.8021 5.18184 13.3483 5.33304 12.9373L9.16344 2.52131C9.31544 2.11031 9.77384 1.89881 10.189 2.04806ZM1.93144 8.19206L4.76024 10.9926C5.07224 11.3016 5.07224 11.8026 4.76024 12.1116C4.68811 12.1847 4.60063 12.243 4.50329 12.2829C4.40596 12.3228 4.30087 12.3434 4.19464 12.3434C4.08841 12.3434 3.98332 12.3228 3.88599 12.2829C3.78865 12.243 3.70117 12.1847 3.62904 12.1116L0.234639 8.75231C0.084409 8.59988 0.000976562 8.39997 0.000976562 8.19244C0.000976562 7.9849 0.084409 7.78499 0.234639 7.63256L3.62904 4.27256C3.70117 4.19944 3.78865 4.1411 3.88599 4.1012C3.98332 4.0613 4.08841 4.0407 4.19464 4.0407C4.30087 4.0407 4.40596 4.0613 4.50329 4.1012C4.60063 4.1411 4.68811 4.19944 4.76024 4.27256C4.9107 4.42503 4.99427 4.6251 4.99427 4.83281C4.99427 5.04052 4.9107 5.24059 4.76024 5.39306L1.93144 8.19206ZM14.069 8.19206L11.2402 5.39306C11.09 5.24063 11.0066 5.04072 11.0066 4.83319C11.0066 4.62565 11.09 4.42574 11.2402 4.27331C11.3124 4.20019 11.3998 4.14185 11.4972 4.10195C11.5945 4.06205 11.6996 4.04145 11.8058 4.04145C11.9121 4.04145 12.0172 4.06205 12.1145 4.10195C12.2118 4.14185 12.2993 4.20019 12.3714 4.27331L15.7658 7.63256C16.0778 7.94156 16.0778 8.44256 15.7658 8.75231L12.3714 12.1108C12.2993 12.1839 12.2118 12.2423 12.1145 12.2822C12.0172 12.3221 11.9121 12.3427 11.8058 12.3427C11.6996 12.3427 11.5945 12.3221 11.4972 12.2822C11.3998 12.2423 11.3124 12.1839 11.2402 12.1108C11.0902 11.9584 11.0069 11.7587 11.0069 11.5513C11.0069 11.344 11.0902 11.1442 11.2402 10.9918L14.069 8.19206Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M11 17H7C5.61667 17 4.43767 16.5123 3.463 15.537C2.48833 14.5617 2.00067 13.3827 2 12C1.99933 10.6173 2.487 9.43833 3.463 8.463C4.439 7.48767 5.618 7 7 7H11V9H7C6.16667 9 5.45833 9.29167 4.875 9.875C4.29167 10.4583 4 11.1667 4 12C4 12.8333 4.29167 13.5417 4.875 14.125C5.45833 14.7083 6.16667 15 7 15H11V17ZM8 13V11H16V13H8ZM13 17V15H17C17.8333 15 18.5417 14.7083 19.125 14.125C19.7083 13.5417 20 12.8333 20 12C20 11.1667 19.7083 10.4583 19.125 9.875C18.5417 9.29167 17.8333 9 17 9H13V7H17C18.3833 7 19.5627 7.48767 20.538 8.463C21.5133 9.43833 22.0007 10.6173 22 12C21.9993 13.3827 21.5117 14.562 20.537 15.538C19.5623 16.514 18.3833 17.0013 17 17H13Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\r\n <VDialog class=\"rich-text-editor__dialog\">\r\n <template #header>\r\n {{ props.label ?? \"Редактирование текста\" }}\r\n </template>\r\n <div class=\"rich-text-editor__controls\">\r\n <VSelect v-model=\"blockType\" :items=\"blockTypes\" style=\"width: 200px\"/>\r\n <div class=\"rich-text-editor__actions-group\">\r\n <button v-for=\"item in styles\" :class=\"{ active: item.active }\" @click=\"item.onClick\">\r\n <component :is=\"item.icon\" />\r\n </button>\r\n </div>\r\n <div class=\"rich-text-editor__actions-group\" >\r\n <button :class=\"{ active: textEditorRef?.currentStyles.has('link') }\" @click=\"insertLink\">\r\n <LinkIcon/>\r\n </button>\r\n </div>\r\n <div class=\"rich-text-editor__actions-group\">\r\n <button title=\"Вставить изображение\" @click=\"insertImage\"><ImageSolidIcon/></button>\r\n <button title=\"Вставить элемент кода\" @click=\"insertCodeBlock\"><CodeIcon/></button>\r\n </div>\r\n </div>\r\n <TextEditor \r\n ref=\"textEditorRef\" \r\n v-model=\"model\" \r\n class=\"text-editor\" \r\n :renderer=\"defaultRenderer\" \r\n :decorator=\"defaultDecorator\" \r\n @keydown=\"onKeyDown\"\r\n :html-parser=\"htmlParser\"\r\n >\r\n <template #code=\"{ props, block }\">\r\n <RichTextEditorCode \r\n v-model=\"block.text\" \r\n v-bind=\"props\" \r\n @newblock=\"textEditorRef?.addNewLine()\" \r\n @remove=\"textEditorRef?.removeCurrentBlock()\"\r\n />\r\n </template>\r\n <template #image=\"{ props, block }\">\r\n <VImageUploader \r\n v-model=\"block.image\" \r\n v-bind=\"props\" \r\n :class=\"{ selected: textEditorRef?.selection.focus.blockId === block.id }\" \r\n contenteditable=\"false\"\r\n @keydown=\"onKeyDown\"\r\n />\r\n </template>\r\n <template #placeholder>\r\n <div class=\"rich-text-editor__placeholder\" :contenteditable=\"false\">Введите текст...</div>\r\n </template>\r\n </TextEditor>\r\n <VPopover\r\n class=\"rich-text-editor-link-popover scroll\"\r\n :open=\"linkPopoverState != null\"\r\n placement=\"bottom-start\"\r\n :anchor-position=\"linkPopoverPosition\"\r\n :offset=\"4\"\r\n @update:open=\"onUpdateLinkPopoverOpen\"\r\n >\r\n <RichTextEditorLinkPopover \r\n v-if=\"linkPopoverState !== null\" \r\n :state=\"linkPopoverState\"\r\n @apply=\"onLinkApply\"\r\n />\r\n </VPopover>\r\n <div v-if=\"cachedSelection\" :style=\"cachedSelection\" class=\"rich-text-editor__cached-selection\"></div>\r\n </VDialog>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { TextEditor, TextEditorRef } from 'vuewrite';\r\nimport VDialog from '../VDialog.vue';\r\nimport VSelect from '../VSelect.vue';\r\nimport { computed, CSSProperties, getCurrentInstance, nextTick, ref, shallowRef } from 'vue';\r\nimport { defaultDecorator, defaultRenderer } from '../../utils/richTextComponents';\r\nimport RichTextEditorCode from '../RichTextEditorCode.vue';\r\nimport VImageUploader from '../VImageUploader.vue'\r\nimport RichTextEditorLinkPopover from '../RichTextEditorLinkPopover.vue'\r\n\r\nimport TextBoldIcon from '../icons/TextBoldIcon.vue'\r\nimport TextItalicIcon from '../icons/TextItalicIcon.vue'\r\nimport TextUnderlineIcon from '../icons/TextUnderlineIcon.vue'\r\nimport TextStrikethroughIcon from '../icons/TextStrikethroughIcon.vue'\r\nimport ImageSolidIcon from '../icons/ImageSolidIcon.vue'\r\nimport CodeIcon from '../icons/CodeIcon.vue'\r\nimport LinkIcon from '../icons/LinkIcon.vue'\r\nimport VPopover from '../VPopover.vue';\r\n\r\nconst props = defineProps<{ label?: string }>()\r\nconst model = defineModel<any[]>()\r\nif (!model.value || model.value.length === 0) {\r\n model.value = [{ text: \"\" }]\r\n}\r\n\r\nconst blockTypes = [\r\n { id: \"default\", title: \"Обычный текст\" },\r\n { id: \"h1\", title: \"Заголовок 1\" },\r\n { id: \"h2\", title: \"Заголовок 2\" },\r\n { id: \"h3\", title: \"Заголовок 3\" },\r\n { id: \"li\", title: \"Список\" },\r\n { id: \"callout\", title: \"Callout\" },\r\n { id: \"code\", title: \"Элемент кода\" }\r\n]\r\nconst textEditorRef = shallowRef<TextEditorRef>()\r\n\r\nconst blockType = computed({\r\n get() {\r\n if (!textEditorRef.value) return \"default\"\r\n let type: string | undefined | null = null\r\n for (let block of textEditorRef.value.getCurrentBlocks()) {\r\n if (type === null) {\r\n type = block.type\r\n } else if (type !== block.type) {\r\n type = \"mixed\"\r\n break\r\n }\r\n }\r\n return type ?? \"default\"\r\n },\r\n set(type) {\r\n if (!model.value || !textEditorRef.value) return\r\n for (let block of textEditorRef.value.getCurrentBlocks()) {\r\n if (type === \"default\") {\r\n delete block.type\r\n } else {\r\n block.type = type ?? undefined\r\n }\r\n if (type === \"code\") {\r\n block.editable = false\r\n } else {\r\n delete block.editable\r\n }\r\n }\r\n }\r\n})\r\n\r\nconst styles = computed(() => {\r\n const textEditor = textEditorRef.value\r\n if (!textEditor) return []\r\n const currentStyles = textEditor.currentStyles\r\n return [\r\n { icon: TextBoldIcon, active: currentStyles.has(\"bold\"), onClick: () => textEditor.toggleStyle(\"bold\") },\r\n { icon: TextItalicIcon, active: currentStyles.has(\"italic\"), onClick: () => textEditor.toggleStyle(\"italic\") },\r\n { icon: TextUnderlineIcon, active: currentStyles.has(\"underline\"), onClick: () => textEditor.toggleStyle(\"underline\") },\r\n { icon: TextStrikethroughIcon, active: currentStyles.has(\"strikethrough\"), onClick: () => textEditor.toggleStyle(\"strikethrough\") }\r\n ]\r\n})\r\n\r\nconst canInsertLink = computed(() => {\r\n if (!textEditorRef.value) return false\r\n return !textEditorRef.value.isCollapsed && \r\n textEditorRef.value.selection.anchor.blockId === textEditorRef.value.selection.focus.blockId\r\n})\r\n\r\nconst linkPopoverPosition = shallowRef({ x: 0, y: 0 })\r\nconst cachedSelection = shallowRef<CSSProperties | null>(null)\r\nconst linkPopoverState = shallowRef<null | { url: \"\", isInternal?: boolean, pageName?: string }>(null)\r\n\r\nconst el = getCurrentInstance()\r\n\r\nlet lastSelection: any\r\nconst insertLink = () => {\r\n\r\n const currentLink = textEditorRef.value!.currentStyles.get(\"link\")\r\n if (!currentLink && !canInsertLink.value) return\r\n\r\n const selection = window.getSelection()\r\n let range = selection?.getRangeAt(0)\r\n if (!selection || !range) return\r\n\r\n lastSelection = JSON.parse(JSON.stringify(textEditorRef.value!.selection))\r\n if (currentLink && range && textEditorRef.value?.isCollapsed) {\r\n const newRange = document.createRange();\r\n newRange.selectNodeContents(range.startContainer.parentElement!);\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n \r\n lastSelection.anchor.offset -= range.startOffset\r\n lastSelection.focus.offset += range.startContainer.textContent!.length - range.endOffset\r\n }\r\n\r\n const rect = selection?.getRangeAt(0)?.getBoundingClientRect()\r\n if (!rect) return\r\n\r\n linkPopoverPosition.value = { x: rect.left, y: rect.bottom }\r\n linkPopoverState.value = currentLink?.meta? { ...currentLink.meta }: { url: \"\" }\r\n\r\n const container = el!.vnode.el!\r\n const containerRect = container.getBoundingClientRect()\r\n\r\n\r\n cachedSelection.value = { \r\n top: rect.top - containerRect.top + container.scrollTop +'px', \r\n left: rect.left - containerRect.left + 'px', \r\n width: rect.width+'px', \r\n height: rect.height+'px' \r\n }\r\n}\r\n\r\nconst onUpdateLinkPopoverOpen = (val: boolean) => {\r\n if (val === false) {\r\n linkPopoverState.value = null\r\n cachedSelection.value = null\r\n el!.vnode.el!.querySelector(\".text-editor\").focus()\r\n setTimeout(() =>{ \r\n Object.assign(textEditorRef.value!.selection, lastSelection)\r\n }, 0)\r\n }\r\n}\r\nconst onLinkApply = () => {\r\n const state = linkPopoverState.value\r\n linkPopoverState.value = null\r\n \r\n Object.assign(textEditorRef.value!.selection, lastSelection)\r\n if (!state || state.url === \"\") {\r\n textEditorRef.value?.removeStyle(\"link\")\r\n } else {\r\n textEditorRef.value?.applyStyle(\"link\", state)\r\n }\r\n onUpdateLinkPopoverOpen(false)\r\n}\r\n\r\nconst onKeyDown = (e: KeyboardEvent) => {\r\n if ((e.ctrlKey || e.metaKey) && !e.shiftKey && !e.altKey) {\r\n if (e.code === \"KeyB\") {\r\n textEditorRef.value?.toggleStyle(\"bold\")\r\n }\r\n if (e.code === \"KeyI\") {\r\n textEditorRef.value?.toggleStyle(\"italic\")\r\n }\r\n if (e.code === \"KeyU\") {\r\n textEditorRef.value?.toggleStyle(\"underline\")\r\n }\r\n if (e.code === \"KeyK\") {\r\n e.preventDefault()\r\n if (textEditorRef.value?.currentStyles.has('link')) {\r\n textEditorRef.value.removeStyle(\"link\")\r\n } else {\r\n insertLink()\r\n }\r\n }\r\n }\r\n // if (e.key === \"Enter\" && popoverOpen.value && activeItem.value) {\r\n // e.preventDefault()\r\n // activeItem.value.onClick()\r\n // return\r\n // }\r\n if (e.key === \"Enter\" && !e.shiftKey && textEditorRef.value?.currentBlock?.type === \"li\") {\r\n e.preventDefault()\r\n textEditorRef.value.addNewLine()\r\n textEditorRef.value!.currentBlock.type = \"li\"\r\n textEditorRef.value.pushHistory(\"setText\")\r\n }\r\n if (textEditorRef.value?.currentBlock?.editable === false && textEditorRef.value.currentBlock.type !== 'code' && (e.code === \"Backspace\" || e.code === \"Delete\")) {\r\n textEditorRef.value.removeCurrentBlock()\r\n e.preventDefault()\r\n }\r\n // if ((e.key === \"ArrowUp\" || e.key === \"ArrowDown\") && popoverOpen.value && visibleBlocks.value.length > 0) {\r\n // e.preventDefault()\r\n // const index = visibleBlocks.value.indexOf(activeItem.value!)\r\n // let newIndex = index + (e.key === \"ArrowUp\"? -1: 1)\r\n // if (newIndex < 0) newIndex = visibleBlocks.value.length-1\r\n // if (newIndex >= visibleBlocks.value.length) newIndex = 0\r\n // activeItem.value = visibleBlocks.value[newIndex]\r\n // }\r\n}\r\n\r\nconst htmlParser = (el: Element) => {\r\n if (el.tagName === \"LI\") return 'li'\r\n if (el.tagName === \"H1\") return \"h1\"\r\n if (el.tagName === \"H2\") return \"h2\"\r\n if (el.tagName === \"H3\") return \"h3\"\r\n}\r\n\r\nconst insertCodeBlock = () => {\r\n textEditorRef.value?.insertBlock({ type: \"code\", editable: false, text: \"\" })\r\n}\r\n\r\nconst insertImage = () => {\r\n textEditorRef.value?.insertBlock({ type: \"image\", editable: false, text: \"\" })\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.rich-text-editor__dialog\r\n width: 800px\r\n .v-dialog__content\r\n padding: 0\r\n\r\n .text-editor\r\n padding: 20px 24px\r\n outline: none\r\n white-space: pre-wrap\r\n word-break: break-all\r\n min-height: 400px\r\n padding-top: 16px\r\n position: relative\r\n\r\n .bold\r\n font-weight: 700\r\n .italic\r\n font-style: italic\r\n .underline\r\n text-decoration: underline\r\n .strikethrough\r\n text-decoration: line-through\r\n \r\n .callout\r\n background-color: rgba(#0073E9, 0.1)\r\n border: 1px solid var(--primary-color)\r\n border-radius: 8px\r\n padding: 16px\r\n margin-bottom: 8px\r\n margin-top: 8px\r\n\r\n .v-image-uploader\r\n width: 320px\r\n margin-top: 12px\r\n margin-bottom: 12px\r\n &.selected .v-form-control__outline\r\n border-color: var(--primary-color)\r\n box-shadow: 0 0 0 2px var(--shadow-color)\r\n\r\n.rich-text-editor__placeholder\r\n position: absolute\r\n top: 16px\r\n left: 24px\r\n color: var(--text-secondary-color)\r\n margin-top: 1em\r\n \r\n.rich-text-editor__controls\r\n height: 40px\r\n padding: 0 24px\r\n display: flex\r\n align-items: center\r\n padding-top: 12px\r\n gap: 12px\r\n\r\n.rich-text-editor__cached-selection\r\n position: absolute\r\n background-color: rgba(0, 0, 0, 0.25)\r\n\r\n.rich-text-editor__actions-group\r\n height: 40px\r\n // background-color: var(--blocks-color)\r\n border: 1px solid var(--input-border-color)\r\n border-radius: 8px\r\n padding: 3px\r\n box-sizing: border-box\r\n display: flex\r\n button\r\n background: none\r\n border: none\r\n height: 32px\r\n width: 32px\r\n cursor: pointer\r\n border-radius: 6px\r\n color: var(--text-secondary-color)\r\n display: flex\r\n align-items: center\r\n justify-content: center\r\n\r\n &:hover\r\n background-color: var(--hover-color)\r\n\r\n &.active\r\n background-color: var(--background-active-color)\r\n color: var(--text-color)\r\n\r\n &.disabled\r\n pointer-events: none\r\n opacity: 0.6\r\n\r\n</style>","<template>\r\n <VFormControl :label=\"props.label\" class=\"rich-text-editor\">\r\n <div class=\"v-form-control__outline\">\r\n <TextEditor v-model=\"model\" class=\"rich-text-editor__editor\"/>\r\n </div>\r\n <VButton @click=\"openTextEditor\">Редактировать</VButton>\r\n </VFormControl>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { TextEditor } from 'vuewrite';\r\nimport VFormControl from './VFormControl.vue';\r\nimport VButton from './VButton.vue';\r\nimport { useDialog } from './VDialogProvider.vue';\r\nimport RichTextEditorDialog from './dialogs/RichTextEditorDialog.vue';\r\n\r\nconst props = defineProps<{ label?: string }>()\r\nconst model = defineModel<any[]>()\r\n\r\nconst dialog = useDialog()\r\nconst openTextEditor = () => {\r\n dialog.open(RichTextEditorDialog, { \r\n label: props.label,\r\n modelValue: model.value, \r\n [\"onUpdate:modelValue\"]: (val: any) => model.value = val \r\n } as any)\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.rich-text-editor\r\n\r\n .v-form-control__outline\r\n height: 60px\r\n overflow-x: hidden\r\n overflow-y: auto\r\n display: block\r\n\r\n .rich-text-editor__editor\r\n width: 100%\r\n outline: none\r\n padding: 8px 12px\r\n overflow: hidden\r\n box-sizing: border-box\r\n word-break: break-all\r\n min-height: 100%\r\n white-space: pre-wrap\r\n\r\n .mech-v-button\r\n margin-top: 8px\r\n height: 32px\r\n font-size: 12px\r\n width: fit-content\r\n\r\n\r\n</style>","<template>\n<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M6.25 1.25C5.58696 1.25 4.95107 1.51339 4.48223 1.98223C4.01339 2.45107 3.75 3.08696 3.75 3.75V16.25C3.75 16.913 4.01339 17.5489 4.48223 18.0178C4.95107 18.4866 5.58696 18.75 6.25 18.75H13.75C14.413 18.75 15.0489 18.4866 15.5178 18.0178C15.9866 17.5489 16.25 16.913 16.25 16.25V6.7675C16.2496 6.27039 16.0517 5.79379 15.7 5.4425L12.0588 1.79875C11.8846 1.62467 11.6778 1.4866 11.4502 1.39245C11.2227 1.29829 10.9788 1.24989 10.7325 1.25H6.25ZM5 3.75C5 3.41848 5.1317 3.10054 5.36612 2.86612C5.60054 2.6317 5.91848 2.5 6.25 2.5H10V5.625C10 6.12228 10.1975 6.59919 10.5492 6.95083C10.9008 7.30246 11.3777 7.5 11.875 7.5H15V16.25C15 16.5815 14.8683 16.8995 14.6339 17.1339C14.3995 17.3683 14.0815 17.5 13.75 17.5H6.25C5.91848 17.5 5.60054 17.3683 5.36612 17.1339C5.1317 16.8995 5 16.5815 5 16.25V3.75ZM14.7413 6.25H11.875C11.7092 6.25 11.5503 6.18415 11.4331 6.06694C11.3158 5.94973 11.25 5.79076 11.25 5.625V2.75875L14.7413 6.25Z\" fill=\"currentColor\"/>\n</svg>\n</template>\n","<template>\r\n <VFormControl \r\n class=\"v-image-uploader v-file-uploader\" \r\n :class=\"{ drag }\"\r\n :error=\"error\" \r\n :label=\"label\" \r\n :required=\"required\" \r\n :disabled=\"disabled\" \r\n outline\r\n @drop=\"onDrop\"\r\n @dragover=\"onDragOver\" \r\n @dragleave=\"onDragLeave\"\r\n >\r\n <template v-if=\"drag\">\r\n <div class=\"v-image-uploader__drag-label\">Отпустите файл здесь</div>\r\n </template>\r\n <template v-else-if=\"!props.modelValue || props.modelValue.src === ''\">\r\n <EmptyFileIcon/>\r\n <div>\r\n <a @click=\"fileDialog.open()\">Загрузите файл</a>\r\n <br/>или перетащите сюда\r\n </div>\r\n </template>\r\n <template v-else>\r\n <div class=\"v-file-uploader__file-name\" >\r\n <FileIcon/>\r\n {{ props.modelValue.name }}\r\n <!-- <img :src=\"props.modelValue.previewSrc ?? props.modelValue.src\" alt=\"Preview Image\" /> -->\r\n </div>\r\n <VIconButton class=\"v-file-uploader__delete-button\" @click=\"removeImage\"><CloseMinIcon/></VIconButton>\r\n </template>\r\n </VFormControl>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { inject, ref } from 'vue';\r\nimport VFormControl, { VFormControlProps } from './VFormControl.vue';\r\nimport EmptyFileIcon from './icons/EmptyFileIcon.vue'\r\nimport CloseMinIcon from './icons/CloseMinIcon.vue'\r\nimport FileIcon from './icons/FileIcon.vue'\r\nimport { useFileDialog } from '@vueuse/core'\r\nimport { getDefaultValue } from '../utils/passDefaultValue';\r\nimport VIconButton from './VIconButton.vue';\r\nimport { useDialog } from './VDialogProvider.vue';\r\nimport ProjectImagesDialog from './dialogs/ProjectImagesDialog.vue'\r\n\r\nconst props = defineProps<{ \r\n accept?: string,\r\n schema?: any,\r\n modelValue?: FileInfo | null,\r\n} & VFormControlProps>()\r\nconst emit = defineEmits([ \"update:modelValue\" ])\r\n\r\nconst fileUploader = inject(\"fileUploader\") as (file: File) => Promise<any>\r\nconst fileRequest = inject(\"fileRequest\", null) as (() => Promise<any>) | null\r\n\r\nconst addFile = async (file: File) => {\r\n emit(\"update:modelValue\", { src: URL.createObjectURL(file), file, name: file.name })\r\n if (fileUploader) {\r\n const resp = await fileUploader(file)\r\n emit(\"update:modelValue\", { src: resp.src, previewSrc: resp.previewSrc, name: resp.name })\r\n }\r\n // emit(\"loadFile\", file)\r\n}\r\n\r\nconst drag = ref(false)\r\nconst onDragOver = (e: DragEvent) => {\r\n if (e.dataTransfer?.types?.[0]?.startsWith('text')) return\r\n e.preventDefault()\r\n drag.value = true\r\n}\r\n\r\nconst onDragLeave = (e: DragEvent) => {\r\n if (e.relatedTarget === e.currentTarget || (e.relatedTarget as HTMLElement)?.parentElement === e.currentTarget) return\r\n drag.value = false\r\n}\r\n\r\nconst onDrop = (e: DragEvent) => {\r\n e.preventDefault()\r\n drag.value = false\r\n\r\n for (const item of (e as any).dataTransfer.items) {\r\n if (item.kind !== 'file') continue\r\n const file = item.getAsFile() as File\r\n if (!file) continue\r\n\r\n addFile(file)\r\n }\r\n}\r\n\r\nconst fileDialog = useFileDialog({\r\n accept: props.accept,\r\n multiple: false\r\n})\r\n\r\nfileDialog.onChange((files) => {\r\n if (!files || files.length === 0) return\r\n for (const file of files) {\r\n addFile(file)\r\n }\r\n fileDialog.reset()\r\n})\r\n\r\nconst removeImage = () => {\r\n emit(\"update:modelValue\", getDefaultValue(props.schema ?? { type: \"object\", format: \"file\" }))\r\n}\r\n\r\nconst dialog = useDialog()\r\nconst contextMenuItems: any[] = []\r\n\r\nconst onOpenImage = (image: any) => {\r\n emit(\"update:modelValue\", image)\r\n}\r\n\r\nif (fileRequest) {\r\n contextMenuItems.push({ title: \"Выбрать из файлов проекта\", onClick: () => dialog.open(ProjectImagesDialog as any, { fileRequest, onOpenImage }) })\r\n}\r\n\r\n</script>\r\n\r\n<script lang=\"ts\">\r\nexport type FileInfo = {\r\n id?: string,\r\n file?: File,\r\n src: string,\r\n name: string,\r\n previewSrc?: string,\r\n progress?: number | null\r\n}\r\n\r\n</script>\r\n\r\n\r\n<style lang=\"sass\">\r\n\r\n.v-file-uploader__file-name\r\n word-break: break-all\r\n color: var(--text-color)\r\n display: flex\r\n align-items: center\r\n gap: 4px\r\n\r\n svg\r\n color: var(--icon-color)\r\n margin-left: -2px\r\n flex-shrink: 0\r\n\r\n.v-file-uploader__delete-button\r\n top: -10px\r\n right: -10px\r\n flex-shrink: 0\r\n margin-left: -8px\r\n svg\r\n width: 10px\r\n height: 10px\r\n\r\n</style>","<template>\r\n <VFormControl\r\n outline\r\n class=\"v-multiselect\"\r\n :label=\"props.label\"\r\n :error=\"props.error\"\r\n :disabled=\"props.disabled\"\r\n :required=\"props.required\"\r\n >\r\n <VPopover v-model:open=\"opened\" placement=\"bottom\" fit-anchor :offset=\"8\">\r\n \r\n <!-- ACTIVATOR -->\r\n <template #activator=\"{ props: activatorProps }\">\r\n <button\r\n class=\"v-multiselect__activator\"\r\n :class=\"{ opened }\"\r\n v-bind=\"activatorProps\"\r\n >\r\n <div v-if=\"selectedItems.length\">\r\n {{ displayValue }}\r\n </div>\r\n <div v-else class=\"v-multiselect__placeholder\">\r\n {{ props.placeholder ?? 'Выберите значения' }}\r\n </div>\r\n <ArrowDownIcon/>\r\n </button>\r\n\r\n <div class=\"v-multiselect__actions\">\r\n <slot></slot>\r\n\r\n <VIconButton\r\n v-if=\"nullable && model.length\"\r\n title=\"Очистить\"\r\n class=\"v-multiselect__delete-button\"\r\n @click=\"resetValue\"\r\n >\r\n <CloseMinIcon/>\r\n </VIconButton>\r\n </div>\r\n </template>\r\n\r\n <!-- MENU -->\r\n <div class=\"v-multiselect__menu\">\r\n <template v-for=\"item in items\">\r\n \r\n <div v-if=\"item === ''\" class=\"v-multiselect__divider\"></div>\r\n\r\n <div v-else-if=\"typeof item === 'string'\" class=\"group-title\">\r\n {{ item }}\r\n </div>\r\n\r\n <label v-else class=\"v-multiselect__item\">\r\n <VCheckbox\r\n :model-value=\"isSelected(item)\"\r\n @update:model-value=\"() => toggleItem(item)\"\r\n />\r\n \r\n <span>\r\n <slot name=\"item\" :item=\"item\">\r\n {{ item.title }}\r\n </slot>\r\n </span>\r\n </label>\r\n\r\n </template>\r\n </div>\r\n\r\n </VPopover>\r\n </VFormControl>\r\n</template>\r\n\r\n<script lang=\"ts\" setup generic=\"T extends { id: number | string, title?: string }\">\r\nimport { computed, ref } from 'vue'\r\n\r\nimport VFormControl, { VFormControlProps } from './VFormControl.vue'\r\nimport VPopover from './VPopover.vue'\r\nimport VCheckbox from './VCheckbox.vue'\r\nimport VIconButton from './VIconButton.vue'\r\n\r\nimport ArrowDownIcon from './icons/ArrowDownIcon.vue'\r\nimport CloseMinIcon from './icons/CloseMinIcon.vue'\r\n\r\nconst props = defineProps<{\r\n items: (T | string)[]\r\n placeholder?: string\r\n nullable?: boolean\r\n visualValue?: string\r\n} & VFormControlProps>()\r\n\r\nconst model = defineModel<T['id'][]>({ default: [] })\r\nif (!Array.isArray(model.value)) {\r\n model.value = []\r\n}\r\n\r\nconst opened = ref(false)\r\n\r\n/* -----------------------------\r\n COMPUTED\r\n----------------------------- */\r\n\r\nconst items = computed(() => props.items)\r\n\r\nconst selectedItems = computed<T[]>(() => {\r\n return props.items.filter(\r\n (item): item is T =>\r\n typeof item !== 'string' && model.value.includes(item.id)\r\n )\r\n})\r\n\r\nconst displayValue = computed(() => {\r\n if (props.visualValue) return props.visualValue\r\n return selectedItems.value.map(i => i.title).join(', ')\r\n})\r\n\r\n/* -----------------------------\r\n METHODS\r\n----------------------------- */\r\n\r\nconst isSelected = (item: T) => {\r\n return model.value.includes(item.id)\r\n}\r\n\r\nconst toggleItem = (item: T) => {\r\n if (isSelected(item)) {\r\n model.value = model.value.filter(id => id !== item.id)\r\n } else {\r\n model.value = [...model.value, item.id]\r\n }\r\n}\r\n\r\nconst resetValue = () => {\r\n model.value = []\r\n}\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-multiselect\r\n .v-form-control__outline\r\n height: 40px\r\n\r\n.v-multiselect__activator\r\n background: none\r\n border: none\r\n display: flex\r\n align-items: center\r\n padding: 0 12px\r\n width: 100%\r\n color: var(--text-color)\r\n text-align: left\r\n cursor: pointer\r\n outline: none\r\n\r\n &>div\r\n flex: 1 1 auto\r\n\r\n svg\r\n margin-right: -2px\r\n color: var(--icon-color)\r\n width: 12px\r\n pointer-events: none\r\n\r\n &.opened\r\n svg\r\n transform: rotate(180deg)\r\n\r\n.v-multiselect__placeholder\r\n color: var(--text-secondary-color)\r\n\r\n.v-multiselect__actions\r\n position: absolute\r\n right: 28px\r\n bottom: 9px\r\n display: flex\r\n align-items: center\r\n gap: 2px\r\n height: 20px\r\n\r\n.v-multiselect__delete-button\r\n svg\r\n width: 10px\r\n height: 10px\r\n\r\n.v-multiselect__menu\r\n display: flex\r\n flex-direction: column\r\n padding: 6px\r\n\r\n.v-multiselect__item\r\n display: flex\r\n align-items: center\r\n gap: 8px\r\n padding: 6px 8px\r\n cursor: pointer\r\n border-radius: 6px\r\n\r\n &:hover\r\n background-color: var(--hover-color)\r\n\r\n.group-title\r\n padding: 4px 8px 0\r\n font-size: 13px\r\n color: var(--text-secondary-color)\r\n\r\n.v-multiselect__divider\r\n border-bottom: 1px solid var(--border-color)\r\n margin: 4px 8px\r\n</style>","<template>\r\n <VImageUploader \r\n v-if=\"props.schema.type === 'object' && props.schema.format === 'image'\" \r\n v-model=\"vModel\" \r\n :label=\"props.schema.name ?? props.name\"\r\n :schema=\"props.schema\"\r\n />\r\n <VFileUploader\r\n v-else-if=\"props.schema.type === 'object' && props.schema.format === 'file'\" \r\n v-model=\"vModel\" \r\n :accept=\"props.schema.accept\"\r\n :label=\"props.schema.name ?? props.name\"\r\n :schema=\"props.schema\"\r\n />\r\n <VMultiSelect\r\n v-else-if=\"props.schema.type === 'array' && props.schema.format === 'multiselect'\" \r\n v-model=\"vModel\" \r\n :items=\"getItemsMultiselect(props.schema)\"\r\n :label=\"props.schema.name ?? props.name\"\r\n />\r\n <VLinkEditor \r\n v-else-if=\"props.schema.type === 'object' && props.schema.format === 'smartLink'\" \r\n v-model=\"vModel\" \r\n :label=\"props.schema.name ?? props.name\"\r\n :schema=\"props.schema\"\r\n :nullable=\"props.schema.nullable || props.nullable\"\r\n />\r\n <VRichTextEditor\r\n v-else-if=\"props.schema.type === 'array' && props.schema.format === 'richText'\"\r\n v-model=\"vModel\" \r\n :label=\"props.schema.name ?? props.name\"\r\n :schema=\"props.schema\"\r\n />\r\n <div v-else-if=\"props.schema.type === 'object'\" class=\"json-editor__object\">\r\n <template v-if=\"props.flat\">\r\n <JsonEditor \r\n v-for=\"(item, key) in (props.schema.properties as object)\" \r\n v-model=\"vModel[key]\"\r\n :key=\"key\" \r\n :schema=\"item\"\r\n :expanded=\"childExpanded\"\r\n :name=\"spaceCamelCase(key)\"\r\n :nullable=\"!props.schema.required?.includes(key)\"\r\n @edit=\"emit('edit', join(key, $event))\"\r\n />\r\n </template>\r\n <VCollapse v-else :label=\"props.schema.name ?? props.name\" :open=\"props.expanded\">\r\n <JsonEditor \r\n v-for=\"(item, key) in (props.schema.properties as object)\" \r\n v-model=\"vModel[key]\"\r\n :key=\"key\" \r\n :schema=\"item\"\r\n :expanded=\"childExpanded\"\r\n :name=\"spaceCamelCase(key)\"\r\n :nullable=\"!props.schema.required?.includes(key)\"\r\n @edit=\"emit('edit', join(key, $event))\"\r\n />\r\n </VCollapse>\r\n </div>\r\n <JsonEditorArray \r\n v-else-if=\"props.schema.type === 'array'\" \r\n v-model=\"vModel\" \r\n :schema=\"props.schema\"\r\n :label=\"props.schema.name ?? props.name\"\r\n :expanded=\"props.expanded\"\r\n @edit=\"emit('edit', $event)\"\r\n />\r\n <VSelect \r\n v-else-if=\"props.schema.type === 'string' && props.schema.enum\" \r\n :nullable=\"props.schema.nullable || props.nullable\"\r\n :items=\"getItems(props.schema)\"\r\n v-model=\"vModel\"\r\n :label=\"props.schema.name ?? props.name\"\r\n />\r\n <VCheckbox\r\n v-else-if=\"props.schema.type === 'boolean'\"\r\n v-model=\"vModel\"\r\n :label=\"props.schema.name ?? props.name\"\r\n />\r\n <VInput \r\n v-else\r\n v-model=\"vModel\"\r\n :label=\"props.schema.name ?? props.name\"\r\n :multiline=\"props.schema.multiline\"\r\n :placeholder=\"props.schema.placeholder\"\r\n >\r\n <!-- <template #actions><JsonEditorActions v-model=\"vModel\" :defaultValue=\"getDefaultValue(props.schema)\"/></template> -->\r\n </VInput>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport VInput from './VInput.vue';\r\nimport VCollapse from './VCollapse.vue'\r\nimport VSelect from './VSelect.vue'\r\nimport JsonEditorArray from './JsonEditorArray.vue'\r\nimport VImageUploader from './VImageUploader.vue'\r\nimport VCheckbox from './VCheckbox.vue'\r\nimport { spaceCamelCase } from '../utils/lang'\r\nimport { getDefaultValue } from '../utils/passDefaultValue';\r\nimport VLinkEditor from './VLinkEditor.vue';\r\nimport VRichTextEditor from './VRichTextEditor.vue';\r\nimport { watch } from 'vue';\r\nimport VFileUploader from './VFileUploader.vue';\r\nimport VMultiSelect from './VMultiSelect.vue';\r\n\r\nconst props = defineProps<{ schema: any, name?: string, flat?: boolean, expanded?: boolean, nullable?: boolean }>()\r\nconst emit = defineEmits([ \"edit\" ])\r\n\r\nconst childExpanded = props.schema.type === 'object' && Object.keys(props.schema.properties).length < 2\r\n\r\nconst vModel = defineModel<any>()\r\n\r\nif (vModel.value !== null && vModel.value !== undefined) {\r\n if (props.schema.type === 'object' && typeof vModel.value !== \"object\") {\r\n vModel.value = getDefaultValue(props.schema)\r\n }\r\n}\r\n\r\nwatch(vModel, () => emit(\"edit\"))\r\n\r\n// const onPropertyUpdate = (key: string, value: any) => {\r\n// if (!props.modelValue) {\r\n// emit(\"update:modelValue\", { [key]: value })\r\n// } else {\r\n// props.modelValue[key] = value\r\n// }\r\n// }\r\n\r\n</script>\r\n\r\n<script lang=\"ts\">\r\n\r\nconst getItems = (schema: { enum: string[], enumAlias?: string[] }) => {\r\n return schema.enum.map((item, index) => ({\r\n id: item,\r\n title: schema.enumAlias?.[index] ?? spaceCamelCase(item)\r\n }))\r\n}\r\n\r\nconst getItemsMultiselect = (schema: { enum: string[], enumAlias?: string[], items: any }) => {\r\n const enumValues = schema.enum ?? schema.items.enum ?? []\r\n const enumAlias = schema.enumAlias ?? schema.items.enumAlias ?? []\r\n return enumValues.map((item, index) => ({\r\n id: item,\r\n title: enumAlias?.[index] ?? spaceCamelCase(item)\r\n }))\r\n}\r\n\r\nexport const join = (baseKey: string | number, key: string | undefined) => {\r\n if (key) {\r\n return `${baseKey}.${key}`\r\n } else {\r\n return baseKey.toString()\r\n }\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.json-editor__object\r\n display: flex\r\n flex-direction: column\r\n gap: 12px\r\n\r\n .v-collapse.open>.v-collapse__content\r\n border-bottom: 1px solid var(--border-color)\r\n \r\n &>.v-collapse>.v-collapse__content>.v-collapse__content-inner\r\n display: flex\r\n flex-direction: column\r\n gap: 12px\r\n\r\n .v-collapse__content-inner\r\n padding-bottom: 12px\r\n padding-left: 2px\r\n padding-right: 2px\r\n\r\n .v-collapse__activator\r\n font-size: 13px\r\n font-weight: 500\r\n\r\n</style>","<template>\r\n <div class=\"editor-blocks-sidebar\" @blockdrop.stop>\r\n <slot></slot>\r\n <VTabs v-model=\"currentTab\" :items=\"tabs\"/>\r\n <VTabsPages :page=\"currentTab\">\r\n <template #blocks>\r\n <BlocksList :blocks=\"blocksList\"/>\r\n </template>\r\n <template #blockEdit>\r\n <JsonEditor \r\n v-if=\"currentBlock && currentContentBlock\" \r\n :key=\"currentContentBlock.id\" \r\n :schema=\"currentBlock.props\" \r\n v-model=\"currentContentBlock.data\" \r\n flat\r\n />\r\n <template v-else-if=\"currentDataEntry\">\r\n <VSelect \r\n v-if=\"props.dataEntryScopes\" \r\n v-model=\"props.dataEntryScopes[currentDataEntry.id]\" \r\n style=\"margin-bottom: 8px\" \r\n label=\"Применить настройки\" \r\n :items=\"settingSelectItems\"\r\n />\r\n <JsonEditor \r\n :key=\"currentDataEntry.id\" \r\n :schema=\"currentDataEntry.props\" \r\n v-model=\"state.data[currentDataEntry.id]\" \r\n flat\r\n />\r\n </template>\r\n <div v-else>Схема для блока не найдена</div>\r\n </template>\r\n </VTabsPages>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ref, computed, watch } from 'vue'\r\nimport BlocksList from './BlocksList.vue'\r\nimport { Block, ContentBlock, DataEntry, DataEntryScope, State } from '../types';\r\nimport { findBlock } from '../utils/blocks';\r\nimport VTabs from './VTabs.vue';\r\nimport VTabsPages from './VTabsPages.vue';\r\nimport JsonEditor from './JsonEditor.vue';\r\nimport VSelect from './VSelect.vue';\r\n\r\nconst props = defineProps<{ \r\n blocksList: Block[], \r\n blocksMap: Map<string, Block>,\r\n dataEntries: DataEntry[],\r\n dataEntryScopes?: Record<string, DataEntryScope>,\r\n activeBlockId?: string | null,\r\n state: State\r\n}>()\r\n\r\nconst currentTab = ref(\"blocks\")\r\n\r\nconst currentContentBlock = computed(() => {\r\n if (!props.activeBlockId) return null\r\n return findBlock(props.state.content, block => block.id === props.activeBlockId)\r\n})\r\nconst currentBlock = computed(() => {\r\n if (!currentContentBlock.value) return null\r\n return props.blocksMap.get(currentContentBlock.value.blockId)\r\n})\r\nconst currentDataEntry = computed(() => {\r\n if (props.activeBlockId?.startsWith(\"data:\")) {\r\n const id = props.activeBlockId.slice(5)\r\n return props.dataEntries.find(item => item.id === id)\r\n }\r\n return null\r\n})\r\nconst tabs = computed(() => {\r\n const arr = [\r\n { id: \"blocks\", title: \"Блоки\" }\r\n ]\r\n if (currentBlock.value) {\r\n arr.push({\r\n id: \"blockEdit\",\r\n title: currentBlock.value?.name ?? \"Unknown Block\"\r\n })\r\n }\r\n if (currentDataEntry.value) {\r\n arr.push({\r\n id: \"blockEdit\",\r\n title: currentDataEntry.value?.title ?? \"Settings\"\r\n })\r\n }\r\n return arr\r\n})\r\n\r\n\r\nwatch(() => props.activeBlockId, (blockId, oldBlockId) => {\r\n if (blockId && blockId !== oldBlockId) {\r\n currentTab.value = \"blockEdit\"\r\n }\r\n if (!blockId && (currentTab.value === \"blockEdit\" || currentTab.value === \"settingEdit\")) {\r\n currentTab.value = \"blocks\"\r\n }\r\n\r\n if (currentTab.value === \"blockEdit\" && currentDataEntry.value && props.dataEntryScopes && !props.dataEntryScopes[currentDataEntry.value.id]) {\r\n props.dataEntryScopes[currentDataEntry.value.id] = 'site'\r\n }\r\n}, { immediate: true })\r\n\r\nconst settingSelectItems = [\r\n { id: \"page\", title: \"Только для этой страницы\" },\r\n { id: \"site\", title: \"Для всего сайта\" },\r\n]\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n\r\n.editor-blocks-sidebar\r\n width: 340px\r\n border-left: 1px solid var(--border-color)\r\n background-color: white\r\n display: flex\r\n flex-direction: column\r\n\r\n .v-tabs\r\n padding: 0 16px\r\n margin-top: 12px\r\n\r\n .v-tabs-pages\r\n flex: 1 1 auto\r\n\r\n .v-tabs-pages__page\r\n padding: 16px 16px\r\n\r\n.editor-sidebar__title\r\n margin-bottom: 8px\r\n color: var(--text-secondary-color)\r\n\r\n</style>","<template>\r\n <div ref=\"containerRef\" class=\"page-editor-hierarchy\" @click.self=\"emit('update:activeBlockId', null)\">\r\n <div \r\n v-for=\"item in flatBlocks\" \r\n class=\"page-editor-hierarchy__item\" \r\n :class=\"{ active: props.activeBlockId === item.content.id, hover: props.hoverBlockId === item.content.id }\"\r\n :style=\"{ paddingLeft: `${16 + item.intent*16}px` }\"\r\n @blockdrop=\"onItemBlockDrop($event, item)\"\r\n @mousedown=\"onItemMouseDown($event, item)\"\r\n @mouseenter=\"emit('update:hoverBlockId', item.content.id)\"\r\n @mouseleave=\"emit('update:hoverBlockId', null)\"\r\n @click=\"emit('update:activeBlockId', item.content.id)\"\r\n @contextmenu.stop=\"contextMenu.open($event, item.content)\"\r\n >\r\n {{ item.block.name }}\r\n </div>\r\n\r\n <div \r\n v-for=\"item in places\" \r\n class=\"page-editor-hierarhy__place\" \r\n :style=\"item.style\"\r\n @blockdrop=\"onPlaceBlockDrop($event, item.index)\"\r\n >\r\n </div>\r\n <VContextMenu v-bind=\"contextMenu.props\" />\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { computed, CSSProperties, inject, Ref, ref, shallowReactive, watch } from 'vue';\r\nimport { Block, BlockDropEvent, ContentBlock } from '../../common/types'\r\nimport { hasSlots, hasMultipleSlots, forEachChildren, uid, deleteBlock, createContentBlockChild, getBlockIndex, createContentBlock, changeBlockId } from '../utils/blocks';\r\nimport { cloneDeep, useDraggableItem } from 'vuesix'\r\nimport VContextMenu, { useContextMenu } from './VContextMenu.vue'\r\n\r\ntype FlatBlockEntry = { \r\n content: ContentBlock, \r\n parent: ContentBlock | null,\r\n block: Block, \r\n key: string, \r\n intent: number, \r\n hasSlots: boolean,\r\n hasMultipleSlots: boolean\r\n}\r\n\r\nconst props = defineProps<{ contentBlocks: ContentBlock[], blocksMap: Map<string, Block>, hoverBlockId: string | null, activeBlockId: string | null }>()\r\nconst emit = defineEmits([ \"update:hoverBlockId\", \"update:activeBlockId\" ])\r\n\r\nconst flatBlocks = computed(() => {\r\n const arr: Array<FlatBlockEntry> = []\r\n\r\n const collectBlocks = (items: ContentBlock[], intent = 0, parent: ContentBlock | null = null) => {\r\n for (let i = 0; i < items.length; i++) {\r\n const data = items[i]\r\n if (data.blockId.startsWith(\"__dev\")) continue\r\n const block = props.blocksMap.get(data.blockId)\r\n if (!block) {\r\n arr.push({\r\n content: data, key: data.id, intent, hasSlots: false, hasMultipleSlots: false, block: {} as Block, parent\r\n })\r\n continue\r\n }\r\n arr.push({ \r\n content: data, \r\n key: data.id, \r\n intent, \r\n hasSlots: hasSlots(block),\r\n hasMultipleSlots: hasMultipleSlots(block),\r\n block: block,\r\n parent\r\n })\r\n forEachChildren(block, data, blocks => {\r\n collectBlocks(blocks, intent+1, data)\r\n })\r\n }\r\n }\r\n\r\n collectBlocks(props.contentBlocks)\r\n return arr\r\n})\r\n\r\nconst drag = useDraggableItem()\r\nconst dragMode = inject(\"dragMode\") as Ref<boolean>\r\n\r\nconst onItemMouseDown = (e: MouseEvent, item: FlatBlockEntry) => {\r\n if (e.button !== 0) return\r\n const target = e.currentTarget as HTMLElement\r\n drag(e, {\r\n onStart(item) {\r\n target.setAttribute(\"data-source-drag\", \"\")\r\n item.classList.add(\"drag\")\r\n document.body.classList.add(\"mousedrag\")\r\n dragMode.value = true\r\n },\r\n onEnd(e) {\r\n document.body.classList.remove(\"mousedrag\")\r\n target.removeAttribute(\"data-source-drag\")\r\n if (e.target !== target) {\r\n e.target?.dispatchEvent(new BlockDropEvent(item.block, item.content))\r\n }\r\n dragMode.value = false\r\n }\r\n })\r\n}\r\n\r\nconst containerRef = ref<HTMLElement>()\r\nconst places = shallowReactive<{ style: CSSProperties, index: number }[]>([])\r\n\r\nwatch(dragMode, (dragMode) => {\r\n if (!dragMode || !containerRef.value) {\r\n places.length = 0\r\n return\r\n }\r\n const containerRect = containerRef.value.getBoundingClientRect()\r\n\r\n places.length = 0\r\n\r\n const children = Array.from(containerRef.value.children).filter(child => child.classList.contains(\"page-editor-hierarchy__item\"))\r\n let lastRectHeight = 0\r\n let lastRectBottom = containerRect.top\r\n for (let i = 0; i < children.length+1; i++) {\r\n const child = children[i]\r\n const rect = i === children.length? \r\n { top: lastRectBottom, height: containerRect.bottom - lastRectBottom, bottom: 0 }: \r\n child.getBoundingClientRect()\r\n\r\n let top = lastRectHeight * 0.2\r\n let bottom = rect.height * 0.2\r\n\r\n if (i > 0 && !flatBlocks.value[i-1].hasSlots) {\r\n top = lastRectHeight * 0.5\r\n } \r\n if (i === children.length) {\r\n bottom = rect.height\r\n } else if (!flatBlocks.value[i].hasSlots) {\r\n bottom = rect.height * 0.5\r\n }\r\n\r\n places.push({\r\n index: i,\r\n style: {\r\n top: rect.top - containerRect.top + containerRef.value.scrollTop - top + \"px\",\r\n paddingTop: top - 1 + \"px\",\r\n height: (top+bottom) + \"px\"\r\n }\r\n })\r\n\r\n lastRectHeight = rect.height\r\n lastRectBottom = rect.bottom\r\n }\r\n})\r\n\r\nconst onItemBlockDrop = (e: BlockDropEvent, item: FlatBlockEntry) => {\r\n if (e.content) {\r\n deleteBlock(props.contentBlocks, e.content)\r\n }\r\n if (item.hasSlots) {\r\n const contentBlock: ContentBlock = e.content ?? createContentBlock(e.block)\r\n createContentBlockChild(props.blocksMap, contentBlock, item.content, -1)\r\n }\r\n}\r\n\r\nconst onPlaceBlockDrop = (e: BlockDropEvent, _index: number, dublicate = false) => {\r\n e.stopPropagation()\r\n let index = _index\r\n \r\n let content = e.content\r\n if (content && !dublicate) {\r\n const sourceIndex = flatBlocks.value.findIndex(item => item.content === content)!\r\n if (sourceIndex === index || sourceIndex === index-1) return\r\n if (index > sourceIndex && sourceIndex !== -1) index--\r\n deleteBlock(props.contentBlocks, content)\r\n }\r\n if (content && dublicate) {\r\n content = cloneDeep(content)\r\n changeBlockId(content, e.block)\r\n }\r\n\r\n const contentBlock: ContentBlock = content ?? createContentBlock(e.block)\r\n\r\n if (index >= flatBlocks.value.length) {\r\n props.contentBlocks.push(contentBlock)\r\n } else {\r\n const blockEntry = flatBlocks.value[index]\r\n if (blockEntry.parent === null) {\r\n const index = props.contentBlocks.indexOf(blockEntry.content)\r\n props.contentBlocks.splice(index, 0, contentBlock)\r\n } else {\r\n const index = getBlockIndex(blockEntry.parent, blockEntry.content)\r\n createContentBlockChild(props.blocksMap, contentBlock, blockEntry.parent, index)\r\n }\r\n }\r\n}\r\n\r\nconst contextMenu = useContextMenu((content: ContentBlock | null) => [\r\n content !== null && { title: \"Дублировать блок\", onClick() {\r\n const index = flatBlocks.value.findIndex(item => item.content === content)\r\n const block = props.blocksMap.get(content.blockId)!\r\n onPlaceBlockDrop(new BlockDropEvent(block, content), index, true)\r\n } },\r\n content !== null && { title: \"Копировать блок\", async onClick() {\r\n const blob = new Blob([ JSON.stringify(content) ], { type: \"text/plain\" })\r\n await navigator.clipboard.write([\r\n new ClipboardItem({ \"text/plain\": blob })\r\n ])\r\n }},\r\n content && props.blocksMap.get(content.blockId)?.slots && { \r\n title: `Вставить блок как дочерний`,\r\n onClick: () => placeBlockFromClipboard(content)\r\n },\r\n {\r\n title: \"Вставить блок ниже\",\r\n onClick: async () => {\r\n const index = flatBlocks.value.findIndex(item => item.content === content)\r\n const [contentData, block] = await getBlockFromClipboard()\r\n if (!contentData || !block) return\r\n onPlaceBlockDrop(new BlockDropEvent(block, contentData), index+1, false)\r\n }\r\n },\r\n content !== null && { \r\n title: \"Удалить блок\", \r\n onClick: () => {\r\n deleteBlock(props.contentBlocks, content) \r\n if (props.activeBlockId === content.id) {\r\n emit(\"update:activeBlockId\", null)\r\n }\r\n if (props.hoverBlockId === content.id) {\r\n emit(\"update:hoverBlockId\", null)\r\n }\r\n }\r\n },\r\n])\r\n\r\nconst getBlockFromClipboard = async (): Promise<[ ContentBlock | null, Block | null ]> => {\r\n const resp = await navigator.clipboard.read()\r\n if (!resp[0].types.includes(\"text/plain\")) return [null, null]\r\n const entry = await resp[0].getType(\"text/plain\")\r\n const text = await entry.text()\r\n if (!text.startsWith(\"{\")) return [null, null]\r\n\r\n const contentData = JSON.parse(text)\r\n const block = props.blocksMap.get(contentData.blockId) ?? null\r\n if (block) {\r\n changeBlockId(contentData, block)\r\n }\r\n return [contentData as ContentBlock, block]\r\n}\r\n\r\n\r\nconst placeBlockFromClipboard = async (content: ContentBlock | null) => {\r\n\r\n const [contentData, block] = await getBlockFromClipboard()\r\n if (!contentData || !block) return\r\n\r\n try {\r\n if (content !== null) {\r\n const index = flatBlocks.value.findIndex(item => item.content === content)\r\n if (flatBlocks.value[index].hasSlots) {\r\n onItemBlockDrop(new BlockDropEvent(block, contentData), flatBlocks.value[index])\r\n } else {\r\n onPlaceBlockDrop(new BlockDropEvent(block, contentData), index)\r\n }\r\n } else {\r\n onPlaceBlockDrop(new BlockDropEvent(block, contentData), flatBlocks.value.length)\r\n }\r\n } catch(e) {\r\n console.warn(e)\r\n }\r\n}\r\n\r\n</script>\r\n\r\n<script lang=\"ts\">\r\n\r\n</script>\r\n\r\n\r\n<style lang=\"sass\">\r\n.page-editor-hierarchy\r\n background-color: var(--paper-color)\r\n position: relative\r\n flex: 1 1 auto\r\n user-select: none\r\n\r\n.page-editor-hierarchy__item\r\n display: flex\r\n align-items: center\r\n height: 42px\r\n padding: 0 16px\r\n font-size: 13px\r\n cursor: pointer\r\n font-weight: 500\r\n box-sizing: border-box\r\n color: var(--text-color-alt)\r\n user-select: none\r\n\r\n &:hover, &.hover, &[data-popover-target]\r\n background-color: var(--hover-color)\r\n\r\n &.active, &[data-source-drag]\r\n background-color: var(--background-active-color)\r\n color: var(--text-active-color)\r\n\r\n &.hoverBlock\r\n box-shadow: inset 0 0 0 2px var(--primary-color)\r\n\r\n &.drag\r\n display: none\r\n\r\n.page-editor-hierarhy__place\r\n position: absolute\r\n left: 0\r\n right: 0\r\n box-sizing: border-box\r\n // border: 1px solid var(--primary-color)\r\n\r\n &::after\r\n content: \"\"\r\n width: 100%\r\n display: block\r\n height: 2px\r\n\r\n &:hover::after\r\n background-color: var(--primary-color)\r\n\r\n</style>","<template>\r\n <div class=\"editor-hierarchy\" @blockdrop.stop>\r\n <slot></slot>\r\n <!-- <div class=\"title\">Настройки</div>\r\n <ContentSettings \r\n v-model=\"props.control.activeBlockId.value\" \r\n :dataEntries=\"props.dataEntries\"\r\n /> -->\r\n <div class=\"title\">Блоки</div>\r\n <ContentHierarchy \r\n class=\"scroll\"\r\n v-model:hover-block-id=\"props.control.hoverBlockId.value\"\r\n v-model:active-block-id=\"props.control.activeBlockId.value\"\r\n :content-blocks=\"props.state.content\" \r\n :blocks-map=\"props.blocksMap\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { Block, DataEntry, State } from '../types';\r\nimport { useControlComponent } from '../utils/controlComponent';\r\nimport ContentHierarchy from './ContentHierarchy.vue';\r\n\r\nconst props = defineProps<{ \r\n state: State, \r\n blocksMap: Map<string, Block>,\r\n control: ReturnType<typeof useControlComponent>,\r\n dataEntries: DataEntry[]\r\n}>()\r\n\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n\r\n.editor-hierarchy\r\n width: 250px\r\n border-right: 1px solid var(--border-color)\r\n background-color: white\r\n display: flex\r\n flex-direction: column\r\n\r\n .title\r\n color: var(--text-secondary-color)\r\n padding: 0 16px\r\n font-size: 13px\r\n font-weight: 500\r\n margin-top: 12px\r\n\r\n.editor-hierarchy__header\r\n padding: 12px 16px\r\n display: flex\r\n align-items: center\r\n gap: 8px\r\n padding-bottom: 4px\r\n \r\n .v-select\r\n flex: 1 1 auto\r\n\r\n .v-icon-button\r\n width: 32px\r\n height: 32px\r\n \r\n</style>","import { shallowRef, watch } from \"vue\"\r\nimport { findParent } from \"vuesix\"\r\n\r\n/** Создает необходимые функции для подсвечивания блоков в текущем DOM */\r\nexport const useControlComponent = (_activeBlockId?: string) => {\r\n\r\n let dragMode = false\r\n let lastRoot: HTMLElement = document.body\r\n\r\n const hoverBlockId = shallowRef<string | null>(null)\r\n const activeBlockId = shallowRef<string | null>(_activeBlockId ?? null)\r\n\r\n const hoverBlockElement = shallowRef<HTMLElement | null>(null)\r\n const activeBlockElement = shallowRef<HTMLElement | null>(null)\r\n \r\n let lastStateKey = \"\" \r\n\r\n let blocksHover: HTMLElement[] = []\r\n const onIframeBlockMouseEnter = (e: MouseEvent) => {\r\n if (dragMode) return\r\n\r\n hoverBlockElement.value = e.currentTarget as HTMLElement\r\n const blockId = hoverBlockElement.value.getAttribute(\"data-block-id\") ?? null\r\n hoverBlockId.value = blockId\r\n\r\n blocksHover.push(e.currentTarget as HTMLElement)\r\n }\r\n\r\n const onIframeBlockMouseLeave = (e: MouseEvent) => {\r\n const el = e.currentTarget as HTMLElement\r\n if (el && blocksHover.indexOf(el) >= 0) {\r\n blocksHover = blocksHover.slice(0, blocksHover.indexOf(el))\r\n }\r\n setTimeout(() => {\r\n if (hoverBlockElement.value !== el) return\r\n hoverBlockElement.value = blocksHover[blocksHover.length-1] ?? null\r\n const blockId = hoverBlockElement.value?.getAttribute(\"data-block-id\") ?? null\r\n hoverBlockId.value = blockId\r\n }, 0) \r\n }\r\n\r\n const onIframeBlockClick = (e: MouseEvent) => {\r\n hoverBlockElement.value = e.currentTarget as HTMLElement\r\n const blockId = hoverBlockElement.value.getAttribute(\"data-block-id\") ?? null\r\n hoverBlockId.value = blockId\r\n\r\n activeBlockId.value = blockId\r\n\r\n if (!blockId) return\r\n\r\n activeBlockElement.value = hoverBlockElement.value\r\n\r\n e.stopPropagation()\r\n e.preventDefault()\r\n }\r\n \r\n const elements = shallowRef<HTMLElement[]>([])\r\n const update = (root: HTMLElement) => {\r\n lastRoot = root\r\n const arr = Array.from(root.querySelectorAll<HTMLDivElement>(\"[data-block-id]\"))\r\n \r\n const key = arr.map(item => item.getAttribute(\"data-block-id\") ?? \"\").join(\",\")\r\n if (lastStateKey === key) return\r\n\r\n for (let item of arr) {\r\n if (item.hasAttribute(\"data-dev\")) continue\r\n item.addEventListener(\"mouseenter\", onIframeBlockMouseEnter)\r\n item.addEventListener(\"mouseleave\", onIframeBlockMouseLeave)\r\n item.addEventListener(\"click\", onIframeBlockClick)\r\n }\r\n elements.value = arr\r\n } \r\n\r\n \r\n watch(hoverBlockId, (hoverBlockId) => {\r\n if (hoverBlockId === null) {\r\n hoverBlockElement.value = null\r\n return\r\n }\r\n if (hoverBlockId === hoverBlockElement.value?.getAttribute(\"data-block-id\")) {\r\n return\r\n }\r\n hoverBlockElement.value = lastRoot?.querySelector(`[data-block-id=\"${hoverBlockId}\"]`) ?? null\r\n })\r\n \r\n watch(activeBlockId, (activeBlockId) => {\r\n if (activeBlockId === null) {\r\n activeBlockElement.value = null\r\n return\r\n }\r\n if (activeBlockId === activeBlockElement.value?.getAttribute(\"data-block-id\")) {\r\n return\r\n }\r\n updateActiveElement()\r\n }, { immediate: true })\r\n\r\n const updateActiveElement = () => {\r\n const blockId = activeBlockId.value\r\n if (!blockId) return\r\n activeBlockElement.value = lastRoot.querySelector(`[data-block-id=\"${blockId}\"]`) ?? null\r\n }\r\n\r\n // Тут и ниже: методы для вставки элемента \r\n let placeElements: { id: string, top: number, bottom: number, width: number }[] = []\r\n const insertedPlace = shallowRef<{ prepentBlockId: string | null, top: number } | null>(null)\r\n const onMouseMove = (e: MouseEvent) => {\r\n if (!dragMode) {\r\n return\r\n }\r\n if (e.currentTarget !== e.target && findParent(e.target as HTMLElement, item => item.classList.contains('editor-component'))) {\r\n insertedPlace.value = null\r\n return\r\n }\r\n let index = 0\r\n for (let item of placeElements) {\r\n if (e.clientY + window.scrollY < (item.top + item.bottom) * 0.5) {\r\n break\r\n }\r\n index++\r\n }\r\n if (index === placeElements.length) {\r\n insertedPlace.value = { prepentBlockId: null, top: placeElements[index-1]?.bottom ?? 0 }\r\n } else {\r\n insertedPlace.value = { prepentBlockId: placeElements[index].id, top: placeElements[index].top }\r\n }\r\n }\r\n const onMouseLeave = () => {\r\n insertedPlace.value = null\r\n }\r\n\r\n const updatePlaceElements = () => {\r\n placeElements = elements.value.map(item => {\r\n const rect = item.getBoundingClientRect()\r\n const width = item.parentElement?.scrollWidth ?? rect.width\r\n\r\n const style = window.getComputedStyle(item)\r\n const top = rect.top + window.scrollY - parseInt(style.marginTop)\r\n const bottom = rect.bottom + window.scrollY\r\n return { id: item.getAttribute(\"data-block-id\")!, top, bottom, width }\r\n })\r\n placeElements.sort((a, b) => a.top - b.top)\r\n }\r\n\r\n let mouseMoveRoot: HTMLElement | null = null\r\n const setDragMode = (_dragMode: boolean) => {\r\n dragMode = _dragMode\r\n if (dragMode) {\r\n updatePlaceElements()\r\n lastRoot.addEventListener(\"mousemove\", onMouseMove)\r\n mouseMoveRoot = lastRoot\r\n } else {\r\n mouseMoveRoot?.removeEventListener(\"mousemove\", onMouseMove)\r\n insertedPlace.value = null\r\n }\r\n }\r\n\r\n const onScroll = () => {\r\n if (dragMode) {\r\n updatePlaceElements()\r\n if (insertedPlace.value?.prepentBlockId) {\r\n const index = placeElements.findIndex(item => item.id === insertedPlace.value!.prepentBlockId)\r\n insertedPlace.value = { ...insertedPlace.value, top: placeElements[index].top }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n update,\r\n hoverBlockElement,\r\n activeBlockElement,\r\n activeBlockId,\r\n hoverBlockId,\r\n updateActiveElement,\r\n elements,\r\n insertedPlace,\r\n onMouseMove,\r\n onMouseLeave,\r\n setDragMode,\r\n onScroll\r\n }\r\n}","<template>\r\n <div class=\"form-column\" :class=\"[\r\n props.spacing? `spacing-${props.spacing}`: undefined, \r\n props.size? `size-${props.size}`: undefined \r\n ]\">\r\n <slot></slot>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\n\r\nconst props = defineProps<{ spacing?: \"large\", size?: \"small\" }>()\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.form-column\r\n display: flex\r\n flex-direction: column\r\n gap: 8px\r\n\r\n &.spacing-large\r\n gap: 16px\r\n\r\n &.size-small\r\n width: 600px\r\n\r\n .form-row\r\n display: flex\r\n gap: 16px\r\n\r\n &>*\r\n flex: 1 1 50px\r\n \r\n</style>","<template>\r\n <VDialog style=\"width: 500px\">\r\n <template #header>{{ props.item? \"Редактировать\": \"Создать\" }} страницу</template>\r\n <FormColumn>\r\n <VInput v-bind=\"register('name')\" label=\"Название страницы\" autofocus/>\r\n <VInput v-bind=\"register('path')\" :prefix=\"currentFoler?.path\" label=\"URL адрес\"/>\r\n <VSelect v-if=\"folders.length > 0\" nullable v-bind=\"register('folderId')\" :items=\"folders\" label=\"Папка\"/>\r\n </FormColumn>\r\n <template #actions>\r\n <VButton :disabled=\"pending\" large @click=\"apply\">{{ props.item? \"Сохранить\": \"Создать\" }}</VButton>\r\n </template> \r\n </VDialog>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { computed } from 'vue';\r\nimport type { ProjectPage, ProjectPageFolder } from '../../../frontend/src/api/projectPagesApi';\r\nimport { useForm } from 'vuesix';\r\nimport FormColumn from '../FormColumn.vue';\r\nimport VInput from '../VInput.vue';\r\nimport VSelect from '../VSelect.vue';\r\nimport VButton from '../VButton.vue';\r\nimport { useDialog } from '../VDialogProvider.vue';\r\nimport VDialog from '../VDialog.vue';\r\n\r\nconst props = defineProps<{ \r\n folders: ProjectPageFolder[],\r\n folderId?: number, \r\n item?: ProjectPage,\r\n onCreate: (data: { name: string, path: string, folderId: number | null }) => Promise<void>\r\n}>()\r\n\r\nconst { register, handleSubmit, pending, values, updateDefaultValues } = useForm({\r\n name: \"\",\r\n path: \"/\",\r\n folderId: (props.folderId ?? null) as number | null\r\n})\r\nif (props.item) {\r\n updateDefaultValues(props.item)\r\n}\r\n\r\nconst folders = computed(() => {\r\n const addItem = { id: \"_add\", title: \"Создать папку...\" }\r\n const arr = props.folders? props.folders.map(item => ({ id: item.id, title: item.name })): []\r\n // arr.push(addItem)\r\n return arr\r\n})\r\n\r\nconst currentFoler = computed(() => {\r\n if (!values.folderId) return null\r\n return props.folders.find(item => item.id === values.folderId)\r\n})\r\n\r\nconst dialog = useDialog()\r\nconst apply = handleSubmit(async (values) => {\r\n await props.onCreate(values)\r\n dialog.close()\r\n})\r\n\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n\r\n</style>","<template>\r\n <div class=\"v-table\" :style=\"gridStyle\">\r\n <div class=\"v-table__header\">\r\n <div v-if=\"props.checkable\"></div>\r\n <div v-for=\"item in columns\">\r\n {{ item.title }}\r\n </div>\r\n </div>\r\n <component \r\n v-for=\"(item, index) in data\" \r\n :key=\"index\" \r\n :is=\"is(item)\" \r\n v-bind=\"bind(item)\" \r\n class=\"v-table__row\" \r\n :class=\"{ hasGroup: props.groupBy && item[props.groupBy] && item[props.groupBy] !== data[index-1]?.[props.groupBy] }\"\r\n @click=\"emit('itemclick', item)\"\r\n @contextmenu=\"emit('itemcontext', $event, item)\"\r\n >\r\n <div v-if=\"props.groupBy && item[props.groupBy] && item[props.groupBy] !== data[index-1]?.[props.groupBy]\" class=\"v-table__group-label\">\r\n Папка {{ item[props.groupBy] }}\r\n </div>\r\n <div v-if=\"props.checkable\" class=\"v-table__check\" @click.prevent.stop=\"checkboxClick\">\r\n <VCheckbox \r\n :modelValue=\"modelValue.has(item)\" \r\n @update:modelValue=\"modelValue.has(item)? modelValue.delete(item): modelValue.add(item)\"\r\n />\r\n </div>\r\n <div v-for=\"(column, key) in columns\" :key=\"key\" :class=\"column.class\" >\r\n <slot :name=\"key\" :item=\"item\" :cell=\"item[key as keyof T]\">\r\n {{ column.map? column.map(item): item[key as keyof T] }}\r\n </slot>\r\n </div>\r\n </component>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup generic=\"T\">\r\nimport { CSSProperties, computed } from 'vue';\r\nimport VCheckbox from './VCheckbox.vue';\r\n\r\nconst props = defineProps<{ \r\n data: T[],\r\n clickable?: boolean,\r\n checkable?: boolean,\r\n to?: (item: T) => string,\r\n useHref?: boolean,\r\n groupBy?: keyof T,\r\n columns: Columns<T>\r\n}>()\r\n\r\nconst emit = defineEmits([ \"itemclick\", \"itemcontext\" ])\r\nconst modelValue = defineModel({ default: new Set() })\r\n\r\nconst is = (item: T) => {\r\n const to = props.to?.(item)\r\n if (to) {\r\n return props.useHref? 'a': 'router-link'\r\n }\r\n if (props.clickable) return 'button'\r\n return 'div'\r\n}\r\n\r\nconst bind = (item: T) => {\r\n const to = props.to?.(item)\r\n if (to) {\r\n return props.useHref? { href: to }: { to }\r\n } else {\r\n return {}\r\n }\r\n}\r\n\r\nconst gridStyle = computed<CSSProperties>(() => {\r\n const arr = Object.values(props.columns).map(item => item.width ?? '1fr')\r\n if (props.checkable) {\r\n arr.unshift(\"52px\")\r\n }\r\n return {\r\n gridTemplateColumns: arr.join(\" \")\r\n }\r\n})\r\n\r\nconst checkboxClick = (e: MouseEvent) => {\r\n if (e.target === e.currentTarget) {\r\n (e.target as HTMLElement).querySelector(\".mech-v-checkbox\")?.dispatchEvent(new MouseEvent(\"click\"))\r\n }\r\n}\r\n\r\n</script>\r\n\r\n<script lang=\"ts\">\r\n\r\ntype Column<T> = {\r\n title?: string,\r\n class?: string,\r\n width?: string,\r\n map?: (item: T) => string\r\n}\r\n\r\nexport type Columns<T> = Record<string, Column<T>>\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.v-table\r\n display: grid\r\n grid-template-columns: 1fr 1fr 1fr\r\n\r\n.v-table__header, .v-table__row\r\n display: grid\r\n grid-template-columns: subgrid\r\n grid-column: 1 / -1\r\n align-items: center\r\n padding: 0 20px\r\n\r\n.v-table__header\r\n font-size: 13px\r\n font-weight: 500\r\n color: var(--text-secondary-color)\r\n height: 24px\r\n\r\n.v-table__row\r\n height: 50px\r\n text-decoration: none\r\n color: var(--text-color)\r\n font-weight: 500\r\n text-align: left\r\n background: none\r\n border: none\r\n font-size: 14px\r\n user-drag: none\r\n -webkit-user-drag: none\r\n\r\n\r\n &:hover\r\n background-color: var(--hover-color)\r\n\r\na.v-table__row\r\n text-decoration: none\r\n\r\n.v-table__check\r\n height: 100%\r\n display: flex\r\n align-items: center\r\n user-drag: none\r\n -webkit-user-drag: none\r\n margin-left: -20px\r\n padding-left: 20px\r\n\r\n.v-table__actions\r\n display: flex\r\n align-items: center\r\n justify-content: flex-end\r\n gap: 4px\r\n display: none\r\n .v-icon-button\r\n width: 32px\r\n height: 32px\r\n\r\n svg\r\n width: 20px\r\n height: 20px\r\n\r\n.v-table__row:hover .v-table__actions\r\n display: flex\r\n \r\n.v-table__row.hasGroup\r\n margin-top: 30px\r\n position: relative\r\n \r\n.v-table__group-label\r\n position: absolute\r\n top: -16px\r\n left: 20px\r\n color: var(--text-secondary-color)\r\n font-size: 13px\r\n\r\n</style>","<template>\r\n <VDialog class=\"standart\">\r\n <template #header>\r\n Страницы проекта\r\n </template>\r\n <VTable \r\n v-if=\"data\" \r\n :data=\"data\" \r\n :columns=\"columns\" \r\n group-by=\"folderPath\" \r\n class=\"open-page-dialog__table\"\r\n useHref\r\n :to=\"item => item.path\"\r\n >\r\n\r\n </VTable>\r\n </VDialog>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { useRequest } from 'vuesix';\r\nimport VDialog from '../VDialog.vue';\r\nimport VTable, { Columns } from '../VTable.vue'\r\nimport { inject } from 'vue';\r\n\r\nconst pagesRequest = inject(\"pagesRequest\") as (() => Promise<any>)\r\nconst { data } = useRequest(pagesRequest)\r\n\r\nconst columns: Columns<any> = {\r\n name: { title: \"Название страницы\" },\r\n path: { title: \"Путь\" }\r\n}\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n.open-page-dialog__table\r\n margin-left: -20px\r\n margin-right: -20px\r\n</style>","<template>\r\n <VDialog class=\"standart\">\r\n <template #header>Настройки страницы</template>\r\n <VTabs v-model=\"currentTab\" :items=\"tabs\" style=\"margin-bottom: 12px\" />\r\n <VTabsPages :page=\"currentTab\">\r\n <template #_main>\r\n <FormColumn>\r\n <div class=\"form-row\">\r\n <VInput v-bind=\"register('name')\" label=\"Название страницы\"/>\r\n <VInput v-bind=\"register('path')\" label=\"Путь к странице\"/>\r\n </div>\r\n </FormColumn>\r\n </template>\r\n <template v-for=\"tab in tabs.slice(1)\" #[tab.id]>\r\n <JsonEditor :schema=\"tab.props\" v-model=\"state.data[tab.id]\" flat @edit=\"onEdit\"/>\r\n </template>\r\n </VTabsPages>\r\n <template #actions>\r\n <VButton large @click=\"apply\">Сохранить</VButton>\r\n </template>\r\n </VDIalog>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { cloneDeep, isEqual, useForm } from 'vuesix';\r\nimport FormColumn from '../FormColumn.vue';\r\nimport VButton from '../VButton.vue';\r\nimport VDialog from '../VDialog.vue';\r\nimport VInput from '../VInput.vue';\r\nimport { useDialog } from '../VDialogProvider.vue';\r\nimport { computed, inject, shallowRef, watch } from 'vue';\r\nimport VTabs from '../VTabs.vue';\r\nimport VTabsPages from '../VTabsPages.vue';\r\nimport JsonEditor from '../JsonEditor.vue';\r\n\r\ntype Page = { name: string, path: string, meta?: { title?: string, description?: string } }\r\nconst props = defineProps<{ page: Page, onConfirm: (values: any) => Promise<void> }>()\r\nconst { register, handleSubmit } = useForm({\r\n name: props.page.name,\r\n path: props.page.path,\r\n // title: props.page.meta?.title ?? \"\",\r\n // description: props.page.meta?.description ?? \"\",\r\n})\r\n\r\nconst dataEntries = inject(\"dataEntries\") as any[]\r\n\r\nconst currentTab = shallowRef(\"_main\")\r\nconst tabs = computed(() => {\r\n return [\r\n { id: \"_main\", title: \"Основное\" } as any,\r\n ...dataEntries\r\n .map(item => ({ id: item.id, title: item.title ?? item.id, order: item.order ?? 0, props: item.props }))\r\n .sort((a, b) => a.order - b.order)\r\n ]\r\n})\r\nconst state = inject(\"state\") as any\r\n\r\nconst onEdit = (key: string) => {\r\n if (!state.dataEntryScopes[currentTab.value]) {\r\n state.dataEntryScopes[currentTab.value] = 'page'\r\n }\r\n}\r\n\r\nconst dialog = useDialog()\r\nconst apply = handleSubmit(async (values) => {\r\n await props.onConfirm(values)\r\n dialog.close()\r\n})\r\n\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n\r\n</style>","<template>\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M8 15L12 19L16 15M16 9L12 5L8 9\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n</svg>\n</template>\n","import { setUseFormErrorHandler } from \"vuesix\"\r\n\r\nexport class HTTPError extends Error {\r\n body: any\r\n statusCode: number\r\n\r\n constructor(body: any, statusCode: number = 401) {\r\n super()\r\n this.body = body\r\n this.statusCode = statusCode\r\n }\r\n}\r\n\r\nsetUseFormErrorHandler((e, errors) => {\r\n if (e instanceof HTTPError && typeof e.body?.error === \"object\") {\r\n for (let [key, error] of Object.entries(e.body.error)) {\r\n if (typeof error === \"string\") {\r\n (errors as any)[key] = error as string\r\n } else if (typeof error === \"object\" && error) {\r\n (errors as any)[key] = error\r\n }\r\n }\r\n } else {\r\n (errors as any)[\"_global\"] = e.body ?? \"Error\"\r\n }\r\n})\r\n\r\ntype RequestOptions = Partial<{\r\n method: \"GET\" | \"POST\" | \"DELETE\" | \"PUT\",\r\n responseContentType: \"json\" | \"blob\",\r\n ignoreJwt?: boolean\r\n}>\r\n\r\nexport const request = async <T = any>(url: string, body?: any, options: RequestOptions = {}) => {\r\n const headers: { [key: string]: string} = {}\r\n if (body && !(body instanceof FormData)) {\r\n headers[\"Content-Type\"] = \"application/json\"\r\n }\r\n\r\n const resp = await fetch(url, {\r\n method: options.method || (body? \"POST\": \"GET\"),\r\n body: !body || body instanceof FormData || typeof body === \"string\"? body: JSON.stringify(body),\r\n headers\r\n })\r\n\r\n let response = null as T\r\n if ((resp as any).headers.get(\"content-type\")?.startsWith(\"application/json\")) {\r\n response = await resp.json() as T\r\n }\r\n if ((resp as any).headers.get(\"content-type\")?.startsWith(\"text/plain\")) {\r\n response = await resp.text() as T\r\n }\r\n\r\n if (resp.status >= 400) {\r\n throw new HTTPError(response, resp.status)\r\n }\r\n\r\n if (options.responseContentType === \"blob\"){\r\n response = await (resp as any).blob() as T\r\n }\r\n\r\n return response as T\r\n}","<template>\r\n <VContextMenu placement=\"bottom\" fitAnchor :offset=\"4\" :items=\"menuItems\">\r\n <template #activator=\"{ props }\">\r\n <button v-bind=\"$attrs\" class=\"pages-selector\" @click=\"props.onClick\">\r\n <div class=\"pages-selector__title\">{{ currentPage?.name }}</div>\r\n <div class=\"pages-selector__subtitle\">Текущая страница</div>\r\n <SortIcon/>\r\n </button>\r\n </template>\r\n </VContextMenu>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { computed, inject } from 'vue';\r\nimport { mutateRequest, useRequest } from 'vuesix';\r\nimport { useDialog } from '../../../common/components/VDialogProvider.vue';\r\nimport CreatePageDialog from '../../../common/components/dialogs/CreatePageDialog.vue';\r\nimport OpenPageDialog from '../../../common/components/dialogs/OpenPageDialog.vue';\r\nimport PageSettingsDialog from '../../../common/components/dialogs/PageSettingsDialog.vue';\r\nimport VContextMenu, { ContextMenuItem } from '../../../common/components/VContextMenu.vue';\r\nimport SortIcon from '../../../common/components/icons/SortIcon.vue';\r\nimport type { ProjectPage, ProjectPageFolder } from '../../../frontend/src/api/projectPagesApi';\r\nimport { request } from './api';\r\n\r\nconst props = defineProps<{ state?: any }>()\r\n\r\n\r\nconst pagesRequest = inject(\"pagesRequest\") as () => Promise<ProjectPage[]>\r\nconst foldersRequest = inject(\"foldersRequest\") as () => Promise<ProjectPageFolder[]>\r\nconst { data: pages } = useRequest(pagesRequest)\r\nconst { data: folders } = useRequest(foldersRequest)\r\n\r\nconst currentPage = computed(() => {\r\n return props.state.currentPage\r\n})\r\n\r\n\r\nconst dialog = useDialog()\r\nconst createNewPage = () => {\r\n dialog.open(CreatePageDialog, { folders: folders.value! as any, onCreate: async (values: any) => {\r\n const pageData = await request(\"/@mechanica/pages\", values)\r\n mutateRequest(pagesRequest)\r\n // window.location.href = pageData.path\r\n } })\r\n}\r\n\r\nconst openPage = () => {\r\n dialog.open(OpenPageDialog)\r\n}\r\n\r\nconst openPageSettingsDialog = () => {\r\n dialog.open(PageSettingsDialog, { page: props.state.currentPage, onConfirm: async(values: any) => {\r\n await request(`/@mechanica/pages?path=${encodeURIComponent(props.state.currentPage.path)}`, values)\r\n props.state.currentPage.name = values.name\r\n } })\r\n}\r\n\r\nconst menuItems = computed(() => {\r\n const arr: ContextMenuItem[] = [\r\n { title: \"Настройки страницы\", onClick: openPageSettingsDialog },\r\n { title: \"Открыть страницу...\", onClick: openPage },\r\n { title: \"Новая страница...\", onClick: createNewPage }\r\n ]\r\n\r\n if ((window as any).__mechanicaConfig__?.languages) {\r\n arr.push({\r\n title: \"Язык\",\r\n children: Object.entries<any>((window as any).__mechanicaConfig__.languages).map(i => ({\r\n title: i[1].title,\r\n onClick() {\r\n \r\n }\r\n }))\r\n })\r\n }\r\n\r\n return arr\r\n})\r\n\r\n// watch(currentPage, async (newPage) => {\r\n// const resp = await fetch(`/${newPage}`)\r\n// const html = await resp.text()\r\n// const _state = html.match(/window\\.state=({.+})/)?.[1]\r\n// const state = _state && JSON.parse(_state)\r\n// processState(state)\r\n\r\n// Object.assign((window as any).state, state)\r\n// window.history.pushState({}, \"\", newPage === 'index'? '/': `/${newPage}`)\r\n// })\r\n\r\ndefineOptions({\r\n inheritAttrs: false\r\n})\r\n\r\n</script>\r\n\r\n\r\n<style lang=\"sass\">\r\n.pages-selector\r\n display: flex\r\n height: 46px\r\n color: var(--placeholder-color)\r\n width: 100%\r\n background: none\r\n text-align: left\r\n border: none\r\n cursor: pointer\r\n padding: 0 \r\n border-bottom: 1px solid var(--border-color)\r\n margin-top: -4px\r\n flex-direction: column\r\n position: relative\r\n justify-content: center\r\n gap: 2px\r\n outline: none\r\n\r\n svg\r\n position: absolute\r\n right: 0\r\n width: 20px\r\n height: 20px\r\n top: calc(50% - 10px)\r\n \r\n.pages-selector__title\r\n color: var(--text-color-alt)\r\n font-weight: 600\r\n\r\n.pages-selector__subtitle\r\n font-size: 12px\r\n\r\n</style>","import { blocksList as _blocksList, addUpdateListener } from 'virtual:builder-blocks'\r\nimport { getBlockName } from '../../../common/utils/lang'\r\nimport { unfoldSchema, registerAlias } from 'compact-json-schema';\r\nimport { computed, shallowRef } from \"vue\";\r\nimport type { State } from \"../../../common/types\";\r\nimport { processBlocks } from \"../../../common/utils/processBlock\";\r\nimport { registerAliases } from '../../../common/utils/schemaAliases';\r\n\r\nregisterAliases(registerAlias)\r\n\r\nexport const blocksList = shallowRef(_blocksList.map(file => ({\r\n ...file.blockSchema,\r\n id: file.blockSchema.id ?? file.__name!,\r\n order: file.blockSchema.order,\r\n name: file.blockSchema.name ?? getBlockName(file.__name) ?? \"Unnamed block\",\r\n props: file.blockSchema.props? unfoldSchema(file.blockSchema.props): {}\r\n})))\r\n\r\nexport const blocksMap = computed(() => new Map(blocksList.value.map(item => [ item.id, item ])))\r\n\r\naddUpdateListener((module: any) => {\r\n blocksList.value = module.blocksList.map((file: any) => ({\r\n ...file.blockSchema,\r\n id: file.blockSchema.id ?? file.__name!,\r\n order: file.blockSchema.order,\r\n name: file.blockSchema.name ?? getBlockName(file.__name) ?? \"Unnamed block\",\r\n props: file.blockSchema.props? unfoldSchema(file.blockSchema.props): {}\r\n }))\r\n})\r\n\r\n/** Функция проходит по всем блокам и назначает пропс data-block-id и значения по умолчанию */\r\nexport const processState = (state: State) => {\r\n processBlocks(state.content, blocksMap.value)\r\n return state\r\n}\r\n","<template>\r\n <Transition>\r\n <HierarchySidebar \r\n v-if=\"controlsOpened\" \r\n :control=\"control\"\r\n :state=\"state\"\r\n :blocks-map=\"blocksMap\"\r\n :data-entries=\"dataEntries\"\r\n class=\"editor-sidebar-left editor-component\" \r\n >\r\n <div class=\"editor-hierarchy__header\">\r\n <PageSelector :state=\"state\"/>\r\n </div>\r\n <button class=\"editor-sidebar__close-button\" @click=\"controlsOpened = false\"><ChevronLeftIcon/></button>\r\n </HierarchySidebar>\r\n </Transition>\r\n <HoverFrame v-if=\"controlsOpened\" :element=\"control.hoverBlockElement.value\"/>\r\n <HoverFrame v-if=\"controlsOpened\" :element=\"control.activeBlockElement.value\" resizable/>\r\n <InsertedPlace v-if=\"control.insertedPlace.value\" :top=\"control.insertedPlace.value.top\"/>\r\n <Transition>\r\n <BlocksEditor \r\n v-if=\"controlsOpened\"\r\n class=\"editor-sidebar-right editor-component\" @blockdrop.stop\r\n :state=\"state\" \r\n :blocks-list=\"blocksList\" \r\n :blocks-map=\"blocksMap\" \r\n :active-block-id=\"control.activeBlockId.value\"\r\n :data-entries=\"dataEntries\"\r\n :dataEntryScopes=\"dataEntryScopes\"\r\n >\r\n <button class=\"editor-sidebar__close-button right\" @click=\"controlsOpened = false\"><ChevronRightIcon/></button>\r\n </BlocksEditor>\r\n </Transition>\r\n <Transition>\r\n <div v-if=\"!controlsOpened\" class=\"editor-sidebar__close-button editor-component fixed\" @click=\"controlsOpened = true\"><ChevronRightIcon/></div>\r\n </Transition>\r\n <Transition>\r\n <div v-if=\"!controlsOpened\" class=\"editor-sidebar__close-button editor-component right fixed\" @click=\"controlsOpened = true\"><ChevronLeftIcon/></div>\r\n </Transition>\r\n <VDialogProvider/>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport HoverFrame from '../../../common/components/HoverFrame.vue'\r\nimport InsertedPlace from '../../../common/components/InsertedPlace.vue'\r\nimport ChevronLeftIcon from '../../../common/components/icons/ChevronLeftIcon.vue'\r\nimport ChevronRightIcon from '../../../common/components/icons/ChevronRightIcon.vue'\r\nimport BlocksEditor from '../../../common/components/BlocksEditor.vue'\r\nimport HierarchySidebar from '../../../common/components/HierarchySidebar.vue'\r\n\r\nimport { useEventListener, watchDebounced } from '@vueuse/core'\r\nimport { BlockDropEvent, ContentBlock, DataEntryScope, State } from '../../../common/types';\r\nimport { useControlComponent } from '../../../common/utils/controlComponent'\r\nimport { computed, inject, onMounted, provide, reactive, ref, watch } from 'vue';\r\nimport { insertBlockBefore } from '../../../common/utils/blocks'\r\nimport { cloneDeep, useKeyDownLayer } from 'vuesix'\r\nimport PageSelector from './PageSelector.vue'\r\nimport { blocksList, blocksMap, processState } from './processState'\r\nimport VDialogProvider from '../../../common/components/VDialogProvider.vue'\r\nimport { saveBlocks, splitData } from '../../../common/utils/processBlock'\r\nimport { passDefaultValue } from '../../../common/utils/passDefaultValue'\r\nimport { request } from './api'\r\n\r\nconst controlsOpened = ref(true)\r\n\r\nconst dragMode = ref(false)\r\nprovide(\"dragMode\", dragMode)\r\n\r\nconst state = reactive<State>(processState(JSON.parse(JSON.stringify((window as any).state))))\r\nprovide(\"state\", state)\r\n\r\nconst contentBlocks = computed(() => state.content as ContentBlock[])\r\n\r\nuseEventListener(document, \"blockdrop\", (e: BlockDropEvent) => {\r\n if (e.content) return\r\n insertBlockBefore(e.block, contentBlocks.value, control.insertedPlace.value?.prepentBlockId)\r\n})\r\n\r\nlet ignoreChanges = false\r\nuseEventListener(document, \"openpage\", (e: Event) => {\r\n Object.assign(state, processState(cloneDeep((e as any).data)))\r\n ignoreChanges = true\r\n})\r\n\r\nconst control = useControlComponent()\r\nwatch(dragMode, control.setDragMode)\r\n\r\nwatch(blocksList, () => {\r\n control.update(window.document.body)\r\n control.updateActiveElement()\r\n}, { flush: \"post\" })\r\nonMounted(() => {\r\n control.update(window.document.body)\r\n})\r\n\r\n// watch(currentTab, (currentTab) => {\r\n// Object.assign(import.meta.hot!.data, { currentTab })\r\n// })\r\n\r\n// watch(control.activeBlockId, (activeBlockId) => {\r\n// Object.assign(import.meta.hot!.data, { activeBlockId })\r\n// })\r\n\r\nwatchDebounced(state, (newState, oldState) => {\r\n if (ignoreChanges) {\r\n ignoreChanges = false\r\n return\r\n }\r\n\r\n const state = cloneDeep(newState)\r\n const scopedData = splitData(state.data, dataEntryScopes.value)\r\n\r\n state.data = scopedData['page']\r\n saveBlocks(state.content, blocksMap.value)\r\n\r\n request(`/@mechanica/save?path=${window.location.pathname}`, state)\r\n}, { debounce: 500 })\r\n\r\nprovide(\"fileUploader\", async (file: File) => {\r\n const resp = await fetch(\"/@mechanica/upload\", {\r\n method: \"POST\",\r\n body: file,\r\n headers: { \"x-file-name\": file.name, \"content-type\": \"application/octet-stream\" }\r\n })\r\n const obj = await resp.json()\r\n return obj\r\n})\r\nprovide(\"fileRequest\", async () => {\r\n return await request(\"/@mechanica/images\")\r\n})\r\nprovide(\"pagesRequest\", async () => {\r\n return await request(\"/@mechanica/pages\")\r\n})\r\nprovide(\"foldersRequest\", async () => {\r\n return await request(\"/@mechanica/folders\")\r\n})\r\n\r\nconst dataEntries = inject(\"dataEntries\") as any[]\r\nconst dataEntryScopes = ref<Record<string, DataEntryScope>>(state.dataEntryScopes ?? {})\r\n\r\nuseKeyDownLayer(\"Escape\", () => !!control.activeBlockId.value, () => control.activeBlockId.value = null)\r\n\r\nfor (let entry of dataEntries) {\r\n state.data[entry.id] = passDefaultValue(state.data[entry.id], entry.props)\r\n}\r\n\r\nwatch(state, (state) => {\r\n const val = JSON.parse(JSON.stringify(state))\r\n window.postMessage({ type: \"update:state\", payload: val })\r\n setTimeout(() => control.update(window.document.body), 50)\r\n}, { immediate: true })\r\n\r\n// import.meta.hot?.accept()\r\n\r\n</script>\r\n\r\n<style lang=\"sass\">\r\n@import ../../../common/styles/variables\r\n@import ../../../common/styles/typography\r\n@import ../../../common/styles/components\r\n\r\n.editor-component\r\n @include variables\r\n @include typography\r\n &.scroll, .scroll\r\n @include scroll-mixin \r\n \r\n color: var(--text-color)\r\n\r\n.editor-sidebar-right\r\n position: fixed\r\n right: 0\r\n top: 0\r\n bottom: 0\r\n z-index: 1000\r\n\r\n.editor-sidebar-left \r\n position: fixed\r\n left: 0\r\n top: 0\r\n bottom: 0\r\n z-index: 1000\r\n\r\n.editor-control-component\r\n position: absolute\r\n top: 0\r\n left: 0\r\n width: 300px\r\n height: 200px\r\n border: 2px solid var(--primary-color)\r\n\r\n.editor-sidebar__close-button\r\n position: absolute\r\n right: -12px\r\n top: calc(50% - 12px)\r\n width: 24px\r\n height: 24px\r\n display: flex\r\n align-items: center\r\n justify-content: center\r\n padding: 0\r\n background-color: var(--text-secondary-color)\r\n color: white\r\n border: none\r\n border-radius: 9999px\r\n cursor: pointer\r\n z-index: 1\r\n opacity: 0.2\r\n &:hover\r\n opacity: 1\r\n\r\n &.right\r\n right: auto\r\n left: -12px\r\n\r\n &.fixed\r\n right: auto\r\n left: 20px\r\n z-index: 100\r\n position: fixed\r\n\r\n &.fixed.right\r\n left: auto\r\n right: 20px\r\n\r\n &.v-enter-active\r\n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1)\r\n transition-delay: 0.4s\r\n\r\n &.v-enter-from\r\n transform: translateX(-60px)\r\n\r\n &.right\r\n &.v-enter-from\r\n transform: translateX(60px)\r\n\r\n\r\n.editor-sidebar-left, .editor-sidebar-right\r\n &.v-enter-active, &.v-leave-active \r\n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1)\r\n\r\n.editor-sidebar-left\r\n &.v-enter-from, &.v-leave-to\r\n transform: translateX(-100%)\r\n\r\n.editor-sidebar-right\r\n &.v-enter-from, &.v-leave-to\r\n transform: translateX(100%)\r\n\r\n// .editor-hierarchy:hover .editor-sidebar__close-button\r\n// opacity: 1\r\n\r\n// .editor-blocks-sidebar:hover .editor-sidebar__close-button\r\n// opacity: 1\r\n\r\n</style>","import { createApp, reactive } from 'vue'\r\nimport EditorApp from './EditorApp.vue'\r\nimport { createDialogSystem } from '../../../common/components/VDialogProvider.vue'\r\nimport { unfoldSchema } from 'compact-json-schema'\r\nimport { passDefaultValue } from '../../../common/utils/passDefaultValue'\r\n\r\nconst mountDiv = document.createElement(\"div\")\r\nmountDiv.id = \"data-mechanics-editor\"\r\ndocument.body.append(mountDiv)\r\n\r\nconst dataEntries = reactive<any[]>([])\r\ndocument.addEventListener(\"DOMContentLoaded\", () => {\r\n createApp(EditorApp)\r\n .provide(\"dataEntries\", dataEntries)\r\n .use(createDialogSystem())\r\n .mount(mountDiv)\r\n})\r\n\r\n// @ts-ignore\r\nglobalThis._registerData = (dataEntry) => {\r\n dataEntry.props = unfoldSchema(dataEntry.props);\r\n const exists = dataEntries.find((item: any) => item.id === dataEntry.id)\r\n if (exists) {\r\n Object.assign(exists, dataEntry)\r\n } else {\r\n dataEntries.push(dataEntry)\r\n }\r\n}"],"names":["_createElementBlock","top","_openBlock","_hoisted_1","_createElementVNode","findParent","e","isEqual","data","request","args","_normalizeClass","_createTextVNode","_toDisplayString","_hoisted_2","_hoisted_3","_renderSlot","$slots","_hoisted_4","_createVNode","_Transition","_hoisted_5","tryOnScopeDispose","isClient","toString","isObject","noop","defaultWindow","unrefElement","toValue","useEventListener","window","document","getValue","_createBlock","VFormControl","large","multiline","label","required","disabled","item","VInput","_Fragment","_renderList","_unref","_hoisted_6","uid","schema","blocksMap","content","child","_TransitionGroup","_normalizeStyle","clamp","open","_Teleport","_mergeProps","$attrs","_useModel","VPopover","_withCtx","nullable","length","VCollapse","JsonEditor","_resolveDynamicComponent","component","flat","outline","offset","VButton","dialog","_withDirectives","_vShow","VDialog","ProjectImagesDialog","error","VContextMenu","props","VSelect","VCheckbox","__defProp","__defNormalProp","__publicField","events","listeners","_sfc_main$2","_sfc_main$1","TextEditor","_hoisted_7","el","RichTextEditorCode","_a","VImageUploader","RichTextEditorLinkPopover","RichTextEditorDialog","VFileUploader","VMultiSelect","VLinkEditor","VRichTextEditor","JsonEditorArray","VTabs","VTabsPages","BlocksList","blocksList","state","dragMode","index","_withModifiers","_normalizeProps","_guardReactiveProps","ContentHierarchy","hoverBlockId","activeBlockId","values","FormColumn","columns","VTable","dataEntries","_createSlots","CreatePageDialog","OpenPageDialog","PageSettingsDialog","_blocksList","HierarchySidebar","PageSelector","HoverFrame","InsertedPlace","BlocksEditor","VDialogProvider","EditorApp"],"mappings":"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","x_google_ignoreList":[4,5,6,7,8,9,10,11,12,13,14,17,18,47]}