From ef9a218bfc0e0a15c4b6cd5562d51ffc9c81e772 Mon Sep 17 00:00:00 2001 From: Nvex Date: Wed, 22 Oct 2025 17:58:21 +0800 Subject: [PATCH] =?UTF-8?q?Initial=20commit:=20=E6=89=B9=E9=87=8F=E9=80=80?= =?UTF-8?q?=E8=AF=BE=E5=B7=A5=E5=85=B7=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 202 ++ README.md | 111 ++ generate_template.py | 15 + requirements.txt | 5 + src/main.py | 282 +++ toolbox-app/.gitignore | 24 + toolbox-app/README.md | 5 + toolbox-app/index.html | 13 + toolbox-app/loading.css | 495 +++++ toolbox-app/package-lock.json | 1638 +++++++++++++++++ toolbox-app/package.json | 25 + toolbox-app/public/vite.svg | 1 + toolbox-app/public/工作簿14.xlsx | Bin 0 -> 9727 bytes toolbox-app/public/退课列表.xlsx | Bin 0 -> 4932 bytes toolbox-app/src/App.vue | 80 + toolbox-app/src/assets/vue.svg | 1 + toolbox-app/src/components/HelloWorld.vue | 43 + .../src/components/tools/CourseWithdrawal.vue | 521 ++++++ toolbox-app/src/main.js | 11 + toolbox-app/src/router/index.js | 27 + toolbox-app/src/store/settings.js | 20 + toolbox-app/src/style.css | 79 + toolbox-app/src/views/HomeView.vue | 47 + toolbox-app/src/views/SettingsView.vue | 91 + toolbox-app/vite.config.js | 7 + 25 files changed, 3743 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 generate_template.py create mode 100644 requirements.txt create mode 100644 src/main.py create mode 100644 toolbox-app/.gitignore create mode 100644 toolbox-app/README.md create mode 100644 toolbox-app/index.html create mode 100644 toolbox-app/loading.css create mode 100644 toolbox-app/package-lock.json create mode 100644 toolbox-app/package.json create mode 100644 toolbox-app/public/vite.svg create mode 100644 toolbox-app/public/工作簿14.xlsx create mode 100644 toolbox-app/public/退课列表.xlsx create mode 100644 toolbox-app/src/App.vue create mode 100644 toolbox-app/src/assets/vue.svg create mode 100644 toolbox-app/src/components/HelloWorld.vue create mode 100644 toolbox-app/src/components/tools/CourseWithdrawal.vue create mode 100644 toolbox-app/src/main.js create mode 100644 toolbox-app/src/router/index.js create mode 100644 toolbox-app/src/store/settings.js create mode 100644 toolbox-app/src/style.css create mode 100644 toolbox-app/src/views/HomeView.vue create mode 100644 toolbox-app/src/views/SettingsView.vue create mode 100644 toolbox-app/vite.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0fba9d8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,202 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Node.js +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Vue.js +.DS_Store +dist/ +dist-ssr/ +*.local + +# Editor directories and files +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Coverage directory used by tools like istanbul +coverage/ + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..a042d45 --- /dev/null +++ b/README.md @@ -0,0 +1,111 @@ +# 学生课程批量退选工具 + +## 🚀 功能概述 + +本工具旨在帮助管理员通过 API 自动批量退选学生的课程。 + +系统会从项目根目录下的 `退课列表.xlsx` 文件中读取学生 ID 和待退选的课程班 ID 列表,然后执行以下操作: + +1. **获取学生课程**:通过 `GET` 请求获取每个学生当前已选的课程班列表。 +2. **匹配与退课**:在学生的已选课程中匹配需要退选的课程班 ID,并通过 `DELETE` 请求发起退课操作。 +3. **结果反馈**:在终端清晰地输出每一位学生的处理结果,并在操作结束后提供总结报告。 + +> **🛡️ 安全第一**:为了防止误操作,本工具采用 **先预览,后确认** 的安全执行模式。 + +--- + +## 🛠️ 快速上手指南 + +### 第 1 步:环境配置 (`.env` 文件) + +在首次使用前,请在项目根目录下创建一个名为 `.env` 的文件,并将以下内容复制进去。 + +```dotenv +# --- API 配置 --- +BASE_URL=https://api.seiue.com + + +# --- 身份认证 --- +# ⚠️ 请将 <你的Token> 替换为有效的 Bearer Token +AUTHORIZATION="Bearer <你的Token>" +X_ROLE="shadow" +X_SCHOOL_ID="665" +X_REFLECTION_ID="969269" +SEMESTER_ID=61626 +``` + +> **⚠️ 注意:** +> - **必须** 将 `AUTHORIZATION` 配置项中的 `<你的Token>` 替换为您自己的有效令牌。 +> - `.env` 文件包含了敏感信息,请 **绝对不要** 将其提交到任何公共代码仓库。 + +### 第 2 步:准备数据 (`退课列表.xlsx`) + +请确保项目根目录下存在 `退课列表.xlsx` 文件,并遵循以下格式: + +| 学生ID | 课程班ID | +| --- | --- | +| 3831629 | 1820221, 1820210 | +| 3831630 | 1820456 | + +- **学生ID**: 学生的唯一标识符。 +- **课程班ID**: 需要退选的一个或多个课程班 ID,多个 ID 之间请用 **英文逗号** `,` 分隔。 + +### 第 3 步:安装依赖 + +在项目根目录下打开终端,运行以下命令: + +> 👉 **执行安装命令** +> ```bash +> pip3 install -r requirements.txt +> ``` + +这将安装运行本工具所需的所有库 (`requests`, `openpyxl`, `python-dotenv`)。 + +### 第 4 步:执行脚本 + +一切准备就绪后,在项目根目录下运行主程序: + +> 👉 **执行主程序** +> ```bash +> python3 src/main.py +> ``` + +#### 4.1) 预览变更 + +脚本启动后,将 **自动进入预览模式**。它会分析数据并显示即将发生的操作,但 **不会执行任何实际的退课**。 + +``` +--- 预览模式: 以下操作将不会实际执行 --- +--- +➡️ [预览] 学生 3831629 将退课: 体育自主选修, 音乐 +ℹ️ 学生 3831630 无匹配课程班可退。 +--- +``` + +#### 4.2) 确认执行 + +预览信息显示完毕后,程序会暂停并等待您的最终确认。 + +> 👉 **输入 `drop` 确认执行** +> ``` +> 请检查以上预览信息。 +> 👉 如果确认要执行退课操作,请输入 'drop' 并按 Enter。输入其他任何内容将取消操作: drop +> ``` + +- **确认执行**:精确输入 `drop` 并按回车键,脚本将开始执行实际的退课操作。 +- **取消操作**:输入任何其他内容(或直接按回车),程序将立即安全退出。 + +#### 4.3) 查看结果 + +确认执行后,脚本会处理每个学生,并实时打印结果。全部操作完成后,会显示最终的统计报告。 + +``` +--- 开始执行批量退课 --- +--- +✅ 学生 3831629 已退课: 体育自主选修, 音乐 +ℹ️ 学生 3831630 无匹配课程班,跳过。 + +--- 批量退课结果 --- +✅ 成功: 1 +❌ 失败: 0 +``` \ No newline at end of file diff --git a/generate_template.py b/generate_template.py new file mode 100644 index 0000000..a2cc217 --- /dev/null +++ b/generate_template.py @@ -0,0 +1,15 @@ +import pandas as pd +import os + +# Define the path to the public directory +public_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), 'toolbox-app', 'public')) +# Define the full path for the Excel file +file_path = os.path.join(public_dir, '退课列表.xlsx') + +# Create a DataFrame with the specified headers +df = pd.DataFrame(columns=['学生ID', '课程班ID']) + +# Save the DataFrame to an Excel file +df.to_excel(file_path, index=False) + +print(f"Template file created at {file_path}") \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ba2fdd9 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +requests +openpyxl +tqdm +python-dotenv +Flask \ No newline at end of file diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..1326206 --- /dev/null +++ b/src/main.py @@ -0,0 +1,282 @@ +from flask import Flask, request, jsonify, send_from_directory, make_response +from flask_cors import CORS +import os +import pandas as pd +import requests +from dotenv import load_dotenv + +load_dotenv() + +app = Flask(__name__) +CORS(app) + +# --- 从 .env 文件加载配置 --- +BASE_URL = os.getenv("BASE_URL") +AUTHORIZATION = os.getenv("AUTHORIZATION") +SEMESTER_ID = os.getenv("SEMESTER_ID") +X_ROLE = os.getenv("X_ROLE") +X_SCHOOL_ID = os.getenv("X_SCHOOL_ID") +X_REFLECTION_ID = os.getenv("X_REFLECTION_ID") + +# Use absolute path for the template directory +TEMPLATE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'toolbox-app', 'public')) +TEMPLATE_FILENAME = '退课列表.xlsx' + +def get_student_info_from_api(student_id): + """通过 API 查询学生姓名和班级""" + if not all([BASE_URL, AUTHORIZATION, X_ROLE, X_SCHOOL_ID, X_REFLECTION_ID]): + return "配置缺失", None, "Error: Missing API configuration" + + headers = { + "Authorization": AUTHORIZATION, + "X-Role": X_ROLE, + "X-School-ID": X_SCHOOL_ID, + "X-Reflection-ID": X_REFLECTION_ID + } + + url = f"{BASE_URL}/chalk/role/reflection/students" + params = { + "id_in": student_id, + "policy": "admin" + } + + try: + resp = requests.get(url, headers=headers, params=params) + resp.raise_for_status() + data = resp.json() + + if data and isinstance(data, list): + student_data = data[0] + student_name = student_data.get("name", "未知姓名") + admin_classes = student_data.get("admin_classes", []) + return student_name, admin_classes, None + else: + return "未找到学生", None, f"No info found for student {student_id}" + + except requests.exceptions.RequestException as e: + app.logger.error(f"API request failed for student_id {student_id}: {e}") + return "查询失败", None, f"Error fetching info for student {student_id}" + +def get_class_info_from_api(student_id, class_ids): + """通过 API 查询课程班信息,返回ID和名称的字典""" + if not all([BASE_URL, AUTHORIZATION, SEMESTER_ID, X_ROLE, X_SCHOOL_ID, X_REFLECTION_ID]): + return None, "错误: 缺少 API 配置" + + headers = { + "Authorization": AUTHORIZATION, + "X-Role": X_ROLE, + "X-School-ID": X_SCHOOL_ID, + "X-Reflection-ID": X_REFLECTION_ID + } + + url = f"{BASE_URL}/scms/class/students/{student_id}/classes" + params = {"semester_id": SEMESTER_ID, "paginated": "1", "expand": "course"} + + try: + resp = requests.get(url, headers=headers, params=params) + resp.raise_for_status() + data = resp.json() + + student_class_info = {str(item["id"]): item.get("name") or (item.get("course", {}).get("name") or f"未知名称 (ID: {item['id']})") for item in data} + + if isinstance(class_ids, str): + class_ids = [id.strip() for id in class_ids.split(',')] + elif not isinstance(class_ids, list): + class_ids = [str(class_ids)] + + class_details = {class_id: student_class_info.get(str(class_id), f"未找到名称 (ID: {class_id})") for class_id in class_ids} + + return class_details, None + + except requests.exceptions.RequestException as e: + app.logger.error(f"API request failed for student_id {student_id}: {e}") + return None, f"为学生 {student_id} 获取名称时出错" + +def get_school_name_from_api(): + """通过 API 查询学校名称""" + if not all([BASE_URL, AUTHORIZATION, X_ROLE, X_SCHOOL_ID]): + return "配置缺失", "Error: Missing API configuration" + + headers = { + "Authorization": AUTHORIZATION, + "X-Role": X_ROLE, + "X-School-ID": X_SCHOOL_ID + } + + url = f"{BASE_URL}/chalk/system/schools/{X_SCHOOL_ID}?expand=custom_constraints" + + try: + resp = requests.get(url, headers=headers) + resp.raise_for_status() + data = resp.json() + school_name = data.get("name", "未知学校") + return school_name, None + + except requests.exceptions.RequestException as e: + app.logger.error(f"API request failed for school_id {X_SCHOOL_ID}: {e}") + return "查询失败", f"Error fetching info for school {X_SCHOOL_ID}" + +@app.route('/api/school-name', methods=['GET']) +def get_school_name(): + """Provides the school name.""" + school_name, error = get_school_name_from_api() + if error: + return jsonify({'error': error}), 500 + return jsonify({'school_name': school_name}) + +@app.route('/api/download-template', methods=['GET']) +def download_template(): + """Provides the template file for download.""" + try: + return send_from_directory(TEMPLATE_DIR, TEMPLATE_FILENAME, as_attachment=True) + except FileNotFoundError: + return jsonify({'error': 'Template file not found on server.'}), 404 + +@app.route('/api/upload', methods=['POST']) +def upload_file(): + """Uploads a file to the server.""" + if 'file' not in request.files: + return jsonify({'error': 'No file part'}), 400 + file = request.files['file'] + if file.filename == '': + return jsonify({'error': 'No selected file'}), 400 + + filename = file.filename + file.save(os.path.join(TEMPLATE_DIR, filename)) + + return jsonify({'message': 'File uploaded successfully'}), 200 + +import json +from flask import Response + +@app.route('/api/preview', methods=['POST']) +def preview_file(): + """Previews the content of an uploaded Excel file.""" + if 'file' not in request.files: + return jsonify({'error': 'No file part'}), 400 + file = request.files['file'] + if file.filename == '': + return jsonify({'error': 'No selected file'}), 400 + + try: + df = pd.read_excel(file) + df = df.where(pd.notnull(df), None) + + if '课程班ID' not in df.columns or '学生ID' not in df.columns: + return jsonify({'error': 'Excel文件缺少必要的列: 学生ID, 课程班ID'}), 400 + + expanded_rows = [] + for _, row in df.iterrows(): + student_id = row['学生ID'] + class_ids_str = row['课程班ID'] + + student_name, admin_classes, info_error = get_student_info_from_api(student_id) + class_details, class_error = get_class_info_from_api(student_id, class_ids_str) + + if class_error: + class_ids = [id.strip() for id in str(class_ids_str).split(',')] + for class_id in class_ids: + expanded_rows.append({ + '学生ID': student_id, + '学生姓名': student_name if not info_error else info_error, + '班级': admin_classes if not info_error else [], + '课程班ID': class_id, + '课程班名称': class_error + }) + else: + if not any("未找到名称" not in name for name in class_details.values()): + expanded_rows.append({ + '学生ID': student_id, + '学生姓名': student_name if not info_error else info_error, + '班级': admin_classes if not info_error else [], + '课程班ID': None, + '课程班名称': "无匹配的课程班" + }) + else: + for class_id, class_name in class_details.items(): + if "未找到名称" not in class_name: + expanded_rows.append({ + '学生ID': student_id, + '学生姓名': student_name if not info_error else info_error, + '班级': admin_classes if not info_error else [], + '课程班ID': class_id, + '课程班名称': class_name + }) + + return jsonify({'data': expanded_rows}) + + except Exception as e: + return jsonify({'error': str(e)}), 500 + + +@app.route('/api/withdraw', methods=['POST']) +def withdraw_courses(): + """Processes a batch of course withdrawals from an uploaded file.""" + data = request.get_json() + withdraw_list = data.get('withdraw_list') + + if not withdraw_list: + return jsonify({'error': 'Withdrawal list is required.'}), 400 + + headers = { + "Authorization": AUTHORIZATION, + "X-Role": X_ROLE, + "X-School-ID": X_SCHOOL_ID, + "X-Reflection-ID": X_REFLECTION_ID + } + + student_withdrawals = {} + for item in withdraw_list: + student_id = item.get('学生ID') + class_id = item.get('课程班ID') + if student_id not in student_withdrawals: + student_withdrawals[student_id] = [] + if class_id is not None: + student_withdrawals[student_id].append(class_id) + + success_count = 0 + failure_count = 0 + skipped_count = 0 + details = [] + + for student_id, class_ids in student_withdrawals.items(): + if not class_ids: + skipped_count += 1 + details.append(f"⏭️ 学生 {student_id} 无匹配的课程班,已跳过") + continue + + payload = { + "reflection_ids": [student_id], + "class_ids": [int(cid) for cid in class_ids] + } + + try: + resp = requests.delete(f"{BASE_URL}/scms/class/class-selections", headers=headers, json=payload) + if resp.status_code == 204: + success_count += 1 + details.append(f"✅ 学生 {student_id} 已成功退课") + else: + failure_count += 1 + details.append(f"❌ 学生 {student_id} 退课失败:{resp.status_code} - {resp.text}") + except requests.exceptions.RequestException as e: + failure_count += 1 + details.append(f"❌ 学生 {student_id} 退课失败: {e}") + + summary_message = f"退课操作完成:{success_count} 个成功,{failure_count} 个失败,{skipped_count} 个跳过。" + + # 判断整体操作是否成功 + overall_success = failure_count == 0 and (success_count > 0 or skipped_count > 0) + + return jsonify({ + 'success': overall_success, + 'message': summary_message, + 'details': details, + 'stats': { + 'success_count': success_count, + 'failure_count': failure_count, + 'skipped_count': skipped_count + } + }) + +if __name__ == '__main__': + app.run(debug=True, port=5001) \ No newline at end of file diff --git a/toolbox-app/.gitignore b/toolbox-app/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/toolbox-app/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/toolbox-app/README.md b/toolbox-app/README.md new file mode 100644 index 0000000..1511959 --- /dev/null +++ b/toolbox-app/README.md @@ -0,0 +1,5 @@ +# Vue 3 + Vite + +This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 ` + + diff --git a/toolbox-app/loading.css b/toolbox-app/loading.css new file mode 100644 index 0000000..38fbc5c --- /dev/null +++ b/toolbox-app/loading.css @@ -0,0 +1,495 @@ +/* From Uiverse.io by Nawsome */ +.banter-loader { + position: absolute; + left: 50%; + top: 50%; + width: 72px; + height: 72px; + margin-left: -36px; + margin-top: -36px; +} + +.banter-loader__box { + float: left; + position: relative; + width: 20px; + height: 20px; + margin-right: 6px; +} + +.banter-loader__box:before { + content: ""; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #fff; +} + +.banter-loader__box:nth-child(3n) { + margin-right: 0; + margin-bottom: 6px; +} + +.banter-loader__box:nth-child(1):before, .banter-loader__box:nth-child(4):before { + margin-left: 26px; +} + +.banter-loader__box:nth-child(3):before { + margin-top: 52px; +} + +.banter-loader__box:last-child { + margin-bottom: 0; +} + +@keyframes moveBox-1 { + 9.0909090909% { + transform: translate(-26px, 0); + } + + 18.1818181818% { + transform: translate(0px, 0); + } + + 27.2727272727% { + transform: translate(0px, 0); + } + + 36.3636363636% { + transform: translate(26px, 0); + } + + 45.4545454545% { + transform: translate(26px, 26px); + } + + 54.5454545455% { + transform: translate(26px, 26px); + } + + 63.6363636364% { + transform: translate(26px, 26px); + } + + 72.7272727273% { + transform: translate(26px, 0px); + } + + 81.8181818182% { + transform: translate(0px, 0px); + } + + 90.9090909091% { + transform: translate(-26px, 0px); + } + + 100% { + transform: translate(0px, 0px); + } +} + +.banter-loader__box:nth-child(1) { + animation: moveBox-1 4s infinite; +} + +@keyframes moveBox-2 { + 9.0909090909% { + transform: translate(0, 0); + } + + 18.1818181818% { + transform: translate(26px, 0); + } + + 27.2727272727% { + transform: translate(0px, 0); + } + + 36.3636363636% { + transform: translate(26px, 0); + } + + 45.4545454545% { + transform: translate(26px, 26px); + } + + 54.5454545455% { + transform: translate(26px, 26px); + } + + 63.6363636364% { + transform: translate(26px, 26px); + } + + 72.7272727273% { + transform: translate(26px, 26px); + } + + 81.8181818182% { + transform: translate(0px, 26px); + } + + 90.9090909091% { + transform: translate(0px, 26px); + } + + 100% { + transform: translate(0px, 0px); + } +} + +.banter-loader__box:nth-child(2) { + animation: moveBox-2 4s infinite; +} + +@keyframes moveBox-3 { + 9.0909090909% { + transform: translate(-26px, 0); + } + + 18.1818181818% { + transform: translate(-26px, 0); + } + + 27.2727272727% { + transform: translate(0px, 0); + } + + 36.3636363636% { + transform: translate(-26px, 0); + } + + 45.4545454545% { + transform: translate(-26px, 0); + } + + 54.5454545455% { + transform: translate(-26px, 0); + } + + 63.6363636364% { + transform: translate(-26px, 0); + } + + 72.7272727273% { + transform: translate(-26px, 0); + } + + 81.8181818182% { + transform: translate(-26px, -26px); + } + + 90.9090909091% { + transform: translate(0px, -26px); + } + + 100% { + transform: translate(0px, 0px); + } +} + +.banter-loader__box:nth-child(3) { + animation: moveBox-3 4s infinite; +} + +@keyframes moveBox-4 { + 9.0909090909% { + transform: translate(-26px, 0); + } + + 18.1818181818% { + transform: translate(-26px, 0); + } + + 27.2727272727% { + transform: translate(-26px, -26px); + } + + 36.3636363636% { + transform: translate(0px, -26px); + } + + 45.4545454545% { + transform: translate(0px, 0px); + } + + 54.5454545455% { + transform: translate(0px, -26px); + } + + 63.6363636364% { + transform: translate(0px, -26px); + } + + 72.7272727273% { + transform: translate(0px, -26px); + } + + 81.8181818182% { + transform: translate(-26px, -26px); + } + + 90.9090909091% { + transform: translate(-26px, 0px); + } + + 100% { + transform: translate(0px, 0px); + } +} + +.banter-loader__box:nth-child(4) { + animation: moveBox-4 4s infinite; +} + +@keyframes moveBox-5 { + 9.0909090909% { + transform: translate(0, 0); + } + + 18.1818181818% { + transform: translate(0, 0); + } + + 27.2727272727% { + transform: translate(0, 0); + } + + 36.3636363636% { + transform: translate(26px, 0); + } + + 45.4545454545% { + transform: translate(26px, 0); + } + + 54.5454545455% { + transform: translate(26px, 0); + } + + 63.6363636364% { + transform: translate(26px, 0); + } + + 72.7272727273% { + transform: translate(26px, 0); + } + + 81.8181818182% { + transform: translate(26px, -26px); + } + + 90.9090909091% { + transform: translate(0px, -26px); + } + + 100% { + transform: translate(0px, 0px); + } +} + +.banter-loader__box:nth-child(5) { + animation: moveBox-5 4s infinite; +} + +@keyframes moveBox-6 { + 9.0909090909% { + transform: translate(0, 0); + } + + 18.1818181818% { + transform: translate(-26px, 0); + } + + 27.2727272727% { + transform: translate(-26px, 0); + } + + 36.3636363636% { + transform: translate(0px, 0); + } + + 45.4545454545% { + transform: translate(0px, 0); + } + + 54.5454545455% { + transform: translate(0px, 0); + } + + 63.6363636364% { + transform: translate(0px, 0); + } + + 72.7272727273% { + transform: translate(0px, 26px); + } + + 81.8181818182% { + transform: translate(-26px, 26px); + } + + 90.9090909091% { + transform: translate(-26px, 0px); + } + + 100% { + transform: translate(0px, 0px); + } +} + +.banter-loader__box:nth-child(6) { + animation: moveBox-6 4s infinite; +} + +@keyframes moveBox-7 { + 9.0909090909% { + transform: translate(26px, 0); + } + + 18.1818181818% { + transform: translate(26px, 0); + } + + 27.2727272727% { + transform: translate(26px, 0); + } + + 36.3636363636% { + transform: translate(0px, 0); + } + + 45.4545454545% { + transform: translate(0px, -26px); + } + + 54.5454545455% { + transform: translate(26px, -26px); + } + + 63.6363636364% { + transform: translate(0px, -26px); + } + + 72.7272727273% { + transform: translate(0px, -26px); + } + + 81.8181818182% { + transform: translate(0px, 0px); + } + + 90.9090909091% { + transform: translate(26px, 0px); + } + + 100% { + transform: translate(0px, 0px); + } +} + +.banter-loader__box:nth-child(7) { + animation: moveBox-7 4s infinite; +} + +@keyframes moveBox-8 { + 9.0909090909% { + transform: translate(0, 0); + } + + 18.1818181818% { + transform: translate(-26px, 0); + } + + 27.2727272727% { + transform: translate(-26px, -26px); + } + + 36.3636363636% { + transform: translate(0px, -26px); + } + + 45.4545454545% { + transform: translate(0px, -26px); + } + + 54.5454545455% { + transform: translate(0px, -26px); + } + + 63.6363636364% { + transform: translate(0px, -26px); + } + + 72.7272727273% { + transform: translate(0px, -26px); + } + + 81.8181818182% { + transform: translate(26px, -26px); + } + + 90.9090909091% { + transform: translate(26px, 0px); + } + + 100% { + transform: translate(0px, 0px); + } +} + +.banter-loader__box:nth-child(8) { + animation: moveBox-8 4s infinite; +} + +@keyframes moveBox-9 { + 9.0909090909% { + transform: translate(-26px, 0); + } + + 18.1818181818% { + transform: translate(-26px, 0); + } + + 27.2727272727% { + transform: translate(0px, 0); + } + + 36.3636363636% { + transform: translate(-26px, 0); + } + + 45.4545454545% { + transform: translate(0px, 0); + } + + 54.5454545455% { + transform: translate(0px, 0); + } + + 63.6363636364% { + transform: translate(-26px, 0); + } + + 72.7272727273% { + transform: translate(-26px, 0); + } + + 81.8181818182% { + transform: translate(-52px, 0); + } + + 90.9090909091% { + transform: translate(-26px, 0); + } + + 100% { + transform: translate(0px, 0); + } +} + +.banter-loader__box:nth-child(9) { + animation: moveBox-9 4s infinite; +} \ No newline at end of file diff --git a/toolbox-app/package-lock.json b/toolbox-app/package-lock.json new file mode 100644 index 0000000..53e9e96 --- /dev/null +++ b/toolbox-app/package-lock.json @@ -0,0 +1,1638 @@ +{ + "name": "toolbox-app", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "toolbox-app", + "version": "0.0.0", + "dependencies": { + "axios": "^1.12.2", + "pinia": "^3.0.3", + "vue": "^3.5.22", + "vue-router": "^4.6.3", + "xlsx": "^0.18.5" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.1", + "vite": "npm:rolldown-vite@7.1.14" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.6.0.tgz", + "integrity": "sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.6.0.tgz", + "integrity": "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz", + "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@tybys/wasm-util": "^0.10.1" + } + }, + "node_modules/@oxc-project/runtime": { + "version": "0.92.0", + "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.92.0.tgz", + "integrity": "sha512-Z7x2dZOmznihvdvCvLKMl+nswtOSVxS2H2ocar+U9xx6iMfTp0VGIrX6a4xB1v80IwOPC7dT1LXIJrY70Xu3Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.93.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.93.0.tgz", + "integrity": "sha512-yNtwmWZIBtJsMr5TEfoZFDxIWV6OdScOpza/f5YxbqUMJk+j6QX3Cf3jgZShGEFYWQJ5j9mJ6jM0tZHu2J9Yrg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-beta.41.tgz", + "integrity": "sha512-Edflndd9lU7JVhVIvJlZhdCj5DkhYDJPIRn4Dx0RUdfc8asP9xHOI5gMd8MesDDx+BJpdIT/uAmVTearteU/mQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.41.tgz", + "integrity": "sha512-XGCzqfjdk7550PlyZRTBKbypXrB7ATtXhw/+bjtxnklLQs0mKP/XkQVOKyn9qGKSlvH8I56JLYryVxl0PCvSNw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-beta.41.tgz", + "integrity": "sha512-Ho6lIwGJed98zub7n0xcRKuEtnZgbxevAmO4x3zn3C3N4GVXZD5xvCvTVxSMoeBJwTcIYzkVDRTIhylQNsTgLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-beta.41.tgz", + "integrity": "sha512-ijAZETywvL+gACjbT4zBnCp5ez1JhTRs6OxRN4J+D6AzDRbU2zb01Esl51RP5/8ZOlvB37xxsRQ3X4YRVyYb3g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-beta.41.tgz", + "integrity": "sha512-EgIOZt7UildXKFEFvaiLNBXm+4ggQyGe3E5Z1QP9uRcJJs9omihOnm897FwOBQdCuMvI49iBgjFrkhH+wMJ2MA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-beta.41.tgz", + "integrity": "sha512-F8bUwJq8v/JAU8HSwgF4dztoqJ+FjdyjuvX4//3+Fbe2we9UktFeZ27U4lRMXF1vxWtdV4ey6oCSqI7yUrSEeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-beta.41.tgz", + "integrity": "sha512-MioXcCIX/wB1pBnBoJx8q4OGucUAfC1+/X1ilKFsjDK05VwbLZGRgOVD5OJJpUQPK86DhQciNBrfOKDiatxNmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-beta.41.tgz", + "integrity": "sha512-m66M61fizvRCwt5pOEiZQMiwBL9/y0bwU/+Kc4Ce/Pef6YfoEkR28y+DzN9rMdjo8Z28NXjsDPq9nH4mXnAP0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-beta.41.tgz", + "integrity": "sha512-yRxlSfBvWnnfrdtJfvi9lg8xfG5mPuyoSHm0X01oiE8ArmLRvoJGHUTJydCYz+wbK2esbq5J4B4Tq9WAsOlP1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-beta.41.tgz", + "integrity": "sha512-PHVxYhBpi8UViS3/hcvQQb9RFqCtvFmFU1PvUoTRiUdBtgHA6fONNHU4x796lgzNlVSD3DO/MZNk1s5/ozSMQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-beta.41.tgz", + "integrity": "sha512-OAfcO37ME6GGWmj9qTaDT7jY4rM0T2z0/8ujdQIJQ2x2nl+ztO32EIwURfmXOK0U1tzkyuaKYvE34Pug/ucXlQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.0.5" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-beta.41.tgz", + "integrity": "sha512-NIYGuCcuXaq5BC4Q3upbiMBvmZsTsEPG9k/8QKQdmrch+ocSy5Jv9tdpdmXJyighKqm182nh/zBt+tSJkYoNlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-ia32-msvc": { + "version": "1.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.0.0-beta.41.tgz", + "integrity": "sha512-kANdsDbE5FkEOb5NrCGBJBCaZ2Sabp3D7d4PRqMYJqyLljwh9mDyYyYSv5+QNvdAmifj+f3lviNEUUuUZPEFPw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-beta.41.tgz", + "integrity": "sha512-UlpxKmFdik0Y2VjZrgUCgoYArZJiZllXgIipdBRV1hw6uK45UbQabSTW6Kp6enuOu7vouYWftwhuxfpE8J2JAg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz", + "integrity": "sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz", + "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.29" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.22.tgz", + "integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "@vue/shared": "3.5.22", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz", + "integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz", + "integrity": "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "@vue/compiler-core": "3.5.22", + "@vue/compiler-dom": "3.5.22", + "@vue/compiler-ssr": "3.5.22", + "@vue/shared": "3.5.22", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.19", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.22.tgz", + "integrity": "sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz", + "integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.7", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz", + "integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.22.tgz", + "integrity": "sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.22.tgz", + "integrity": "sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.22.tgz", + "integrity": "sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.22", + "@vue/runtime-core": "3.5.22", + "@vue/shared": "3.5.22", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.22.tgz", + "integrity": "sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.22", + "@vue/shared": "3.5.22" + }, + "peerDependencies": { + "vue": "3.5.22" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.22.tgz", + "integrity": "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==", + "license": "MIT" + }, + "node_modules/adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ansis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz", + "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/birpc": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.6.1.tgz", + "integrity": "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinia": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.3.tgz", + "integrity": "sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^7.7.2" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.4.4", + "vue": "^2.7.0 || ^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/@vue/devtools-api": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.7.tgz", + "integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.7" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rolldown": { + "version": "1.0.0-beta.41", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.41.tgz", + "integrity": "sha512-U+NPR0Bkg3wm61dteD2L4nAM1U9dtaqVrpDXwC36IKRHpEO/Ubpid4Nijpa2imPchcVNHfxVFwSSMJdwdGFUbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.93.0", + "@rolldown/pluginutils": "1.0.0-beta.41", + "ansis": "=4.2.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-beta.41", + "@rolldown/binding-darwin-arm64": "1.0.0-beta.41", + "@rolldown/binding-darwin-x64": "1.0.0-beta.41", + "@rolldown/binding-freebsd-x64": "1.0.0-beta.41", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.41", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.41", + "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.41", + "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.41", + "@rolldown/binding-linux-x64-musl": "1.0.0-beta.41", + "@rolldown/binding-openharmony-arm64": "1.0.0-beta.41", + "@rolldown/binding-wasm32-wasi": "1.0.0-beta.41", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.41", + "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.41", + "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.41" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.41.tgz", + "integrity": "sha512-ycMEPrS3StOIeb87BT3/+bu+blEtyvwQ4zmo2IcJQy0Rd1DAAhKksA0iUZ3MYSpJtjlPhg0Eo6mvVS6ggPhRbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "license": "Apache-2.0", + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "license": "MIT", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/vite": { + "name": "rolldown-vite", + "version": "7.1.14", + "resolved": "https://registry.npmjs.org/rolldown-vite/-/rolldown-vite-7.1.14.tgz", + "integrity": "sha512-eSiiRJmovt8qDJkGyZuLnbxAOAdie6NCmmd0NkTC0RJI9duiSBTfr8X2mBYJOUFzxQa2USaHmL99J9uMxkjCyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/runtime": "0.92.0", + "fdir": "^6.5.0", + "lightningcss": "^1.30.1", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rolldown": "1.0.0-beta.41", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "esbuild": "^0.25.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.22.tgz", + "integrity": "sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.22", + "@vue/compiler-sfc": "3.5.22", + "@vue/runtime-dom": "3.5.22", + "@vue/server-renderer": "3.5.22", + "@vue/shared": "3.5.22" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.3.tgz", + "integrity": "sha512-ARBedLm9YlbvQomnmq91Os7ck6efydTSpRP3nuOKCvgJOHNrhRoJDSKtee8kcL1Vf7nz6U+PMBL+hTvR3bTVQg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xlsx": { + "version": "0.18.5", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + } + } +} diff --git a/toolbox-app/package.json b/toolbox-app/package.json new file mode 100644 index 0000000..a743224 --- /dev/null +++ b/toolbox-app/package.json @@ -0,0 +1,25 @@ +{ + "name": "toolbox-app", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "axios": "^1.12.2", + "pinia": "^3.0.3", + "vue": "^3.5.22", + "vue-router": "^4.6.3", + "xlsx": "^0.18.5" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.1", + "vite": "npm:rolldown-vite@7.1.14" + }, + "overrides": { + "vite": "npm:rolldown-vite@7.1.14" + } +} diff --git a/toolbox-app/public/vite.svg b/toolbox-app/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/toolbox-app/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toolbox-app/public/工作簿14.xlsx b/toolbox-app/public/工作簿14.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4ea4190a0b3895c9141188ddafbc4958a52710ec GIT binary patch literal 9727 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 literal 0 HcmV?d00001 diff --git a/toolbox-app/public/退课列表.xlsx b/toolbox-app/public/退课列表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..554ae6f19b9add744efaf5efc50cbf4ae285902b GIT binary patch literal 4932 zcmZ`-2UHW?)(urDN*4)5siK5lq$)*vM@k@oltc)iVCb{NI~dGqYx`*=O$E_ndvsJ$jl%#Pk3F;5>lY-x#7|)=U|Kf2+V> z)c6bPYOCkr>gFkE?dB$cbav8?(WYn-qQ3J(V|B*GXzQx*)sgJ^u7_$jC1RmUUZKZ+ zcblJ1$<7Krsb%N}w{d!lhqdJg&~&K+uoNn-O2e<1RJnn0Fq?dzPZZq;yEd+J=1w9j z1})LP)MM5!mD0;B_2LWHSBt7blhY7M4#K?qNshZQq2u*eu&xKzB#r1p61~61i>vb* z+Qg5Oj}QQ$`R90TT|Hnw2izO4uh}X@-Pst4d;3-l!l0PM*q%=oLeyRrJB_s(M&WX1 zs;WvL;Vb91guQ!KORD%`mf*7!U@e$HmtuEb8n5gqfZF+yi?{W#Zy~RL)GO7 z%v=TNr&9ULQ>V>^s16yU!^psGq3;ZBqs7R?LlGU2H}i{j4tB}nLHxd7c$JKdn?}Th zGs3XJd{!YeJeiFY_KXYWCv-C2LFs5EFU`Wuqu2L(Yuv-hXEU&ZyS1TfBCCD#`+PF$ z`4P-s&yQEHP;Hs83mSc}3D^cSFEtB`hLg2Wj;| zaB8fsN^o}GM1+e*L5L~8Y^#YpSIe@}3=U|O^zWjhZJiE@I^$*~1LyMJ~ulr-S>v z{Px<`GoN%%BE+15^NZU^No>zhlp722ynbCqOZr!*#vBDQOg4M~ImU(R*e%=5a^K0P;e^wr+T9>En)~0mK@d=h{iBW6tU&dqtJSHD6kW z$|d>Xs{pW@*Vy|ZqD0H9Hgi0XN$Q zwef3BkG&(FWu*u5C|_K$X~BZ z?MEMbuHZ8B(c{{ReQxz2vh5>Ih;{fi7a2MaX%;(0zy7_wxLj_L{>=mOH62;IE5?cC z7XAIWj3*wPbu)Wl|2a2H6I8gAGvD#o;%Fo*)h~$9-9Dclmh7O%LYPA) zocJ zFatr-$b%Nt!Gx9c^y{1*t+<5*H8cE2#i&HM+{x3lVfn2DL9RoM zxTo+pocRcz-W5?`vq~BBgK+yHS>IEVgEVn+mN;fsLObR+D(onD-4Jt3k{#* zEgL2YphxAUV66Kql$9B6#~@N?2t#vhS}cyfW%ce$Z`^~vvAByg@s>C7-}Xht(loM# zNou65XSsukPckf9)tgsBdhVZ82ZW7^I)P%otBx>g;HY@=Z?B4ooy$%!C3}l9cE~IY z7rRx!CPGfKUBh;3$rnj}GqIyyuQcQ#!H>bon=M8AAx%<&0{;EEn>AnMUJg~=nEy?*$C3ssh4%FlTzRx|jG z0$25MRQJ}6HnJ5cgqy6#a2R$ok~Tw;*=6+)j-7tBInxl zX=%xfA_u;l($ zrEs5z_mb_Nb?AxFJ3AF~fmEujs>ioM^z%?F{uk#SmFW}i7#LXzLpq4~Vzd0To+z)l zEhm}ZTO5pEoXUe$x|Ch_W^(2*kZOS^)7ceu&%!F2jad7QAUov^4ssXU7t+TTSbQr6Lrmsgru;3lp}> z+nM91Bm+SrOlcRiE!IbuQ`1U)IlK;&yqm3dPTaawsg`7x?|rpUDh=41Sv+(>%cyCk z`LxpzAe0F?pRtf$VidvYZN$ft(h>9~bluq^41wmc1SKC*yxpO!xz5m6a!V>u8T2Sj z$8w09mOiqal7yYnV{vm6?cn`n{16oEj4~8~jxu&DJ#Lm0^-!8Hhr1M|haiA&fd&CrQb-ASuT{1=CC4~K zxYCF0?h;vTaVy&z7;s`WHMA`sLGS07**oPLnu%caOhzz3@JB&)g=^N5+40+9(8vAj z4-yL~$Y+}@&wb+H9-ecgF4XKw{`#1x%mG1`!p&bae|~>*qf!}Rb-fzZ;WkPP>`su4 zNphUqWS*5od@^B?yml?O@8Xxp1e6Z-`FDfDLJ$2~NKtNgj5|7`(UhDs?Q`z^r?|He z!E5)evfE??%XQSXLI^dyXpnj{qSMD(=Yk<&AWh6?!gas<>KlZ&rvzKPb~~I`BPNY& zSi?V@%y30s+V0MXQf4XfnnGnUEES41x)=XgjL37xNoH;1*mum|92`?IR!;ghnpAAC zTPBwxZ3zi-VN|NS*U7$)PBXl4IQfEBG#m=AJfV7F@u(z8!OB4XWh2QJqiSTiPdHzi4GsaVqQ$o}y3?Hcq(8(#)ZNU=Mycn4E_m^cFpiV+l z5116!(YN$CmgUzex$Cxc5^TML&qY(1K3aU+C~ouQMA_yWuQq4_muq$5lbg(gJExCU zQKUH%*rkh!d$D`z4E3MmMhX$asY~#lT%9pKIn319Hz!xp^=@cl&YF?)*U>j>Aw<|6 z<8n?D*z1oP8^vEA`tXfPRWq(kFvCEev5~xJDc{3!Kz}Rw8nWRrTJDA@QK#>y`!Z@20!GGoHv~`EH>Sy`ty>-VH0&pvlbsT9$k_5(Z$d*H-x_3j z$(Qd8%nv^oP#%yP4$)T+5K1{>5qJXO*)8Ft8<$@dv}Q}E-W_BhW_ycnvzPz$@a2f; z#-XY1YCrqQ-Co7aM&k*au+jQtw@-tV)-8mKb1D=St}Ozm*FkHz!D>OGG}WVTWzCY? zP-TAI0RO^k{x=TOA}$8ZKKOiW+V#jqS@P%#MXAYgi*0np4#S8W`S*Eh32RmB^y%z# zKwOV!VJA>~X}i6a?-&O|`gG&Y&8j~zg4HS9xc05u0cu2cl6OiyyUl8TShru^NGpCN z;osWj#YbX^bZ4RcO8Pvef21go}IM9 zmHTwPR!XD%{o8_U(cKrA5-#32u_#$}8K&DgWzm!KcU3Gv524l46H3K7wrkn5c^78# z5U~mmf>T&Wp03SnwM&_XS>$?Ty9h4KBYfnS+gb zb@_za0B$x~O`wM5ehTl4Q!E_;v5AKd$={i>RVp_F-I5nzx?lAcdMV#C$0WjhJUv%# zN>Eq9HKIdHc(B#)W4<$mIBgE7x1)a3*+xwai6Acv0oVPn7C+@ctB4 z8&_AypWz#=Kd8|vPksE%?TVGbU`Xz2lrn$BB|iT~uGIUhGtLuJn8`A4G&N{{VR*I= z)cSsUN6QZs5!03A&HgEm2F?fv_K?;`-yBiY%j4NIMl2}-A*7IYQu%sK*EdcXzERD^ ziRiJ!;k8g=4Fz)Yy(YGgEP)3B+B%mjDiHWI*!yjlE~Jfs2I2=6k5Bc<3laB7_-Hdw^?94vSJowcfKHmg5)y2e zSK98j0uxjAWw2ebPO*JVajF|_I1X+}>F!gCtxzQ$XQr%ZmPp|OQ`InmE(Rl93Wd`O zii!%6!5Uk6z!UAf8wJAh-}0pO-T4cqJ%*ktEbnau?7dJ%^vT`WW3%iszT2@HXngx` zW#nQ@%__l@x{oIq_?z6{j`UB8e>qiUoZQ7nLX@Fpv`YYSy;n*kS{7hF0cw(6PFmXb zQt~RnP=Z)#g!StT{=m&HolJXrZ@@jNR{_EZV+U#8%{*uPv?2ea(Mc=Nk*Y40Lg=^UjS5^;JaEyH4c;+gOh>?iuY zuY)MLx*%XKhVV&rUne@0UA>{FWZmGo~D39R~l^n^y|bZl5Tkfj)QDfQzNEQdxV8bbZO zXX%k%Gaa&!_hG`?s3^w6^%Zi}hgo||`+1X%scdx1dj}1sY;g_R@%HAmD+!CQX(&H*5o_6(9NVY1tgI!c)OSgv?Y91 zL3Gt_Z4e=>&66SYq`&UNar1rhcir0LG*T7Bft~4`T{A{dPBmy=8It|=w=YKuI*>;V zalMNtl<=FlU>oqK{{4p?j6azBwrN^68gEzBkLdsdKSh1KZ5fDXl7Nt&=zn)S@ILeF z2*UIG|N9?j(P#S)zp(&75JCAr(f`+tI14|!LH`5q!~gzYw(DmNoGsA)Yap2F{4WFl zTCSb7a<-iKuN8uPvR_vI6c=ZqXI1+T^daS68h#ddRt5h6q4{;;HDE|X) rzW59LKVtr@owI@T$4(wzng1oM^fXEE{S*Lz41eCj>-W~rCK=#Ay`F_% literal 0 HcmV?d00001 diff --git a/toolbox-app/src/App.vue b/toolbox-app/src/App.vue new file mode 100644 index 0000000..7931a4c --- /dev/null +++ b/toolbox-app/src/App.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/toolbox-app/src/assets/vue.svg b/toolbox-app/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/toolbox-app/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toolbox-app/src/components/HelloWorld.vue b/toolbox-app/src/components/HelloWorld.vue new file mode 100644 index 0000000..546ebbc --- /dev/null +++ b/toolbox-app/src/components/HelloWorld.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/toolbox-app/src/components/tools/CourseWithdrawal.vue b/toolbox-app/src/components/tools/CourseWithdrawal.vue new file mode 100644 index 0000000..6dea233 --- /dev/null +++ b/toolbox-app/src/components/tools/CourseWithdrawal.vue @@ -0,0 +1,521 @@ + + + + + \ No newline at end of file diff --git a/toolbox-app/src/main.js b/toolbox-app/src/main.js new file mode 100644 index 0000000..e0091de --- /dev/null +++ b/toolbox-app/src/main.js @@ -0,0 +1,11 @@ +import { createApp } from 'vue'; +import { createPinia } from 'pinia'; +import App from './App.vue'; +import router from './router'; + +const app = createApp(App); + +app.use(createPinia()); +app.use(router); + +app.mount('#app'); diff --git a/toolbox-app/src/router/index.js b/toolbox-app/src/router/index.js new file mode 100644 index 0000000..37a865a --- /dev/null +++ b/toolbox-app/src/router/index.js @@ -0,0 +1,27 @@ +import { createRouter, createWebHistory } from 'vue-router'; +import HomeView from '../views/HomeView.vue'; + +const routes = [ + { + path: '/', + name: 'Home', + component: HomeView, + }, + { + path: '/settings', + name: 'Settings', + component: () => import('../views/SettingsView.vue'), + }, + { + path: '/tools/course-withdrawal', + name: 'CourseWithdrawal', + component: () => import('../components/tools/CourseWithdrawal.vue'), + }, +]; + +const router = createRouter({ + history: createWebHistory(), + routes, +}); + +export default router; \ No newline at end of file diff --git a/toolbox-app/src/store/settings.js b/toolbox-app/src/store/settings.js new file mode 100644 index 0000000..f76fe7b --- /dev/null +++ b/toolbox-app/src/store/settings.js @@ -0,0 +1,20 @@ +import { defineStore } from 'pinia'; + +export const useSettingsStore = defineStore('settings', { + state: () => ({ + authorization: 'Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiIzIiwiZXhwIjoxNzYxMTk0MjQzLCJqdGkiOiJmZjdkYTlkMS05ZGEzLTRhZDctYWZhZS04Njc3YWEzMzI0ZGMiLCJpYXQiOjE3NjExMDc4NDMsImlzcyI6Imh0dHBzOi8vbWRwLnNlaXVlLmNvbS9zZWl1ZSIsInN1YiI6IjEwMjg1MjYiLCJjdHgiOiJsb2dpbl9yaWQ9OTY5MjY5XHUwMDI2cmVhZG9ubHk9MFx1MDAyNnN0YWZmX2lkPTI0MCIsInNpZCI6MTAzNDkyOTJ9.bDuRFltrbFkV5NPxMAABFhTxv9zDQDBq4S9ZCRmQwohANrUD7HriP7vmospkrA_5skxJtyi3iK5OtINyIVGFP9zK7jcrfGJlhTrQimfgnHH-39mYsk08fOH-MhDvr2Q87ng-2gACIpNvyvzP-VCxo6IGOk9ZZWg2aT6xua-cV-8', + semesterId: '61626', + xRole: 'shadow', + xSchoolId: '665', + xReflectionId: '969269', + }), + actions: { + setSettings(newSettings) { + this.authorization = newSettings.authorization; + this.semesterId = newSettings.semesterId; + this.xRole = newSettings.xRole; + this.xSchoolId = newSettings.xSchoolId; + this.xReflectionId = newSettings.xReflectionId; + }, + }, +}); \ No newline at end of file diff --git a/toolbox-app/src/style.css b/toolbox-app/src/style.css new file mode 100644 index 0000000..f691315 --- /dev/null +++ b/toolbox-app/src/style.css @@ -0,0 +1,79 @@ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +.card { + padding: 2em; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/toolbox-app/src/views/HomeView.vue b/toolbox-app/src/views/HomeView.vue new file mode 100644 index 0000000..c6db42c --- /dev/null +++ b/toolbox-app/src/views/HomeView.vue @@ -0,0 +1,47 @@ + + + + + \ No newline at end of file diff --git a/toolbox-app/src/views/SettingsView.vue b/toolbox-app/src/views/SettingsView.vue new file mode 100644 index 0000000..40c24ed --- /dev/null +++ b/toolbox-app/src/views/SettingsView.vue @@ -0,0 +1,91 @@ + + + + + \ No newline at end of file diff --git a/toolbox-app/vite.config.js b/toolbox-app/vite.config.js new file mode 100644 index 0000000..bbcf80c --- /dev/null +++ b/toolbox-app/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [vue()], +})