This commit is contained in:
		
							parent
							
								
									3b9aa94a65
								
							
						
					
					
						commit
						044350e8cc
					
				
							
								
								
									
										1284
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										1284
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -9,6 +9,8 @@
 | 
				
			|||||||
    "preview": "vite preview"
 | 
					    "preview": "vite preview"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
 | 
					    "tdesign-icons-vue-next": "^0.3.6",
 | 
				
			||||||
 | 
					    "tdesign-vue-next": "^1.15.2",
 | 
				
			||||||
    "vue": "^3.4.0",
 | 
					    "vue": "^3.4.0",
 | 
				
			||||||
    "vue-router": "^4.2.5"
 | 
					    "vue-router": "^4.2.5"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
				
			|||||||
@ -8,6 +8,7 @@
 | 
				
			|||||||
export default {
 | 
					export default {
 | 
				
			||||||
  name: 'App'
 | 
					  name: 'App'
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style>
 | 
					<style>
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								src/assets/teacher.mp4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/assets/teacher.mp4
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							@ -1,7 +1,10 @@
 | 
				
			|||||||
import { createApp } from 'vue'
 | 
					import { createApp } from 'vue'
 | 
				
			||||||
import App from './App.vue'
 | 
					import App from './App.vue'
 | 
				
			||||||
import router from './router'
 | 
					import router from './router'
 | 
				
			||||||
 | 
					import TDesign from 'tdesign-vue-next';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const app = createApp(App)
 | 
					const app = createApp(App)
 | 
				
			||||||
app.use(router)
 | 
					app.use(router)
 | 
				
			||||||
 | 
					app.use(TDesign)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
app.mount('#app') 
 | 
					app.mount('#app') 
 | 
				
			||||||
 | 
				
			|||||||
@ -1,26 +1,13 @@
 | 
				
			|||||||
<template>
 | 
					<template>
 | 
				
			||||||
    <div class="study-page">
 | 
					    <div class="study-page">
 | 
				
			||||||
      <!-- 顶部评分区域 -->
 | 
					      <!-- 视频 -->
 | 
				
			||||||
      <div class="score-section">
 | 
					      <div class="teacher-container" style="width: 100%; height: 22%;">
 | 
				
			||||||
        <div class="score-item">
 | 
					        <video src="../assets/teacher.mp4" autoplay loop muted 
 | 
				
			||||||
          <div class="score-icon">✓</div>
 | 
					          style="width: 100%; height: 100%;">
 | 
				
			||||||
          <div class="score-text">语法正确</div>
 | 
					        </video>
 | 
				
			||||||
          <!-- <div class="score-value">太棒了</div> -->
 | 
					 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
        <div class="score-item">
 | 
					 | 
				
			||||||
          <div class="score-number">{{ pronunciationScore }}</div>
 | 
					 | 
				
			||||||
          <div class="score-text">发音</div>
 | 
					 | 
				
			||||||
          <!-- <div class="score-link">发音分析 ></div> -->
 | 
					 | 
				
			||||||
        </div>
 | 
					 | 
				
			||||||
        <div class="score-item">
 | 
					 | 
				
			||||||
          <div class="score-number">{{ authenticityScore }}</div>
 | 
					 | 
				
			||||||
          <div class="score-text">地道</div>
 | 
					 | 
				
			||||||
          <!-- <div class="score-link">更多语境 ></div> -->
 | 
					 | 
				
			||||||
        </div>
 | 
					 | 
				
			||||||
      </div>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      <!-- 示例选择区域 -->
 | 
					      <!-- 示例选择区域 -->
 | 
				
			||||||
      <div class="example-selection">
 | 
					      <!-- <div class="example-selection">
 | 
				
			||||||
        <div class="example-title">选择跟读示例</div>
 | 
					        <div class="example-title">选择跟读示例</div>
 | 
				
			||||||
        <div
 | 
					        <div
 | 
				
			||||||
          class="example-options"
 | 
					          class="example-options"
 | 
				
			||||||
@ -43,22 +30,22 @@
 | 
				
			|||||||
            <div class="example-name">{{ example.name }}</div>
 | 
					            <div class="example-name">{{ example.name }}</div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
      </div>
 | 
					      </div> -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <!-- 跟读练习区域 -->
 | 
					      <!-- 跟读练习区域,示例选择区,现有的句子和音频 -->
 | 
				
			||||||
      <div v-if="selectedExample !== null" class="practice-area">
 | 
					      <!-- <div v-if="selectedExample !== null" class="practice-area">
 | 
				
			||||||
        <div class="example-display">
 | 
					        <div class="example-display">
 | 
				
			||||||
          <div class="example-text">
 | 
					          <div class="example-text">
 | 
				
			||||||
            <div class="english-text">
 | 
					            <div class="english-text">
 | 
				
			||||||
              {{ currentExample.english }}
 | 
					              {{ currentExample.english }}
 | 
				
			||||||
              <button class="inline-play-btn" @click="playExample($event)">
 | 
					              <button class="inline-play-btn" @click="currentExample($event)">
 | 
				
			||||||
                🔊
 | 
					                🔊
 | 
				
			||||||
              </button>
 | 
					              </button>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="chinese-text">{{ currentExample.chinese }}</div>
 | 
					            <div class="chinese-text">{{ currentExample.chinese }}</div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
      </div>
 | 
					      </div> -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <!-- 对话内容区域 -->
 | 
					      <!-- 对话内容区域 -->
 | 
				
			||||||
      <div class="conversation-area">
 | 
					      <div class="conversation-area">
 | 
				
			||||||
@ -68,33 +55,38 @@
 | 
				
			|||||||
            :key="index"
 | 
					            :key="index"
 | 
				
			||||||
            :class="['message', message.type]"
 | 
					            :class="['message', message.type]"
 | 
				
			||||||
          >
 | 
					          >
 | 
				
			||||||
 | 
					          <div class="message-box">
 | 
				
			||||||
              <div class="message-content">
 | 
					              <div class="message-content">
 | 
				
			||||||
              <div class="message-text">{{ message.text }}</div>
 | 
					              <div class="message-text">
 | 
				
			||||||
 | 
					                {{ message.text }}
 | 
				
			||||||
 | 
					              </div>
 | 
				
			||||||
              <div v-if="message.translation" class="message-translation">
 | 
					              <div v-if="message.translation" class="message-translation">
 | 
				
			||||||
                {{ message.translation }}
 | 
					                {{ message.translation }}
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
 | 
					              <div class="message-icon">
 | 
				
			||||||
 | 
					              <t-icon name="sonic" @click="playAudio(message, $event)" />
 | 
				
			||||||
 | 
					              <t-icon name="translate-1" />
 | 
				
			||||||
 | 
					              <t-icon name="star" />
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
            <div v-if="message.type === 'ai'" class="message-actions">
 | 
					 | 
				
			||||||
              <button class="action-btn" @click="playAudio(message, $event)">
 | 
					 | 
				
			||||||
                🔊
 | 
					 | 
				
			||||||
              </button>
 | 
					 | 
				
			||||||
              <button class="action-btn" @click="editText(message)">
 | 
					 | 
				
			||||||
                ✏️
 | 
					 | 
				
			||||||
              </button>
 | 
					 | 
				
			||||||
              <button class="action-btn" @click="favoriteMessage(message)">
 | 
					 | 
				
			||||||
                ⭐
 | 
					 | 
				
			||||||
              </button>
 | 
					 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div v-if="message.type === 'user' && message.audioUrl" class="message-actions">
 | 
					            <div v-if="message.type==='user'" class="message-scores">
 | 
				
			||||||
              <button class="action-btn" @click="playAudio(message, $event)">
 | 
					              <span class="pronunciation">
 | 
				
			||||||
                🔊
 | 
					                发音:{{ this.pronunciationScore }}
 | 
				
			||||||
              </button>
 | 
					                <div>发音分析</div>
 | 
				
			||||||
 | 
					              </span>
 | 
				
			||||||
 | 
					              <t-divider layout="vertical" />
 | 
				
			||||||
 | 
					              <span class="authenticity">
 | 
				
			||||||
 | 
					                地道:{{ this.authenticityScore }}
 | 
				
			||||||
 | 
					                <div>更多选项</div>
 | 
				
			||||||
 | 
					              </span>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
 | 
					           
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <!-- 语境示例 -->
 | 
					        <!-- 语境示例 -->
 | 
				
			||||||
        <div v-if="showContext" class="context-examples">
 | 
					        <!-- <div v-if="showContext" class="context-examples">
 | 
				
			||||||
          <div class="context-item">
 | 
					          <div class="context-item">
 | 
				
			||||||
            <div class="context-type">商务</div>
 | 
					            <div class="context-type">商务</div>
 | 
				
			||||||
            <div class="context-text">My favorite movie of his is "Galactic Force"...</div>
 | 
					            <div class="context-text">My favorite movie of his is "Galactic Force"...</div>
 | 
				
			||||||
@ -103,51 +95,29 @@
 | 
				
			|||||||
            <div class="context-type">地道</div>
 | 
					            <div class="context-type">地道</div>
 | 
				
			||||||
            <div class="context-text">I love "Galactic Force" the most. He's am...</div>
 | 
					            <div class="context-text">I love "Galactic Force" the most. He's am...</div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div> -->
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <!-- 底部导航 -->
 | 
					
 | 
				
			||||||
<!--      <div class="bottom-nav">-->
 | 
					 | 
				
			||||||
        <!-- <div class="nav-item">
 | 
					 | 
				
			||||||
          <div class="nav-icon">📚</div>
 | 
					 | 
				
			||||||
          <div class="nav-text">AI 情景课</div>
 | 
					 | 
				
			||||||
          <div class="nav-badge">New</div>
 | 
					 | 
				
			||||||
        </div>
 | 
					 | 
				
			||||||
        <div class="nav-item">
 | 
					 | 
				
			||||||
          <div class="nav-icon">🌐</div>
 | 
					 | 
				
			||||||
          <div class="nav-text">英语(美)</div>
 | 
					 | 
				
			||||||
          <div class="nav-arrow">▼</div>
 | 
					 | 
				
			||||||
        </div>
 | 
					 | 
				
			||||||
        <div class="nav-item">
 | 
					 | 
				
			||||||
          <div class="nav-icon">⚙️</div>
 | 
					 | 
				
			||||||
          <div class="nav-text">对话设置</div>
 | 
					 | 
				
			||||||
        </div> -->
 | 
					 | 
				
			||||||
<!--      </div>-->
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <!-- 语音输入区域 -->
 | 
					      <!-- 语音输入区域 -->
 | 
				
			||||||
      <div class="voice-input-area">
 | 
					      <div class="voice-input-area">
 | 
				
			||||||
        <div class="voice-controls">
 | 
					        <div class="voice-box">
 | 
				
			||||||
          <button
 | 
					          <button variant="outline" @click="toggleRecording" class="voice-button">
 | 
				
			||||||
            class="voice-btn"
 | 
					            <t-icon name="microphone-1"></t-icon>
 | 
				
			||||||
            :class="{ recording: isRecording }"
 | 
					 | 
				
			||||||
            @click="toggleRecording"
 | 
					 | 
				
			||||||
          >
 | 
					 | 
				
			||||||
            🎤
 | 
					 | 
				
			||||||
          </button>
 | 
					 | 
				
			||||||
          <div class="voice-text">
 | 
					 | 
				
			||||||
            {{ isRecording ? `正在录音... ${Math.floor(recordingDuration / 60)}:${(recordingDuration % 60).toString().padStart(2, '0')}` : '点击说话' }}
 | 
					            {{ isRecording ? `正在录音... ${Math.floor(recordingDuration / 60)}:${(recordingDuration % 60).toString().padStart(2, '0')}` : '点击说话' }}
 | 
				
			||||||
 | 
					          </button>
 | 
				
			||||||
 | 
					          <div class="icon-right">
 | 
				
			||||||
 | 
					            <t-icon name="keyboard"></t-icon>
 | 
				
			||||||
 | 
					            <t-icon name="call-1"></t-icon>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="voice-actions">
 | 
					
 | 
				
			||||||
 | 
					        <!-- 功能区 -->
 | 
				
			||||||
 | 
					        <!-- <div class="voice-actions">
 | 
				
			||||||
          <button class="voice-action-btn" @click="uploadAudioFile">
 | 
					          <button class="voice-action-btn" @click="uploadAudioFile">
 | 
				
			||||||
            📁
 | 
					            📁
 | 
				
			||||||
          </button>
 | 
					          </button>
 | 
				
			||||||
          <!-- <button class="voice-action-btn" @click="testApi">
 | 
					 | 
				
			||||||
            🧪
 | 
					 | 
				
			||||||
          </button>
 | 
					 | 
				
			||||||
          <button class="voice-action-btn" @click="testAudioPlayback($event)">
 | 
					 | 
				
			||||||
            🔊
 | 
					 | 
				
			||||||
          </button> -->
 | 
					 | 
				
			||||||
          <button class="voice-action-btn" @click="checkAudioPermissions">
 | 
					          <button class="voice-action-btn" @click="checkAudioPermissions">
 | 
				
			||||||
            🔍
 | 
					            🔍
 | 
				
			||||||
          </button>
 | 
					          </button>
 | 
				
			||||||
@ -157,17 +127,17 @@
 | 
				
			|||||||
          <button class="voice-action-btn call-btn" @click="startCall">
 | 
					          <button class="voice-action-btn call-btn" @click="startCall">
 | 
				
			||||||
            📞
 | 
					            📞
 | 
				
			||||||
          </button>
 | 
					          </button>
 | 
				
			||||||
        </div>
 | 
					        </div> -->
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <!-- 隐藏的文件上传输入 -->
 | 
					      <!-- 隐藏的文件上传输入 -->
 | 
				
			||||||
      <input
 | 
					      <!-- <input
 | 
				
			||||||
        ref="fileInput"
 | 
					        ref="fileInput"
 | 
				
			||||||
        type="file"
 | 
					        type="file"
 | 
				
			||||||
        accept=".mp3,.wav,.m4a,.aac"
 | 
					        accept=".mp3,.wav,.m4a,.aac"
 | 
				
			||||||
        style="display: none;"
 | 
					        style="display: none;"
 | 
				
			||||||
        @change="handleFileUpload"
 | 
					        @change="handleFileUpload"
 | 
				
			||||||
      />
 | 
					      /> -->
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  </template>
 | 
					  </template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -181,11 +151,16 @@
 | 
				
			|||||||
  import audio3 from '../assets/3.mp3'
 | 
					  import audio3 from '../assets/3.mp3'
 | 
				
			||||||
  import audio4 from '../assets/4.mp3'
 | 
					  import audio4 from '../assets/4.mp3'
 | 
				
			||||||
  import audio5 from '../assets/5.mp3'
 | 
					  import audio5 from '../assets/5.mp3'
 | 
				
			||||||
 | 
					 | 
				
			||||||
  export default {
 | 
					  export default {
 | 
				
			||||||
    name: 'StudyPage',
 | 
					    name: 'StudyPage',
 | 
				
			||||||
    data() {
 | 
					    data() {
 | 
				
			||||||
      return {
 | 
					      return {
 | 
				
			||||||
 | 
					        contentList: [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            question: 'What is your name?',
 | 
				
			||||||
 | 
					            answer: 'My name is John Doe.'
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
        isRecording: false,
 | 
					        isRecording: false,
 | 
				
			||||||
        pronunciationScore: 94,
 | 
					        pronunciationScore: 94,
 | 
				
			||||||
        authenticityScore: 95,
 | 
					        authenticityScore: 95,
 | 
				
			||||||
@ -201,49 +176,14 @@
 | 
				
			|||||||
        currentX: 0,
 | 
					        currentX: 0,
 | 
				
			||||||
        scrollLeft: 0,
 | 
					        scrollLeft: 0,
 | 
				
			||||||
        containerWidth: 0,
 | 
					        containerWidth: 0,
 | 
				
			||||||
        examples: [
 | 
					        examples: [],
 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            name: '问候语',
 | 
					 | 
				
			||||||
            icon: '👋',
 | 
					 | 
				
			||||||
            english: 'Hello, how are you today?',
 | 
					 | 
				
			||||||
            chinese: '你好,今天怎么样?',
 | 
					 | 
				
			||||||
            messages: []
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            name: '自我介绍',
 | 
					 | 
				
			||||||
            icon: '👤',
 | 
					 | 
				
			||||||
            english: 'My name is Sarah and I\'m from New York.',
 | 
					 | 
				
			||||||
            chinese: '我叫莎拉,来自纽约。',
 | 
					 | 
				
			||||||
            messages: []
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            name: '餐厅点餐',
 | 
					 | 
				
			||||||
            icon: '🍽️',
 | 
					 | 
				
			||||||
            english: 'I\'d like to order the grilled chicken with rice.',
 | 
					 | 
				
			||||||
            chinese: '我想点烤鸡配米饭。',
 | 
					 | 
				
			||||||
            messages: []
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            name: '购物对话',
 | 
					 | 
				
			||||||
            icon: '🛍️',
 | 
					 | 
				
			||||||
            english: 'How much does this shirt cost?',
 | 
					 | 
				
			||||||
            chinese: '这件衬衫多少钱?',
 | 
					 | 
				
			||||||
            messages: []
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            name: '旅游问路',
 | 
					 | 
				
			||||||
            icon: '🗺️',
 | 
					 | 
				
			||||||
            english: 'Excuse me, could you tell me how to get to the museum?',
 | 
					 | 
				
			||||||
            chinese: '打扰一下,能告诉我怎么去博物馆吗?',
 | 
					 | 
				
			||||||
            messages: []
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        ],
 | 
					 | 
				
			||||||
        messages: []
 | 
					        messages: []
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    methods: {
 | 
					    methods: {
 | 
				
			||||||
 | 
					      //点击说话
 | 
				
			||||||
      toggleRecording() {
 | 
					      toggleRecording() {
 | 
				
			||||||
        this.isRecording = !this.isRecording
 | 
					        this.isRecording = !this.isRecording;        
 | 
				
			||||||
        if (this.isRecording) {
 | 
					        if (this.isRecording) {
 | 
				
			||||||
          this.startRecording()
 | 
					          this.startRecording()
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
@ -252,41 +192,45 @@
 | 
				
			|||||||
      },
 | 
					      },
 | 
				
			||||||
      async startRecording() {
 | 
					      async startRecording() {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
 | 
					          //申请使用麦克风
 | 
				
			||||||
          const stream = await navigator.mediaDevices.getUserMedia({ audio: true })
 | 
					          const stream = await navigator.mediaDevices.getUserMedia({ audio: true })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          this.mediaRecorder = new MediaRecorder(stream)
 | 
					          this.mediaRecorder = new MediaRecorder(stream)
 | 
				
			||||||
          this.audioChunks = []
 | 
					          this.audioChunks = []
 | 
				
			||||||
 | 
					          //监听媒体录制过程
 | 
				
			||||||
          this.mediaRecorder.ondataavailable = (event) => {
 | 
					          this.mediaRecorder.ondataavailable = (event) => {
 | 
				
			||||||
            this.audioChunks.push(event.data)
 | 
					            this.audioChunks.push(event.data)
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
 | 
					          //监听媒体录制停止
 | 
				
			||||||
          this.mediaRecorder.onstop = () => {
 | 
					          this.mediaRecorder.onstop = () => {
 | 
				
			||||||
            const audioBlob = new Blob(this.audioChunks, { type: 'audio/wav' })
 | 
					            const audioBlob = new Blob(this.audioChunks, { type: 'audio/wav' })
 | 
				
			||||||
            const audioUrl = URL.createObjectURL(audioBlob)
 | 
					            const audioUrl = URL.createObjectURL(audioBlob);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            stream.getTracks().forEach(track => track.stop())
 | 
					            stream.getTracks().forEach(track => track.stop());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            this.processVoiceInput(audioBlob, audioUrl)
 | 
					            this.processVoiceInput(audioBlob, audioUrl); //语言识别
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          this.mediaRecorder.start()
 | 
					          this.mediaRecorder.start(); //开始录制媒体流
 | 
				
			||||||
          this.recordingDuration = 0
 | 
					          this.recordingDuration = 0;
 | 
				
			||||||
          this.startRecordingTimer()
 | 
					          this.startRecordingTimer(); //录制时间++
 | 
				
			||||||
          console.log('开始录音')
 | 
					          console.log('开始录音');
 | 
				
			||||||
 | 
					          
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        } catch (error) {
 | 
					        } catch (error) {
 | 
				
			||||||
 | 
					          isRecording = false;
 | 
				
			||||||
          console.error('录音失败:', error)
 | 
					          console.error('录音失败:', error)
 | 
				
			||||||
          alert('无法访问麦克风,请检查权限设置')
 | 
					          alert('无法访问麦克风,请检查权限设置')
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      stopRecording() {
 | 
					      stopRecording() {
 | 
				
			||||||
        if (this.mediaRecorder && this.mediaRecorder.state === 'recording') {
 | 
					        if (this.mediaRecorder && this.mediaRecorder.state === 'recording') {
 | 
				
			||||||
          this.mediaRecorder.stop()
 | 
					          this.mediaRecorder.stop();
 | 
				
			||||||
          this.stopRecordingTimer()
 | 
					          this.stopRecordingTimer(); //清空计时器
 | 
				
			||||||
          console.log('停止录音')
 | 
					          console.log('停止录音')
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
 | 
					      //语音识别
 | 
				
			||||||
      async processVoiceInput(audioBlob = null, audioUrl = null) {
 | 
					      async processVoiceInput(audioBlob = null, audioUrl = null) {
 | 
				
			||||||
        if (audioBlob) {
 | 
					        if (audioBlob) {
 | 
				
			||||||
          try {
 | 
					          try {
 | 
				
			||||||
@ -294,7 +238,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            console.log('语音识别结果:', transcription)
 | 
					            console.log('语音识别结果:', transcription)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // 检查识别结果是否有效
 | 
					            // 检查识别结果是否有效,添加文字,进行评分
 | 
				
			||||||
            if (transcription && transcription.trim() && transcription !== 'test audio data') {
 | 
					            if (transcription && transcription.trim() && transcription !== 'test audio data') {
 | 
				
			||||||
              this.addMessage('user', transcription, '你的跟读', audioBlob, audioUrl)
 | 
					              this.addMessage('user', transcription, '你的跟读', audioBlob, audioUrl)
 | 
				
			||||||
              this.updateScores()
 | 
					              this.updateScores()
 | 
				
			||||||
@ -314,6 +258,7 @@
 | 
				
			|||||||
      uploadAudioFile() {
 | 
					      uploadAudioFile() {
 | 
				
			||||||
        this.$refs.fileInput.click()
 | 
					        this.$refs.fileInput.click()
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
 | 
					      //文件上传
 | 
				
			||||||
      async handleFileUpload(event) {
 | 
					      async handleFileUpload(event) {
 | 
				
			||||||
        const file = event.target.files[0]
 | 
					        const file = event.target.files[0]
 | 
				
			||||||
        if (!file) return
 | 
					        if (!file) return
 | 
				
			||||||
@ -343,13 +288,19 @@
 | 
				
			|||||||
          audioUrl,
 | 
					          audioUrl,
 | 
				
			||||||
          timestamp: new Date()
 | 
					          timestamp: new Date()
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        // console.log('selectedExample:',this.selectedExample);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 添加到当前示例的对话历史
 | 
					        // 添加到当前示例的对话历史
 | 
				
			||||||
        if (this.selectedExample !== null) {
 | 
					          // this.examples[this.selectedExample].messages.push(message)
 | 
				
			||||||
          this.examples[this.selectedExample].messages.push(message)
 | 
					          // console.log('11111111',this.examples[this.selectedExample]);
 | 
				
			||||||
 | 
					          // console.log(message);
 | 
				
			||||||
 | 
					          
 | 
				
			||||||
          // 同时更新当前显示的messages
 | 
					          // 同时更新当前显示的messages
 | 
				
			||||||
          this.messages = this.examples[this.selectedExample].messages
 | 
					          // this.messages = this.examples[this.selectedExample].messages
 | 
				
			||||||
        }
 | 
					          this.messages.push(message);
 | 
				
			||||||
 | 
					          console.log("message:",this.messages);
 | 
				
			||||||
 | 
					          
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      updateScores() {
 | 
					      updateScores() {
 | 
				
			||||||
        const oldPronunciation = this.pronunciationScore
 | 
					        const oldPronunciation = this.pronunciationScore
 | 
				
			||||||
@ -363,6 +314,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        console.log(`评分更新 - 发音: ${oldPronunciation} → ${this.pronunciationScore}, 地道: ${oldAuthenticity} → ${this.authenticityScore}`)
 | 
					        console.log(`评分更新 - 发音: ${oldPronunciation} → ${this.pronunciationScore}, 地道: ${oldAuthenticity} → ${this.authenticityScore}`)
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
 | 
					      //播放声音
 | 
				
			||||||
      playAudio(message, event) {
 | 
					      playAudio(message, event) {
 | 
				
			||||||
        if (message.audioUrl) {
 | 
					        if (message.audioUrl) {
 | 
				
			||||||
          const audio = new Audio(message.audioUrl)
 | 
					          const audio = new Audio(message.audioUrl)
 | 
				
			||||||
@ -377,26 +329,14 @@
 | 
				
			|||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      editText(message) {
 | 
					      // selectExample(exampleIndex) {
 | 
				
			||||||
        console.log('编辑文本:', message.text)
 | 
					      //   if (this.isDragging) return
 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      favoriteMessage(message) {
 | 
					 | 
				
			||||||
        console.log('收藏消息:', message.text)
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      sendMessage() {
 | 
					 | 
				
			||||||
        console.log('发送消息')
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      startCall() {
 | 
					 | 
				
			||||||
        console.log('开始通话')
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      selectExample(exampleIndex) {
 | 
					 | 
				
			||||||
        if (this.isDragging) return
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.selectedExample = exampleIndex
 | 
					      //   this.selectedExample = exampleIndex
 | 
				
			||||||
      //   切换到对应示例的对话历史
 | 
					      //   切换到对应示例的对话历史
 | 
				
			||||||
        this.messages = this.examples[exampleIndex].messages
 | 
					      //   this.messages = this.examples[exampleIndex].messages;
 | 
				
			||||||
        console.log('选择了示例:', this.examples[exampleIndex].name)
 | 
					      //   console.log('选择了示例:', this.examples[exampleIndex].name)
 | 
				
			||||||
      },
 | 
					      // },
 | 
				
			||||||
      playExample(event) {
 | 
					      playExample(event) {
 | 
				
			||||||
        if (this.currentExample) {
 | 
					        if (this.currentExample) {
 | 
				
			||||||
          // 根据选中的示例索引播放对应的MP3文件
 | 
					          // 根据选中的示例索引播放对应的MP3文件
 | 
				
			||||||
@ -506,44 +446,44 @@
 | 
				
			|||||||
          this.recordingTimer = null
 | 
					          this.recordingTimer = null
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      handleTouchStart(e) {
 | 
					      // handleTouchStart(e) {
 | 
				
			||||||
        this.isDragging = true
 | 
					      //   this.isDragging = true
 | 
				
			||||||
        this.startX = e.touches[0].clientX
 | 
					      //   this.startX = e.touches[0].clientX
 | 
				
			||||||
        this.currentX = this.startX
 | 
					      //   this.currentX = this.startX
 | 
				
			||||||
        this.scrollLeft = this.$refs.exampleContainer.scrollLeft
 | 
					      //   this.scrollLeft = this.$refs.exampleContainer.scrollLeft
 | 
				
			||||||
      },
 | 
					      // },
 | 
				
			||||||
      handleTouchMove(e) {
 | 
					      // handleTouchMove(e) {
 | 
				
			||||||
        if (!this.isDragging) return
 | 
					      //   if (!this.isDragging) return
 | 
				
			||||||
        e.preventDefault()
 | 
					      //   e.preventDefault()
 | 
				
			||||||
        this.currentX = e.touches[0].clientX
 | 
					      //   this.currentX = e.touches[0].clientX
 | 
				
			||||||
        const diff = this.currentX - this.startX
 | 
					      //   const diff = this.currentX - this.startX
 | 
				
			||||||
        this.$refs.exampleContainer.scrollLeft = this.scrollLeft - diff
 | 
					      //   this.$refs.exampleContainer.scrollLeft = this.scrollLeft - diff
 | 
				
			||||||
      },
 | 
					      // },
 | 
				
			||||||
      handleTouchEnd() {
 | 
					      // handleTouchEnd() {
 | 
				
			||||||
        this.isDragging = false
 | 
					      //   this.isDragging = false
 | 
				
			||||||
      },
 | 
					      // },
 | 
				
			||||||
      handleMouseDown(e) {
 | 
					      // handleMouseDown(e) {
 | 
				
			||||||
        this.isDragging = true
 | 
					      //   this.isDragging = true
 | 
				
			||||||
        this.startX = e.clientX
 | 
					      //   this.startX = e.clientX
 | 
				
			||||||
        this.currentX = this.startX
 | 
					      //   this.currentX = this.startX
 | 
				
			||||||
        this.scrollLeft = this.$refs.exampleContainer.scrollLeft
 | 
					      //   this.scrollLeft = this.$refs.exampleContainer.scrollLeft
 | 
				
			||||||
        this.$refs.exampleContainer.style.cursor = 'grabbing'
 | 
					      //   this.$refs.exampleContainer.style.cursor = 'grabbing'
 | 
				
			||||||
      },
 | 
					      // },
 | 
				
			||||||
      handleMouseMove(e) {
 | 
					      // handleMouseMove(e) {
 | 
				
			||||||
        if (!this.isDragging) return
 | 
					      //   if (!this.isDragging) return
 | 
				
			||||||
        e.preventDefault()
 | 
					      //   e.preventDefault()
 | 
				
			||||||
        this.currentX = e.clientX
 | 
					      //   this.currentX = e.clientX
 | 
				
			||||||
        const diff = this.currentX - this.startX
 | 
					      //   const diff = this.currentX - this.startX
 | 
				
			||||||
        this.$refs.exampleContainer.scrollLeft = this.scrollLeft - diff
 | 
					      //   this.$refs.exampleContainer.scrollLeft = this.scrollLeft - diff
 | 
				
			||||||
      },
 | 
					      // },
 | 
				
			||||||
      handleMouseUp() {
 | 
					      // handleMouseUp() {
 | 
				
			||||||
        this.isDragging = false
 | 
					      //   this.isDragging = false
 | 
				
			||||||
        this.$refs.exampleContainer.style.cursor = 'grab'
 | 
					      //   this.$refs.exampleContainer.style.cursor = 'grab'
 | 
				
			||||||
      },
 | 
					      // },
 | 
				
			||||||
      handleMouseLeave() {
 | 
					      // handleMouseLeave() {
 | 
				
			||||||
        this.isDragging = false
 | 
					      //   this.isDragging = false
 | 
				
			||||||
        this.$refs.exampleContainer.style.cursor = 'grab'
 | 
					      //   this.$refs.exampleContainer.style.cursor = 'grab'
 | 
				
			||||||
      },
 | 
					      // },
 | 
				
			||||||
      initMobileOptimizations() {
 | 
					      initMobileOptimizations() {
 | 
				
			||||||
        let lastTouchEnd = 0
 | 
					        let lastTouchEnd = 0
 | 
				
			||||||
        this.doubleTapHandler = (event) => {
 | 
					        this.doubleTapHandler = (event) => {
 | 
				
			||||||
@ -655,7 +595,7 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    mounted() {
 | 
					    mounted() {
 | 
				
			||||||
      this.selectExample(0)
 | 
					      // this.selectExample(0);
 | 
				
			||||||
      this.$nextTick(() => {
 | 
					      this.$nextTick(() => {
 | 
				
			||||||
        if (this.$refs.exampleContainer) {
 | 
					        if (this.$refs.exampleContainer) {
 | 
				
			||||||
          this.containerWidth = this.$refs.exampleContainer.offsetWidth
 | 
					          this.containerWidth = this.$refs.exampleContainer.offsetWidth
 | 
				
			||||||
@ -684,14 +624,66 @@
 | 
				
			|||||||
    height: 100vh;
 | 
					    height: 100vh;
 | 
				
			||||||
    height: 100dvh; /* 使用动态视口高度 */
 | 
					    height: 100dvh; /* 使用动态视口高度 */
 | 
				
			||||||
    height: calc(var(--vh, 1vh) * 100); /* 使用CSS变量 */
 | 
					    height: calc(var(--vh, 1vh) * 100); /* 使用CSS变量 */
 | 
				
			||||||
 | 
					    width: 80%;
 | 
				
			||||||
    display: flex;
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    margin: 0 auto;
 | 
				
			||||||
 | 
					    /* justify-content: center; */
 | 
				
			||||||
 | 
					    /* align-items: center; */
 | 
				
			||||||
    flex-direction: column;
 | 
					    flex-direction: column;
 | 
				
			||||||
    background: white;
 | 
					    background: #FFF;
 | 
				
			||||||
    overflow: hidden;
 | 
					 | 
				
			||||||
    /* 确保在移动端浏览器中底部区域可见 */
 | 
					    /* 确保在移动端浏览器中底部区域可见 */
 | 
				
			||||||
    padding-bottom: env(safe-area-inset-bottom);
 | 
					    padding-bottom: env(safe-area-inset-bottom);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  .card-container {
 | 
				
			||||||
 | 
					    height: 100%; 
 | 
				
			||||||
 | 
					    margin: 1.5rem 3.5rem 0 3.5rem;
 | 
				
			||||||
 | 
					    background: #2196F3;
 | 
				
			||||||
 | 
					      .card-content {
 | 
				
			||||||
 | 
					      height: 26.5rem;
 | 
				
			||||||
 | 
					      overflow-y: auto;
 | 
				
			||||||
 | 
					      padding-bottom: 1rem;
 | 
				
			||||||
 | 
					      margin-bottom: 1rem;
 | 
				
			||||||
 | 
					      .item {
 | 
				
			||||||
 | 
					          width: 100%;
 | 
				
			||||||
 | 
					          padding: 0 2rem;
 | 
				
			||||||
 | 
					          box-sizing: border-box;
 | 
				
			||||||
 | 
					          flex: 1;
 | 
				
			||||||
 | 
					          overflow-y: auto;
 | 
				
			||||||
 | 
					          background: #fff;
 | 
				
			||||||
 | 
					          display: flex;
 | 
				
			||||||
 | 
					          flex-direction: column;
 | 
				
			||||||
 | 
					          .right {
 | 
				
			||||||
 | 
					              max-width: 65%;
 | 
				
			||||||
 | 
					              display: flex;
 | 
				
			||||||
 | 
					              align-self: flex-end;
 | 
				
			||||||
 | 
					              flex-direction: row-reverse;
 | 
				
			||||||
 | 
					              .text {
 | 
				
			||||||
 | 
					                  word-break: break-all;
 | 
				
			||||||
 | 
					                  padding: 0.5rem 0.3rem;
 | 
				
			||||||
 | 
					                  border-radius: 0.2rem;
 | 
				
			||||||
 | 
					                  background-color: #BCF56F;
 | 
				
			||||||
 | 
					                  font-size: 0.875rem;
 | 
				
			||||||
 | 
					                  line-height: 1.25rem;
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          .left {
 | 
				
			||||||
 | 
					              max-width: 65%;
 | 
				
			||||||
 | 
					              display: flex;
 | 
				
			||||||
 | 
					              align-self: flex-start;
 | 
				
			||||||
 | 
					              margin-top: 2rem;
 | 
				
			||||||
 | 
					              .text {
 | 
				
			||||||
 | 
					                  list-style-position: inside;
 | 
				
			||||||
 | 
					                  word-break: break-all;
 | 
				
			||||||
 | 
					                  padding: 0.5rem 0.6rem;
 | 
				
			||||||
 | 
					                  background: #F3F4F6;
 | 
				
			||||||
 | 
					                  border-radius: 0.2rem;
 | 
				
			||||||
 | 
					                  font-size: 0.875rem;
 | 
				
			||||||
 | 
					                  line-height: 1.25rem;
 | 
				
			||||||
 | 
					                  }
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  .score-section {
 | 
					  .score-section {
 | 
				
			||||||
    display: flex;
 | 
					    display: flex;
 | 
				
			||||||
    justify-content: space-around;
 | 
					    justify-content: space-around;
 | 
				
			||||||
@ -881,8 +873,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  .conversation-area {
 | 
					  .conversation-area {
 | 
				
			||||||
    flex: 1;
 | 
					    flex: 1;
 | 
				
			||||||
    padding: 15px 10px;
 | 
					    /* margin-top: 1rem; */
 | 
				
			||||||
 | 
					    padding: 2rem 3rem;
 | 
				
			||||||
    overflow-y: auto;
 | 
					    overflow-y: auto;
 | 
				
			||||||
 | 
					    scrollbar-width: none;
 | 
				
			||||||
    -webkit-overflow-scrolling: touch;
 | 
					    -webkit-overflow-scrolling: touch;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -891,10 +885,9 @@
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .message {
 | 
					  .message {
 | 
				
			||||||
    margin-bottom: 12px;
 | 
					    margin-bottom: 0.6rem;
 | 
				
			||||||
    display: flex;
 | 
					    display: flex;
 | 
				
			||||||
    align-items: flex-start;
 | 
					    /* align-items: flex-start; */
 | 
				
			||||||
    gap: 8px;
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .message.ai {
 | 
					  .message.ai {
 | 
				
			||||||
@ -902,19 +895,23 @@
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .message.user {
 | 
					  .message.user {
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
    flex-direction: row-reverse;
 | 
					    flex-direction: row-reverse;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  .message-box{
 | 
				
			||||||
 | 
					      display: flex;
 | 
				
			||||||
 | 
					      flex-direction: column;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  .message-content {
 | 
					  .message-content {
 | 
				
			||||||
    max-width: 75%;
 | 
					    max-width: 25rem;
 | 
				
			||||||
    padding: 10px 12px;
 | 
					    padding: 1rem ;
 | 
				
			||||||
    border-radius: 16px;
 | 
					    border-radius: 1rem;
 | 
				
			||||||
    position: relative;
 | 
					    position: relative;
 | 
				
			||||||
    word-wrap: break-word;
 | 
					    word-wrap: break-word;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .message-content.example {
 | 
					  .message-content.example {
 | 
				
			||||||
    border: 2px solid #ff6b6b;
 | 
					    border: 1px solid #ff6b6b;
 | 
				
			||||||
    background: rgba(255, 107, 107, 0.05);
 | 
					    background: rgba(255, 107, 107, 0.05);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -924,17 +921,39 @@
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .message.user .message-content {
 | 
					  .message.user .message-content {
 | 
				
			||||||
    background: #007AFF;
 | 
					    background: #9ee443;
 | 
				
			||||||
    color: white;
 | 
					    color: white;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  .message-scores{
 | 
				
			||||||
 | 
					    width: 10.5rem;
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    align-self:flex-end;
 | 
				
			||||||
 | 
					    border: 1px solid #dad1d1;
 | 
				
			||||||
 | 
					    border-radius: 1rem;
 | 
				
			||||||
 | 
					    font-size: 0.875rem;
 | 
				
			||||||
 | 
					    color: #9ee443;
 | 
				
			||||||
 | 
					    padding: 0.21rem 0.7rem;
 | 
				
			||||||
 | 
					    margin-top: 0.2rem;
 | 
				
			||||||
 | 
					    .t-divider{
 | 
				
			||||||
 | 
					      height: 100%;
 | 
				
			||||||
 | 
					      padding-top: 0.5rem;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    .pronunciation{
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  .message-text {
 | 
					  .message-text {
 | 
				
			||||||
    font-size: 14px;
 | 
					    font-size: 0.875rem;
 | 
				
			||||||
    line-height: 1.4;
 | 
					    line-height: 1.4;
 | 
				
			||||||
    margin-bottom: 4px;
 | 
					    margin-bottom: 0.2rem;
 | 
				
			||||||
    font-weight: 500;
 | 
					    font-weight: 500;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  .message-icon{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .t-icon{
 | 
				
			||||||
 | 
					      font-size: 1.15rem;
 | 
				
			||||||
 | 
					      margin-right: 0.35rem;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  .message.ai .message-text {
 | 
					  .message.ai .message-text {
 | 
				
			||||||
    color: #2c3e50;
 | 
					    color: #2c3e50;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@ -944,22 +963,10 @@
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .message-translation {
 | 
					  .message-translation {
 | 
				
			||||||
    font-size: 12px;
 | 
					    font-size: 0.875rem;
 | 
				
			||||||
    opacity: 0.8;
 | 
					    opacity: 0.8;
 | 
				
			||||||
    font-style: italic;
 | 
					    font-style: italic;
 | 
				
			||||||
    margin-top: 4px;
 | 
					    margin-top: 0.2rem;
 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .example-badge {
 | 
					 | 
				
			||||||
    position: absolute;
 | 
					 | 
				
			||||||
    top: -6px;
 | 
					 | 
				
			||||||
    left: -6px;
 | 
					 | 
				
			||||||
    background: #ff6b6b;
 | 
					 | 
				
			||||||
    color: white;
 | 
					 | 
				
			||||||
    font-size: 9px;
 | 
					 | 
				
			||||||
    padding: 2px 5px;
 | 
					 | 
				
			||||||
    border-radius: 8px;
 | 
					 | 
				
			||||||
    font-weight: bold;
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .message-actions {
 | 
					  .message-actions {
 | 
				
			||||||
@ -1059,17 +1066,47 @@
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .voice-input-area {
 | 
					  .voice-input-area {
 | 
				
			||||||
    padding: 15px 10px;
 | 
					    width: 100%;
 | 
				
			||||||
    padding-bottom: calc(15px + env(safe-area-inset-bottom));
 | 
					    padding: 1rem 2rem;
 | 
				
			||||||
    background: white;
 | 
					    background: white;
 | 
				
			||||||
    border-top: 1px solid #e0e0e0;
 | 
					 | 
				
			||||||
    display: flex;
 | 
					    display: flex;
 | 
				
			||||||
    align-items: center;
 | 
					    align-items: center;
 | 
				
			||||||
    justify-content: space-between;
 | 
					 | 
				
			||||||
    flex-shrink: 0;
 | 
					    flex-shrink: 0;
 | 
				
			||||||
    /* 确保在移动端浏览器中始终可见 */
 | 
					    /* 确保在移动端浏览器中始终可见 */
 | 
				
			||||||
    position: relative;
 | 
					    position: relative;
 | 
				
			||||||
    z-index: 1000;
 | 
					    z-index: 1000;
 | 
				
			||||||
 | 
					    .voice-box{
 | 
				
			||||||
 | 
					      display: flex;
 | 
				
			||||||
 | 
					      align-self:center;
 | 
				
			||||||
 | 
					      justify-content: center;
 | 
				
			||||||
 | 
					      position: relative;
 | 
				
			||||||
 | 
					      width: 100%;
 | 
				
			||||||
 | 
					      height: 2.5rem;
 | 
				
			||||||
 | 
					      border: 1px solid #999;
 | 
				
			||||||
 | 
					      border-radius: 1rem;
 | 
				
			||||||
 | 
					      background-color: #FFF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .voice-button{
 | 
				
			||||||
 | 
					        position: absolute;
 | 
				
			||||||
 | 
					        top: 25%;
 | 
				
			||||||
 | 
					        width: 85%;
 | 
				
			||||||
 | 
					        border: none;
 | 
				
			||||||
 | 
					        background-color: #FFF;
 | 
				
			||||||
 | 
					          .t-icon{ 
 | 
				
			||||||
 | 
					            font-size: 1.1rem;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      .icon-right{
 | 
				
			||||||
 | 
					        position: absolute;
 | 
				
			||||||
 | 
					        right: 1%; 
 | 
				
			||||||
 | 
					        top: 15%;
 | 
				
			||||||
 | 
					        .t-icon{
 | 
				
			||||||
 | 
					          margin-left: 0.2rem;
 | 
				
			||||||
 | 
					          margin-right: 0.3rem;
 | 
				
			||||||
 | 
					          font-size: 1.1rem;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .voice-controls {
 | 
					  .voice-controls {
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										367
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										367
									
								
								yarn.lock
									
									
									
									
									
								
							@ -4,262 +4,94 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
"@babel/helper-string-parser@^7.27.1":
 | 
					"@babel/helper-string-parser@^7.27.1":
 | 
				
			||||||
  version "7.27.1"
 | 
					  version "7.27.1"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687"
 | 
					  resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz"
 | 
				
			||||||
  integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==
 | 
					  integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@babel/helper-validator-identifier@^7.27.1":
 | 
					"@babel/helper-validator-identifier@^7.27.1":
 | 
				
			||||||
  version "7.27.1"
 | 
					  version "7.27.1"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8"
 | 
					  resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz"
 | 
				
			||||||
  integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==
 | 
					  integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@babel/parser@^7.28.0":
 | 
					"@babel/parser@^7.28.0":
 | 
				
			||||||
  version "7.28.0"
 | 
					  version "7.28.0"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.0.tgz#979829fbab51a29e13901e5a80713dbcb840825e"
 | 
					  resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.0.tgz"
 | 
				
			||||||
  integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==
 | 
					  integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@babel/types" "^7.28.0"
 | 
					    "@babel/types" "^7.28.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"@babel/runtime@^7.16.3", "@babel/runtime@^7.22.6":
 | 
				
			||||||
 | 
					  version "7.28.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.2.tgz"
 | 
				
			||||||
 | 
					  integrity sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@babel/types@^7.28.0":
 | 
					"@babel/types@^7.28.0":
 | 
				
			||||||
  version "7.28.1"
 | 
					  version "7.28.1"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@babel/types/-/types-7.28.1.tgz#2aaf3c10b31ba03a77ac84f52b3912a0edef4cf9"
 | 
					  resolved "https://registry.npmmirror.com/@babel/types/-/types-7.28.1.tgz"
 | 
				
			||||||
  integrity sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==
 | 
					  integrity sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@babel/helper-string-parser" "^7.27.1"
 | 
					    "@babel/helper-string-parser" "^7.27.1"
 | 
				
			||||||
    "@babel/helper-validator-identifier" "^7.27.1"
 | 
					    "@babel/helper-validator-identifier" "^7.27.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@esbuild/aix-ppc64@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f"
 | 
					 | 
				
			||||||
  integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/android-arm64@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052"
 | 
					 | 
				
			||||||
  integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/android-arm@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28"
 | 
					 | 
				
			||||||
  integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/android-x64@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e"
 | 
					 | 
				
			||||||
  integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/darwin-arm64@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a"
 | 
					 | 
				
			||||||
  integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/darwin-x64@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22"
 | 
					 | 
				
			||||||
  integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/freebsd-arm64@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e"
 | 
					 | 
				
			||||||
  integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/freebsd-x64@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261"
 | 
					 | 
				
			||||||
  integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/linux-arm64@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b"
 | 
					 | 
				
			||||||
  integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/linux-arm@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9"
 | 
					 | 
				
			||||||
  integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/linux-ia32@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2"
 | 
					 | 
				
			||||||
  integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/linux-loong64@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df"
 | 
					 | 
				
			||||||
  integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/linux-mips64el@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe"
 | 
					 | 
				
			||||||
  integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/linux-ppc64@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4"
 | 
					 | 
				
			||||||
  integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/linux-riscv64@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc"
 | 
					 | 
				
			||||||
  integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/linux-s390x@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de"
 | 
					 | 
				
			||||||
  integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/linux-x64@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0"
 | 
					 | 
				
			||||||
  integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/netbsd-x64@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047"
 | 
					 | 
				
			||||||
  integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/openbsd-x64@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70"
 | 
					 | 
				
			||||||
  integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/sunos-x64@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b"
 | 
					 | 
				
			||||||
  integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/win32-arm64@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d"
 | 
					 | 
				
			||||||
  integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/win32-ia32@0.21.5":
 | 
					 | 
				
			||||||
  version "0.21.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b"
 | 
					 | 
				
			||||||
  integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@esbuild/win32-x64@0.21.5":
 | 
					"@esbuild/win32-x64@0.21.5":
 | 
				
			||||||
  version "0.21.5"
 | 
					  version "0.21.5"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c"
 | 
					  resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz"
 | 
				
			||||||
  integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==
 | 
					  integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@jridgewell/sourcemap-codec@^1.5.0":
 | 
					"@jridgewell/sourcemap-codec@^1.5.0":
 | 
				
			||||||
  version "1.5.4"
 | 
					  version "1.5.4"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz#7358043433b2e5da569aa02cbc4c121da3af27d7"
 | 
					  resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz"
 | 
				
			||||||
  integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==
 | 
					  integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@rollup/rollup-android-arm-eabi@4.45.1":
 | 
					"@popperjs/core@^2.11.8":
 | 
				
			||||||
  version "4.45.1"
 | 
					  version "2.11.8"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz#8560592f0dcf43b8cb0949af9f1d916205148d12"
 | 
					  resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz"
 | 
				
			||||||
  integrity sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==
 | 
					  integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
 | 
				
			||||||
 | 
					 | 
				
			||||||
"@rollup/rollup-android-arm64@4.45.1":
 | 
					 | 
				
			||||||
  version "4.45.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.1.tgz#6bfb777bbce998691b6fd3e916b05cd46392d020"
 | 
					 | 
				
			||||||
  integrity sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@rollup/rollup-darwin-arm64@4.45.1":
 | 
					 | 
				
			||||||
  version "4.45.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.1.tgz#7efce10220293a22e7b7b595d05d8b8400a7bcf3"
 | 
					 | 
				
			||||||
  integrity sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@rollup/rollup-darwin-x64@4.45.1":
 | 
					 | 
				
			||||||
  version "4.45.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.1.tgz#c617a8ece21050bfbea299c126767d2e70cfa79a"
 | 
					 | 
				
			||||||
  integrity sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@rollup/rollup-freebsd-arm64@4.45.1":
 | 
					 | 
				
			||||||
  version "4.45.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.1.tgz#5a6af0a9acf82162d2910933649ae24fc0ea3ecb"
 | 
					 | 
				
			||||||
  integrity sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@rollup/rollup-freebsd-x64@4.45.1":
 | 
					 | 
				
			||||||
  version "4.45.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.1.tgz#ae9709463560196fc275bd0da598668a2e341023"
 | 
					 | 
				
			||||||
  integrity sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@rollup/rollup-linux-arm-gnueabihf@4.45.1":
 | 
					 | 
				
			||||||
  version "4.45.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.1.tgz#6ec52661764dbd54c19d6520a403aa385a5c0fbf"
 | 
					 | 
				
			||||||
  integrity sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@rollup/rollup-linux-arm-musleabihf@4.45.1":
 | 
					 | 
				
			||||||
  version "4.45.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.1.tgz#fd33ba4a43ef8419e96811236493d19436271923"
 | 
					 | 
				
			||||||
  integrity sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@rollup/rollup-linux-arm64-gnu@4.45.1":
 | 
					 | 
				
			||||||
  version "4.45.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.1.tgz#933b3d99b73c9d7bf4506cab0d5d313c7e74fd2d"
 | 
					 | 
				
			||||||
  integrity sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@rollup/rollup-linux-arm64-musl@4.45.1":
 | 
					 | 
				
			||||||
  version "4.45.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.1.tgz#dbe9ae24ee9e97b75662fddcb69eb7f23c89280a"
 | 
					 | 
				
			||||||
  integrity sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@rollup/rollup-linux-loongarch64-gnu@4.45.1":
 | 
					 | 
				
			||||||
  version "4.45.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.1.tgz#818c5a071eec744436dbcdd76fe9c3c869dc9a8d"
 | 
					 | 
				
			||||||
  integrity sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@rollup/rollup-linux-powerpc64le-gnu@4.45.1":
 | 
					 | 
				
			||||||
  version "4.45.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.1.tgz#6b8591def27d886fa147fb0340126c7d6682a7e4"
 | 
					 | 
				
			||||||
  integrity sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@rollup/rollup-linux-riscv64-gnu@4.45.1":
 | 
					 | 
				
			||||||
  version "4.45.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.1.tgz#f1861ac4ee8da64e0b0d23853ff26fe2baa876cf"
 | 
					 | 
				
			||||||
  integrity sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@rollup/rollup-linux-riscv64-musl@4.45.1":
 | 
					 | 
				
			||||||
  version "4.45.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.1.tgz#320c961401a923b374e358664527b188e374e1ae"
 | 
					 | 
				
			||||||
  integrity sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@rollup/rollup-linux-s390x-gnu@4.45.1":
 | 
					 | 
				
			||||||
  version "4.45.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.1.tgz#1763eed3362b50b6164d3f0947486c03cc7e616d"
 | 
					 | 
				
			||||||
  integrity sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@rollup/rollup-linux-x64-gnu@4.45.1":
 | 
					 | 
				
			||||||
  version "4.45.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz#0d4c8d0b8f801902f0844a40a9d981a0179f4971"
 | 
					 | 
				
			||||||
  integrity sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@rollup/rollup-linux-x64-musl@4.45.1":
 | 
					 | 
				
			||||||
  version "4.45.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.1.tgz#ec30bb48b5fe22a3aaba98072f2d5b7139e1a8eb"
 | 
					 | 
				
			||||||
  integrity sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@rollup/rollup-win32-arm64-msvc@4.45.1":
 | 
					 | 
				
			||||||
  version "4.45.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.1.tgz#27a6e48d1502e8e4bed96bedfb533738655874f2"
 | 
					 | 
				
			||||||
  integrity sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@rollup/rollup-win32-ia32-msvc@4.45.1":
 | 
					 | 
				
			||||||
  version "4.45.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.1.tgz#a2fbad3bec20ff879f3fd51720adf33692ca8f3d"
 | 
					 | 
				
			||||||
  integrity sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@rollup/rollup-win32-x64-msvc@4.45.1":
 | 
					"@rollup/rollup-win32-x64-msvc@4.45.1":
 | 
				
			||||||
  version "4.45.1"
 | 
					  version "4.45.1"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz#e5085c6d13da15b4c5133cd2a6bb11f25b6bb77a"
 | 
					  resolved "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz"
 | 
				
			||||||
  integrity sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==
 | 
					  integrity sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@types/estree@1.0.8":
 | 
					"@types/estree@1.0.8":
 | 
				
			||||||
  version "1.0.8"
 | 
					  version "1.0.8"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e"
 | 
					  resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz"
 | 
				
			||||||
  integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
 | 
					  integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"@types/lodash-es@^4.17.12":
 | 
				
			||||||
 | 
					  version "4.17.12"
 | 
				
			||||||
 | 
					  resolved "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz"
 | 
				
			||||||
 | 
					  integrity sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    "@types/lodash" "*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"@types/lodash@*":
 | 
				
			||||||
 | 
					  version "4.17.20"
 | 
				
			||||||
 | 
					  resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz"
 | 
				
			||||||
 | 
					  integrity sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"@types/sortablejs@^1.15.1":
 | 
				
			||||||
 | 
					  version "1.15.8"
 | 
				
			||||||
 | 
					  resolved "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.8.tgz"
 | 
				
			||||||
 | 
					  integrity sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"@types/tinycolor2@^1.4.3":
 | 
				
			||||||
 | 
					  version "1.4.6"
 | 
				
			||||||
 | 
					  resolved "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz"
 | 
				
			||||||
 | 
					  integrity sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"@types/validator@^13.7.17":
 | 
				
			||||||
 | 
					  version "13.15.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.npmjs.org/@types/validator/-/validator-13.15.2.tgz"
 | 
				
			||||||
 | 
					  integrity sha512-y7pa/oEJJ4iGYBxOpfAKn5b9+xuihvzDVnC/OSvlVnGxVg0pOqmjiMafiJ1KVNQEaPZf9HsEp5icEwGg8uIe5Q==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@vitejs/plugin-vue@^5.0.0":
 | 
					"@vitejs/plugin-vue@^5.0.0":
 | 
				
			||||||
  version "5.2.4"
 | 
					  version "5.2.4"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz#9e8a512eb174bfc2a333ba959bbf9de428d89ad8"
 | 
					  resolved "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz"
 | 
				
			||||||
  integrity sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==
 | 
					  integrity sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@vue/compiler-core@3.5.18":
 | 
					"@vue/compiler-core@3.5.18":
 | 
				
			||||||
  version "3.5.18"
 | 
					  version "3.5.18"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.18.tgz#521a138cdd970d9bfd27e42168d12f77a04b2074"
 | 
					  resolved "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.18.tgz"
 | 
				
			||||||
  integrity sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==
 | 
					  integrity sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@babel/parser" "^7.28.0"
 | 
					    "@babel/parser" "^7.28.0"
 | 
				
			||||||
@ -270,7 +102,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
"@vue/compiler-dom@3.5.18":
 | 
					"@vue/compiler-dom@3.5.18":
 | 
				
			||||||
  version "3.5.18"
 | 
					  version "3.5.18"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz#e13504492c3061ec5bbe6a2e789f15261d4f03a7"
 | 
					  resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz"
 | 
				
			||||||
  integrity sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==
 | 
					  integrity sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@vue/compiler-core" "3.5.18"
 | 
					    "@vue/compiler-core" "3.5.18"
 | 
				
			||||||
@ -278,7 +110,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
"@vue/compiler-sfc@3.5.18":
 | 
					"@vue/compiler-sfc@3.5.18":
 | 
				
			||||||
  version "3.5.18"
 | 
					  version "3.5.18"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz#ba1e849561337d809937994cdaf900539542eeca"
 | 
					  resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz"
 | 
				
			||||||
  integrity sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==
 | 
					  integrity sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@babel/parser" "^7.28.0"
 | 
					    "@babel/parser" "^7.28.0"
 | 
				
			||||||
@ -293,7 +125,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
"@vue/compiler-ssr@3.5.18":
 | 
					"@vue/compiler-ssr@3.5.18":
 | 
				
			||||||
  version "3.5.18"
 | 
					  version "3.5.18"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz#aecde0b0bff268a9c9014ba66799307c4a784328"
 | 
					  resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz"
 | 
				
			||||||
  integrity sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==
 | 
					  integrity sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@vue/compiler-dom" "3.5.18"
 | 
					    "@vue/compiler-dom" "3.5.18"
 | 
				
			||||||
@ -301,19 +133,19 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
"@vue/devtools-api@^6.6.4":
 | 
					"@vue/devtools-api@^6.6.4":
 | 
				
			||||||
  version "6.6.4"
 | 
					  version "6.6.4"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz#cbe97fe0162b365edc1dba80e173f90492535343"
 | 
					  resolved "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz"
 | 
				
			||||||
  integrity sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==
 | 
					  integrity sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@vue/reactivity@3.5.18":
 | 
					"@vue/reactivity@3.5.18":
 | 
				
			||||||
  version "3.5.18"
 | 
					  version "3.5.18"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.18.tgz#fe32166e3938832c54b4134e60e9b58ca7d9bdb4"
 | 
					  resolved "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.18.tgz"
 | 
				
			||||||
  integrity sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==
 | 
					  integrity sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@vue/shared" "3.5.18"
 | 
					    "@vue/shared" "3.5.18"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@vue/runtime-core@3.5.18":
 | 
					"@vue/runtime-core@3.5.18":
 | 
				
			||||||
  version "3.5.18"
 | 
					  version "3.5.18"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.18.tgz#9e9ae8b9491548b53d0cea2bf25746d27c52e191"
 | 
					  resolved "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.18.tgz"
 | 
				
			||||||
  integrity sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==
 | 
					  integrity sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@vue/reactivity" "3.5.18"
 | 
					    "@vue/reactivity" "3.5.18"
 | 
				
			||||||
@ -321,7 +153,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
"@vue/runtime-dom@3.5.18":
 | 
					"@vue/runtime-dom@3.5.18":
 | 
				
			||||||
  version "3.5.18"
 | 
					  version "3.5.18"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz#1150952d1048b5822e4f1dd8aed24665cbb22107"
 | 
					  resolved "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz"
 | 
				
			||||||
  integrity sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==
 | 
					  integrity sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@vue/reactivity" "3.5.18"
 | 
					    "@vue/reactivity" "3.5.18"
 | 
				
			||||||
@ -331,7 +163,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
"@vue/server-renderer@3.5.18":
 | 
					"@vue/server-renderer@3.5.18":
 | 
				
			||||||
  version "3.5.18"
 | 
					  version "3.5.18"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.18.tgz#e9fa267b95b3a1d8cddca762377e5de2ae9122bd"
 | 
					  resolved "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.18.tgz"
 | 
				
			||||||
  integrity sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==
 | 
					  integrity sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@vue/compiler-ssr" "3.5.18"
 | 
					    "@vue/compiler-ssr" "3.5.18"
 | 
				
			||||||
@ -339,22 +171,27 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
"@vue/shared@3.5.18":
 | 
					"@vue/shared@3.5.18":
 | 
				
			||||||
  version "3.5.18"
 | 
					  version "3.5.18"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.18.tgz#529f24a88d3ed678d50fd5c07455841fbe8ac95e"
 | 
					  resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.18.tgz"
 | 
				
			||||||
  integrity sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==
 | 
					  integrity sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
csstype@^3.1.3:
 | 
					csstype@^3.1.3:
 | 
				
			||||||
  version "3.1.3"
 | 
					  version "3.1.3"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
 | 
					  resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz"
 | 
				
			||||||
  integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
 | 
					  integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dayjs@^1.11.10:
 | 
				
			||||||
 | 
					  version "1.11.13"
 | 
				
			||||||
 | 
					  resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz"
 | 
				
			||||||
 | 
					  integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
entities@^4.5.0:
 | 
					entities@^4.5.0:
 | 
				
			||||||
  version "4.5.0"
 | 
					  version "4.5.0"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
 | 
					  resolved "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz"
 | 
				
			||||||
  integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
 | 
					  integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
esbuild@^0.21.3:
 | 
					esbuild@^0.21.3:
 | 
				
			||||||
  version "0.21.5"
 | 
					  version "0.21.5"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d"
 | 
					  resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz"
 | 
				
			||||||
  integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==
 | 
					  integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==
 | 
				
			||||||
  optionalDependencies:
 | 
					  optionalDependencies:
 | 
				
			||||||
    "@esbuild/aix-ppc64" "0.21.5"
 | 
					    "@esbuild/aix-ppc64" "0.21.5"
 | 
				
			||||||
@ -383,34 +220,39 @@ esbuild@^0.21.3:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
estree-walker@^2.0.2:
 | 
					estree-walker@^2.0.2:
 | 
				
			||||||
  version "2.0.2"
 | 
					  version "2.0.2"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
 | 
					  resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz"
 | 
				
			||||||
  integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
 | 
					  integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fsevents@~2.3.2, fsevents@~2.3.3:
 | 
					lodash-es@^4.17.21:
 | 
				
			||||||
  version "2.3.3"
 | 
					  version "4.17.21"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
 | 
					  resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz"
 | 
				
			||||||
  integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
 | 
					  integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
magic-string@^0.30.17:
 | 
					magic-string@^0.30.17:
 | 
				
			||||||
  version "0.30.17"
 | 
					  version "0.30.17"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453"
 | 
					  resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz"
 | 
				
			||||||
  integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==
 | 
					  integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@jridgewell/sourcemap-codec" "^1.5.0"
 | 
					    "@jridgewell/sourcemap-codec" "^1.5.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mitt@^3.0.1:
 | 
				
			||||||
 | 
					  version "3.0.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz"
 | 
				
			||||||
 | 
					  integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
nanoid@^3.3.11:
 | 
					nanoid@^3.3.11:
 | 
				
			||||||
  version "3.3.11"
 | 
					  version "3.3.11"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b"
 | 
					  resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz"
 | 
				
			||||||
  integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
 | 
					  integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
picocolors@^1.1.1:
 | 
					picocolors@^1.1.1:
 | 
				
			||||||
  version "1.1.1"
 | 
					  version "1.1.1"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
 | 
					  resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz"
 | 
				
			||||||
  integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
 | 
					  integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
postcss@^8.4.43, postcss@^8.5.6:
 | 
					postcss@^8.4.43, postcss@^8.5.6:
 | 
				
			||||||
  version "8.5.6"
 | 
					  version "8.5.6"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c"
 | 
					  resolved "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz"
 | 
				
			||||||
  integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==
 | 
					  integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    nanoid "^3.3.11"
 | 
					    nanoid "^3.3.11"
 | 
				
			||||||
@ -419,7 +261,7 @@ postcss@^8.4.43, postcss@^8.5.6:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
rollup@^4.20.0:
 | 
					rollup@^4.20.0:
 | 
				
			||||||
  version "4.45.1"
 | 
					  version "4.45.1"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/rollup/-/rollup-4.45.1.tgz#d0ef72a8d0a9210d832f9c3c5f3b6a2aa4b0ba64"
 | 
					  resolved "https://registry.npmmirror.com/rollup/-/rollup-4.45.1.tgz"
 | 
				
			||||||
  integrity sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==
 | 
					  integrity sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@types/estree" "1.0.8"
 | 
					    "@types/estree" "1.0.8"
 | 
				
			||||||
@ -446,14 +288,55 @@ rollup@^4.20.0:
 | 
				
			|||||||
    "@rollup/rollup-win32-x64-msvc" "4.45.1"
 | 
					    "@rollup/rollup-win32-x64-msvc" "4.45.1"
 | 
				
			||||||
    fsevents "~2.3.2"
 | 
					    fsevents "~2.3.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sortablejs@^1.15.0:
 | 
				
			||||||
 | 
					  version "1.15.6"
 | 
				
			||||||
 | 
					  resolved "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.6.tgz"
 | 
				
			||||||
 | 
					  integrity sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
source-map-js@^1.2.1:
 | 
					source-map-js@^1.2.1:
 | 
				
			||||||
  version "1.2.1"
 | 
					  version "1.2.1"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
 | 
					  resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz"
 | 
				
			||||||
  integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
 | 
					  integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
vite@^5.0.0:
 | 
					tdesign-icons-vue-next@^0.3.6:
 | 
				
			||||||
 | 
					  version "0.3.6"
 | 
				
			||||||
 | 
					  resolved "https://registry.npmjs.org/tdesign-icons-vue-next/-/tdesign-icons-vue-next-0.3.6.tgz"
 | 
				
			||||||
 | 
					  integrity sha512-X9u90dBv8tPhfpguUyx+BzF8CU2ef2L4RXOO7MYOj1ufHCHwBXTF8L3GPfq6KZd/2u4vMLYAA8lGURn4PZZICw==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    "@babel/runtime" "^7.16.3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tdesign-vue-next@^1.15.2:
 | 
				
			||||||
 | 
					  version "1.15.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.npmjs.org/tdesign-vue-next/-/tdesign-vue-next-1.15.2.tgz"
 | 
				
			||||||
 | 
					  integrity sha512-EGuI3zJZD5JA6BB+s/+PeFZ08lqcTJtFCdI4O+1QJ/ru4Rie6fTgkrCL+IR9R3NQNyG4Di5T2SziAbSH1v9j7Q==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    "@babel/runtime" "^7.22.6"
 | 
				
			||||||
 | 
					    "@popperjs/core" "^2.11.8"
 | 
				
			||||||
 | 
					    "@types/lodash-es" "^4.17.12"
 | 
				
			||||||
 | 
					    "@types/sortablejs" "^1.15.1"
 | 
				
			||||||
 | 
					    "@types/tinycolor2" "^1.4.3"
 | 
				
			||||||
 | 
					    "@types/validator" "^13.7.17"
 | 
				
			||||||
 | 
					    dayjs "^1.11.10"
 | 
				
			||||||
 | 
					    lodash-es "^4.17.21"
 | 
				
			||||||
 | 
					    mitt "^3.0.1"
 | 
				
			||||||
 | 
					    sortablejs "^1.15.0"
 | 
				
			||||||
 | 
					    tdesign-icons-vue-next "^0.3.6"
 | 
				
			||||||
 | 
					    tinycolor2 "^1.6.0"
 | 
				
			||||||
 | 
					    validator "^13.9.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tinycolor2@^1.6.0:
 | 
				
			||||||
 | 
					  version "1.6.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz"
 | 
				
			||||||
 | 
					  integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					validator@^13.9.0:
 | 
				
			||||||
 | 
					  version "13.15.15"
 | 
				
			||||||
 | 
					  resolved "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz"
 | 
				
			||||||
 | 
					  integrity sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					vite@^5.0.0, "vite@^5.0.0 || ^6.0.0":
 | 
				
			||||||
  version "5.4.19"
 | 
					  version "5.4.19"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/vite/-/vite-5.4.19.tgz#20efd060410044b3ed555049418a5e7d1998f959"
 | 
					  resolved "https://registry.npmmirror.com/vite/-/vite-5.4.19.tgz"
 | 
				
			||||||
  integrity sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==
 | 
					  integrity sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    esbuild "^0.21.3"
 | 
					    esbuild "^0.21.3"
 | 
				
			||||||
@ -464,14 +347,14 @@ vite@^5.0.0:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
vue-router@^4.2.5:
 | 
					vue-router@^4.2.5:
 | 
				
			||||||
  version "4.5.1"
 | 
					  version "4.5.1"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/vue-router/-/vue-router-4.5.1.tgz#47bffe2d3a5479d2886a9a244547a853aa0abf69"
 | 
					  resolved "https://registry.npmmirror.com/vue-router/-/vue-router-4.5.1.tgz"
 | 
				
			||||||
  integrity sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==
 | 
					  integrity sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@vue/devtools-api" "^6.6.4"
 | 
					    "@vue/devtools-api" "^6.6.4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
vue@^3.4.0:
 | 
					vue@^3.0.0, vue@^3.2.0, vue@^3.2.25, vue@^3.4.0, vue@>=3.1.0, vue@3.5.18:
 | 
				
			||||||
  version "3.5.18"
 | 
					  version "3.5.18"
 | 
				
			||||||
  resolved "https://registry.npmmirror.com/vue/-/vue-3.5.18.tgz#3d622425ad1391a2b0138323211ec784f4415686"
 | 
					  resolved "https://registry.npmmirror.com/vue/-/vue-3.5.18.tgz"
 | 
				
			||||||
  integrity sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==
 | 
					  integrity sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@vue/compiler-dom" "3.5.18"
 | 
					    "@vue/compiler-dom" "3.5.18"
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user