main
夜笙歌 6 months ago
commit 43ec52f06f

24
.gitignore vendored

@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

@ -0,0 +1,3 @@
{
"recommendations": ["Vue.volar"]
}

@ -0,0 +1,5 @@
# Vue 3 + Vite
This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
Learn more about IDE Support for Vue in the [Vue Docs Scaling up Guide](https://vuejs.org/guide/scaling-up/tooling.html#ide-support).

@ -0,0 +1,13 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + Vue</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>

@ -0,0 +1,21 @@
{
"name": "airport",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"element-plus": "^2.10.4",
"@vitejs/plugin-basic-ssl": "^2.0.0",
"vue": "^3.5.17",
"vue-router": "4"
},
"devDependencies": {
"@vitejs/plugin-vue": "^6.0.0",
"vite": "^7.0.4"
}
}

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1,9 @@
<script setup>
</script>
<template>
<router-view />
</template>
<style scoped>
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>

After

Width:  |  Height:  |  Size: 496 B

@ -0,0 +1,397 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>刻度尺与内容区域对齐修复</title>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: #1a1c23;
color: #e0e0e0;
min-height: 100vh;
display: flex;
flex-direction: column;
padding: 20px;
line-height: 1.5;
}
.container {
position: relative;
width: 100%;
height: 70vh;
display: flex;
flex-direction: row;
background: #2d3039;
user-select: none;
overflow: hidden;
color: white;
margin: 0 auto;
border-radius: 8px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4);
max-width: 1000px;
}
.ruler.vertical {
width: 40px;
height: calc(100% - 40px);
border-right: 1px solid #555;
position: relative;
box-sizing: border-box;
background: #353741;
}
.ruler.vertical .ruler-content {
position: relative;
height: 100%;
}
.ruler.vertical .tick {
position: absolute;
right: 0;
border-bottom: 1px solid white;
opacity: 0.4;
}
.ruler.vertical .tick.major {
border-bottom: 2px solid white;
opacity: 1;
}
.ruler.vertical .label {
position: absolute;
font-size: 10px;
color: white;
background: rgba(53, 55, 65, 0.8);
padding: 0 2px;
}
.content-area {
position: relative;
height: 100%;
border-left: 1px solid #555;
border-bottom: 1px solid #555;
overflow: hidden;
flex-shrink: 0;
background: #353741;
}
.content-inner {
position: relative;
width: 100%;
height: 100%;
user-select: none;
background-image: linear-gradient(#3a3e4b 1px, transparent 1px),
linear-gradient(90deg, #3a3e4b 1px, transparent 1px);
background-size: 20px 20px;
}
.box {
position: absolute;
background: #00bfff;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
font-weight: bold;
color: white;
}
.ruler.horizontal {
height: 40px;
width: 100%;
position: absolute;
bottom: 0;
left: 40px;
border-top: 1px solid #555;
display: flex;
background: #353741;
}
.ruler.horizontal .ruler-content {
position: relative;
height: 100%;
flex: 1;
}
.ruler.horizontal .tick {
position: absolute;
top: 0;
border-left: 1px solid white;
opacity: 0.4;
}
.ruler.horizontal .tick.major {
border-left: 2px solid white;
opacity: 1;
}
.ruler.horizontal .label {
position: absolute;
font-size: 10px;
color: white;
background: rgba(53, 55, 65, 0.8);
padding: 2px 0;
}
.info {
max-width: 1000px;
margin: 20px auto 0;
background: rgba(40, 44, 52, 0.8);
border-radius: 8px;
padding: 15px;
font-size: 14px;
}
.info h3 {
color: #4fc3f7;
margin-bottom: 10px;
}
.info p {
margin-bottom: 10px;
}
.info code {
background: rgba(0, 0, 0, 0.2);
padding: 2px 6px;
border-radius: 4px;
font-family: monospace;
}
</style>
</head>
<body>
<div id="app">
<div class="container" ref="containerRef" @wheel.prevent="onWheel">
<!-- 左侧竖向刻度尺 -->
<div class="ruler vertical">
<div class="ruler-content" :style="{ height: contentHeight + 'px' }">
<template v-for="tick in verticalTicks" :key="'v-' + tick.index">
<div
class="tick"
:class="{ major: tick.isMajor }"
:style="{
bottom: tick.pos + 'px',
width: tick.isMajor ? '15px' : '7px',
right: 0,
}"
>
<span
v-if="tick.isMajor"
class="label"
:style="{ right: '18px', bottom: '-6px' }"
>
{{ tick.label }}
</span>
</div>
</template>
</div>
</div>
<!-- 右边内容区 -->
<div
class="content-area"
:style="{
width: contentWidth + 'px',
height: contentHeight + 'px',
}"
>
<div
class="content-inner"
:style="{
transform: `translate(${offsetX}px, ${offsetY}px) scale(${scale})`,
transformOrigin: 'top left',
width: contentWidth + 'px',
height: contentHeight + 'px',
position: 'relative',
}"
>
<div
class="box"
:style="{
width: boxSize + 'px',
height: boxSize + 'px',
left: boxPos.x + 'px',
bottom: boxPos.y + 'px',
}"
>
Box
</div>
</div>
</div>
<!-- 下方横向刻度尺 -->
<div class="ruler horizontal" :style="{ width: contentWidth + 'px' }">
<div class="ruler-content" :style="{ width: contentWidth + 'px' }">
<template v-for="tick in horizontalTicks" :key="'h-' + tick.index">
<div
class="tick"
:class="{ major: tick.isMajor }"
:style="{
left: tick.pos + 'px',
height: tick.isMajor ? '15px' : '7px',
bottom: 0,
}"
>
<span
v-if="tick.isMajor"
class="label"
:style="{ bottom: '18px', left: '-6px' }"
>
{{ tick.label }}
</span>
</div>
</template>
</div>
</div>
</div>
<div class="info">
<h3>修复说明</h3>
<p>问题已修复:刻度尺现在会随缩放和平移正确更新位置。</p>
<p>关键修改:</p>
<p>1. 在 <code>generateTicks</code> 函数中增加了偏移量计算:<code>const visibleStart = -offset / currentScale</code>
</p>
<p>2. 使用公式 <code>(pos - visibleStart) * currentScale</code> 计算刻度位置</p>
<p>3. 只生成可见范围内的刻度以提高性能</p>
<p>使用鼠标滚轮在内容区域缩放,观察刻度尺变化。</p>
</div>
</div>
<script>
const {createApp, ref, computed, onMounted, watch} = Vue;
createApp({
setup() {
const boxSize = 80;
const minScale = 0.5;
const maxScale = 3;
const rulerSize = 40;
const scale = ref(1);
const containerRef = ref(null);
const offsetX = ref(0);
const offsetY = ref(0);
const containerWidth = ref(0);
const containerHeight = ref(0);
const boxPos = ref({x: 300, y: 200});
function updateContainerSize() {
if (containerRef.value) {
containerWidth.value = containerRef.value.clientWidth;
containerHeight.value = containerRef.value.clientHeight;
}
}
onMounted(() => {
updateContainerSize();
window.addEventListener("resize", updateContainerSize);
});
watch(containerRef, updateContainerSize);
const contentWidth = computed(() => containerWidth.value - rulerSize);
const contentHeight = computed(() => containerHeight.value - rulerSize);
// 获取当前 box 中心在缩放前的位置(基于 scale
function getBoxCenterPos(s) {
const x = boxPos.value.x + boxSize / 2;
const y = boxPos.value.y + boxSize / 2;
const viewX = x * s + offsetX.value;
const viewY = (contentHeight.value - y) * s + offsetY.value;
return {x: viewX, y: viewY};
}
function onWheel(e) {
const oldScale = scale.value;
const direction = e.deltaY < 0 ? 1 : -1;
const step = 0.1;
let newScale = oldScale + direction * step;
newScale = Math.max(minScale, Math.min(maxScale, newScale));
if (newScale === oldScale) return;
const oldCenter = getBoxCenterPos(oldScale);
scale.value = newScale;
const newCenter = getBoxCenterPos(newScale);
offsetX.value += oldCenter.x - newCenter.x;
offsetY.value += oldCenter.y - newCenter.y;
}
// 修复后的刻度生成函数
function generateTicks(length, offset, currentScale) {
const ticks = [];
// 计算当前视口在原始坐标系中的可见范围
const visibleStart = -offset / currentScale;
const visibleEnd = visibleStart + length / currentScale;
const baseMajorTickSize = 40;
const baseMinorTicks = 5;
const majorTickSpacing = baseMajorTickSize;
const minorTickSpacing = majorTickSpacing / baseMinorTicks;
// 找到第一个主刻度
let firstMajor = Math.floor(visibleStart / majorTickSpacing) * majorTickSpacing;
if (firstMajor < visibleStart) {
firstMajor += majorTickSpacing;
}
// 生成可见范围内的刻度
for (let pos = firstMajor; pos <= visibleEnd; pos += minorTickSpacing) {
const isMajor = Math.abs(pos % majorTickSpacing) < 0.1;
// 计算刻度在视图中的位置
const tickPos = (pos - visibleStart) * currentScale;
// 只添加在可见范围内的刻度
if (tickPos >= -20 && tickPos <= length + 20) {
ticks.push({
pos: tickPos,
isMajor,
label: Math.round(pos),
index: pos
});
}
}
return ticks;
}
const verticalTicks = computed(() =>
generateTicks(contentHeight.value, offsetY.value, scale.value)
);
const horizontalTicks = computed(() =>
generateTicks(contentWidth.value, offsetX.value, scale.value)
);
return {
containerRef,
onWheel,
scale,
offsetX,
offsetY,
contentWidth,
contentHeight,
verticalTicks,
horizontalTicks,
boxSize,
boxPos
};
}
}).mount('#app');
</script>
</body>
</html>

@ -0,0 +1,305 @@
<template>
<!-- <div class="container" ref="containerRef" @wheel.prevent="onWheel">-->
<div class="container" ref="containerRef">
<div class="leftLine"></div>
<!-- 左侧竖向刻度尺 -->
<div class="ruler vertical" :style="{ backgroundColor: bgColor }">
<div class="ruler-content" :style="{ height: contentHeight + 'px' ,transform: 'rotate(180deg)'}">
<template v-for="tick in verticalTicks" :key="'v-' + tick.index">
<div
class="tick"
:class="{ major: tick.isMajor }"
:style="{
bottom: tick.pos + 'px',
width: tick.isMajor ? '15px' : '7px',
right: 0,
}"
>
<span
v-if="tick.isMajor"
class="label"
:style="{ right: '18px', bottom: '-6px',transform: 'rotate(180deg)' }"
>
{{ tick.label }}
</span>
</div>
</template>
</div>
</div>
<!-- 内容区 -->
<div
class="content-area"
:style="{
width: contentWidth + 'px',
height: contentHeight + 'px',
backgroundColor: bgColor,
}"
>
<div
class="content-inner"
:style="{
transform: `translate(${offsetX}px, ${offsetY}px) scale(${scale})`,
transformOrigin: 'top left',
}"
>
<div
class="box"
:style="{
width: boxSize + 'px',
height: boxSize + 'px',
left: boxPos.x + 'px',
top: contentHeight - boxPos.y - boxSize + 'px',
transform: `rotate(${boxPos.rotate}deg)`
}"
></div>
</div>
</div>
<!-- 下方横向刻度尺 -->
<div
class="ruler horizontal"
:style="{ backgroundColor: bgColor, width: contentWidth + 'px' }"
>
<div class="ruler-content" :style="{ width: contentWidth + 'px' }">
<template v-for="tick in horizontalTicks" :key="'h-' + tick.index">
<div
class="tick"
:class="{ major: tick.isMajor }"
:style="{
left: tick.pos + 'px',
height: tick.isMajor ? '15px' : '7px',
top: 0,
}"
>
<span
v-if="tick.isMajor"
class="label"
:style="{ top: '18px', left: '-6px' }"
>
{{ tick.label }}
</span>
</div>
</template>
</div>
</div>
</div>
</template>
<script setup>
import {ref, computed, onMounted, watch} from 'vue'
const props = defineProps({
boxPos: {
type: Object,
default: () => ({x: 200, y: 300}),
},
})
const boxPos = ref({x: 200, y: 300, rotate: -45})
setInterval(() => {
boxPos.value.x += (-10 + (Math.random() * 20))
boxPos.value.y += (-10 + (Math.random() * 20))
boxPos.value.rotate += (-5 + (Math.random() * 10))
}, 1000)
const boxSize = 30
const minScale = 1
const maxScale = 3
const scale = ref(1)
const offsetX = ref(0)
const offsetY = ref(0)
const contentWidth = computed(() => containerWidth.value - rulerSize)
const contentHeight = computed(() => containerHeight.value - rulerSize)
const bgColor = '#353741'
function updateContainerSize() {
if (containerRef.value) {
containerWidth.value = containerRef.value.clientWidth
containerHeight.value = containerRef.value.clientHeight
}
}
onMounted(() => {
updateContainerSize()
window.addEventListener('resize', updateContainerSize)
})
watch(
() => containerRef.value,
(el) => {
if (el) updateContainerSize()
}
)
// box
function getBoxCenterPos(s) {
const x = boxPos.value.x * s + (boxSize * s) / 2
const y = (contentHeight.value - boxPos.value.y - boxSize / 2) * s
return {x, y}
}
//
function onWheel(e) {
const oldScale = scale.value
const direction = e.deltaY < 0 ? 1 : -1
const step = 0.1
let newScale = oldScale + direction * step
newScale = Math.max(minScale, Math.min(maxScale, newScale))
if (newScale === oldScale) return
const oldCenter = getBoxCenterPos(oldScale)
const newCenter = getBoxCenterPos(newScale)
offsetX.value += oldCenter.x - newCenter.x
offsetY.value += oldCenter.y - newCenter.y
scale.value = newScale
}
//
const baseMajorTickSize = 100
const baseMinorTicks = 10
const majorTickSpacing = computed(() => baseMajorTickSize * scale.value)
const minorTickSpacing = computed(() => majorTickSpacing.value / baseMinorTicks)
function generateTicks(length, offset, isVertical = false) {
const spacing = minorTickSpacing.value
const ticks = []
const startIndex = Math.floor(-offset / spacing)
const endIndex = Math.ceil((length - offset) / spacing)
for (let i = startIndex; i <= endIndex; i++) {
const rawPos = i * spacing + offset
const pos = isVertical ? length - rawPos : rawPos
const isMajor = i % baseMinorTicks === 0
ticks.push({
index: i,
pos,
isMajor,
label: isMajor ? i * (baseMajorTickSize / baseMinorTicks) : null,
})
}
return ticks
}
const horizontalTicks = computed(() =>
generateTicks(contentWidth.value, offsetX.value)
)
const verticalTicks = computed(() =>
generateTicks(contentHeight.value, offsetY.value, true)
)
</script>
<style scoped>
.container {
position: relative;
width: 100%;
height: 100%;
display: flex;
flex-direction: row;
background: #353741;
user-select: none;
overflow: hidden;
color: white;
}
/* 竖向刻度尺 */
.ruler.vertical {
width: 40px;
height: calc(100% - 40px);
position: relative;
border-right: 1px solid #666;
}
.ruler.horizontal {
height: 40px;
width: 100%;
position: absolute;
bottom: 0;
left: 40px;
border-top: 1px solid #666;
}
.content-area {
position: relative;
height: 100%;
overflow: hidden;
flex-shrink: 0;
border-left: 1px solid #666;
border-bottom: 1px solid #666;
}
.content-inner {
position: absolute;
width: 100%;
height: 100%;
}
.box {
position: absolute;
background-image: url("../assets/car.png");
background-repeat: no-repeat;
background-size: 100% 100%;
transition: all 1s ease;
}
.tick {
position: absolute;
opacity: 0.4;
pointer-events: none;
}
.tick.major {
opacity: 1;
}
.ruler.vertical .tick {
border-top: 1px solid white;
}
.ruler.vertical .tick.major {
border-top: 2px solid white;
}
.ruler.vertical .label {
position: absolute;
font-size: 10px;
bottom: -6px;
right: 18px;
}
.ruler.horizontal .tick {
border-left: 1px solid white;
}
.ruler.horizontal .tick.major {
border-left: 2px solid white;
}
.ruler.horizontal .label {
position: absolute;
font-size: 10px;
top: 18px;
left: -6px;
}
.ruler-content {
position: relative;
}
.leftLine {
position: absolute;
top: 0;
left: 20%;
width: 1px;
height: calc(100% - 40px);
border-right: 3px dashed white;
z-index: 9999;
}
</style>

@ -0,0 +1,293 @@
<template>
<!-- <div class="container" ref="containerRef" @wheel.prevent="onWheel">-->
<div class="container" ref="containerRef">
<!-- 左侧竖向刻度尺 -->
<div class="ruler vertical" :style="{ backgroundColor: bgColor }">
<div class="ruler-content" :style="{ height: contentHeight + 'px' ,transform: 'rotate(180deg)'}">
<template v-for="tick in verticalTicks" :key="'v-' + tick.index">
<div
class="tick"
:class="{ major: tick.isMajor }"
:style="{
bottom: tick.pos + 'px',
width: tick.isMajor ? '15px' : '7px',
right: 0,
}"
>
<span
v-if="tick.isMajor"
class="label"
:style="{ right: '18px', bottom: '-6px',transform: 'rotate(180deg)' }"
>
{{ tick.label }}
</span>
</div>
</template>
</div>
</div>
<!-- 内容区 -->
<div
class="content-area"
:style="{
width: contentWidth + 'px',
height: contentHeight + 'px',
backgroundColor: bgColor,
}"
>
<div
class="content-inner"
:style="{
transform: `translate(${offsetX}px, ${offsetY}px) scale(${scale})`,
transformOrigin: 'top left',
}"
>
<div
class="box"
:style="{
width: boxSize + 'px',
height: boxSize + 'px',
left: boxPos.x + 'px',
top: contentHeight - boxPos.y - boxSize + 'px',
}"
></div>
</div>
</div>
<!-- 下方横向刻度尺 -->
<div
class="ruler horizontal"
:style="{ backgroundColor: bgColor, width: contentWidth + 'px' }"
>
<div class="ruler-content" :style="{ width: contentWidth + 'px' }">
<template v-for="tick in horizontalTicks" :key="'h-' + tick.index">
<div
class="tick"
:class="{ major: tick.isMajor }"
:style="{
left: tick.pos + 'px',
height: tick.isMajor ? '15px' : '7px',
top: 0,
}"
>
<span
v-if="tick.isMajor"
class="label"
:style="{ top: '18px', left: '-6px' }"
>
{{ tick.label }}
</span>
</div>
</template>
</div>
</div>
</div>
</template>
<script setup>
import {ref, computed, onMounted, watch} from 'vue'
const props = defineProps({
boxPos: {
type: Object,
default: () => ({x: 200, y: 300}),
},
})
const boxPos = ref({x: 200, y: 300})
// setInterval(() => {
// boxPos.value.x += (-10 + (Math.random() * 20))
// boxPos.value.y += (-10 + (Math.random() * 20))
// }, 100)
const boxSize = 30
const minScale = 1
const maxScale = 3
const scale = ref(1)
const offsetX = ref(0)
const offsetY = ref(0)
const containerRef = ref(null)
const rulerSize = 40
const containerWidth = ref(0)
const containerHeight = ref(0)
const contentWidth = computed(() => containerWidth.value - rulerSize)
const contentHeight = computed(() => containerHeight.value - rulerSize)
const bgColor = '#353741'
function updateContainerSize() {
if (containerRef.value) {
containerWidth.value = containerRef.value.clientWidth
containerHeight.value = containerRef.value.clientHeight
}
}
onMounted(() => {
updateContainerSize()
window.addEventListener('resize', updateContainerSize)
})
watch(
() => containerRef.value,
(el) => {
if (el) updateContainerSize()
}
)
// box
function getBoxCenterPos(s) {
const x = boxPos.value.x * s + (boxSize * s) / 2
const y = (contentHeight.value - boxPos.value.y - boxSize / 2) * s
return {x, y}
}
//
function onWheel(e) {
const oldScale = scale.value
const direction = e.deltaY < 0 ? 1 : -1
const step = 0.1
let newScale = oldScale + direction * step
newScale = Math.max(minScale, Math.min(maxScale, newScale))
if (newScale === oldScale) return
const oldCenter = getBoxCenterPos(oldScale)
const newCenter = getBoxCenterPos(newScale)
offsetX.value += oldCenter.x - newCenter.x
offsetY.value += oldCenter.y - newCenter.y
scale.value = newScale
}
//
const baseMajorTickSize = 100
const baseMinorTicks = 10
const majorTickSpacing = computed(() => baseMajorTickSize * scale.value)
const minorTickSpacing = computed(() => majorTickSpacing.value / baseMinorTicks)
function generateTicks(length, offset, isVertical = false) {
const spacing = minorTickSpacing.value
const ticks = []
const startIndex = Math.floor(-offset / spacing)
const endIndex = Math.ceil((length - offset) / spacing)
for (let i = startIndex; i <= endIndex; i++) {
const rawPos = i * spacing + offset
const pos = isVertical ? length - rawPos : rawPos
const isMajor = i % baseMinorTicks === 0
ticks.push({
index: i,
pos,
isMajor,
label: isMajor ? i * (baseMajorTickSize / baseMinorTicks) : null,
})
}
return ticks
}
const horizontalTicks = computed(() =>
generateTicks(contentWidth.value, offsetX.value)
)
const verticalTicks = computed(() =>
generateTicks(contentHeight.value, offsetY.value, true)
)
</script>
<style scoped>
.container {
position: relative;
width: 100%;
height: 100%;
display: flex;
flex-direction: row;
background: #353741;
user-select: none;
overflow: hidden;
color: white;
}
/* 竖向刻度尺 */
.ruler.vertical {
width: 40px;
height: calc(100% - 40px);
position: relative;
border-right: 1px solid #666;
}
.ruler.horizontal {
height: 40px;
width: 100%;
position: absolute;
bottom: 0;
left: 40px;
border-top: 1px solid #666;
}
.content-area {
position: relative;
height: 100%;
overflow: hidden;
flex-shrink: 0;
border-left: 1px solid #666;
border-bottom: 1px solid #666;
}
.content-inner {
position: absolute;
width: 100%;
height: 100%;
}
.box {
position: absolute;
background-color: #00bfff;
border-radius: 3px;
}
.tick {
position: absolute;
opacity: 0.4;
pointer-events: none;
}
.tick.major {
opacity: 1;
}
.ruler.vertical .tick {
border-top: 1px solid white;
}
.ruler.vertical .tick.major {
border-top: 2px solid white;
}
.ruler.vertical .label {
position: absolute;
font-size: 10px;
bottom: -6px;
right: 18px;
}
.ruler.horizontal .tick {
border-left: 1px solid white;
}
.ruler.horizontal .tick.major {
border-left: 2px solid white;
}
.ruler.horizontal .label {
position: absolute;
font-size: 10px;
top: 18px;
left: -6px;
}
.ruler-content {
position: relative;
}
</style>

@ -0,0 +1,15 @@
import {createApp} from 'vue'
import './style.css'
import App from './App.vue'
import router from './router';
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
const app = createApp(App);
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
app.component(key, component)
}
app.use(router);
app.use(ElementPlus)
app.mount('#app')

@ -0,0 +1,18 @@
import {createWebHistory, createRouter, RouteRecordRaw} from 'vue-router';
// 公共路由
export const constantRoutes: RouteRecordRaw[] = [
{path: '/', component: () => import('@/views/index.vue')},
];
/**
*
*/
const router = createRouter({
history: createWebHistory(),
routes: constantRoutes,
});
export default router;

@ -0,0 +1,83 @@
:root {
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
line-height: 1.5;
font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
background-color: #242424;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
a {
font-weight: 500;
color: #646cff;
text-decoration: inherit;
}
a:hover {
color: #535bf2;
}
body {
margin: 0;
display: flex;
place-items: center;
min-width: 320px;
min-height: 100vh;
}
h1 {
font-size: 3.2em;
line-height: 1.1;
}
button {
border-radius: 8px;
border: 1px solid transparent;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
background-color: #1a1a1a;
cursor: pointer;
transition: border-color 0.25s;
}
button:hover {
border-color: #646cff;
}
button:focus,
button:focus-visible {
outline: 4px auto -webkit-focus-ring-color;
}
.card {
padding: 2em;
}
#app {
max-width: 1280px;
margin: 0 auto;
padding: 2rem;
}
@media (prefers-color-scheme: light) {
:root {
color: #213547;
background-color: #ffffff;
}
a:hover {
color: #747bff;
}
button {
background-color: #f9f9f9;
}
}

@ -0,0 +1,435 @@
<template>
<div class="app-container">
<div class="top">
<div class="title">探测系统</div>
<div class="items">
<div @click="setItemsId(1)" :class="{click:itemsId === 1}" class="item">
<span>
主界面
</span>
</div>
<div @click="setItemsId(2)" :class="{click:itemsId === 2}" class="item"><span>
区域标定
</span></div>
<div @click="setItemsId(3)" :class="{click:itemsId === 3}" class="item"><span>
软件设置
</span></div>
<div @click="setItemsId(4)" :class="{click:itemsId === 4}" class="item"><span>
历史记录
</span></div>
<!-- <div class="item">视频接口</div>-->
</div>
</div>
<div class="left">
<Ruler/>
</div>
<div class="right">
<div v-if="itemsId === 1" class="tabsItem">
<el-card shadow="always">
<el-form :inline="true" :model="form1" class="demo-form-inline">
<el-form-item>
<el-select
v-model="form1.region"
placeholder="请选择机场名称"
style="width: 200px"
clearable
>
<el-option label="机场1" value="shanghai"/>
<el-option label="机场2" value="beijing"/>
</el-select>
</el-form-item>
<el-form-item>
<el-select
v-model="form1.region1"
placeholder="请选择区域名称"
style="width: 200px"
clearable
>
<el-option label="区域1" value="shanghai"/>
<el-option label="区域2" value="beijing"/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit"></el-button>
</el-form-item>
</el-form>
</el-card>
<el-card shadow="always" style="margin-top: 12px;">
<div
style="width:calc( 50% - 50px);position: relative;border-radius: 5px;background-color: #01CE69;height: 44px;display: inline-block;padding:0 20px;margin-right: 20px;">
<span
style="position:absolute;top: 50%;transform: translateY(-50%);left:20%;color: #fff;letter-spacing: 2px">雷达通讯状态</span>
<el-icon size="20px" style="position:absolute;top: 50%;transform: translateY(-50%);right: 40px">
<SuccessFilled color="#fff"/>
</el-icon>
</div>
<div
style="width:calc( 50% - 50px);position: relative;border-radius: 5px;background-color: #E8370D;height: 44px;display: inline-block;padding:0 20px;">
<span
style="position:absolute;top: 50%;transform: translateY(-50%);left:20%;color: #fff;letter-spacing: 2px">雷达通讯状态</span>
<el-icon size="20px" style="position:absolute;top: 50%;transform: translateY(-50%);right: 40px">
<WarningFilled color="#fff"/>
</el-icon>
</div>
<div
style="margin-top: 12px;width:calc( 50% - 50px);position: relative;border-radius: 5px;background-color: #01CE69;height: 44px;display: inline-block;padding:0 20px;margin-right: 20px;">
<span
style="position:absolute;top: 50%;transform: translateY(-50%);left:20%;color: #fff;letter-spacing: 2px">雷达通讯状态</span>
<el-icon size="20px" style="position:absolute;top: 50%;transform: translateY(-50%);right: 40px">
<SuccessFilled color="#fff"/>
</el-icon>
</div>
<div
style="margin-top: 12px;width:calc( 50% - 50px);position: relative;border-radius: 5px;background-color: #01CE69;height: 44px;display: inline-block;padding:0 20px;">
<span
style="position:absolute;top: 50%;transform: translateY(-50%);left:20%;color: #fff;letter-spacing: 2px">雷达通讯状态</span>
<el-icon size="20px" style="position:absolute;top: 50%;transform: translateY(-50%);right: 40px">
<SuccessFilled color="#fff"/>
</el-icon>
</div>
</el-card>
<el-card shadow="always" style="margin-top: 12px;">
<el-form :inline="true" :model="form2" class="demo-form-inline">
<el-form-item>
<el-date-picker
v-model="form2.date"
type="date"
placeholder="选择时间"
clearable
/>
</el-form-item>
<el-form-item>
<el-button @click="onSubmit"></el-button>
<el-button type="primary" @click="onSubmit"></el-button>
</el-form-item>
</el-form>
<el-table :data="tableData1" style="width: 100%">
<el-table-column type="selection" width="55"/>
<el-table-column label="序号" type="index" width="60"/>
<el-table-column property="coordinate" label="目标坐标" width="120"/>
<el-table-column label="告警等级" width="160">
<template #default="scope">
<el-rate v-model="scope.row.rate" disabled/>
</template>
</el-table-column>
<el-table-column
label="处理状态"
show-overflow-tooltip>
<template #default="scope">
<el-button type="primary" link>已处理</el-button>
<el-button type="primary" link>不处理</el-button>
<el-button type="primary" link>未发现</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<el-card shadow="always" style="margin-top: 12px;">
<el-table :data="tableData2" style="width: 100%">
<el-table-column label="序号" type="index" width="60"/>
<el-table-column property="coordinate" label="目标坐标" width="120"/>
<el-table-column label="告警等级" width="160">
<template #default="scope">
<el-rate v-model="scope.row.rate" disabled/>
</template>
</el-table-column>
<el-table-column
label="处理状态"
show-overflow-tooltip>
<template #default="scope">
<span v-if="scope.row.type === 1"></span>
<span v-if="scope.row.type === 2"></span>
<span v-if="scope.row.type === 3"></span>
</template>
</el-table-column>
<el-table-column label="其他操作" width="160">
<template #default="scope">
<el-input v-model="scope.row.notes" placeholder="详细信息填写"/>
</template>
</el-table-column>
</el-table>
</el-card>
</div>
<div v-if="itemsId === 2" class="tabsItem">
<el-card shadow="always">
<el-form :inline="true" :model="form5" class="demo-form-inline">
<el-form-item>
<el-input v-model="form5.region" style="width: 200px" placeholder="请输入机场名称"/>
</el-form-item>
<el-form-item>
<el-input v-model="form5.region1" style="width: 200px" placeholder="请输入区域名称"/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit"></el-button>
</el-form-item>
</el-form>
<el-form :inline="true" :model="form6" class="demo-form-inline">
<el-form-item>
<el-select
v-model="form6.region"
placeholder="请选择机场名称"
style="width: 200px"
clearable
>
<el-option label="机场1" value="shanghai"/>
<el-option label="机场2" value="beijing"/>
</el-select>
</el-form-item>
<el-form-item>
<el-select
v-model="form6.region1"
placeholder="请选择区域名称"
style="width: 200px"
clearable
>
<el-option label="区域1" value="shanghai"/>
<el-option label="区域2" value="beijing"/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit"></el-button>
</el-form-item>
</el-form>
</el-card>
<el-card shadow="always" style="margin-top: 12px;">
<div v-for="i in list" style="margin-bottom: 12px;">
<el-input disabled v-model="i.value1" style="width: 200px"/>
<el-input disabled v-model="i.value2" style="width: 200px;margin-left: 20px;"/>
<el-button type="primary" @click="onSubmit" style=" margin-left: 20px;">获取</el-button>
</div>
</el-card>
<div style="text-align: center;margin-top: 12px;">
<el-button type="primary" @click="onSubmit" style=" margin-left: 20px;">提交</el-button>
</div>
</div>
<div v-if="itemsId === 3" class="tabsItem">
</div>
<div v-if="itemsId === 4" class="tabsItem">
<el-card shadow="always">
<el-date-picker
style="width: calc(100% - 20px)"
v-model="date1"
type="datetimerange"
range-separator="到"
start-placeholder="选择开始时间"
end-placeholder="选择结束时间"
/>
</el-card>
<el-card shadow="always" style="margin-top: 12px;">
<el-form :inline="true" :model="form3" class="demo-form-inline">
<el-form-item>
<el-select
v-model="form3.region"
placeholder="请选择机场名称"
style="width: 170px"
clearable
>
<el-option label="机场1" value="shanghai"/>
<el-option label="机场2" value="beijing"/>
</el-select>
</el-form-item>
<el-form-item>
<el-select
v-model="form3.region1"
placeholder="请选择区域名称"
style="width: 170px"
clearable
>
<el-option label="区域1" value="shanghai"/>
<el-option label="区域2" value="beijing"/>
</el-select>
</el-form-item>
<el-form-item>
<el-select
v-model="form3.region2"
placeholder="请选择固定目标"
style="width: 170px"
clearable
>
<el-option label="目标1" value="shanghai"/>
<el-option label="目标2" value="beijing"/>
</el-select>
</el-form-item>
</el-form>
</el-card>
<el-card shadow="always" style="margin-top: 12px;">
<el-form :inline="true" :model="form4" class="demo-form-inline">
<el-form-item>
<el-input v-model="form4.input1" style="width: 170px" placeholder="请输入检测序号"/>
</el-form-item>
<el-form-item>
<el-date-picker
v-model="form4.date1"
type="date"
style="width: 170px"
placeholder="选择检测时间"
clearable
/>
</el-form-item>
<el-form-item>
<el-input v-model="form4.input2" style="width: 170px" placeholder="请输入检测人员"/>
</el-form-item>
</el-form>
</el-card>
<el-card shadow="always" style="margin-top: 12px;">
<el-table :data="tableData2" style="width: 100%">
<el-table-column label="序号" type="index" width="60"/>
<el-table-column property="coordinate" label="目标坐标" width="120"/>
<el-table-column label="告警等级" width="160">
<template #default="scope">
<el-rate v-model="scope.row.rate" disabled/>
</template>
</el-table-column>
<el-table-column
label="处理状态"
show-overflow-tooltip>
<template #default="scope">
<span v-if="scope.row.type === 1"></span>
<span v-if="scope.row.type === 2"></span>
<span v-if="scope.row.type === 3"></span>
</template>
</el-table-column>
</el-table>
</el-card>
</div>
<div v-if="itemsId === 5" class="tabsItem">
</div>
</div>
</div>
</template>
<script setup>
import Ruler from "@/components/ruler.vue";
import {ref} from "vue";
const list = ref([
{
value1: '点位1',
value2: '经纬度:(528,11)'
},
{
value1: '点位1',
value2: '经纬度:(528,11)'
},
{
value1: '点位1',
value2: '经纬度:(528,11)'
},
])
const itemsId = ref(1)
const form1 = ref({})
const form2 = ref({})
const form3 = ref({})
const form4 = ref({})
const form5 = ref({})
const form6 = ref({})
const tableData1 = ref([
{
coordinate: '528,11',
rate: 2
},
{
coordinate: '528,11',
rate: 2
},
{
coordinate: '528,11',
rate: 2
},
{
coordinate: '528,11',
rate: 2
},
{
coordinate: '528,11',
rate: 2
},
{
coordinate: '528,11',
rate: 2
},
])
const tableData2 = ref([
{
coordinate: '528,11',
rate: 2,
type: 1
},
])
const date1 = ref([])
const setItemsId = (e) => {
itemsId.value = e
}
</script>
<style>
.app-container {
width: 1080px;
height: 1920px;
margin: 0 auto;
border: 1px solid #888888;
}
.top {
width: 100%;
height: 80px;
font-size: 24px;
background-color: #202227;
position: relative;
}
.items {
position: absolute;
top: 15%;
left: 50%;
transform: translateX(-50%);
white-space: nowrap;
}
.item {
display: inline-block;
width: 120px;
height: 100%;
color: #8C9A9C;
line-height: 56px;
cursor: pointer;
font-size: 18px;
font-weight: 600;
letter-spacing: 2px;
}
.item span {
display: inline-block;
height: 100%;
}
.item.click span, .item:hover span {
color: #0D52BF;
border-bottom: 2px solid #0D52BF;
}
.title {
line-height: 80px;
color: #fff;
margin-left: 20px;
display: inline-block;
text-align: left;
}
.left {
display: inline-block;
height: 1840px;
width: 380px;
vertical-align: top;
}
.right {
display: inline-block;
height: 1800px;
width: 660px;
padding: 20px;
background-color: #F6F7FB;
}
</style>

@ -0,0 +1,32 @@
{
"compilerOptions": {
"target": "esnext",
"module": "esnext",
// "useDefineForClassFields": true,
"moduleResolution": "node",
"strict": true,
"jsx": "preserve",
"strictNullChecks": false,
"sourceMap": true,
"resolveJsonModule": true,
"esModuleInterop": true,
"strictFunctionTypes": false,
"lib": ["esnext", "dom"],
"noImplicitAny": false,
"allowJs": true,
"experimentalDecorators": true,
"baseUrl": "./",
"paths": {
"@/*": ["./src/*"],
"@": ["./src"]
},
"types": ["vite/client"],
"skipLibCheck": true,
"removeComments": true,
//
"allowSyntheticDefaultImports": true,
"forceConsistentCasingInFileNames": true
},
"include": ["src/**/*.ts", "src/**/*.vue", "src/types/**/*.d.ts", "vite.config.ts"],
"exclude": ["node_modules", "dist", "**/*.js", "**/*.md", "src/**/*.md"]
}

@ -0,0 +1,13 @@
import {defineConfig} from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path';
import basicSsl from '@vitejs/plugin-basic-ssl';
// https://vite.dev/config/
export default defineConfig({
plugins: [vue(), basicSsl()], resolve: {
alias: {
'~': path.resolve(__dirname, './'), '@': path.resolve(__dirname, 'src')
}, extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
},
})

@ -0,0 +1,672 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@babel/helper-string-parser@^7.27.1":
version "7.27.1"
resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687"
integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==
"@babel/helper-validator-identifier@^7.27.1":
version "7.27.1"
resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8"
integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==
"@babel/parser@^7.28.0":
version "7.28.0"
resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.0.tgz#979829fbab51a29e13901e5a80713dbcb840825e"
integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==
dependencies:
"@babel/types" "^7.28.0"
"@babel/types@^7.28.0":
version "7.28.2"
resolved "https://registry.npmmirror.com/@babel/types/-/types-7.28.2.tgz#da9db0856a9a88e0a13b019881d7513588cf712b"
integrity sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==
dependencies:
"@babel/helper-string-parser" "^7.27.1"
"@babel/helper-validator-identifier" "^7.27.1"
"@ctrl/tinycolor@^3.4.1":
version "3.6.1"
resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz#b6c75a56a1947cc916ea058772d666a2c8932f31"
integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==
"@element-plus/icons-vue@^2.3.1":
version "2.3.1"
resolved "https://registry.yarnpkg.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz#1f635ad5fdd5c85ed936481525570e82b5a8307a"
integrity sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==
"@esbuild/aix-ppc64@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz#a1414903bb38027382f85f03dda6065056757727"
integrity sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==
"@esbuild/android-arm64@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz#c859994089e9767224269884061f89dae6fb51c6"
integrity sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==
"@esbuild/android-arm@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.8.tgz#96a8f2ca91c6cd29ea90b1af79d83761c8ba0059"
integrity sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==
"@esbuild/android-x64@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.8.tgz#a3a626c4fec4a024a9fa8c7679c39996e92916f0"
integrity sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==
"@esbuild/darwin-arm64@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz#a5e1252ca2983d566af1c0ea39aded65736fc66d"
integrity sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==
"@esbuild/darwin-x64@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz#5271b0df2bb12ce8df886704bfdd1c7cc01385d2"
integrity sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==
"@esbuild/freebsd-arm64@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz#d0a0e7fdf19733b8bb1566b81df1aa0bb7e46ada"
integrity sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==
"@esbuild/freebsd-x64@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz#2de8b2e0899d08f1cb1ef3128e159616e7e85343"
integrity sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==
"@esbuild/linux-arm64@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz#a4209efadc0c2975716458484a4e90c237c48ae9"
integrity sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==
"@esbuild/linux-arm@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz#ccd9e291c24cd8d9142d819d463e2e7200d25b19"
integrity sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==
"@esbuild/linux-ia32@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz#006ad1536d0c2b28fb3a1cf0b53bcb85aaf92c4d"
integrity sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==
"@esbuild/linux-loong64@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz#127b3fbfb2c2e08b1397e985932f718f09a8f5c4"
integrity sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==
"@esbuild/linux-mips64el@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz#837d1449517791e3fa7d82675a2d06d9f56cb340"
integrity sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==
"@esbuild/linux-ppc64@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz#aa2e3bd93ab8df084212f1895ca4b03c42d9e0fe"
integrity sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==
"@esbuild/linux-riscv64@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz#a340620e31093fef72767dd28ab04214b3442083"
integrity sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==
"@esbuild/linux-s390x@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz#ddfed266c8c13f5efb3105a0cd47f6dcd0e79e71"
integrity sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==
"@esbuild/linux-x64@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz#9a4f78c75c051e8c060183ebb39a269ba936a2ac"
integrity sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==
"@esbuild/netbsd-arm64@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz#902c80e1d678047926387230bc037e63e00697d0"
integrity sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==
"@esbuild/netbsd-x64@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz#2d9eb4692add2681ff05a14ce99de54fbed7079c"
integrity sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==
"@esbuild/openbsd-arm64@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz#89c3b998c6de739db38ab7fb71a8a76b3fa84a45"
integrity sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==
"@esbuild/openbsd-x64@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz#2f01615cf472b0e48c077045cfd96b5c149365cc"
integrity sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==
"@esbuild/openharmony-arm64@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz#a201f720cd2c3ebf9a6033fcc3feb069a54b509a"
integrity sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==
"@esbuild/sunos-x64@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz#07046c977985a3334667f19e6ab3a01a80862afb"
integrity sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==
"@esbuild/win32-arm64@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz#4a5470caf0d16127c05d4833d4934213c69392d1"
integrity sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==
"@esbuild/win32-ia32@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz#3de3e8470b7b328d99dbc3e9ec1eace207e5bbc4"
integrity sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==
"@esbuild/win32-x64@0.25.8":
version "0.25.8"
resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz#610d7ea539d2fcdbe39237b5cc175eb2c4451f9c"
integrity sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==
"@floating-ui/core@^1.7.3":
version "1.7.3"
resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.7.3.tgz#462d722f001e23e46d86fd2bd0d21b7693ccb8b7"
integrity sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==
dependencies:
"@floating-ui/utils" "^0.2.10"
"@floating-ui/dom@^1.0.1":
version "1.7.3"
resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.3.tgz#6174ac3409e6a064bbdf1f4bb07188ee9461f8cf"
integrity sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag==
dependencies:
"@floating-ui/core" "^1.7.3"
"@floating-ui/utils" "^0.2.10"
"@floating-ui/utils@^0.2.10":
version "0.2.10"
resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.10.tgz#a2a1e3812d14525f725d011a73eceb41fef5bc1c"
integrity sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==
"@jridgewell/sourcemap-codec@^1.5.0":
version "1.5.4"
resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz#7358043433b2e5da569aa02cbc4c121da3af27d7"
integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==
"@popperjs/core@npm:@sxzz/popperjs-es@^2.11.7":
version "2.11.7"
resolved "https://registry.yarnpkg.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz#a7f69e3665d3da9b115f9e71671dae1b97e13671"
integrity sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==
"@rolldown/pluginutils@1.0.0-beta.29":
version "1.0.0-beta.29"
resolved "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz#f8fc9a8788757dccba0d3b7fee93183621773d4c"
integrity sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==
"@rollup/rollup-android-arm-eabi@4.46.1":
version "4.46.1"
resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.1.tgz#c659481d5b15054d4636b3dd0c2f50ab3083d839"
integrity sha512-oENme6QxtLCqjChRUUo3S6X8hjCXnWmJWnedD7VbGML5GUtaOtAyx+fEEXnBXVf0CBZApMQU0Idwi0FmyxzQhw==
"@rollup/rollup-android-arm64@4.46.1":
version "4.46.1"
resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.1.tgz#7e05c3c0bf6a79ee6b40ab5e778679742f06815d"
integrity sha512-OikvNT3qYTl9+4qQ9Bpn6+XHM+ogtFadRLuT2EXiFQMiNkXFLQfNVppi5o28wvYdHL2s3fM0D/MZJ8UkNFZWsw==
"@rollup/rollup-darwin-arm64@4.46.1":
version "4.46.1"
resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.1.tgz#b190fbd0274fbbd4d257ff0b3d68f0885c454e0d"
integrity sha512-EFYNNGij2WllnzljQDQnlFTXzSJw87cpAs4TVBAWLdkvic5Uh5tISrIL6NRcxoh/b2EFBG/TK8hgRrGx94zD4A==
"@rollup/rollup-darwin-x64@4.46.1":
version "4.46.1"
resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.1.tgz#a4df7fa06ac318b66a6aa66d6f1e0a58fef58cd3"
integrity sha512-ZaNH06O1KeTug9WI2+GRBE5Ujt9kZw4a1+OIwnBHal92I8PxSsl5KpsrPvthRynkhMck4XPdvY0z26Cym/b7oA==
"@rollup/rollup-freebsd-arm64@4.46.1":
version "4.46.1"
resolved "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.1.tgz#6634478a78a0c17dcf55adb621fa66faa58a017b"
integrity sha512-n4SLVebZP8uUlJ2r04+g2U/xFeiQlw09Me5UFqny8HGbARl503LNH5CqFTb5U5jNxTouhRjai6qPT0CR5c/Iig==
"@rollup/rollup-freebsd-x64@4.46.1":
version "4.46.1"
resolved "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.1.tgz#db42c46c0263b2562e2ba5c2e00e318646f2b24c"
integrity sha512-8vu9c02F16heTqpvo3yeiu7Vi1REDEC/yES/dIfq3tSXe6mLndiwvYr3AAvd1tMNUqE9yeGYa5w7PRbI5QUV+w==
"@rollup/rollup-linux-arm-gnueabihf@4.46.1":
version "4.46.1"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.1.tgz#88ca443ad42c70555978b000c6d1dd925fb3203b"
integrity sha512-K4ncpWl7sQuyp6rWiGUvb6Q18ba8mzM0rjWJ5JgYKlIXAau1db7hZnR0ldJvqKWWJDxqzSLwGUhA4jp+KqgDtQ==
"@rollup/rollup-linux-arm-musleabihf@4.46.1":
version "4.46.1"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.1.tgz#36106fe103d32c2a97583ebadcfb28dc63988bda"
integrity sha512-YykPnXsjUjmXE6j6k2QBBGAn1YsJUix7pYaPLK3RVE0bQL2jfdbfykPxfF8AgBlqtYbfEnYHmLXNa6QETjdOjQ==
"@rollup/rollup-linux-arm64-gnu@4.46.1":
version "4.46.1"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.1.tgz#00c28bc9210dcfbb5e7fa8e52fd827fb570afe26"
integrity sha512-kKvqBGbZ8i9pCGW3a1FH3HNIVg49dXXTsChGFsHGXQaVJPLA4f/O+XmTxfklhccxdF5FefUn2hvkoGJH0ScWOA==
"@rollup/rollup-linux-arm64-musl@4.46.1":
version "4.46.1"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.1.tgz#45a13486b5523235eb87b349e7ca5a0bb85a5b0e"
integrity sha512-zzX5nTw1N1plmqC9RGC9vZHFuiM7ZP7oSWQGqpbmfjK7p947D518cVK1/MQudsBdcD84t6k70WNczJOct6+hdg==
"@rollup/rollup-linux-loongarch64-gnu@4.46.1":
version "4.46.1"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.1.tgz#b8edd99f072cd652acbbddc1c539b1ac4254381d"
integrity sha512-O8CwgSBo6ewPpktFfSDgB6SJN9XDcPSvuwxfejiddbIC/hn9Tg6Ai0f0eYDf3XvB/+PIWzOQL+7+TZoB8p9Yuw==
"@rollup/rollup-linux-ppc64-gnu@4.46.1":
version "4.46.1"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.1.tgz#0ec72a4f8b7a86b13c0f6b7666ed1d3b6e8e67cc"
integrity sha512-JnCfFVEKeq6G3h3z8e60kAp8Rd7QVnWCtPm7cxx+5OtP80g/3nmPtfdCXbVl063e3KsRnGSKDHUQMydmzc/wBA==
"@rollup/rollup-linux-riscv64-gnu@4.46.1":
version "4.46.1"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.1.tgz#99f06928528fb58addd12e50827e1a0269c1cca8"
integrity sha512-dVxuDqS237eQXkbYzQQfdf/njgeNw6LZuVyEdUaWwRpKHhsLI+y4H/NJV8xJGU19vnOJCVwaBFgr936FHOnJsQ==
"@rollup/rollup-linux-riscv64-musl@4.46.1":
version "4.46.1"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.1.tgz#3c14aba63b4170fe3d9d0b6ad98361366170590e"
integrity sha512-CvvgNl2hrZrTR9jXK1ye0Go0HQRT6ohQdDfWR47/KFKiLd5oN5T14jRdUVGF4tnsN8y9oSfMOqH6RuHh+ck8+w==
"@rollup/rollup-linux-s390x-gnu@4.46.1":
version "4.46.1"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.1.tgz#34c647a823dcdca0f749a2bdcbde4fb131f37a4c"
integrity sha512-x7ANt2VOg2565oGHJ6rIuuAon+A8sfe1IeUx25IKqi49OjSr/K3awoNqr9gCwGEJo9OuXlOn+H2p1VJKx1psxA==
"@rollup/rollup-linux-x64-gnu@4.46.1":
version "4.46.1"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.1.tgz#3991010418c005e8791c415e7c2072b247157710"
integrity sha512-9OADZYryz/7E8/qt0vnaHQgmia2Y0wrjSSn1V/uL+zw/i7NUhxbX4cHXdEQ7dnJgzYDS81d8+tf6nbIdRFZQoQ==
"@rollup/rollup-linux-x64-musl@4.46.1":
version "4.46.1"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.1.tgz#f3943e5f284f40ffbcf4a14da9ee2e43d303b462"
integrity sha512-NuvSCbXEKY+NGWHyivzbjSVJi68Xfq1VnIvGmsuXs6TCtveeoDRKutI5vf2ntmNnVq64Q4zInet0UDQ+yMB6tA==
"@rollup/rollup-win32-arm64-msvc@4.46.1":
version "4.46.1"
resolved "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.1.tgz#45b5a1d3f0af63f85044913c371d7b0519c913ad"
integrity sha512-mWz+6FSRb82xuUMMV1X3NGiaPFqbLN9aIueHleTZCc46cJvwTlvIh7reQLk4p97dv0nddyewBhwzryBHH7wtPw==
"@rollup/rollup-win32-ia32-msvc@4.46.1":
version "4.46.1"
resolved "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.1.tgz#900ef7211d2929e9809f3a044c4e2fd3aa685a0c"
integrity sha512-7Thzy9TMXDw9AU4f4vsLNBxh7/VOKuXi73VH3d/kHGr0tZ3x/ewgL9uC7ojUKmH1/zvmZe2tLapYcZllk3SO8Q==
"@rollup/rollup-win32-x64-msvc@4.46.1":
version "4.46.1"
resolved "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.1.tgz#932d8696dfef673bee1a1e291a5531d25a6903be"
integrity sha512-7GVB4luhFmGUNXXJhH2jJwZCFB3pIOixv2E3s17GQHBFUOQaISlt7aGcQgqvCaDSxTZJUzlK/QJ1FN8S94MrzQ==
"@types/estree@1.0.8":
version "1.0.8"
resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e"
integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
"@types/lodash-es@^4.17.6":
version "4.17.12"
resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.12.tgz#65f6d1e5f80539aa7cfbfc962de5def0cf4f341b"
integrity sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==
dependencies:
"@types/lodash" "*"
"@types/lodash@*", "@types/lodash@^4.14.182":
version "4.17.20"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.20.tgz#1ca77361d7363432d29f5e55950d9ec1e1c6ea93"
integrity sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==
"@types/web-bluetooth@^0.0.16":
version "0.0.16"
resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz#1d12873a8e49567371f2a75fe3e7f7edca6662d8"
integrity sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==
"@vitejs/plugin-basic-ssl@^2.0.0":
version "2.1.0"
resolved "https://registry.npmmirror.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.0.tgz#c70d2a922bc437f154089d7ef0505db4b383eb7b"
integrity sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==
"@vitejs/plugin-vue@^6.0.0":
version "6.0.1"
resolved "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz#4c7f559621af104a22255c6ace5626e6d8349689"
integrity sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==
dependencies:
"@rolldown/pluginutils" "1.0.0-beta.29"
"@vue/compiler-core@3.5.18":
version "3.5.18"
resolved "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.18.tgz#521a138cdd970d9bfd27e42168d12f77a04b2074"
integrity sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==
dependencies:
"@babel/parser" "^7.28.0"
"@vue/shared" "3.5.18"
entities "^4.5.0"
estree-walker "^2.0.2"
source-map-js "^1.2.1"
"@vue/compiler-dom@3.5.18":
version "3.5.18"
resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz#e13504492c3061ec5bbe6a2e789f15261d4f03a7"
integrity sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==
dependencies:
"@vue/compiler-core" "3.5.18"
"@vue/shared" "3.5.18"
"@vue/compiler-sfc@3.5.18":
version "3.5.18"
resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz#ba1e849561337d809937994cdaf900539542eeca"
integrity sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==
dependencies:
"@babel/parser" "^7.28.0"
"@vue/compiler-core" "3.5.18"
"@vue/compiler-dom" "3.5.18"
"@vue/compiler-ssr" "3.5.18"
"@vue/shared" "3.5.18"
estree-walker "^2.0.2"
magic-string "^0.30.17"
postcss "^8.5.6"
source-map-js "^1.2.1"
"@vue/compiler-ssr@3.5.18":
version "3.5.18"
resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz#aecde0b0bff268a9c9014ba66799307c4a784328"
integrity sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==
dependencies:
"@vue/compiler-dom" "3.5.18"
"@vue/shared" "3.5.18"
"@vue/devtools-api@^6.6.4":
version "6.6.4"
resolved "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz#cbe97fe0162b365edc1dba80e173f90492535343"
integrity sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==
"@vue/reactivity@3.5.18":
version "3.5.18"
resolved "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.18.tgz#fe32166e3938832c54b4134e60e9b58ca7d9bdb4"
integrity sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==
dependencies:
"@vue/shared" "3.5.18"
"@vue/runtime-core@3.5.18":
version "3.5.18"
resolved "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.18.tgz#9e9ae8b9491548b53d0cea2bf25746d27c52e191"
integrity sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==
dependencies:
"@vue/reactivity" "3.5.18"
"@vue/shared" "3.5.18"
"@vue/runtime-dom@3.5.18":
version "3.5.18"
resolved "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz#1150952d1048b5822e4f1dd8aed24665cbb22107"
integrity sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==
dependencies:
"@vue/reactivity" "3.5.18"
"@vue/runtime-core" "3.5.18"
"@vue/shared" "3.5.18"
csstype "^3.1.3"
"@vue/server-renderer@3.5.18":
version "3.5.18"
resolved "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.18.tgz#e9fa267b95b3a1d8cddca762377e5de2ae9122bd"
integrity sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==
dependencies:
"@vue/compiler-ssr" "3.5.18"
"@vue/shared" "3.5.18"
"@vue/shared@3.5.18":
version "3.5.18"
resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.18.tgz#529f24a88d3ed678d50fd5c07455841fbe8ac95e"
integrity sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==
"@vueuse/core@^9.1.0":
version "9.13.0"
resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-9.13.0.tgz#2f69e66d1905c1e4eebc249a01759cf88ea00cf4"
integrity sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==
dependencies:
"@types/web-bluetooth" "^0.0.16"
"@vueuse/metadata" "9.13.0"
"@vueuse/shared" "9.13.0"
vue-demi "*"
"@vueuse/metadata@9.13.0":
version "9.13.0"
resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-9.13.0.tgz#bc25a6cdad1b1a93c36ce30191124da6520539ff"
integrity sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==
"@vueuse/shared@9.13.0":
version "9.13.0"
resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-9.13.0.tgz#089ff4cc4e2e7a4015e57a8f32e4b39d096353b9"
integrity sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==
dependencies:
vue-demi "*"
async-validator@^4.2.5:
version "4.2.5"
resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339"
integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==
csstype@^3.1.3:
version "3.1.3"
resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
dayjs@^1.11.13:
version "1.11.13"
resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c"
integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==
element-plus@^2.10.4:
version "2.10.4"
resolved "https://registry.yarnpkg.com/element-plus/-/element-plus-2.10.4.tgz#72de60a6074be79f9f1b299f422e7ac96a3b5e9a"
integrity sha512-UD4elWHrCnp1xlPhbXmVcaKFLCRaRAY6WWRwemGfGW3ceIjXm9fSYc9RNH3AiOEA6Ds1p9ZvhCs76CR9J8Vd+A==
dependencies:
"@ctrl/tinycolor" "^3.4.1"
"@element-plus/icons-vue" "^2.3.1"
"@floating-ui/dom" "^1.0.1"
"@popperjs/core" "npm:@sxzz/popperjs-es@^2.11.7"
"@types/lodash" "^4.14.182"
"@types/lodash-es" "^4.17.6"
"@vueuse/core" "^9.1.0"
async-validator "^4.2.5"
dayjs "^1.11.13"
escape-html "^1.0.3"
lodash "^4.17.21"
lodash-es "^4.17.21"
lodash-unified "^1.0.2"
memoize-one "^6.0.0"
normalize-wheel-es "^1.2.0"
entities@^4.5.0:
version "4.5.0"
resolved "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
esbuild@^0.25.0:
version "0.25.8"
resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.8.tgz#482d42198b427c9c2f3a81b63d7663aecb1dda07"
integrity sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==
optionalDependencies:
"@esbuild/aix-ppc64" "0.25.8"
"@esbuild/android-arm" "0.25.8"
"@esbuild/android-arm64" "0.25.8"
"@esbuild/android-x64" "0.25.8"
"@esbuild/darwin-arm64" "0.25.8"
"@esbuild/darwin-x64" "0.25.8"
"@esbuild/freebsd-arm64" "0.25.8"
"@esbuild/freebsd-x64" "0.25.8"
"@esbuild/linux-arm" "0.25.8"
"@esbuild/linux-arm64" "0.25.8"
"@esbuild/linux-ia32" "0.25.8"
"@esbuild/linux-loong64" "0.25.8"
"@esbuild/linux-mips64el" "0.25.8"
"@esbuild/linux-ppc64" "0.25.8"
"@esbuild/linux-riscv64" "0.25.8"
"@esbuild/linux-s390x" "0.25.8"
"@esbuild/linux-x64" "0.25.8"
"@esbuild/netbsd-arm64" "0.25.8"
"@esbuild/netbsd-x64" "0.25.8"
"@esbuild/openbsd-arm64" "0.25.8"
"@esbuild/openbsd-x64" "0.25.8"
"@esbuild/openharmony-arm64" "0.25.8"
"@esbuild/sunos-x64" "0.25.8"
"@esbuild/win32-arm64" "0.25.8"
"@esbuild/win32-ia32" "0.25.8"
"@esbuild/win32-x64" "0.25.8"
escape-html@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
estree-walker@^2.0.2:
version "2.0.2"
resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
fdir@^6.4.4, fdir@^6.4.6:
version "6.4.6"
resolved "https://registry.npmmirror.com/fdir/-/fdir-6.4.6.tgz#2b268c0232697063111bbf3f64810a2a741ba281"
integrity sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==
fsevents@~2.3.2, fsevents@~2.3.3:
version "2.3.3"
resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
lodash-es@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
lodash-unified@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/lodash-unified/-/lodash-unified-1.0.3.tgz#80b1eac10ed2eb02ed189f08614a29c27d07c894"
integrity sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==
lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
magic-string@^0.30.17:
version "0.30.17"
resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453"
integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==
dependencies:
"@jridgewell/sourcemap-codec" "^1.5.0"
memoize-one@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045"
integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==
nanoid@^3.3.11:
version "3.3.11"
resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b"
integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
normalize-wheel-es@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz#0fa2593d619f7245a541652619105ab076acf09e"
integrity sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==
picocolors@^1.1.1:
version "1.1.1"
resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
picomatch@^4.0.2, picomatch@^4.0.3:
version "4.0.3"
resolved "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042"
integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==
postcss@^8.5.6:
version "8.5.6"
resolved "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c"
integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==
dependencies:
nanoid "^3.3.11"
picocolors "^1.1.1"
source-map-js "^1.2.1"
rollup@^4.40.0:
version "4.46.1"
resolved "https://registry.npmmirror.com/rollup/-/rollup-4.46.1.tgz#287d07ef0ea17950b348b027c634a9544a1a375f"
integrity sha512-33xGNBsDJAkzt0PvninskHlWnTIPgDtTwhg0U38CUoNP/7H6wI2Cz6dUeoNPbjdTdsYTGuiFFASuUOWovH0SyQ==
dependencies:
"@types/estree" "1.0.8"
optionalDependencies:
"@rollup/rollup-android-arm-eabi" "4.46.1"
"@rollup/rollup-android-arm64" "4.46.1"
"@rollup/rollup-darwin-arm64" "4.46.1"
"@rollup/rollup-darwin-x64" "4.46.1"
"@rollup/rollup-freebsd-arm64" "4.46.1"
"@rollup/rollup-freebsd-x64" "4.46.1"
"@rollup/rollup-linux-arm-gnueabihf" "4.46.1"
"@rollup/rollup-linux-arm-musleabihf" "4.46.1"
"@rollup/rollup-linux-arm64-gnu" "4.46.1"
"@rollup/rollup-linux-arm64-musl" "4.46.1"
"@rollup/rollup-linux-loongarch64-gnu" "4.46.1"
"@rollup/rollup-linux-ppc64-gnu" "4.46.1"
"@rollup/rollup-linux-riscv64-gnu" "4.46.1"
"@rollup/rollup-linux-riscv64-musl" "4.46.1"
"@rollup/rollup-linux-s390x-gnu" "4.46.1"
"@rollup/rollup-linux-x64-gnu" "4.46.1"
"@rollup/rollup-linux-x64-musl" "4.46.1"
"@rollup/rollup-win32-arm64-msvc" "4.46.1"
"@rollup/rollup-win32-ia32-msvc" "4.46.1"
"@rollup/rollup-win32-x64-msvc" "4.46.1"
fsevents "~2.3.2"
source-map-js@^1.2.1:
version "1.2.1"
resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
tinyglobby@^0.2.14:
version "0.2.14"
resolved "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.14.tgz#5280b0cf3f972b050e74ae88406c0a6a58f4079d"
integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==
dependencies:
fdir "^6.4.4"
picomatch "^4.0.2"
vite@^7.0.4:
version "7.0.6"
resolved "https://registry.npmmirror.com/vite/-/vite-7.0.6.tgz#7866ccb176db4bbeec0adfb3f907f077881591d0"
integrity sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==
dependencies:
esbuild "^0.25.0"
fdir "^6.4.6"
picomatch "^4.0.3"
postcss "^8.5.6"
rollup "^4.40.0"
tinyglobby "^0.2.14"
optionalDependencies:
fsevents "~2.3.3"
vue-demi@*:
version "0.14.10"
resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.10.tgz#afc78de3d6f9e11bf78c55e8510ee12814522f04"
integrity sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==
vue-router@4:
version "4.5.1"
resolved "https://registry.npmmirror.com/vue-router/-/vue-router-4.5.1.tgz#47bffe2d3a5479d2886a9a244547a853aa0abf69"
integrity sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==
dependencies:
"@vue/devtools-api" "^6.6.4"
vue@^3.5.17:
version "3.5.18"
resolved "https://registry.npmmirror.com/vue/-/vue-3.5.18.tgz#3d622425ad1391a2b0138323211ec784f4415686"
integrity sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==
dependencies:
"@vue/compiler-dom" "3.5.18"
"@vue/compiler-sfc" "3.5.18"
"@vue/runtime-dom" "3.5.18"
"@vue/server-renderer" "3.5.18"
"@vue/shared" "3.5.18"
Loading…
Cancel
Save