diff --git a/.dockerignore b/.dockerignore
deleted file mode 100644
index c10f7c72..00000000
--- a/.dockerignore
+++ /dev/null
@@ -1,36 +0,0 @@
-# Node modules
-InfoGenie-frontend/node_modules
-InfoGenie-frontend/build
-
-# Python cache
-InfoGenie-backend/__pycache__
-InfoGenie-backend/**/__pycache__
-InfoGenie-backend/*.pyc
-InfoGenie-backend/**/*.pyc
-
-# Git
-.git
-.gitignore
-
-# IDE
-.vscode
-.idea
-*.swp
-*.swo
-
-# Logs
-*.log
-
-# OS
-.DS_Store
-Thumbs.db
-
-# Test files
-InfoGenie-backend/test
-
-# Documentation
-*.md
-
-# Backup files
-*.backup
-*.bak
diff --git a/.gitignore b/.gitignore
deleted file mode 100755
index 6d1c1604..00000000
--- a/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-#项目自忽略
-.vscode
-InfoGenie-frontend/node_modules
-InfoGenie-frontend/build
-InfoGenie-backend/__pycache__
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
index a1508387..372c39f8 100755
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,4 +1,4 @@
-{
- "git.ignoreLimitWarning": true,
- "terminal.integrated.defaultProfile.windows": "Command Prompt"
+{
+ "git.ignoreLimitWarning": true,
+ "terminal.integrated.defaultProfile.windows": "Command Prompt"
}
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index ea2b41a4..00000000
--- a/Dockerfile
+++ /dev/null
@@ -1,57 +0,0 @@
-# InfoGenie 统一 Docker 镜像
-# 多阶段构建:前端构建 + 后端 + Nginx
-
-# 阶段1: 前端构建
-FROM node:18-alpine AS frontend-builder
-
-WORKDIR /frontend
-COPY InfoGenie-frontend/package*.json ./
-RUN npm install --legacy-peer-deps
-COPY InfoGenie-frontend/ ./
-RUN npm run build
-
-# 阶段2: 最终镜像
-FROM python:3.10-slim
-
-# 安装 Nginx 和必要的工具
-RUN apt-get update && apt-get install -y \
- nginx \
- supervisor \
- && rm -rf /var/lib/apt/lists/*
-
-# 设置工作目录
-WORKDIR /app
-
-# 复制后端代码
-COPY InfoGenie-backend/ ./backend/
-
-# 安装 Python 依赖
-RUN pip install --no-cache-dir -r ./backend/requirements.txt gunicorn
-
-# 复制前端构建产物到 Nginx 目录
-COPY --from=frontend-builder /frontend/build /usr/share/nginx/html
-
-# 创建持久化数据目录
-RUN mkdir -p /app/data/logs
-
-# 复制 Nginx 配置
-COPY docker/nginx.conf /etc/nginx/nginx.conf
-COPY docker/default.conf /etc/nginx/conf.d/default.conf
-
-# 复制 Supervisor 配置
-COPY docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
-
-# 复制启动脚本
-COPY docker/entrypoint.sh /entrypoint.sh
-RUN chmod +x /entrypoint.sh
-
-# 暴露端口
-EXPOSE 2323
-
-# 设置环境变量
-ENV FLASK_APP=app.py
-ENV FLASK_ENV=production
-ENV PYTHONUNBUFFERED=1
-
-# 使用 supervisor 管理多进程
-ENTRYPOINT ["/entrypoint.sh"]
diff --git a/InfoGenie-backend/.dockerignore b/InfoGenie-backend/.dockerignore
new file mode 100644
index 00000000..67818e6e
--- /dev/null
+++ b/InfoGenie-backend/.dockerignore
@@ -0,0 +1,19 @@
+
+
+# Python cache
+__pycache__
+
+# Git
+.git
+.gitignore
+
+# IDE
+.vscode
+.idea
+*.swp
+*.swo
+
+# Test files
+InfoGenie-backend/test
+
+
diff --git a/InfoGenie-backend/.gitignore b/InfoGenie-backend/.gitignore
new file mode 100644
index 00000000..3c593d0c
--- /dev/null
+++ b/InfoGenie-backend/.gitignore
@@ -0,0 +1,3 @@
+#项目自忽略
+.vscode
+__pycache__
\ No newline at end of file
diff --git a/InfoGenie-backend/Dockerfile b/InfoGenie-backend/Dockerfile
new file mode 100644
index 00000000..dac43587
--- /dev/null
+++ b/InfoGenie-backend/Dockerfile
@@ -0,0 +1,30 @@
+# InfoGenie 后端 Docker 镜像
+# 仅包含后端服务,使用 Gunicorn
+
+FROM python:3.10-slim
+
+# 安装 curl 用于健康检查
+RUN apt-get update && apt-get install -y \
+ curl \
+ && rm -rf /var/lib/apt/lists/*
+
+# 设置工作目录
+WORKDIR /app
+
+# 复制依赖文件
+COPY requirements.txt .
+
+# 安装 Python 依赖
+RUN pip install --no-cache-dir -r requirements.txt gunicorn
+
+# 复制后端代码
+COPY . .
+
+# 创建持久化数据目录
+RUN mkdir -p /app/data/logs
+
+# 暴露端口
+EXPOSE 2323
+
+# 使用 Gunicorn 启动应用
+CMD ["gunicorn", "--bind", "0.0.0.0:2323", "--workers", "4", "--threads", "2", "--timeout", "120", "--access-logfile", "-", "--error-logfile", "-", "app:app"]
diff --git a/InfoGenie-backend/ai_config.json b/InfoGenie-backend/ai_config.json
index aa1cf9af..05b14b91 100755
--- a/InfoGenie-backend/ai_config.json
+++ b/InfoGenie-backend/ai_config.json
@@ -1,13 +1,13 @@
-{
- "deepseek": {
- "api_key": "sk-832f8e5250464de08a31523c7fd712",
- "api_base": "https://api.deepseek.com",
- "model": ["deepseek-chat","deepseek-reasoner"]
- },
-
- "kimi": {
- "api_key": "sk-zdg9NBpTlhOcDDpoWfaBKu0KNDdGv18SipORnL2utawja",
- "api_base": "https://api.moonshot.cn",
- "model": ["kimi-k2-0905-preview","kimi-k2-0711-preview"]
- }
+{
+ "deepseek": {
+ "api_key": "sk-832f8e5250464de08a31523c7fd712",
+ "api_base": "https://api.deepseek.com",
+ "model": ["deepseek-chat","deepseek-reasoner"]
+ },
+
+ "kimi": {
+ "api_key": "sk-zdg9NBpTlhOcDDpoWfaBKu0KNDdGv18SipORnL2utawja",
+ "api_base": "https://api.moonshot.cn",
+ "model": ["kimi-k2-0905-preview","kimi-k2-0711-preview"]
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-backend/app.py b/InfoGenie-backend/app.py
index 7f3c1878..608e0600 100755
--- a/InfoGenie-backend/app.py
+++ b/InfoGenie-backend/app.py
@@ -178,7 +178,9 @@ def create_app():
return app
+# 为 Gunicorn 创建应用实例
+app = create_app()
+
if __name__ == '__main__':
- app = create_app()
print("🚀 启动 InfoGenie 后端服务...")
app.run(debug=True, host='0.0.0.0', port=5002)
diff --git a/InfoGenie-backend/config.py b/InfoGenie-backend/config.py
index 251fcab6..4836948d 100755
--- a/InfoGenie-backend/config.py
+++ b/InfoGenie-backend/config.py
@@ -1,85 +1,85 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""
-InfoGenie 配置文件
-Created by: 万象口袋
-Date: 2025-09-02
-"""
-
-import os
-from datetime import timedelta
-from dotenv import load_dotenv
-
-# 加载环境变量
-load_dotenv()
-
-class Config:
- """应用配置类"""
-
- # 基础配置
- SECRET_KEY = os.environ.get('SECRET_KEY') or 'infogenie-secret-key-2025'
-
- # MongoDB 配置
- MONGO_URI = os.environ.get('MONGO_URI') or 'mongodb://localhost:27017/InfoGenie'
-
- # hwt 配置
- HWT_LIFETIME = timedelta(days=7) # hwt持续7天
- HWT_SECURE = False # 开发环境设为False,生产环境设为True
- HWT_HTTPONLY = True
- HWT_SAMESITE = 'Lax'
- HWT_DOMAIN = None # 开发环境设为None,生产环境设为具体域名
- HWT_PATH = '/'
- HWT_REFRESH_EACH_REQUEST = True # 每次请求刷新hwt过期时间
-
- # 邮件配置
- MAIL_SERVER = 'smtp.qq.com'
- MAIL_PORT = 465
- MAIL_USE_SSL = True
- MAIL_USE_TLS = False
- MAIL_USERNAME = os.environ.get('MAIL_USERNAME') or 'your-email@qq.com'
- MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD') or 'your-app-password'
- MAIL_DEFAULT_SENDER = ('InfoGenie 万象口袋', os.environ.get('MAIL_USERNAME') or 'your-email@qq.com')
-
- # API 配置
- API_RATE_LIMIT = '100 per hour' # API调用频率限制
-
- # 外部API配置
- EXTERNAL_APIS = {
- '60s': [
- 'https://60s.api.shumengya.top'
- ]
- }
-
- # 应用信息
- APP_INFO = {
- 'name': '✨ 万象口袋 ✨',
- 'description': '🎨 一个多功能的聚合软件应用 💬',
- 'author': '👨💻 by-万象口袋',
- 'version': '1.0.0',
- 'icp': '📄 蜀ICP备2025151694号'
- }
-
-class DevelopmentConfig(Config):
- """开发环境配置"""
- DEBUG = True
- TESTING = False
-
-class ProductionConfig(Config):
- """生产环境配置"""
- DEBUG = False
- TESTING = False
- HWT_SECURE = True
-
-class TestingConfig(Config):
- """测试环境配置"""
- DEBUG = True
- TESTING = True
- MONGO_URI = 'mongodb://localhost:27017/InfoGenie_Test'
-
-# 配置字典
-config = {
- 'development': DevelopmentConfig,
- 'production': ProductionConfig,
- 'testing': TestingConfig,
- 'default': DevelopmentConfig
-}
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+InfoGenie 配置文件
+Created by: 万象口袋
+Date: 2025-09-02
+"""
+
+import os
+from datetime import timedelta
+from dotenv import load_dotenv
+
+# 加载环境变量
+load_dotenv()
+
+class Config:
+ """应用配置类"""
+
+ # 基础配置
+ SECRET_KEY = os.environ.get('SECRET_KEY') or 'infogenie-secret-key-2025'
+
+ # MongoDB 配置
+ MONGO_URI = os.environ.get('MONGO_URI') or 'mongodb://localhost:27017/InfoGenie'
+
+ # hwt 配置
+ HWT_LIFETIME = timedelta(days=7) # hwt持续7天
+ HWT_SECURE = False # 开发环境设为False,生产环境设为True
+ HWT_HTTPONLY = True
+ HWT_SAMESITE = 'Lax'
+ HWT_DOMAIN = None # 开发环境设为None,生产环境设为具体域名
+ HWT_PATH = '/'
+ HWT_REFRESH_EACH_REQUEST = True # 每次请求刷新hwt过期时间
+
+ # 邮件配置
+ MAIL_SERVER = 'smtp.qq.com'
+ MAIL_PORT = 465
+ MAIL_USE_SSL = True
+ MAIL_USE_TLS = False
+ MAIL_USERNAME = os.environ.get('MAIL_USERNAME') or 'your-email@qq.com'
+ MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD') or 'your-app-password'
+ MAIL_DEFAULT_SENDER = ('InfoGenie 万象口袋', os.environ.get('MAIL_USERNAME') or 'your-email@qq.com')
+
+ # API 配置
+ API_RATE_LIMIT = '100 per hour' # API调用频率限制
+
+ # 外部API配置
+ EXTERNAL_APIS = {
+ '60s': [
+ 'https://60s.api.shumengya.top'
+ ]
+ }
+
+ # 应用信息
+ APP_INFO = {
+ 'name': '✨ 万象口袋 ✨',
+ 'description': '🎨 一个多功能的聚合软件应用 💬',
+ 'author': '👨💻 by-万象口袋',
+ 'version': '1.0.0',
+ 'icp': '📄 蜀ICP备2025151694号'
+ }
+
+class DevelopmentConfig(Config):
+ """开发环境配置"""
+ DEBUG = True
+ TESTING = False
+
+class ProductionConfig(Config):
+ """生产环境配置"""
+ DEBUG = False
+ TESTING = False
+ HWT_SECURE = True
+
+class TestingConfig(Config):
+ """测试环境配置"""
+ DEBUG = True
+ TESTING = True
+ MONGO_URI = 'mongodb://localhost:27017/InfoGenie_Test'
+
+# 配置字典
+config = {
+ 'development': DevelopmentConfig,
+ 'production': ProductionConfig,
+ 'testing': TestingConfig,
+ 'default': DevelopmentConfig
+}
diff --git a/docker-compose.yml b/InfoGenie-backend/docker-compose.yml
similarity index 59%
rename from docker-compose.yml
rename to InfoGenie-backend/docker-compose.yml
index e2cd86b7..920183e2 100644
--- a/docker-compose.yml
+++ b/InfoGenie-backend/docker-compose.yml
@@ -1,36 +1,39 @@
-version: '3.8'
-
-services:
- infogenie:
- build:
- context: .
- dockerfile: Dockerfile
- container_name: infogenie
- restart: always
- ports:
- - "2323:2323"
- volumes:
- # 持久化数据映射
- - /shumengya/docker/storage/infogenie/logs:/app/data/logs
- - /shumengya/docker/storage/infogenie/data:/app/data
- environment:
- # 从 .env 文件读取环境变量
- - MONGO_URI=${MONGO_URI}
- - MAIL_USERNAME=${MAIL_USERNAME}
- - MAIL_PASSWORD=${MAIL_PASSWORD}
- - SECRET_KEY=${SECRET_KEY}
- - FLASK_ENV=production
- env_file:
- - ./InfoGenie-backend/.env
- networks:
- - infogenie-network
- healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost:2323/api/health"]
- interval: 30s
- timeout: 10s
- retries: 3
- start_period: 40s
-
-networks:
- infogenie-network:
- driver: bridge
+version: '3.8'
+
+services:
+ infogenie-backend:
+ build:
+ context: .
+ dockerfile: Dockerfile
+ container_name: infogenie-backend
+ restart: always
+ ports:
+ - "2323:2323"
+ volumes:
+ # 持久化数据映射
+ - /shumengya/docker/infogenie-backend/data:/app/data
+
+ environment:
+ # 从 .env 文件读取环境变量
+ - MONGO_URI=${MONGO_URI}
+ - MAIL_USERNAME=${MAIL_USERNAME}
+ - MAIL_PASSWORD=${MAIL_PASSWORD}
+ - SECRET_KEY=${SECRET_KEY}
+ - FLASK_ENV=production
+ # 生产环境配置
+ - HWT_DOMAIN=.shumengya.top
+ - HWT_SECURE=False # 如果使用 HTTPS 反向代理,设为 False;直接 HTTPS 设为 True
+ env_file:
+ - .env
+ networks:
+ - infogenie-network
+ healthcheck:
+ test: ["CMD-SHELL", "curl -f http://localhost:2323/api/health || exit 1"]
+ interval: 30s
+ timeout: 10s
+ retries: 3
+ start_period: 40s
+
+networks:
+ infogenie-network:
+ driver: bridge
diff --git a/InfoGenie-backend/modules/aimodelapp.py b/InfoGenie-backend/modules/aimodelapp.py
index 7de7c36c..2061e7ba 100755
--- a/InfoGenie-backend/modules/aimodelapp.py
+++ b/InfoGenie-backend/modules/aimodelapp.py
@@ -1,1087 +1,1087 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""
-AI模型应用服务模块
-Created by: 万象口袋
-Date: 2025-01-15
-"""
-
-from flask import Blueprint, request, jsonify, current_app
-import requests
-import json
-import os
-from datetime import datetime
-from bson import ObjectId
-from functools import wraps
-
-# 创建蓝图
-aimodelapp_bp = Blueprint('aimodelapp', __name__)
-
-# AI功能萌芽币消耗配置
-AI_COST = 100 # 每次调用AI功能消耗的萌芽币数量
-
-# 验证用户萌芽币余额装饰器
-def verify_user_coins(f):
- """验证用户萌芽币余额并在调用AI功能后扣除相应数量的萌芽币"""
- @wraps(f)
- def decorated(*args, **kwargs):
- try:
- # 获取用户认证信息
- token = request.headers.get('Authorization')
- if not token:
- return jsonify({
- 'success': False,
- 'message': '未提供认证信息',
- 'error_code': 'auth_required'
- }), 401
-
- if token.startswith('Bearer '):
- token = token[7:]
-
- # 解析JWT token
- import jwt
- try:
- payload = jwt.decode(token, current_app.config['SECRET_KEY'], algorithms=['HS256'])
- user_id = payload['user_id']
- except Exception as jwt_error:
- print(f"JWT解析错误: {str(jwt_error)}")
- return jsonify({
- 'success': False,
- 'message': '无效的认证信息',
- 'error_code': 'invalid_token'
- }), 401
-
- # 查询用户萌芽币余额
- users_collection = current_app.mongo.db.userdata
- user = users_collection.find_one({'_id': ObjectId(user_id)})
-
- if not user:
- return jsonify({
- 'success': False,
- 'message': '用户不存在',
- 'error_code': 'user_not_found'
- }), 404
-
- # 检查萌芽币余额
- current_coins = user.get('萌芽币', 0)
- if current_coins < AI_COST:
- return jsonify({
- 'success': False,
- 'message': f'萌芽币余额不足!当前余额: {current_coins}, 需要: {AI_COST}',
- 'error_code': 'insufficient_coins',
- 'current_coins': current_coins,
- 'required_coins': AI_COST
- }), 402
-
- # 先扣除萌芽币,确保无论服务是否成功都会扣费
- deduct_result = users_collection.update_one(
- {'_id': ObjectId(user_id)},
- {'$inc': {'萌芽币': -AI_COST}}
- )
-
- if deduct_result.modified_count < 1:
- print(f"警告: 用户 {user_id} 萌芽币扣除失败")
-
- # 为请求添加用户信息,以便在函数内部使用
- request.current_user = {
- 'user_id': user_id,
- 'username': user.get('用户名', ''),
- 'email': user.get('邮箱', '')
- }
-
- # 保存API调用类型
- api_type = request.path.split('/')[-1]
-
- # 添加使用记录
- usage_record = {
- 'api_type': api_type,
- 'timestamp': datetime.now().isoformat(),
- 'cost': AI_COST
- }
-
- # 更新用户的AI使用历史记录
- users_collection.update_one(
- {'_id': ObjectId(user_id)},
- {'$push': {'ai_usage_history': usage_record}}
- )
-
- # 调用原函数
- result = f(*args, **kwargs)
-
- return result
-
- except Exception as e:
- print(f"验证萌芽币时发生错误: {str(e)}")
- return jsonify({
- 'success': False,
- 'message': '处理请求时出错',
- 'error': str(e)
- }), 500
-
- return decorated
-
-#加载AI配置文件
-def load_ai_config():
- """加载AI配置文件"""
- try:
- config_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'ai_config.json')
- with open(config_path, 'r', encoding='utf-8') as f:
- return json.load(f)
- except Exception as e:
- print(f"加载AI配置失败: {e}")
- return None
-
-#调用DeepSeek API,带重试机制
-def call_deepseek_api(messages, model="deepseek-chat", max_retries=3):
- """调用DeepSeek API,带重试机制"""
- config = load_ai_config()
- if not config or 'deepseek' not in config:
- return None, "AI配置加载失败"
-
- deepseek_config = config['deepseek']
-
- headers = {
- 'Authorization': f'Bearer {deepseek_config["api_key"]}',
- 'Content-Type': 'application/json'
- }
-
- data = {
- 'model': model,
- 'messages': messages,
- 'temperature': 0.7,
- 'max_tokens': 2000
- }
-
- import time
-
- for attempt in range(max_retries):
- try:
- # 增加超时时间到90秒
- response = requests.post(
- f"{deepseek_config['api_base']}/chat/completions",
- headers=headers,
- json=data,
- timeout=90
- )
-
- if response.status_code == 200:
- result = response.json()
- return result['choices'][0]['message']['content'], None
- else:
- error_msg = f"API调用失败: {response.status_code} - {response.text}"
- if attempt < max_retries - 1:
- print(f"第{attempt + 1}次尝试失败,等待重试: {error_msg}")
- time.sleep(2 ** attempt) # 指数退避
- continue
- return None, error_msg
-
- except requests.exceptions.Timeout:
- error_msg = "API请求超时"
- if attempt < max_retries - 1:
- print(f"第{attempt + 1}次尝试超时,等待重试")
- time.sleep(2 ** attempt) # 指数退避
- continue
- return None, f"{error_msg}(已重试{max_retries}次)"
-
- except Exception as e:
- error_msg = f"API调用异常: {str(e)}"
- if attempt < max_retries - 1:
- print(f"第{attempt + 1}次尝试异常,等待重试: {error_msg}")
- time.sleep(2 ** attempt) # 指数退避
- continue
- return None, f"{error_msg}(已重试{max_retries}次)"
-
-#调用Kimi API
-def call_kimi_api(messages, model="kimi-k2-0905-preview"):
- """调用Kimi API"""
- config = load_ai_config()
- if not config or 'kimi' not in config:
- return None, "AI配置加载失败"
-
- kimi_config = config['kimi']
-
- headers = {
- 'Authorization': f'Bearer {kimi_config["api_key"]}',
- 'Content-Type': 'application/json'
- }
-
- data = {
- 'model': model,
- 'messages': messages,
- 'temperature': 0.7,
- 'max_tokens': 2000
- }
-
- try:
- response = requests.post(
- f"{kimi_config['api_base']}/v1/chat/completions",
- headers=headers,
- json=data,
- timeout=30
- )
-
- if response.status_code == 200:
- result = response.json()
- return result['choices'][0]['message']['content'], None
- else:
- return None, f"API调用失败: {response.status_code} - {response.text}"
-
- except Exception as e:
- return None, f"API调用异常: {str(e)}"
-
-#统一的AI聊天接口
-@aimodelapp_bp.route('/chat', methods=['POST'])
-@verify_user_coins
-def ai_chat():
- """统一的AI聊天接口"""
- try:
- data = request.get_json()
-
- if not data:
- return jsonify({'error': '请求数据为空'}), 400
-
- # 获取请求参数
- messages = data.get('messages', [])
- model_provider = data.get('provider', 'deepseek') # 默认使用deepseek
- model_name = data.get('model', 'deepseek-chat') # 默认模型
-
- if not messages:
- return jsonify({'error': '消息内容不能为空'}), 400
-
- # 根据提供商调用对应的API
- if model_provider == 'deepseek':
- content, error = call_deepseek_api(messages, model_name)
- elif model_provider == 'kimi':
- content, error = call_kimi_api(messages, model_name)
- else:
- return jsonify({'error': f'不支持的AI提供商: {model_provider}'}), 400
-
- if error:
- return jsonify({'error': error}), 500
-
- return jsonify({
- 'success': True,
- 'content': content,
- 'provider': model_provider,
- 'model': model_name,
- 'timestamp': datetime.now().isoformat()
- })
-
- except Exception as e:
- return jsonify({'error': f'服务器错误: {str(e)}'}), 500
-
-#姓名分析专用接口
-@aimodelapp_bp.route('/name-analysis', methods=['POST'])
-@verify_user_coins
-def name_analysis():
- """姓名分析专用接口"""
- try:
- data = request.get_json()
- name = data.get('name', '').strip()
-
- if not name:
- return jsonify({'error': '姓名不能为空'}), 400
-
- # 构建姓名分析的专业提示词
- prompt = f"""你是一位专业的姓名学专家和语言学家,请对输入的姓名进行全面分析。请直接输出分析结果,不要包含任何思考过程或标签。
-
-姓名:{name}
-
-请按照以下格式严格输出分析结果:
-
-【稀有度评分】
-评分:X%
-评价:[对稀有度的详细说明,包括姓氏和名字的常见程度分析]
-
-【音韵评价】
-评分:X%
-评价:[对音韵美感的分析,包括声调搭配、读音流畅度、音律和谐度等]
-
-【含义解读】
-[详细分析姓名的寓意内涵,包括:
-1. 姓氏的历史渊源和文化背景
-2. 名字各字的含义和象征
-3. 整体姓名的寓意组合
-4. 可能体现的父母期望或文化内涵
-5. 与传统文化、诗词典故的关联等]
-
-要求:
-1. 评分必须是1-100的整数百分比,要有明显区分度,避免雷同
-2. 分析要专业、客观、有依据,评分要根据实际情况有所差异
-3. 含义解读要详细深入,至少150字
-4. 严格按照上述格式输出,不要添加思考过程、标签或其他内容
-5. 如果是生僻字或罕见姓名,要特别说明
-6. 直接输出最终结果,不要显示推理过程"""
-
- messages = [
- {"role": "user", "content": prompt}
- ]
-
- # 使用DeepSeek进行分析
- content, error = call_deepseek_api(messages)
-
- if error:
- return jsonify({'error': error}), 500
-
- return jsonify({
- 'success': True,
- 'analysis': content,
- 'name': name,
- 'timestamp': datetime.now().isoformat()
- })
-
- except Exception as e:
- return jsonify({'error': f'姓名分析失败: {str(e)}'}), 500
-
-#变量命名助手接口
-@aimodelapp_bp.route('/variable-naming', methods=['POST'])
-@verify_user_coins
-def variable_naming():
- """变量命名助手接口"""
- try:
- data = request.get_json()
- description = data.get('description', '').strip()
- language = data.get('language', 'javascript').lower()
-
- if not description:
- return jsonify({'error': '变量描述不能为空'}), 400
-
- # 构建变量命名的提示词
- prompt = f"""你是一个专业的变量命名助手。请根据以下描述为变量生成合适的名称:
-
-描述:{description}
-
-请为每种命名规范生成3个变量名建议:
-1. camelCase (驼峰命名法)
-2. PascalCase (帕斯卡命名法)
-3. snake_case (下划线命名法)
-4. kebab-case (短横线命名法)
-5. CONSTANT_CASE (常量命名法)
-
-要求:
-- 变量名要准确反映功能和用途
-- 严格遵循各自的命名规范
-- 避免使用缩写,除非是广泛认知的缩写
-- 名称要简洁但具有描述性
-- 考虑代码的可读性和维护性
-
-请按以下JSON格式返回:
-{{
- "suggestions": {{
- "camelCase": [
- {{"name": "变量名1", "description": "解释说明1"}},
- {{"name": "变量名2", "description": "解释说明2"}},
- {{"name": "变量名3", "description": "解释说明3"}}
- ],
- "PascalCase": [
- {{"name": "变量名1", "description": "解释说明1"}},
- {{"name": "变量名2", "description": "解释说明2"}},
- {{"name": "变量名3", "description": "解释说明3"}}
- ],
- "snake_case": [
- {{"name": "变量名1", "description": "解释说明1"}},
- {{"name": "变量名2", "description": "解释说明2"}},
- {{"name": "变量名3", "description": "解释说明3"}}
- ],
- "kebab-case": [
- {{"name": "变量名1", "description": "解释说明1"}},
- {{"name": "变量名2", "description": "解释说明2"}},
- {{"name": "变量名3", "description": "解释说明3"}}
- ],
- "CONSTANT_CASE": [
- {{"name": "变量名1", "description": "解释说明1"}},
- {{"name": "变量名2", "description": "解释说明2"}},
- {{"name": "变量名3", "description": "解释说明3"}}
- ]
- }}
-}}
-
-只返回JSON格式的结果,不要包含其他文字。"""
-
- messages = [
- {"role": "user", "content": prompt}
- ]
-
- # 使用DeepSeek进行分析
- content, error = call_deepseek_api(messages)
-
- if error:
- return jsonify({'error': error}), 500
-
- # 解析AI返回的JSON格式数据
- try:
- # 尝试直接解析JSON
- ai_response = json.loads(content)
- suggestions = ai_response.get('suggestions', {})
- except json.JSONDecodeError:
- # 如果直接解析失败,尝试提取JSON部分
- import re
- json_match = re.search(r'\{[\s\S]*\}', content)
- if json_match:
- try:
- ai_response = json.loads(json_match.group())
- suggestions = ai_response.get('suggestions', {})
- except json.JSONDecodeError:
- return jsonify({'error': 'AI返回的数据格式无法解析'}), 500
- else:
- return jsonify({'error': 'AI返回的数据中未找到有效的JSON格式'}), 500
-
- return jsonify({
- 'success': True,
- 'suggestions': suggestions,
- 'description': description,
- 'language': language,
- 'timestamp': datetime.now().isoformat()
- })
-
- except Exception as e:
- return jsonify({'error': f'变量命名失败: {str(e)}'}), 500
-
-#AI写诗助手接口
-@aimodelapp_bp.route('/poetry', methods=['POST'])
-@verify_user_coins
-def poetry_assistant():
- """AI写诗助手接口"""
- try:
- data = request.get_json()
- theme = data.get('theme', '').strip()
- style = data.get('style', '现代诗').strip()
- mood = data.get('mood', '').strip()
-
- if not theme:
- return jsonify({'error': '诗歌主题不能为空'}), 400
-
- # 构建写诗的提示词
- prompt = f"""你是一位才华横溢的诗人,请根据以下要求创作一首诗歌。
-
-主题:{theme}
-风格:{style}
-情感基调:{mood if mood else '自由发挥'}
-
-创作要求:
-1. 紧扣主题,情感真挚
-2. 语言优美,意境深远
-3. 符合指定的诗歌风格
-4. 长度适中,朗朗上口
-5. 如果是古体诗,注意平仄和韵律
-
-请直接输出诗歌作品,不需要额外的解释或分析。"""
-
- messages = [
- {"role": "user", "content": prompt}
- ]
-
- # 使用DeepSeek进行创作
- content, error = call_deepseek_api(messages)
-
- if error:
- return jsonify({'error': error}), 500
-
- return jsonify({
- 'success': True,
- 'poem': content,
- 'theme': theme,
- 'style': style,
- 'mood': mood,
- 'timestamp': datetime.now().isoformat()
- })
-
- except Exception as e:
- return jsonify({'error': f'诗歌创作失败: {str(e)}'}), 500
-
-#AI语言翻译接口
-@aimodelapp_bp.route('/translation', methods=['POST'])
-@verify_user_coins
-def translation():
- """AI语言翻译接口"""
- try:
- data = request.get_json()
- source_text = data.get('source_text', '').strip()
- target_language = data.get('target_language', 'zh-CN').strip()
-
- if not source_text:
- return jsonify({'error': '翻译内容不能为空'}), 400
-
- # 语言映射
- language_map = {
- 'zh-CN': '中文(简体)',
- 'zh-TW': '中文(繁体)',
- 'en': '英语',
- 'ja': '日语',
- 'ko': '韩语',
- 'fr': '法语',
- 'de': '德语',
- 'es': '西班牙语',
- 'it': '意大利语',
- 'pt': '葡萄牙语',
- 'ru': '俄语',
- 'ar': '阿拉伯语',
- 'hi': '印地语',
- 'th': '泰语',
- 'vi': '越南语'
- }
-
- target_language_name = language_map.get(target_language, target_language)
-
- # 构建翻译的专业提示词
- prompt = f"""你是一位专业的翻译专家,精通多种语言的翻译工作。请将以下文本翻译成{target_language_name}。
-
-原文:{source_text}
-
-翻译要求:
-1. 【信】- 忠实原文,准确传达原意,不遗漏、不添加、不歪曲
-2. 【达】- 译文通顺流畅,符合目标语言的表达习惯和语法规范
-3. 【雅】- 用词优美得体,风格与原文相符,具有良好的可读性
-
-特别注意:
-- 自动检测源语言,无需用户指定
-- 保持原文的语气、情感色彩和文体风格
-- 对于专业术语,提供准确的对应翻译
-- 对于文化特色词汇,在保持原意的基础上进行适当的本土化处理
-- 如果是单词或短语,提供多个常用含义的翻译
-- 如果是句子,确保语法正确、表达自然
-
-请按以下JSON格式返回翻译结果:
-{{
- "detected_language": "检测到的源语言名称",
- "target_language": "{target_language_name}",
- "translation": "翻译结果",
- "alternative_translations": [
- "备选翻译1",
- "备选翻译2",
- "备选翻译3"
- ],
- "explanation": "翻译说明(包括语境、用法、注意事项等)",
- "pronunciation": "目标语言的发音指导(如适用)"
-}}
-
-只返回JSON格式的结果,不要包含其他文字。"""
-
- messages = [
- {"role": "user", "content": prompt}
- ]
-
- # 使用DeepSeek进行翻译
- content, error = call_deepseek_api(messages)
-
- if error:
- return jsonify({'error': error}), 500
-
- return jsonify({
- 'success': True,
- 'translation_result': content,
- 'source_text': source_text,
- 'target_language': target_language,
- 'timestamp': datetime.now().isoformat()
- })
-
- except Exception as e:
- return jsonify({'error': f'翻译失败: {str(e)}'}), 500
-
-#现代文转文言文接口
-@aimodelapp_bp.route('/classical_conversion', methods=['POST'])
-@verify_user_coins
-def classical_conversion():
- """现代文转文言文接口"""
- try:
- data = request.get_json()
- modern_text = data.get('modern_text', '').strip()
- style = data.get('style', '古雅').strip()
- article_type = data.get('article_type', '散文').strip()
-
- if not modern_text:
- return jsonify({'error': '现代文内容不能为空'}), 400
-
- # 构建文言文转换的专业提示词
- prompt = f"""你是一位精通古代文言文的文学大师,擅长将现代文转换为优美的文言文。请将以下现代文转换为文言文。
-
-现代文:{modern_text}
-
-转换要求:
-1. 风格:{style}
-2. 文体:{article_type}
-3. 保持原文的核心意思和情感色彩
-4. 使用恰当的文言文语法和词汇
-5. 注重音韵美感和文字的雅致
-6. 根据不同风格调整用词和句式
-
-风格说明:
-- 古雅:典雅庄重,用词考究,句式工整
-- 简洁:言简意赅,删繁就简,朴实无华
-- 华丽:辞藻华美,对仗工整,音韵和谐
-- 朴实:平实自然,通俗易懂,贴近生活
-
-文体特点:
-- 散文:行文自由,情理并茂
-- 诗歌:讲究韵律,意境深远
-- 议论文:逻辑严密,论证有力
-- 记叙文:叙事生动,描写细腻
-- 书信:格式规范,情真意切
-- 公文:庄重严肃,用词准确
-
-请按以下JSON格式返回转换结果:
-{{
- "classical_text": "转换后的文言文",
- "translation_notes": "转换说明,包括重要词汇的选择理由和语法特点",
- "style_analysis": "风格分析,说明如何体现所选风格特点",
- "difficulty_level": "难度等级(初级/中级/高级)",
- "key_phrases": [
- {{
- "modern": "现代词汇",
- "classical": "对应文言文词汇",
- "explanation": "转换说明"
- }}
- ],
- "cultural_elements": "文化内涵说明,包含的典故、意象等"
-}}
-
-只返回JSON格式的结果,不要包含其他文字。"""
-
- messages = [
- {"role": "user", "content": prompt}
- ]
-
- # 使用DeepSeek进行文言文转换
- content, error = call_deepseek_api(messages)
-
- if error:
- return jsonify({'error': error}), 500
-
- return jsonify({
- 'success': True,
- 'conversion_result': content,
- 'modern_text': modern_text,
- 'style': style,
- 'article_type': article_type,
- 'timestamp': datetime.now().isoformat()
- })
-
- except Exception as e:
- return jsonify({'error': f'文言文转换失败: {str(e)}'}), 500
-
-#AI表情制作器接口
-@aimodelapp_bp.route('/expression-maker', methods=['POST'])
-@verify_user_coins
-def expression_maker():
- """AI表情制作器接口"""
- try:
- data = request.get_json()
- text = data.get('text', '').strip()
- style = data.get('style', 'mixed').strip()
-
- if not text:
- return jsonify({'error': '文字内容不能为空'}), 400
-
- # 风格映射
- style_prompts = {
- 'mixed': '混合使用Emoji表情和颜文字',
- 'emoji': '仅使用Emoji表情符号',
- 'kaomoji': '仅使用颜文字(日式表情符号)',
- 'cute': '使用可爱风格的表情符号',
- 'cool': '使用酷炫风格的表情符号'
- }
-
- style_description = style_prompts.get(style, style_prompts['mixed'])
-
- # 构建表情制作的提示词
- prompt = f"""你是一个专业的表情符号专家,擅长为文字内容生成合适的表情符号。请根据以下文字内容生成相应的表情符号:
-
-文字内容:{text}
-表情风格:{style_description}
-
-请为这个文字内容生成表情符号,要求:
-1. 准确表达文字的情感和含义
-2. 符合指定的表情风格
-3. 提供多样化的选择
-4. 包含使用场景说明
-
-请按以下分类生成表情符号:
-1. Emoji表情(使用Unicode表情符号)
-2. 颜文字(使用ASCII字符组成的表情)
-3. 组合表情(多个符号组合使用)
-
-每个分类提供5个不同的表情选项,每个选项包含:
-- 表情符号本身
-- 适用场景说明
-- 情感强度(轻微/中等/强烈)
-
-请按以下JSON格式返回:
-{{
- "expressions": {{
- "emoji": [
- {{
- "symbol": "😊",
- "description": "适用场景和情感说明",
- "intensity": "中等",
- "usage": "使用建议"
- }}
- ],
- "kaomoji": [
- {{
- "symbol": "(^_^)",
- "description": "适用场景和情感说明",
- "intensity": "轻微",
- "usage": "使用建议"
- }}
- ],
- "combination": [
- {{
- "symbol": "🎉✨",
- "description": "适用场景和情感说明",
- "intensity": "强烈",
- "usage": "使用建议"
- }}
- ]
- }},
- "summary": {{
- "emotion_analysis": "对输入文字的情感分析",
- "recommended_usage": "推荐的使用场景",
- "style_notes": "风格特点说明"
- }}
-}}
-
-只返回JSON格式的结果,不要包含其他文字。"""
-
- messages = [
- {"role": "user", "content": prompt}
- ]
-
- # 使用DeepSeek进行分析
- content, error = call_deepseek_api(messages)
-
- if error:
- return jsonify({'error': error}), 500
-
- # 解析AI返回的JSON格式数据
- try:
- # 尝试直接解析JSON
- ai_response = json.loads(content)
- expressions = ai_response.get('expressions', {})
- summary = ai_response.get('summary', {})
- except json.JSONDecodeError:
- # 如果直接解析失败,尝试提取JSON部分
- import re
- json_match = re.search(r'\{[\s\S]*\}', content)
- if json_match:
- try:
- ai_response = json.loads(json_match.group())
- expressions = ai_response.get('expressions', {})
- summary = ai_response.get('summary', {})
- except json.JSONDecodeError:
- return jsonify({'error': 'AI返回的数据格式无法解析'}), 500
- else:
- return jsonify({'error': 'AI返回的数据中未找到有效的JSON格式'}), 500
-
- return jsonify({
- 'success': True,
- 'expressions': expressions,
- 'summary': summary,
- 'text': text,
- 'style': style,
- 'timestamp': datetime.now().isoformat()
- })
-
- except Exception as e:
- return jsonify({'error': f'表情制作失败: {str(e)}'}), 500
-
-#Linux命令生成接口
-@aimodelapp_bp.route('/linux-command', methods=['POST'])
-@verify_user_coins
-def linux_command_generator():
- """Linux命令生成接口"""
- try:
- data = request.get_json()
- task_description = data.get('task_description', '').strip()
- difficulty_level = data.get('difficulty_level', 'beginner').strip()
-
- if not task_description:
- return jsonify({'error': '任务描述不能为空'}), 400
-
- # 构建Linux命令生成的专业提示词
- prompt = f"""你是一位Linux系统专家,请根据用户的任务描述生成相应的Linux命令。
-
-任务描述:{task_description}
-用户水平:{difficulty_level}
-
-请为这个任务生成合适的Linux命令,要求:
-1. 命令准确可用,符合Linux标准
-2. 根据用户水平提供适当的复杂度
-3. 提供多种实现方式(如果有的话)
-4. 包含安全提示和注意事项
-5. 解释每个命令的作用和参数
-
-用户水平说明:
-- beginner(初学者):提供基础命令,详细解释
-- intermediate(中级):提供常用命令和选项
-- advanced(高级):提供高效命令和高级用法
-
-请按以下JSON格式返回:
-{{
- "commands": [
- {{
- "command": "具体的Linux命令",
- "description": "命令的详细说明",
- "safety_level": "safe/caution/dangerous",
- "explanation": "命令各部分的解释",
- "example_output": "预期的命令输出示例",
- "alternatives": ["替代命令1", "替代命令2"]
- }}
- ],
- "safety_warnings": ["安全提示1", "安全提示2"],
- "prerequisites": ["前置条件1", "前置条件2"],
- "related_concepts": ["相关概念1", "相关概念2"]
-}}
-
-只返回JSON格式的结果,不要包含其他文字。"""
-
- messages = [
- {"role": "user", "content": prompt}
- ]
-
- # 使用DeepSeek进行命令生成
- content, error = call_deepseek_api(messages)
-
- if error:
- return jsonify({'error': error}), 500
-
- return jsonify({
- 'success': True,
- 'command_result': content,
- 'task_description': task_description,
- 'difficulty_level': difficulty_level,
- 'timestamp': datetime.now().isoformat()
- })
-
- except Exception as e:
- return jsonify({'error': f'Linux命令生成失败: {str(e)}'}), 500
-
-#AI文章排版(Markdown格式化)接口
-@aimodelapp_bp.route('/markdown_formatting', methods=['POST'])
-@verify_user_coins
-def markdown_formatting():
- """AI文章排版(Markdown格式化)接口"""
- try:
- data = request.get_json()
- article_text = data.get('article_text', '').strip()
- emoji_style = data.get('emoji_style', 'balanced').strip()
- markdown_option = data.get('markdown_option', 'standard').strip()
-
- if not article_text:
- return jsonify({'error': '文章内容不能为空'}), 400
-
- # 构建Markdown排版的提示词
- prompt = f"""你是一位专业的文档排版助手。请将用户提供的全文按“标准Markdown格式”进行排版,并在不改变任何原文内容的前提下进行结构化呈现。严格遵守以下规则:
-
-1) 保留所有原始内容,严禁改写、删减或添加新内容。
-2) 使用合理的Markdown结构(标题、分节、段落、列表、引用、表格如有必要、代码块仅当原文包含)。
-3) 智能添加适量Emoji以增强可读性({emoji_style}),在标题、关键句、列表项等处点缀;避免过度使用,保持专业。
-4) 保持语言与语气不变,只优化排版和表现形式。
-5) 输出“纯Markdown文本”,不要包含任何JSON、HTML、XML、解释文字、或代码块围栏标记(例如不要在最外层使用```)。
-
-如果原文本较长,可在开头自动生成简洁的“目录”以便阅读。
-
-原文如下:
-{article_text}
-"""
-
- messages = [{"role": "user", "content": prompt}]
-
- # 使用DeepSeek进行排版生成
- content, error = call_deepseek_api(messages)
-
- if error:
- return jsonify({'error': error}), 500
-
- # 返回AI生成的Markdown文本
- return jsonify({
- 'success': True,
- 'formatted_markdown': content,
- 'source_text': article_text,
- 'emoji_style': emoji_style,
- 'markdown_option': markdown_option,
- 'timestamp': datetime.now().isoformat()
- })
-
- except Exception as e:
- return jsonify({'error': f'文章排版失败: {str(e)}'}), 500
-
-#获取用户萌芽币余额
-@aimodelapp_bp.route('/coins', methods=['GET'])
-def get_user_coins():
- """获取用户萌芽币余额"""
- try:
- # 获取用户认证信息
- token = request.headers.get('Authorization')
- if not token:
- return jsonify({
- 'success': False,
- 'message': '未提供认证信息',
- 'error_code': 'auth_required'
- }), 401
-
- if token.startswith('Bearer '):
- token = token[7:]
-
- # 解析JWT token
- import jwt
- try:
- payload = jwt.decode(token, current_app.config['SECRET_KEY'], algorithms=['HS256'])
- user_id = payload['user_id']
- except jwt.ExpiredSignatureError:
- return jsonify({
- 'success': False,
- 'message': 'Token已过期,请重新登录',
- 'error_code': 'token_expired'
- }), 401
- except Exception as e:
- return jsonify({
- 'success': False,
- 'message': f'无效的认证信息: {str(e)}',
- 'error_code': 'invalid_token'
- }), 401
-
- # 查询用户萌芽币余额
- users_collection = current_app.mongo.db.userdata
- user = users_collection.find_one({'_id': ObjectId(user_id)})
-
- if not user:
- return jsonify({
- 'success': False,
- 'message': '用户不存在',
- 'error_code': 'user_not_found'
- }), 404
-
- # 返回萌芽币信息
- current_coins = user.get('萌芽币', 0)
- username = user.get('用户名', '用户')
-
- # 增加额外有用信息
- ai_usage_history = []
- if 'ai_usage_history' in user:
- ai_usage_history = user['ai_usage_history'][-5:] # 最近5条使用记录
-
- return jsonify({
- 'success': True,
- 'data': {
- 'coins': current_coins,
- 'ai_cost': AI_COST,
- 'can_use_ai': current_coins >= AI_COST,
- 'username': username,
- 'usage_count': len(ai_usage_history),
- 'recent_usage': ai_usage_history
- },
- 'message': f'当前萌芽币余额: {current_coins}'
- }), 200
- except Exception as e:
- return jsonify({
- 'success': False,
- 'message': '处理请求时出错',
- 'error': str(e)
- }), 500
-
-#获取可用的AI模型列表
-@aimodelapp_bp.route('/models', methods=['GET'])
-def get_available_models():
- """获取可用的AI模型列表"""
- try:
- config = load_ai_config()
- if not config:
- return jsonify({'error': 'AI配置加载失败'}), 500
-
- models = {}
- for provider, provider_config in config.items():
- if 'model' in provider_config:
- models[provider] = provider_config['model']
-
- return jsonify({
- 'success': True,
- 'models': models,
- 'default_provider': 'deepseek',
- 'default_model': 'deepseek-chat'
- })
-
- except Exception as e:
- return jsonify({'error': f'获取模型列表失败: {str(e)}'}), 500
-
-#中国亲戚称呼计算器接口(普通话版 + 方言)
-@aimodelapp_bp.route('/kinship-calculator', methods=['POST'])
-@verify_user_coins
-def kinship_calculator():
- """中国亲戚称呼计算器接口"""
- try:
- data = request.get_json() or {}
- relation_chain = (data.get('relation_chain') or '').strip()
- dialects = data.get('dialects') # 可选,指定方言列表
-
- if not relation_chain:
- return jsonify({'error': '亲属关系链不能为空'}), 400
-
- # 组装提示词:要求严格JSON输出
- requested_dialects = dialects if isinstance(dialects, list) and dialects else [
- '粤语', '闽南语', '上海话', '四川话', '东北话', '客家话'
- ]
-
- prompt = f"""你是一位中国亲属称呼专家。请解析下面的亲属关系链,给出最终的亲属称呼。
-输入的关系链会用“的”连接,如“妈妈的爸爸”“爸爸的姐姐的儿子”。
-
-请遵循:
-1) 以中国大陆通行的标准普通话称呼为准,给出最常用、规范的最终称呼。
-2) 同时给出若干方言的对应称呼:{', '.join(requested_dialects)}。
-3) 如存在地区差异或性别歧义,请在notes中说明,但最终给出一个最常用称呼。
-4) 不要展示推理过程;只输出JSON。
-
-严格按以下JSON结构输出:
-{{
- "mandarin_title": "标准普通话称呼",
- "dialect_titles": {{
- "粤语": {{"title": "称呼", "romanization": "粤拼或发音", "notes": "可选说明"}},
- "闽南语": {{"title": "称呼", "romanization": "白话字或发音", "notes": "可选说明"}},
- "上海话": {{"title": "称呼", "romanization": "拟音或IPA", "notes": "可选说明"}},
- "四川话": {{"title": "称呼", "romanization": "拟音或IPA", "notes": "可选说明"}},
- "东北话": {{"title": "称呼", "romanization": "拟音或IPA", "notes": "可选说明"}},
- "客家话": {{"title": "称呼", "romanization": "客家话拟音", "notes": "可选说明"}}
- }},
- "notes": "总体说明(如地区差异、辈分方向、父系/母系等提示)"
-}}
-
-关系链:
-{relation_chain}
-"""
-
- messages = [{"role": "user", "content": prompt}]
- content, error = call_deepseek_api(messages)
-
- if error:
- return jsonify({'error': error}), 500
-
- # 解析AI返回的JSON
- try:
- result = json.loads(content)
- except json.JSONDecodeError:
- import re
- m = re.search(r'\{[\s\S]*\}', content)
- if not m:
- return jsonify({'error': 'AI返回的数据中未找到有效JSON'}), 500
- try:
- result = json.loads(m.group())
- except Exception:
- return jsonify({'error': 'AI返回的JSON格式无法解析'}), 500
-
- mandarin_title = result.get('mandarin_title')
- dialect_titles = result.get('dialect_titles', {})
- notes = result.get('notes', '')
-
- if not mandarin_title:
- return jsonify({'error': '未获得标准普通话称呼'}), 500
-
- return jsonify({
- 'success': True,
- 'relation_chain': relation_chain,
- 'mandarin_title': mandarin_title,
- 'dialect_titles': dialect_titles,
- 'notes': notes,
- 'timestamp': datetime.now().isoformat()
- })
-
- except Exception as e:
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+AI模型应用服务模块
+Created by: 万象口袋
+Date: 2025-01-15
+"""
+
+from flask import Blueprint, request, jsonify, current_app
+import requests
+import json
+import os
+from datetime import datetime
+from bson import ObjectId
+from functools import wraps
+
+# 创建蓝图
+aimodelapp_bp = Blueprint('aimodelapp', __name__)
+
+# AI功能萌芽币消耗配置
+AI_COST = 100 # 每次调用AI功能消耗的萌芽币数量
+
+# 验证用户萌芽币余额装饰器
+def verify_user_coins(f):
+ """验证用户萌芽币余额并在调用AI功能后扣除相应数量的萌芽币"""
+ @wraps(f)
+ def decorated(*args, **kwargs):
+ try:
+ # 获取用户认证信息
+ token = request.headers.get('Authorization')
+ if not token:
+ return jsonify({
+ 'success': False,
+ 'message': '未提供认证信息',
+ 'error_code': 'auth_required'
+ }), 401
+
+ if token.startswith('Bearer '):
+ token = token[7:]
+
+ # 解析JWT token
+ import jwt
+ try:
+ payload = jwt.decode(token, current_app.config['SECRET_KEY'], algorithms=['HS256'])
+ user_id = payload['user_id']
+ except Exception as jwt_error:
+ print(f"JWT解析错误: {str(jwt_error)}")
+ return jsonify({
+ 'success': False,
+ 'message': '无效的认证信息',
+ 'error_code': 'invalid_token'
+ }), 401
+
+ # 查询用户萌芽币余额
+ users_collection = current_app.mongo.db.userdata
+ user = users_collection.find_one({'_id': ObjectId(user_id)})
+
+ if not user:
+ return jsonify({
+ 'success': False,
+ 'message': '用户不存在',
+ 'error_code': 'user_not_found'
+ }), 404
+
+ # 检查萌芽币余额
+ current_coins = user.get('萌芽币', 0)
+ if current_coins < AI_COST:
+ return jsonify({
+ 'success': False,
+ 'message': f'萌芽币余额不足!当前余额: {current_coins}, 需要: {AI_COST}',
+ 'error_code': 'insufficient_coins',
+ 'current_coins': current_coins,
+ 'required_coins': AI_COST
+ }), 402
+
+ # 先扣除萌芽币,确保无论服务是否成功都会扣费
+ deduct_result = users_collection.update_one(
+ {'_id': ObjectId(user_id)},
+ {'$inc': {'萌芽币': -AI_COST}}
+ )
+
+ if deduct_result.modified_count < 1:
+ print(f"警告: 用户 {user_id} 萌芽币扣除失败")
+
+ # 为请求添加用户信息,以便在函数内部使用
+ request.current_user = {
+ 'user_id': user_id,
+ 'username': user.get('用户名', ''),
+ 'email': user.get('邮箱', '')
+ }
+
+ # 保存API调用类型
+ api_type = request.path.split('/')[-1]
+
+ # 添加使用记录
+ usage_record = {
+ 'api_type': api_type,
+ 'timestamp': datetime.now().isoformat(),
+ 'cost': AI_COST
+ }
+
+ # 更新用户的AI使用历史记录
+ users_collection.update_one(
+ {'_id': ObjectId(user_id)},
+ {'$push': {'ai_usage_history': usage_record}}
+ )
+
+ # 调用原函数
+ result = f(*args, **kwargs)
+
+ return result
+
+ except Exception as e:
+ print(f"验证萌芽币时发生错误: {str(e)}")
+ return jsonify({
+ 'success': False,
+ 'message': '处理请求时出错',
+ 'error': str(e)
+ }), 500
+
+ return decorated
+
+#加载AI配置文件
+def load_ai_config():
+ """加载AI配置文件"""
+ try:
+ config_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'ai_config.json')
+ with open(config_path, 'r', encoding='utf-8') as f:
+ return json.load(f)
+ except Exception as e:
+ print(f"加载AI配置失败: {e}")
+ return None
+
+#调用DeepSeek API,带重试机制
+def call_deepseek_api(messages, model="deepseek-chat", max_retries=3):
+ """调用DeepSeek API,带重试机制"""
+ config = load_ai_config()
+ if not config or 'deepseek' not in config:
+ return None, "AI配置加载失败"
+
+ deepseek_config = config['deepseek']
+
+ headers = {
+ 'Authorization': f'Bearer {deepseek_config["api_key"]}',
+ 'Content-Type': 'application/json'
+ }
+
+ data = {
+ 'model': model,
+ 'messages': messages,
+ 'temperature': 0.7,
+ 'max_tokens': 2000
+ }
+
+ import time
+
+ for attempt in range(max_retries):
+ try:
+ # 增加超时时间到90秒
+ response = requests.post(
+ f"{deepseek_config['api_base']}/chat/completions",
+ headers=headers,
+ json=data,
+ timeout=90
+ )
+
+ if response.status_code == 200:
+ result = response.json()
+ return result['choices'][0]['message']['content'], None
+ else:
+ error_msg = f"API调用失败: {response.status_code} - {response.text}"
+ if attempt < max_retries - 1:
+ print(f"第{attempt + 1}次尝试失败,等待重试: {error_msg}")
+ time.sleep(2 ** attempt) # 指数退避
+ continue
+ return None, error_msg
+
+ except requests.exceptions.Timeout:
+ error_msg = "API请求超时"
+ if attempt < max_retries - 1:
+ print(f"第{attempt + 1}次尝试超时,等待重试")
+ time.sleep(2 ** attempt) # 指数退避
+ continue
+ return None, f"{error_msg}(已重试{max_retries}次)"
+
+ except Exception as e:
+ error_msg = f"API调用异常: {str(e)}"
+ if attempt < max_retries - 1:
+ print(f"第{attempt + 1}次尝试异常,等待重试: {error_msg}")
+ time.sleep(2 ** attempt) # 指数退避
+ continue
+ return None, f"{error_msg}(已重试{max_retries}次)"
+
+#调用Kimi API
+def call_kimi_api(messages, model="kimi-k2-0905-preview"):
+ """调用Kimi API"""
+ config = load_ai_config()
+ if not config or 'kimi' not in config:
+ return None, "AI配置加载失败"
+
+ kimi_config = config['kimi']
+
+ headers = {
+ 'Authorization': f'Bearer {kimi_config["api_key"]}',
+ 'Content-Type': 'application/json'
+ }
+
+ data = {
+ 'model': model,
+ 'messages': messages,
+ 'temperature': 0.7,
+ 'max_tokens': 2000
+ }
+
+ try:
+ response = requests.post(
+ f"{kimi_config['api_base']}/v1/chat/completions",
+ headers=headers,
+ json=data,
+ timeout=30
+ )
+
+ if response.status_code == 200:
+ result = response.json()
+ return result['choices'][0]['message']['content'], None
+ else:
+ return None, f"API调用失败: {response.status_code} - {response.text}"
+
+ except Exception as e:
+ return None, f"API调用异常: {str(e)}"
+
+#统一的AI聊天接口
+@aimodelapp_bp.route('/chat', methods=['POST'])
+@verify_user_coins
+def ai_chat():
+ """统一的AI聊天接口"""
+ try:
+ data = request.get_json()
+
+ if not data:
+ return jsonify({'error': '请求数据为空'}), 400
+
+ # 获取请求参数
+ messages = data.get('messages', [])
+ model_provider = data.get('provider', 'deepseek') # 默认使用deepseek
+ model_name = data.get('model', 'deepseek-chat') # 默认模型
+
+ if not messages:
+ return jsonify({'error': '消息内容不能为空'}), 400
+
+ # 根据提供商调用对应的API
+ if model_provider == 'deepseek':
+ content, error = call_deepseek_api(messages, model_name)
+ elif model_provider == 'kimi':
+ content, error = call_kimi_api(messages, model_name)
+ else:
+ return jsonify({'error': f'不支持的AI提供商: {model_provider}'}), 400
+
+ if error:
+ return jsonify({'error': error}), 500
+
+ return jsonify({
+ 'success': True,
+ 'content': content,
+ 'provider': model_provider,
+ 'model': model_name,
+ 'timestamp': datetime.now().isoformat()
+ })
+
+ except Exception as e:
+ return jsonify({'error': f'服务器错误: {str(e)}'}), 500
+
+#姓名分析专用接口
+@aimodelapp_bp.route('/name-analysis', methods=['POST'])
+@verify_user_coins
+def name_analysis():
+ """姓名分析专用接口"""
+ try:
+ data = request.get_json()
+ name = data.get('name', '').strip()
+
+ if not name:
+ return jsonify({'error': '姓名不能为空'}), 400
+
+ # 构建姓名分析的专业提示词
+ prompt = f"""你是一位专业的姓名学专家和语言学家,请对输入的姓名进行全面分析。请直接输出分析结果,不要包含任何思考过程或标签。
+
+姓名:{name}
+
+请按照以下格式严格输出分析结果:
+
+【稀有度评分】
+评分:X%
+评价:[对稀有度的详细说明,包括姓氏和名字的常见程度分析]
+
+【音韵评价】
+评分:X%
+评价:[对音韵美感的分析,包括声调搭配、读音流畅度、音律和谐度等]
+
+【含义解读】
+[详细分析姓名的寓意内涵,包括:
+1. 姓氏的历史渊源和文化背景
+2. 名字各字的含义和象征
+3. 整体姓名的寓意组合
+4. 可能体现的父母期望或文化内涵
+5. 与传统文化、诗词典故的关联等]
+
+要求:
+1. 评分必须是1-100的整数百分比,要有明显区分度,避免雷同
+2. 分析要专业、客观、有依据,评分要根据实际情况有所差异
+3. 含义解读要详细深入,至少150字
+4. 严格按照上述格式输出,不要添加思考过程、标签或其他内容
+5. 如果是生僻字或罕见姓名,要特别说明
+6. 直接输出最终结果,不要显示推理过程"""
+
+ messages = [
+ {"role": "user", "content": prompt}
+ ]
+
+ # 使用DeepSeek进行分析
+ content, error = call_deepseek_api(messages)
+
+ if error:
+ return jsonify({'error': error}), 500
+
+ return jsonify({
+ 'success': True,
+ 'analysis': content,
+ 'name': name,
+ 'timestamp': datetime.now().isoformat()
+ })
+
+ except Exception as e:
+ return jsonify({'error': f'姓名分析失败: {str(e)}'}), 500
+
+#变量命名助手接口
+@aimodelapp_bp.route('/variable-naming', methods=['POST'])
+@verify_user_coins
+def variable_naming():
+ """变量命名助手接口"""
+ try:
+ data = request.get_json()
+ description = data.get('description', '').strip()
+ language = data.get('language', 'javascript').lower()
+
+ if not description:
+ return jsonify({'error': '变量描述不能为空'}), 400
+
+ # 构建变量命名的提示词
+ prompt = f"""你是一个专业的变量命名助手。请根据以下描述为变量生成合适的名称:
+
+描述:{description}
+
+请为每种命名规范生成3个变量名建议:
+1. camelCase (驼峰命名法)
+2. PascalCase (帕斯卡命名法)
+3. snake_case (下划线命名法)
+4. kebab-case (短横线命名法)
+5. CONSTANT_CASE (常量命名法)
+
+要求:
+- 变量名要准确反映功能和用途
+- 严格遵循各自的命名规范
+- 避免使用缩写,除非是广泛认知的缩写
+- 名称要简洁但具有描述性
+- 考虑代码的可读性和维护性
+
+请按以下JSON格式返回:
+{{
+ "suggestions": {{
+ "camelCase": [
+ {{"name": "变量名1", "description": "解释说明1"}},
+ {{"name": "变量名2", "description": "解释说明2"}},
+ {{"name": "变量名3", "description": "解释说明3"}}
+ ],
+ "PascalCase": [
+ {{"name": "变量名1", "description": "解释说明1"}},
+ {{"name": "变量名2", "description": "解释说明2"}},
+ {{"name": "变量名3", "description": "解释说明3"}}
+ ],
+ "snake_case": [
+ {{"name": "变量名1", "description": "解释说明1"}},
+ {{"name": "变量名2", "description": "解释说明2"}},
+ {{"name": "变量名3", "description": "解释说明3"}}
+ ],
+ "kebab-case": [
+ {{"name": "变量名1", "description": "解释说明1"}},
+ {{"name": "变量名2", "description": "解释说明2"}},
+ {{"name": "变量名3", "description": "解释说明3"}}
+ ],
+ "CONSTANT_CASE": [
+ {{"name": "变量名1", "description": "解释说明1"}},
+ {{"name": "变量名2", "description": "解释说明2"}},
+ {{"name": "变量名3", "description": "解释说明3"}}
+ ]
+ }}
+}}
+
+只返回JSON格式的结果,不要包含其他文字。"""
+
+ messages = [
+ {"role": "user", "content": prompt}
+ ]
+
+ # 使用DeepSeek进行分析
+ content, error = call_deepseek_api(messages)
+
+ if error:
+ return jsonify({'error': error}), 500
+
+ # 解析AI返回的JSON格式数据
+ try:
+ # 尝试直接解析JSON
+ ai_response = json.loads(content)
+ suggestions = ai_response.get('suggestions', {})
+ except json.JSONDecodeError:
+ # 如果直接解析失败,尝试提取JSON部分
+ import re
+ json_match = re.search(r'\{[\s\S]*\}', content)
+ if json_match:
+ try:
+ ai_response = json.loads(json_match.group())
+ suggestions = ai_response.get('suggestions', {})
+ except json.JSONDecodeError:
+ return jsonify({'error': 'AI返回的数据格式无法解析'}), 500
+ else:
+ return jsonify({'error': 'AI返回的数据中未找到有效的JSON格式'}), 500
+
+ return jsonify({
+ 'success': True,
+ 'suggestions': suggestions,
+ 'description': description,
+ 'language': language,
+ 'timestamp': datetime.now().isoformat()
+ })
+
+ except Exception as e:
+ return jsonify({'error': f'变量命名失败: {str(e)}'}), 500
+
+#AI写诗助手接口
+@aimodelapp_bp.route('/poetry', methods=['POST'])
+@verify_user_coins
+def poetry_assistant():
+ """AI写诗助手接口"""
+ try:
+ data = request.get_json()
+ theme = data.get('theme', '').strip()
+ style = data.get('style', '现代诗').strip()
+ mood = data.get('mood', '').strip()
+
+ if not theme:
+ return jsonify({'error': '诗歌主题不能为空'}), 400
+
+ # 构建写诗的提示词
+ prompt = f"""你是一位才华横溢的诗人,请根据以下要求创作一首诗歌。
+
+主题:{theme}
+风格:{style}
+情感基调:{mood if mood else '自由发挥'}
+
+创作要求:
+1. 紧扣主题,情感真挚
+2. 语言优美,意境深远
+3. 符合指定的诗歌风格
+4. 长度适中,朗朗上口
+5. 如果是古体诗,注意平仄和韵律
+
+请直接输出诗歌作品,不需要额外的解释或分析。"""
+
+ messages = [
+ {"role": "user", "content": prompt}
+ ]
+
+ # 使用DeepSeek进行创作
+ content, error = call_deepseek_api(messages)
+
+ if error:
+ return jsonify({'error': error}), 500
+
+ return jsonify({
+ 'success': True,
+ 'poem': content,
+ 'theme': theme,
+ 'style': style,
+ 'mood': mood,
+ 'timestamp': datetime.now().isoformat()
+ })
+
+ except Exception as e:
+ return jsonify({'error': f'诗歌创作失败: {str(e)}'}), 500
+
+#AI语言翻译接口
+@aimodelapp_bp.route('/translation', methods=['POST'])
+@verify_user_coins
+def translation():
+ """AI语言翻译接口"""
+ try:
+ data = request.get_json()
+ source_text = data.get('source_text', '').strip()
+ target_language = data.get('target_language', 'zh-CN').strip()
+
+ if not source_text:
+ return jsonify({'error': '翻译内容不能为空'}), 400
+
+ # 语言映射
+ language_map = {
+ 'zh-CN': '中文(简体)',
+ 'zh-TW': '中文(繁体)',
+ 'en': '英语',
+ 'ja': '日语',
+ 'ko': '韩语',
+ 'fr': '法语',
+ 'de': '德语',
+ 'es': '西班牙语',
+ 'it': '意大利语',
+ 'pt': '葡萄牙语',
+ 'ru': '俄语',
+ 'ar': '阿拉伯语',
+ 'hi': '印地语',
+ 'th': '泰语',
+ 'vi': '越南语'
+ }
+
+ target_language_name = language_map.get(target_language, target_language)
+
+ # 构建翻译的专业提示词
+ prompt = f"""你是一位专业的翻译专家,精通多种语言的翻译工作。请将以下文本翻译成{target_language_name}。
+
+原文:{source_text}
+
+翻译要求:
+1. 【信】- 忠实原文,准确传达原意,不遗漏、不添加、不歪曲
+2. 【达】- 译文通顺流畅,符合目标语言的表达习惯和语法规范
+3. 【雅】- 用词优美得体,风格与原文相符,具有良好的可读性
+
+特别注意:
+- 自动检测源语言,无需用户指定
+- 保持原文的语气、情感色彩和文体风格
+- 对于专业术语,提供准确的对应翻译
+- 对于文化特色词汇,在保持原意的基础上进行适当的本土化处理
+- 如果是单词或短语,提供多个常用含义的翻译
+- 如果是句子,确保语法正确、表达自然
+
+请按以下JSON格式返回翻译结果:
+{{
+ "detected_language": "检测到的源语言名称",
+ "target_language": "{target_language_name}",
+ "translation": "翻译结果",
+ "alternative_translations": [
+ "备选翻译1",
+ "备选翻译2",
+ "备选翻译3"
+ ],
+ "explanation": "翻译说明(包括语境、用法、注意事项等)",
+ "pronunciation": "目标语言的发音指导(如适用)"
+}}
+
+只返回JSON格式的结果,不要包含其他文字。"""
+
+ messages = [
+ {"role": "user", "content": prompt}
+ ]
+
+ # 使用DeepSeek进行翻译
+ content, error = call_deepseek_api(messages)
+
+ if error:
+ return jsonify({'error': error}), 500
+
+ return jsonify({
+ 'success': True,
+ 'translation_result': content,
+ 'source_text': source_text,
+ 'target_language': target_language,
+ 'timestamp': datetime.now().isoformat()
+ })
+
+ except Exception as e:
+ return jsonify({'error': f'翻译失败: {str(e)}'}), 500
+
+#现代文转文言文接口
+@aimodelapp_bp.route('/classical_conversion', methods=['POST'])
+@verify_user_coins
+def classical_conversion():
+ """现代文转文言文接口"""
+ try:
+ data = request.get_json()
+ modern_text = data.get('modern_text', '').strip()
+ style = data.get('style', '古雅').strip()
+ article_type = data.get('article_type', '散文').strip()
+
+ if not modern_text:
+ return jsonify({'error': '现代文内容不能为空'}), 400
+
+ # 构建文言文转换的专业提示词
+ prompt = f"""你是一位精通古代文言文的文学大师,擅长将现代文转换为优美的文言文。请将以下现代文转换为文言文。
+
+现代文:{modern_text}
+
+转换要求:
+1. 风格:{style}
+2. 文体:{article_type}
+3. 保持原文的核心意思和情感色彩
+4. 使用恰当的文言文语法和词汇
+5. 注重音韵美感和文字的雅致
+6. 根据不同风格调整用词和句式
+
+风格说明:
+- 古雅:典雅庄重,用词考究,句式工整
+- 简洁:言简意赅,删繁就简,朴实无华
+- 华丽:辞藻华美,对仗工整,音韵和谐
+- 朴实:平实自然,通俗易懂,贴近生活
+
+文体特点:
+- 散文:行文自由,情理并茂
+- 诗歌:讲究韵律,意境深远
+- 议论文:逻辑严密,论证有力
+- 记叙文:叙事生动,描写细腻
+- 书信:格式规范,情真意切
+- 公文:庄重严肃,用词准确
+
+请按以下JSON格式返回转换结果:
+{{
+ "classical_text": "转换后的文言文",
+ "translation_notes": "转换说明,包括重要词汇的选择理由和语法特点",
+ "style_analysis": "风格分析,说明如何体现所选风格特点",
+ "difficulty_level": "难度等级(初级/中级/高级)",
+ "key_phrases": [
+ {{
+ "modern": "现代词汇",
+ "classical": "对应文言文词汇",
+ "explanation": "转换说明"
+ }}
+ ],
+ "cultural_elements": "文化内涵说明,包含的典故、意象等"
+}}
+
+只返回JSON格式的结果,不要包含其他文字。"""
+
+ messages = [
+ {"role": "user", "content": prompt}
+ ]
+
+ # 使用DeepSeek进行文言文转换
+ content, error = call_deepseek_api(messages)
+
+ if error:
+ return jsonify({'error': error}), 500
+
+ return jsonify({
+ 'success': True,
+ 'conversion_result': content,
+ 'modern_text': modern_text,
+ 'style': style,
+ 'article_type': article_type,
+ 'timestamp': datetime.now().isoformat()
+ })
+
+ except Exception as e:
+ return jsonify({'error': f'文言文转换失败: {str(e)}'}), 500
+
+#AI表情制作器接口
+@aimodelapp_bp.route('/expression-maker', methods=['POST'])
+@verify_user_coins
+def expression_maker():
+ """AI表情制作器接口"""
+ try:
+ data = request.get_json()
+ text = data.get('text', '').strip()
+ style = data.get('style', 'mixed').strip()
+
+ if not text:
+ return jsonify({'error': '文字内容不能为空'}), 400
+
+ # 风格映射
+ style_prompts = {
+ 'mixed': '混合使用Emoji表情和颜文字',
+ 'emoji': '仅使用Emoji表情符号',
+ 'kaomoji': '仅使用颜文字(日式表情符号)',
+ 'cute': '使用可爱风格的表情符号',
+ 'cool': '使用酷炫风格的表情符号'
+ }
+
+ style_description = style_prompts.get(style, style_prompts['mixed'])
+
+ # 构建表情制作的提示词
+ prompt = f"""你是一个专业的表情符号专家,擅长为文字内容生成合适的表情符号。请根据以下文字内容生成相应的表情符号:
+
+文字内容:{text}
+表情风格:{style_description}
+
+请为这个文字内容生成表情符号,要求:
+1. 准确表达文字的情感和含义
+2. 符合指定的表情风格
+3. 提供多样化的选择
+4. 包含使用场景说明
+
+请按以下分类生成表情符号:
+1. Emoji表情(使用Unicode表情符号)
+2. 颜文字(使用ASCII字符组成的表情)
+3. 组合表情(多个符号组合使用)
+
+每个分类提供5个不同的表情选项,每个选项包含:
+- 表情符号本身
+- 适用场景说明
+- 情感强度(轻微/中等/强烈)
+
+请按以下JSON格式返回:
+{{
+ "expressions": {{
+ "emoji": [
+ {{
+ "symbol": "😊",
+ "description": "适用场景和情感说明",
+ "intensity": "中等",
+ "usage": "使用建议"
+ }}
+ ],
+ "kaomoji": [
+ {{
+ "symbol": "(^_^)",
+ "description": "适用场景和情感说明",
+ "intensity": "轻微",
+ "usage": "使用建议"
+ }}
+ ],
+ "combination": [
+ {{
+ "symbol": "🎉✨",
+ "description": "适用场景和情感说明",
+ "intensity": "强烈",
+ "usage": "使用建议"
+ }}
+ ]
+ }},
+ "summary": {{
+ "emotion_analysis": "对输入文字的情感分析",
+ "recommended_usage": "推荐的使用场景",
+ "style_notes": "风格特点说明"
+ }}
+}}
+
+只返回JSON格式的结果,不要包含其他文字。"""
+
+ messages = [
+ {"role": "user", "content": prompt}
+ ]
+
+ # 使用DeepSeek进行分析
+ content, error = call_deepseek_api(messages)
+
+ if error:
+ return jsonify({'error': error}), 500
+
+ # 解析AI返回的JSON格式数据
+ try:
+ # 尝试直接解析JSON
+ ai_response = json.loads(content)
+ expressions = ai_response.get('expressions', {})
+ summary = ai_response.get('summary', {})
+ except json.JSONDecodeError:
+ # 如果直接解析失败,尝试提取JSON部分
+ import re
+ json_match = re.search(r'\{[\s\S]*\}', content)
+ if json_match:
+ try:
+ ai_response = json.loads(json_match.group())
+ expressions = ai_response.get('expressions', {})
+ summary = ai_response.get('summary', {})
+ except json.JSONDecodeError:
+ return jsonify({'error': 'AI返回的数据格式无法解析'}), 500
+ else:
+ return jsonify({'error': 'AI返回的数据中未找到有效的JSON格式'}), 500
+
+ return jsonify({
+ 'success': True,
+ 'expressions': expressions,
+ 'summary': summary,
+ 'text': text,
+ 'style': style,
+ 'timestamp': datetime.now().isoformat()
+ })
+
+ except Exception as e:
+ return jsonify({'error': f'表情制作失败: {str(e)}'}), 500
+
+#Linux命令生成接口
+@aimodelapp_bp.route('/linux-command', methods=['POST'])
+@verify_user_coins
+def linux_command_generator():
+ """Linux命令生成接口"""
+ try:
+ data = request.get_json()
+ task_description = data.get('task_description', '').strip()
+ difficulty_level = data.get('difficulty_level', 'beginner').strip()
+
+ if not task_description:
+ return jsonify({'error': '任务描述不能为空'}), 400
+
+ # 构建Linux命令生成的专业提示词
+ prompt = f"""你是一位Linux系统专家,请根据用户的任务描述生成相应的Linux命令。
+
+任务描述:{task_description}
+用户水平:{difficulty_level}
+
+请为这个任务生成合适的Linux命令,要求:
+1. 命令准确可用,符合Linux标准
+2. 根据用户水平提供适当的复杂度
+3. 提供多种实现方式(如果有的话)
+4. 包含安全提示和注意事项
+5. 解释每个命令的作用和参数
+
+用户水平说明:
+- beginner(初学者):提供基础命令,详细解释
+- intermediate(中级):提供常用命令和选项
+- advanced(高级):提供高效命令和高级用法
+
+请按以下JSON格式返回:
+{{
+ "commands": [
+ {{
+ "command": "具体的Linux命令",
+ "description": "命令的详细说明",
+ "safety_level": "safe/caution/dangerous",
+ "explanation": "命令各部分的解释",
+ "example_output": "预期的命令输出示例",
+ "alternatives": ["替代命令1", "替代命令2"]
+ }}
+ ],
+ "safety_warnings": ["安全提示1", "安全提示2"],
+ "prerequisites": ["前置条件1", "前置条件2"],
+ "related_concepts": ["相关概念1", "相关概念2"]
+}}
+
+只返回JSON格式的结果,不要包含其他文字。"""
+
+ messages = [
+ {"role": "user", "content": prompt}
+ ]
+
+ # 使用DeepSeek进行命令生成
+ content, error = call_deepseek_api(messages)
+
+ if error:
+ return jsonify({'error': error}), 500
+
+ return jsonify({
+ 'success': True,
+ 'command_result': content,
+ 'task_description': task_description,
+ 'difficulty_level': difficulty_level,
+ 'timestamp': datetime.now().isoformat()
+ })
+
+ except Exception as e:
+ return jsonify({'error': f'Linux命令生成失败: {str(e)}'}), 500
+
+#AI文章排版(Markdown格式化)接口
+@aimodelapp_bp.route('/markdown_formatting', methods=['POST'])
+@verify_user_coins
+def markdown_formatting():
+ """AI文章排版(Markdown格式化)接口"""
+ try:
+ data = request.get_json()
+ article_text = data.get('article_text', '').strip()
+ emoji_style = data.get('emoji_style', 'balanced').strip()
+ markdown_option = data.get('markdown_option', 'standard').strip()
+
+ if not article_text:
+ return jsonify({'error': '文章内容不能为空'}), 400
+
+ # 构建Markdown排版的提示词
+ prompt = f"""你是一位专业的文档排版助手。请将用户提供的全文按“标准Markdown格式”进行排版,并在不改变任何原文内容的前提下进行结构化呈现。严格遵守以下规则:
+
+1) 保留所有原始内容,严禁改写、删减或添加新内容。
+2) 使用合理的Markdown结构(标题、分节、段落、列表、引用、表格如有必要、代码块仅当原文包含)。
+3) 智能添加适量Emoji以增强可读性({emoji_style}),在标题、关键句、列表项等处点缀;避免过度使用,保持专业。
+4) 保持语言与语气不变,只优化排版和表现形式。
+5) 输出“纯Markdown文本”,不要包含任何JSON、HTML、XML、解释文字、或代码块围栏标记(例如不要在最外层使用```)。
+
+如果原文本较长,可在开头自动生成简洁的“目录”以便阅读。
+
+原文如下:
+{article_text}
+"""
+
+ messages = [{"role": "user", "content": prompt}]
+
+ # 使用DeepSeek进行排版生成
+ content, error = call_deepseek_api(messages)
+
+ if error:
+ return jsonify({'error': error}), 500
+
+ # 返回AI生成的Markdown文本
+ return jsonify({
+ 'success': True,
+ 'formatted_markdown': content,
+ 'source_text': article_text,
+ 'emoji_style': emoji_style,
+ 'markdown_option': markdown_option,
+ 'timestamp': datetime.now().isoformat()
+ })
+
+ except Exception as e:
+ return jsonify({'error': f'文章排版失败: {str(e)}'}), 500
+
+#获取用户萌芽币余额
+@aimodelapp_bp.route('/coins', methods=['GET'])
+def get_user_coins():
+ """获取用户萌芽币余额"""
+ try:
+ # 获取用户认证信息
+ token = request.headers.get('Authorization')
+ if not token:
+ return jsonify({
+ 'success': False,
+ 'message': '未提供认证信息',
+ 'error_code': 'auth_required'
+ }), 401
+
+ if token.startswith('Bearer '):
+ token = token[7:]
+
+ # 解析JWT token
+ import jwt
+ try:
+ payload = jwt.decode(token, current_app.config['SECRET_KEY'], algorithms=['HS256'])
+ user_id = payload['user_id']
+ except jwt.ExpiredSignatureError:
+ return jsonify({
+ 'success': False,
+ 'message': 'Token已过期,请重新登录',
+ 'error_code': 'token_expired'
+ }), 401
+ except Exception as e:
+ return jsonify({
+ 'success': False,
+ 'message': f'无效的认证信息: {str(e)}',
+ 'error_code': 'invalid_token'
+ }), 401
+
+ # 查询用户萌芽币余额
+ users_collection = current_app.mongo.db.userdata
+ user = users_collection.find_one({'_id': ObjectId(user_id)})
+
+ if not user:
+ return jsonify({
+ 'success': False,
+ 'message': '用户不存在',
+ 'error_code': 'user_not_found'
+ }), 404
+
+ # 返回萌芽币信息
+ current_coins = user.get('萌芽币', 0)
+ username = user.get('用户名', '用户')
+
+ # 增加额外有用信息
+ ai_usage_history = []
+ if 'ai_usage_history' in user:
+ ai_usage_history = user['ai_usage_history'][-5:] # 最近5条使用记录
+
+ return jsonify({
+ 'success': True,
+ 'data': {
+ 'coins': current_coins,
+ 'ai_cost': AI_COST,
+ 'can_use_ai': current_coins >= AI_COST,
+ 'username': username,
+ 'usage_count': len(ai_usage_history),
+ 'recent_usage': ai_usage_history
+ },
+ 'message': f'当前萌芽币余额: {current_coins}'
+ }), 200
+ except Exception as e:
+ return jsonify({
+ 'success': False,
+ 'message': '处理请求时出错',
+ 'error': str(e)
+ }), 500
+
+#获取可用的AI模型列表
+@aimodelapp_bp.route('/models', methods=['GET'])
+def get_available_models():
+ """获取可用的AI模型列表"""
+ try:
+ config = load_ai_config()
+ if not config:
+ return jsonify({'error': 'AI配置加载失败'}), 500
+
+ models = {}
+ for provider, provider_config in config.items():
+ if 'model' in provider_config:
+ models[provider] = provider_config['model']
+
+ return jsonify({
+ 'success': True,
+ 'models': models,
+ 'default_provider': 'deepseek',
+ 'default_model': 'deepseek-chat'
+ })
+
+ except Exception as e:
+ return jsonify({'error': f'获取模型列表失败: {str(e)}'}), 500
+
+#中国亲戚称呼计算器接口(普通话版 + 方言)
+@aimodelapp_bp.route('/kinship-calculator', methods=['POST'])
+@verify_user_coins
+def kinship_calculator():
+ """中国亲戚称呼计算器接口"""
+ try:
+ data = request.get_json() or {}
+ relation_chain = (data.get('relation_chain') or '').strip()
+ dialects = data.get('dialects') # 可选,指定方言列表
+
+ if not relation_chain:
+ return jsonify({'error': '亲属关系链不能为空'}), 400
+
+ # 组装提示词:要求严格JSON输出
+ requested_dialects = dialects if isinstance(dialects, list) and dialects else [
+ '粤语', '闽南语', '上海话', '四川话', '东北话', '客家话'
+ ]
+
+ prompt = f"""你是一位中国亲属称呼专家。请解析下面的亲属关系链,给出最终的亲属称呼。
+输入的关系链会用“的”连接,如“妈妈的爸爸”“爸爸的姐姐的儿子”。
+
+请遵循:
+1) 以中国大陆通行的标准普通话称呼为准,给出最常用、规范的最终称呼。
+2) 同时给出若干方言的对应称呼:{', '.join(requested_dialects)}。
+3) 如存在地区差异或性别歧义,请在notes中说明,但最终给出一个最常用称呼。
+4) 不要展示推理过程;只输出JSON。
+
+严格按以下JSON结构输出:
+{{
+ "mandarin_title": "标准普通话称呼",
+ "dialect_titles": {{
+ "粤语": {{"title": "称呼", "romanization": "粤拼或发音", "notes": "可选说明"}},
+ "闽南语": {{"title": "称呼", "romanization": "白话字或发音", "notes": "可选说明"}},
+ "上海话": {{"title": "称呼", "romanization": "拟音或IPA", "notes": "可选说明"}},
+ "四川话": {{"title": "称呼", "romanization": "拟音或IPA", "notes": "可选说明"}},
+ "东北话": {{"title": "称呼", "romanization": "拟音或IPA", "notes": "可选说明"}},
+ "客家话": {{"title": "称呼", "romanization": "客家话拟音", "notes": "可选说明"}}
+ }},
+ "notes": "总体说明(如地区差异、辈分方向、父系/母系等提示)"
+}}
+
+关系链:
+{relation_chain}
+"""
+
+ messages = [{"role": "user", "content": prompt}]
+ content, error = call_deepseek_api(messages)
+
+ if error:
+ return jsonify({'error': error}), 500
+
+ # 解析AI返回的JSON
+ try:
+ result = json.loads(content)
+ except json.JSONDecodeError:
+ import re
+ m = re.search(r'\{[\s\S]*\}', content)
+ if not m:
+ return jsonify({'error': 'AI返回的数据中未找到有效JSON'}), 500
+ try:
+ result = json.loads(m.group())
+ except Exception:
+ return jsonify({'error': 'AI返回的JSON格式无法解析'}), 500
+
+ mandarin_title = result.get('mandarin_title')
+ dialect_titles = result.get('dialect_titles', {})
+ notes = result.get('notes', '')
+
+ if not mandarin_title:
+ return jsonify({'error': '未获得标准普通话称呼'}), 500
+
+ return jsonify({
+ 'success': True,
+ 'relation_chain': relation_chain,
+ 'mandarin_title': mandarin_title,
+ 'dialect_titles': dialect_titles,
+ 'notes': notes,
+ 'timestamp': datetime.now().isoformat()
+ })
+
+ except Exception as e:
return jsonify({'error': f'亲戚称呼计算失败: {str(e)}'}), 500
\ No newline at end of file
diff --git a/InfoGenie-backend/modules/auth.py b/InfoGenie-backend/modules/auth.py
index a62f99c7..1f186701 100755
--- a/InfoGenie-backend/modules/auth.py
+++ b/InfoGenie-backend/modules/auth.py
@@ -1,455 +1,455 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""
-用户认证模块
-Created by: 万象口袋
-Date: 2025-09-02
-"""
-
-from flask import Blueprint, request, jsonify, current_app
-from werkzeug.security import generate_password_hash, check_password_hash
-import hashlib
-import re
-import jwt
-from datetime import datetime, timedelta
-from functools import wraps
-from .email_service import send_verification_email, verify_code, is_qq_email, get_qq_avatar_url
-
-auth_bp = Blueprint('auth', __name__)
-
-#生成JWT token
-def generate_token(user_data):
- """生成JWT token"""
- payload = {
- 'user_id': user_data['user_id'],
- 'email': user_data['email'],
- 'username': user_data['username'],
- 'exp': datetime.utcnow() + timedelta(days=7), # 7天过期
- 'iat': datetime.utcnow()
- }
- return jwt.encode(payload, current_app.config['SECRET_KEY'], algorithm='HS256')
-
-#验证JWT token
-def verify_token(token):
- """验证JWT token"""
- try:
- payload = jwt.decode(token, current_app.config['SECRET_KEY'], algorithms=['HS256'])
- return {'success': True, 'data': payload}
- except jwt.ExpiredSignatureError:
- return {'success': False, 'message': 'Token已过期'}
- except jwt.InvalidTokenError:
- return {'success': False, 'message': 'Token无效'}
-
-#JWT token验证装饰器
-def token_required(f):
- """JWT token验证装饰器"""
- @wraps(f)
- def decorated(*args, **kwargs):
- token = request.headers.get('Authorization')
- if not token:
- return jsonify({'success': False, 'message': '缺少认证token'}), 401
-
- if token.startswith('Bearer '):
- token = token[7:]
-
- result = verify_token(token)
- if not result['success']:
- return jsonify({'success': False, 'message': result['message']}), 401
-
- request.current_user = result['data']
- return f(*args, **kwargs)
- return decorated
-
-#验证QQ邮箱格式
-def validate_qq_email(email):
- """验证QQ邮箱格式"""
- return is_qq_email(email)
-
-#验证密码格式
-def validate_password(password):
- """验证密码格式(6-20位)"""
- return 6 <= len(password) <= 20
-
-
-#==========================对外暴露的HTTP接口==========================
-#发送验证码邮件
-@auth_bp.route('/send-verification', methods=['POST'])
-def send_verification():
- """发送验证码邮件"""
- try:
- data = request.get_json()
- email = data.get('email', '').strip()
- verification_type = data.get('type', 'register') # register, login
-
- # 参数验证
- if not email:
- return jsonify({
- 'success': False,
- 'message': '邮箱地址不能为空'
- }), 400
-
- if not validate_qq_email(email):
- return jsonify({
- 'success': False,
- 'message': '仅支持QQ邮箱(qq.com、vip.qq.com、foxmail.com)'
- }), 400
-
- # 获取数据库集合
- db = current_app.mongo.db
- users_collection = db.userdata
-
- # 检查邮箱是否已注册
- existing_user = users_collection.find_one({'邮箱': email})
-
- if verification_type == 'register' and existing_user:
- return jsonify({
- 'success': False,
- 'message': '该邮箱已被注册'
- }), 409
-
- if verification_type == 'login' and not existing_user:
- return jsonify({
- 'success': False,
- 'message': '该邮箱尚未注册'
- }), 404
-
- # 发送验证码
- result = send_verification_email(email, verification_type)
-
- if result['success']:
- return jsonify(result), 200
- else:
- return jsonify(result), 500
-
- except Exception as e:
- current_app.logger.error(f"发送验证码失败: {str(e)}")
- return jsonify({
- 'success': False,
- 'message': '发送失败,请稍后重试'
- }), 500
-
-#验证验证码
-@auth_bp.route('/verify-code', methods=['POST'])
-def verify_verification_code():
- """验证验证码"""
- try:
- data = request.get_json()
- email = data.get('email', '').strip()
- code = data.get('code', '').strip()
-
- # 参数验证
- if not email or not code:
- return jsonify({
- 'success': False,
- 'message': '邮箱和验证码不能为空'
- }), 400
-
- # 验证码校验
- result = verify_code(email, code)
-
- if result['success']:
- return jsonify(result), 200
- else:
- return jsonify(result), 400
-
- except Exception as e:
- current_app.logger.error(f"验证码校验失败: {str(e)}")
- return jsonify({
- 'success': False,
- 'message': '验证失败,请稍后重试'
- }), 500
-
-#用户注册
-@auth_bp.route('/register', methods=['POST'])
-def register():
- """用户注册(需要先验证邮箱)"""
- try:
- data = request.get_json()
- email = data.get('email', '').strip()
- username = data.get('username', '').strip()
- password = data.get('password', '').strip()
- code = data.get('code', '').strip()
-
- # 参数验证
- if not all([email, username, password, code]):
- return jsonify({
- 'success': False,
- 'message': '所有字段都不能为空'
- }), 400
-
- if not validate_qq_email(email):
- return jsonify({
- 'success': False,
- 'message': '仅支持QQ邮箱注册'
- }), 400
-
- if not validate_password(password):
- return jsonify({
- 'success': False,
- 'message': '密码长度必须在6-20位之间'
- }), 400
-
- # 验证验证码
- verify_result = verify_code(email, code)
- if not verify_result['success'] or verify_result.get('type') != 'register':
- return jsonify({
- 'success': False,
- 'message': '验证码无效或已过期'
- }), 400
-
- # 获取数据库集合
- db = current_app.mongo.db
- users_collection = db.userdata
-
- # 检查邮箱是否已被注册
- if users_collection.find_one({'邮箱': email}):
- return jsonify({
- 'success': False,
- 'message': '该邮箱已被注册'
- }), 409
-
- # 检查用户名是否已被使用
- if users_collection.find_one({'用户名': username}):
- return jsonify({
- 'success': False,
- 'message': '该用户名已被使用'
- }), 409
-
- # 获取QQ头像
- avatar_url = get_qq_avatar_url(email)
-
- # 创建新用户
- password_hash = generate_password_hash(password)
- user_data = {
- '邮箱': email,
- '用户名': username,
- '密码': password_hash,
- '头像': avatar_url,
- '注册时间': datetime.now().isoformat(),
- '最后登录': None,
- '登录次数': 0,
- '用户状态': 'active',
- '等级': 0,
- '经验': 0,
- '萌芽币': 0,
- '签到系统': {
- '连续签到天数': 0,
- '今日是否已签到': False,
- '签到时间': '2025-01-01'
- }
- }
-
- result = users_collection.insert_one(user_data)
-
- if result.inserted_id:
- return jsonify({
- 'success': True,
- 'message': '注册成功!',
- 'user': {
- 'email': email,
- 'username': username,
- 'avatar': avatar_url
- }
- }), 201
- else:
- return jsonify({
- 'success': False,
- 'message': '注册失败,请稍后重试'
- }), 500
-
- except Exception as e:
- current_app.logger.error(f"注册失败: {str(e)}")
- return jsonify({
- 'success': False,
- 'message': '注册失败,请稍后重试'
- }), 500
-
-#用户登录
-@auth_bp.route('/login', methods=['POST'])
-def login():
- """用户登录(支持邮箱+验证码或邮箱+密码)"""
- try:
- data = request.get_json()
- email = data.get('email', '').strip()
- password = data.get('password', '').strip()
- code = data.get('code', '').strip()
-
- # 参数验证
- if not email:
- return jsonify({
- 'success': False,
- 'message': '邮箱地址不能为空'
- }), 400
-
- if not validate_qq_email(email):
- return jsonify({
- 'success': False,
- 'message': '仅支持QQ邮箱登录'
- }), 400
-
- # 获取数据库集合
- db = current_app.mongo.db
- users_collection = db.userdata
-
- # 查找用户
- user = users_collection.find_one({'邮箱': email})
-
- if not user:
- return jsonify({
- 'success': False,
- 'message': '该邮箱尚未注册'
- }), 404
-
- # 检查用户状态
- if user.get('用户状态') != 'active':
- return jsonify({
- 'success': False,
- 'message': '账号已被禁用,请联系管理员'
- }), 403
-
- # 验证方式:验证码登录或密码登录
- if code:
- # 验证码登录
- verify_result = verify_code(email, code)
- if not verify_result['success'] or verify_result.get('type') != 'login':
- return jsonify({
- 'success': False,
- 'message': '验证码无效或已过期'
- }), 400
- elif password:
- # 密码登录
- if not check_password_hash(user['密码'], password):
- return jsonify({
- 'success': False,
- 'message': '密码错误'
- }), 401
- else:
- return jsonify({
- 'success': False,
- 'message': '请输入密码或验证码'
- }), 400
-
- # 登录成功,更新用户信息
- users_collection.update_one(
- {'邮箱': email},
- {
- '$set': {'最后登录': datetime.now().isoformat()},
- '$inc': {'登录次数': 1}
- }
- )
-
- # 生成JWT token
- user_data = {
- 'user_id': str(user['_id']),
- 'email': email,
- 'username': user.get('用户名', '')
- }
- token = generate_token(user_data)
-
- return jsonify({
- 'success': True,
- 'message': '登录成功!',
- 'token': token,
- 'user': {
- 'id': str(user['_id']),
- 'email': email,
- 'username': user.get('用户名', ''),
- 'avatar': user.get('头像', ''),
- 'login_count': user.get('登录次数', 0) + 1
- }
- }), 200
-
- except Exception as e:
- current_app.logger.error(f"登录失败: {str(e)}")
- return jsonify({
- 'success': False,
- 'message': '登录失败,请稍后重试'
- }), 500
-
- # 登录成功,创建会话
- hwt = getattr(request, 'hwt', {})
- hwt['user_id'] = str(user['_id'])
- hwt['account'] = user['账号']
- hwt['logged_in'] = True
-
- # 更新登录信息
- users_collection.update_one(
- {'_id': user['_id']},
- {
- '$set': {'最后登录': datetime.now().isoformat()},
- '$inc': {'登录次数': 1}
- }
- )
-
- return jsonify({
- 'success': True,
- 'message': '登录成功!',
- 'user': {
- 'account': user['账号'],
- 'last_login': user.get('最后登录'),
- 'login_count': user.get('登录次数', 0) + 1
- }
- }), 200
-
- except Exception as e:
- return jsonify({
- 'success': False,
- 'message': f'服务器错误: {str(e)}'
- }), 500
-
-#用户登出
-@auth_bp.route('/logout', methods=['POST'])
-def logout():
- """用户登出"""
- try:
- # JWT是无状态的,客户端删除token即可
- return jsonify({
- 'success': True,
- 'message': '已成功登出'
- }), 200
-
- except Exception as e:
- return jsonify({
- 'success': False,
- 'message': f'服务器错误: {str(e)}'
- }), 500
-
-#检查登录状态
-@auth_bp.route('/check', methods=['GET'])
-def check_login():
- """检查登录状态"""
- try:
- token = request.headers.get('Authorization')
- if not token:
- return jsonify({
- 'success': True,
- 'logged_in': False
- }), 200
-
- if token.startswith('Bearer '):
- token = token[7:]
-
- result = verify_token(token)
- if result['success']:
- user_data = result['data']
- return jsonify({
- 'success': True,
- 'logged_in': True,
- 'user': {
- 'id': user_data['user_id'],
- 'email': user_data['email'],
- 'username': user_data['username']
- }
- }), 200
- else:
- return jsonify({
- 'success': True,
- 'logged_in': False
- }), 200
-
- except Exception as e:
- return jsonify({
- 'success': False,
- 'message': f'服务器错误: {str(e)}'
- }), 500
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+用户认证模块
+Created by: 万象口袋
+Date: 2025-09-02
+"""
+
+from flask import Blueprint, request, jsonify, current_app
+from werkzeug.security import generate_password_hash, check_password_hash
+import hashlib
+import re
+import jwt
+from datetime import datetime, timedelta
+from functools import wraps
+from .email_service import send_verification_email, verify_code, is_qq_email, get_qq_avatar_url
+
+auth_bp = Blueprint('auth', __name__)
+
+#生成JWT token
+def generate_token(user_data):
+ """生成JWT token"""
+ payload = {
+ 'user_id': user_data['user_id'],
+ 'email': user_data['email'],
+ 'username': user_data['username'],
+ 'exp': datetime.utcnow() + timedelta(days=7), # 7天过期
+ 'iat': datetime.utcnow()
+ }
+ return jwt.encode(payload, current_app.config['SECRET_KEY'], algorithm='HS256')
+
+#验证JWT token
+def verify_token(token):
+ """验证JWT token"""
+ try:
+ payload = jwt.decode(token, current_app.config['SECRET_KEY'], algorithms=['HS256'])
+ return {'success': True, 'data': payload}
+ except jwt.ExpiredSignatureError:
+ return {'success': False, 'message': 'Token已过期'}
+ except jwt.InvalidTokenError:
+ return {'success': False, 'message': 'Token无效'}
+
+#JWT token验证装饰器
+def token_required(f):
+ """JWT token验证装饰器"""
+ @wraps(f)
+ def decorated(*args, **kwargs):
+ token = request.headers.get('Authorization')
+ if not token:
+ return jsonify({'success': False, 'message': '缺少认证token'}), 401
+
+ if token.startswith('Bearer '):
+ token = token[7:]
+
+ result = verify_token(token)
+ if not result['success']:
+ return jsonify({'success': False, 'message': result['message']}), 401
+
+ request.current_user = result['data']
+ return f(*args, **kwargs)
+ return decorated
+
+#验证QQ邮箱格式
+def validate_qq_email(email):
+ """验证QQ邮箱格式"""
+ return is_qq_email(email)
+
+#验证密码格式
+def validate_password(password):
+ """验证密码格式(6-20位)"""
+ return 6 <= len(password) <= 20
+
+
+#==========================对外暴露的HTTP接口==========================
+#发送验证码邮件
+@auth_bp.route('/send-verification', methods=['POST'])
+def send_verification():
+ """发送验证码邮件"""
+ try:
+ data = request.get_json()
+ email = data.get('email', '').strip()
+ verification_type = data.get('type', 'register') # register, login
+
+ # 参数验证
+ if not email:
+ return jsonify({
+ 'success': False,
+ 'message': '邮箱地址不能为空'
+ }), 400
+
+ if not validate_qq_email(email):
+ return jsonify({
+ 'success': False,
+ 'message': '仅支持QQ邮箱(qq.com、vip.qq.com、foxmail.com)'
+ }), 400
+
+ # 获取数据库集合
+ db = current_app.mongo.db
+ users_collection = db.userdata
+
+ # 检查邮箱是否已注册
+ existing_user = users_collection.find_one({'邮箱': email})
+
+ if verification_type == 'register' and existing_user:
+ return jsonify({
+ 'success': False,
+ 'message': '该邮箱已被注册'
+ }), 409
+
+ if verification_type == 'login' and not existing_user:
+ return jsonify({
+ 'success': False,
+ 'message': '该邮箱尚未注册'
+ }), 404
+
+ # 发送验证码
+ result = send_verification_email(email, verification_type)
+
+ if result['success']:
+ return jsonify(result), 200
+ else:
+ return jsonify(result), 500
+
+ except Exception as e:
+ current_app.logger.error(f"发送验证码失败: {str(e)}")
+ return jsonify({
+ 'success': False,
+ 'message': '发送失败,请稍后重试'
+ }), 500
+
+#验证验证码
+@auth_bp.route('/verify-code', methods=['POST'])
+def verify_verification_code():
+ """验证验证码"""
+ try:
+ data = request.get_json()
+ email = data.get('email', '').strip()
+ code = data.get('code', '').strip()
+
+ # 参数验证
+ if not email or not code:
+ return jsonify({
+ 'success': False,
+ 'message': '邮箱和验证码不能为空'
+ }), 400
+
+ # 验证码校验
+ result = verify_code(email, code)
+
+ if result['success']:
+ return jsonify(result), 200
+ else:
+ return jsonify(result), 400
+
+ except Exception as e:
+ current_app.logger.error(f"验证码校验失败: {str(e)}")
+ return jsonify({
+ 'success': False,
+ 'message': '验证失败,请稍后重试'
+ }), 500
+
+#用户注册
+@auth_bp.route('/register', methods=['POST'])
+def register():
+ """用户注册(需要先验证邮箱)"""
+ try:
+ data = request.get_json()
+ email = data.get('email', '').strip()
+ username = data.get('username', '').strip()
+ password = data.get('password', '').strip()
+ code = data.get('code', '').strip()
+
+ # 参数验证
+ if not all([email, username, password, code]):
+ return jsonify({
+ 'success': False,
+ 'message': '所有字段都不能为空'
+ }), 400
+
+ if not validate_qq_email(email):
+ return jsonify({
+ 'success': False,
+ 'message': '仅支持QQ邮箱注册'
+ }), 400
+
+ if not validate_password(password):
+ return jsonify({
+ 'success': False,
+ 'message': '密码长度必须在6-20位之间'
+ }), 400
+
+ # 验证验证码
+ verify_result = verify_code(email, code)
+ if not verify_result['success'] or verify_result.get('type') != 'register':
+ return jsonify({
+ 'success': False,
+ 'message': '验证码无效或已过期'
+ }), 400
+
+ # 获取数据库集合
+ db = current_app.mongo.db
+ users_collection = db.userdata
+
+ # 检查邮箱是否已被注册
+ if users_collection.find_one({'邮箱': email}):
+ return jsonify({
+ 'success': False,
+ 'message': '该邮箱已被注册'
+ }), 409
+
+ # 检查用户名是否已被使用
+ if users_collection.find_one({'用户名': username}):
+ return jsonify({
+ 'success': False,
+ 'message': '该用户名已被使用'
+ }), 409
+
+ # 获取QQ头像
+ avatar_url = get_qq_avatar_url(email)
+
+ # 创建新用户
+ password_hash = generate_password_hash(password)
+ user_data = {
+ '邮箱': email,
+ '用户名': username,
+ '密码': password_hash,
+ '头像': avatar_url,
+ '注册时间': datetime.now().isoformat(),
+ '最后登录': None,
+ '登录次数': 0,
+ '用户状态': 'active',
+ '等级': 0,
+ '经验': 0,
+ '萌芽币': 0,
+ '签到系统': {
+ '连续签到天数': 0,
+ '今日是否已签到': False,
+ '签到时间': '2025-01-01'
+ }
+ }
+
+ result = users_collection.insert_one(user_data)
+
+ if result.inserted_id:
+ return jsonify({
+ 'success': True,
+ 'message': '注册成功!',
+ 'user': {
+ 'email': email,
+ 'username': username,
+ 'avatar': avatar_url
+ }
+ }), 201
+ else:
+ return jsonify({
+ 'success': False,
+ 'message': '注册失败,请稍后重试'
+ }), 500
+
+ except Exception as e:
+ current_app.logger.error(f"注册失败: {str(e)}")
+ return jsonify({
+ 'success': False,
+ 'message': '注册失败,请稍后重试'
+ }), 500
+
+#用户登录
+@auth_bp.route('/login', methods=['POST'])
+def login():
+ """用户登录(支持邮箱+验证码或邮箱+密码)"""
+ try:
+ data = request.get_json()
+ email = data.get('email', '').strip()
+ password = data.get('password', '').strip()
+ code = data.get('code', '').strip()
+
+ # 参数验证
+ if not email:
+ return jsonify({
+ 'success': False,
+ 'message': '邮箱地址不能为空'
+ }), 400
+
+ if not validate_qq_email(email):
+ return jsonify({
+ 'success': False,
+ 'message': '仅支持QQ邮箱登录'
+ }), 400
+
+ # 获取数据库集合
+ db = current_app.mongo.db
+ users_collection = db.userdata
+
+ # 查找用户
+ user = users_collection.find_one({'邮箱': email})
+
+ if not user:
+ return jsonify({
+ 'success': False,
+ 'message': '该邮箱尚未注册'
+ }), 404
+
+ # 检查用户状态
+ if user.get('用户状态') != 'active':
+ return jsonify({
+ 'success': False,
+ 'message': '账号已被禁用,请联系管理员'
+ }), 403
+
+ # 验证方式:验证码登录或密码登录
+ if code:
+ # 验证码登录
+ verify_result = verify_code(email, code)
+ if not verify_result['success'] or verify_result.get('type') != 'login':
+ return jsonify({
+ 'success': False,
+ 'message': '验证码无效或已过期'
+ }), 400
+ elif password:
+ # 密码登录
+ if not check_password_hash(user['密码'], password):
+ return jsonify({
+ 'success': False,
+ 'message': '密码错误'
+ }), 401
+ else:
+ return jsonify({
+ 'success': False,
+ 'message': '请输入密码或验证码'
+ }), 400
+
+ # 登录成功,更新用户信息
+ users_collection.update_one(
+ {'邮箱': email},
+ {
+ '$set': {'最后登录': datetime.now().isoformat()},
+ '$inc': {'登录次数': 1}
+ }
+ )
+
+ # 生成JWT token
+ user_data = {
+ 'user_id': str(user['_id']),
+ 'email': email,
+ 'username': user.get('用户名', '')
+ }
+ token = generate_token(user_data)
+
+ return jsonify({
+ 'success': True,
+ 'message': '登录成功!',
+ 'token': token,
+ 'user': {
+ 'id': str(user['_id']),
+ 'email': email,
+ 'username': user.get('用户名', ''),
+ 'avatar': user.get('头像', ''),
+ 'login_count': user.get('登录次数', 0) + 1
+ }
+ }), 200
+
+ except Exception as e:
+ current_app.logger.error(f"登录失败: {str(e)}")
+ return jsonify({
+ 'success': False,
+ 'message': '登录失败,请稍后重试'
+ }), 500
+
+ # 登录成功,创建会话
+ hwt = getattr(request, 'hwt', {})
+ hwt['user_id'] = str(user['_id'])
+ hwt['account'] = user['账号']
+ hwt['logged_in'] = True
+
+ # 更新登录信息
+ users_collection.update_one(
+ {'_id': user['_id']},
+ {
+ '$set': {'最后登录': datetime.now().isoformat()},
+ '$inc': {'登录次数': 1}
+ }
+ )
+
+ return jsonify({
+ 'success': True,
+ 'message': '登录成功!',
+ 'user': {
+ 'account': user['账号'],
+ 'last_login': user.get('最后登录'),
+ 'login_count': user.get('登录次数', 0) + 1
+ }
+ }), 200
+
+ except Exception as e:
+ return jsonify({
+ 'success': False,
+ 'message': f'服务器错误: {str(e)}'
+ }), 500
+
+#用户登出
+@auth_bp.route('/logout', methods=['POST'])
+def logout():
+ """用户登出"""
+ try:
+ # JWT是无状态的,客户端删除token即可
+ return jsonify({
+ 'success': True,
+ 'message': '已成功登出'
+ }), 200
+
+ except Exception as e:
+ return jsonify({
+ 'success': False,
+ 'message': f'服务器错误: {str(e)}'
+ }), 500
+
+#检查登录状态
+@auth_bp.route('/check', methods=['GET'])
+def check_login():
+ """检查登录状态"""
+ try:
+ token = request.headers.get('Authorization')
+ if not token:
+ return jsonify({
+ 'success': True,
+ 'logged_in': False
+ }), 200
+
+ if token.startswith('Bearer '):
+ token = token[7:]
+
+ result = verify_token(token)
+ if result['success']:
+ user_data = result['data']
+ return jsonify({
+ 'success': True,
+ 'logged_in': True,
+ 'user': {
+ 'id': user_data['user_id'],
+ 'email': user_data['email'],
+ 'username': user_data['username']
+ }
+ }), 200
+ else:
+ return jsonify({
+ 'success': True,
+ 'logged_in': False
+ }), 200
+
+ except Exception as e:
+ return jsonify({
+ 'success': False,
+ 'message': f'服务器错误: {str(e)}'
+ }), 500
#==========================对外暴露的HTTP接口==========================
\ No newline at end of file
diff --git a/InfoGenie-backend/modules/email_service.py b/InfoGenie-backend/modules/email_service.py
index 98e9612f..56244858 100755
--- a/InfoGenie-backend/modules/email_service.py
+++ b/InfoGenie-backend/modules/email_service.py
@@ -1,283 +1,283 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-"""
-邮件发送模块
-负责处理用户注册、登录验证邮件
-"""
-
-import random
-import string
-import smtplib
-from datetime import datetime, timedelta
-from email.mime.text import MIMEText
-from email.header import Header
-from flask import current_app
-import logging
-import os
-
-# 验证码存储(生产环境建议使用Redis)
-verification_codes = {}
-
-# 初始化日志
-def init_mail(app):
- """初始化邮件配置"""
- # 使用smtplib直接发送,不需要Flask-Mail
- pass
-
-# 生成验证码
-def generate_verification_code(length=6):
- """生成验证码"""
- return ''.join(random.choices(string.digits, k=length))
-
-# 发送验证邮件
-def send_verification_email(email, verification_type='register'):
- """
- 发送验证邮件
-
- Args:
- email: 收件人邮箱
- verification_type: 验证类型 ('register', 'login', 'reset_password')
-
- Returns:
- dict: 发送结果
- """
- try:
- # 验证QQ邮箱格式
- if not is_qq_email(email):
- return {
- 'success': False,
- 'message': '仅支持QQ邮箱注册登录'
- }
-
- # 生成验证码
- code = generate_verification_code()
-
- # 存储验证码(5分钟有效期)
- verification_codes[email] = {
- 'code': code,
- 'type': verification_type,
- 'expires_at': datetime.now() + timedelta(minutes=5),
- 'attempts': 0
- }
-
- # 获取邮件配置 - 使用与QQEmailSendAPI相同的配置
- sender_email = os.environ.get('MAIL_USERNAME', '3205788256@qq.com')
- sender_password = os.environ.get('MAIL_PASSWORD', 'szcaxvbftusqddhi')
-
- # 邮件模板
- if verification_type == 'register':
- subject = '【万象口袋】注册验证码'
- html_content = f'''
-
-
-
-
-
-
-
验证码
-
- {code}
-
-
请在5分钟内输入此验证码完成注册
-
-
-
-
- 如果您没有申请注册,请忽略此邮件
- 此验证码5分钟内有效,请勿泄露给他人
-
-
-
-
-
- '''
- else: # login
- subject = '【InfoGenie】登录验证码'
- html_content = f'''
-
-
-
-
-
InfoGenie 万象口袋
-
安全登录验证
-
-
-
-
登录验证码
-
- {code}
-
-
请在5分钟内输入此验证码完成登录
-
-
-
-
- 如果不是您本人操作,请检查账户安全
- 此验证码5分钟内有效,请勿泄露给他人
-
-
-
-
-
- '''
-
- # 创建邮件 - 使用与QQEmailSendAPI相同的方式
- message = MIMEText(html_content, 'html', 'utf-8')
- message['From'] = sender_email # 直接使用邮箱地址,不使用Header包装
- message['To'] = email
- message['Subject'] = Header(subject, 'utf-8')
-
- # 发送邮件 - 使用SSL端口465
- try:
- # 使用与QQEmailSendAPI相同的连接方式
- smtp_obj = smtplib.SMTP_SSL('smtp.qq.com', 465)
- smtp_obj.login(sender_email, sender_password)
- smtp_obj.sendmail(sender_email, [email], message.as_string())
- smtp_obj.quit()
-
- print(f"验证码邮件发送成功: {email}")
- return {
- 'success': True,
- 'message': '验证码已发送到您的邮箱',
- 'email': email
- }
-
- except smtplib.SMTPAuthenticationError as auth_error:
- print(f"SMTP认证失败: {str(auth_error)}")
- return {
- 'success': False,
- 'message': 'SMTP认证失败,请检查邮箱配置'
- }
- except smtplib.SMTPConnectError as conn_error:
- print(f"SMTP连接失败: {str(conn_error)}")
- return {
- 'success': False,
- 'message': 'SMTP服务器连接失败'
- }
- except Exception as smtp_error:
- print(f"SMTP发送失败: {str(smtp_error)}")
- return {
- 'success': False,
- 'message': f'邮件发送失败: {str(smtp_error)}'
- }
-
- except Exception as e:
- print(f"邮件发送失败: {str(e)}")
- return {
- 'success': False,
- 'message': '邮件发送失败,请稍后重试'
- }
-
-# 验证验证码
-def verify_code(email, code):
- """
- 验证验证码
-
- Args:
- email: 邮箱地址
- code: 验证码
-
- Returns:
- dict: 验证结果
- """
- if email not in verification_codes:
- return {
- 'success': False,
- 'message': '验证码不存在或已过期'
- }
-
- stored_info = verification_codes[email]
-
- # 检查过期时间
- if datetime.now() > stored_info['expires_at']:
- del verification_codes[email]
- return {
- 'success': False,
- 'message': '验证码已过期,请重新获取'
- }
-
- # 检查尝试次数
- if stored_info['attempts'] >= 3:
- del verification_codes[email]
- return {
- 'success': False,
- 'message': '验证码输入错误次数过多,请重新获取'
- }
-
- # 验证码校验
- if stored_info['code'] != code:
- stored_info['attempts'] += 1
- return {
- 'success': False,
- 'message': f'验证码错误,还可尝试{3 - stored_info["attempts"]}次'
- }
-
- # 验证成功,删除验证码
- verification_type = stored_info['type']
- del verification_codes[email]
-
- return {
- 'success': True,
- 'message': '验证码验证成功',
- 'type': verification_type
- }
-
-# 验证QQ邮箱格式
-def is_qq_email(email):
- """
- 验证是否为QQ邮箱
-
- Args:
- email: 邮箱地址
-
- Returns:
- bool: 是否为QQ邮箱
- """
- if not email or '@' not in email:
- return False
-
- domain = email.split('@')[1].lower()
- qq_domains = ['qq.com', 'vip.qq.com', 'foxmail.com']
-
- return domain in qq_domains
-
-# 获取QQ头像URL
-def get_qq_avatar_url(email):
- """
- 根据QQ邮箱获取QQ头像URL
-
- Args:
- email: QQ邮箱地址
-
- Returns:
- str: QQ头像URL
- """
- if not is_qq_email(email):
- return None
-
- # 提取QQ号码
- qq_number = email.split('@')[0]
-
- # 验证是否为纯数字(QQ号)
- if not qq_number.isdigit():
- return None
-
- # 返回QQ头像API URL
- return f"http://q1.qlogo.cn/g?b=qq&nk={qq_number}&s=100"
-
-# 清理过期验证码
-def cleanup_expired_codes():
- """清理过期的验证码"""
- current_time = datetime.now()
- expired_emails = [
- email for email, info in verification_codes.items()
- if current_time > info['expires_at']
- ]
-
- for email in expired_emails:
- del verification_codes[email]
-
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+邮件发送模块
+负责处理用户注册、登录验证邮件
+"""
+
+import random
+import string
+import smtplib
+from datetime import datetime, timedelta
+from email.mime.text import MIMEText
+from email.header import Header
+from flask import current_app
+import logging
+import os
+
+# 验证码存储(生产环境建议使用Redis)
+verification_codes = {}
+
+# 初始化日志
+def init_mail(app):
+ """初始化邮件配置"""
+ # 使用smtplib直接发送,不需要Flask-Mail
+ pass
+
+# 生成验证码
+def generate_verification_code(length=6):
+ """生成验证码"""
+ return ''.join(random.choices(string.digits, k=length))
+
+# 发送验证邮件
+def send_verification_email(email, verification_type='register'):
+ """
+ 发送验证邮件
+
+ Args:
+ email: 收件人邮箱
+ verification_type: 验证类型 ('register', 'login', 'reset_password')
+
+ Returns:
+ dict: 发送结果
+ """
+ try:
+ # 验证QQ邮箱格式
+ if not is_qq_email(email):
+ return {
+ 'success': False,
+ 'message': '仅支持QQ邮箱注册登录'
+ }
+
+ # 生成验证码
+ code = generate_verification_code()
+
+ # 存储验证码(5分钟有效期)
+ verification_codes[email] = {
+ 'code': code,
+ 'type': verification_type,
+ 'expires_at': datetime.now() + timedelta(minutes=5),
+ 'attempts': 0
+ }
+
+ # 获取邮件配置 - 使用与QQEmailSendAPI相同的配置
+ sender_email = os.environ.get('MAIL_USERNAME', '3205788256@qq.com')
+ sender_password = os.environ.get('MAIL_PASSWORD', 'szcaxvbftusqddhi')
+
+ # 邮件模板
+ if verification_type == 'register':
+ subject = '【万象口袋】注册验证码'
+ html_content = f'''
+
+
+
+
+
+
+
验证码
+
+ {code}
+
+
请在5分钟内输入此验证码完成注册
+
+
+
+
+ 如果您没有申请注册,请忽略此邮件
+ 此验证码5分钟内有效,请勿泄露给他人
+
+
+
+
+
+ '''
+ else: # login
+ subject = '【InfoGenie】登录验证码'
+ html_content = f'''
+
+
+
+
+
InfoGenie 万象口袋
+
安全登录验证
+
+
+
+
登录验证码
+
+ {code}
+
+
请在5分钟内输入此验证码完成登录
+
+
+
+
+ 如果不是您本人操作,请检查账户安全
+ 此验证码5分钟内有效,请勿泄露给他人
+
+
+
+
+
+ '''
+
+ # 创建邮件 - 使用与QQEmailSendAPI相同的方式
+ message = MIMEText(html_content, 'html', 'utf-8')
+ message['From'] = sender_email # 直接使用邮箱地址,不使用Header包装
+ message['To'] = email
+ message['Subject'] = Header(subject, 'utf-8')
+
+ # 发送邮件 - 使用SSL端口465
+ try:
+ # 使用与QQEmailSendAPI相同的连接方式
+ smtp_obj = smtplib.SMTP_SSL('smtp.qq.com', 465)
+ smtp_obj.login(sender_email, sender_password)
+ smtp_obj.sendmail(sender_email, [email], message.as_string())
+ smtp_obj.quit()
+
+ print(f"验证码邮件发送成功: {email}")
+ return {
+ 'success': True,
+ 'message': '验证码已发送到您的邮箱',
+ 'email': email
+ }
+
+ except smtplib.SMTPAuthenticationError as auth_error:
+ print(f"SMTP认证失败: {str(auth_error)}")
+ return {
+ 'success': False,
+ 'message': 'SMTP认证失败,请检查邮箱配置'
+ }
+ except smtplib.SMTPConnectError as conn_error:
+ print(f"SMTP连接失败: {str(conn_error)}")
+ return {
+ 'success': False,
+ 'message': 'SMTP服务器连接失败'
+ }
+ except Exception as smtp_error:
+ print(f"SMTP发送失败: {str(smtp_error)}")
+ return {
+ 'success': False,
+ 'message': f'邮件发送失败: {str(smtp_error)}'
+ }
+
+ except Exception as e:
+ print(f"邮件发送失败: {str(e)}")
+ return {
+ 'success': False,
+ 'message': '邮件发送失败,请稍后重试'
+ }
+
+# 验证验证码
+def verify_code(email, code):
+ """
+ 验证验证码
+
+ Args:
+ email: 邮箱地址
+ code: 验证码
+
+ Returns:
+ dict: 验证结果
+ """
+ if email not in verification_codes:
+ return {
+ 'success': False,
+ 'message': '验证码不存在或已过期'
+ }
+
+ stored_info = verification_codes[email]
+
+ # 检查过期时间
+ if datetime.now() > stored_info['expires_at']:
+ del verification_codes[email]
+ return {
+ 'success': False,
+ 'message': '验证码已过期,请重新获取'
+ }
+
+ # 检查尝试次数
+ if stored_info['attempts'] >= 3:
+ del verification_codes[email]
+ return {
+ 'success': False,
+ 'message': '验证码输入错误次数过多,请重新获取'
+ }
+
+ # 验证码校验
+ if stored_info['code'] != code:
+ stored_info['attempts'] += 1
+ return {
+ 'success': False,
+ 'message': f'验证码错误,还可尝试{3 - stored_info["attempts"]}次'
+ }
+
+ # 验证成功,删除验证码
+ verification_type = stored_info['type']
+ del verification_codes[email]
+
+ return {
+ 'success': True,
+ 'message': '验证码验证成功',
+ 'type': verification_type
+ }
+
+# 验证QQ邮箱格式
+def is_qq_email(email):
+ """
+ 验证是否为QQ邮箱
+
+ Args:
+ email: 邮箱地址
+
+ Returns:
+ bool: 是否为QQ邮箱
+ """
+ if not email or '@' not in email:
+ return False
+
+ domain = email.split('@')[1].lower()
+ qq_domains = ['qq.com', 'vip.qq.com', 'foxmail.com']
+
+ return domain in qq_domains
+
+# 获取QQ头像URL
+def get_qq_avatar_url(email):
+ """
+ 根据QQ邮箱获取QQ头像URL
+
+ Args:
+ email: QQ邮箱地址
+
+ Returns:
+ str: QQ头像URL
+ """
+ if not is_qq_email(email):
+ return None
+
+ # 提取QQ号码
+ qq_number = email.split('@')[0]
+
+ # 验证是否为纯数字(QQ号)
+ if not qq_number.isdigit():
+ return None
+
+ # 返回QQ头像API URL
+ return f"https://q1.qlogo.cn/g?b=qq&nk={qq_number}&s=100"
+
+# 清理过期验证码
+def cleanup_expired_codes():
+ """清理过期的验证码"""
+ current_time = datetime.now()
+ expired_emails = [
+ email for email, info in verification_codes.items()
+ if current_time > info['expires_at']
+ ]
+
+ for email in expired_emails:
+ del verification_codes[email]
+
return len(expired_emails)
\ No newline at end of file
diff --git a/InfoGenie-backend/modules/user_management.py b/InfoGenie-backend/modules/user_management.py
index db252c48..6bac4343 100755
--- a/InfoGenie-backend/modules/user_management.py
+++ b/InfoGenie-backend/modules/user_management.py
@@ -1,550 +1,550 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""
-用户管理模块
-Created by: 万象口袋
-Date: 2025-09-02
-"""
-
-from flask import Blueprint, request, jsonify, current_app
-from datetime import datetime
-from bson import ObjectId
-import jwt
-from functools import wraps
-
-user_bp = Blueprint('user', __name__)
-
-# 验证JWT token
-def verify_token(token):
- """验证JWT token"""
- try:
- payload = jwt.decode(token, current_app.config['SECRET_KEY'], algorithms=['HS256'])
- return {'success': True, 'data': payload}
- except jwt.ExpiredSignatureError:
- return {'success': False, 'message': 'Token已过期'}
- except jwt.InvalidTokenError:
- return {'success': False, 'message': 'Token无效'}
-
-# 登录验证装饰器(支持JWT token和hwt)
-def login_required(f):
- """登录验证装饰器(支持JWT token和hwt)"""
- @wraps(f)
- def decorated_function(*args, **kwargs):
- # 优先检查JWT token
- token = request.headers.get('Authorization')
- if token:
- if token.startswith('Bearer '):
- token = token[7:]
-
- result = verify_token(token)
- if result['success']:
- request.current_user = result['data']
- return f(*args, **kwargs)
- # 回退到hwt验证
- hwt = getattr(request, 'hwt', {})
- if not hwt.get('logged_in'):
- return jsonify({
- 'success': False,
- 'message': '请先登录'
- }), 401
- return f(*args, **kwargs)
- return decorated_function
- return decorated_function
-
-
-#==========================对外暴露的HTTP接口==========================
-# 获取用户资料
-@user_bp.route('/profile', methods=['GET'])
-@login_required
-def get_profile():
- """获取用户资料"""
- try:
- # 优先从JWT token获取用户信息
- user_id = None
- if hasattr(request, 'current_user') and request.current_user:
- user_id = request.current_user.get('user_id')
- else:
- # 回退到hwt验证
- hwt = getattr(request, 'hwt', {})
- user_id = hwt.get('user_id')
-
- if not user_id:
- return jsonify({
- 'success': False,
- 'message': '无法获取用户信息'
- }), 401
-
- users_collection = current_app.mongo.db.userdata
- user = users_collection.find_one({'_id': ObjectId(user_id)})
- if not user:
- return jsonify({
- 'success': False,
- 'message': '用户不存在'
- }), 404
- # 返回用户信息(不包含密码)
- profile = {
- 'account': user.get('邮箱'),
- 'username': user.get('用户名'),
- 'avatar': user.get('头像'),
- 'register_time': user.get('注册时间'),
- 'last_login': user.get('最后登录'),
- 'login_count': user.get('登录次数', 0),
- 'status': user.get('用户状态', 'active'),
- 'level': user.get('等级', 1),
- 'experience': user.get('经验', 0),
- 'coins': user.get('萌芽币', 0)
- }
- return jsonify({
- 'success': True,
- 'data': profile
- }), 200
- except Exception as e:
- return jsonify({
- 'success': False,
- 'message': f'服务器错误: {str(e)}'
- }), 500
-
-# 为指定账号增加萌芽币
-@user_bp.route('/add-coins', methods=['POST'])
-@login_required
-def add_coins():
- """为指定账号增加萌芽币(支持email或username指定账号,amount为正整数)"""
- try:
- data = request.get_json() or {}
- email = (data.get('email') or '').strip()
- username = (data.get('username') or '').strip()
- amount = data.get('amount')
-
- # 参数校验
- if not email and not username:
- return jsonify({
- 'success': False,
- 'message': '请提供email或username其中之一'
- }), 400
-
- if amount is None:
- return jsonify({
- 'success': False,
- 'message': 'amount不能为空'
- }), 400
-
- try:
- amount_int = int(amount)
- except Exception:
- return jsonify({
- 'success': False,
- 'message': 'amount必须为整数'
- }), 400
-
- if amount_int <= 0:
- return jsonify({
- 'success': False,
- 'message': 'amount必须为正整数'
- }), 400
-
- users_collection = current_app.mongo.db.userdata
- query = {'邮箱': email} if email else {'用户名': username}
- user = users_collection.find_one(query)
- if not user:
- return jsonify({
- 'success': False,
- 'message': '用户不存在'
- }), 404
-
- before_coins = user.get('萌芽币', 0)
- update_result = users_collection.update_one(query, {'$inc': {'萌芽币': amount_int}})
-
- if update_result.modified_count == 0:
- return jsonify({
- 'success': False,
- 'message': '更新失败,请稍后重试'
- }), 500
-
- updated = users_collection.find_one({'_id': user['_id']})
- new_coins = updated.get('萌芽币', before_coins)
-
- return jsonify({
- 'success': True,
- 'message': f"已为账户{email or username}增加{amount_int}萌芽币",
- 'data': {
- 'before_coins': before_coins,
- 'added': amount_int,
- 'new_coins': new_coins,
- 'user': {
- 'id': str(updated.get('_id')),
- 'email': updated.get('邮箱'),
- 'username': updated.get('用户名'),
- 'avatar': updated.get('头像'),
- 'register_time': updated.get('注册时间'),
- 'last_login': updated.get('最后登录'),
- 'login_count': updated.get('登录次数', 0),
- 'status': updated.get('用户状态', 'active'),
- 'level': updated.get('等级', 0),
- 'experience': updated.get('经验', 0),
- 'coins': new_coins
- }
- }
- }), 200
- except Exception as e:
- return jsonify({
- 'success': False,
- 'message': f'服务器错误: {str(e)}'
- }), 500
-
-# 列出所有用户
-@user_bp.route('/list', methods=['GET'])
-@login_required
-def list_users():
- """列出所有用户(不返回密码)"""
- try:
- users_collection = current_app.mongo.db.userdata
- cursor = users_collection.find({}, {'密码': 0})
- users = []
- for u in cursor:
- users.append({
- 'id': str(u.get('_id')),
- 'email': u.get('邮箱'),
- 'username': u.get('用户名'),
- 'avatar': u.get('头像'),
- 'register_time': u.get('注册时间'),
- 'last_login': u.get('最后登录'),
- 'login_count': u.get('登录次数', 0),
- 'status': u.get('用户状态', 'active'),
- 'level': u.get('等级', 0),
- 'experience': u.get('经验', 0),
- 'coins': u.get('萌芽币', 0)
- })
- return jsonify({
- 'success': True,
- 'count': len(users),
- 'data': users
- }), 200
- except Exception as e:
- return jsonify({
- 'success': False,
- 'message': f'服务器错误: {str(e)}'
- }), 500
-
-# 修改密码
-@user_bp.route('/change-password', methods=['POST'])
-@login_required
-def change_password():
- """修改密码"""
- try:
- data = request.get_json()
- old_password = data.get('old_password', '').strip()
- new_password = data.get('new_password', '').strip()
-
- if not old_password or not new_password:
- return jsonify({
- 'success': False,
- 'message': '旧密码和新密码不能为空'
- }), 400
-
- if len(new_password) < 6 or len(new_password) > 20:
- return jsonify({
- 'success': False,
- 'message': '新密码长度必须在6-20位之间'
- }), 400
-
- hwt = getattr(request, 'hwt', {})
- user_id = hwt.get('user_id')
- users_collection = current_app.mongo.db.userdata
- user = users_collection.find_one({'_id': ObjectId(user_id)})
- if not user:
- return jsonify({
- 'success': False,
- 'message': '用户不存在'
- }), 404
- from werkzeug.security import check_password_hash, generate_password_hash
- # 验证旧密码
- if not check_password_hash(user['密码'], old_password):
- return jsonify({
- 'success': False,
- 'message': '原密码错误'
- }), 401
- # 更新密码
- new_password_hash = generate_password_hash(new_password)
- result = users_collection.update_one(
- {'_id': ObjectId(user_id)},
- {'$set': {'密码': new_password_hash}}
- )
- if result.modified_count > 0:
- return jsonify({
- 'success': True,
- 'message': '密码修改成功'
- }), 200
- else:
- return jsonify({
- 'success': False,
- 'message': '密码修改失败'
- }), 500
- except Exception as e:
- return jsonify({
- 'success': False,
- 'message': f'服务器错误: {str(e)}'
- }), 500
-
-# 获取用户统计信息
-@user_bp.route('/stats', methods=['GET'])
-@login_required
-def get_user_stats():
- """获取用户统计信息"""
- try:
- hwt = getattr(request, 'hwt', {})
- user_id = hwt.get('user_id')
- # 这里可以添加更多统计信息,比如API调用次数等
- stats = {
- 'login_today': 1, # 今日登录次数
- 'api_calls_today': 0, # 今日API调用次数
- 'total_api_calls': 0, # 总API调用次数
- 'join_days': 1, # 加入天数
- 'last_activity': datetime.now().isoformat()
- }
- return jsonify({
- 'success': True,
- 'data': stats
- }), 200
- except Exception as e:
- return jsonify({
- 'success': False,
- 'message': f'服务器错误: {str(e)}'
- }), 500
-
-# 获取用户游戏数据
-@user_bp.route('/game-data', methods=['GET'])
-@login_required
-def get_user_game_data():
- """获取用户游戏数据"""
- try:
- # 优先从JWT token获取用户ID
- if hasattr(request, 'current_user'):
- user_id = request.current_user['user_id']
- else:
- hwt = getattr(request, 'hwt', {})
- user_id = hwt.get('user_id')
-
- users_collection = current_app.mongo.db.userdata
-
- user = users_collection.find_one({'_id': ObjectId(user_id)})
-
- if not user:
- return jsonify({
- 'success': False,
- 'message': '用户不存在'
- }), 404
-
- # 返回用户游戏数据
- game_data = {
- 'level': user.get('等级', 0),
- 'experience': user.get('经验', 0),
- 'coins': user.get('萌芽币', 0),
- 'checkin_system': user.get('签到系统', {
- '连续签到天数': 0,
- '今日是否已签到': False,
- '签到时间': '2025-01-01'
- })
- }
-
- return jsonify({
- 'success': True,
- 'data': game_data
- }), 200
-
- except Exception as e:
- return jsonify({
- 'success': False,
- 'message': f'服务器错误: {str(e)}'
- }), 500
-
-# 每日签到
-@user_bp.route('/checkin', methods=['POST'])
-@login_required
-def daily_checkin():
- """每日签到"""
- try:
- # 优先从JWT token获取用户ID
- if hasattr(request, 'current_user'):
- user_id = request.current_user['user_id']
- else:
- hwt = getattr(request, 'hwt', {})
- user_id = hwt.get('user_id')
-
- users_collection = current_app.mongo.db.userdata
-
- user = users_collection.find_one({'_id': ObjectId(user_id)})
-
- if not user:
- return jsonify({
- 'success': False,
- 'message': '用户不存在'
- }), 404
-
- # 获取当前日期
- today = datetime.now().strftime('%Y-%m-%d')
-
- # 获取签到系统数据
- checkin_system = user.get('签到系统', {
- '连续签到天数': 0,
- '今日是否已签到': False,
- '签到时间': '2025-01-01'
- })
-
- # 检查今日是否已签到
- if checkin_system.get('今日是否已签到', False) and checkin_system.get('签到时间') == today:
- return jsonify({
- 'success': False,
- 'message': '今日已签到,请明天再来!'
- }), 400
-
- # 计算连续签到天数
- last_checkin_date = checkin_system.get('签到时间', '2025-01-01')
- consecutive_days = checkin_system.get('连续签到天数', 0)
-
- # 检查是否连续签到
- if last_checkin_date:
- try:
- last_date = datetime.strptime(last_checkin_date, '%Y-%m-%d')
- today_date = datetime.strptime(today, '%Y-%m-%d')
- days_diff = (today_date - last_date).days
-
- if days_diff == 1:
- # 连续签到
- consecutive_days += 1
- elif days_diff > 1:
- # 断签,重新开始
- consecutive_days = 1
- else:
- # 同一天,不应该发生
- consecutive_days = consecutive_days
- except:
- consecutive_days = 1
- else:
- consecutive_days = 1
-
- # 签到奖励
- coin_reward = 300
- exp_reward = 200
-
- # 获取当前用户数据
- current_coins = user.get('萌芽币', 0)
- current_exp = user.get('经验', 0)
- current_level = user.get('等级', 0)
-
- # 计算新的经验和等级
- new_exp = current_exp + exp_reward
- new_level = current_level
-
- # 等级升级逻辑:100 × 1.2^(等级)
- while True:
- exp_needed = int(100 * (1.2 ** new_level))
- if new_exp >= exp_needed:
- new_exp -= exp_needed
- new_level += 1
- else:
- break
-
- # 更新用户数据
- update_data = {
- '萌芽币': current_coins + coin_reward,
- '经验': new_exp,
- '等级': new_level,
- '签到系统': {
- '连续签到天数': consecutive_days,
- '今日是否已签到': True,
- '签到时间': today
- }
- }
-
- result = users_collection.update_one(
- {'_id': ObjectId(user_id)},
- {'$set': update_data}
- )
-
- if result.modified_count > 0:
- level_up = new_level > current_level
- return jsonify({
- 'success': True,
- 'message': '签到成功!',
- 'data': {
- 'coin_reward': coin_reward,
- 'exp_reward': exp_reward,
- 'consecutive_days': consecutive_days,
- 'level_up': level_up,
- 'new_level': new_level,
- 'new_coins': current_coins + coin_reward,
- 'new_exp': new_exp
- }
- }), 200
- else:
- return jsonify({
- 'success': False,
- 'message': '签到失败,请稍后重试'
- }), 500
-
- except Exception as e:
- return jsonify({
- 'success': False,
- 'message': f'服务器错误: {str(e)}'
- }), 500
-
-# 删除账户
-@user_bp.route('/delete', methods=['POST'])
-@login_required
-def delete_account():
- """删除账户"""
- try:
- data = request.get_json()
- password = data.get('password', '').strip()
-
- if not password:
- return jsonify({
- 'success': False,
- 'message': '请输入密码确认删除'
- }), 400
-
- hwt = getattr(request, 'hwt', {})
- user_id = hwt.get('user_id')
- users_collection = current_app.mongo.db.userdata
-
- user = users_collection.find_one({'_id': ObjectId(user_id)})
-
- if not user:
- return jsonify({
- 'success': False,
- 'message': '用户不存在'
- }), 404
-
- from werkzeug.security import check_password_hash
-
- # 验证密码
- if not check_password_hash(user['密码'], password):
- return jsonify({
- 'success': False,
- 'message': '密码错误'
- }), 401
-
- # 删除用户
- result = users_collection.delete_one({'_id': ObjectId(user_id)})
-
- if result.deleted_count > 0:
- # 清除会话
- hwt = getattr(request, 'hwt', {})
- hwt.clear()
-
- return jsonify({
- 'success': True,
- 'message': '账户已成功删除'
- }), 200
- else:
- return jsonify({
- 'success': False,
- 'message': '删除失败'
- }), 500
-
- except Exception as e:
- return jsonify({
- 'success': False,
- 'message': f'服务器错误: {str(e)}'
- }), 500
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+用户管理模块
+Created by: 万象口袋
+Date: 2025-09-02
+"""
+
+from flask import Blueprint, request, jsonify, current_app
+from datetime import datetime
+from bson import ObjectId
+import jwt
+from functools import wraps
+
+user_bp = Blueprint('user', __name__)
+
+# 验证JWT token
+def verify_token(token):
+ """验证JWT token"""
+ try:
+ payload = jwt.decode(token, current_app.config['SECRET_KEY'], algorithms=['HS256'])
+ return {'success': True, 'data': payload}
+ except jwt.ExpiredSignatureError:
+ return {'success': False, 'message': 'Token已过期'}
+ except jwt.InvalidTokenError:
+ return {'success': False, 'message': 'Token无效'}
+
+# 登录验证装饰器(支持JWT token和hwt)
+def login_required(f):
+ """登录验证装饰器(支持JWT token和hwt)"""
+ @wraps(f)
+ def decorated_function(*args, **kwargs):
+ # 优先检查JWT token
+ token = request.headers.get('Authorization')
+ if token:
+ if token.startswith('Bearer '):
+ token = token[7:]
+
+ result = verify_token(token)
+ if result['success']:
+ request.current_user = result['data']
+ return f(*args, **kwargs)
+ # 回退到hwt验证
+ hwt = getattr(request, 'hwt', {})
+ if not hwt.get('logged_in'):
+ return jsonify({
+ 'success': False,
+ 'message': '请先登录'
+ }), 401
+ return f(*args, **kwargs)
+ return decorated_function
+ return decorated_function
+
+
+#==========================对外暴露的HTTP接口==========================
+# 获取用户资料
+@user_bp.route('/profile', methods=['GET'])
+@login_required
+def get_profile():
+ """获取用户资料"""
+ try:
+ # 优先从JWT token获取用户信息
+ user_id = None
+ if hasattr(request, 'current_user') and request.current_user:
+ user_id = request.current_user.get('user_id')
+ else:
+ # 回退到hwt验证
+ hwt = getattr(request, 'hwt', {})
+ user_id = hwt.get('user_id')
+
+ if not user_id:
+ return jsonify({
+ 'success': False,
+ 'message': '无法获取用户信息'
+ }), 401
+
+ users_collection = current_app.mongo.db.userdata
+ user = users_collection.find_one({'_id': ObjectId(user_id)})
+ if not user:
+ return jsonify({
+ 'success': False,
+ 'message': '用户不存在'
+ }), 404
+ # 返回用户信息(不包含密码)
+ profile = {
+ 'account': user.get('邮箱'),
+ 'username': user.get('用户名'),
+ 'avatar': user.get('头像'),
+ 'register_time': user.get('注册时间'),
+ 'last_login': user.get('最后登录'),
+ 'login_count': user.get('登录次数', 0),
+ 'status': user.get('用户状态', 'active'),
+ 'level': user.get('等级', 1),
+ 'experience': user.get('经验', 0),
+ 'coins': user.get('萌芽币', 0)
+ }
+ return jsonify({
+ 'success': True,
+ 'data': profile
+ }), 200
+ except Exception as e:
+ return jsonify({
+ 'success': False,
+ 'message': f'服务器错误: {str(e)}'
+ }), 500
+
+# 为指定账号增加萌芽币
+@user_bp.route('/add-coins', methods=['POST'])
+@login_required
+def add_coins():
+ """为指定账号增加萌芽币(支持email或username指定账号,amount为正整数)"""
+ try:
+ data = request.get_json() or {}
+ email = (data.get('email') or '').strip()
+ username = (data.get('username') or '').strip()
+ amount = data.get('amount')
+
+ # 参数校验
+ if not email and not username:
+ return jsonify({
+ 'success': False,
+ 'message': '请提供email或username其中之一'
+ }), 400
+
+ if amount is None:
+ return jsonify({
+ 'success': False,
+ 'message': 'amount不能为空'
+ }), 400
+
+ try:
+ amount_int = int(amount)
+ except Exception:
+ return jsonify({
+ 'success': False,
+ 'message': 'amount必须为整数'
+ }), 400
+
+ if amount_int <= 0:
+ return jsonify({
+ 'success': False,
+ 'message': 'amount必须为正整数'
+ }), 400
+
+ users_collection = current_app.mongo.db.userdata
+ query = {'邮箱': email} if email else {'用户名': username}
+ user = users_collection.find_one(query)
+ if not user:
+ return jsonify({
+ 'success': False,
+ 'message': '用户不存在'
+ }), 404
+
+ before_coins = user.get('萌芽币', 0)
+ update_result = users_collection.update_one(query, {'$inc': {'萌芽币': amount_int}})
+
+ if update_result.modified_count == 0:
+ return jsonify({
+ 'success': False,
+ 'message': '更新失败,请稍后重试'
+ }), 500
+
+ updated = users_collection.find_one({'_id': user['_id']})
+ new_coins = updated.get('萌芽币', before_coins)
+
+ return jsonify({
+ 'success': True,
+ 'message': f"已为账户{email or username}增加{amount_int}萌芽币",
+ 'data': {
+ 'before_coins': before_coins,
+ 'added': amount_int,
+ 'new_coins': new_coins,
+ 'user': {
+ 'id': str(updated.get('_id')),
+ 'email': updated.get('邮箱'),
+ 'username': updated.get('用户名'),
+ 'avatar': updated.get('头像'),
+ 'register_time': updated.get('注册时间'),
+ 'last_login': updated.get('最后登录'),
+ 'login_count': updated.get('登录次数', 0),
+ 'status': updated.get('用户状态', 'active'),
+ 'level': updated.get('等级', 0),
+ 'experience': updated.get('经验', 0),
+ 'coins': new_coins
+ }
+ }
+ }), 200
+ except Exception as e:
+ return jsonify({
+ 'success': False,
+ 'message': f'服务器错误: {str(e)}'
+ }), 500
+
+# 列出所有用户
+@user_bp.route('/list', methods=['GET'])
+@login_required
+def list_users():
+ """列出所有用户(不返回密码)"""
+ try:
+ users_collection = current_app.mongo.db.userdata
+ cursor = users_collection.find({}, {'密码': 0})
+ users = []
+ for u in cursor:
+ users.append({
+ 'id': str(u.get('_id')),
+ 'email': u.get('邮箱'),
+ 'username': u.get('用户名'),
+ 'avatar': u.get('头像'),
+ 'register_time': u.get('注册时间'),
+ 'last_login': u.get('最后登录'),
+ 'login_count': u.get('登录次数', 0),
+ 'status': u.get('用户状态', 'active'),
+ 'level': u.get('等级', 0),
+ 'experience': u.get('经验', 0),
+ 'coins': u.get('萌芽币', 0)
+ })
+ return jsonify({
+ 'success': True,
+ 'count': len(users),
+ 'data': users
+ }), 200
+ except Exception as e:
+ return jsonify({
+ 'success': False,
+ 'message': f'服务器错误: {str(e)}'
+ }), 500
+
+# 修改密码
+@user_bp.route('/change-password', methods=['POST'])
+@login_required
+def change_password():
+ """修改密码"""
+ try:
+ data = request.get_json()
+ old_password = data.get('old_password', '').strip()
+ new_password = data.get('new_password', '').strip()
+
+ if not old_password or not new_password:
+ return jsonify({
+ 'success': False,
+ 'message': '旧密码和新密码不能为空'
+ }), 400
+
+ if len(new_password) < 6 or len(new_password) > 20:
+ return jsonify({
+ 'success': False,
+ 'message': '新密码长度必须在6-20位之间'
+ }), 400
+
+ hwt = getattr(request, 'hwt', {})
+ user_id = hwt.get('user_id')
+ users_collection = current_app.mongo.db.userdata
+ user = users_collection.find_one({'_id': ObjectId(user_id)})
+ if not user:
+ return jsonify({
+ 'success': False,
+ 'message': '用户不存在'
+ }), 404
+ from werkzeug.security import check_password_hash, generate_password_hash
+ # 验证旧密码
+ if not check_password_hash(user['密码'], old_password):
+ return jsonify({
+ 'success': False,
+ 'message': '原密码错误'
+ }), 401
+ # 更新密码
+ new_password_hash = generate_password_hash(new_password)
+ result = users_collection.update_one(
+ {'_id': ObjectId(user_id)},
+ {'$set': {'密码': new_password_hash}}
+ )
+ if result.modified_count > 0:
+ return jsonify({
+ 'success': True,
+ 'message': '密码修改成功'
+ }), 200
+ else:
+ return jsonify({
+ 'success': False,
+ 'message': '密码修改失败'
+ }), 500
+ except Exception as e:
+ return jsonify({
+ 'success': False,
+ 'message': f'服务器错误: {str(e)}'
+ }), 500
+
+# 获取用户统计信息
+@user_bp.route('/stats', methods=['GET'])
+@login_required
+def get_user_stats():
+ """获取用户统计信息"""
+ try:
+ hwt = getattr(request, 'hwt', {})
+ user_id = hwt.get('user_id')
+ # 这里可以添加更多统计信息,比如API调用次数等
+ stats = {
+ 'login_today': 1, # 今日登录次数
+ 'api_calls_today': 0, # 今日API调用次数
+ 'total_api_calls': 0, # 总API调用次数
+ 'join_days': 1, # 加入天数
+ 'last_activity': datetime.now().isoformat()
+ }
+ return jsonify({
+ 'success': True,
+ 'data': stats
+ }), 200
+ except Exception as e:
+ return jsonify({
+ 'success': False,
+ 'message': f'服务器错误: {str(e)}'
+ }), 500
+
+# 获取用户游戏数据
+@user_bp.route('/game-data', methods=['GET'])
+@login_required
+def get_user_game_data():
+ """获取用户游戏数据"""
+ try:
+ # 优先从JWT token获取用户ID
+ if hasattr(request, 'current_user'):
+ user_id = request.current_user['user_id']
+ else:
+ hwt = getattr(request, 'hwt', {})
+ user_id = hwt.get('user_id')
+
+ users_collection = current_app.mongo.db.userdata
+
+ user = users_collection.find_one({'_id': ObjectId(user_id)})
+
+ if not user:
+ return jsonify({
+ 'success': False,
+ 'message': '用户不存在'
+ }), 404
+
+ # 返回用户游戏数据
+ game_data = {
+ 'level': user.get('等级', 0),
+ 'experience': user.get('经验', 0),
+ 'coins': user.get('萌芽币', 0),
+ 'checkin_system': user.get('签到系统', {
+ '连续签到天数': 0,
+ '今日是否已签到': False,
+ '签到时间': '2025-01-01'
+ })
+ }
+
+ return jsonify({
+ 'success': True,
+ 'data': game_data
+ }), 200
+
+ except Exception as e:
+ return jsonify({
+ 'success': False,
+ 'message': f'服务器错误: {str(e)}'
+ }), 500
+
+# 每日签到
+@user_bp.route('/checkin', methods=['POST'])
+@login_required
+def daily_checkin():
+ """每日签到"""
+ try:
+ # 优先从JWT token获取用户ID
+ if hasattr(request, 'current_user'):
+ user_id = request.current_user['user_id']
+ else:
+ hwt = getattr(request, 'hwt', {})
+ user_id = hwt.get('user_id')
+
+ users_collection = current_app.mongo.db.userdata
+
+ user = users_collection.find_one({'_id': ObjectId(user_id)})
+
+ if not user:
+ return jsonify({
+ 'success': False,
+ 'message': '用户不存在'
+ }), 404
+
+ # 获取当前日期
+ today = datetime.now().strftime('%Y-%m-%d')
+
+ # 获取签到系统数据
+ checkin_system = user.get('签到系统', {
+ '连续签到天数': 0,
+ '今日是否已签到': False,
+ '签到时间': '2025-01-01'
+ })
+
+ # 检查今日是否已签到
+ if checkin_system.get('今日是否已签到', False) and checkin_system.get('签到时间') == today:
+ return jsonify({
+ 'success': False,
+ 'message': '今日已签到,请明天再来!'
+ }), 400
+
+ # 计算连续签到天数
+ last_checkin_date = checkin_system.get('签到时间', '2025-01-01')
+ consecutive_days = checkin_system.get('连续签到天数', 0)
+
+ # 检查是否连续签到
+ if last_checkin_date:
+ try:
+ last_date = datetime.strptime(last_checkin_date, '%Y-%m-%d')
+ today_date = datetime.strptime(today, '%Y-%m-%d')
+ days_diff = (today_date - last_date).days
+
+ if days_diff == 1:
+ # 连续签到
+ consecutive_days += 1
+ elif days_diff > 1:
+ # 断签,重新开始
+ consecutive_days = 1
+ else:
+ # 同一天,不应该发生
+ consecutive_days = consecutive_days
+ except:
+ consecutive_days = 1
+ else:
+ consecutive_days = 1
+
+ # 签到奖励
+ coin_reward = 300
+ exp_reward = 200
+
+ # 获取当前用户数据
+ current_coins = user.get('萌芽币', 0)
+ current_exp = user.get('经验', 0)
+ current_level = user.get('等级', 0)
+
+ # 计算新的经验和等级
+ new_exp = current_exp + exp_reward
+ new_level = current_level
+
+ # 等级升级逻辑:100 × 1.2^(等级)
+ while True:
+ exp_needed = int(100 * (1.2 ** new_level))
+ if new_exp >= exp_needed:
+ new_exp -= exp_needed
+ new_level += 1
+ else:
+ break
+
+ # 更新用户数据
+ update_data = {
+ '萌芽币': current_coins + coin_reward,
+ '经验': new_exp,
+ '等级': new_level,
+ '签到系统': {
+ '连续签到天数': consecutive_days,
+ '今日是否已签到': True,
+ '签到时间': today
+ }
+ }
+
+ result = users_collection.update_one(
+ {'_id': ObjectId(user_id)},
+ {'$set': update_data}
+ )
+
+ if result.modified_count > 0:
+ level_up = new_level > current_level
+ return jsonify({
+ 'success': True,
+ 'message': '签到成功!',
+ 'data': {
+ 'coin_reward': coin_reward,
+ 'exp_reward': exp_reward,
+ 'consecutive_days': consecutive_days,
+ 'level_up': level_up,
+ 'new_level': new_level,
+ 'new_coins': current_coins + coin_reward,
+ 'new_exp': new_exp
+ }
+ }), 200
+ else:
+ return jsonify({
+ 'success': False,
+ 'message': '签到失败,请稍后重试'
+ }), 500
+
+ except Exception as e:
+ return jsonify({
+ 'success': False,
+ 'message': f'服务器错误: {str(e)}'
+ }), 500
+
+# 删除账户
+@user_bp.route('/delete', methods=['POST'])
+@login_required
+def delete_account():
+ """删除账户"""
+ try:
+ data = request.get_json()
+ password = data.get('password', '').strip()
+
+ if not password:
+ return jsonify({
+ 'success': False,
+ 'message': '请输入密码确认删除'
+ }), 400
+
+ hwt = getattr(request, 'hwt', {})
+ user_id = hwt.get('user_id')
+ users_collection = current_app.mongo.db.userdata
+
+ user = users_collection.find_one({'_id': ObjectId(user_id)})
+
+ if not user:
+ return jsonify({
+ 'success': False,
+ 'message': '用户不存在'
+ }), 404
+
+ from werkzeug.security import check_password_hash
+
+ # 验证密码
+ if not check_password_hash(user['密码'], password):
+ return jsonify({
+ 'success': False,
+ 'message': '密码错误'
+ }), 401
+
+ # 删除用户
+ result = users_collection.delete_one({'_id': ObjectId(user_id)})
+
+ if result.deleted_count > 0:
+ # 清除会话
+ hwt = getattr(request, 'hwt', {})
+ hwt.clear()
+
+ return jsonify({
+ 'success': True,
+ 'message': '账户已成功删除'
+ }), 200
+ else:
+ return jsonify({
+ 'success': False,
+ 'message': '删除失败'
+ }), 500
+
+ except Exception as e:
+ return jsonify({
+ 'success': False,
+ 'message': f'服务器错误: {str(e)}'
+ }), 500
#==========================对外暴露的HTTP接口==========================
\ No newline at end of file
diff --git a/InfoGenie-backend/requirements.txt b/InfoGenie-backend/requirements.txt
index 3a6a4eaf..0a9fabfc 100755
--- a/InfoGenie-backend/requirements.txt
+++ b/InfoGenie-backend/requirements.txt
@@ -1,29 +1,29 @@
-# InfoGenie 后端依赖包
-# Web框架
-Flask==2.3.3
-Flask-CORS==4.0.0
-
-# 数据库
-Flask-PyMongo==2.3.0
-pymongo==4.5.0
-
-# 密码加密
-Werkzeug==2.3.7
-
-# JWT认证
-PyJWT==2.8.0
-
-# HTTP请求
-requests==2.31.0
-
-# 邮件发送
-Flask-Mail==0.9.1
-
-# 数据处理
-python-dateutil==2.8.2
-
-# 环境变量
-python-dotenv==1.0.0
-
-# 开发工具
-flask-limiter==3.5.0 # API限流
+# InfoGenie 后端依赖包
+# Web框架
+Flask==2.3.3
+Flask-CORS==4.0.0
+
+# 数据库
+Flask-PyMongo==2.3.0
+pymongo==4.5.0
+
+# 密码加密
+Werkzeug==2.3.7
+
+# JWT认证
+PyJWT==2.8.0
+
+# HTTP请求
+requests==2.31.0
+
+# 邮件发送
+Flask-Mail==0.9.1
+
+# 数据处理
+python-dateutil==2.8.2
+
+# 环境变量
+python-dotenv==1.0.0
+
+# 开发工具
+flask-limiter==3.5.0 # API限流
diff --git a/InfoGenie-backend/start_backend.bat b/InfoGenie-backend/start_backend.bat
index ec8b3e13..3caf17ca 100755
--- a/InfoGenie-backend/start_backend.bat
+++ b/InfoGenie-backend/start_backend.bat
@@ -1,2 +1,2 @@
-@echo off
+@echo off
python app.py
\ No newline at end of file
diff --git a/InfoGenie-backend/start_backend.sh b/InfoGenie-backend/start_backend.sh
index cd71ab28..75eb545b 100755
--- a/InfoGenie-backend/start_backend.sh
+++ b/InfoGenie-backend/start_backend.sh
@@ -1,2 +1,2 @@
-#!/bin/bash
-python3 app.py
+#!/bin/bash
+python3 app.py
diff --git a/InfoGenie-backend/test/email_test.py b/InfoGenie-backend/test/email_test.py
deleted file mode 100755
index 9b219e6f..00000000
--- a/InfoGenie-backend/test/email_test.py
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""
-测试注册邮件发送
-"""
-
-import requests
-import json
-
-def test_send_verification_email():
- """测试发送验证码邮件"""
- url = "http://localhost:5000/api/auth/send-verification"
-
- test_data = {
- "email": "3205788256@qq.com", # 使用配置的邮箱
- "type": "register"
- }
-
- try:
- response = requests.post(url, json=test_data)
- print(f"状态码: {response.status_code}")
- print(f"响应: {response.json()}")
-
- if response.status_code == 200:
- print("\n✅ 邮件发送成功!请检查邮箱")
- else:
- print(f"\n❌ 邮件发送失败: {response.json().get('message', '未知错误')}")
-
- except Exception as e:
- print(f"❌ 请求失败: {str(e)}")
-
-if __name__ == "__main__":
- print("📧 测试注册邮件发送...")
- test_send_verification_email()
diff --git a/InfoGenie-backend/test/mongo_test.py b/InfoGenie-backend/test/mongo_test.py
deleted file mode 100755
index 26e79874..00000000
--- a/InfoGenie-backend/test/mongo_test.py
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""
-MongoDB连接测试
-"""
-
-from pymongo import MongoClient
-
-def test_connection():
- # 测试不同的连接配置
- configs = [
- "mongodb://shumengya:tyh%4019900420@192.168.1.233:27017/InfoGenie",
- "mongodb://shumengya:tyh%4019900420@192.168.1.233:27017/InfoGenie?authSource=admin",
- "mongodb://shumengya:tyh%4019900420@192.168.1.233:27017/InfoGenie?authSource=InfoGenie",
- "mongodb://shumengya:tyh%4019900420@192.168.1.233:27017/?authSource=admin",
- ]
-
- for i, uri in enumerate(configs):
- print(f"\n测试配置 {i+1}: {uri}")
- try:
- client = MongoClient(uri, serverSelectionTimeoutMS=5000)
- client.admin.command('ping')
- print("✅ 连接成功!")
-
- # 测试InfoGenie数据库
- db = client.InfoGenie
- collections = db.list_collection_names()
- print(f"数据库集合: {collections}")
-
- # 测试userdata集合
- if 'userdata' in collections:
- count = db.userdata.count_documents({})
- print(f"userdata集合文档数: {count}")
-
- client.close()
- return uri
-
- except Exception as e:
- print(f"❌ 连接失败: {str(e)}")
-
- return None
-
-if __name__ == "__main__":
- print("🔧 测试MongoDB连接...")
- success_uri = test_connection()
- if success_uri:
- print(f"\n✅ 成功的连接字符串: {success_uri}")
- else:
- print("\n❌ 所有连接尝试都失败了")
diff --git a/InfoGenie-backend/test/test_add_coins.py b/InfoGenie-backend/test/test_add_coins.py
deleted file mode 100644
index aa3c51e6..00000000
--- a/InfoGenie-backend/test/test_add_coins.py
+++ /dev/null
@@ -1,100 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""
-测试为指定账号增加萌芽币接口 (/api/user/add-coins)
-"""
-
-import os
-import sys
-import json
-from datetime import datetime
-
-# 加入后端根目录到路径,导入create_app
-sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-
-from app import create_app
-from modules.auth import generate_token
-from werkzeug.security import generate_password_hash
-
-
-def run_test():
- """运行加币接口测试,打印真实响应并断言结果"""
- app = create_app()
-
- with app.app_context():
- db = app.mongo.db
- users = db.userdata
-
- # 构造一个临时测试用户(真实写库,测试结束删除)
- test_email = "infogenie.test.addcoins@foxmail.com"
- users.delete_many({'邮箱': test_email})
- test_user = {
- '邮箱': test_email,
- '用户名': '测试用户_加币',
- '密码': generate_password_hash('AddCoins123!'),
- '头像': None,
- '注册时间': datetime.now().isoformat(),
- '最后登录': None,
- '登录次数': 0,
- '用户状态': 'active',
- '等级': 0,
- '经验': 0,
- '萌芽币': 0,
- '签到系统': {
- '连续签到天数': 0,
- '今日是否已签到': False,
- '签到时间': datetime.now().strftime('%Y-%m-%d')
- }
- }
- insert_result = users.insert_one(test_user)
- test_user_id = str(insert_result.inserted_id)
-
- # 生成有效JWT用于认证
- token = generate_token({
- 'user_id': test_user_id,
- 'email': test_email,
- 'username': test_user['用户名']
- })
-
- client = app.test_client()
-
- # 第一次加币: +500
- resp1 = client.post(
- '/api/user/add-coins',
- headers={'Authorization': f'Bearer {token}'},
- json={'email': test_email, 'amount': 500}
- )
- print('第一次加币 状态码:', resp1.status_code)
- data1 = resp1.get_json()
- print('第一次加币 响应:')
- print(json.dumps(data1, ensure_ascii=False, indent=2))
- assert resp1.status_code == 200
- assert data1.get('success') is True
- assert data1['data']['before_coins'] == 0
- assert data1['data']['added'] == 500
- assert data1['data']['new_coins'] == 500
-
- # 第二次加币: +200
- resp2 = client.post(
- '/api/user/add-coins',
- headers={'Authorization': f'Bearer {token}'},
- json={'email': test_email, 'amount': 200}
- )
- print('第二次加币 状态码:', resp2.status_code)
- data2 = resp2.get_json()
- print('第二次加币 响应:')
- print(json.dumps(data2, ensure_ascii=False, indent=2))
- assert resp2.status_code == 200
- assert data2.get('success') is True
- assert data2['data']['before_coins'] == 500
- assert data2['data']['added'] == 200
- assert data2['data']['new_coins'] == 700
-
- # 清理临时测试用户
- users.delete_many({'邮箱': test_email})
-
-
-if __name__ == '__main__':
- print('🔧 开始测试 /api/user/add-coins 接口...')
- run_test()
- print('✅ 测试完成!')
\ No newline at end of file
diff --git a/InfoGenie-backend/test/test_email.py b/InfoGenie-backend/test/test_email.py
deleted file mode 100755
index ee645e86..00000000
--- a/InfoGenie-backend/test/test_email.py
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""
-测试邮件发送功能
-"""
-
-import requests
-import json
-
-def test_send_verification():
- """测试发送验证码"""
- url = "http://localhost:5000/api/auth/send-verification"
-
- # 测试数据
- test_data = {
- "email": "3205788256@qq.com", # 使用配置中的测试邮箱
- "type": "register"
- }
-
- try:
- response = requests.post(url, json=test_data)
- print(f"状态码: {response.status_code}")
- print(f"响应内容: {response.json()}")
-
- if response.status_code == 200:
- print("✅ 邮件发送成功!")
- else:
- print("❌ 邮件发送失败")
-
- except Exception as e:
- print(f"❌ 请求失败: {str(e)}")
-
-if __name__ == "__main__":
- print("📧 测试邮件发送功能...")
- test_send_verification()
diff --git a/InfoGenie-backend/test/test_email_fix.py b/InfoGenie-backend/test/test_email_fix.py
deleted file mode 100755
index 6c7b164d..00000000
--- a/InfoGenie-backend/test/test_email_fix.py
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-"""
-测试修复后的邮件发送功能
-"""
-
-import sys
-import os
-
-# 添加父目录到路径
-sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-
-from modules.email_service import send_verification_email, verify_code
-
-def test_email_sending():
- """
- 测试邮件发送功能
- """
- print("=== 测试邮件发送功能 ===")
-
- # 测试邮箱(请替换为你的QQ邮箱)
- test_email = "3205788256@qq.com" # 替换为实际的测试邮箱
-
- print(f"正在向 {test_email} 发送注册验证码...")
-
- # 发送注册验证码
- result = send_verification_email(test_email, 'register')
-
- print(f"发送结果: {result}")
-
- if result['success']:
- print("✅ 邮件发送成功!")
- if 'code' in result:
- print(f"验证码: {result['code']}")
-
- # 测试验证码验证
- print("\n=== 测试验证码验证 ===")
- verify_result = verify_code(test_email, result['code'])
- print(f"验证结果: {verify_result}")
-
- if verify_result['success']:
- print("✅ 验证码验证成功!")
- else:
- print("❌ 验证码验证失败!")
- else:
- print("❌ 邮件发送失败!")
- print(f"错误信息: {result['message']}")
-
-def test_login_email():
- """
- 测试登录验证码邮件
- """
- print("\n=== 测试登录验证码邮件 ===")
-
- test_email = "3205788256@qq.com" # 替换为实际的测试邮箱
-
- print(f"正在向 {test_email} 发送登录验证码...")
-
- result = send_verification_email(test_email, 'login')
-
- print(f"发送结果: {result}")
-
- if result['success']:
- print("✅ 登录验证码邮件发送成功!")
- if 'code' in result:
- print(f"验证码: {result['code']}")
- else:
- print("❌ 登录验证码邮件发送失败!")
- print(f"错误信息: {result['message']}")
-
-if __name__ == '__main__':
- print("InfoGenie 邮件服务测试")
- print("=" * 50)
-
- # 测试注册验证码
- test_email_sending()
-
- # 测试登录验证码
- test_login_email()
-
- print("\n测试完成!")
\ No newline at end of file
diff --git a/InfoGenie-backend/test/test_mongo.py b/InfoGenie-backend/test/test_mongo.py
deleted file mode 100755
index 830d1557..00000000
--- a/InfoGenie-backend/test/test_mongo.py
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""
-测试MongoDB连接
-"""
-
-import os
-from pymongo import MongoClient
-from dotenv import load_dotenv
-
-# 加载环境变量
-load_dotenv()
-
-def test_mongodb_connection():
- """测试MongoDB连接"""
- try:
- # 获取连接字符串
- mongo_uri = os.environ.get('MONGO_URI')
- print(f"连接字符串: {mongo_uri}")
-
- # 创建连接
- client = MongoClient(mongo_uri)
-
- # 测试连接
- client.admin.command('ping')
- print("✅ MongoDB连接成功!")
-
- # 获取数据库
- db = client.InfoGenie
- print(f"数据库: {db.name}")
-
- # 测试集合访问
- userdata_collection = db.userdata
- print(f"用户集合: {userdata_collection.name}")
-
- # 测试查询(计算文档数量)
- count = userdata_collection.count_documents({})
- print(f"用户数据集合中有 {count} 个文档")
-
- # 关闭连接
- client.close()
-
- except Exception as e:
- print(f"❌ MongoDB连接失败: {str(e)}")
-
- # 尝试其他认证数据库
- print("\n尝试使用不同的认证配置...")
- try:
- # 尝试不指定认证数据库
- uri_without_auth = "mongodb://shumengya:tyh%4019900420@192.168.1.233:27017/InfoGenie"
- client2 = MongoClient(uri_without_auth)
- client2.admin.command('ping')
- print("✅ 不使用authSource连接成功!")
- client2.close()
- except Exception as e2:
- print(f"❌ 无authSource也失败: {str(e2)}")
-
- # 尝试使用InfoGenie作为认证数据库
- try:
- uri_with_infogenie_auth = "mongodb://shumengya:tyh%4019900420@192.168.1.233:27017/InfoGenie?authSource=InfoGenie"
- client3 = MongoClient(uri_with_infogenie_auth)
- client3.admin.command('ping')
- print("✅ 使用InfoGenie作为authSource连接成功!")
- client3.close()
- except Exception as e3:
- print(f"❌ InfoGenie authSource也失败: {str(e3)}")
-
-if __name__ == "__main__":
- print("🔧 测试MongoDB连接...")
- test_mongodb_connection()
diff --git a/InfoGenie-backend/test/test_user_list.py b/InfoGenie-backend/test/test_user_list.py
deleted file mode 100644
index 26df9d80..00000000
--- a/InfoGenie-backend/test/test_user_list.py
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""
-测试列出所有用户的HTTP接口 (/api/user/list)
-"""
-
-import os
-import sys
-import json
-from datetime import datetime
-
-# 将后端根目录加入路径,便于导入app
-sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-
-from app import create_app
-from modules.auth import generate_token
-from werkzeug.security import generate_password_hash
-
-
-def run_test():
- """运行用户列表接口测试,输出真实数据"""
- # 使用.env中的真实Mongo配置,不造假
- app = create_app()
-
- with app.app_context():
- db = app.mongo.db
- users = db.userdata
-
- # 插入一个测试用户(真实写入后再删除),确保可验证接口输出
- test_email = "infogenie.test.user@foxmail.com"
- users.delete_many({'邮箱': test_email})
- test_user = {
- '邮箱': test_email,
- '用户名': '测试用户_列表',
- '密码': generate_password_hash('TestPass123!'),
- '头像': None,
- '注册时间': datetime.now().isoformat(),
- '最后登录': None,
- '登录次数': 0,
- '用户状态': 'active',
- '等级': 0,
- '经验': 0,
- '萌芽币': 0,
- '签到系统': {
- '连续签到天数': 0,
- '今日是否已签到': False,
- '签到时间': datetime.now().strftime('%Y-%m-%d')
- }
- }
- insert_result = users.insert_one(test_user)
- test_user_id = str(insert_result.inserted_id)
-
- # 生成有效JWT,满足认证要求
- token = generate_token({
- 'user_id': test_user_id,
- 'email': test_email,
- 'username': test_user['用户名']
- })
-
- client = app.test_client()
- resp = client.get('/api/user/list', headers={'Authorization': f'Bearer {token}'})
-
- print("状态码:", resp.status_code)
- data = resp.get_json()
- print("响应内容:")
- print(json.dumps(data, ensure_ascii=False, indent=2))
-
- # 基本断言,确保返回真实列表数据且包含刚插入的测试用户
- assert resp.status_code == 200
- assert data.get('success') is True
- assert isinstance(data.get('data'), list)
- assert any(u.get('email') == test_email for u in data['data'])
-
- # 清理测试数据
- users.delete_many({'邮箱': test_email})
-
-
-if __name__ == '__main__':
- print('🔎 开始测试 /api/user/list 接口...')
- run_test()
- print('✅ 测试完成!')
\ No newline at end of file
diff --git a/InfoGenie-backend/后端架构文档.md b/InfoGenie-backend/后端架构文档.md
index f55b0161..3d7a375b 100755
--- a/InfoGenie-backend/后端架构文档.md
+++ b/InfoGenie-backend/后端架构文档.md
@@ -1,396 +1,396 @@
-# InfoGenie 后端架构文档
-
-## 项目概述
-
-InfoGenie(万象口袋)是一个基于前后端分离架构的多功能聚合软件应用。后端采用Flask框架提供RESTful API服务,前端通过HTTP请求调用后端API,实现数据交互和业务逻辑处理。
-
-## 技术栈
-
-### 核心框架
-- **Web框架**: Flask 2.3.3
-- **数据库**: MongoDB (Flask-PyMongo 2.3.0)
-- **认证**: JWT (PyJWT 2.8.0)
-- **跨域**: Flask-CORS 4.0.0
-
-### 辅助工具
-- **邮件服务**: Flask-Mail 0.9.1
-- **密码加密**: Werkzeug 2.3.7
-- **环境配置**: python-dotenv 1.0.0
-- **API限流**: Flask-Limiter 3.5.0
-
-## 架构设计原则
-
-### 前后端分离
-- 后端专注于数据处理和业务逻辑
-- 前端负责用户界面和交互体验
-- 通过RESTful API进行数据交换
-- 完全解耦,便于独立开发和部署
-
-### 模块化设计
-- 按功能划分独立模块
-- 每个模块职责单一
-- 便于维护和扩展
-
-## 核心模块详解
-
-### 1. 认证模块 (auth.py)
-
-**功能职责**:
-- 用户注册和登录
-- JWT Token生成和管理
-- 邮箱验证码验证
-- QQ邮箱格式验证
-
-**API端点**:
-```
-POST /api/auth/send-verification # 发送验证码
-POST /api/auth/verify-code # 验证验证码
-POST /api/auth/register # 用户注册
-POST /api/auth/login # 用户登录
-POST /api/auth/logout # 用户登出
-GET /api/auth/check # 检查登录状态
-```
-
-**数据流程**:
-1. 前端发送注册/登录请求
-2. 后端验证邮箱格式(仅支持QQ邮箱)
-3. 发送验证码邮件到用户邮箱
-4. 用户输入验证码完成验证
-5. 验证成功后生成JWT Token返回给前端
-
-**安全特性**:
-- 密码使用Werkzeug进行哈希加密
-- JWT Token 7天有效期
-- 验证码5分钟有效期,限制尝试次数
-
-### 2. 用户管理模块 (user_management.py)
-
-**功能职责**:
-- 用户资料管理
-- 密码修改
-- 每日签到系统
-- 用户游戏数据管理
-- 账户删除
-
-**API端点**:
-```
-GET /api/user/profile # 获取用户资料
-POST /api/user/change-password # 修改密码
-GET /api/user/stats # 获取用户统计
-GET /api/user/game-data # 获取游戏数据
-POST /api/user/checkin # 每日签到
-POST /api/user/delete # 删除账户
-```
-
-**数据结构**:
-```json
-{
- "邮箱": "user@qq.com",
- "用户名": "用户名",
- "密码": "哈希密码",
- "头像": "QQ头像URL",
- "注册时间": "2025-01-01T00:00:00",
- "最后登录": "2025-01-01T00:00:00",
- "登录次数": 10,
- "用户状态": "active",
- "等级": 5,
- "经验": 1200,
- "萌芽币": 1500,
- "签到系统": {
- "连续签到天数": 7,
- "今日是否已签到": true,
- "签到时间": "2025-01-01"
- }
-}
-```
-
-**业务逻辑**:
-- 签到奖励:300萌芽币 + 200经验
-- 等级升级:100 × 1.2^(等级) 经验需求
-
-### 3. 邮件服务模块 (email_service.py)
-
-**功能职责**:
-- 验证码邮件发送
-- QQ邮箱格式验证
-- QQ头像获取
-- 邮件模板管理
-
-**邮件模板**:
-- 注册验证码邮件(HTML格式)
-- 登录验证码邮件(HTML格式)
-- 支持自定义邮件内容和样式
-
-**安全考虑**:
-- 仅支持QQ邮箱(qq.com、vip.qq.com、foxmail.com)
-- 使用SSL加密连接
-- 验证码存储在内存中(生产环境建议使用Redis)
-
-### 4. AI模型应用模块 (aimodelapp.py)
-
-**功能职责**:
-- 集成多种AI服务(DeepSeek、Kimi)
-- 提供AI功能API接口
-- 统一AI接口调用
-- 管理用户萌芽币消费(每次调用消耗100萌芽币)
-
-**支持的AI功能**:
-1. **AI聊天接口** (`/api/aimodelapp/chat`)
-2. **姓名分析** (`/api/aimodelapp/name-analysis`)
-3. **变量命名助手** (`/api/aimodelapp/variable-naming`)
-4. **AI写诗助手** (`/api/aimodelapp/poetry`)
-5. **AI语言翻译** (`/api/aimodelapp/translation`)
-6. **现代文转文言文** (`/api/aimodelapp/classical_conversion`)
-7. **AI表情制作器** (`/api/aimodelapp/expression-maker`)
-8. **Linux命令生成** (`/api/aimodelapp/linux-command`)
-9. **获取可用模型** (`/api/aimodelapp/models`)
-
-**AI配置**:
-```json
-{
- "deepseek": {
- "api_key": "your-api-key",
- "api_base": "https://api.deepseek.com",
- "model": ["deepseek-chat", "deepseek-reasoner"]
- },
- "kimi": {
- "api_key": "your-api-key",
- "api_base": "https://api.moonshot.cn",
- "model": ["kimi-k2-0905-preview", "kimi-k2-0711-preview"]
- }
-}
-```
-
-**调用流程**:
-1. 前端发送AI请求(包含消息、模型提供商等参数)
-2. 后端加载AI配置文件
-3. 调用对应AI API(带重试机制)
-4. 返回AI响应给前端
-
-## API设计规范
-
-### 请求/响应格式
-
-**成功响应**:
-```json
-{
- "success": true,
- "data": {...},
- "message": "操作成功",
- "timestamp": "2025-01-01T00:00:00"
-}
-```
-
-**错误响应**:
-```json
-{
- "success": false,
- "message": "错误信息",
- "error": "错误详情"
-}
-```
-
-### 认证方式
-
-**JWT Token认证**:
-```
-Authorization: Bearer
-```
-
-**支持的认证端点**:
-- 所有 `/api/user/*` 端点需要认证
-- 部分 `/api/aimodelapp/*` 端点需要认证
-
-### 错误处理
-
-**HTTP状态码**:
-- 200: 成功
-- 400: 请求参数错误
-- 401: 未认证/认证失败
-- 403: 权限不足
-- 404: 资源不存在
-- 409: 资源冲突
-- 500: 服务器内部错误
-
-## 数据库设计
-
-### MongoDB集合
-
-**主要集合**: `userdata`
-- 存储所有用户相关数据
-- 支持动态字段扩展
-- 使用ObjectId作为用户唯一标识
-
-### 数据关系
-- 用户数据自包含,无复杂关联
-- 通过用户ID进行数据关联
-- 支持水平扩展
-
-## 部署和配置
-
-### 环境配置
-
-**必需环境变量**:
-```
-SECRET_KEY=your-secret-key
-MONGO_URI=mongodb://localhost:27017/InfoGenie
-MAIL_USERNAME=your-email@qq.com
-MAIL_PASSWORD=your-app-password
-```
-
-### 启动方式
-
-**开发环境**:
-```bash
-python app.py
-```
-
-**生产环境**:
-- 支持Docker部署
-- 提供docker-compose配置
-- 支持Gunicorn WSGI服务器
-
-### 静态文件服务
-
-**支持的前端资源**:
-- `/60sapi/*`: 60秒API相关文件
-- `/smallgame/*`: 小游戏相关文件
-- `/aimodelapp/*`: AI模型应用相关文件
-
-## 安全考虑
-
-### 数据安全
-- 密码哈希存储
-- JWT Token安全传输
-- 输入数据验证和过滤
-
-### API安全
-- CORS配置(生产环境限制域名)
-- API限流保护
-- 请求日志记录
-
-### 部署安全
-- 环境变量管理敏感信息
-- HTTPS证书配置
-- 防火墙和访问控制
-
-## 前后端协作指南
-
-### 前端调用示例
-
-**用户登录**:
-```javascript
-// 1. 发送验证码
-fetch('/api/auth/send-verification', {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({ email: 'user@qq.com', type: 'login' })
-});
-
-// 2. 验证验证码并登录
-fetch('/api/auth/login', {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({
- email: 'user@qq.com',
- code: '123456'
- })
-});
-
-// 3. 保存token到localStorage
-localStorage.setItem('token', response.token);
-```
-
-**调用需要认证的API**:
-```javascript
-fetch('/api/user/profile', {
- method: 'GET',
- headers: {
- 'Authorization': `Bearer ${localStorage.getItem('token')}`
- }
-});
-```
-
-### 数据约定
-
-**前端发送数据格式**:
-- 所有请求使用JSON格式
-- 必填字段验证
-- 参数命名使用snake_case
-
-**后端返回数据格式**:
-- 统一响应格式
-- 时间戳使用ISO格式
-- 错误信息清晰明确
-
-### 开发协作流程
-
-1. **API设计阶段**:
- - 后端定义API接口规范
- - 前端根据规范开发调用代码
- - 约定数据格式和错误处理
-
-2. **联调阶段**:
- - 使用统一的测试数据
- - 验证各种边界情况
- - 确认错误处理逻辑
-
-3. **部署阶段**:
- - 后端部署API服务
- - 前端配置API基础URL
- - 验证跨域和认证配置
-
-## 新功能添加
-
-### 1. AI功能萌芽币消费系统
-
-**功能描述**:
-- 用户每次调用AI模型应用(aimodelapp)需消耗100萌芽币
-- 当用户萌芽币余额不足时,无法使用AI功能
-- 记录用户的AI使用历史
-
-**API端点**:
-```
-GET /api/aimodelapp/coins # 查询用户萌芽币余额和使用历史
-```
-
-**技术实现**:
-- 使用装饰器模式实现请求前验证和扣除萌芽币
-- 在MongoDB中记录用户AI使用历史
-- 通过JWT Token验证用户身份
-
-**业务逻辑**:
-1. 当用户请求AI功能时,首先验证JWT Token
-2. 检查用户萌芽币余额是否≥100
-3. 如余额充足,先扣除萌芽币,然后再调用AI服务
-4. 记录使用历史,包括API类型、时间和消费萌芽币数量
-5. 返回AI服务结果给用户
-
-**响应示例(查询萌芽币余额)**:
-```json
-{
- "success": true,
- "data": {
- "coins": 200,
- "ai_cost": 100,
- "can_use_ai": true,
- "username": "用户名",
- "usage_count": 1,
- "recent_usage": [
- {
- "api_type": "chat",
- "cost": 100,
- "timestamp": "2025-09-16T11:15:47.285720"
- }
- ]
- },
- "message": "当前萌芽币余额: 200"
-}
-```
-
-**前端开发注意事项**:
-- 每个需要调用AI功能的页面应首先检查用户萌芽币余额
-- 当萌芽币不足时,向用户提示并引导用户通过签到等方式获取萌芽币
-- 可在UI中展示用户最近的AI使用记录和萌芽币消费情况
-
----
+# InfoGenie 后端架构文档
+
+## 项目概述
+
+InfoGenie(万象口袋)是一个基于前后端分离架构的多功能聚合软件应用。后端采用Flask框架提供RESTful API服务,前端通过HTTP请求调用后端API,实现数据交互和业务逻辑处理。
+
+## 技术栈
+
+### 核心框架
+- **Web框架**: Flask 2.3.3
+- **数据库**: MongoDB (Flask-PyMongo 2.3.0)
+- **认证**: JWT (PyJWT 2.8.0)
+- **跨域**: Flask-CORS 4.0.0
+
+### 辅助工具
+- **邮件服务**: Flask-Mail 0.9.1
+- **密码加密**: Werkzeug 2.3.7
+- **环境配置**: python-dotenv 1.0.0
+- **API限流**: Flask-Limiter 3.5.0
+
+## 架构设计原则
+
+### 前后端分离
+- 后端专注于数据处理和业务逻辑
+- 前端负责用户界面和交互体验
+- 通过RESTful API进行数据交换
+- 完全解耦,便于独立开发和部署
+
+### 模块化设计
+- 按功能划分独立模块
+- 每个模块职责单一
+- 便于维护和扩展
+
+## 核心模块详解
+
+### 1. 认证模块 (auth.py)
+
+**功能职责**:
+- 用户注册和登录
+- JWT Token生成和管理
+- 邮箱验证码验证
+- QQ邮箱格式验证
+
+**API端点**:
+```
+POST /api/auth/send-verification # 发送验证码
+POST /api/auth/verify-code # 验证验证码
+POST /api/auth/register # 用户注册
+POST /api/auth/login # 用户登录
+POST /api/auth/logout # 用户登出
+GET /api/auth/check # 检查登录状态
+```
+
+**数据流程**:
+1. 前端发送注册/登录请求
+2. 后端验证邮箱格式(仅支持QQ邮箱)
+3. 发送验证码邮件到用户邮箱
+4. 用户输入验证码完成验证
+5. 验证成功后生成JWT Token返回给前端
+
+**安全特性**:
+- 密码使用Werkzeug进行哈希加密
+- JWT Token 7天有效期
+- 验证码5分钟有效期,限制尝试次数
+
+### 2. 用户管理模块 (user_management.py)
+
+**功能职责**:
+- 用户资料管理
+- 密码修改
+- 每日签到系统
+- 用户游戏数据管理
+- 账户删除
+
+**API端点**:
+```
+GET /api/user/profile # 获取用户资料
+POST /api/user/change-password # 修改密码
+GET /api/user/stats # 获取用户统计
+GET /api/user/game-data # 获取游戏数据
+POST /api/user/checkin # 每日签到
+POST /api/user/delete # 删除账户
+```
+
+**数据结构**:
+```json
+{
+ "邮箱": "user@qq.com",
+ "用户名": "用户名",
+ "密码": "哈希密码",
+ "头像": "QQ头像URL",
+ "注册时间": "2025-01-01T00:00:00",
+ "最后登录": "2025-01-01T00:00:00",
+ "登录次数": 10,
+ "用户状态": "active",
+ "等级": 5,
+ "经验": 1200,
+ "萌芽币": 1500,
+ "签到系统": {
+ "连续签到天数": 7,
+ "今日是否已签到": true,
+ "签到时间": "2025-01-01"
+ }
+}
+```
+
+**业务逻辑**:
+- 签到奖励:300萌芽币 + 200经验
+- 等级升级:100 × 1.2^(等级) 经验需求
+
+### 3. 邮件服务模块 (email_service.py)
+
+**功能职责**:
+- 验证码邮件发送
+- QQ邮箱格式验证
+- QQ头像获取
+- 邮件模板管理
+
+**邮件模板**:
+- 注册验证码邮件(HTML格式)
+- 登录验证码邮件(HTML格式)
+- 支持自定义邮件内容和样式
+
+**安全考虑**:
+- 仅支持QQ邮箱(qq.com、vip.qq.com、foxmail.com)
+- 使用SSL加密连接
+- 验证码存储在内存中(生产环境建议使用Redis)
+
+### 4. AI模型应用模块 (aimodelapp.py)
+
+**功能职责**:
+- 集成多种AI服务(DeepSeek、Kimi)
+- 提供AI功能API接口
+- 统一AI接口调用
+- 管理用户萌芽币消费(每次调用消耗100萌芽币)
+
+**支持的AI功能**:
+1. **AI聊天接口** (`/api/aimodelapp/chat`)
+2. **姓名分析** (`/api/aimodelapp/name-analysis`)
+3. **变量命名助手** (`/api/aimodelapp/variable-naming`)
+4. **AI写诗助手** (`/api/aimodelapp/poetry`)
+5. **AI语言翻译** (`/api/aimodelapp/translation`)
+6. **现代文转文言文** (`/api/aimodelapp/classical_conversion`)
+7. **AI表情制作器** (`/api/aimodelapp/expression-maker`)
+8. **Linux命令生成** (`/api/aimodelapp/linux-command`)
+9. **获取可用模型** (`/api/aimodelapp/models`)
+
+**AI配置**:
+```json
+{
+ "deepseek": {
+ "api_key": "your-api-key",
+ "api_base": "https://api.deepseek.com",
+ "model": ["deepseek-chat", "deepseek-reasoner"]
+ },
+ "kimi": {
+ "api_key": "your-api-key",
+ "api_base": "https://api.moonshot.cn",
+ "model": ["kimi-k2-0905-preview", "kimi-k2-0711-preview"]
+ }
+}
+```
+
+**调用流程**:
+1. 前端发送AI请求(包含消息、模型提供商等参数)
+2. 后端加载AI配置文件
+3. 调用对应AI API(带重试机制)
+4. 返回AI响应给前端
+
+## API设计规范
+
+### 请求/响应格式
+
+**成功响应**:
+```json
+{
+ "success": true,
+ "data": {...},
+ "message": "操作成功",
+ "timestamp": "2025-01-01T00:00:00"
+}
+```
+
+**错误响应**:
+```json
+{
+ "success": false,
+ "message": "错误信息",
+ "error": "错误详情"
+}
+```
+
+### 认证方式
+
+**JWT Token认证**:
+```
+Authorization: Bearer
+```
+
+**支持的认证端点**:
+- 所有 `/api/user/*` 端点需要认证
+- 部分 `/api/aimodelapp/*` 端点需要认证
+
+### 错误处理
+
+**HTTP状态码**:
+- 200: 成功
+- 400: 请求参数错误
+- 401: 未认证/认证失败
+- 403: 权限不足
+- 404: 资源不存在
+- 409: 资源冲突
+- 500: 服务器内部错误
+
+## 数据库设计
+
+### MongoDB集合
+
+**主要集合**: `userdata`
+- 存储所有用户相关数据
+- 支持动态字段扩展
+- 使用ObjectId作为用户唯一标识
+
+### 数据关系
+- 用户数据自包含,无复杂关联
+- 通过用户ID进行数据关联
+- 支持水平扩展
+
+## 部署和配置
+
+### 环境配置
+
+**必需环境变量**:
+```
+SECRET_KEY=your-secret-key
+MONGO_URI=mongodb://localhost:27017/InfoGenie
+MAIL_USERNAME=your-email@qq.com
+MAIL_PASSWORD=your-app-password
+```
+
+### 启动方式
+
+**开发环境**:
+```bash
+python app.py
+```
+
+**生产环境**:
+- 支持Docker部署
+- 提供docker-compose配置
+- 支持Gunicorn WSGI服务器
+
+### 静态文件服务
+
+**支持的前端资源**:
+- `/60sapi/*`: 60秒API相关文件
+- `/smallgame/*`: 小游戏相关文件
+- `/aimodelapp/*`: AI模型应用相关文件
+
+## 安全考虑
+
+### 数据安全
+- 密码哈希存储
+- JWT Token安全传输
+- 输入数据验证和过滤
+
+### API安全
+- CORS配置(生产环境限制域名)
+- API限流保护
+- 请求日志记录
+
+### 部署安全
+- 环境变量管理敏感信息
+- HTTPS证书配置
+- 防火墙和访问控制
+
+## 前后端协作指南
+
+### 前端调用示例
+
+**用户登录**:
+```javascript
+// 1. 发送验证码
+fetch('/api/auth/send-verification', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ email: 'user@qq.com', type: 'login' })
+});
+
+// 2. 验证验证码并登录
+fetch('/api/auth/login', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ email: 'user@qq.com',
+ code: '123456'
+ })
+});
+
+// 3. 保存token到localStorage
+localStorage.setItem('token', response.token);
+```
+
+**调用需要认证的API**:
+```javascript
+fetch('/api/user/profile', {
+ method: 'GET',
+ headers: {
+ 'Authorization': `Bearer ${localStorage.getItem('token')}`
+ }
+});
+```
+
+### 数据约定
+
+**前端发送数据格式**:
+- 所有请求使用JSON格式
+- 必填字段验证
+- 参数命名使用snake_case
+
+**后端返回数据格式**:
+- 统一响应格式
+- 时间戳使用ISO格式
+- 错误信息清晰明确
+
+### 开发协作流程
+
+1. **API设计阶段**:
+ - 后端定义API接口规范
+ - 前端根据规范开发调用代码
+ - 约定数据格式和错误处理
+
+2. **联调阶段**:
+ - 使用统一的测试数据
+ - 验证各种边界情况
+ - 确认错误处理逻辑
+
+3. **部署阶段**:
+ - 后端部署API服务
+ - 前端配置API基础URL
+ - 验证跨域和认证配置
+
+## 新功能添加
+
+### 1. AI功能萌芽币消费系统
+
+**功能描述**:
+- 用户每次调用AI模型应用(aimodelapp)需消耗100萌芽币
+- 当用户萌芽币余额不足时,无法使用AI功能
+- 记录用户的AI使用历史
+
+**API端点**:
+```
+GET /api/aimodelapp/coins # 查询用户萌芽币余额和使用历史
+```
+
+**技术实现**:
+- 使用装饰器模式实现请求前验证和扣除萌芽币
+- 在MongoDB中记录用户AI使用历史
+- 通过JWT Token验证用户身份
+
+**业务逻辑**:
+1. 当用户请求AI功能时,首先验证JWT Token
+2. 检查用户萌芽币余额是否≥100
+3. 如余额充足,先扣除萌芽币,然后再调用AI服务
+4. 记录使用历史,包括API类型、时间和消费萌芽币数量
+5. 返回AI服务结果给用户
+
+**响应示例(查询萌芽币余额)**:
+```json
+{
+ "success": true,
+ "data": {
+ "coins": 200,
+ "ai_cost": 100,
+ "can_use_ai": true,
+ "username": "用户名",
+ "usage_count": 1,
+ "recent_usage": [
+ {
+ "api_type": "chat",
+ "cost": 100,
+ "timestamp": "2025-09-16T11:15:47.285720"
+ }
+ ]
+ },
+ "message": "当前萌芽币余额: 200"
+}
+```
+
+**前端开发注意事项**:
+- 每个需要调用AI功能的页面应首先检查用户萌芽币余额
+- 当萌芽币不足时,向用户提示并引导用户通过签到等方式获取萌芽币
+- 可在UI中展示用户最近的AI使用记录和萌芽币消费情况
+
+---
diff --git a/InfoGenie-backend/用户数据模板.json b/InfoGenie-backend/用户数据模板.json
index 5b2f2d07..b9cdbaa4 100755
--- a/InfoGenie-backend/用户数据模板.json
+++ b/InfoGenie-backend/用户数据模板.json
@@ -1,13 +1,13 @@
-{
- "账号":"3205788256",
- "邮箱":"3205788256@qq.com",
- "密码":"0123456789",
- "等级":0,
- "经验":0,
- "萌芽币":0,
- "签到系统":{
- "连续签到天数":0,
- "今日是否已签到":false,
- "签到时间":"2025-01-01"
- }
+{
+ "账号":"3205788256",
+ "邮箱":"3205788256@qq.com",
+ "密码":"0123456789",
+ "等级":0,
+ "经验":0,
+ "萌芽币":0,
+ "签到系统":{
+ "连续签到天数":0,
+ "今日是否已签到":false,
+ "签到时间":"2025-01-01"
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/build_frontend.bat b/InfoGenie-frontend/build_frontend.bat
index 20b19b16..cc07c378 100755
--- a/InfoGenie-frontend/build_frontend.bat
+++ b/InfoGenie-frontend/build_frontend.bat
@@ -1,4 +1,4 @@
-@echo off
-npm run build
-npx serve -s build
+@echo off
+npm run build
+npx serve -s build
pause
\ No newline at end of file
diff --git a/InfoGenie-frontend/env.backup b/InfoGenie-frontend/env.backup
index d6572034..a4fef6fc 100755
--- a/InfoGenie-frontend/env.backup
+++ b/InfoGenie-frontend/env.backup
@@ -1,5 +1,5 @@
-# 生产环境API配置
-REACT_APP_API_URL=https://infogenie.api.shumengya.top
-
-# 生产环境API配置
+# 生产环境API配置
+REACT_APP_API_URL=https://infogenie.api.shumengya.top
+
+# 生产环境API配置
REACT_APP_API_URL=http://127.0.0.1:5002
\ No newline at end of file
diff --git a/InfoGenie-frontend/package-lock.json b/InfoGenie-frontend/package-lock.json
index 30a1cf9d..57e5c300 100755
--- a/InfoGenie-frontend/package-lock.json
+++ b/InfoGenie-frontend/package-lock.json
@@ -1,20700 +1,20700 @@
-{
- "name": "infogenie-frontend",
- "version": "1.0.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "infogenie-frontend",
- "version": "1.0.0",
- "license": "MIT",
- "dependencies": {
- "@testing-library/jest-dom": "^5.17.0",
- "@testing-library/react": "^13.4.0",
- "@testing-library/user-event": "^14.5.2",
- "axios": "^1.5.0",
- "react": "^18.2.0",
- "react-dom": "^18.2.0",
- "react-hot-toast": "^2.4.1",
- "react-icons": "^4.11.0",
- "react-router-dom": "^6.15.0",
- "react-scripts": "5.0.1",
- "react-transition-group": "^4.4.5",
- "styled-components": "^6.0.7",
- "web-vitals": "^2.1.4"
- }
- },
- "node_modules/@adobe/css-tools": {
- "version": "4.4.4",
- "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz",
- "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==",
- "license": "MIT"
- },
- "node_modules/@alloc/quick-lru": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
- "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@ampproject/remapping": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
- "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.24"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/code-frame": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
- "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.27.1",
- "js-tokens": "^4.0.0",
- "picocolors": "^1.1.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/compat-data": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz",
- "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/core": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz",
- "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.27.1",
- "@babel/generator": "^7.28.3",
- "@babel/helper-compilation-targets": "^7.27.2",
- "@babel/helper-module-transforms": "^7.28.3",
- "@babel/helpers": "^7.28.3",
- "@babel/parser": "^7.28.3",
- "@babel/template": "^7.27.2",
- "@babel/traverse": "^7.28.3",
- "@babel/types": "^7.28.2",
- "convert-source-map": "^2.0.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.2.3",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/babel"
- }
- },
- "node_modules/@babel/core/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/eslint-parser": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.0.tgz",
- "integrity": "sha512-N4ntErOlKvcbTt01rr5wj3y55xnIdx1ymrfIr8C2WnM1Y9glFgWaGDEULJIazOX3XM9NRzhfJ6zZnQ1sBNWU+w==",
- "license": "MIT",
- "dependencies": {
- "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1",
- "eslint-visitor-keys": "^2.1.0",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || >=14.0.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.11.0",
- "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0"
- }
- },
- "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
- "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@babel/eslint-parser/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/generator": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz",
- "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==",
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.28.3",
- "@babel/types": "^7.28.2",
- "@jridgewell/gen-mapping": "^0.3.12",
- "@jridgewell/trace-mapping": "^0.3.28",
- "jsesc": "^3.0.2"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-annotate-as-pure": {
- "version": "7.27.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz",
- "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==",
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.27.3"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-compilation-targets": {
- "version": "7.27.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
- "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^7.27.2",
- "@babel/helper-validator-option": "^7.27.1",
- "browserslist": "^4.24.0",
- "lru-cache": "^5.1.1",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/helper-create-class-features-plugin": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz",
- "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.27.3",
- "@babel/helper-member-expression-to-functions": "^7.27.1",
- "@babel/helper-optimise-call-expression": "^7.27.1",
- "@babel/helper-replace-supers": "^7.27.1",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
- "@babel/traverse": "^7.28.3",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/helper-create-regexp-features-plugin": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz",
- "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.27.1",
- "regexpu-core": "^6.2.0",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/helper-define-polyfill-provider": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz",
- "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-compilation-targets": "^7.27.2",
- "@babel/helper-plugin-utils": "^7.27.1",
- "debug": "^4.4.1",
- "lodash.debounce": "^4.0.8",
- "resolve": "^1.22.10"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/@babel/helper-globals": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
- "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-member-expression-to-functions": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz",
- "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==",
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.27.1",
- "@babel/types": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-imports": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
- "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.27.1",
- "@babel/types": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
- "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-imports": "^7.27.1",
- "@babel/helper-validator-identifier": "^7.27.1",
- "@babel/traverse": "^7.28.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-optimise-call-expression": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz",
- "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==",
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-plugin-utils": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
- "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-remap-async-to-generator": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz",
- "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.27.1",
- "@babel/helper-wrap-function": "^7.27.1",
- "@babel/traverse": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-replace-supers": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz",
- "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-member-expression-to-functions": "^7.27.1",
- "@babel/helper-optimise-call-expression": "^7.27.1",
- "@babel/traverse": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz",
- "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==",
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.27.1",
- "@babel/types": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "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/helper-validator-option": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
- "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-wrap-function": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz",
- "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==",
- "license": "MIT",
- "dependencies": {
- "@babel/template": "^7.27.2",
- "@babel/traverse": "^7.28.3",
- "@babel/types": "^7.28.2"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helpers": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz",
- "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==",
- "license": "MIT",
- "dependencies": {
- "@babel/template": "^7.27.2",
- "@babel/types": "^7.28.2"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/parser": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz",
- "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==",
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.28.2"
- },
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz",
- "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/traverse": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz",
- "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz",
- "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz",
- "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
- "@babel/plugin-transform-optional-chaining": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.13.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz",
- "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/traverse": "^7.28.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-proposal-class-properties": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz",
- "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==",
- "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.18.6",
- "@babel/helper-plugin-utils": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-decorators": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz",
- "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/plugin-syntax-decorators": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz",
- "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==",
- "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.18.6",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-numeric-separator": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz",
- "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==",
- "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.18.6",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-optional-chaining": {
- "version": "7.21.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz",
- "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==",
- "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.20.2",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-private-methods": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz",
- "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==",
- "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.18.6",
- "@babel/helper-plugin-utils": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-private-property-in-object": {
- "version": "7.21.0-placeholder-for-preset-env.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
- "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-async-generators": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
- "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-bigint": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
- "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-class-properties": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
- "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-class-static-block": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
- "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-decorators": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz",
- "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-flow": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz",
- "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-import-assertions": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz",
- "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-import-attributes": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz",
- "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-import-meta": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
- "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-json-strings": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
- "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-jsx": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz",
- "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
- "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
- "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-numeric-separator": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
- "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-object-rest-spread": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
- "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-optional-catch-binding": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
- "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-optional-chaining": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
- "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-private-property-in-object": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
- "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-top-level-await": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
- "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-typescript": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz",
- "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
- "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.18.6",
- "@babel/helper-plugin-utils": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-transform-arrow-functions": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz",
- "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-async-generator-functions": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz",
- "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/helper-remap-async-to-generator": "^7.27.1",
- "@babel/traverse": "^7.28.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-async-to-generator": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz",
- "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-imports": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/helper-remap-async-to-generator": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-block-scoped-functions": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz",
- "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-block-scoping": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz",
- "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-class-properties": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz",
- "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-class-static-block": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz",
- "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.28.3",
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.12.0"
- }
- },
- "node_modules/@babel/plugin-transform-classes": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz",
- "integrity": "sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.27.3",
- "@babel/helper-compilation-targets": "^7.27.2",
- "@babel/helper-globals": "^7.28.0",
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/helper-replace-supers": "^7.27.1",
- "@babel/traverse": "^7.28.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-computed-properties": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz",
- "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/template": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-destructuring": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz",
- "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/traverse": "^7.28.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-dotall-regex": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz",
- "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-duplicate-keys": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz",
- "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz",
- "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-transform-dynamic-import": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz",
- "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-explicit-resource-management": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz",
- "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/plugin-transform-destructuring": "^7.28.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-exponentiation-operator": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz",
- "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-export-namespace-from": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz",
- "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-flow-strip-types": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz",
- "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/plugin-syntax-flow": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-for-of": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz",
- "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-function-name": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz",
- "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-compilation-targets": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/traverse": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-json-strings": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz",
- "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-literals": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz",
- "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-logical-assignment-operators": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz",
- "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-member-expression-literals": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz",
- "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-amd": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz",
- "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-commonjs": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz",
- "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-systemjs": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz",
- "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/helper-validator-identifier": "^7.27.1",
- "@babel/traverse": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-umd": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz",
- "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz",
- "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-transform-new-target": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz",
- "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz",
- "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-numeric-separator": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz",
- "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-object-rest-spread": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz",
- "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-compilation-targets": "^7.27.2",
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/plugin-transform-destructuring": "^7.28.0",
- "@babel/plugin-transform-parameters": "^7.27.7",
- "@babel/traverse": "^7.28.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-object-super": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz",
- "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/helper-replace-supers": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-optional-catch-binding": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz",
- "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-optional-chaining": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz",
- "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-parameters": {
- "version": "7.27.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz",
- "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-private-methods": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz",
- "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-private-property-in-object": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz",
- "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.27.1",
- "@babel/helper-create-class-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-property-literals": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz",
- "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-constant-elements": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz",
- "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-display-name": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz",
- "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz",
- "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.27.1",
- "@babel/helper-module-imports": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/plugin-syntax-jsx": "^7.27.1",
- "@babel/types": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx-development": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz",
- "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==",
- "license": "MIT",
- "dependencies": {
- "@babel/plugin-transform-react-jsx": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-pure-annotations": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz",
- "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-regenerator": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz",
- "integrity": "sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-regexp-modifiers": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz",
- "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-transform-reserved-words": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz",
- "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-runtime": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz",
- "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-imports": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1",
- "babel-plugin-polyfill-corejs2": "^0.4.14",
- "babel-plugin-polyfill-corejs3": "^0.13.0",
- "babel-plugin-polyfill-regenerator": "^0.6.5",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-runtime/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/plugin-transform-shorthand-properties": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz",
- "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-spread": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz",
- "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-sticky-regex": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz",
- "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-template-literals": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz",
- "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-typeof-symbol": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz",
- "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-typescript": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz",
- "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.27.3",
- "@babel/helper-create-class-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
- "@babel/plugin-syntax-typescript": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-escapes": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz",
- "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-property-regex": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz",
- "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-regex": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz",
- "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-sets-regex": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz",
- "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/preset-env": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz",
- "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==",
- "license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^7.28.0",
- "@babel/helper-compilation-targets": "^7.27.2",
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/helper-validator-option": "^7.27.1",
- "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1",
- "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1",
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1",
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1",
- "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3",
- "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
- "@babel/plugin-syntax-import-assertions": "^7.27.1",
- "@babel/plugin-syntax-import-attributes": "^7.27.1",
- "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
- "@babel/plugin-transform-arrow-functions": "^7.27.1",
- "@babel/plugin-transform-async-generator-functions": "^7.28.0",
- "@babel/plugin-transform-async-to-generator": "^7.27.1",
- "@babel/plugin-transform-block-scoped-functions": "^7.27.1",
- "@babel/plugin-transform-block-scoping": "^7.28.0",
- "@babel/plugin-transform-class-properties": "^7.27.1",
- "@babel/plugin-transform-class-static-block": "^7.28.3",
- "@babel/plugin-transform-classes": "^7.28.3",
- "@babel/plugin-transform-computed-properties": "^7.27.1",
- "@babel/plugin-transform-destructuring": "^7.28.0",
- "@babel/plugin-transform-dotall-regex": "^7.27.1",
- "@babel/plugin-transform-duplicate-keys": "^7.27.1",
- "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1",
- "@babel/plugin-transform-dynamic-import": "^7.27.1",
- "@babel/plugin-transform-explicit-resource-management": "^7.28.0",
- "@babel/plugin-transform-exponentiation-operator": "^7.27.1",
- "@babel/plugin-transform-export-namespace-from": "^7.27.1",
- "@babel/plugin-transform-for-of": "^7.27.1",
- "@babel/plugin-transform-function-name": "^7.27.1",
- "@babel/plugin-transform-json-strings": "^7.27.1",
- "@babel/plugin-transform-literals": "^7.27.1",
- "@babel/plugin-transform-logical-assignment-operators": "^7.27.1",
- "@babel/plugin-transform-member-expression-literals": "^7.27.1",
- "@babel/plugin-transform-modules-amd": "^7.27.1",
- "@babel/plugin-transform-modules-commonjs": "^7.27.1",
- "@babel/plugin-transform-modules-systemjs": "^7.27.1",
- "@babel/plugin-transform-modules-umd": "^7.27.1",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1",
- "@babel/plugin-transform-new-target": "^7.27.1",
- "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1",
- "@babel/plugin-transform-numeric-separator": "^7.27.1",
- "@babel/plugin-transform-object-rest-spread": "^7.28.0",
- "@babel/plugin-transform-object-super": "^7.27.1",
- "@babel/plugin-transform-optional-catch-binding": "^7.27.1",
- "@babel/plugin-transform-optional-chaining": "^7.27.1",
- "@babel/plugin-transform-parameters": "^7.27.7",
- "@babel/plugin-transform-private-methods": "^7.27.1",
- "@babel/plugin-transform-private-property-in-object": "^7.27.1",
- "@babel/plugin-transform-property-literals": "^7.27.1",
- "@babel/plugin-transform-regenerator": "^7.28.3",
- "@babel/plugin-transform-regexp-modifiers": "^7.27.1",
- "@babel/plugin-transform-reserved-words": "^7.27.1",
- "@babel/plugin-transform-shorthand-properties": "^7.27.1",
- "@babel/plugin-transform-spread": "^7.27.1",
- "@babel/plugin-transform-sticky-regex": "^7.27.1",
- "@babel/plugin-transform-template-literals": "^7.27.1",
- "@babel/plugin-transform-typeof-symbol": "^7.27.1",
- "@babel/plugin-transform-unicode-escapes": "^7.27.1",
- "@babel/plugin-transform-unicode-property-regex": "^7.27.1",
- "@babel/plugin-transform-unicode-regex": "^7.27.1",
- "@babel/plugin-transform-unicode-sets-regex": "^7.27.1",
- "@babel/preset-modules": "0.1.6-no-external-plugins",
- "babel-plugin-polyfill-corejs2": "^0.4.14",
- "babel-plugin-polyfill-corejs3": "^0.13.0",
- "babel-plugin-polyfill-regenerator": "^0.6.5",
- "core-js-compat": "^3.43.0",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/preset-env/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/preset-modules": {
- "version": "0.1.6-no-external-plugins",
- "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
- "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/types": "^7.4.4",
- "esutils": "^2.0.2"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/@babel/preset-react": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz",
- "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/helper-validator-option": "^7.27.1",
- "@babel/plugin-transform-react-display-name": "^7.27.1",
- "@babel/plugin-transform-react-jsx": "^7.27.1",
- "@babel/plugin-transform-react-jsx-development": "^7.27.1",
- "@babel/plugin-transform-react-pure-annotations": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/preset-typescript": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz",
- "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/helper-validator-option": "^7.27.1",
- "@babel/plugin-syntax-jsx": "^7.27.1",
- "@babel/plugin-transform-modules-commonjs": "^7.27.1",
- "@babel/plugin-transform-typescript": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/runtime": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz",
- "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/template": {
- "version": "7.27.2",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
- "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.27.1",
- "@babel/parser": "^7.27.2",
- "@babel/types": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz",
- "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.27.1",
- "@babel/generator": "^7.28.3",
- "@babel/helper-globals": "^7.28.0",
- "@babel/parser": "^7.28.3",
- "@babel/template": "^7.27.2",
- "@babel/types": "^7.28.2",
- "debug": "^4.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/types": {
- "version": "7.28.2",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz",
- "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-string-parser": "^7.27.1",
- "@babel/helper-validator-identifier": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@bcoe/v8-coverage": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
- "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
- "license": "MIT"
- },
- "node_modules/@csstools/normalize.css": {
- "version": "12.1.1",
- "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz",
- "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==",
- "license": "CC0-1.0"
- },
- "node_modules/@csstools/postcss-cascade-layers": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz",
- "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==",
- "license": "CC0-1.0",
- "dependencies": {
- "@csstools/selector-specificity": "^2.0.2",
- "postcss-selector-parser": "^6.0.10"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/@csstools/postcss-color-function": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz",
- "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==",
- "license": "CC0-1.0",
- "dependencies": {
- "@csstools/postcss-progressive-custom-properties": "^1.1.0",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/@csstools/postcss-font-format-keywords": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz",
- "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==",
- "license": "CC0-1.0",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/@csstools/postcss-hwb-function": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz",
- "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==",
- "license": "CC0-1.0",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/@csstools/postcss-ic-unit": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz",
- "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==",
- "license": "CC0-1.0",
- "dependencies": {
- "@csstools/postcss-progressive-custom-properties": "^1.1.0",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/@csstools/postcss-is-pseudo-class": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz",
- "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==",
- "license": "CC0-1.0",
- "dependencies": {
- "@csstools/selector-specificity": "^2.0.0",
- "postcss-selector-parser": "^6.0.10"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/@csstools/postcss-nested-calc": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz",
- "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==",
- "license": "CC0-1.0",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/@csstools/postcss-normalize-display-values": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz",
- "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==",
- "license": "CC0-1.0",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/@csstools/postcss-oklab-function": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz",
- "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==",
- "license": "CC0-1.0",
- "dependencies": {
- "@csstools/postcss-progressive-custom-properties": "^1.1.0",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/@csstools/postcss-progressive-custom-properties": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz",
- "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==",
- "license": "CC0-1.0",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/@csstools/postcss-stepped-value-functions": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz",
- "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==",
- "license": "CC0-1.0",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/@csstools/postcss-text-decoration-shorthand": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz",
- "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==",
- "license": "CC0-1.0",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/@csstools/postcss-trigonometric-functions": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz",
- "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==",
- "license": "CC0-1.0",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/@csstools/postcss-unset-value": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz",
- "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==",
- "license": "CC0-1.0",
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/@csstools/selector-specificity": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz",
- "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==",
- "license": "CC0-1.0",
- "engines": {
- "node": "^14 || ^16 || >=18"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss-selector-parser": "^6.0.10"
- }
- },
- "node_modules/@emotion/is-prop-valid": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz",
- "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==",
- "license": "MIT",
- "dependencies": {
- "@emotion/memoize": "^0.8.1"
- }
- },
- "node_modules/@emotion/memoize": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
- "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==",
- "license": "MIT"
- },
- "node_modules/@emotion/unitless": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
- "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==",
- "license": "MIT"
- },
- "node_modules/@eslint-community/eslint-utils": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
- "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
- "license": "MIT",
- "dependencies": {
- "eslint-visitor-keys": "^3.4.3"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
- }
- },
- "node_modules/@eslint-community/regexpp": {
- "version": "4.12.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
- "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
- "license": "MIT",
- "engines": {
- "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
- }
- },
- "node_modules/@eslint/eslintrc": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
- "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
- "license": "MIT",
- "dependencies": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^9.6.0",
- "globals": "^13.19.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@eslint/eslintrc/node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "license": "Python-2.0"
- },
- "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "license": "MIT",
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/@eslint/js": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
- "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
- "license": "MIT",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- }
- },
- "node_modules/@humanwhocodes/config-array": {
- "version": "0.13.0",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
- "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
- "deprecated": "Use @eslint/config-array instead",
- "license": "Apache-2.0",
- "dependencies": {
- "@humanwhocodes/object-schema": "^2.0.3",
- "debug": "^4.3.1",
- "minimatch": "^3.0.5"
- },
- "engines": {
- "node": ">=10.10.0"
- }
- },
- "node_modules/@humanwhocodes/module-importer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">=12.22"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@humanwhocodes/object-schema": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
- "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
- "deprecated": "Use @eslint/object-schema instead",
- "license": "BSD-3-Clause"
- },
- "node_modules/@isaacs/cliui": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
- "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
- "license": "ISC",
- "dependencies": {
- "string-width": "^5.1.2",
- "string-width-cjs": "npm:string-width@^4.2.0",
- "strip-ansi": "^7.0.1",
- "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
- "wrap-ansi": "^8.1.0",
- "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz",
- "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==",
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
- }
- },
- "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@isaacs/cliui/node_modules/string-width": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
- "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
- "license": "MIT",
- "dependencies": {
- "eastasianwidth": "^0.2.0",
- "emoji-regex": "^9.2.2",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
- "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
- "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^6.1.0",
- "string-width": "^5.0.1",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/@istanbuljs/load-nyc-config": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
- "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
- "license": "ISC",
- "dependencies": {
- "camelcase": "^5.3.1",
- "find-up": "^4.1.0",
- "get-package-type": "^0.1.0",
- "js-yaml": "^3.13.1",
- "resolve-from": "^5.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@istanbuljs/schema": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
- "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@jest/console": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz",
- "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "jest-message-util": "^27.5.1",
- "jest-util": "^27.5.1",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/console/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/console/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/@jest/console/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/@jest/console/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@jest/console/node_modules/jest-message-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
- "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@jest/types": "^27.5.1",
- "@types/stack-utils": "^2.0.0",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "micromatch": "^4.0.4",
- "pretty-format": "^27.5.1",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/console/node_modules/jest-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
- "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/console/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/@jest/core": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz",
- "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==",
- "license": "MIT",
- "dependencies": {
- "@jest/console": "^27.5.1",
- "@jest/reporters": "^27.5.1",
- "@jest/test-result": "^27.5.1",
- "@jest/transform": "^27.5.1",
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "ansi-escapes": "^4.2.1",
- "chalk": "^4.0.0",
- "emittery": "^0.8.1",
- "exit": "^0.1.2",
- "graceful-fs": "^4.2.9",
- "jest-changed-files": "^27.5.1",
- "jest-config": "^27.5.1",
- "jest-haste-map": "^27.5.1",
- "jest-message-util": "^27.5.1",
- "jest-regex-util": "^27.5.1",
- "jest-resolve": "^27.5.1",
- "jest-resolve-dependencies": "^27.5.1",
- "jest-runner": "^27.5.1",
- "jest-runtime": "^27.5.1",
- "jest-snapshot": "^27.5.1",
- "jest-util": "^27.5.1",
- "jest-validate": "^27.5.1",
- "jest-watcher": "^27.5.1",
- "micromatch": "^4.0.4",
- "rimraf": "^3.0.0",
- "slash": "^3.0.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
- }
- },
- "node_modules/@jest/core/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/core/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/@jest/core/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/@jest/core/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@jest/core/node_modules/jest-message-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
- "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@jest/types": "^27.5.1",
- "@types/stack-utils": "^2.0.0",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "micromatch": "^4.0.4",
- "pretty-format": "^27.5.1",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/core/node_modules/jest-regex-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
- "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
- "license": "MIT",
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/core/node_modules/jest-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
- "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/core/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/@jest/diff-sequences": {
- "version": "30.0.1",
- "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz",
- "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==",
- "license": "MIT",
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/@jest/environment": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz",
- "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==",
- "license": "MIT",
- "dependencies": {
- "@jest/fake-timers": "^27.5.1",
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "jest-mock": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/environment/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/environment/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/@jest/environment/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/@jest/environment/node_modules/jest-mock": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
- "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/expect-utils": {
- "version": "30.1.2",
- "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.1.2.tgz",
- "integrity": "sha512-HXy1qT/bfdjCv7iC336ExbqqYtZvljrV8odNdso7dWK9bSeHtLlvwWWC3YSybSPL03Gg5rug6WLCZAZFH72m0A==",
- "license": "MIT",
- "dependencies": {
- "@jest/get-type": "30.1.0"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/@jest/fake-timers": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz",
- "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@sinonjs/fake-timers": "^8.0.1",
- "@types/node": "*",
- "jest-message-util": "^27.5.1",
- "jest-mock": "^27.5.1",
- "jest-util": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/fake-timers/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/fake-timers/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/@jest/fake-timers/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/@jest/fake-timers/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@jest/fake-timers/node_modules/jest-message-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
- "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@jest/types": "^27.5.1",
- "@types/stack-utils": "^2.0.0",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "micromatch": "^4.0.4",
- "pretty-format": "^27.5.1",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/fake-timers/node_modules/jest-mock": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
- "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/fake-timers/node_modules/jest-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
- "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/fake-timers/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/@jest/get-type": {
- "version": "30.1.0",
- "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz",
- "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==",
- "license": "MIT",
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/@jest/globals": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz",
- "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==",
- "license": "MIT",
- "dependencies": {
- "@jest/environment": "^27.5.1",
- "@jest/types": "^27.5.1",
- "expect": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/globals/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/globals/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/@jest/globals/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/@jest/globals/node_modules/expect": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
- "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "jest-get-type": "^27.5.1",
- "jest-matcher-utils": "^27.5.1",
- "jest-message-util": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/globals/node_modules/jest-diff": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz",
- "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==",
- "license": "MIT",
- "dependencies": {
- "chalk": "^4.0.0",
- "diff-sequences": "^27.5.1",
- "jest-get-type": "^27.5.1",
- "pretty-format": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/globals/node_modules/jest-matcher-utils": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz",
- "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==",
- "license": "MIT",
- "dependencies": {
- "chalk": "^4.0.0",
- "jest-diff": "^27.5.1",
- "jest-get-type": "^27.5.1",
- "pretty-format": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/globals/node_modules/jest-message-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
- "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@jest/types": "^27.5.1",
- "@types/stack-utils": "^2.0.0",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "micromatch": "^4.0.4",
- "pretty-format": "^27.5.1",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/pattern": {
- "version": "30.0.1",
- "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz",
- "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "jest-regex-util": "30.0.1"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/@jest/reporters": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz",
- "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==",
- "license": "MIT",
- "dependencies": {
- "@bcoe/v8-coverage": "^0.2.3",
- "@jest/console": "^27.5.1",
- "@jest/test-result": "^27.5.1",
- "@jest/transform": "^27.5.1",
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "collect-v8-coverage": "^1.0.0",
- "exit": "^0.1.2",
- "glob": "^7.1.2",
- "graceful-fs": "^4.2.9",
- "istanbul-lib-coverage": "^3.0.0",
- "istanbul-lib-instrument": "^5.1.0",
- "istanbul-lib-report": "^3.0.0",
- "istanbul-lib-source-maps": "^4.0.0",
- "istanbul-reports": "^3.1.3",
- "jest-haste-map": "^27.5.1",
- "jest-resolve": "^27.5.1",
- "jest-util": "^27.5.1",
- "jest-worker": "^27.5.1",
- "slash": "^3.0.0",
- "source-map": "^0.6.0",
- "string-length": "^4.0.1",
- "terminal-link": "^2.0.0",
- "v8-to-istanbul": "^8.1.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
- }
- },
- "node_modules/@jest/reporters/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/reporters/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/@jest/reporters/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/@jest/reporters/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@jest/reporters/node_modules/jest-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
- "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/reporters/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/@jest/reporters/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@jest/schemas": {
- "version": "30.0.5",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz",
- "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==",
- "license": "MIT",
- "dependencies": {
- "@sinclair/typebox": "^0.34.0"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/@jest/source-map": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz",
- "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==",
- "license": "MIT",
- "dependencies": {
- "callsites": "^3.0.0",
- "graceful-fs": "^4.2.9",
- "source-map": "^0.6.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/source-map/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@jest/test-result": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz",
- "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==",
- "license": "MIT",
- "dependencies": {
- "@jest/console": "^27.5.1",
- "@jest/types": "^27.5.1",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "collect-v8-coverage": "^1.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/test-result/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/test-result/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/@jest/test-result/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/@jest/test-sequencer": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz",
- "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==",
- "license": "MIT",
- "dependencies": {
- "@jest/test-result": "^27.5.1",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^27.5.1",
- "jest-runtime": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/transform": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz",
- "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==",
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.1.0",
- "@jest/types": "^27.5.1",
- "babel-plugin-istanbul": "^6.1.1",
- "chalk": "^4.0.0",
- "convert-source-map": "^1.4.0",
- "fast-json-stable-stringify": "^2.0.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^27.5.1",
- "jest-regex-util": "^27.5.1",
- "jest-util": "^27.5.1",
- "micromatch": "^4.0.4",
- "pirates": "^4.0.4",
- "slash": "^3.0.0",
- "source-map": "^0.6.1",
- "write-file-atomic": "^3.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/transform/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/transform/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/@jest/transform/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/@jest/transform/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@jest/transform/node_modules/convert-source-map": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
- "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
- "license": "MIT"
- },
- "node_modules/@jest/transform/node_modules/jest-regex-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
- "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
- "license": "MIT",
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/transform/node_modules/jest-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
- "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/@jest/transform/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/@jest/transform/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@jest/types": {
- "version": "30.0.5",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.5.tgz",
- "integrity": "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==",
- "license": "MIT",
- "dependencies": {
- "@jest/pattern": "30.0.1",
- "@jest/schemas": "30.0.5",
- "@types/istanbul-lib-coverage": "^2.0.6",
- "@types/istanbul-reports": "^3.0.4",
- "@types/node": "*",
- "@types/yargs": "^17.0.33",
- "chalk": "^4.1.2"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/@jest/types/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
- "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/source-map": {
- "version": "0.3.11",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz",
- "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.25"
- }
- },
- "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/@jridgewell/trace-mapping": {
- "version": "0.3.30",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz",
- "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@leichtgewicht/ip-codec": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz",
- "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==",
- "license": "MIT"
- },
- "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
- "version": "5.1.1-v1",
- "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
- "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==",
- "license": "MIT",
- "dependencies": {
- "eslint-scope": "5.1.1"
- }
- },
- "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@pkgjs/parseargs": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
- "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@pmmmwh/react-refresh-webpack-plugin": {
- "version": "0.5.17",
- "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.17.tgz",
- "integrity": "sha512-tXDyE1/jzFsHXjhRZQ3hMl0IVhYe5qula43LDWIhVfjp9G/nT5OQY5AORVOrkEGAUltBJOfOWeETbmhm6kHhuQ==",
- "license": "MIT",
- "dependencies": {
- "ansi-html": "^0.0.9",
- "core-js-pure": "^3.23.3",
- "error-stack-parser": "^2.0.6",
- "html-entities": "^2.1.0",
- "loader-utils": "^2.0.4",
- "schema-utils": "^4.2.0",
- "source-map": "^0.7.3"
- },
- "engines": {
- "node": ">= 10.13"
- },
- "peerDependencies": {
- "@types/webpack": "4.x || 5.x",
- "react-refresh": ">=0.10.0 <1.0.0",
- "sockjs-client": "^1.4.0",
- "type-fest": ">=0.17.0 <5.0.0",
- "webpack": ">=4.43.0 <6.0.0",
- "webpack-dev-server": "3.x || 4.x || 5.x",
- "webpack-hot-middleware": "2.x",
- "webpack-plugin-serve": "0.x || 1.x"
- },
- "peerDependenciesMeta": {
- "@types/webpack": {
- "optional": true
- },
- "sockjs-client": {
- "optional": true
- },
- "type-fest": {
- "optional": true
- },
- "webpack-dev-server": {
- "optional": true
- },
- "webpack-hot-middleware": {
- "optional": true
- },
- "webpack-plugin-serve": {
- "optional": true
- }
- }
- },
- "node_modules/@remix-run/router": {
- "version": "1.23.0",
- "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz",
- "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==",
- "license": "MIT",
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/@rollup/plugin-babel": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
- "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-imports": "^7.10.4",
- "@rollup/pluginutils": "^3.1.0"
- },
- "engines": {
- "node": ">= 10.0.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0",
- "@types/babel__core": "^7.1.9",
- "rollup": "^1.20.0||^2.0.0"
- },
- "peerDependenciesMeta": {
- "@types/babel__core": {
- "optional": true
- }
- }
- },
- "node_modules/@rollup/plugin-node-resolve": {
- "version": "11.2.1",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz",
- "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==",
- "license": "MIT",
- "dependencies": {
- "@rollup/pluginutils": "^3.1.0",
- "@types/resolve": "1.17.1",
- "builtin-modules": "^3.1.0",
- "deepmerge": "^4.2.2",
- "is-module": "^1.0.0",
- "resolve": "^1.19.0"
- },
- "engines": {
- "node": ">= 10.0.0"
- },
- "peerDependencies": {
- "rollup": "^1.20.0||^2.0.0"
- }
- },
- "node_modules/@rollup/plugin-replace": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz",
- "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==",
- "license": "MIT",
- "dependencies": {
- "@rollup/pluginutils": "^3.1.0",
- "magic-string": "^0.25.7"
- },
- "peerDependencies": {
- "rollup": "^1.20.0 || ^2.0.0"
- }
- },
- "node_modules/@rollup/pluginutils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
- "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "0.0.39",
- "estree-walker": "^1.0.1",
- "picomatch": "^2.2.2"
- },
- "engines": {
- "node": ">= 8.0.0"
- },
- "peerDependencies": {
- "rollup": "^1.20.0||^2.0.0"
- }
- },
- "node_modules/@rollup/pluginutils/node_modules/@types/estree": {
- "version": "0.0.39",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
- "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
- "license": "MIT"
- },
- "node_modules/@rollup/pluginutils/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/@rtsao/scc": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
- "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
- "license": "MIT"
- },
- "node_modules/@rushstack/eslint-patch": {
- "version": "1.12.0",
- "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.12.0.tgz",
- "integrity": "sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==",
- "license": "MIT"
- },
- "node_modules/@sinclair/typebox": {
- "version": "0.34.41",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz",
- "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==",
- "license": "MIT"
- },
- "node_modules/@sinonjs/commons": {
- "version": "1.8.6",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
- "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "type-detect": "4.0.8"
- }
- },
- "node_modules/@sinonjs/fake-timers": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz",
- "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "@sinonjs/commons": "^1.7.0"
- }
- },
- "node_modules/@surma/rollup-plugin-off-main-thread": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz",
- "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "ejs": "^3.1.6",
- "json5": "^2.2.0",
- "magic-string": "^0.25.0",
- "string.prototype.matchall": "^4.0.6"
- }
- },
- "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz",
- "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz",
- "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz",
- "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz",
- "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz",
- "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz",
- "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz",
- "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@svgr/babel-plugin-transform-svg-component": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz",
- "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@svgr/babel-preset": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz",
- "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==",
- "license": "MIT",
- "dependencies": {
- "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0",
- "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0",
- "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1",
- "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1",
- "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0",
- "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0",
- "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0",
- "@svgr/babel-plugin-transform-svg-component": "^5.5.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@svgr/core": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz",
- "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==",
- "license": "MIT",
- "dependencies": {
- "@svgr/plugin-jsx": "^5.5.0",
- "camelcase": "^6.2.0",
- "cosmiconfig": "^7.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@svgr/hast-util-to-babel-ast": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz",
- "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.12.6"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@svgr/plugin-jsx": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz",
- "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==",
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.12.3",
- "@svgr/babel-preset": "^5.5.0",
- "@svgr/hast-util-to-babel-ast": "^5.5.0",
- "svg-parser": "^2.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@svgr/plugin-svgo": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz",
- "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==",
- "license": "MIT",
- "dependencies": {
- "cosmiconfig": "^7.0.0",
- "deepmerge": "^4.2.2",
- "svgo": "^1.2.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@svgr/webpack": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz",
- "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==",
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.12.3",
- "@babel/plugin-transform-react-constant-elements": "^7.12.1",
- "@babel/preset-env": "^7.12.1",
- "@babel/preset-react": "^7.12.5",
- "@svgr/core": "^5.5.0",
- "@svgr/plugin-jsx": "^5.5.0",
- "@svgr/plugin-svgo": "^5.5.0",
- "loader-utils": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@testing-library/dom": {
- "version": "10.4.1",
- "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz",
- "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "@babel/code-frame": "^7.10.4",
- "@babel/runtime": "^7.12.5",
- "@types/aria-query": "^5.0.1",
- "aria-query": "5.3.0",
- "dom-accessibility-api": "^0.5.9",
- "lz-string": "^1.5.0",
- "picocolors": "1.1.1",
- "pretty-format": "^27.0.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@testing-library/jest-dom": {
- "version": "5.17.0",
- "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz",
- "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==",
- "license": "MIT",
- "dependencies": {
- "@adobe/css-tools": "^4.0.1",
- "@babel/runtime": "^7.9.2",
- "@types/testing-library__jest-dom": "^5.9.1",
- "aria-query": "^5.0.0",
- "chalk": "^3.0.0",
- "css.escape": "^1.5.1",
- "dom-accessibility-api": "^0.5.6",
- "lodash": "^4.17.15",
- "redent": "^3.0.0"
- },
- "engines": {
- "node": ">=8",
- "npm": ">=6",
- "yarn": ">=1"
- }
- },
- "node_modules/@testing-library/react": {
- "version": "13.4.0",
- "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz",
- "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.12.5",
- "@testing-library/dom": "^8.5.0",
- "@types/react-dom": "^18.0.0"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- }
- },
- "node_modules/@testing-library/react/node_modules/@testing-library/dom": {
- "version": "8.20.1",
- "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz",
- "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.10.4",
- "@babel/runtime": "^7.12.5",
- "@types/aria-query": "^5.0.1",
- "aria-query": "5.1.3",
- "chalk": "^4.1.0",
- "dom-accessibility-api": "^0.5.9",
- "lz-string": "^1.5.0",
- "pretty-format": "^27.0.2"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@testing-library/react/node_modules/aria-query": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz",
- "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "deep-equal": "^2.0.5"
- }
- },
- "node_modules/@testing-library/react/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/@testing-library/user-event": {
- "version": "14.6.1",
- "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz",
- "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==",
- "license": "MIT",
- "engines": {
- "node": ">=12",
- "npm": ">=6"
- },
- "peerDependencies": {
- "@testing-library/dom": ">=7.21.4"
- }
- },
- "node_modules/@tootallnate/once": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
- "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/@trysound/sax": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
- "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
- "license": "ISC",
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/@types/aria-query": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
- "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==",
- "license": "MIT"
- },
- "node_modules/@types/babel__core": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
- "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.20.7",
- "@babel/types": "^7.20.7",
- "@types/babel__generator": "*",
- "@types/babel__template": "*",
- "@types/babel__traverse": "*"
- }
- },
- "node_modules/@types/babel__generator": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
- "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__template": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
- "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__traverse": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
- "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.28.2"
- }
- },
- "node_modules/@types/body-parser": {
- "version": "1.19.6",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
- "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==",
- "license": "MIT",
- "dependencies": {
- "@types/connect": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/bonjour": {
- "version": "3.5.13",
- "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz",
- "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/connect": {
- "version": "3.4.38",
- "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
- "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/connect-history-api-fallback": {
- "version": "1.5.4",
- "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz",
- "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==",
- "license": "MIT",
- "dependencies": {
- "@types/express-serve-static-core": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/eslint": {
- "version": "8.56.12",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz",
- "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "*",
- "@types/json-schema": "*"
- }
- },
- "node_modules/@types/eslint-scope": {
- "version": "3.7.7",
- "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
- "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
- "license": "MIT",
- "dependencies": {
- "@types/eslint": "*",
- "@types/estree": "*"
- }
- },
- "node_modules/@types/estree": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
- "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
- "license": "MIT"
- },
- "node_modules/@types/express": {
- "version": "4.17.23",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz",
- "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==",
- "license": "MIT",
- "dependencies": {
- "@types/body-parser": "*",
- "@types/express-serve-static-core": "^4.17.33",
- "@types/qs": "*",
- "@types/serve-static": "*"
- }
- },
- "node_modules/@types/express-serve-static-core": {
- "version": "5.0.7",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz",
- "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "@types/qs": "*",
- "@types/range-parser": "*",
- "@types/send": "*"
- }
- },
- "node_modules/@types/express/node_modules/@types/express-serve-static-core": {
- "version": "4.19.6",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz",
- "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "@types/qs": "*",
- "@types/range-parser": "*",
- "@types/send": "*"
- }
- },
- "node_modules/@types/graceful-fs": {
- "version": "4.1.9",
- "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
- "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/html-minifier-terser": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
- "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==",
- "license": "MIT"
- },
- "node_modules/@types/http-errors": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz",
- "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==",
- "license": "MIT"
- },
- "node_modules/@types/http-proxy": {
- "version": "1.17.16",
- "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz",
- "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/istanbul-lib-coverage": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
- "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
- "license": "MIT"
- },
- "node_modules/@types/istanbul-lib-report": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
- "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "*"
- }
- },
- "node_modules/@types/istanbul-reports": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
- "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-report": "*"
- }
- },
- "node_modules/@types/jest": {
- "version": "30.0.0",
- "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz",
- "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==",
- "license": "MIT",
- "dependencies": {
- "expect": "^30.0.0",
- "pretty-format": "^30.0.0"
- }
- },
- "node_modules/@types/jest/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@types/jest/node_modules/pretty-format": {
- "version": "30.0.5",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz",
- "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==",
- "license": "MIT",
- "dependencies": {
- "@jest/schemas": "30.0.5",
- "ansi-styles": "^5.2.0",
- "react-is": "^18.3.1"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/@types/jest/node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "license": "MIT"
- },
- "node_modules/@types/json-schema": {
- "version": "7.0.15",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
- "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
- "license": "MIT"
- },
- "node_modules/@types/json5": {
- "version": "0.0.29",
- "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
- "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
- "license": "MIT"
- },
- "node_modules/@types/mime": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
- "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
- "license": "MIT"
- },
- "node_modules/@types/node": {
- "version": "24.3.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz",
- "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==",
- "license": "MIT",
- "dependencies": {
- "undici-types": "~7.10.0"
- }
- },
- "node_modules/@types/node-forge": {
- "version": "1.3.14",
- "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz",
- "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/parse-json": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
- "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
- "license": "MIT"
- },
- "node_modules/@types/prettier": {
- "version": "2.7.3",
- "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz",
- "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==",
- "license": "MIT"
- },
- "node_modules/@types/prop-types": {
- "version": "15.7.15",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
- "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
- "license": "MIT"
- },
- "node_modules/@types/q": {
- "version": "1.5.8",
- "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz",
- "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==",
- "license": "MIT"
- },
- "node_modules/@types/qs": {
- "version": "6.14.0",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz",
- "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
- "license": "MIT"
- },
- "node_modules/@types/range-parser": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
- "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
- "license": "MIT"
- },
- "node_modules/@types/react": {
- "version": "18.3.24",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.24.tgz",
- "integrity": "sha512-0dLEBsA1kI3OezMBF8nSsb7Nk19ZnsyE1LLhB8r27KbgU5H4pvuqZLdtE+aUkJVoXgTVuA+iLIwmZ0TuK4tx6A==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "@types/prop-types": "*",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/@types/react-dom": {
- "version": "18.3.7",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz",
- "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "^18.0.0"
- }
- },
- "node_modules/@types/resolve": {
- "version": "1.17.1",
- "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
- "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/retry": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
- "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
- "license": "MIT"
- },
- "node_modules/@types/semver": {
- "version": "7.7.0",
- "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz",
- "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==",
- "license": "MIT"
- },
- "node_modules/@types/send": {
- "version": "0.17.5",
- "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz",
- "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==",
- "license": "MIT",
- "dependencies": {
- "@types/mime": "^1",
- "@types/node": "*"
- }
- },
- "node_modules/@types/serve-index": {
- "version": "1.9.4",
- "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz",
- "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==",
- "license": "MIT",
- "dependencies": {
- "@types/express": "*"
- }
- },
- "node_modules/@types/serve-static": {
- "version": "1.15.8",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz",
- "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==",
- "license": "MIT",
- "dependencies": {
- "@types/http-errors": "*",
- "@types/node": "*",
- "@types/send": "*"
- }
- },
- "node_modules/@types/sockjs": {
- "version": "0.3.36",
- "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
- "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/stack-utils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
- "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
- "license": "MIT"
- },
- "node_modules/@types/stylis": {
- "version": "4.2.5",
- "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz",
- "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==",
- "license": "MIT"
- },
- "node_modules/@types/testing-library__jest-dom": {
- "version": "5.14.9",
- "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz",
- "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==",
- "license": "MIT",
- "dependencies": {
- "@types/jest": "*"
- }
- },
- "node_modules/@types/trusted-types": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
- "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
- "license": "MIT"
- },
- "node_modules/@types/ws": {
- "version": "8.18.1",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
- "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/yargs": {
- "version": "17.0.33",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
- "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/@types/yargs-parser": {
- "version": "21.0.3",
- "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
- "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
- "license": "MIT"
- },
- "node_modules/@typescript-eslint/eslint-plugin": {
- "version": "5.62.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz",
- "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "@eslint-community/regexpp": "^4.4.0",
- "@typescript-eslint/scope-manager": "5.62.0",
- "@typescript-eslint/type-utils": "5.62.0",
- "@typescript-eslint/utils": "5.62.0",
- "debug": "^4.3.4",
- "graphemer": "^1.4.0",
- "ignore": "^5.2.0",
- "natural-compare-lite": "^1.4.0",
- "semver": "^7.3.7",
- "tsutils": "^3.21.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "@typescript-eslint/parser": "^5.0.0",
- "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/experimental-utils": {
- "version": "5.62.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz",
- "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==",
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/utils": "5.62.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/@typescript-eslint/parser": {
- "version": "5.62.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz",
- "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==",
- "license": "BSD-2-Clause",
- "peer": true,
- "dependencies": {
- "@typescript-eslint/scope-manager": "5.62.0",
- "@typescript-eslint/types": "5.62.0",
- "@typescript-eslint/typescript-estree": "5.62.0",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/scope-manager": {
- "version": "5.62.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz",
- "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==",
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "5.62.0",
- "@typescript-eslint/visitor-keys": "5.62.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/type-utils": {
- "version": "5.62.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz",
- "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==",
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/typescript-estree": "5.62.0",
- "@typescript-eslint/utils": "5.62.0",
- "debug": "^4.3.4",
- "tsutils": "^3.21.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "*"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/types": {
- "version": "5.62.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz",
- "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==",
- "license": "MIT",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree": {
- "version": "5.62.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz",
- "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "@typescript-eslint/types": "5.62.0",
- "@typescript-eslint/visitor-keys": "5.62.0",
- "debug": "^4.3.4",
- "globby": "^11.1.0",
- "is-glob": "^4.0.3",
- "semver": "^7.3.7",
- "tsutils": "^3.21.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/utils": {
- "version": "5.62.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz",
- "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==",
- "license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@types/json-schema": "^7.0.9",
- "@types/semver": "^7.3.12",
- "@typescript-eslint/scope-manager": "5.62.0",
- "@typescript-eslint/types": "5.62.0",
- "@typescript-eslint/typescript-estree": "5.62.0",
- "eslint-scope": "^5.1.1",
- "semver": "^7.3.7"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/@typescript-eslint/utils/node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/@typescript-eslint/visitor-keys": {
- "version": "5.62.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz",
- "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==",
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "5.62.0",
- "eslint-visitor-keys": "^3.3.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@ungap/structured-clone": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
- "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
- "license": "ISC"
- },
- "node_modules/@webassemblyjs/ast": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
- "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/helper-numbers": "1.13.2",
- "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
- }
- },
- "node_modules/@webassemblyjs/floating-point-hex-parser": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
- "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
- "license": "MIT"
- },
- "node_modules/@webassemblyjs/helper-api-error": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
- "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
- "license": "MIT"
- },
- "node_modules/@webassemblyjs/helper-buffer": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
- "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
- "license": "MIT"
- },
- "node_modules/@webassemblyjs/helper-numbers": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
- "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/floating-point-hex-parser": "1.13.2",
- "@webassemblyjs/helper-api-error": "1.13.2",
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webassemblyjs/helper-wasm-bytecode": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
- "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
- "license": "MIT"
- },
- "node_modules/@webassemblyjs/helper-wasm-section": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
- "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/ast": "1.14.1",
- "@webassemblyjs/helper-buffer": "1.14.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
- "@webassemblyjs/wasm-gen": "1.14.1"
- }
- },
- "node_modules/@webassemblyjs/ieee754": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
- "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
- "license": "MIT",
- "dependencies": {
- "@xtuc/ieee754": "^1.2.0"
- }
- },
- "node_modules/@webassemblyjs/leb128": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
- "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webassemblyjs/utf8": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
- "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
- "license": "MIT"
- },
- "node_modules/@webassemblyjs/wasm-edit": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
- "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/ast": "1.14.1",
- "@webassemblyjs/helper-buffer": "1.14.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
- "@webassemblyjs/helper-wasm-section": "1.14.1",
- "@webassemblyjs/wasm-gen": "1.14.1",
- "@webassemblyjs/wasm-opt": "1.14.1",
- "@webassemblyjs/wasm-parser": "1.14.1",
- "@webassemblyjs/wast-printer": "1.14.1"
- }
- },
- "node_modules/@webassemblyjs/wasm-gen": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
- "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/ast": "1.14.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
- "@webassemblyjs/ieee754": "1.13.2",
- "@webassemblyjs/leb128": "1.13.2",
- "@webassemblyjs/utf8": "1.13.2"
- }
- },
- "node_modules/@webassemblyjs/wasm-opt": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
- "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/ast": "1.14.1",
- "@webassemblyjs/helper-buffer": "1.14.1",
- "@webassemblyjs/wasm-gen": "1.14.1",
- "@webassemblyjs/wasm-parser": "1.14.1"
- }
- },
- "node_modules/@webassemblyjs/wasm-parser": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
- "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/ast": "1.14.1",
- "@webassemblyjs/helper-api-error": "1.13.2",
- "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
- "@webassemblyjs/ieee754": "1.13.2",
- "@webassemblyjs/leb128": "1.13.2",
- "@webassemblyjs/utf8": "1.13.2"
- }
- },
- "node_modules/@webassemblyjs/wast-printer": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
- "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/ast": "1.14.1",
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@xtuc/ieee754": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
- "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
- "license": "BSD-3-Clause"
- },
- "node_modules/@xtuc/long": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
- "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
- "license": "Apache-2.0"
- },
- "node_modules/abab": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
- "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
- "deprecated": "Use your platform's native atob() and btoa() methods instead",
- "license": "BSD-3-Clause"
- },
- "node_modules/accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
- "license": "MIT",
- "dependencies": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/accepts/node_modules/negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/acorn": {
- "version": "8.15.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
- "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
- "license": "MIT",
- "peer": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-globals": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
- "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
- "license": "MIT",
- "dependencies": {
- "acorn": "^7.1.1",
- "acorn-walk": "^7.1.1"
- }
- },
- "node_modules/acorn-globals/node_modules/acorn": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
- "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
- "license": "MIT",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-import-phases": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz",
- "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==",
- "license": "MIT",
- "engines": {
- "node": ">=10.13.0"
- },
- "peerDependencies": {
- "acorn": "^8.14.0"
- }
- },
- "node_modules/acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "license": "MIT",
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/acorn-walk": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
- "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
- "license": "MIT",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/address": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz",
- "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==",
- "license": "MIT",
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/adjust-sourcemap-loader": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz",
- "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==",
- "license": "MIT",
- "dependencies": {
- "loader-utils": "^2.0.0",
- "regex-parser": "^2.2.11"
- },
- "engines": {
- "node": ">=8.9"
- }
- },
- "node_modules/agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
- "license": "MIT",
- "dependencies": {
- "debug": "4"
- },
- "engines": {
- "node": ">= 6.0.0"
- }
- },
- "node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ajv-formats": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
- "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
- "license": "MIT",
- "dependencies": {
- "ajv": "^8.0.0"
- },
- "peerDependencies": {
- "ajv": "^8.0.0"
- },
- "peerDependenciesMeta": {
- "ajv": {
- "optional": true
- }
- }
- },
- "node_modules/ajv-formats/node_modules/ajv": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.3",
- "fast-uri": "^3.0.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ajv-formats/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "license": "MIT"
- },
- "node_modules/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "license": "MIT",
- "peerDependencies": {
- "ajv": "^6.9.1"
- }
- },
- "node_modules/ansi-escapes": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
- "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
- "license": "MIT",
- "dependencies": {
- "type-fest": "^0.21.3"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/ansi-escapes/node_modules/type-fest": {
- "version": "0.21.3",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
- "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
- "license": "(MIT OR CC0-1.0)",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/ansi-html": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz",
- "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==",
- "engines": [
- "node >= 0.8.0"
- ],
- "license": "Apache-2.0",
- "bin": {
- "ansi-html": "bin/ansi-html"
- }
- },
- "node_modules/ansi-html-community": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
- "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
- "engines": [
- "node >= 0.8.0"
- ],
- "license": "Apache-2.0",
- "bin": {
- "ansi-html": "bin/ansi-html"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
- "license": "MIT"
- },
- "node_modules/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
- "license": "ISC",
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/anymatch/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/arg": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
- "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
- "license": "MIT"
- },
- "node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "license": "MIT",
- "dependencies": {
- "sprintf-js": "~1.0.2"
- }
- },
- "node_modules/aria-query": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
- "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
- "license": "Apache-2.0",
- "dependencies": {
- "dequal": "^2.0.3"
- }
- },
- "node_modules/array-buffer-byte-length": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
- "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "is-array-buffer": "^3.0.5"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
- "license": "MIT"
- },
- "node_modules/array-includes": {
- "version": "3.1.9",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz",
- "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.4",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.24.0",
- "es-object-atoms": "^1.1.1",
- "get-intrinsic": "^1.3.0",
- "is-string": "^1.1.1",
- "math-intrinsics": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/array.prototype.findlast": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
- "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "es-shim-unscopables": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.findlastindex": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz",
- "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.4",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.9",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.1.1",
- "es-shim-unscopables": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.flat": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
- "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.5",
- "es-shim-unscopables": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.flatmap": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
- "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.5",
- "es-shim-unscopables": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.reduce": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz",
- "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.4",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.9",
- "es-array-method-boxes-properly": "^1.0.0",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.1.1",
- "is-string": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.tosorted": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
- "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.3",
- "es-errors": "^1.3.0",
- "es-shim-unscopables": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/arraybuffer.prototype.slice": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
- "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
- "license": "MIT",
- "dependencies": {
- "array-buffer-byte-length": "^1.0.1",
- "call-bind": "^1.0.8",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.5",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.6",
- "is-array-buffer": "^3.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
- "license": "MIT"
- },
- "node_modules/ast-types-flow": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
- "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
- "license": "MIT"
- },
- "node_modules/async": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
- "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
- "license": "MIT"
- },
- "node_modules/async-function": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
- "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "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/at-least-node": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
- "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
- "license": "ISC",
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/autoprefixer": {
- "version": "10.4.21",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
- "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/autoprefixer"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "browserslist": "^4.24.4",
- "caniuse-lite": "^1.0.30001702",
- "fraction.js": "^4.3.7",
- "normalize-range": "^0.1.2",
- "picocolors": "^1.1.1",
- "postcss-value-parser": "^4.2.0"
- },
- "bin": {
- "autoprefixer": "bin/autoprefixer"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/available-typed-arrays": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
- "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
- "license": "MIT",
- "dependencies": {
- "possible-typed-array-names": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/axe-core": {
- "version": "4.10.3",
- "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz",
- "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==",
- "license": "MPL-2.0",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/axios": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz",
- "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==",
- "license": "MIT",
- "dependencies": {
- "follow-redirects": "^1.15.6",
- "form-data": "^4.0.4",
- "proxy-from-env": "^1.1.0"
- }
- },
- "node_modules/axobject-query": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
- "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/babel-jest": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz",
- "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==",
- "license": "MIT",
- "dependencies": {
- "@jest/transform": "^27.5.1",
- "@jest/types": "^27.5.1",
- "@types/babel__core": "^7.1.14",
- "babel-plugin-istanbul": "^6.1.1",
- "babel-preset-jest": "^27.5.1",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.8.0"
- }
- },
- "node_modules/babel-jest/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/babel-jest/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/babel-jest/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/babel-loader": {
- "version": "8.4.1",
- "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz",
- "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==",
- "license": "MIT",
- "dependencies": {
- "find-cache-dir": "^3.3.1",
- "loader-utils": "^2.0.4",
- "make-dir": "^3.1.0",
- "schema-utils": "^2.6.5"
- },
- "engines": {
- "node": ">= 8.9"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0",
- "webpack": ">=2"
- }
- },
- "node_modules/babel-loader/node_modules/schema-utils": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
- "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
- "license": "MIT",
- "dependencies": {
- "@types/json-schema": "^7.0.5",
- "ajv": "^6.12.4",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 8.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/babel-plugin-istanbul": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
- "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@istanbuljs/load-nyc-config": "^1.0.0",
- "@istanbuljs/schema": "^0.1.2",
- "istanbul-lib-instrument": "^5.0.4",
- "test-exclude": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/babel-plugin-jest-hoist": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz",
- "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/template": "^7.3.3",
- "@babel/types": "^7.3.3",
- "@types/babel__core": "^7.0.0",
- "@types/babel__traverse": "^7.0.6"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/babel-plugin-macros": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
- "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.12.5",
- "cosmiconfig": "^7.0.0",
- "resolve": "^1.19.0"
- },
- "engines": {
- "node": ">=10",
- "npm": ">=6"
- }
- },
- "node_modules/babel-plugin-named-asset-import": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz",
- "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==",
- "license": "MIT",
- "peerDependencies": {
- "@babel/core": "^7.1.0"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs2": {
- "version": "0.4.14",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz",
- "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==",
- "license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^7.27.7",
- "@babel/helper-define-polyfill-provider": "^0.6.5",
- "semver": "^6.3.1"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs3": {
- "version": "0.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz",
- "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.6.5",
- "core-js-compat": "^3.43.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/babel-plugin-polyfill-regenerator": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz",
- "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.6.5"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/babel-plugin-transform-react-remove-prop-types": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz",
- "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==",
- "license": "MIT"
- },
- "node_modules/babel-preset-current-node-syntax": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz",
- "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==",
- "license": "MIT",
- "dependencies": {
- "@babel/plugin-syntax-async-generators": "^7.8.4",
- "@babel/plugin-syntax-bigint": "^7.8.3",
- "@babel/plugin-syntax-class-properties": "^7.12.13",
- "@babel/plugin-syntax-class-static-block": "^7.14.5",
- "@babel/plugin-syntax-import-attributes": "^7.24.7",
- "@babel/plugin-syntax-import-meta": "^7.10.4",
- "@babel/plugin-syntax-json-strings": "^7.8.3",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3",
- "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
- "@babel/plugin-syntax-top-level-await": "^7.14.5"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0 || ^8.0.0-0"
- }
- },
- "node_modules/babel-preset-jest": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz",
- "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==",
- "license": "MIT",
- "dependencies": {
- "babel-plugin-jest-hoist": "^27.5.1",
- "babel-preset-current-node-syntax": "^1.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/babel-preset-react-app": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.1.0.tgz",
- "integrity": "sha512-f9B1xMdnkCIqe+2dHrJsoQFRz7reChaAHE/65SdaykPklQqhme2WaC08oD3is77x9ff98/9EazAKFDZv5rFEQg==",
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.16.0",
- "@babel/plugin-proposal-class-properties": "^7.16.0",
- "@babel/plugin-proposal-decorators": "^7.16.4",
- "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0",
- "@babel/plugin-proposal-numeric-separator": "^7.16.0",
- "@babel/plugin-proposal-optional-chaining": "^7.16.0",
- "@babel/plugin-proposal-private-methods": "^7.16.0",
- "@babel/plugin-proposal-private-property-in-object": "^7.16.7",
- "@babel/plugin-transform-flow-strip-types": "^7.16.0",
- "@babel/plugin-transform-react-display-name": "^7.16.0",
- "@babel/plugin-transform-runtime": "^7.16.4",
- "@babel/preset-env": "^7.16.4",
- "@babel/preset-react": "^7.16.0",
- "@babel/preset-typescript": "^7.16.0",
- "@babel/runtime": "^7.16.3",
- "babel-plugin-macros": "^3.1.0",
- "babel-plugin-transform-react-remove-prop-types": "^0.4.24"
- }
- },
- "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-private-property-in-object": {
- "version": "7.21.11",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz",
- "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==",
- "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.18.6",
- "@babel/helper-create-class-features-plugin": "^7.21.0",
- "@babel/helper-plugin-utils": "^7.20.2",
- "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "license": "MIT"
- },
- "node_modules/batch": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
- "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
- "license": "MIT"
- },
- "node_modules/bfj": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz",
- "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==",
- "license": "MIT",
- "dependencies": {
- "bluebird": "^3.7.2",
- "check-types": "^11.2.3",
- "hoopy": "^0.1.4",
- "jsonpath": "^1.1.1",
- "tryer": "^1.0.1"
- },
- "engines": {
- "node": ">= 8.0.0"
- }
- },
- "node_modules/big.js": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
- "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
- "license": "MIT",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/binary-extensions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
- "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
- "license": "MIT"
- },
- "node_modules/body-parser": {
- "version": "1.20.3",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
- "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
- "license": "MIT",
- "dependencies": {
- "bytes": "3.1.2",
- "content-type": "~1.0.5",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.13.0",
- "raw-body": "2.5.2",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/body-parser/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/body-parser/node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "license": "MIT",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/body-parser/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
- },
- "node_modules/bonjour-service": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz",
- "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==",
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.3",
- "multicast-dns": "^7.2.5"
- }
- },
- "node_modules/boolbase": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
- "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
- "license": "ISC"
- },
- "node_modules/brace-expansion": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
- "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
- "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
- "license": "MIT",
- "dependencies": {
- "fill-range": "^7.1.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/browser-process-hrtime": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
- "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
- "license": "BSD-2-Clause"
- },
- "node_modules/browserslist": {
- "version": "4.25.4",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz",
- "integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "caniuse-lite": "^1.0.30001737",
- "electron-to-chromium": "^1.5.211",
- "node-releases": "^2.0.19",
- "update-browserslist-db": "^1.1.3"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/bser": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
- "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "node-int64": "^0.4.0"
- }
- },
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "license": "MIT"
- },
- "node_modules/builtin-modules": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
- "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
- "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
- "license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.0",
- "es-define-property": "^1.0.0",
- "get-intrinsic": "^1.2.4",
- "set-function-length": "^1.2.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "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/call-bound": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
- "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
- "license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.2",
- "get-intrinsic": "^1.3.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/camel-case": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
- "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
- "license": "MIT",
- "dependencies": {
- "pascal-case": "^3.1.2",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/camelcase-css": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
- "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/camelize": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz",
- "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/caniuse-api": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
- "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
- "license": "MIT",
- "dependencies": {
- "browserslist": "^4.0.0",
- "caniuse-lite": "^1.0.0",
- "lodash.memoize": "^4.1.2",
- "lodash.uniq": "^4.5.0"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001739",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001739.tgz",
- "integrity": "sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "CC-BY-4.0"
- },
- "node_modules/case-sensitive-paths-webpack-plugin": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz",
- "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/char-regex": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
- "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/check-types": {
- "version": "11.2.3",
- "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz",
- "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==",
- "license": "MIT"
- },
- "node_modules/chokidar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
- "license": "MIT",
- "dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/chokidar/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/chrome-trace-event": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
- "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
- "license": "MIT",
- "engines": {
- "node": ">=6.0"
- }
- },
- "node_modules/ci-info": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz",
- "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cjs-module-lexer": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz",
- "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==",
- "license": "MIT"
- },
- "node_modules/clean-css": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
- "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
- "license": "MIT",
- "dependencies": {
- "source-map": "~0.6.0"
- },
- "engines": {
- "node": ">= 10.0"
- }
- },
- "node_modules/clean-css/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
- "license": "ISC",
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.0"
- }
- },
- "node_modules/co": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
- "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
- "license": "MIT",
- "engines": {
- "iojs": ">= 1.0.0",
- "node": ">= 0.12.0"
- }
- },
- "node_modules/coa": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
- "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
- "license": "MIT",
- "dependencies": {
- "@types/q": "^1.5.1",
- "chalk": "^2.4.1",
- "q": "^1.1.2"
- },
- "engines": {
- "node": ">= 4.0"
- }
- },
- "node_modules/coa/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/coa/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/coa/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "license": "MIT",
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/coa/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "license": "MIT"
- },
- "node_modules/coa/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "license": "MIT",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/coa/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/coa/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/collect-v8-coverage": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
- "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==",
- "license": "MIT"
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "license": "MIT"
- },
- "node_modules/colord": {
- "version": "2.9.3",
- "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
- "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
- "license": "MIT"
- },
- "node_modules/colorette": {
- "version": "2.0.20",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
- "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
- "license": "MIT"
- },
- "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/commander": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
- "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
- "license": "MIT",
- "engines": {
- "node": ">= 12"
- }
- },
- "node_modules/common-tags": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
- "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
- "license": "MIT",
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
- "license": "MIT"
- },
- "node_modules/compressible": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
- "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
- "license": "MIT",
- "dependencies": {
- "mime-db": ">= 1.43.0 < 2"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/compression": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz",
- "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==",
- "license": "MIT",
- "dependencies": {
- "bytes": "3.1.2",
- "compressible": "~2.0.18",
- "debug": "2.6.9",
- "negotiator": "~0.6.4",
- "on-headers": "~1.1.0",
- "safe-buffer": "5.2.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/compression/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/compression/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "license": "MIT"
- },
- "node_modules/confusing-browser-globals": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
- "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==",
- "license": "MIT"
- },
- "node_modules/connect-history-api-fallback": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
- "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
- "license": "MIT",
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "5.2.1"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/content-type": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
- "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/convert-source-map": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
- "license": "MIT"
- },
- "node_modules/cookie": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
- "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
- "license": "MIT"
- },
- "node_modules/core-js": {
- "version": "3.45.1",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz",
- "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==",
- "hasInstallScript": true,
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
- }
- },
- "node_modules/core-js-compat": {
- "version": "3.45.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz",
- "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==",
- "license": "MIT",
- "dependencies": {
- "browserslist": "^4.25.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
- }
- },
- "node_modules/core-js-pure": {
- "version": "3.45.1",
- "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.45.1.tgz",
- "integrity": "sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==",
- "hasInstallScript": true,
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
- }
- },
- "node_modules/core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
- "license": "MIT"
- },
- "node_modules/cosmiconfig": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
- "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
- "license": "MIT",
- "dependencies": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.2.1",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.10.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/cross-spawn": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
- "license": "MIT",
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/crypto-random-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
- "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/css-blank-pseudo": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz",
- "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==",
- "license": "CC0-1.0",
- "dependencies": {
- "postcss-selector-parser": "^6.0.9"
- },
- "bin": {
- "css-blank-pseudo": "dist/cli.cjs"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "peerDependencies": {
- "postcss": "^8.4"
- }
- },
- "node_modules/css-color-keywords": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz",
- "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==",
- "license": "ISC",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/css-declaration-sorter": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz",
- "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==",
- "license": "ISC",
- "engines": {
- "node": "^10 || ^12 || >=14"
- },
- "peerDependencies": {
- "postcss": "^8.0.9"
- }
- },
- "node_modules/css-has-pseudo": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz",
- "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==",
- "license": "CC0-1.0",
- "dependencies": {
- "postcss-selector-parser": "^6.0.9"
- },
- "bin": {
- "css-has-pseudo": "dist/cli.cjs"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "peerDependencies": {
- "postcss": "^8.4"
- }
- },
- "node_modules/css-loader": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz",
- "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==",
- "license": "MIT",
- "dependencies": {
- "icss-utils": "^5.1.0",
- "postcss": "^8.4.33",
- "postcss-modules-extract-imports": "^3.1.0",
- "postcss-modules-local-by-default": "^4.0.5",
- "postcss-modules-scope": "^3.2.0",
- "postcss-modules-values": "^4.0.0",
- "postcss-value-parser": "^4.2.0",
- "semver": "^7.5.4"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "@rspack/core": "0.x || 1.x",
- "webpack": "^5.0.0"
- },
- "peerDependenciesMeta": {
- "@rspack/core": {
- "optional": true
- },
- "webpack": {
- "optional": true
- }
- }
- },
- "node_modules/css-minimizer-webpack-plugin": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz",
- "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==",
- "license": "MIT",
- "dependencies": {
- "cssnano": "^5.0.6",
- "jest-worker": "^27.0.2",
- "postcss": "^8.3.5",
- "schema-utils": "^4.0.0",
- "serialize-javascript": "^6.0.0",
- "source-map": "^0.6.1"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.0.0"
- },
- "peerDependenciesMeta": {
- "@parcel/css": {
- "optional": true
- },
- "clean-css": {
- "optional": true
- },
- "csso": {
- "optional": true
- },
- "esbuild": {
- "optional": true
- }
- }
- },
- "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/css-prefers-color-scheme": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz",
- "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==",
- "license": "CC0-1.0",
- "bin": {
- "css-prefers-color-scheme": "dist/cli.cjs"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "peerDependencies": {
- "postcss": "^8.4"
- }
- },
- "node_modules/css-select": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
- "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "boolbase": "^1.0.0",
- "css-what": "^6.0.1",
- "domhandler": "^4.3.1",
- "domutils": "^2.8.0",
- "nth-check": "^2.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/fb55"
- }
- },
- "node_modules/css-select-base-adapter": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
- "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
- "license": "MIT"
- },
- "node_modules/css-to-react-native": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz",
- "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==",
- "license": "MIT",
- "dependencies": {
- "camelize": "^1.0.0",
- "css-color-keywords": "^1.0.0",
- "postcss-value-parser": "^4.0.2"
- }
- },
- "node_modules/css-tree": {
- "version": "1.0.0-alpha.37",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
- "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
- "license": "MIT",
- "dependencies": {
- "mdn-data": "2.0.4",
- "source-map": "^0.6.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/css-tree/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/css-what": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
- "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">= 6"
- },
- "funding": {
- "url": "https://github.com/sponsors/fb55"
- }
- },
- "node_modules/css.escape": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
- "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==",
- "license": "MIT"
- },
- "node_modules/cssdb": {
- "version": "7.11.2",
- "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz",
- "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- }
- ],
- "license": "CC0-1.0"
- },
- "node_modules/cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
- "license": "MIT",
- "bin": {
- "cssesc": "bin/cssesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/cssnano": {
- "version": "5.1.15",
- "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz",
- "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==",
- "license": "MIT",
- "dependencies": {
- "cssnano-preset-default": "^5.2.14",
- "lilconfig": "^2.0.3",
- "yaml": "^1.10.2"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/cssnano"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/cssnano-preset-default": {
- "version": "5.2.14",
- "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz",
- "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==",
- "license": "MIT",
- "dependencies": {
- "css-declaration-sorter": "^6.3.1",
- "cssnano-utils": "^3.1.0",
- "postcss-calc": "^8.2.3",
- "postcss-colormin": "^5.3.1",
- "postcss-convert-values": "^5.1.3",
- "postcss-discard-comments": "^5.1.2",
- "postcss-discard-duplicates": "^5.1.0",
- "postcss-discard-empty": "^5.1.1",
- "postcss-discard-overridden": "^5.1.0",
- "postcss-merge-longhand": "^5.1.7",
- "postcss-merge-rules": "^5.1.4",
- "postcss-minify-font-values": "^5.1.0",
- "postcss-minify-gradients": "^5.1.1",
- "postcss-minify-params": "^5.1.4",
- "postcss-minify-selectors": "^5.2.1",
- "postcss-normalize-charset": "^5.1.0",
- "postcss-normalize-display-values": "^5.1.0",
- "postcss-normalize-positions": "^5.1.1",
- "postcss-normalize-repeat-style": "^5.1.1",
- "postcss-normalize-string": "^5.1.0",
- "postcss-normalize-timing-functions": "^5.1.0",
- "postcss-normalize-unicode": "^5.1.1",
- "postcss-normalize-url": "^5.1.0",
- "postcss-normalize-whitespace": "^5.1.1",
- "postcss-ordered-values": "^5.1.3",
- "postcss-reduce-initial": "^5.1.2",
- "postcss-reduce-transforms": "^5.1.0",
- "postcss-svgo": "^5.1.0",
- "postcss-unique-selectors": "^5.1.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/cssnano-utils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz",
- "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==",
- "license": "MIT",
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/csso": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
- "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
- "license": "MIT",
- "dependencies": {
- "css-tree": "^1.1.2"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/csso/node_modules/css-tree": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
- "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
- "license": "MIT",
- "dependencies": {
- "mdn-data": "2.0.14",
- "source-map": "^0.6.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/csso/node_modules/mdn-data": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
- "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
- "license": "CC0-1.0"
- },
- "node_modules/csso/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/cssom": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
- "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
- "license": "MIT"
- },
- "node_modules/cssstyle": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
- "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
- "license": "MIT",
- "dependencies": {
- "cssom": "~0.3.6"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cssstyle/node_modules/cssom": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
- "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
- "license": "MIT"
- },
- "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",
- "peer": true
- },
- "node_modules/damerau-levenshtein": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
- "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
- "license": "BSD-2-Clause"
- },
- "node_modules/data-urls": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
- "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
- "license": "MIT",
- "dependencies": {
- "abab": "^2.0.3",
- "whatwg-mimetype": "^2.3.0",
- "whatwg-url": "^8.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/data-view-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
- "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/data-view-byte-length": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
- "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/inspect-js"
- }
- },
- "node_modules/data-view-byte-offset": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
- "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/debug": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
- "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/decimal.js": {
- "version": "10.6.0",
- "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
- "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
- "license": "MIT"
- },
- "node_modules/dedent": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
- "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
- "license": "MIT"
- },
- "node_modules/deep-equal": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz",
- "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==",
- "license": "MIT",
- "dependencies": {
- "array-buffer-byte-length": "^1.0.0",
- "call-bind": "^1.0.5",
- "es-get-iterator": "^1.1.3",
- "get-intrinsic": "^1.2.2",
- "is-arguments": "^1.1.1",
- "is-array-buffer": "^3.0.2",
- "is-date-object": "^1.0.5",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.2",
- "isarray": "^2.0.5",
- "object-is": "^1.1.5",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.4",
- "regexp.prototype.flags": "^1.5.1",
- "side-channel": "^1.0.4",
- "which-boxed-primitive": "^1.0.2",
- "which-collection": "^1.0.1",
- "which-typed-array": "^1.1.13"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "license": "MIT"
- },
- "node_modules/deepmerge": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
- "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/default-gateway": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
- "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "execa": "^5.0.0"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/define-data-property": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
- "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
- "license": "MIT",
- "dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "gopd": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/define-lazy-prop": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
- "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/define-properties": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
- "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
- "license": "MIT",
- "dependencies": {
- "define-data-property": "^1.0.1",
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "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/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/dequal": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
- "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/detect-newline": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
- "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/detect-node": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
- "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
- "license": "MIT"
- },
- "node_modules/detect-port-alt": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz",
- "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==",
- "license": "MIT",
- "dependencies": {
- "address": "^1.0.1",
- "debug": "^2.6.0"
- },
- "bin": {
- "detect": "bin/detect-port",
- "detect-port": "bin/detect-port"
- },
- "engines": {
- "node": ">= 4.2.1"
- }
- },
- "node_modules/detect-port-alt/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/detect-port-alt/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
- },
- "node_modules/didyoumean": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
- "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
- "license": "Apache-2.0"
- },
- "node_modules/diff-sequences": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
- "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
- "license": "MIT",
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "license": "MIT",
- "dependencies": {
- "path-type": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/dlv": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
- "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
- "license": "MIT"
- },
- "node_modules/dns-packet": {
- "version": "5.6.1",
- "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz",
- "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
- "license": "MIT",
- "dependencies": {
- "@leichtgewicht/ip-codec": "^2.0.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "license": "Apache-2.0",
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/dom-accessibility-api": {
- "version": "0.5.16",
- "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
- "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==",
- "license": "MIT"
- },
- "node_modules/dom-converter": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
- "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
- "license": "MIT",
- "dependencies": {
- "utila": "~0.4"
- }
- },
- "node_modules/dom-helpers": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
- "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.8.7",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/dom-serializer": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
- "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
- "license": "MIT",
- "dependencies": {
- "domelementtype": "^2.0.1",
- "domhandler": "^4.2.0",
- "entities": "^2.0.0"
- },
- "funding": {
- "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
- }
- },
- "node_modules/domelementtype": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
- "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ],
- "license": "BSD-2-Clause"
- },
- "node_modules/domexception": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
- "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
- "deprecated": "Use your platform's native DOMException instead",
- "license": "MIT",
- "dependencies": {
- "webidl-conversions": "^5.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/domexception/node_modules/webidl-conversions": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
- "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/domhandler": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
- "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "domelementtype": "^2.2.0"
- },
- "engines": {
- "node": ">= 4"
- },
- "funding": {
- "url": "https://github.com/fb55/domhandler?sponsor=1"
- }
- },
- "node_modules/domutils": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
- "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "dom-serializer": "^1.0.1",
- "domelementtype": "^2.2.0",
- "domhandler": "^4.2.0"
- },
- "funding": {
- "url": "https://github.com/fb55/domutils?sponsor=1"
- }
- },
- "node_modules/dot-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
- "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
- "license": "MIT",
- "dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/dotenv": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz",
- "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/dotenv-expand": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
- "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
- "license": "BSD-2-Clause"
- },
- "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/duplexer": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
- "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
- "license": "MIT"
- },
- "node_modules/eastasianwidth": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
- "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
- "license": "MIT"
- },
- "node_modules/ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
- "license": "MIT"
- },
- "node_modules/ejs": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
- "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
- "license": "Apache-2.0",
- "dependencies": {
- "jake": "^10.8.5"
- },
- "bin": {
- "ejs": "bin/cli.js"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/electron-to-chromium": {
- "version": "1.5.211",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.211.tgz",
- "integrity": "sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw==",
- "license": "ISC"
- },
- "node_modules/emittery": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz",
- "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/emittery?sponsor=1"
- }
- },
- "node_modules/emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "license": "MIT"
- },
- "node_modules/emojis-list": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
- "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/encodeurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
- "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/enhanced-resolve": {
- "version": "5.18.3",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
- "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
- "license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/entities": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
- "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
- "license": "BSD-2-Clause",
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "license": "MIT",
- "dependencies": {
- "is-arrayish": "^0.2.1"
- }
- },
- "node_modules/error-stack-parser": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
- "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
- "license": "MIT",
- "dependencies": {
- "stackframe": "^1.3.4"
- }
- },
- "node_modules/es-abstract": {
- "version": "1.24.0",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz",
- "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==",
- "license": "MIT",
- "dependencies": {
- "array-buffer-byte-length": "^1.0.2",
- "arraybuffer.prototype.slice": "^1.0.4",
- "available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.4",
- "data-view-buffer": "^1.0.2",
- "data-view-byte-length": "^1.0.2",
- "data-view-byte-offset": "^1.0.1",
- "es-define-property": "^1.0.1",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.1.1",
- "es-set-tostringtag": "^2.1.0",
- "es-to-primitive": "^1.3.0",
- "function.prototype.name": "^1.1.8",
- "get-intrinsic": "^1.3.0",
- "get-proto": "^1.0.1",
- "get-symbol-description": "^1.1.0",
- "globalthis": "^1.0.4",
- "gopd": "^1.2.0",
- "has-property-descriptors": "^1.0.2",
- "has-proto": "^1.2.0",
- "has-symbols": "^1.1.0",
- "hasown": "^2.0.2",
- "internal-slot": "^1.1.0",
- "is-array-buffer": "^3.0.5",
- "is-callable": "^1.2.7",
- "is-data-view": "^1.0.2",
- "is-negative-zero": "^2.0.3",
- "is-regex": "^1.2.1",
- "is-set": "^2.0.3",
- "is-shared-array-buffer": "^1.0.4",
- "is-string": "^1.1.1",
- "is-typed-array": "^1.1.15",
- "is-weakref": "^1.1.1",
- "math-intrinsics": "^1.1.0",
- "object-inspect": "^1.13.4",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.7",
- "own-keys": "^1.0.1",
- "regexp.prototype.flags": "^1.5.4",
- "safe-array-concat": "^1.1.3",
- "safe-push-apply": "^1.0.0",
- "safe-regex-test": "^1.1.0",
- "set-proto": "^1.0.0",
- "stop-iteration-iterator": "^1.1.0",
- "string.prototype.trim": "^1.2.10",
- "string.prototype.trimend": "^1.0.9",
- "string.prototype.trimstart": "^1.0.8",
- "typed-array-buffer": "^1.0.3",
- "typed-array-byte-length": "^1.0.3",
- "typed-array-byte-offset": "^1.0.4",
- "typed-array-length": "^1.0.7",
- "unbox-primitive": "^1.1.0",
- "which-typed-array": "^1.1.19"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/es-array-method-boxes-properly": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
- "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
- "license": "MIT"
- },
- "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-get-iterator": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz",
- "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.3",
- "has-symbols": "^1.0.3",
- "is-arguments": "^1.1.1",
- "is-map": "^2.0.2",
- "is-set": "^2.0.2",
- "is-string": "^1.0.7",
- "isarray": "^2.0.5",
- "stop-iteration-iterator": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/es-iterator-helpers": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz",
- "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.6",
- "es-errors": "^1.3.0",
- "es-set-tostringtag": "^2.0.3",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.6",
- "globalthis": "^1.0.4",
- "gopd": "^1.2.0",
- "has-property-descriptors": "^1.0.2",
- "has-proto": "^1.2.0",
- "has-symbols": "^1.1.0",
- "internal-slot": "^1.1.0",
- "iterator.prototype": "^1.1.4",
- "safe-array-concat": "^1.1.3"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-module-lexer": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
- "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
- "license": "MIT"
- },
- "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/es-shim-unscopables": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
- "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
- "license": "MIT",
- "dependencies": {
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-to-primitive": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
- "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
- "license": "MIT",
- "dependencies": {
- "is-callable": "^1.2.7",
- "is-date-object": "^1.0.5",
- "is-symbol": "^1.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/escalade": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
- "license": "MIT"
- },
- "node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/escodegen": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
- "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "esprima": "^4.0.1",
- "estraverse": "^5.2.0",
- "esutils": "^2.0.2"
- },
- "bin": {
- "escodegen": "bin/escodegen.js",
- "esgenerate": "bin/esgenerate.js"
- },
- "engines": {
- "node": ">=6.0"
- },
- "optionalDependencies": {
- "source-map": "~0.6.1"
- }
- },
- "node_modules/escodegen/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "license": "BSD-3-Clause",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/eslint": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
- "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
- "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@eslint-community/regexpp": "^4.6.1",
- "@eslint/eslintrc": "^2.1.4",
- "@eslint/js": "8.57.1",
- "@humanwhocodes/config-array": "^0.13.0",
- "@humanwhocodes/module-importer": "^1.0.1",
- "@nodelib/fs.walk": "^1.2.8",
- "@ungap/structured-clone": "^1.2.0",
- "ajv": "^6.12.4",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.3.2",
- "doctrine": "^3.0.0",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^7.2.2",
- "eslint-visitor-keys": "^3.4.3",
- "espree": "^9.6.1",
- "esquery": "^1.4.2",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
- "find-up": "^5.0.0",
- "glob-parent": "^6.0.2",
- "globals": "^13.19.0",
- "graphemer": "^1.4.0",
- "ignore": "^5.2.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "is-path-inside": "^3.0.3",
- "js-yaml": "^4.1.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.1.2",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.3",
- "strip-ansi": "^6.0.1",
- "text-table": "^0.2.0"
- },
- "bin": {
- "eslint": "bin/eslint.js"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-config-react-app": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz",
- "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==",
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.16.0",
- "@babel/eslint-parser": "^7.16.3",
- "@rushstack/eslint-patch": "^1.1.0",
- "@typescript-eslint/eslint-plugin": "^5.5.0",
- "@typescript-eslint/parser": "^5.5.0",
- "babel-preset-react-app": "^10.0.1",
- "confusing-browser-globals": "^1.0.11",
- "eslint-plugin-flowtype": "^8.0.3",
- "eslint-plugin-import": "^2.25.3",
- "eslint-plugin-jest": "^25.3.0",
- "eslint-plugin-jsx-a11y": "^6.5.1",
- "eslint-plugin-react": "^7.27.1",
- "eslint-plugin-react-hooks": "^4.3.0",
- "eslint-plugin-testing-library": "^5.0.1"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "eslint": "^8.0.0"
- }
- },
- "node_modules/eslint-import-resolver-node": {
- "version": "0.3.9",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
- "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
- "license": "MIT",
- "dependencies": {
- "debug": "^3.2.7",
- "is-core-module": "^2.13.0",
- "resolve": "^1.22.4"
- }
- },
- "node_modules/eslint-import-resolver-node/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-module-utils": {
- "version": "2.12.1",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz",
- "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==",
- "license": "MIT",
- "dependencies": {
- "debug": "^3.2.7"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependenciesMeta": {
- "eslint": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-module-utils/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-plugin-flowtype": {
- "version": "8.0.3",
- "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz",
- "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "lodash": "^4.17.21",
- "string-natural-compare": "^3.0.1"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "@babel/plugin-syntax-flow": "^7.14.5",
- "@babel/plugin-transform-react-jsx": "^7.14.9",
- "eslint": "^8.1.0"
- }
- },
- "node_modules/eslint-plugin-import": {
- "version": "2.32.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz",
- "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
- "license": "MIT",
- "dependencies": {
- "@rtsao/scc": "^1.1.0",
- "array-includes": "^3.1.9",
- "array.prototype.findlastindex": "^1.2.6",
- "array.prototype.flat": "^1.3.3",
- "array.prototype.flatmap": "^1.3.3",
- "debug": "^3.2.7",
- "doctrine": "^2.1.0",
- "eslint-import-resolver-node": "^0.3.9",
- "eslint-module-utils": "^2.12.1",
- "hasown": "^2.0.2",
- "is-core-module": "^2.16.1",
- "is-glob": "^4.0.3",
- "minimatch": "^3.1.2",
- "object.fromentries": "^2.0.8",
- "object.groupby": "^1.0.3",
- "object.values": "^1.2.1",
- "semver": "^6.3.1",
- "string.prototype.trimend": "^1.0.9",
- "tsconfig-paths": "^3.15.0"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependencies": {
- "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "license": "Apache-2.0",
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/eslint-plugin-jest": {
- "version": "25.7.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz",
- "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==",
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/experimental-utils": "^5.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- },
- "peerDependencies": {
- "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0",
- "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "@typescript-eslint/eslint-plugin": {
- "optional": true
- },
- "jest": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-plugin-jsx-a11y": {
- "version": "6.10.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
- "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
- "license": "MIT",
- "dependencies": {
- "aria-query": "^5.3.2",
- "array-includes": "^3.1.8",
- "array.prototype.flatmap": "^1.3.2",
- "ast-types-flow": "^0.0.8",
- "axe-core": "^4.10.0",
- "axobject-query": "^4.1.0",
- "damerau-levenshtein": "^1.0.8",
- "emoji-regex": "^9.2.2",
- "hasown": "^2.0.2",
- "jsx-ast-utils": "^3.3.5",
- "language-tags": "^1.0.9",
- "minimatch": "^3.1.2",
- "object.fromentries": "^2.0.8",
- "safe-regex-test": "^1.0.3",
- "string.prototype.includes": "^2.0.1"
- },
- "engines": {
- "node": ">=4.0"
- },
- "peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
- }
- },
- "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
- "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/eslint-plugin-react": {
- "version": "7.37.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz",
- "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==",
- "license": "MIT",
- "dependencies": {
- "array-includes": "^3.1.8",
- "array.prototype.findlast": "^1.2.5",
- "array.prototype.flatmap": "^1.3.3",
- "array.prototype.tosorted": "^1.1.4",
- "doctrine": "^2.1.0",
- "es-iterator-helpers": "^1.2.1",
- "estraverse": "^5.3.0",
- "hasown": "^2.0.2",
- "jsx-ast-utils": "^2.4.1 || ^3.0.0",
- "minimatch": "^3.1.2",
- "object.entries": "^1.1.9",
- "object.fromentries": "^2.0.8",
- "object.values": "^1.2.1",
- "prop-types": "^15.8.1",
- "resolve": "^2.0.0-next.5",
- "semver": "^6.3.1",
- "string.prototype.matchall": "^4.0.12",
- "string.prototype.repeat": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
- }
- },
- "node_modules/eslint-plugin-react-hooks": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz",
- "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
- }
- },
- "node_modules/eslint-plugin-react/node_modules/doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "license": "Apache-2.0",
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/eslint-plugin-react/node_modules/resolve": {
- "version": "2.0.0-next.5",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
- "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
- "license": "MIT",
- "dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/eslint-plugin-react/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/eslint-plugin-testing-library": {
- "version": "5.11.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz",
- "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==",
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/utils": "^5.58.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0",
- "npm": ">=6"
- },
- "peerDependencies": {
- "eslint": "^7.5.0 || ^8.0.0"
- }
- },
- "node_modules/eslint-scope": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
- "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "license": "Apache-2.0",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-webpack-plugin": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz",
- "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==",
- "license": "MIT",
- "dependencies": {
- "@types/eslint": "^7.29.0 || ^8.4.1",
- "jest-worker": "^28.0.2",
- "micromatch": "^4.0.5",
- "normalize-path": "^3.0.0",
- "schema-utils": "^4.0.0"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "eslint": "^7.0.0 || ^8.0.0",
- "webpack": "^5.0.0"
- }
- },
- "node_modules/eslint-webpack-plugin/node_modules/jest-worker": {
- "version": "28.1.3",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz",
- "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
- }
- },
- "node_modules/eslint-webpack-plugin/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/eslint/node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "license": "Python-2.0"
- },
- "node_modules/eslint/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/eslint/node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "license": "MIT",
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "license": "MIT",
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/eslint/node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "license": "MIT",
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "license": "MIT",
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "license": "MIT",
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/espree": {
- "version": "9.6.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
- "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "acorn": "^8.9.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^3.4.1"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "license": "BSD-2-Clause",
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/esquery": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
- "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "estraverse": "^5.1.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estree-walker": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
- "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
- "license": "MIT"
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/eventemitter3": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
- "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
- "license": "MIT"
- },
- "node_modules/events": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
- "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
- "license": "MIT",
- "engines": {
- "node": ">=0.8.x"
- }
- },
- "node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "license": "MIT",
- "dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
- "node_modules/exit": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/expect": {
- "version": "30.1.2",
- "resolved": "https://registry.npmjs.org/expect/-/expect-30.1.2.tgz",
- "integrity": "sha512-xvHszRavo28ejws8FpemjhwswGj4w/BetHIL8cU49u4sGyXDw2+p3YbeDbj6xzlxi6kWTjIRSTJ+9sNXPnF0Zg==",
- "license": "MIT",
- "dependencies": {
- "@jest/expect-utils": "30.1.2",
- "@jest/get-type": "30.1.0",
- "jest-matcher-utils": "30.1.2",
- "jest-message-util": "30.1.0",
- "jest-mock": "30.0.5",
- "jest-util": "30.0.5"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/express": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
- "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
- "license": "MIT",
- "dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.3",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.7.1",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.3.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.3",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.12",
- "proxy-addr": "~2.0.7",
- "qs": "6.13.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.19.0",
- "serve-static": "1.16.2",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.10.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
- }
- },
- "node_modules/express/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/express/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "license": "MIT"
- },
- "node_modules/fast-glob": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
- "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.8"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
- "node_modules/fast-glob/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "license": "MIT"
- },
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "license": "MIT"
- },
- "node_modules/fast-uri": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
- "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/fastify"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/fastify"
- }
- ],
- "license": "BSD-3-Clause"
- },
- "node_modules/fastq": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
- "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
- "license": "ISC",
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/faye-websocket": {
- "version": "0.11.4",
- "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
- "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
- "license": "Apache-2.0",
- "dependencies": {
- "websocket-driver": ">=0.5.1"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/fb-watchman": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
- "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
- "license": "Apache-2.0",
- "dependencies": {
- "bser": "2.1.1"
- }
- },
- "node_modules/file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
- "license": "MIT",
- "dependencies": {
- "flat-cache": "^3.0.4"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "node_modules/file-loader": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
- "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
- "license": "MIT",
- "dependencies": {
- "loader-utils": "^2.0.0",
- "schema-utils": "^3.0.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^4.0.0 || ^5.0.0"
- }
- },
- "node_modules/file-loader/node_modules/schema-utils": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
- "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
- "license": "MIT",
- "dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/filelist": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
- "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
- "license": "Apache-2.0",
- "dependencies": {
- "minimatch": "^5.0.1"
- }
- },
- "node_modules/filelist/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/filelist/node_modules/minimatch": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/filesize": {
- "version": "8.0.7",
- "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz",
- "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
- "license": "MIT",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/finalhandler": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
- "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
- "license": "MIT",
- "dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/finalhandler/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/finalhandler/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
- },
- "node_modules/find-cache-dir": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
- "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
- "license": "MIT",
- "dependencies": {
- "commondir": "^1.0.1",
- "make-dir": "^3.0.2",
- "pkg-dir": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
- }
- },
- "node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "license": "MIT",
- "dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/flat-cache": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
- "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
- "license": "MIT",
- "dependencies": {
- "flatted": "^3.2.9",
- "keyv": "^4.5.3",
- "rimraf": "^3.0.2"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "node_modules/flatted": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
- "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
- "license": "ISC"
- },
- "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/for-each": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
- "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
- "license": "MIT",
- "dependencies": {
- "is-callable": "^1.2.7"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/foreground-child": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
- "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
- "license": "ISC",
- "dependencies": {
- "cross-spawn": "^7.0.6",
- "signal-exit": "^4.0.1"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/foreground-child/node_modules/signal-exit": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
- "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
- "license": "ISC",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin": {
- "version": "6.5.3",
- "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz",
- "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.8.3",
- "@types/json-schema": "^7.0.5",
- "chalk": "^4.1.0",
- "chokidar": "^3.4.2",
- "cosmiconfig": "^6.0.0",
- "deepmerge": "^4.2.2",
- "fs-extra": "^9.0.0",
- "glob": "^7.1.6",
- "memfs": "^3.1.2",
- "minimatch": "^3.0.4",
- "schema-utils": "2.7.0",
- "semver": "^7.3.2",
- "tapable": "^1.0.0"
- },
- "engines": {
- "node": ">=10",
- "yarn": ">=1.0.0"
- },
- "peerDependencies": {
- "eslint": ">= 6",
- "typescript": ">= 2.7",
- "vue-template-compiler": "*",
- "webpack": ">= 4"
- },
- "peerDependenciesMeta": {
- "eslint": {
- "optional": true
- },
- "vue-template-compiler": {
- "optional": true
- }
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
- "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
- "license": "MIT",
- "dependencies": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.1.0",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.7.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
- "license": "MIT",
- "dependencies": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
- "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
- "license": "MIT",
- "dependencies": {
- "@types/json-schema": "^7.0.4",
- "ajv": "^6.12.2",
- "ajv-keywords": "^3.4.1"
- },
- "engines": {
- "node": ">= 8.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
- "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "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/forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fraction.js": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
- "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
- "license": "MIT",
- "engines": {
- "node": "*"
- },
- "funding": {
- "type": "patreon",
- "url": "https://github.com/sponsors/rawify"
- }
- },
- "node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
- "license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/fs-monkey": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz",
- "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==",
- "license": "Unlicense"
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "license": "ISC"
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "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/function.prototype.name": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
- "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
- "define-properties": "^1.2.1",
- "functions-have-names": "^1.2.3",
- "hasown": "^2.0.2",
- "is-callable": "^1.2.7"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/functions-have-names": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
- "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "license": "ISC",
- "engines": {
- "node": "6.* || 8.* || >= 10.*"
- }
- },
- "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-own-enumerable-property-symbols": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
- "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
- "license": "ISC"
- },
- "node_modules/get-package-type": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
- "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
- "license": "MIT",
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "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/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/get-symbol-description": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
- "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.6"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
- "license": "ISC",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/glob-to-regexp": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
- "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
- "license": "BSD-2-Clause"
- },
- "node_modules/global-modules": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
- "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
- "license": "MIT",
- "dependencies": {
- "global-prefix": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/global-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
- "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
- "license": "MIT",
- "dependencies": {
- "ini": "^1.3.5",
- "kind-of": "^6.0.2",
- "which": "^1.3.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/global-prefix/node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
- }
- },
- "node_modules/globals": {
- "version": "13.24.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
- "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
- "license": "MIT",
- "dependencies": {
- "type-fest": "^0.20.2"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/globalthis": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
- "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
- "license": "MIT",
- "dependencies": {
- "define-properties": "^1.2.1",
- "gopd": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "license": "MIT",
- "dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/goober": {
- "version": "2.1.16",
- "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.16.tgz",
- "integrity": "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==",
- "license": "MIT",
- "peerDependencies": {
- "csstype": "^3.0.10"
- }
- },
- "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/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "license": "ISC"
- },
- "node_modules/graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
- "license": "MIT"
- },
- "node_modules/gzip-size": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
- "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
- "license": "MIT",
- "dependencies": {
- "duplexer": "^0.1.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/handle-thing": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
- "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
- "license": "MIT"
- },
- "node_modules/harmony-reflect": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz",
- "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==",
- "license": "(Apache-2.0 OR MPL-1.1)"
- },
- "node_modules/has-bigints": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
- "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/has-property-descriptors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
- "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
- "license": "MIT",
- "dependencies": {
- "es-define-property": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-proto": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
- "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
- "license": "MIT",
- "dependencies": {
- "dunder-proto": "^1.0.0"
- },
- "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/he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
- "license": "MIT",
- "bin": {
- "he": "bin/he"
- }
- },
- "node_modules/hoopy": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
- "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 6.0.0"
- }
- },
- "node_modules/hpack.js": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
- "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.1",
- "obuf": "^1.0.0",
- "readable-stream": "^2.0.1",
- "wbuf": "^1.1.0"
- }
- },
- "node_modules/hpack.js/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "license": "MIT"
- },
- "node_modules/hpack.js/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
- "license": "MIT",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/hpack.js/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "license": "MIT"
- },
- "node_modules/hpack.js/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/html-encoding-sniffer": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
- "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
- "license": "MIT",
- "dependencies": {
- "whatwg-encoding": "^1.0.5"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/html-entities": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
- "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/mdevils"
- },
- {
- "type": "patreon",
- "url": "https://patreon.com/mdevils"
- }
- ],
- "license": "MIT"
- },
- "node_modules/html-escaper": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
- "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
- "license": "MIT"
- },
- "node_modules/html-minifier-terser": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
- "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==",
- "license": "MIT",
- "dependencies": {
- "camel-case": "^4.1.2",
- "clean-css": "^5.2.2",
- "commander": "^8.3.0",
- "he": "^1.2.0",
- "param-case": "^3.0.4",
- "relateurl": "^0.2.7",
- "terser": "^5.10.0"
- },
- "bin": {
- "html-minifier-terser": "cli.js"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/html-webpack-plugin": {
- "version": "5.6.4",
- "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz",
- "integrity": "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==",
- "license": "MIT",
- "dependencies": {
- "@types/html-minifier-terser": "^6.0.0",
- "html-minifier-terser": "^6.0.2",
- "lodash": "^4.17.21",
- "pretty-error": "^4.0.0",
- "tapable": "^2.0.0"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/html-webpack-plugin"
- },
- "peerDependencies": {
- "@rspack/core": "0.x || 1.x",
- "webpack": "^5.20.0"
- },
- "peerDependenciesMeta": {
- "@rspack/core": {
- "optional": true
- },
- "webpack": {
- "optional": true
- }
- }
- },
- "node_modules/htmlparser2": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
- "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
- "funding": [
- "https://github.com/fb55/htmlparser2?sponsor=1",
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "domelementtype": "^2.0.1",
- "domhandler": "^4.0.0",
- "domutils": "^2.5.2",
- "entities": "^2.0.0"
- }
- },
- "node_modules/http-deceiver": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
- "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
- "license": "MIT"
- },
- "node_modules/http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "license": "MIT",
- "dependencies": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/http-parser-js": {
- "version": "0.5.10",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz",
- "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==",
- "license": "MIT"
- },
- "node_modules/http-proxy": {
- "version": "1.18.1",
- "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
- "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
- "license": "MIT",
- "dependencies": {
- "eventemitter3": "^4.0.0",
- "follow-redirects": "^1.0.0",
- "requires-port": "^1.0.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/http-proxy-agent": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
- "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
- "license": "MIT",
- "dependencies": {
- "@tootallnate/once": "1",
- "agent-base": "6",
- "debug": "4"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/http-proxy-middleware": {
- "version": "2.0.9",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz",
- "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==",
- "license": "MIT",
- "dependencies": {
- "@types/http-proxy": "^1.17.8",
- "http-proxy": "^1.18.1",
- "is-glob": "^4.0.1",
- "is-plain-obj": "^3.0.0",
- "micromatch": "^4.0.2"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "@types/express": "^4.17.13"
- },
- "peerDependenciesMeta": {
- "@types/express": {
- "optional": true
- }
- }
- },
- "node_modules/https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
- "license": "MIT",
- "dependencies": {
- "agent-base": "6",
- "debug": "4"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">=10.17.0"
- }
- },
- "node_modules/iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
- "license": "MIT",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/icss-utils": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
- "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
- "license": "ISC",
- "engines": {
- "node": "^10 || ^12 || >= 14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/idb": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
- "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==",
- "license": "ISC"
- },
- "node_modules/identity-obj-proxy": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz",
- "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==",
- "license": "MIT",
- "dependencies": {
- "harmony-reflect": "^1.4.6"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ignore": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
- "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/immer": {
- "version": "9.0.21",
- "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
- "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==",
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/immer"
- }
- },
- "node_modules/import-fresh": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
- "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
- "license": "MIT",
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/import-fresh/node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/import-local": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
- "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
- "license": "MIT",
- "dependencies": {
- "pkg-dir": "^4.2.0",
- "resolve-cwd": "^3.0.0"
- },
- "bin": {
- "import-local-fixture": "fixtures/cli.js"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "license": "MIT",
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
- "license": "ISC",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "license": "ISC"
- },
- "node_modules/ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "license": "ISC"
- },
- "node_modules/internal-slot": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
- "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "hasown": "^2.0.2",
- "side-channel": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/ipaddr.js": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
- "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==",
- "license": "MIT",
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/is-arguments": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz",
- "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "has-tostringtag": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-array-buffer": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
- "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
- "get-intrinsic": "^1.2.6"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "license": "MIT"
- },
- "node_modules/is-async-function": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
- "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
- "license": "MIT",
- "dependencies": {
- "async-function": "^1.0.0",
- "call-bound": "^1.0.3",
- "get-proto": "^1.0.1",
- "has-tostringtag": "^1.0.2",
- "safe-regex-test": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-bigint": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
- "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
- "license": "MIT",
- "dependencies": {
- "has-bigints": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "license": "MIT",
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-boolean-object": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
- "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "has-tostringtag": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-callable": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
- "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.16.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
- "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
- "license": "MIT",
- "dependencies": {
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-data-view": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
- "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "get-intrinsic": "^1.2.6",
- "is-typed-array": "^1.1.13"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-date-object": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
- "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "has-tostringtag": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
- "license": "MIT",
- "bin": {
- "is-docker": "cli.js"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-finalizationregistry": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
- "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-generator-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
- "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/is-generator-function": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz",
- "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "get-proto": "^1.0.0",
- "has-tostringtag": "^1.0.2",
- "safe-regex-test": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "license": "MIT",
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-map": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
- "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
- "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
- "license": "MIT"
- },
- "node_modules/is-negative-zero": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
- "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "license": "MIT",
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-number-object": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
- "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "has-tostringtag": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
- "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-plain-obj": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
- "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-potential-custom-element-name": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
- "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
- "license": "MIT"
- },
- "node_modules/is-regex": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
- "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "gopd": "^1.2.0",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-regexp": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
- "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-root": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz",
- "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/is-set": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
- "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-shared-array-buffer": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
- "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-string": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
- "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "has-tostringtag": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-symbol": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
- "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "has-symbols": "^1.1.0",
- "safe-regex-test": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-typed-array": {
- "version": "1.1.15",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
- "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
- "license": "MIT",
- "dependencies": {
- "which-typed-array": "^1.1.16"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
- "license": "MIT"
- },
- "node_modules/is-weakmap": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
- "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-weakref": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
- "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-weakset": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
- "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "get-intrinsic": "^1.2.6"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "license": "MIT",
- "dependencies": {
- "is-docker": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/isarray": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
- "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
- "license": "MIT"
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "license": "ISC"
- },
- "node_modules/istanbul-lib-coverage": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
- "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/istanbul-lib-instrument": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
- "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "@babel/core": "^7.12.3",
- "@babel/parser": "^7.14.7",
- "@istanbuljs/schema": "^0.1.2",
- "istanbul-lib-coverage": "^3.2.0",
- "semver": "^6.3.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/istanbul-lib-instrument/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/istanbul-lib-report": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
- "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "istanbul-lib-coverage": "^3.0.0",
- "make-dir": "^4.0.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/istanbul-lib-report/node_modules/make-dir": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
- "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
- "license": "MIT",
- "dependencies": {
- "semver": "^7.5.3"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/istanbul-lib-source-maps": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
- "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "debug": "^4.1.1",
- "istanbul-lib-coverage": "^3.0.0",
- "source-map": "^0.6.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/istanbul-lib-source-maps/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/istanbul-reports": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz",
- "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "html-escaper": "^2.0.0",
- "istanbul-lib-report": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/iterator.prototype": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
- "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
- "license": "MIT",
- "dependencies": {
- "define-data-property": "^1.1.4",
- "es-object-atoms": "^1.0.0",
- "get-intrinsic": "^1.2.6",
- "get-proto": "^1.0.0",
- "has-symbols": "^1.1.0",
- "set-function-name": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/jackspeak": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
- "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "@isaacs/cliui": "^8.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- },
- "optionalDependencies": {
- "@pkgjs/parseargs": "^0.11.0"
- }
- },
- "node_modules/jake": {
- "version": "10.9.4",
- "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz",
- "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==",
- "license": "Apache-2.0",
- "dependencies": {
- "async": "^3.2.6",
- "filelist": "^1.0.4",
- "picocolors": "^1.1.1"
- },
- "bin": {
- "jake": "bin/cli.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/jest": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz",
- "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "@jest/core": "^27.5.1",
- "import-local": "^3.0.2",
- "jest-cli": "^27.5.1"
- },
- "bin": {
- "jest": "bin/jest.js"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
- }
- },
- "node_modules/jest-changed-files": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz",
- "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "execa": "^5.0.0",
- "throat": "^6.0.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-changed-files/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-changed-files/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/jest-changed-files/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-circus": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz",
- "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==",
- "license": "MIT",
- "dependencies": {
- "@jest/environment": "^27.5.1",
- "@jest/test-result": "^27.5.1",
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "co": "^4.6.0",
- "dedent": "^0.7.0",
- "expect": "^27.5.1",
- "is-generator-fn": "^2.0.0",
- "jest-each": "^27.5.1",
- "jest-matcher-utils": "^27.5.1",
- "jest-message-util": "^27.5.1",
- "jest-runtime": "^27.5.1",
- "jest-snapshot": "^27.5.1",
- "jest-util": "^27.5.1",
- "pretty-format": "^27.5.1",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3",
- "throat": "^6.0.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-circus/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-circus/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/jest-circus/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-circus/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest-circus/node_modules/expect": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
- "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "jest-get-type": "^27.5.1",
- "jest-matcher-utils": "^27.5.1",
- "jest-message-util": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-circus/node_modules/jest-diff": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz",
- "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==",
- "license": "MIT",
- "dependencies": {
- "chalk": "^4.0.0",
- "diff-sequences": "^27.5.1",
- "jest-get-type": "^27.5.1",
- "pretty-format": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-circus/node_modules/jest-matcher-utils": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz",
- "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==",
- "license": "MIT",
- "dependencies": {
- "chalk": "^4.0.0",
- "jest-diff": "^27.5.1",
- "jest-get-type": "^27.5.1",
- "pretty-format": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-circus/node_modules/jest-message-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
- "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@jest/types": "^27.5.1",
- "@types/stack-utils": "^2.0.0",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "micromatch": "^4.0.4",
- "pretty-format": "^27.5.1",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-circus/node_modules/jest-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
- "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-circus/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/jest-cli": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz",
- "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==",
- "license": "MIT",
- "dependencies": {
- "@jest/core": "^27.5.1",
- "@jest/test-result": "^27.5.1",
- "@jest/types": "^27.5.1",
- "chalk": "^4.0.0",
- "exit": "^0.1.2",
- "graceful-fs": "^4.2.9",
- "import-local": "^3.0.2",
- "jest-config": "^27.5.1",
- "jest-util": "^27.5.1",
- "jest-validate": "^27.5.1",
- "prompts": "^2.0.1",
- "yargs": "^16.2.0"
- },
- "bin": {
- "jest": "bin/jest.js"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
- }
- },
- "node_modules/jest-cli/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-cli/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/jest-cli/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-cli/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest-cli/node_modules/jest-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
- "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-cli/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/jest-config": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz",
- "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==",
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.8.0",
- "@jest/test-sequencer": "^27.5.1",
- "@jest/types": "^27.5.1",
- "babel-jest": "^27.5.1",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "deepmerge": "^4.2.2",
- "glob": "^7.1.1",
- "graceful-fs": "^4.2.9",
- "jest-circus": "^27.5.1",
- "jest-environment-jsdom": "^27.5.1",
- "jest-environment-node": "^27.5.1",
- "jest-get-type": "^27.5.1",
- "jest-jasmine2": "^27.5.1",
- "jest-regex-util": "^27.5.1",
- "jest-resolve": "^27.5.1",
- "jest-runner": "^27.5.1",
- "jest-util": "^27.5.1",
- "jest-validate": "^27.5.1",
- "micromatch": "^4.0.4",
- "parse-json": "^5.2.0",
- "pretty-format": "^27.5.1",
- "slash": "^3.0.0",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- },
- "peerDependencies": {
- "ts-node": ">=9.0.0"
- },
- "peerDependenciesMeta": {
- "ts-node": {
- "optional": true
- }
- }
- },
- "node_modules/jest-config/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-config/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/jest-config/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-config/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest-config/node_modules/jest-regex-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
- "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
- "license": "MIT",
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-config/node_modules/jest-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
- "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-config/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/jest-diff": {
- "version": "30.1.2",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.1.2.tgz",
- "integrity": "sha512-4+prq+9J61mOVXCa4Qp8ZjavdxzrWQXrI80GNxP8f4tkI2syPuPrJgdRPZRrfUTRvIoUwcmNLbqEJy9W800+NQ==",
- "license": "MIT",
- "dependencies": {
- "@jest/diff-sequences": "30.0.1",
- "@jest/get-type": "30.1.0",
- "chalk": "^4.1.2",
- "pretty-format": "30.0.5"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/jest-diff/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-diff/node_modules/pretty-format": {
- "version": "30.0.5",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz",
- "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==",
- "license": "MIT",
- "dependencies": {
- "@jest/schemas": "30.0.5",
- "ansi-styles": "^5.2.0",
- "react-is": "^18.3.1"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/jest-diff/node_modules/pretty-format/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/jest-diff/node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "license": "MIT"
- },
- "node_modules/jest-docblock": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz",
- "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==",
- "license": "MIT",
- "dependencies": {
- "detect-newline": "^3.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-each": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz",
- "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "chalk": "^4.0.0",
- "jest-get-type": "^27.5.1",
- "jest-util": "^27.5.1",
- "pretty-format": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-each/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-each/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/jest-each/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-each/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest-each/node_modules/jest-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
- "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-each/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/jest-environment-jsdom": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz",
- "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==",
- "license": "MIT",
- "dependencies": {
- "@jest/environment": "^27.5.1",
- "@jest/fake-timers": "^27.5.1",
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "jest-mock": "^27.5.1",
- "jest-util": "^27.5.1",
- "jsdom": "^16.6.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-environment-jsdom/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-environment-jsdom/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/jest-environment-jsdom/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-environment-jsdom/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest-environment-jsdom/node_modules/jest-mock": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
- "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-environment-jsdom/node_modules/jest-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
- "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-environment-jsdom/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/jest-environment-node": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz",
- "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==",
- "license": "MIT",
- "dependencies": {
- "@jest/environment": "^27.5.1",
- "@jest/fake-timers": "^27.5.1",
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "jest-mock": "^27.5.1",
- "jest-util": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-environment-node/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-environment-node/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/jest-environment-node/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-environment-node/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest-environment-node/node_modules/jest-mock": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
- "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-environment-node/node_modules/jest-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
- "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-environment-node/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/jest-get-type": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz",
- "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==",
- "license": "MIT",
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-haste-map": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz",
- "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/graceful-fs": "^4.1.2",
- "@types/node": "*",
- "anymatch": "^3.0.3",
- "fb-watchman": "^2.0.0",
- "graceful-fs": "^4.2.9",
- "jest-regex-util": "^27.5.1",
- "jest-serializer": "^27.5.1",
- "jest-util": "^27.5.1",
- "jest-worker": "^27.5.1",
- "micromatch": "^4.0.4",
- "walker": "^1.0.7"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- },
- "optionalDependencies": {
- "fsevents": "^2.3.2"
- }
- },
- "node_modules/jest-haste-map/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-haste-map/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/jest-haste-map/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-haste-map/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest-haste-map/node_modules/jest-regex-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
- "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
- "license": "MIT",
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-haste-map/node_modules/jest-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
- "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-haste-map/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/jest-jasmine2": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz",
- "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==",
- "license": "MIT",
- "dependencies": {
- "@jest/environment": "^27.5.1",
- "@jest/source-map": "^27.5.1",
- "@jest/test-result": "^27.5.1",
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "co": "^4.6.0",
- "expect": "^27.5.1",
- "is-generator-fn": "^2.0.0",
- "jest-each": "^27.5.1",
- "jest-matcher-utils": "^27.5.1",
- "jest-message-util": "^27.5.1",
- "jest-runtime": "^27.5.1",
- "jest-snapshot": "^27.5.1",
- "jest-util": "^27.5.1",
- "pretty-format": "^27.5.1",
- "throat": "^6.0.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-jasmine2/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-jasmine2/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/jest-jasmine2/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-jasmine2/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest-jasmine2/node_modules/expect": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
- "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "jest-get-type": "^27.5.1",
- "jest-matcher-utils": "^27.5.1",
- "jest-message-util": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-jasmine2/node_modules/jest-diff": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz",
- "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==",
- "license": "MIT",
- "dependencies": {
- "chalk": "^4.0.0",
- "diff-sequences": "^27.5.1",
- "jest-get-type": "^27.5.1",
- "pretty-format": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-jasmine2/node_modules/jest-matcher-utils": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz",
- "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==",
- "license": "MIT",
- "dependencies": {
- "chalk": "^4.0.0",
- "jest-diff": "^27.5.1",
- "jest-get-type": "^27.5.1",
- "pretty-format": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-jasmine2/node_modules/jest-message-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
- "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@jest/types": "^27.5.1",
- "@types/stack-utils": "^2.0.0",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "micromatch": "^4.0.4",
- "pretty-format": "^27.5.1",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-jasmine2/node_modules/jest-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
- "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-jasmine2/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/jest-leak-detector": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz",
- "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==",
- "license": "MIT",
- "dependencies": {
- "jest-get-type": "^27.5.1",
- "pretty-format": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-matcher-utils": {
- "version": "30.1.2",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.1.2.tgz",
- "integrity": "sha512-7ai16hy4rSbDjvPTuUhuV8nyPBd6EX34HkBsBcBX2lENCuAQ0qKCPb/+lt8OSWUa9WWmGYLy41PrEzkwRwoGZQ==",
- "license": "MIT",
- "dependencies": {
- "@jest/get-type": "30.1.0",
- "chalk": "^4.1.2",
- "jest-diff": "30.1.2",
- "pretty-format": "30.0.5"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/jest-matcher-utils/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-matcher-utils/node_modules/pretty-format": {
- "version": "30.0.5",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz",
- "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==",
- "license": "MIT",
- "dependencies": {
- "@jest/schemas": "30.0.5",
- "ansi-styles": "^5.2.0",
- "react-is": "^18.3.1"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/jest-matcher-utils/node_modules/pretty-format/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/jest-matcher-utils/node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "license": "MIT"
- },
- "node_modules/jest-message-util": {
- "version": "30.1.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.1.0.tgz",
- "integrity": "sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.27.1",
- "@jest/types": "30.0.5",
- "@types/stack-utils": "^2.0.3",
- "chalk": "^4.1.2",
- "graceful-fs": "^4.2.11",
- "micromatch": "^4.0.8",
- "pretty-format": "30.0.5",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.6"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/jest-message-util/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-message-util/node_modules/pretty-format": {
- "version": "30.0.5",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz",
- "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==",
- "license": "MIT",
- "dependencies": {
- "@jest/schemas": "30.0.5",
- "ansi-styles": "^5.2.0",
- "react-is": "^18.3.1"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/jest-message-util/node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "license": "MIT"
- },
- "node_modules/jest-mock": {
- "version": "30.0.5",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz",
- "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "30.0.5",
- "@types/node": "*",
- "jest-util": "30.0.5"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/jest-pnp-resolver": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
- "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- },
- "peerDependencies": {
- "jest-resolve": "*"
- },
- "peerDependenciesMeta": {
- "jest-resolve": {
- "optional": true
- }
- }
- },
- "node_modules/jest-regex-util": {
- "version": "30.0.1",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz",
- "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==",
- "license": "MIT",
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/jest-resolve": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz",
- "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^27.5.1",
- "jest-pnp-resolver": "^1.2.2",
- "jest-util": "^27.5.1",
- "jest-validate": "^27.5.1",
- "resolve": "^1.20.0",
- "resolve.exports": "^1.1.0",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-resolve-dependencies": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz",
- "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "jest-regex-util": "^27.5.1",
- "jest-snapshot": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-resolve-dependencies/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-resolve-dependencies/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/jest-resolve-dependencies/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-resolve-dependencies/node_modules/jest-regex-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
- "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
- "license": "MIT",
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-resolve/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-resolve/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/jest-resolve/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-resolve/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest-resolve/node_modules/jest-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
- "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-resolve/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/jest-runner": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz",
- "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==",
- "license": "MIT",
- "dependencies": {
- "@jest/console": "^27.5.1",
- "@jest/environment": "^27.5.1",
- "@jest/test-result": "^27.5.1",
- "@jest/transform": "^27.5.1",
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "emittery": "^0.8.1",
- "graceful-fs": "^4.2.9",
- "jest-docblock": "^27.5.1",
- "jest-environment-jsdom": "^27.5.1",
- "jest-environment-node": "^27.5.1",
- "jest-haste-map": "^27.5.1",
- "jest-leak-detector": "^27.5.1",
- "jest-message-util": "^27.5.1",
- "jest-resolve": "^27.5.1",
- "jest-runtime": "^27.5.1",
- "jest-util": "^27.5.1",
- "jest-worker": "^27.5.1",
- "source-map-support": "^0.5.6",
- "throat": "^6.0.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-runner/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-runner/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/jest-runner/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-runner/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest-runner/node_modules/jest-message-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
- "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@jest/types": "^27.5.1",
- "@types/stack-utils": "^2.0.0",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "micromatch": "^4.0.4",
- "pretty-format": "^27.5.1",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-runner/node_modules/jest-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
- "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-runner/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/jest-runtime": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz",
- "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==",
- "license": "MIT",
- "dependencies": {
- "@jest/environment": "^27.5.1",
- "@jest/fake-timers": "^27.5.1",
- "@jest/globals": "^27.5.1",
- "@jest/source-map": "^27.5.1",
- "@jest/test-result": "^27.5.1",
- "@jest/transform": "^27.5.1",
- "@jest/types": "^27.5.1",
- "chalk": "^4.0.0",
- "cjs-module-lexer": "^1.0.0",
- "collect-v8-coverage": "^1.0.0",
- "execa": "^5.0.0",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^27.5.1",
- "jest-message-util": "^27.5.1",
- "jest-mock": "^27.5.1",
- "jest-regex-util": "^27.5.1",
- "jest-resolve": "^27.5.1",
- "jest-snapshot": "^27.5.1",
- "jest-util": "^27.5.1",
- "slash": "^3.0.0",
- "strip-bom": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-runtime/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-runtime/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/jest-runtime/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-runtime/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest-runtime/node_modules/jest-message-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
- "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@jest/types": "^27.5.1",
- "@types/stack-utils": "^2.0.0",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "micromatch": "^4.0.4",
- "pretty-format": "^27.5.1",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-runtime/node_modules/jest-mock": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
- "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-runtime/node_modules/jest-regex-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
- "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
- "license": "MIT",
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-runtime/node_modules/jest-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
- "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-runtime/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/jest-serializer": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz",
- "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "graceful-fs": "^4.2.9"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-snapshot": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz",
- "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==",
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.7.2",
- "@babel/generator": "^7.7.2",
- "@babel/plugin-syntax-typescript": "^7.7.2",
- "@babel/traverse": "^7.7.2",
- "@babel/types": "^7.0.0",
- "@jest/transform": "^27.5.1",
- "@jest/types": "^27.5.1",
- "@types/babel__traverse": "^7.0.4",
- "@types/prettier": "^2.1.5",
- "babel-preset-current-node-syntax": "^1.0.0",
- "chalk": "^4.0.0",
- "expect": "^27.5.1",
- "graceful-fs": "^4.2.9",
- "jest-diff": "^27.5.1",
- "jest-get-type": "^27.5.1",
- "jest-haste-map": "^27.5.1",
- "jest-matcher-utils": "^27.5.1",
- "jest-message-util": "^27.5.1",
- "jest-util": "^27.5.1",
- "natural-compare": "^1.4.0",
- "pretty-format": "^27.5.1",
- "semver": "^7.3.2"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-snapshot/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-snapshot/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/jest-snapshot/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-snapshot/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest-snapshot/node_modules/expect": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
- "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "jest-get-type": "^27.5.1",
- "jest-matcher-utils": "^27.5.1",
- "jest-message-util": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-snapshot/node_modules/jest-diff": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz",
- "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==",
- "license": "MIT",
- "dependencies": {
- "chalk": "^4.0.0",
- "diff-sequences": "^27.5.1",
- "jest-get-type": "^27.5.1",
- "pretty-format": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-snapshot/node_modules/jest-matcher-utils": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz",
- "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==",
- "license": "MIT",
- "dependencies": {
- "chalk": "^4.0.0",
- "jest-diff": "^27.5.1",
- "jest-get-type": "^27.5.1",
- "pretty-format": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-snapshot/node_modules/jest-message-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
- "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@jest/types": "^27.5.1",
- "@types/stack-utils": "^2.0.0",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "micromatch": "^4.0.4",
- "pretty-format": "^27.5.1",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-snapshot/node_modules/jest-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
- "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-snapshot/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/jest-util": {
- "version": "30.0.5",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz",
- "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "30.0.5",
- "@types/node": "*",
- "chalk": "^4.1.2",
- "ci-info": "^4.2.0",
- "graceful-fs": "^4.2.11",
- "picomatch": "^4.0.2"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/jest-util/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-validate": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz",
- "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "camelcase": "^6.2.0",
- "chalk": "^4.0.0",
- "jest-get-type": "^27.5.1",
- "leven": "^3.1.0",
- "pretty-format": "^27.5.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-validate/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-validate/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/jest-validate/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-watch-typeahead": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz",
- "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==",
- "license": "MIT",
- "dependencies": {
- "ansi-escapes": "^4.3.1",
- "chalk": "^4.0.0",
- "jest-regex-util": "^28.0.0",
- "jest-watcher": "^28.0.0",
- "slash": "^4.0.0",
- "string-length": "^5.0.1",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "peerDependencies": {
- "jest": "^27.0.0 || ^28.0.0"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/@jest/console": {
- "version": "28.1.3",
- "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz",
- "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^28.1.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "jest-message-util": "^28.1.3",
- "jest-util": "^28.1.3",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/@jest/schemas": {
- "version": "28.1.3",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz",
- "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==",
- "license": "MIT",
- "dependencies": {
- "@sinclair/typebox": "^0.24.1"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": {
- "version": "28.1.3",
- "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz",
- "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==",
- "license": "MIT",
- "dependencies": {
- "@jest/console": "^28.1.3",
- "@jest/types": "^28.1.3",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "collect-v8-coverage": "^1.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/@jest/types": {
- "version": "28.1.3",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz",
- "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==",
- "license": "MIT",
- "dependencies": {
- "@jest/schemas": "^28.1.3",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^17.0.8",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/@sinclair/typebox": {
- "version": "0.24.51",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz",
- "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==",
- "license": "MIT"
- },
- "node_modules/jest-watch-typeahead/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/emittery": {
- "version": "0.10.2",
- "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz",
- "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==",
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/emittery?sponsor=1"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/jest-message-util": {
- "version": "28.1.3",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz",
- "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@jest/types": "^28.1.3",
- "@types/stack-utils": "^2.0.0",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "micromatch": "^4.0.4",
- "pretty-format": "^28.1.3",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": {
- "version": "28.0.2",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz",
- "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==",
- "license": "MIT",
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/jest-util": {
- "version": "28.1.3",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz",
- "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^28.1.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/jest-watcher": {
- "version": "28.1.3",
- "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz",
- "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==",
- "license": "MIT",
- "dependencies": {
- "@jest/test-result": "^28.1.3",
- "@jest/types": "^28.1.3",
- "@types/node": "*",
- "ansi-escapes": "^4.2.1",
- "chalk": "^4.0.0",
- "emittery": "^0.10.2",
- "jest-util": "^28.1.3",
- "string-length": "^4.0.1"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
- "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
- "license": "MIT",
- "dependencies": {
- "char-regex": "^1.0.2",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/pretty-format": {
- "version": "28.1.3",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz",
- "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==",
- "license": "MIT",
- "dependencies": {
- "@jest/schemas": "^28.1.3",
- "ansi-regex": "^5.0.1",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/pretty-format/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "license": "MIT"
- },
- "node_modules/jest-watch-typeahead/node_modules/slash": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
- "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/string-length": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz",
- "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==",
- "license": "MIT",
- "dependencies": {
- "char-regex": "^2.0.0",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": ">=12.20"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz",
- "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==",
- "license": "MIT",
- "engines": {
- "node": ">=12.20"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
- "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz",
- "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==",
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
- }
- },
- "node_modules/jest-watcher": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz",
- "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==",
- "license": "MIT",
- "dependencies": {
- "@jest/test-result": "^27.5.1",
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "ansi-escapes": "^4.2.1",
- "chalk": "^4.0.0",
- "jest-util": "^27.5.1",
- "string-length": "^4.0.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-watcher/node_modules/@jest/types": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^16.0.0",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-watcher/node_modules/@types/yargs": {
- "version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/jest-watcher/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-watcher/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest-watcher/node_modules/jest-util": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
- "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^27.5.1",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/jest-watcher/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/jest-worker": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
- "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- }
- },
- "node_modules/jest-worker/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/jiti": {
- "version": "1.21.7",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
- "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
- "license": "MIT",
- "bin": {
- "jiti": "bin/jiti.js"
- }
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "license": "MIT"
- },
- "node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "license": "MIT",
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/jsdom": {
- "version": "16.7.0",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz",
- "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==",
- "license": "MIT",
- "dependencies": {
- "abab": "^2.0.5",
- "acorn": "^8.2.4",
- "acorn-globals": "^6.0.0",
- "cssom": "^0.4.4",
- "cssstyle": "^2.3.0",
- "data-urls": "^2.0.0",
- "decimal.js": "^10.2.1",
- "domexception": "^2.0.1",
- "escodegen": "^2.0.0",
- "form-data": "^3.0.0",
- "html-encoding-sniffer": "^2.0.1",
- "http-proxy-agent": "^4.0.1",
- "https-proxy-agent": "^5.0.0",
- "is-potential-custom-element-name": "^1.0.1",
- "nwsapi": "^2.2.0",
- "parse5": "6.0.1",
- "saxes": "^5.0.1",
- "symbol-tree": "^3.2.4",
- "tough-cookie": "^4.0.0",
- "w3c-hr-time": "^1.0.2",
- "w3c-xmlserializer": "^2.0.0",
- "webidl-conversions": "^6.1.0",
- "whatwg-encoding": "^1.0.5",
- "whatwg-mimetype": "^2.3.0",
- "whatwg-url": "^8.5.0",
- "ws": "^7.4.6",
- "xml-name-validator": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "canvas": "^2.5.0"
- },
- "peerDependenciesMeta": {
- "canvas": {
- "optional": true
- }
- }
- },
- "node_modules/jsdom/node_modules/form-data": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz",
- "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==",
- "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.35"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/jsesc": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
- "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
- "license": "MIT",
- "bin": {
- "jsesc": "bin/jsesc"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
- "license": "MIT"
- },
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "license": "MIT"
- },
- "node_modules/json-schema": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
- "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
- "license": "(AFL-2.1 OR BSD-3-Clause)"
- },
- "node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "license": "MIT"
- },
- "node_modules/json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "license": "MIT"
- },
- "node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "license": "MIT",
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/jsonfile": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
- "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
- "license": "MIT",
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/jsonpath": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz",
- "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==",
- "license": "MIT",
- "dependencies": {
- "esprima": "1.2.2",
- "static-eval": "2.0.2",
- "underscore": "1.12.1"
- }
- },
- "node_modules/jsonpath/node_modules/esprima": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz",
- "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==",
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/jsonpointer": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz",
- "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/jsx-ast-utils": {
- "version": "3.3.5",
- "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
- "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
- "license": "MIT",
- "dependencies": {
- "array-includes": "^3.1.6",
- "array.prototype.flat": "^1.3.1",
- "object.assign": "^4.1.4",
- "object.values": "^1.1.6"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/keyv": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
- "license": "MIT",
- "dependencies": {
- "json-buffer": "3.0.1"
- }
- },
- "node_modules/kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/kleur": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
- "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/klona": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
- "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/language-subtag-registry": {
- "version": "0.3.23",
- "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
- "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
- "license": "CC0-1.0"
- },
- "node_modules/language-tags": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
- "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
- "license": "MIT",
- "dependencies": {
- "language-subtag-registry": "^0.3.20"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/launch-editor": {
- "version": "2.11.1",
- "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz",
- "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==",
- "license": "MIT",
- "dependencies": {
- "picocolors": "^1.1.1",
- "shell-quote": "^1.8.3"
- }
- },
- "node_modules/leven": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
- "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
- "license": "MIT",
- "dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/lilconfig": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
- "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "license": "MIT"
- },
- "node_modules/loader-runner": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
- "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
- "license": "MIT",
- "engines": {
- "node": ">=6.11.5"
- }
- },
- "node_modules/loader-utils": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
- "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
- "license": "MIT",
- "dependencies": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
- },
- "engines": {
- "node": ">=8.9.0"
- }
- },
- "node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "license": "MIT",
- "dependencies": {
- "p-locate": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "license": "MIT"
- },
- "node_modules/lodash.debounce": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
- "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
- "license": "MIT"
- },
- "node_modules/lodash.memoize": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
- "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
- "license": "MIT"
- },
- "node_modules/lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
- "license": "MIT"
- },
- "node_modules/lodash.sortby": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
- "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
- "license": "MIT"
- },
- "node_modules/lodash.uniq": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
- "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
- "license": "MIT"
- },
- "node_modules/loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "license": "MIT",
- "dependencies": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- },
- "bin": {
- "loose-envify": "cli.js"
- }
- },
- "node_modules/lower-case": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
- "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.3"
- }
- },
- "node_modules/lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "license": "ISC",
- "dependencies": {
- "yallist": "^3.0.2"
- }
- },
- "node_modules/lz-string": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
- "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==",
- "license": "MIT",
- "bin": {
- "lz-string": "bin/bin.js"
- }
- },
- "node_modules/magic-string": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
- "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
- "license": "MIT",
- "dependencies": {
- "sourcemap-codec": "^1.4.8"
- }
- },
- "node_modules/make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
- "license": "MIT",
- "dependencies": {
- "semver": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/make-dir/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/makeerror": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
- "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "tmpl": "1.0.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/mdn-data": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
- "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
- "license": "CC0-1.0"
- },
- "node_modules/media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/memfs": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz",
- "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==",
- "license": "Unlicense",
- "dependencies": {
- "fs-monkey": "^1.0.4"
- },
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/merge-descriptors": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
- "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
- "license": "MIT"
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
- "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
- "license": "MIT",
- "dependencies": {
- "braces": "^3.0.3",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/micromatch/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "license": "MIT",
- "bin": {
- "mime": "cli.js"
- },
- "engines": {
- "node": ">=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/mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/min-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
- "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/mini-css-extract-plugin": {
- "version": "2.9.4",
- "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz",
- "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==",
- "license": "MIT",
- "dependencies": {
- "schema-utils": "^4.0.0",
- "tapable": "^2.2.1"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.0.0"
- }
- },
- "node_modules/minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
- "license": "ISC"
- },
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "license": "ISC",
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
- "license": "MIT",
- "dependencies": {
- "minimist": "^1.2.6"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
- "node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/multicast-dns": {
- "version": "7.2.5",
- "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
- "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
- "license": "MIT",
- "dependencies": {
- "dns-packet": "^5.2.2",
- "thunky": "^1.0.2"
- },
- "bin": {
- "multicast-dns": "cli.js"
- }
- },
- "node_modules/mz": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
- "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0",
- "object-assign": "^4.0.1",
- "thenify-all": "^1.0.0"
- }
- },
- "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/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "license": "MIT"
- },
- "node_modules/natural-compare-lite": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
- "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
- "license": "MIT"
- },
- "node_modules/negotiator": {
- "version": "0.6.4",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
- "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/neo-async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
- "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
- "license": "MIT"
- },
- "node_modules/no-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
- "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
- "license": "MIT",
- "dependencies": {
- "lower-case": "^2.0.2",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/node-forge": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
- "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
- "license": "(BSD-3-Clause OR GPL-2.0)",
- "engines": {
- "node": ">= 6.13.0"
- }
- },
- "node_modules/node-int64": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
- "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
- "license": "MIT"
- },
- "node_modules/node-releases": {
- "version": "2.0.19",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
- "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
- "license": "MIT"
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/normalize-range": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
- "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/normalize-url": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
- "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
- "license": "MIT",
- "dependencies": {
- "path-key": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/nth-check": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
- "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "boolbase": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/fb55/nth-check?sponsor=1"
- }
- },
- "node_modules/nwsapi": {
- "version": "2.2.21",
- "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.21.tgz",
- "integrity": "sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==",
- "license": "MIT"
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-hash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
- "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.13.4",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
- "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object-is": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz",
- "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.assign": {
- "version": "4.1.7",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
- "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
- "define-properties": "^1.2.1",
- "es-object-atoms": "^1.0.0",
- "has-symbols": "^1.1.0",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.entries": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz",
- "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.4",
- "define-properties": "^1.2.1",
- "es-object-atoms": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.fromentries": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
- "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.getownpropertydescriptors": {
- "version": "2.1.8",
- "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz",
- "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==",
- "license": "MIT",
- "dependencies": {
- "array.prototype.reduce": "^1.0.6",
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
- "es-object-atoms": "^1.0.0",
- "gopd": "^1.0.1",
- "safe-array-concat": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.8"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.groupby": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
- "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.values": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
- "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
- "define-properties": "^1.2.1",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/obuf": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
- "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
- "license": "MIT"
- },
- "node_modules/on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "license": "MIT",
- "dependencies": {
- "ee-first": "1.1.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/on-headers": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz",
- "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "license": "ISC",
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "license": "MIT",
- "dependencies": {
- "mimic-fn": "^2.1.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/open": {
- "version": "8.4.2",
- "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
- "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
- "license": "MIT",
- "dependencies": {
- "define-lazy-prop": "^2.0.0",
- "is-docker": "^2.1.1",
- "is-wsl": "^2.2.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/optionator": {
- "version": "0.9.4",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
- "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
- "license": "MIT",
- "dependencies": {
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0",
- "word-wrap": "^1.2.5"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/own-keys": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
- "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
- "license": "MIT",
- "dependencies": {
- "get-intrinsic": "^1.2.6",
- "object-keys": "^1.1.1",
- "safe-push-apply": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "license": "MIT",
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "license": "MIT",
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-retry": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
- "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
- "license": "MIT",
- "dependencies": {
- "@types/retry": "0.12.0",
- "retry": "^0.13.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/package-json-from-dist": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
- "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
- "license": "BlueOak-1.0.0"
- },
- "node_modules/param-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
- "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
- "license": "MIT",
- "dependencies": {
- "dot-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "license": "MIT",
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/parse5": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
- "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
- "license": "MIT"
- },
- "node_modules/parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/pascal-case": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
- "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
- "license": "MIT",
- "dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "license": "MIT"
- },
- "node_modules/path-scurry": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
- "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "lru-cache": "^10.2.0",
- "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
- },
- "engines": {
- "node": ">=16 || 14 >=14.18"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/path-scurry/node_modules/lru-cache": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
- "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
- "license": "ISC"
- },
- "node_modules/path-to-regexp": {
- "version": "0.1.12",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
- "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
- "license": "MIT"
- },
- "node_modules/path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
- "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==",
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/pirates": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
- "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
- "license": "MIT",
- "dependencies": {
- "find-up": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/pkg-up": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz",
- "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
- "license": "MIT",
- "dependencies": {
- "find-up": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/pkg-up/node_modules/find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "license": "MIT",
- "dependencies": {
- "locate-path": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/pkg-up/node_modules/locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "license": "MIT",
- "dependencies": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/pkg-up/node_modules/p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "license": "MIT",
- "dependencies": {
- "p-limit": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/pkg-up/node_modules/path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/possible-typed-array-names": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
- "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "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",
- "peer": true,
- "dependencies": {
- "nanoid": "^3.3.11",
- "picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/postcss-attribute-case-insensitive": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz",
- "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==",
- "license": "MIT",
- "dependencies": {
- "postcss-selector-parser": "^6.0.10"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/postcss-browser-comments": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz",
- "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==",
- "license": "CC0-1.0",
- "engines": {
- "node": ">=8"
- },
- "peerDependencies": {
- "browserslist": ">=4",
- "postcss": ">=8"
- }
- },
- "node_modules/postcss-calc": {
- "version": "8.2.4",
- "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz",
- "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==",
- "license": "MIT",
- "dependencies": {
- "postcss-selector-parser": "^6.0.9",
- "postcss-value-parser": "^4.2.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.2"
- }
- },
- "node_modules/postcss-clamp": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz",
- "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==",
- "license": "MIT",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": ">=7.6.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.6"
- }
- },
- "node_modules/postcss-color-functional-notation": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz",
- "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==",
- "license": "CC0-1.0",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/postcss-color-hex-alpha": {
- "version": "8.0.4",
- "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz",
- "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==",
- "license": "MIT",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.4"
- }
- },
- "node_modules/postcss-color-rebeccapurple": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz",
- "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==",
- "license": "CC0-1.0",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/postcss-colormin": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz",
- "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==",
- "license": "MIT",
- "dependencies": {
- "browserslist": "^4.21.4",
- "caniuse-api": "^3.0.0",
- "colord": "^2.9.1",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-convert-values": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz",
- "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==",
- "license": "MIT",
- "dependencies": {
- "browserslist": "^4.21.4",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-custom-media": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz",
- "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==",
- "license": "MIT",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/postcss-custom-properties": {
- "version": "12.1.11",
- "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz",
- "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==",
- "license": "MIT",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/postcss-custom-selectors": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz",
- "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==",
- "license": "MIT",
- "dependencies": {
- "postcss-selector-parser": "^6.0.4"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/postcss-dir-pseudo-class": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz",
- "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==",
- "license": "CC0-1.0",
- "dependencies": {
- "postcss-selector-parser": "^6.0.10"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/postcss-discard-comments": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz",
- "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==",
- "license": "MIT",
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-discard-duplicates": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz",
- "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==",
- "license": "MIT",
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-discard-empty": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz",
- "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==",
- "license": "MIT",
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-discard-overridden": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz",
- "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==",
- "license": "MIT",
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-double-position-gradients": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz",
- "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==",
- "license": "CC0-1.0",
- "dependencies": {
- "@csstools/postcss-progressive-custom-properties": "^1.1.0",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/postcss-env-function": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz",
- "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==",
- "license": "CC0-1.0",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "peerDependencies": {
- "postcss": "^8.4"
- }
- },
- "node_modules/postcss-flexbugs-fixes": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz",
- "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==",
- "license": "MIT",
- "peerDependencies": {
- "postcss": "^8.1.4"
- }
- },
- "node_modules/postcss-focus-visible": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz",
- "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==",
- "license": "CC0-1.0",
- "dependencies": {
- "postcss-selector-parser": "^6.0.9"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "peerDependencies": {
- "postcss": "^8.4"
- }
- },
- "node_modules/postcss-focus-within": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz",
- "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==",
- "license": "CC0-1.0",
- "dependencies": {
- "postcss-selector-parser": "^6.0.9"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "peerDependencies": {
- "postcss": "^8.4"
- }
- },
- "node_modules/postcss-font-variant": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz",
- "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==",
- "license": "MIT",
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-gap-properties": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz",
- "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==",
- "license": "CC0-1.0",
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/postcss-image-set-function": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz",
- "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==",
- "license": "CC0-1.0",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/postcss-import": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
- "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
- "license": "MIT",
- "dependencies": {
- "postcss-value-parser": "^4.0.0",
- "read-cache": "^1.0.0",
- "resolve": "^1.1.7"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "postcss": "^8.0.0"
- }
- },
- "node_modules/postcss-initial": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz",
- "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==",
- "license": "MIT",
- "peerDependencies": {
- "postcss": "^8.0.0"
- }
- },
- "node_modules/postcss-js": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
- "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
- "license": "MIT",
- "dependencies": {
- "camelcase-css": "^2.0.1"
- },
- "engines": {
- "node": "^12 || ^14 || >= 16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- "peerDependencies": {
- "postcss": "^8.4.21"
- }
- },
- "node_modules/postcss-lab-function": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz",
- "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==",
- "license": "CC0-1.0",
- "dependencies": {
- "@csstools/postcss-progressive-custom-properties": "^1.1.0",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/postcss-load-config": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
- "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "lilconfig": "^3.0.0",
- "yaml": "^2.3.4"
- },
- "engines": {
- "node": ">= 14"
- },
- "peerDependencies": {
- "postcss": ">=8.0.9",
- "ts-node": ">=9.0.0"
- },
- "peerDependenciesMeta": {
- "postcss": {
- "optional": true
- },
- "ts-node": {
- "optional": true
- }
- }
- },
- "node_modules/postcss-load-config/node_modules/lilconfig": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
- "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
- "license": "MIT",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/antonk52"
- }
- },
- "node_modules/postcss-load-config/node_modules/yaml": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
- "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
- "license": "ISC",
- "bin": {
- "yaml": "bin.mjs"
- },
- "engines": {
- "node": ">= 14.6"
- }
- },
- "node_modules/postcss-loader": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz",
- "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==",
- "license": "MIT",
- "dependencies": {
- "cosmiconfig": "^7.0.0",
- "klona": "^2.0.5",
- "semver": "^7.3.5"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "postcss": "^7.0.0 || ^8.0.1",
- "webpack": "^5.0.0"
- }
- },
- "node_modules/postcss-logical": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz",
- "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==",
- "license": "CC0-1.0",
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "peerDependencies": {
- "postcss": "^8.4"
- }
- },
- "node_modules/postcss-media-minmax": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz",
- "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==",
- "license": "MIT",
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-merge-longhand": {
- "version": "5.1.7",
- "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz",
- "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==",
- "license": "MIT",
- "dependencies": {
- "postcss-value-parser": "^4.2.0",
- "stylehacks": "^5.1.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-merge-rules": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz",
- "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==",
- "license": "MIT",
- "dependencies": {
- "browserslist": "^4.21.4",
- "caniuse-api": "^3.0.0",
- "cssnano-utils": "^3.1.0",
- "postcss-selector-parser": "^6.0.5"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-minify-font-values": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz",
- "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==",
- "license": "MIT",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-minify-gradients": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz",
- "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==",
- "license": "MIT",
- "dependencies": {
- "colord": "^2.9.1",
- "cssnano-utils": "^3.1.0",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-minify-params": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz",
- "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==",
- "license": "MIT",
- "dependencies": {
- "browserslist": "^4.21.4",
- "cssnano-utils": "^3.1.0",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-minify-selectors": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz",
- "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==",
- "license": "MIT",
- "dependencies": {
- "postcss-selector-parser": "^6.0.5"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-modules-extract-imports": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz",
- "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==",
- "license": "ISC",
- "engines": {
- "node": "^10 || ^12 || >= 14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-modules-local-by-default": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz",
- "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==",
- "license": "MIT",
- "dependencies": {
- "icss-utils": "^5.0.0",
- "postcss-selector-parser": "^7.0.0",
- "postcss-value-parser": "^4.1.0"
- },
- "engines": {
- "node": "^10 || ^12 || >= 14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
- "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
- "license": "MIT",
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/postcss-modules-scope": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz",
- "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==",
- "license": "ISC",
- "dependencies": {
- "postcss-selector-parser": "^7.0.0"
- },
- "engines": {
- "node": "^10 || ^12 || >= 14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
- "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
- "license": "MIT",
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/postcss-modules-values": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
- "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
- "license": "ISC",
- "dependencies": {
- "icss-utils": "^5.0.0"
- },
- "engines": {
- "node": "^10 || ^12 || >= 14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-nested": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
- "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "postcss-selector-parser": "^6.1.1"
- },
- "engines": {
- "node": ">=12.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.14"
- }
- },
- "node_modules/postcss-nesting": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz",
- "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==",
- "license": "CC0-1.0",
- "dependencies": {
- "@csstools/selector-specificity": "^2.0.0",
- "postcss-selector-parser": "^6.0.10"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/postcss-normalize": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz",
- "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==",
- "license": "CC0-1.0",
- "dependencies": {
- "@csstools/normalize.css": "*",
- "postcss-browser-comments": "^4",
- "sanitize.css": "*"
- },
- "engines": {
- "node": ">= 12"
- },
- "peerDependencies": {
- "browserslist": ">= 4",
- "postcss": ">= 8"
- }
- },
- "node_modules/postcss-normalize-charset": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz",
- "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==",
- "license": "MIT",
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-normalize-display-values": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz",
- "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==",
- "license": "MIT",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-normalize-positions": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz",
- "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==",
- "license": "MIT",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-normalize-repeat-style": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz",
- "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==",
- "license": "MIT",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-normalize-string": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz",
- "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==",
- "license": "MIT",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-normalize-timing-functions": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz",
- "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==",
- "license": "MIT",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-normalize-unicode": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz",
- "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==",
- "license": "MIT",
- "dependencies": {
- "browserslist": "^4.21.4",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-normalize-url": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz",
- "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==",
- "license": "MIT",
- "dependencies": {
- "normalize-url": "^6.0.1",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-normalize-whitespace": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz",
- "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==",
- "license": "MIT",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-opacity-percentage": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz",
- "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==",
- "funding": [
- {
- "type": "kofi",
- "url": "https://ko-fi.com/mrcgrtz"
- },
- {
- "type": "liberapay",
- "url": "https://liberapay.com/mrcgrtz"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/postcss-ordered-values": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz",
- "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==",
- "license": "MIT",
- "dependencies": {
- "cssnano-utils": "^3.1.0",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-overflow-shorthand": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz",
- "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==",
- "license": "CC0-1.0",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/postcss-page-break": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz",
- "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==",
- "license": "MIT",
- "peerDependencies": {
- "postcss": "^8"
- }
- },
- "node_modules/postcss-place": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz",
- "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==",
- "license": "CC0-1.0",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/postcss-preset-env": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz",
- "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==",
- "license": "CC0-1.0",
- "dependencies": {
- "@csstools/postcss-cascade-layers": "^1.1.1",
- "@csstools/postcss-color-function": "^1.1.1",
- "@csstools/postcss-font-format-keywords": "^1.0.1",
- "@csstools/postcss-hwb-function": "^1.0.2",
- "@csstools/postcss-ic-unit": "^1.0.1",
- "@csstools/postcss-is-pseudo-class": "^2.0.7",
- "@csstools/postcss-nested-calc": "^1.0.0",
- "@csstools/postcss-normalize-display-values": "^1.0.1",
- "@csstools/postcss-oklab-function": "^1.1.1",
- "@csstools/postcss-progressive-custom-properties": "^1.3.0",
- "@csstools/postcss-stepped-value-functions": "^1.0.1",
- "@csstools/postcss-text-decoration-shorthand": "^1.0.0",
- "@csstools/postcss-trigonometric-functions": "^1.0.2",
- "@csstools/postcss-unset-value": "^1.0.2",
- "autoprefixer": "^10.4.13",
- "browserslist": "^4.21.4",
- "css-blank-pseudo": "^3.0.3",
- "css-has-pseudo": "^3.0.4",
- "css-prefers-color-scheme": "^6.0.3",
- "cssdb": "^7.1.0",
- "postcss-attribute-case-insensitive": "^5.0.2",
- "postcss-clamp": "^4.1.0",
- "postcss-color-functional-notation": "^4.2.4",
- "postcss-color-hex-alpha": "^8.0.4",
- "postcss-color-rebeccapurple": "^7.1.1",
- "postcss-custom-media": "^8.0.2",
- "postcss-custom-properties": "^12.1.10",
- "postcss-custom-selectors": "^6.0.3",
- "postcss-dir-pseudo-class": "^6.0.5",
- "postcss-double-position-gradients": "^3.1.2",
- "postcss-env-function": "^4.0.6",
- "postcss-focus-visible": "^6.0.4",
- "postcss-focus-within": "^5.0.4",
- "postcss-font-variant": "^5.0.0",
- "postcss-gap-properties": "^3.0.5",
- "postcss-image-set-function": "^4.0.7",
- "postcss-initial": "^4.0.1",
- "postcss-lab-function": "^4.2.1",
- "postcss-logical": "^5.0.4",
- "postcss-media-minmax": "^5.0.0",
- "postcss-nesting": "^10.2.0",
- "postcss-opacity-percentage": "^1.1.2",
- "postcss-overflow-shorthand": "^3.0.4",
- "postcss-page-break": "^3.0.4",
- "postcss-place": "^7.0.5",
- "postcss-pseudo-class-any-link": "^7.1.6",
- "postcss-replace-overflow-wrap": "^4.0.0",
- "postcss-selector-not": "^6.0.1",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/postcss-pseudo-class-any-link": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz",
- "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==",
- "license": "CC0-1.0",
- "dependencies": {
- "postcss-selector-parser": "^6.0.10"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/postcss-reduce-initial": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz",
- "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==",
- "license": "MIT",
- "dependencies": {
- "browserslist": "^4.21.4",
- "caniuse-api": "^3.0.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-reduce-transforms": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz",
- "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==",
- "license": "MIT",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-replace-overflow-wrap": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz",
- "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==",
- "license": "MIT",
- "peerDependencies": {
- "postcss": "^8.0.3"
- }
- },
- "node_modules/postcss-selector-not": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz",
- "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==",
- "license": "MIT",
- "dependencies": {
- "postcss-selector-parser": "^6.0.10"
- },
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/postcss-selector-parser": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
- "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/postcss-svgo": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz",
- "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==",
- "license": "MIT",
- "dependencies": {
- "postcss-value-parser": "^4.2.0",
- "svgo": "^2.7.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-svgo/node_modules/commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
- "license": "MIT",
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/postcss-svgo/node_modules/css-tree": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
- "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
- "license": "MIT",
- "dependencies": {
- "mdn-data": "2.0.14",
- "source-map": "^0.6.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/postcss-svgo/node_modules/mdn-data": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
- "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
- "license": "CC0-1.0"
- },
- "node_modules/postcss-svgo/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/postcss-svgo/node_modules/svgo": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
- "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
- "license": "MIT",
- "dependencies": {
- "@trysound/sax": "0.2.0",
- "commander": "^7.2.0",
- "css-select": "^4.1.3",
- "css-tree": "^1.1.3",
- "csso": "^4.2.0",
- "picocolors": "^1.0.0",
- "stable": "^0.1.8"
- },
- "bin": {
- "svgo": "bin/svgo"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/postcss-unique-selectors": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz",
- "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==",
- "license": "MIT",
- "dependencies": {
- "postcss-selector-parser": "^6.0.5"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/postcss-value-parser": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
- "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
- "license": "MIT"
- },
- "node_modules/prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/pretty-bytes": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
- "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/pretty-error": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
- "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==",
- "license": "MIT",
- "dependencies": {
- "lodash": "^4.17.20",
- "renderkid": "^3.0.0"
- }
- },
- "node_modules/pretty-format": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
- "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1",
- "ansi-styles": "^5.0.0",
- "react-is": "^17.0.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/pretty-format/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "license": "MIT"
- },
- "node_modules/promise": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
- "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
- "license": "MIT",
- "dependencies": {
- "asap": "~2.0.6"
- }
- },
- "node_modules/prompts": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
- "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
- "license": "MIT",
- "dependencies": {
- "kleur": "^3.0.3",
- "sisteransi": "^1.0.5"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/prop-types": {
- "version": "15.8.1",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
- "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
- "license": "MIT",
- "dependencies": {
- "loose-envify": "^1.4.0",
- "object-assign": "^4.1.1",
- "react-is": "^16.13.1"
- }
- },
- "node_modules/prop-types/node_modules/react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
- "license": "MIT"
- },
- "node_modules/proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "license": "MIT",
- "dependencies": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/proxy-addr/node_modules/ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "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/psl": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
- "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
- "license": "MIT",
- "dependencies": {
- "punycode": "^2.3.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/lupomontero"
- }
- },
- "node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/q": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
- "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
- "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)",
- "license": "MIT",
- "engines": {
- "node": ">=0.6.0",
- "teleport": ">=0.2.0"
- }
- },
- "node_modules/qs": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
- "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "side-channel": "^1.0.6"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/querystringify": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
- "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
- "license": "MIT"
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
- "node_modules/raf": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
- "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
- "license": "MIT",
- "dependencies": {
- "performance-now": "^2.1.0"
- }
- },
- "node_modules/randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "^5.1.0"
- }
- },
- "node_modules/range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/raw-body": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
- "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
- "license": "MIT",
- "dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/raw-body/node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "license": "MIT",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
- "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "loose-envify": "^1.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-app-polyfill": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz",
- "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==",
- "license": "MIT",
- "dependencies": {
- "core-js": "^3.19.2",
- "object-assign": "^4.1.1",
- "promise": "^8.1.0",
- "raf": "^3.4.1",
- "regenerator-runtime": "^0.13.9",
- "whatwg-fetch": "^3.6.2"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/react-dev-utils": {
- "version": "12.0.1",
- "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz",
- "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.16.0",
- "address": "^1.1.2",
- "browserslist": "^4.18.1",
- "chalk": "^4.1.2",
- "cross-spawn": "^7.0.3",
- "detect-port-alt": "^1.1.6",
- "escape-string-regexp": "^4.0.0",
- "filesize": "^8.0.6",
- "find-up": "^5.0.0",
- "fork-ts-checker-webpack-plugin": "^6.5.0",
- "global-modules": "^2.0.0",
- "globby": "^11.0.4",
- "gzip-size": "^6.0.0",
- "immer": "^9.0.7",
- "is-root": "^2.1.0",
- "loader-utils": "^3.2.0",
- "open": "^8.4.0",
- "pkg-up": "^3.1.0",
- "prompts": "^2.4.2",
- "react-error-overlay": "^6.0.11",
- "recursive-readdir": "^2.2.2",
- "shell-quote": "^1.7.3",
- "strip-ansi": "^6.0.1",
- "text-table": "^0.2.0"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/react-dev-utils/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/react-dev-utils/node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "license": "MIT",
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/react-dev-utils/node_modules/loader-utils": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz",
- "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==",
- "license": "MIT",
- "engines": {
- "node": ">= 12.13.0"
- }
- },
- "node_modules/react-dev-utils/node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "license": "MIT",
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/react-dev-utils/node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "license": "MIT",
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/react-dev-utils/node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "license": "MIT",
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/react-dom": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
- "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "loose-envify": "^1.1.0",
- "scheduler": "^0.23.2"
- },
- "peerDependencies": {
- "react": "^18.3.1"
- }
- },
- "node_modules/react-error-overlay": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.1.0.tgz",
- "integrity": "sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==",
- "license": "MIT"
- },
- "node_modules/react-hot-toast": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.6.0.tgz",
- "integrity": "sha512-bH+2EBMZ4sdyou/DPrfgIouFpcRLCJ+HoCA32UoAYHn6T3Ur5yfcDCeSr5mwldl6pFOsiocmrXMuoCJ1vV8bWg==",
- "license": "MIT",
- "dependencies": {
- "csstype": "^3.1.3",
- "goober": "^2.1.16"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "react": ">=16",
- "react-dom": ">=16"
- }
- },
- "node_modules/react-icons": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz",
- "integrity": "sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==",
- "license": "MIT",
- "peerDependencies": {
- "react": "*"
- }
- },
- "node_modules/react-is": {
- "version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
- "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
- "license": "MIT"
- },
- "node_modules/react-refresh": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz",
- "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==",
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-router": {
- "version": "6.30.1",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.1.tgz",
- "integrity": "sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==",
- "license": "MIT",
- "dependencies": {
- "@remix-run/router": "1.23.0"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "react": ">=16.8"
- }
- },
- "node_modules/react-router-dom": {
- "version": "6.30.1",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.1.tgz",
- "integrity": "sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==",
- "license": "MIT",
- "dependencies": {
- "@remix-run/router": "1.23.0",
- "react-router": "6.30.1"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "react": ">=16.8",
- "react-dom": ">=16.8"
- }
- },
- "node_modules/react-scripts": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz",
- "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.16.0",
- "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3",
- "@svgr/webpack": "^5.5.0",
- "babel-jest": "^27.4.2",
- "babel-loader": "^8.2.3",
- "babel-plugin-named-asset-import": "^0.3.8",
- "babel-preset-react-app": "^10.0.1",
- "bfj": "^7.0.2",
- "browserslist": "^4.18.1",
- "camelcase": "^6.2.1",
- "case-sensitive-paths-webpack-plugin": "^2.4.0",
- "css-loader": "^6.5.1",
- "css-minimizer-webpack-plugin": "^3.2.0",
- "dotenv": "^10.0.0",
- "dotenv-expand": "^5.1.0",
- "eslint": "^8.3.0",
- "eslint-config-react-app": "^7.0.1",
- "eslint-webpack-plugin": "^3.1.1",
- "file-loader": "^6.2.0",
- "fs-extra": "^10.0.0",
- "html-webpack-plugin": "^5.5.0",
- "identity-obj-proxy": "^3.0.0",
- "jest": "^27.4.3",
- "jest-resolve": "^27.4.2",
- "jest-watch-typeahead": "^1.0.0",
- "mini-css-extract-plugin": "^2.4.5",
- "postcss": "^8.4.4",
- "postcss-flexbugs-fixes": "^5.0.2",
- "postcss-loader": "^6.2.1",
- "postcss-normalize": "^10.0.1",
- "postcss-preset-env": "^7.0.1",
- "prompts": "^2.4.2",
- "react-app-polyfill": "^3.0.0",
- "react-dev-utils": "^12.0.1",
- "react-refresh": "^0.11.0",
- "resolve": "^1.20.0",
- "resolve-url-loader": "^4.0.0",
- "sass-loader": "^12.3.0",
- "semver": "^7.3.5",
- "source-map-loader": "^3.0.0",
- "style-loader": "^3.3.1",
- "tailwindcss": "^3.0.2",
- "terser-webpack-plugin": "^5.2.5",
- "webpack": "^5.64.4",
- "webpack-dev-server": "^4.6.0",
- "webpack-manifest-plugin": "^4.0.2",
- "workbox-webpack-plugin": "^6.4.1"
- },
- "bin": {
- "react-scripts": "bin/react-scripts.js"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "optionalDependencies": {
- "fsevents": "^2.3.2"
- },
- "peerDependencies": {
- "react": ">= 16",
- "typescript": "^3.2.1 || ^4"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/react-transition-group": {
- "version": "4.4.5",
- "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
- "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "@babel/runtime": "^7.5.5",
- "dom-helpers": "^5.0.1",
- "loose-envify": "^1.4.0",
- "prop-types": "^15.6.2"
- },
- "peerDependencies": {
- "react": ">=16.6.0",
- "react-dom": ">=16.6.0"
- }
- },
- "node_modules/read-cache": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
- "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
- "license": "MIT",
- "dependencies": {
- "pify": "^2.3.0"
- }
- },
- "node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "license": "MIT",
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/readdirp/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/recursive-readdir": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
- "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==",
- "license": "MIT",
- "dependencies": {
- "minimatch": "^3.0.5"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/redent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
- "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
- "license": "MIT",
- "dependencies": {
- "indent-string": "^4.0.0",
- "strip-indent": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/reflect.getprototypeof": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
- "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.9",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "get-intrinsic": "^1.2.7",
- "get-proto": "^1.0.1",
- "which-builtin-type": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/regenerate": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
- "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
- "license": "MIT"
- },
- "node_modules/regenerate-unicode-properties": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz",
- "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==",
- "license": "MIT",
- "dependencies": {
- "regenerate": "^1.4.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/regenerator-runtime": {
- "version": "0.13.11",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
- "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
- "license": "MIT"
- },
- "node_modules/regex-parser": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz",
- "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==",
- "license": "MIT"
- },
- "node_modules/regexp.prototype.flags": {
- "version": "1.5.4",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
- "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "define-properties": "^1.2.1",
- "es-errors": "^1.3.0",
- "get-proto": "^1.0.1",
- "gopd": "^1.2.0",
- "set-function-name": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/regexpu-core": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz",
- "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==",
- "license": "MIT",
- "dependencies": {
- "regenerate": "^1.4.2",
- "regenerate-unicode-properties": "^10.2.0",
- "regjsgen": "^0.8.0",
- "regjsparser": "^0.12.0",
- "unicode-match-property-ecmascript": "^2.0.0",
- "unicode-match-property-value-ecmascript": "^2.1.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/regjsgen": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
- "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
- "license": "MIT"
- },
- "node_modules/regjsparser": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz",
- "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "jsesc": "~3.0.2"
- },
- "bin": {
- "regjsparser": "bin/parser"
- }
- },
- "node_modules/regjsparser/node_modules/jsesc": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
- "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
- "license": "MIT",
- "bin": {
- "jsesc": "bin/jsesc"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/relateurl": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
- "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/renderkid": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz",
- "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==",
- "license": "MIT",
- "dependencies": {
- "css-select": "^4.1.3",
- "dom-converter": "^0.2.0",
- "htmlparser2": "^6.1.0",
- "lodash": "^4.17.21",
- "strip-ansi": "^6.0.1"
- }
- },
- "node_modules/require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
- "license": "MIT"
- },
- "node_modules/resolve": {
- "version": "1.22.10",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
- "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
- "license": "MIT",
- "dependencies": {
- "is-core-module": "^2.16.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/resolve-cwd": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
- "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
- "license": "MIT",
- "dependencies": {
- "resolve-from": "^5.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/resolve-url-loader": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz",
- "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==",
- "license": "MIT",
- "dependencies": {
- "adjust-sourcemap-loader": "^4.0.0",
- "convert-source-map": "^1.7.0",
- "loader-utils": "^2.0.0",
- "postcss": "^7.0.35",
- "source-map": "0.6.1"
- },
- "engines": {
- "node": ">=8.9"
- },
- "peerDependencies": {
- "rework": "1.0.1",
- "rework-visit": "1.0.0"
- },
- "peerDependenciesMeta": {
- "rework": {
- "optional": true
- },
- "rework-visit": {
- "optional": true
- }
- }
- },
- "node_modules/resolve-url-loader/node_modules/convert-source-map": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
- "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
- "license": "MIT"
- },
- "node_modules/resolve-url-loader/node_modules/picocolors": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
- "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
- "license": "ISC"
- },
- "node_modules/resolve-url-loader/node_modules/postcss": {
- "version": "7.0.39",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
- "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
- "license": "MIT",
- "dependencies": {
- "picocolors": "^0.2.1",
- "source-map": "^0.6.1"
- },
- "engines": {
- "node": ">=6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- }
- },
- "node_modules/resolve-url-loader/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/resolve.exports": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz",
- "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/retry": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
- "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/reusify": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
- "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
- "license": "MIT",
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "deprecated": "Rimraf versions prior to v4 are no longer supported",
- "license": "ISC",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/rollup": {
- "version": "2.79.2",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz",
- "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==",
- "license": "MIT",
- "peer": true,
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/rollup-plugin-terser": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
- "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
- "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.10.4",
- "jest-worker": "^26.2.1",
- "serialize-javascript": "^4.0.0",
- "terser": "^5.0.0"
- },
- "peerDependencies": {
- "rollup": "^2.0.0"
- }
- },
- "node_modules/rollup-plugin-terser/node_modules/jest-worker": {
- "version": "26.6.2",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
- "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "merge-stream": "^2.0.0",
- "supports-color": "^7.0.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- }
- },
- "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
- "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "randombytes": "^2.1.0"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/safe-array-concat": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
- "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.2",
- "get-intrinsic": "^1.2.6",
- "has-symbols": "^1.1.0",
- "isarray": "^2.0.5"
- },
- "engines": {
- "node": ">=0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
- "node_modules/safe-push-apply": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
- "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "isarray": "^2.0.5"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/safe-regex-test": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
- "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "es-errors": "^1.3.0",
- "is-regex": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "license": "MIT"
- },
- "node_modules/sanitize.css": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz",
- "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==",
- "license": "CC0-1.0"
- },
- "node_modules/sass-loader": {
- "version": "12.6.0",
- "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz",
- "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==",
- "license": "MIT",
- "dependencies": {
- "klona": "^2.0.4",
- "neo-async": "^2.6.2"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "fibers": ">= 3.1.0",
- "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0",
- "sass": "^1.3.0",
- "sass-embedded": "*",
- "webpack": "^5.0.0"
- },
- "peerDependenciesMeta": {
- "fibers": {
- "optional": true
- },
- "node-sass": {
- "optional": true
- },
- "sass": {
- "optional": true
- },
- "sass-embedded": {
- "optional": true
- }
- }
- },
- "node_modules/sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
- "license": "ISC"
- },
- "node_modules/saxes": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
- "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
- "license": "ISC",
- "dependencies": {
- "xmlchars": "^2.2.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/scheduler": {
- "version": "0.23.2",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
- "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
- "license": "MIT",
- "dependencies": {
- "loose-envify": "^1.1.0"
- }
- },
- "node_modules/schema-utils": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz",
- "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==",
- "license": "MIT",
- "dependencies": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.9.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.1.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/schema-utils/node_modules/ajv": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.3",
- "fast-uri": "^3.0.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/schema-utils/node_modules/ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.3"
- },
- "peerDependencies": {
- "ajv": "^8.8.2"
- }
- },
- "node_modules/schema-utils/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "license": "MIT"
- },
- "node_modules/select-hose": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
- "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
- "license": "MIT"
- },
- "node_modules/selfsigned": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz",
- "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
- "license": "MIT",
- "dependencies": {
- "@types/node-forge": "^1.3.0",
- "node-forge": "^1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/semver": {
- "version": "7.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
- "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/send": {
- "version": "0.19.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
- "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
- "license": "MIT",
- "dependencies": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/send/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/send/node_modules/debug/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
- },
- "node_modules/send/node_modules/encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/serialize-javascript": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
- "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "randombytes": "^2.1.0"
- }
- },
- "node_modules/serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
- "license": "MIT",
- "dependencies": {
- "accepts": "~1.3.4",
- "batch": "0.6.1",
- "debug": "2.6.9",
- "escape-html": "~1.0.3",
- "http-errors": "~1.6.2",
- "mime-types": "~2.1.17",
- "parseurl": "~1.3.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/serve-index/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/serve-index/node_modules/depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/serve-index/node_modules/http-errors": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
- "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
- "license": "MIT",
- "dependencies": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/serve-index/node_modules/inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
- "license": "ISC"
- },
- "node_modules/serve-index/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
- },
- "node_modules/serve-index/node_modules/setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
- "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
- "license": "ISC"
- },
- "node_modules/serve-index/node_modules/statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/serve-static": {
- "version": "1.16.2",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
- "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
- "license": "MIT",
- "dependencies": {
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.19.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/set-function-length": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
- "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
- "license": "MIT",
- "dependencies": {
- "define-data-property": "^1.1.4",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/set-function-name": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
- "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
- "license": "MIT",
- "dependencies": {
- "define-data-property": "^1.1.4",
- "es-errors": "^1.3.0",
- "functions-have-names": "^1.2.3",
- "has-property-descriptors": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/set-proto": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
- "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
- "license": "MIT",
- "dependencies": {
- "dunder-proto": "^1.0.1",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
- "license": "ISC"
- },
- "node_modules/shallowequal": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
- "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==",
- "license": "MIT"
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "license": "MIT",
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shell-quote": {
- "version": "1.8.3",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
- "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/side-channel": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
- "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "object-inspect": "^1.13.3",
- "side-channel-list": "^1.0.0",
- "side-channel-map": "^1.0.1",
- "side-channel-weakmap": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/side-channel-list": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
- "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "object-inspect": "^1.13.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/side-channel-map": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
- "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.5",
- "object-inspect": "^1.13.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/side-channel-weakmap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
- "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.5",
- "object-inspect": "^1.13.3",
- "side-channel-map": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "license": "ISC"
- },
- "node_modules/sisteransi": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
- "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
- "license": "MIT"
- },
- "node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/sockjs": {
- "version": "0.3.24",
- "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
- "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
- "license": "MIT",
- "dependencies": {
- "faye-websocket": "^0.11.3",
- "uuid": "^8.3.2",
- "websocket-driver": "^0.7.4"
- }
- },
- "node_modules/source-list-map": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
- "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
- "license": "MIT"
- },
- "node_modules/source-map": {
- "version": "0.7.6",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
- "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">= 12"
- }
- },
- "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/source-map-loader": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz",
- "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==",
- "license": "MIT",
- "dependencies": {
- "abab": "^2.0.5",
- "iconv-lite": "^0.6.3",
- "source-map-js": "^1.0.1"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.0.0"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "license": "MIT",
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/source-map-support/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/sourcemap-codec": {
- "version": "1.4.8",
- "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
- "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
- "deprecated": "Please use @jridgewell/sourcemap-codec instead",
- "license": "MIT"
- },
- "node_modules/spdy": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
- "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
- "license": "MIT",
- "dependencies": {
- "debug": "^4.1.0",
- "handle-thing": "^2.0.0",
- "http-deceiver": "^1.2.7",
- "select-hose": "^2.0.0",
- "spdy-transport": "^3.0.0"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/spdy-transport": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
- "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
- "license": "MIT",
- "dependencies": {
- "debug": "^4.1.0",
- "detect-node": "^2.0.4",
- "hpack.js": "^2.1.6",
- "obuf": "^1.1.2",
- "readable-stream": "^3.0.6",
- "wbuf": "^1.7.3"
- }
- },
- "node_modules/sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
- "license": "BSD-3-Clause"
- },
- "node_modules/stable": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
- "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
- "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility",
- "license": "MIT"
- },
- "node_modules/stack-utils": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
- "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
- "license": "MIT",
- "dependencies": {
- "escape-string-regexp": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/stack-utils/node_modules/escape-string-regexp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
- "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/stackframe": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
- "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
- "license": "MIT"
- },
- "node_modules/static-eval": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz",
- "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==",
- "license": "MIT",
- "dependencies": {
- "escodegen": "^1.8.1"
- }
- },
- "node_modules/static-eval/node_modules/escodegen": {
- "version": "1.14.3",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
- "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "esprima": "^4.0.1",
- "estraverse": "^4.2.0",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1"
- },
- "bin": {
- "escodegen": "bin/escodegen.js",
- "esgenerate": "bin/esgenerate.js"
- },
- "engines": {
- "node": ">=4.0"
- },
- "optionalDependencies": {
- "source-map": "~0.6.1"
- }
- },
- "node_modules/static-eval/node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/static-eval/node_modules/levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
- "license": "MIT",
- "dependencies": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/static-eval/node_modules/optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
- "license": "MIT",
- "dependencies": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.6",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "word-wrap": "~1.2.3"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/static-eval/node_modules/prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/static-eval/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "license": "BSD-3-Clause",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/static-eval/node_modules/type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
- "license": "MIT",
- "dependencies": {
- "prelude-ls": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/stop-iteration-iterator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
- "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "internal-slot": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "~5.2.0"
- }
- },
- "node_modules/string-length": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
- "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
- "license": "MIT",
- "dependencies": {
- "char-regex": "^1.0.2",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/string-natural-compare": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz",
- "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==",
- "license": "MIT"
- },
- "node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "license": "MIT",
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string-width-cjs": {
- "name": "string-width",
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "license": "MIT",
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string-width-cjs/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "license": "MIT"
- },
- "node_modules/string-width/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "license": "MIT"
- },
- "node_modules/string.prototype.includes": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
- "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.3"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/string.prototype.matchall": {
- "version": "4.0.12",
- "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
- "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.6",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "get-intrinsic": "^1.2.6",
- "gopd": "^1.2.0",
- "has-symbols": "^1.1.0",
- "internal-slot": "^1.1.0",
- "regexp.prototype.flags": "^1.5.3",
- "set-function-name": "^2.0.2",
- "side-channel": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.repeat": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
- "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
- "license": "MIT",
- "dependencies": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.5"
- }
- },
- "node_modules/string.prototype.trim": {
- "version": "1.2.10",
- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
- "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.2",
- "define-data-property": "^1.1.4",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.5",
- "es-object-atoms": "^1.0.0",
- "has-property-descriptors": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trimend": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
- "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.2",
- "define-properties": "^1.2.1",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trimstart": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
- "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/stringify-object": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
- "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "get-own-enumerable-property-symbols": "^3.0.0",
- "is-obj": "^1.0.1",
- "is-regexp": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-ansi-cjs": {
- "name": "strip-ansi",
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-bom": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
- "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz",
- "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/strip-final-newline": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/strip-indent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
- "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
- "license": "MIT",
- "dependencies": {
- "min-indent": "^1.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/style-loader": {
- "version": "3.3.4",
- "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz",
- "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==",
- "license": "MIT",
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.0.0"
- }
- },
- "node_modules/styled-components": {
- "version": "6.1.19",
- "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.19.tgz",
- "integrity": "sha512-1v/e3Dl1BknC37cXMhwGomhO8AkYmN41CqyX9xhUDxry1ns3BFQy2lLDRQXJRdVVWB9OHemv/53xaStimvWyuA==",
- "license": "MIT",
- "dependencies": {
- "@emotion/is-prop-valid": "1.2.2",
- "@emotion/unitless": "0.8.1",
- "@types/stylis": "4.2.5",
- "css-to-react-native": "3.2.0",
- "csstype": "3.1.3",
- "postcss": "8.4.49",
- "shallowequal": "1.1.0",
- "stylis": "4.3.2",
- "tslib": "2.6.2"
- },
- "engines": {
- "node": ">= 16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/styled-components"
- },
- "peerDependencies": {
- "react": ">= 16.8.0",
- "react-dom": ">= 16.8.0"
- }
- },
- "node_modules/styled-components/node_modules/postcss": {
- "version": "8.4.49",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
- "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
- "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.7",
- "picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/styled-components/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
- "license": "0BSD"
- },
- "node_modules/stylehacks": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz",
- "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==",
- "license": "MIT",
- "dependencies": {
- "browserslist": "^4.21.4",
- "postcss-selector-parser": "^6.0.4"
- },
- "engines": {
- "node": "^10 || ^12 || >=14.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.15"
- }
- },
- "node_modules/stylis": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz",
- "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==",
- "license": "MIT"
- },
- "node_modules/sucrase": {
- "version": "3.35.0",
- "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
- "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.2",
- "commander": "^4.0.0",
- "glob": "^10.3.10",
- "lines-and-columns": "^1.1.6",
- "mz": "^2.7.0",
- "pirates": "^4.0.1",
- "ts-interface-checker": "^0.1.9"
- },
- "bin": {
- "sucrase": "bin/sucrase",
- "sucrase-node": "bin/sucrase-node"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/sucrase/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/sucrase/node_modules/commander": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
- "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/sucrase/node_modules/glob": {
- "version": "10.4.5",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
- "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
- "license": "ISC",
- "dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^3.1.2",
- "minimatch": "^9.0.4",
- "minipass": "^7.1.2",
- "package-json-from-dist": "^1.0.0",
- "path-scurry": "^1.11.1"
- },
- "bin": {
- "glob": "dist/esm/bin.mjs"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/sucrase/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-hyperlinks": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
- "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0",
- "supports-color": "^7.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/svg-parser": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
- "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==",
- "license": "MIT"
- },
- "node_modules/svgo": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
- "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
- "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.",
- "license": "MIT",
- "dependencies": {
- "chalk": "^2.4.1",
- "coa": "^2.0.2",
- "css-select": "^2.0.0",
- "css-select-base-adapter": "^0.1.1",
- "css-tree": "1.0.0-alpha.37",
- "csso": "^4.0.2",
- "js-yaml": "^3.13.1",
- "mkdirp": "~0.5.1",
- "object.values": "^1.1.0",
- "sax": "~1.2.4",
- "stable": "^0.1.8",
- "unquote": "~1.1.1",
- "util.promisify": "~1.0.0"
- },
- "bin": {
- "svgo": "bin/svgo"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/svgo/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/svgo/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/svgo/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "license": "MIT",
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/svgo/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "license": "MIT"
- },
- "node_modules/svgo/node_modules/css-select": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
- "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "boolbase": "^1.0.0",
- "css-what": "^3.2.1",
- "domutils": "^1.7.0",
- "nth-check": "^1.0.2"
- }
- },
- "node_modules/svgo/node_modules/css-what": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
- "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">= 6"
- },
- "funding": {
- "url": "https://github.com/sponsors/fb55"
- }
- },
- "node_modules/svgo/node_modules/dom-serializer": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
- "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
- "license": "MIT",
- "dependencies": {
- "domelementtype": "^2.0.1",
- "entities": "^2.0.0"
- }
- },
- "node_modules/svgo/node_modules/domutils": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
- "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "dom-serializer": "0",
- "domelementtype": "1"
- }
- },
- "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
- "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
- "license": "BSD-2-Clause"
- },
- "node_modules/svgo/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "license": "MIT",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/svgo/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/svgo/node_modules/nth-check": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
- "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "boolbase": "~1.0.0"
- }
- },
- "node_modules/svgo/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/symbol-tree": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
- "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
- "license": "MIT"
- },
- "node_modules/tailwindcss": {
- "version": "3.4.17",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
- "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==",
- "license": "MIT",
- "dependencies": {
- "@alloc/quick-lru": "^5.2.0",
- "arg": "^5.0.2",
- "chokidar": "^3.6.0",
- "didyoumean": "^1.2.2",
- "dlv": "^1.1.3",
- "fast-glob": "^3.3.2",
- "glob-parent": "^6.0.2",
- "is-glob": "^4.0.3",
- "jiti": "^1.21.6",
- "lilconfig": "^3.1.3",
- "micromatch": "^4.0.8",
- "normalize-path": "^3.0.0",
- "object-hash": "^3.0.0",
- "picocolors": "^1.1.1",
- "postcss": "^8.4.47",
- "postcss-import": "^15.1.0",
- "postcss-js": "^4.0.1",
- "postcss-load-config": "^4.0.2",
- "postcss-nested": "^6.2.0",
- "postcss-selector-parser": "^6.1.2",
- "resolve": "^1.22.8",
- "sucrase": "^3.35.0"
- },
- "bin": {
- "tailwind": "lib/cli.js",
- "tailwindcss": "lib/cli.js"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/tailwindcss/node_modules/lilconfig": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
- "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
- "license": "MIT",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/antonk52"
- }
- },
- "node_modules/tapable": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz",
- "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/temp-dir": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
- "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/tempy": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz",
- "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==",
- "license": "MIT",
- "dependencies": {
- "is-stream": "^2.0.0",
- "temp-dir": "^2.0.0",
- "type-fest": "^0.16.0",
- "unique-string": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/tempy/node_modules/type-fest": {
- "version": "0.16.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz",
- "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==",
- "license": "(MIT OR CC0-1.0)",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/terminal-link": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
- "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
- "license": "MIT",
- "dependencies": {
- "ansi-escapes": "^4.2.1",
- "supports-hyperlinks": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/terser": {
- "version": "5.43.1",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz",
- "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "@jridgewell/source-map": "^0.3.3",
- "acorn": "^8.14.0",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- },
- "bin": {
- "terser": "bin/terser"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/terser-webpack-plugin": {
- "version": "5.3.14",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz",
- "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.25",
- "jest-worker": "^27.4.5",
- "schema-utils": "^4.3.0",
- "serialize-javascript": "^6.0.2",
- "terser": "^5.31.1"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.1.0"
- },
- "peerDependenciesMeta": {
- "@swc/core": {
- "optional": true
- },
- "esbuild": {
- "optional": true
- },
- "uglify-js": {
- "optional": true
- }
- }
- },
- "node_modules/terser/node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "license": "MIT"
- },
- "node_modules/test-exclude": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
- "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
- "license": "ISC",
- "dependencies": {
- "@istanbuljs/schema": "^0.1.2",
- "glob": "^7.1.4",
- "minimatch": "^3.0.4"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
- "license": "MIT"
- },
- "node_modules/thenify": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
- "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0"
- }
- },
- "node_modules/thenify-all": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
- "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
- "license": "MIT",
- "dependencies": {
- "thenify": ">= 3.1.0 < 4"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/throat": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz",
- "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==",
- "license": "MIT"
- },
- "node_modules/thunky": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
- "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
- "license": "MIT"
- },
- "node_modules/tmpl": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
- "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
- "license": "BSD-3-Clause"
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "license": "MIT",
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "license": "MIT",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/tough-cookie": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
- "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "psl": "^1.1.33",
- "punycode": "^2.1.1",
- "universalify": "^0.2.0",
- "url-parse": "^1.5.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/tough-cookie/node_modules/universalify": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
- "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
- "license": "MIT",
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/tr46": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
- "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
- "license": "MIT",
- "dependencies": {
- "punycode": "^2.1.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/tryer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz",
- "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==",
- "license": "MIT"
- },
- "node_modules/ts-interface-checker": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
- "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
- "license": "Apache-2.0"
- },
- "node_modules/tsconfig-paths": {
- "version": "3.15.0",
- "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
- "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
- "license": "MIT",
- "dependencies": {
- "@types/json5": "^0.0.29",
- "json5": "^1.0.2",
- "minimist": "^1.2.6",
- "strip-bom": "^3.0.0"
- }
- },
- "node_modules/tsconfig-paths/node_modules/json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
- "license": "MIT",
- "dependencies": {
- "minimist": "^1.2.0"
- },
- "bin": {
- "json5": "lib/cli.js"
- }
- },
- "node_modules/tsconfig-paths/node_modules/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "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==",
- "license": "0BSD"
- },
- "node_modules/tsutils": {
- "version": "3.21.0",
- "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
- "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
- "license": "MIT",
- "dependencies": {
- "tslib": "^1.8.1"
- },
- "engines": {
- "node": ">= 6"
- },
- "peerDependencies": {
- "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
- }
- },
- "node_modules/tsutils/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "license": "0BSD"
- },
- "node_modules/type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "license": "MIT",
- "dependencies": {
- "prelude-ls": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "license": "(MIT OR CC0-1.0)",
- "peer": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "license": "MIT",
- "dependencies": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/typed-array-buffer": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
- "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "es-errors": "^1.3.0",
- "is-typed-array": "^1.1.14"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/typed-array-byte-length": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
- "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "for-each": "^0.3.3",
- "gopd": "^1.2.0",
- "has-proto": "^1.2.0",
- "is-typed-array": "^1.1.14"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/typed-array-byte-offset": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
- "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
- "license": "MIT",
- "dependencies": {
- "available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.8",
- "for-each": "^0.3.3",
- "gopd": "^1.2.0",
- "has-proto": "^1.2.0",
- "is-typed-array": "^1.1.15",
- "reflect.getprototypeof": "^1.0.9"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/typed-array-length": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
- "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.7",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "is-typed-array": "^1.1.13",
- "possible-typed-array-names": "^1.0.0",
- "reflect.getprototypeof": "^1.0.6"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/typedarray-to-buffer": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
- "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
- "license": "MIT",
- "dependencies": {
- "is-typedarray": "^1.0.0"
- }
- },
- "node_modules/typescript": {
- "version": "4.9.5",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
- "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
- "license": "Apache-2.0",
- "peer": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=4.2.0"
- }
- },
- "node_modules/unbox-primitive": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
- "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "has-bigints": "^1.0.2",
- "has-symbols": "^1.1.0",
- "which-boxed-primitive": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/underscore": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz",
- "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==",
- "license": "MIT"
- },
- "node_modules/undici-types": {
- "version": "7.10.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz",
- "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==",
- "license": "MIT"
- },
- "node_modules/unicode-canonical-property-names-ecmascript": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
- "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unicode-match-property-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
- "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
- "license": "MIT",
- "dependencies": {
- "unicode-canonical-property-names-ecmascript": "^2.0.0",
- "unicode-property-aliases-ecmascript": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unicode-match-property-value-ecmascript": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz",
- "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unicode-property-aliases-ecmascript": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
- "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unique-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
- "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
- "license": "MIT",
- "dependencies": {
- "crypto-random-string": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "license": "MIT",
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/unquote": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
- "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==",
- "license": "MIT"
- },
- "node_modules/upath": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
- "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
- "license": "MIT",
- "engines": {
- "node": ">=4",
- "yarn": "*"
- }
- },
- "node_modules/update-browserslist-db": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
- "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "escalade": "^3.2.0",
- "picocolors": "^1.1.1"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/url-parse": {
- "version": "1.5.10",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
- "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
- "license": "MIT",
- "dependencies": {
- "querystringify": "^2.1.1",
- "requires-port": "^1.0.0"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "license": "MIT"
- },
- "node_modules/util.promisify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
- "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
- "license": "MIT",
- "dependencies": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.2",
- "has-symbols": "^1.0.1",
- "object.getownpropertydescriptors": "^2.1.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/utila": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
- "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
- "license": "MIT"
- },
- "node_modules/utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "license": "MIT",
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
- "node_modules/v8-to-istanbul": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz",
- "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==",
- "license": "ISC",
- "dependencies": {
- "@types/istanbul-lib-coverage": "^2.0.1",
- "convert-source-map": "^1.6.0",
- "source-map": "^0.7.3"
- },
- "engines": {
- "node": ">=10.12.0"
- }
- },
- "node_modules/v8-to-istanbul/node_modules/convert-source-map": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
- "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
- "license": "MIT"
- },
- "node_modules/vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/w3c-hr-time": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
- "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
- "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.",
- "license": "MIT",
- "dependencies": {
- "browser-process-hrtime": "^1.0.0"
- }
- },
- "node_modules/w3c-xmlserializer": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
- "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
- "license": "MIT",
- "dependencies": {
- "xml-name-validator": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/walker": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
- "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "makeerror": "1.0.12"
- }
- },
- "node_modules/watchpack": {
- "version": "2.4.4",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz",
- "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==",
- "license": "MIT",
- "dependencies": {
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.1.2"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/wbuf": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
- "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
- "license": "MIT",
- "dependencies": {
- "minimalistic-assert": "^1.0.0"
- }
- },
- "node_modules/web-vitals": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz",
- "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==",
- "license": "Apache-2.0"
- },
- "node_modules/webidl-conversions": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
- "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=10.4"
- }
- },
- "node_modules/webpack": {
- "version": "5.101.3",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz",
- "integrity": "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "@types/eslint-scope": "^3.7.7",
- "@types/estree": "^1.0.8",
- "@types/json-schema": "^7.0.15",
- "@webassemblyjs/ast": "^1.14.1",
- "@webassemblyjs/wasm-edit": "^1.14.1",
- "@webassemblyjs/wasm-parser": "^1.14.1",
- "acorn": "^8.15.0",
- "acorn-import-phases": "^1.0.3",
- "browserslist": "^4.24.0",
- "chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^5.17.3",
- "es-module-lexer": "^1.2.1",
- "eslint-scope": "5.1.1",
- "events": "^3.2.0",
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.2.11",
- "json-parse-even-better-errors": "^2.3.1",
- "loader-runner": "^4.2.0",
- "mime-types": "^2.1.27",
- "neo-async": "^2.6.2",
- "schema-utils": "^4.3.2",
- "tapable": "^2.1.1",
- "terser-webpack-plugin": "^5.3.11",
- "watchpack": "^2.4.1",
- "webpack-sources": "^3.3.3"
- },
- "bin": {
- "webpack": "bin/webpack.js"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependenciesMeta": {
- "webpack-cli": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-dev-middleware": {
- "version": "5.3.4",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz",
- "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==",
- "license": "MIT",
- "dependencies": {
- "colorette": "^2.0.10",
- "memfs": "^3.4.3",
- "mime-types": "^2.1.31",
- "range-parser": "^1.2.1",
- "schema-utils": "^4.0.0"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^4.0.0 || ^5.0.0"
- }
- },
- "node_modules/webpack-dev-server": {
- "version": "4.15.2",
- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz",
- "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "@types/bonjour": "^3.5.9",
- "@types/connect-history-api-fallback": "^1.3.5",
- "@types/express": "^4.17.13",
- "@types/serve-index": "^1.9.1",
- "@types/serve-static": "^1.13.10",
- "@types/sockjs": "^0.3.33",
- "@types/ws": "^8.5.5",
- "ansi-html-community": "^0.0.8",
- "bonjour-service": "^1.0.11",
- "chokidar": "^3.5.3",
- "colorette": "^2.0.10",
- "compression": "^1.7.4",
- "connect-history-api-fallback": "^2.0.0",
- "default-gateway": "^6.0.3",
- "express": "^4.17.3",
- "graceful-fs": "^4.2.6",
- "html-entities": "^2.3.2",
- "http-proxy-middleware": "^2.0.3",
- "ipaddr.js": "^2.0.1",
- "launch-editor": "^2.6.0",
- "open": "^8.0.9",
- "p-retry": "^4.5.0",
- "rimraf": "^3.0.2",
- "schema-utils": "^4.0.0",
- "selfsigned": "^2.1.1",
- "serve-index": "^1.9.1",
- "sockjs": "^0.3.24",
- "spdy": "^4.0.2",
- "webpack-dev-middleware": "^5.3.4",
- "ws": "^8.13.0"
- },
- "bin": {
- "webpack-dev-server": "bin/webpack-dev-server.js"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^4.37.0 || ^5.0.0"
- },
- "peerDependenciesMeta": {
- "webpack": {
- "optional": true
- },
- "webpack-cli": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-dev-server/node_modules/ws": {
- "version": "8.18.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
- "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
- "license": "MIT",
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": ">=5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-manifest-plugin": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz",
- "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==",
- "license": "MIT",
- "dependencies": {
- "tapable": "^2.0.0",
- "webpack-sources": "^2.2.0"
- },
- "engines": {
- "node": ">=12.22.0"
- },
- "peerDependencies": {
- "webpack": "^4.44.2 || ^5.47.0"
- }
- },
- "node_modules/webpack-manifest-plugin/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz",
- "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==",
- "license": "MIT",
- "dependencies": {
- "source-list-map": "^2.0.1",
- "source-map": "^0.6.1"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/webpack-sources": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz",
- "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==",
- "license": "MIT",
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/webpack/node_modules/eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/webpack/node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/websocket-driver": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
- "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
- "license": "Apache-2.0",
- "dependencies": {
- "http-parser-js": ">=0.5.1",
- "safe-buffer": ">=5.1.0",
- "websocket-extensions": ">=0.1.1"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/websocket-extensions": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
- "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/whatwg-encoding": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
- "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
- "license": "MIT",
- "dependencies": {
- "iconv-lite": "0.4.24"
- }
- },
- "node_modules/whatwg-encoding/node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "license": "MIT",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/whatwg-fetch": {
- "version": "3.6.20",
- "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz",
- "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==",
- "license": "MIT"
- },
- "node_modules/whatwg-mimetype": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
- "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
- "license": "MIT"
- },
- "node_modules/whatwg-url": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
- "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
- "license": "MIT",
- "dependencies": {
- "lodash": "^4.7.0",
- "tr46": "^2.1.0",
- "webidl-conversions": "^6.1.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/which-boxed-primitive": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
- "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
- "license": "MIT",
- "dependencies": {
- "is-bigint": "^1.1.0",
- "is-boolean-object": "^1.2.1",
- "is-number-object": "^1.1.1",
- "is-string": "^1.1.1",
- "is-symbol": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-builtin-type": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
- "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "function.prototype.name": "^1.1.6",
- "has-tostringtag": "^1.0.2",
- "is-async-function": "^2.0.0",
- "is-date-object": "^1.1.0",
- "is-finalizationregistry": "^1.1.0",
- "is-generator-function": "^1.0.10",
- "is-regex": "^1.2.1",
- "is-weakref": "^1.0.2",
- "isarray": "^2.0.5",
- "which-boxed-primitive": "^1.1.0",
- "which-collection": "^1.0.2",
- "which-typed-array": "^1.1.16"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-collection": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
- "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
- "license": "MIT",
- "dependencies": {
- "is-map": "^2.0.3",
- "is-set": "^2.0.3",
- "is-weakmap": "^2.0.2",
- "is-weakset": "^2.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-typed-array": {
- "version": "1.1.19",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
- "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
- "license": "MIT",
- "dependencies": {
- "available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.4",
- "for-each": "^0.3.5",
- "get-proto": "^1.0.1",
- "gopd": "^1.2.0",
- "has-tostringtag": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/word-wrap": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
- "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/workbox-background-sync": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz",
- "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==",
- "license": "MIT",
- "dependencies": {
- "idb": "^7.0.1",
- "workbox-core": "6.6.0"
- }
- },
- "node_modules/workbox-broadcast-update": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz",
- "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==",
- "license": "MIT",
- "dependencies": {
- "workbox-core": "6.6.0"
- }
- },
- "node_modules/workbox-build": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz",
- "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==",
- "license": "MIT",
- "dependencies": {
- "@apideck/better-ajv-errors": "^0.3.1",
- "@babel/core": "^7.11.1",
- "@babel/preset-env": "^7.11.0",
- "@babel/runtime": "^7.11.2",
- "@rollup/plugin-babel": "^5.2.0",
- "@rollup/plugin-node-resolve": "^11.2.1",
- "@rollup/plugin-replace": "^2.4.1",
- "@surma/rollup-plugin-off-main-thread": "^2.2.3",
- "ajv": "^8.6.0",
- "common-tags": "^1.8.0",
- "fast-json-stable-stringify": "^2.1.0",
- "fs-extra": "^9.0.1",
- "glob": "^7.1.6",
- "lodash": "^4.17.20",
- "pretty-bytes": "^5.3.0",
- "rollup": "^2.43.1",
- "rollup-plugin-terser": "^7.0.0",
- "source-map": "^0.8.0-beta.0",
- "stringify-object": "^3.3.0",
- "strip-comments": "^2.0.1",
- "tempy": "^0.6.0",
- "upath": "^1.2.0",
- "workbox-background-sync": "6.6.0",
- "workbox-broadcast-update": "6.6.0",
- "workbox-cacheable-response": "6.6.0",
- "workbox-core": "6.6.0",
- "workbox-expiration": "6.6.0",
- "workbox-google-analytics": "6.6.0",
- "workbox-navigation-preload": "6.6.0",
- "workbox-precaching": "6.6.0",
- "workbox-range-requests": "6.6.0",
- "workbox-recipes": "6.6.0",
- "workbox-routing": "6.6.0",
- "workbox-strategies": "6.6.0",
- "workbox-streams": "6.6.0",
- "workbox-sw": "6.6.0",
- "workbox-window": "6.6.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz",
- "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==",
- "license": "MIT",
- "dependencies": {
- "json-schema": "^0.4.0",
- "jsonpointer": "^5.0.0",
- "leven": "^3.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "ajv": ">=8"
- }
- },
- "node_modules/workbox-build/node_modules/ajv": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.3",
- "fast-uri": "^3.0.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/workbox-build/node_modules/fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
- "license": "MIT",
- "dependencies": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/workbox-build/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "license": "MIT"
- },
- "node_modules/workbox-build/node_modules/source-map": {
- "version": "0.8.0-beta.0",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
- "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
- "deprecated": "The work that was done in this beta branch won't be included in future versions",
- "license": "BSD-3-Clause",
- "dependencies": {
- "whatwg-url": "^7.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/workbox-build/node_modules/tr46": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
- "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
- "license": "MIT",
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/workbox-build/node_modules/webidl-conversions": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
- "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
- "license": "BSD-2-Clause"
- },
- "node_modules/workbox-build/node_modules/whatwg-url": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
- "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
- "license": "MIT",
- "dependencies": {
- "lodash.sortby": "^4.7.0",
- "tr46": "^1.0.1",
- "webidl-conversions": "^4.0.2"
- }
- },
- "node_modules/workbox-cacheable-response": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz",
- "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==",
- "deprecated": "workbox-background-sync@6.6.0",
- "license": "MIT",
- "dependencies": {
- "workbox-core": "6.6.0"
- }
- },
- "node_modules/workbox-core": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz",
- "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==",
- "license": "MIT"
- },
- "node_modules/workbox-expiration": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz",
- "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==",
- "license": "MIT",
- "dependencies": {
- "idb": "^7.0.1",
- "workbox-core": "6.6.0"
- }
- },
- "node_modules/workbox-google-analytics": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz",
- "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==",
- "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained",
- "license": "MIT",
- "dependencies": {
- "workbox-background-sync": "6.6.0",
- "workbox-core": "6.6.0",
- "workbox-routing": "6.6.0",
- "workbox-strategies": "6.6.0"
- }
- },
- "node_modules/workbox-navigation-preload": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz",
- "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==",
- "license": "MIT",
- "dependencies": {
- "workbox-core": "6.6.0"
- }
- },
- "node_modules/workbox-precaching": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz",
- "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==",
- "license": "MIT",
- "dependencies": {
- "workbox-core": "6.6.0",
- "workbox-routing": "6.6.0",
- "workbox-strategies": "6.6.0"
- }
- },
- "node_modules/workbox-range-requests": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz",
- "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==",
- "license": "MIT",
- "dependencies": {
- "workbox-core": "6.6.0"
- }
- },
- "node_modules/workbox-recipes": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz",
- "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==",
- "license": "MIT",
- "dependencies": {
- "workbox-cacheable-response": "6.6.0",
- "workbox-core": "6.6.0",
- "workbox-expiration": "6.6.0",
- "workbox-precaching": "6.6.0",
- "workbox-routing": "6.6.0",
- "workbox-strategies": "6.6.0"
- }
- },
- "node_modules/workbox-routing": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz",
- "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==",
- "license": "MIT",
- "dependencies": {
- "workbox-core": "6.6.0"
- }
- },
- "node_modules/workbox-strategies": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz",
- "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==",
- "license": "MIT",
- "dependencies": {
- "workbox-core": "6.6.0"
- }
- },
- "node_modules/workbox-streams": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz",
- "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==",
- "license": "MIT",
- "dependencies": {
- "workbox-core": "6.6.0",
- "workbox-routing": "6.6.0"
- }
- },
- "node_modules/workbox-sw": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz",
- "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==",
- "license": "MIT"
- },
- "node_modules/workbox-webpack-plugin": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz",
- "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==",
- "license": "MIT",
- "dependencies": {
- "fast-json-stable-stringify": "^2.1.0",
- "pretty-bytes": "^5.4.1",
- "upath": "^1.2.0",
- "webpack-sources": "^1.4.3",
- "workbox-build": "6.6.0"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "webpack": "^4.4.0 || ^5.9.0"
- }
- },
- "node_modules/workbox-webpack-plugin/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
- "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
- "license": "MIT",
- "dependencies": {
- "source-list-map": "^2.0.0",
- "source-map": "~0.6.1"
- }
- },
- "node_modules/workbox-window": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz",
- "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==",
- "license": "MIT",
- "dependencies": {
- "@types/trusted-types": "^2.0.2",
- "workbox-core": "6.6.0"
- }
- },
- "node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrap-ansi-cjs": {
- "name": "wrap-ansi",
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "license": "ISC"
- },
- "node_modules/write-file-atomic": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
- "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
- "license": "ISC",
- "dependencies": {
- "imurmurhash": "^0.1.4",
- "is-typedarray": "^1.0.0",
- "signal-exit": "^3.0.2",
- "typedarray-to-buffer": "^3.1.5"
- }
- },
- "node_modules/ws": {
- "version": "7.5.10",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
- "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
- "license": "MIT",
- "engines": {
- "node": ">=8.3.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/xml-name-validator": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
- "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
- "license": "Apache-2.0"
- },
- "node_modules/xmlchars": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
- "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
- "license": "MIT"
- },
- "node_modules/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "license": "ISC",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "license": "ISC"
- },
- "node_modules/yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "license": "ISC",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "license": "MIT",
- "dependencies": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yargs-parser": {
- "version": "20.2.9",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
- "license": "ISC",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- }
- }
-}
+{
+ "name": "infogenie-frontend",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "infogenie-frontend",
+ "version": "1.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@testing-library/jest-dom": "^5.17.0",
+ "@testing-library/react": "^13.4.0",
+ "@testing-library/user-event": "^14.5.2",
+ "axios": "^1.5.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-hot-toast": "^2.4.1",
+ "react-icons": "^4.11.0",
+ "react-router-dom": "^6.15.0",
+ "react-scripts": "5.0.1",
+ "react-transition-group": "^4.4.5",
+ "styled-components": "^6.0.7",
+ "web-vitals": "^2.1.4"
+ }
+ },
+ "node_modules/@adobe/css-tools": {
+ "version": "4.4.4",
+ "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz",
+ "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==",
+ "license": "MIT"
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz",
+ "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz",
+ "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.28.3",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-module-transforms": "^7.28.3",
+ "@babel/helpers": "^7.28.3",
+ "@babel/parser": "^7.28.3",
+ "@babel/template": "^7.27.2",
+ "@babel/traverse": "^7.28.3",
+ "@babel/types": "^7.28.2",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/eslint-parser": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.0.tgz",
+ "integrity": "sha512-N4ntErOlKvcbTt01rr5wj3y55xnIdx1ymrfIr8C2WnM1Y9glFgWaGDEULJIazOX3XM9NRzhfJ6zZnQ1sBNWU+w==",
+ "license": "MIT",
+ "dependencies": {
+ "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1",
+ "eslint-visitor-keys": "^2.1.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || >=14.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.11.0",
+ "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0"
+ }
+ },
+ "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@babel/eslint-parser/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz",
+ "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.3",
+ "@babel/types": "^7.28.2",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.27.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz",
+ "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.27.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
+ "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.27.2",
+ "@babel/helper-validator-option": "^7.27.1",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz",
+ "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-member-expression-to-functions": "^7.27.1",
+ "@babel/helper-optimise-call-expression": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/traverse": "^7.28.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz",
+ "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "regexpu-core": "^6.2.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz",
+ "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "debug": "^4.4.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.22.10"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz",
+ "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
+ "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
+ "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "@babel/traverse": "^7.28.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz",
+ "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
+ "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz",
+ "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-wrap-function": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz",
+ "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.27.1",
+ "@babel/helper-optimise-call-expression": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz",
+ "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "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/helper-validator-option": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz",
+ "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.27.2",
+ "@babel/traverse": "^7.28.3",
+ "@babel/types": "^7.28.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz",
+ "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.27.2",
+ "@babel/types": "^7.28.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz",
+ "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.2"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz",
+ "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz",
+ "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz",
+ "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz",
+ "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/plugin-transform-optional-chaining": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz",
+ "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.28.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz",
+ "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-decorators": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz",
+ "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/plugin-syntax-decorators": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz",
+ "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-numeric-separator": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz",
+ "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-optional-chaining": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz",
+ "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-methods": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz",
+ "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-bigint": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-decorators": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz",
+ "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-flow": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz",
+ "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz",
+ "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz",
+ "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz",
+ "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz",
+ "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz",
+ "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz",
+ "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-remap-async-to-generator": "^7.27.1",
+ "@babel/traverse": "^7.28.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz",
+ "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-remap-async-to-generator": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz",
+ "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz",
+ "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz",
+ "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz",
+ "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.28.3",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz",
+ "integrity": "sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.27.1",
+ "@babel/traverse": "^7.28.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz",
+ "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/template": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz",
+ "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.28.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz",
+ "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz",
+ "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz",
+ "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz",
+ "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-explicit-resource-management": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz",
+ "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/plugin-transform-destructuring": "^7.28.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz",
+ "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz",
+ "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-flow-strip-types": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz",
+ "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/plugin-syntax-flow": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz",
+ "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz",
+ "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz",
+ "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz",
+ "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz",
+ "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz",
+ "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz",
+ "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz",
+ "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz",
+ "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz",
+ "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz",
+ "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz",
+ "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz",
+ "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz",
+ "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz",
+ "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/plugin-transform-destructuring": "^7.28.0",
+ "@babel/plugin-transform-parameters": "^7.27.7",
+ "@babel/traverse": "^7.28.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz",
+ "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz",
+ "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz",
+ "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.27.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz",
+ "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz",
+ "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz",
+ "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz",
+ "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-constant-elements": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz",
+ "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-display-name": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz",
+ "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz",
+ "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/plugin-syntax-jsx": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-development": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz",
+ "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/plugin-transform-react-jsx": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-pure-annotations": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz",
+ "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz",
+ "integrity": "sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regexp-modifiers": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz",
+ "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz",
+ "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz",
+ "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "babel-plugin-polyfill-corejs2": "^0.4.14",
+ "babel-plugin-polyfill-corejs3": "^0.13.0",
+ "babel-plugin-polyfill-regenerator": "^0.6.5",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz",
+ "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz",
+ "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz",
+ "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz",
+ "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz",
+ "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz",
+ "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/plugin-syntax-typescript": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz",
+ "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz",
+ "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz",
+ "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz",
+ "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz",
+ "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.28.0",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-option": "^7.27.1",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1",
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3",
+ "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+ "@babel/plugin-syntax-import-assertions": "^7.27.1",
+ "@babel/plugin-syntax-import-attributes": "^7.27.1",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.27.1",
+ "@babel/plugin-transform-async-generator-functions": "^7.28.0",
+ "@babel/plugin-transform-async-to-generator": "^7.27.1",
+ "@babel/plugin-transform-block-scoped-functions": "^7.27.1",
+ "@babel/plugin-transform-block-scoping": "^7.28.0",
+ "@babel/plugin-transform-class-properties": "^7.27.1",
+ "@babel/plugin-transform-class-static-block": "^7.28.3",
+ "@babel/plugin-transform-classes": "^7.28.3",
+ "@babel/plugin-transform-computed-properties": "^7.27.1",
+ "@babel/plugin-transform-destructuring": "^7.28.0",
+ "@babel/plugin-transform-dotall-regex": "^7.27.1",
+ "@babel/plugin-transform-duplicate-keys": "^7.27.1",
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1",
+ "@babel/plugin-transform-dynamic-import": "^7.27.1",
+ "@babel/plugin-transform-explicit-resource-management": "^7.28.0",
+ "@babel/plugin-transform-exponentiation-operator": "^7.27.1",
+ "@babel/plugin-transform-export-namespace-from": "^7.27.1",
+ "@babel/plugin-transform-for-of": "^7.27.1",
+ "@babel/plugin-transform-function-name": "^7.27.1",
+ "@babel/plugin-transform-json-strings": "^7.27.1",
+ "@babel/plugin-transform-literals": "^7.27.1",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.27.1",
+ "@babel/plugin-transform-member-expression-literals": "^7.27.1",
+ "@babel/plugin-transform-modules-amd": "^7.27.1",
+ "@babel/plugin-transform-modules-commonjs": "^7.27.1",
+ "@babel/plugin-transform-modules-systemjs": "^7.27.1",
+ "@babel/plugin-transform-modules-umd": "^7.27.1",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1",
+ "@babel/plugin-transform-new-target": "^7.27.1",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1",
+ "@babel/plugin-transform-numeric-separator": "^7.27.1",
+ "@babel/plugin-transform-object-rest-spread": "^7.28.0",
+ "@babel/plugin-transform-object-super": "^7.27.1",
+ "@babel/plugin-transform-optional-catch-binding": "^7.27.1",
+ "@babel/plugin-transform-optional-chaining": "^7.27.1",
+ "@babel/plugin-transform-parameters": "^7.27.7",
+ "@babel/plugin-transform-private-methods": "^7.27.1",
+ "@babel/plugin-transform-private-property-in-object": "^7.27.1",
+ "@babel/plugin-transform-property-literals": "^7.27.1",
+ "@babel/plugin-transform-regenerator": "^7.28.3",
+ "@babel/plugin-transform-regexp-modifiers": "^7.27.1",
+ "@babel/plugin-transform-reserved-words": "^7.27.1",
+ "@babel/plugin-transform-shorthand-properties": "^7.27.1",
+ "@babel/plugin-transform-spread": "^7.27.1",
+ "@babel/plugin-transform-sticky-regex": "^7.27.1",
+ "@babel/plugin-transform-template-literals": "^7.27.1",
+ "@babel/plugin-transform-typeof-symbol": "^7.27.1",
+ "@babel/plugin-transform-unicode-escapes": "^7.27.1",
+ "@babel/plugin-transform-unicode-property-regex": "^7.27.1",
+ "@babel/plugin-transform-unicode-regex": "^7.27.1",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.27.1",
+ "@babel/preset-modules": "0.1.6-no-external-plugins",
+ "babel-plugin-polyfill-corejs2": "^0.4.14",
+ "babel-plugin-polyfill-corejs3": "^0.13.0",
+ "babel-plugin-polyfill-regenerator": "^0.6.5",
+ "core-js-compat": "^3.43.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-env/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.6-no-external-plugins",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+ "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/preset-react": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz",
+ "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-option": "^7.27.1",
+ "@babel/plugin-transform-react-display-name": "^7.27.1",
+ "@babel/plugin-transform-react-jsx": "^7.27.1",
+ "@babel/plugin-transform-react-jsx-development": "^7.27.1",
+ "@babel/plugin-transform-react-pure-annotations": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-typescript": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz",
+ "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-option": "^7.27.1",
+ "@babel/plugin-syntax-jsx": "^7.27.1",
+ "@babel/plugin-transform-modules-commonjs": "^7.27.1",
+ "@babel/plugin-transform-typescript": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz",
+ "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
+ "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/parser": "^7.27.2",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz",
+ "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.28.3",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/parser": "^7.28.3",
+ "@babel/template": "^7.27.2",
+ "@babel/types": "^7.28.2",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.28.2",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz",
+ "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+ "license": "MIT"
+ },
+ "node_modules/@csstools/normalize.css": {
+ "version": "12.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz",
+ "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/@csstools/postcss-cascade-layers": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz",
+ "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/selector-specificity": "^2.0.2",
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-color-function": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz",
+ "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-font-format-keywords": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz",
+ "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-hwb-function": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz",
+ "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-ic-unit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz",
+ "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-is-pseudo-class": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz",
+ "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/selector-specificity": "^2.0.0",
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-nested-calc": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz",
+ "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-normalize-display-values": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz",
+ "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-oklab-function": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz",
+ "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-progressive-custom-properties": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz",
+ "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3"
+ }
+ },
+ "node_modules/@csstools/postcss-stepped-value-functions": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz",
+ "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-text-decoration-shorthand": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz",
+ "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-trigonometric-functions": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz",
+ "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-unset-value": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz",
+ "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==",
+ "license": "CC0-1.0",
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/selector-specificity": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz",
+ "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==",
+ "license": "CC0-1.0",
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ }
+ },
+ "node_modules/@emotion/is-prop-valid": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz",
+ "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/memoize": "^0.8.1"
+ }
+ },
+ "node_modules/@emotion/memoize": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
+ "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/unitless": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
+ "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==",
+ "license": "MIT"
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
+ "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
+ },
+ "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
+ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
+ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
+ "deprecated": "Use @eslint/config-array instead",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.3",
+ "debug": "^4.3.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+ "deprecated": "Use @eslint/object-schema instead",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz",
+ "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "license": "ISC",
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/console": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz",
+ "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/console/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/console/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@jest/console/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@jest/console/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/console/node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/console/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/console/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/@jest/core": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz",
+ "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^27.5.1",
+ "@jest/reporters": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.8.1",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-changed-files": "^27.5.1",
+ "jest-config": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-resolve-dependencies": "^27.5.1",
+ "jest-runner": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "jest-watcher": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "rimraf": "^3.0.0",
+ "slash": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/core/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/core/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@jest/core/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@jest/core/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/core/node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/core/node_modules/jest-regex-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
+ "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/core/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/core/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/@jest/diff-sequences": {
+ "version": "30.0.1",
+ "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz",
+ "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/environment": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz",
+ "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/environment/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/environment/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@jest/environment/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@jest/environment/node_modules/jest-mock": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
+ "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/expect-utils": {
+ "version": "30.1.2",
+ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.1.2.tgz",
+ "integrity": "sha512-HXy1qT/bfdjCv7iC336ExbqqYtZvljrV8odNdso7dWK9bSeHtLlvwWWC3YSybSPL03Gg5rug6WLCZAZFH72m0A==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/get-type": "30.1.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz",
+ "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@sinonjs/fake-timers": "^8.0.1",
+ "@types/node": "*",
+ "jest-message-util": "^27.5.1",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@jest/fake-timers/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@jest/fake-timers/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/fake-timers/node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers/node_modules/jest-mock": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
+ "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/@jest/get-type": {
+ "version": "30.1.0",
+ "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz",
+ "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/globals": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz",
+ "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "expect": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/globals/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/globals/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@jest/globals/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@jest/globals/node_modules/expect": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
+ "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/globals/node_modules/jest-diff": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz",
+ "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/globals/node_modules/jest-matcher-utils": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz",
+ "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/globals/node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/pattern": {
+ "version": "30.0.1",
+ "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz",
+ "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "jest-regex-util": "30.0.1"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/reporters": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz",
+ "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==",
+ "license": "MIT",
+ "dependencies": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@jest/console": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "exit": "^0.1.2",
+ "glob": "^7.1.2",
+ "graceful-fs": "^4.2.9",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-instrument": "^5.1.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.1.3",
+ "jest-haste-map": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.0",
+ "string-length": "^4.0.1",
+ "terminal-link": "^2.0.0",
+ "v8-to-istanbul": "^8.1.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@jest/schemas": {
+ "version": "30.0.5",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz",
+ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==",
+ "license": "MIT",
+ "dependencies": {
+ "@sinclair/typebox": "^0.34.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/source-map": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz",
+ "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==",
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0",
+ "graceful-fs": "^4.2.9",
+ "source-map": "^0.6.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/source-map/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@jest/test-result": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz",
+ "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/test-result/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/test-result/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@jest/test-result/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@jest/test-sequencer": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz",
+ "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/test-result": "^27.5.1",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-runtime": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/transform": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz",
+ "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.1.0",
+ "@jest/types": "^27.5.1",
+ "babel-plugin-istanbul": "^6.1.1",
+ "chalk": "^4.0.0",
+ "convert-source-map": "^1.4.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "pirates": "^4.0.4",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.1",
+ "write-file-atomic": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "license": "MIT"
+ },
+ "node_modules/@jest/transform/node_modules/jest-regex-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
+ "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "30.0.5",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.5.tgz",
+ "integrity": "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/pattern": "30.0.1",
+ "@jest/schemas": "30.0.5",
+ "@types/istanbul-lib-coverage": "^2.0.6",
+ "@types/istanbul-reports": "^3.0.4",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.33",
+ "chalk": "^4.1.2"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/types/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.11",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz",
+ "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
+ "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/@jridgewell/trace-mapping": {
+ "version": "0.3.30",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz",
+ "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@leichtgewicht/ip-codec": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz",
+ "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==",
+ "license": "MIT"
+ },
+ "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
+ "version": "5.1.1-v1",
+ "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
+ "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==",
+ "license": "MIT",
+ "dependencies": {
+ "eslint-scope": "5.1.1"
+ }
+ },
+ "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@pmmmwh/react-refresh-webpack-plugin": {
+ "version": "0.5.17",
+ "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.17.tgz",
+ "integrity": "sha512-tXDyE1/jzFsHXjhRZQ3hMl0IVhYe5qula43LDWIhVfjp9G/nT5OQY5AORVOrkEGAUltBJOfOWeETbmhm6kHhuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-html": "^0.0.9",
+ "core-js-pure": "^3.23.3",
+ "error-stack-parser": "^2.0.6",
+ "html-entities": "^2.1.0",
+ "loader-utils": "^2.0.4",
+ "schema-utils": "^4.2.0",
+ "source-map": "^0.7.3"
+ },
+ "engines": {
+ "node": ">= 10.13"
+ },
+ "peerDependencies": {
+ "@types/webpack": "4.x || 5.x",
+ "react-refresh": ">=0.10.0 <1.0.0",
+ "sockjs-client": "^1.4.0",
+ "type-fest": ">=0.17.0 <5.0.0",
+ "webpack": ">=4.43.0 <6.0.0",
+ "webpack-dev-server": "3.x || 4.x || 5.x",
+ "webpack-hot-middleware": "2.x",
+ "webpack-plugin-serve": "0.x || 1.x"
+ },
+ "peerDependenciesMeta": {
+ "@types/webpack": {
+ "optional": true
+ },
+ "sockjs-client": {
+ "optional": true
+ },
+ "type-fest": {
+ "optional": true
+ },
+ "webpack-dev-server": {
+ "optional": true
+ },
+ "webpack-hot-middleware": {
+ "optional": true
+ },
+ "webpack-plugin-serve": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@remix-run/router": {
+ "version": "1.23.0",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz",
+ "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@rollup/plugin-babel": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
+ "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.10.4",
+ "@rollup/pluginutils": "^3.1.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0",
+ "@types/babel__core": "^7.1.9",
+ "rollup": "^1.20.0||^2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/babel__core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-node-resolve": {
+ "version": "11.2.1",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz",
+ "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==",
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/pluginutils": "^3.1.0",
+ "@types/resolve": "1.17.1",
+ "builtin-modules": "^3.1.0",
+ "deepmerge": "^4.2.2",
+ "is-module": "^1.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0"
+ }
+ },
+ "node_modules/@rollup/plugin-replace": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz",
+ "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==",
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/pluginutils": "^3.1.0",
+ "magic-string": "^0.25.7"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0 || ^2.0.0"
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
+ "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "0.0.39",
+ "estree-walker": "^1.0.1",
+ "picomatch": "^2.2.2"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0"
+ }
+ },
+ "node_modules/@rollup/pluginutils/node_modules/@types/estree": {
+ "version": "0.0.39",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
+ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
+ "license": "MIT"
+ },
+ "node_modules/@rollup/pluginutils/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/@rtsao/scc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
+ "license": "MIT"
+ },
+ "node_modules/@rushstack/eslint-patch": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.12.0.tgz",
+ "integrity": "sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==",
+ "license": "MIT"
+ },
+ "node_modules/@sinclair/typebox": {
+ "version": "0.34.41",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz",
+ "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==",
+ "license": "MIT"
+ },
+ "node_modules/@sinonjs/commons": {
+ "version": "1.8.6",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
+ "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz",
+ "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sinonjs/commons": "^1.7.0"
+ }
+ },
+ "node_modules/@surma/rollup-plugin-off-main-thread": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz",
+ "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "ejs": "^3.1.6",
+ "json5": "^2.2.0",
+ "magic-string": "^0.25.0",
+ "string.prototype.matchall": "^4.0.6"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz",
+ "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz",
+ "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz",
+ "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz",
+ "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz",
+ "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz",
+ "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz",
+ "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-svg-component": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz",
+ "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-preset": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz",
+ "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==",
+ "license": "MIT",
+ "dependencies": {
+ "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0",
+ "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0",
+ "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1",
+ "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1",
+ "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0",
+ "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0",
+ "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0",
+ "@svgr/babel-plugin-transform-svg-component": "^5.5.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/core": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz",
+ "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@svgr/plugin-jsx": "^5.5.0",
+ "camelcase": "^6.2.0",
+ "cosmiconfig": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/hast-util-to-babel-ast": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz",
+ "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.12.6"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/plugin-jsx": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz",
+ "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@svgr/babel-preset": "^5.5.0",
+ "@svgr/hast-util-to-babel-ast": "^5.5.0",
+ "svg-parser": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/plugin-svgo": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz",
+ "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cosmiconfig": "^7.0.0",
+ "deepmerge": "^4.2.2",
+ "svgo": "^1.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/webpack": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz",
+ "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/plugin-transform-react-constant-elements": "^7.12.1",
+ "@babel/preset-env": "^7.12.1",
+ "@babel/preset-react": "^7.12.5",
+ "@svgr/core": "^5.5.0",
+ "@svgr/plugin-jsx": "^5.5.0",
+ "@svgr/plugin-svgo": "^5.5.0",
+ "loader-utils": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@testing-library/dom": {
+ "version": "10.4.1",
+ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz",
+ "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/runtime": "^7.12.5",
+ "@types/aria-query": "^5.0.1",
+ "aria-query": "5.3.0",
+ "dom-accessibility-api": "^0.5.9",
+ "lz-string": "^1.5.0",
+ "picocolors": "1.1.1",
+ "pretty-format": "^27.0.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@testing-library/jest-dom": {
+ "version": "5.17.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz",
+ "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@adobe/css-tools": "^4.0.1",
+ "@babel/runtime": "^7.9.2",
+ "@types/testing-library__jest-dom": "^5.9.1",
+ "aria-query": "^5.0.0",
+ "chalk": "^3.0.0",
+ "css.escape": "^1.5.1",
+ "dom-accessibility-api": "^0.5.6",
+ "lodash": "^4.17.15",
+ "redent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8",
+ "npm": ">=6",
+ "yarn": ">=1"
+ }
+ },
+ "node_modules/@testing-library/react": {
+ "version": "13.4.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz",
+ "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "@testing-library/dom": "^8.5.0",
+ "@types/react-dom": "^18.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ }
+ },
+ "node_modules/@testing-library/react/node_modules/@testing-library/dom": {
+ "version": "8.20.1",
+ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz",
+ "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/runtime": "^7.12.5",
+ "@types/aria-query": "^5.0.1",
+ "aria-query": "5.1.3",
+ "chalk": "^4.1.0",
+ "dom-accessibility-api": "^0.5.9",
+ "lz-string": "^1.5.0",
+ "pretty-format": "^27.0.2"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@testing-library/react/node_modules/aria-query": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz",
+ "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "deep-equal": "^2.0.5"
+ }
+ },
+ "node_modules/@testing-library/react/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@testing-library/user-event": {
+ "version": "14.6.1",
+ "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz",
+ "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12",
+ "npm": ">=6"
+ },
+ "peerDependencies": {
+ "@testing-library/dom": ">=7.21.4"
+ }
+ },
+ "node_modules/@tootallnate/once": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
+ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@trysound/sax": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
+ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/@types/aria-query": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
+ "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.2"
+ }
+ },
+ "node_modules/@types/body-parser": {
+ "version": "1.19.6",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
+ "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/bonjour": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz",
+ "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
+ "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect-history-api-fallback": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz",
+ "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/express-serve-static-core": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/eslint": {
+ "version": "8.56.12",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz",
+ "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/express": {
+ "version": "4.17.23",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz",
+ "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^4.17.33",
+ "@types/qs": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "node_modules/@types/express-serve-static-core": {
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz",
+ "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/express/node_modules/@types/express-serve-static-core": {
+ "version": "4.19.6",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz",
+ "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/graceful-fs": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
+ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/html-minifier-terser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+ "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/http-errors": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz",
+ "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/http-proxy": {
+ "version": "1.17.16",
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz",
+ "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+ "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+ "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/jest": {
+ "version": "30.0.0",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz",
+ "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==",
+ "license": "MIT",
+ "dependencies": {
+ "expect": "^30.0.0",
+ "pretty-format": "^30.0.0"
+ }
+ },
+ "node_modules/@types/jest/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@types/jest/node_modules/pretty-format": {
+ "version": "30.0.5",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz",
+ "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "30.0.5",
+ "ansi-styles": "^5.2.0",
+ "react-is": "^18.3.1"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@types/jest/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/mime": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
+ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "24.3.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz",
+ "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.10.0"
+ }
+ },
+ "node_modules/@types/node-forge": {
+ "version": "1.3.14",
+ "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz",
+ "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/parse-json": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
+ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/prettier": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz",
+ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.15",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
+ "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/q": {
+ "version": "1.5.8",
+ "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz",
+ "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/qs": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz",
+ "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/range-parser": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
+ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/react": {
+ "version": "18.3.24",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.24.tgz",
+ "integrity": "sha512-0dLEBsA1kI3OezMBF8nSsb7Nk19ZnsyE1LLhB8r27KbgU5H4pvuqZLdtE+aUkJVoXgTVuA+iLIwmZ0TuK4tx6A==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/prop-types": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.3.7",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz",
+ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^18.0.0"
+ }
+ },
+ "node_modules/@types/resolve": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
+ "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/semver": {
+ "version": "7.7.0",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz",
+ "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/send": {
+ "version": "0.17.5",
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz",
+ "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mime": "^1",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/serve-index": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz",
+ "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/express": "*"
+ }
+ },
+ "node_modules/@types/serve-static": {
+ "version": "1.15.8",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz",
+ "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-errors": "*",
+ "@types/node": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/sockjs": {
+ "version": "0.3.36",
+ "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
+ "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/stack-utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
+ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/stylis": {
+ "version": "4.2.5",
+ "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz",
+ "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/testing-library__jest-dom": {
+ "version": "5.14.9",
+ "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz",
+ "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/jest": "*"
+ }
+ },
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/ws": {
+ "version": "8.18.1",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
+ "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.33",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
+ "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz",
+ "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.4.0",
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/type-utils": "5.62.0",
+ "@typescript-eslint/utils": "5.62.0",
+ "debug": "^4.3.4",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "natural-compare-lite": "^1.4.0",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^5.0.0",
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/experimental-utils": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz",
+ "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/utils": "5.62.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz",
+ "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==",
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz",
+ "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz",
+ "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "@typescript-eslint/utils": "5.62.0",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz",
+ "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz",
+ "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz",
+ "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "eslint-scope": "^5.1.1",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz",
+ "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
+ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
+ "license": "ISC"
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
+ "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
+ "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
+ "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
+ "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
+ "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.13.2",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
+ "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
+ "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/wasm-gen": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
+ "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
+ "license": "MIT",
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
+ "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
+ "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
+ "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/helper-wasm-section": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-opt": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1",
+ "@webassemblyjs/wast-printer": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
+ "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
+ "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
+ "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
+ "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/abab": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
+ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
+ "deprecated": "Use your platform's native atob() and btoa() methods instead",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/accepts/node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-globals": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
+ "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^7.1.1",
+ "acorn-walk": "^7.1.1"
+ }
+ },
+ "node_modules/acorn-globals/node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-import-phases": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz",
+ "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "peerDependencies": {
+ "acorn": "^8.14.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/address": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz",
+ "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/adjust-sourcemap-loader": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz",
+ "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==",
+ "license": "MIT",
+ "dependencies": {
+ "loader-utils": "^2.0.0",
+ "regex-parser": "^2.2.11"
+ },
+ "engines": {
+ "node": ">=8.9"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-formats/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
+ "node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-escapes/node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-html": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz",
+ "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==",
+ "engines": [
+ "node >= 0.8.0"
+ ],
+ "license": "Apache-2.0",
+ "bin": {
+ "ansi-html": "bin/ansi-html"
+ }
+ },
+ "node_modules/ansi-html-community": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
+ "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
+ "engines": [
+ "node >= 0.8.0"
+ ],
+ "license": "Apache-2.0",
+ "bin": {
+ "ansi-html": "bin/ansi-html"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "license": "MIT"
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/anymatch/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "license": "MIT"
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
+ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "dequal": "^2.0.3"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+ "license": "MIT"
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz",
+ "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.24.0",
+ "es-object-atoms": "^1.1.1",
+ "get-intrinsic": "^1.3.0",
+ "is-string": "^1.1.1",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlastindex": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz",
+ "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-shim-unscopables": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
+ "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
+ "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.reduce": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz",
+ "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-array-method-boxes-properly": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "is-string": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
+ "license": "MIT"
+ },
+ "node_modules/ast-types-flow": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
+ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
+ "license": "MIT"
+ },
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "license": "MIT"
+ },
+ "node_modules/async-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "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/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.21",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
+ "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.24.4",
+ "caniuse-lite": "^1.0.30001702",
+ "fraction.js": "^4.3.7",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.1.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axe-core": {
+ "version": "4.10.3",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz",
+ "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==",
+ "license": "MPL-2.0",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz",
+ "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.4",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/babel-jest": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz",
+ "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/babel__core": "^7.1.14",
+ "babel-plugin-istanbul": "^6.1.1",
+ "babel-preset-jest": "^27.5.1",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.8.0"
+ }
+ },
+ "node_modules/babel-jest/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/babel-jest/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/babel-jest/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/babel-loader": {
+ "version": "8.4.1",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz",
+ "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==",
+ "license": "MIT",
+ "dependencies": {
+ "find-cache-dir": "^3.3.1",
+ "loader-utils": "^2.0.4",
+ "make-dir": "^3.1.0",
+ "schema-utils": "^2.6.5"
+ },
+ "engines": {
+ "node": ">= 8.9"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0",
+ "webpack": ">=2"
+ }
+ },
+ "node_modules/babel-loader/node_modules/schema-utils": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+ "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.5",
+ "ajv": "^6.12.4",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 8.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/babel-plugin-istanbul": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
+ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-instrument": "^5.0.4",
+ "test-exclude": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-plugin-jest-hoist": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz",
+ "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.3.3",
+ "@babel/types": "^7.3.3",
+ "@types/babel__core": "^7.0.0",
+ "@types/babel__traverse": "^7.0.6"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/babel-plugin-macros": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
+ "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "cosmiconfig": "^7.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/babel-plugin-named-asset-import": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz",
+ "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@babel/core": "^7.1.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.14",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz",
+ "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.27.7",
+ "@babel/helper-define-polyfill-provider": "^0.6.5",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz",
+ "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.5",
+ "core-js-compat": "^3.43.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz",
+ "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.5"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-react-remove-prop-types": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz",
+ "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==",
+ "license": "MIT"
+ },
+ "node_modules/babel-preset-current-node-syntax": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz",
+ "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-bigint": "^7.8.3",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-import-attributes": "^7.24.7",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/babel-preset-jest": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz",
+ "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==",
+ "license": "MIT",
+ "dependencies": {
+ "babel-plugin-jest-hoist": "^27.5.1",
+ "babel-preset-current-node-syntax": "^1.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/babel-preset-react-app": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.1.0.tgz",
+ "integrity": "sha512-f9B1xMdnkCIqe+2dHrJsoQFRz7reChaAHE/65SdaykPklQqhme2WaC08oD3is77x9ff98/9EazAKFDZv5rFEQg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.16.0",
+ "@babel/plugin-proposal-class-properties": "^7.16.0",
+ "@babel/plugin-proposal-decorators": "^7.16.4",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0",
+ "@babel/plugin-proposal-numeric-separator": "^7.16.0",
+ "@babel/plugin-proposal-optional-chaining": "^7.16.0",
+ "@babel/plugin-proposal-private-methods": "^7.16.0",
+ "@babel/plugin-proposal-private-property-in-object": "^7.16.7",
+ "@babel/plugin-transform-flow-strip-types": "^7.16.0",
+ "@babel/plugin-transform-react-display-name": "^7.16.0",
+ "@babel/plugin-transform-runtime": "^7.16.4",
+ "@babel/preset-env": "^7.16.4",
+ "@babel/preset-react": "^7.16.0",
+ "@babel/preset-typescript": "^7.16.0",
+ "@babel/runtime": "^7.16.3",
+ "babel-plugin-macros": "^3.1.0",
+ "babel-plugin-transform-react-remove-prop-types": "^0.4.24"
+ }
+ },
+ "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.11",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz",
+ "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-create-class-features-plugin": "^7.21.0",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
+ "node_modules/batch": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
+ "license": "MIT"
+ },
+ "node_modules/bfj": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz",
+ "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==",
+ "license": "MIT",
+ "dependencies": {
+ "bluebird": "^3.7.2",
+ "check-types": "^11.2.3",
+ "hoopy": "^0.1.4",
+ "jsonpath": "^1.1.1",
+ "tryer": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
+ "node_modules/big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "license": "MIT"
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.3",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
+ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.13.0",
+ "raw-body": "2.5.2",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/bonjour-service": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz",
+ "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "multicast-dns": "^7.2.5"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "license": "ISC"
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browser-process-hrtime": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/browserslist": {
+ "version": "4.25.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz",
+ "integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001737",
+ "electron-to-chromium": "^1.5.211",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "license": "MIT"
+ },
+ "node_modules/builtin-modules": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
+ "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "license": "MIT",
+ "dependencies": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/camelize": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz",
+ "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/caniuse-api": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.0.0",
+ "caniuse-lite": "^1.0.0",
+ "lodash.memoize": "^4.1.2",
+ "lodash.uniq": "^4.5.0"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001739",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001739.tgz",
+ "integrity": "sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/case-sensitive-paths-webpack-plugin": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz",
+ "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/check-types": {
+ "version": "11.2.3",
+ "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz",
+ "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==",
+ "license": "MIT"
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
+ "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz",
+ "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cjs-module-lexer": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz",
+ "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==",
+ "license": "MIT"
+ },
+ "node_modules/clean-css": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
+ "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
+ "license": "MIT",
+ "dependencies": {
+ "source-map": "~0.6.0"
+ },
+ "engines": {
+ "node": ">= 10.0"
+ }
+ },
+ "node_modules/clean-css/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "license": "MIT",
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/coa": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
+ "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/q": "^1.5.1",
+ "chalk": "^2.4.1",
+ "q": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 4.0"
+ }
+ },
+ "node_modules/coa/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/coa/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/coa/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/coa/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "license": "MIT"
+ },
+ "node_modules/coa/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/coa/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/coa/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/collect-v8-coverage": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
+ "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==",
+ "license": "MIT"
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/colord": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+ "license": "MIT"
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "license": "MIT"
+ },
+ "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/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/common-tags": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+ "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "license": "MIT"
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz",
+ "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "compressible": "~2.0.18",
+ "debug": "2.6.9",
+ "negotiator": "~0.6.4",
+ "on-headers": "~1.1.0",
+ "safe-buffer": "5.2.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/compression/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/compression/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "license": "MIT"
+ },
+ "node_modules/confusing-browser-globals": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
+ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==",
+ "license": "MIT"
+ },
+ "node_modules/connect-history-api-fallback": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
+ "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "license": "MIT"
+ },
+ "node_modules/cookie": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
+ "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+ "license": "MIT"
+ },
+ "node_modules/core-js": {
+ "version": "3.45.1",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz",
+ "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.45.1",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz",
+ "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.25.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-pure": {
+ "version": "3.45.1",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.45.1.tgz",
+ "integrity": "sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "license": "MIT"
+ },
+ "node_modules/cosmiconfig": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypto-random-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/css-blank-pseudo": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz",
+ "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9"
+ },
+ "bin": {
+ "css-blank-pseudo": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/css-color-keywords": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz",
+ "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/css-declaration-sorter": {
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz",
+ "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==",
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.9"
+ }
+ },
+ "node_modules/css-has-pseudo": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz",
+ "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9"
+ },
+ "bin": {
+ "css-has-pseudo": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/css-loader": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz",
+ "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==",
+ "license": "MIT",
+ "dependencies": {
+ "icss-utils": "^5.1.0",
+ "postcss": "^8.4.33",
+ "postcss-modules-extract-imports": "^3.1.0",
+ "postcss-modules-local-by-default": "^4.0.5",
+ "postcss-modules-scope": "^3.2.0",
+ "postcss-modules-values": "^4.0.0",
+ "postcss-value-parser": "^4.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "@rspack/core": "0.x || 1.x",
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/css-minimizer-webpack-plugin": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz",
+ "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "cssnano": "^5.0.6",
+ "jest-worker": "^27.0.2",
+ "postcss": "^8.3.5",
+ "schema-utils": "^4.0.0",
+ "serialize-javascript": "^6.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@parcel/css": {
+ "optional": true
+ },
+ "clean-css": {
+ "optional": true
+ },
+ "csso": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/css-prefers-color-scheme": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz",
+ "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==",
+ "license": "CC0-1.0",
+ "bin": {
+ "css-prefers-color-scheme": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-select-base-adapter": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
+ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
+ "license": "MIT"
+ },
+ "node_modules/css-to-react-native": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz",
+ "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "camelize": "^1.0.0",
+ "css-color-keywords": "^1.0.0",
+ "postcss-value-parser": "^4.0.2"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "1.0.0-alpha.37",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
+ "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.4",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/css-tree/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
+ "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css.escape": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
+ "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==",
+ "license": "MIT"
+ },
+ "node_modules/cssdb": {
+ "version": "7.11.2",
+ "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz",
+ "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ }
+ ],
+ "license": "CC0-1.0"
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cssnano": {
+ "version": "5.1.15",
+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz",
+ "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==",
+ "license": "MIT",
+ "dependencies": {
+ "cssnano-preset-default": "^5.2.14",
+ "lilconfig": "^2.0.3",
+ "yaml": "^1.10.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/cssnano"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/cssnano-preset-default": {
+ "version": "5.2.14",
+ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz",
+ "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==",
+ "license": "MIT",
+ "dependencies": {
+ "css-declaration-sorter": "^6.3.1",
+ "cssnano-utils": "^3.1.0",
+ "postcss-calc": "^8.2.3",
+ "postcss-colormin": "^5.3.1",
+ "postcss-convert-values": "^5.1.3",
+ "postcss-discard-comments": "^5.1.2",
+ "postcss-discard-duplicates": "^5.1.0",
+ "postcss-discard-empty": "^5.1.1",
+ "postcss-discard-overridden": "^5.1.0",
+ "postcss-merge-longhand": "^5.1.7",
+ "postcss-merge-rules": "^5.1.4",
+ "postcss-minify-font-values": "^5.1.0",
+ "postcss-minify-gradients": "^5.1.1",
+ "postcss-minify-params": "^5.1.4",
+ "postcss-minify-selectors": "^5.2.1",
+ "postcss-normalize-charset": "^5.1.0",
+ "postcss-normalize-display-values": "^5.1.0",
+ "postcss-normalize-positions": "^5.1.1",
+ "postcss-normalize-repeat-style": "^5.1.1",
+ "postcss-normalize-string": "^5.1.0",
+ "postcss-normalize-timing-functions": "^5.1.0",
+ "postcss-normalize-unicode": "^5.1.1",
+ "postcss-normalize-url": "^5.1.0",
+ "postcss-normalize-whitespace": "^5.1.1",
+ "postcss-ordered-values": "^5.1.3",
+ "postcss-reduce-initial": "^5.1.2",
+ "postcss-reduce-transforms": "^5.1.0",
+ "postcss-svgo": "^5.1.0",
+ "postcss-unique-selectors": "^5.1.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/cssnano-utils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz",
+ "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/csso": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
+ "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
+ "license": "MIT",
+ "dependencies": {
+ "css-tree": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/csso/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/cssom": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
+ "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
+ "license": "MIT"
+ },
+ "node_modules/cssstyle": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+ "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "license": "MIT",
+ "dependencies": {
+ "cssom": "~0.3.6"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cssstyle/node_modules/cssom": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+ "license": "MIT"
+ },
+ "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",
+ "peer": true
+ },
+ "node_modules/damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/data-urls": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
+ "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
+ "license": "MIT",
+ "dependencies": {
+ "abab": "^2.0.3",
+ "whatwg-mimetype": "^2.3.0",
+ "whatwg-url": "^8.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/inspect-js"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decimal.js": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
+ "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
+ "license": "MIT"
+ },
+ "node_modules/dedent": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
+ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
+ "license": "MIT"
+ },
+ "node_modules/deep-equal": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz",
+ "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==",
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "call-bind": "^1.0.5",
+ "es-get-iterator": "^1.1.3",
+ "get-intrinsic": "^1.2.2",
+ "is-arguments": "^1.1.1",
+ "is-array-buffer": "^3.0.2",
+ "is-date-object": "^1.0.5",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "isarray": "^2.0.5",
+ "object-is": "^1.1.5",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.5.1",
+ "side-channel": "^1.0.4",
+ "which-boxed-primitive": "^1.0.2",
+ "which-collection": "^1.0.1",
+ "which-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "license": "MIT"
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/default-gateway": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
+ "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "execa": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+ "license": "MIT"
+ },
+ "node_modules/detect-port-alt": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz",
+ "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "address": "^1.0.1",
+ "debug": "^2.6.0"
+ },
+ "bin": {
+ "detect": "bin/detect-port",
+ "detect-port": "bin/detect-port"
+ },
+ "engines": {
+ "node": ">= 4.2.1"
+ }
+ },
+ "node_modules/detect-port-alt/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/detect-port-alt/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/diff-sequences": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
+ "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "license": "MIT"
+ },
+ "node_modules/dns-packet": {
+ "version": "5.6.1",
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz",
+ "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
+ "license": "MIT",
+ "dependencies": {
+ "@leichtgewicht/ip-codec": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dom-accessibility-api": {
+ "version": "0.5.16",
+ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
+ "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==",
+ "license": "MIT"
+ },
+ "node_modules/dom-converter": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
+ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+ "license": "MIT",
+ "dependencies": {
+ "utila": "~0.4"
+ }
+ },
+ "node_modules/dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domexception": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
+ "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
+ "deprecated": "Use your platform's native DOMException instead",
+ "license": "MIT",
+ "dependencies": {
+ "webidl-conversions": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/domexception/node_modules/webidl-conversions": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
+ "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/domhandler": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
+ "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz",
+ "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/dotenv-expand": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
+ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
+ "license": "BSD-2-Clause"
+ },
+ "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/duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+ "license": "MIT"
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "license": "MIT"
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "license": "MIT"
+ },
+ "node_modules/ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.211",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.211.tgz",
+ "integrity": "sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw==",
+ "license": "ISC"
+ },
+ "node_modules/emittery": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz",
+ "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "license": "MIT"
+ },
+ "node_modules/emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.18.3",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
+ "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/error-stack-parser": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
+ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "stackframe": "^1.3.4"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.24.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz",
+ "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==",
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.2",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.2.1",
+ "is-set": "^2.0.3",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.1",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.4",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.4",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "stop-iteration-iterator": "^1.1.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.19"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-array-method-boxes-properly": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
+ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
+ "license": "MIT"
+ },
+ "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-get-iterator": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz",
+ "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "has-symbols": "^1.0.3",
+ "is-arguments": "^1.1.1",
+ "is-map": "^2.0.2",
+ "is-set": "^2.0.2",
+ "is-string": "^1.0.7",
+ "isarray": "^2.0.5",
+ "stop-iteration-iterator": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-iterator-helpers": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz",
+ "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.0.3",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.6",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "iterator.prototype": "^1.1.4",
+ "safe-array-concat": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
+ "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
+ "license": "MIT"
+ },
+ "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/es-shim-unscopables": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
+ "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "license": "MIT"
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/escodegen": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/escodegen/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
+ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
+ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.1",
+ "@humanwhocodes/config-array": "^0.13.0",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-react-app": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz",
+ "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.16.0",
+ "@babel/eslint-parser": "^7.16.3",
+ "@rushstack/eslint-patch": "^1.1.0",
+ "@typescript-eslint/eslint-plugin": "^5.5.0",
+ "@typescript-eslint/parser": "^5.5.0",
+ "babel-preset-react-app": "^10.0.1",
+ "confusing-browser-globals": "^1.0.11",
+ "eslint-plugin-flowtype": "^8.0.3",
+ "eslint-plugin-import": "^2.25.3",
+ "eslint-plugin-jest": "^25.3.0",
+ "eslint-plugin-jsx-a11y": "^6.5.1",
+ "eslint-plugin-react": "^7.27.1",
+ "eslint-plugin-react-hooks": "^4.3.0",
+ "eslint-plugin-testing-library": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^8.0.0"
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
+ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.13.0",
+ "resolve": "^1.22.4"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-module-utils": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz",
+ "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-flowtype": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz",
+ "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "lodash": "^4.17.21",
+ "string-natural-compare": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "@babel/plugin-syntax-flow": "^7.14.5",
+ "@babel/plugin-transform-react-jsx": "^7.14.9",
+ "eslint": "^8.1.0"
+ }
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.32.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz",
+ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
+ "license": "MIT",
+ "dependencies": {
+ "@rtsao/scc": "^1.1.0",
+ "array-includes": "^3.1.9",
+ "array.prototype.findlastindex": "^1.2.6",
+ "array.prototype.flat": "^1.3.3",
+ "array.prototype.flatmap": "^1.3.3",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.9",
+ "eslint-module-utils": "^2.12.1",
+ "hasown": "^2.0.2",
+ "is-core-module": "^2.16.1",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "object.groupby": "^1.0.3",
+ "object.values": "^1.2.1",
+ "semver": "^6.3.1",
+ "string.prototype.trimend": "^1.0.9",
+ "tsconfig-paths": "^3.15.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-jest": {
+ "version": "25.7.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz",
+ "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/experimental-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0",
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@typescript-eslint/eslint-plugin": {
+ "optional": true
+ },
+ "jest": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y": {
+ "version": "6.10.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
+ "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "aria-query": "^5.3.2",
+ "array-includes": "^3.1.8",
+ "array.prototype.flatmap": "^1.3.2",
+ "ast-types-flow": "^0.0.8",
+ "axe-core": "^4.10.0",
+ "axobject-query": "^4.1.0",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^3.3.5",
+ "language-tags": "^1.0.9",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.includes": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/eslint-plugin-react": {
+ "version": "7.37.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz",
+ "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==",
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.3",
+ "array.prototype.tosorted": "^1.1.4",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.2.1",
+ "estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.9",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.12",
+ "string.prototype.repeat": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz",
+ "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-testing-library": {
+ "version": "5.11.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz",
+ "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/utils": "^5.58.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0",
+ "npm": ">=6"
+ },
+ "peerDependencies": {
+ "eslint": "^7.5.0 || ^8.0.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-webpack-plugin": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz",
+ "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/eslint": "^7.29.0 || ^8.4.1",
+ "jest-worker": "^28.0.2",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0",
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/eslint-webpack-plugin/node_modules/jest-worker": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz",
+ "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/eslint-webpack-plugin/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
+ },
+ "node_modules/eslint/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/eslint/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
+ "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
+ "license": "MIT"
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "license": "MIT"
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/expect": {
+ "version": "30.1.2",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-30.1.2.tgz",
+ "integrity": "sha512-xvHszRavo28ejws8FpemjhwswGj4w/BetHIL8cU49u4sGyXDw2+p3YbeDbj6xzlxi6kWTjIRSTJ+9sNXPnF0Zg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/expect-utils": "30.1.2",
+ "@jest/get-type": "30.1.0",
+ "jest-matcher-utils": "30.1.2",
+ "jest-message-util": "30.1.0",
+ "jest-mock": "30.0.5",
+ "jest-util": "30.0.5"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/express": {
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
+ "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.3",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.7.1",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.3.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.3",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.12",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.13.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.19.0",
+ "serve-static": "1.16.2",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/express/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "license": "MIT"
+ },
+ "node_modules/fast-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
+ "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/faye-websocket": {
+ "version": "0.11.4",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
+ "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "websocket-driver": ">=0.5.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/fb-watchman": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bser": "2.1.1"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/file-loader": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
+ "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
+ "license": "MIT",
+ "dependencies": {
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/file-loader/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/filesize": {
+ "version": "8.0.7",
+ "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz",
+ "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
+ "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "license": "MIT",
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "license": "ISC"
+ },
+ "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/for-each": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/foreground-child/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin": {
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz",
+ "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.8.3",
+ "@types/json-schema": "^7.0.5",
+ "chalk": "^4.1.0",
+ "chokidar": "^3.4.2",
+ "cosmiconfig": "^6.0.0",
+ "deepmerge": "^4.2.2",
+ "fs-extra": "^9.0.0",
+ "glob": "^7.1.6",
+ "memfs": "^3.1.2",
+ "minimatch": "^3.0.4",
+ "schema-utils": "2.7.0",
+ "semver": "^7.3.2",
+ "tapable": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "yarn": ">=1.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">= 6",
+ "typescript": ">= 2.7",
+ "vue-template-compiler": "*",
+ "webpack": ">= 4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ },
+ "vue-template-compiler": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
+ "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.1.0",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.7.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "license": "MIT",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
+ "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.4",
+ "ajv": "^6.12.2",
+ "ajv-keywords": "^3.4.1"
+ },
+ "engines": {
+ "node": ">= 8.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/fs-monkey": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz",
+ "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==",
+ "license": "Unlicense"
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "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/function.prototype.name": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "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-own-enumerable-property-symbols": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
+ "license": "ISC"
+ },
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "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/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "license": "MIT",
+ "dependencies": {
+ "global-prefix": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/global-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+ "license": "MIT",
+ "dependencies": {
+ "ini": "^1.3.5",
+ "kind-of": "^6.0.2",
+ "which": "^1.3.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/global-prefix/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "license": "MIT",
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/goober": {
+ "version": "2.1.16",
+ "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.16.tgz",
+ "integrity": "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==",
+ "license": "MIT",
+ "peerDependencies": {
+ "csstype": "^3.0.10"
+ }
+ },
+ "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/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "license": "ISC"
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "license": "MIT"
+ },
+ "node_modules/gzip-size": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
+ "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "duplexer": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/handle-thing": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
+ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
+ "license": "MIT"
+ },
+ "node_modules/harmony-reflect": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz",
+ "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==",
+ "license": "(Apache-2.0 OR MPL-1.1)"
+ },
+ "node_modules/has-bigints": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.0"
+ },
+ "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/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "license": "MIT",
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/hoopy": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
+ "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "obuf": "^1.0.0",
+ "readable-stream": "^2.0.1",
+ "wbuf": "^1.1.0"
+ }
+ },
+ "node_modules/hpack.js/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "license": "MIT"
+ },
+ "node_modules/hpack.js/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/hpack.js/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "license": "MIT"
+ },
+ "node_modules/hpack.js/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/html-encoding-sniffer": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
+ "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-encoding": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/html-entities": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
+ "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/mdevils"
+ },
+ {
+ "type": "patreon",
+ "url": "https://patreon.com/mdevils"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "license": "MIT"
+ },
+ "node_modules/html-minifier-terser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+ "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==",
+ "license": "MIT",
+ "dependencies": {
+ "camel-case": "^4.1.2",
+ "clean-css": "^5.2.2",
+ "commander": "^8.3.0",
+ "he": "^1.2.0",
+ "param-case": "^3.0.4",
+ "relateurl": "^0.2.7",
+ "terser": "^5.10.0"
+ },
+ "bin": {
+ "html-minifier-terser": "cli.js"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/html-webpack-plugin": {
+ "version": "5.6.4",
+ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz",
+ "integrity": "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/html-minifier-terser": "^6.0.0",
+ "html-minifier-terser": "^6.0.2",
+ "lodash": "^4.17.21",
+ "pretty-error": "^4.0.0",
+ "tapable": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/html-webpack-plugin"
+ },
+ "peerDependencies": {
+ "@rspack/core": "0.x || 1.x",
+ "webpack": "^5.20.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
+ "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "domutils": "^2.5.2",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
+ "license": "MIT"
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-parser-js": {
+ "version": "0.5.10",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz",
+ "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==",
+ "license": "MIT"
+ },
+ "node_modules/http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "license": "MIT",
+ "dependencies": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
+ "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+ "license": "MIT",
+ "dependencies": {
+ "@tootallnate/once": "1",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/http-proxy-middleware": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz",
+ "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-proxy": "^1.17.8",
+ "http-proxy": "^1.18.1",
+ "is-glob": "^4.0.1",
+ "is-plain-obj": "^3.0.0",
+ "micromatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "@types/express": "^4.17.13"
+ },
+ "peerDependenciesMeta": {
+ "@types/express": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/idb": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
+ "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==",
+ "license": "ISC"
+ },
+ "node_modules/identity-obj-proxy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz",
+ "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==",
+ "license": "MIT",
+ "dependencies": {
+ "harmony-reflect": "^1.4.6"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/immer": {
+ "version": "9.0.21",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
+ "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-fresh/node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/import-local": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
+ "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
+ "license": "MIT",
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "license": "ISC"
+ },
+ "node_modules/internal-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
+ "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/is-arguments": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz",
+ "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "license": "MIT"
+ },
+ "node_modules/is-async-function": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+ "license": "MIT",
+ "dependencies": {
+ "async-function": "^1.0.0",
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+ "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz",
+ "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.0",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
+ "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
+ "license": "MIT"
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
+ "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+ "license": "MIT"
+ },
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
+ "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-root": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz",
+ "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "license": "MIT"
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+ "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/parser": "^7.14.7",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz",
+ "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/iterator.prototype": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
+ "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "get-proto": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/jake": {
+ "version": "10.9.4",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz",
+ "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "async": "^3.2.6",
+ "filelist": "^1.0.4",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jest": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz",
+ "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/core": "^27.5.1",
+ "import-local": "^3.0.2",
+ "jest-cli": "^27.5.1"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-changed-files": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz",
+ "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "execa": "^5.0.0",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-changed-files/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-changed-files/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-changed-files/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-circus": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz",
+ "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "dedent": "^0.7.0",
+ "expect": "^27.5.1",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-circus/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-circus/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-circus/node_modules/expect": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
+ "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/jest-diff": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz",
+ "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/jest-matcher-utils": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz",
+ "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/jest-cli": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz",
+ "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/core": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "import-local": "^3.0.2",
+ "jest-config": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "prompts": "^2.0.1",
+ "yargs": "^16.2.0"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-cli/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-cli/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-cli/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-cli/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-cli/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-cli/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/jest-config": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz",
+ "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.8.0",
+ "@jest/test-sequencer": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "babel-jest": "^27.5.1",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.1",
+ "graceful-fs": "^4.2.9",
+ "jest-circus": "^27.5.1",
+ "jest-environment-jsdom": "^27.5.1",
+ "jest-environment-node": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-jasmine2": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-runner": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "parse-json": "^5.2.0",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-config/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-config/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-config/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-config/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-config/node_modules/jest-regex-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
+ "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-config/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-config/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/jest-diff": {
+ "version": "30.1.2",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.1.2.tgz",
+ "integrity": "sha512-4+prq+9J61mOVXCa4Qp8ZjavdxzrWQXrI80GNxP8f4tkI2syPuPrJgdRPZRrfUTRvIoUwcmNLbqEJy9W800+NQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/diff-sequences": "30.0.1",
+ "@jest/get-type": "30.1.0",
+ "chalk": "^4.1.2",
+ "pretty-format": "30.0.5"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-diff/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-diff/node_modules/pretty-format": {
+ "version": "30.0.5",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz",
+ "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "30.0.5",
+ "ansi-styles": "^5.2.0",
+ "react-is": "^18.3.1"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-diff/node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-diff/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "license": "MIT"
+ },
+ "node_modules/jest-docblock": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz",
+ "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "detect-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-each": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz",
+ "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-each/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-each/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-each/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-each/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-each/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-each/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/jest-environment-jsdom": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz",
+ "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jsdom": "^16.6.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-jsdom/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-jsdom/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-environment-jsdom/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-environment-jsdom/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-environment-jsdom/node_modules/jest-mock": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
+ "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-jsdom/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-jsdom/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/jest-environment-node": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz",
+ "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-node/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-node/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-environment-node/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-environment-node/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-environment-node/node_modules/jest-mock": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
+ "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-node/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-node/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/jest-get-type": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz",
+ "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-haste-map": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz",
+ "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/graceful-fs": "^4.1.2",
+ "@types/node": "*",
+ "anymatch": "^3.0.3",
+ "fb-watchman": "^2.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-regex-util": "^27.5.1",
+ "jest-serializer": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "walker": "^1.0.7"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "^2.3.2"
+ }
+ },
+ "node_modules/jest-haste-map/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-haste-map/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-haste-map/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-haste-map/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-haste-map/node_modules/jest-regex-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
+ "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-haste-map/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-haste-map/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/jest-jasmine2": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz",
+ "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/source-map": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "expect": "^27.5.1",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/expect": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
+ "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/jest-diff": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz",
+ "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/jest-matcher-utils": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz",
+ "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/jest-leak-detector": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz",
+ "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-matcher-utils": {
+ "version": "30.1.2",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.1.2.tgz",
+ "integrity": "sha512-7ai16hy4rSbDjvPTuUhuV8nyPBd6EX34HkBsBcBX2lENCuAQ0qKCPb/+lt8OSWUa9WWmGYLy41PrEzkwRwoGZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/get-type": "30.1.0",
+ "chalk": "^4.1.2",
+ "jest-diff": "30.1.2",
+ "pretty-format": "30.0.5"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-matcher-utils/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-matcher-utils/node_modules/pretty-format": {
+ "version": "30.0.5",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz",
+ "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "30.0.5",
+ "ansi-styles": "^5.2.0",
+ "react-is": "^18.3.1"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-matcher-utils/node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-matcher-utils/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "license": "MIT"
+ },
+ "node_modules/jest-message-util": {
+ "version": "30.1.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.1.0.tgz",
+ "integrity": "sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@jest/types": "30.0.5",
+ "@types/stack-utils": "^2.0.3",
+ "chalk": "^4.1.2",
+ "graceful-fs": "^4.2.11",
+ "micromatch": "^4.0.8",
+ "pretty-format": "30.0.5",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.6"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-message-util/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-message-util/node_modules/pretty-format": {
+ "version": "30.0.5",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz",
+ "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "30.0.5",
+ "ansi-styles": "^5.2.0",
+ "react-is": "^18.3.1"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-message-util/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "license": "MIT"
+ },
+ "node_modules/jest-mock": {
+ "version": "30.0.5",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz",
+ "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "30.0.5",
+ "@types/node": "*",
+ "jest-util": "30.0.5"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-pnp-resolver": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+ "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "peerDependencies": {
+ "jest-resolve": "*"
+ },
+ "peerDependenciesMeta": {
+ "jest-resolve": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-regex-util": {
+ "version": "30.0.1",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz",
+ "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-resolve": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz",
+ "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "resolve": "^1.20.0",
+ "resolve.exports": "^1.1.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-resolve-dependencies": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz",
+ "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-snapshot": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-resolve-dependencies/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-resolve-dependencies/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-resolve-dependencies/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-resolve-dependencies/node_modules/jest-regex-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
+ "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-resolve/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-resolve/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-resolve/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-resolve/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-resolve/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-resolve/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/jest-runner": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz",
+ "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^27.5.1",
+ "@jest/environment": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "emittery": "^0.8.1",
+ "graceful-fs": "^4.2.9",
+ "jest-docblock": "^27.5.1",
+ "jest-environment-jsdom": "^27.5.1",
+ "jest-environment-node": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-leak-detector": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "source-map-support": "^0.5.6",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runner/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runner/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-runner/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-runner/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-runner/node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runner/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runner/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/jest-runtime": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz",
+ "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/globals": "^27.5.1",
+ "@jest/source-map": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "cjs-module-lexer": "^1.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "execa": "^5.0.0",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-mock": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/jest-mock": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
+ "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/jest-regex-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
+ "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/jest-serializer": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz",
+ "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "graceful-fs": "^4.2.9"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz",
+ "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.7.2",
+ "@babel/generator": "^7.7.2",
+ "@babel/plugin-syntax-typescript": "^7.7.2",
+ "@babel/traverse": "^7.7.2",
+ "@babel/types": "^7.0.0",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/babel__traverse": "^7.0.4",
+ "@types/prettier": "^2.1.5",
+ "babel-preset-current-node-syntax": "^1.0.0",
+ "chalk": "^4.0.0",
+ "expect": "^27.5.1",
+ "graceful-fs": "^4.2.9",
+ "jest-diff": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "natural-compare": "^1.4.0",
+ "pretty-format": "^27.5.1",
+ "semver": "^7.3.2"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/expect": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
+ "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/jest-diff": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz",
+ "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/jest-matcher-utils": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz",
+ "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/jest-util": {
+ "version": "30.0.5",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz",
+ "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "30.0.5",
+ "@types/node": "*",
+ "chalk": "^4.1.2",
+ "ci-info": "^4.2.0",
+ "graceful-fs": "^4.2.11",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-util/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-validate": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz",
+ "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^27.5.1",
+ "leven": "^3.1.0",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-validate/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-validate/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-validate/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-watch-typeahead": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz",
+ "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^4.3.1",
+ "chalk": "^4.0.0",
+ "jest-regex-util": "^28.0.0",
+ "jest-watcher": "^28.0.0",
+ "slash": "^4.0.0",
+ "string-length": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "jest": "^27.0.0 || ^28.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@jest/console": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz",
+ "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^28.1.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^28.1.3",
+ "jest-util": "^28.1.3",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@jest/schemas": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz",
+ "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==",
+ "license": "MIT",
+ "dependencies": {
+ "@sinclair/typebox": "^0.24.1"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz",
+ "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^28.1.3",
+ "@jest/types": "^28.1.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@jest/types": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz",
+ "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^28.1.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@sinclair/typebox": {
+ "version": "0.24.51",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz",
+ "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==",
+ "license": "MIT"
+ },
+ "node_modules/jest-watch-typeahead/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/emittery": {
+ "version": "0.10.2",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz",
+ "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-message-util": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz",
+ "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^28.1.3",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^28.1.3",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": {
+ "version": "28.0.2",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz",
+ "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-util": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz",
+ "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^28.1.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-watcher": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz",
+ "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/test-result": "^28.1.3",
+ "@jest/types": "^28.1.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.10.2",
+ "jest-util": "^28.1.3",
+ "string-length": "^4.0.1"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "license": "MIT",
+ "dependencies": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/pretty-format": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz",
+ "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^28.1.3",
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "license": "MIT"
+ },
+ "node_modules/jest-watch-typeahead/node_modules/slash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/string-length": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz",
+ "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==",
+ "license": "MIT",
+ "dependencies": {
+ "char-regex": "^2.0.0",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz",
+ "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz",
+ "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/jest-watcher": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz",
+ "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "jest-util": "^27.5.1",
+ "string-length": "^4.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-watcher/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-watcher/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-watcher/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-watcher/node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-watcher/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-watcher/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.21.7",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
+ "license": "MIT",
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsdom": {
+ "version": "16.7.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz",
+ "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==",
+ "license": "MIT",
+ "dependencies": {
+ "abab": "^2.0.5",
+ "acorn": "^8.2.4",
+ "acorn-globals": "^6.0.0",
+ "cssom": "^0.4.4",
+ "cssstyle": "^2.3.0",
+ "data-urls": "^2.0.0",
+ "decimal.js": "^10.2.1",
+ "domexception": "^2.0.1",
+ "escodegen": "^2.0.0",
+ "form-data": "^3.0.0",
+ "html-encoding-sniffer": "^2.0.1",
+ "http-proxy-agent": "^4.0.1",
+ "https-proxy-agent": "^5.0.0",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.0",
+ "parse5": "6.0.1",
+ "saxes": "^5.0.1",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^4.0.0",
+ "w3c-hr-time": "^1.0.2",
+ "w3c-xmlserializer": "^2.0.0",
+ "webidl-conversions": "^6.1.0",
+ "whatwg-encoding": "^1.0.5",
+ "whatwg-mimetype": "^2.3.0",
+ "whatwg-url": "^8.5.0",
+ "ws": "^7.4.6",
+ "xml-name-validator": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "canvas": "^2.5.0"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jsdom/node_modules/form-data": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz",
+ "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==",
+ "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.35"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "license": "MIT"
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "license": "MIT"
+ },
+ "node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+ "license": "(AFL-2.1 OR BSD-3-Clause)"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonpath": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz",
+ "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==",
+ "license": "MIT",
+ "dependencies": {
+ "esprima": "1.2.2",
+ "static-eval": "2.0.2",
+ "underscore": "1.12.1"
+ }
+ },
+ "node_modules/jsonpath/node_modules/esprima": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz",
+ "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/jsonpointer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz",
+ "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/klona": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
+ "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/language-subtag-registry": {
+ "version": "0.3.23",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
+ "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/language-tags": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
+ "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
+ "license": "MIT",
+ "dependencies": {
+ "language-subtag-registry": "^0.3.20"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/launch-editor": {
+ "version": "2.11.1",
+ "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz",
+ "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==",
+ "license": "MIT",
+ "dependencies": {
+ "picocolors": "^1.1.1",
+ "shell-quote": "^1.8.3"
+ }
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "license": "MIT"
+ },
+ "node_modules/loader-runner": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.11.5"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "license": "MIT",
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
+ "license": "MIT"
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/lz-string": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
+ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==",
+ "license": "MIT",
+ "bin": {
+ "lz-string": "bin/bin.js"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+ "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+ "license": "MIT",
+ "dependencies": {
+ "sourcemap-codec": "^1.4.8"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/makeerror": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tmpl": "1.0.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/mdn-data": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
+ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/memfs": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz",
+ "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==",
+ "license": "Unlicense",
+ "dependencies": {
+ "fs-monkey": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/micromatch/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=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/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mini-css-extract-plugin": {
+ "version": "2.9.4",
+ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz",
+ "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==",
+ "license": "MIT",
+ "dependencies": {
+ "schema-utils": "^4.0.0",
+ "tapable": "^2.2.1"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "license": "ISC"
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/multicast-dns": {
+ "version": "7.2.5",
+ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
+ "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
+ "license": "MIT",
+ "dependencies": {
+ "dns-packet": "^5.2.2",
+ "thunky": "^1.0.2"
+ },
+ "bin": {
+ "multicast-dns": "cli.js"
+ }
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "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/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "license": "MIT"
+ },
+ "node_modules/natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
+ "license": "MIT"
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+ "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "license": "MIT"
+ },
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "license": "MIT",
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/node-forge": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
+ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
+ "license": "(BSD-3-Clause OR GPL-2.0)",
+ "engines": {
+ "node": ">= 6.13.0"
+ }
+ },
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+ "license": "MIT"
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "license": "MIT"
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-url": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/nwsapi": {
+ "version": "2.2.21",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.21.tgz",
+ "integrity": "sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==",
+ "license": "MIT"
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-is": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz",
+ "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz",
+ "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.getownpropertydescriptors": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz",
+ "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==",
+ "license": "MIT",
+ "dependencies": {
+ "array.prototype.reduce": "^1.0.6",
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0",
+ "gopd": "^1.0.1",
+ "safe-array-concat": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.groupby": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
+ "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+ "license": "MIT"
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/on-headers": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz",
+ "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/open": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+ "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/own-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.6",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-retry": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
+ "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/retry": "0.12.0",
+ "retry": "^0.13.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "license": "MIT",
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+ "license": "MIT"
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "license": "MIT"
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "license": "ISC"
+ },
+ "node_modules/path-to-regexp": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
+ "license": "MIT"
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
+ "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-up": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz",
+ "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-up/node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-up/node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-up/node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-up/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "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",
+ "peer": true,
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-attribute-case-insensitive": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz",
+ "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-browser-comments": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz",
+ "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==",
+ "license": "CC0-1.0",
+ "engines": {
+ "node": ">=8"
+ },
+ "peerDependencies": {
+ "browserslist": ">=4",
+ "postcss": ">=8"
+ }
+ },
+ "node_modules/postcss-calc": {
+ "version": "8.2.4",
+ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz",
+ "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.2"
+ }
+ },
+ "node_modules/postcss-clamp": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz",
+ "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=7.6.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.6"
+ }
+ },
+ "node_modules/postcss-color-functional-notation": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz",
+ "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-color-hex-alpha": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz",
+ "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-color-rebeccapurple": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz",
+ "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-colormin": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz",
+ "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "caniuse-api": "^3.0.0",
+ "colord": "^2.9.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-convert-values": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz",
+ "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-custom-media": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz",
+ "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3"
+ }
+ },
+ "node_modules/postcss-custom-properties": {
+ "version": "12.1.11",
+ "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz",
+ "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-custom-selectors": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz",
+ "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.4"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3"
+ }
+ },
+ "node_modules/postcss-dir-pseudo-class": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz",
+ "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-discard-comments": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz",
+ "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-discard-duplicates": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz",
+ "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-discard-empty": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz",
+ "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-discard-overridden": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz",
+ "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-double-position-gradients": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz",
+ "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-env-function": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz",
+ "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-flexbugs-fixes": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz",
+ "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8.1.4"
+ }
+ },
+ "node_modules/postcss-focus-visible": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz",
+ "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-focus-within": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz",
+ "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-font-variant": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz",
+ "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-gap-properties": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz",
+ "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==",
+ "license": "CC0-1.0",
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-image-set-function": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz",
+ "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-initial": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz",
+ "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "license": "MIT",
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-lab-function": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz",
+ "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "lilconfig": "^3.0.0",
+ "yaml": "^2.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-load-config/node_modules/lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/postcss-load-config/node_modules/yaml": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
+ "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ }
+ },
+ "node_modules/postcss-loader": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz",
+ "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==",
+ "license": "MIT",
+ "dependencies": {
+ "cosmiconfig": "^7.0.0",
+ "klona": "^2.0.5",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "postcss": "^7.0.0 || ^8.0.1",
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/postcss-logical": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz",
+ "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==",
+ "license": "CC0-1.0",
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-media-minmax": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz",
+ "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-merge-longhand": {
+ "version": "5.1.7",
+ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz",
+ "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "stylehacks": "^5.1.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-merge-rules": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz",
+ "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "caniuse-api": "^3.0.0",
+ "cssnano-utils": "^3.1.0",
+ "postcss-selector-parser": "^6.0.5"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-font-values": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz",
+ "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-gradients": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz",
+ "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==",
+ "license": "MIT",
+ "dependencies": {
+ "colord": "^2.9.1",
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-params": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz",
+ "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-selectors": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz",
+ "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.5"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-modules-extract-imports": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz",
+ "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==",
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz",
+ "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==",
+ "license": "MIT",
+ "dependencies": {
+ "icss-utils": "^5.0.0",
+ "postcss-selector-parser": "^7.0.0",
+ "postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-modules-scope": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz",
+ "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==",
+ "license": "ISC",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-modules-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+ "license": "ISC",
+ "dependencies": {
+ "icss-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-nesting": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz",
+ "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/selector-specificity": "^2.0.0",
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-normalize": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz",
+ "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/normalize.css": "*",
+ "postcss-browser-comments": "^4",
+ "sanitize.css": "*"
+ },
+ "engines": {
+ "node": ">= 12"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4",
+ "postcss": ">= 8"
+ }
+ },
+ "node_modules/postcss-normalize-charset": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz",
+ "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-display-values": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz",
+ "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-positions": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz",
+ "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-repeat-style": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz",
+ "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-string": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz",
+ "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-timing-functions": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz",
+ "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-unicode": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz",
+ "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-url": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz",
+ "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==",
+ "license": "MIT",
+ "dependencies": {
+ "normalize-url": "^6.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-whitespace": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz",
+ "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-opacity-percentage": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz",
+ "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==",
+ "funding": [
+ {
+ "type": "kofi",
+ "url": "https://ko-fi.com/mrcgrtz"
+ },
+ {
+ "type": "liberapay",
+ "url": "https://liberapay.com/mrcgrtz"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-ordered-values": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz",
+ "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-overflow-shorthand": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz",
+ "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-page-break": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz",
+ "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8"
+ }
+ },
+ "node_modules/postcss-place": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz",
+ "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-preset-env": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz",
+ "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/postcss-cascade-layers": "^1.1.1",
+ "@csstools/postcss-color-function": "^1.1.1",
+ "@csstools/postcss-font-format-keywords": "^1.0.1",
+ "@csstools/postcss-hwb-function": "^1.0.2",
+ "@csstools/postcss-ic-unit": "^1.0.1",
+ "@csstools/postcss-is-pseudo-class": "^2.0.7",
+ "@csstools/postcss-nested-calc": "^1.0.0",
+ "@csstools/postcss-normalize-display-values": "^1.0.1",
+ "@csstools/postcss-oklab-function": "^1.1.1",
+ "@csstools/postcss-progressive-custom-properties": "^1.3.0",
+ "@csstools/postcss-stepped-value-functions": "^1.0.1",
+ "@csstools/postcss-text-decoration-shorthand": "^1.0.0",
+ "@csstools/postcss-trigonometric-functions": "^1.0.2",
+ "@csstools/postcss-unset-value": "^1.0.2",
+ "autoprefixer": "^10.4.13",
+ "browserslist": "^4.21.4",
+ "css-blank-pseudo": "^3.0.3",
+ "css-has-pseudo": "^3.0.4",
+ "css-prefers-color-scheme": "^6.0.3",
+ "cssdb": "^7.1.0",
+ "postcss-attribute-case-insensitive": "^5.0.2",
+ "postcss-clamp": "^4.1.0",
+ "postcss-color-functional-notation": "^4.2.4",
+ "postcss-color-hex-alpha": "^8.0.4",
+ "postcss-color-rebeccapurple": "^7.1.1",
+ "postcss-custom-media": "^8.0.2",
+ "postcss-custom-properties": "^12.1.10",
+ "postcss-custom-selectors": "^6.0.3",
+ "postcss-dir-pseudo-class": "^6.0.5",
+ "postcss-double-position-gradients": "^3.1.2",
+ "postcss-env-function": "^4.0.6",
+ "postcss-focus-visible": "^6.0.4",
+ "postcss-focus-within": "^5.0.4",
+ "postcss-font-variant": "^5.0.0",
+ "postcss-gap-properties": "^3.0.5",
+ "postcss-image-set-function": "^4.0.7",
+ "postcss-initial": "^4.0.1",
+ "postcss-lab-function": "^4.2.1",
+ "postcss-logical": "^5.0.4",
+ "postcss-media-minmax": "^5.0.0",
+ "postcss-nesting": "^10.2.0",
+ "postcss-opacity-percentage": "^1.1.2",
+ "postcss-overflow-shorthand": "^3.0.4",
+ "postcss-page-break": "^3.0.4",
+ "postcss-place": "^7.0.5",
+ "postcss-pseudo-class-any-link": "^7.1.6",
+ "postcss-replace-overflow-wrap": "^4.0.0",
+ "postcss-selector-not": "^6.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-pseudo-class-any-link": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz",
+ "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-reduce-initial": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz",
+ "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "caniuse-api": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-reduce-transforms": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz",
+ "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-replace-overflow-wrap": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz",
+ "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8.0.3"
+ }
+ },
+ "node_modules/postcss-selector-not": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz",
+ "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-svgo": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz",
+ "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "svgo": "^2.7.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/postcss-svgo/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/svgo": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
+ "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
+ "license": "MIT",
+ "dependencies": {
+ "@trysound/sax": "0.2.0",
+ "commander": "^7.2.0",
+ "css-select": "^4.1.3",
+ "css-tree": "^1.1.3",
+ "csso": "^4.2.0",
+ "picocolors": "^1.0.0",
+ "stable": "^0.1.8"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/postcss-unique-selectors": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz",
+ "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.5"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "license": "MIT"
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/pretty-bytes": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
+ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pretty-error": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
+ "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.17.20",
+ "renderkid": "^3.0.0"
+ }
+ },
+ "node_modules/pretty-format": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
+ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "license": "MIT"
+ },
+ "node_modules/promise": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
+ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
+ "license": "MIT",
+ "dependencies": {
+ "asap": "~2.0.6"
+ }
+ },
+ "node_modules/prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/prop-types/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "license": "MIT"
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/proxy-addr/node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "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/psl": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
+ "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.3.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/lupomontero"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
+ "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.0",
+ "teleport": ">=0.2.0"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+ "license": "MIT"
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/raf": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
+ "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+ "license": "MIT",
+ "dependencies": {
+ "performance-now": "^2.1.0"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/raw-body/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-app-polyfill": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz",
+ "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==",
+ "license": "MIT",
+ "dependencies": {
+ "core-js": "^3.19.2",
+ "object-assign": "^4.1.1",
+ "promise": "^8.1.0",
+ "raf": "^3.4.1",
+ "regenerator-runtime": "^0.13.9",
+ "whatwg-fetch": "^3.6.2"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/react-dev-utils": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz",
+ "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.16.0",
+ "address": "^1.1.2",
+ "browserslist": "^4.18.1",
+ "chalk": "^4.1.2",
+ "cross-spawn": "^7.0.3",
+ "detect-port-alt": "^1.1.6",
+ "escape-string-regexp": "^4.0.0",
+ "filesize": "^8.0.6",
+ "find-up": "^5.0.0",
+ "fork-ts-checker-webpack-plugin": "^6.5.0",
+ "global-modules": "^2.0.0",
+ "globby": "^11.0.4",
+ "gzip-size": "^6.0.0",
+ "immer": "^9.0.7",
+ "is-root": "^2.1.0",
+ "loader-utils": "^3.2.0",
+ "open": "^8.4.0",
+ "pkg-up": "^3.1.0",
+ "prompts": "^2.4.2",
+ "react-error-overlay": "^6.0.11",
+ "recursive-readdir": "^2.2.2",
+ "shell-quote": "^1.7.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/react-dev-utils/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/react-dev-utils/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/react-dev-utils/node_modules/loader-utils": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz",
+ "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/react-dev-utils/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/react-dev-utils/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/react-dev-utils/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ },
+ "peerDependencies": {
+ "react": "^18.3.1"
+ }
+ },
+ "node_modules/react-error-overlay": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.1.0.tgz",
+ "integrity": "sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==",
+ "license": "MIT"
+ },
+ "node_modules/react-hot-toast": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.6.0.tgz",
+ "integrity": "sha512-bH+2EBMZ4sdyou/DPrfgIouFpcRLCJ+HoCA32UoAYHn6T3Ur5yfcDCeSr5mwldl6pFOsiocmrXMuoCJ1vV8bWg==",
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.1.3",
+ "goober": "^2.1.16"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "react": ">=16",
+ "react-dom": ">=16"
+ }
+ },
+ "node_modules/react-icons": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz",
+ "integrity": "sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "license": "MIT"
+ },
+ "node_modules/react-refresh": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz",
+ "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-router": {
+ "version": "6.30.1",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.1.tgz",
+ "integrity": "sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@remix-run/router": "1.23.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "6.30.1",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.1.tgz",
+ "integrity": "sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==",
+ "license": "MIT",
+ "dependencies": {
+ "@remix-run/router": "1.23.0",
+ "react-router": "6.30.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
+ "node_modules/react-scripts": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz",
+ "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.16.0",
+ "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3",
+ "@svgr/webpack": "^5.5.0",
+ "babel-jest": "^27.4.2",
+ "babel-loader": "^8.2.3",
+ "babel-plugin-named-asset-import": "^0.3.8",
+ "babel-preset-react-app": "^10.0.1",
+ "bfj": "^7.0.2",
+ "browserslist": "^4.18.1",
+ "camelcase": "^6.2.1",
+ "case-sensitive-paths-webpack-plugin": "^2.4.0",
+ "css-loader": "^6.5.1",
+ "css-minimizer-webpack-plugin": "^3.2.0",
+ "dotenv": "^10.0.0",
+ "dotenv-expand": "^5.1.0",
+ "eslint": "^8.3.0",
+ "eslint-config-react-app": "^7.0.1",
+ "eslint-webpack-plugin": "^3.1.1",
+ "file-loader": "^6.2.0",
+ "fs-extra": "^10.0.0",
+ "html-webpack-plugin": "^5.5.0",
+ "identity-obj-proxy": "^3.0.0",
+ "jest": "^27.4.3",
+ "jest-resolve": "^27.4.2",
+ "jest-watch-typeahead": "^1.0.0",
+ "mini-css-extract-plugin": "^2.4.5",
+ "postcss": "^8.4.4",
+ "postcss-flexbugs-fixes": "^5.0.2",
+ "postcss-loader": "^6.2.1",
+ "postcss-normalize": "^10.0.1",
+ "postcss-preset-env": "^7.0.1",
+ "prompts": "^2.4.2",
+ "react-app-polyfill": "^3.0.0",
+ "react-dev-utils": "^12.0.1",
+ "react-refresh": "^0.11.0",
+ "resolve": "^1.20.0",
+ "resolve-url-loader": "^4.0.0",
+ "sass-loader": "^12.3.0",
+ "semver": "^7.3.5",
+ "source-map-loader": "^3.0.0",
+ "style-loader": "^3.3.1",
+ "tailwindcss": "^3.0.2",
+ "terser-webpack-plugin": "^5.2.5",
+ "webpack": "^5.64.4",
+ "webpack-dev-server": "^4.6.0",
+ "webpack-manifest-plugin": "^4.0.2",
+ "workbox-webpack-plugin": "^6.4.1"
+ },
+ "bin": {
+ "react-scripts": "bin/react-scripts.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "^2.3.2"
+ },
+ "peerDependencies": {
+ "react": ">= 16",
+ "typescript": "^3.2.1 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-transition-group": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.6.0",
+ "react-dom": ">=16.6.0"
+ }
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "license": "MIT",
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/readdirp/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/recursive-readdir": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
+ "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==",
+ "license": "MIT",
+ "dependencies": {
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/redent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+ "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "license": "MIT",
+ "dependencies": {
+ "indent-string": "^4.0.0",
+ "strip-indent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
+ "which-builtin-type": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "license": "MIT"
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz",
+ "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+ "license": "MIT"
+ },
+ "node_modules/regex-parser": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz",
+ "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==",
+ "license": "MIT"
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz",
+ "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.2.0",
+ "regjsgen": "^0.8.0",
+ "regjsparser": "^0.12.0",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
+ "license": "MIT"
+ },
+ "node_modules/regjsparser": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz",
+ "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "jsesc": "~3.0.2"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+ "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/renderkid": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz",
+ "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==",
+ "license": "MIT",
+ "dependencies": {
+ "css-select": "^4.1.3",
+ "dom-converter": "^0.2.0",
+ "htmlparser2": "^6.1.0",
+ "lodash": "^4.17.21",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "license": "MIT"
+ },
+ "node_modules/resolve": {
+ "version": "1.22.10",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.16.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "license": "MIT",
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-url-loader": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz",
+ "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==",
+ "license": "MIT",
+ "dependencies": {
+ "adjust-sourcemap-loader": "^4.0.0",
+ "convert-source-map": "^1.7.0",
+ "loader-utils": "^2.0.0",
+ "postcss": "^7.0.35",
+ "source-map": "0.6.1"
+ },
+ "engines": {
+ "node": ">=8.9"
+ },
+ "peerDependencies": {
+ "rework": "1.0.1",
+ "rework-visit": "1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rework": {
+ "optional": true
+ },
+ "rework-visit": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/resolve-url-loader/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "license": "MIT"
+ },
+ "node_modules/resolve-url-loader/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "license": "ISC"
+ },
+ "node_modules/resolve-url-loader/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "license": "MIT",
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/resolve-url-loader/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve.exports": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz",
+ "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "2.79.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz",
+ "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==",
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/rollup-plugin-terser": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
+ "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
+ "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "jest-worker": "^26.2.1",
+ "serialize-javascript": "^4.0.0",
+ "terser": "^5.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^2.0.0"
+ }
+ },
+ "node_modules/rollup-plugin-terser/node_modules/jest-worker": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
+ "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+ "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+ "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "has-symbols": "^1.1.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
+ "node_modules/sanitize.css": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz",
+ "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/sass-loader": {
+ "version": "12.6.0",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz",
+ "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==",
+ "license": "MIT",
+ "dependencies": {
+ "klona": "^2.0.4",
+ "neo-async": "^2.6.2"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "fibers": ">= 3.1.0",
+ "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0",
+ "sass": "^1.3.0",
+ "sass-embedded": "*",
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "fibers": {
+ "optional": true
+ },
+ "node-sass": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+ "license": "ISC"
+ },
+ "node_modules/saxes": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
+ "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+ "license": "ISC",
+ "dependencies": {
+ "xmlchars": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/schema-utils": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz",
+ "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/schema-utils/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/schema-utils/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/schema-utils/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
+ "node_modules/select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
+ "license": "MIT"
+ },
+ "node_modules/selfsigned": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz",
+ "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node-forge": "^1.3.0",
+ "node-forge": "^1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/send/node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "batch": "0.6.1",
+ "debug": "2.6.9",
+ "escape-html": "~1.0.3",
+ "http-errors": "~1.6.2",
+ "mime-types": "~2.1.17",
+ "parseurl": "~1.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": ">= 1.4.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+ "license": "ISC"
+ },
+ "node_modules/serve-index/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/serve-index/node_modules/setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "license": "ISC"
+ },
+ "node_modules/serve-index/node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
+ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.19.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "license": "ISC"
+ },
+ "node_modules/shallowequal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
+ "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==",
+ "license": "MIT"
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shell-quote": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
+ "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "license": "ISC"
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "license": "MIT"
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sockjs": {
+ "version": "0.3.24",
+ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
+ "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "faye-websocket": "^0.11.3",
+ "uuid": "^8.3.2",
+ "websocket-driver": "^0.7.4"
+ }
+ },
+ "node_modules/source-list-map": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
+ "license": "MIT"
+ },
+ "node_modules/source-map": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
+ "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "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/source-map-loader": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz",
+ "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==",
+ "license": "MIT",
+ "dependencies": {
+ "abab": "^2.0.5",
+ "iconv-lite": "^0.6.3",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-support/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+ "deprecated": "Please use @jridgewell/sourcemap-codec instead",
+ "license": "MIT"
+ },
+ "node_modules/spdy": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
+ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.0",
+ "handle-thing": "^2.0.0",
+ "http-deceiver": "^1.2.7",
+ "select-hose": "^2.0.0",
+ "spdy-transport": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/spdy-transport": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.0",
+ "detect-node": "^2.0.4",
+ "hpack.js": "^2.1.6",
+ "obuf": "^1.1.2",
+ "readable-stream": "^3.0.6",
+ "wbuf": "^1.7.3"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/stable": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+ "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility",
+ "license": "MIT"
+ },
+ "node_modules/stack-utils": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/stack-utils/node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/stackframe": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
+ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
+ "license": "MIT"
+ },
+ "node_modules/static-eval": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz",
+ "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==",
+ "license": "MIT",
+ "dependencies": {
+ "escodegen": "^1.8.1"
+ }
+ },
+ "node_modules/static-eval/node_modules/escodegen": {
+ "version": "1.14.3",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+ "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^4.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/static-eval/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/static-eval/node_modules/levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/static-eval/node_modules/optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/static-eval/node_modules/prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/static-eval/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/static-eval/node_modules/type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "internal-slot": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "license": "MIT",
+ "dependencies": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/string-natural-compare": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz",
+ "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==",
+ "license": "MIT"
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/string-width/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/string.prototype.includes": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
+ "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
+ "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "regexp.prototype.flags": "^1.5.3",
+ "set-function-name": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.repeat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
+ "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-data-property": "^1.1.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-object-atoms": "^1.0.0",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/stringify-object": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
+ "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "get-own-enumerable-property-symbols": "^3.0.0",
+ "is-obj": "^1.0.1",
+ "is-regexp": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz",
+ "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "min-indent": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/style-loader": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz",
+ "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/styled-components": {
+ "version": "6.1.19",
+ "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.19.tgz",
+ "integrity": "sha512-1v/e3Dl1BknC37cXMhwGomhO8AkYmN41CqyX9xhUDxry1ns3BFQy2lLDRQXJRdVVWB9OHemv/53xaStimvWyuA==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/is-prop-valid": "1.2.2",
+ "@emotion/unitless": "0.8.1",
+ "@types/stylis": "4.2.5",
+ "css-to-react-native": "3.2.0",
+ "csstype": "3.1.3",
+ "postcss": "8.4.49",
+ "shallowequal": "1.1.0",
+ "stylis": "4.3.2",
+ "tslib": "2.6.2"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/styled-components"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0",
+ "react-dom": ">= 16.8.0"
+ }
+ },
+ "node_modules/styled-components/node_modules/postcss": {
+ "version": "8.4.49",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
+ "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
+ "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.7",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/styled-components/node_modules/tslib": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
+ "license": "0BSD"
+ },
+ "node_modules/stylehacks": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz",
+ "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "postcss-selector-parser": "^6.0.4"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/stylis": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz",
+ "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==",
+ "license": "MIT"
+ },
+ "node_modules/sucrase": {
+ "version": "3.35.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "^10.3.10",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/sucrase/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/sucrase/node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/sucrase/node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/sucrase/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-hyperlinks": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
+ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svg-parser": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
+ "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==",
+ "license": "MIT"
+ },
+ "node_modules/svgo": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
+ "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
+ "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^2.4.1",
+ "coa": "^2.0.2",
+ "css-select": "^2.0.0",
+ "css-select-base-adapter": "^0.1.1",
+ "css-tree": "1.0.0-alpha.37",
+ "csso": "^4.0.2",
+ "js-yaml": "^3.13.1",
+ "mkdirp": "~0.5.1",
+ "object.values": "^1.1.0",
+ "sax": "~1.2.4",
+ "stable": "^0.1.8",
+ "unquote": "~1.1.1",
+ "util.promisify": "~1.0.0"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/svgo/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/svgo/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/svgo/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/svgo/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "license": "MIT"
+ },
+ "node_modules/svgo/node_modules/css-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
+ "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^3.2.1",
+ "domutils": "^1.7.0",
+ "nth-check": "^1.0.2"
+ }
+ },
+ "node_modules/svgo/node_modules/css-what": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
+ "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/svgo/node_modules/dom-serializer": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+ "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/svgo/node_modules/domutils": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "0",
+ "domelementtype": "1"
+ }
+ },
+ "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/svgo/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/svgo/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/svgo/node_modules/nth-check": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+ "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "~1.0.0"
+ }
+ },
+ "node_modules/svgo/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+ "license": "MIT"
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.4.17",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
+ "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==",
+ "license": "MIT",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.6.0",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.3.2",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.21.6",
+ "lilconfig": "^3.1.3",
+ "micromatch": "^4.0.8",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.1.1",
+ "postcss": "^8.4.47",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.2",
+ "postcss-nested": "^6.2.0",
+ "postcss-selector-parser": "^6.1.2",
+ "resolve": "^1.22.8",
+ "sucrase": "^3.35.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz",
+ "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/temp-dir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
+ "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tempy": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz",
+ "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-stream": "^2.0.0",
+ "temp-dir": "^2.0.0",
+ "type-fest": "^0.16.0",
+ "unique-string": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/tempy/node_modules/type-fest": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz",
+ "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/terminal-link": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
+ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^4.2.1",
+ "supports-hyperlinks": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.43.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz",
+ "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.14.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.3.14",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz",
+ "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^4.3.0",
+ "serialize-javascript": "^6.0.2",
+ "terser": "^5.31.1"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "uglify-js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "license": "MIT"
+ },
+ "node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "license": "ISC",
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "license": "MIT"
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "license": "MIT",
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/throat": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz",
+ "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==",
+ "license": "MIT"
+ },
+ "node_modules/thunky": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
+ "license": "MIT"
+ },
+ "node_modules/tmpl": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/tough-cookie": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
+ "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.2.0",
+ "url-parse": "^1.5.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tough-cookie/node_modules/universalify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
+ "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tryer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz",
+ "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==",
+ "license": "MIT"
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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==",
+ "license": "0BSD"
+ },
+ "node_modules/tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+ }
+ },
+ "node_modules/tsutils/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "license": "0BSD"
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "license": "(MIT OR CC0-1.0)",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "license": "MIT",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
+ "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0",
+ "reflect.getprototypeof": "^1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "license": "MIT",
+ "dependencies": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/underscore": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz",
+ "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==",
+ "license": "MIT"
+ },
+ "node_modules/undici-types": {
+ "version": "7.10.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz",
+ "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==",
+ "license": "MIT"
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+ "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz",
+ "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unique-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+ "license": "MIT",
+ "dependencies": {
+ "crypto-random-string": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/unquote": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
+ "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==",
+ "license": "MIT"
+ },
+ "node_modules/upath": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4",
+ "yarn": "*"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "license": "MIT",
+ "dependencies": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
+ "node_modules/util.promisify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
+ "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.2",
+ "has-symbols": "^1.0.1",
+ "object.getownpropertydescriptors": "^2.1.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/utila": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
+ "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
+ "license": "MIT"
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/v8-to-istanbul": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz",
+ "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==",
+ "license": "ISC",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^1.6.0",
+ "source-map": "^0.7.3"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/v8-to-istanbul/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "license": "MIT"
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/w3c-hr-time": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+ "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+ "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.",
+ "license": "MIT",
+ "dependencies": {
+ "browser-process-hrtime": "^1.0.0"
+ }
+ },
+ "node_modules/w3c-xmlserializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
+ "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
+ "license": "MIT",
+ "dependencies": {
+ "xml-name-validator": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "makeerror": "1.0.12"
+ }
+ },
+ "node_modules/watchpack": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz",
+ "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==",
+ "license": "MIT",
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/wbuf": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "license": "MIT",
+ "dependencies": {
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/web-vitals": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz",
+ "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/webidl-conversions": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
+ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=10.4"
+ }
+ },
+ "node_modules/webpack": {
+ "version": "5.101.3",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz",
+ "integrity": "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/eslint-scope": "^3.7.7",
+ "@types/estree": "^1.0.8",
+ "@types/json-schema": "^7.0.15",
+ "@webassemblyjs/ast": "^1.14.1",
+ "@webassemblyjs/wasm-edit": "^1.14.1",
+ "@webassemblyjs/wasm-parser": "^1.14.1",
+ "acorn": "^8.15.0",
+ "acorn-import-phases": "^1.0.3",
+ "browserslist": "^4.24.0",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.17.3",
+ "es-module-lexer": "^1.2.1",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.11",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.2.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^4.3.2",
+ "tapable": "^2.1.1",
+ "terser-webpack-plugin": "^5.3.11",
+ "watchpack": "^2.4.1",
+ "webpack-sources": "^3.3.3"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-dev-middleware": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz",
+ "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "colorette": "^2.0.10",
+ "memfs": "^3.4.3",
+ "mime-types": "^2.1.31",
+ "range-parser": "^1.2.1",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/webpack-dev-server": {
+ "version": "4.15.2",
+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz",
+ "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/bonjour": "^3.5.9",
+ "@types/connect-history-api-fallback": "^1.3.5",
+ "@types/express": "^4.17.13",
+ "@types/serve-index": "^1.9.1",
+ "@types/serve-static": "^1.13.10",
+ "@types/sockjs": "^0.3.33",
+ "@types/ws": "^8.5.5",
+ "ansi-html-community": "^0.0.8",
+ "bonjour-service": "^1.0.11",
+ "chokidar": "^3.5.3",
+ "colorette": "^2.0.10",
+ "compression": "^1.7.4",
+ "connect-history-api-fallback": "^2.0.0",
+ "default-gateway": "^6.0.3",
+ "express": "^4.17.3",
+ "graceful-fs": "^4.2.6",
+ "html-entities": "^2.3.2",
+ "http-proxy-middleware": "^2.0.3",
+ "ipaddr.js": "^2.0.1",
+ "launch-editor": "^2.6.0",
+ "open": "^8.0.9",
+ "p-retry": "^4.5.0",
+ "rimraf": "^3.0.2",
+ "schema-utils": "^4.0.0",
+ "selfsigned": "^2.1.1",
+ "serve-index": "^1.9.1",
+ "sockjs": "^0.3.24",
+ "spdy": "^4.0.2",
+ "webpack-dev-middleware": "^5.3.4",
+ "ws": "^8.13.0"
+ },
+ "bin": {
+ "webpack-dev-server": "bin/webpack-dev-server.js"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.37.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "webpack": {
+ "optional": true
+ },
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/ws": {
+ "version": "8.18.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
+ "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-manifest-plugin": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz",
+ "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==",
+ "license": "MIT",
+ "dependencies": {
+ "tapable": "^2.0.0",
+ "webpack-sources": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12.22.0"
+ },
+ "peerDependencies": {
+ "webpack": "^4.44.2 || ^5.47.0"
+ }
+ },
+ "node_modules/webpack-manifest-plugin/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz",
+ "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==",
+ "license": "MIT",
+ "dependencies": {
+ "source-list-map": "^2.0.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz",
+ "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack/node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/webpack/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/websocket-driver": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
+ "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "http-parser-js": ">=0.5.1",
+ "safe-buffer": ">=5.1.0",
+ "websocket-extensions": ">=0.1.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/websocket-extensions": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/whatwg-encoding": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
+ "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "0.4.24"
+ }
+ },
+ "node_modules/whatwg-encoding/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/whatwg-fetch": {
+ "version": "3.6.20",
+ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz",
+ "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==",
+ "license": "MIT"
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
+ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
+ "license": "MIT"
+ },
+ "node_modules/whatwg-url": {
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
+ "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.7.0",
+ "tr46": "^2.1.0",
+ "webidl-conversions": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "license": "MIT",
+ "dependencies": {
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.2.1",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.19",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
+ "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/workbox-background-sync": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz",
+ "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==",
+ "license": "MIT",
+ "dependencies": {
+ "idb": "^7.0.1",
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-broadcast-update": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz",
+ "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-build": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz",
+ "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@apideck/better-ajv-errors": "^0.3.1",
+ "@babel/core": "^7.11.1",
+ "@babel/preset-env": "^7.11.0",
+ "@babel/runtime": "^7.11.2",
+ "@rollup/plugin-babel": "^5.2.0",
+ "@rollup/plugin-node-resolve": "^11.2.1",
+ "@rollup/plugin-replace": "^2.4.1",
+ "@surma/rollup-plugin-off-main-thread": "^2.2.3",
+ "ajv": "^8.6.0",
+ "common-tags": "^1.8.0",
+ "fast-json-stable-stringify": "^2.1.0",
+ "fs-extra": "^9.0.1",
+ "glob": "^7.1.6",
+ "lodash": "^4.17.20",
+ "pretty-bytes": "^5.3.0",
+ "rollup": "^2.43.1",
+ "rollup-plugin-terser": "^7.0.0",
+ "source-map": "^0.8.0-beta.0",
+ "stringify-object": "^3.3.0",
+ "strip-comments": "^2.0.1",
+ "tempy": "^0.6.0",
+ "upath": "^1.2.0",
+ "workbox-background-sync": "6.6.0",
+ "workbox-broadcast-update": "6.6.0",
+ "workbox-cacheable-response": "6.6.0",
+ "workbox-core": "6.6.0",
+ "workbox-expiration": "6.6.0",
+ "workbox-google-analytics": "6.6.0",
+ "workbox-navigation-preload": "6.6.0",
+ "workbox-precaching": "6.6.0",
+ "workbox-range-requests": "6.6.0",
+ "workbox-recipes": "6.6.0",
+ "workbox-routing": "6.6.0",
+ "workbox-strategies": "6.6.0",
+ "workbox-streams": "6.6.0",
+ "workbox-sw": "6.6.0",
+ "workbox-window": "6.6.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz",
+ "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==",
+ "license": "MIT",
+ "dependencies": {
+ "json-schema": "^0.4.0",
+ "jsonpointer": "^5.0.0",
+ "leven": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "ajv": ">=8"
+ }
+ },
+ "node_modules/workbox-build/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/workbox-build/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "license": "MIT",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/workbox-build/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
+ "node_modules/workbox-build/node_modules/source-map": {
+ "version": "0.8.0-beta.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
+ "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
+ "deprecated": "The work that was done in this beta branch won't be included in future versions",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "whatwg-url": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/workbox-build/node_modules/tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/workbox-build/node_modules/webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/workbox-build/node_modules/whatwg-url": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+ "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash.sortby": "^4.7.0",
+ "tr46": "^1.0.1",
+ "webidl-conversions": "^4.0.2"
+ }
+ },
+ "node_modules/workbox-cacheable-response": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz",
+ "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==",
+ "deprecated": "workbox-background-sync@6.6.0",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-core": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz",
+ "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==",
+ "license": "MIT"
+ },
+ "node_modules/workbox-expiration": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz",
+ "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==",
+ "license": "MIT",
+ "dependencies": {
+ "idb": "^7.0.1",
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-google-analytics": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz",
+ "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==",
+ "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-background-sync": "6.6.0",
+ "workbox-core": "6.6.0",
+ "workbox-routing": "6.6.0",
+ "workbox-strategies": "6.6.0"
+ }
+ },
+ "node_modules/workbox-navigation-preload": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz",
+ "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-precaching": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz",
+ "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0",
+ "workbox-routing": "6.6.0",
+ "workbox-strategies": "6.6.0"
+ }
+ },
+ "node_modules/workbox-range-requests": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz",
+ "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-recipes": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz",
+ "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-cacheable-response": "6.6.0",
+ "workbox-core": "6.6.0",
+ "workbox-expiration": "6.6.0",
+ "workbox-precaching": "6.6.0",
+ "workbox-routing": "6.6.0",
+ "workbox-strategies": "6.6.0"
+ }
+ },
+ "node_modules/workbox-routing": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz",
+ "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-strategies": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz",
+ "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-streams": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz",
+ "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0",
+ "workbox-routing": "6.6.0"
+ }
+ },
+ "node_modules/workbox-sw": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz",
+ "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==",
+ "license": "MIT"
+ },
+ "node_modules/workbox-webpack-plugin": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz",
+ "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-json-stable-stringify": "^2.1.0",
+ "pretty-bytes": "^5.4.1",
+ "upath": "^1.2.0",
+ "webpack-sources": "^1.4.3",
+ "workbox-build": "6.6.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "webpack": "^4.4.0 || ^5.9.0"
+ }
+ },
+ "node_modules/workbox-webpack-plugin/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
+ "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+ "license": "MIT",
+ "dependencies": {
+ "source-list-map": "^2.0.0",
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/workbox-window": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz",
+ "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/trusted-types": "^2.0.2",
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "license": "ISC"
+ },
+ "node_modules/write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "node_modules/ws": {
+ "version": "7.5.10",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xml-name-validator": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
+ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "license": "MIT"
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "license": "ISC"
+ },
+ "node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/InfoGenie-frontend/package.json b/InfoGenie-frontend/package.json
index 2a3eb677..5e50057c 100755
--- a/InfoGenie-frontend/package.json
+++ b/InfoGenie-frontend/package.json
@@ -1,55 +1,55 @@
-{
- "name": "infogenie-frontend",
- "version": "1.0.0",
- "description": "✨ 万象口袋 - 前端React应用",
- "keywords": [
- "react",
- "api",
- "mobile-first",
- "responsive"
- ],
- "author": "万象口袋",
- "license": "MIT",
- "private": true,
- "homepage": "/",
- "dependencies": {
- "@testing-library/jest-dom": "^5.17.0",
- "@testing-library/react": "^13.4.0",
- "@testing-library/user-event": "^14.5.2",
- "axios": "^1.5.0",
- "react": "^18.2.0",
- "react-dom": "^18.2.0",
- "react-hot-toast": "^2.4.1",
- "react-icons": "^4.11.0",
- "react-router-dom": "^6.15.0",
- "react-scripts": "5.0.1",
- "react-transition-group": "^4.4.5",
- "styled-components": "^6.0.7",
- "web-vitals": "^2.1.4"
- },
- "scripts": {
- "start": "react-scripts start",
- "build": "react-scripts build",
- "test": "react-scripts test",
- "eject": "react-scripts eject",
- "dev": "react-scripts start"
- },
- "eslintConfig": {
- "extends": [
- "react-app",
- "react-app/jest"
- ]
- },
- "browserslist": {
- "production": [
- ">0.2%",
- "not dead",
- "not op_mini all"
- ],
- "development": [
- "last 1 chrome version",
- "last 1 firefox version",
- "last 1 safari version"
- ]
- }
-}
+{
+ "name": "infogenie-frontend",
+ "version": "1.0.0",
+ "description": "✨ 万象口袋 - 前端React应用",
+ "keywords": [
+ "react",
+ "api",
+ "mobile-first",
+ "responsive"
+ ],
+ "author": "万象口袋",
+ "license": "MIT",
+ "private": true,
+ "homepage": "/",
+ "dependencies": {
+ "@testing-library/jest-dom": "^5.17.0",
+ "@testing-library/react": "^13.4.0",
+ "@testing-library/user-event": "^14.5.2",
+ "axios": "^1.5.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-hot-toast": "^2.4.1",
+ "react-icons": "^4.11.0",
+ "react-router-dom": "^6.15.0",
+ "react-scripts": "5.0.1",
+ "react-transition-group": "^4.4.5",
+ "styled-components": "^6.0.7",
+ "web-vitals": "^2.1.4"
+ },
+ "scripts": {
+ "start": "react-scripts start",
+ "build": "react-scripts build",
+ "test": "react-scripts test",
+ "eject": "react-scripts eject",
+ "dev": "react-scripts start"
+ },
+ "eslintConfig": {
+ "extends": [
+ "react-app",
+ "react-app/jest"
+ ]
+ },
+ "browserslist": {
+ "production": [
+ ">0.2%",
+ "not dead",
+ "not op_mini all"
+ ],
+ "development": [
+ "last 1 chrome version",
+ "last 1 firefox version",
+ "last 1 safari version"
+ ]
+ }
+}
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/background.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/background.css
index 7a44dec9..c2e020b1 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/background.css
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/background.css
@@ -1,190 +1,190 @@
-/* 背景样式文件 */
-
-/* 主体背景 */
-body {
- background: linear-gradient(135deg, #e8f5e8 0%, #c8e6c9 50%, #a5d6a7 100%);
- background-attachment: fixed;
- background-size: 400% 400%;
- animation: gradientShift 15s ease infinite;
-}
-
-/* 背景动画 */
-@keyframes gradientShift {
- 0% {
- background-position: 0% 50%;
- }
- 50% {
- background-position: 100% 50%;
- }
- 100% {
- background-position: 0% 50%;
- }
-}
-
-/* 装饰性背景元素 */
-body::before {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- radial-gradient(circle at 20% 80%, rgba(76, 175, 80, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 80% 20%, rgba(129, 199, 132, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 40% 40%, rgba(165, 214, 167, 0.08) 0%, transparent 50%);
- pointer-events: none;
- z-index: -1;
-}
-
-/* 浮动装饰圆点 */
-body::after {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- radial-gradient(2px 2px at 20px 30px, rgba(76, 175, 80, 0.3), transparent),
- radial-gradient(2px 2px at 40px 70px, rgba(129, 199, 132, 0.2), transparent),
- radial-gradient(1px 1px at 90px 40px, rgba(165, 214, 167, 0.3), transparent),
- radial-gradient(1px 1px at 130px 80px, rgba(76, 175, 80, 0.2), transparent),
- radial-gradient(2px 2px at 160px 30px, rgba(129, 199, 132, 0.3), transparent);
- background-repeat: repeat;
- background-size: 200px 100px;
- animation: float 20s linear infinite;
- pointer-events: none;
- z-index: -1;
- opacity: 0.6;
-}
-
-@keyframes float {
- 0% {
- transform: translateY(0px);
- }
- 50% {
- transform: translateY(-10px);
- }
- 100% {
- transform: translateY(0px);
- }
-}
-
-/* 题目容器背景增强 */
-.question-container {
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(10px);
- -webkit-backdrop-filter: blur(10px);
- border: 1px solid rgba(255, 255, 255, 0.2);
- box-shadow:
- 0 8px 32px rgba(26, 77, 26, 0.1),
- inset 0 1px 0 rgba(255, 255, 255, 0.2);
-}
-
-/* 错误容器背景 */
-.error-container {
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(10px);
- -webkit-backdrop-filter: blur(10px);
-}
-
-/* 结果容器背景 */
-.result-container {
- background: rgba(255, 255, 255, 0.9);
- backdrop-filter: blur(5px);
- -webkit-backdrop-filter: blur(5px);
-}
-
-/* 代码块背景 */
-.code-block {
- background: rgba(248, 249, 250, 0.9);
- backdrop-filter: blur(5px);
- -webkit-backdrop-filter: blur(5px);
-}
-
-/* 选项背景 */
-.option {
- background: rgba(255, 255, 255, 0.8);
- backdrop-filter: blur(5px);
- -webkit-backdrop-filter: blur(5px);
-}
-
-.option:hover {
- background: rgba(76, 175, 80, 0.05);
-}
-
-.option.selected {
- background: linear-gradient(135deg, rgba(76, 175, 80, 0.15), rgba(76, 175, 80, 0.08));
-}
-
-/* 按钮背景增强 */
-.submit-btn {
- background: linear-gradient(135deg, #4caf50, #45a049);
- box-shadow: 0 4px 15px rgba(76, 175, 80, 0.2);
-}
-
-.show-answer-btn {
- background: linear-gradient(135deg, #2196f3, #1976d2);
- box-shadow: 0 4px 15px rgba(33, 150, 243, 0.2);
-}
-
-.retry-btn {
- background: linear-gradient(135deg, #ff9800, #f57c00);
- box-shadow: 0 4px 15px rgba(255, 152, 0, 0.2);
-}
-
-.refresh-btn {
- background: linear-gradient(135deg, #4caf50, #45a049);
- box-shadow: 0 4px 15px rgba(76, 175, 80, 0.2);
-}
-
-/* 移动端背景优化 */
-@media (max-width: 768px) {
- body {
- background-attachment: scroll;
- }
-
- body::after {
- opacity: 0.4;
- background-size: 150px 75px;
- }
-
- .question-container {
- backdrop-filter: blur(8px);
- -webkit-backdrop-filter: blur(8px);
- }
-}
-
-/* 高对比度模式支持 */
-@media (prefers-contrast: high) {
- body {
- background: #f0f8f0;
- }
-
- body::before,
- body::after {
- display: none;
- }
-
- .question-container {
- background: #ffffff;
- border: 2px solid #4caf50;
- }
-}
-
-/* 减少动画模式支持 */
-@media (prefers-reduced-motion: reduce) {
- body {
- animation: none;
- background: #e8f5e8;
- }
-
- body::after {
- animation: none;
- }
-
- .refresh-btn:hover {
- transform: scale(1.1);
- }
+/* 背景样式文件 */
+
+/* 主体背景 */
+body {
+ background: linear-gradient(135deg, #e8f5e8 0%, #c8e6c9 50%, #a5d6a7 100%);
+ background-attachment: fixed;
+ background-size: 400% 400%;
+ animation: gradientShift 15s ease infinite;
+}
+
+/* 背景动画 */
+@keyframes gradientShift {
+ 0% {
+ background-position: 0% 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+ 100% {
+ background-position: 0% 50%;
+ }
+}
+
+/* 装饰性背景元素 */
+body::before {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(circle at 20% 80%, rgba(76, 175, 80, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(129, 199, 132, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 40% 40%, rgba(165, 214, 167, 0.08) 0%, transparent 50%);
+ pointer-events: none;
+ z-index: -1;
+}
+
+/* 浮动装饰圆点 */
+body::after {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(2px 2px at 20px 30px, rgba(76, 175, 80, 0.3), transparent),
+ radial-gradient(2px 2px at 40px 70px, rgba(129, 199, 132, 0.2), transparent),
+ radial-gradient(1px 1px at 90px 40px, rgba(165, 214, 167, 0.3), transparent),
+ radial-gradient(1px 1px at 130px 80px, rgba(76, 175, 80, 0.2), transparent),
+ radial-gradient(2px 2px at 160px 30px, rgba(129, 199, 132, 0.3), transparent);
+ background-repeat: repeat;
+ background-size: 200px 100px;
+ animation: float 20s linear infinite;
+ pointer-events: none;
+ z-index: -1;
+ opacity: 0.6;
+}
+
+@keyframes float {
+ 0% {
+ transform: translateY(0px);
+ }
+ 50% {
+ transform: translateY(-10px);
+ }
+ 100% {
+ transform: translateY(0px);
+ }
+}
+
+/* 题目容器背景增强 */
+.question-container {
+ background: rgba(255, 255, 255, 0.95);
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ box-shadow:
+ 0 8px 32px rgba(26, 77, 26, 0.1),
+ inset 0 1px 0 rgba(255, 255, 255, 0.2);
+}
+
+/* 错误容器背景 */
+.error-container {
+ background: rgba(255, 255, 255, 0.95);
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px);
+}
+
+/* 结果容器背景 */
+.result-container {
+ background: rgba(255, 255, 255, 0.9);
+ backdrop-filter: blur(5px);
+ -webkit-backdrop-filter: blur(5px);
+}
+
+/* 代码块背景 */
+.code-block {
+ background: rgba(248, 249, 250, 0.9);
+ backdrop-filter: blur(5px);
+ -webkit-backdrop-filter: blur(5px);
+}
+
+/* 选项背景 */
+.option {
+ background: rgba(255, 255, 255, 0.8);
+ backdrop-filter: blur(5px);
+ -webkit-backdrop-filter: blur(5px);
+}
+
+.option:hover {
+ background: rgba(76, 175, 80, 0.05);
+}
+
+.option.selected {
+ background: linear-gradient(135deg, rgba(76, 175, 80, 0.15), rgba(76, 175, 80, 0.08));
+}
+
+/* 按钮背景增强 */
+.submit-btn {
+ background: linear-gradient(135deg, #4caf50, #45a049);
+ box-shadow: 0 4px 15px rgba(76, 175, 80, 0.2);
+}
+
+.show-answer-btn {
+ background: linear-gradient(135deg, #2196f3, #1976d2);
+ box-shadow: 0 4px 15px rgba(33, 150, 243, 0.2);
+}
+
+.retry-btn {
+ background: linear-gradient(135deg, #ff9800, #f57c00);
+ box-shadow: 0 4px 15px rgba(255, 152, 0, 0.2);
+}
+
+.refresh-btn {
+ background: linear-gradient(135deg, #4caf50, #45a049);
+ box-shadow: 0 4px 15px rgba(76, 175, 80, 0.2);
+}
+
+/* 移动端背景优化 */
+@media (max-width: 768px) {
+ body {
+ background-attachment: scroll;
+ }
+
+ body::after {
+ opacity: 0.4;
+ background-size: 150px 75px;
+ }
+
+ .question-container {
+ backdrop-filter: blur(8px);
+ -webkit-backdrop-filter: blur(8px);
+ }
+}
+
+/* 高对比度模式支持 */
+@media (prefers-contrast: high) {
+ body {
+ background: #f0f8f0;
+ }
+
+ body::before,
+ body::after {
+ display: none;
+ }
+
+ .question-container {
+ background: #ffffff;
+ border: 2px solid #4caf50;
+ }
+}
+
+/* 减少动画模式支持 */
+@media (prefers-reduced-motion: reduce) {
+ body {
+ animation: none;
+ background: #e8f5e8;
+ }
+
+ body::after {
+ animation: none;
+ }
+
+ .refresh-btn:hover {
+ transform: scale(1.1);
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/style.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/style.css
index 2ad05653..540f0c2a 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/css/style.css
@@ -1,597 +1,597 @@
-/* 基础样式重置 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
- line-height: 1.6;
- color: #2d5a27;
- min-height: 100vh;
- overflow-x: hidden;
-}
-
-/* 容器布局 */
-.container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 20px;
- min-height: 100vh;
- display: flex;
- flex-direction: column;
-}
-
-/* 头部样式 */
-.header {
- text-align: center;
- margin-bottom: 40px;
- padding: 30px 0;
-}
-
-.header h1 {
- font-size: 2.5rem;
- color: #1a4d1a;
- margin-bottom: 10px;
- font-weight: 700;
- text-shadow: 0 2px 4px rgba(26, 77, 26, 0.1);
-}
-
-.subtitle {
- font-size: 1.1rem;
- color: #4a7c59;
- opacity: 0.8;
-}
-
-/* 主内容区域 */
-.main-content {
- flex: 1;
- display: flex;
- justify-content: center;
- align-items: flex-start;
-}
-
-/* 加载动画 */
-.loading {
- text-align: center;
- padding: 60px 20px;
-}
-
-.spinner {
- width: 50px;
- height: 50px;
- border: 4px solid #e8f5e8;
- border-top: 4px solid #4caf50;
- border-radius: 50%;
- animation: spin 1s linear infinite;
- margin: 0 auto 20px;
-}
-
-@keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-.loading p {
- color: #4a7c59;
- font-size: 1.1rem;
-}
-
-/* 题目容器 */
-.question-container {
- background: rgba(255, 255, 255, 0.95);
- border-radius: 20px;
- padding: 40px;
- box-shadow: 0 10px 30px rgba(26, 77, 26, 0.1);
- border: 2px solid rgba(76, 175, 80, 0.2);
- width: 100%;
- max-width: 800px;
- backdrop-filter: blur(10px);
-}
-
-/* 题目头部 */
-.question-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 30px;
- padding-bottom: 15px;
- border-bottom: 2px solid #e8f5e8;
-}
-
-.question-id {
- font-size: 1.1rem;
- color: #4caf50;
- font-weight: 600;
- background: linear-gradient(135deg, #e8f5e8, #c8e6c9);
- padding: 8px 16px;
- border-radius: 20px;
-}
-
-.refresh-btn {
- background: linear-gradient(135deg, #4caf50, #45a049);
- border: none;
- border-radius: 50%;
- width: 45px;
- height: 45px;
- color: white;
- cursor: pointer;
- transition: all 0.3s ease;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.refresh-btn:hover {
- transform: rotate(180deg) scale(1.1);
- box-shadow: 0 5px 15px rgba(76, 175, 80, 0.3);
-}
-
-/* 题目文本 */
-.question-text h2 {
- font-size: 1.5rem;
- color: #1a4d1a;
- margin-bottom: 25px;
- text-align: center;
-}
-
-/* 代码块 */
-.code-block {
- background: #f8f9fa;
- border: 2px solid #e8f5e8;
- border-radius: 12px;
- margin: 25px 0;
- overflow-x: auto;
- position: relative;
-}
-
-.code-block pre {
- margin: 0;
- padding: 25px;
- font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
- font-size: 0.95rem;
- line-height: 1.5;
- color: #2d5a27;
- white-space: pre-wrap;
- word-wrap: break-word;
- background: transparent !important;
-}
-
-.code-block code {
- font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
- background: transparent !important;
-}
-
-/* 代码高亮自定义样式 - 丰富的语法高亮 */
-.code-block .hljs {
- background: transparent !important;
- color: #333333 !important;
-}
-
-/* JavaScript 关键字 - 蓝色 */
-.code-block .hljs-keyword {
- color: #0066cc !important;
- font-weight: 600;
-}
-
-/* 字符串 - 绿色 */
-.code-block .hljs-string {
- color: #22aa22 !important;
-}
-
-/* 数字 - 橙色 */
-.code-block .hljs-number {
- color: #ff6600 !important;
-}
-
-/* 函数名 - 紫色 */
-.code-block .hljs-function,
-.code-block .hljs-title.function_ {
- color: #9933cc !important;
- font-weight: 600;
-}
-
-/* 变量名 - 深蓝色 */
-.code-block .hljs-variable,
-.code-block .hljs-name {
- color: #0066aa !important;
-}
-
-/* 注释 - 灰色 */
-.code-block .hljs-comment {
- color: #888888 !important;
- font-style: italic;
-}
-
-/* 内置对象和方法 - 深紫色 */
-.code-block .hljs-built_in {
- color: #663399 !important;
- font-weight: 500;
-}
-
-/* 字面量 (true, false, null) - 红色 */
-.code-block .hljs-literal {
- color: #cc0000 !important;
- font-weight: 600;
-}
-
-/* 操作符 - 深灰色 */
-.code-block .hljs-operator {
- color: #666666 !important;
-}
-
-/* 标点符号 - 深灰色 */
-.code-block .hljs-punctuation {
- color: #666666 !important;
-}
-
-/* 属性名 - 深蓝色 */
-.code-block .hljs-property,
-.code-block .hljs-attr {
- color: #0066aa !important;
-}
-
-/* 类名和构造函数 - 深绿色 */
-.code-block .hljs-title.class_,
-.code-block .hljs-title {
- color: #228833 !important;
- font-weight: 600;
-}
-
-/* 参数 - 深蓝色 */
-.code-block .hljs-params {
- color: #0066aa !important;
-}
-
-/* 正则表达式 - 深红色 */
-.code-block .hljs-regexp {
- color: #aa0066 !important;
-}
-
-/* 模板字符串 - 深绿色 */
-.code-block .hljs-template-variable,
-.code-block .hljs-template-tag {
- color: #228833 !important;
-}
-
-/* 选项容器 */
-.options-container {
- margin: 30px 0;
-}
-
-.option {
- background: rgba(255, 255, 255, 0.8);
- border: 2px solid #e8f5e8;
- border-radius: 12px;
- padding: 15px 20px;
- margin: 12px 0;
- cursor: pointer;
- transition: all 0.3s ease;
- font-size: 1rem;
- position: relative;
- overflow: hidden;
-}
-
-.option:hover {
- border-color: #4caf50;
- background: rgba(76, 175, 80, 0.05);
- transform: translateX(5px);
-}
-
-.option.selected {
- border-color: #4caf50;
- background: linear-gradient(135deg, rgba(76, 175, 80, 0.1), rgba(76, 175, 80, 0.05));
- color: #1a4d1a;
- font-weight: 600;
-}
-
-.option.correct {
- border-color: #4caf50;
- background: linear-gradient(135deg, rgba(76, 175, 80, 0.2), rgba(76, 175, 80, 0.1));
- color: #1a4d1a;
-}
-
-.option.incorrect {
- border-color: #f44336;
- background: linear-gradient(135deg, rgba(244, 67, 54, 0.1), rgba(244, 67, 54, 0.05));
- color: #c62828;
-}
-
-/* 按钮样式 */
-.action-buttons {
- display: flex;
- gap: 15px;
- margin: 30px 0;
- justify-content: center;
- flex-wrap: wrap;
-}
-
-.submit-btn, .show-answer-btn, .retry-btn, .export-btn {
- padding: 12px 30px;
- border: none;
- border-radius: 25px;
- font-size: 1rem;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.3s ease;
- min-width: 120px;
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 8px;
-}
-
-.submit-btn {
- background: linear-gradient(135deg, #4caf50, #45a049);
- color: white;
-}
-
-.submit-btn:hover:not(:disabled) {
- transform: translateY(-2px);
- box-shadow: 0 5px 15px rgba(76, 175, 80, 0.3);
-}
-
-.submit-btn:disabled {
- background: #cccccc;
- cursor: not-allowed;
- transform: none;
- box-shadow: none;
-}
-
-.show-answer-btn {
- background: linear-gradient(135deg, #2196f3, #1976d2);
- color: white;
-}
-
-.show-answer-btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 5px 15px rgba(33, 150, 243, 0.3);
-}
-
-.retry-btn {
- background: linear-gradient(135deg, #ff9800, #f57c00);
- color: white;
-}
-
-.retry-btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 5px 15px rgba(255, 152, 0, 0.3);
-}
-
-.export-btn {
- background: linear-gradient(135deg, #9c27b0, #7b1fa2);
- color: white;
-}
-
-.export-btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 5px 15px rgba(156, 39, 176, 0.3);
-}
-
-.export-btn svg {
- width: 16px;
- height: 16px;
-}
-
-/* 结果容器 */
-.result-container {
- margin-top: 30px;
- padding: 25px;
- background: rgba(255, 255, 255, 0.9);
- border-radius: 15px;
- border: 2px solid #e8f5e8;
-}
-
-.result-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 20px;
- padding-bottom: 15px;
- border-bottom: 1px solid #e8f5e8;
-}
-
-.result-status {
- font-size: 1.2rem;
- font-weight: 600;
-}
-
-.result-status.correct {
- color: #4caf50;
-}
-
-.result-status.incorrect {
- color: #f44336;
-}
-
-.correct-answer {
- font-weight: 600;
- color: #4caf50;
- background: rgba(76, 175, 80, 0.1);
- padding: 5px 12px;
- border-radius: 15px;
-}
-
-.explanation {
- color: #2d5a27;
- line-height: 1.7;
- font-size: 1rem;
-}
-
-.explanation pre {
- background: #f8f9fa;
- border: 1px solid #e8f5e8;
- border-radius: 8px;
- padding: 15px;
- margin: 15px 0;
- overflow-x: auto;
- font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
-}
-
-/* 错误容器 */
-.error-container {
- text-align: center;
- padding: 60px 20px;
- background: rgba(255, 255, 255, 0.9);
- border-radius: 20px;
- border: 2px solid rgba(244, 67, 54, 0.2);
- max-width: 500px;
- margin: 0 auto;
-}
-
-.error-icon {
- font-size: 3rem;
- margin-bottom: 20px;
-}
-
-.error-container h3 {
- color: #f44336;
- margin-bottom: 15px;
- font-size: 1.5rem;
-}
-
-.error-container p {
- color: #666;
- margin-bottom: 25px;
- font-size: 1.1rem;
-}
-
-/* 底部 */
-.footer {
- text-align: center;
- padding: 30px 0;
- margin-top: 40px;
- color: #4a7c59;
- opacity: 0.7;
- border-top: 1px solid rgba(76, 175, 80, 0.2);
-}
-
-/* 平板端适配 (768px - 1024px) */
-@media (max-width: 1024px) and (min-width: 768px) {
- .container {
- padding: 15px;
- }
-
- .header h1 {
- font-size: 2.2rem;
- }
-
- .question-container {
- padding: 30px;
- }
-
- .action-buttons {
- flex-wrap: wrap;
- }
-}
-
-/* 手机端适配 (最大768px) */
-@media (max-width: 768px) {
- .container {
- padding: 10px;
- }
-
- .header {
- margin-bottom: 25px;
- padding: 20px 0;
- }
-
- .header h1 {
- font-size: 1.8rem;
- }
-
- .subtitle {
- font-size: 1rem;
- }
-
- .question-container {
- padding: 20px;
- border-radius: 15px;
- }
-
- .question-header {
- flex-direction: column;
- gap: 15px;
- text-align: center;
- }
-
- .question-text h2 {
- font-size: 1.3rem;
- }
-
- .code-block pre {
- padding: 15px;
- font-size: 0.85rem;
- }
-
- .option {
- padding: 12px 15px;
- font-size: 0.95rem;
- }
-
- .action-buttons {
- flex-direction: column;
- align-items: center;
- }
-
- .submit-btn, .show-answer-btn, .retry-btn {
- width: 100%;
- max-width: 200px;
- }
-
- .result-header {
- flex-direction: column;
- gap: 10px;
- text-align: center;
- }
-
- .explanation {
- font-size: 0.95rem;
- }
-
- .explanation pre {
- padding: 10px;
- font-size: 0.8rem;
- }
-}
-
-/* 小屏手机适配 (最大480px) */
-@media (max-width: 480px) {
- .container {
- padding: 8px;
- }
-
- .header h1 {
- font-size: 1.6rem;
- }
-
- .question-container {
- padding: 15px;
- }
-
- .question-id {
- font-size: 1rem;
- padding: 6px 12px;
- }
-
- .refresh-btn {
- width: 40px;
- height: 40px;
- }
-
- .code-block pre {
- font-size: 0.8rem;
- padding: 12px;
- }
-
- .option {
- padding: 10px 12px;
- font-size: 0.9rem;
- }
-
- .submit-btn, .show-answer-btn, .retry-btn {
- padding: 10px 20px;
- font-size: 0.95rem;
- }
+/* 基础样式重置 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
+ line-height: 1.6;
+ color: #2d5a27;
+ min-height: 100vh;
+ overflow-x: hidden;
+}
+
+/* 容器布局 */
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+}
+
+/* 头部样式 */
+.header {
+ text-align: center;
+ margin-bottom: 40px;
+ padding: 30px 0;
+}
+
+.header h1 {
+ font-size: 2.5rem;
+ color: #1a4d1a;
+ margin-bottom: 10px;
+ font-weight: 700;
+ text-shadow: 0 2px 4px rgba(26, 77, 26, 0.1);
+}
+
+.subtitle {
+ font-size: 1.1rem;
+ color: #4a7c59;
+ opacity: 0.8;
+}
+
+/* 主内容区域 */
+.main-content {
+ flex: 1;
+ display: flex;
+ justify-content: center;
+ align-items: flex-start;
+}
+
+/* 加载动画 */
+.loading {
+ text-align: center;
+ padding: 60px 20px;
+}
+
+.spinner {
+ width: 50px;
+ height: 50px;
+ border: 4px solid #e8f5e8;
+ border-top: 4px solid #4caf50;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ margin: 0 auto 20px;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+.loading p {
+ color: #4a7c59;
+ font-size: 1.1rem;
+}
+
+/* 题目容器 */
+.question-container {
+ background: rgba(255, 255, 255, 0.95);
+ border-radius: 20px;
+ padding: 40px;
+ box-shadow: 0 10px 30px rgba(26, 77, 26, 0.1);
+ border: 2px solid rgba(76, 175, 80, 0.2);
+ width: 100%;
+ max-width: 800px;
+ backdrop-filter: blur(10px);
+}
+
+/* 题目头部 */
+.question-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 30px;
+ padding-bottom: 15px;
+ border-bottom: 2px solid #e8f5e8;
+}
+
+.question-id {
+ font-size: 1.1rem;
+ color: #4caf50;
+ font-weight: 600;
+ background: linear-gradient(135deg, #e8f5e8, #c8e6c9);
+ padding: 8px 16px;
+ border-radius: 20px;
+}
+
+.refresh-btn {
+ background: linear-gradient(135deg, #4caf50, #45a049);
+ border: none;
+ border-radius: 50%;
+ width: 45px;
+ height: 45px;
+ color: white;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.refresh-btn:hover {
+ transform: rotate(180deg) scale(1.1);
+ box-shadow: 0 5px 15px rgba(76, 175, 80, 0.3);
+}
+
+/* 题目文本 */
+.question-text h2 {
+ font-size: 1.5rem;
+ color: #1a4d1a;
+ margin-bottom: 25px;
+ text-align: center;
+}
+
+/* 代码块 */
+.code-block {
+ background: #f8f9fa;
+ border: 2px solid #e8f5e8;
+ border-radius: 12px;
+ margin: 25px 0;
+ overflow-x: auto;
+ position: relative;
+}
+
+.code-block pre {
+ margin: 0;
+ padding: 25px;
+ font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
+ font-size: 0.95rem;
+ line-height: 1.5;
+ color: #2d5a27;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+ background: transparent !important;
+}
+
+.code-block code {
+ font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
+ background: transparent !important;
+}
+
+/* 代码高亮自定义样式 - 丰富的语法高亮 */
+.code-block .hljs {
+ background: transparent !important;
+ color: #333333 !important;
+}
+
+/* JavaScript 关键字 - 蓝色 */
+.code-block .hljs-keyword {
+ color: #0066cc !important;
+ font-weight: 600;
+}
+
+/* 字符串 - 绿色 */
+.code-block .hljs-string {
+ color: #22aa22 !important;
+}
+
+/* 数字 - 橙色 */
+.code-block .hljs-number {
+ color: #ff6600 !important;
+}
+
+/* 函数名 - 紫色 */
+.code-block .hljs-function,
+.code-block .hljs-title.function_ {
+ color: #9933cc !important;
+ font-weight: 600;
+}
+
+/* 变量名 - 深蓝色 */
+.code-block .hljs-variable,
+.code-block .hljs-name {
+ color: #0066aa !important;
+}
+
+/* 注释 - 灰色 */
+.code-block .hljs-comment {
+ color: #888888 !important;
+ font-style: italic;
+}
+
+/* 内置对象和方法 - 深紫色 */
+.code-block .hljs-built_in {
+ color: #663399 !important;
+ font-weight: 500;
+}
+
+/* 字面量 (true, false, null) - 红色 */
+.code-block .hljs-literal {
+ color: #cc0000 !important;
+ font-weight: 600;
+}
+
+/* 操作符 - 深灰色 */
+.code-block .hljs-operator {
+ color: #666666 !important;
+}
+
+/* 标点符号 - 深灰色 */
+.code-block .hljs-punctuation {
+ color: #666666 !important;
+}
+
+/* 属性名 - 深蓝色 */
+.code-block .hljs-property,
+.code-block .hljs-attr {
+ color: #0066aa !important;
+}
+
+/* 类名和构造函数 - 深绿色 */
+.code-block .hljs-title.class_,
+.code-block .hljs-title {
+ color: #228833 !important;
+ font-weight: 600;
+}
+
+/* 参数 - 深蓝色 */
+.code-block .hljs-params {
+ color: #0066aa !important;
+}
+
+/* 正则表达式 - 深红色 */
+.code-block .hljs-regexp {
+ color: #aa0066 !important;
+}
+
+/* 模板字符串 - 深绿色 */
+.code-block .hljs-template-variable,
+.code-block .hljs-template-tag {
+ color: #228833 !important;
+}
+
+/* 选项容器 */
+.options-container {
+ margin: 30px 0;
+}
+
+.option {
+ background: rgba(255, 255, 255, 0.8);
+ border: 2px solid #e8f5e8;
+ border-radius: 12px;
+ padding: 15px 20px;
+ margin: 12px 0;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ font-size: 1rem;
+ position: relative;
+ overflow: hidden;
+}
+
+.option:hover {
+ border-color: #4caf50;
+ background: rgba(76, 175, 80, 0.05);
+ transform: translateX(5px);
+}
+
+.option.selected {
+ border-color: #4caf50;
+ background: linear-gradient(135deg, rgba(76, 175, 80, 0.1), rgba(76, 175, 80, 0.05));
+ color: #1a4d1a;
+ font-weight: 600;
+}
+
+.option.correct {
+ border-color: #4caf50;
+ background: linear-gradient(135deg, rgba(76, 175, 80, 0.2), rgba(76, 175, 80, 0.1));
+ color: #1a4d1a;
+}
+
+.option.incorrect {
+ border-color: #f44336;
+ background: linear-gradient(135deg, rgba(244, 67, 54, 0.1), rgba(244, 67, 54, 0.05));
+ color: #c62828;
+}
+
+/* 按钮样式 */
+.action-buttons {
+ display: flex;
+ gap: 15px;
+ margin: 30px 0;
+ justify-content: center;
+ flex-wrap: wrap;
+}
+
+.submit-btn, .show-answer-btn, .retry-btn, .export-btn {
+ padding: 12px 30px;
+ border: none;
+ border-radius: 25px;
+ font-size: 1rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ min-width: 120px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 8px;
+}
+
+.submit-btn {
+ background: linear-gradient(135deg, #4caf50, #45a049);
+ color: white;
+}
+
+.submit-btn:hover:not(:disabled) {
+ transform: translateY(-2px);
+ box-shadow: 0 5px 15px rgba(76, 175, 80, 0.3);
+}
+
+.submit-btn:disabled {
+ background: #cccccc;
+ cursor: not-allowed;
+ transform: none;
+ box-shadow: none;
+}
+
+.show-answer-btn {
+ background: linear-gradient(135deg, #2196f3, #1976d2);
+ color: white;
+}
+
+.show-answer-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 5px 15px rgba(33, 150, 243, 0.3);
+}
+
+.retry-btn {
+ background: linear-gradient(135deg, #ff9800, #f57c00);
+ color: white;
+}
+
+.retry-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 5px 15px rgba(255, 152, 0, 0.3);
+}
+
+.export-btn {
+ background: linear-gradient(135deg, #9c27b0, #7b1fa2);
+ color: white;
+}
+
+.export-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 5px 15px rgba(156, 39, 176, 0.3);
+}
+
+.export-btn svg {
+ width: 16px;
+ height: 16px;
+}
+
+/* 结果容器 */
+.result-container {
+ margin-top: 30px;
+ padding: 25px;
+ background: rgba(255, 255, 255, 0.9);
+ border-radius: 15px;
+ border: 2px solid #e8f5e8;
+}
+
+.result-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 20px;
+ padding-bottom: 15px;
+ border-bottom: 1px solid #e8f5e8;
+}
+
+.result-status {
+ font-size: 1.2rem;
+ font-weight: 600;
+}
+
+.result-status.correct {
+ color: #4caf50;
+}
+
+.result-status.incorrect {
+ color: #f44336;
+}
+
+.correct-answer {
+ font-weight: 600;
+ color: #4caf50;
+ background: rgba(76, 175, 80, 0.1);
+ padding: 5px 12px;
+ border-radius: 15px;
+}
+
+.explanation {
+ color: #2d5a27;
+ line-height: 1.7;
+ font-size: 1rem;
+}
+
+.explanation pre {
+ background: #f8f9fa;
+ border: 1px solid #e8f5e8;
+ border-radius: 8px;
+ padding: 15px;
+ margin: 15px 0;
+ overflow-x: auto;
+ font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
+}
+
+/* 错误容器 */
+.error-container {
+ text-align: center;
+ padding: 60px 20px;
+ background: rgba(255, 255, 255, 0.9);
+ border-radius: 20px;
+ border: 2px solid rgba(244, 67, 54, 0.2);
+ max-width: 500px;
+ margin: 0 auto;
+}
+
+.error-icon {
+ font-size: 3rem;
+ margin-bottom: 20px;
+}
+
+.error-container h3 {
+ color: #f44336;
+ margin-bottom: 15px;
+ font-size: 1.5rem;
+}
+
+.error-container p {
+ color: #666;
+ margin-bottom: 25px;
+ font-size: 1.1rem;
+}
+
+/* 底部 */
+.footer {
+ text-align: center;
+ padding: 30px 0;
+ margin-top: 40px;
+ color: #4a7c59;
+ opacity: 0.7;
+ border-top: 1px solid rgba(76, 175, 80, 0.2);
+}
+
+/* 平板端适配 (768px - 1024px) */
+@media (max-width: 1024px) and (min-width: 768px) {
+ .container {
+ padding: 15px;
+ }
+
+ .header h1 {
+ font-size: 2.2rem;
+ }
+
+ .question-container {
+ padding: 30px;
+ }
+
+ .action-buttons {
+ flex-wrap: wrap;
+ }
+}
+
+/* 手机端适配 (最大768px) */
+@media (max-width: 768px) {
+ .container {
+ padding: 10px;
+ }
+
+ .header {
+ margin-bottom: 25px;
+ padding: 20px 0;
+ }
+
+ .header h1 {
+ font-size: 1.8rem;
+ }
+
+ .subtitle {
+ font-size: 1rem;
+ }
+
+ .question-container {
+ padding: 20px;
+ border-radius: 15px;
+ }
+
+ .question-header {
+ flex-direction: column;
+ gap: 15px;
+ text-align: center;
+ }
+
+ .question-text h2 {
+ font-size: 1.3rem;
+ }
+
+ .code-block pre {
+ padding: 15px;
+ font-size: 0.85rem;
+ }
+
+ .option {
+ padding: 12px 15px;
+ font-size: 0.95rem;
+ }
+
+ .action-buttons {
+ flex-direction: column;
+ align-items: center;
+ }
+
+ .submit-btn, .show-answer-btn, .retry-btn {
+ width: 100%;
+ max-width: 200px;
+ }
+
+ .result-header {
+ flex-direction: column;
+ gap: 10px;
+ text-align: center;
+ }
+
+ .explanation {
+ font-size: 0.95rem;
+ }
+
+ .explanation pre {
+ padding: 10px;
+ font-size: 0.8rem;
+ }
+}
+
+/* 小屏手机适配 (最大480px) */
+@media (max-width: 480px) {
+ .container {
+ padding: 8px;
+ }
+
+ .header h1 {
+ font-size: 1.6rem;
+ }
+
+ .question-container {
+ padding: 15px;
+ }
+
+ .question-id {
+ font-size: 1rem;
+ padding: 6px 12px;
+ }
+
+ .refresh-btn {
+ width: 40px;
+ height: 40px;
+ }
+
+ .code-block pre {
+ font-size: 0.8rem;
+ padding: 12px;
+ }
+
+ .option {
+ padding: 10px 12px;
+ font-size: 0.9rem;
+ }
+
+ .submit-btn, .show-answer-btn, .retry-btn {
+ padding: 10px 20px;
+ font-size: 0.95rem;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/index.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/index.html
index b3d01b4e..46e66a0a 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/index.html
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/index.html
@@ -1,91 +1,91 @@
-
-
-
-
-
- 随机JavaScript趣味题
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
输出是什么?
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
⚠️
-
加载失败
-
网络连接异常,请稍后重试
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ 随机JavaScript趣味题
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
输出是什么?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
⚠️
+
加载失败
+
网络连接异常,请稍后重试
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/js/script.js b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/js/script.js
index 891da9e4..5bf6a0cd 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/js/script.js
@@ -1,582 +1,582 @@
-// JavaScript趣味题应用
-class JSQuizApp {
- constructor() {
- this.apiEndpoints = [
- 'https://60s.api.shumengya.top',
- ];
- this.currentApiIndex = 0;
- this.currentQuestion = null;
- this.selectedOption = null;
- this.isAnswered = false;
- this.loadStartTime = null;
-
- this.initElements();
- this.bindEvents();
- this.preloadResources();
- this.loadQuestion();
- }
-
- // 初始化DOM元素
- initElements() {
- this.elements = {
- loading: document.getElementById('loading'),
- questionContainer: document.getElementById('questionContainer'),
- errorContainer: document.getElementById('errorContainer'),
- questionId: document.getElementById('questionId'),
- questionText: document.getElementById('questionText'),
- codeContent: document.getElementById('codeContent'),
- optionsContainer: document.getElementById('optionsContainer'),
- submitBtn: document.getElementById('submitBtn'),
- showAnswerBtn: document.getElementById('showAnswerBtn'),
- refreshBtn: document.getElementById('refreshBtn'),
- retryBtn: document.getElementById('retryBtn'),
- exportBtn: document.getElementById('exportBtn'),
- resultContainer: document.getElementById('resultContainer'),
- resultStatus: document.getElementById('resultStatus'),
- correctAnswer: document.getElementById('correctAnswer'),
- explanation: document.getElementById('explanation'),
- errorMessage: document.getElementById('errorMessage')
- };
- }
-
- // 预加载资源
- preloadResources() {
- // 预连接API服务器
- this.apiEndpoints.forEach(endpoint => {
- const link = document.createElement('link');
- link.rel = 'preconnect';
- link.href = endpoint;
- document.head.appendChild(link);
- });
- }
-
- // 绑定事件
- bindEvents() {
- this.elements.submitBtn.addEventListener('click', () => this.submitAnswer());
- this.elements.showAnswerBtn.addEventListener('click', () => this.showAnswer());
- this.elements.refreshBtn.addEventListener('click', () => this.loadQuestion());
- this.elements.retryBtn.addEventListener('click', () => this.loadQuestion());
- this.elements.exportBtn.addEventListener('click', () => this.exportToMarkdown());
- }
-
- // 显示加载状态
- showLoading() {
- this.elements.loading.style.display = 'block';
- this.elements.questionContainer.style.display = 'none';
- this.elements.errorContainer.style.display = 'none';
- }
-
- // 显示题目
- showQuestion() {
- this.elements.loading.style.display = 'none';
- this.elements.questionContainer.style.display = 'block';
- this.elements.errorContainer.style.display = 'none';
- }
-
- // 显示错误
- showError(message) {
- this.elements.loading.style.display = 'none';
- this.elements.questionContainer.style.display = 'none';
- this.elements.errorContainer.style.display = 'block';
- this.elements.errorMessage.textContent = message;
- }
-
- // 获取当前API地址
- getCurrentApiUrl() {
- return `${this.apiEndpoints[this.currentApiIndex]}/v2/awesome-js`;
- }
-
- // 切换到下一个API
- switchToNextApi() {
- this.currentApiIndex = (this.currentApiIndex + 1) % this.apiEndpoints.length;
- }
-
- // 加载题目
- async loadQuestion() {
- this.loadStartTime = Date.now();
- this.showLoading();
- this.resetQuestion();
-
- let attempts = 0;
- const maxAttempts = this.apiEndpoints.length;
-
- while (attempts < maxAttempts) {
- try {
- const controller = new AbortController();
- const timeoutId = setTimeout(() => controller.abort(), 5000);
-
- const response = await fetch(this.getCurrentApiUrl(), {
- method: 'GET',
- headers: {
- 'Accept': 'application/json',
- 'Content-Type': 'application/json'
- },
- signal: controller.signal
- });
-
- clearTimeout(timeoutId);
-
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
- }
-
- const data = await response.json();
-
- if (data.code === 200 && data.data) {
- this.currentQuestion = data.data;
- const loadTime = Date.now() - this.loadStartTime;
- console.log(`题目加载完成,耗时: ${loadTime}ms`);
- this.displayQuestion();
- return;
- } else {
- throw new Error(data.message || '数据格式错误');
- }
-
- } catch (error) {
- console.warn(`API ${this.getCurrentApiUrl()} 请求失败:`, error.message);
- attempts++;
-
- if (attempts < maxAttempts) {
- this.switchToNextApi();
- console.log(`切换到备用API: ${this.getCurrentApiUrl()}`);
- } else {
- this.showError(`所有API接口都无法访问,请检查网络连接后重试。\n最后尝试的错误: ${error.message}`);
- return;
- }
- }
- }
- }
-
- // 重置题目状态
- resetQuestion() {
- this.selectedOption = null;
- this.isAnswered = false;
- this.elements.resultContainer.style.display = 'none';
- this.elements.submitBtn.disabled = true;
- this.elements.submitBtn.textContent = '提交答案';
- this.elements.showAnswerBtn.style.display = 'inline-block';
-
- // 清空选项容器,防止重复显示
- this.elements.optionsContainer.innerHTML = '';
-
- // 移除所有选项的事件监听器
- const existingOptions = document.querySelectorAll('.option');
- existingOptions.forEach(option => {
- option.removeEventListener('click', this.selectOption);
- });
- }
-
- // 显示题目内容
- displayQuestion() {
- const question = this.currentQuestion;
-
- console.log('显示题目:', question);
-
- // 设置题目ID
- this.elements.questionId.textContent = `题目 #${question.id}`;
-
- // 设置题目文本
- this.elements.questionText.innerHTML = `${this.escapeHtml(question.question)}
`;
-
- // 设置代码内容并应用语法高亮
- this.elements.codeContent.textContent = question.code;
-
- // 应用语法高亮
- if (typeof hljs !== 'undefined') {
- hljs.highlightElement(this.elements.codeContent);
- }
-
- // 确保选项容器已清空
- this.elements.optionsContainer.innerHTML = '';
-
- // 生成选项
- this.generateOptions(question.options);
-
- this.showQuestion();
- }
-
- // 生成选项
- generateOptions(options) {
- // 确保清空容器
- this.elements.optionsContainer.innerHTML = '';
-
- // 验证选项数据
- if (!Array.isArray(options) || options.length === 0) {
- console.error('选项数据无效:', options);
- return;
- }
-
- // 移除可能存在的重复选项
- const uniqueOptions = [...new Set(options)];
-
- uniqueOptions.forEach((option, index) => {
- const optionElement = document.createElement('div');
- optionElement.className = 'option';
- optionElement.textContent = option;
- optionElement.dataset.index = index;
- optionElement.dataset.value = option.charAt(0); // A, B, C, D
-
- optionElement.addEventListener('click', () => this.selectOption(optionElement));
-
- this.elements.optionsContainer.appendChild(optionElement);
- });
-
- console.log('生成选项:', uniqueOptions);
- }
-
- // 选择选项
- selectOption(optionElement) {
- if (this.isAnswered) return;
-
- // 移除之前的选中状态
- document.querySelectorAll('.option.selected').forEach(el => {
- el.classList.remove('selected');
- });
-
- // 设置当前选中
- optionElement.classList.add('selected');
- this.selectedOption = optionElement.dataset.value;
-
- // 启用提交按钮
- this.elements.submitBtn.disabled = false;
- }
-
- // 提交答案
- submitAnswer() {
- if (!this.selectedOption || this.isAnswered) return;
-
- this.isAnswered = true;
- this.elements.submitBtn.disabled = true;
- this.elements.submitBtn.textContent = '已提交';
- this.elements.showAnswerBtn.style.display = 'none';
-
- const isCorrect = this.selectedOption === this.currentQuestion.answer;
-
- // 显示结果
- this.showResult(isCorrect);
-
- // 标记选项
- this.markOptions();
- }
-
- // 显示答案
- showAnswer() {
- this.isAnswered = true;
- this.elements.submitBtn.disabled = true;
- this.elements.submitBtn.textContent = '已显示答案';
- this.elements.showAnswerBtn.style.display = 'none';
-
- // 显示结果(不判断对错)
- this.showResult(null);
-
- // 标记正确答案
- this.markCorrectAnswer();
- }
-
- // 显示结果
- showResult(isCorrect) {
- const resultContainer = this.elements.resultContainer;
- const resultStatus = this.elements.resultStatus;
- const correctAnswer = this.elements.correctAnswer;
- const explanation = this.elements.explanation;
-
- // 设置结果状态
- if (isCorrect === true) {
- resultStatus.textContent = '✅ 回答正确!';
- resultStatus.className = 'result-status correct';
- } else if (isCorrect === false) {
- resultStatus.textContent = '❌ 回答错误';
- resultStatus.className = 'result-status incorrect';
- } else {
- resultStatus.textContent = '💡 答案解析';
- resultStatus.className = 'result-status';
- }
-
- // 设置正确答案
- correctAnswer.textContent = `正确答案: ${this.currentQuestion.answer}`;
-
- // 设置解析内容
- explanation.innerHTML = this.formatExplanation(this.currentQuestion.explanation);
-
- // 显示结果容器
- resultContainer.style.display = 'block';
-
- // 滚动到结果区域
- setTimeout(() => {
- resultContainer.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
- }, 100);
- }
-
- // 标记选项
- markOptions() {
- const options = document.querySelectorAll('.option');
- const correctAnswer = this.currentQuestion.answer;
-
- options.forEach(option => {
- const optionValue = option.dataset.value;
-
- if (optionValue === correctAnswer) {
- option.classList.add('correct');
- } else if (option.classList.contains('selected')) {
- option.classList.add('incorrect');
- }
-
- // 禁用点击
- option.style.pointerEvents = 'none';
- });
- }
-
- // 标记正确答案
- markCorrectAnswer() {
- const options = document.querySelectorAll('.option');
- const correctAnswer = this.currentQuestion.answer;
-
- options.forEach(option => {
- const optionValue = option.dataset.value;
-
- if (optionValue === correctAnswer) {
- option.classList.add('correct');
- }
-
- // 禁用点击
- option.style.pointerEvents = 'none';
- });
- }
-
- // 格式化解析内容
- formatExplanation(explanation) {
- // 转义HTML
- let formatted = this.escapeHtml(explanation);
-
- // 处理代码块
- formatted = formatted.replace(/```js\n([\s\S]*?)\n```/g, '$1
');
- formatted = formatted.replace(/```javascript\n([\s\S]*?)\n```/g, '$1
');
- formatted = formatted.replace(/```([\s\S]*?)```/g, '$1
');
-
- // 处理行内代码
- formatted = formatted.replace(/`([^`]+)`/g, '$1');
-
- // 处理换行
- formatted = formatted.replace(/\n\n/g, '
');
- formatted = formatted.replace(/\n/g, '
');
-
- // 包装段落
- if (!formatted.includes('
')) {
- formatted = '
' + formatted + '
';
- }
-
- return formatted;
- }
-
- // HTML转义
- escapeHtml(text) {
- const div = document.createElement('div');
- div.textContent = text;
- return div.innerHTML;
- }
-
- // 导出为Markdown
- exportToMarkdown() {
- if (!this.currentQuestion) {
- alert('请先加载题目后再导出!');
- return;
- }
-
- const question = this.currentQuestion;
- const timestamp = new Date().toLocaleString('zh-CN');
-
- // 构建Markdown内容
- let markdown = `# JavaScript趣味题 #${question.id}\n\n`;
- markdown += `> 导出时间: ${timestamp}\n\n`;
-
- // 题目部分
- markdown += `## 题目\n\n`;
- markdown += `${question.question}\n\n`;
-
- // 代码部分
- markdown += `## 代码\n\n`;
- markdown += `\`\`\`javascript\n${question.code}\n\`\`\`\n\n`;
-
- // 选项部分
- markdown += `## 选项\n\n`;
- question.options.forEach((option, index) => {
- const letter = String.fromCharCode(65 + index); // A, B, C, D
- const isCorrect = letter === question.answer;
- markdown += `${letter}. ${option}${isCorrect ? ' ✅' : ''}\n`;
- });
- markdown += `\n`;
-
- // 答案部分
- markdown += `## 正确答案\n\n`;
- markdown += `**${question.answer}**\n\n`;
-
- // 解析部分
- markdown += `## 答案解析\n\n`;
- // 清理解析内容中的HTML标签,转换为Markdown格式
- let explanation = question.explanation;
- explanation = explanation.replace(/
/gi, '\n');
- explanation = explanation.replace(//gi, '\n');
- explanation = explanation.replace(/<\/p>/gi, '\n');
- explanation = explanation.replace(/]*>/gi, '`');
- explanation = explanation.replace(/<\/code>/gi, '`');
- explanation = explanation.replace(//gi, '\n```javascript\n');
- explanation = explanation.replace(/<\/code><\/pre>/gi, '\n```\n');
- explanation = explanation.replace(/<[^>]*>/g, ''); // 移除其他HTML标签
- explanation = explanation.replace(/\n\s*\n/g, '\n\n'); // 清理多余空行
- markdown += explanation.trim() + '\n\n';
-
- // 添加页脚
- markdown += `---\n\n`;
- markdown += `*本题目来源于JavaScript趣味题集合*\n`;
- markdown += `*导出工具: JavaScript趣味题网页版*\n`;
-
- // 创建下载
- this.downloadMarkdown(markdown, `JavaScript趣味题_${question.id}_${new Date().getTime()}.md`);
- }
-
- // 下载Markdown文件
- downloadMarkdown(content, filename) {
- const blob = new Blob([content], { type: 'text/markdown;charset=utf-8' });
- const url = URL.createObjectURL(blob);
-
- const link = document.createElement('a');
- link.href = url;
- link.download = filename;
- link.style.display = 'none';
-
- document.body.appendChild(link);
- link.click();
- document.body.removeChild(link);
-
- // 清理URL对象
- setTimeout(() => {
- URL.revokeObjectURL(url);
- }, 100);
-
- // 显示成功提示
- this.showExportSuccess(filename);
- }
-
- // 显示导出成功提示
- showExportSuccess(filename) {
- // 创建临时提示元素
- const toast = document.createElement('div');
- toast.style.cssText = `
- position: fixed;
- top: 20px;
- right: 20px;
- background: linear-gradient(135deg, #4caf50, #45a049);
- color: white;
- padding: 15px 20px;
- border-radius: 8px;
- box-shadow: 0 4px 12px rgba(76, 175, 80, 0.3);
- z-index: 10000;
- font-size: 14px;
- max-width: 300px;
- word-wrap: break-word;
- animation: slideInRight 0.3s ease-out;
- `;
-
- toast.innerHTML = `
-
- `;
-
- // 添加动画样式
- const style = document.createElement('style');
- style.textContent = `
- @keyframes slideInRight {
- from {
- transform: translateX(100%);
- opacity: 0;
- }
- to {
- transform: translateX(0);
- opacity: 1;
- }
- }
- @keyframes slideOutRight {
- from {
- transform: translateX(0);
- opacity: 1;
- }
- to {
- transform: translateX(100%);
- opacity: 0;
- }
- }
- `;
- document.head.appendChild(style);
-
- document.body.appendChild(toast);
-
- // 3秒后自动消失
- setTimeout(() => {
- toast.style.animation = 'slideOutRight 0.3s ease-in';
- setTimeout(() => {
- if (toast.parentNode) {
- document.body.removeChild(toast);
- }
- if (style.parentNode) {
- document.head.removeChild(style);
- }
- }, 300);
- }, 3000);
- }
-}
-
-// 页面加载完成后初始化应用
-document.addEventListener('DOMContentLoaded', () => {
- new JSQuizApp();
-});
-
-// 添加键盘快捷键支持
-document.addEventListener('keydown', (e) => {
- // 按R键刷新题目
- if (e.key.toLowerCase() === 'r' && !e.ctrlKey && !e.metaKey) {
- const refreshBtn = document.getElementById('refreshBtn');
- if (refreshBtn && !document.querySelector('.loading').style.display !== 'none') {
- refreshBtn.click();
- }
- }
-
- // 按数字键1-4选择选项
- if (['1', '2', '3', '4'].includes(e.key)) {
- const options = document.querySelectorAll('.option');
- const index = parseInt(e.key) - 1;
- if (options[index] && !options[index].style.pointerEvents) {
- options[index].click();
- }
- }
-
- // 按Enter键提交答案
- if (e.key === 'Enter') {
- const submitBtn = document.getElementById('submitBtn');
- if (submitBtn && !submitBtn.disabled) {
- submitBtn.click();
- }
- }
-});
-
-// 添加触摸设备支持
-if ('ontouchstart' in window) {
- document.addEventListener('touchstart', () => {}, { passive: true });
-}
-
-// 添加网络状态监听
-if ('navigator' in window && 'onLine' in navigator) {
- window.addEventListener('online', () => {
- console.log('网络连接已恢复');
- });
-
- window.addEventListener('offline', () => {
- console.log('网络连接已断开');
- });
+// JavaScript趣味题应用
+class JSQuizApp {
+ constructor() {
+ this.apiEndpoints = [
+ 'https://60s.api.shumengya.top',
+ ];
+ this.currentApiIndex = 0;
+ this.currentQuestion = null;
+ this.selectedOption = null;
+ this.isAnswered = false;
+ this.loadStartTime = null;
+
+ this.initElements();
+ this.bindEvents();
+ this.preloadResources();
+ this.loadQuestion();
+ }
+
+ // 初始化DOM元素
+ initElements() {
+ this.elements = {
+ loading: document.getElementById('loading'),
+ questionContainer: document.getElementById('questionContainer'),
+ errorContainer: document.getElementById('errorContainer'),
+ questionId: document.getElementById('questionId'),
+ questionText: document.getElementById('questionText'),
+ codeContent: document.getElementById('codeContent'),
+ optionsContainer: document.getElementById('optionsContainer'),
+ submitBtn: document.getElementById('submitBtn'),
+ showAnswerBtn: document.getElementById('showAnswerBtn'),
+ refreshBtn: document.getElementById('refreshBtn'),
+ retryBtn: document.getElementById('retryBtn'),
+ exportBtn: document.getElementById('exportBtn'),
+ resultContainer: document.getElementById('resultContainer'),
+ resultStatus: document.getElementById('resultStatus'),
+ correctAnswer: document.getElementById('correctAnswer'),
+ explanation: document.getElementById('explanation'),
+ errorMessage: document.getElementById('errorMessage')
+ };
+ }
+
+ // 预加载资源
+ preloadResources() {
+ // 预连接API服务器
+ this.apiEndpoints.forEach(endpoint => {
+ const link = document.createElement('link');
+ link.rel = 'preconnect';
+ link.href = endpoint;
+ document.head.appendChild(link);
+ });
+ }
+
+ // 绑定事件
+ bindEvents() {
+ this.elements.submitBtn.addEventListener('click', () => this.submitAnswer());
+ this.elements.showAnswerBtn.addEventListener('click', () => this.showAnswer());
+ this.elements.refreshBtn.addEventListener('click', () => this.loadQuestion());
+ this.elements.retryBtn.addEventListener('click', () => this.loadQuestion());
+ this.elements.exportBtn.addEventListener('click', () => this.exportToMarkdown());
+ }
+
+ // 显示加载状态
+ showLoading() {
+ this.elements.loading.style.display = 'block';
+ this.elements.questionContainer.style.display = 'none';
+ this.elements.errorContainer.style.display = 'none';
+ }
+
+ // 显示题目
+ showQuestion() {
+ this.elements.loading.style.display = 'none';
+ this.elements.questionContainer.style.display = 'block';
+ this.elements.errorContainer.style.display = 'none';
+ }
+
+ // 显示错误
+ showError(message) {
+ this.elements.loading.style.display = 'none';
+ this.elements.questionContainer.style.display = 'none';
+ this.elements.errorContainer.style.display = 'block';
+ this.elements.errorMessage.textContent = message;
+ }
+
+ // 获取当前API地址
+ getCurrentApiUrl() {
+ return `${this.apiEndpoints[this.currentApiIndex]}/v2/awesome-js`;
+ }
+
+ // 切换到下一个API
+ switchToNextApi() {
+ this.currentApiIndex = (this.currentApiIndex + 1) % this.apiEndpoints.length;
+ }
+
+ // 加载题目
+ async loadQuestion() {
+ this.loadStartTime = Date.now();
+ this.showLoading();
+ this.resetQuestion();
+
+ let attempts = 0;
+ const maxAttempts = this.apiEndpoints.length;
+
+ while (attempts < maxAttempts) {
+ try {
+ const controller = new AbortController();
+ const timeoutId = setTimeout(() => controller.abort(), 5000);
+
+ const response = await fetch(this.getCurrentApiUrl(), {
+ method: 'GET',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json'
+ },
+ signal: controller.signal
+ });
+
+ clearTimeout(timeoutId);
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+ }
+
+ const data = await response.json();
+
+ if (data.code === 200 && data.data) {
+ this.currentQuestion = data.data;
+ const loadTime = Date.now() - this.loadStartTime;
+ console.log(`题目加载完成,耗时: ${loadTime}ms`);
+ this.displayQuestion();
+ return;
+ } else {
+ throw new Error(data.message || '数据格式错误');
+ }
+
+ } catch (error) {
+ console.warn(`API ${this.getCurrentApiUrl()} 请求失败:`, error.message);
+ attempts++;
+
+ if (attempts < maxAttempts) {
+ this.switchToNextApi();
+ console.log(`切换到备用API: ${this.getCurrentApiUrl()}`);
+ } else {
+ this.showError(`所有API接口都无法访问,请检查网络连接后重试。\n最后尝试的错误: ${error.message}`);
+ return;
+ }
+ }
+ }
+ }
+
+ // 重置题目状态
+ resetQuestion() {
+ this.selectedOption = null;
+ this.isAnswered = false;
+ this.elements.resultContainer.style.display = 'none';
+ this.elements.submitBtn.disabled = true;
+ this.elements.submitBtn.textContent = '提交答案';
+ this.elements.showAnswerBtn.style.display = 'inline-block';
+
+ // 清空选项容器,防止重复显示
+ this.elements.optionsContainer.innerHTML = '';
+
+ // 移除所有选项的事件监听器
+ const existingOptions = document.querySelectorAll('.option');
+ existingOptions.forEach(option => {
+ option.removeEventListener('click', this.selectOption);
+ });
+ }
+
+ // 显示题目内容
+ displayQuestion() {
+ const question = this.currentQuestion;
+
+ console.log('显示题目:', question);
+
+ // 设置题目ID
+ this.elements.questionId.textContent = `题目 #${question.id}`;
+
+ // 设置题目文本
+ this.elements.questionText.innerHTML = `${this.escapeHtml(question.question)}
`;
+
+ // 设置代码内容并应用语法高亮
+ this.elements.codeContent.textContent = question.code;
+
+ // 应用语法高亮
+ if (typeof hljs !== 'undefined') {
+ hljs.highlightElement(this.elements.codeContent);
+ }
+
+ // 确保选项容器已清空
+ this.elements.optionsContainer.innerHTML = '';
+
+ // 生成选项
+ this.generateOptions(question.options);
+
+ this.showQuestion();
+ }
+
+ // 生成选项
+ generateOptions(options) {
+ // 确保清空容器
+ this.elements.optionsContainer.innerHTML = '';
+
+ // 验证选项数据
+ if (!Array.isArray(options) || options.length === 0) {
+ console.error('选项数据无效:', options);
+ return;
+ }
+
+ // 移除可能存在的重复选项
+ const uniqueOptions = [...new Set(options)];
+
+ uniqueOptions.forEach((option, index) => {
+ const optionElement = document.createElement('div');
+ optionElement.className = 'option';
+ optionElement.textContent = option;
+ optionElement.dataset.index = index;
+ optionElement.dataset.value = option.charAt(0); // A, B, C, D
+
+ optionElement.addEventListener('click', () => this.selectOption(optionElement));
+
+ this.elements.optionsContainer.appendChild(optionElement);
+ });
+
+ console.log('生成选项:', uniqueOptions);
+ }
+
+ // 选择选项
+ selectOption(optionElement) {
+ if (this.isAnswered) return;
+
+ // 移除之前的选中状态
+ document.querySelectorAll('.option.selected').forEach(el => {
+ el.classList.remove('selected');
+ });
+
+ // 设置当前选中
+ optionElement.classList.add('selected');
+ this.selectedOption = optionElement.dataset.value;
+
+ // 启用提交按钮
+ this.elements.submitBtn.disabled = false;
+ }
+
+ // 提交答案
+ submitAnswer() {
+ if (!this.selectedOption || this.isAnswered) return;
+
+ this.isAnswered = true;
+ this.elements.submitBtn.disabled = true;
+ this.elements.submitBtn.textContent = '已提交';
+ this.elements.showAnswerBtn.style.display = 'none';
+
+ const isCorrect = this.selectedOption === this.currentQuestion.answer;
+
+ // 显示结果
+ this.showResult(isCorrect);
+
+ // 标记选项
+ this.markOptions();
+ }
+
+ // 显示答案
+ showAnswer() {
+ this.isAnswered = true;
+ this.elements.submitBtn.disabled = true;
+ this.elements.submitBtn.textContent = '已显示答案';
+ this.elements.showAnswerBtn.style.display = 'none';
+
+ // 显示结果(不判断对错)
+ this.showResult(null);
+
+ // 标记正确答案
+ this.markCorrectAnswer();
+ }
+
+ // 显示结果
+ showResult(isCorrect) {
+ const resultContainer = this.elements.resultContainer;
+ const resultStatus = this.elements.resultStatus;
+ const correctAnswer = this.elements.correctAnswer;
+ const explanation = this.elements.explanation;
+
+ // 设置结果状态
+ if (isCorrect === true) {
+ resultStatus.textContent = '✅ 回答正确!';
+ resultStatus.className = 'result-status correct';
+ } else if (isCorrect === false) {
+ resultStatus.textContent = '❌ 回答错误';
+ resultStatus.className = 'result-status incorrect';
+ } else {
+ resultStatus.textContent = '💡 答案解析';
+ resultStatus.className = 'result-status';
+ }
+
+ // 设置正确答案
+ correctAnswer.textContent = `正确答案: ${this.currentQuestion.answer}`;
+
+ // 设置解析内容
+ explanation.innerHTML = this.formatExplanation(this.currentQuestion.explanation);
+
+ // 显示结果容器
+ resultContainer.style.display = 'block';
+
+ // 滚动到结果区域
+ setTimeout(() => {
+ resultContainer.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
+ }, 100);
+ }
+
+ // 标记选项
+ markOptions() {
+ const options = document.querySelectorAll('.option');
+ const correctAnswer = this.currentQuestion.answer;
+
+ options.forEach(option => {
+ const optionValue = option.dataset.value;
+
+ if (optionValue === correctAnswer) {
+ option.classList.add('correct');
+ } else if (option.classList.contains('selected')) {
+ option.classList.add('incorrect');
+ }
+
+ // 禁用点击
+ option.style.pointerEvents = 'none';
+ });
+ }
+
+ // 标记正确答案
+ markCorrectAnswer() {
+ const options = document.querySelectorAll('.option');
+ const correctAnswer = this.currentQuestion.answer;
+
+ options.forEach(option => {
+ const optionValue = option.dataset.value;
+
+ if (optionValue === correctAnswer) {
+ option.classList.add('correct');
+ }
+
+ // 禁用点击
+ option.style.pointerEvents = 'none';
+ });
+ }
+
+ // 格式化解析内容
+ formatExplanation(explanation) {
+ // 转义HTML
+ let formatted = this.escapeHtml(explanation);
+
+ // 处理代码块
+ formatted = formatted.replace(/```js\n([\s\S]*?)\n```/g, '$1
');
+ formatted = formatted.replace(/```javascript\n([\s\S]*?)\n```/g, '$1
');
+ formatted = formatted.replace(/```([\s\S]*?)```/g, '$1
');
+
+ // 处理行内代码
+ formatted = formatted.replace(/`([^`]+)`/g, '$1');
+
+ // 处理换行
+ formatted = formatted.replace(/\n\n/g, '
');
+ formatted = formatted.replace(/\n/g, '
');
+
+ // 包装段落
+ if (!formatted.includes('
')) {
+ formatted = '
' + formatted + '
';
+ }
+
+ return formatted;
+ }
+
+ // HTML转义
+ escapeHtml(text) {
+ const div = document.createElement('div');
+ div.textContent = text;
+ return div.innerHTML;
+ }
+
+ // 导出为Markdown
+ exportToMarkdown() {
+ if (!this.currentQuestion) {
+ alert('请先加载题目后再导出!');
+ return;
+ }
+
+ const question = this.currentQuestion;
+ const timestamp = new Date().toLocaleString('zh-CN');
+
+ // 构建Markdown内容
+ let markdown = `# JavaScript趣味题 #${question.id}\n\n`;
+ markdown += `> 导出时间: ${timestamp}\n\n`;
+
+ // 题目部分
+ markdown += `## 题目\n\n`;
+ markdown += `${question.question}\n\n`;
+
+ // 代码部分
+ markdown += `## 代码\n\n`;
+ markdown += `\`\`\`javascript\n${question.code}\n\`\`\`\n\n`;
+
+ // 选项部分
+ markdown += `## 选项\n\n`;
+ question.options.forEach((option, index) => {
+ const letter = String.fromCharCode(65 + index); // A, B, C, D
+ const isCorrect = letter === question.answer;
+ markdown += `${letter}. ${option}${isCorrect ? ' ✅' : ''}\n`;
+ });
+ markdown += `\n`;
+
+ // 答案部分
+ markdown += `## 正确答案\n\n`;
+ markdown += `**${question.answer}**\n\n`;
+
+ // 解析部分
+ markdown += `## 答案解析\n\n`;
+ // 清理解析内容中的HTML标签,转换为Markdown格式
+ let explanation = question.explanation;
+ explanation = explanation.replace(/
/gi, '\n');
+ explanation = explanation.replace(//gi, '\n');
+ explanation = explanation.replace(/<\/p>/gi, '\n');
+ explanation = explanation.replace(/]*>/gi, '`');
+ explanation = explanation.replace(/<\/code>/gi, '`');
+ explanation = explanation.replace(//gi, '\n```javascript\n');
+ explanation = explanation.replace(/<\/code><\/pre>/gi, '\n```\n');
+ explanation = explanation.replace(/<[^>]*>/g, ''); // 移除其他HTML标签
+ explanation = explanation.replace(/\n\s*\n/g, '\n\n'); // 清理多余空行
+ markdown += explanation.trim() + '\n\n';
+
+ // 添加页脚
+ markdown += `---\n\n`;
+ markdown += `*本题目来源于JavaScript趣味题集合*\n`;
+ markdown += `*导出工具: JavaScript趣味题网页版*\n`;
+
+ // 创建下载
+ this.downloadMarkdown(markdown, `JavaScript趣味题_${question.id}_${new Date().getTime()}.md`);
+ }
+
+ // 下载Markdown文件
+ downloadMarkdown(content, filename) {
+ const blob = new Blob([content], { type: 'text/markdown;charset=utf-8' });
+ const url = URL.createObjectURL(blob);
+
+ const link = document.createElement('a');
+ link.href = url;
+ link.download = filename;
+ link.style.display = 'none';
+
+ document.body.appendChild(link);
+ link.click();
+ document.body.removeChild(link);
+
+ // 清理URL对象
+ setTimeout(() => {
+ URL.revokeObjectURL(url);
+ }, 100);
+
+ // 显示成功提示
+ this.showExportSuccess(filename);
+ }
+
+ // 显示导出成功提示
+ showExportSuccess(filename) {
+ // 创建临时提示元素
+ const toast = document.createElement('div');
+ toast.style.cssText = `
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ background: linear-gradient(135deg, #4caf50, #45a049);
+ color: white;
+ padding: 15px 20px;
+ border-radius: 8px;
+ box-shadow: 0 4px 12px rgba(76, 175, 80, 0.3);
+ z-index: 10000;
+ font-size: 14px;
+ max-width: 300px;
+ word-wrap: break-word;
+ animation: slideInRight 0.3s ease-out;
+ `;
+
+ toast.innerHTML = `
+
+ `;
+
+ // 添加动画样式
+ const style = document.createElement('style');
+ style.textContent = `
+ @keyframes slideInRight {
+ from {
+ transform: translateX(100%);
+ opacity: 0;
+ }
+ to {
+ transform: translateX(0);
+ opacity: 1;
+ }
+ }
+ @keyframes slideOutRight {
+ from {
+ transform: translateX(0);
+ opacity: 1;
+ }
+ to {
+ transform: translateX(100%);
+ opacity: 0;
+ }
+ }
+ `;
+ document.head.appendChild(style);
+
+ document.body.appendChild(toast);
+
+ // 3秒后自动消失
+ setTimeout(() => {
+ toast.style.animation = 'slideOutRight 0.3s ease-in';
+ setTimeout(() => {
+ if (toast.parentNode) {
+ document.body.removeChild(toast);
+ }
+ if (style.parentNode) {
+ document.head.removeChild(style);
+ }
+ }, 300);
+ }, 3000);
+ }
+}
+
+// 页面加载完成后初始化应用
+document.addEventListener('DOMContentLoaded', () => {
+ new JSQuizApp();
+});
+
+// 添加键盘快捷键支持
+document.addEventListener('keydown', (e) => {
+ // 按R键刷新题目
+ if (e.key.toLowerCase() === 'r' && !e.ctrlKey && !e.metaKey) {
+ const refreshBtn = document.getElementById('refreshBtn');
+ if (refreshBtn && !document.querySelector('.loading').style.display !== 'none') {
+ refreshBtn.click();
+ }
+ }
+
+ // 按数字键1-4选择选项
+ if (['1', '2', '3', '4'].includes(e.key)) {
+ const options = document.querySelectorAll('.option');
+ const index = parseInt(e.key) - 1;
+ if (options[index] && !options[index].style.pointerEvents) {
+ options[index].click();
+ }
+ }
+
+ // 按Enter键提交答案
+ if (e.key === 'Enter') {
+ const submitBtn = document.getElementById('submitBtn');
+ if (submitBtn && !submitBtn.disabled) {
+ submitBtn.click();
+ }
+ }
+});
+
+// 添加触摸设备支持
+if ('ontouchstart' in window) {
+ document.addEventListener('touchstart', () => {}, { passive: true });
+}
+
+// 添加网络状态监听
+if ('navigator' in window && 'onLine' in navigator) {
+ window.addEventListener('online', () => {
+ console.log('网络连接已恢复');
+ });
+
+ window.addEventListener('offline', () => {
+ console.log('网络连接已断开');
+ });
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/接口集合.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/接口集合.json
index 547b2771..42245813 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/接口集合.json
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/接口集合.json
@@ -1,3 +1,3 @@
-[
- "https://60s.api.shumengya.top"
-]
+[
+ "https://60s.api.shumengya.top"
+]
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/返回接口.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/返回接口.json
index d6592cc8..0499383a 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机JavaScript趣味题/返回接口.json
@@ -1,17 +1,17 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "id": 11,
- "question": "输出是什么?",
- "code": "function Person(firstName, lastName) {\n this.firstName = firstName;\n this.lastName = lastName;\n}\n\nconst member = new Person(\"Lydia\", \"Hallie\");\nPerson.getFullName = function () {\n return `${this.firstName} ${this.lastName}`;\n}\n\nconsole.log(member.getFullName());",
- "options": [
- "A: `TypeError`",
- "B: `SyntaxError`",
- "C: `Lydia Hallie`",
- "D: `undefined` `undefined`"
- ],
- "answer": "A",
- "explanation": "你不能像常规对象那样,给构造函数添加属性。如果你想一次性给所有实例添加特性,你应该使用原型。因此本例中,使用如下方式:\n\n```js\nPerson.prototype.getFullName = function () {\n return `${this.firstName} ${this.lastName}`;\n}\n```\n\n这才会使 `member.getFullName()` 起作用。为什么这么做有益的?假设我们将这个方法添加到构造函数本身里。也许不是每个 `Person` 实例都需要这个方法。这将浪费大量内存空间,因为它们仍然具有该属性,这将占用每个实例的内存空间。相反,如果我们只将它添加到原型中,那么它只存在于内存中的一个位置,但是所有实例都可以访问它!"
- }
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "id": 11,
+ "question": "输出是什么?",
+ "code": "function Person(firstName, lastName) {\n this.firstName = firstName;\n this.lastName = lastName;\n}\n\nconst member = new Person(\"Lydia\", \"Hallie\");\nPerson.getFullName = function () {\n return `${this.firstName} ${this.lastName}`;\n}\n\nconsole.log(member.getFullName());",
+ "options": [
+ "A: `TypeError`",
+ "B: `SyntaxError`",
+ "C: `Lydia Hallie`",
+ "D: `undefined` `undefined`"
+ ],
+ "answer": "A",
+ "explanation": "你不能像常规对象那样,给构造函数添加属性。如果你想一次性给所有实例添加特性,你应该使用原型。因此本例中,使用如下方式:\n\n```js\nPerson.prototype.getFullName = function () {\n return `${this.firstName} ${this.lastName}`;\n}\n```\n\n这才会使 `member.getFullName()` 起作用。为什么这么做有益的?假设我们将这个方法添加到构造函数本身里。也许不是每个 `Person` 实例都需要这个方法。这将浪费大量内存空间,因为它们仍然具有该属性,这将占用每个实例的内存空间。相反,如果我们只将它添加到原型中,那么它只存在于内存中的一个位置,但是所有实例都可以访问它!"
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/css/background.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/css/background.css
index 84d3b43d..5e15d96d 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/css/background.css
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/css/background.css
@@ -1,81 +1,81 @@
-/* 背景样式文件 */
-body {
- background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 25%, #ffd3a5 50%, #a8e6cf 75%, #88d8a3 100%);
- background-size: 400% 400%;
- animation: gradientShift 15s ease infinite;
- position: relative;
-}
-
-/* 背景动画 */
-@keyframes gradientShift {
- 0% {
- background-position: 0% 50%;
- }
- 50% {
- background-position: 100% 50%;
- }
- 100% {
- background-position: 0% 50%;
- }
-}
-
-/* 背景装饰元素 */
-body::before {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- radial-gradient(circle at 20% 80%, rgba(39, 174, 96, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 80% 20%, rgba(46, 204, 113, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 40% 40%, rgba(26, 188, 156, 0.05) 0%, transparent 50%);
- pointer-events: none;
- z-index: -1;
-}
-
-/* 浮动装饰圆点 */
-body::after {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- radial-gradient(2px 2px at 20px 30px, rgba(39, 174, 96, 0.3), transparent),
- radial-gradient(2px 2px at 40px 70px, rgba(46, 204, 113, 0.2), transparent),
- radial-gradient(1px 1px at 90px 40px, rgba(26, 188, 156, 0.3), transparent),
- radial-gradient(1px 1px at 130px 80px, rgba(39, 174, 96, 0.2), transparent),
- radial-gradient(2px 2px at 160px 30px, rgba(46, 204, 113, 0.3), transparent);
- background-repeat: repeat;
- background-size: 200px 100px;
- animation: floatDots 20s linear infinite;
- pointer-events: none;
- z-index: -1;
-}
-
-@keyframes floatDots {
- 0% {
- transform: translateY(0px);
- }
- 100% {
- transform: translateY(-100px);
- }
-}
-
-/* 响应式背景调整 */
-@media (max-width: 768px) {
- body::after {
- background-size: 150px 75px;
- animation-duration: 25s;
- }
-}
-
-@media (max-width: 480px) {
- body::after {
- background-size: 100px 50px;
- animation-duration: 30s;
- }
+/* 背景样式文件 */
+body {
+ background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 25%, #ffd3a5 50%, #a8e6cf 75%, #88d8a3 100%);
+ background-size: 400% 400%;
+ animation: gradientShift 15s ease infinite;
+ position: relative;
+}
+
+/* 背景动画 */
+@keyframes gradientShift {
+ 0% {
+ background-position: 0% 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+ 100% {
+ background-position: 0% 50%;
+ }
+}
+
+/* 背景装饰元素 */
+body::before {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(circle at 20% 80%, rgba(39, 174, 96, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(46, 204, 113, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 40% 40%, rgba(26, 188, 156, 0.05) 0%, transparent 50%);
+ pointer-events: none;
+ z-index: -1;
+}
+
+/* 浮动装饰圆点 */
+body::after {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(2px 2px at 20px 30px, rgba(39, 174, 96, 0.3), transparent),
+ radial-gradient(2px 2px at 40px 70px, rgba(46, 204, 113, 0.2), transparent),
+ radial-gradient(1px 1px at 90px 40px, rgba(26, 188, 156, 0.3), transparent),
+ radial-gradient(1px 1px at 130px 80px, rgba(39, 174, 96, 0.2), transparent),
+ radial-gradient(2px 2px at 160px 30px, rgba(46, 204, 113, 0.3), transparent);
+ background-repeat: repeat;
+ background-size: 200px 100px;
+ animation: floatDots 20s linear infinite;
+ pointer-events: none;
+ z-index: -1;
+}
+
+@keyframes floatDots {
+ 0% {
+ transform: translateY(0px);
+ }
+ 100% {
+ transform: translateY(-100px);
+ }
+}
+
+/* 响应式背景调整 */
+@media (max-width: 768px) {
+ body::after {
+ background-size: 150px 75px;
+ animation-duration: 25s;
+ }
+}
+
+@media (max-width: 480px) {
+ body::after {
+ background-size: 100px 50px;
+ animation-duration: 30s;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/css/style.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/css/style.css
index b1bef2cc..a190f17c 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/css/style.css
@@ -1,339 +1,339 @@
-/* 基础样式重置 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: 'Microsoft YaHei', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif;
- line-height: 1.6;
- color: #2c3e50;
- min-height: 100vh;
- overflow-x: hidden;
-}
-
-/* 容器布局 */
-.container {
- min-height: 100vh;
- display: flex;
- flex-direction: column;
- max-width: 1200px;
- margin: 0 auto;
- padding: 20px;
-}
-
-/* 头部样式 */
-.header {
- text-align: center;
- margin-bottom: 40px;
- padding: 30px 0;
-}
-
-.title {
- font-size: 2.5rem;
- font-weight: 700;
- color: #27ae60;
- margin-bottom: 10px;
- text-shadow: 0 2px 4px rgba(39, 174, 96, 0.2);
-}
-
-.subtitle {
- font-size: 1.1rem;
- color: #7f8c8d;
- font-weight: 400;
-}
-
-/* 主要内容区域 */
-.main {
- flex: 1;
- display: flex;
- justify-content: center;
- align-items: center;
-}
-
-.content-card {
- background: rgba(255, 255, 255, 0.95);
- border-radius: 20px;
- padding: 40px;
- box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
- backdrop-filter: blur(10px);
- border: 1px solid rgba(39, 174, 96, 0.1);
- width: 100%;
- max-width: 600px;
- transition: transform 0.3s ease, box-shadow 0.3s ease;
-}
-
-.content-card:hover {
- transform: translateY(-5px);
- box-shadow: 0 15px 40px rgba(0, 0, 0, 0.15);
-}
-
-/* KFC文案内容 */
-.kfc-content {
- min-height: 200px;
- padding: 30px;
- background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
- border-radius: 15px;
- border-left: 5px solid #27ae60;
- margin-bottom: 30px;
- position: relative;
- overflow: hidden;
-}
-
-.kfc-content::before {
- content: '"';
- position: absolute;
- top: 10px;
- left: 15px;
- font-size: 3rem;
- color: #27ae60;
- opacity: 0.3;
- font-family: serif;
-}
-
-.kfc-content p {
- font-size: 1.1rem;
- line-height: 1.8;
- color: #2c3e50;
- margin-left: 20px;
- position: relative;
- z-index: 1;
-}
-
-.loading-text {
- text-align: center;
- color: #7f8c8d;
- font-style: italic;
-}
-
-/* 按钮组 */
-.button-group {
- display: flex;
- gap: 15px;
- justify-content: center;
- margin-bottom: 20px;
-}
-
-.generate-btn, .copy-btn {
- padding: 15px 30px;
- border: none;
- border-radius: 50px;
- font-size: 1rem;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.3s ease;
- position: relative;
- overflow: hidden;
-}
-
-.generate-btn {
- background: linear-gradient(135deg, #27ae60 0%, #2ecc71 100%);
- color: white;
- box-shadow: 0 4px 15px rgba(39, 174, 96, 0.3);
-}
-
-.generate-btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 6px 20px rgba(39, 174, 96, 0.4);
-}
-
-.generate-btn:active {
- transform: translateY(0);
-}
-
-.generate-btn:disabled {
- opacity: 0.7;
- cursor: not-allowed;
- transform: none;
-}
-
-.copy-btn {
- background: linear-gradient(135deg, #3498db 0%, #5dade2 100%);
- color: white;
- box-shadow: 0 4px 15px rgba(52, 152, 219, 0.3);
-}
-
-.copy-btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 6px 20px rgba(52, 152, 219, 0.4);
-}
-
-/* 编号信息 */
-.index-info {
- text-align: center;
- padding: 10px;
- background: rgba(39, 174, 96, 0.1);
- border-radius: 10px;
- border: 1px solid rgba(39, 174, 96, 0.2);
-}
-
-.index-text {
- color: #27ae60;
- font-weight: 600;
- font-size: 0.9rem;
-}
-
-#indexNumber {
- color: #2c3e50;
- font-weight: 700;
-}
-
-/* 底部 */
-.footer {
- text-align: center;
- padding: 20px 0;
- color: #7f8c8d;
- font-size: 0.9rem;
- margin-top: 40px;
-}
-
-/* 提示框 */
-.toast {
- position: fixed;
- top: 20px;
- right: 20px;
- background: #27ae60;
- color: white;
- padding: 15px 25px;
- border-radius: 10px;
- box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
- transform: translateX(400px);
- transition: transform 0.3s ease;
- z-index: 1000;
- font-weight: 600;
-}
-
-.toast.show {
- transform: translateX(0);
-}
-
-/* 平板端适配 (768px - 1024px) */
-@media (max-width: 1024px) and (min-width: 768px) {
- .container {
- padding: 15px;
- }
-
- .title {
- font-size: 2.2rem;
- }
-
- .content-card {
- padding: 35px;
- max-width: 550px;
- }
-
- .kfc-content {
- padding: 25px;
- min-height: 180px;
- }
-
- .button-group {
- flex-direction: row;
- gap: 12px;
- }
-
- .generate-btn, .copy-btn {
- padding: 12px 25px;
- font-size: 0.95rem;
- }
-}
-
-/* 手机端适配 (最大768px) */
-@media (max-width: 768px) {
- .container {
- padding: 10px;
- }
-
- .header {
- margin-bottom: 30px;
- padding: 20px 0;
- }
-
- .title {
- font-size: 1.8rem;
- margin-bottom: 8px;
- }
-
- .subtitle {
- font-size: 1rem;
- }
-
- .content-card {
- padding: 25px;
- margin: 0 5px;
- border-radius: 15px;
- }
-
- .kfc-content {
- padding: 20px;
- min-height: 150px;
- margin-bottom: 25px;
- }
-
- .kfc-content::before {
- font-size: 2.5rem;
- top: 5px;
- left: 10px;
- }
-
- .kfc-content p {
- font-size: 1rem;
- line-height: 1.7;
- margin-left: 15px;
- }
-
- .button-group {
- flex-direction: column;
- gap: 10px;
- }
-
- .generate-btn, .copy-btn {
- padding: 12px 20px;
- font-size: 0.9rem;
- width: 100%;
- }
-
- .footer {
- font-size: 0.8rem;
- margin-top: 30px;
- }
-
- .toast {
- right: 10px;
- left: 10px;
- transform: translateY(-100px);
- font-size: 0.9rem;
- }
-
- .toast.show {
- transform: translateY(0);
- }
-}
-
-/* 小屏手机适配 (最大480px) */
-@media (max-width: 480px) {
- .title {
- font-size: 1.6rem;
- }
-
- .content-card {
- padding: 20px;
- margin: 0;
- }
-
- .kfc-content {
- padding: 15px;
- min-height: 120px;
- }
-
- .kfc-content p {
- font-size: 0.95rem;
- margin-left: 10px;
- }
-
- .generate-btn, .copy-btn {
- padding: 10px 15px;
- font-size: 0.85rem;
- }
+/* 基础样式重置 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Microsoft YaHei', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif;
+ line-height: 1.6;
+ color: #2c3e50;
+ min-height: 100vh;
+ overflow-x: hidden;
+}
+
+/* 容器布局 */
+.container {
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+}
+
+/* 头部样式 */
+.header {
+ text-align: center;
+ margin-bottom: 40px;
+ padding: 30px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+ font-weight: 700;
+ color: #27ae60;
+ margin-bottom: 10px;
+ text-shadow: 0 2px 4px rgba(39, 174, 96, 0.2);
+}
+
+.subtitle {
+ font-size: 1.1rem;
+ color: #7f8c8d;
+ font-weight: 400;
+}
+
+/* 主要内容区域 */
+.main {
+ flex: 1;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.content-card {
+ background: rgba(255, 255, 255, 0.95);
+ border-radius: 20px;
+ padding: 40px;
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
+ backdrop-filter: blur(10px);
+ border: 1px solid rgba(39, 174, 96, 0.1);
+ width: 100%;
+ max-width: 600px;
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
+}
+
+.content-card:hover {
+ transform: translateY(-5px);
+ box-shadow: 0 15px 40px rgba(0, 0, 0, 0.15);
+}
+
+/* KFC文案内容 */
+.kfc-content {
+ min-height: 200px;
+ padding: 30px;
+ background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
+ border-radius: 15px;
+ border-left: 5px solid #27ae60;
+ margin-bottom: 30px;
+ position: relative;
+ overflow: hidden;
+}
+
+.kfc-content::before {
+ content: '"';
+ position: absolute;
+ top: 10px;
+ left: 15px;
+ font-size: 3rem;
+ color: #27ae60;
+ opacity: 0.3;
+ font-family: serif;
+}
+
+.kfc-content p {
+ font-size: 1.1rem;
+ line-height: 1.8;
+ color: #2c3e50;
+ margin-left: 20px;
+ position: relative;
+ z-index: 1;
+}
+
+.loading-text {
+ text-align: center;
+ color: #7f8c8d;
+ font-style: italic;
+}
+
+/* 按钮组 */
+.button-group {
+ display: flex;
+ gap: 15px;
+ justify-content: center;
+ margin-bottom: 20px;
+}
+
+.generate-btn, .copy-btn {
+ padding: 15px 30px;
+ border: none;
+ border-radius: 50px;
+ font-size: 1rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ position: relative;
+ overflow: hidden;
+}
+
+.generate-btn {
+ background: linear-gradient(135deg, #27ae60 0%, #2ecc71 100%);
+ color: white;
+ box-shadow: 0 4px 15px rgba(39, 174, 96, 0.3);
+}
+
+.generate-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 6px 20px rgba(39, 174, 96, 0.4);
+}
+
+.generate-btn:active {
+ transform: translateY(0);
+}
+
+.generate-btn:disabled {
+ opacity: 0.7;
+ cursor: not-allowed;
+ transform: none;
+}
+
+.copy-btn {
+ background: linear-gradient(135deg, #3498db 0%, #5dade2 100%);
+ color: white;
+ box-shadow: 0 4px 15px rgba(52, 152, 219, 0.3);
+}
+
+.copy-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 6px 20px rgba(52, 152, 219, 0.4);
+}
+
+/* 编号信息 */
+.index-info {
+ text-align: center;
+ padding: 10px;
+ background: rgba(39, 174, 96, 0.1);
+ border-radius: 10px;
+ border: 1px solid rgba(39, 174, 96, 0.2);
+}
+
+.index-text {
+ color: #27ae60;
+ font-weight: 600;
+ font-size: 0.9rem;
+}
+
+#indexNumber {
+ color: #2c3e50;
+ font-weight: 700;
+}
+
+/* 底部 */
+.footer {
+ text-align: center;
+ padding: 20px 0;
+ color: #7f8c8d;
+ font-size: 0.9rem;
+ margin-top: 40px;
+}
+
+/* 提示框 */
+.toast {
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ background: #27ae60;
+ color: white;
+ padding: 15px 25px;
+ border-radius: 10px;
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
+ transform: translateX(400px);
+ transition: transform 0.3s ease;
+ z-index: 1000;
+ font-weight: 600;
+}
+
+.toast.show {
+ transform: translateX(0);
+}
+
+/* 平板端适配 (768px - 1024px) */
+@media (max-width: 1024px) and (min-width: 768px) {
+ .container {
+ padding: 15px;
+ }
+
+ .title {
+ font-size: 2.2rem;
+ }
+
+ .content-card {
+ padding: 35px;
+ max-width: 550px;
+ }
+
+ .kfc-content {
+ padding: 25px;
+ min-height: 180px;
+ }
+
+ .button-group {
+ flex-direction: row;
+ gap: 12px;
+ }
+
+ .generate-btn, .copy-btn {
+ padding: 12px 25px;
+ font-size: 0.95rem;
+ }
+}
+
+/* 手机端适配 (最大768px) */
+@media (max-width: 768px) {
+ .container {
+ padding: 10px;
+ }
+
+ .header {
+ margin-bottom: 30px;
+ padding: 20px 0;
+ }
+
+ .title {
+ font-size: 1.8rem;
+ margin-bottom: 8px;
+ }
+
+ .subtitle {
+ font-size: 1rem;
+ }
+
+ .content-card {
+ padding: 25px;
+ margin: 0 5px;
+ border-radius: 15px;
+ }
+
+ .kfc-content {
+ padding: 20px;
+ min-height: 150px;
+ margin-bottom: 25px;
+ }
+
+ .kfc-content::before {
+ font-size: 2.5rem;
+ top: 5px;
+ left: 10px;
+ }
+
+ .kfc-content p {
+ font-size: 1rem;
+ line-height: 1.7;
+ margin-left: 15px;
+ }
+
+ .button-group {
+ flex-direction: column;
+ gap: 10px;
+ }
+
+ .generate-btn, .copy-btn {
+ padding: 12px 20px;
+ font-size: 0.9rem;
+ width: 100%;
+ }
+
+ .footer {
+ font-size: 0.8rem;
+ margin-top: 30px;
+ }
+
+ .toast {
+ right: 10px;
+ left: 10px;
+ transform: translateY(-100px);
+ font-size: 0.9rem;
+ }
+
+ .toast.show {
+ transform: translateY(0);
+ }
+}
+
+/* 小屏手机适配 (最大480px) */
+@media (max-width: 480px) {
+ .title {
+ font-size: 1.6rem;
+ }
+
+ .content-card {
+ padding: 20px;
+ margin: 0;
+ }
+
+ .kfc-content {
+ padding: 15px;
+ min-height: 120px;
+ }
+
+ .kfc-content p {
+ font-size: 0.95rem;
+ margin-left: 10px;
+ }
+
+ .generate-btn, .copy-btn {
+ padding: 10px 15px;
+ font-size: 0.85rem;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/index.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/index.html
index 72ab0627..49ec4123 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/index.html
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/index.html
@@ -1,46 +1,46 @@
-
-
-
-
-
- 随机KFC文案生成器
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 文案编号:
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ 随机KFC文案生成器
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 文案编号:
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/js/main.js b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/js/main.js
index 353209f9..d5188864 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/js/main.js
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/js/main.js
@@ -1,240 +1,240 @@
-// KFC文案生成器主要功能
-class KFCGenerator {
- constructor() {
- this.apiEndpoints = [];
- this.currentApiIndex = 0;
- this.isLoading = false;
-
- this.init();
- }
-
- // 初始化
- async init() {
- await this.loadApiEndpoints();
- this.bindEvents();
- }
-
- // 加载API接口列表
- async loadApiEndpoints() {
- try {
- // 直接硬编码API端点,避免CORS问题
- this.apiEndpoints = ["https://60s.api.shumengya.top"];
- } catch (error) {
- console.error('加载API接口列表失败:', error);
- this.showToast('加载接口配置失败', 'error');
- }
- }
-
- // 绑定事件
- bindEvents() {
- const generateBtn = document.getElementById('generateBtn');
- const copyBtn = document.getElementById('copyBtn');
-
- generateBtn.addEventListener('click', () => this.generateKFC());
- copyBtn.addEventListener('click', () => this.copyContent());
- }
-
- // 生成KFC文案
- async generateKFC() {
- if (this.isLoading) return;
-
- this.setLoadingState(true);
-
- let success = false;
- let attempts = 0;
- const maxAttempts = this.apiEndpoints.length;
-
- while (!success && attempts < maxAttempts) {
- try {
- const apiUrl = this.apiEndpoints[this.currentApiIndex];
- const data = await this.fetchKFCData(apiUrl);
-
- if (data && data.code === 200 && data.data && data.data.kfc) {
- this.displayKFC(data.data);
- success = true;
- } else {
- throw new Error('API返回数据格式错误');
- }
- } catch (error) {
- console.error(`API ${this.currentApiIndex + 1} 请求失败:`, error);
- this.currentApiIndex = (this.currentApiIndex + 1) % this.apiEndpoints.length;
- attempts++;
- }
- }
-
- if (!success) {
- this.showError('所有API接口都无法访问,请稍后重试');
- }
-
- this.setLoadingState(false);
- }
-
- // 请求KFC数据
- async fetchKFCData(apiUrl) {
- const controller = new AbortController();
- const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时
-
- try {
- const response = await fetch(`${apiUrl}/v2/kfc`, {
- method: 'GET',
- headers: {
- 'Accept': 'application/json',
- 'Content-Type': 'application/json'
- },
- signal: controller.signal
- });
-
- clearTimeout(timeoutId);
-
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
- }
-
- return await response.json();
- } catch (error) {
- clearTimeout(timeoutId);
- throw error;
- }
- }
-
- // 显示KFC文案
- displayKFC(data) {
- const contentElement = document.getElementById('kfcContent');
- const indexElement = document.getElementById('indexNumber');
- const indexInfo = document.getElementById('indexInfo');
- const copyBtn = document.getElementById('copyBtn');
-
- // 显示文案内容
- contentElement.innerHTML = `${this.escapeHtml(data.kfc)}
`;
-
- // 显示编号信息
- if (data.index) {
- indexElement.textContent = data.index;
- indexInfo.style.display = 'block';
- } else {
- indexInfo.style.display = 'none';
- }
-
- // 显示复制按钮
- copyBtn.style.display = 'inline-block';
-
- // 添加显示动画
- contentElement.style.opacity = '0';
- contentElement.style.transform = 'translateY(20px)';
-
- setTimeout(() => {
- contentElement.style.transition = 'all 0.5s ease';
- contentElement.style.opacity = '1';
- contentElement.style.transform = 'translateY(0)';
- }, 100);
- }
-
- // 显示错误信息
- showError(message) {
- const contentElement = document.getElementById('kfcContent');
- contentElement.innerHTML = `${this.escapeHtml(message)}
`;
-
- const copyBtn = document.getElementById('copyBtn');
- const indexInfo = document.getElementById('indexInfo');
- copyBtn.style.display = 'none';
- indexInfo.style.display = 'none';
- }
-
- // 复制文案内容
- async copyContent() {
- const contentElement = document.getElementById('kfcContent');
- const textContent = contentElement.querySelector('p')?.textContent;
-
- if (!textContent || textContent.includes('点击按钮获取') || textContent.includes('失败')) {
- this.showToast('没有可复制的内容', 'error');
- return;
- }
-
- try {
- if (navigator.clipboard && window.isSecureContext) {
- await navigator.clipboard.writeText(textContent);
- } else {
- // 降级方案
- const textArea = document.createElement('textarea');
- textArea.value = textContent;
- textArea.style.position = 'fixed';
- textArea.style.left = '-999999px';
- textArea.style.top = '-999999px';
- document.body.appendChild(textArea);
- textArea.focus();
- textArea.select();
- document.execCommand('copy');
- textArea.remove();
- }
-
- this.showToast('文案已复制到剪贴板', 'success');
- } catch (error) {
- console.error('复制失败:', error);
- this.showToast('复制失败,请手动选择复制', 'error');
- }
- }
-
- // 设置加载状态
- setLoadingState(loading) {
- this.isLoading = loading;
- const generateBtn = document.getElementById('generateBtn');
- const btnText = generateBtn.querySelector('.btn-text');
- const btnLoading = generateBtn.querySelector('.btn-loading');
-
- if (loading) {
- generateBtn.disabled = true;
- btnText.style.display = 'none';
- btnLoading.style.display = 'inline';
- } else {
- generateBtn.disabled = false;
- btnText.style.display = 'inline';
- btnLoading.style.display = 'none';
- }
- }
-
- // 显示提示消息
- showToast(message, type = 'success') {
- const toast = document.getElementById('toast');
- toast.textContent = message;
- toast.className = `toast ${type}`;
- toast.classList.add('show');
-
- setTimeout(() => {
- toast.classList.remove('show');
- }, 3000);
- }
-
- // HTML转义
- escapeHtml(text) {
- const div = document.createElement('div');
- div.textContent = text;
- return div.innerHTML;
- }
-}
-
-// 页面加载完成后初始化
-document.addEventListener('DOMContentLoaded', () => {
- const generator = new KFCGenerator();
- // 页面加载完成后自动生成一条文案
- setTimeout(() => {
- generator.generateKFC();
- }, 1000);
-});
-
-// 添加键盘快捷键支持
-document.addEventListener('keydown', (event) => {
- // 按空格键生成文案
- if (event.code === 'Space' && event.target.tagName !== 'INPUT' && event.target.tagName !== 'TEXTAREA') {
- event.preventDefault();
- document.getElementById('generateBtn').click();
- }
-
- // Ctrl+C 复制文案
- if (event.ctrlKey && event.key === 'c' && event.target.tagName !== 'INPUT' && event.target.tagName !== 'TEXTAREA') {
- const copyBtn = document.getElementById('copyBtn');
- if (copyBtn.style.display !== 'none') {
- event.preventDefault();
- copyBtn.click();
- }
- }
+// KFC文案生成器主要功能
+class KFCGenerator {
+ constructor() {
+ this.apiEndpoints = [];
+ this.currentApiIndex = 0;
+ this.isLoading = false;
+
+ this.init();
+ }
+
+ // 初始化
+ async init() {
+ await this.loadApiEndpoints();
+ this.bindEvents();
+ }
+
+ // 加载API接口列表
+ async loadApiEndpoints() {
+ try {
+ // 直接硬编码API端点,避免CORS问题
+ this.apiEndpoints = ["https://60s.api.shumengya.top"];
+ } catch (error) {
+ console.error('加载API接口列表失败:', error);
+ this.showToast('加载接口配置失败', 'error');
+ }
+ }
+
+ // 绑定事件
+ bindEvents() {
+ const generateBtn = document.getElementById('generateBtn');
+ const copyBtn = document.getElementById('copyBtn');
+
+ generateBtn.addEventListener('click', () => this.generateKFC());
+ copyBtn.addEventListener('click', () => this.copyContent());
+ }
+
+ // 生成KFC文案
+ async generateKFC() {
+ if (this.isLoading) return;
+
+ this.setLoadingState(true);
+
+ let success = false;
+ let attempts = 0;
+ const maxAttempts = this.apiEndpoints.length;
+
+ while (!success && attempts < maxAttempts) {
+ try {
+ const apiUrl = this.apiEndpoints[this.currentApiIndex];
+ const data = await this.fetchKFCData(apiUrl);
+
+ if (data && data.code === 200 && data.data && data.data.kfc) {
+ this.displayKFC(data.data);
+ success = true;
+ } else {
+ throw new Error('API返回数据格式错误');
+ }
+ } catch (error) {
+ console.error(`API ${this.currentApiIndex + 1} 请求失败:`, error);
+ this.currentApiIndex = (this.currentApiIndex + 1) % this.apiEndpoints.length;
+ attempts++;
+ }
+ }
+
+ if (!success) {
+ this.showError('所有API接口都无法访问,请稍后重试');
+ }
+
+ this.setLoadingState(false);
+ }
+
+ // 请求KFC数据
+ async fetchKFCData(apiUrl) {
+ const controller = new AbortController();
+ const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时
+
+ try {
+ const response = await fetch(`${apiUrl}/v2/kfc`, {
+ method: 'GET',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json'
+ },
+ signal: controller.signal
+ });
+
+ clearTimeout(timeoutId);
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+ }
+
+ return await response.json();
+ } catch (error) {
+ clearTimeout(timeoutId);
+ throw error;
+ }
+ }
+
+ // 显示KFC文案
+ displayKFC(data) {
+ const contentElement = document.getElementById('kfcContent');
+ const indexElement = document.getElementById('indexNumber');
+ const indexInfo = document.getElementById('indexInfo');
+ const copyBtn = document.getElementById('copyBtn');
+
+ // 显示文案内容
+ contentElement.innerHTML = `${this.escapeHtml(data.kfc)}
`;
+
+ // 显示编号信息
+ if (data.index) {
+ indexElement.textContent = data.index;
+ indexInfo.style.display = 'block';
+ } else {
+ indexInfo.style.display = 'none';
+ }
+
+ // 显示复制按钮
+ copyBtn.style.display = 'inline-block';
+
+ // 添加显示动画
+ contentElement.style.opacity = '0';
+ contentElement.style.transform = 'translateY(20px)';
+
+ setTimeout(() => {
+ contentElement.style.transition = 'all 0.5s ease';
+ contentElement.style.opacity = '1';
+ contentElement.style.transform = 'translateY(0)';
+ }, 100);
+ }
+
+ // 显示错误信息
+ showError(message) {
+ const contentElement = document.getElementById('kfcContent');
+ contentElement.innerHTML = `${this.escapeHtml(message)}
`;
+
+ const copyBtn = document.getElementById('copyBtn');
+ const indexInfo = document.getElementById('indexInfo');
+ copyBtn.style.display = 'none';
+ indexInfo.style.display = 'none';
+ }
+
+ // 复制文案内容
+ async copyContent() {
+ const contentElement = document.getElementById('kfcContent');
+ const textContent = contentElement.querySelector('p')?.textContent;
+
+ if (!textContent || textContent.includes('点击按钮获取') || textContent.includes('失败')) {
+ this.showToast('没有可复制的内容', 'error');
+ return;
+ }
+
+ try {
+ if (navigator.clipboard && window.isSecureContext) {
+ await navigator.clipboard.writeText(textContent);
+ } else {
+ // 降级方案
+ const textArea = document.createElement('textarea');
+ textArea.value = textContent;
+ textArea.style.position = 'fixed';
+ textArea.style.left = '-999999px';
+ textArea.style.top = '-999999px';
+ document.body.appendChild(textArea);
+ textArea.focus();
+ textArea.select();
+ document.execCommand('copy');
+ textArea.remove();
+ }
+
+ this.showToast('文案已复制到剪贴板', 'success');
+ } catch (error) {
+ console.error('复制失败:', error);
+ this.showToast('复制失败,请手动选择复制', 'error');
+ }
+ }
+
+ // 设置加载状态
+ setLoadingState(loading) {
+ this.isLoading = loading;
+ const generateBtn = document.getElementById('generateBtn');
+ const btnText = generateBtn.querySelector('.btn-text');
+ const btnLoading = generateBtn.querySelector('.btn-loading');
+
+ if (loading) {
+ generateBtn.disabled = true;
+ btnText.style.display = 'none';
+ btnLoading.style.display = 'inline';
+ } else {
+ generateBtn.disabled = false;
+ btnText.style.display = 'inline';
+ btnLoading.style.display = 'none';
+ }
+ }
+
+ // 显示提示消息
+ showToast(message, type = 'success') {
+ const toast = document.getElementById('toast');
+ toast.textContent = message;
+ toast.className = `toast ${type}`;
+ toast.classList.add('show');
+
+ setTimeout(() => {
+ toast.classList.remove('show');
+ }, 3000);
+ }
+
+ // HTML转义
+ escapeHtml(text) {
+ const div = document.createElement('div');
+ div.textContent = text;
+ return div.innerHTML;
+ }
+}
+
+// 页面加载完成后初始化
+document.addEventListener('DOMContentLoaded', () => {
+ const generator = new KFCGenerator();
+ // 页面加载完成后自动生成一条文案
+ setTimeout(() => {
+ generator.generateKFC();
+ }, 1000);
+});
+
+// 添加键盘快捷键支持
+document.addEventListener('keydown', (event) => {
+ // 按空格键生成文案
+ if (event.code === 'Space' && event.target.tagName !== 'INPUT' && event.target.tagName !== 'TEXTAREA') {
+ event.preventDefault();
+ document.getElementById('generateBtn').click();
+ }
+
+ // Ctrl+C 复制文案
+ if (event.ctrlKey && event.key === 'c' && event.target.tagName !== 'INPUT' && event.target.tagName !== 'TEXTAREA') {
+ const copyBtn = document.getElementById('copyBtn');
+ if (copyBtn.style.display !== 'none') {
+ event.preventDefault();
+ copyBtn.click();
+ }
+ }
});
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/接口集合.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/接口集合.json
index 547b2771..42245813 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/接口集合.json
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/接口集合.json
@@ -1,3 +1,3 @@
-[
- "https://60s.api.shumengya.top"
-]
+[
+ "https://60s.api.shumengya.top"
+]
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/返回接口.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/返回接口.json
index 1e04caca..23ea61f5 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机KFC文案/返回接口.json
@@ -1,8 +1,8 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "index": 78,
- "kfc": "我叫夯大力 立冬给我准备了糖炒栗子了没有 没准备的自动绝交 再 v 我 50 吃疯狂星期四 然后再给我点杯奶茶 再给我两万块钱 懂吗你们"
- }
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "index": 78,
+ "kfc": "我叫夯大力 立冬给我准备了糖炒栗子了没有 没准备的自动绝交 再 v 我 50 吃疯狂星期四 然后再给我点杯奶茶 再给我两万块钱 懂吗你们"
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/css/background.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/css/background.css
index 7bdb6f75..7ef065d5 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/css/background.css
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/css/background.css
@@ -1,167 +1,167 @@
-/* 背景样式文件 - 金色光辉主题 */
-
-/* 主背景 */
-body {
- background: linear-gradient(
- 135deg,
- #f1f8e9 0%,
- #dcedc8 25%,
- #c8e6c8 50%,
- #a5d6a7 75%,
- #81c784 100%
- );
- background-size: 400% 400%;
- animation: gradientShift 15s ease infinite;
- position: relative;
-}
-
-/* 背景装饰层 */
-body::before {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background:
- radial-gradient(circle at 20% 80%, rgba(129, 199, 132, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 80% 20%, rgba(165, 214, 167, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 40% 40%, rgba(102, 187, 106, 0.05) 0%, transparent 50%);
- pointer-events: none;
- z-index: 1;
-}
-
-/* 动态光点效果 */
-body::after {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- radial-gradient(2px 2px at 20px 30px, rgba(129, 199, 132, 0.3), transparent),
- radial-gradient(2px 2px at 40px 70px, rgba(165, 214, 167, 0.2), transparent),
- radial-gradient(1px 1px at 90px 40px, rgba(102, 187, 106, 0.4), transparent),
- radial-gradient(1px 1px at 130px 80px, rgba(129, 199, 132, 0.2), transparent),
- radial-gradient(2px 2px at 160px 30px, rgba(165, 214, 167, 0.3), transparent);
- background-repeat: repeat;
- background-size: 200px 100px;
- animation: sparkle 20s linear infinite;
- pointer-events: none;
- z-index: 2;
-}
-
-/* 背景动画 */
-@keyframes gradientShift {
- 0% {
- background-position: 0% 50%;
- }
- 50% {
- background-position: 100% 50%;
- }
- 100% {
- background-position: 0% 50%;
- }
-}
-
-@keyframes sparkle {
- 0% {
- transform: translateY(0);
- opacity: 1;
- }
- 100% {
- transform: translateY(-100vh);
- opacity: 0;
- }
-}
-
-/* 响应式背景调整 */
-
-/* 平板端背景 */
-@media (min-width: 768px) and (max-width: 1024px) {
- body::after {
- background-size: 250px 120px;
- }
-}
-
-/* 电脑端背景 */
-@media (min-width: 1024px) {
- body {
- background-size: 300% 300%;
- }
-
- body::after {
- background-size: 300px 150px;
- animation-duration: 25s;
- }
-}
-
-/* 手机端背景优化 */
-@media (max-width: 767px) {
- body {
- background-size: 200% 200%;
- animation-duration: 10s;
- }
-
- body::before {
- background:
- radial-gradient(circle at 30% 70%, rgba(129, 199, 132, 0.08) 0%, transparent 40%),
- radial-gradient(circle at 70% 30%, rgba(165, 214, 167, 0.08) 0%, transparent 40%);
- }
-
- body::after {
- background-size: 150px 80px;
- animation-duration: 15s;
- }
-}
-
-/* 超小屏幕背景 */
-@media (max-width: 479px) {
- body {
- background: linear-gradient(
- 135deg,
- #f1f8e9 0%,
- #dcedc8 50%,
- #c8e6c8 100%
- );
- background-size: 150% 150%;
- }
-
- body::after {
- background-size: 120px 60px;
- }
-}
-
-/* 深色模式支持 */
-@media (prefers-color-scheme: dark) {
- body {
- background: linear-gradient(
- 135deg,
- #1b2e1b 0%,
- #2e4a2e 25%,
- #3e5e3e 50%,
- #4e6e4e 75%,
- #5e7e5e 100%
- );
- }
-
- body::before {
- background:
- radial-gradient(circle at 20% 80%, rgba(129, 199, 132, 0.05) 0%, transparent 50%),
- radial-gradient(circle at 80% 20%, rgba(165, 214, 167, 0.05) 0%, transparent 50%);
- }
-}
-
-/* 减少动画效果(用户偏好) */
-@media (prefers-reduced-motion: reduce) {
- body,
- body::before,
- body::after {
- animation: none;
- }
-
- body {
- background: linear-gradient(135deg, #f1f8e9 0%, #dcedc8 50%, #c8e6c8 100%);
- }
+/* 背景样式文件 - 金色光辉主题 */
+
+/* 主背景 */
+body {
+ background: linear-gradient(
+ 135deg,
+ #f1f8e9 0%,
+ #dcedc8 25%,
+ #c8e6c8 50%,
+ #a5d6a7 75%,
+ #81c784 100%
+ );
+ background-size: 400% 400%;
+ animation: gradientShift 15s ease infinite;
+ position: relative;
+}
+
+/* 背景装饰层 */
+body::before {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background:
+ radial-gradient(circle at 20% 80%, rgba(129, 199, 132, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(165, 214, 167, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 40% 40%, rgba(102, 187, 106, 0.05) 0%, transparent 50%);
+ pointer-events: none;
+ z-index: 1;
+}
+
+/* 动态光点效果 */
+body::after {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(2px 2px at 20px 30px, rgba(129, 199, 132, 0.3), transparent),
+ radial-gradient(2px 2px at 40px 70px, rgba(165, 214, 167, 0.2), transparent),
+ radial-gradient(1px 1px at 90px 40px, rgba(102, 187, 106, 0.4), transparent),
+ radial-gradient(1px 1px at 130px 80px, rgba(129, 199, 132, 0.2), transparent),
+ radial-gradient(2px 2px at 160px 30px, rgba(165, 214, 167, 0.3), transparent);
+ background-repeat: repeat;
+ background-size: 200px 100px;
+ animation: sparkle 20s linear infinite;
+ pointer-events: none;
+ z-index: 2;
+}
+
+/* 背景动画 */
+@keyframes gradientShift {
+ 0% {
+ background-position: 0% 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+ 100% {
+ background-position: 0% 50%;
+ }
+}
+
+@keyframes sparkle {
+ 0% {
+ transform: translateY(0);
+ opacity: 1;
+ }
+ 100% {
+ transform: translateY(-100vh);
+ opacity: 0;
+ }
+}
+
+/* 响应式背景调整 */
+
+/* 平板端背景 */
+@media (min-width: 768px) and (max-width: 1024px) {
+ body::after {
+ background-size: 250px 120px;
+ }
+}
+
+/* 电脑端背景 */
+@media (min-width: 1024px) {
+ body {
+ background-size: 300% 300%;
+ }
+
+ body::after {
+ background-size: 300px 150px;
+ animation-duration: 25s;
+ }
+}
+
+/* 手机端背景优化 */
+@media (max-width: 767px) {
+ body {
+ background-size: 200% 200%;
+ animation-duration: 10s;
+ }
+
+ body::before {
+ background:
+ radial-gradient(circle at 30% 70%, rgba(129, 199, 132, 0.08) 0%, transparent 40%),
+ radial-gradient(circle at 70% 30%, rgba(165, 214, 167, 0.08) 0%, transparent 40%);
+ }
+
+ body::after {
+ background-size: 150px 80px;
+ animation-duration: 15s;
+ }
+}
+
+/* 超小屏幕背景 */
+@media (max-width: 479px) {
+ body {
+ background: linear-gradient(
+ 135deg,
+ #f1f8e9 0%,
+ #dcedc8 50%,
+ #c8e6c8 100%
+ );
+ background-size: 150% 150%;
+ }
+
+ body::after {
+ background-size: 120px 60px;
+ }
+}
+
+/* 深色模式支持 */
+@media (prefers-color-scheme: dark) {
+ body {
+ background: linear-gradient(
+ 135deg,
+ #1b2e1b 0%,
+ #2e4a2e 25%,
+ #3e5e3e 50%,
+ #4e6e4e 75%,
+ #5e7e5e 100%
+ );
+ }
+
+ body::before {
+ background:
+ radial-gradient(circle at 20% 80%, rgba(129, 199, 132, 0.05) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(165, 214, 167, 0.05) 0%, transparent 50%);
+ }
+}
+
+/* 减少动画效果(用户偏好) */
+@media (prefers-reduced-motion: reduce) {
+ body,
+ body::before,
+ body::after {
+ animation: none;
+ }
+
+ body {
+ background: linear-gradient(135deg, #f1f8e9 0%, #dcedc8 50%, #c8e6c8 100%);
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/css/style.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/css/style.css
index 618808d2..d48fa7b8 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/css/style.css
@@ -1,357 +1,357 @@
-/* 基础样式重置 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: 'Microsoft YaHei', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif;
- line-height: 1.6;
- color: #2e7d32;
- overflow-x: hidden;
-}
-
-/* 容器布局 */
-.container {
- min-height: 100vh;
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
- padding: 20px;
- position: relative;
-}
-
-/* 头部样式 */
-.header {
- text-align: center;
- margin-bottom: 40px;
- z-index: 10;
-}
-
-.title {
- font-size: 3rem;
- font-weight: 700;
- color: #2e7d32;
- text-shadow:
- 0 0 10px rgba(129, 199, 132, 0.8),
- 0 0 20px rgba(129, 199, 132, 0.6),
- 0 0 30px rgba(129, 199, 132, 0.4);
- margin-bottom: 10px;
- animation: titleGlow 3s ease-in-out infinite alternate;
-}
-
-.subtitle {
- font-size: 1.2rem;
- color: #388e3c;
- opacity: 0.9;
- text-shadow: 0 0 5px rgba(102, 187, 106, 0.5);
-}
-
-/* 主内容区域 */
-.main-content {
- width: 100%;
- max-width: 800px;
- z-index: 10;
-}
-
-/* 一言容器 */
-.quote-container {
- background: linear-gradient(135deg, rgba(129, 199, 132, 0.1), rgba(165, 214, 167, 0.05));
- border: 2px solid rgba(102, 187, 106, 0.3);
- border-radius: 20px;
- padding: 40px;
- margin-bottom: 30px;
- backdrop-filter: blur(10px);
- box-shadow:
- 0 8px 32px rgba(102, 187, 106, 0.2),
- inset 0 1px 0 rgba(255, 255, 255, 0.1);
- position: relative;
- overflow: hidden;
-}
-
-.quote-container::before {
- content: '';
- position: absolute;
- top: -2px;
- left: -2px;
- right: -2px;
- bottom: -2px;
- background: linear-gradient(45deg, #81c784, #a5d6a7, #81c784, #a5d6a7);
- border-radius: 22px;
- z-index: -1;
- animation: borderGlow 4s linear infinite;
-}
-
-/* 加载状态 */
-.loading {
- display: none;
- text-align: center;
- color: #2e7d32;
-}
-
-.loading.show {
- display: block;
-}
-
-.loading-spinner {
- width: 40px;
- height: 40px;
- border: 4px solid rgba(102, 187, 106, 0.3);
- border-top: 4px solid #2e7d32;
- border-radius: 50%;
- margin: 0 auto 15px;
- animation: spin 1s linear infinite;
-}
-
-/* 一言显示 */
-.quote-display {
- display: block;
- text-align: center;
-}
-
-.quote-display.hide {
- display: none;
-}
-
-.quote-text {
- font-size: 1.8rem;
- line-height: 1.8;
- color: #2e7d32;
- margin-bottom: 20px;
- text-shadow: 0 1px 2px rgba(102, 187, 106, 0.1);
- font-weight: 500;
-}
-
-.quote-index {
- font-size: 0.9rem;
- color: #388e3c;
- opacity: 0.8;
-}
-
-/* 错误信息 */
-.error-message {
- display: none;
- text-align: center;
- color: #66bb6a;
-}
-
-.error-message.show {
- display: block;
-}
-
-.error-icon {
- font-size: 2rem;
- margin-bottom: 10px;
-}
-
-.error-text {
- font-size: 1.1rem;
- line-height: 1.5;
-}
-
-/* 控制按钮 */
-.controls {
- text-align: center;
-}
-
-.refresh-btn {
- background: linear-gradient(135deg, #81c784, #a5d6a7);
- border: none;
- border-radius: 50px;
- padding: 15px 30px;
- font-size: 1.1rem;
- font-weight: 600;
- color: #2e7d32;
- cursor: pointer;
- display: inline-flex;
- align-items: center;
- gap: 10px;
- transition: all 0.3s ease;
- box-shadow:
- 0 4px 15px rgba(102, 187, 106, 0.3),
- inset 0 1px 0 rgba(255, 255, 255, 0.3);
- position: relative;
- overflow: hidden;
-}
-
-.refresh-btn:hover {
- transform: translateY(-2px);
- box-shadow:
- 0 6px 20px rgba(102, 187, 106, 0.4),
- inset 0 1px 0 rgba(255, 255, 255, 0.3);
-}
-
-.refresh-btn:active {
- transform: translateY(0);
-}
-
-.refresh-btn:disabled {
- opacity: 0.6;
- cursor: not-allowed;
- transform: none;
-}
-
-.btn-icon {
- font-size: 1.2rem;
- transition: transform 0.3s ease;
-}
-
-.refresh-btn:hover .btn-icon {
- transform: rotate(180deg);
-}
-
-/* 底部 */
-.footer {
- margin-top: 40px;
- text-align: center;
- color: #388e3c;
- opacity: 0.8;
- font-size: 0.9rem;
-}
-
-/* 动画效果 */
-@keyframes titleGlow {
- 0% {
- text-shadow:
- 0 0 10px rgba(129, 199, 132, 0.8),
- 0 0 20px rgba(129, 199, 132, 0.6),
- 0 0 30px rgba(129, 199, 132, 0.4);
- }
- 100% {
- text-shadow:
- 0 0 15px rgba(129, 199, 132, 1),
- 0 0 25px rgba(129, 199, 132, 0.8),
- 0 0 35px rgba(129, 199, 132, 0.6);
- }
-}
-
-@keyframes borderGlow {
- 0% {
- background-position: 0% 50%;
- }
- 50% {
- background-position: 100% 50%;
- }
- 100% {
- background-position: 0% 50%;
- }
-}
-
-@keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-/* 平板端适配 (768px - 1024px) */
-@media (min-width: 768px) and (max-width: 1024px) {
- .container {
- padding: 30px;
- }
-
- .title {
- font-size: 3.5rem;
- }
-
- .subtitle {
- font-size: 1.3rem;
- }
-
- .quote-container {
- padding: 50px;
- }
-
- .quote-text {
- font-size: 2rem;
- }
-}
-
-/* 电脑端适配 (1024px+) */
-@media (min-width: 1024px) {
- .container {
- padding: 40px;
- }
-
- .title {
- font-size: 4rem;
- }
-
- .subtitle {
- font-size: 1.4rem;
- }
-
- .quote-container {
- padding: 60px;
- max-width: 900px;
- }
-
- .quote-text {
- font-size: 2.2rem;
- line-height: 1.9;
- }
-
- .refresh-btn {
- padding: 18px 36px;
- font-size: 1.2rem;
- }
-}
-
-/* 手机端适配 (小于768px) */
-@media (max-width: 767px) {
- .container {
- padding: 15px;
- }
-
- .header {
- margin-bottom: 30px;
- }
-
- .title {
- font-size: 2.5rem;
- }
-
- .subtitle {
- font-size: 1rem;
- }
-
- .quote-container {
- padding: 25px;
- border-radius: 15px;
- }
-
- .quote-text {
- font-size: 1.4rem;
- line-height: 1.6;
- }
-
- .refresh-btn {
- padding: 12px 24px;
- font-size: 1rem;
- }
-
- .footer {
- margin-top: 30px;
- font-size: 0.8rem;
- }
-}
-
-/* 超小屏幕适配 (小于480px) */
-@media (max-width: 479px) {
- .title {
- font-size: 2rem;
- }
-
- .quote-container {
- padding: 20px;
- }
-
- .quote-text {
- font-size: 1.2rem;
- }
-
- .refresh-btn {
- padding: 10px 20px;
- font-size: 0.9rem;
- }
+/* 基础样式重置 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Microsoft YaHei', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif;
+ line-height: 1.6;
+ color: #2e7d32;
+ overflow-x: hidden;
+}
+
+/* 容器布局 */
+.container {
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ padding: 20px;
+ position: relative;
+}
+
+/* 头部样式 */
+.header {
+ text-align: center;
+ margin-bottom: 40px;
+ z-index: 10;
+}
+
+.title {
+ font-size: 3rem;
+ font-weight: 700;
+ color: #2e7d32;
+ text-shadow:
+ 0 0 10px rgba(129, 199, 132, 0.8),
+ 0 0 20px rgba(129, 199, 132, 0.6),
+ 0 0 30px rgba(129, 199, 132, 0.4);
+ margin-bottom: 10px;
+ animation: titleGlow 3s ease-in-out infinite alternate;
+}
+
+.subtitle {
+ font-size: 1.2rem;
+ color: #388e3c;
+ opacity: 0.9;
+ text-shadow: 0 0 5px rgba(102, 187, 106, 0.5);
+}
+
+/* 主内容区域 */
+.main-content {
+ width: 100%;
+ max-width: 800px;
+ z-index: 10;
+}
+
+/* 一言容器 */
+.quote-container {
+ background: linear-gradient(135deg, rgba(129, 199, 132, 0.1), rgba(165, 214, 167, 0.05));
+ border: 2px solid rgba(102, 187, 106, 0.3);
+ border-radius: 20px;
+ padding: 40px;
+ margin-bottom: 30px;
+ backdrop-filter: blur(10px);
+ box-shadow:
+ 0 8px 32px rgba(102, 187, 106, 0.2),
+ inset 0 1px 0 rgba(255, 255, 255, 0.1);
+ position: relative;
+ overflow: hidden;
+}
+
+.quote-container::before {
+ content: '';
+ position: absolute;
+ top: -2px;
+ left: -2px;
+ right: -2px;
+ bottom: -2px;
+ background: linear-gradient(45deg, #81c784, #a5d6a7, #81c784, #a5d6a7);
+ border-radius: 22px;
+ z-index: -1;
+ animation: borderGlow 4s linear infinite;
+}
+
+/* 加载状态 */
+.loading {
+ display: none;
+ text-align: center;
+ color: #2e7d32;
+}
+
+.loading.show {
+ display: block;
+}
+
+.loading-spinner {
+ width: 40px;
+ height: 40px;
+ border: 4px solid rgba(102, 187, 106, 0.3);
+ border-top: 4px solid #2e7d32;
+ border-radius: 50%;
+ margin: 0 auto 15px;
+ animation: spin 1s linear infinite;
+}
+
+/* 一言显示 */
+.quote-display {
+ display: block;
+ text-align: center;
+}
+
+.quote-display.hide {
+ display: none;
+}
+
+.quote-text {
+ font-size: 1.8rem;
+ line-height: 1.8;
+ color: #2e7d32;
+ margin-bottom: 20px;
+ text-shadow: 0 1px 2px rgba(102, 187, 106, 0.1);
+ font-weight: 500;
+}
+
+.quote-index {
+ font-size: 0.9rem;
+ color: #388e3c;
+ opacity: 0.8;
+}
+
+/* 错误信息 */
+.error-message {
+ display: none;
+ text-align: center;
+ color: #66bb6a;
+}
+
+.error-message.show {
+ display: block;
+}
+
+.error-icon {
+ font-size: 2rem;
+ margin-bottom: 10px;
+}
+
+.error-text {
+ font-size: 1.1rem;
+ line-height: 1.5;
+}
+
+/* 控制按钮 */
+.controls {
+ text-align: center;
+}
+
+.refresh-btn {
+ background: linear-gradient(135deg, #81c784, #a5d6a7);
+ border: none;
+ border-radius: 50px;
+ padding: 15px 30px;
+ font-size: 1.1rem;
+ font-weight: 600;
+ color: #2e7d32;
+ cursor: pointer;
+ display: inline-flex;
+ align-items: center;
+ gap: 10px;
+ transition: all 0.3s ease;
+ box-shadow:
+ 0 4px 15px rgba(102, 187, 106, 0.3),
+ inset 0 1px 0 rgba(255, 255, 255, 0.3);
+ position: relative;
+ overflow: hidden;
+}
+
+.refresh-btn:hover {
+ transform: translateY(-2px);
+ box-shadow:
+ 0 6px 20px rgba(102, 187, 106, 0.4),
+ inset 0 1px 0 rgba(255, 255, 255, 0.3);
+}
+
+.refresh-btn:active {
+ transform: translateY(0);
+}
+
+.refresh-btn:disabled {
+ opacity: 0.6;
+ cursor: not-allowed;
+ transform: none;
+}
+
+.btn-icon {
+ font-size: 1.2rem;
+ transition: transform 0.3s ease;
+}
+
+.refresh-btn:hover .btn-icon {
+ transform: rotate(180deg);
+}
+
+/* 底部 */
+.footer {
+ margin-top: 40px;
+ text-align: center;
+ color: #388e3c;
+ opacity: 0.8;
+ font-size: 0.9rem;
+}
+
+/* 动画效果 */
+@keyframes titleGlow {
+ 0% {
+ text-shadow:
+ 0 0 10px rgba(129, 199, 132, 0.8),
+ 0 0 20px rgba(129, 199, 132, 0.6),
+ 0 0 30px rgba(129, 199, 132, 0.4);
+ }
+ 100% {
+ text-shadow:
+ 0 0 15px rgba(129, 199, 132, 1),
+ 0 0 25px rgba(129, 199, 132, 0.8),
+ 0 0 35px rgba(129, 199, 132, 0.6);
+ }
+}
+
+@keyframes borderGlow {
+ 0% {
+ background-position: 0% 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+ 100% {
+ background-position: 0% 50%;
+ }
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+/* 平板端适配 (768px - 1024px) */
+@media (min-width: 768px) and (max-width: 1024px) {
+ .container {
+ padding: 30px;
+ }
+
+ .title {
+ font-size: 3.5rem;
+ }
+
+ .subtitle {
+ font-size: 1.3rem;
+ }
+
+ .quote-container {
+ padding: 50px;
+ }
+
+ .quote-text {
+ font-size: 2rem;
+ }
+}
+
+/* 电脑端适配 (1024px+) */
+@media (min-width: 1024px) {
+ .container {
+ padding: 40px;
+ }
+
+ .title {
+ font-size: 4rem;
+ }
+
+ .subtitle {
+ font-size: 1.4rem;
+ }
+
+ .quote-container {
+ padding: 60px;
+ max-width: 900px;
+ }
+
+ .quote-text {
+ font-size: 2.2rem;
+ line-height: 1.9;
+ }
+
+ .refresh-btn {
+ padding: 18px 36px;
+ font-size: 1.2rem;
+ }
+}
+
+/* 手机端适配 (小于768px) */
+@media (max-width: 767px) {
+ .container {
+ padding: 15px;
+ }
+
+ .header {
+ margin-bottom: 30px;
+ }
+
+ .title {
+ font-size: 2.5rem;
+ }
+
+ .subtitle {
+ font-size: 1rem;
+ }
+
+ .quote-container {
+ padding: 25px;
+ border-radius: 15px;
+ }
+
+ .quote-text {
+ font-size: 1.4rem;
+ line-height: 1.6;
+ }
+
+ .refresh-btn {
+ padding: 12px 24px;
+ font-size: 1rem;
+ }
+
+ .footer {
+ margin-top: 30px;
+ font-size: 0.8rem;
+ }
+}
+
+/* 超小屏幕适配 (小于480px) */
+@media (max-width: 479px) {
+ .title {
+ font-size: 2rem;
+ }
+
+ .quote-container {
+ padding: 20px;
+ }
+
+ .quote-text {
+ font-size: 1.2rem;
+ }
+
+ .refresh-btn {
+ padding: 10px 20px;
+ font-size: 0.9rem;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/index.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/index.html
index 4ef88f30..b0d4f467 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/index.html
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/index.html
@@ -1,52 +1,52 @@
-
-
-
-
-
- 随机一言 - 金色光辉
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ 随机一言 - 金色光辉
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/js/script.js b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/js/script.js
index cd62af76..d15eeb6e 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/js/script.js
@@ -1,222 +1,222 @@
-// 随机一言 JavaScript 功能实现
-
-class HitokotoApp {
- constructor() {
- // API接口列表
- this.apiEndpoints = [
- "https://60s.api.shumengya.top"
- ];
-
- this.currentEndpointIndex = 0;
- this.isLoading = false;
-
- // DOM 元素
- this.elements = {
- loading: document.getElementById('loading'),
- quoteDisplay: document.getElementById('quoteDisplay'),
- quoteText: document.getElementById('quoteText'),
- quoteIndex: document.getElementById('quoteIndex'),
- errorMessage: document.getElementById('errorMessage'),
- errorText: document.getElementById('errorText'),
- refreshBtn: document.getElementById('refreshBtn')
- };
-
- this.init();
- }
-
- // 初始化应用
- init() {
- this.bindEvents();
- this.hideAllStates();
- this.showQuoteDisplay();
- }
-
- // 绑定事件
- bindEvents() {
- this.elements.refreshBtn.addEventListener('click', () => {
- this.fetchHitokoto();
- });
-
- // 键盘快捷键支持
- document.addEventListener('keydown', (e) => {
- if (e.code === 'Space' && !this.isLoading) {
- e.preventDefault();
- this.fetchHitokoto();
- }
- });
- }
-
- // 隐藏所有状态
- hideAllStates() {
- this.elements.loading.classList.remove('show');
- this.elements.quoteDisplay.classList.remove('hide');
- this.elements.errorMessage.classList.remove('show');
- }
-
- // 显示加载状态
- showLoading() {
- this.hideAllStates();
- this.elements.loading.classList.add('show');
- this.elements.quoteDisplay.classList.add('hide');
- this.elements.refreshBtn.disabled = true;
- this.isLoading = true;
- }
-
- // 显示一言内容
- showQuoteDisplay() {
- this.hideAllStates();
- this.elements.quoteDisplay.classList.remove('hide');
- this.elements.refreshBtn.disabled = false;
- this.isLoading = false;
- }
-
- // 显示错误信息
- showError(message) {
- this.hideAllStates();
- this.elements.errorMessage.classList.add('show');
- this.elements.errorText.textContent = message;
- this.elements.refreshBtn.disabled = false;
- this.isLoading = false;
- }
-
- // 获取一言数据
- async fetchHitokoto() {
- if (this.isLoading) return;
-
- this.showLoading();
-
- // 尝试所有API接口
- for (let i = 0; i < this.apiEndpoints.length; i++) {
- const endpointIndex = (this.currentEndpointIndex + i) % this.apiEndpoints.length;
- const endpoint = this.apiEndpoints[endpointIndex];
-
- try {
- const result = await this.tryFetchFromEndpoint(endpoint);
- if (result.success) {
- this.currentEndpointIndex = endpointIndex;
- this.displayHitokoto(result.data);
- return;
- }
- } catch (error) {
- console.warn(`接口 ${endpoint} 请求失败:`, error.message);
- continue;
- }
- }
-
- // 所有接口都失败
- this.showError('所有接口都无法访问,请检查网络连接或稍后重试');
- }
-
- // 尝试从指定接口获取数据
- async tryFetchFromEndpoint(endpoint) {
- const controller = new AbortController();
- const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时
-
- try {
- // 移除URL中的encoding=text参数,确保返回JSON格式
- const response = await fetch(`${endpoint}/v2/hitokoto`, {
- method: 'GET',
- headers: {
- 'Accept': 'application/json',
- 'Content-Type': 'application/json'
- },
- signal: controller.signal
- });
-
- clearTimeout(timeoutId);
-
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
- }
-
- const data = await response.json();
-
- // 验证返回数据格式
- if (data.code === 200 && data.data && data.data.hitokoto) {
- return {
- success: true,
- data: data.data
- };
- } else {
- throw new Error('返回数据格式不正确');
- }
-
- } catch (error) {
- clearTimeout(timeoutId);
-
- if (error.name === 'AbortError') {
- throw new Error('请求超时');
- }
-
- throw error;
- }
- }
-
- // 显示一言内容
- displayHitokoto(data) {
- // 更新一言文本
- this.elements.quoteText.textContent = data.hitokoto;
-
- // 更新序号信息
- if (data.index) {
- this.elements.quoteIndex.textContent = `第 ${data.index} 条`;
- } else {
- this.elements.quoteIndex.textContent = '';
- }
-
- // 添加淡入动画效果
- this.elements.quoteText.style.opacity = '0';
- this.elements.quoteIndex.style.opacity = '0';
-
- setTimeout(() => {
- this.elements.quoteText.style.transition = 'opacity 0.5s ease';
- this.elements.quoteIndex.style.transition = 'opacity 0.5s ease';
- this.elements.quoteText.style.opacity = '1';
- this.elements.quoteIndex.style.opacity = '1';
- }, 100);
-
- this.showQuoteDisplay();
-
- // 控制台输出调试信息
- console.log('一言获取成功:', {
- content: data.hitokoto,
- index: data.index,
- endpoint: this.apiEndpoints[this.currentEndpointIndex]
- });
- }
-
- // 获取随机接口(用于负载均衡)
- getRandomEndpoint() {
- const randomIndex = Math.floor(Math.random() * this.apiEndpoints.length);
- return this.apiEndpoints[randomIndex];
- }
-}
-
-// 页面加载完成后初始化应用
-document.addEventListener('DOMContentLoaded', () => {
- const app = new HitokotoApp();
-
- // 添加全局错误处理
- window.addEventListener('error', (event) => {
- console.error('页面发生错误:', event.error);
- });
-
- window.addEventListener('unhandledrejection', (event) => {
- console.error('未处理的Promise拒绝:', event.reason);
- });
-
- // 页面可见性变化时的处理
- document.addEventListener('visibilitychange', () => {
- if (!document.hidden && !app.isLoading) {
- // 页面重新可见时,可以选择刷新内容
- console.log('页面重新可见');
- }
- });
-
- console.log('随机一言应用初始化完成');
-});
-
-// 导出应用类(如果需要在其他地方使用)
-if (typeof module !== 'undefined' && module.exports) {
- module.exports = HitokotoApp;
+// 随机一言 JavaScript 功能实现
+
+class HitokotoApp {
+ constructor() {
+ // API接口列表
+ this.apiEndpoints = [
+ "https://60s.api.shumengya.top"
+ ];
+
+ this.currentEndpointIndex = 0;
+ this.isLoading = false;
+
+ // DOM 元素
+ this.elements = {
+ loading: document.getElementById('loading'),
+ quoteDisplay: document.getElementById('quoteDisplay'),
+ quoteText: document.getElementById('quoteText'),
+ quoteIndex: document.getElementById('quoteIndex'),
+ errorMessage: document.getElementById('errorMessage'),
+ errorText: document.getElementById('errorText'),
+ refreshBtn: document.getElementById('refreshBtn')
+ };
+
+ this.init();
+ }
+
+ // 初始化应用
+ init() {
+ this.bindEvents();
+ this.hideAllStates();
+ this.showQuoteDisplay();
+ }
+
+ // 绑定事件
+ bindEvents() {
+ this.elements.refreshBtn.addEventListener('click', () => {
+ this.fetchHitokoto();
+ });
+
+ // 键盘快捷键支持
+ document.addEventListener('keydown', (e) => {
+ if (e.code === 'Space' && !this.isLoading) {
+ e.preventDefault();
+ this.fetchHitokoto();
+ }
+ });
+ }
+
+ // 隐藏所有状态
+ hideAllStates() {
+ this.elements.loading.classList.remove('show');
+ this.elements.quoteDisplay.classList.remove('hide');
+ this.elements.errorMessage.classList.remove('show');
+ }
+
+ // 显示加载状态
+ showLoading() {
+ this.hideAllStates();
+ this.elements.loading.classList.add('show');
+ this.elements.quoteDisplay.classList.add('hide');
+ this.elements.refreshBtn.disabled = true;
+ this.isLoading = true;
+ }
+
+ // 显示一言内容
+ showQuoteDisplay() {
+ this.hideAllStates();
+ this.elements.quoteDisplay.classList.remove('hide');
+ this.elements.refreshBtn.disabled = false;
+ this.isLoading = false;
+ }
+
+ // 显示错误信息
+ showError(message) {
+ this.hideAllStates();
+ this.elements.errorMessage.classList.add('show');
+ this.elements.errorText.textContent = message;
+ this.elements.refreshBtn.disabled = false;
+ this.isLoading = false;
+ }
+
+ // 获取一言数据
+ async fetchHitokoto() {
+ if (this.isLoading) return;
+
+ this.showLoading();
+
+ // 尝试所有API接口
+ for (let i = 0; i < this.apiEndpoints.length; i++) {
+ const endpointIndex = (this.currentEndpointIndex + i) % this.apiEndpoints.length;
+ const endpoint = this.apiEndpoints[endpointIndex];
+
+ try {
+ const result = await this.tryFetchFromEndpoint(endpoint);
+ if (result.success) {
+ this.currentEndpointIndex = endpointIndex;
+ this.displayHitokoto(result.data);
+ return;
+ }
+ } catch (error) {
+ console.warn(`接口 ${endpoint} 请求失败:`, error.message);
+ continue;
+ }
+ }
+
+ // 所有接口都失败
+ this.showError('所有接口都无法访问,请检查网络连接或稍后重试');
+ }
+
+ // 尝试从指定接口获取数据
+ async tryFetchFromEndpoint(endpoint) {
+ const controller = new AbortController();
+ const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时
+
+ try {
+ // 移除URL中的encoding=text参数,确保返回JSON格式
+ const response = await fetch(`${endpoint}/v2/hitokoto`, {
+ method: 'GET',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json'
+ },
+ signal: controller.signal
+ });
+
+ clearTimeout(timeoutId);
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+ }
+
+ const data = await response.json();
+
+ // 验证返回数据格式
+ if (data.code === 200 && data.data && data.data.hitokoto) {
+ return {
+ success: true,
+ data: data.data
+ };
+ } else {
+ throw new Error('返回数据格式不正确');
+ }
+
+ } catch (error) {
+ clearTimeout(timeoutId);
+
+ if (error.name === 'AbortError') {
+ throw new Error('请求超时');
+ }
+
+ throw error;
+ }
+ }
+
+ // 显示一言内容
+ displayHitokoto(data) {
+ // 更新一言文本
+ this.elements.quoteText.textContent = data.hitokoto;
+
+ // 更新序号信息
+ if (data.index) {
+ this.elements.quoteIndex.textContent = `第 ${data.index} 条`;
+ } else {
+ this.elements.quoteIndex.textContent = '';
+ }
+
+ // 添加淡入动画效果
+ this.elements.quoteText.style.opacity = '0';
+ this.elements.quoteIndex.style.opacity = '0';
+
+ setTimeout(() => {
+ this.elements.quoteText.style.transition = 'opacity 0.5s ease';
+ this.elements.quoteIndex.style.transition = 'opacity 0.5s ease';
+ this.elements.quoteText.style.opacity = '1';
+ this.elements.quoteIndex.style.opacity = '1';
+ }, 100);
+
+ this.showQuoteDisplay();
+
+ // 控制台输出调试信息
+ console.log('一言获取成功:', {
+ content: data.hitokoto,
+ index: data.index,
+ endpoint: this.apiEndpoints[this.currentEndpointIndex]
+ });
+ }
+
+ // 获取随机接口(用于负载均衡)
+ getRandomEndpoint() {
+ const randomIndex = Math.floor(Math.random() * this.apiEndpoints.length);
+ return this.apiEndpoints[randomIndex];
+ }
+}
+
+// 页面加载完成后初始化应用
+document.addEventListener('DOMContentLoaded', () => {
+ const app = new HitokotoApp();
+
+ // 添加全局错误处理
+ window.addEventListener('error', (event) => {
+ console.error('页面发生错误:', event.error);
+ });
+
+ window.addEventListener('unhandledrejection', (event) => {
+ console.error('未处理的Promise拒绝:', event.reason);
+ });
+
+ // 页面可见性变化时的处理
+ document.addEventListener('visibilitychange', () => {
+ if (!document.hidden && !app.isLoading) {
+ // 页面重新可见时,可以选择刷新内容
+ console.log('页面重新可见');
+ }
+ });
+
+ console.log('随机一言应用初始化完成');
+});
+
+// 导出应用类(如果需要在其他地方使用)
+if (typeof module !== 'undefined' && module.exports) {
+ module.exports = HitokotoApp;
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/接口集合.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/接口集合.json
index 547b2771..42245813 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/接口集合.json
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/接口集合.json
@@ -1,3 +1,3 @@
-[
- "https://60s.api.shumengya.top"
-]
+[
+ "https://60s.api.shumengya.top"
+]
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/返回接口.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/返回接口.json
index 29342ebc..f983c75c 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机一言/返回接口.json
@@ -1,8 +1,8 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "index": 2862,
- "hitokoto": "你带上罪恶之冠,即使背负上所有罪恶和孤独,绝不让你受伤"
- }
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "index": 2862,
+ "hitokoto": "你带上罪恶之冠,即使背负上所有罪恶和孤独,绝不让你受伤"
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/Untitled-1.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/Untitled-1.html
index 6edd77e5..66b58879 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/Untitled-1.html
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/Untitled-1.html
@@ -1,16 +1,16 @@
-
-
-
-
-
- 每日笑话
-
-
-
-
-
-
+
+
+
+
+
+ 每日笑话
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/background.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/background.css
index 79480464..4cb97210 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/background.css
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/background.css
@@ -1,107 +1,107 @@
-/* background.css - 动态渐变背景 */
-body {
- background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);
- background-size: 400% 400%;
- animation: gradient 15s ease infinite;
-}
-
-@keyframes gradient {
- 0% {
- background-position: 0% 50%;
- }
- 50% {
- background-position: 100% 50%;
- }
- 100% {
- background-position: 0% 50%;
- }
-}
-:root {
- --bg-yellow: #FFFDE7; /* 浅黄 */
- --bg-blue: #E3F2FD; /* 淡蓝 */
-}
-
-body {
- background: linear-gradient(180deg, var(--bg-yellow) 0%, var(--bg-blue) 100%);
- background-attachment: fixed; /* 固定背景,滚动时不移动 */
-}
-
-body {
- margin: 0;
- padding: 0;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
- overflow: hidden;
- transition: background-color 0.5s ease;
-}
-
-/* Light Theme (Default) */
-[data-theme="light"] {
- background: linear-gradient(to bottom, #87CEEB, #B0E0E6);
-}
-
-/* Dark Theme */
-[data-theme="dark"] {
- background: linear-gradient(to bottom, #232526, #414345);
-}
-[data-theme="dark"] .snowflake {
- color: #999;
-}
-
-/* Winter Theme */
-[data-theme="winter"] {
- background: linear-gradient(to bottom, #a1c4fd, #c2e9fb);
-}
-[data-theme="winter"] .background-bottom {
- position: fixed;
- bottom: 0;
- left: 0;
- width: 100%;
- height: 100px;
- background: linear-gradient(to top, white, rgba(255, 255, 255, 0));
- z-index: -1;
- border-radius: 50% 50% 0 0 / 20px;
- box-shadow: 0 -10px 20px rgba(255, 255, 255, 0.5);
-}
-
-
-#snowflake-container {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- pointer-events: none;
- z-index: 0;
-}
-
-.snowflake {
- position: absolute;
- top: -10%;
- color: white;
- font-size: 20px;
- user-select: none;
- animation: fall linear infinite;
-}
-
-@keyframes fall {
- to {
- transform: translateY(105vh) rotate(360deg);
- }
-}
-
-#frost-overlay {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: url('https://www.transparenttextures.com/patterns/ice-age.png') repeat;
- opacity: 0;
- pointer-events: none;
- transition: opacity 0.5s ease-in-out;
- z-index: 100;
-}
-
-#frost-overlay.is-frosted {
- opacity: 0.3;
+/* background.css - 动态渐变背景 */
+body {
+ background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);
+ background-size: 400% 400%;
+ animation: gradient 15s ease infinite;
+}
+
+@keyframes gradient {
+ 0% {
+ background-position: 0% 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+ 100% {
+ background-position: 0% 50%;
+ }
+}
+:root {
+ --bg-yellow: #FFFDE7; /* 浅黄 */
+ --bg-blue: #E3F2FD; /* 淡蓝 */
+}
+
+body {
+ background: linear-gradient(180deg, var(--bg-yellow) 0%, var(--bg-blue) 100%);
+ background-attachment: fixed; /* 固定背景,滚动时不移动 */
+}
+
+body {
+ margin: 0;
+ padding: 0;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
+ overflow: hidden;
+ transition: background-color 0.5s ease;
+}
+
+/* Light Theme (Default) */
+[data-theme="light"] {
+ background: linear-gradient(to bottom, #87CEEB, #B0E0E6);
+}
+
+/* Dark Theme */
+[data-theme="dark"] {
+ background: linear-gradient(to bottom, #232526, #414345);
+}
+[data-theme="dark"] .snowflake {
+ color: #999;
+}
+
+/* Winter Theme */
+[data-theme="winter"] {
+ background: linear-gradient(to bottom, #a1c4fd, #c2e9fb);
+}
+[data-theme="winter"] .background-bottom {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 100px;
+ background: linear-gradient(to top, white, rgba(255, 255, 255, 0));
+ z-index: -1;
+ border-radius: 50% 50% 0 0 / 20px;
+ box-shadow: 0 -10px 20px rgba(255, 255, 255, 0.5);
+}
+
+
+#snowflake-container {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ pointer-events: none;
+ z-index: 0;
+}
+
+.snowflake {
+ position: absolute;
+ top: -10%;
+ color: white;
+ font-size: 20px;
+ user-select: none;
+ animation: fall linear infinite;
+}
+
+@keyframes fall {
+ to {
+ transform: translateY(105vh) rotate(360deg);
+ }
+}
+
+#frost-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: url('https://www.transparenttextures.com/patterns/ice-age.png') repeat;
+ opacity: 0;
+ pointer-events: none;
+ transition: opacity 0.5s ease-in-out;
+ z-index: 100;
+}
+
+#frost-overlay.is-frosted {
+ opacity: 0.3;
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/style.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/style.css
index 1676dffd..ce4fa9f6 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/css/style.css
@@ -1,217 +1,217 @@
-:root {
- --primary-color-light: #4A90E2;
- --text-color-light: #333;
- --card-bg-light: rgba(255, 255, 255, 0.85);
-
- --primary-color-dark: #5271C4;
- --text-color-dark: #E0E0E0;
- --card-bg-dark: rgba(40, 40, 40, 0.85);
-
- --primary-color-winter: #6A82FB;
- --text-color-winter: #2c3e50;
- --card-bg-winter: rgba(255, 255, 255, 0.7);
-}
-
-.container {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- min-height: 100vh;
- padding: 20px;
- box-sizing: border-box;
- text-align: center;
- position: relative;
- z-index: 1;
-}
-
-.top-nav {
- position: absolute;
- top: 20px;
- right: 20px;
- background: rgba(255, 255, 255, 0.3);
- padding: 5px;
- border-radius: 50px;
- backdrop-filter: blur(5px);
-}
-
-.theme-switcher {
- display: flex;
- gap: 5px;
-}
-
-.theme-btn {
- background: transparent;
- border: 2px solid transparent;
- border-radius: 50%;
- width: 40px;
- height: 40px;
- font-size: 1.5em;
- cursor: pointer;
- transition: transform 0.2s, border-color 0.2s;
-}
-.theme-btn:hover {
- transform: scale(1.1);
-}
-.theme-btn.active {
- border-color: white;
-}
-
-.title {
- font-family: 'ZCOOL KuaiLe', cursive;
- font-size: 3em;
- margin-bottom: 20px;
- transition: color 0.5s ease;
-}
-
-.joke-stream {
- width: 100%;
- max-width: 500px;
- display: flex;
- flex-direction: column;
- gap: 25px;
-}
-
-.joke-card {
- border-radius: 20px;
- padding: 30px 40px;
- box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15);
- width: 100%;
- max-width: 500px;
- min-height: 150px;
- display: flex;
- justify-content: center;
- align-items: center;
- position: relative;
- backdrop-filter: blur(8px);
- border: 1px solid rgba(255, 255, 255, 0.2);
- transition: background-color 0.5s ease, border-color 0.5s ease;
-}
-
-#joke-text {
- font-size: 1.5em;
- line-height: 1.6;
- transition: opacity 0.3s, color 0.5s ease;
-}
-
-/* --- Theming --- */
-
-/* Light Theme */
-[data-theme="light"] .title { color: white; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.2); }
-[data-theme="light"] .joke-card { background-color: var(--card-bg-light); }
-[data-theme="light"] #joke-text { color: var(--text-color-light); }
-[data-theme="light"] #new-joke-btn { background-color: var(--primary-color-light); box-shadow: 0 4px 15px rgba(74, 144, 226, 0.4); }
-[data-theme="light"] footer { color: rgba(255, 255, 255, 0.8); }
-
-/* Dark Theme */
-[data-theme="dark"] .title { color: #EAEAEA; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); }
-[data-theme="dark"] .joke-card { background-color: var(--card-bg-dark); border-color: rgba(255, 255, 255, 0.1); }
-[data-theme="dark"] #joke-text { color: var(--text-color-dark); }
-[data-theme="dark"] #new-joke-btn { background-color: var(--primary-color-dark); box-shadow: 0 4px 15px rgba(82, 113, 196, 0.4); }
-[data-theme="dark"] footer { color: rgba(200, 200, 200, 0.7); }
-
-/* Winter Theme */
-[data-theme="winter"] .title { color: #1e3a5f; text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.7); }
-[data-theme="winter"] .joke-card {
- background-color: var(--card-bg-winter);
- border-color: rgba(255, 255, 255, 0.8);
- box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1), inset 0 0 15px rgba(255, 255, 255, 0.5);
-}
-[data-theme="winter"] #joke-text { color: var(--text-color-winter); }
-[data-theme="winter"] #new-joke-btn { background-color: var(--primary-color-winter); box-shadow: 0 4px 15px rgba(106, 130, 251, 0.4); }
-[data-theme="winter"] footer { color: #1e3a5f; }
-
-
-.controls {
- margin-top: 30px;
-}
-
-#new-joke-btn {
- color: white;
- font-size: 1.2em;
- font-weight: bold;
- padding: 15px 35px;
- border: none;
- border-radius: 50px;
- cursor: pointer;
- transition: transform 0.2s ease, box-shadow 0.2s ease, background-color 0.5s ease;
-}
-
-#new-joke-btn:hover {
- transform: translateY(-3px);
-}
-
-#new-joke-btn:active {
- transform: translateY(1px);
-}
-
-.interactions {
- margin-top: 25px;
- display: flex;
- gap: 20px;
-}
-
-.interaction-btn {
- background: rgba(255, 255, 255, 0.7);
- border: 1px solid rgba(255, 255, 255, 0.9);
- border-radius: 50%;
- width: 50px;
- height: 50px;
- font-size: 1.5em;
- cursor: pointer;
- transition: transform 0.2s, background-color 0.2s;
-}
-
-.interaction-btn:hover {
- transform: scale(1.1);
- background: white;
-}
-
-footer {
- position: absolute;
- bottom: 10px;
- font-size: 0.9em;
- transition: color 0.5s ease;
-}
-
-/* Loader */
-#loader {
- position: absolute;
- transition: color 0.5s ease;
-}
-[data-theme="light"] #loader { color: var(--primary-color-light); }
-[data-theme="dark"] #loader { color: var(--primary-color-dark); }
-[data-theme="winter"] #loader { color: var(--primary-color-winter); }
-
-.snowflake-loader {
- font-size: 40px;
- display: inline-block;
- animation: spin 1.5s linear infinite;
-}
-.snowflake-loader::before {
- content: '❄';
-}
-@keyframes spin {
- to { transform: rotate(360deg); }
-}
-
-.hidden {
- display: none;
-}
-
-/* Responsive */
-@media (max-width: 600px) {
- .title {
- font-size: 2.5em;
- }
- .joke-card {
- padding: 25px;
- }
- #joke-text {
- font-size: 1.2em;
- }
- .top-nav {
- top: 10px;
- right: 10px;
- }
+:root {
+ --primary-color-light: #4A90E2;
+ --text-color-light: #333;
+ --card-bg-light: rgba(255, 255, 255, 0.85);
+
+ --primary-color-dark: #5271C4;
+ --text-color-dark: #E0E0E0;
+ --card-bg-dark: rgba(40, 40, 40, 0.85);
+
+ --primary-color-winter: #6A82FB;
+ --text-color-winter: #2c3e50;
+ --card-bg-winter: rgba(255, 255, 255, 0.7);
+}
+
+.container {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ min-height: 100vh;
+ padding: 20px;
+ box-sizing: border-box;
+ text-align: center;
+ position: relative;
+ z-index: 1;
+}
+
+.top-nav {
+ position: absolute;
+ top: 20px;
+ right: 20px;
+ background: rgba(255, 255, 255, 0.3);
+ padding: 5px;
+ border-radius: 50px;
+ backdrop-filter: blur(5px);
+}
+
+.theme-switcher {
+ display: flex;
+ gap: 5px;
+}
+
+.theme-btn {
+ background: transparent;
+ border: 2px solid transparent;
+ border-radius: 50%;
+ width: 40px;
+ height: 40px;
+ font-size: 1.5em;
+ cursor: pointer;
+ transition: transform 0.2s, border-color 0.2s;
+}
+.theme-btn:hover {
+ transform: scale(1.1);
+}
+.theme-btn.active {
+ border-color: white;
+}
+
+.title {
+ font-family: 'ZCOOL KuaiLe', cursive;
+ font-size: 3em;
+ margin-bottom: 20px;
+ transition: color 0.5s ease;
+}
+
+.joke-stream {
+ width: 100%;
+ max-width: 500px;
+ display: flex;
+ flex-direction: column;
+ gap: 25px;
+}
+
+.joke-card {
+ border-radius: 20px;
+ padding: 30px 40px;
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15);
+ width: 100%;
+ max-width: 500px;
+ min-height: 150px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: relative;
+ backdrop-filter: blur(8px);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ transition: background-color 0.5s ease, border-color 0.5s ease;
+}
+
+#joke-text {
+ font-size: 1.5em;
+ line-height: 1.6;
+ transition: opacity 0.3s, color 0.5s ease;
+}
+
+/* --- Theming --- */
+
+/* Light Theme */
+[data-theme="light"] .title { color: white; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.2); }
+[data-theme="light"] .joke-card { background-color: var(--card-bg-light); }
+[data-theme="light"] #joke-text { color: var(--text-color-light); }
+[data-theme="light"] #new-joke-btn { background-color: var(--primary-color-light); box-shadow: 0 4px 15px rgba(74, 144, 226, 0.4); }
+[data-theme="light"] footer { color: rgba(255, 255, 255, 0.8); }
+
+/* Dark Theme */
+[data-theme="dark"] .title { color: #EAEAEA; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); }
+[data-theme="dark"] .joke-card { background-color: var(--card-bg-dark); border-color: rgba(255, 255, 255, 0.1); }
+[data-theme="dark"] #joke-text { color: var(--text-color-dark); }
+[data-theme="dark"] #new-joke-btn { background-color: var(--primary-color-dark); box-shadow: 0 4px 15px rgba(82, 113, 196, 0.4); }
+[data-theme="dark"] footer { color: rgba(200, 200, 200, 0.7); }
+
+/* Winter Theme */
+[data-theme="winter"] .title { color: #1e3a5f; text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.7); }
+[data-theme="winter"] .joke-card {
+ background-color: var(--card-bg-winter);
+ border-color: rgba(255, 255, 255, 0.8);
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1), inset 0 0 15px rgba(255, 255, 255, 0.5);
+}
+[data-theme="winter"] #joke-text { color: var(--text-color-winter); }
+[data-theme="winter"] #new-joke-btn { background-color: var(--primary-color-winter); box-shadow: 0 4px 15px rgba(106, 130, 251, 0.4); }
+[data-theme="winter"] footer { color: #1e3a5f; }
+
+
+.controls {
+ margin-top: 30px;
+}
+
+#new-joke-btn {
+ color: white;
+ font-size: 1.2em;
+ font-weight: bold;
+ padding: 15px 35px;
+ border: none;
+ border-radius: 50px;
+ cursor: pointer;
+ transition: transform 0.2s ease, box-shadow 0.2s ease, background-color 0.5s ease;
+}
+
+#new-joke-btn:hover {
+ transform: translateY(-3px);
+}
+
+#new-joke-btn:active {
+ transform: translateY(1px);
+}
+
+.interactions {
+ margin-top: 25px;
+ display: flex;
+ gap: 20px;
+}
+
+.interaction-btn {
+ background: rgba(255, 255, 255, 0.7);
+ border: 1px solid rgba(255, 255, 255, 0.9);
+ border-radius: 50%;
+ width: 50px;
+ height: 50px;
+ font-size: 1.5em;
+ cursor: pointer;
+ transition: transform 0.2s, background-color 0.2s;
+}
+
+.interaction-btn:hover {
+ transform: scale(1.1);
+ background: white;
+}
+
+footer {
+ position: absolute;
+ bottom: 10px;
+ font-size: 0.9em;
+ transition: color 0.5s ease;
+}
+
+/* Loader */
+#loader {
+ position: absolute;
+ transition: color 0.5s ease;
+}
+[data-theme="light"] #loader { color: var(--primary-color-light); }
+[data-theme="dark"] #loader { color: var(--primary-color-dark); }
+[data-theme="winter"] #loader { color: var(--primary-color-winter); }
+
+.snowflake-loader {
+ font-size: 40px;
+ display: inline-block;
+ animation: spin 1.5s linear infinite;
+}
+.snowflake-loader::before {
+ content: '❄';
+}
+@keyframes spin {
+ to { transform: rotate(360deg); }
+}
+
+.hidden {
+ display: none;
+}
+
+/* Responsive */
+@media (max-width: 600px) {
+ .title {
+ font-size: 2.5em;
+ }
+ .joke-card {
+ padding: 25px;
+ }
+ #joke-text {
+ font-size: 1.2em;
+ }
+ .top-nav {
+ top: 10px;
+ right: 10px;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/index.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/index.html
index 68477bd1..9801ca05 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/index.html
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/index.html
@@ -1,58 +1,58 @@
-
-
-
-
-
- 随机冷笑话
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 点击下面的按钮,来点冷笑话吧!
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ 随机冷笑话
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 点击下面的按钮,来点冷笑话吧!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/js/script.js b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/js/script.js
index 8fe675eb..c9912df1 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/js/script.js
@@ -1,117 +1,117 @@
-document.addEventListener('DOMContentLoaded', () => {
- const jokeTextElem = document.getElementById('joke-text');
- const newJokeBtn = document.getElementById('new-joke-btn');
- const snowflakeContainer = document.getElementById('snowflake-container');
- const frostOverlay = document.getElementById('frost-overlay');
- const windSound = document.getElementById('wind-sound');
- const snowSound = document.getElementById('snow-sound');
- const loader = document.getElementById('loader');
- const themeBtns = document.querySelectorAll('.theme-btn');
-
- const apiEndpoints = [
- 'https://60s.api.shumengya.top/v2/dad-joke',
- ];
- let currentApiIndex = 0;
-
- async function fetchJoke() {
- jokeTextElem.classList.add('hidden');
- loader.classList.remove('hidden');
-
- try {
- const response = await fetch(apiEndpoints[currentApiIndex]);
- if (!response.ok) throw new Error('Network response was not ok');
-
- const data = await response.json();
- if (data.code === 200 && data.data.content) {
- updateJokeText(data.data.content);
- if (document.body.dataset.theme === 'winter' && Math.random() < 0.3) {
- triggerFrostEffect();
- }
- } else {
- throw new Error('API returned invalid data');
- }
- } catch (error) {
- console.error('Fetch error:', error);
- currentApiIndex = (currentApiIndex + 1) % apiEndpoints.length;
- if (currentApiIndex !== 0) {
- fetchJoke();
- } else {
- jokeTextElem.textContent = '冰箱坏了,暂时没有冷笑话...';
- }
- } finally {
- loader.classList.add('hidden');
- jokeTextElem.classList.remove('hidden');
- }
- }
-
- function updateJokeText(text) {
- jokeTextElem.textContent = '';
- let i = 0;
- const typing = setInterval(() => {
- if (i < text.length) {
- jokeTextElem.textContent += text.charAt(i);
- i++;
- } else {
- clearInterval(typing);
- }
- }, 50);
- }
-
- function createSnowflakes() {
- const snowflakeCount = document.body.dataset.theme === 'dark' ? 50 : 30;
- snowflakeContainer.innerHTML = '';
- for (let i = 0; i < snowflakeCount; i++) {
- const snowflake = document.createElement('div');
- snowflake.className = 'snowflake';
- snowflake.textContent = '❄️';
-
- snowflake.style.left = `${Math.random() * 100}vw`;
- snowflake.style.fontSize = `${Math.random() * 15 + 10}px`;
- snowflake.style.opacity = Math.random() * 0.5 + 0.3;
-
- const duration = Math.random() * 10 + 8;
- const delay = Math.random() * 10;
-
- snowflake.style.animation = `fall ${duration}s linear ${delay}s infinite`;
-
- snowflakeContainer.appendChild(snowflake);
- }
- }
-
- function triggerFrostEffect() {
- frostOverlay.classList.add('is-frosted');
- windSound.play().catch(e => console.error("Audio play failed:", e));
- setTimeout(() => {
- frostOverlay.classList.remove('is-frosted');
- }, 2000);
- }
-
- function setTheme(theme) {
- document.body.dataset.theme = theme;
- localStorage.setItem('joke-theme', theme);
-
- themeBtns.forEach(btn => {
- btn.classList.toggle('active', btn.dataset.themeTarget === theme);
- });
-
- if (theme === 'winter') {
- snowSound.play().catch(e => console.error("Audio play failed:", e));
- }
-
- // Recreate snowflakes for theme-specific density
- createSnowflakes();
- }
-
- themeBtns.forEach(btn => {
- btn.addEventListener('click', () => {
- setTheme(btn.dataset.themeTarget);
- });
- });
-
- newJokeBtn.addEventListener('click', fetchJoke);
-
- // Initial setup
- const savedTheme = localStorage.getItem('joke-theme') || 'light';
- setTheme(savedTheme);
- fetchJoke();
+document.addEventListener('DOMContentLoaded', () => {
+ const jokeTextElem = document.getElementById('joke-text');
+ const newJokeBtn = document.getElementById('new-joke-btn');
+ const snowflakeContainer = document.getElementById('snowflake-container');
+ const frostOverlay = document.getElementById('frost-overlay');
+ const windSound = document.getElementById('wind-sound');
+ const snowSound = document.getElementById('snow-sound');
+ const loader = document.getElementById('loader');
+ const themeBtns = document.querySelectorAll('.theme-btn');
+
+ const apiEndpoints = [
+ 'https://60s.api.shumengya.top/v2/dad-joke',
+ ];
+ let currentApiIndex = 0;
+
+ async function fetchJoke() {
+ jokeTextElem.classList.add('hidden');
+ loader.classList.remove('hidden');
+
+ try {
+ const response = await fetch(apiEndpoints[currentApiIndex]);
+ if (!response.ok) throw new Error('Network response was not ok');
+
+ const data = await response.json();
+ if (data.code === 200 && data.data.content) {
+ updateJokeText(data.data.content);
+ if (document.body.dataset.theme === 'winter' && Math.random() < 0.3) {
+ triggerFrostEffect();
+ }
+ } else {
+ throw new Error('API returned invalid data');
+ }
+ } catch (error) {
+ console.error('Fetch error:', error);
+ currentApiIndex = (currentApiIndex + 1) % apiEndpoints.length;
+ if (currentApiIndex !== 0) {
+ fetchJoke();
+ } else {
+ jokeTextElem.textContent = '冰箱坏了,暂时没有冷笑话...';
+ }
+ } finally {
+ loader.classList.add('hidden');
+ jokeTextElem.classList.remove('hidden');
+ }
+ }
+
+ function updateJokeText(text) {
+ jokeTextElem.textContent = '';
+ let i = 0;
+ const typing = setInterval(() => {
+ if (i < text.length) {
+ jokeTextElem.textContent += text.charAt(i);
+ i++;
+ } else {
+ clearInterval(typing);
+ }
+ }, 50);
+ }
+
+ function createSnowflakes() {
+ const snowflakeCount = document.body.dataset.theme === 'dark' ? 50 : 30;
+ snowflakeContainer.innerHTML = '';
+ for (let i = 0; i < snowflakeCount; i++) {
+ const snowflake = document.createElement('div');
+ snowflake.className = 'snowflake';
+ snowflake.textContent = '❄️';
+
+ snowflake.style.left = `${Math.random() * 100}vw`;
+ snowflake.style.fontSize = `${Math.random() * 15 + 10}px`;
+ snowflake.style.opacity = Math.random() * 0.5 + 0.3;
+
+ const duration = Math.random() * 10 + 8;
+ const delay = Math.random() * 10;
+
+ snowflake.style.animation = `fall ${duration}s linear ${delay}s infinite`;
+
+ snowflakeContainer.appendChild(snowflake);
+ }
+ }
+
+ function triggerFrostEffect() {
+ frostOverlay.classList.add('is-frosted');
+ windSound.play().catch(e => console.error("Audio play failed:", e));
+ setTimeout(() => {
+ frostOverlay.classList.remove('is-frosted');
+ }, 2000);
+ }
+
+ function setTheme(theme) {
+ document.body.dataset.theme = theme;
+ localStorage.setItem('joke-theme', theme);
+
+ themeBtns.forEach(btn => {
+ btn.classList.toggle('active', btn.dataset.themeTarget === theme);
+ });
+
+ if (theme === 'winter') {
+ snowSound.play().catch(e => console.error("Audio play failed:", e));
+ }
+
+ // Recreate snowflakes for theme-specific density
+ createSnowflakes();
+ }
+
+ themeBtns.forEach(btn => {
+ btn.addEventListener('click', () => {
+ setTheme(btn.dataset.themeTarget);
+ });
+ });
+
+ newJokeBtn.addEventListener('click', fetchJoke);
+
+ // Initial setup
+ const savedTheme = localStorage.getItem('joke-theme') || 'light';
+ setTheme(savedTheme);
+ fetchJoke();
});
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/返回接口.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/返回接口.json
index b514f650..3cb69b8d 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机冷笑话/返回接口.json
@@ -1,8 +1,8 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "index": 121,
- "content": "这个世界上谁最懂猪?蜘蛛(知猪)人。"
- }
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "index": 121,
+ "content": "这个世界上谁最懂猪?蜘蛛(知猪)人。"
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/css/background.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/css/background.css
index b77c1a35..022ce6d9 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/css/background.css
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/css/background.css
@@ -1,90 +1,90 @@
-body {
- background-color: #1a1a1a;
- color: #e0e0e0;
- font-family: 'Courier New', Courier, monospace;
- overflow: hidden;
- margin: 0;
- padding: 0;
-}
-
-#bg-container {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- z-index: -2;
- overflow: hidden;
- transition: transform 0.2s ease-out;
-}
-
-.floating-emoji {
- position: absolute;
- user-select: none;
- opacity: 0;
- animation-iteration-count: infinite;
- animation-timing-function: linear;
-}
-
-@keyframes float-top-to-bottom {
- 0% { transform: translateY(-10vh) rotate(0deg); opacity: 0; }
- 10%, 90% { opacity: 0.7; }
- 100% { transform: translateY(110vh) rotate(360deg); opacity: 0; }
-}
-
-@keyframes float-bottom-to-top {
- 0% { transform: translateY(110vh) rotate(0deg); opacity: 0; }
- 10%, 90% { opacity: 0.7; }
- 100% { transform: translateY(-10vh) rotate(360deg); opacity: 0; }
-}
-
-@keyframes float-left-to-right {
- 0% { transform: translateX(-10vw) rotate(0deg); opacity: 0; }
- 10%, 90% { opacity: 0.7; }
- 100% { transform: translateX(110vw) rotate(360deg); opacity: 0; }
-}
-
-@keyframes float-right-to-left {
- 0% { transform: translateX(110vw) rotate(0deg); opacity: 0; }
- 10%, 90% { opacity: 0.7; }
- 100% { transform: translateX(-10vw) rotate(360deg); opacity: 0; }
-}
-
-.text-fragment {
- position: absolute;
- font-size: 24px;
- color: rgba(255, 0, 255, 0.4);
- opacity: 0;
- animation: float-fragment 15s linear infinite, fade-in-out 15s linear infinite;
- user-select: none;
-}
-
-@keyframes float-fragment {
- 0% { transform: translate(0, 0) rotate(0deg); }
- 25% { transform: translate(20px, 40px) rotate(15deg); }
- 50% { transform: translate(-30px, -10px) rotate(-10deg); }
- 75% { transform: translate(10px, -30px) rotate(5deg); }
- 100% { transform: translate(0, 0) rotate(0deg); }
-}
-
-@keyframes fade-in-out {
- 0%, 100% { opacity: 0; }
- 10%, 90% { opacity: 0.4; }
-}
-
-.screen-crack {
- position: absolute;
- width: 200px;
- height: 200px;
- background-image: url('data:image/svg+xml;utf8,');
- opacity: 0;
- animation: flicker-crack 25s steps(1, end) infinite;
-}
-
-@keyframes flicker-crack {
- 0%, 100% { opacity: 0; }
- 50% { opacity: 0.3; }
- 51% { opacity: 0; }
- 75% { opacity: 0.2; }
- 76% { opacity: 0; }
+body {
+ background-color: #1a1a1a;
+ color: #e0e0e0;
+ font-family: 'Courier New', Courier, monospace;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+}
+
+#bg-container {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: -2;
+ overflow: hidden;
+ transition: transform 0.2s ease-out;
+}
+
+.floating-emoji {
+ position: absolute;
+ user-select: none;
+ opacity: 0;
+ animation-iteration-count: infinite;
+ animation-timing-function: linear;
+}
+
+@keyframes float-top-to-bottom {
+ 0% { transform: translateY(-10vh) rotate(0deg); opacity: 0; }
+ 10%, 90% { opacity: 0.7; }
+ 100% { transform: translateY(110vh) rotate(360deg); opacity: 0; }
+}
+
+@keyframes float-bottom-to-top {
+ 0% { transform: translateY(110vh) rotate(0deg); opacity: 0; }
+ 10%, 90% { opacity: 0.7; }
+ 100% { transform: translateY(-10vh) rotate(360deg); opacity: 0; }
+}
+
+@keyframes float-left-to-right {
+ 0% { transform: translateX(-10vw) rotate(0deg); opacity: 0; }
+ 10%, 90% { opacity: 0.7; }
+ 100% { transform: translateX(110vw) rotate(360deg); opacity: 0; }
+}
+
+@keyframes float-right-to-left {
+ 0% { transform: translateX(110vw) rotate(0deg); opacity: 0; }
+ 10%, 90% { opacity: 0.7; }
+ 100% { transform: translateX(-10vw) rotate(360deg); opacity: 0; }
+}
+
+.text-fragment {
+ position: absolute;
+ font-size: 24px;
+ color: rgba(255, 0, 255, 0.4);
+ opacity: 0;
+ animation: float-fragment 15s linear infinite, fade-in-out 15s linear infinite;
+ user-select: none;
+}
+
+@keyframes float-fragment {
+ 0% { transform: translate(0, 0) rotate(0deg); }
+ 25% { transform: translate(20px, 40px) rotate(15deg); }
+ 50% { transform: translate(-30px, -10px) rotate(-10deg); }
+ 75% { transform: translate(10px, -30px) rotate(5deg); }
+ 100% { transform: translate(0, 0) rotate(0deg); }
+}
+
+@keyframes fade-in-out {
+ 0%, 100% { opacity: 0; }
+ 10%, 90% { opacity: 0.4; }
+}
+
+.screen-crack {
+ position: absolute;
+ width: 200px;
+ height: 200px;
+ background-image: url('data:image/svg+xml;utf8,');
+ opacity: 0;
+ animation: flicker-crack 25s steps(1, end) infinite;
+}
+
+@keyframes flicker-crack {
+ 0%, 100% { opacity: 0; }
+ 50% { opacity: 0.3; }
+ 51% { opacity: 0; }
+ 75% { opacity: 0.2; }
+ 76% { opacity: 0; }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/css/style.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/css/style.css
index db1df76c..1441da73 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/css/style.css
@@ -1,235 +1,235 @@
-.container {
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
- min-height: 100vh;
- padding: 20px;
- box-sizing: border-box;
- position: relative;
- z-index: 1;
-}
-
-.content-card {
- background: rgba(20, 20, 20, 0.7);
- border: none;
- padding: 40px;
- max-width: 600px;
- width: 100%;
- text-align: center;
- backdrop-filter: blur(5px);
- position: relative;
- clip-path: polygon(2% 5%, 97% 0%, 100% 95%, 0% 100%);
-}
-
-.body-animated .content-card {
- animation: tremble 0.4s infinite, glitch-shadow 1.5s steps(1, end) infinite;
-}
-
-@keyframes tremble {
- 0% { clip-path: polygon(2% 5%, 97% 0%, 100% 95%, 0% 100%); }
- 25% { clip-path: polygon(2% 5%, 98% 2%, 99% 100%, 1% 98%); }
- 50% { clip-path: polygon(3% 4%, 96% 1%, 100% 96%, 2% 100%); }
- 75% { clip-path: polygon(1% 6%, 97% 3%, 98% 95%, 0% 99%); }
- 100% { clip-path: polygon(2% 5%, 97% 0%, 100% 95%, 0% 100%); }
-}
-
-@keyframes glitch-shadow {
- 0% {
- box-shadow:
- 0 0 8px rgba(255, 0, 255, 0.5),
- inset 0 0 8px rgba(255, 0, 255, 0.4);
- }
- 33% {
- box-shadow:
- 0 0 8px rgba(0, 255, 255, 0.5),
- inset 0 0 8px rgba(0, 255, 255, 0.4);
- }
- 66% {
- box-shadow:
- 0 0 8px rgba(0, 255, 0, 0.5),
- inset 0 0 8px rgba(0, 255, 0, 0.4);
- }
- 100% {
- box-shadow:
- 0 0 8px rgba(255, 0, 255, 0.5),
- inset 0 0 8px rgba(255, 0, 255, 0.4);
- }
-}
-
-#literature-text {
- font-size: 1.2em;
- line-height: 1.8;
- min-height: 100px;
- color: #e0e0e0;
- text-shadow: 0 0 5px rgba(0, 255, 135, 0.5);
- animation: text-flicker 15s linear infinite;
-}
-
-.body-animated #literature-text {
- animation: text-flicker 15s linear infinite, text-shadow-glitch 2s steps(1, end) infinite;
-}
-
-@keyframes text-flicker {
- 0%, 100% { opacity: 1; }
- 50.0% { opacity: 0.95; }
- 50.5% { opacity: 1; }
-}
-
-@keyframes text-shadow-glitch {
- 0% {
- text-shadow:
- 1px 0 0 rgba(255,0,255,0.5),
- -1px 0 0 rgba(0,255,255,0.5);
- }
- 10% {
- text-shadow:
- -1px 0 0 rgba(255,0,255,0.5),
- 1px 0 0 rgba(0,255,255,0.5);
- }
- 11%, 100% {
- text-shadow: none;
- }
-}
-
-.controls {
- margin-top: 30px;
- display: flex;
- align-items: center;
- gap: 20px;
-}
-
-#new-literature-btn {
- background-color: #ff00ff;
- color: #fff;
- border: none;
- padding: 12px 25px;
- font-size: 1em;
- cursor: pointer;
- border-radius: 5px;
- text-transform: uppercase;
- font-weight: bold;
- transition: transform 0.2s, box-shadow 0.2s;
- box-shadow: 0 0 10px #ff00ff, 0 0 20px #ff00ff;
-}
-
-#new-literature-btn:hover {
- transform: scale(1.05);
- box-shadow: 0 0 15px #ff00ff, 0 0 30px #ff00ff;
-}
-
-#new-literature-btn:active {
- transform: scale(0.95);
-}
-
-/* Animation Toggle Switch */
-.switch-container {
- display: flex;
- align-items: center;
- gap: 10px;
- color: #aaa;
-}
-
-.switch {
- position: relative;
- display: inline-block;
- width: 50px;
- height: 24px;
-}
-
-.switch input {
- opacity: 0;
- width: 0;
- height: 0;
-}
-
-.slider {
- position: absolute;
- cursor: pointer;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-color: #ccc;
- transition: .4s;
-}
-
-.slider:before {
- position: absolute;
- content: "";
- height: 16px;
- width: 16px;
- left: 4px;
- bottom: 4px;
- background-color: white;
- transition: .4s;
-}
-
-input:checked + .slider {
- background-color: #ff00ff;
-}
-
-input:checked + .slider:before {
- transform: translateX(26px);
-}
-
-.slider.round {
- border-radius: 34px;
-}
-
-.slider.round:before {
- border-radius: 50%;
-}
-
-/* Glitch Overlay & Animations */
-#glitch-overlay {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- z-index: -1;
- pointer-events: none;
-}
-
-.body-animated #glitch-overlay {
- animation: color-shift 15s steps(1, end) infinite;
-}
-
-@keyframes color-shift {
- 0%, 100% { background: transparent; }
- 10% { background: rgba(255, 0, 0, 0.05); }
- 10.1% { background: transparent; }
- 20% { background: rgba(0, 255, 0, 0.05); }
- 20.1% { background: transparent; }
- 30% { background: rgba(0, 0, 255, 0.05); }
- 30.1% { background: transparent; }
-}
-
-.flicker-block {
- position: absolute;
- background: rgba(255, 255, 255, 0.1);
- opacity: 0;
-}
-
-.body-animated .flicker-block {
- animation: flicker 3s infinite;
-}
-
-@keyframes flicker {
- 0%, 100% { opacity: 0; }
- 50% { opacity: 1; }
-}
-
-/* Responsive Design */
-@media (max-width: 768px) {
- .content-card {
- padding: 20px;
- }
- #literature-text {
- font-size: 1em;
- }
- .controls {
- flex-direction: column;
- }
+.container {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ min-height: 100vh;
+ padding: 20px;
+ box-sizing: border-box;
+ position: relative;
+ z-index: 1;
+}
+
+.content-card {
+ background: rgba(20, 20, 20, 0.7);
+ border: none;
+ padding: 40px;
+ max-width: 600px;
+ width: 100%;
+ text-align: center;
+ backdrop-filter: blur(5px);
+ position: relative;
+ clip-path: polygon(2% 5%, 97% 0%, 100% 95%, 0% 100%);
+}
+
+.body-animated .content-card {
+ animation: tremble 0.4s infinite, glitch-shadow 1.5s steps(1, end) infinite;
+}
+
+@keyframes tremble {
+ 0% { clip-path: polygon(2% 5%, 97% 0%, 100% 95%, 0% 100%); }
+ 25% { clip-path: polygon(2% 5%, 98% 2%, 99% 100%, 1% 98%); }
+ 50% { clip-path: polygon(3% 4%, 96% 1%, 100% 96%, 2% 100%); }
+ 75% { clip-path: polygon(1% 6%, 97% 3%, 98% 95%, 0% 99%); }
+ 100% { clip-path: polygon(2% 5%, 97% 0%, 100% 95%, 0% 100%); }
+}
+
+@keyframes glitch-shadow {
+ 0% {
+ box-shadow:
+ 0 0 8px rgba(255, 0, 255, 0.5),
+ inset 0 0 8px rgba(255, 0, 255, 0.4);
+ }
+ 33% {
+ box-shadow:
+ 0 0 8px rgba(0, 255, 255, 0.5),
+ inset 0 0 8px rgba(0, 255, 255, 0.4);
+ }
+ 66% {
+ box-shadow:
+ 0 0 8px rgba(0, 255, 0, 0.5),
+ inset 0 0 8px rgba(0, 255, 0, 0.4);
+ }
+ 100% {
+ box-shadow:
+ 0 0 8px rgba(255, 0, 255, 0.5),
+ inset 0 0 8px rgba(255, 0, 255, 0.4);
+ }
+}
+
+#literature-text {
+ font-size: 1.2em;
+ line-height: 1.8;
+ min-height: 100px;
+ color: #e0e0e0;
+ text-shadow: 0 0 5px rgba(0, 255, 135, 0.5);
+ animation: text-flicker 15s linear infinite;
+}
+
+.body-animated #literature-text {
+ animation: text-flicker 15s linear infinite, text-shadow-glitch 2s steps(1, end) infinite;
+}
+
+@keyframes text-flicker {
+ 0%, 100% { opacity: 1; }
+ 50.0% { opacity: 0.95; }
+ 50.5% { opacity: 1; }
+}
+
+@keyframes text-shadow-glitch {
+ 0% {
+ text-shadow:
+ 1px 0 0 rgba(255,0,255,0.5),
+ -1px 0 0 rgba(0,255,255,0.5);
+ }
+ 10% {
+ text-shadow:
+ -1px 0 0 rgba(255,0,255,0.5),
+ 1px 0 0 rgba(0,255,255,0.5);
+ }
+ 11%, 100% {
+ text-shadow: none;
+ }
+}
+
+.controls {
+ margin-top: 30px;
+ display: flex;
+ align-items: center;
+ gap: 20px;
+}
+
+#new-literature-btn {
+ background-color: #ff00ff;
+ color: #fff;
+ border: none;
+ padding: 12px 25px;
+ font-size: 1em;
+ cursor: pointer;
+ border-radius: 5px;
+ text-transform: uppercase;
+ font-weight: bold;
+ transition: transform 0.2s, box-shadow 0.2s;
+ box-shadow: 0 0 10px #ff00ff, 0 0 20px #ff00ff;
+}
+
+#new-literature-btn:hover {
+ transform: scale(1.05);
+ box-shadow: 0 0 15px #ff00ff, 0 0 30px #ff00ff;
+}
+
+#new-literature-btn:active {
+ transform: scale(0.95);
+}
+
+/* Animation Toggle Switch */
+.switch-container {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ color: #aaa;
+}
+
+.switch {
+ position: relative;
+ display: inline-block;
+ width: 50px;
+ height: 24px;
+}
+
+.switch input {
+ opacity: 0;
+ width: 0;
+ height: 0;
+}
+
+.slider {
+ position: absolute;
+ cursor: pointer;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background-color: #ccc;
+ transition: .4s;
+}
+
+.slider:before {
+ position: absolute;
+ content: "";
+ height: 16px;
+ width: 16px;
+ left: 4px;
+ bottom: 4px;
+ background-color: white;
+ transition: .4s;
+}
+
+input:checked + .slider {
+ background-color: #ff00ff;
+}
+
+input:checked + .slider:before {
+ transform: translateX(26px);
+}
+
+.slider.round {
+ border-radius: 34px;
+}
+
+.slider.round:before {
+ border-radius: 50%;
+}
+
+/* Glitch Overlay & Animations */
+#glitch-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: -1;
+ pointer-events: none;
+}
+
+.body-animated #glitch-overlay {
+ animation: color-shift 15s steps(1, end) infinite;
+}
+
+@keyframes color-shift {
+ 0%, 100% { background: transparent; }
+ 10% { background: rgba(255, 0, 0, 0.05); }
+ 10.1% { background: transparent; }
+ 20% { background: rgba(0, 255, 0, 0.05); }
+ 20.1% { background: transparent; }
+ 30% { background: rgba(0, 0, 255, 0.05); }
+ 30.1% { background: transparent; }
+}
+
+.flicker-block {
+ position: absolute;
+ background: rgba(255, 255, 255, 0.1);
+ opacity: 0;
+}
+
+.body-animated .flicker-block {
+ animation: flicker 3s infinite;
+}
+
+@keyframes flicker {
+ 0%, 100% { opacity: 0; }
+ 50% { opacity: 1; }
+}
+
+/* Responsive Design */
+@media (max-width: 768px) {
+ .content-card {
+ padding: 20px;
+ }
+ #literature-text {
+ font-size: 1em;
+ }
+ .controls {
+ flex-direction: column;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/index.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/index.html
index 5af98657..c852d74c 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/index.html
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/index.html
@@ -1,34 +1,34 @@
-
-
-
-
-
- 随机发病文学
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ 随机发病文学
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/js/script.js b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/js/script.js
index f4901b06..765be465 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/js/script.js
@@ -1,147 +1,147 @@
-document.addEventListener('DOMContentLoaded', () => {
- const literatureTextElem = document.getElementById('literature-text');
- const newLiteratureBtn = document.getElementById('new-literature-btn');
- const animationToggle = document.getElementById('animation-toggle');
- const bgContainer = document.getElementById('bg-container');
- const body = document.body;
-
- const apiEndpoints = [
- 'https://60s.api.shumengya.top/v2/fabing',
- // Add fallback APIs here if available
- ];
-
- let currentApiIndex = 0;
-
- async function fetchLiterature() {
- literatureTextElem.textContent = '正在卖力发疯中...';
- literatureTextElem.style.opacity = '0.5';
-
- try {
- const response = await fetch(apiEndpoints[currentApiIndex]);
- if (!response.ok) {
- throw new Error('Network response was not ok');
- }
- const data = await response.json();
- if (data.code === 200) {
- literatureTextElem.textContent = data.data.saying;
- } else {
- throw new Error('API returned an error');
- }
- } catch (error) {
- console.error('Fetch error:', error);
- currentApiIndex = (currentApiIndex + 1) % apiEndpoints.length;
- if (currentApiIndex !== 0) {
- fetchLiterature(); // Retry with the next API
- } else {
- literatureTextElem.textContent = '疯不起来了,请稍后再试。';
- }
- } finally {
- literatureTextElem.style.opacity = '1';
- }
- }
-
- function createFloatingEmojis() {
- const existingEmojis = bgContainer.querySelectorAll('.floating-emoji');
- existingEmojis.forEach(e => e.remove());
-
- const emojis = ['🤯', '😵', '🤪', '🥴', '🤡', '👹', '👻', '💀', '💥', '🔥', '🌪️', '😵💫'];
- const animationNames = ['float-top-to-bottom', 'float-bottom-to-top', 'float-left-to-right', 'float-right-to-left'];
- const emojiCount = 25;
-
- for (let i = 0; i < emojiCount; i++) {
- const emojiEl = document.createElement('div');
- emojiEl.className = 'floating-emoji';
- emojiEl.textContent = emojis[Math.floor(Math.random() * emojis.length)];
-
- const animationName = animationNames[Math.floor(Math.random() * animationNames.length)];
- emojiEl.style.animationName = animationName;
- emojiEl.style.animationDuration = `${Math.random() * 10 + 15}s`; // 15-25 seconds
- emojiEl.style.animationDelay = `${Math.random() * 20}s`;
- emojiEl.style.fontSize = `${Math.random() * 20 + 20}px`;
-
- // Set initial position based on animation direction
- if (animationName.includes('top') || animationName.includes('bottom')) { // Vertical movement
- emojiEl.style.left = `${Math.random() * 100}vw`;
- } else { // Horizontal movement
- emojiEl.style.top = `${Math.random() * 100}vh`;
- }
-
- bgContainer.appendChild(emojiEl);
- }
- }
-
- function createFragments() {
- const existingFragments = bgContainer.querySelectorAll('.text-fragment');
- existingFragments.forEach(f => f.remove());
-
- const fragments = ['我', '疯', '了', '?', '!', '…', '救命', '为什么', '好烦', '啊啊啊'];
- for (let i = 0; i < 20; i++) {
- const frag = document.createElement('div');
- frag.className = 'text-fragment';
- frag.textContent = fragments[Math.floor(Math.random() * fragments.length)];
- frag.style.top = `${Math.random() * 100}%`;
- frag.style.left = `${Math.random() * 100}%`;
- frag.style.animationDelay = `${Math.random() * 15}s`;
- frag.style.fontSize = `${Math.random() * 12 + 12}px`;
- bgContainer.appendChild(frag);
- }
- }
-
- function createCracks() {
- for (let i = 0; i < 2; i++) {
- const crack = document.createElement('div');
- crack.className = 'screen-crack';
- crack.style.top = `${Math.random() * 80}%`;
- crack.style.left = `${Math.random() * 80}%`;
- crack.style.transform = `rotate(${Math.random() * 360}deg)`;
- crack.style.animationDelay = `${Math.random() * 25}s`;
- bgContainer.appendChild(crack);
- }
- }
-
- function createFlickerBlocks() {
- const glitchOverlay = document.getElementById('glitch-overlay');
- for (let i = 0; i < 3; i++) {
- const block = document.createElement('div');
- block.className = 'flicker-block';
- block.style.width = `${Math.random() * 100 + 50}px`;
- block.style.height = `${Math.random() * 100 + 50}px`;
- block.style.top = `${Math.random() * 90}%`;
- block.style.left = `${Math.random() * 90}%`;
- block.style.animationDuration = `${Math.random() * 2 + 2}s`;
- block.style.animationDelay = `${Math.random() * 3}s`;
- glitchOverlay.appendChild(block);
- }
- }
-
- function toggleAnimations() {
- if (animationToggle.checked) {
- body.classList.add('body-animated');
- } else {
- body.classList.remove('body-animated');
- }
- }
-
- document.addEventListener('mousemove', (e) => {
- if (!animationToggle.checked) return;
- const x = (window.innerWidth / 2) - e.pageX;
- const y = (window.innerHeight / 2) - e.pageY;
- bgContainer.style.transform = `translateX(${x / 50}px) translateY(${y / 50}px)`;
- });
-
- newLiteratureBtn.addEventListener('click', fetchLiterature);
- animationToggle.addEventListener('change', toggleAnimations);
-
- // Initial setup
- createFloatingEmojis();
- createFragments();
- createCracks();
- createFlickerBlocks();
- toggleAnimations();
- fetchLiterature();
-
- window.addEventListener('resize', () => {
- createFloatingEmojis();
- createFragments();
- });
+document.addEventListener('DOMContentLoaded', () => {
+ const literatureTextElem = document.getElementById('literature-text');
+ const newLiteratureBtn = document.getElementById('new-literature-btn');
+ const animationToggle = document.getElementById('animation-toggle');
+ const bgContainer = document.getElementById('bg-container');
+ const body = document.body;
+
+ const apiEndpoints = [
+ 'https://60s.api.shumengya.top/v2/fabing',
+ // Add fallback APIs here if available
+ ];
+
+ let currentApiIndex = 0;
+
+ async function fetchLiterature() {
+ literatureTextElem.textContent = '正在卖力发疯中...';
+ literatureTextElem.style.opacity = '0.5';
+
+ try {
+ const response = await fetch(apiEndpoints[currentApiIndex]);
+ if (!response.ok) {
+ throw new Error('Network response was not ok');
+ }
+ const data = await response.json();
+ if (data.code === 200) {
+ literatureTextElem.textContent = data.data.saying;
+ } else {
+ throw new Error('API returned an error');
+ }
+ } catch (error) {
+ console.error('Fetch error:', error);
+ currentApiIndex = (currentApiIndex + 1) % apiEndpoints.length;
+ if (currentApiIndex !== 0) {
+ fetchLiterature(); // Retry with the next API
+ } else {
+ literatureTextElem.textContent = '疯不起来了,请稍后再试。';
+ }
+ } finally {
+ literatureTextElem.style.opacity = '1';
+ }
+ }
+
+ function createFloatingEmojis() {
+ const existingEmojis = bgContainer.querySelectorAll('.floating-emoji');
+ existingEmojis.forEach(e => e.remove());
+
+ const emojis = ['🤯', '😵', '🤪', '🥴', '🤡', '👹', '👻', '💀', '💥', '🔥', '🌪️', '😵💫'];
+ const animationNames = ['float-top-to-bottom', 'float-bottom-to-top', 'float-left-to-right', 'float-right-to-left'];
+ const emojiCount = 25;
+
+ for (let i = 0; i < emojiCount; i++) {
+ const emojiEl = document.createElement('div');
+ emojiEl.className = 'floating-emoji';
+ emojiEl.textContent = emojis[Math.floor(Math.random() * emojis.length)];
+
+ const animationName = animationNames[Math.floor(Math.random() * animationNames.length)];
+ emojiEl.style.animationName = animationName;
+ emojiEl.style.animationDuration = `${Math.random() * 10 + 15}s`; // 15-25 seconds
+ emojiEl.style.animationDelay = `${Math.random() * 20}s`;
+ emojiEl.style.fontSize = `${Math.random() * 20 + 20}px`;
+
+ // Set initial position based on animation direction
+ if (animationName.includes('top') || animationName.includes('bottom')) { // Vertical movement
+ emojiEl.style.left = `${Math.random() * 100}vw`;
+ } else { // Horizontal movement
+ emojiEl.style.top = `${Math.random() * 100}vh`;
+ }
+
+ bgContainer.appendChild(emojiEl);
+ }
+ }
+
+ function createFragments() {
+ const existingFragments = bgContainer.querySelectorAll('.text-fragment');
+ existingFragments.forEach(f => f.remove());
+
+ const fragments = ['我', '疯', '了', '?', '!', '…', '救命', '为什么', '好烦', '啊啊啊'];
+ for (let i = 0; i < 20; i++) {
+ const frag = document.createElement('div');
+ frag.className = 'text-fragment';
+ frag.textContent = fragments[Math.floor(Math.random() * fragments.length)];
+ frag.style.top = `${Math.random() * 100}%`;
+ frag.style.left = `${Math.random() * 100}%`;
+ frag.style.animationDelay = `${Math.random() * 15}s`;
+ frag.style.fontSize = `${Math.random() * 12 + 12}px`;
+ bgContainer.appendChild(frag);
+ }
+ }
+
+ function createCracks() {
+ for (let i = 0; i < 2; i++) {
+ const crack = document.createElement('div');
+ crack.className = 'screen-crack';
+ crack.style.top = `${Math.random() * 80}%`;
+ crack.style.left = `${Math.random() * 80}%`;
+ crack.style.transform = `rotate(${Math.random() * 360}deg)`;
+ crack.style.animationDelay = `${Math.random() * 25}s`;
+ bgContainer.appendChild(crack);
+ }
+ }
+
+ function createFlickerBlocks() {
+ const glitchOverlay = document.getElementById('glitch-overlay');
+ for (let i = 0; i < 3; i++) {
+ const block = document.createElement('div');
+ block.className = 'flicker-block';
+ block.style.width = `${Math.random() * 100 + 50}px`;
+ block.style.height = `${Math.random() * 100 + 50}px`;
+ block.style.top = `${Math.random() * 90}%`;
+ block.style.left = `${Math.random() * 90}%`;
+ block.style.animationDuration = `${Math.random() * 2 + 2}s`;
+ block.style.animationDelay = `${Math.random() * 3}s`;
+ glitchOverlay.appendChild(block);
+ }
+ }
+
+ function toggleAnimations() {
+ if (animationToggle.checked) {
+ body.classList.add('body-animated');
+ } else {
+ body.classList.remove('body-animated');
+ }
+ }
+
+ document.addEventListener('mousemove', (e) => {
+ if (!animationToggle.checked) return;
+ const x = (window.innerWidth / 2) - e.pageX;
+ const y = (window.innerHeight / 2) - e.pageY;
+ bgContainer.style.transform = `translateX(${x / 50}px) translateY(${y / 50}px)`;
+ });
+
+ newLiteratureBtn.addEventListener('click', fetchLiterature);
+ animationToggle.addEventListener('change', toggleAnimations);
+
+ // Initial setup
+ createFloatingEmojis();
+ createFragments();
+ createCracks();
+ createFlickerBlocks();
+ toggleAnimations();
+ fetchLiterature();
+
+ window.addEventListener('resize', () => {
+ createFloatingEmojis();
+ createFragments();
+ });
});
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/返回接口.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/返回接口.json
index 4a6d180e..b06376f6 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机发病文学/返回接口.json
@@ -1,8 +1,8 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "index": 347,
- "duanzi": "我不想读书,主要是因为家里牛啊,猪啊羊啊都没人喂。"
- }
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "index": 347,
+ "duanzi": "我不想读书,主要是因为家里牛啊,猪啊羊啊都没人喂。"
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/css/style.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/css/style.css
index c6b6f0d6..5c5b82b4 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/css/style.css
@@ -1,251 +1,251 @@
-/* 随机唱歌音频 - 淡绿色清新风格样式 */
-
-/* 重置样式 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
- background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%);
- min-height: 100vh;
- color: #2d5016;
- line-height: 1.6;
- overflow-x: hidden;
-}
-
-.container {
- max-width: 900px;
- margin: 0 auto;
- padding: 20px;
-}
-
-/* 头部 */
-.header {
- text-align: center;
- margin-bottom: 20px;
- background: rgba(255, 255, 255, 0.85);
- border-radius: 20px;
- padding: 24px;
- box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08);
- backdrop-filter: blur(10px);
-}
-
-.header h1 {
- font-size: 2rem;
- color: #2d5016;
- margin-bottom: 10px;
- font-weight: 700;
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 12px;
-}
-
-.header p {
- color: #5a7c65;
- font-size: 1rem;
-}
-
-/* 用户卡片 */
-.user-card {
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 15px;
- background: rgba(255, 255, 255, 0.9);
- padding: 16px;
- border-radius: 15px;
- box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08);
- margin-bottom: 15px;
- text-align: center;
-}
-
-.avatar {
- width: 56px;
- height: 56px;
- border-radius: 50%;
- object-fit: cover;
- border: 3px solid rgba(129, 199, 132, 0.5);
-}
-
-.user-info {
- display: flex;
- flex-direction: column;
-}
-
-.nickname {
- font-weight: 700;
- font-size: 1.1rem;
- color: #2d5016;
-}
-
-.meta {
- color: #5a7c65;
- font-size: 0.9rem;
-}
-
-/* 歌曲信息 */
-.song-card {
- background: rgba(255, 255, 255, 0.9);
- padding: 16px;
- border-radius: 15px;
- box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08);
- margin-bottom: 15px;
- text-align: center;
-}
-
-.song-title {
- font-size: 1.2rem;
- font-weight: 700;
- margin-bottom: 8px;
- color: #1b5e20;
-}
-
-.song-meta {
- color: #5a7c65;
- font-size: 0.95rem;
- margin-bottom: 10px;
-}
-
-/* 歌词 */
-.lyrics {
- background: rgba(129, 199, 132, 0.1);
- border-radius: 12px;
- padding: 12px;
- max-height: 220px;
- overflow: auto;
-}
-
-.lyrics p {
- margin-bottom: 6px;
-}
-
-/* 音频播放器卡片 */
-.audio-card {
- background: rgba(255, 255, 255, 0.9);
- padding: 16px;
- border-radius: 15px;
- box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08);
- margin-bottom: 15px;
-}
-
-.audio-actions {
- display: flex;
- flex-direction: column;
- gap: 12px;
- align-items: center;
- margin-top: 10px;
-}
-
-.btn {
- background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%);
- color: white;
- border: none;
- padding: 10px 18px;
- border-radius: 10px;
- font-size: 0.95rem;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.25s ease;
- box-shadow: 0 4px 12px rgba(129, 199, 132, 0.35);
- text-decoration: none;
-}
-
-.btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 6px 18px rgba(129, 199, 132, 0.45);
-}
-
-.info {
- color: #5a7c65;
- font-size: 0.9rem;
-}
-
-/* 加载与错误 */
-.loading, .error {
- text-align: center;
- padding: 30px;
- background: rgba(255, 255, 255, 0.85);
- border-radius: 15px;
- box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08);
-}
-
-.spinner {
- width: 36px;
- height: 36px;
- border: 4px solid #e8f5e8;
- border-top: 4px solid #81c784;
- border-radius: 50%;
- animation: spin 1s linear infinite;
- margin: 0 auto 18px;
-}
-
-@keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-/* 动画 */
-.fade-in {
- animation: fadeIn 0.5s ease-in-out;
-}
-
-@keyframes fadeIn {
- from { opacity: 0; transform: translateY(10px); }
- to { opacity: 1; transform: translateY(0); }
-}
-
-/* 平板端适配 */
-@media (max-width: 1024px) and (min-width: 768px) {
- .container { padding: 16px; }
- .header h1 { font-size: 1.8rem; }
-}
-
-/* 手机端优先优化 */
-@media (max-width: 767px) {
- .container { padding: 12px; }
- .header { padding: 18px; }
- .header h1 { font-size: 1.6rem; gap: 8px; }
-
- .user-card {
- padding: 16px;
- flex-direction: column;
- text-align: center;
- }
-
- .avatar {
- width: 80px;
- height: 80px;
- margin-bottom: 8px;
- }
-
- .song-card, .audio-card {
- padding: 16px;
- }
-
- .lyrics {
- max-height: 180px;
- text-align: left;
- padding: 16px;
- }
-
- .audio-actions {
- flex-direction: column;
- gap: 15px;
- align-items: center;
- }
-
- .info {
- text-align: center;
- line-height: 1.8;
- }
-
- .btn {
- width: 100%;
- max-width: 200px;
- text-align: center;
- }
+/* 随机唱歌音频 - 淡绿色清新风格样式 */
+
+/* 重置样式 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%);
+ min-height: 100vh;
+ color: #2d5016;
+ line-height: 1.6;
+ overflow-x: hidden;
+}
+
+.container {
+ max-width: 900px;
+ margin: 0 auto;
+ padding: 20px;
+}
+
+/* 头部 */
+.header {
+ text-align: center;
+ margin-bottom: 20px;
+ background: rgba(255, 255, 255, 0.85);
+ border-radius: 20px;
+ padding: 24px;
+ box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08);
+ backdrop-filter: blur(10px);
+}
+
+.header h1 {
+ font-size: 2rem;
+ color: #2d5016;
+ margin-bottom: 10px;
+ font-weight: 700;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 12px;
+}
+
+.header p {
+ color: #5a7c65;
+ font-size: 1rem;
+}
+
+/* 用户卡片 */
+.user-card {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 15px;
+ background: rgba(255, 255, 255, 0.9);
+ padding: 16px;
+ border-radius: 15px;
+ box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08);
+ margin-bottom: 15px;
+ text-align: center;
+}
+
+.avatar {
+ width: 56px;
+ height: 56px;
+ border-radius: 50%;
+ object-fit: cover;
+ border: 3px solid rgba(129, 199, 132, 0.5);
+}
+
+.user-info {
+ display: flex;
+ flex-direction: column;
+}
+
+.nickname {
+ font-weight: 700;
+ font-size: 1.1rem;
+ color: #2d5016;
+}
+
+.meta {
+ color: #5a7c65;
+ font-size: 0.9rem;
+}
+
+/* 歌曲信息 */
+.song-card {
+ background: rgba(255, 255, 255, 0.9);
+ padding: 16px;
+ border-radius: 15px;
+ box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08);
+ margin-bottom: 15px;
+ text-align: center;
+}
+
+.song-title {
+ font-size: 1.2rem;
+ font-weight: 700;
+ margin-bottom: 8px;
+ color: #1b5e20;
+}
+
+.song-meta {
+ color: #5a7c65;
+ font-size: 0.95rem;
+ margin-bottom: 10px;
+}
+
+/* 歌词 */
+.lyrics {
+ background: rgba(129, 199, 132, 0.1);
+ border-radius: 12px;
+ padding: 12px;
+ max-height: 220px;
+ overflow: auto;
+}
+
+.lyrics p {
+ margin-bottom: 6px;
+}
+
+/* 音频播放器卡片 */
+.audio-card {
+ background: rgba(255, 255, 255, 0.9);
+ padding: 16px;
+ border-radius: 15px;
+ box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08);
+ margin-bottom: 15px;
+}
+
+.audio-actions {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ align-items: center;
+ margin-top: 10px;
+}
+
+.btn {
+ background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%);
+ color: white;
+ border: none;
+ padding: 10px 18px;
+ border-radius: 10px;
+ font-size: 0.95rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.25s ease;
+ box-shadow: 0 4px 12px rgba(129, 199, 132, 0.35);
+ text-decoration: none;
+}
+
+.btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 6px 18px rgba(129, 199, 132, 0.45);
+}
+
+.info {
+ color: #5a7c65;
+ font-size: 0.9rem;
+}
+
+/* 加载与错误 */
+.loading, .error {
+ text-align: center;
+ padding: 30px;
+ background: rgba(255, 255, 255, 0.85);
+ border-radius: 15px;
+ box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08);
+}
+
+.spinner {
+ width: 36px;
+ height: 36px;
+ border: 4px solid #e8f5e8;
+ border-top: 4px solid #81c784;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ margin: 0 auto 18px;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+/* 动画 */
+.fade-in {
+ animation: fadeIn 0.5s ease-in-out;
+}
+
+@keyframes fadeIn {
+ from { opacity: 0; transform: translateY(10px); }
+ to { opacity: 1; transform: translateY(0); }
+}
+
+/* 平板端适配 */
+@media (max-width: 1024px) and (min-width: 768px) {
+ .container { padding: 16px; }
+ .header h1 { font-size: 1.8rem; }
+}
+
+/* 手机端优先优化 */
+@media (max-width: 767px) {
+ .container { padding: 12px; }
+ .header { padding: 18px; }
+ .header h1 { font-size: 1.6rem; gap: 8px; }
+
+ .user-card {
+ padding: 16px;
+ flex-direction: column;
+ text-align: center;
+ }
+
+ .avatar {
+ width: 80px;
+ height: 80px;
+ margin-bottom: 8px;
+ }
+
+ .song-card, .audio-card {
+ padding: 16px;
+ }
+
+ .lyrics {
+ max-height: 180px;
+ text-align: left;
+ padding: 16px;
+ }
+
+ .audio-actions {
+ flex-direction: column;
+ gap: 15px;
+ align-items: center;
+ }
+
+ .info {
+ text-align: center;
+ line-height: 1.8;
+ }
+
+ .btn {
+ width: 100%;
+ max-width: 200px;
+ text-align: center;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/index.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/index.html
index 3134b76d..79f8f821 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/index.html
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/index.html
@@ -1,67 +1,67 @@
-
-
-
-
-
-
- 随机唱歌音频 - 60s API 集合
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
![用户头像]()
-
-
-
-
-
-
-
-
-
-
-
-
- ❤ 喜欢:
-
- · ⏱ 时长:
--:--
- · 🗓 发布:
-
- · 🔗
查看原帖
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+ 随机唱歌音频 - 60s API 集合
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
![用户头像]()
+
+
+
+
+
+
+
+
+
+
+
+
+ ❤ 喜欢:
-
+ · ⏱ 时长:
--:--
+ · 🗓 发布:
-
+ · 🔗
查看原帖
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/js/script.js b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/js/script.js
index a6ec7c07..ed079964 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/js/script.js
@@ -1,252 +1,252 @@
-// 随机唱歌音频 页面脚本
-(function () {
- 'use strict';
-
- const API = {
- endpoints: [],
- currentIndex: 0,
- params: {
- encoding: 'json'
- },
- localFallback: '返回接口.json',
- // 初始化API接口列表
- async init() {
- try {
- const res = await fetch('./接口集合.json');
- const endpoints = await res.json();
- this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/changya`);
- } catch (e) {
- // 如果无法加载接口集合,使用默认接口
- this.endpoints = ['https://60s.api.shumengya.top/v2/changya'];
- }
- },
- // 获取当前接口URL
- getCurrentUrl() {
- if (this.endpoints.length === 0) return null;
- const url = new URL(this.endpoints[this.currentIndex]);
- Object.entries(this.params).forEach(([k, v]) => url.searchParams.append(k, v));
- return url.toString();
- },
- // 切换到下一个接口
- switchToNext() {
- this.currentIndex = (this.currentIndex + 1) % this.endpoints.length;
- return this.currentIndex < this.endpoints.length;
- },
- // 重置到第一个接口
- reset() {
- this.currentIndex = 0;
- }
- };
-
- // DOM 元素引用
- const els = {
- loading: null,
- error: null,
- container: null,
- avatar: null,
- nickname: null,
- gender: null,
- songTitle: null,
- songMeta: null,
- lyrics: null,
- audio: null,
- likeCount: null,
- publishTime: null,
- link: null,
- refreshBtn: null,
- };
-
- function initDom() {
- els.loading = document.getElementById('loading');
- els.error = document.getElementById('error');
- els.container = document.getElementById('content');
-
- els.avatar = document.getElementById('avatar');
- els.nickname = document.getElementById('nickname');
- els.gender = document.getElementById('gender');
- els.songTitle = document.getElementById('song-title');
- els.songMeta = document.getElementById('song-meta');
- els.lyrics = document.getElementById('lyrics');
-
- els.audio = document.getElementById('audio');
- els.likeCount = document.getElementById('like-count');
- els.publishTime = document.getElementById('publish-time');
- els.link = document.getElementById('link');
- els.refreshBtn = document.getElementById('refresh-btn');
- }
-
- function showLoading() {
- els.loading.style.display = 'block';
- els.error.style.display = 'none';
- els.container.style.display = 'none';
- }
-
- function showError(msg) {
- els.loading.style.display = 'none';
- els.error.style.display = 'block';
- els.container.style.display = 'none';
- els.error.querySelector('p').textContent = msg || '获取数据失败,请稍后重试';
- }
-
- function showContent() {
- els.loading.style.display = 'none';
- els.error.style.display = 'none';
- els.container.style.display = 'block';
- }
-
- function formatDuration(ms) {
- if (!ms && ms !== 0) return '';
- const totalSeconds = Math.floor(ms / 1000);
- const m = Math.floor(totalSeconds / 60).toString().padStart(2, '0');
- const s = (totalSeconds % 60).toString().padStart(2, '0');
- return `${m}:${s}`;
- }
-
- function safeText(text) {
- const div = document.createElement('div');
- div.textContent = text == null ? '' : String(text);
- return div.innerHTML;
- }
-
- async function fetchFromAPI() {
- // 初始化API接口列表
- await API.init();
-
- // 重置API索引到第一个接口
- API.reset();
-
- // 尝试所有API接口
- for (let i = 0; i < API.endpoints.length; i++) {
- try {
- const url = API.getCurrentUrl();
- console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`);
-
- const resp = await fetch(url, {
- cache: 'no-store',
- timeout: 10000 // 10秒超时
- });
-
- if (!resp.ok) {
- throw new Error(`HTTP ${resp.status}: ${resp.statusText}`);
- }
-
- const data = await resp.json();
-
- if (data && data.code === 200) {
- console.log(`接口 ${i + 1} 请求成功`);
- return data;
- }
-
- throw new Error(data && data.message ? data.message : '接口返回异常');
-
- } catch (e) {
- console.warn(`接口 ${i + 1} 失败:`, e.message);
-
- // 如果不是最后一个接口,切换到下一个
- if (i < API.endpoints.length - 1) {
- API.switchToNext();
- continue;
- }
-
- // 所有接口都失败了
- console.warn('所有远程接口都失败,尝试本地数据');
- return null;
- }
- }
- }
-
- async function fetchFromLocal() {
- try {
- const resp = await fetch(API.localFallback + `?t=${Date.now()}`);
- if (!resp.ok) throw new Error(`本地文件HTTP ${resp.status}`);
- const data = await resp.json();
- return data;
- } catch (e) {
- console.error('读取本地返回接口.json失败:', e);
- return null;
- }
- }
-
- function render(data) {
- const d = data?.data || {};
- const user = d.user || {};
- const song = d.song || {};
- const audio = d.audio || {};
-
- // 用户信息
- els.avatar.src = user.avatar_url || '';
- els.avatar.alt = (user.nickname || '用户') + ' 头像';
- els.nickname.textContent = user.nickname || '未知用户';
- els.gender.textContent = user.gender === 'female' ? '女' : user.gender === 'male' ? '男' : '未知';
-
- // 歌曲信息
- els.songTitle.textContent = song.name || '未知歌曲';
- els.songMeta.textContent = song.singer ? `演唱:${song.singer}` : '';
-
- els.lyrics.innerHTML = '';
- if (Array.isArray(song.lyrics)) {
- const frag = document.createDocumentFragment();
- song.lyrics.forEach(line => {
- const p = document.createElement('p');
- p.innerHTML = safeText(line);
- frag.appendChild(p);
- });
- els.lyrics.appendChild(frag);
- }
-
- // 音频
- els.audio.src = audio.url || '';
- els.audio.preload = 'none';
-
- // 其他信息
- els.likeCount.textContent = typeof audio.like_count === 'number' ? audio.like_count : '-';
- const publish = audio.publish || (audio.publish_at ? new Date(audio.publish_at).toLocaleString() : '');
- els.publishTime.textContent = publish;
- els.link.href = audio.link || '#';
- els.link.target = '_blank';
-
- // 时长信息
- const durationEl = document.getElementById('duration');
- durationEl.textContent = formatDuration(audio.duration);
-
- showContent();
- }
-
- async function load() {
- showLoading();
- try {
- // 先尝试远程API
- const data = await fetchFromAPI();
- if (data) {
- render(data);
- return;
- }
-
- // 远程API失败,尝试本地数据
- const localData = await fetchFromLocal();
- if (localData) {
- render(localData);
- return;
- }
-
- // 都失败了
- showError('获取数据失败,请稍后重试');
- } catch (e) {
- console.error('加载数据时发生错误:', e);
- showError('获取数据失败,请稍后重试');
- }
- }
-
- function bindEvents() {
- if (els.refreshBtn) {
- els.refreshBtn.addEventListener('click', load);
- }
- // 快捷键 Ctrl+R 刷新(不拦截浏览器默认刷新)
- }
-
- document.addEventListener('DOMContentLoaded', () => {
- initDom();
- bindEvents();
- load();
- });
+// 随机唱歌音频 页面脚本
+(function () {
+ 'use strict';
+
+ const API = {
+ endpoints: [],
+ currentIndex: 0,
+ params: {
+ encoding: 'json'
+ },
+ localFallback: '返回接口.json',
+ // 初始化API接口列表
+ async init() {
+ try {
+ const res = await fetch('./接口集合.json');
+ const endpoints = await res.json();
+ this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/changya`);
+ } catch (e) {
+ // 如果无法加载接口集合,使用默认接口
+ this.endpoints = ['https://60s.api.shumengya.top/v2/changya'];
+ }
+ },
+ // 获取当前接口URL
+ getCurrentUrl() {
+ if (this.endpoints.length === 0) return null;
+ const url = new URL(this.endpoints[this.currentIndex]);
+ Object.entries(this.params).forEach(([k, v]) => url.searchParams.append(k, v));
+ return url.toString();
+ },
+ // 切换到下一个接口
+ switchToNext() {
+ this.currentIndex = (this.currentIndex + 1) % this.endpoints.length;
+ return this.currentIndex < this.endpoints.length;
+ },
+ // 重置到第一个接口
+ reset() {
+ this.currentIndex = 0;
+ }
+ };
+
+ // DOM 元素引用
+ const els = {
+ loading: null,
+ error: null,
+ container: null,
+ avatar: null,
+ nickname: null,
+ gender: null,
+ songTitle: null,
+ songMeta: null,
+ lyrics: null,
+ audio: null,
+ likeCount: null,
+ publishTime: null,
+ link: null,
+ refreshBtn: null,
+ };
+
+ function initDom() {
+ els.loading = document.getElementById('loading');
+ els.error = document.getElementById('error');
+ els.container = document.getElementById('content');
+
+ els.avatar = document.getElementById('avatar');
+ els.nickname = document.getElementById('nickname');
+ els.gender = document.getElementById('gender');
+ els.songTitle = document.getElementById('song-title');
+ els.songMeta = document.getElementById('song-meta');
+ els.lyrics = document.getElementById('lyrics');
+
+ els.audio = document.getElementById('audio');
+ els.likeCount = document.getElementById('like-count');
+ els.publishTime = document.getElementById('publish-time');
+ els.link = document.getElementById('link');
+ els.refreshBtn = document.getElementById('refresh-btn');
+ }
+
+ function showLoading() {
+ els.loading.style.display = 'block';
+ els.error.style.display = 'none';
+ els.container.style.display = 'none';
+ }
+
+ function showError(msg) {
+ els.loading.style.display = 'none';
+ els.error.style.display = 'block';
+ els.container.style.display = 'none';
+ els.error.querySelector('p').textContent = msg || '获取数据失败,请稍后重试';
+ }
+
+ function showContent() {
+ els.loading.style.display = 'none';
+ els.error.style.display = 'none';
+ els.container.style.display = 'block';
+ }
+
+ function formatDuration(ms) {
+ if (!ms && ms !== 0) return '';
+ const totalSeconds = Math.floor(ms / 1000);
+ const m = Math.floor(totalSeconds / 60).toString().padStart(2, '0');
+ const s = (totalSeconds % 60).toString().padStart(2, '0');
+ return `${m}:${s}`;
+ }
+
+ function safeText(text) {
+ const div = document.createElement('div');
+ div.textContent = text == null ? '' : String(text);
+ return div.innerHTML;
+ }
+
+ async function fetchFromAPI() {
+ // 初始化API接口列表
+ await API.init();
+
+ // 重置API索引到第一个接口
+ API.reset();
+
+ // 尝试所有API接口
+ for (let i = 0; i < API.endpoints.length; i++) {
+ try {
+ const url = API.getCurrentUrl();
+ console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`);
+
+ const resp = await fetch(url, {
+ cache: 'no-store',
+ timeout: 10000 // 10秒超时
+ });
+
+ if (!resp.ok) {
+ throw new Error(`HTTP ${resp.status}: ${resp.statusText}`);
+ }
+
+ const data = await resp.json();
+
+ if (data && data.code === 200) {
+ console.log(`接口 ${i + 1} 请求成功`);
+ return data;
+ }
+
+ throw new Error(data && data.message ? data.message : '接口返回异常');
+
+ } catch (e) {
+ console.warn(`接口 ${i + 1} 失败:`, e.message);
+
+ // 如果不是最后一个接口,切换到下一个
+ if (i < API.endpoints.length - 1) {
+ API.switchToNext();
+ continue;
+ }
+
+ // 所有接口都失败了
+ console.warn('所有远程接口都失败,尝试本地数据');
+ return null;
+ }
+ }
+ }
+
+ async function fetchFromLocal() {
+ try {
+ const resp = await fetch(API.localFallback + `?t=${Date.now()}`);
+ if (!resp.ok) throw new Error(`本地文件HTTP ${resp.status}`);
+ const data = await resp.json();
+ return data;
+ } catch (e) {
+ console.error('读取本地返回接口.json失败:', e);
+ return null;
+ }
+ }
+
+ function render(data) {
+ const d = data?.data || {};
+ const user = d.user || {};
+ const song = d.song || {};
+ const audio = d.audio || {};
+
+ // 用户信息
+ els.avatar.src = user.avatar_url || '';
+ els.avatar.alt = (user.nickname || '用户') + ' 头像';
+ els.nickname.textContent = user.nickname || '未知用户';
+ els.gender.textContent = user.gender === 'female' ? '女' : user.gender === 'male' ? '男' : '未知';
+
+ // 歌曲信息
+ els.songTitle.textContent = song.name || '未知歌曲';
+ els.songMeta.textContent = song.singer ? `演唱:${song.singer}` : '';
+
+ els.lyrics.innerHTML = '';
+ if (Array.isArray(song.lyrics)) {
+ const frag = document.createDocumentFragment();
+ song.lyrics.forEach(line => {
+ const p = document.createElement('p');
+ p.innerHTML = safeText(line);
+ frag.appendChild(p);
+ });
+ els.lyrics.appendChild(frag);
+ }
+
+ // 音频
+ els.audio.src = audio.url || '';
+ els.audio.preload = 'none';
+
+ // 其他信息
+ els.likeCount.textContent = typeof audio.like_count === 'number' ? audio.like_count : '-';
+ const publish = audio.publish || (audio.publish_at ? new Date(audio.publish_at).toLocaleString() : '');
+ els.publishTime.textContent = publish;
+ els.link.href = audio.link || '#';
+ els.link.target = '_blank';
+
+ // 时长信息
+ const durationEl = document.getElementById('duration');
+ durationEl.textContent = formatDuration(audio.duration);
+
+ showContent();
+ }
+
+ async function load() {
+ showLoading();
+ try {
+ // 先尝试远程API
+ const data = await fetchFromAPI();
+ if (data) {
+ render(data);
+ return;
+ }
+
+ // 远程API失败,尝试本地数据
+ const localData = await fetchFromLocal();
+ if (localData) {
+ render(localData);
+ return;
+ }
+
+ // 都失败了
+ showError('获取数据失败,请稍后重试');
+ } catch (e) {
+ console.error('加载数据时发生错误:', e);
+ showError('获取数据失败,请稍后重试');
+ }
+ }
+
+ function bindEvents() {
+ if (els.refreshBtn) {
+ els.refreshBtn.addEventListener('click', load);
+ }
+ // 快捷键 Ctrl+R 刷新(不拦截浏览器默认刷新)
+ }
+
+ document.addEventListener('DOMContentLoaded', () => {
+ initDom();
+ bindEvents();
+ load();
+ });
})();
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/接口集合.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/接口集合.json
index 547b2771..42245813 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/接口集合.json
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/接口集合.json
@@ -1,3 +1,3 @@
-[
- "https://60s.api.shumengya.top"
-]
+[
+ "https://60s.api.shumengya.top"
+]
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/返回接口.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/返回接口.json
index d364f524..b52bbe66 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机唱歌音频/返回接口.json
@@ -1,32 +1,32 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "user": {
- "nickname": "𝑮𝑺_迷鹿_",
- "gender": "female",
- "avatar_url": "http://img-cdn.api.singduck.cn/user-img/6afbebcfae6144478c150d0c1d0d5899.jpg"
- },
- "song": {
- "name": "恶作剧",
- "singer": "王蓝茵",
- "lyrics": [
- "我想我会开始想念你",
- "可是我刚刚才遇见了你",
- "我怀疑这奇遇只是个恶作剧",
- "我想我已慢慢喜欢你",
- "因为我拥有爱情的勇气",
- "我任性投入你给的恶作剧",
- "你给的恶作剧"
- ]
- },
- "audio": {
- "url": "http://audio-cdn.api.singduck.cn/ugc/220929_965696173_b822a290c553.wav?auth_key=1755845643-0-0-4029539b73e17337dcac49cc4e0ecfcc",
- "duration": 35050,
- "like_count": 955,
- "link": "https://m.api.singduck.cn/user-piece/toGZlBfZbukck2sHb",
- "publish": "2022/09/29 18:33:51",
- "publish_at": 1664447631000
- }
- }
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "user": {
+ "nickname": "𝑮𝑺_迷鹿_",
+ "gender": "female",
+ "avatar_url": "http://img-cdn.api.singduck.cn/user-img/6afbebcfae6144478c150d0c1d0d5899.jpg"
+ },
+ "song": {
+ "name": "恶作剧",
+ "singer": "王蓝茵",
+ "lyrics": [
+ "我想我会开始想念你",
+ "可是我刚刚才遇见了你",
+ "我怀疑这奇遇只是个恶作剧",
+ "我想我已慢慢喜欢你",
+ "因为我拥有爱情的勇气",
+ "我任性投入你给的恶作剧",
+ "你给的恶作剧"
+ ]
+ },
+ "audio": {
+ "url": "http://audio-cdn.api.singduck.cn/ugc/220929_965696173_b822a290c553.wav?auth_key=1755845643-0-0-4029539b73e17337dcac49cc4e0ecfcc",
+ "duration": 35050,
+ "like_count": 955,
+ "link": "https://m.api.singduck.cn/user-piece/toGZlBfZbukck2sHb",
+ "publish": "2022/09/29 18:33:51",
+ "publish_at": 1664447631000
+ }
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/css/background.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/css/background.css
index 38d40031..25ad9632 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/css/background.css
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/css/background.css
@@ -1,36 +1,36 @@
-body {
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
- margin: 0;
- min-height: 100vh;
- overflow-x: hidden;
- transition: background 0.5s ease;
-}
-
-/* Hand-drawn Comic Theme Background - FRESH GREEN VERSION */
-body.theme-comic {
- background: linear-gradient(-45deg, #c8e6c9, #dcedc8, #f1f8e9, #e8f5e8);
- background-size: 400% 400%;
- animation: gradientBG 15s ease infinite;
-}
-
-@keyframes gradientBG {
- 0% {
- background-position: 0% 50%;
- }
- 50% {
- background-position: 100% 50%;
- }
- 100% {
- background-position: 0% 50%;
- }
-}
-
-/* Placeholder for Emoji Theme Background */
-body.theme-emoji {
- background-color: #fffde7;
-}
-
-/* Placeholder for Retro TV Theme Background */
-body.theme-retro {
- background-color: #3d2b1f;
+body {
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
+ margin: 0;
+ min-height: 100vh;
+ overflow-x: hidden;
+ transition: background 0.5s ease;
+}
+
+/* Hand-drawn Comic Theme Background - FRESH GREEN VERSION */
+body.theme-comic {
+ background: linear-gradient(-45deg, #c8e6c9, #dcedc8, #f1f8e9, #e8f5e8);
+ background-size: 400% 400%;
+ animation: gradientBG 15s ease infinite;
+}
+
+@keyframes gradientBG {
+ 0% {
+ background-position: 0% 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+ 100% {
+ background-position: 0% 50%;
+ }
+}
+
+/* Placeholder for Emoji Theme Background */
+body.theme-emoji {
+ background-color: #fffde7;
+}
+
+/* Placeholder for Retro TV Theme Background */
+body.theme-retro {
+ background-color: #3d2b1f;
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/css/style.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/css/style.css
index d8e4fa1e..ca721728 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/css/style.css
@@ -1,200 +1,200 @@
-@import url('https://fonts.googleapis.com/css2?family=Zhi+Mang+Xing&display=swap');
-
-/* --- General & Theme Switcher --- */
-.container {
- max-width: 600px;
- margin: 0 auto;
- padding: 20px;
- text-align: center;
-}
-
-.theme-switcher {
- position: fixed;
- top: 15px;
- right: 15px;
- display: flex;
- gap: 5px;
- background: rgba(255, 255, 255, 0.8);
- padding: 5px;
- border-radius: 20px;
- box-shadow: 0 2px 10px rgba(0,0,0,0.1);
- z-index: 100;
-}
-
-.theme-icon {
- width: 30px;
- height: 30px;
- border-radius: 50%;
- display: flex;
- justify-content: center;
- align-items: center;
- cursor: pointer;
- transition: all 0.2s ease;
- border: 2px solid transparent;
-}
-.theme-icon.active {
- border-color: #66bb6a;
- transform: scale(1.1);
-}
-
-/* --- Comic Theme Styles --- */
-.theme-comic header h1 {
- font-family: 'Zhi Mang Xing', cursive;
- font-size: 4em;
- color: #2e7d32; /* Fresh Green */
- text-shadow: 2px 2px 0 #fff;
- margin: 0.2em 0;
-}
-
-.theme-comic .divider {
- height: 3px;
- background: linear-gradient(90deg, #81c784, #a5d6a7, #c8e6c9, #66bb6a);
- border-radius: 3px;
- margin: 20px auto;
- width: 80%;
-}
-
-.theme-comic .joke-card {
- background: rgba(248, 255, 248, 0.9); /* Light green tinted white */
- backdrop-filter: blur(5px);
- border-radius: 15px;
- padding: 40px;
- min-height: 200px;
- box-shadow: 0 8px 25px rgba(102, 187, 106, 0.15);
- display: flex;
- justify-content: center;
- align-items: center;
- position: relative;
- margin-bottom: 20px;
- transform: rotate(-1deg);
- transition: transform 0.2s ease;
- border: 1px solid rgba(129, 199, 132, 0.3);
-}
-.theme-comic .joke-card:hover {
- transform: rotate(1deg) scale(1.02);
-}
-
-.theme-comic .joke-text {
- font-family: 'Zhi Mang Xing', cursive;
- font-size: 2em;
- line-height: 1.6;
- color: #1b5e20;
-}
-
-.theme-comic .new-joke-btn {
- background: linear-gradient(135deg, #66bb6a, #81c784); /* Fresh Green Gradient */
- color: white;
- font-family: 'Zhi Mang Xing', cursive;
- font-size: 2.5em;
- border: none;
- border-radius: 50px;
- padding: 10px 30px;
- cursor: pointer;
- box-shadow: 0 5px 0 #388e3c; /* Darker Green */
- transition: all 0.1s ease-in-out;
-}
-.theme-comic .new-joke-btn:active {
- transform: translateY(5px);
- box-shadow: none;
-}
-
-/* --- Loading Animation --- */
-.loading-container { display: none; }
-.loading-container.visible { display: block; }
-.loading-anim {
- height: 60px;
- width: 80px;
- margin: 0 auto 10px;
-}
-.book {
- transform-style: preserve-3d;
- transform: rotateY(-30deg);
- animation: flip 3s infinite;
-}
-.book, .book-page {
- width: 40px;
- height: 55px;
- position: absolute;
- left: 50%;
- top: 50%;
- margin-left: -20px;
- margin-top: -27.5px;
-}
-.book-page {
- background: #a5d6a7;
- border: 1px solid #66bb6a;
- border-radius: 3px;
- transform-origin: left;
-}
-.book-page:nth-child(1) { animation: flip-page 3s infinite; }
-.book-page:nth-child(2) { animation: flip-page 3s -1s infinite; }
-.book-page:nth-child(3) { animation: flip-page 3s -2s infinite; }
-
-@keyframes flip { 50% { transform: rotateY(30deg); } }
-@keyframes flip-page { 30%, 100% { transform: rotateY(180deg); } }
-
-/* --- Feedback Buttons & Animations --- */
-.feedback-buttons {
- display: flex;
- justify-content: center;
- gap: 15px;
- margin-bottom: 30px;
-}
-.feedback-btn {
- background: none;
- border: none;
- font-size: 2em;
- cursor: pointer;
- transition: transform 0.2s ease;
-}
-.feedback-btn:hover { transform: scale(1.2); }
-
-#animation-container {
- position: fixed;
- top: 0; left: 0; width: 100%; height: 100%;
- pointer-events: none; z-index: 999;
-}
-.confetti, .snowflake {
- position: absolute;
- animation-timing-function: linear;
- animation-iteration-count: infinite;
-}
-.confetti {
- width: 10px; height: 10px;
- animation-name: fall;
-}
-.snowflake {
- font-size: 20px; color: #fff;
- animation-name: fall;
-}
-@keyframes fall {
- from { transform: translateY(-10vh) rotate(0deg); }
- to { transform: translateY(110vh) rotate(360deg); }
-}
-
-.joke-card.absurd {
- animation: absurd-flash 0.5s 2;
-}
-@keyframes absurd-flash {
- 0%, 100% { border: 2px solid transparent; }
- 50% { border: 5px solid red; }
-}
-
-/* --- General Joke Text Visibility --- */
-.joke-text {
- opacity: 0;
- transform: scale(0.9);
- transition: opacity 0.4s ease, transform 0.4s ease;
-}
-.joke-text.visible {
- opacity: 1;
- transform: scale(1);
-}
-
-/* --- Responsive --- */
-@media (max-width: 600px) {
- .theme-comic header h1 { font-size: 3em; }
- .theme-comic .joke-card { padding: 25px; transform: rotate(0); }
- .theme-comic .joke-card:hover { transform: rotate(0); }
- .theme-comic .joke-text { font-size: 1.5em; }
+@import url('https://fonts.googleapis.com/css2?family=Zhi+Mang+Xing&display=swap');
+
+/* --- General & Theme Switcher --- */
+.container {
+ max-width: 600px;
+ margin: 0 auto;
+ padding: 20px;
+ text-align: center;
+}
+
+.theme-switcher {
+ position: fixed;
+ top: 15px;
+ right: 15px;
+ display: flex;
+ gap: 5px;
+ background: rgba(255, 255, 255, 0.8);
+ padding: 5px;
+ border-radius: 20px;
+ box-shadow: 0 2px 10px rgba(0,0,0,0.1);
+ z-index: 100;
+}
+
+.theme-icon {
+ width: 30px;
+ height: 30px;
+ border-radius: 50%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ cursor: pointer;
+ transition: all 0.2s ease;
+ border: 2px solid transparent;
+}
+.theme-icon.active {
+ border-color: #66bb6a;
+ transform: scale(1.1);
+}
+
+/* --- Comic Theme Styles --- */
+.theme-comic header h1 {
+ font-family: 'Zhi Mang Xing', cursive;
+ font-size: 4em;
+ color: #2e7d32; /* Fresh Green */
+ text-shadow: 2px 2px 0 #fff;
+ margin: 0.2em 0;
+}
+
+.theme-comic .divider {
+ height: 3px;
+ background: linear-gradient(90deg, #81c784, #a5d6a7, #c8e6c9, #66bb6a);
+ border-radius: 3px;
+ margin: 20px auto;
+ width: 80%;
+}
+
+.theme-comic .joke-card {
+ background: rgba(248, 255, 248, 0.9); /* Light green tinted white */
+ backdrop-filter: blur(5px);
+ border-radius: 15px;
+ padding: 40px;
+ min-height: 200px;
+ box-shadow: 0 8px 25px rgba(102, 187, 106, 0.15);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: relative;
+ margin-bottom: 20px;
+ transform: rotate(-1deg);
+ transition: transform 0.2s ease;
+ border: 1px solid rgba(129, 199, 132, 0.3);
+}
+.theme-comic .joke-card:hover {
+ transform: rotate(1deg) scale(1.02);
+}
+
+.theme-comic .joke-text {
+ font-family: 'Zhi Mang Xing', cursive;
+ font-size: 2em;
+ line-height: 1.6;
+ color: #1b5e20;
+}
+
+.theme-comic .new-joke-btn {
+ background: linear-gradient(135deg, #66bb6a, #81c784); /* Fresh Green Gradient */
+ color: white;
+ font-family: 'Zhi Mang Xing', cursive;
+ font-size: 2.5em;
+ border: none;
+ border-radius: 50px;
+ padding: 10px 30px;
+ cursor: pointer;
+ box-shadow: 0 5px 0 #388e3c; /* Darker Green */
+ transition: all 0.1s ease-in-out;
+}
+.theme-comic .new-joke-btn:active {
+ transform: translateY(5px);
+ box-shadow: none;
+}
+
+/* --- Loading Animation --- */
+.loading-container { display: none; }
+.loading-container.visible { display: block; }
+.loading-anim {
+ height: 60px;
+ width: 80px;
+ margin: 0 auto 10px;
+}
+.book {
+ transform-style: preserve-3d;
+ transform: rotateY(-30deg);
+ animation: flip 3s infinite;
+}
+.book, .book-page {
+ width: 40px;
+ height: 55px;
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ margin-left: -20px;
+ margin-top: -27.5px;
+}
+.book-page {
+ background: #a5d6a7;
+ border: 1px solid #66bb6a;
+ border-radius: 3px;
+ transform-origin: left;
+}
+.book-page:nth-child(1) { animation: flip-page 3s infinite; }
+.book-page:nth-child(2) { animation: flip-page 3s -1s infinite; }
+.book-page:nth-child(3) { animation: flip-page 3s -2s infinite; }
+
+@keyframes flip { 50% { transform: rotateY(30deg); } }
+@keyframes flip-page { 30%, 100% { transform: rotateY(180deg); } }
+
+/* --- Feedback Buttons & Animations --- */
+.feedback-buttons {
+ display: flex;
+ justify-content: center;
+ gap: 15px;
+ margin-bottom: 30px;
+}
+.feedback-btn {
+ background: none;
+ border: none;
+ font-size: 2em;
+ cursor: pointer;
+ transition: transform 0.2s ease;
+}
+.feedback-btn:hover { transform: scale(1.2); }
+
+#animation-container {
+ position: fixed;
+ top: 0; left: 0; width: 100%; height: 100%;
+ pointer-events: none; z-index: 999;
+}
+.confetti, .snowflake {
+ position: absolute;
+ animation-timing-function: linear;
+ animation-iteration-count: infinite;
+}
+.confetti {
+ width: 10px; height: 10px;
+ animation-name: fall;
+}
+.snowflake {
+ font-size: 20px; color: #fff;
+ animation-name: fall;
+}
+@keyframes fall {
+ from { transform: translateY(-10vh) rotate(0deg); }
+ to { transform: translateY(110vh) rotate(360deg); }
+}
+
+.joke-card.absurd {
+ animation: absurd-flash 0.5s 2;
+}
+@keyframes absurd-flash {
+ 0%, 100% { border: 2px solid transparent; }
+ 50% { border: 5px solid red; }
+}
+
+/* --- General Joke Text Visibility --- */
+.joke-text {
+ opacity: 0;
+ transform: scale(0.9);
+ transition: opacity 0.4s ease, transform 0.4s ease;
+}
+.joke-text.visible {
+ opacity: 1;
+ transform: scale(1);
+}
+
+/* --- Responsive --- */
+@media (max-width: 600px) {
+ .theme-comic header h1 { font-size: 3em; }
+ .theme-comic .joke-card { padding: 25px; transform: rotate(0); }
+ .theme-comic .joke-card:hover { transform: rotate(0); }
+ .theme-comic .joke-text { font-size: 1.5em; }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/index.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/index.html
index 833f79da..3c636665 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/index.html
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/index.html
@@ -1,57 +1,57 @@
-
-
-
-
-
- 段子游乐场
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ 段子游乐场
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/js/script.js b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/js/script.js
index 5fce3956..0dc8b1f9 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/js/script.js
@@ -1,122 +1,122 @@
-document.addEventListener('DOMContentLoaded', () => {
- // Elements
- const body = document.body;
- const jokeTextElem = document.getElementById('joke-text');
- const newJokeBtn = document.getElementById('new-joke-btn');
- const loadingContainer = document.querySelector('.loading-container');
- const animationContainer = document.getElementById('animation-container');
- const jokeCard = document.getElementById('joke-card');
-
- // API
- const apiBaseUrls = ["https://60s.api.shumengya.top"];
- const apiPath = "/v2/duanzi";
- let currentApiIndex = 0;
-
- // --- Core Functions ---
- const showLoading = (isLoading) => {
- loadingContainer.classList.toggle('visible', isLoading);
- if (isLoading) jokeTextElem.classList.remove('visible');
- };
-
- const displayJoke = (joke) => {
- jokeTextElem.textContent = joke;
- showLoading(false);
- setTimeout(() => jokeTextElem.classList.add('visible'), 50);
- };
-
- const fetchJoke = async () => {
- showLoading(true);
- try {
- const url = apiBaseUrls[currentApiIndex] + apiPath;
- const response = await fetch(url, { timeout: 5000 });
- if (!response.ok) throw new Error('Network response was not ok');
-
- const data = await response.json();
- if (data.code === 200 && data.data && data.data.duanzi) {
- displayJoke(data.data.duanzi);
- } else {
- throw new Error('Invalid data format');
- }
- } catch (error) {
- console.error(`API error with ${apiBaseUrls[currentApiIndex]}:`, error);
- currentApiIndex = (currentApiIndex + 1) % apiBaseUrls.length;
- if (currentApiIndex !== 0) {
- fetchJoke(); // Try next API
- } else {
- displayJoke('段子菌迷路了!点击‘再来一个’让它重新找路~');
- }
- }
- };
-
- // --- Theme Switcher ---
- const themeSwitcher = document.querySelector('.theme-switcher');
- themeSwitcher.addEventListener('click', (e) => {
- if (e.target.classList.contains('theme-icon')) {
- const theme = e.target.dataset.theme;
- body.className = theme; // Set body class to the selected theme
-
- // Update active icon
- themeSwitcher.querySelectorAll('.theme-icon').forEach(icon => icon.classList.remove('active'));
- e.target.classList.add('active');
-
- alert(`主题已切换!部分主题(如表情包、复古电视)将在后续阶段实现。`);
- }
- });
- // Set initial active theme icon
- themeSwitcher.querySelector(`[data-theme="${body.className}"]`).classList.add('active');
-
-
- // --- Feedback Buttons & Animations ---
- const btnLol = document.getElementById('btn-lol');
- const btnCold = document.getElementById('btn-cold');
- const btnSeen = document.getElementById('btn-seen');
- const btnAbsurd = document.getElementById('btn-absurd');
- const soundLol = document.getElementById('sound-lol');
- const soundCold = document.getElementById('sound-cold');
-
- btnLol.addEventListener('click', () => {
- soundLol.play();
- createParticles(20, 'confetti');
- });
-
- btnCold.addEventListener('click', () => {
- soundCold.play();
- createParticles(15, 'snowflake');
- });
-
- btnSeen.addEventListener('click', () => {
- displayJoke("原来你也听过!那再给你换个新鲜的~");
- setTimeout(fetchJoke, 1500);
- });
-
- btnAbsurd.addEventListener('click', () => {
- jokeCard.classList.add('absurd');
- setTimeout(() => jokeCard.classList.remove('absurd'), 1000);
- });
-
- function createParticles(count, type) {
- animationContainer.innerHTML = ''; // Clear previous
- const colors = ['#ffca28', '#ff7043', '#29b6f6', '#66bb6a'];
- for (let i = 0; i < count; i++) {
- const particle = document.createElement('div');
- particle.classList.add(type);
- if (type === 'confetti') {
- particle.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)];
- } else {
- particle.textContent = '❄️';
- }
- particle.style.left = `${Math.random() * 100}vw`;
- const duration = Math.random() * 3 + 2; // 2-5 seconds
- const delay = Math.random() * -duration; // Start at different times
- particle.style.animationDuration = `${duration}s`;
- particle.style.animationDelay = `${delay}s`;
- animationContainer.appendChild(particle);
- }
- }
-
- // --- Event Listeners ---
- newJokeBtn.addEventListener('click', fetchJoke);
-
- // --- Initial Load ---
- fetchJoke();
+document.addEventListener('DOMContentLoaded', () => {
+ // Elements
+ const body = document.body;
+ const jokeTextElem = document.getElementById('joke-text');
+ const newJokeBtn = document.getElementById('new-joke-btn');
+ const loadingContainer = document.querySelector('.loading-container');
+ const animationContainer = document.getElementById('animation-container');
+ const jokeCard = document.getElementById('joke-card');
+
+ // API
+ const apiBaseUrls = ["https://60s.api.shumengya.top"];
+ const apiPath = "/v2/duanzi";
+ let currentApiIndex = 0;
+
+ // --- Core Functions ---
+ const showLoading = (isLoading) => {
+ loadingContainer.classList.toggle('visible', isLoading);
+ if (isLoading) jokeTextElem.classList.remove('visible');
+ };
+
+ const displayJoke = (joke) => {
+ jokeTextElem.textContent = joke;
+ showLoading(false);
+ setTimeout(() => jokeTextElem.classList.add('visible'), 50);
+ };
+
+ const fetchJoke = async () => {
+ showLoading(true);
+ try {
+ const url = apiBaseUrls[currentApiIndex] + apiPath;
+ const response = await fetch(url, { timeout: 5000 });
+ if (!response.ok) throw new Error('Network response was not ok');
+
+ const data = await response.json();
+ if (data.code === 200 && data.data && data.data.duanzi) {
+ displayJoke(data.data.duanzi);
+ } else {
+ throw new Error('Invalid data format');
+ }
+ } catch (error) {
+ console.error(`API error with ${apiBaseUrls[currentApiIndex]}:`, error);
+ currentApiIndex = (currentApiIndex + 1) % apiBaseUrls.length;
+ if (currentApiIndex !== 0) {
+ fetchJoke(); // Try next API
+ } else {
+ displayJoke('段子菌迷路了!点击‘再来一个’让它重新找路~');
+ }
+ }
+ };
+
+ // --- Theme Switcher ---
+ const themeSwitcher = document.querySelector('.theme-switcher');
+ themeSwitcher.addEventListener('click', (e) => {
+ if (e.target.classList.contains('theme-icon')) {
+ const theme = e.target.dataset.theme;
+ body.className = theme; // Set body class to the selected theme
+
+ // Update active icon
+ themeSwitcher.querySelectorAll('.theme-icon').forEach(icon => icon.classList.remove('active'));
+ e.target.classList.add('active');
+
+ alert(`主题已切换!部分主题(如表情包、复古电视)将在后续阶段实现。`);
+ }
+ });
+ // Set initial active theme icon
+ themeSwitcher.querySelector(`[data-theme="${body.className}"]`).classList.add('active');
+
+
+ // --- Feedback Buttons & Animations ---
+ const btnLol = document.getElementById('btn-lol');
+ const btnCold = document.getElementById('btn-cold');
+ const btnSeen = document.getElementById('btn-seen');
+ const btnAbsurd = document.getElementById('btn-absurd');
+ const soundLol = document.getElementById('sound-lol');
+ const soundCold = document.getElementById('sound-cold');
+
+ btnLol.addEventListener('click', () => {
+ soundLol.play();
+ createParticles(20, 'confetti');
+ });
+
+ btnCold.addEventListener('click', () => {
+ soundCold.play();
+ createParticles(15, 'snowflake');
+ });
+
+ btnSeen.addEventListener('click', () => {
+ displayJoke("原来你也听过!那再给你换个新鲜的~");
+ setTimeout(fetchJoke, 1500);
+ });
+
+ btnAbsurd.addEventListener('click', () => {
+ jokeCard.classList.add('absurd');
+ setTimeout(() => jokeCard.classList.remove('absurd'), 1000);
+ });
+
+ function createParticles(count, type) {
+ animationContainer.innerHTML = ''; // Clear previous
+ const colors = ['#ffca28', '#ff7043', '#29b6f6', '#66bb6a'];
+ for (let i = 0; i < count; i++) {
+ const particle = document.createElement('div');
+ particle.classList.add(type);
+ if (type === 'confetti') {
+ particle.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)];
+ } else {
+ particle.textContent = '❄️';
+ }
+ particle.style.left = `${Math.random() * 100}vw`;
+ const duration = Math.random() * 3 + 2; // 2-5 seconds
+ const delay = Math.random() * -duration; // Start at different times
+ particle.style.animationDuration = `${duration}s`;
+ particle.style.animationDelay = `${delay}s`;
+ animationContainer.appendChild(particle);
+ }
+ }
+
+ // --- Event Listeners ---
+ newJokeBtn.addEventListener('click', fetchJoke);
+
+ // --- Initial Load ---
+ fetchJoke();
});
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/返回接口.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/返回接口.json
index 4a6d180e..b06376f6 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机搞笑段子/返回接口.json
@@ -1,8 +1,8 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "index": 347,
- "duanzi": "我不想读书,主要是因为家里牛啊,猪啊羊啊都没人喂。"
- }
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "index": 347,
+ "duanzi": "我不想读书,主要是因为家里牛啊,猪啊羊啊都没人喂。"
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机答案之书/返回接口.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机答案之书/返回接口.json
index 73cbc640..c3053e9b 100644
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机答案之书/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机答案之书/返回接口.json
@@ -1,10 +1,10 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "id": "63",
- "answer": "那不值得纠结",
- "answer_en": "It's not worth worrying about",
- "index": 62
- }
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "id": "63",
+ "answer": "那不值得纠结",
+ "answer_en": "It's not worth worrying about",
+ "index": 62
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/css/background.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/css/background.css
index 92d35e3c..3390a76c 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/css/background.css
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/css/background.css
@@ -1,26 +1,26 @@
-body {
- background: linear-gradient(-45deg, #f1f8e9, #e8f5e8, #c8e6c9, #dcedc8);
- background-size: 400% 400%;
- animation: gradientBG 20s ease infinite;
- color: #2e7d32;
- font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
- margin: 0;
- padding: 0;
- display: flex;
- justify-content: center;
- align-items: center;
- min-height: 100vh;
- overflow-x: hidden;
-}
-
-@keyframes gradientBG {
- 0% {
- background-position: 0% 50%;
- }
- 50% {
- background-position: 100% 50%;
- }
- 100% {
- background-position: 0% 50%;
- }
+body {
+ background: linear-gradient(-45deg, #f1f8e9, #e8f5e8, #c8e6c9, #dcedc8);
+ background-size: 400% 400%;
+ animation: gradientBG 20s ease infinite;
+ color: #2e7d32;
+ font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ min-height: 100vh;
+ overflow-x: hidden;
+}
+
+@keyframes gradientBG {
+ 0% {
+ background-position: 0% 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+ 100% {
+ background-position: 0% 50%;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/css/style.css b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/css/style.css
index c3bec4c0..5c6c9ad1 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/css/style.css
@@ -1,342 +1,342 @@
-.container {
- text-align: center;
- padding: 20px;
- max-width: 600px;
- width: 100%;
- box-sizing: border-box;
-}
-
-header h1 {
- font-size: 2.8em;
- color: #2e7d32;
- text-shadow: 0 0 10px #81c784, 0 0 20px #a5d6a7;
- margin-bottom: 0.2em;
-}
-
-header p {
- font-size: 1.2em;
- color: #388e3c;
- margin-bottom: 40px;
-}
-
-.crystal-ball-container {
- perspective: 1000px;
- margin-bottom: 40px;
-}
-
-.crystal-ball {
- width: 200px;
- height: 200px;
- background: radial-gradient(circle at 30% 30%, rgba(255, 255, 255, 0.6), rgba(200, 230, 201, 0.3));
- border-radius: 50%;
- margin: 0 auto;
- position: relative;
- box-shadow: 0 0 30px #81c784, 0 0 60px #66bb6a, inset 0 0 20px rgba(220, 255, 220, 0.3);
- animation: float 6s ease-in-out infinite;
- transform-style: preserve-3d;
-}
-
-.reflection {
- width: 80px;
- height: 40px;
- background: rgba(255, 255, 255, 0.3);
- border-radius: 50%;
- position: absolute;
- top: 20px;
- left: 40px;
- transform: rotate(-30deg);
- filter: blur(5px);
-}
-
-.swirl {
- position: absolute;
- top: 50%;
- left: 50%;
- width: 120%;
- height: 120%;
- background: linear-gradient(45deg, rgba(200, 230, 201, 0.2), rgba(129, 199, 132, 0.3));
- border-radius: 50%;
- animation: swirl 10s linear infinite;
- transform: translate(-50%, -50%);
-}
-
-@keyframes float {
- 0%, 100% { transform: translateY(0); }
- 50% { transform: translateY(-20px); }
-}
-
-@keyframes swirl {
- from { transform: translate(-50%, -50%) rotate(0deg); }
- to { transform: translate(-50%, -50%) rotate(360deg); }
-}
-
-.fortune-card {
- background: rgba(248, 255, 248, 0.8);
- border-radius: 15px;
- padding: 30px;
- margin-bottom: 30px;
- min-height: 120px;
- display: flex;
- justify-content: center;
- align-items: center;
- backdrop-filter: blur(10px);
- border: 1px solid rgba(129, 199, 132, 0.3);
- box-shadow: 0 8px 32px 0 rgba(102, 187, 106, 0.2);
- transition: opacity 0.5s ease-in-out;
-}
-
-.fortune-content {
- opacity: 0;
- transition: opacity 0.5s ease-in-out;
-}
-
-.fortune-content.visible {
- opacity: 1;
-}
-
-#luck-desc {
- font-size: 2em;
- color: #2e7d32;
- margin: 0 0 10px;
-}
-
-#luck-tip {
- font-size: 1.1em;
- color: #388e3c;
- margin: 0;
- padding-bottom: 20px; /* Add some space before the new details */
-}
-
-.fortune-details {
- display: flex;
- justify-content: space-around;
- margin-top: 20px;
- padding-top: 20px;
- border-top: 1px solid rgba(255, 255, 255, 0.2);
-}
-
-.detail-item {
- text-align: center;
-}
-
-.detail-item h3 {
- font-size: 0.9em;
- color: #66bb6a;
- margin: 0 0 5px;
- font-weight: normal;
-}
-
-.detail-item p {
- font-size: 1.2em;
- margin: 0;
- font-weight: bold;
-}
-
-#lucky-color {
- display: inline-block;
- width: 24px;
- height: 24px;
- border-radius: 50%;
- border: 2px solid white;
- box-shadow: 0 0 5px rgba(0, 0, 0, 0.5);
- /* Remove the text content */
- font-size: 0;
-}
-
-/* Tarot Card Styles */
-.tarot-container {
- margin-top: 40px;
- margin-bottom: 40px;
-}
-
-.tarot-container h2 {
- font-size: 1.5em;
- color: #2e7d32;
- text-shadow: 0 0 8px #81c784;
- margin-bottom: 20px;
-}
-
-.tarot-card-container {
- width: 180px;
- height: 280px;
- perspective: 1000px;
- margin: 0 auto;
- cursor: pointer;
-}
-
-.tarot-card-inner {
- position: relative;
- width: 100%;
- height: 100%;
- transition: transform 0.8s;
- transform-style: preserve-3d;
-}
-
-.tarot-card-container.flipped .tarot-card-inner {
- transform: rotateY(180deg);
-}
-
-.tarot-card-front,
-.tarot-card-back {
- position: absolute;
- width: 100%;
- height: 100%;
- -webkit-backface-visibility: hidden;
- backface-visibility: hidden;
- border-radius: 10px;
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
-}
-
-.tarot-card-back {
- background: linear-gradient(135deg, #66bb6a, #388e3c);
- border: 2px solid #81c784;
- display: flex;
- justify-content: center;
- align-items: center;
- font-size: 3em;
- color: #c8e6c9;
-}
-
-.tarot-card-back::after {
- content: '✧'; /* A simple star symbol */
- text-shadow: 0 0 10px #e8f5e8;
-}
-
-.tarot-card-front {
- background: linear-gradient(135deg, #4caf50, #66bb6a);
- border: 2px solid #81c784;
- color: white;
- transform: rotateY(180deg);
- padding: 20px;
- box-sizing: border-box;
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
-}
-
-#tarot-name {
- font-size: 1.4em;
- color: #e8f5e8;
- margin: 0 0 10px;
-}
-
-#tarot-interpretation {
- font-size: 0.9em;
- text-align: center;
- margin: 0;
-}
-
-/* Side Decorations */
-.side-decor {
- position: fixed;
- top: 0;
- bottom: 0;
- width: 15vw;
- height: 100vh;
- pointer-events: none;
- z-index: 0;
-}
-
-.left-decor {
- left: 0;
-}
-
-.right-decor {
- right: 0;
-}
-
-.decor-symbol {
- position: absolute;
- color: rgba(129, 199, 132, 0.5);
- text-shadow: 0 0 10px rgba(200, 230, 201, 0.7);
- animation: floatSymbol 20s infinite ease-in-out;
-}
-
-@keyframes floatSymbol {
- 0%, 100% {
- transform: translateY(0) rotate(0deg);
- opacity: 0;
- }
- 25%, 75% {
- opacity: 0.8;
- }
- 50% {
- transform: translateY(-20vh) rotate(180deg);
- opacity: 0.3;
- }
-}
-
-#get-fortune-btn {
- background: linear-gradient(45deg, #66bb6a, #4caf50);
- color: white;
- border: none;
- border-radius: 50px;
- padding: 15px 30px;
- font-size: 1.1em;
- cursor: pointer;
- transition: transform 0.2s, box-shadow 0.2s;
- box-shadow: 0 0 15px #81c784;
-}
-
-#get-fortune-btn:hover {
- transform: scale(1.05);
- box-shadow: 0 0 25px #a5d6a7;
-}
-
-#get-fortune-btn:active {
- transform: scale(0.98);
-}
-
-.loading-spinner {
- border: 4px solid rgba(129, 199, 132, 0.3);
- border-left-color: #66bb6a;
- border-radius: 50%;
- width: 40px;
- height: 40px;
- animation: spin 1s linear infinite;
- display: none; /* Hidden by default */
-}
-
-.loading-spinner.visible {
- display: block;
-}
-
-@keyframes spin {
- to { transform: rotate(360deg); }
-}
-
-footer {
- margin-top: 40px;
- color: rgba(46, 125, 50, 0.7);
-}
-
-/* Responsive Design */
-@media (max-width: 768px) {
- header h1 {
- font-size: 2.2em;
- }
- .crystal-ball {
- width: 150px;
- height: 150px;
- }
- .fortune-card {
- padding: 20px;
- }
- .fortune-details {
- flex-direction: column;
- gap: 15px;
- }
-
- .tarot-card-container {
- width: 150px;
- height: 233px;
- }
-}
-
-/* Hide side decor on smaller screens */
-@media (max-width: 1200px) {
- .side-decor {
- display: none;
- }
+.container {
+ text-align: center;
+ padding: 20px;
+ max-width: 600px;
+ width: 100%;
+ box-sizing: border-box;
+}
+
+header h1 {
+ font-size: 2.8em;
+ color: #2e7d32;
+ text-shadow: 0 0 10px #81c784, 0 0 20px #a5d6a7;
+ margin-bottom: 0.2em;
+}
+
+header p {
+ font-size: 1.2em;
+ color: #388e3c;
+ margin-bottom: 40px;
+}
+
+.crystal-ball-container {
+ perspective: 1000px;
+ margin-bottom: 40px;
+}
+
+.crystal-ball {
+ width: 200px;
+ height: 200px;
+ background: radial-gradient(circle at 30% 30%, rgba(255, 255, 255, 0.6), rgba(200, 230, 201, 0.3));
+ border-radius: 50%;
+ margin: 0 auto;
+ position: relative;
+ box-shadow: 0 0 30px #81c784, 0 0 60px #66bb6a, inset 0 0 20px rgba(220, 255, 220, 0.3);
+ animation: float 6s ease-in-out infinite;
+ transform-style: preserve-3d;
+}
+
+.reflection {
+ width: 80px;
+ height: 40px;
+ background: rgba(255, 255, 255, 0.3);
+ border-radius: 50%;
+ position: absolute;
+ top: 20px;
+ left: 40px;
+ transform: rotate(-30deg);
+ filter: blur(5px);
+}
+
+.swirl {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 120%;
+ height: 120%;
+ background: linear-gradient(45deg, rgba(200, 230, 201, 0.2), rgba(129, 199, 132, 0.3));
+ border-radius: 50%;
+ animation: swirl 10s linear infinite;
+ transform: translate(-50%, -50%);
+}
+
+@keyframes float {
+ 0%, 100% { transform: translateY(0); }
+ 50% { transform: translateY(-20px); }
+}
+
+@keyframes swirl {
+ from { transform: translate(-50%, -50%) rotate(0deg); }
+ to { transform: translate(-50%, -50%) rotate(360deg); }
+}
+
+.fortune-card {
+ background: rgba(248, 255, 248, 0.8);
+ border-radius: 15px;
+ padding: 30px;
+ margin-bottom: 30px;
+ min-height: 120px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ backdrop-filter: blur(10px);
+ border: 1px solid rgba(129, 199, 132, 0.3);
+ box-shadow: 0 8px 32px 0 rgba(102, 187, 106, 0.2);
+ transition: opacity 0.5s ease-in-out;
+}
+
+.fortune-content {
+ opacity: 0;
+ transition: opacity 0.5s ease-in-out;
+}
+
+.fortune-content.visible {
+ opacity: 1;
+}
+
+#luck-desc {
+ font-size: 2em;
+ color: #2e7d32;
+ margin: 0 0 10px;
+}
+
+#luck-tip {
+ font-size: 1.1em;
+ color: #388e3c;
+ margin: 0;
+ padding-bottom: 20px; /* Add some space before the new details */
+}
+
+.fortune-details {
+ display: flex;
+ justify-content: space-around;
+ margin-top: 20px;
+ padding-top: 20px;
+ border-top: 1px solid rgba(255, 255, 255, 0.2);
+}
+
+.detail-item {
+ text-align: center;
+}
+
+.detail-item h3 {
+ font-size: 0.9em;
+ color: #66bb6a;
+ margin: 0 0 5px;
+ font-weight: normal;
+}
+
+.detail-item p {
+ font-size: 1.2em;
+ margin: 0;
+ font-weight: bold;
+}
+
+#lucky-color {
+ display: inline-block;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ border: 2px solid white;
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.5);
+ /* Remove the text content */
+ font-size: 0;
+}
+
+/* Tarot Card Styles */
+.tarot-container {
+ margin-top: 40px;
+ margin-bottom: 40px;
+}
+
+.tarot-container h2 {
+ font-size: 1.5em;
+ color: #2e7d32;
+ text-shadow: 0 0 8px #81c784;
+ margin-bottom: 20px;
+}
+
+.tarot-card-container {
+ width: 180px;
+ height: 280px;
+ perspective: 1000px;
+ margin: 0 auto;
+ cursor: pointer;
+}
+
+.tarot-card-inner {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ transition: transform 0.8s;
+ transform-style: preserve-3d;
+}
+
+.tarot-card-container.flipped .tarot-card-inner {
+ transform: rotateY(180deg);
+}
+
+.tarot-card-front,
+.tarot-card-back {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ border-radius: 10px;
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
+}
+
+.tarot-card-back {
+ background: linear-gradient(135deg, #66bb6a, #388e3c);
+ border: 2px solid #81c784;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ font-size: 3em;
+ color: #c8e6c9;
+}
+
+.tarot-card-back::after {
+ content: '✧'; /* A simple star symbol */
+ text-shadow: 0 0 10px #e8f5e8;
+}
+
+.tarot-card-front {
+ background: linear-gradient(135deg, #4caf50, #66bb6a);
+ border: 2px solid #81c784;
+ color: white;
+ transform: rotateY(180deg);
+ padding: 20px;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+}
+
+#tarot-name {
+ font-size: 1.4em;
+ color: #e8f5e8;
+ margin: 0 0 10px;
+}
+
+#tarot-interpretation {
+ font-size: 0.9em;
+ text-align: center;
+ margin: 0;
+}
+
+/* Side Decorations */
+.side-decor {
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ width: 15vw;
+ height: 100vh;
+ pointer-events: none;
+ z-index: 0;
+}
+
+.left-decor {
+ left: 0;
+}
+
+.right-decor {
+ right: 0;
+}
+
+.decor-symbol {
+ position: absolute;
+ color: rgba(129, 199, 132, 0.5);
+ text-shadow: 0 0 10px rgba(200, 230, 201, 0.7);
+ animation: floatSymbol 20s infinite ease-in-out;
+}
+
+@keyframes floatSymbol {
+ 0%, 100% {
+ transform: translateY(0) rotate(0deg);
+ opacity: 0;
+ }
+ 25%, 75% {
+ opacity: 0.8;
+ }
+ 50% {
+ transform: translateY(-20vh) rotate(180deg);
+ opacity: 0.3;
+ }
+}
+
+#get-fortune-btn {
+ background: linear-gradient(45deg, #66bb6a, #4caf50);
+ color: white;
+ border: none;
+ border-radius: 50px;
+ padding: 15px 30px;
+ font-size: 1.1em;
+ cursor: pointer;
+ transition: transform 0.2s, box-shadow 0.2s;
+ box-shadow: 0 0 15px #81c784;
+}
+
+#get-fortune-btn:hover {
+ transform: scale(1.05);
+ box-shadow: 0 0 25px #a5d6a7;
+}
+
+#get-fortune-btn:active {
+ transform: scale(0.98);
+}
+
+.loading-spinner {
+ border: 4px solid rgba(129, 199, 132, 0.3);
+ border-left-color: #66bb6a;
+ border-radius: 50%;
+ width: 40px;
+ height: 40px;
+ animation: spin 1s linear infinite;
+ display: none; /* Hidden by default */
+}
+
+.loading-spinner.visible {
+ display: block;
+}
+
+@keyframes spin {
+ to { transform: rotate(360deg); }
+}
+
+footer {
+ margin-top: 40px;
+ color: rgba(46, 125, 50, 0.7);
+}
+
+/* Responsive Design */
+@media (max-width: 768px) {
+ header h1 {
+ font-size: 2.2em;
+ }
+ .crystal-ball {
+ width: 150px;
+ height: 150px;
+ }
+ .fortune-card {
+ padding: 20px;
+ }
+ .fortune-details {
+ flex-direction: column;
+ gap: 15px;
+ }
+
+ .tarot-card-container {
+ width: 150px;
+ height: 233px;
+ }
+}
+
+/* Hide side decor on smaller screens */
+@media (max-width: 1200px) {
+ .side-decor {
+ display: none;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/index.html b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/index.html
index 4214eeb4..fb64a251 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/index.html
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/index.html
@@ -1,71 +1,71 @@
-
-
-
-
-
- 水晶球占卜
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ 水晶球占卜
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/js/script.js b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/js/script.js
index 596b807a..5637b31c 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/js/script.js
@@ -1,170 +1,170 @@
-document.addEventListener('DOMContentLoaded', () => {
- const getFortuneBtn = document.getElementById('get-fortune-btn');
- const fortuneCard = document.getElementById('fortune-card');
- const fortuneContent = fortuneCard.querySelector('.fortune-content');
- const luckDescElem = document.getElementById('luck-desc');
- const luckTipElem = document.getElementById('luck-tip');
- const fortuneSummaryElem = document.getElementById('fortune-summary');
- const luckyColorElem = document.getElementById('lucky-color');
- const luckyNumberElem = document.getElementById('lucky-number');
- const loadingSpinner = fortuneCard.querySelector('.loading-spinner');
- const tarotCardContainer = document.getElementById('tarot-card');
- const tarotNameElem = document.getElementById('tarot-name');
- const tarotInterpretationElem = document.getElementById('tarot-interpretation');
-
- const apiBaseUrls = [
- "https://60s.api.shumengya.top",
- ];
- const apiPath = "/v2/luck";
-
- const mantras = [
- "顺其自然,皆是美好。",
- "相信直觉,它知道方向。",
- "每一次呼吸都是新的开始。",
- "心怀感恩,好运自来。",
- "拥抱变化,发现惊喜。",
- "你的能量,超乎想象。",
- "保持微笑,宇宙会回应你。"
- ];
-
- const tarotDeck = [
- { name: "愚者", interpretation: "新的开始,无限的潜力,天真和自由。勇敢地迈出第一步。" },
- { name: "魔术师", interpretation: "创造力,意志力,显化。你拥有实现目标所需的一切资源。" },
- { name: "女祭司", interpretation: "直觉,潜意识,神秘。倾听你内心的声音,智慧在你之内。" },
- { name: "皇后", interpretation: "丰饶,母性,创造。享受生活的美好,与自然和谐相处。" },
- { name: "皇帝", interpretation: "权威,结构,控制。建立秩序和纪律,掌控你的生活。" },
- { name: "教皇", interpretation: "传统,信仰,灵性指导。寻求智慧和知识,遵循传统。" },
- { name: "恋人", interpretation: "爱,和谐,选择。做出与你内心价值观一致的决定。" },
- { name: "战车", interpretation: "胜利,决心,控制。以坚定的意志力克服障碍,勇往直前。" },
- { name: "力量", interpretation: "勇气,内在力量,同情。用温柔和耐心驯服内心的野兽。" },
- { name: "隐士", interpretation: "内省,孤独,寻求真理。花时间独处,向内寻求答案。" },
- { name: "命运之轮", interpretation: "变化,命运,转折点。生活总在变化,顺应潮流。" },
- { name: "正义", interpretation: "公平,真理,因果。为你的行为负责,寻求平衡。" },
- { name: "倒吊人", interpretation: "新的视角,顺从,牺牲。放手,从不同的角度看问题。" },
- { name: "死神", interpretation: "结束,转变,新生。一个周期的结束是另一个周期的开始。" },
- { name: "节制", interpretation: "平衡,和谐,耐心。融合对立的力量,找到中间道路。" },
- { name: "恶魔", interpretation: "束缚,物质主义,诱惑。认识到你的束缚,并寻求解放。" },
- { name: "塔", interpretation: "突变,启示,解放。旧的结构正在崩塌,为新的结构让路。" },
- { name: "星星", interpretation: "希望,灵感,平静。在黑暗之后,总有希望的曙光。" },
- { name: "月亮", interpretation: "幻觉,恐惧,潜意识。面对你的恐惧,相信你的直觉。" },
- { name: "太阳", interpretation: "成功,喜悦,活力。拥抱光明,享受生活的乐趣。" },
- { name: "审判", interpretation: "觉醒,重生,评估。一个反思和更新的时刻。" },
- { name: "世界", interpretation: "完成,整合,成就。一个旅程的成功结束,庆祝你的成就。" }
- ];
-
- let currentApiIndex = 0;
-
- const showLoading = (isLoading) => {
- if (isLoading) {
- fortuneContent.classList.remove('visible');
- loadingSpinner.classList.add('visible');
- } else {
- loadingSpinner.classList.remove('visible');
- setTimeout(() => {
- fortuneContent.classList.add('visible');
- }, 100);
- }
- };
-
- const fetchFortune = async () => {
- showLoading(true);
- tarotCardContainer.classList.remove('flipped'); // Reset card on new fetch
-
- try {
- const url = apiBaseUrls[currentApiIndex] + apiPath;
- const response = await fetch(url, { timeout: 5000 });
- if (!response.ok) {
- throw new Error('Network response was not ok');
- }
- const data = await response.json();
-
- if (data.code === 200 && data.data) {
- updateFortune(data.data);
- drawTarotCard(); // Draw a tarot card on success
- } else {
- throw new Error('Invalid data format');
- }
- } catch (error) {
- console.error(`API error with ${apiBaseUrls[currentApiIndex]}:`, error);
- currentApiIndex = (currentApiIndex + 1) % apiBaseUrls.length;
- if (currentApiIndex !== 0) {
- fetchFortune(); // Try next API
- } else {
- displayError();
- }
- }
- };
-
- const updateFortune = (data) => {
- luckDescElem.textContent = data.luck_desc || '运势';
- luckTipElem.textContent = data.luck_tip || '今日运势平平,保持好心情。';
-
- // Generate and display additional details
- fortuneSummaryElem.textContent = mantras[Math.floor(Math.random() * mantras.length)];
- luckyColorElem.style.backgroundColor = `#${Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')}`;
- luckyNumberElem.textContent = Math.floor(Math.random() * 100);
-
- showLoading(false);
- };
-
- const displayError = () => {
- luckDescElem.textContent = '占卜失败';
- luckTipElem.textContent = '无法连接到星辰之力,请稍后再试。';
- fortuneSummaryElem.textContent = '---';
- luckyColorElem.style.backgroundColor = 'transparent';
- luckyNumberElem.textContent = '-';
- showLoading(false);
- tarotNameElem.textContent = '指引中断';
- tarotInterpretationElem.textContent = '星辰之力暂时无法连接。';
- tarotCardContainer.classList.add('flipped'); // Show error on card
- };
-
- const drawTarotCard = () => {
- const card = tarotDeck[Math.floor(Math.random() * tarotDeck.length)];
- tarotNameElem.textContent = card.name;
- tarotInterpretationElem.textContent = card.interpretation;
-
- // Flip the card after a short delay to allow the main content to appear
- setTimeout(() => {
- tarotCardContainer.classList.add('flipped');
- }, 500);
- };
-
- const createSideDecorations = () => {
- const leftContainer = document.querySelector('.left-decor');
- const rightContainer = document.querySelector('.right-decor');
- if (!leftContainer || !rightContainer) return;
-
- const symbols = ['✧', '✦', '☾', '✶', '✵', '✩', '✨'];
- const symbolCount = 15; // Number of symbols per side
-
- const createSymbols = (container) => {
- for (let i = 0; i < symbolCount; i++) {
- const symbol = document.createElement('span');
- symbol.classList.add('decor-symbol');
- symbol.textContent = symbols[Math.floor(Math.random() * symbols.length)];
-
- // Randomize properties for a more natural look
- symbol.style.top = `${Math.random() * 90}vh`;
- symbol.style.left = `${Math.random() * 80}%`;
- symbol.style.fontSize = `${Math.random() * 20 + 10}px`;
- symbol.style.animationDelay = `${Math.random() * 20}s`;
- symbol.style.animationDuration = `${Math.random() * 20 + 15}s`; // Duration between 15s and 35s
-
- container.appendChild(symbol);
- }
- };
-
- createSymbols(leftContainer);
- createSymbols(rightContainer);
- };
-
- getFortuneBtn.addEventListener('click', fetchFortune);
- tarotCardContainer.addEventListener('click', () => {
- tarotCardContainer.classList.toggle('flipped');
- });
-
- // Initial actions on page load
- fetchFortune();
- createSideDecorations();
+document.addEventListener('DOMContentLoaded', () => {
+ const getFortuneBtn = document.getElementById('get-fortune-btn');
+ const fortuneCard = document.getElementById('fortune-card');
+ const fortuneContent = fortuneCard.querySelector('.fortune-content');
+ const luckDescElem = document.getElementById('luck-desc');
+ const luckTipElem = document.getElementById('luck-tip');
+ const fortuneSummaryElem = document.getElementById('fortune-summary');
+ const luckyColorElem = document.getElementById('lucky-color');
+ const luckyNumberElem = document.getElementById('lucky-number');
+ const loadingSpinner = fortuneCard.querySelector('.loading-spinner');
+ const tarotCardContainer = document.getElementById('tarot-card');
+ const tarotNameElem = document.getElementById('tarot-name');
+ const tarotInterpretationElem = document.getElementById('tarot-interpretation');
+
+ const apiBaseUrls = [
+ "https://60s.api.shumengya.top",
+ ];
+ const apiPath = "/v2/luck";
+
+ const mantras = [
+ "顺其自然,皆是美好。",
+ "相信直觉,它知道方向。",
+ "每一次呼吸都是新的开始。",
+ "心怀感恩,好运自来。",
+ "拥抱变化,发现惊喜。",
+ "你的能量,超乎想象。",
+ "保持微笑,宇宙会回应你。"
+ ];
+
+ const tarotDeck = [
+ { name: "愚者", interpretation: "新的开始,无限的潜力,天真和自由。勇敢地迈出第一步。" },
+ { name: "魔术师", interpretation: "创造力,意志力,显化。你拥有实现目标所需的一切资源。" },
+ { name: "女祭司", interpretation: "直觉,潜意识,神秘。倾听你内心的声音,智慧在你之内。" },
+ { name: "皇后", interpretation: "丰饶,母性,创造。享受生活的美好,与自然和谐相处。" },
+ { name: "皇帝", interpretation: "权威,结构,控制。建立秩序和纪律,掌控你的生活。" },
+ { name: "教皇", interpretation: "传统,信仰,灵性指导。寻求智慧和知识,遵循传统。" },
+ { name: "恋人", interpretation: "爱,和谐,选择。做出与你内心价值观一致的决定。" },
+ { name: "战车", interpretation: "胜利,决心,控制。以坚定的意志力克服障碍,勇往直前。" },
+ { name: "力量", interpretation: "勇气,内在力量,同情。用温柔和耐心驯服内心的野兽。" },
+ { name: "隐士", interpretation: "内省,孤独,寻求真理。花时间独处,向内寻求答案。" },
+ { name: "命运之轮", interpretation: "变化,命运,转折点。生活总在变化,顺应潮流。" },
+ { name: "正义", interpretation: "公平,真理,因果。为你的行为负责,寻求平衡。" },
+ { name: "倒吊人", interpretation: "新的视角,顺从,牺牲。放手,从不同的角度看问题。" },
+ { name: "死神", interpretation: "结束,转变,新生。一个周期的结束是另一个周期的开始。" },
+ { name: "节制", interpretation: "平衡,和谐,耐心。融合对立的力量,找到中间道路。" },
+ { name: "恶魔", interpretation: "束缚,物质主义,诱惑。认识到你的束缚,并寻求解放。" },
+ { name: "塔", interpretation: "突变,启示,解放。旧的结构正在崩塌,为新的结构让路。" },
+ { name: "星星", interpretation: "希望,灵感,平静。在黑暗之后,总有希望的曙光。" },
+ { name: "月亮", interpretation: "幻觉,恐惧,潜意识。面对你的恐惧,相信你的直觉。" },
+ { name: "太阳", interpretation: "成功,喜悦,活力。拥抱光明,享受生活的乐趣。" },
+ { name: "审判", interpretation: "觉醒,重生,评估。一个反思和更新的时刻。" },
+ { name: "世界", interpretation: "完成,整合,成就。一个旅程的成功结束,庆祝你的成就。" }
+ ];
+
+ let currentApiIndex = 0;
+
+ const showLoading = (isLoading) => {
+ if (isLoading) {
+ fortuneContent.classList.remove('visible');
+ loadingSpinner.classList.add('visible');
+ } else {
+ loadingSpinner.classList.remove('visible');
+ setTimeout(() => {
+ fortuneContent.classList.add('visible');
+ }, 100);
+ }
+ };
+
+ const fetchFortune = async () => {
+ showLoading(true);
+ tarotCardContainer.classList.remove('flipped'); // Reset card on new fetch
+
+ try {
+ const url = apiBaseUrls[currentApiIndex] + apiPath;
+ const response = await fetch(url, { timeout: 5000 });
+ if (!response.ok) {
+ throw new Error('Network response was not ok');
+ }
+ const data = await response.json();
+
+ if (data.code === 200 && data.data) {
+ updateFortune(data.data);
+ drawTarotCard(); // Draw a tarot card on success
+ } else {
+ throw new Error('Invalid data format');
+ }
+ } catch (error) {
+ console.error(`API error with ${apiBaseUrls[currentApiIndex]}:`, error);
+ currentApiIndex = (currentApiIndex + 1) % apiBaseUrls.length;
+ if (currentApiIndex !== 0) {
+ fetchFortune(); // Try next API
+ } else {
+ displayError();
+ }
+ }
+ };
+
+ const updateFortune = (data) => {
+ luckDescElem.textContent = data.luck_desc || '运势';
+ luckTipElem.textContent = data.luck_tip || '今日运势平平,保持好心情。';
+
+ // Generate and display additional details
+ fortuneSummaryElem.textContent = mantras[Math.floor(Math.random() * mantras.length)];
+ luckyColorElem.style.backgroundColor = `#${Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')}`;
+ luckyNumberElem.textContent = Math.floor(Math.random() * 100);
+
+ showLoading(false);
+ };
+
+ const displayError = () => {
+ luckDescElem.textContent = '占卜失败';
+ luckTipElem.textContent = '无法连接到星辰之力,请稍后再试。';
+ fortuneSummaryElem.textContent = '---';
+ luckyColorElem.style.backgroundColor = 'transparent';
+ luckyNumberElem.textContent = '-';
+ showLoading(false);
+ tarotNameElem.textContent = '指引中断';
+ tarotInterpretationElem.textContent = '星辰之力暂时无法连接。';
+ tarotCardContainer.classList.add('flipped'); // Show error on card
+ };
+
+ const drawTarotCard = () => {
+ const card = tarotDeck[Math.floor(Math.random() * tarotDeck.length)];
+ tarotNameElem.textContent = card.name;
+ tarotInterpretationElem.textContent = card.interpretation;
+
+ // Flip the card after a short delay to allow the main content to appear
+ setTimeout(() => {
+ tarotCardContainer.classList.add('flipped');
+ }, 500);
+ };
+
+ const createSideDecorations = () => {
+ const leftContainer = document.querySelector('.left-decor');
+ const rightContainer = document.querySelector('.right-decor');
+ if (!leftContainer || !rightContainer) return;
+
+ const symbols = ['✧', '✦', '☾', '✶', '✵', '✩', '✨'];
+ const symbolCount = 15; // Number of symbols per side
+
+ const createSymbols = (container) => {
+ for (let i = 0; i < symbolCount; i++) {
+ const symbol = document.createElement('span');
+ symbol.classList.add('decor-symbol');
+ symbol.textContent = symbols[Math.floor(Math.random() * symbols.length)];
+
+ // Randomize properties for a more natural look
+ symbol.style.top = `${Math.random() * 90}vh`;
+ symbol.style.left = `${Math.random() * 80}%`;
+ symbol.style.fontSize = `${Math.random() * 20 + 10}px`;
+ symbol.style.animationDelay = `${Math.random() * 20}s`;
+ symbol.style.animationDuration = `${Math.random() * 20 + 15}s`; // Duration between 15s and 35s
+
+ container.appendChild(symbol);
+ }
+ };
+
+ createSymbols(leftContainer);
+ createSymbols(rightContainer);
+ };
+
+ getFortuneBtn.addEventListener('click', fetchFortune);
+ tarotCardContainer.addEventListener('click', () => {
+ tarotCardContainer.classList.toggle('flipped');
+ });
+
+ // Initial actions on page load
+ fetchFortune();
+ createSideDecorations();
});
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/接口集合.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/接口集合.json
index 547b2771..42245813 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/接口集合.json
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/接口集合.json
@@ -1,3 +1,3 @@
-[
- "https://60s.api.shumengya.top"
-]
+[
+ "https://60s.api.shumengya.top"
+]
diff --git a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/返回接口.json b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/返回接口.json
index f5498794..caa75793 100755
--- a/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/娱乐消遣/随机运势/返回接口.json
@@ -1,10 +1,10 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "luck_desc": "恋愛運",
- "luck_rank": 21,
- "luck_tip": "闪亮的邂逅之日!顺其自然吧",
- "luck_tip_index": 19
- }
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "luck_desc": "恋愛運",
+ "luck_rank": 21,
+ "luck_tip": "闪亮的邂逅之日!顺其自然吧",
+ "luck_tip_index": 19
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/css/style.css b/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/css/style.css
index 30d4f120..cfc307ed 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/css/style.css
@@ -1,330 +1,330 @@
-/* Epic Games 免费游戏 - 淡绿色清新风格样式 */
-
-/* 重置样式 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
- background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%);
- min-height: 100vh;
- color: #2d5016;
- line-height: 1.6;
- overflow-x: hidden;
-}
-
-.container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 20px;
-}
-
-/* 头部 */
-.header {
- text-align: center;
- margin-bottom: 30px;
- background: rgba(255, 255, 255, 0.85);
- border-radius: 20px;
- padding: 24px;
- box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08);
- backdrop-filter: blur(10px);
-}
-
-.header h1 {
- font-size: 2.2rem;
- color: #2d5016;
- margin-bottom: 10px;
- font-weight: 700;
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 12px;
-}
-
-.header p {
- color: #5a7c65;
- font-size: 1rem;
-}
-
-/* 统计信息 */
-.stats {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 15px;
- margin-bottom: 25px;
-}
-
-.stat-card {
- background: rgba(255, 255, 255, 0.9);
- padding: 16px;
- border-radius: 15px;
- text-align: center;
- box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08);
-}
-
-.stat-number {
- font-size: 1.8rem;
- font-weight: 700;
- color: #1b5e20;
- margin-bottom: 5px;
-}
-
-.stat-label {
- color: #5a7c65;
- font-size: 0.9rem;
-}
-
-/* 游戏网格 */
-.games-grid {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
- gap: 20px;
- margin-bottom: 20px;
-}
-
-/* 游戏卡片 */
-.game-card {
- background: rgba(255, 255, 255, 0.95);
- border-radius: 18px;
- overflow: hidden;
- box-shadow: 0 6px 25px rgba(45, 80, 22, 0.1);
- transition: all 0.3s ease;
- position: relative;
-}
-
-.game-card:hover {
- transform: translateY(-5px);
- box-shadow: 0 12px 35px rgba(45, 80, 22, 0.15);
-}
-
-.game-cover {
- width: 100%;
- height: 180px;
- object-fit: cover;
- border-radius: 0;
-}
-
-.game-info {
- padding: 18px;
-}
-
-.game-title {
- font-size: 1.1rem;
- font-weight: 700;
- color: #1b5e20;
- margin-bottom: 8px;
- line-height: 1.3;
- display: -webkit-box;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical;
- overflow: hidden;
-}
-
-.game-description {
- color: #5a7c65;
- font-size: 0.9rem;
- margin-bottom: 12px;
- display: -webkit-box;
- -webkit-line-clamp: 3;
- -webkit-box-orient: vertical;
- overflow: hidden;
- line-height: 1.4;
-}
-
-.game-meta {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 12px;
-}
-
-.game-price {
- font-size: 1rem;
- font-weight: 600;
-}
-
-.original-price {
- color: #81c784;
- text-decoration: line-through;
-}
-
-.free-price {
- color: #2e7d32;
- font-weight: 700;
-}
-
-.game-seller {
- color: #5a7c65;
- font-size: 0.85rem;
-}
-
-.game-dates {
- background: rgba(129, 199, 132, 0.1);
- padding: 10px;
- border-radius: 10px;
- margin-bottom: 12px;
- font-size: 0.85rem;
- color: #2d5016;
-}
-
-.free-period {
- display: flex;
- justify-content: space-between;
- margin-bottom: 4px;
-}
-
-.game-actions {
- display: flex;
- gap: 10px;
-}
-
-.btn {
- flex: 1;
- background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%);
- color: white;
- border: none;
- padding: 10px 16px;
- border-radius: 10px;
- font-size: 0.9rem;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.25s ease;
- box-shadow: 0 4px 12px rgba(129, 199, 132, 0.35);
- text-decoration: none;
- text-align: center;
- display: inline-block;
-}
-
-.btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 6px 18px rgba(129, 199, 132, 0.45);
-}
-
-.btn-secondary {
- background: linear-gradient(135deg, #a5d6a7 0%, #81c784 100%);
-}
-
-/* 状态标签 */
-.status-badge {
- position: absolute;
- top: 12px;
- right: 12px;
- padding: 6px 12px;
- border-radius: 20px;
- font-size: 0.8rem;
- font-weight: 600;
- color: white;
- text-shadow: 0 1px 2px rgba(0,0,0,0.2);
-}
-
-.status-free {
- background: linear-gradient(135deg, #4caf50 0%, #2e7d32 100%);
-}
-
-.status-upcoming {
- background: linear-gradient(135deg, #ff9800 0%, #f57c00 100%);
-}
-
-/* 加载与错误 */
-.loading, .error {
- text-align: center;
- padding: 40px;
- background: rgba(255, 255, 255, 0.85);
- border-radius: 15px;
- box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08);
-}
-
-.spinner {
- width: 40px;
- height: 40px;
- border: 4px solid #e8f5e8;
- border-top: 4px solid #81c784;
- border-radius: 50%;
- animation: spin 1s linear infinite;
- margin: 0 auto 20px;
-}
-
-@keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-/* 动画 */
-.fade-in {
- animation: fadeIn 0.6s ease-in-out;
-}
-
-@keyframes fadeIn {
- from { opacity: 0; transform: translateY(20px); }
- to { opacity: 1; transform: translateY(0); }
-}
-
-/* 平板端适配 */
-@media (max-width: 1024px) and (min-width: 768px) {
- .container { padding: 16px; }
- .header h1 { font-size: 2rem; }
- .games-grid { grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); }
-}
-
-/* 手机端优化 */
-@media (max-width: 767px) {
- .container { padding: 12px; }
- .header { padding: 18px; }
- .header h1 { font-size: 1.8rem; gap: 8px; }
-
- .stats {
- display: flex;
- flex-direction: row;
- justify-content: space-between;
- gap: 8px;
- }
-
- .stat-card {
- padding: 10px 8px;
- flex: 1;
- min-width: 0;
- }
- .stat-number { font-size: 1.4rem; }
- .stat-label { font-size: 0.75rem; }
-
- .games-grid {
- grid-template-columns: 1fr;
- gap: 16px;
- }
-
- .game-card { margin: 0 4px; }
- .game-cover { height: 160px; }
- .game-info { padding: 14px; }
-
- .game-actions {
- flex-direction: column;
- }
-
- .btn {
- width: 100%;
- padding: 12px;
- }
-}
-
-/* 小屏手机优化 */
-@media (max-width: 480px) {
- .stats {
- grid-template-columns: 1fr;
- }
-
- .game-meta {
- flex-direction: column;
- align-items: flex-start;
- gap: 6px;
- }
-}
-
-/* 高分辨率显示器优化 */
-@media (min-width: 1400px) {
- .games-grid {
- grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
- }
+/* Epic Games 免费游戏 - 淡绿色清新风格样式 */
+
+/* 重置样式 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%);
+ min-height: 100vh;
+ color: #2d5016;
+ line-height: 1.6;
+ overflow-x: hidden;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+}
+
+/* 头部 */
+.header {
+ text-align: center;
+ margin-bottom: 30px;
+ background: rgba(255, 255, 255, 0.85);
+ border-radius: 20px;
+ padding: 24px;
+ box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08);
+ backdrop-filter: blur(10px);
+}
+
+.header h1 {
+ font-size: 2.2rem;
+ color: #2d5016;
+ margin-bottom: 10px;
+ font-weight: 700;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 12px;
+}
+
+.header p {
+ color: #5a7c65;
+ font-size: 1rem;
+}
+
+/* 统计信息 */
+.stats {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: 15px;
+ margin-bottom: 25px;
+}
+
+.stat-card {
+ background: rgba(255, 255, 255, 0.9);
+ padding: 16px;
+ border-radius: 15px;
+ text-align: center;
+ box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08);
+}
+
+.stat-number {
+ font-size: 1.8rem;
+ font-weight: 700;
+ color: #1b5e20;
+ margin-bottom: 5px;
+}
+
+.stat-label {
+ color: #5a7c65;
+ font-size: 0.9rem;
+}
+
+/* 游戏网格 */
+.games-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
+ gap: 20px;
+ margin-bottom: 20px;
+}
+
+/* 游戏卡片 */
+.game-card {
+ background: rgba(255, 255, 255, 0.95);
+ border-radius: 18px;
+ overflow: hidden;
+ box-shadow: 0 6px 25px rgba(45, 80, 22, 0.1);
+ transition: all 0.3s ease;
+ position: relative;
+}
+
+.game-card:hover {
+ transform: translateY(-5px);
+ box-shadow: 0 12px 35px rgba(45, 80, 22, 0.15);
+}
+
+.game-cover {
+ width: 100%;
+ height: 180px;
+ object-fit: cover;
+ border-radius: 0;
+}
+
+.game-info {
+ padding: 18px;
+}
+
+.game-title {
+ font-size: 1.1rem;
+ font-weight: 700;
+ color: #1b5e20;
+ margin-bottom: 8px;
+ line-height: 1.3;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+}
+
+.game-description {
+ color: #5a7c65;
+ font-size: 0.9rem;
+ margin-bottom: 12px;
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ line-height: 1.4;
+}
+
+.game-meta {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 12px;
+}
+
+.game-price {
+ font-size: 1rem;
+ font-weight: 600;
+}
+
+.original-price {
+ color: #81c784;
+ text-decoration: line-through;
+}
+
+.free-price {
+ color: #2e7d32;
+ font-weight: 700;
+}
+
+.game-seller {
+ color: #5a7c65;
+ font-size: 0.85rem;
+}
+
+.game-dates {
+ background: rgba(129, 199, 132, 0.1);
+ padding: 10px;
+ border-radius: 10px;
+ margin-bottom: 12px;
+ font-size: 0.85rem;
+ color: #2d5016;
+}
+
+.free-period {
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 4px;
+}
+
+.game-actions {
+ display: flex;
+ gap: 10px;
+}
+
+.btn {
+ flex: 1;
+ background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%);
+ color: white;
+ border: none;
+ padding: 10px 16px;
+ border-radius: 10px;
+ font-size: 0.9rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.25s ease;
+ box-shadow: 0 4px 12px rgba(129, 199, 132, 0.35);
+ text-decoration: none;
+ text-align: center;
+ display: inline-block;
+}
+
+.btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 6px 18px rgba(129, 199, 132, 0.45);
+}
+
+.btn-secondary {
+ background: linear-gradient(135deg, #a5d6a7 0%, #81c784 100%);
+}
+
+/* 状态标签 */
+.status-badge {
+ position: absolute;
+ top: 12px;
+ right: 12px;
+ padding: 6px 12px;
+ border-radius: 20px;
+ font-size: 0.8rem;
+ font-weight: 600;
+ color: white;
+ text-shadow: 0 1px 2px rgba(0,0,0,0.2);
+}
+
+.status-free {
+ background: linear-gradient(135deg, #4caf50 0%, #2e7d32 100%);
+}
+
+.status-upcoming {
+ background: linear-gradient(135deg, #ff9800 0%, #f57c00 100%);
+}
+
+/* 加载与错误 */
+.loading, .error {
+ text-align: center;
+ padding: 40px;
+ background: rgba(255, 255, 255, 0.85);
+ border-radius: 15px;
+ box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08);
+}
+
+.spinner {
+ width: 40px;
+ height: 40px;
+ border: 4px solid #e8f5e8;
+ border-top: 4px solid #81c784;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ margin: 0 auto 20px;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+/* 动画 */
+.fade-in {
+ animation: fadeIn 0.6s ease-in-out;
+}
+
+@keyframes fadeIn {
+ from { opacity: 0; transform: translateY(20px); }
+ to { opacity: 1; transform: translateY(0); }
+}
+
+/* 平板端适配 */
+@media (max-width: 1024px) and (min-width: 768px) {
+ .container { padding: 16px; }
+ .header h1 { font-size: 2rem; }
+ .games-grid { grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); }
+}
+
+/* 手机端优化 */
+@media (max-width: 767px) {
+ .container { padding: 12px; }
+ .header { padding: 18px; }
+ .header h1 { font-size: 1.8rem; gap: 8px; }
+
+ .stats {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ gap: 8px;
+ }
+
+ .stat-card {
+ padding: 10px 8px;
+ flex: 1;
+ min-width: 0;
+ }
+ .stat-number { font-size: 1.4rem; }
+ .stat-label { font-size: 0.75rem; }
+
+ .games-grid {
+ grid-template-columns: 1fr;
+ gap: 16px;
+ }
+
+ .game-card { margin: 0 4px; }
+ .game-cover { height: 160px; }
+ .game-info { padding: 14px; }
+
+ .game-actions {
+ flex-direction: column;
+ }
+
+ .btn {
+ width: 100%;
+ padding: 12px;
+ }
+}
+
+/* 小屏手机优化 */
+@media (max-width: 480px) {
+ .stats {
+ grid-template-columns: 1fr;
+ }
+
+ .game-meta {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 6px;
+ }
+}
+
+/* 高分辨率显示器优化 */
+@media (min-width: 1400px) {
+ .games-grid {
+ grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/index.html b/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/index.html
index c29c106f..55b0509a 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/index.html
+++ b/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/index.html
@@ -1,63 +1,63 @@
-
-
-
-
-
-
- Epic Games 免费游戏 - 60s API 集合
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+ Epic Games 免费游戏 - 60s API 集合
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/js/script.js b/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/js/script.js
index 10bd848e..c56e2e4c 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/js/script.js
@@ -1,266 +1,266 @@
-// Epic Games 免费游戏 页面脚本
-(function () {
- 'use strict';
-
- const API = {
- endpoints: [],
- currentIndex: 0,
- // 初始化API接口列表
- async init() {
- try {
- const res = await fetch('./接口集合.json');
- const endpoints = await res.json();
- this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/epic`);
- } catch (e) {
- // 如果无法加载接口集合,使用默认接口
- this.endpoints = ['https://60s.api.shumengya.top/v2/epic'];
- }
- },
- // 获取当前接口URL
- getCurrentUrl(encoding) {
- if (this.endpoints.length === 0) return null;
- const url = new URL(this.endpoints[this.currentIndex]);
- if (encoding) url.searchParams.set('encoding', encoding);
- return url.toString();
- },
- // 切换到下一个接口
- switchToNext() {
- this.currentIndex = (this.currentIndex + 1) % this.endpoints.length;
- return this.currentIndex < this.endpoints.length;
- },
- // 重置到第一个接口
- reset() {
- this.currentIndex = 0;
- }
- };
-
- // DOM 元素引用
- const els = {
- loading: null,
- error: null,
- container: null,
- gamesGrid: null,
- totalGames: null,
- freeNow: null,
- upcoming: null,
- refreshBtn: null,
- };
-
- function initDom() {
- els.loading = document.getElementById('loading');
- els.error = document.getElementById('error');
- els.container = document.getElementById('content');
- els.gamesGrid = document.getElementById('games-grid');
- els.totalGames = document.getElementById('total-games');
- els.freeNow = document.getElementById('free-now');
- els.upcoming = document.getElementById('upcoming');
- els.refreshBtn = document.getElementById('refresh-btn');
- }
-
- function showLoading() {
- els.loading.style.display = 'block';
- els.error.style.display = 'none';
- els.container.style.display = 'none';
- }
-
- function showError(msg) {
- els.loading.style.display = 'none';
- els.error.style.display = 'block';
- els.container.style.display = 'none';
- els.error.querySelector('p').textContent = msg || '获取数据失败,请稍后重试';
- }
-
- function showContent() {
- els.loading.style.display = 'none';
- els.error.style.display = 'none';
- els.container.style.display = 'block';
- }
-
- function safeText(text) {
- const div = document.createElement('div');
- div.textContent = text == null ? '' : String(text);
- return div.innerHTML;
- }
-
- function formatDate(dateStr) {
- if (!dateStr) return '';
- try {
- const date = new Date(dateStr);
- return date.toLocaleDateString('zh-CN', {
- month: '2-digit',
- day: '2-digit',
- hour: '2-digit',
- minute: '2-digit'
- });
- } catch (e) {
- return dateStr;
- }
- }
-
- async function fetchData(preferLocal = false) {
- if (preferLocal) {
- try {
- const res = await fetch('./返回接口.json', { cache: 'no-store' });
- const json = await res.json();
- return json;
- } catch (e) {
- throw new Error('本地数据加载失败');
- }
- }
-
- // 重置API索引到第一个接口
- API.reset();
-
- // 尝试所有API接口
- for (let i = 0; i < API.endpoints.length; i++) {
- try {
- const url = API.getCurrentUrl();
- console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`);
-
- const res = await fetch(url, {
- cache: 'no-store',
- timeout: 10000 // 10秒超时
- });
-
- if (!res.ok) {
- throw new Error(`HTTP ${res.status}: ${res.statusText}`);
- }
-
- const json = await res.json();
-
- if (json && json.code === 200) {
- console.log(`接口 ${i + 1} 请求成功`);
- return json;
- }
-
- throw new Error(json && json.message ? json.message : '接口返回异常');
-
- } catch (e) {
- console.warn(`接口 ${i + 1} 失败:`, e.message);
-
- // 如果不是最后一个接口,切换到下一个
- if (i < API.endpoints.length - 1) {
- API.switchToNext();
- continue;
- }
-
- // 所有接口都失败了,尝试本地数据
- console.warn('所有远程接口都失败,尝试本地数据');
- try {
- const res = await fetch('./返回接口.json', { cache: 'no-store' });
- const json = await res.json();
- return json;
- } catch (e2) {
- throw new Error('所有接口和本地数据都无法访问');
- }
- }
- }
- }
-
- function createGameCard(game) {
- const isFree = game.is_free_now;
- const statusClass = isFree ? 'status-free' : 'status-upcoming';
- const statusText = isFree ? '限时免费' : '即将免费';
-
- return `
-
-
${statusText}
-
})
-
-
${safeText(game.title)}
-
${safeText(game.description)}
-
-
-
-
-
- 开始:${formatDate(game.free_start)}
- 结束:${formatDate(game.free_end)}
-
-
-
-
-
-
- `;
- }
-
- function updateStats(games) {
- const total = games.length;
- const freeNow = games.filter(game => game.is_free_now).length;
- const upcoming = total - freeNow;
-
- els.totalGames.textContent = total;
- els.freeNow.textContent = freeNow;
- els.upcoming.textContent = upcoming;
- }
-
- function renderGames(games) {
- if (!Array.isArray(games) || games.length === 0) {
- els.gamesGrid.innerHTML = '暂无游戏数据
';
- return;
- }
-
- // 按状态排序:免费的在前
- const sortedGames = [...games].sort((a, b) => {
- if (a.is_free_now && !b.is_free_now) return -1;
- if (!a.is_free_now && b.is_free_now) return 1;
- return 0;
- });
-
- const html = sortedGames.map(game => createGameCard(game)).join('');
- els.gamesGrid.innerHTML = html;
-
- updateStats(games);
- }
-
- function render(data) {
- const games = data?.data || [];
- renderGames(games);
- showContent();
- }
-
- async function load() {
- showLoading();
-
- // 初始化API接口列表
- await API.init();
-
- try {
- const data = await fetchData(false);
- render(data);
- } catch (e) {
- console.error('数据获取失败:', e);
- showError(e.message || '获取数据失败,请稍后重试');
- }
- }
-
- function bindEvents() {
- if (els.refreshBtn) {
- els.refreshBtn.addEventListener('click', load);
- }
-
- // 快捷键 Ctrl+R 刷新(不拦截浏览器默认刷新)
- document.addEventListener('keydown', (e) => {
- if (e.ctrlKey && e.key === 'r' && !e.defaultPrevented) {
- // 不阻止默认行为,让浏览器正常刷新
- }
- });
- }
-
- document.addEventListener('DOMContentLoaded', () => {
- initDom();
- bindEvents();
- load();
- });
+// Epic Games 免费游戏 页面脚本
+(function () {
+ 'use strict';
+
+ const API = {
+ endpoints: [],
+ currentIndex: 0,
+ // 初始化API接口列表
+ async init() {
+ try {
+ const res = await fetch('./接口集合.json');
+ const endpoints = await res.json();
+ this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/epic`);
+ } catch (e) {
+ // 如果无法加载接口集合,使用默认接口
+ this.endpoints = ['https://60s.api.shumengya.top/v2/epic'];
+ }
+ },
+ // 获取当前接口URL
+ getCurrentUrl(encoding) {
+ if (this.endpoints.length === 0) return null;
+ const url = new URL(this.endpoints[this.currentIndex]);
+ if (encoding) url.searchParams.set('encoding', encoding);
+ return url.toString();
+ },
+ // 切换到下一个接口
+ switchToNext() {
+ this.currentIndex = (this.currentIndex + 1) % this.endpoints.length;
+ return this.currentIndex < this.endpoints.length;
+ },
+ // 重置到第一个接口
+ reset() {
+ this.currentIndex = 0;
+ }
+ };
+
+ // DOM 元素引用
+ const els = {
+ loading: null,
+ error: null,
+ container: null,
+ gamesGrid: null,
+ totalGames: null,
+ freeNow: null,
+ upcoming: null,
+ refreshBtn: null,
+ };
+
+ function initDom() {
+ els.loading = document.getElementById('loading');
+ els.error = document.getElementById('error');
+ els.container = document.getElementById('content');
+ els.gamesGrid = document.getElementById('games-grid');
+ els.totalGames = document.getElementById('total-games');
+ els.freeNow = document.getElementById('free-now');
+ els.upcoming = document.getElementById('upcoming');
+ els.refreshBtn = document.getElementById('refresh-btn');
+ }
+
+ function showLoading() {
+ els.loading.style.display = 'block';
+ els.error.style.display = 'none';
+ els.container.style.display = 'none';
+ }
+
+ function showError(msg) {
+ els.loading.style.display = 'none';
+ els.error.style.display = 'block';
+ els.container.style.display = 'none';
+ els.error.querySelector('p').textContent = msg || '获取数据失败,请稍后重试';
+ }
+
+ function showContent() {
+ els.loading.style.display = 'none';
+ els.error.style.display = 'none';
+ els.container.style.display = 'block';
+ }
+
+ function safeText(text) {
+ const div = document.createElement('div');
+ div.textContent = text == null ? '' : String(text);
+ return div.innerHTML;
+ }
+
+ function formatDate(dateStr) {
+ if (!dateStr) return '';
+ try {
+ const date = new Date(dateStr);
+ return date.toLocaleDateString('zh-CN', {
+ month: '2-digit',
+ day: '2-digit',
+ hour: '2-digit',
+ minute: '2-digit'
+ });
+ } catch (e) {
+ return dateStr;
+ }
+ }
+
+ async function fetchData(preferLocal = false) {
+ if (preferLocal) {
+ try {
+ const res = await fetch('./返回接口.json', { cache: 'no-store' });
+ const json = await res.json();
+ return json;
+ } catch (e) {
+ throw new Error('本地数据加载失败');
+ }
+ }
+
+ // 重置API索引到第一个接口
+ API.reset();
+
+ // 尝试所有API接口
+ for (let i = 0; i < API.endpoints.length; i++) {
+ try {
+ const url = API.getCurrentUrl();
+ console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`);
+
+ const res = await fetch(url, {
+ cache: 'no-store',
+ timeout: 10000 // 10秒超时
+ });
+
+ if (!res.ok) {
+ throw new Error(`HTTP ${res.status}: ${res.statusText}`);
+ }
+
+ const json = await res.json();
+
+ if (json && json.code === 200) {
+ console.log(`接口 ${i + 1} 请求成功`);
+ return json;
+ }
+
+ throw new Error(json && json.message ? json.message : '接口返回异常');
+
+ } catch (e) {
+ console.warn(`接口 ${i + 1} 失败:`, e.message);
+
+ // 如果不是最后一个接口,切换到下一个
+ if (i < API.endpoints.length - 1) {
+ API.switchToNext();
+ continue;
+ }
+
+ // 所有接口都失败了,尝试本地数据
+ console.warn('所有远程接口都失败,尝试本地数据');
+ try {
+ const res = await fetch('./返回接口.json', { cache: 'no-store' });
+ const json = await res.json();
+ return json;
+ } catch (e2) {
+ throw new Error('所有接口和本地数据都无法访问');
+ }
+ }
+ }
+ }
+
+ function createGameCard(game) {
+ const isFree = game.is_free_now;
+ const statusClass = isFree ? 'status-free' : 'status-upcoming';
+ const statusText = isFree ? '限时免费' : '即将免费';
+
+ return `
+
+
${statusText}
+
})
+
+
${safeText(game.title)}
+
${safeText(game.description)}
+
+
+
+
+
+ 开始:${formatDate(game.free_start)}
+ 结束:${formatDate(game.free_end)}
+
+
+
+
+
+
+ `;
+ }
+
+ function updateStats(games) {
+ const total = games.length;
+ const freeNow = games.filter(game => game.is_free_now).length;
+ const upcoming = total - freeNow;
+
+ els.totalGames.textContent = total;
+ els.freeNow.textContent = freeNow;
+ els.upcoming.textContent = upcoming;
+ }
+
+ function renderGames(games) {
+ if (!Array.isArray(games) || games.length === 0) {
+ els.gamesGrid.innerHTML = '暂无游戏数据
';
+ return;
+ }
+
+ // 按状态排序:免费的在前
+ const sortedGames = [...games].sort((a, b) => {
+ if (a.is_free_now && !b.is_free_now) return -1;
+ if (!a.is_free_now && b.is_free_now) return 1;
+ return 0;
+ });
+
+ const html = sortedGames.map(game => createGameCard(game)).join('');
+ els.gamesGrid.innerHTML = html;
+
+ updateStats(games);
+ }
+
+ function render(data) {
+ const games = data?.data || [];
+ renderGames(games);
+ showContent();
+ }
+
+ async function load() {
+ showLoading();
+
+ // 初始化API接口列表
+ await API.init();
+
+ try {
+ const data = await fetchData(false);
+ render(data);
+ } catch (e) {
+ console.error('数据获取失败:', e);
+ showError(e.message || '获取数据失败,请稍后重试');
+ }
+ }
+
+ function bindEvents() {
+ if (els.refreshBtn) {
+ els.refreshBtn.addEventListener('click', load);
+ }
+
+ // 快捷键 Ctrl+R 刷新(不拦截浏览器默认刷新)
+ document.addEventListener('keydown', (e) => {
+ if (e.ctrlKey && e.key === 'r' && !e.defaultPrevented) {
+ // 不阻止默认行为,让浏览器正常刷新
+ }
+ });
+ }
+
+ document.addEventListener('DOMContentLoaded', () => {
+ initDom();
+ bindEvents();
+ load();
+ });
})();
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/接口集合.json b/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/接口集合.json
index 547b2771..42245813 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/接口集合.json
+++ b/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/接口集合.json
@@ -1,3 +1,3 @@
-[
- "https://60s.api.shumengya.top"
-]
+[
+ "https://60s.api.shumengya.top"
+]
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/返回接口.json
index 7804d62a..be3aa159 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/实用功能/EpicGames免费游戏/返回接口.json
@@ -1,66 +1,66 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": [
- {
- "id": "9aa227e2ba294bb1a95c95fde892eb31",
- "title": "《Totally Reliable Delivery Service》 Standard Edition",
- "cover": "https://cdn1.epicgames.com/52b90f9a982a404781b189f6a7903226/offer/EGS_TotallyReliableDeliveryService_WereFiveGames_S1-2560x1440-47e6e9562d62705a75ea7b7096d0b8dc.jpg",
- "original_price": 52,
- "original_price_desc": "¥52.00",
- "description": "穿好护腰护具,发动货车,送货的时间到啦!在一个高度互动的沙盒世界中,与最多三位好友一起随意地完成送货。货物已试投,这就是我们靠谱快递(Totally Reliable Delivery Service)的品质保证!",
- "seller": "Infogrames LLC",
- "is_free_now": true,
- "free_start": "2025/08/14 23:00:00",
- "free_start_at": 1755183600000,
- "free_end": "2025/08/21 23:00:00",
- "free_end_at": 1755788400000,
- "link": "https://store.epicgames.com/store/zh-CN/p/totally-reliable-delivery-service/home"
- },
- {
- "id": "8ea3500dc38e4f429702bf889c172d3d",
- "title": "Hidden Folks",
- "cover": "https://cdn1.epicgames.com/spt-assets/7bfd56b0586348dcb139945d9e59f988/hidden-folks-1b7hh.png",
- "original_price": 47,
- "original_price_desc": "¥47.00",
- "description": "Search for hidden folks in hand-drawn, interactive, miniature landscapes. Unfurl tent flaps, cut through bushes, slam doors, and poke some crocodiles! Rooooaaaarrrr!!!!!",
- "seller": "Adriaan de Jongh",
- "is_free_now": true,
- "free_start": "2025/08/14 23:00:00",
- "free_start_at": 1755183600000,
- "free_end": "2025/08/21 23:00:00",
- "free_end_at": 1755788400000,
- "link": "https://store.epicgames.com/store/zh-CN/p/hidden-folks-239d16"
- },
- {
- "id": "4cbb6c3704d240f19c3dd5f5cb2b0cb4",
- "title": "Kamaeru",
- "cover": "https://cdn1.epicgames.com/spt-assets/44313cfbb62b4df5801d0c8d541c2624/kamaeru-40asc.png",
- "original_price": 62,
- "original_price_desc": "¥62.00",
- "description": "Foster a sanctuary for frogs and restore the biodiversity of the wetlands in Kamaeru, a cozy frog collecting game, where you take pictures of frogs, play mini-games and decorate your habitat. Hop right to it!",
- "seller": "Armor Games Studios",
- "is_free_now": false,
- "free_start": "2025/08/21 23:00:00",
- "free_start_at": 1755788400000,
- "free_end": "2025/08/28 23:00:00",
- "free_end_at": 1756393200000,
- "link": "https://store.epicgames.com/store/zh-CN/p/kamaeru-0c301e"
- },
- {
- "id": "0d9a533f0e684cc18620a8f408e8e72c",
- "title": "Strange Horticulture",
- "cover": "https://cdn1.epicgames.com/spt-assets/15e8e3eba65a4763a815d6eae1d763b2/strange-horticulture-offer-2wghv.png",
- "original_price": 45,
- "original_price_desc": "¥45.00",
- "description": "款神秘学解谜游戏,你将扮演当地植物商店的店主,寻找并识别新的植物,悠闲撸猫,与女巫团体交谈,或加入异教。收集各种强大的植物,用它们来影响故事走向,揭开昂德米尔镇的黑暗谜团。",
- "seller": "Iceberg Interactive",
- "is_free_now": false,
- "free_start": "2025/08/21 23:00:00",
- "free_start_at": 1755788400000,
- "free_end": "2025/08/28 23:00:00",
- "free_end_at": 1756393200000,
- "link": "https://store.epicgames.com/store/zh-CN/p/strange-horticulture-360e80"
- }
- ]
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": [
+ {
+ "id": "9aa227e2ba294bb1a95c95fde892eb31",
+ "title": "《Totally Reliable Delivery Service》 Standard Edition",
+ "cover": "https://cdn1.epicgames.com/52b90f9a982a404781b189f6a7903226/offer/EGS_TotallyReliableDeliveryService_WereFiveGames_S1-2560x1440-47e6e9562d62705a75ea7b7096d0b8dc.jpg",
+ "original_price": 52,
+ "original_price_desc": "¥52.00",
+ "description": "穿好护腰护具,发动货车,送货的时间到啦!在一个高度互动的沙盒世界中,与最多三位好友一起随意地完成送货。货物已试投,这就是我们靠谱快递(Totally Reliable Delivery Service)的品质保证!",
+ "seller": "Infogrames LLC",
+ "is_free_now": true,
+ "free_start": "2025/08/14 23:00:00",
+ "free_start_at": 1755183600000,
+ "free_end": "2025/08/21 23:00:00",
+ "free_end_at": 1755788400000,
+ "link": "https://store.epicgames.com/store/zh-CN/p/totally-reliable-delivery-service/home"
+ },
+ {
+ "id": "8ea3500dc38e4f429702bf889c172d3d",
+ "title": "Hidden Folks",
+ "cover": "https://cdn1.epicgames.com/spt-assets/7bfd56b0586348dcb139945d9e59f988/hidden-folks-1b7hh.png",
+ "original_price": 47,
+ "original_price_desc": "¥47.00",
+ "description": "Search for hidden folks in hand-drawn, interactive, miniature landscapes. Unfurl tent flaps, cut through bushes, slam doors, and poke some crocodiles! Rooooaaaarrrr!!!!!",
+ "seller": "Adriaan de Jongh",
+ "is_free_now": true,
+ "free_start": "2025/08/14 23:00:00",
+ "free_start_at": 1755183600000,
+ "free_end": "2025/08/21 23:00:00",
+ "free_end_at": 1755788400000,
+ "link": "https://store.epicgames.com/store/zh-CN/p/hidden-folks-239d16"
+ },
+ {
+ "id": "4cbb6c3704d240f19c3dd5f5cb2b0cb4",
+ "title": "Kamaeru",
+ "cover": "https://cdn1.epicgames.com/spt-assets/44313cfbb62b4df5801d0c8d541c2624/kamaeru-40asc.png",
+ "original_price": 62,
+ "original_price_desc": "¥62.00",
+ "description": "Foster a sanctuary for frogs and restore the biodiversity of the wetlands in Kamaeru, a cozy frog collecting game, where you take pictures of frogs, play mini-games and decorate your habitat. Hop right to it!",
+ "seller": "Armor Games Studios",
+ "is_free_now": false,
+ "free_start": "2025/08/21 23:00:00",
+ "free_start_at": 1755788400000,
+ "free_end": "2025/08/28 23:00:00",
+ "free_end_at": 1756393200000,
+ "link": "https://store.epicgames.com/store/zh-CN/p/kamaeru-0c301e"
+ },
+ {
+ "id": "0d9a533f0e684cc18620a8f408e8e72c",
+ "title": "Strange Horticulture",
+ "cover": "https://cdn1.epicgames.com/spt-assets/15e8e3eba65a4763a815d6eae1d763b2/strange-horticulture-offer-2wghv.png",
+ "original_price": 45,
+ "original_price_desc": "¥45.00",
+ "description": "款神秘学解谜游戏,你将扮演当地植物商店的店主,寻找并识别新的植物,悠闲撸猫,与女巫团体交谈,或加入异教。收集各种强大的植物,用它们来影响故事走向,揭开昂德米尔镇的黑暗谜团。",
+ "seller": "Iceberg Interactive",
+ "is_free_now": false,
+ "free_start": "2025/08/21 23:00:00",
+ "free_start_at": 1755788400000,
+ "free_end": "2025/08/28 23:00:00",
+ "free_end_at": 1756393200000,
+ "link": "https://store.epicgames.com/store/zh-CN/p/strange-horticulture-360e80"
+ }
+ ]
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/css/background.css b/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/css/background.css
index 0da5d4ac..4096b50d 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/css/background.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/css/background.css
@@ -1,233 +1,233 @@
-/* 动态背景样式 */
-body::before {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: linear-gradient(135deg, #f0f8e8 0%, #e8f5e8 50%, #d4f4dd 100%);
- z-index: -2;
-}
-
-body::after {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background:
- radial-gradient(circle at 20% 80%, rgba(144, 238, 144, 0.2) 0%, transparent 50%),
- radial-gradient(circle at 80% 20%, rgba(173, 255, 173, 0.2) 0%, transparent 50%),
- radial-gradient(circle at 40% 40%, rgba(152, 251, 152, 0.2) 0%, transparent 50%);
- z-index: -1;
- animation: backgroundMove 20s ease-in-out infinite;
-}
-
-@keyframes backgroundMove {
- 0%, 100% {
- background:
- radial-gradient(circle at 20% 80%, rgba(144, 238, 144, 0.2) 0%, transparent 50%),
- radial-gradient(circle at 80% 20%, rgba(173, 255, 173, 0.2) 0%, transparent 50%),
- radial-gradient(circle at 40% 40%, rgba(152, 251, 152, 0.2) 0%, transparent 50%);
- }
- 25% {
- background:
- radial-gradient(circle at 60% 30%, rgba(144, 238, 144, 0.2) 0%, transparent 50%),
- radial-gradient(circle at 30% 70%, rgba(173, 255, 173, 0.2) 0%, transparent 50%),
- radial-gradient(circle at 80% 80%, rgba(152, 251, 152, 0.2) 0%, transparent 50%);
- }
- 50% {
- background:
- radial-gradient(circle at 80% 60%, rgba(144, 238, 144, 0.2) 0%, transparent 50%),
- radial-gradient(circle at 20% 30%, rgba(173, 255, 173, 0.2) 0%, transparent 50%),
- radial-gradient(circle at 60% 70%, rgba(152, 251, 152, 0.2) 0%, transparent 50%);
- }
- 75% {
- background:
- radial-gradient(circle at 40% 90%, rgba(144, 238, 144, 0.2) 0%, transparent 50%),
- radial-gradient(circle at 70% 10%, rgba(173, 255, 173, 0.2) 0%, transparent 50%),
- radial-gradient(circle at 20% 60%, rgba(152, 251, 152, 0.2) 0%, transparent 50%);
- }
-}
-
-/* 浮动粒子效果 */
-.particles {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- pointer-events: none;
- z-index: -1;
-}
-
-.particle {
- position: absolute;
- width: 4px;
- height: 4px;
- background: rgba(255, 255, 255, 0.5);
- border-radius: 50%;
- animation: float 15s infinite linear;
-}
-
-.particle:nth-child(1) {
- left: 10%;
- animation-delay: 0s;
- animation-duration: 12s;
-}
-
-.particle:nth-child(2) {
- left: 20%;
- animation-delay: 2s;
- animation-duration: 18s;
-}
-
-.particle:nth-child(3) {
- left: 30%;
- animation-delay: 4s;
- animation-duration: 15s;
-}
-
-.particle:nth-child(4) {
- left: 40%;
- animation-delay: 6s;
- animation-duration: 20s;
-}
-
-.particle:nth-child(5) {
- left: 50%;
- animation-delay: 8s;
- animation-duration: 14s;
-}
-
-.particle:nth-child(6) {
- left: 60%;
- animation-delay: 10s;
- animation-duration: 16s;
-}
-
-.particle:nth-child(7) {
- left: 70%;
- animation-delay: 12s;
- animation-duration: 22s;
-}
-
-.particle:nth-child(8) {
- left: 80%;
- animation-delay: 14s;
- animation-duration: 13s;
-}
-
-.particle:nth-child(9) {
- left: 90%;
- animation-delay: 16s;
- animation-duration: 19s;
-}
-
-.particle:nth-child(10) {
- left: 15%;
- animation-delay: 18s;
- animation-duration: 17s;
-}
-
-@keyframes float {
- 0% {
- transform: translateY(100vh) rotate(0deg);
- opacity: 0;
- }
- 10% {
- opacity: 1;
- }
- 90% {
- opacity: 1;
- }
- 100% {
- transform: translateY(-100px) rotate(360deg);
- opacity: 0;
- }
-}
-
-/* 网格背景效果 */
-.grid-background {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- linear-gradient(rgba(255, 255, 255, 0.1) 1px, transparent 1px),
- linear-gradient(90deg, rgba(255, 255, 255, 0.1) 1px, transparent 1px);
- background-size: 50px 50px;
- z-index: -1;
- opacity: 0.3;
- animation: gridMove 30s linear infinite;
-}
-
-@keyframes gridMove {
- 0% {
- transform: translate(0, 0);
- }
- 100% {
- transform: translate(50px, 50px);
- }
-}
-
-/* 光晕效果 */
-.glow-effect {
- position: fixed;
- top: 50%;
- left: 50%;
- width: 300px;
- height: 300px;
- background: radial-gradient(circle, rgba(74, 144, 226, 0.2) 0%, transparent 70%);
- border-radius: 50%;
- transform: translate(-50%, -50%);
- z-index: -1;
- animation: pulse 4s ease-in-out infinite;
-}
-
-@keyframes pulse {
- 0%, 100% {
- transform: translate(-50%, -50%) scale(1);
- opacity: 0.5;
- }
- 50% {
- transform: translate(-50%, -50%) scale(1.2);
- opacity: 0.8;
- }
-}
-
-/* 响应式背景调整 */
-@media (max-width: 768px) {
- .grid-background {
- background-size: 30px 30px;
- }
-
- .glow-effect {
- width: 200px;
- height: 200px;
- }
-
- .particle {
- width: 3px;
- height: 3px;
- }
-}
-
-@media (max-width: 480px) {
- .grid-background {
- background-size: 20px 20px;
- }
-
- .glow-effect {
- width: 150px;
- height: 150px;
- }
-
- .particle {
- width: 2px;
- height: 2px;
- }
+/* 动态背景样式 */
+body::before {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(135deg, #f0f8e8 0%, #e8f5e8 50%, #d4f4dd 100%);
+ z-index: -2;
+}
+
+body::after {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background:
+ radial-gradient(circle at 20% 80%, rgba(144, 238, 144, 0.2) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(173, 255, 173, 0.2) 0%, transparent 50%),
+ radial-gradient(circle at 40% 40%, rgba(152, 251, 152, 0.2) 0%, transparent 50%);
+ z-index: -1;
+ animation: backgroundMove 20s ease-in-out infinite;
+}
+
+@keyframes backgroundMove {
+ 0%, 100% {
+ background:
+ radial-gradient(circle at 20% 80%, rgba(144, 238, 144, 0.2) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(173, 255, 173, 0.2) 0%, transparent 50%),
+ radial-gradient(circle at 40% 40%, rgba(152, 251, 152, 0.2) 0%, transparent 50%);
+ }
+ 25% {
+ background:
+ radial-gradient(circle at 60% 30%, rgba(144, 238, 144, 0.2) 0%, transparent 50%),
+ radial-gradient(circle at 30% 70%, rgba(173, 255, 173, 0.2) 0%, transparent 50%),
+ radial-gradient(circle at 80% 80%, rgba(152, 251, 152, 0.2) 0%, transparent 50%);
+ }
+ 50% {
+ background:
+ radial-gradient(circle at 80% 60%, rgba(144, 238, 144, 0.2) 0%, transparent 50%),
+ radial-gradient(circle at 20% 30%, rgba(173, 255, 173, 0.2) 0%, transparent 50%),
+ radial-gradient(circle at 60% 70%, rgba(152, 251, 152, 0.2) 0%, transparent 50%);
+ }
+ 75% {
+ background:
+ radial-gradient(circle at 40% 90%, rgba(144, 238, 144, 0.2) 0%, transparent 50%),
+ radial-gradient(circle at 70% 10%, rgba(173, 255, 173, 0.2) 0%, transparent 50%),
+ radial-gradient(circle at 20% 60%, rgba(152, 251, 152, 0.2) 0%, transparent 50%);
+ }
+}
+
+/* 浮动粒子效果 */
+.particles {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ pointer-events: none;
+ z-index: -1;
+}
+
+.particle {
+ position: absolute;
+ width: 4px;
+ height: 4px;
+ background: rgba(255, 255, 255, 0.5);
+ border-radius: 50%;
+ animation: float 15s infinite linear;
+}
+
+.particle:nth-child(1) {
+ left: 10%;
+ animation-delay: 0s;
+ animation-duration: 12s;
+}
+
+.particle:nth-child(2) {
+ left: 20%;
+ animation-delay: 2s;
+ animation-duration: 18s;
+}
+
+.particle:nth-child(3) {
+ left: 30%;
+ animation-delay: 4s;
+ animation-duration: 15s;
+}
+
+.particle:nth-child(4) {
+ left: 40%;
+ animation-delay: 6s;
+ animation-duration: 20s;
+}
+
+.particle:nth-child(5) {
+ left: 50%;
+ animation-delay: 8s;
+ animation-duration: 14s;
+}
+
+.particle:nth-child(6) {
+ left: 60%;
+ animation-delay: 10s;
+ animation-duration: 16s;
+}
+
+.particle:nth-child(7) {
+ left: 70%;
+ animation-delay: 12s;
+ animation-duration: 22s;
+}
+
+.particle:nth-child(8) {
+ left: 80%;
+ animation-delay: 14s;
+ animation-duration: 13s;
+}
+
+.particle:nth-child(9) {
+ left: 90%;
+ animation-delay: 16s;
+ animation-duration: 19s;
+}
+
+.particle:nth-child(10) {
+ left: 15%;
+ animation-delay: 18s;
+ animation-duration: 17s;
+}
+
+@keyframes float {
+ 0% {
+ transform: translateY(100vh) rotate(0deg);
+ opacity: 0;
+ }
+ 10% {
+ opacity: 1;
+ }
+ 90% {
+ opacity: 1;
+ }
+ 100% {
+ transform: translateY(-100px) rotate(360deg);
+ opacity: 0;
+ }
+}
+
+/* 网格背景效果 */
+.grid-background {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ linear-gradient(rgba(255, 255, 255, 0.1) 1px, transparent 1px),
+ linear-gradient(90deg, rgba(255, 255, 255, 0.1) 1px, transparent 1px);
+ background-size: 50px 50px;
+ z-index: -1;
+ opacity: 0.3;
+ animation: gridMove 30s linear infinite;
+}
+
+@keyframes gridMove {
+ 0% {
+ transform: translate(0, 0);
+ }
+ 100% {
+ transform: translate(50px, 50px);
+ }
+}
+
+/* 光晕效果 */
+.glow-effect {
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ width: 300px;
+ height: 300px;
+ background: radial-gradient(circle, rgba(74, 144, 226, 0.2) 0%, transparent 70%);
+ border-radius: 50%;
+ transform: translate(-50%, -50%);
+ z-index: -1;
+ animation: pulse 4s ease-in-out infinite;
+}
+
+@keyframes pulse {
+ 0%, 100% {
+ transform: translate(-50%, -50%) scale(1);
+ opacity: 0.5;
+ }
+ 50% {
+ transform: translate(-50%, -50%) scale(1.2);
+ opacity: 0.8;
+ }
+}
+
+/* 响应式背景调整 */
+@media (max-width: 768px) {
+ .grid-background {
+ background-size: 30px 30px;
+ }
+
+ .glow-effect {
+ width: 200px;
+ height: 200px;
+ }
+
+ .particle {
+ width: 3px;
+ height: 3px;
+ }
+}
+
+@media (max-width: 480px) {
+ .grid-background {
+ background-size: 20px 20px;
+ }
+
+ .glow-effect {
+ width: 150px;
+ height: 150px;
+ }
+
+ .particle {
+ width: 2px;
+ height: 2px;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/css/style.css b/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/css/style.css
index 4ef98078..879b6b3f 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/css/style.css
@@ -1,461 +1,461 @@
-/* 全局样式重置 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
- line-height: 1.6;
- color: #333;
- min-height: 100vh;
- overflow-x: hidden;
- /* 隐藏滚动条但保留滚动功能 */
- scrollbar-width: none; /* Firefox */
- -ms-overflow-style: none; /* IE and Edge */
-}
-
-/* 隐藏 Webkit 浏览器的滚动条 */
-body::-webkit-scrollbar,
-html::-webkit-scrollbar,
-*::-webkit-scrollbar {
- display: none;
-}
-
-/* 全局隐藏滚动条但保留滚动功能 */
-html {
- scrollbar-width: none; /* Firefox */
- -ms-overflow-style: none; /* IE and Edge */
-}
-
-/* 容器样式 */
-.container {
- min-height: 100vh;
- display: flex;
- flex-direction: column;
- position: relative;
- z-index: 1;
-}
-
-/* 头部样式 */
-.header {
- text-align: center;
- padding: 3rem 2rem 2rem;
- background: linear-gradient(135deg, rgba(144, 238, 144, 0.15), rgba(152, 251, 152, 0.15));
- backdrop-filter: blur(10px);
- border-bottom: 1px solid rgba(255, 255, 255, 0.2);
-}
-
-.header h1 {
- font-size: 2.5rem;
- font-weight: 700;
- background: linear-gradient(135deg, #228B22, #32CD32);
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
- margin-bottom: 0.5rem;
- text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
-}
-
-.header h1 i {
- margin-right: 0.5rem;
- background: linear-gradient(135deg, #228B22, #32CD32);
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
-}
-
-.subtitle {
- font-size: 1.1rem;
- color: #666;
- font-weight: 300;
-}
-
-/* 主要内容区域 */
-.main-content {
- flex: 1;
- padding: 2rem;
- max-width: 800px;
- margin: 0 auto;
- width: 100%;
-}
-
-/* 查询按钮区域 */
-.query-section {
- text-align: center;
- margin-bottom: 2rem;
-}
-
-.query-btn {
- background: linear-gradient(135deg, #228B22, #32CD32);
- color: white;
- border: none;
- padding: 1rem 2rem;
- font-size: 1.1rem;
- font-weight: 600;
- border-radius: 50px;
- cursor: pointer;
- transition: all 0.3s ease;
- box-shadow: 0 4px 15px rgba(34, 139, 34, 0.3);
- display: inline-flex;
- align-items: center;
- gap: 0.5rem;
- min-width: 200px;
- justify-content: center;
-}
-
-.query-btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 6px 20px rgba(34, 139, 34, 0.4);
- background: linear-gradient(135deg, #1e7e1e, #2eb82e);
-}
-
-.query-btn:active {
- transform: translateY(0);
-}
-
-.query-btn:disabled {
- opacity: 0.6;
- cursor: not-allowed;
- transform: none;
-}
-
-/* 加载动画 */
-.loading {
- text-align: center;
- padding: 2rem;
-}
-
-.spinner {
- width: 50px;
- height: 50px;
- border: 4px solid #f3f3f3;
- border-top: 4px solid #4a90e2;
- border-radius: 50%;
- animation: spin 1s linear infinite;
- margin: 0 auto 1rem;
-}
-
-@keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-.loading p {
- color: #666;
- font-size: 1rem;
-}
-
-/* IP信息卡片 */
-.ip-info {
- animation: fadeInUp 0.6s ease;
-}
-
-@keyframes fadeInUp {
- from {
- opacity: 0;
- transform: translateY(30px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-.ip-card {
- background: rgba(255, 255, 255, 0.9);
- backdrop-filter: blur(10px);
- border-radius: 20px;
- padding: 2rem;
- margin-bottom: 2rem;
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
- border: 1px solid rgba(255, 255, 255, 0.2);
-}
-
-.ip-header {
- display: flex;
- align-items: center;
- gap: 0.5rem;
- margin-bottom: 1.5rem;
- padding-bottom: 1rem;
- border-bottom: 2px solid #f0f0f0;
-}
-
-.ip-header i {
- font-size: 1.5rem;
- color: #4a90e2;
-}
-
-.ip-header h2 {
- font-size: 1.5rem;
- font-weight: 600;
- color: #333;
-}
-
-.ip-display {
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 1rem;
- margin-bottom: 1.5rem;
- padding: 1.5rem;
- background: linear-gradient(135deg, rgba(74, 144, 226, 0.1), rgba(80, 200, 120, 0.1));
- border-radius: 15px;
- border: 2px solid rgba(74, 144, 226, 0.2);
-}
-
-.ip-address {
- font-size: 2rem;
- font-weight: 700;
- font-family: 'Courier New', monospace;
- color: #2c3e50;
- background: linear-gradient(135deg, #4a90e2, #50c878);
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
- text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
-}
-
-.copy-btn {
- background: #4a90e2;
- color: white;
- border: none;
- padding: 0.5rem;
- border-radius: 8px;
- cursor: pointer;
- transition: all 0.3s ease;
- font-size: 1rem;
- width: 40px;
- height: 40px;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.copy-btn:hover {
- background: #3a7bc8;
- transform: scale(1.1);
-}
-
-.ip-details {
- display: grid;
- gap: 1rem;
-}
-
-.detail-item {
- display: flex;
- align-items: center;
- gap: 0.5rem;
- padding: 0.75rem;
- background: rgba(248, 249, 250, 0.8);
- border-radius: 10px;
- transition: all 0.3s ease;
-}
-
-.detail-item:hover {
- background: rgba(74, 144, 226, 0.1);
- transform: translateX(5px);
-}
-
-.detail-item i {
- color: #4a90e2;
- width: 20px;
- text-align: center;
-}
-
-.detail-item .label {
- font-weight: 600;
- color: #555;
- min-width: 80px;
-}
-
-.detail-item .value {
- color: #333;
- font-weight: 500;
-}
-
-/* IP地址说明区域 */
-.ip-explanation {
- background: rgba(255, 255, 255, 0.9);
- backdrop-filter: blur(10px);
- border-radius: 20px;
- padding: 2rem;
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
- border: 1px solid rgba(255, 255, 255, 0.2);
-}
-
-.ip-explanation h3 {
- display: flex;
- align-items: center;
- gap: 0.5rem;
- margin-bottom: 1rem;
- font-size: 1.3rem;
- color: #333;
-}
-
-.ip-explanation h3 i {
- color: #4a90e2;
-}
-
-.ip-explanation p {
- color: #666;
- line-height: 1.8;
- margin-bottom: 1.5rem;
-}
-
-.features {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
- gap: 1rem;
-}
-
-.feature-item {
- display: flex;
- align-items: flex-start;
- gap: 1rem;
- padding: 1rem;
- background: rgba(248, 249, 250, 0.8);
- border-radius: 12px;
- transition: all 0.3s ease;
-}
-
-.feature-item:hover {
- background: rgba(74, 144, 226, 0.1);
- transform: translateY(-2px);
-}
-
-.feature-item i {
- color: #4a90e2;
- font-size: 1.5rem;
- margin-top: 0.2rem;
-}
-
-.feature-item h4 {
- font-size: 1rem;
- font-weight: 600;
- color: #333;
- margin-bottom: 0.3rem;
-}
-
-.feature-item p {
- font-size: 0.9rem;
- color: #666;
- line-height: 1.5;
- margin: 0;
-}
-
-/* 错误信息 */
-.error-message {
- text-align: center;
- padding: 2rem;
- background: rgba(255, 255, 255, 0.9);
- backdrop-filter: blur(10px);
- border-radius: 20px;
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
- border: 1px solid rgba(255, 99, 99, 0.3);
- animation: fadeInUp 0.6s ease;
-}
-
-.error-message i {
- font-size: 3rem;
- color: #ff6b6b;
- margin-bottom: 1rem;
-}
-
-.error-message p {
- color: #666;
- font-size: 1.1rem;
- margin-bottom: 1.5rem;
-}
-
-.retry-btn {
- background: #ff6b6b;
- color: white;
- border: none;
- padding: 0.75rem 1.5rem;
- font-size: 1rem;
- font-weight: 600;
- border-radius: 25px;
- cursor: pointer;
- transition: all 0.3s ease;
-}
-
-.retry-btn:hover {
- background: #ff5252;
- transform: translateY(-2px);
- box-shadow: 0 4px 15px rgba(255, 107, 107, 0.3);
-}
-
-/* 页脚 */
-.footer {
- text-align: center;
- padding: 2rem;
- background: rgba(248, 249, 250, 0.8);
- backdrop-filter: blur(10px);
- border-top: 1px solid rgba(255, 255, 255, 0.2);
- color: #666;
- font-size: 0.9rem;
-}
-
-/* 响应式设计 */
-@media (max-width: 768px) {
- .header {
- padding: 2rem 1rem 1.5rem;
- }
-
- .header h1 {
- font-size: 2rem;
- }
-
- .main-content {
- padding: 1rem;
- }
-
- .ip-card, .ip-explanation {
- padding: 1.5rem;
- }
-
- .ip-address {
- font-size: 1.5rem;
- }
-
- .ip-display {
- flex-direction: column;
- gap: 1rem;
- }
-
- .features {
- grid-template-columns: 1fr;
- }
-
- .detail-item {
- flex-direction: column;
- align-items: flex-start;
- gap: 0.3rem;
- }
-
- .detail-item .label {
- min-width: auto;
- }
-}
-
-@media (max-width: 480px) {
- .header h1 {
- font-size: 1.8rem;
- }
-
- .query-btn {
- padding: 0.875rem 1.5rem;
- font-size: 1rem;
- min-width: 180px;
- }
-
- .ip-address {
- font-size: 1.3rem;
- }
-
- .ip-card, .ip-explanation {
- padding: 1rem;
- }
+/* 全局样式重置 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ line-height: 1.6;
+ color: #333;
+ min-height: 100vh;
+ overflow-x: hidden;
+ /* 隐藏滚动条但保留滚动功能 */
+ scrollbar-width: none; /* Firefox */
+ -ms-overflow-style: none; /* IE and Edge */
+}
+
+/* 隐藏 Webkit 浏览器的滚动条 */
+body::-webkit-scrollbar,
+html::-webkit-scrollbar,
+*::-webkit-scrollbar {
+ display: none;
+}
+
+/* 全局隐藏滚动条但保留滚动功能 */
+html {
+ scrollbar-width: none; /* Firefox */
+ -ms-overflow-style: none; /* IE and Edge */
+}
+
+/* 容器样式 */
+.container {
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ position: relative;
+ z-index: 1;
+}
+
+/* 头部样式 */
+.header {
+ text-align: center;
+ padding: 3rem 2rem 2rem;
+ background: linear-gradient(135deg, rgba(144, 238, 144, 0.15), rgba(152, 251, 152, 0.15));
+ backdrop-filter: blur(10px);
+ border-bottom: 1px solid rgba(255, 255, 255, 0.2);
+}
+
+.header h1 {
+ font-size: 2.5rem;
+ font-weight: 700;
+ background: linear-gradient(135deg, #228B22, #32CD32);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ margin-bottom: 0.5rem;
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+}
+
+.header h1 i {
+ margin-right: 0.5rem;
+ background: linear-gradient(135deg, #228B22, #32CD32);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+.subtitle {
+ font-size: 1.1rem;
+ color: #666;
+ font-weight: 300;
+}
+
+/* 主要内容区域 */
+.main-content {
+ flex: 1;
+ padding: 2rem;
+ max-width: 800px;
+ margin: 0 auto;
+ width: 100%;
+}
+
+/* 查询按钮区域 */
+.query-section {
+ text-align: center;
+ margin-bottom: 2rem;
+}
+
+.query-btn {
+ background: linear-gradient(135deg, #228B22, #32CD32);
+ color: white;
+ border: none;
+ padding: 1rem 2rem;
+ font-size: 1.1rem;
+ font-weight: 600;
+ border-radius: 50px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ box-shadow: 0 4px 15px rgba(34, 139, 34, 0.3);
+ display: inline-flex;
+ align-items: center;
+ gap: 0.5rem;
+ min-width: 200px;
+ justify-content: center;
+}
+
+.query-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 6px 20px rgba(34, 139, 34, 0.4);
+ background: linear-gradient(135deg, #1e7e1e, #2eb82e);
+}
+
+.query-btn:active {
+ transform: translateY(0);
+}
+
+.query-btn:disabled {
+ opacity: 0.6;
+ cursor: not-allowed;
+ transform: none;
+}
+
+/* 加载动画 */
+.loading {
+ text-align: center;
+ padding: 2rem;
+}
+
+.spinner {
+ width: 50px;
+ height: 50px;
+ border: 4px solid #f3f3f3;
+ border-top: 4px solid #4a90e2;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ margin: 0 auto 1rem;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+.loading p {
+ color: #666;
+ font-size: 1rem;
+}
+
+/* IP信息卡片 */
+.ip-info {
+ animation: fadeInUp 0.6s ease;
+}
+
+@keyframes fadeInUp {
+ from {
+ opacity: 0;
+ transform: translateY(30px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.ip-card {
+ background: rgba(255, 255, 255, 0.9);
+ backdrop-filter: blur(10px);
+ border-radius: 20px;
+ padding: 2rem;
+ margin-bottom: 2rem;
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+}
+
+.ip-header {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ margin-bottom: 1.5rem;
+ padding-bottom: 1rem;
+ border-bottom: 2px solid #f0f0f0;
+}
+
+.ip-header i {
+ font-size: 1.5rem;
+ color: #4a90e2;
+}
+
+.ip-header h2 {
+ font-size: 1.5rem;
+ font-weight: 600;
+ color: #333;
+}
+
+.ip-display {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 1rem;
+ margin-bottom: 1.5rem;
+ padding: 1.5rem;
+ background: linear-gradient(135deg, rgba(74, 144, 226, 0.1), rgba(80, 200, 120, 0.1));
+ border-radius: 15px;
+ border: 2px solid rgba(74, 144, 226, 0.2);
+}
+
+.ip-address {
+ font-size: 2rem;
+ font-weight: 700;
+ font-family: 'Courier New', monospace;
+ color: #2c3e50;
+ background: linear-gradient(135deg, #4a90e2, #50c878);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+}
+
+.copy-btn {
+ background: #4a90e2;
+ color: white;
+ border: none;
+ padding: 0.5rem;
+ border-radius: 8px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ font-size: 1rem;
+ width: 40px;
+ height: 40px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.copy-btn:hover {
+ background: #3a7bc8;
+ transform: scale(1.1);
+}
+
+.ip-details {
+ display: grid;
+ gap: 1rem;
+}
+
+.detail-item {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.75rem;
+ background: rgba(248, 249, 250, 0.8);
+ border-radius: 10px;
+ transition: all 0.3s ease;
+}
+
+.detail-item:hover {
+ background: rgba(74, 144, 226, 0.1);
+ transform: translateX(5px);
+}
+
+.detail-item i {
+ color: #4a90e2;
+ width: 20px;
+ text-align: center;
+}
+
+.detail-item .label {
+ font-weight: 600;
+ color: #555;
+ min-width: 80px;
+}
+
+.detail-item .value {
+ color: #333;
+ font-weight: 500;
+}
+
+/* IP地址说明区域 */
+.ip-explanation {
+ background: rgba(255, 255, 255, 0.9);
+ backdrop-filter: blur(10px);
+ border-radius: 20px;
+ padding: 2rem;
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+}
+
+.ip-explanation h3 {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ margin-bottom: 1rem;
+ font-size: 1.3rem;
+ color: #333;
+}
+
+.ip-explanation h3 i {
+ color: #4a90e2;
+}
+
+.ip-explanation p {
+ color: #666;
+ line-height: 1.8;
+ margin-bottom: 1.5rem;
+}
+
+.features {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
+ gap: 1rem;
+}
+
+.feature-item {
+ display: flex;
+ align-items: flex-start;
+ gap: 1rem;
+ padding: 1rem;
+ background: rgba(248, 249, 250, 0.8);
+ border-radius: 12px;
+ transition: all 0.3s ease;
+}
+
+.feature-item:hover {
+ background: rgba(74, 144, 226, 0.1);
+ transform: translateY(-2px);
+}
+
+.feature-item i {
+ color: #4a90e2;
+ font-size: 1.5rem;
+ margin-top: 0.2rem;
+}
+
+.feature-item h4 {
+ font-size: 1rem;
+ font-weight: 600;
+ color: #333;
+ margin-bottom: 0.3rem;
+}
+
+.feature-item p {
+ font-size: 0.9rem;
+ color: #666;
+ line-height: 1.5;
+ margin: 0;
+}
+
+/* 错误信息 */
+.error-message {
+ text-align: center;
+ padding: 2rem;
+ background: rgba(255, 255, 255, 0.9);
+ backdrop-filter: blur(10px);
+ border-radius: 20px;
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
+ border: 1px solid rgba(255, 99, 99, 0.3);
+ animation: fadeInUp 0.6s ease;
+}
+
+.error-message i {
+ font-size: 3rem;
+ color: #ff6b6b;
+ margin-bottom: 1rem;
+}
+
+.error-message p {
+ color: #666;
+ font-size: 1.1rem;
+ margin-bottom: 1.5rem;
+}
+
+.retry-btn {
+ background: #ff6b6b;
+ color: white;
+ border: none;
+ padding: 0.75rem 1.5rem;
+ font-size: 1rem;
+ font-weight: 600;
+ border-radius: 25px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+}
+
+.retry-btn:hover {
+ background: #ff5252;
+ transform: translateY(-2px);
+ box-shadow: 0 4px 15px rgba(255, 107, 107, 0.3);
+}
+
+/* 页脚 */
+.footer {
+ text-align: center;
+ padding: 2rem;
+ background: rgba(248, 249, 250, 0.8);
+ backdrop-filter: blur(10px);
+ border-top: 1px solid rgba(255, 255, 255, 0.2);
+ color: #666;
+ font-size: 0.9rem;
+}
+
+/* 响应式设计 */
+@media (max-width: 768px) {
+ .header {
+ padding: 2rem 1rem 1.5rem;
+ }
+
+ .header h1 {
+ font-size: 2rem;
+ }
+
+ .main-content {
+ padding: 1rem;
+ }
+
+ .ip-card, .ip-explanation {
+ padding: 1.5rem;
+ }
+
+ .ip-address {
+ font-size: 1.5rem;
+ }
+
+ .ip-display {
+ flex-direction: column;
+ gap: 1rem;
+ }
+
+ .features {
+ grid-template-columns: 1fr;
+ }
+
+ .detail-item {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 0.3rem;
+ }
+
+ .detail-item .label {
+ min-width: auto;
+ }
+}
+
+@media (max-width: 480px) {
+ .header h1 {
+ font-size: 1.8rem;
+ }
+
+ .query-btn {
+ padding: 0.875rem 1.5rem;
+ font-size: 1rem;
+ min-width: 180px;
+ }
+
+ .ip-address {
+ font-size: 1.3rem;
+ }
+
+ .ip-card, .ip-explanation {
+ padding: 1rem;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/index.html b/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/index.html
index 88d7ae88..41638692 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/index.html
+++ b/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/index.html
@@ -1,131 +1,131 @@
-
-
-
-
-
- 公网IP地址查询
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ---.---.---.---
-
-
-
-
-
- 查询时间:
- --
-
-
-
- 位置信息:
- --
-
-
-
- 网络服务商:
- --
-
-
-
- 国家:
- --
-
-
-
- 地区:
- --
-
-
-
- 城市:
- --
-
-
-
- 时区:
- --
-
-
-
-
-
-
-
什么是公网IP地址?
-
公网IP地址是您的设备在互联网上的唯一标识符,由您的网络服务提供商(ISP)分配。通过这个地址,互联网上的其他设备可以找到并与您的设备通信。
-
-
-
-
-
-
隐私保护
-
了解您的IP地址有助于保护网络隐私
-
-
-
-
-
-
地理位置
-
IP地址可以大致确定您的地理位置
-
-
-
-
-
-
-
-
-
-
-
获取IP地址失败,请检查网络连接或稍后重试
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ 公网IP地址查询
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ---.---.---.---
+
+
+
+
+
+ 查询时间:
+ --
+
+
+
+ 位置信息:
+ --
+
+
+
+ 网络服务商:
+ --
+
+
+
+ 国家:
+ --
+
+
+
+ 地区:
+ --
+
+
+
+ 城市:
+ --
+
+
+
+ 时区:
+ --
+
+
+
+
+
+
+
什么是公网IP地址?
+
公网IP地址是您的设备在互联网上的唯一标识符,由您的网络服务提供商(ISP)分配。通过这个地址,互联网上的其他设备可以找到并与您的设备通信。
+
+
+
+
+
+
隐私保护
+
了解您的IP地址有助于保护网络隐私
+
+
+
+
+
+
地理位置
+
IP地址可以大致确定您的地理位置
+
+
+
+
+
+
+
+
+
+
+
获取IP地址失败,请检查网络连接或稍后重试
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/js/script.js b/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/js/script.js
index c982e386..4cbc83d2 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/js/script.js
@@ -1,343 +1,343 @@
-// 公网IP地址查询应用
-class IPQueryApp {
- constructor() {
- this.apiEndpoint = 'https://60s.api.shumengya.top/v2/ip';
- this.init();
- }
-
- // 初始化应用
- init() {
- this.bindEvents();
- this.createParticles();
- this.createBackgroundElements();
- console.log('IP查询应用初始化完成');
- }
-
- // 绑定事件
- bindEvents() {
- const queryBtn = document.getElementById('queryBtn');
- const retryBtn = document.getElementById('retryBtn');
- const copyBtn = document.getElementById('copyBtn');
-
- if (queryBtn) {
- queryBtn.addEventListener('click', () => this.queryIP());
- }
-
- if (retryBtn) {
- retryBtn.addEventListener('click', () => this.queryIP());
- }
-
- if (copyBtn) {
- copyBtn.addEventListener('click', () => this.copyIP());
- }
-
- // 页面加载完成后自动查询一次
- document.addEventListener('DOMContentLoaded', () => {
- setTimeout(() => this.queryIP(), 500);
- });
- }
-
- // 创建浮动粒子
- createParticles() {
- const particlesContainer = document.createElement('div');
- particlesContainer.className = 'particles';
- document.body.appendChild(particlesContainer);
-
- for (let i = 0; i < 10; i++) {
- const particle = document.createElement('div');
- particle.className = 'particle';
- particlesContainer.appendChild(particle);
- }
- }
-
- // 创建背景元素
- createBackgroundElements() {
- // 创建网格背景
- const gridBackground = document.createElement('div');
- gridBackground.className = 'grid-background';
- document.body.appendChild(gridBackground);
-
- // 创建光晕效果
- const glowEffect = document.createElement('div');
- glowEffect.className = 'glow-effect';
- document.body.appendChild(glowEffect);
- }
-
- // 显示加载状态
- showLoading() {
- const loading = document.getElementById('loading');
- const ipInfo = document.getElementById('ipInfo');
- const errorMessage = document.getElementById('errorMessage');
- const queryBtn = document.getElementById('queryBtn');
-
- if (loading) loading.style.display = 'block';
- if (ipInfo) ipInfo.style.display = 'none';
- if (errorMessage) errorMessage.style.display = 'none';
- if (queryBtn) {
- queryBtn.disabled = true;
- queryBtn.innerHTML = ' 查询中...';
- }
- }
-
- // 隐藏加载状态
- hideLoading() {
- const loading = document.getElementById('loading');
- const queryBtn = document.getElementById('queryBtn');
-
- if (loading) loading.style.display = 'none';
- if (queryBtn) {
- queryBtn.disabled = false;
- queryBtn.innerHTML = ' 查询我的IP';
- }
- }
-
- // 显示错误信息
- showError(message) {
- const errorMessage = document.getElementById('error-message');
- const ipInfo = document.getElementById('ip-info');
-
- if (errorMessage) {
- errorMessage.style.display = 'block';
- const errorText = errorMessage.querySelector('p');
- if (errorText) errorText.textContent = message || '获取IP信息失败,请稍后重试';
- }
- if (ipInfo) ipInfo.style.display = 'none';
-
- this.hideLoading();
- }
-
- // 查询IP地址
- async queryIP() {
- try {
- this.showLoading();
- console.log('开始查询IP地址...');
-
- const response = await fetch(this.apiEndpoint, {
- method: 'GET',
- headers: {
- 'Accept': 'application/json',
- 'Content-Type': 'application/json'
- }
- });
-
- console.log('API响应状态:', response.status);
-
- if (!response.ok) {
- throw new Error(`HTTP错误: ${response.status}`);
- }
-
- const data = await response.json();
- console.log('API返回数据:', data);
-
- if (data.code === 200 && data.data) {
- this.displayIPInfo(data.data);
- } else {
- throw new Error(data.message || '获取IP信息失败');
- }
-
- } catch (error) {
- console.error('查询IP失败:', error);
- this.showError(error.message);
- }
- }
-
- // 显示IP信息
- displayIPInfo(data) {
- const ipInfo = document.getElementById('ip-info');
- const errorMessage = document.getElementById('error-message');
-
- // 更新IP地址显示
- const ipAddressElement = document.getElementById('ip-address');
- if (ipAddressElement && data.ip) {
- ipAddressElement.textContent = data.ip;
- }
-
- // 更新查询时间
- const queryTimeElement = document.getElementById('query-time');
- if (queryTimeElement) {
- const now = new Date();
- queryTimeElement.textContent = now.toLocaleString('zh-CN');
- }
-
- // 更新详细信息 - 只显示API提供的数据
- if (data.location) this.updateDetailItem('location', data.location);
- else this.hideDetailItem('location');
-
- if (data.isp) this.updateDetailItem('isp', data.isp);
- else this.hideDetailItem('isp');
-
- if (data.country) this.updateDetailItem('country', data.country);
- else this.hideDetailItem('country');
-
- if (data.region) this.updateDetailItem('region', data.region);
- else this.hideDetailItem('region');
-
- if (data.city) this.updateDetailItem('city', data.city);
- else this.hideDetailItem('city');
-
- if (data.timezone) this.updateDetailItem('timezone', data.timezone);
- else this.hideDetailItem('timezone');
-
- // 显示IP信息,隐藏错误信息
- if (ipInfo) ipInfo.style.display = 'block';
- if (errorMessage) errorMessage.style.display = 'none';
-
- this.hideLoading();
- console.log('IP信息显示完成');
- }
-
- // 更新详细信息项
- updateDetailItem(id, value) {
- const element = document.getElementById(id);
- if (element) {
- element.textContent = value;
- // 显示对应的详细信息行
- const detailRow = element.closest('.detail-item');
- if (detailRow) {
- detailRow.style.display = 'flex';
- }
- }
- }
-
- // 隐藏详细信息项
- hideDetailItem(id) {
- const element = document.getElementById(id);
- if (element) {
- // 隐藏整个详细信息行
- const detailRow = element.closest('.detail-item');
- if (detailRow) {
- detailRow.style.display = 'none';
- }
- }
- }
-
- // 复制IP地址
- async copyIP() {
- const ipAddressElement = document.getElementById('ip-address');
- const copyBtn = document.getElementById('copyBtn');
-
- if (!ipAddressElement || !ipAddressElement.textContent) {
- this.showToast('没有可复制的IP地址', 'error');
- return;
- }
-
- try {
- await navigator.clipboard.writeText(ipAddressElement.textContent);
-
- // 更新按钮状态
- if (copyBtn) {
- const originalHTML = copyBtn.innerHTML;
- copyBtn.innerHTML = '';
- copyBtn.style.background = '#50c878';
-
- setTimeout(() => {
- copyBtn.innerHTML = originalHTML;
- copyBtn.style.background = '#4a90e2';
- }, 1500);
- }
-
- this.showToast('IP地址已复制到剪贴板', 'success');
- console.log('IP地址已复制:', ipAddressElement.textContent);
-
- } catch (error) {
- console.error('复制失败:', error);
- this.showToast('复制失败,请手动选择复制', 'error');
- }
- }
-
- // 显示提示消息
- showToast(message, type = 'info') {
- // 移除已存在的toast
- const existingToast = document.querySelector('.toast');
- if (existingToast) {
- existingToast.remove();
- }
-
- // 创建新的toast
- const toast = document.createElement('div');
- toast.className = `toast toast-${type}`;
- toast.innerHTML = `
-
- ${message}
- `;
-
- // 添加toast样式
- toast.style.cssText = `
- position: fixed;
- top: 20px;
- right: 20px;
- background: ${type === 'success' ? '#50c878' : type === 'error' ? '#ff6b6b' : '#4a90e2'};
- color: white;
- padding: 1rem 1.5rem;
- border-radius: 10px;
- box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
- z-index: 1000;
- display: flex;
- align-items: center;
- gap: 0.5rem;
- font-weight: 500;
- animation: slideInRight 0.3s ease;
- max-width: 300px;
- `;
-
- // 添加动画样式
- const style = document.createElement('style');
- style.textContent = `
- @keyframes slideInRight {
- from {
- transform: translateX(100%);
- opacity: 0;
- }
- to {
- transform: translateX(0);
- opacity: 1;
- }
- }
- @keyframes slideOutRight {
- from {
- transform: translateX(0);
- opacity: 1;
- }
- to {
- transform: translateX(100%);
- opacity: 0;
- }
- }
- `;
- document.head.appendChild(style);
-
- document.body.appendChild(toast);
-
- // 3秒后自动移除
- setTimeout(() => {
- toast.style.animation = 'slideOutRight 0.3s ease';
- setTimeout(() => {
- if (toast.parentNode) {
- toast.remove();
- }
- if (style.parentNode) {
- style.remove();
- }
- }, 300);
- }, 3000);
- }
-
- // 格式化时间
- formatTime(timestamp) {
- const date = new Date(timestamp);
- return date.toLocaleString('zh-CN', {
- year: 'numeric',
- month: '2-digit',
- day: '2-digit',
- hour: '2-digit',
- minute: '2-digit',
- second: '2-digit'
- });
- }
-}
-
-// 初始化应用
-const app = new IPQueryApp();
-
-// 导出到全局作用域(用于调试)
+// 公网IP地址查询应用
+class IPQueryApp {
+ constructor() {
+ this.apiEndpoint = 'https://60s.api.shumengya.top/v2/ip';
+ this.init();
+ }
+
+ // 初始化应用
+ init() {
+ this.bindEvents();
+ this.createParticles();
+ this.createBackgroundElements();
+ console.log('IP查询应用初始化完成');
+ }
+
+ // 绑定事件
+ bindEvents() {
+ const queryBtn = document.getElementById('queryBtn');
+ const retryBtn = document.getElementById('retryBtn');
+ const copyBtn = document.getElementById('copyBtn');
+
+ if (queryBtn) {
+ queryBtn.addEventListener('click', () => this.queryIP());
+ }
+
+ if (retryBtn) {
+ retryBtn.addEventListener('click', () => this.queryIP());
+ }
+
+ if (copyBtn) {
+ copyBtn.addEventListener('click', () => this.copyIP());
+ }
+
+ // 页面加载完成后自动查询一次
+ document.addEventListener('DOMContentLoaded', () => {
+ setTimeout(() => this.queryIP(), 500);
+ });
+ }
+
+ // 创建浮动粒子
+ createParticles() {
+ const particlesContainer = document.createElement('div');
+ particlesContainer.className = 'particles';
+ document.body.appendChild(particlesContainer);
+
+ for (let i = 0; i < 10; i++) {
+ const particle = document.createElement('div');
+ particle.className = 'particle';
+ particlesContainer.appendChild(particle);
+ }
+ }
+
+ // 创建背景元素
+ createBackgroundElements() {
+ // 创建网格背景
+ const gridBackground = document.createElement('div');
+ gridBackground.className = 'grid-background';
+ document.body.appendChild(gridBackground);
+
+ // 创建光晕效果
+ const glowEffect = document.createElement('div');
+ glowEffect.className = 'glow-effect';
+ document.body.appendChild(glowEffect);
+ }
+
+ // 显示加载状态
+ showLoading() {
+ const loading = document.getElementById('loading');
+ const ipInfo = document.getElementById('ipInfo');
+ const errorMessage = document.getElementById('errorMessage');
+ const queryBtn = document.getElementById('queryBtn');
+
+ if (loading) loading.style.display = 'block';
+ if (ipInfo) ipInfo.style.display = 'none';
+ if (errorMessage) errorMessage.style.display = 'none';
+ if (queryBtn) {
+ queryBtn.disabled = true;
+ queryBtn.innerHTML = ' 查询中...';
+ }
+ }
+
+ // 隐藏加载状态
+ hideLoading() {
+ const loading = document.getElementById('loading');
+ const queryBtn = document.getElementById('queryBtn');
+
+ if (loading) loading.style.display = 'none';
+ if (queryBtn) {
+ queryBtn.disabled = false;
+ queryBtn.innerHTML = ' 查询我的IP';
+ }
+ }
+
+ // 显示错误信息
+ showError(message) {
+ const errorMessage = document.getElementById('error-message');
+ const ipInfo = document.getElementById('ip-info');
+
+ if (errorMessage) {
+ errorMessage.style.display = 'block';
+ const errorText = errorMessage.querySelector('p');
+ if (errorText) errorText.textContent = message || '获取IP信息失败,请稍后重试';
+ }
+ if (ipInfo) ipInfo.style.display = 'none';
+
+ this.hideLoading();
+ }
+
+ // 查询IP地址
+ async queryIP() {
+ try {
+ this.showLoading();
+ console.log('开始查询IP地址...');
+
+ const response = await fetch(this.apiEndpoint, {
+ method: 'GET',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json'
+ }
+ });
+
+ console.log('API响应状态:', response.status);
+
+ if (!response.ok) {
+ throw new Error(`HTTP错误: ${response.status}`);
+ }
+
+ const data = await response.json();
+ console.log('API返回数据:', data);
+
+ if (data.code === 200 && data.data) {
+ this.displayIPInfo(data.data);
+ } else {
+ throw new Error(data.message || '获取IP信息失败');
+ }
+
+ } catch (error) {
+ console.error('查询IP失败:', error);
+ this.showError(error.message);
+ }
+ }
+
+ // 显示IP信息
+ displayIPInfo(data) {
+ const ipInfo = document.getElementById('ip-info');
+ const errorMessage = document.getElementById('error-message');
+
+ // 更新IP地址显示
+ const ipAddressElement = document.getElementById('ip-address');
+ if (ipAddressElement && data.ip) {
+ ipAddressElement.textContent = data.ip;
+ }
+
+ // 更新查询时间
+ const queryTimeElement = document.getElementById('query-time');
+ if (queryTimeElement) {
+ const now = new Date();
+ queryTimeElement.textContent = now.toLocaleString('zh-CN');
+ }
+
+ // 更新详细信息 - 只显示API提供的数据
+ if (data.location) this.updateDetailItem('location', data.location);
+ else this.hideDetailItem('location');
+
+ if (data.isp) this.updateDetailItem('isp', data.isp);
+ else this.hideDetailItem('isp');
+
+ if (data.country) this.updateDetailItem('country', data.country);
+ else this.hideDetailItem('country');
+
+ if (data.region) this.updateDetailItem('region', data.region);
+ else this.hideDetailItem('region');
+
+ if (data.city) this.updateDetailItem('city', data.city);
+ else this.hideDetailItem('city');
+
+ if (data.timezone) this.updateDetailItem('timezone', data.timezone);
+ else this.hideDetailItem('timezone');
+
+ // 显示IP信息,隐藏错误信息
+ if (ipInfo) ipInfo.style.display = 'block';
+ if (errorMessage) errorMessage.style.display = 'none';
+
+ this.hideLoading();
+ console.log('IP信息显示完成');
+ }
+
+ // 更新详细信息项
+ updateDetailItem(id, value) {
+ const element = document.getElementById(id);
+ if (element) {
+ element.textContent = value;
+ // 显示对应的详细信息行
+ const detailRow = element.closest('.detail-item');
+ if (detailRow) {
+ detailRow.style.display = 'flex';
+ }
+ }
+ }
+
+ // 隐藏详细信息项
+ hideDetailItem(id) {
+ const element = document.getElementById(id);
+ if (element) {
+ // 隐藏整个详细信息行
+ const detailRow = element.closest('.detail-item');
+ if (detailRow) {
+ detailRow.style.display = 'none';
+ }
+ }
+ }
+
+ // 复制IP地址
+ async copyIP() {
+ const ipAddressElement = document.getElementById('ip-address');
+ const copyBtn = document.getElementById('copyBtn');
+
+ if (!ipAddressElement || !ipAddressElement.textContent) {
+ this.showToast('没有可复制的IP地址', 'error');
+ return;
+ }
+
+ try {
+ await navigator.clipboard.writeText(ipAddressElement.textContent);
+
+ // 更新按钮状态
+ if (copyBtn) {
+ const originalHTML = copyBtn.innerHTML;
+ copyBtn.innerHTML = '';
+ copyBtn.style.background = '#50c878';
+
+ setTimeout(() => {
+ copyBtn.innerHTML = originalHTML;
+ copyBtn.style.background = '#4a90e2';
+ }, 1500);
+ }
+
+ this.showToast('IP地址已复制到剪贴板', 'success');
+ console.log('IP地址已复制:', ipAddressElement.textContent);
+
+ } catch (error) {
+ console.error('复制失败:', error);
+ this.showToast('复制失败,请手动选择复制', 'error');
+ }
+ }
+
+ // 显示提示消息
+ showToast(message, type = 'info') {
+ // 移除已存在的toast
+ const existingToast = document.querySelector('.toast');
+ if (existingToast) {
+ existingToast.remove();
+ }
+
+ // 创建新的toast
+ const toast = document.createElement('div');
+ toast.className = `toast toast-${type}`;
+ toast.innerHTML = `
+
+ ${message}
+ `;
+
+ // 添加toast样式
+ toast.style.cssText = `
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ background: ${type === 'success' ? '#50c878' : type === 'error' ? '#ff6b6b' : '#4a90e2'};
+ color: white;
+ padding: 1rem 1.5rem;
+ border-radius: 10px;
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
+ z-index: 1000;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ font-weight: 500;
+ animation: slideInRight 0.3s ease;
+ max-width: 300px;
+ `;
+
+ // 添加动画样式
+ const style = document.createElement('style');
+ style.textContent = `
+ @keyframes slideInRight {
+ from {
+ transform: translateX(100%);
+ opacity: 0;
+ }
+ to {
+ transform: translateX(0);
+ opacity: 1;
+ }
+ }
+ @keyframes slideOutRight {
+ from {
+ transform: translateX(0);
+ opacity: 1;
+ }
+ to {
+ transform: translateX(100%);
+ opacity: 0;
+ }
+ }
+ `;
+ document.head.appendChild(style);
+
+ document.body.appendChild(toast);
+
+ // 3秒后自动移除
+ setTimeout(() => {
+ toast.style.animation = 'slideOutRight 0.3s ease';
+ setTimeout(() => {
+ if (toast.parentNode) {
+ toast.remove();
+ }
+ if (style.parentNode) {
+ style.remove();
+ }
+ }, 300);
+ }, 3000);
+ }
+
+ // 格式化时间
+ formatTime(timestamp) {
+ const date = new Date(timestamp);
+ return date.toLocaleString('zh-CN', {
+ year: 'numeric',
+ month: '2-digit',
+ day: '2-digit',
+ hour: '2-digit',
+ minute: '2-digit',
+ second: '2-digit'
+ });
+ }
+}
+
+// 初始化应用
+const app = new IPQueryApp();
+
+// 导出到全局作用域(用于调试)
window.IPQueryApp = app;
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/接口集合.json b/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/接口集合.json
index 36e557bf..5f95c7b9 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/接口集合.json
+++ b/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/接口集合.json
@@ -1,3 +1,3 @@
-[
- "https://60s.api.shumengya.top/v2/ip"
+[
+ "https://60s.api.shumengya.top/v2/ip"
]
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/返回接口.json
index d10b040f..ca6fcb11 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/实用功能/公网IP地址/返回接口.json
@@ -1,17 +1,17 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "ip": "2401:b60:16:83::"
- }
-}
-
-// 注意:此API只返回IP地址,不包含以下信息:
-// - location (位置信息)
-// - isp (网络服务商)
-// - country (国家)
-// - region (地区)
-// - city (城市)
-// - timezone (时区)
-//
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "ip": "2401:b60:16:83::"
+ }
+}
+
+// 注意:此API只返回IP地址,不包含以下信息:
+// - location (位置信息)
+// - isp (网络服务商)
+// - country (国家)
+// - region (地区)
+// - city (城市)
+// - timezone (时区)
+//
// 如需这些信息,需要使用其他API服务
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/css/background.css b/InfoGenie-frontend/public/60sapi/实用功能/农历信息/css/background.css
index 4b346b4f..2b5c219b 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/css/background.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/农历信息/css/background.css
@@ -1,590 +1,590 @@
-/* 全局滚动条隐藏样式 */
-html, body {
- scrollbar-width: none; /* Firefox */
- -ms-overflow-style: none; /* IE/Edge */
-}
-
-html::-webkit-scrollbar,
-body::-webkit-scrollbar,
-*::-webkit-scrollbar {
- display: none; /* Webkit浏览器 */
-}
-
-/* 农历主题背景样式 - 淡黄绿色到淡绿色清新渐变 */
-body {
- background: linear-gradient(135deg,
- #f0f8e8 0%, /* 淡黄绿色 */
- #e8f5e8 20%, /* 浅绿色 */
- #d4f4dd 40%, /* 淡绿色 */
- #c8f2d4 60%, /* 清新绿色 */
- #b8f0c8 80%, /* 柔和绿色 */
- #e8f5e8 100% /* 浅绿色 */
- );
- background-size: 400% 400%;
- animation: gentleShift 30s ease infinite;
- background-attachment: fixed;
- min-height: 100vh;
- position: relative;
- /* 隐藏滚动条但保留滚动功能 */
- scrollbar-width: none; /* Firefox */
- -ms-overflow-style: none; /* IE/Edge */
-}
-
-@keyframes gentleShift {
- 0% { background-position: 0% 50%; }
- 25% { background-position: 100% 50%; }
- 50% { background-position: 100% 100%; }
- 75% { background-position: 0% 100%; }
- 100% { background-position: 0% 50%; }
-}
-
-/* 动态颜色调节系统 - 绿色主题版本 */
-.adaptive-overlay {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background:
- radial-gradient(circle at 20% 30%, rgba(200, 242, 212, 0.3) 0%, transparent 50%),
- radial-gradient(circle at 80% 70%, rgba(184, 240, 200, 0.25) 0%, transparent 50%),
- linear-gradient(45deg, rgba(232, 245, 232, 0.2) 0%, rgba(212, 244, 221, 0.3) 100%);
- pointer-events: none;
- z-index: 1;
- animation: adaptiveShift 60s ease infinite;
-}
-
-@keyframes adaptiveShift {
- 0% {
- background:
- radial-gradient(circle at 20% 30%, rgba(232, 245, 232, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 80% 70%, rgba(212, 244, 221, 0.15) 0%, transparent 50%),
- linear-gradient(45deg, rgba(240, 248, 232, 0.1) 0%, rgba(232, 245, 232, 0.2) 100%);
- }
- 25% {
- background:
- radial-gradient(circle at 70% 20%, rgba(200, 242, 212, 0.2) 0%, transparent 50%),
- radial-gradient(circle at 30% 80%, rgba(184, 240, 200, 0.1) 0%, transparent 50%),
- linear-gradient(135deg, rgba(212, 244, 221, 0.15) 0%, rgba(200, 242, 212, 0.25) 100%);
- }
- 50% {
- background:
- radial-gradient(circle at 50% 50%, rgba(220, 246, 228, 0.15) 0%, transparent 50%),
- radial-gradient(circle at 10% 90%, rgba(232, 245, 232, 0.12) 0%, transparent 50%),
- linear-gradient(225deg, rgba(240, 248, 232, 0.12) 0%, rgba(212, 244, 221, 0.22) 100%);
- }
- 75% {
- background:
- radial-gradient(circle at 90% 60%, rgba(184, 240, 200, 0.18) 0%, transparent 50%),
- radial-gradient(circle at 40% 10%, rgba(240, 248, 232, 0.08) 0%, transparent 50%),
- linear-gradient(315deg, rgba(232, 245, 232, 0.1) 0%, rgba(200, 242, 212, 0.2) 100%);
- }
- 100% {
- background:
- radial-gradient(circle at 20% 30%, rgba(232, 245, 232, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 80% 70%, rgba(212, 244, 221, 0.15) 0%, transparent 50%),
- linear-gradient(45deg, rgba(240, 248, 232, 0.1) 0%, rgba(232, 245, 232, 0.2) 100%);
- }
-}
-
-/* 高清稻穗贴图层 */
-body::before {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- /* 主稻穗束 - 高清细节 */
- radial-gradient(ellipse 1.5px 12px at 50% 45%, #DAA520 0%, #B8860B 30%, transparent 80%),
- radial-gradient(ellipse 1px 10px at 48% 50%, #FFD700 0%, #DAA520 40%, transparent 75%),
- radial-gradient(ellipse 1.2px 11px at 52% 48%, #FFCC00 0%, #B8860B 35%, transparent 78%),
- radial-gradient(ellipse 0.8px 9px at 49% 52%, #F4A460 0%, #DAA520 45%, transparent 70%),
- radial-gradient(ellipse 1.3px 13px at 51% 46%, #DEB887 0%, #B8860B 38%, transparent 82%),
-
- /* 次级稻穗 */
- radial-gradient(ellipse 1px 8px at 30% 35%, #FFD700 0%, #DAA520 50%, transparent 75%),
- radial-gradient(ellipse 0.9px 7px at 32% 38%, #FFCC00 0%, #B8860B 45%, transparent 70%),
- radial-gradient(ellipse 1.1px 9px at 28% 36%, #DEB887 0%, #DAA520 40%, transparent 78%),
-
- radial-gradient(ellipse 1px 8px at 70% 65%, #FFD700 0%, #DAA520 50%, transparent 75%),
- radial-gradient(ellipse 0.8px 7px at 72% 68%, #F4A460 0%, #B8860B 45%, transparent 70%),
- radial-gradient(ellipse 1.2px 9px at 68% 66%, #FFCC00 0%, #DAA520 40%, transparent 78%),
-
- /* 散落稻粒 */
- radial-gradient(ellipse 0.5px 4px at 20% 80%, #FFD700 0%, transparent 60%),
- radial-gradient(ellipse 0.6px 5px at 80% 20%, #FFCC00 0%, transparent 65%),
- radial-gradient(ellipse 0.4px 3px at 15% 25%, #DEB887 0%, transparent 55%),
- radial-gradient(ellipse 0.7px 6px at 85% 75%, #DAA520 0%, transparent 70%),
-
- /* 稻穗茎秆 - 更细致 */
- linear-gradient(88deg, transparent 49%, #9ACD32 49.5%, #8FBC8F 50%, #9ACD32 50.5%, transparent 51%),
- linear-gradient(92deg, transparent 49%, #8FBC8F 49.5%, #228B22 50%, #8FBC8F 50.5%, transparent 51%),
- linear-gradient(85deg, transparent 49%, #32CD32 49.5%, #9ACD32 50%, #32CD32 50.5%, transparent 51%);
-
- background-size:
- 25px 25px, 24px 24px, 26px 26px, 23px 23px, 27px 27px,
- 20px 20px, 19px 19px, 21px 21px,
- 22px 22px, 18px 18px, 23px 23px,
- 15px 15px, 16px 16px, 14px 14px, 17px 17px,
- 80px 80px, 85px 85px, 75px 75px;
-
- background-position:
- 0 0, 12px 12px, 6px 18px, 18px 6px, 3px 21px,
- 40px 40px, 52px 48px, 35px 55px,
- 120px 120px, 135px 115px, 110px 130px,
- 200px 200px, 220px 180px, 180px 220px, 240px 160px,
- 0 0, 40px 40px, 20px 60px;
-
- opacity: 0.25;
- pointer-events: none;
- z-index: -2;
- animation: wheatSway 20s ease-in-out infinite;
-}
-
-@keyframes wheatSway {
- 0%, 100% {
- transform: translateX(0) rotate(0deg);
- }
- 25% {
- transform: translateX(5px) rotate(0.5deg);
- }
- 50% {
- transform: translateX(-3px) rotate(-0.3deg);
- }
- 75% {
- transform: translateX(2px) rotate(0.2deg);
- }
-}
-
-/* 大型稻穗背景层 */
-body::after {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- /* 主稻穗茎秆 - 右侧大型 */
- linear-gradient(85deg, transparent 45%, #9ACD32 47%, #8FBC8F 48%, #228B22 49%, #8FBC8F 50%, #9ACD32 51%, transparent 53%),
- linear-gradient(87deg, transparent 46%, #32CD32 47.5%, #9ACD32 48.5%, #8FBC8F 49.5%, #9ACD32 50.5%, #32CD32 51.5%, transparent 54%),
-
- /* 主稻穗穗头 - 大型椭圆稻粒群 */
- radial-gradient(ellipse 8px 25px at 75% 15%, #FFD700 0%, #DAA520 30%, #B8860B 60%, transparent 85%),
- radial-gradient(ellipse 7px 23px at 77% 18%, #FFCC00 0%, #DAA520 35%, transparent 80%),
- radial-gradient(ellipse 9px 27px at 73% 12%, #F4A460 0%, #B8860B 40%, transparent 88%),
- radial-gradient(ellipse 6px 22px at 79% 20%, #DEB887 0%, #DAA520 45%, transparent 75%),
- radial-gradient(ellipse 8px 24px at 75% 16%, #FFD700 0%, #B8860B 38%, transparent 82%),
-
- /* 稻穗分支 */
- radial-gradient(ellipse 5px 18px at 72% 25%, #FFCC00 0%, #DAA520 50%, transparent 75%),
- radial-gradient(ellipse 4px 16px at 78% 28%, #F4A460 0%, #B8860B 45%, transparent 70%),
- radial-gradient(ellipse 6px 20px at 70% 22%, #DEB887 0%, #DAA520 40%, transparent 78%),
- radial-gradient(ellipse 5px 17px at 80% 30%, #FFD700 0%, #B8860B 42%, transparent 76%),
-
- /* 左侧稻穗茎秆 */
- linear-gradient(95deg, transparent 15%, #9ACD32 17%, #8FBC8F 18%, #228B22 19%, #8FBC8F 20%, #9ACD32 21%, transparent 23%),
-
- /* 左侧稻穗穗头 */
- radial-gradient(ellipse 6px 20px at 25% 25%, #FFD700 0%, #DAA520 30%, transparent 80%),
- radial-gradient(ellipse 5px 18px at 27% 28%, #FFCC00 0%, #B8860B 35%, transparent 75%),
- radial-gradient(ellipse 7px 22px at 23% 22%, #F4A460 0%, #DAA520 40%, transparent 85%),
-
- /* 麦田远景效果 */
- linear-gradient(180deg, transparent 70%, rgba(255, 215, 0, 0.1) 75%, rgba(218, 165, 32, 0.15) 85%, rgba(255, 215, 0, 0.2) 95%, rgba(255, 215, 0, 0.25) 100%),
-
- /* 散落稻粒 */
- radial-gradient(ellipse 2px 8px at 60% 40%, #FFD700 0%, transparent 60%),
- radial-gradient(ellipse 1.5px 6px at 40% 60%, #FFCC00 0%, transparent 65%),
- radial-gradient(ellipse 2.5px 10px at 85% 50%, #DEB887 0%, transparent 70%),
- radial-gradient(ellipse 1.8px 7px at 15% 80%, #DAA520 0%, transparent 68%);
-
- background-size:
- /* 主茎秆 */
- 100vw 80vh, 100vw 82vh,
- /* 主穗头 */
- 50vw 60vh, 48vw 58vh, 52vw 62vh, 46vw 56vh, 50vw 60vh,
- /* 分支 */
- 40vw 50vh, 38vw 48vh, 42vw 52vh, 36vw 46vh,
- /* 左侧茎秆 */
- 100vw 70vh,
- /* 左侧穗头 */
- 35vw 45vh, 33vw 43vh, 37vw 47vh,
- /* 麦田远景 */
- 100vw 100vh,
- /* 散落稻粒 */
- 20vw 20vh, 25vw 25vh, 30vw 30vh, 22vw 22vh;
-
- background-position:
- /* 主茎秆 */
- 70% 20%, 72% 18%,
- /* 主穗头 */
- 60% 0%, 62% 2%, 58% -2%, 64% 4%, 60% 1%,
- /* 分支 */
- 65% 15%, 67% 17%, 63% 13%, 69% 19%,
- /* 左侧茎秆 */
- 20% 30%,
- /* 左侧穗头 */
- 15% 20%, 17% 22%, 13% 18%,
- /* 麦田远景 */
- 0% 0%,
- /* 散落稻粒 */
- 30% 50%, 50% 70%, 80% 40%, 10% 80%;
-
- background-repeat: no-repeat;
- opacity: 0.4;
- pointer-events: none;
- z-index: -1;
- animation: wheatSway 25s ease-in-out infinite;
-}
-
-@keyframes spiralRotate {
- 0% {
- transform: rotate(0deg);
- }
- 100% {
- transform: rotate(360deg);
- }
-}
-
-/* 流星效果容器 */
-.meteor-container {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- pointer-events: none;
- z-index: -1;
- overflow: hidden;
-}
-
-/* 流星轨迹 */
-.meteor {
- position: absolute;
- width: 2px;
- height: 2px;
- background: radial-gradient(circle, #FFD700 0%, #FFA500 50%, transparent 100%);
- border-radius: 50%;
- box-shadow:
- 0 0 10px #FFD700,
- 0 0 20px #FFA500,
- 0 0 30px #FF8C00;
- animation: meteorFall linear infinite;
-}
-
-/* 流星尾迹 */
-.meteor::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- width: 100px;
- height: 1px;
- background: linear-gradient(90deg,
- #FFD700 0%,
- #FFA500 30%,
- #FF8C00 60%,
- transparent 100%);
- transform-origin: 0 50%;
- transform: rotate(-45deg);
- opacity: 0.8;
-}
-
-@keyframes meteorFall {
- 0% {
- transform: translateX(-100px) translateY(-100px);
- opacity: 0;
- }
- 10% {
- opacity: 1;
- }
- 90% {
- opacity: 1;
- }
- 100% {
- transform: translateX(calc(100vw + 100px)) translateY(calc(100vh + 100px));
- opacity: 0;
- }
-}
-
-/* 多个流星的不同轨迹 */
-.meteor:nth-child(1) {
- top: 10%;
- left: -100px;
- animation-duration: 8s;
- animation-delay: 0s;
-}
-
-.meteor:nth-child(2) {
- top: 20%;
- left: -100px;
- animation-duration: 12s;
- animation-delay: 2s;
-}
-
-.meteor:nth-child(3) {
- top: 30%;
- left: -100px;
- animation-duration: 10s;
- animation-delay: 4s;
-}
-
-.meteor:nth-child(4) {
- top: 50%;
- left: -100px;
- animation-duration: 15s;
- animation-delay: 6s;
-}
-
-.meteor:nth-child(5) {
- top: 70%;
- left: -100px;
- animation-duration: 9s;
- animation-delay: 8s;
-}
-
-.meteor:nth-child(6) {
- top: 80%;
- left: -100px;
- animation-duration: 11s;
- animation-delay: 10s;
-}
-
-/* 金色粒子效果 */
-.golden-particles {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- pointer-events: none;
- z-index: -1;
-}
-
-.particle {
- position: absolute;
- width: 3px;
- height: 3px;
- background: radial-gradient(circle, #FFD700 0%, #FFA500 70%, transparent 100%);
- border-radius: 50%;
- animation: particleFloat linear infinite;
-}
-
-@keyframes particleFloat {
- 0% {
- transform: translateY(100vh) rotate(0deg);
- opacity: 0;
- }
- 10% {
- opacity: 1;
- }
- 90% {
- opacity: 1;
- }
- 100% {
- transform: translateY(-100px) rotate(360deg);
- opacity: 0;
- }
-}
-
-/* 粒子的不同位置和动画时长 */
-.particle:nth-child(1) { left: 10%; animation-duration: 20s; animation-delay: 0s; }
-.particle:nth-child(2) { left: 20%; animation-duration: 25s; animation-delay: 2s; }
-.particle:nth-child(3) { left: 30%; animation-duration: 18s; animation-delay: 4s; }
-.particle:nth-child(4) { left: 40%; animation-duration: 22s; animation-delay: 6s; }
-.particle:nth-child(5) { left: 50%; animation-duration: 24s; animation-delay: 8s; }
-.particle:nth-child(6) { left: 60%; animation-duration: 19s; animation-delay: 10s; }
-.particle:nth-child(7) { left: 70%; animation-duration: 21s; animation-delay: 12s; }
-.particle:nth-child(8) { left: 80%; animation-duration: 23s; animation-delay: 14s; }
-.particle:nth-child(9) { left: 90%; animation-duration: 26s; animation-delay: 16s; }
-
-/* 响应式设计 */
-@media (max-width: 768px) {
- .meteor {
- width: 1px;
- height: 1px;
- }
-
- .meteor::before {
- width: 50px;
- }
-
- .particle {
- width: 2px;
- height: 2px;
- }
-
- body::before {
- background-size:
- 30px 30px, 25px 25px, 35px 35px, 28px 28px, 32px 32px,
- 40px 40px, 45px 45px;
- }
-
- body::after {
- background-size: 200px 200px, 150px 150px, 100px 100px;
- }
-}
-
-/* 麦穗飘舞特效 */
-.wheat-floating {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- pointer-events: none;
- z-index: 2;
- overflow: hidden;
-}
-
-/* 移动设备性能优化 */
-@media (max-width: 768px) {
- .wheat-floating {
- display: none;
- }
-
- .golden-particles {
- display: none;
- }
-
- .meteor-container {
- display: none;
- }
-
- .adaptive-overlay {
- animation: none;
- background: rgba(255, 255, 255, 0.1);
- }
-}
-
-.wheat-particle {
- position: absolute;
- width: 8px;
- height: 20px;
- background: linear-gradient(180deg,
- #FFD700 0%,
- #DAA520 50%,
- #B8860B 100%
- );
- border-radius: 50% 50% 50% 50% / 60% 60% 40% 40%;
- opacity: 0.7;
- animation: wheatFloat 15s linear infinite;
-}
-
-.wheat-particle::before {
- content: '';
- position: absolute;
- top: -3px;
- left: 50%;
- transform: translateX(-50%);
- width: 2px;
- height: 8px;
- background: #8B7355;
- border-radius: 1px;
-}
-
-.wheat-particle::after {
- content: '';
- position: absolute;
- top: 2px;
- left: 1px;
- width: 2px;
- height: 4px;
- background: #FFEC8C;
- border-radius: 50%;
- box-shadow:
- 3px 2px 0 #FFEC8C,
- 1px 6px 0 #FFEC8C,
- 4px 8px 0 #FFEC8C;
-}
-
-@keyframes wheatFloat {
- 0% {
- transform: translateY(-100vh) translateX(0) rotate(0deg);
- opacity: 0;
- }
- 10% {
- opacity: 0.7;
- }
- 90% {
- opacity: 0.7;
- }
- 100% {
- transform: translateY(100vh) translateX(50px) rotate(360deg);
- opacity: 0;
- }
-}
-
-/* 不同大小和速度的麦穗 */
-.wheat-particle:nth-child(1) {
- left: 10%;
- animation-duration: 12s;
- animation-delay: 0s;
- transform: scale(0.8);
-}
-
-.wheat-particle:nth-child(2) {
- left: 25%;
- animation-duration: 18s;
- animation-delay: 2s;
- transform: scale(1.2);
-}
-
-.wheat-particle:nth-child(3) {
- left: 40%;
- animation-duration: 15s;
- animation-delay: 4s;
- transform: scale(0.9);
-}
-
-.wheat-particle:nth-child(4) {
- left: 60%;
- animation-duration: 20s;
- animation-delay: 1s;
- transform: scale(1.1);
-}
-
-.wheat-particle:nth-child(5) {
- left: 75%;
- animation-duration: 14s;
- animation-delay: 3s;
- transform: scale(0.7);
-}
-
-.wheat-particle:nth-child(6) {
- left: 90%;
- animation-duration: 16s;
- animation-delay: 5s;
- transform: scale(1.0);
-}
-
-.wheat-particle:nth-child(7) {
- left: 5%;
- animation-duration: 22s;
- animation-delay: 6s;
- transform: scale(0.6);
-}
-
-.wheat-particle:nth-child(8) {
- left: 35%;
- animation-duration: 13s;
- animation-delay: 2.5s;
- transform: scale(1.3);
-}
-
-/* 减少动画偏好设置 */
-@media (prefers-reduced-motion: reduce) {
- * {
- animation-duration: 0.01ms !important;
- animation-iteration-count: 1 !important;
- transition-duration: 0.01ms !important;
- }
-
- .meteor,
- .particle {
- display: none;
- }
-}
+/* 全局滚动条隐藏样式 */
+html, body {
+ scrollbar-width: none; /* Firefox */
+ -ms-overflow-style: none; /* IE/Edge */
+}
+
+html::-webkit-scrollbar,
+body::-webkit-scrollbar,
+*::-webkit-scrollbar {
+ display: none; /* Webkit浏览器 */
+}
+
+/* 农历主题背景样式 - 淡黄绿色到淡绿色清新渐变 */
+body {
+ background: linear-gradient(135deg,
+ #f0f8e8 0%, /* 淡黄绿色 */
+ #e8f5e8 20%, /* 浅绿色 */
+ #d4f4dd 40%, /* 淡绿色 */
+ #c8f2d4 60%, /* 清新绿色 */
+ #b8f0c8 80%, /* 柔和绿色 */
+ #e8f5e8 100% /* 浅绿色 */
+ );
+ background-size: 400% 400%;
+ animation: gentleShift 30s ease infinite;
+ background-attachment: fixed;
+ min-height: 100vh;
+ position: relative;
+ /* 隐藏滚动条但保留滚动功能 */
+ scrollbar-width: none; /* Firefox */
+ -ms-overflow-style: none; /* IE/Edge */
+}
+
+@keyframes gentleShift {
+ 0% { background-position: 0% 50%; }
+ 25% { background-position: 100% 50%; }
+ 50% { background-position: 100% 100%; }
+ 75% { background-position: 0% 100%; }
+ 100% { background-position: 0% 50%; }
+}
+
+/* 动态颜色调节系统 - 绿色主题版本 */
+.adaptive-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background:
+ radial-gradient(circle at 20% 30%, rgba(200, 242, 212, 0.3) 0%, transparent 50%),
+ radial-gradient(circle at 80% 70%, rgba(184, 240, 200, 0.25) 0%, transparent 50%),
+ linear-gradient(45deg, rgba(232, 245, 232, 0.2) 0%, rgba(212, 244, 221, 0.3) 100%);
+ pointer-events: none;
+ z-index: 1;
+ animation: adaptiveShift 60s ease infinite;
+}
+
+@keyframes adaptiveShift {
+ 0% {
+ background:
+ radial-gradient(circle at 20% 30%, rgba(232, 245, 232, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 80% 70%, rgba(212, 244, 221, 0.15) 0%, transparent 50%),
+ linear-gradient(45deg, rgba(240, 248, 232, 0.1) 0%, rgba(232, 245, 232, 0.2) 100%);
+ }
+ 25% {
+ background:
+ radial-gradient(circle at 70% 20%, rgba(200, 242, 212, 0.2) 0%, transparent 50%),
+ radial-gradient(circle at 30% 80%, rgba(184, 240, 200, 0.1) 0%, transparent 50%),
+ linear-gradient(135deg, rgba(212, 244, 221, 0.15) 0%, rgba(200, 242, 212, 0.25) 100%);
+ }
+ 50% {
+ background:
+ radial-gradient(circle at 50% 50%, rgba(220, 246, 228, 0.15) 0%, transparent 50%),
+ radial-gradient(circle at 10% 90%, rgba(232, 245, 232, 0.12) 0%, transparent 50%),
+ linear-gradient(225deg, rgba(240, 248, 232, 0.12) 0%, rgba(212, 244, 221, 0.22) 100%);
+ }
+ 75% {
+ background:
+ radial-gradient(circle at 90% 60%, rgba(184, 240, 200, 0.18) 0%, transparent 50%),
+ radial-gradient(circle at 40% 10%, rgba(240, 248, 232, 0.08) 0%, transparent 50%),
+ linear-gradient(315deg, rgba(232, 245, 232, 0.1) 0%, rgba(200, 242, 212, 0.2) 100%);
+ }
+ 100% {
+ background:
+ radial-gradient(circle at 20% 30%, rgba(232, 245, 232, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 80% 70%, rgba(212, 244, 221, 0.15) 0%, transparent 50%),
+ linear-gradient(45deg, rgba(240, 248, 232, 0.1) 0%, rgba(232, 245, 232, 0.2) 100%);
+ }
+}
+
+/* 高清稻穗贴图层 */
+body::before {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ /* 主稻穗束 - 高清细节 */
+ radial-gradient(ellipse 1.5px 12px at 50% 45%, #DAA520 0%, #B8860B 30%, transparent 80%),
+ radial-gradient(ellipse 1px 10px at 48% 50%, #FFD700 0%, #DAA520 40%, transparent 75%),
+ radial-gradient(ellipse 1.2px 11px at 52% 48%, #FFCC00 0%, #B8860B 35%, transparent 78%),
+ radial-gradient(ellipse 0.8px 9px at 49% 52%, #F4A460 0%, #DAA520 45%, transparent 70%),
+ radial-gradient(ellipse 1.3px 13px at 51% 46%, #DEB887 0%, #B8860B 38%, transparent 82%),
+
+ /* 次级稻穗 */
+ radial-gradient(ellipse 1px 8px at 30% 35%, #FFD700 0%, #DAA520 50%, transparent 75%),
+ radial-gradient(ellipse 0.9px 7px at 32% 38%, #FFCC00 0%, #B8860B 45%, transparent 70%),
+ radial-gradient(ellipse 1.1px 9px at 28% 36%, #DEB887 0%, #DAA520 40%, transparent 78%),
+
+ radial-gradient(ellipse 1px 8px at 70% 65%, #FFD700 0%, #DAA520 50%, transparent 75%),
+ radial-gradient(ellipse 0.8px 7px at 72% 68%, #F4A460 0%, #B8860B 45%, transparent 70%),
+ radial-gradient(ellipse 1.2px 9px at 68% 66%, #FFCC00 0%, #DAA520 40%, transparent 78%),
+
+ /* 散落稻粒 */
+ radial-gradient(ellipse 0.5px 4px at 20% 80%, #FFD700 0%, transparent 60%),
+ radial-gradient(ellipse 0.6px 5px at 80% 20%, #FFCC00 0%, transparent 65%),
+ radial-gradient(ellipse 0.4px 3px at 15% 25%, #DEB887 0%, transparent 55%),
+ radial-gradient(ellipse 0.7px 6px at 85% 75%, #DAA520 0%, transparent 70%),
+
+ /* 稻穗茎秆 - 更细致 */
+ linear-gradient(88deg, transparent 49%, #9ACD32 49.5%, #8FBC8F 50%, #9ACD32 50.5%, transparent 51%),
+ linear-gradient(92deg, transparent 49%, #8FBC8F 49.5%, #228B22 50%, #8FBC8F 50.5%, transparent 51%),
+ linear-gradient(85deg, transparent 49%, #32CD32 49.5%, #9ACD32 50%, #32CD32 50.5%, transparent 51%);
+
+ background-size:
+ 25px 25px, 24px 24px, 26px 26px, 23px 23px, 27px 27px,
+ 20px 20px, 19px 19px, 21px 21px,
+ 22px 22px, 18px 18px, 23px 23px,
+ 15px 15px, 16px 16px, 14px 14px, 17px 17px,
+ 80px 80px, 85px 85px, 75px 75px;
+
+ background-position:
+ 0 0, 12px 12px, 6px 18px, 18px 6px, 3px 21px,
+ 40px 40px, 52px 48px, 35px 55px,
+ 120px 120px, 135px 115px, 110px 130px,
+ 200px 200px, 220px 180px, 180px 220px, 240px 160px,
+ 0 0, 40px 40px, 20px 60px;
+
+ opacity: 0.25;
+ pointer-events: none;
+ z-index: -2;
+ animation: wheatSway 20s ease-in-out infinite;
+}
+
+@keyframes wheatSway {
+ 0%, 100% {
+ transform: translateX(0) rotate(0deg);
+ }
+ 25% {
+ transform: translateX(5px) rotate(0.5deg);
+ }
+ 50% {
+ transform: translateX(-3px) rotate(-0.3deg);
+ }
+ 75% {
+ transform: translateX(2px) rotate(0.2deg);
+ }
+}
+
+/* 大型稻穗背景层 */
+body::after {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ /* 主稻穗茎秆 - 右侧大型 */
+ linear-gradient(85deg, transparent 45%, #9ACD32 47%, #8FBC8F 48%, #228B22 49%, #8FBC8F 50%, #9ACD32 51%, transparent 53%),
+ linear-gradient(87deg, transparent 46%, #32CD32 47.5%, #9ACD32 48.5%, #8FBC8F 49.5%, #9ACD32 50.5%, #32CD32 51.5%, transparent 54%),
+
+ /* 主稻穗穗头 - 大型椭圆稻粒群 */
+ radial-gradient(ellipse 8px 25px at 75% 15%, #FFD700 0%, #DAA520 30%, #B8860B 60%, transparent 85%),
+ radial-gradient(ellipse 7px 23px at 77% 18%, #FFCC00 0%, #DAA520 35%, transparent 80%),
+ radial-gradient(ellipse 9px 27px at 73% 12%, #F4A460 0%, #B8860B 40%, transparent 88%),
+ radial-gradient(ellipse 6px 22px at 79% 20%, #DEB887 0%, #DAA520 45%, transparent 75%),
+ radial-gradient(ellipse 8px 24px at 75% 16%, #FFD700 0%, #B8860B 38%, transparent 82%),
+
+ /* 稻穗分支 */
+ radial-gradient(ellipse 5px 18px at 72% 25%, #FFCC00 0%, #DAA520 50%, transparent 75%),
+ radial-gradient(ellipse 4px 16px at 78% 28%, #F4A460 0%, #B8860B 45%, transparent 70%),
+ radial-gradient(ellipse 6px 20px at 70% 22%, #DEB887 0%, #DAA520 40%, transparent 78%),
+ radial-gradient(ellipse 5px 17px at 80% 30%, #FFD700 0%, #B8860B 42%, transparent 76%),
+
+ /* 左侧稻穗茎秆 */
+ linear-gradient(95deg, transparent 15%, #9ACD32 17%, #8FBC8F 18%, #228B22 19%, #8FBC8F 20%, #9ACD32 21%, transparent 23%),
+
+ /* 左侧稻穗穗头 */
+ radial-gradient(ellipse 6px 20px at 25% 25%, #FFD700 0%, #DAA520 30%, transparent 80%),
+ radial-gradient(ellipse 5px 18px at 27% 28%, #FFCC00 0%, #B8860B 35%, transparent 75%),
+ radial-gradient(ellipse 7px 22px at 23% 22%, #F4A460 0%, #DAA520 40%, transparent 85%),
+
+ /* 麦田远景效果 */
+ linear-gradient(180deg, transparent 70%, rgba(255, 215, 0, 0.1) 75%, rgba(218, 165, 32, 0.15) 85%, rgba(255, 215, 0, 0.2) 95%, rgba(255, 215, 0, 0.25) 100%),
+
+ /* 散落稻粒 */
+ radial-gradient(ellipse 2px 8px at 60% 40%, #FFD700 0%, transparent 60%),
+ radial-gradient(ellipse 1.5px 6px at 40% 60%, #FFCC00 0%, transparent 65%),
+ radial-gradient(ellipse 2.5px 10px at 85% 50%, #DEB887 0%, transparent 70%),
+ radial-gradient(ellipse 1.8px 7px at 15% 80%, #DAA520 0%, transparent 68%);
+
+ background-size:
+ /* 主茎秆 */
+ 100vw 80vh, 100vw 82vh,
+ /* 主穗头 */
+ 50vw 60vh, 48vw 58vh, 52vw 62vh, 46vw 56vh, 50vw 60vh,
+ /* 分支 */
+ 40vw 50vh, 38vw 48vh, 42vw 52vh, 36vw 46vh,
+ /* 左侧茎秆 */
+ 100vw 70vh,
+ /* 左侧穗头 */
+ 35vw 45vh, 33vw 43vh, 37vw 47vh,
+ /* 麦田远景 */
+ 100vw 100vh,
+ /* 散落稻粒 */
+ 20vw 20vh, 25vw 25vh, 30vw 30vh, 22vw 22vh;
+
+ background-position:
+ /* 主茎秆 */
+ 70% 20%, 72% 18%,
+ /* 主穗头 */
+ 60% 0%, 62% 2%, 58% -2%, 64% 4%, 60% 1%,
+ /* 分支 */
+ 65% 15%, 67% 17%, 63% 13%, 69% 19%,
+ /* 左侧茎秆 */
+ 20% 30%,
+ /* 左侧穗头 */
+ 15% 20%, 17% 22%, 13% 18%,
+ /* 麦田远景 */
+ 0% 0%,
+ /* 散落稻粒 */
+ 30% 50%, 50% 70%, 80% 40%, 10% 80%;
+
+ background-repeat: no-repeat;
+ opacity: 0.4;
+ pointer-events: none;
+ z-index: -1;
+ animation: wheatSway 25s ease-in-out infinite;
+}
+
+@keyframes spiralRotate {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+/* 流星效果容器 */
+.meteor-container {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ pointer-events: none;
+ z-index: -1;
+ overflow: hidden;
+}
+
+/* 流星轨迹 */
+.meteor {
+ position: absolute;
+ width: 2px;
+ height: 2px;
+ background: radial-gradient(circle, #FFD700 0%, #FFA500 50%, transparent 100%);
+ border-radius: 50%;
+ box-shadow:
+ 0 0 10px #FFD700,
+ 0 0 20px #FFA500,
+ 0 0 30px #FF8C00;
+ animation: meteorFall linear infinite;
+}
+
+/* 流星尾迹 */
+.meteor::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100px;
+ height: 1px;
+ background: linear-gradient(90deg,
+ #FFD700 0%,
+ #FFA500 30%,
+ #FF8C00 60%,
+ transparent 100%);
+ transform-origin: 0 50%;
+ transform: rotate(-45deg);
+ opacity: 0.8;
+}
+
+@keyframes meteorFall {
+ 0% {
+ transform: translateX(-100px) translateY(-100px);
+ opacity: 0;
+ }
+ 10% {
+ opacity: 1;
+ }
+ 90% {
+ opacity: 1;
+ }
+ 100% {
+ transform: translateX(calc(100vw + 100px)) translateY(calc(100vh + 100px));
+ opacity: 0;
+ }
+}
+
+/* 多个流星的不同轨迹 */
+.meteor:nth-child(1) {
+ top: 10%;
+ left: -100px;
+ animation-duration: 8s;
+ animation-delay: 0s;
+}
+
+.meteor:nth-child(2) {
+ top: 20%;
+ left: -100px;
+ animation-duration: 12s;
+ animation-delay: 2s;
+}
+
+.meteor:nth-child(3) {
+ top: 30%;
+ left: -100px;
+ animation-duration: 10s;
+ animation-delay: 4s;
+}
+
+.meteor:nth-child(4) {
+ top: 50%;
+ left: -100px;
+ animation-duration: 15s;
+ animation-delay: 6s;
+}
+
+.meteor:nth-child(5) {
+ top: 70%;
+ left: -100px;
+ animation-duration: 9s;
+ animation-delay: 8s;
+}
+
+.meteor:nth-child(6) {
+ top: 80%;
+ left: -100px;
+ animation-duration: 11s;
+ animation-delay: 10s;
+}
+
+/* 金色粒子效果 */
+.golden-particles {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ pointer-events: none;
+ z-index: -1;
+}
+
+.particle {
+ position: absolute;
+ width: 3px;
+ height: 3px;
+ background: radial-gradient(circle, #FFD700 0%, #FFA500 70%, transparent 100%);
+ border-radius: 50%;
+ animation: particleFloat linear infinite;
+}
+
+@keyframes particleFloat {
+ 0% {
+ transform: translateY(100vh) rotate(0deg);
+ opacity: 0;
+ }
+ 10% {
+ opacity: 1;
+ }
+ 90% {
+ opacity: 1;
+ }
+ 100% {
+ transform: translateY(-100px) rotate(360deg);
+ opacity: 0;
+ }
+}
+
+/* 粒子的不同位置和动画时长 */
+.particle:nth-child(1) { left: 10%; animation-duration: 20s; animation-delay: 0s; }
+.particle:nth-child(2) { left: 20%; animation-duration: 25s; animation-delay: 2s; }
+.particle:nth-child(3) { left: 30%; animation-duration: 18s; animation-delay: 4s; }
+.particle:nth-child(4) { left: 40%; animation-duration: 22s; animation-delay: 6s; }
+.particle:nth-child(5) { left: 50%; animation-duration: 24s; animation-delay: 8s; }
+.particle:nth-child(6) { left: 60%; animation-duration: 19s; animation-delay: 10s; }
+.particle:nth-child(7) { left: 70%; animation-duration: 21s; animation-delay: 12s; }
+.particle:nth-child(8) { left: 80%; animation-duration: 23s; animation-delay: 14s; }
+.particle:nth-child(9) { left: 90%; animation-duration: 26s; animation-delay: 16s; }
+
+/* 响应式设计 */
+@media (max-width: 768px) {
+ .meteor {
+ width: 1px;
+ height: 1px;
+ }
+
+ .meteor::before {
+ width: 50px;
+ }
+
+ .particle {
+ width: 2px;
+ height: 2px;
+ }
+
+ body::before {
+ background-size:
+ 30px 30px, 25px 25px, 35px 35px, 28px 28px, 32px 32px,
+ 40px 40px, 45px 45px;
+ }
+
+ body::after {
+ background-size: 200px 200px, 150px 150px, 100px 100px;
+ }
+}
+
+/* 麦穗飘舞特效 */
+.wheat-floating {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ pointer-events: none;
+ z-index: 2;
+ overflow: hidden;
+}
+
+/* 移动设备性能优化 */
+@media (max-width: 768px) {
+ .wheat-floating {
+ display: none;
+ }
+
+ .golden-particles {
+ display: none;
+ }
+
+ .meteor-container {
+ display: none;
+ }
+
+ .adaptive-overlay {
+ animation: none;
+ background: rgba(255, 255, 255, 0.1);
+ }
+}
+
+.wheat-particle {
+ position: absolute;
+ width: 8px;
+ height: 20px;
+ background: linear-gradient(180deg,
+ #FFD700 0%,
+ #DAA520 50%,
+ #B8860B 100%
+ );
+ border-radius: 50% 50% 50% 50% / 60% 60% 40% 40%;
+ opacity: 0.7;
+ animation: wheatFloat 15s linear infinite;
+}
+
+.wheat-particle::before {
+ content: '';
+ position: absolute;
+ top: -3px;
+ left: 50%;
+ transform: translateX(-50%);
+ width: 2px;
+ height: 8px;
+ background: #8B7355;
+ border-radius: 1px;
+}
+
+.wheat-particle::after {
+ content: '';
+ position: absolute;
+ top: 2px;
+ left: 1px;
+ width: 2px;
+ height: 4px;
+ background: #FFEC8C;
+ border-radius: 50%;
+ box-shadow:
+ 3px 2px 0 #FFEC8C,
+ 1px 6px 0 #FFEC8C,
+ 4px 8px 0 #FFEC8C;
+}
+
+@keyframes wheatFloat {
+ 0% {
+ transform: translateY(-100vh) translateX(0) rotate(0deg);
+ opacity: 0;
+ }
+ 10% {
+ opacity: 0.7;
+ }
+ 90% {
+ opacity: 0.7;
+ }
+ 100% {
+ transform: translateY(100vh) translateX(50px) rotate(360deg);
+ opacity: 0;
+ }
+}
+
+/* 不同大小和速度的麦穗 */
+.wheat-particle:nth-child(1) {
+ left: 10%;
+ animation-duration: 12s;
+ animation-delay: 0s;
+ transform: scale(0.8);
+}
+
+.wheat-particle:nth-child(2) {
+ left: 25%;
+ animation-duration: 18s;
+ animation-delay: 2s;
+ transform: scale(1.2);
+}
+
+.wheat-particle:nth-child(3) {
+ left: 40%;
+ animation-duration: 15s;
+ animation-delay: 4s;
+ transform: scale(0.9);
+}
+
+.wheat-particle:nth-child(4) {
+ left: 60%;
+ animation-duration: 20s;
+ animation-delay: 1s;
+ transform: scale(1.1);
+}
+
+.wheat-particle:nth-child(5) {
+ left: 75%;
+ animation-duration: 14s;
+ animation-delay: 3s;
+ transform: scale(0.7);
+}
+
+.wheat-particle:nth-child(6) {
+ left: 90%;
+ animation-duration: 16s;
+ animation-delay: 5s;
+ transform: scale(1.0);
+}
+
+.wheat-particle:nth-child(7) {
+ left: 5%;
+ animation-duration: 22s;
+ animation-delay: 6s;
+ transform: scale(0.6);
+}
+
+.wheat-particle:nth-child(8) {
+ left: 35%;
+ animation-duration: 13s;
+ animation-delay: 2.5s;
+ transform: scale(1.3);
+}
+
+/* 减少动画偏好设置 */
+@media (prefers-reduced-motion: reduce) {
+ * {
+ animation-duration: 0.01ms !important;
+ animation-iteration-count: 1 !important;
+ transition-duration: 0.01ms !important;
+ }
+
+ .meteor,
+ .particle {
+ display: none;
+ }
+}
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/css/style.css b/InfoGenie-frontend/public/60sapi/实用功能/农历信息/css/style.css
index 4004990d..e6daabe3 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/农历信息/css/style.css
@@ -1,1268 +1,1268 @@
-/* 重置样式 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;
- line-height: 1.6;
- color: #1a1a1a;
- overflow-x: hidden;
-}
-
-/* 结果容器 - 优化可读性版本 */
-.result-container {
- background: rgba(255, 255, 255, 0.85);
- backdrop-filter: blur(20px);
- -webkit-backdrop-filter: blur(20px);
- border: 1px solid rgba(0, 0, 0, 0.1);
- border-radius: 25px;
- padding: 40px;
- margin-top: 40px;
- box-shadow:
- 0 8px 32px 0 rgba(0, 0, 0, 0.1),
- inset 0 1px 0 rgba(255, 255, 255, 0.8);
-}
-
-/* 移除过度的文字颜色动画,保持稳定的可读性 */
-
-/* 容器 */
-.container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 20px;
- animation: containerFadeIn 1s ease-out;
-}
-
-@keyframes containerFadeIn {
- from {
- opacity: 0;
- transform: translateY(30px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-/* 玻璃拟态基础样式 - 动态调节版本 */
-.glass-morphism {
- background: rgba(255, 255, 255, 0.15);
- backdrop-filter: blur(20px);
- -webkit-backdrop-filter: blur(20px);
- border: 1px solid rgba(255, 255, 255, 0.2);
- box-shadow:
- 0 8px 32px 0 rgba(31, 38, 135, 0.15),
- inset 0 1px 0 rgba(255, 255, 255, 0.3);
- border-radius: 20px;
- animation: glassColorShift 25s ease infinite;
-}
-
-@keyframes glassColorShift {
- 0% {
- background: rgba(255, 255, 255, 0.15);
- border-color: rgba(255, 255, 255, 0.2);
- box-shadow:
- 0 8px 32px 0 rgba(31, 38, 135, 0.15),
- inset 0 1px 0 rgba(255, 255, 255, 0.3);
- }
- 25% {
- background: rgba(255, 255, 255, 0.25);
- border-color: rgba(255, 255, 255, 0.35);
- box-shadow:
- 0 8px 32px 0 rgba(31, 38, 135, 0.25),
- inset 0 1px 0 rgba(255, 255, 255, 0.5);
- }
- 50% {
- background: rgba(255, 255, 255, 0.18);
- border-color: rgba(255, 255, 255, 0.25);
- box-shadow:
- 0 8px 32px 0 rgba(31, 38, 135, 0.18),
- inset 0 1px 0 rgba(255, 255, 255, 0.35);
- }
- 75% {
- background: rgba(255, 255, 255, 0.22);
- border-color: rgba(255, 255, 255, 0.3);
- box-shadow:
- 0 8px 32px 0 rgba(31, 38, 135, 0.2),
- inset 0 1px 0 rgba(255, 255, 255, 0.4);
- }
- 100% {
- background: rgba(255, 255, 255, 0.15);
- border-color: rgba(255, 255, 255, 0.2);
- box-shadow:
- 0 8px 32px 0 rgba(31, 38, 135, 0.15),
- inset 0 1px 0 rgba(255, 255, 255, 0.3);
- }
-}
-
-/* 头部 - 优化可读性版本 */
-.header {
- text-align: center;
- margin-bottom: 40px;
- background: rgba(255, 255, 255, 0.85);
- backdrop-filter: blur(20px);
- -webkit-backdrop-filter: blur(20px);
- padding: 40px 30px;
- border-radius: 25px;
- border: 1px solid rgba(0, 0, 0, 0.1);
- box-shadow:
- 0 8px 32px 0 rgba(0, 0, 0, 0.1),
- inset 0 1px 0 rgba(255, 255, 255, 0.8);
- position: relative;
- overflow: hidden;
-}
-
-@keyframes headerColorShift {
- 0% {
- background: rgba(255, 255, 255, 0.1);
- border-color: rgba(255, 255, 255, 0.2);
- box-shadow:
- 0 8px 32px 0 rgba(31, 38, 135, 0.2),
- inset 0 1px 0 rgba(255, 255, 255, 0.4);
- }
- 25% {
- background: rgba(255, 255, 255, 0.2);
- border-color: rgba(255, 255, 255, 0.35);
- box-shadow:
- 0 8px 32px 0 rgba(31, 38, 135, 0.3),
- inset 0 1px 0 rgba(255, 255, 255, 0.6);
- }
- 50% {
- background: rgba(255, 255, 255, 0.15);
- border-color: rgba(255, 255, 255, 0.25);
- box-shadow:
- 0 8px 32px 0 rgba(31, 38, 135, 0.22),
- inset 0 1px 0 rgba(255, 255, 255, 0.45);
- }
- 75% {
- background: rgba(255, 255, 255, 0.18);
- border-color: rgba(255, 255, 255, 0.3);
- box-shadow:
- 0 8px 32px 0 rgba(31, 38, 135, 0.25),
- inset 0 1px 0 rgba(255, 255, 255, 0.5);
- }
- 100% {
- background: rgba(255, 255, 255, 0.1);
- border-color: rgba(255, 255, 255, 0.2);
- box-shadow:
- 0 8px 32px 0 rgba(31, 38, 135, 0.2),
- inset 0 1px 0 rgba(255, 255, 255, 0.4);
- }
-}
-
-.header::before {
- content: '';
- position: absolute;
- top: 0;
- left: -100%;
- width: 100%;
- height: 100%;
- background: linear-gradient(90deg,
- transparent,
- rgba(255, 255, 255, 0.1),
- transparent
- );
- animation: headerShimmer 6s ease-in-out infinite;
-}
-
-@keyframes headerShimmer {
- 0% { left: -100%; }
- 50% { left: 100%; }
- 100% { left: 100%; }
-}
-
-.header-icon {
- font-size: 4em;
- margin-bottom: 15px;
- animation: iconFloat 3s ease-in-out infinite;
- text-shadow: 0 0 20px rgba(255, 255, 255, 0.5);
-}
-
-@keyframes iconFloat {
- 0%, 100% {
- transform: translateY(0) scale(1);
- filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.3));
- }
- 50% {
- transform: translateY(-10px) scale(1.05);
- filter: drop-shadow(0 5px 15px rgba(255, 255, 255, 0.5));
- }
-}
-
-.title {
- font-size: 3.2em;
- font-weight: 800;
- color: #1a1a1a;
- margin-bottom: 10px;
- text-shadow: 1px 1px 3px rgba(255, 255, 255, 0.8);
- letter-spacing: 2px;
-}
-
-/* 移除标题颜色动画,保持稳定的可读性 */
-
-.subtitle {
- font-size: 1.3em;
- color: #555555;
- margin-bottom: 30px;
- font-weight: 600;
- text-shadow: 0 1px 2px rgba(255, 255, 255, 0.8);
-}
-
-/* 移除副标题颜色动画,保持稳定的可读性 */
-
-/* 日期选择器 */
-.date-selector {
- display: flex;
- align-items: flex-end;
- justify-content: center;
- gap: 20px;
- margin-bottom: 25px;
- flex-wrap: wrap;
-}
-
-.input-group {
- display: flex;
- flex-direction: column;
- gap: 8px;
- min-width: 200px;
-}
-
-.input-label {
- display: flex;
- align-items: center;
- gap: 8px;
- color: #2c2c2c;
- font-weight: 600;
- font-size: 1em;
- text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.8);
-}
-
-/* 移除标签颜色动画,保持稳定的可读性 */
-
-.label-icon {
- font-size: 1.2em;
-}
-
-.date-input {
- background: rgba(255, 255, 255, 0.9);
- backdrop-filter: blur(10px);
- -webkit-backdrop-filter: blur(10px);
- border: 1px solid rgba(0, 0, 0, 0.2);
- border-radius: 15px;
- padding: 12px 16px;
- color: #1a1a1a;
- font-size: 1em;
- font-weight: 500;
- transition: all 0.3s ease;
- box-shadow:
- 0 4px 15px rgba(0, 0, 0, 0.1),
- inset 0 1px 0 rgba(255, 255, 255, 0.8);
-}
-
-/* 移除输入框颜色动画,保持稳定的可读性 */
-
-.date-input:focus {
- outline: none;
- border-color: #228B22;
- background: rgba(255, 255, 255, 0.95);
- box-shadow:
- 0 6px 20px rgba(34, 139, 34, 0.2),
- inset 0 1px 0 rgba(255, 255, 255, 0.8),
- 0 0 0 3px rgba(34, 139, 34, 0.1);
- transform: translateY(-2px);
-}
-
-.date-input::-webkit-calendar-picker-indicator {
- filter: invert(1);
- opacity: 0.8;
- cursor: pointer;
-}
-
-.query-btn {
- background: linear-gradient(135deg, #228B22 0%, #32CD32 100%);
- backdrop-filter: blur(15px);
- -webkit-backdrop-filter: blur(15px);
- color: #ffffff;
- border: 1px solid rgba(34, 139, 34, 0.3);
- padding: 12px 28px;
- border-radius: 20px;
- cursor: pointer;
- font-size: 1em;
- font-weight: 600;
- transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
- display: flex;
- align-items: center;
- gap: 8px;
- position: relative;
- overflow: hidden;
- text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
- box-shadow:
- 0 4px 15px rgba(34, 139, 34, 0.3),
- inset 0 1px 0 rgba(255, 255, 255, 0.2);
-}
-
-/* 移除按钮颜色动画,保持稳定的可读性 */
-
-.query-btn::before {
- content: '';
- position: absolute;
- top: 0;
- left: -100%;
- width: 100%;
- height: 100%;
- background: linear-gradient(90deg,
- transparent,
- rgba(255, 255, 255, 0.2),
- transparent
- );
- transition: left 0.6s ease;
-}
-
-.query-btn:hover::before {
- left: 100%;
-}
-
-.query-btn:hover {
- background: linear-gradient(135deg, #1e7e1e, #2eb82e);
- border-color: rgba(34, 139, 34, 0.5);
- transform: translateY(-2px);
- box-shadow:
- 0 8px 25px rgba(34, 139, 34, 0.4),
- inset 0 1px 0 rgba(255, 255, 255, 0.3);
-}
-
-.btn-icon {
- font-size: 1.2em;
- transition: transform 0.3s ease;
-}
-
-.query-btn:hover .btn-icon {
- transform: scale(1.1) rotate(5deg);
-}
-
-.update-time {
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 8px;
- color: #1a252f;
- font-size: 1em;
- padding: 10px 20px;
- background: rgba(255, 255, 255, 0.08);
- backdrop-filter: blur(8px);
- -webkit-backdrop-filter: blur(8px);
- border-radius: 20px;
- border: 1px solid rgba(255, 255, 255, 0.15);
- display: inline-flex;
- text-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
- font-weight: 600;
-}
-
-.time-icon {
- font-size: 1.2em;
- animation: clockTick 2s infinite;
-}
-
-@keyframes clockTick {
- 0%, 50% { transform: rotate(0deg); }
- 25% { transform: rotate(15deg); }
- 75% { transform: rotate(-15deg); }
-}
-
-/* 玻璃拟态加载动画 */
-.loading {
- text-align: center;
- padding: 60px 40px;
- background: rgba(255, 255, 255, 0.1);
- backdrop-filter: blur(25px);
- -webkit-backdrop-filter: blur(25px);
- border-radius: 25px;
- margin-bottom: 25px;
- border: 1px solid rgba(255, 255, 255, 0.2);
- box-shadow:
- 0 8px 32px 0 rgba(31, 38, 135, 0.2),
- inset 0 1px 0 rgba(255, 255, 255, 0.3);
-}
-
-.loading-content {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 25px;
-}
-
-.glass-spinner {
- width: 60px;
- height: 60px;
- border: 4px solid rgba(255, 255, 255, 0.1);
- border-top: 4px solid rgba(255, 255, 255, 0.8);
- border-radius: 50%;
- animation: glassSpinnerRotate 1.5s linear infinite;
- position: relative;
- backdrop-filter: blur(5px);
- -webkit-backdrop-filter: blur(5px);
-}
-
-.glass-spinner::before {
- content: '';
- position: absolute;
- top: -4px;
- left: -4px;
- right: -4px;
- bottom: -4px;
- border: 2px solid rgba(255, 255, 255, 0.05);
- border-top: 2px solid rgba(255, 255, 255, 0.3);
- border-radius: 50%;
- animation: glassSpinnerRotate 2s linear infinite reverse;
-}
-
-@keyframes glassSpinnerRotate {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-.loading-text {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 15px;
-}
-
-.loading-emoji {
- font-size: 2.5em;
- animation: mysticalPulse 2s ease-in-out infinite alternate;
- filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.5));
-}
-
-@keyframes mysticalPulse {
- 0% {
- transform: scale(1);
- filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.5));
- }
- 100% {
- transform: scale(1.1);
- filter: drop-shadow(0 0 20px rgba(255, 255, 255, 0.8));
- }
-}
-
-.loading-text p {
- font-size: 1.2em;
- color: #1a1a1a;
- font-weight: 600;
- margin: 0;
- text-shadow: 0 1px 3px rgba(255, 255, 255, 0.8);
-}
-
-.loading-dots {
- display: flex;
- gap: 8px;
-}
-
-.loading-dots span {
- width: 10px;
- height: 10px;
- background: #4a4a4a;
- border-radius: 50%;
- animation: glassDotsFloat 1.4s ease-in-out infinite both;
- backdrop-filter: blur(2px);
- -webkit-backdrop-filter: blur(2px);
- box-shadow: 0 2px 8px rgba(255, 255, 255, 0.3);
-}
-
-.loading-dots span:nth-child(1) { animation-delay: -0.32s; }
-.loading-dots span:nth-child(2) { animation-delay: -0.16s; }
-.loading-dots span:nth-child(3) { animation-delay: 0s; }
-
-@keyframes glassDotsFloat {
- 0%, 80%, 100% {
- transform: scale(0.8);
- opacity: 0.5;
- }
- 40% {
- transform: scale(1.2);
- opacity: 1;
- }
-}
-
-/* 农历信息展示 */
-.lunar-info {
- display: grid;
- gap: 25px;
- animation: infoFadeIn 0.8s ease-out;
-}
-
-@keyframes infoFadeIn {
- from {
- opacity: 0;
- transform: translateY(30px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-.info-card {
- background: rgba(255, 255, 255, 0.12);
- backdrop-filter: blur(20px);
- -webkit-backdrop-filter: blur(20px);
- border: 1px solid rgba(255, 255, 255, 0.2);
- border-radius: 20px;
- padding: 30px;
- position: relative;
- overflow: hidden;
- transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
- box-shadow:
- 0 8px 32px 0 rgba(31, 38, 135, 0.15),
- inset 0 1px 0 rgba(255, 255, 255, 0.3);
-}
-
-.info-card::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 3px;
- background: linear-gradient(90deg,
- rgba(255, 255, 255, 0.3),
- rgba(255, 255, 255, 0.6),
- rgba(255, 255, 255, 0.3)
- );
- transform: scaleX(0);
- transition: transform 0.4s ease;
-}
-
-.info-card:hover::before {
- transform: scaleX(1);
-}
-
-.info-card:hover {
- transform: translateY(-5px);
- background: rgba(255, 255, 255, 0.15);
- border-color: rgba(255, 255, 255, 0.3);
- box-shadow:
- 0 12px 40px 0 rgba(31, 38, 135, 0.2),
- inset 0 1px 0 rgba(255, 255, 255, 0.4);
-}
-
-.card-header {
- display: flex;
- align-items: center;
- gap: 15px;
- margin-bottom: 20px;
-}
-
-.card-icon {
- font-size: 2.5em;
- animation: cardIconFloat 3s ease-in-out infinite;
-}
-
-@keyframes cardIconFloat {
- 0%, 100% { transform: translateY(0) rotate(0deg); }
- 50% { transform: translateY(-5px) rotate(5deg); }
-}
-
-.card-title {
- font-size: 1.5em;
- font-weight: 700;
- color: #0a0f14;
- text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
-}
-
-.card-content {
- display: grid;
- gap: 15px;
-}
-
-.info-item {
- display: flex;
- align-items: center;
- gap: 12px;
- padding: 15px;
- background: rgba(255, 255, 255, 0.08);
- backdrop-filter: blur(10px);
- -webkit-backdrop-filter: blur(10px);
- border-radius: 15px;
- border: 1px solid rgba(255, 255, 255, 0.15);
- transition: all 0.3s ease;
-}
-
-.info-item:hover {
- background: rgba(255, 255, 255, 0.12);
- transform: scale(1.02);
-}
-
-.item-icon {
- font-size: 1.3em;
- min-width: 30px;
- text-align: center;
-}
-
-.item-label {
- font-weight: 600;
- color: #1a252f;
- min-width: 80px;
- text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
-}
-
-.item-value {
- font-weight: 700;
- color: #0a0f14;
- font-size: 1.1em;
- text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
-}
-
-/* 错误信息 */
-.error-message {
- text-align: center;
- padding: 60px 40px;
- background: rgba(255, 255, 255, 0.1);
- backdrop-filter: blur(25px);
- -webkit-backdrop-filter: blur(25px);
- border-radius: 25px;
- border: 1px solid rgba(255, 255, 255, 0.2);
- box-shadow:
- 0 8px 32px 0 rgba(31, 38, 135, 0.2),
- inset 0 1px 0 rgba(255, 255, 255, 0.3);
-}
-
-.error-content {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 25px;
-}
-
-.error-icon {
- font-size: 4em;
- animation: errorFloat 2s ease-in-out infinite alternate;
- filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.3));
-}
-
-@keyframes errorFloat {
- 0% { transform: translateY(0) rotate(-5deg); }
- 100% { transform: translateY(-10px) rotate(5deg); }
-}
-
-.error-content h3 {
- font-size: 1.6em;
- color: #0a0f14;
- margin: 0;
- font-weight: 700;
- text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
-}
-
-.error-content p {
- color: #1a252f;
- text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
- font-size: 1.1em;
- margin: 0;
- line-height: 1.6;
- text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
-}
-
-.retry-btn {
- background: rgba(255, 255, 255, 0.15);
- backdrop-filter: blur(15px);
- -webkit-backdrop-filter: blur(15px);
- color: #0a0f14;
- border: 1px solid rgba(255, 255, 255, 0.3);
- padding: 12px 25px;
- border-radius: 20px;
- cursor: pointer;
- font-size: 1em;
- font-weight: 600;
- transition: all 0.4s ease;
- display: inline-flex;
- align-items: center;
- gap: 8px;
- text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
- box-shadow:
- 0 4px 15px rgba(31, 38, 135, 0.2),
- inset 0 1px 0 rgba(255, 255, 255, 0.3);
-}
-
-.retry-btn:hover {
- background: rgba(255, 255, 255, 0.2);
- border-color: rgba(255, 255, 255, 0.4);
- transform: translateY(-2px);
- box-shadow:
- 0 6px 20px rgba(31, 38, 135, 0.3),
- inset 0 1px 0 rgba(255, 255, 255, 0.4);
-}
-
-.retry-btn span {
- font-size: 1.1em;
- transition: transform 0.3s ease;
-}
-
-.retry-btn:hover span {
- transform: rotate(180deg);
-}
-
-/* 功能提示 */
-.feature-tips {
- margin-top: 40px;
-}
-
-.tip-card {
- background: rgba(255, 255, 255, 0.1);
- backdrop-filter: blur(20px);
- -webkit-backdrop-filter: blur(20px);
- border: 1px solid rgba(255, 255, 255, 0.2);
- border-radius: 20px;
- padding: 30px;
- text-align: center;
- box-shadow:
- 0 8px 32px 0 rgba(31, 38, 135, 0.15),
- inset 0 1px 0 rgba(255, 255, 255, 0.3);
-}
-
-.tip-icon {
- font-size: 3em;
- margin-bottom: 15px;
- animation: tipBlink 3s ease-in-out infinite;
-}
-
-@keyframes tipBlink {
- 0%, 100% { opacity: 1; transform: scale(1); }
- 50% { opacity: 0.7; transform: scale(1.05); }
-}
-
-.tip-card h3 {
- font-size: 1.4em;
- font-weight: 700;
- color: #0a0f14;
- margin-bottom: 20px;
- text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
-}
-
-.tip-card ul {
- list-style: none;
- display: grid;
- gap: 12px;
- text-align: left;
-}
-
-.tip-card li {
- color: #1a252f;
- font-size: 1em;
- padding: 10px 15px;
- background: rgba(255, 255, 255, 0.08);
- backdrop-filter: blur(5px);
- -webkit-backdrop-filter: blur(5px);
- border-radius: 10px;
- border: 1px solid rgba(255, 255, 255, 0.15);
- transition: all 0.3s ease;
- text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
-}
-
-.tip-card li:hover {
- background: rgba(255, 255, 255, 0.12);
- transform: translateX(5px);
-}
-
-/* 平板端适配 (768px - 1024px) */
-@media (min-width: 768px) and (max-width: 1024px) {
- .container {
- padding: 25px;
- }
-
- .header {
- padding: 35px 25px;
- }
-
- .header-icon {
- font-size: 3.5em;
- }
-
- .title {
- font-size: 2.8em;
- letter-spacing: 1.5px;
- }
-
- .subtitle {
- font-size: 1.2em;
- }
-
- .date-selector {
- gap: 15px;
- }
-
- .input-group {
- min-width: 180px;
- }
-
- .lunar-info {
- grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
- gap: 20px;
- }
-
- .info-card {
- padding: 25px;
- }
-}
-
-/* 电脑端适配 (1025px+) */
-@media (min-width: 1025px) {
- .container {
- padding: 40px;
- }
-
- .header {
- padding: 50px 40px;
- margin-bottom: 50px;
- }
-
- .header-icon {
- font-size: 4.5em;
- }
-
- .title {
- font-size: 3.8em;
- letter-spacing: 3px;
- }
-
- .subtitle {
- font-size: 1.4em;
- }
-
- .date-selector {
- gap: 25px;
- }
-
- .input-group {
- min-width: 220px;
- }
-
- .date-input {
- padding: 14px 18px;
- font-size: 1.05em;
- }
-
- .query-btn {
- padding: 14px 32px;
- font-size: 1.05em;
- }
-
- .lunar-info {
- grid-template-columns: repeat(auto-fit, minmax(500px, 1fr));
- gap: 30px;
- }
-
- .info-card {
- padding: 35px;
- }
-
- .card-title {
- font-size: 1.6em;
- }
-
- .item-label {
- min-width: 100px;
- }
-
- .item-value {
- font-size: 1.15em;
- }
-
- /* 电脑端特殊效果 */
- .info-card:hover {
- transform: translateY(-8px) scale(1.02);
- }
-}
-
-/* 手机端适配 (767px以下) - 优化手机端体验 */
-@media (max-width: 767px) {
- .container {
- padding: 15px;
- margin: 10px auto;
- max-width: 95%;
- }
-
- .header {
- padding: 25px 15px;
- margin-bottom: 25px;
- border-radius: 20px;
- }
-
- .header-icon {
- font-size: 2.8em;
- }
-
- .title {
- font-size: 2.2em;
- letter-spacing: 1px;
- margin-bottom: 8px;
- }
-
- .subtitle {
- font-size: 1em;
- margin-bottom: 20px;
- }
-
- .date-selector {
- flex-direction: column;
- gap: 15px;
- align-items: center;
- padding: 0 5px;
- }
-
- .input-group {
- width: 100%;
- max-width: 300px;
- min-width: auto;
- }
-
- .date-input {
- padding: 14px 16px;
- font-size: 16px; /* 防止iOS缩放 */
- border-radius: 12px;
- }
-
- .query-btn {
- padding: 14px 24px;
- font-size: 16px;
- width: 100%;
- max-width: 200px;
- justify-content: center;
- border-radius: 15px;
- margin-top: 10px;
- }
-
- .update-time {
- font-size: 0.9em;
- padding: 8px 16px;
- }
-
- .info-card {
- padding: 20px;
- border-radius: 15px;
- }
-
- .card-header {
- gap: 12px;
- margin-bottom: 15px;
- }
-
- .card-icon {
- font-size: 2em;
- }
-
- .card-title {
- font-size: 1.3em;
- }
-
- .info-item {
- padding: 12px;
- flex-direction: column;
- align-items: flex-start;
- gap: 8px;
- }
-
- .item-icon {
- font-size: 1.2em;
- }
-
- .item-label {
- min-width: auto;
- font-size: 0.95em;
- margin-bottom: 8px;
- }
-
- .item-value {
- font-size: 1em;
- }
-
- .tip-card {
- padding: 20px;
- }
-
- .tip-card ul {
- gap: 10px;
- }
-
- .tip-card li {
- padding: 8px 12px;
- font-size: 0.9em;
- }
-
- /* 手机端性能优化 - 减少动画 */
- .title {
- animation: none;
- }
-
- .subtitle {
- animation: none;
- }
-
- .input-label {
- animation: none;
- }
-
- .date-input {
- animation: none;
- }
-
- .query-btn {
- animation: none;
- }
-
- .card-icon {
- animation: none;
- }
-
- .tip-icon {
- animation: none;
- }
-}
-
-/* 超小屏幕适配 (480px以下) */
-@media (max-width: 480px) {
- .container {
- padding: 12px;
- }
-
- .header {
- padding: 20px 15px;
- margin-bottom: 20px;
- }
-
- .header-icon {
- font-size: 2.5em;
- }
-
- .title {
- font-size: 1.9em;
- letter-spacing: 0.5px;
- }
-
- .subtitle {
- font-size: 0.95em;
- }
-
- .date-selector {
- gap: 12px;
- }
-
- .input-group {
- max-width: 280px;
- }
-
- .date-input {
- padding: 8px 12px;
- font-size: 0.9em;
- }
-
- .query-btn {
- padding: 8px 20px;
- font-size: 0.9em;
- max-width: 180px;
- }
-
- .update-time {
- font-size: 0.85em;
- padding: 6px 12px;
- flex-direction: column;
- gap: 4px;
- }
-
- .lunar-info {
- gap: 15px;
- }
-
- .info-card {
- padding: 18px 15px;
- border-radius: 12px;
- }
-
- .card-header {
- gap: 10px;
- margin-bottom: 12px;
- }
-
- .card-icon {
- font-size: 1.8em;
- }
-
- .card-title {
- font-size: 1.2em;
- }
-
- .info-item {
- padding: 10px;
- gap: 6px;
- }
-
- .item-icon {
- font-size: 1.1em;
- }
-
- .item-label {
- font-size: 0.85em;
- }
-
- .item-value {
- font-size: 0.95em;
- }
-
- .tip-card {
- padding: 15px;
- }
-
- .tip-icon {
- font-size: 2.5em;
- }
-
- .tip-card h3 {
- font-size: 1.2em;
- }
-
- .tip-card li {
- padding: 6px 10px;
- font-size: 0.85em;
- }
-
- /* 超小屏幕性能优化 */
- .info-card {
- transition: transform 0.2s ease, background 0.2s ease;
- }
-
- .info-card::before {
- display: none;
- }
-
- /* 禁用复杂动画以提升性能 */
- .title {
- animation: none;
- }
-
- .subtitle {
- animation: none;
- }
-
- .input-label {
- animation: none;
- }
-
- .date-input {
- animation: none;
- }
-
- .query-btn {
- animation: none;
- }
-
- .card-icon {
- animation: none;
- }
-
- .tip-icon {
- animation: none;
- }
-
- .loading-content {
- gap: 15px;
- }
-
- .loading-emoji {
- font-size: 2em;
- }
-
- .error-icon {
- font-size: 3em;
- }
-}
-
-/* 时辰宜忌特殊样式 */
-.hours-card {
- grid-column: 1 / -1; /* 占满整行 */
-}
-
-.hours-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 15px;
- margin-top: 15px;
-}
-
-.hour-item {
- background: rgba(255, 255, 255, 0.1);
- backdrop-filter: blur(10px);
- border: 1px solid rgba(255, 255, 255, 0.2);
- border-radius: 12px;
- padding: 12px;
- transition: all 0.3s ease;
-}
-
-.hour-item:hover {
- background: rgba(255, 255, 255, 0.15);
- transform: translateY(-2px);
- box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
-}
-
-.hour-name {
- font-size: 14px;
- font-weight: 600;
- color: #2c3e50;
- text-align: center;
- margin-bottom: 8px;
- padding: 4px 8px;
- background: rgba(255, 255, 255, 0.8);
- border-radius: 6px;
- text-shadow: 0 1px 2px rgba(255, 255, 255, 0.5);
- border: 1px solid rgba(255, 255, 255, 0.9);
-}
-
-.hour-content {
- font-size: 12px;
- line-height: 1.4;
-}
-
-.hour-recommends,
-.hour-avoids {
- margin: 4px 0;
-}
-
-.hour-label {
- font-weight: 600;
- color: #1a1a1a;
- margin-right: 4px;
-}
-
-.hour-recommends .hour-label {
- color: #4ade80;
-}
-
-.hour-avoids .hour-label {
- color: #f87171;
-}
-
-.hour-text {
- color: #2c2c2c;
-}
-
-/* 时辰宜忌响应式优化 */
-@media (max-width: 768px) {
- .hours-grid {
- grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
- gap: 10px;
- }
-
- .hour-item {
- padding: 8px;
- }
-
- .hour-name {
- font-size: 12px;
- margin-bottom: 6px;
- }
-
- .hour-content {
- font-size: 11px;
- }
-}
+/* 重置样式 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;
+ line-height: 1.6;
+ color: #1a1a1a;
+ overflow-x: hidden;
+}
+
+/* 结果容器 - 优化可读性版本 */
+.result-container {
+ background: rgba(255, 255, 255, 0.85);
+ backdrop-filter: blur(20px);
+ -webkit-backdrop-filter: blur(20px);
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ border-radius: 25px;
+ padding: 40px;
+ margin-top: 40px;
+ box-shadow:
+ 0 8px 32px 0 rgba(0, 0, 0, 0.1),
+ inset 0 1px 0 rgba(255, 255, 255, 0.8);
+}
+
+/* 移除过度的文字颜色动画,保持稳定的可读性 */
+
+/* 容器 */
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+ animation: containerFadeIn 1s ease-out;
+}
+
+@keyframes containerFadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(30px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+/* 玻璃拟态基础样式 - 动态调节版本 */
+.glass-morphism {
+ background: rgba(255, 255, 255, 0.15);
+ backdrop-filter: blur(20px);
+ -webkit-backdrop-filter: blur(20px);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ box-shadow:
+ 0 8px 32px 0 rgba(31, 38, 135, 0.15),
+ inset 0 1px 0 rgba(255, 255, 255, 0.3);
+ border-radius: 20px;
+ animation: glassColorShift 25s ease infinite;
+}
+
+@keyframes glassColorShift {
+ 0% {
+ background: rgba(255, 255, 255, 0.15);
+ border-color: rgba(255, 255, 255, 0.2);
+ box-shadow:
+ 0 8px 32px 0 rgba(31, 38, 135, 0.15),
+ inset 0 1px 0 rgba(255, 255, 255, 0.3);
+ }
+ 25% {
+ background: rgba(255, 255, 255, 0.25);
+ border-color: rgba(255, 255, 255, 0.35);
+ box-shadow:
+ 0 8px 32px 0 rgba(31, 38, 135, 0.25),
+ inset 0 1px 0 rgba(255, 255, 255, 0.5);
+ }
+ 50% {
+ background: rgba(255, 255, 255, 0.18);
+ border-color: rgba(255, 255, 255, 0.25);
+ box-shadow:
+ 0 8px 32px 0 rgba(31, 38, 135, 0.18),
+ inset 0 1px 0 rgba(255, 255, 255, 0.35);
+ }
+ 75% {
+ background: rgba(255, 255, 255, 0.22);
+ border-color: rgba(255, 255, 255, 0.3);
+ box-shadow:
+ 0 8px 32px 0 rgba(31, 38, 135, 0.2),
+ inset 0 1px 0 rgba(255, 255, 255, 0.4);
+ }
+ 100% {
+ background: rgba(255, 255, 255, 0.15);
+ border-color: rgba(255, 255, 255, 0.2);
+ box-shadow:
+ 0 8px 32px 0 rgba(31, 38, 135, 0.15),
+ inset 0 1px 0 rgba(255, 255, 255, 0.3);
+ }
+}
+
+/* 头部 - 优化可读性版本 */
+.header {
+ text-align: center;
+ margin-bottom: 40px;
+ background: rgba(255, 255, 255, 0.85);
+ backdrop-filter: blur(20px);
+ -webkit-backdrop-filter: blur(20px);
+ padding: 40px 30px;
+ border-radius: 25px;
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ box-shadow:
+ 0 8px 32px 0 rgba(0, 0, 0, 0.1),
+ inset 0 1px 0 rgba(255, 255, 255, 0.8);
+ position: relative;
+ overflow: hidden;
+}
+
+@keyframes headerColorShift {
+ 0% {
+ background: rgba(255, 255, 255, 0.1);
+ border-color: rgba(255, 255, 255, 0.2);
+ box-shadow:
+ 0 8px 32px 0 rgba(31, 38, 135, 0.2),
+ inset 0 1px 0 rgba(255, 255, 255, 0.4);
+ }
+ 25% {
+ background: rgba(255, 255, 255, 0.2);
+ border-color: rgba(255, 255, 255, 0.35);
+ box-shadow:
+ 0 8px 32px 0 rgba(31, 38, 135, 0.3),
+ inset 0 1px 0 rgba(255, 255, 255, 0.6);
+ }
+ 50% {
+ background: rgba(255, 255, 255, 0.15);
+ border-color: rgba(255, 255, 255, 0.25);
+ box-shadow:
+ 0 8px 32px 0 rgba(31, 38, 135, 0.22),
+ inset 0 1px 0 rgba(255, 255, 255, 0.45);
+ }
+ 75% {
+ background: rgba(255, 255, 255, 0.18);
+ border-color: rgba(255, 255, 255, 0.3);
+ box-shadow:
+ 0 8px 32px 0 rgba(31, 38, 135, 0.25),
+ inset 0 1px 0 rgba(255, 255, 255, 0.5);
+ }
+ 100% {
+ background: rgba(255, 255, 255, 0.1);
+ border-color: rgba(255, 255, 255, 0.2);
+ box-shadow:
+ 0 8px 32px 0 rgba(31, 38, 135, 0.2),
+ inset 0 1px 0 rgba(255, 255, 255, 0.4);
+ }
+}
+
+.header::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: -100%;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(90deg,
+ transparent,
+ rgba(255, 255, 255, 0.1),
+ transparent
+ );
+ animation: headerShimmer 6s ease-in-out infinite;
+}
+
+@keyframes headerShimmer {
+ 0% { left: -100%; }
+ 50% { left: 100%; }
+ 100% { left: 100%; }
+}
+
+.header-icon {
+ font-size: 4em;
+ margin-bottom: 15px;
+ animation: iconFloat 3s ease-in-out infinite;
+ text-shadow: 0 0 20px rgba(255, 255, 255, 0.5);
+}
+
+@keyframes iconFloat {
+ 0%, 100% {
+ transform: translateY(0) scale(1);
+ filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.3));
+ }
+ 50% {
+ transform: translateY(-10px) scale(1.05);
+ filter: drop-shadow(0 5px 15px rgba(255, 255, 255, 0.5));
+ }
+}
+
+.title {
+ font-size: 3.2em;
+ font-weight: 800;
+ color: #1a1a1a;
+ margin-bottom: 10px;
+ text-shadow: 1px 1px 3px rgba(255, 255, 255, 0.8);
+ letter-spacing: 2px;
+}
+
+/* 移除标题颜色动画,保持稳定的可读性 */
+
+.subtitle {
+ font-size: 1.3em;
+ color: #555555;
+ margin-bottom: 30px;
+ font-weight: 600;
+ text-shadow: 0 1px 2px rgba(255, 255, 255, 0.8);
+}
+
+/* 移除副标题颜色动画,保持稳定的可读性 */
+
+/* 日期选择器 */
+.date-selector {
+ display: flex;
+ align-items: flex-end;
+ justify-content: center;
+ gap: 20px;
+ margin-bottom: 25px;
+ flex-wrap: wrap;
+}
+
+.input-group {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ min-width: 200px;
+}
+
+.input-label {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ color: #2c2c2c;
+ font-weight: 600;
+ font-size: 1em;
+ text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.8);
+}
+
+/* 移除标签颜色动画,保持稳定的可读性 */
+
+.label-icon {
+ font-size: 1.2em;
+}
+
+.date-input {
+ background: rgba(255, 255, 255, 0.9);
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px);
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 15px;
+ padding: 12px 16px;
+ color: #1a1a1a;
+ font-size: 1em;
+ font-weight: 500;
+ transition: all 0.3s ease;
+ box-shadow:
+ 0 4px 15px rgba(0, 0, 0, 0.1),
+ inset 0 1px 0 rgba(255, 255, 255, 0.8);
+}
+
+/* 移除输入框颜色动画,保持稳定的可读性 */
+
+.date-input:focus {
+ outline: none;
+ border-color: #228B22;
+ background: rgba(255, 255, 255, 0.95);
+ box-shadow:
+ 0 6px 20px rgba(34, 139, 34, 0.2),
+ inset 0 1px 0 rgba(255, 255, 255, 0.8),
+ 0 0 0 3px rgba(34, 139, 34, 0.1);
+ transform: translateY(-2px);
+}
+
+.date-input::-webkit-calendar-picker-indicator {
+ filter: invert(1);
+ opacity: 0.8;
+ cursor: pointer;
+}
+
+.query-btn {
+ background: linear-gradient(135deg, #228B22 0%, #32CD32 100%);
+ backdrop-filter: blur(15px);
+ -webkit-backdrop-filter: blur(15px);
+ color: #ffffff;
+ border: 1px solid rgba(34, 139, 34, 0.3);
+ padding: 12px 28px;
+ border-radius: 20px;
+ cursor: pointer;
+ font-size: 1em;
+ font-weight: 600;
+ transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ position: relative;
+ overflow: hidden;
+ text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
+ box-shadow:
+ 0 4px 15px rgba(34, 139, 34, 0.3),
+ inset 0 1px 0 rgba(255, 255, 255, 0.2);
+}
+
+/* 移除按钮颜色动画,保持稳定的可读性 */
+
+.query-btn::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: -100%;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(90deg,
+ transparent,
+ rgba(255, 255, 255, 0.2),
+ transparent
+ );
+ transition: left 0.6s ease;
+}
+
+.query-btn:hover::before {
+ left: 100%;
+}
+
+.query-btn:hover {
+ background: linear-gradient(135deg, #1e7e1e, #2eb82e);
+ border-color: rgba(34, 139, 34, 0.5);
+ transform: translateY(-2px);
+ box-shadow:
+ 0 8px 25px rgba(34, 139, 34, 0.4),
+ inset 0 1px 0 rgba(255, 255, 255, 0.3);
+}
+
+.btn-icon {
+ font-size: 1.2em;
+ transition: transform 0.3s ease;
+}
+
+.query-btn:hover .btn-icon {
+ transform: scale(1.1) rotate(5deg);
+}
+
+.update-time {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 8px;
+ color: #1a252f;
+ font-size: 1em;
+ padding: 10px 20px;
+ background: rgba(255, 255, 255, 0.08);
+ backdrop-filter: blur(8px);
+ -webkit-backdrop-filter: blur(8px);
+ border-radius: 20px;
+ border: 1px solid rgba(255, 255, 255, 0.15);
+ display: inline-flex;
+ text-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
+ font-weight: 600;
+}
+
+.time-icon {
+ font-size: 1.2em;
+ animation: clockTick 2s infinite;
+}
+
+@keyframes clockTick {
+ 0%, 50% { transform: rotate(0deg); }
+ 25% { transform: rotate(15deg); }
+ 75% { transform: rotate(-15deg); }
+}
+
+/* 玻璃拟态加载动画 */
+.loading {
+ text-align: center;
+ padding: 60px 40px;
+ background: rgba(255, 255, 255, 0.1);
+ backdrop-filter: blur(25px);
+ -webkit-backdrop-filter: blur(25px);
+ border-radius: 25px;
+ margin-bottom: 25px;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ box-shadow:
+ 0 8px 32px 0 rgba(31, 38, 135, 0.2),
+ inset 0 1px 0 rgba(255, 255, 255, 0.3);
+}
+
+.loading-content {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 25px;
+}
+
+.glass-spinner {
+ width: 60px;
+ height: 60px;
+ border: 4px solid rgba(255, 255, 255, 0.1);
+ border-top: 4px solid rgba(255, 255, 255, 0.8);
+ border-radius: 50%;
+ animation: glassSpinnerRotate 1.5s linear infinite;
+ position: relative;
+ backdrop-filter: blur(5px);
+ -webkit-backdrop-filter: blur(5px);
+}
+
+.glass-spinner::before {
+ content: '';
+ position: absolute;
+ top: -4px;
+ left: -4px;
+ right: -4px;
+ bottom: -4px;
+ border: 2px solid rgba(255, 255, 255, 0.05);
+ border-top: 2px solid rgba(255, 255, 255, 0.3);
+ border-radius: 50%;
+ animation: glassSpinnerRotate 2s linear infinite reverse;
+}
+
+@keyframes glassSpinnerRotate {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+.loading-text {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 15px;
+}
+
+.loading-emoji {
+ font-size: 2.5em;
+ animation: mysticalPulse 2s ease-in-out infinite alternate;
+ filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.5));
+}
+
+@keyframes mysticalPulse {
+ 0% {
+ transform: scale(1);
+ filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.5));
+ }
+ 100% {
+ transform: scale(1.1);
+ filter: drop-shadow(0 0 20px rgba(255, 255, 255, 0.8));
+ }
+}
+
+.loading-text p {
+ font-size: 1.2em;
+ color: #1a1a1a;
+ font-weight: 600;
+ margin: 0;
+ text-shadow: 0 1px 3px rgba(255, 255, 255, 0.8);
+}
+
+.loading-dots {
+ display: flex;
+ gap: 8px;
+}
+
+.loading-dots span {
+ width: 10px;
+ height: 10px;
+ background: #4a4a4a;
+ border-radius: 50%;
+ animation: glassDotsFloat 1.4s ease-in-out infinite both;
+ backdrop-filter: blur(2px);
+ -webkit-backdrop-filter: blur(2px);
+ box-shadow: 0 2px 8px rgba(255, 255, 255, 0.3);
+}
+
+.loading-dots span:nth-child(1) { animation-delay: -0.32s; }
+.loading-dots span:nth-child(2) { animation-delay: -0.16s; }
+.loading-dots span:nth-child(3) { animation-delay: 0s; }
+
+@keyframes glassDotsFloat {
+ 0%, 80%, 100% {
+ transform: scale(0.8);
+ opacity: 0.5;
+ }
+ 40% {
+ transform: scale(1.2);
+ opacity: 1;
+ }
+}
+
+/* 农历信息展示 */
+.lunar-info {
+ display: grid;
+ gap: 25px;
+ animation: infoFadeIn 0.8s ease-out;
+}
+
+@keyframes infoFadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(30px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.info-card {
+ background: rgba(255, 255, 255, 0.12);
+ backdrop-filter: blur(20px);
+ -webkit-backdrop-filter: blur(20px);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ border-radius: 20px;
+ padding: 30px;
+ position: relative;
+ overflow: hidden;
+ transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
+ box-shadow:
+ 0 8px 32px 0 rgba(31, 38, 135, 0.15),
+ inset 0 1px 0 rgba(255, 255, 255, 0.3);
+}
+
+.info-card::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 3px;
+ background: linear-gradient(90deg,
+ rgba(255, 255, 255, 0.3),
+ rgba(255, 255, 255, 0.6),
+ rgba(255, 255, 255, 0.3)
+ );
+ transform: scaleX(0);
+ transition: transform 0.4s ease;
+}
+
+.info-card:hover::before {
+ transform: scaleX(1);
+}
+
+.info-card:hover {
+ transform: translateY(-5px);
+ background: rgba(255, 255, 255, 0.15);
+ border-color: rgba(255, 255, 255, 0.3);
+ box-shadow:
+ 0 12px 40px 0 rgba(31, 38, 135, 0.2),
+ inset 0 1px 0 rgba(255, 255, 255, 0.4);
+}
+
+.card-header {
+ display: flex;
+ align-items: center;
+ gap: 15px;
+ margin-bottom: 20px;
+}
+
+.card-icon {
+ font-size: 2.5em;
+ animation: cardIconFloat 3s ease-in-out infinite;
+}
+
+@keyframes cardIconFloat {
+ 0%, 100% { transform: translateY(0) rotate(0deg); }
+ 50% { transform: translateY(-5px) rotate(5deg); }
+}
+
+.card-title {
+ font-size: 1.5em;
+ font-weight: 700;
+ color: #0a0f14;
+ text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
+}
+
+.card-content {
+ display: grid;
+ gap: 15px;
+}
+
+.info-item {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding: 15px;
+ background: rgba(255, 255, 255, 0.08);
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px);
+ border-radius: 15px;
+ border: 1px solid rgba(255, 255, 255, 0.15);
+ transition: all 0.3s ease;
+}
+
+.info-item:hover {
+ background: rgba(255, 255, 255, 0.12);
+ transform: scale(1.02);
+}
+
+.item-icon {
+ font-size: 1.3em;
+ min-width: 30px;
+ text-align: center;
+}
+
+.item-label {
+ font-weight: 600;
+ color: #1a252f;
+ min-width: 80px;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
+}
+
+.item-value {
+ font-weight: 700;
+ color: #0a0f14;
+ font-size: 1.1em;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
+}
+
+/* 错误信息 */
+.error-message {
+ text-align: center;
+ padding: 60px 40px;
+ background: rgba(255, 255, 255, 0.1);
+ backdrop-filter: blur(25px);
+ -webkit-backdrop-filter: blur(25px);
+ border-radius: 25px;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ box-shadow:
+ 0 8px 32px 0 rgba(31, 38, 135, 0.2),
+ inset 0 1px 0 rgba(255, 255, 255, 0.3);
+}
+
+.error-content {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 25px;
+}
+
+.error-icon {
+ font-size: 4em;
+ animation: errorFloat 2s ease-in-out infinite alternate;
+ filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.3));
+}
+
+@keyframes errorFloat {
+ 0% { transform: translateY(0) rotate(-5deg); }
+ 100% { transform: translateY(-10px) rotate(5deg); }
+}
+
+.error-content h3 {
+ font-size: 1.6em;
+ color: #0a0f14;
+ margin: 0;
+ font-weight: 700;
+ text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
+}
+
+.error-content p {
+ color: #1a252f;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
+ font-size: 1.1em;
+ margin: 0;
+ line-height: 1.6;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+}
+
+.retry-btn {
+ background: rgba(255, 255, 255, 0.15);
+ backdrop-filter: blur(15px);
+ -webkit-backdrop-filter: blur(15px);
+ color: #0a0f14;
+ border: 1px solid rgba(255, 255, 255, 0.3);
+ padding: 12px 25px;
+ border-radius: 20px;
+ cursor: pointer;
+ font-size: 1em;
+ font-weight: 600;
+ transition: all 0.4s ease;
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
+ box-shadow:
+ 0 4px 15px rgba(31, 38, 135, 0.2),
+ inset 0 1px 0 rgba(255, 255, 255, 0.3);
+}
+
+.retry-btn:hover {
+ background: rgba(255, 255, 255, 0.2);
+ border-color: rgba(255, 255, 255, 0.4);
+ transform: translateY(-2px);
+ box-shadow:
+ 0 6px 20px rgba(31, 38, 135, 0.3),
+ inset 0 1px 0 rgba(255, 255, 255, 0.4);
+}
+
+.retry-btn span {
+ font-size: 1.1em;
+ transition: transform 0.3s ease;
+}
+
+.retry-btn:hover span {
+ transform: rotate(180deg);
+}
+
+/* 功能提示 */
+.feature-tips {
+ margin-top: 40px;
+}
+
+.tip-card {
+ background: rgba(255, 255, 255, 0.1);
+ backdrop-filter: blur(20px);
+ -webkit-backdrop-filter: blur(20px);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ border-radius: 20px;
+ padding: 30px;
+ text-align: center;
+ box-shadow:
+ 0 8px 32px 0 rgba(31, 38, 135, 0.15),
+ inset 0 1px 0 rgba(255, 255, 255, 0.3);
+}
+
+.tip-icon {
+ font-size: 3em;
+ margin-bottom: 15px;
+ animation: tipBlink 3s ease-in-out infinite;
+}
+
+@keyframes tipBlink {
+ 0%, 100% { opacity: 1; transform: scale(1); }
+ 50% { opacity: 0.7; transform: scale(1.05); }
+}
+
+.tip-card h3 {
+ font-size: 1.4em;
+ font-weight: 700;
+ color: #0a0f14;
+ margin-bottom: 20px;
+ text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
+}
+
+.tip-card ul {
+ list-style: none;
+ display: grid;
+ gap: 12px;
+ text-align: left;
+}
+
+.tip-card li {
+ color: #1a252f;
+ font-size: 1em;
+ padding: 10px 15px;
+ background: rgba(255, 255, 255, 0.08);
+ backdrop-filter: blur(5px);
+ -webkit-backdrop-filter: blur(5px);
+ border-radius: 10px;
+ border: 1px solid rgba(255, 255, 255, 0.15);
+ transition: all 0.3s ease;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
+}
+
+.tip-card li:hover {
+ background: rgba(255, 255, 255, 0.12);
+ transform: translateX(5px);
+}
+
+/* 平板端适配 (768px - 1024px) */
+@media (min-width: 768px) and (max-width: 1024px) {
+ .container {
+ padding: 25px;
+ }
+
+ .header {
+ padding: 35px 25px;
+ }
+
+ .header-icon {
+ font-size: 3.5em;
+ }
+
+ .title {
+ font-size: 2.8em;
+ letter-spacing: 1.5px;
+ }
+
+ .subtitle {
+ font-size: 1.2em;
+ }
+
+ .date-selector {
+ gap: 15px;
+ }
+
+ .input-group {
+ min-width: 180px;
+ }
+
+ .lunar-info {
+ grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
+ gap: 20px;
+ }
+
+ .info-card {
+ padding: 25px;
+ }
+}
+
+/* 电脑端适配 (1025px+) */
+@media (min-width: 1025px) {
+ .container {
+ padding: 40px;
+ }
+
+ .header {
+ padding: 50px 40px;
+ margin-bottom: 50px;
+ }
+
+ .header-icon {
+ font-size: 4.5em;
+ }
+
+ .title {
+ font-size: 3.8em;
+ letter-spacing: 3px;
+ }
+
+ .subtitle {
+ font-size: 1.4em;
+ }
+
+ .date-selector {
+ gap: 25px;
+ }
+
+ .input-group {
+ min-width: 220px;
+ }
+
+ .date-input {
+ padding: 14px 18px;
+ font-size: 1.05em;
+ }
+
+ .query-btn {
+ padding: 14px 32px;
+ font-size: 1.05em;
+ }
+
+ .lunar-info {
+ grid-template-columns: repeat(auto-fit, minmax(500px, 1fr));
+ gap: 30px;
+ }
+
+ .info-card {
+ padding: 35px;
+ }
+
+ .card-title {
+ font-size: 1.6em;
+ }
+
+ .item-label {
+ min-width: 100px;
+ }
+
+ .item-value {
+ font-size: 1.15em;
+ }
+
+ /* 电脑端特殊效果 */
+ .info-card:hover {
+ transform: translateY(-8px) scale(1.02);
+ }
+}
+
+/* 手机端适配 (767px以下) - 优化手机端体验 */
+@media (max-width: 767px) {
+ .container {
+ padding: 15px;
+ margin: 10px auto;
+ max-width: 95%;
+ }
+
+ .header {
+ padding: 25px 15px;
+ margin-bottom: 25px;
+ border-radius: 20px;
+ }
+
+ .header-icon {
+ font-size: 2.8em;
+ }
+
+ .title {
+ font-size: 2.2em;
+ letter-spacing: 1px;
+ margin-bottom: 8px;
+ }
+
+ .subtitle {
+ font-size: 1em;
+ margin-bottom: 20px;
+ }
+
+ .date-selector {
+ flex-direction: column;
+ gap: 15px;
+ align-items: center;
+ padding: 0 5px;
+ }
+
+ .input-group {
+ width: 100%;
+ max-width: 300px;
+ min-width: auto;
+ }
+
+ .date-input {
+ padding: 14px 16px;
+ font-size: 16px; /* 防止iOS缩放 */
+ border-radius: 12px;
+ }
+
+ .query-btn {
+ padding: 14px 24px;
+ font-size: 16px;
+ width: 100%;
+ max-width: 200px;
+ justify-content: center;
+ border-radius: 15px;
+ margin-top: 10px;
+ }
+
+ .update-time {
+ font-size: 0.9em;
+ padding: 8px 16px;
+ }
+
+ .info-card {
+ padding: 20px;
+ border-radius: 15px;
+ }
+
+ .card-header {
+ gap: 12px;
+ margin-bottom: 15px;
+ }
+
+ .card-icon {
+ font-size: 2em;
+ }
+
+ .card-title {
+ font-size: 1.3em;
+ }
+
+ .info-item {
+ padding: 12px;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 8px;
+ }
+
+ .item-icon {
+ font-size: 1.2em;
+ }
+
+ .item-label {
+ min-width: auto;
+ font-size: 0.95em;
+ margin-bottom: 8px;
+ }
+
+ .item-value {
+ font-size: 1em;
+ }
+
+ .tip-card {
+ padding: 20px;
+ }
+
+ .tip-card ul {
+ gap: 10px;
+ }
+
+ .tip-card li {
+ padding: 8px 12px;
+ font-size: 0.9em;
+ }
+
+ /* 手机端性能优化 - 减少动画 */
+ .title {
+ animation: none;
+ }
+
+ .subtitle {
+ animation: none;
+ }
+
+ .input-label {
+ animation: none;
+ }
+
+ .date-input {
+ animation: none;
+ }
+
+ .query-btn {
+ animation: none;
+ }
+
+ .card-icon {
+ animation: none;
+ }
+
+ .tip-icon {
+ animation: none;
+ }
+}
+
+/* 超小屏幕适配 (480px以下) */
+@media (max-width: 480px) {
+ .container {
+ padding: 12px;
+ }
+
+ .header {
+ padding: 20px 15px;
+ margin-bottom: 20px;
+ }
+
+ .header-icon {
+ font-size: 2.5em;
+ }
+
+ .title {
+ font-size: 1.9em;
+ letter-spacing: 0.5px;
+ }
+
+ .subtitle {
+ font-size: 0.95em;
+ }
+
+ .date-selector {
+ gap: 12px;
+ }
+
+ .input-group {
+ max-width: 280px;
+ }
+
+ .date-input {
+ padding: 8px 12px;
+ font-size: 0.9em;
+ }
+
+ .query-btn {
+ padding: 8px 20px;
+ font-size: 0.9em;
+ max-width: 180px;
+ }
+
+ .update-time {
+ font-size: 0.85em;
+ padding: 6px 12px;
+ flex-direction: column;
+ gap: 4px;
+ }
+
+ .lunar-info {
+ gap: 15px;
+ }
+
+ .info-card {
+ padding: 18px 15px;
+ border-radius: 12px;
+ }
+
+ .card-header {
+ gap: 10px;
+ margin-bottom: 12px;
+ }
+
+ .card-icon {
+ font-size: 1.8em;
+ }
+
+ .card-title {
+ font-size: 1.2em;
+ }
+
+ .info-item {
+ padding: 10px;
+ gap: 6px;
+ }
+
+ .item-icon {
+ font-size: 1.1em;
+ }
+
+ .item-label {
+ font-size: 0.85em;
+ }
+
+ .item-value {
+ font-size: 0.95em;
+ }
+
+ .tip-card {
+ padding: 15px;
+ }
+
+ .tip-icon {
+ font-size: 2.5em;
+ }
+
+ .tip-card h3 {
+ font-size: 1.2em;
+ }
+
+ .tip-card li {
+ padding: 6px 10px;
+ font-size: 0.85em;
+ }
+
+ /* 超小屏幕性能优化 */
+ .info-card {
+ transition: transform 0.2s ease, background 0.2s ease;
+ }
+
+ .info-card::before {
+ display: none;
+ }
+
+ /* 禁用复杂动画以提升性能 */
+ .title {
+ animation: none;
+ }
+
+ .subtitle {
+ animation: none;
+ }
+
+ .input-label {
+ animation: none;
+ }
+
+ .date-input {
+ animation: none;
+ }
+
+ .query-btn {
+ animation: none;
+ }
+
+ .card-icon {
+ animation: none;
+ }
+
+ .tip-icon {
+ animation: none;
+ }
+
+ .loading-content {
+ gap: 15px;
+ }
+
+ .loading-emoji {
+ font-size: 2em;
+ }
+
+ .error-icon {
+ font-size: 3em;
+ }
+}
+
+/* 时辰宜忌特殊样式 */
+.hours-card {
+ grid-column: 1 / -1; /* 占满整行 */
+}
+
+.hours-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: 15px;
+ margin-top: 15px;
+}
+
+.hour-item {
+ background: rgba(255, 255, 255, 0.1);
+ backdrop-filter: blur(10px);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ border-radius: 12px;
+ padding: 12px;
+ transition: all 0.3s ease;
+}
+
+.hour-item:hover {
+ background: rgba(255, 255, 255, 0.15);
+ transform: translateY(-2px);
+ box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
+}
+
+.hour-name {
+ font-size: 14px;
+ font-weight: 600;
+ color: #2c3e50;
+ text-align: center;
+ margin-bottom: 8px;
+ padding: 4px 8px;
+ background: rgba(255, 255, 255, 0.8);
+ border-radius: 6px;
+ text-shadow: 0 1px 2px rgba(255, 255, 255, 0.5);
+ border: 1px solid rgba(255, 255, 255, 0.9);
+}
+
+.hour-content {
+ font-size: 12px;
+ line-height: 1.4;
+}
+
+.hour-recommends,
+.hour-avoids {
+ margin: 4px 0;
+}
+
+.hour-label {
+ font-weight: 600;
+ color: #1a1a1a;
+ margin-right: 4px;
+}
+
+.hour-recommends .hour-label {
+ color: #4ade80;
+}
+
+.hour-avoids .hour-label {
+ color: #f87171;
+}
+
+.hour-text {
+ color: #2c2c2c;
+}
+
+/* 时辰宜忌响应式优化 */
+@media (max-width: 768px) {
+ .hours-grid {
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
+ gap: 10px;
+ }
+
+ .hour-item {
+ padding: 8px;
+ }
+
+ .hour-name {
+ font-size: 12px;
+ margin-bottom: 6px;
+ }
+
+ .hour-content {
+ font-size: 11px;
+ }
+}
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/index.html b/InfoGenie-frontend/public/60sapi/实用功能/农历信息/index.html
index d66d4d7c..0d00e02d 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/index.html
+++ b/InfoGenie-frontend/public/60sapi/实用功能/农历信息/index.html
@@ -1,108 +1,108 @@
-
-
-
-
-
- 🌙农历信息查询
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
🔮
-
正在查询农历信息...
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
😔
-
查询失败了
-
无法获取农历信息,请稍后重试
-
-
-
-
-
-
-
-
+
+
+
+
+
+
🌙农历信息查询
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
🔮
+
正在查询农历信息...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
😔
+
查询失败了
+
无法获取农历信息,请稍后重试
+
+
+
+
+
+
+
+
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/js/script.js b/InfoGenie-frontend/public/60sapi/实用功能/农历信息/js/script.js
index 248b8928..f2ec21cd 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/实用功能/农历信息/js/script.js
@@ -1,475 +1,475 @@
-// API接口列表
-const API_ENDPOINTS = [
- "https://60s.api.shumengya.top",
-];
-
-// 当前使用的API索引
-let currentApiIndex = 0;
-
-// DOM元素
-const loadingElement = document.getElementById('loading');
-const lunarInfoElement = document.getElementById('lunarInfo');
-const errorMessageElement = document.getElementById('errorMessage');
-const updateTimeElement = document.getElementById('updateTime');
-const dateInput = document.getElementById('dateInput');
-const queryBtn = document.getElementById('queryBtn');
-
-// 页面加载完成后初始化
-document.addEventListener('DOMContentLoaded', function() {
- initializePage();
-});
-
-// 初始化页面
-function initializePage() {
- // 设置默认日期为今天
- const today = new Date();
- const dateString = today.toISOString().split('T')[0];
- dateInput.value = dateString;
-
- // 绑定事件
- queryBtn.addEventListener('click', queryLunarInfo);
- dateInput.addEventListener('change', queryLunarInfo);
-
- // 自动查询当天信息
- queryLunarInfo();
-}
-
-// 查询农历信息
-async function queryLunarInfo() {
- const selectedDate = dateInput.value;
- if (!selectedDate) {
- showError('请选择查询日期');
- return;
- }
-
- showLoading();
- hideError();
- hideLunarInfo();
-
- try {
- const data = await fetchLunarData(selectedDate);
- displayLunarInfo(data.data);
- updateQueryTime();
- } catch (error) {
- console.error('查询失败:', error);
- showError('查询农历信息失败,请稍后重试');
- }
-
- hideLoading();
-}
-
-// 获取农历数据
-async function fetchLunarData(date) {
- for (let i = 0; i < API_ENDPOINTS.length; i++) {
- const apiUrl = API_ENDPOINTS[currentApiIndex];
-
- try {
- const response = await fetch(`${apiUrl}/v2/lunar?date=${date}`, {
- method: 'GET',
- headers: {
- 'Accept': 'application/json',
- },
- timeout: 10000
- });
-
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}`);
- }
-
- const data = await response.json();
-
- if (data.code === 200 && data.data) {
- return data;
- } else {
- throw new Error('数据格式错误');
- }
- } catch (error) {
- console.error(`API ${apiUrl} 请求失败:`, error);
- currentApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length;
-
- if (i === API_ENDPOINTS.length - 1) {
- throw new Error('所有API接口都无法访问');
- }
- }
- }
-}
-
-// 显示农历信息
-function displayLunarInfo(lunarData) {
- lunarInfoElement.innerHTML = `
-
-
-
-
-
🗓️
-
公历日期
-
${lunarData.solar.year}年${String(lunarData.solar.month).padStart(2, '0')}月${String(lunarData.solar.day).padStart(2, '0')}日
-
-
-
🌍
-
星期
-
${lunarData.solar.week_desc}
-
-
-
🍂
-
季节
-
${lunarData.solar.season_name_desc}
-
-
-
⭐
-
星座
-
${lunarData.constellation.name}
-
-
-
-
-
-
-
-
-
🏮
-
农历日期
-
${lunarData.lunar.desc_short}
-
-
-
🐲
-
生肖年
-
${lunarData.zodiac.year}年
-
-
-
☯️
-
天干地支
-
${lunarData.sixty_cycle.year.name}
-
-
-
🌙
-
月相
-
${lunarData.phase.name}
-
-
-
-
-
-
-
-
-
🌱
-
当前节气
-
${lunarData.term.stage ? lunarData.term.stage.name : '无节气'}
-
-
-
🎉
-
法定假日
-
${lunarData.legal_holiday ? lunarData.legal_holiday.name : '无假日'}
-
-
-
🎊
-
传统节日
-
${lunarData.festival.both_desc || '无特殊节日'}
-
-
-
📊
-
一年第几天
-
第${lunarData.stats.day_of_year}天
-
-
-
-
-
-
-
-
-
🕐
-
当前时辰
-
${lunarData.lunar.hour_desc}
-
-
-
☯️
-
时辰干支
-
${lunarData.sixty_cycle.hour.name}
-
-
-
🐾
-
时辰生肖
-
${lunarData.zodiac.hour}
-
-
-
🎵
-
纳音
-
${lunarData.nayin.hour}
-
-
-
-
-
-
-
-
-
✅
-
宜
-
${formatTabooText(lunarData.taboo.day.recommends)}
-
-
-
❌
-
忌
-
${formatTabooText(lunarData.taboo.day.avoids)}
-
-
-
🕐
-
时辰宜
-
${formatTabooText(lunarData.taboo.hour.recommends)}
-
-
-
🚫
-
时辰忌
-
${formatTabooText(lunarData.taboo.hour.avoids)}
-
-
-
-
-
-
-
-
-
🍀
-
今日运势
-
${lunarData.fortune.today_luck}
-
-
-
💼
-
事业运
-
${lunarData.fortune.career}
-
-
-
💰
-
财运
-
${lunarData.fortune.money}
-
-
-
💖
-
感情运
-
${lunarData.fortune.love}
-
-
-
-
-
-
-
-
-
📊
-
年度进度
-
${lunarData.stats.percents_formatted.year}
-
-
-
📅
-
本月进度
-
${lunarData.stats.percents_formatted.month}
-
-
-
-
-
-
-
-
- ${generateHourlyTaboo(lunarData.taboo.hours)}
- `;
-
- showLunarInfo();
-}
-
-// 格式化宜忌文本
-function formatTabooText(text) {
- if (!text) return '无';
- return text.replace(/\./g, '、');
-}
-
-// 生成十二时辰宜忌
-function generateHourlyTaboo(hours) {
- if (!hours || hours.length === 0) return '';
-
- const hourCards = hours.map(hour => `
-
-
${hour.hour}
-
-
- 宜:
- ${formatTabooText(hour.recommends) || '无'}
-
-
- 忌:
- ${formatTabooText(hour.avoids) || '无'}
-
-
-
- `).join('');
-
- return `
-
- `;
-}
-
-// 更新查询时间
-function updateQueryTime() {
- const now = new Date();
- const timeStr = now.toLocaleString('zh-CN', {
- year: 'numeric',
- month: '2-digit',
- day: '2-digit',
- hour: '2-digit',
- minute: '2-digit',
- second: '2-digit'
- });
- updateTimeElement.textContent = `查询时间: ${timeStr}`;
-
- // 添加成功提示
- showSuccessMessage('🌙 农历信息已更新');
-}
-
-// 显示成功消息
-function showSuccessMessage(message) {
- // 移除之前的提示
- const existingToast = document.querySelector('.success-toast');
- if (existingToast) {
- existingToast.remove();
- }
-
- const toast = document.createElement('div');
- toast.className = 'success-toast';
- toast.textContent = message;
- toast.style.cssText = `
- position: fixed;
- top: 20px;
- right: 20px;
- background: rgba(255, 255, 255, 0.2);
- backdrop-filter: blur(15px);
- -webkit-backdrop-filter: blur(15px);
- color: #1a1a1a;
- padding: 12px 20px;
- border-radius: 25px;
- border: 1px solid rgba(255, 255, 255, 0.3);
- box-shadow: 0 8px 32px rgba(31, 38, 135, 0.2);
- z-index: 1000;
- font-weight: 600;
- font-size: 0.9em;
- animation: glassToastSlide 0.5s ease-out;
- text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
- `;
-
- document.body.appendChild(toast);
-
- // 3秒后自动移除
- setTimeout(() => {
- toast.style.animation = 'glassToastSlideOut 0.5s ease-in forwards';
- setTimeout(() => toast.remove(), 500);
- }, 3000);
-}
-
-// 显示加载状态
-function showLoading() {
- loadingElement.style.display = 'block';
-}
-
-// 隐藏加载状态
-function hideLoading() {
- loadingElement.style.display = 'none';
-}
-
-// 显示农历信息
-function showLunarInfo() {
- lunarInfoElement.style.display = 'block';
-}
-
-// 隐藏农历信息
-function hideLunarInfo() {
- lunarInfoElement.style.display = 'none';
-}
-
-// 显示错误信息
-function showError(message = '查询失败,请稍后重试') {
- errorMessageElement.style.display = 'block';
- const errorContent = errorMessageElement.querySelector('.error-content p');
- if (errorContent) {
- errorContent.textContent = message;
- }
-}
-
-// 隐藏错误信息
-function hideError() {
- errorMessageElement.style.display = 'none';
-}
-
-// 添加CSS动画到页面
-if (!document.querySelector('#toast-styles')) {
- const style = document.createElement('style');
- style.id = 'toast-styles';
- style.textContent = `
- @keyframes glassToastSlide {
- from {
- opacity: 0;
- transform: translateX(100px) scale(0.8);
- }
- to {
- opacity: 1;
- transform: translateX(0) scale(1);
- }
- }
-
- @keyframes glassToastSlideOut {
- from {
- opacity: 1;
- transform: translateX(0) scale(1);
- }
- to {
- opacity: 0;
- transform: translateX(100px) scale(0.8);
- }
- }
- `;
- document.head.appendChild(style);
-}
-
-// 键盘快捷键支持
-document.addEventListener('keydown', function(e) {
- if (e.key === 'Enter') {
- e.preventDefault();
- queryLunarInfo();
- }
-
- if (e.key === 'r' && (e.ctrlKey || e.metaKey)) {
- e.preventDefault();
- queryLunarInfo();
- }
-});
+// API接口列表
+const API_ENDPOINTS = [
+ "https://60s.api.shumengya.top",
+];
+
+// 当前使用的API索引
+let currentApiIndex = 0;
+
+// DOM元素
+const loadingElement = document.getElementById('loading');
+const lunarInfoElement = document.getElementById('lunarInfo');
+const errorMessageElement = document.getElementById('errorMessage');
+const updateTimeElement = document.getElementById('updateTime');
+const dateInput = document.getElementById('dateInput');
+const queryBtn = document.getElementById('queryBtn');
+
+// 页面加载完成后初始化
+document.addEventListener('DOMContentLoaded', function() {
+ initializePage();
+});
+
+// 初始化页面
+function initializePage() {
+ // 设置默认日期为今天
+ const today = new Date();
+ const dateString = today.toISOString().split('T')[0];
+ dateInput.value = dateString;
+
+ // 绑定事件
+ queryBtn.addEventListener('click', queryLunarInfo);
+ dateInput.addEventListener('change', queryLunarInfo);
+
+ // 自动查询当天信息
+ queryLunarInfo();
+}
+
+// 查询农历信息
+async function queryLunarInfo() {
+ const selectedDate = dateInput.value;
+ if (!selectedDate) {
+ showError('请选择查询日期');
+ return;
+ }
+
+ showLoading();
+ hideError();
+ hideLunarInfo();
+
+ try {
+ const data = await fetchLunarData(selectedDate);
+ displayLunarInfo(data.data);
+ updateQueryTime();
+ } catch (error) {
+ console.error('查询失败:', error);
+ showError('查询农历信息失败,请稍后重试');
+ }
+
+ hideLoading();
+}
+
+// 获取农历数据
+async function fetchLunarData(date) {
+ for (let i = 0; i < API_ENDPOINTS.length; i++) {
+ const apiUrl = API_ENDPOINTS[currentApiIndex];
+
+ try {
+ const response = await fetch(`${apiUrl}/v2/lunar?date=${date}`, {
+ method: 'GET',
+ headers: {
+ 'Accept': 'application/json',
+ },
+ timeout: 10000
+ });
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}`);
+ }
+
+ const data = await response.json();
+
+ if (data.code === 200 && data.data) {
+ return data;
+ } else {
+ throw new Error('数据格式错误');
+ }
+ } catch (error) {
+ console.error(`API ${apiUrl} 请求失败:`, error);
+ currentApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length;
+
+ if (i === API_ENDPOINTS.length - 1) {
+ throw new Error('所有API接口都无法访问');
+ }
+ }
+ }
+}
+
+// 显示农历信息
+function displayLunarInfo(lunarData) {
+ lunarInfoElement.innerHTML = `
+
+
+
+
+
🗓️
+
公历日期
+
${lunarData.solar.year}年${String(lunarData.solar.month).padStart(2, '0')}月${String(lunarData.solar.day).padStart(2, '0')}日
+
+
+
🌍
+
星期
+
${lunarData.solar.week_desc}
+
+
+
🍂
+
季节
+
${lunarData.solar.season_name_desc}
+
+
+
⭐
+
星座
+
${lunarData.constellation.name}
+
+
+
+
+
+
+
+
+
🏮
+
农历日期
+
${lunarData.lunar.desc_short}
+
+
+
🐲
+
生肖年
+
${lunarData.zodiac.year}年
+
+
+
☯️
+
天干地支
+
${lunarData.sixty_cycle.year.name}
+
+
+
🌙
+
月相
+
${lunarData.phase.name}
+
+
+
+
+
+
+
+
+
🌱
+
当前节气
+
${lunarData.term.stage ? lunarData.term.stage.name : '无节气'}
+
+
+
🎉
+
法定假日
+
${lunarData.legal_holiday ? lunarData.legal_holiday.name : '无假日'}
+
+
+
🎊
+
传统节日
+
${lunarData.festival.both_desc || '无特殊节日'}
+
+
+
📊
+
一年第几天
+
第${lunarData.stats.day_of_year}天
+
+
+
+
+
+
+
+
+
🕐
+
当前时辰
+
${lunarData.lunar.hour_desc}
+
+
+
☯️
+
时辰干支
+
${lunarData.sixty_cycle.hour.name}
+
+
+
🐾
+
时辰生肖
+
${lunarData.zodiac.hour}
+
+
+
🎵
+
纳音
+
${lunarData.nayin.hour}
+
+
+
+
+
+
+
+
+
✅
+
宜
+
${formatTabooText(lunarData.taboo.day.recommends)}
+
+
+
❌
+
忌
+
${formatTabooText(lunarData.taboo.day.avoids)}
+
+
+
🕐
+
时辰宜
+
${formatTabooText(lunarData.taboo.hour.recommends)}
+
+
+
🚫
+
时辰忌
+
${formatTabooText(lunarData.taboo.hour.avoids)}
+
+
+
+
+
+
+
+
+
🍀
+
今日运势
+
${lunarData.fortune.today_luck}
+
+
+
💼
+
事业运
+
${lunarData.fortune.career}
+
+
+
💰
+
财运
+
${lunarData.fortune.money}
+
+
+
💖
+
感情运
+
${lunarData.fortune.love}
+
+
+
+
+
+
+
+
+
📊
+
年度进度
+
${lunarData.stats.percents_formatted.year}
+
+
+
📅
+
本月进度
+
${lunarData.stats.percents_formatted.month}
+
+
+
+
+
+
+
+
+ ${generateHourlyTaboo(lunarData.taboo.hours)}
+ `;
+
+ showLunarInfo();
+}
+
+// 格式化宜忌文本
+function formatTabooText(text) {
+ if (!text) return '无';
+ return text.replace(/\./g, '、');
+}
+
+// 生成十二时辰宜忌
+function generateHourlyTaboo(hours) {
+ if (!hours || hours.length === 0) return '';
+
+ const hourCards = hours.map(hour => `
+
+
${hour.hour}
+
+
+ 宜:
+ ${formatTabooText(hour.recommends) || '无'}
+
+
+ 忌:
+ ${formatTabooText(hour.avoids) || '无'}
+
+
+
+ `).join('');
+
+ return `
+
+ `;
+}
+
+// 更新查询时间
+function updateQueryTime() {
+ const now = new Date();
+ const timeStr = now.toLocaleString('zh-CN', {
+ year: 'numeric',
+ month: '2-digit',
+ day: '2-digit',
+ hour: '2-digit',
+ minute: '2-digit',
+ second: '2-digit'
+ });
+ updateTimeElement.textContent = `查询时间: ${timeStr}`;
+
+ // 添加成功提示
+ showSuccessMessage('🌙 农历信息已更新');
+}
+
+// 显示成功消息
+function showSuccessMessage(message) {
+ // 移除之前的提示
+ const existingToast = document.querySelector('.success-toast');
+ if (existingToast) {
+ existingToast.remove();
+ }
+
+ const toast = document.createElement('div');
+ toast.className = 'success-toast';
+ toast.textContent = message;
+ toast.style.cssText = `
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ background: rgba(255, 255, 255, 0.2);
+ backdrop-filter: blur(15px);
+ -webkit-backdrop-filter: blur(15px);
+ color: #1a1a1a;
+ padding: 12px 20px;
+ border-radius: 25px;
+ border: 1px solid rgba(255, 255, 255, 0.3);
+ box-shadow: 0 8px 32px rgba(31, 38, 135, 0.2);
+ z-index: 1000;
+ font-weight: 600;
+ font-size: 0.9em;
+ animation: glassToastSlide 0.5s ease-out;
+ text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
+ `;
+
+ document.body.appendChild(toast);
+
+ // 3秒后自动移除
+ setTimeout(() => {
+ toast.style.animation = 'glassToastSlideOut 0.5s ease-in forwards';
+ setTimeout(() => toast.remove(), 500);
+ }, 3000);
+}
+
+// 显示加载状态
+function showLoading() {
+ loadingElement.style.display = 'block';
+}
+
+// 隐藏加载状态
+function hideLoading() {
+ loadingElement.style.display = 'none';
+}
+
+// 显示农历信息
+function showLunarInfo() {
+ lunarInfoElement.style.display = 'block';
+}
+
+// 隐藏农历信息
+function hideLunarInfo() {
+ lunarInfoElement.style.display = 'none';
+}
+
+// 显示错误信息
+function showError(message = '查询失败,请稍后重试') {
+ errorMessageElement.style.display = 'block';
+ const errorContent = errorMessageElement.querySelector('.error-content p');
+ if (errorContent) {
+ errorContent.textContent = message;
+ }
+}
+
+// 隐藏错误信息
+function hideError() {
+ errorMessageElement.style.display = 'none';
+}
+
+// 添加CSS动画到页面
+if (!document.querySelector('#toast-styles')) {
+ const style = document.createElement('style');
+ style.id = 'toast-styles';
+ style.textContent = `
+ @keyframes glassToastSlide {
+ from {
+ opacity: 0;
+ transform: translateX(100px) scale(0.8);
+ }
+ to {
+ opacity: 1;
+ transform: translateX(0) scale(1);
+ }
+ }
+
+ @keyframes glassToastSlideOut {
+ from {
+ opacity: 1;
+ transform: translateX(0) scale(1);
+ }
+ to {
+ opacity: 0;
+ transform: translateX(100px) scale(0.8);
+ }
+ }
+ `;
+ document.head.appendChild(style);
+}
+
+// 键盘快捷键支持
+document.addEventListener('keydown', function(e) {
+ if (e.key === 'Enter') {
+ e.preventDefault();
+ queryLunarInfo();
+ }
+
+ if (e.key === 'r' && (e.ctrlKey || e.metaKey)) {
+ e.preventDefault();
+ queryLunarInfo();
+ }
+});
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/接口集合.json b/InfoGenie-frontend/public/60sapi/实用功能/农历信息/接口集合.json
index 547b2771..42245813 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/接口集合.json
+++ b/InfoGenie-frontend/public/60sapi/实用功能/农历信息/接口集合.json
@@ -1,3 +1,3 @@
-[
- "https://60s.api.shumengya.top"
-]
+[
+ "https://60s.api.shumengya.top"
+]
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/农历信息/返回接口.json
index 910981d4..2d37ac73 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/农历信息/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/实用功能/农历信息/返回接口.json
@@ -1,647 +1,647 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "solar": {
- "year": 2025,
- "month": 9,
- "day": 1,
- "hour": 17,
- "minute": 58,
- "second": 47,
- "full": "2025-09-01",
- "full_with_time": "2025-09-01 17:58:47",
- "week": 1,
- "week_desc": "星期一",
- "week_desc_short": "一",
- "season": 3,
- "season_desc": "三季度",
- "season_desc_short": "三",
- "season_name": "秋",
- "season_name_desc": "秋天",
- "is_leap_year": false
- },
- "lunar": {
- "year": "乙巳",
- "month": "七",
- "day": "初十",
- "hour": "酉",
- "full_with_hour": "农历乙巳年七月初十酉时",
- "desc_short": "农历乙巳年七月初十",
- "year_desc": "农历乙巳年",
- "month_desc": "七月",
- "day_desc": "初十",
- "hour_desc": "酉时",
- "is_leap_month": false
- },
- "stats": {
- "day_of_year": 244,
- "week_of_year": 36,
- "week_of_month": 1,
- "percents": {
- "year": 0.665753424657534,
- "month": 0.0333333333333333,
- "week": 0.142857142857143,
- "day": 0.749161909722222
- },
- "percents_formatted": {
- "year": "66.58%",
- "month": "3.33%",
- "week": "14.29%",
- "day": "74.92%"
- }
- },
- "term": {
- "today": null,
- "stage": {
- "name": "处暑",
- "position": 10,
- "is_jie": false,
- "is_qi": true
- }
- },
- "zodiac": {
- "year": "蛇",
- "month": "鸡",
- "day": "鸡",
- "hour": "鸡"
- },
- "sixty_cycle": {
- "year": {
- "heaven_stem": "乙",
- "earth_branch": "巳",
- "name": "乙巳年",
- "name_short": "乙巳"
- },
- "month": {
- "heaven_stem": "乙",
- "earth_branch": "酉",
- "name": "乙酉月",
- "name_short": "乙酉"
- },
- "day": {
- "heaven_stem": "癸",
- "earth_branch": "酉",
- "name": "癸酉日",
- "name_short": "癸酉"
- },
- "hour": {
- "heaven_stem": "辛",
- "earth_branch": "酉",
- "name": "辛酉时",
- "name_short": "辛酉"
- }
- },
- "legal_holiday": null,
- "festival": {
- "solar": null,
- "lunar": null,
- "both_desc": null
- },
- "phase": {
- "name": "宵月",
- "position": 10
- },
- "constellation": {
- "name": "处女座",
- "name_short": "处女"
- },
- "taboo": {
- "day": {
- "recommends": "解除.祭祀.祈福.求嗣.修造.动土.竖柱.上梁.安床.纳畜.盖屋.合脊.起基.入殓.破土.安葬",
- "avoids": "出火.嫁娶.开光.进人口.出行.词讼.开市.入宅.移徙.赴任"
- },
- "hour": {
- "hour": "酉时",
- "hour_short": "酉",
- "avoids": "乘船.造桥",
- "recommends": "嫁娶.出行.移徙.入宅.开市.赴任.祈福.安床.开仓.盖屋.修造.求财"
- },
- "hours": [
- {
- "hour": "酉时",
- "hour_short": "酉",
- "recommends": "嫁娶.出行.移徙.入宅.开市.赴任.祈福.安床.开仓.盖屋.修造.求财",
- "avoids": "乘船.造桥"
- },
- {
- "hour": "戌时",
- "hour_short": "戌",
- "recommends": "嫁娶.移徙.安葬.进人口.求财",
- "avoids": "出行.赴任.祈福.祭祀.开光.斋醮"
- },
- {
- "hour": "亥时",
- "hour_short": "亥",
- "recommends": "嫁娶.移徙.交易.入宅.开市.安葬.求嗣.求财",
- "avoids": "出行.赴任.动土.祈福.祭祀.修造.开光.斋醮"
- },
- {
- "hour": "子时",
- "hour_short": "子",
- "recommends": "嫁娶.交易.入宅.开市.祈福.安葬.求嗣.求财",
- "avoids": "出行.移徙.赴任.词讼.修造"
- },
- {
- "hour": "丑时",
- "hour_short": "丑",
- "recommends": "嫁娶.祈福.安葬.祭祀.酬神.求财",
- "avoids": "出行.赴任.动土.修造"
- },
- {
- "hour": "寅时",
- "hour_short": "寅",
- "recommends": "嫁娶.出行.交易.开市.赴任.祈福.安床.祭祀.求嗣.求财",
- "avoids": "盖屋.入殓.上梁"
- },
- {
- "hour": "卯时",
- "hour_short": "卯",
- "recommends": "嫁娶.交易.入宅.开市.祈福.安床.安葬.求嗣.求财",
- "avoids": "出行.赴任.修造"
- },
- {
- "hour": "辰时",
- "hour_short": "辰",
- "recommends": "",
- "avoids": "诸事不宜"
- },
- {
- "hour": "巳时",
- "hour_short": "巳",
- "recommends": "嫁娶.出行.移徙.入宅.开市.祈福.安床.盖屋.祭祀.作灶",
- "avoids": "安葬.修造.开光"
- },
- {
- "hour": "午时",
- "hour_short": "午",
- "recommends": "嫁娶.出行.交易.开市.祈福.安床.求嗣.求财",
- "avoids": "赴任.动土.词讼.修造"
- },
- {
- "hour": "未时",
- "hour_short": "未",
- "recommends": "嫁娶.入宅.祈福.安葬.祭祀.修造.酬神.求财",
- "avoids": "出行.赴任"
- },
- {
- "hour": "申时",
- "hour_short": "申",
- "recommends": "嫁娶.出行.开市.赴任.安葬.求财",
- "avoids": "祈福.祭祀.酬神.斋醮"
- }
- ]
- },
- "julian_day": 2460919.5,
- "nayin": {
- "year": "覆灯火",
- "month": "泉中水",
- "day": "剑锋金",
- "hour": "石榴木"
- },
- "baizi": {
- "year_baizi": "性格温和,为人正直诚信。",
- "day_baizi": "性格温和,为人正直诚信。"
- },
- "fortune": {
- "today_luck": "今日学习运好,适合进修",
- "career": "领导能力突出,升职有望",
- "money": "偏财运不错,可小试投资",
- "love": "感情需要沟通,避免误会"
- },
- "constants": {
- "legal_holiday_list": [
- {
- "name": "元旦节",
- "date": "2025-01-01",
- "start": "2025-01-01",
- "end": "2025-01-01"
- },
- {
- "name": "春节",
- "date": "2025-01-29",
- "start": "2025-01-26",
- "end": "2025-02-08"
- },
- {
- "name": "清明节",
- "date": "2025-04-04",
- "start": "2025-04-04",
- "end": "2025-04-06"
- },
- {
- "name": "劳动节",
- "date": "2025-05-01",
- "start": "2025-04-27",
- "end": "2025-05-05"
- },
- {
- "name": "端午节",
- "date": "2025-05-31",
- "start": "2025-05-31",
- "end": "2025-06-02"
- },
- {
- "name": "国庆中秋",
- "date": "2025-10-01",
- "start": "2025-09-28",
- "end": "2025-10-11"
- }
- ],
- "phase_list": [
- {
- "name": "朔月",
- "lunar_day": 1
- },
- {
- "name": "既朔月",
- "lunar_day": 2
- },
- {
- "name": "蛾眉新月",
- "lunar_day": 3
- },
- {
- "name": "蛾眉新月",
- "lunar_day": 4
- },
- {
- "name": "蛾眉月",
- "lunar_day": 5
- },
- {
- "name": "夕月",
- "lunar_day": 6
- },
- {
- "name": "上弦月",
- "lunar_day": 7
- },
- {
- "name": "上弦月",
- "lunar_day": 8
- },
- {
- "name": "九夜月",
- "lunar_day": 9
- },
- {
- "name": "宵月",
- "lunar_day": 10
- },
- {
- "name": "宵月",
- "lunar_day": 11
- },
- {
- "name": "宵月",
- "lunar_day": 12
- },
- {
- "name": "渐盈凸月",
- "lunar_day": 13
- },
- {
- "name": "小望月",
- "lunar_day": 14
- },
- {
- "name": "望月",
- "lunar_day": 15
- },
- {
- "name": "既望月",
- "lunar_day": 16
- },
- {
- "name": "立待月",
- "lunar_day": 17
- },
- {
- "name": "居待月",
- "lunar_day": 18
- },
- {
- "name": "寝待月",
- "lunar_day": 19
- },
- {
- "name": "更待月",
- "lunar_day": 20
- },
- {
- "name": "渐亏凸月",
- "lunar_day": 21
- },
- {
- "name": "下弦月",
- "lunar_day": 22
- },
- {
- "name": "下弦月",
- "lunar_day": 23
- },
- {
- "name": "有明月",
- "lunar_day": 24
- },
- {
- "name": "有明月",
- "lunar_day": 25
- },
- {
- "name": "蛾眉残月",
- "lunar_day": 26
- },
- {
- "name": "蛾眉残月",
- "lunar_day": 27
- },
- {
- "name": "残月",
- "lunar_day": 28
- },
- {
- "name": "晓月",
- "lunar_day": 29
- },
- {
- "name": "晦月",
- "lunar_day": 30
- }
- ],
- "zodiac_list": [
- "鼠",
- "牛",
- "虎",
- "兔",
- "龙",
- "蛇",
- "马",
- "羊",
- "猴",
- "鸡",
- "狗",
- "猪"
- ],
- "constellation_list": [
- {
- "name": "白羊",
- "desc": "白羊座",
- "start": "3月21日",
- "end": "4月19日",
- "range": "3月21日~4月19日",
- "start_month": 3,
- "start_day": 21,
- "end_month": 4,
- "end_day": 19
- },
- {
- "name": "金牛",
- "desc": "金牛座",
- "start": "4月20日",
- "end": "5月20日",
- "range": "4月20日~5月20日",
- "start_month": 4,
- "start_day": 20,
- "end_month": 5,
- "end_day": 20
- },
- {
- "name": "双子",
- "desc": "双子座",
- "start": "5月21日",
- "end": "6月21日",
- "range": "5月21日~6月21日",
- "start_month": 5,
- "start_day": 21,
- "end_month": 6,
- "end_day": 21
- },
- {
- "name": "巨蟹",
- "desc": "巨蟹座",
- "start": "6月22日",
- "end": "7月22日",
- "range": "6月22日~7月22日",
- "start_month": 6,
- "start_day": 22,
- "end_month": 7,
- "end_day": 22
- },
- {
- "name": "狮子",
- "desc": "狮子座",
- "start": "7月23日",
- "end": "8月22日",
- "range": "7月23日~8月22日",
- "start_month": 7,
- "start_day": 23,
- "end_month": 8,
- "end_day": 22
- },
- {
- "name": "处女",
- "desc": "处女座",
- "start": "8月23日",
- "end": "9月22日",
- "range": "8月23日~9月22日",
- "start_month": 8,
- "start_day": 23,
- "end_month": 9,
- "end_day": 22
- },
- {
- "name": "天秤",
- "desc": "天秤座",
- "start": "9月23日",
- "end": "10月23日",
- "range": "9月23日~10月23日",
- "start_month": 9,
- "start_day": 23,
- "end_month": 10,
- "end_day": 23
- },
- {
- "name": "天蝎",
- "desc": "天蝎座",
- "start": "10月24日",
- "end": "11月22日",
- "range": "10月24日~11月22日",
- "start_month": 10,
- "start_day": 24,
- "end_month": 11,
- "end_day": 22
- },
- {
- "name": "射手",
- "desc": "射手座",
- "start": "11月23日",
- "end": "12月21日",
- "range": "11月23日~12月21日",
- "start_month": 11,
- "start_day": 23,
- "end_month": 12,
- "end_day": 21
- },
- {
- "name": "摩羯",
- "desc": "摩羯座",
- "start": "12月22日",
- "end": "1月19日",
- "range": "12月22日~1月19日",
- "start_month": 12,
- "start_day": 22,
- "end_month": 1,
- "end_day": 19
- },
- {
- "name": "水瓶",
- "desc": "水瓶座",
- "start": "1月20日",
- "end": "2月18日",
- "range": "1月20日~2月18日",
- "start_month": 1,
- "start_day": 20,
- "end_month": 2,
- "end_day": 18
- },
- {
- "name": "双鱼",
- "desc": "双鱼座",
- "start": "2月19日",
- "end": "3月20日",
- "range": "2月19日~3月20日",
- "start_month": 2,
- "start_day": 19,
- "end_month": 3,
- "end_day": 20
- }
- ],
- "heaven_stems": [
- "甲",
- "乙",
- "丙",
- "丁",
- "戊",
- "己",
- "庚",
- "辛",
- "壬",
- "癸"
- ],
- "earth_branches": [
- "子",
- "丑",
- "寅",
- "卯",
- "辰",
- "巳",
- "午",
- "未",
- "申",
- "酉",
- "戌",
- "亥"
- ],
- "solar_terms": [
- {
- "name": "立春",
- "desc": "春季开始"
- },
- {
- "name": "雨水",
- "desc": "降雨增多"
- },
- {
- "name": "惊蛰",
- "desc": "春雷乍响"
- },
- {
- "name": "春分",
- "desc": "昼夜等长"
- },
- {
- "name": "清明",
- "desc": "天清地明"
- },
- {
- "name": "谷雨",
- "desc": "雨生百谷"
- },
- {
- "name": "立夏",
- "desc": "夏季开始"
- },
- {
- "name": "小满",
- "desc": "麦粒渐满"
- },
- {
- "name": "芒种",
- "desc": "麦类收割"
- },
- {
- "name": "夏至",
- "desc": "白昼最长"
- },
- {
- "name": "小暑",
- "desc": "天气渐热"
- },
- {
- "name": "大暑",
- "desc": "一年最热"
- },
- {
- "name": "立秋",
- "desc": "秋季开始"
- },
- {
- "name": "处暑",
- "desc": "暑热结束"
- },
- {
- "name": "白露",
- "desc": "露水增多"
- },
- {
- "name": "秋分",
- "desc": "昼夜等长"
- },
- {
- "name": "寒露",
- "desc": "露水渐凉"
- },
- {
- "name": "霜降",
- "desc": "开始降霜"
- },
- {
- "name": "立冬",
- "desc": "冬季开始"
- },
- {
- "name": "小雪",
- "desc": "开始降雪"
- },
- {
- "name": "大雪",
- "desc": "降雪增多"
- },
- {
- "name": "冬至",
- "desc": "白昼最短"
- },
- {
- "name": "小寒",
- "desc": "天气渐冷"
- },
- {
- "name": "大寒",
- "desc": "一年最冷"
- }
- ]
- }
- }
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "solar": {
+ "year": 2025,
+ "month": 9,
+ "day": 1,
+ "hour": 17,
+ "minute": 58,
+ "second": 47,
+ "full": "2025-09-01",
+ "full_with_time": "2025-09-01 17:58:47",
+ "week": 1,
+ "week_desc": "星期一",
+ "week_desc_short": "一",
+ "season": 3,
+ "season_desc": "三季度",
+ "season_desc_short": "三",
+ "season_name": "秋",
+ "season_name_desc": "秋天",
+ "is_leap_year": false
+ },
+ "lunar": {
+ "year": "乙巳",
+ "month": "七",
+ "day": "初十",
+ "hour": "酉",
+ "full_with_hour": "农历乙巳年七月初十酉时",
+ "desc_short": "农历乙巳年七月初十",
+ "year_desc": "农历乙巳年",
+ "month_desc": "七月",
+ "day_desc": "初十",
+ "hour_desc": "酉时",
+ "is_leap_month": false
+ },
+ "stats": {
+ "day_of_year": 244,
+ "week_of_year": 36,
+ "week_of_month": 1,
+ "percents": {
+ "year": 0.665753424657534,
+ "month": 0.0333333333333333,
+ "week": 0.142857142857143,
+ "day": 0.749161909722222
+ },
+ "percents_formatted": {
+ "year": "66.58%",
+ "month": "3.33%",
+ "week": "14.29%",
+ "day": "74.92%"
+ }
+ },
+ "term": {
+ "today": null,
+ "stage": {
+ "name": "处暑",
+ "position": 10,
+ "is_jie": false,
+ "is_qi": true
+ }
+ },
+ "zodiac": {
+ "year": "蛇",
+ "month": "鸡",
+ "day": "鸡",
+ "hour": "鸡"
+ },
+ "sixty_cycle": {
+ "year": {
+ "heaven_stem": "乙",
+ "earth_branch": "巳",
+ "name": "乙巳年",
+ "name_short": "乙巳"
+ },
+ "month": {
+ "heaven_stem": "乙",
+ "earth_branch": "酉",
+ "name": "乙酉月",
+ "name_short": "乙酉"
+ },
+ "day": {
+ "heaven_stem": "癸",
+ "earth_branch": "酉",
+ "name": "癸酉日",
+ "name_short": "癸酉"
+ },
+ "hour": {
+ "heaven_stem": "辛",
+ "earth_branch": "酉",
+ "name": "辛酉时",
+ "name_short": "辛酉"
+ }
+ },
+ "legal_holiday": null,
+ "festival": {
+ "solar": null,
+ "lunar": null,
+ "both_desc": null
+ },
+ "phase": {
+ "name": "宵月",
+ "position": 10
+ },
+ "constellation": {
+ "name": "处女座",
+ "name_short": "处女"
+ },
+ "taboo": {
+ "day": {
+ "recommends": "解除.祭祀.祈福.求嗣.修造.动土.竖柱.上梁.安床.纳畜.盖屋.合脊.起基.入殓.破土.安葬",
+ "avoids": "出火.嫁娶.开光.进人口.出行.词讼.开市.入宅.移徙.赴任"
+ },
+ "hour": {
+ "hour": "酉时",
+ "hour_short": "酉",
+ "avoids": "乘船.造桥",
+ "recommends": "嫁娶.出行.移徙.入宅.开市.赴任.祈福.安床.开仓.盖屋.修造.求财"
+ },
+ "hours": [
+ {
+ "hour": "酉时",
+ "hour_short": "酉",
+ "recommends": "嫁娶.出行.移徙.入宅.开市.赴任.祈福.安床.开仓.盖屋.修造.求财",
+ "avoids": "乘船.造桥"
+ },
+ {
+ "hour": "戌时",
+ "hour_short": "戌",
+ "recommends": "嫁娶.移徙.安葬.进人口.求财",
+ "avoids": "出行.赴任.祈福.祭祀.开光.斋醮"
+ },
+ {
+ "hour": "亥时",
+ "hour_short": "亥",
+ "recommends": "嫁娶.移徙.交易.入宅.开市.安葬.求嗣.求财",
+ "avoids": "出行.赴任.动土.祈福.祭祀.修造.开光.斋醮"
+ },
+ {
+ "hour": "子时",
+ "hour_short": "子",
+ "recommends": "嫁娶.交易.入宅.开市.祈福.安葬.求嗣.求财",
+ "avoids": "出行.移徙.赴任.词讼.修造"
+ },
+ {
+ "hour": "丑时",
+ "hour_short": "丑",
+ "recommends": "嫁娶.祈福.安葬.祭祀.酬神.求财",
+ "avoids": "出行.赴任.动土.修造"
+ },
+ {
+ "hour": "寅时",
+ "hour_short": "寅",
+ "recommends": "嫁娶.出行.交易.开市.赴任.祈福.安床.祭祀.求嗣.求财",
+ "avoids": "盖屋.入殓.上梁"
+ },
+ {
+ "hour": "卯时",
+ "hour_short": "卯",
+ "recommends": "嫁娶.交易.入宅.开市.祈福.安床.安葬.求嗣.求财",
+ "avoids": "出行.赴任.修造"
+ },
+ {
+ "hour": "辰时",
+ "hour_short": "辰",
+ "recommends": "",
+ "avoids": "诸事不宜"
+ },
+ {
+ "hour": "巳时",
+ "hour_short": "巳",
+ "recommends": "嫁娶.出行.移徙.入宅.开市.祈福.安床.盖屋.祭祀.作灶",
+ "avoids": "安葬.修造.开光"
+ },
+ {
+ "hour": "午时",
+ "hour_short": "午",
+ "recommends": "嫁娶.出行.交易.开市.祈福.安床.求嗣.求财",
+ "avoids": "赴任.动土.词讼.修造"
+ },
+ {
+ "hour": "未时",
+ "hour_short": "未",
+ "recommends": "嫁娶.入宅.祈福.安葬.祭祀.修造.酬神.求财",
+ "avoids": "出行.赴任"
+ },
+ {
+ "hour": "申时",
+ "hour_short": "申",
+ "recommends": "嫁娶.出行.开市.赴任.安葬.求财",
+ "avoids": "祈福.祭祀.酬神.斋醮"
+ }
+ ]
+ },
+ "julian_day": 2460919.5,
+ "nayin": {
+ "year": "覆灯火",
+ "month": "泉中水",
+ "day": "剑锋金",
+ "hour": "石榴木"
+ },
+ "baizi": {
+ "year_baizi": "性格温和,为人正直诚信。",
+ "day_baizi": "性格温和,为人正直诚信。"
+ },
+ "fortune": {
+ "today_luck": "今日学习运好,适合进修",
+ "career": "领导能力突出,升职有望",
+ "money": "偏财运不错,可小试投资",
+ "love": "感情需要沟通,避免误会"
+ },
+ "constants": {
+ "legal_holiday_list": [
+ {
+ "name": "元旦节",
+ "date": "2025-01-01",
+ "start": "2025-01-01",
+ "end": "2025-01-01"
+ },
+ {
+ "name": "春节",
+ "date": "2025-01-29",
+ "start": "2025-01-26",
+ "end": "2025-02-08"
+ },
+ {
+ "name": "清明节",
+ "date": "2025-04-04",
+ "start": "2025-04-04",
+ "end": "2025-04-06"
+ },
+ {
+ "name": "劳动节",
+ "date": "2025-05-01",
+ "start": "2025-04-27",
+ "end": "2025-05-05"
+ },
+ {
+ "name": "端午节",
+ "date": "2025-05-31",
+ "start": "2025-05-31",
+ "end": "2025-06-02"
+ },
+ {
+ "name": "国庆中秋",
+ "date": "2025-10-01",
+ "start": "2025-09-28",
+ "end": "2025-10-11"
+ }
+ ],
+ "phase_list": [
+ {
+ "name": "朔月",
+ "lunar_day": 1
+ },
+ {
+ "name": "既朔月",
+ "lunar_day": 2
+ },
+ {
+ "name": "蛾眉新月",
+ "lunar_day": 3
+ },
+ {
+ "name": "蛾眉新月",
+ "lunar_day": 4
+ },
+ {
+ "name": "蛾眉月",
+ "lunar_day": 5
+ },
+ {
+ "name": "夕月",
+ "lunar_day": 6
+ },
+ {
+ "name": "上弦月",
+ "lunar_day": 7
+ },
+ {
+ "name": "上弦月",
+ "lunar_day": 8
+ },
+ {
+ "name": "九夜月",
+ "lunar_day": 9
+ },
+ {
+ "name": "宵月",
+ "lunar_day": 10
+ },
+ {
+ "name": "宵月",
+ "lunar_day": 11
+ },
+ {
+ "name": "宵月",
+ "lunar_day": 12
+ },
+ {
+ "name": "渐盈凸月",
+ "lunar_day": 13
+ },
+ {
+ "name": "小望月",
+ "lunar_day": 14
+ },
+ {
+ "name": "望月",
+ "lunar_day": 15
+ },
+ {
+ "name": "既望月",
+ "lunar_day": 16
+ },
+ {
+ "name": "立待月",
+ "lunar_day": 17
+ },
+ {
+ "name": "居待月",
+ "lunar_day": 18
+ },
+ {
+ "name": "寝待月",
+ "lunar_day": 19
+ },
+ {
+ "name": "更待月",
+ "lunar_day": 20
+ },
+ {
+ "name": "渐亏凸月",
+ "lunar_day": 21
+ },
+ {
+ "name": "下弦月",
+ "lunar_day": 22
+ },
+ {
+ "name": "下弦月",
+ "lunar_day": 23
+ },
+ {
+ "name": "有明月",
+ "lunar_day": 24
+ },
+ {
+ "name": "有明月",
+ "lunar_day": 25
+ },
+ {
+ "name": "蛾眉残月",
+ "lunar_day": 26
+ },
+ {
+ "name": "蛾眉残月",
+ "lunar_day": 27
+ },
+ {
+ "name": "残月",
+ "lunar_day": 28
+ },
+ {
+ "name": "晓月",
+ "lunar_day": 29
+ },
+ {
+ "name": "晦月",
+ "lunar_day": 30
+ }
+ ],
+ "zodiac_list": [
+ "鼠",
+ "牛",
+ "虎",
+ "兔",
+ "龙",
+ "蛇",
+ "马",
+ "羊",
+ "猴",
+ "鸡",
+ "狗",
+ "猪"
+ ],
+ "constellation_list": [
+ {
+ "name": "白羊",
+ "desc": "白羊座",
+ "start": "3月21日",
+ "end": "4月19日",
+ "range": "3月21日~4月19日",
+ "start_month": 3,
+ "start_day": 21,
+ "end_month": 4,
+ "end_day": 19
+ },
+ {
+ "name": "金牛",
+ "desc": "金牛座",
+ "start": "4月20日",
+ "end": "5月20日",
+ "range": "4月20日~5月20日",
+ "start_month": 4,
+ "start_day": 20,
+ "end_month": 5,
+ "end_day": 20
+ },
+ {
+ "name": "双子",
+ "desc": "双子座",
+ "start": "5月21日",
+ "end": "6月21日",
+ "range": "5月21日~6月21日",
+ "start_month": 5,
+ "start_day": 21,
+ "end_month": 6,
+ "end_day": 21
+ },
+ {
+ "name": "巨蟹",
+ "desc": "巨蟹座",
+ "start": "6月22日",
+ "end": "7月22日",
+ "range": "6月22日~7月22日",
+ "start_month": 6,
+ "start_day": 22,
+ "end_month": 7,
+ "end_day": 22
+ },
+ {
+ "name": "狮子",
+ "desc": "狮子座",
+ "start": "7月23日",
+ "end": "8月22日",
+ "range": "7月23日~8月22日",
+ "start_month": 7,
+ "start_day": 23,
+ "end_month": 8,
+ "end_day": 22
+ },
+ {
+ "name": "处女",
+ "desc": "处女座",
+ "start": "8月23日",
+ "end": "9月22日",
+ "range": "8月23日~9月22日",
+ "start_month": 8,
+ "start_day": 23,
+ "end_month": 9,
+ "end_day": 22
+ },
+ {
+ "name": "天秤",
+ "desc": "天秤座",
+ "start": "9月23日",
+ "end": "10月23日",
+ "range": "9月23日~10月23日",
+ "start_month": 9,
+ "start_day": 23,
+ "end_month": 10,
+ "end_day": 23
+ },
+ {
+ "name": "天蝎",
+ "desc": "天蝎座",
+ "start": "10月24日",
+ "end": "11月22日",
+ "range": "10月24日~11月22日",
+ "start_month": 10,
+ "start_day": 24,
+ "end_month": 11,
+ "end_day": 22
+ },
+ {
+ "name": "射手",
+ "desc": "射手座",
+ "start": "11月23日",
+ "end": "12月21日",
+ "range": "11月23日~12月21日",
+ "start_month": 11,
+ "start_day": 23,
+ "end_month": 12,
+ "end_day": 21
+ },
+ {
+ "name": "摩羯",
+ "desc": "摩羯座",
+ "start": "12月22日",
+ "end": "1月19日",
+ "range": "12月22日~1月19日",
+ "start_month": 12,
+ "start_day": 22,
+ "end_month": 1,
+ "end_day": 19
+ },
+ {
+ "name": "水瓶",
+ "desc": "水瓶座",
+ "start": "1月20日",
+ "end": "2月18日",
+ "range": "1月20日~2月18日",
+ "start_month": 1,
+ "start_day": 20,
+ "end_month": 2,
+ "end_day": 18
+ },
+ {
+ "name": "双鱼",
+ "desc": "双鱼座",
+ "start": "2月19日",
+ "end": "3月20日",
+ "range": "2月19日~3月20日",
+ "start_month": 2,
+ "start_day": 19,
+ "end_month": 3,
+ "end_day": 20
+ }
+ ],
+ "heaven_stems": [
+ "甲",
+ "乙",
+ "丙",
+ "丁",
+ "戊",
+ "己",
+ "庚",
+ "辛",
+ "壬",
+ "癸"
+ ],
+ "earth_branches": [
+ "子",
+ "丑",
+ "寅",
+ "卯",
+ "辰",
+ "巳",
+ "午",
+ "未",
+ "申",
+ "酉",
+ "戌",
+ "亥"
+ ],
+ "solar_terms": [
+ {
+ "name": "立春",
+ "desc": "春季开始"
+ },
+ {
+ "name": "雨水",
+ "desc": "降雨增多"
+ },
+ {
+ "name": "惊蛰",
+ "desc": "春雷乍响"
+ },
+ {
+ "name": "春分",
+ "desc": "昼夜等长"
+ },
+ {
+ "name": "清明",
+ "desc": "天清地明"
+ },
+ {
+ "name": "谷雨",
+ "desc": "雨生百谷"
+ },
+ {
+ "name": "立夏",
+ "desc": "夏季开始"
+ },
+ {
+ "name": "小满",
+ "desc": "麦粒渐满"
+ },
+ {
+ "name": "芒种",
+ "desc": "麦类收割"
+ },
+ {
+ "name": "夏至",
+ "desc": "白昼最长"
+ },
+ {
+ "name": "小暑",
+ "desc": "天气渐热"
+ },
+ {
+ "name": "大暑",
+ "desc": "一年最热"
+ },
+ {
+ "name": "立秋",
+ "desc": "秋季开始"
+ },
+ {
+ "name": "处暑",
+ "desc": "暑热结束"
+ },
+ {
+ "name": "白露",
+ "desc": "露水增多"
+ },
+ {
+ "name": "秋分",
+ "desc": "昼夜等长"
+ },
+ {
+ "name": "寒露",
+ "desc": "露水渐凉"
+ },
+ {
+ "name": "霜降",
+ "desc": "开始降霜"
+ },
+ {
+ "name": "立冬",
+ "desc": "冬季开始"
+ },
+ {
+ "name": "小雪",
+ "desc": "开始降雪"
+ },
+ {
+ "name": "大雪",
+ "desc": "降雪增多"
+ },
+ {
+ "name": "冬至",
+ "desc": "白昼最短"
+ },
+ {
+ "name": "小寒",
+ "desc": "天气渐冷"
+ },
+ {
+ "name": "大寒",
+ "desc": "一年最冷"
+ }
+ ]
+ }
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/css/style.css b/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/css/style.css
index 98183afc..5fc74cac 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/css/style.css
@@ -1,577 +1,577 @@
-/* Reset and Base Styles */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
- background: linear-gradient(135deg, #f0f8e8 0%, #e8f5e8 50%, #d4f4dd 100%);
- min-height: 100vh;
- color: #333;
- overflow-x: hidden;
- /* 隐藏滚动条但保留滚动功能 */
- scrollbar-width: none; /* Firefox */
- -ms-overflow-style: none; /* IE and Edge */
-}
-
-/* 隐藏 Webkit 浏览器的滚动条 */
-body::-webkit-scrollbar,
-html::-webkit-scrollbar,
-*::-webkit-scrollbar {
- display: none;
-}
-
-/* 全局隐藏滚动条但保留滚动功能 */
-html {
- scrollbar-width: none; /* Firefox */
- -ms-overflow-style: none; /* IE and Edge */
-}
-
-.container {
- max-width: 1400px;
- margin: 0 auto;
- padding: 20px;
- position: relative;
-}
-
-/* Header Styles */
-.header {
- text-align: center;
- margin-bottom: 40px;
- position: relative;
- z-index: 2;
-}
-
-.header-content {
- background: rgba(255, 255, 255, 0.1);
- backdrop-filter: blur(20px);
- border-radius: 24px;
- padding: 40px;
- border: 1px solid rgba(255, 255, 255, 0.2);
- box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
- position: relative;
- overflow: hidden;
-}
-
-.header-content::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background: linear-gradient(45deg, rgba(255, 255, 255, 0.1) 0%, transparent 50%, rgba(255, 255, 255, 0.1) 100%);
- animation: shimmer 3s ease-in-out infinite;
-}
-
-@keyframes shimmer {
- 0%, 100% { transform: translateX(-100%); }
- 50% { transform: translateX(100%); }
-}
-
-.logo {
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 15px;
- margin-bottom: 15px;
-}
-
-.logo i {
- font-size: 48px;
- background: linear-gradient(45deg, #228B22, #32CD32);
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
- animation: pulse 2s ease-in-out infinite;
-}
-
-@keyframes pulse {
- 0%, 100% { transform: scale(1); }
- 50% { transform: scale(1.1); }
-}
-
-.logo h1 {
- font-size: 42px;
- font-weight: 700;
- color: white;
- text-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
-}
-
-.subtitle {
- font-size: 18px;
- color: rgba(255, 255, 255, 0.9);
- font-weight: 400;
- letter-spacing: 0.5px;
-}
-
-/* Floating Shapes */
-.header-decoration {
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- pointer-events: none;
- z-index: 1;
-}
-
-.floating-shapes {
- position: relative;
- width: 100%;
- height: 100%;
-}
-
-.shape {
- position: absolute;
- border-radius: 50%;
- background: linear-gradient(45deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.05));
- animation: float 6s ease-in-out infinite;
-}
-
-.shape-1 {
- width: 80px;
- height: 80px;
- top: 10%;
- left: 10%;
- animation-delay: 0s;
-}
-
-.shape-2 {
- width: 60px;
- height: 60px;
- top: 20%;
- right: 15%;
- animation-delay: 2s;
-}
-
-.shape-3 {
- width: 100px;
- height: 100px;
- bottom: 15%;
- left: 20%;
- animation-delay: 4s;
-}
-
-@keyframes float {
- 0%, 100% { transform: translateY(0px) rotate(0deg); }
- 33% { transform: translateY(-20px) rotate(120deg); }
- 66% { transform: translateY(10px) rotate(240deg); }
-}
-
-/* Input Section */
-.input-section {
- margin-bottom: 40px;
-}
-
-.input-card {
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(20px);
- border-radius: 20px;
- padding: 30px;
- box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
- border: 1px solid rgba(255, 255, 255, 0.3);
- transition: all 0.3s ease;
-}
-
-.input-card:hover {
- transform: translateY(-5px);
- box-shadow: 0 30px 60px rgba(0, 0, 0, 0.15);
-}
-
-.card-header {
- display: flex;
- align-items: center;
- gap: 12px;
- margin-bottom: 20px;
-}
-
-.card-header i {
- font-size: 24px;
- color: #228B22;
-}
-
-.card-header h2 {
- font-size: 24px;
- font-weight: 600;
- color: #333;
-}
-
-.input-wrapper {
- position: relative;
-}
-
-#inputText {
- width: 100%;
- padding: 20px;
- border: 2px solid #e1e5e9;
- border-radius: 12px;
- font-size: 16px;
- font-family: inherit;
- resize: vertical;
- transition: all 0.3s ease;
- background: rgba(255, 255, 255, 0.8);
- backdrop-filter: blur(10px);
-}
-
-#inputText:focus {
- outline: none;
- border-color: #228B22;
- box-shadow: 0 0 0 3px rgba(34, 139, 34, 0.1);
- background: rgba(255, 255, 255, 0.95);
-}
-
-.input-actions {
- display: flex;
- gap: 15px;
- margin-top: 20px;
- justify-content: flex-end;
-}
-
-/* Button Styles */
-.btn {
- padding: 12px 24px;
- border: none;
- border-radius: 10px;
- font-size: 16px;
- font-weight: 500;
- cursor: pointer;
- transition: all 0.3s ease;
- display: flex;
- align-items: center;
- gap: 8px;
- text-decoration: none;
- position: relative;
- overflow: hidden;
-}
-
-.btn::before {
- content: '';
- position: absolute;
- top: 0;
- left: -100%;
- width: 100%;
- height: 100%;
- background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
- transition: left 0.5s;
-}
-
-.btn:hover::before {
- left: 100%;
-}
-
-.btn-primary {
- background: linear-gradient(135deg, #228B22 0%, #32CD32 100%);
- color: white;
- box-shadow: 0 4px 15px rgba(34, 139, 34, 0.3);
-}
-
-.btn-primary:hover {
- transform: translateY(-2px);
- box-shadow: 0 8px 25px rgba(34, 139, 34, 0.4);
-}
-
-.btn-secondary {
- background: rgba(255, 255, 255, 0.8);
- color: #666;
- border: 1px solid #e1e5e9;
-}
-
-.btn-secondary:hover {
- background: rgba(255, 255, 255, 0.95);
- transform: translateY(-2px);
- box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
-}
-
-/* Results Section */
-.results-section {
- opacity: 0;
- transform: translateY(30px);
- transition: all 0.5s ease;
-}
-
-.results-section.show {
- opacity: 1;
- transform: translateY(0);
-}
-
-.results-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
- gap: 30px;
-}
-
-.result-card {
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(20px);
- border-radius: 20px;
- padding: 30px;
- box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
- border: 1px solid rgba(255, 255, 255, 0.3);
- transition: all 0.3s ease;
- position: relative;
- overflow: hidden;
-}
-
-.result-card::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- height: 4px;
- background: linear-gradient(90deg, #228B22, #32CD32, #90EE90, #98FB98);
-}
-
-.result-card:hover {
- transform: translateY(-5px);
- box-shadow: 0 30px 60px rgba(0, 0, 0, 0.15);
-}
-
-.result-card .card-header h3 {
- font-size: 20px;
- font-weight: 600;
- color: #333;
-}
-
-.result-items {
- display: flex;
- flex-direction: column;
- gap: 20px;
-}
-
-.result-item {
- position: relative;
-}
-
-.result-item label {
- display: block;
- font-size: 14px;
- font-weight: 500;
- color: #666;
- margin-bottom: 8px;
- text-transform: uppercase;
- letter-spacing: 0.5px;
-}
-
-.result-value {
- display: flex;
- align-items: center;
- background: rgba(248, 250, 252, 0.8);
- border: 1px solid #e1e5e9;
- border-radius: 8px;
- padding: 12px 16px;
- font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
- font-size: 14px;
- word-break: break-all;
- position: relative;
- transition: all 0.3s ease;
-}
-
-.result-value:hover {
- background: rgba(248, 250, 252, 0.95);
- border-color: #228B22;
-}
-
-.result-value .placeholder {
- color: #999;
- font-style: italic;
-}
-
-.copy-btn {
- background: none;
- border: none;
- color: #228B22;
- cursor: pointer;
- padding: 8px;
- border-radius: 6px;
- transition: all 0.3s ease;
- margin-left: auto;
- flex-shrink: 0;
-}
-
-.copy-btn:hover {
- background: rgba(34, 139, 34, 0.1);
- color: #1e7e1e;
-}
-
-/* Loading Overlay */
-.loading-overlay {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background: rgba(0, 0, 0, 0.5);
- backdrop-filter: blur(5px);
- display: flex;
- align-items: center;
- justify-content: center;
- z-index: 1000;
- opacity: 0;
- visibility: hidden;
- transition: all 0.3s ease;
-}
-
-.loading-overlay.show {
- opacity: 1;
- visibility: visible;
-}
-
-.loading-spinner {
- text-align: center;
- color: white;
-}
-
-.spinner {
- width: 50px;
- height: 50px;
- border: 4px solid rgba(255, 255, 255, 0.3);
- border-top: 4px solid white;
- border-radius: 50%;
- animation: spin 1s linear infinite;
- margin: 0 auto 20px;
-}
-
-@keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-/* Toast Notification */
-.toast {
- position: fixed;
- bottom: 30px;
- right: 30px;
- background: linear-gradient(135deg, #228B22, #32CD32);
- color: white;
- padding: 16px 24px;
- border-radius: 12px;
- box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
- display: flex;
- align-items: center;
- gap: 10px;
- transform: translateX(400px);
- transition: all 0.3s ease;
- z-index: 1001;
-}
-
-.toast.show {
- transform: translateX(0);
-}
-
-.toast i {
- font-size: 18px;
-}
-
-/* Responsive Design */
-@media (max-width: 768px) {
- .container {
- padding: 15px;
- }
-
- .header-content {
- padding: 30px 20px;
- }
-
- .logo h1 {
- font-size: 32px;
- }
-
- .logo i {
- font-size: 36px;
- }
-
- .results-grid {
- grid-template-columns: 1fr;
- gap: 20px;
- }
-
- .input-actions {
- flex-direction: column;
- }
-
- .btn {
- justify-content: center;
- }
-
- .toast {
- bottom: 20px;
- right: 20px;
- left: 20px;
- transform: translateY(100px);
- }
-
- .toast.show {
- transform: translateY(0);
- }
-}
-
-@media (max-width: 480px) {
- .input-card,
- .result-card {
- padding: 20px;
- }
-
- .card-header h2,
- .card-header h3 {
- font-size: 18px;
- }
-
- .result-value {
- font-size: 12px;
- padding: 10px 12px;
- }
-}
-
-/* Animation Classes */
-.fade-in {
- animation: fadeIn 0.5s ease-in-out;
-}
-
-@keyframes fadeIn {
- from {
- opacity: 0;
- transform: translateY(20px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-.slide-in {
- animation: slideIn 0.3s ease-out;
-}
-
-@keyframes slideIn {
- from {
- transform: translateX(-20px);
- opacity: 0;
- }
- to {
- transform: translateX(0);
- opacity: 1;
- }
-}
-
-/* Custom Scrollbar */
-::-webkit-scrollbar {
- width: 8px;
-}
-
-::-webkit-scrollbar-track {
- background: rgba(255, 255, 255, 0.1);
- border-radius: 4px;
-}
-
-::-webkit-scrollbar-thumb {
- background: rgba(255, 255, 255, 0.3);
- border-radius: 4px;
-}
-
-::-webkit-scrollbar-thumb:hover {
- background: rgba(255, 255, 255, 0.5);
+/* Reset and Base Styles */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
+ background: linear-gradient(135deg, #f0f8e8 0%, #e8f5e8 50%, #d4f4dd 100%);
+ min-height: 100vh;
+ color: #333;
+ overflow-x: hidden;
+ /* 隐藏滚动条但保留滚动功能 */
+ scrollbar-width: none; /* Firefox */
+ -ms-overflow-style: none; /* IE and Edge */
+}
+
+/* 隐藏 Webkit 浏览器的滚动条 */
+body::-webkit-scrollbar,
+html::-webkit-scrollbar,
+*::-webkit-scrollbar {
+ display: none;
+}
+
+/* 全局隐藏滚动条但保留滚动功能 */
+html {
+ scrollbar-width: none; /* Firefox */
+ -ms-overflow-style: none; /* IE and Edge */
+}
+
+.container {
+ max-width: 1400px;
+ margin: 0 auto;
+ padding: 20px;
+ position: relative;
+}
+
+/* Header Styles */
+.header {
+ text-align: center;
+ margin-bottom: 40px;
+ position: relative;
+ z-index: 2;
+}
+
+.header-content {
+ background: rgba(255, 255, 255, 0.1);
+ backdrop-filter: blur(20px);
+ border-radius: 24px;
+ padding: 40px;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
+ position: relative;
+ overflow: hidden;
+}
+
+.header-content::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: linear-gradient(45deg, rgba(255, 255, 255, 0.1) 0%, transparent 50%, rgba(255, 255, 255, 0.1) 100%);
+ animation: shimmer 3s ease-in-out infinite;
+}
+
+@keyframes shimmer {
+ 0%, 100% { transform: translateX(-100%); }
+ 50% { transform: translateX(100%); }
+}
+
+.logo {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 15px;
+ margin-bottom: 15px;
+}
+
+.logo i {
+ font-size: 48px;
+ background: linear-gradient(45deg, #228B22, #32CD32);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ animation: pulse 2s ease-in-out infinite;
+}
+
+@keyframes pulse {
+ 0%, 100% { transform: scale(1); }
+ 50% { transform: scale(1.1); }
+}
+
+.logo h1 {
+ font-size: 42px;
+ font-weight: 700;
+ color: white;
+ text-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
+}
+
+.subtitle {
+ font-size: 18px;
+ color: rgba(255, 255, 255, 0.9);
+ font-weight: 400;
+ letter-spacing: 0.5px;
+}
+
+/* Floating Shapes */
+.header-decoration {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ pointer-events: none;
+ z-index: 1;
+}
+
+.floating-shapes {
+ position: relative;
+ width: 100%;
+ height: 100%;
+}
+
+.shape {
+ position: absolute;
+ border-radius: 50%;
+ background: linear-gradient(45deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.05));
+ animation: float 6s ease-in-out infinite;
+}
+
+.shape-1 {
+ width: 80px;
+ height: 80px;
+ top: 10%;
+ left: 10%;
+ animation-delay: 0s;
+}
+
+.shape-2 {
+ width: 60px;
+ height: 60px;
+ top: 20%;
+ right: 15%;
+ animation-delay: 2s;
+}
+
+.shape-3 {
+ width: 100px;
+ height: 100px;
+ bottom: 15%;
+ left: 20%;
+ animation-delay: 4s;
+}
+
+@keyframes float {
+ 0%, 100% { transform: translateY(0px) rotate(0deg); }
+ 33% { transform: translateY(-20px) rotate(120deg); }
+ 66% { transform: translateY(10px) rotate(240deg); }
+}
+
+/* Input Section */
+.input-section {
+ margin-bottom: 40px;
+}
+
+.input-card {
+ background: rgba(255, 255, 255, 0.95);
+ backdrop-filter: blur(20px);
+ border-radius: 20px;
+ padding: 30px;
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
+ border: 1px solid rgba(255, 255, 255, 0.3);
+ transition: all 0.3s ease;
+}
+
+.input-card:hover {
+ transform: translateY(-5px);
+ box-shadow: 0 30px 60px rgba(0, 0, 0, 0.15);
+}
+
+.card-header {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ margin-bottom: 20px;
+}
+
+.card-header i {
+ font-size: 24px;
+ color: #228B22;
+}
+
+.card-header h2 {
+ font-size: 24px;
+ font-weight: 600;
+ color: #333;
+}
+
+.input-wrapper {
+ position: relative;
+}
+
+#inputText {
+ width: 100%;
+ padding: 20px;
+ border: 2px solid #e1e5e9;
+ border-radius: 12px;
+ font-size: 16px;
+ font-family: inherit;
+ resize: vertical;
+ transition: all 0.3s ease;
+ background: rgba(255, 255, 255, 0.8);
+ backdrop-filter: blur(10px);
+}
+
+#inputText:focus {
+ outline: none;
+ border-color: #228B22;
+ box-shadow: 0 0 0 3px rgba(34, 139, 34, 0.1);
+ background: rgba(255, 255, 255, 0.95);
+}
+
+.input-actions {
+ display: flex;
+ gap: 15px;
+ margin-top: 20px;
+ justify-content: flex-end;
+}
+
+/* Button Styles */
+.btn {
+ padding: 12px 24px;
+ border: none;
+ border-radius: 10px;
+ font-size: 16px;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ text-decoration: none;
+ position: relative;
+ overflow: hidden;
+}
+
+.btn::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: -100%;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
+ transition: left 0.5s;
+}
+
+.btn:hover::before {
+ left: 100%;
+}
+
+.btn-primary {
+ background: linear-gradient(135deg, #228B22 0%, #32CD32 100%);
+ color: white;
+ box-shadow: 0 4px 15px rgba(34, 139, 34, 0.3);
+}
+
+.btn-primary:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 8px 25px rgba(34, 139, 34, 0.4);
+}
+
+.btn-secondary {
+ background: rgba(255, 255, 255, 0.8);
+ color: #666;
+ border: 1px solid #e1e5e9;
+}
+
+.btn-secondary:hover {
+ background: rgba(255, 255, 255, 0.95);
+ transform: translateY(-2px);
+ box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
+}
+
+/* Results Section */
+.results-section {
+ opacity: 0;
+ transform: translateY(30px);
+ transition: all 0.5s ease;
+}
+
+.results-section.show {
+ opacity: 1;
+ transform: translateY(0);
+}
+
+.results-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
+ gap: 30px;
+}
+
+.result-card {
+ background: rgba(255, 255, 255, 0.95);
+ backdrop-filter: blur(20px);
+ border-radius: 20px;
+ padding: 30px;
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
+ border: 1px solid rgba(255, 255, 255, 0.3);
+ transition: all 0.3s ease;
+ position: relative;
+ overflow: hidden;
+}
+
+.result-card::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 4px;
+ background: linear-gradient(90deg, #228B22, #32CD32, #90EE90, #98FB98);
+}
+
+.result-card:hover {
+ transform: translateY(-5px);
+ box-shadow: 0 30px 60px rgba(0, 0, 0, 0.15);
+}
+
+.result-card .card-header h3 {
+ font-size: 20px;
+ font-weight: 600;
+ color: #333;
+}
+
+.result-items {
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+}
+
+.result-item {
+ position: relative;
+}
+
+.result-item label {
+ display: block;
+ font-size: 14px;
+ font-weight: 500;
+ color: #666;
+ margin-bottom: 8px;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.result-value {
+ display: flex;
+ align-items: center;
+ background: rgba(248, 250, 252, 0.8);
+ border: 1px solid #e1e5e9;
+ border-radius: 8px;
+ padding: 12px 16px;
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
+ font-size: 14px;
+ word-break: break-all;
+ position: relative;
+ transition: all 0.3s ease;
+}
+
+.result-value:hover {
+ background: rgba(248, 250, 252, 0.95);
+ border-color: #228B22;
+}
+
+.result-value .placeholder {
+ color: #999;
+ font-style: italic;
+}
+
+.copy-btn {
+ background: none;
+ border: none;
+ color: #228B22;
+ cursor: pointer;
+ padding: 8px;
+ border-radius: 6px;
+ transition: all 0.3s ease;
+ margin-left: auto;
+ flex-shrink: 0;
+}
+
+.copy-btn:hover {
+ background: rgba(34, 139, 34, 0.1);
+ color: #1e7e1e;
+}
+
+/* Loading Overlay */
+.loading-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: rgba(0, 0, 0, 0.5);
+ backdrop-filter: blur(5px);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 1000;
+ opacity: 0;
+ visibility: hidden;
+ transition: all 0.3s ease;
+}
+
+.loading-overlay.show {
+ opacity: 1;
+ visibility: visible;
+}
+
+.loading-spinner {
+ text-align: center;
+ color: white;
+}
+
+.spinner {
+ width: 50px;
+ height: 50px;
+ border: 4px solid rgba(255, 255, 255, 0.3);
+ border-top: 4px solid white;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ margin: 0 auto 20px;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+/* Toast Notification */
+.toast {
+ position: fixed;
+ bottom: 30px;
+ right: 30px;
+ background: linear-gradient(135deg, #228B22, #32CD32);
+ color: white;
+ padding: 16px 24px;
+ border-radius: 12px;
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ transform: translateX(400px);
+ transition: all 0.3s ease;
+ z-index: 1001;
+}
+
+.toast.show {
+ transform: translateX(0);
+}
+
+.toast i {
+ font-size: 18px;
+}
+
+/* Responsive Design */
+@media (max-width: 768px) {
+ .container {
+ padding: 15px;
+ }
+
+ .header-content {
+ padding: 30px 20px;
+ }
+
+ .logo h1 {
+ font-size: 32px;
+ }
+
+ .logo i {
+ font-size: 36px;
+ }
+
+ .results-grid {
+ grid-template-columns: 1fr;
+ gap: 20px;
+ }
+
+ .input-actions {
+ flex-direction: column;
+ }
+
+ .btn {
+ justify-content: center;
+ }
+
+ .toast {
+ bottom: 20px;
+ right: 20px;
+ left: 20px;
+ transform: translateY(100px);
+ }
+
+ .toast.show {
+ transform: translateY(0);
+ }
+}
+
+@media (max-width: 480px) {
+ .input-card,
+ .result-card {
+ padding: 20px;
+ }
+
+ .card-header h2,
+ .card-header h3 {
+ font-size: 18px;
+ }
+
+ .result-value {
+ font-size: 12px;
+ padding: 10px 12px;
+ }
+}
+
+/* Animation Classes */
+.fade-in {
+ animation: fadeIn 0.5s ease-in-out;
+}
+
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.slide-in {
+ animation: slideIn 0.3s ease-out;
+}
+
+@keyframes slideIn {
+ from {
+ transform: translateX(-20px);
+ opacity: 0;
+ }
+ to {
+ transform: translateX(0);
+ opacity: 1;
+ }
+}
+
+/* Custom Scrollbar */
+::-webkit-scrollbar {
+ width: 8px;
+}
+
+::-webkit-scrollbar-track {
+ background: rgba(255, 255, 255, 0.1);
+ border-radius: 4px;
+}
+
+::-webkit-scrollbar-thumb {
+ background: rgba(255, 255, 255, 0.3);
+ border-radius: 4px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: rgba(255, 255, 255, 0.5);
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/index.html b/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/index.html
index 5859a369..b7453c4e 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/index.html
+++ b/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/index.html
@@ -1,212 +1,212 @@
-
-
-
-
-
- 多功能哈希工具 - Hash Toolkit
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 等待处理...
-
-
-
-
-
-
- 等待处理...
-
-
-
-
-
-
- 等待处理...
-
-
-
-
-
-
- 等待处理...
-
-
-
-
-
-
-
-
-
-
-
-
-
- 等待处理...
-
-
-
-
-
-
- 等待处理...
-
-
-
-
-
-
- 等待处理...
-
-
-
-
-
-
- 等待处理...
-
-
-
-
-
-
-
-
-
-
-
-
-
- 等待处理...
-
-
-
-
-
-
- 等待处理...
-
-
-
-
-
-
- 等待处理...
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 复制成功!
-
-
-
-
-
+
+
+
+
+
+ 多功能哈希工具 - Hash Toolkit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 等待处理...
+
+
+
+
+
+
+ 等待处理...
+
+
+
+
+
+
+ 等待处理...
+
+
+
+
+
+
+ 等待处理...
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 等待处理...
+
+
+
+
+
+
+ 等待处理...
+
+
+
+
+
+
+ 等待处理...
+
+
+
+
+
+
+ 等待处理...
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 等待处理...
+
+
+
+
+
+
+ 等待处理...
+
+
+
+
+
+
+ 等待处理...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 复制成功!
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/js/script.js b/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/js/script.js
index 6f846356..c9f81d84 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/js/script.js
@@ -1,394 +1,394 @@
-// API配置
-const API_BASE_URL = 'https://60s.api.shumengya.top/v2/hash';
-
-// DOM元素
-const elements = {
- inputText: document.getElementById('inputText'),
- processBtn: document.getElementById('processBtn'),
- clearBtn: document.getElementById('clearBtn'),
- resultsSection: document.getElementById('resultsSection'),
- loadingOverlay: document.getElementById('loadingOverlay'),
- toast: document.getElementById('toast'),
- toastMessage: document.getElementById('toastMessage')
-};
-
-// 结果元素映射
-const resultElements = {
- md5: document.getElementById('md5Result'),
- sha1: document.getElementById('sha1Result'),
- sha256: document.getElementById('sha256Result'),
- sha512: document.getElementById('sha512Result'),
- base64Encode: document.getElementById('base64EncodeResult'),
- base64Decode: document.getElementById('base64DecodeResult'),
- urlEncode: document.getElementById('urlEncodeResult'),
- urlDecode: document.getElementById('urlDecodeResult'),
- gzipCompress: document.getElementById('gzipCompressResult'),
- deflateCompress: document.getElementById('deflateCompressResult'),
- brotliCompress: document.getElementById('brotliCompressResult')
-};
-
-// 初始化
-document.addEventListener('DOMContentLoaded', function() {
- initializeEventListeners();
- addInputAnimation();
-});
-
-// 事件监听器初始化
-function initializeEventListeners() {
- // 处理按钮点击
- elements.processBtn.addEventListener('click', handleProcess);
-
- // 清空按钮点击
- elements.clearBtn.addEventListener('click', handleClear);
-
- // 输入框回车键
- elements.inputText.addEventListener('keydown', function(e) {
- if (e.ctrlKey && e.key === 'Enter') {
- handleProcess();
- }
- });
-
- // 复制按钮事件委托
- document.addEventListener('click', function(e) {
- if (e.target.closest('.copy-btn')) {
- const copyBtn = e.target.closest('.copy-btn');
- const targetId = copyBtn.getAttribute('data-target');
- const targetElement = document.getElementById(targetId);
- const textContent = targetElement.textContent.trim();
-
- if (textContent && textContent !== '等待处理...' && textContent !== '处理失败') {
- copyToClipboard(textContent);
- }
- }
- });
-
- // 输入框实时验证
- elements.inputText.addEventListener('input', function() {
- const hasContent = this.value.trim().length > 0;
- elements.processBtn.disabled = !hasContent;
-
- if (hasContent) {
- elements.processBtn.classList.remove('disabled');
- } else {
- elements.processBtn.classList.add('disabled');
- }
- });
-}
-
-// 添加输入动画效果
-function addInputAnimation() {
- elements.inputText.addEventListener('focus', function() {
- this.parentElement.classList.add('focused');
- });
-
- elements.inputText.addEventListener('blur', function() {
- this.parentElement.classList.remove('focused');
- });
-}
-
-// 处理主要功能
-async function handleProcess() {
- const inputValue = elements.inputText.value.trim();
-
- if (!inputValue) {
- showToast('请输入要处理的内容', 'error');
- return;
- }
-
- // 显示加载状态
- showLoading(true);
- resetResults();
-
- try {
- // 调用API
- const response = await fetch(`${API_BASE_URL}?content=${encodeURIComponent(inputValue)}`);
-
- if (!response.ok) {
- throw new Error(`HTTP error! status: ${response.status}`);
- }
-
- const data = await response.json();
-
- if (data.code === 200 && data.data) {
- displayResults(data.data);
- showResultsSection();
- showToast('处理完成!', 'success');
- } else {
- throw new Error(data.message || '处理失败');
- }
-
- } catch (error) {
- console.error('处理错误:', error);
- showToast(`处理失败: ${error.message}`, 'error');
- displayError();
- } finally {
- showLoading(false);
- }
-}
-
-// 显示结果
-function displayResults(data) {
- try {
- // 哈希结果
- updateResultElement('md5', data.md5 || '不可用');
-
- // SHA系列
- if (data.sha) {
- updateResultElement('sha1', data.sha.sha1 || '不可用');
- updateResultElement('sha256', data.sha.sha256 || '不可用');
- updateResultElement('sha512', data.sha.sha512 || '不可用');
- }
-
- // Base64编码
- if (data.base64) {
- updateResultElement('base64Encode', data.base64.encoded || '不可用');
- // BASE64解码:只有当输入本身是BASE64格式时才显示解码结果
- let base64DecodeResult = data.base64.decoded;
- if (!base64DecodeResult) {
- // 检查输入是否为有效的BASE64格式
- const inputValue = elements.inputText.value.trim();
- const base64Regex = /^[A-Za-z0-9+/]*={0,2}$/;
- if (base64Regex.test(inputValue) && inputValue.length % 4 === 0) {
- try {
- base64DecodeResult = atob(inputValue);
- } catch (e) {
- base64DecodeResult = '解码失败';
- }
- } else {
- base64DecodeResult = '输入非BASE64格式';
- }
- }
- updateResultElement('base64Decode', base64DecodeResult || '不可用');
- }
-
- // URL编码
- if (data.url) {
- updateResultElement('urlEncode', data.url.encoded || '不可用');
- updateResultElement('urlDecode', data.url.decoded || '不可用');
- }
-
- // 压缩结果(仅显示压缩,不显示解压)
- if (data.gzip) {
- updateResultElement('gzipCompress', data.gzip.encoded || '不可用');
- }
-
- if (data.deflate) {
- updateResultElement('deflateCompress', data.deflate.encoded || '不可用');
- }
-
- if (data.brotli) {
- updateResultElement('brotliCompress', data.brotli.encoded || '不可用');
- }
-
- } catch (error) {
- console.error('显示结果时出错:', error);
- showToast('显示结果时出错', 'error');
- }
-}
-
-// 更新单个结果元素
-function updateResultElement(key, value) {
- const element = resultElements[key];
- if (element) {
- const textSpan = element.querySelector('span') || element;
- textSpan.textContent = value;
- textSpan.classList.remove('placeholder');
-
- // 添加动画效果
- element.classList.add('slide-in');
- setTimeout(() => {
- element.classList.remove('slide-in');
- }, 300);
- }
-}
-
-// 重置结果
-function resetResults() {
- Object.values(resultElements).forEach(element => {
- if (element) {
- const textSpan = element.querySelector('span') || element;
- textSpan.textContent = '等待处理...';
- textSpan.classList.add('placeholder');
- }
- });
-}
-
-// 显示错误状态
-function displayError() {
- Object.values(resultElements).forEach(element => {
- if (element) {
- const textSpan = element.querySelector('span') || element;
- textSpan.textContent = '处理失败';
- textSpan.classList.add('placeholder');
- }
- });
-}
-
-// 显示结果区域
-function showResultsSection() {
- elements.resultsSection.classList.add('show');
-
- // 平滑滚动到结果区域
- setTimeout(() => {
- elements.resultsSection.scrollIntoView({
- behavior: 'smooth',
- block: 'start'
- });
- }, 100);
-}
-
-// 清空功能
-function handleClear() {
- elements.inputText.value = '';
- elements.inputText.focus();
- elements.resultsSection.classList.remove('show');
- resetResults();
- elements.processBtn.disabled = true;
- elements.processBtn.classList.add('disabled');
-
- showToast('内容已清空', 'info');
-}
-
-// 复制到剪贴板
-async function copyToClipboard(text) {
- try {
- if (navigator.clipboard && window.isSecureContext) {
- await navigator.clipboard.writeText(text);
- } else {
- // 降级方案
- const textArea = document.createElement('textarea');
- textArea.value = text;
- textArea.style.position = 'fixed';
- textArea.style.left = '-999999px';
- textArea.style.top = '-999999px';
- document.body.appendChild(textArea);
- textArea.focus();
- textArea.select();
- document.execCommand('copy');
- textArea.remove();
- }
-
- showToast('复制成功!', 'success');
- } catch (error) {
- console.error('复制失败:', error);
- showToast('复制失败,请手动复制', 'error');
- }
-}
-
-// 显示/隐藏加载状态
-function showLoading(show) {
- if (show) {
- elements.loadingOverlay.classList.add('show');
- elements.processBtn.disabled = true;
- elements.processBtn.innerHTML = ' 处理中...';
- } else {
- elements.loadingOverlay.classList.remove('show');
- elements.processBtn.disabled = false;
- elements.processBtn.innerHTML = ' 开始处理';
- }
-}
-
-// 显示提示消息
-function showToast(message, type = 'success') {
- elements.toastMessage.textContent = message;
-
- // 设置图标和样式
- const icon = elements.toast.querySelector('i');
- icon.className = getToastIcon(type);
-
- elements.toast.className = `toast ${type}`;
- elements.toast.classList.add('show');
-
- // 自动隐藏
- setTimeout(() => {
- elements.toast.classList.remove('show');
- }, 3000);
-}
-
-// 获取提示图标
-function getToastIcon(type) {
- const icons = {
- success: 'fas fa-check-circle',
- error: 'fas fa-exclamation-circle',
- info: 'fas fa-info-circle',
- warning: 'fas fa-exclamation-triangle'
- };
- return icons[type] || icons.success;
-}
-
-// 工具函数:防抖
-function debounce(func, wait) {
- let timeout;
- return function executedFunction(...args) {
- const later = () => {
- clearTimeout(timeout);
- func(...args);
- };
- clearTimeout(timeout);
- timeout = setTimeout(later, wait);
- };
-}
-
-// 工具函数:节流
-function throttle(func, limit) {
- let inThrottle;
- return function() {
- const args = arguments;
- const context = this;
- if (!inThrottle) {
- func.apply(context, args);
- inThrottle = true;
- setTimeout(() => inThrottle = false, limit);
- }
- }
-}
-
-// 添加键盘快捷键支持
-document.addEventListener('keydown', function(e) {
- // Ctrl+Enter 处理
- if (e.ctrlKey && e.key === 'Enter') {
- e.preventDefault();
- if (!elements.processBtn.disabled) {
- handleProcess();
- }
- }
-
- // Escape 清空
- if (e.key === 'Escape') {
- handleClear();
- }
-});
-
-// 页面可见性变化处理
-document.addEventListener('visibilitychange', function() {
- if (document.hidden) {
- // 页面隐藏时的处理
- console.log('页面已隐藏');
- } else {
- // 页面显示时的处理
- console.log('页面已显示');
- }
-});
-
-// 错误处理
-window.addEventListener('error', function(e) {
- console.error('全局错误:', e.error);
- showToast('发生未知错误,请刷新页面重试', 'error');
-});
-
-// 未处理的Promise拒绝
-window.addEventListener('unhandledrejection', function(e) {
- console.error('未处理的Promise拒绝:', e.reason);
- showToast('网络请求失败,请检查网络连接', 'error');
-});
-
-// 导出函数供测试使用
-if (typeof module !== 'undefined' && module.exports) {
- module.exports = {
- handleProcess,
- copyToClipboard,
- showToast,
- debounce,
- throttle
- };
+// API配置
+const API_BASE_URL = 'https://60s.api.shumengya.top/v2/hash';
+
+// DOM元素
+const elements = {
+ inputText: document.getElementById('inputText'),
+ processBtn: document.getElementById('processBtn'),
+ clearBtn: document.getElementById('clearBtn'),
+ resultsSection: document.getElementById('resultsSection'),
+ loadingOverlay: document.getElementById('loadingOverlay'),
+ toast: document.getElementById('toast'),
+ toastMessage: document.getElementById('toastMessage')
+};
+
+// 结果元素映射
+const resultElements = {
+ md5: document.getElementById('md5Result'),
+ sha1: document.getElementById('sha1Result'),
+ sha256: document.getElementById('sha256Result'),
+ sha512: document.getElementById('sha512Result'),
+ base64Encode: document.getElementById('base64EncodeResult'),
+ base64Decode: document.getElementById('base64DecodeResult'),
+ urlEncode: document.getElementById('urlEncodeResult'),
+ urlDecode: document.getElementById('urlDecodeResult'),
+ gzipCompress: document.getElementById('gzipCompressResult'),
+ deflateCompress: document.getElementById('deflateCompressResult'),
+ brotliCompress: document.getElementById('brotliCompressResult')
+};
+
+// 初始化
+document.addEventListener('DOMContentLoaded', function() {
+ initializeEventListeners();
+ addInputAnimation();
+});
+
+// 事件监听器初始化
+function initializeEventListeners() {
+ // 处理按钮点击
+ elements.processBtn.addEventListener('click', handleProcess);
+
+ // 清空按钮点击
+ elements.clearBtn.addEventListener('click', handleClear);
+
+ // 输入框回车键
+ elements.inputText.addEventListener('keydown', function(e) {
+ if (e.ctrlKey && e.key === 'Enter') {
+ handleProcess();
+ }
+ });
+
+ // 复制按钮事件委托
+ document.addEventListener('click', function(e) {
+ if (e.target.closest('.copy-btn')) {
+ const copyBtn = e.target.closest('.copy-btn');
+ const targetId = copyBtn.getAttribute('data-target');
+ const targetElement = document.getElementById(targetId);
+ const textContent = targetElement.textContent.trim();
+
+ if (textContent && textContent !== '等待处理...' && textContent !== '处理失败') {
+ copyToClipboard(textContent);
+ }
+ }
+ });
+
+ // 输入框实时验证
+ elements.inputText.addEventListener('input', function() {
+ const hasContent = this.value.trim().length > 0;
+ elements.processBtn.disabled = !hasContent;
+
+ if (hasContent) {
+ elements.processBtn.classList.remove('disabled');
+ } else {
+ elements.processBtn.classList.add('disabled');
+ }
+ });
+}
+
+// 添加输入动画效果
+function addInputAnimation() {
+ elements.inputText.addEventListener('focus', function() {
+ this.parentElement.classList.add('focused');
+ });
+
+ elements.inputText.addEventListener('blur', function() {
+ this.parentElement.classList.remove('focused');
+ });
+}
+
+// 处理主要功能
+async function handleProcess() {
+ const inputValue = elements.inputText.value.trim();
+
+ if (!inputValue) {
+ showToast('请输入要处理的内容', 'error');
+ return;
+ }
+
+ // 显示加载状态
+ showLoading(true);
+ resetResults();
+
+ try {
+ // 调用API
+ const response = await fetch(`${API_BASE_URL}?content=${encodeURIComponent(inputValue)}`);
+
+ if (!response.ok) {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+
+ const data = await response.json();
+
+ if (data.code === 200 && data.data) {
+ displayResults(data.data);
+ showResultsSection();
+ showToast('处理完成!', 'success');
+ } else {
+ throw new Error(data.message || '处理失败');
+ }
+
+ } catch (error) {
+ console.error('处理错误:', error);
+ showToast(`处理失败: ${error.message}`, 'error');
+ displayError();
+ } finally {
+ showLoading(false);
+ }
+}
+
+// 显示结果
+function displayResults(data) {
+ try {
+ // 哈希结果
+ updateResultElement('md5', data.md5 || '不可用');
+
+ // SHA系列
+ if (data.sha) {
+ updateResultElement('sha1', data.sha.sha1 || '不可用');
+ updateResultElement('sha256', data.sha.sha256 || '不可用');
+ updateResultElement('sha512', data.sha.sha512 || '不可用');
+ }
+
+ // Base64编码
+ if (data.base64) {
+ updateResultElement('base64Encode', data.base64.encoded || '不可用');
+ // BASE64解码:只有当输入本身是BASE64格式时才显示解码结果
+ let base64DecodeResult = data.base64.decoded;
+ if (!base64DecodeResult) {
+ // 检查输入是否为有效的BASE64格式
+ const inputValue = elements.inputText.value.trim();
+ const base64Regex = /^[A-Za-z0-9+/]*={0,2}$/;
+ if (base64Regex.test(inputValue) && inputValue.length % 4 === 0) {
+ try {
+ base64DecodeResult = atob(inputValue);
+ } catch (e) {
+ base64DecodeResult = '解码失败';
+ }
+ } else {
+ base64DecodeResult = '输入非BASE64格式';
+ }
+ }
+ updateResultElement('base64Decode', base64DecodeResult || '不可用');
+ }
+
+ // URL编码
+ if (data.url) {
+ updateResultElement('urlEncode', data.url.encoded || '不可用');
+ updateResultElement('urlDecode', data.url.decoded || '不可用');
+ }
+
+ // 压缩结果(仅显示压缩,不显示解压)
+ if (data.gzip) {
+ updateResultElement('gzipCompress', data.gzip.encoded || '不可用');
+ }
+
+ if (data.deflate) {
+ updateResultElement('deflateCompress', data.deflate.encoded || '不可用');
+ }
+
+ if (data.brotli) {
+ updateResultElement('brotliCompress', data.brotli.encoded || '不可用');
+ }
+
+ } catch (error) {
+ console.error('显示结果时出错:', error);
+ showToast('显示结果时出错', 'error');
+ }
+}
+
+// 更新单个结果元素
+function updateResultElement(key, value) {
+ const element = resultElements[key];
+ if (element) {
+ const textSpan = element.querySelector('span') || element;
+ textSpan.textContent = value;
+ textSpan.classList.remove('placeholder');
+
+ // 添加动画效果
+ element.classList.add('slide-in');
+ setTimeout(() => {
+ element.classList.remove('slide-in');
+ }, 300);
+ }
+}
+
+// 重置结果
+function resetResults() {
+ Object.values(resultElements).forEach(element => {
+ if (element) {
+ const textSpan = element.querySelector('span') || element;
+ textSpan.textContent = '等待处理...';
+ textSpan.classList.add('placeholder');
+ }
+ });
+}
+
+// 显示错误状态
+function displayError() {
+ Object.values(resultElements).forEach(element => {
+ if (element) {
+ const textSpan = element.querySelector('span') || element;
+ textSpan.textContent = '处理失败';
+ textSpan.classList.add('placeholder');
+ }
+ });
+}
+
+// 显示结果区域
+function showResultsSection() {
+ elements.resultsSection.classList.add('show');
+
+ // 平滑滚动到结果区域
+ setTimeout(() => {
+ elements.resultsSection.scrollIntoView({
+ behavior: 'smooth',
+ block: 'start'
+ });
+ }, 100);
+}
+
+// 清空功能
+function handleClear() {
+ elements.inputText.value = '';
+ elements.inputText.focus();
+ elements.resultsSection.classList.remove('show');
+ resetResults();
+ elements.processBtn.disabled = true;
+ elements.processBtn.classList.add('disabled');
+
+ showToast('内容已清空', 'info');
+}
+
+// 复制到剪贴板
+async function copyToClipboard(text) {
+ try {
+ if (navigator.clipboard && window.isSecureContext) {
+ await navigator.clipboard.writeText(text);
+ } else {
+ // 降级方案
+ const textArea = document.createElement('textarea');
+ textArea.value = text;
+ textArea.style.position = 'fixed';
+ textArea.style.left = '-999999px';
+ textArea.style.top = '-999999px';
+ document.body.appendChild(textArea);
+ textArea.focus();
+ textArea.select();
+ document.execCommand('copy');
+ textArea.remove();
+ }
+
+ showToast('复制成功!', 'success');
+ } catch (error) {
+ console.error('复制失败:', error);
+ showToast('复制失败,请手动复制', 'error');
+ }
+}
+
+// 显示/隐藏加载状态
+function showLoading(show) {
+ if (show) {
+ elements.loadingOverlay.classList.add('show');
+ elements.processBtn.disabled = true;
+ elements.processBtn.innerHTML = ' 处理中...';
+ } else {
+ elements.loadingOverlay.classList.remove('show');
+ elements.processBtn.disabled = false;
+ elements.processBtn.innerHTML = ' 开始处理';
+ }
+}
+
+// 显示提示消息
+function showToast(message, type = 'success') {
+ elements.toastMessage.textContent = message;
+
+ // 设置图标和样式
+ const icon = elements.toast.querySelector('i');
+ icon.className = getToastIcon(type);
+
+ elements.toast.className = `toast ${type}`;
+ elements.toast.classList.add('show');
+
+ // 自动隐藏
+ setTimeout(() => {
+ elements.toast.classList.remove('show');
+ }, 3000);
+}
+
+// 获取提示图标
+function getToastIcon(type) {
+ const icons = {
+ success: 'fas fa-check-circle',
+ error: 'fas fa-exclamation-circle',
+ info: 'fas fa-info-circle',
+ warning: 'fas fa-exclamation-triangle'
+ };
+ return icons[type] || icons.success;
+}
+
+// 工具函数:防抖
+function debounce(func, wait) {
+ let timeout;
+ return function executedFunction(...args) {
+ const later = () => {
+ clearTimeout(timeout);
+ func(...args);
+ };
+ clearTimeout(timeout);
+ timeout = setTimeout(later, wait);
+ };
+}
+
+// 工具函数:节流
+function throttle(func, limit) {
+ let inThrottle;
+ return function() {
+ const args = arguments;
+ const context = this;
+ if (!inThrottle) {
+ func.apply(context, args);
+ inThrottle = true;
+ setTimeout(() => inThrottle = false, limit);
+ }
+ }
+}
+
+// 添加键盘快捷键支持
+document.addEventListener('keydown', function(e) {
+ // Ctrl+Enter 处理
+ if (e.ctrlKey && e.key === 'Enter') {
+ e.preventDefault();
+ if (!elements.processBtn.disabled) {
+ handleProcess();
+ }
+ }
+
+ // Escape 清空
+ if (e.key === 'Escape') {
+ handleClear();
+ }
+});
+
+// 页面可见性变化处理
+document.addEventListener('visibilitychange', function() {
+ if (document.hidden) {
+ // 页面隐藏时的处理
+ console.log('页面已隐藏');
+ } else {
+ // 页面显示时的处理
+ console.log('页面已显示');
+ }
+});
+
+// 错误处理
+window.addEventListener('error', function(e) {
+ console.error('全局错误:', e.error);
+ showToast('发生未知错误,请刷新页面重试', 'error');
+});
+
+// 未处理的Promise拒绝
+window.addEventListener('unhandledrejection', function(e) {
+ console.error('未处理的Promise拒绝:', e.reason);
+ showToast('网络请求失败,请检查网络连接', 'error');
+});
+
+// 导出函数供测试使用
+if (typeof module !== 'undefined' && module.exports) {
+ module.exports = {
+ handleProcess,
+ copyToClipboard,
+ showToast,
+ debounce,
+ throttle
+ };
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/接口集合.json b/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/接口集合.json
index 547b2771..42245813 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/接口集合.json
+++ b/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/接口集合.json
@@ -1,3 +1,3 @@
-[
- "https://60s.api.shumengya.top"
-]
+[
+ "https://60s.api.shumengya.top"
+]
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/返回接口.json
index ed6fc83c..b6d97895 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/实用功能/哈希解压压缩/返回接口.json
@@ -1,35 +1,35 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "source": "hello",
- "md5": "5d41402abc4b2a76b9719d911017c592",
- "sha": {
- "sha1": "aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d",
- "sha256": "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824",
- "sha512": "9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043"
- },
- "base64": {
- "encoded": "aGVsbG8=",
- "decoded": ""
- },
- "url": {
- "encoded": "hello",
- "decoded": "hello"
- },
- "gzip": {
- "encoded": "1f8b0800000000000003cb48cdc9c9070086a6103605000000",
- "decoded": ""
- },
- "deflate": {
- "encoded": "789ccb48cdc9c90700062c0215",
- "decoded": ""
- },
- "brotli": {
- "encoded": "0b028068656c6c6f03",
- "decoded": ""
- }
- }
-}
-
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "source": "hello",
+ "md5": "5d41402abc4b2a76b9719d911017c592",
+ "sha": {
+ "sha1": "aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d",
+ "sha256": "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824",
+ "sha512": "9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043"
+ },
+ "base64": {
+ "encoded": "aGVsbG8=",
+ "decoded": ""
+ },
+ "url": {
+ "encoded": "hello",
+ "decoded": "hello"
+ },
+ "gzip": {
+ "encoded": "1f8b0800000000000003cb48cdc9c9070086a6103605000000",
+ "decoded": ""
+ },
+ "deflate": {
+ "encoded": "789ccb48cdc9c90700062c0215",
+ "decoded": ""
+ },
+ "brotli": {
+ "encoded": "0b028068656c6c6f03",
+ "decoded": ""
+ }
+ }
+}
+
注意:实际API返回的字段名是 encoded/decoded,不是 encode/decode
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/background.css b/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/background.css
index 8cadc9c7..ae4bac38 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/background.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/background.css
@@ -1,137 +1,137 @@
-/* 背景样式文件 */
-
-/* 页面主背景 */
-body {
- background: linear-gradient(135deg, #e8f5e8 0%, #f0fdf4 25%, #dcfce7 50%, #f0fdf4 75%, #e8f5e8 100%);
- background-size: 400% 400%;
- animation: gradientShift 15s ease infinite;
- background-attachment: fixed;
-}
-
-/* 背景动画 */
-@keyframes gradientShift {
- 0% {
- background-position: 0% 50%;
- }
- 50% {
- background-position: 100% 50%;
- }
- 100% {
- background-position: 0% 50%;
- }
-}
-
-/* 容器背景 */
-.container {
- background: rgba(255, 255, 255, 0.1);
- backdrop-filter: blur(10px);
- border-radius: 20px;
- border: 1px solid rgba(255, 255, 255, 0.2);
-}
-
-/* 翻译框背景 */
-.translate-box {
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(20px);
- border: 1px solid rgba(116, 198, 157, 0.3);
-}
-
-/* 输入框背景 */
-#input-text {
- background: rgba(255, 255, 255, 0.9);
-}
-
-#input-text:focus {
- background: rgba(255, 255, 255, 1);
-}
-
-/* 输出框背景 */
-.output-text {
- background: #f8fffe;
-}
-
-/* 按钮背景 */
-.translate-btn {
- background: linear-gradient(135deg, #74c69d, #52b788);
-}
-
-.translate-btn:hover {
- background: linear-gradient(135deg, #52b788, #40916c);
-}
-
-.translate-btn:disabled {
- background: #b7e4c7;
-}
-
-.swap-btn {
- background: #74c69d;
-}
-
-.swap-btn:hover {
- background: #52b788;
-}
-
-/* 语言选择器背景 */
-.lang-select {
- background: white;
-}
-
-.lang-select:focus {
- background: rgba(255, 255, 255, 1);
-}
-
-/* 发音信息背景 */
-.pronounce-item {
- background: rgba(116, 198, 157, 0.1);
-}
-
-/* 清除和复制按钮背景 */
-.clear-btn:hover,
-.copy-btn:hover {
- background: rgba(116, 198, 157, 0.1);
-}
-
-/* 提示消息背景 */
-.toast {
- background: #52b788;
-}
-
-.toast.error {
- background: #e74c3c;
-}
-
-/* 响应式背景调整 */
-@media (max-width: 767px) {
- body {
- background-size: 200% 200%;
- animation-duration: 10s;
- }
-
- .container {
- background: rgba(255, 255, 255, 0.05);
- backdrop-filter: blur(5px);
- }
-
- .translate-box {
- background: rgba(255, 255, 255, 0.98);
- backdrop-filter: blur(15px);
- }
-}
-
-@media (max-width: 480px) {
- body {
- background-size: 150% 150%;
- animation-duration: 8s;
- }
-
- .container {
- background: transparent;
- backdrop-filter: none;
- border: none;
- }
-
- .translate-box {
- background: rgba(255, 255, 255, 0.99);
- backdrop-filter: blur(10px);
- }
+/* 背景样式文件 */
+
+/* 页面主背景 */
+body {
+ background: linear-gradient(135deg, #e8f5e8 0%, #f0fdf4 25%, #dcfce7 50%, #f0fdf4 75%, #e8f5e8 100%);
+ background-size: 400% 400%;
+ animation: gradientShift 15s ease infinite;
+ background-attachment: fixed;
+}
+
+/* 背景动画 */
+@keyframes gradientShift {
+ 0% {
+ background-position: 0% 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+ 100% {
+ background-position: 0% 50%;
+ }
+}
+
+/* 容器背景 */
+.container {
+ background: rgba(255, 255, 255, 0.1);
+ backdrop-filter: blur(10px);
+ border-radius: 20px;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+}
+
+/* 翻译框背景 */
+.translate-box {
+ background: rgba(255, 255, 255, 0.95);
+ backdrop-filter: blur(20px);
+ border: 1px solid rgba(116, 198, 157, 0.3);
+}
+
+/* 输入框背景 */
+#input-text {
+ background: rgba(255, 255, 255, 0.9);
+}
+
+#input-text:focus {
+ background: rgba(255, 255, 255, 1);
+}
+
+/* 输出框背景 */
+.output-text {
+ background: #f8fffe;
+}
+
+/* 按钮背景 */
+.translate-btn {
+ background: linear-gradient(135deg, #74c69d, #52b788);
+}
+
+.translate-btn:hover {
+ background: linear-gradient(135deg, #52b788, #40916c);
+}
+
+.translate-btn:disabled {
+ background: #b7e4c7;
+}
+
+.swap-btn {
+ background: #74c69d;
+}
+
+.swap-btn:hover {
+ background: #52b788;
+}
+
+/* 语言选择器背景 */
+.lang-select {
+ background: white;
+}
+
+.lang-select:focus {
+ background: rgba(255, 255, 255, 1);
+}
+
+/* 发音信息背景 */
+.pronounce-item {
+ background: rgba(116, 198, 157, 0.1);
+}
+
+/* 清除和复制按钮背景 */
+.clear-btn:hover,
+.copy-btn:hover {
+ background: rgba(116, 198, 157, 0.1);
+}
+
+/* 提示消息背景 */
+.toast {
+ background: #52b788;
+}
+
+.toast.error {
+ background: #e74c3c;
+}
+
+/* 响应式背景调整 */
+@media (max-width: 767px) {
+ body {
+ background-size: 200% 200%;
+ animation-duration: 10s;
+ }
+
+ .container {
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(5px);
+ }
+
+ .translate-box {
+ background: rgba(255, 255, 255, 0.98);
+ backdrop-filter: blur(15px);
+ }
+}
+
+@media (max-width: 480px) {
+ body {
+ background-size: 150% 150%;
+ animation-duration: 8s;
+ }
+
+ .container {
+ background: transparent;
+ backdrop-filter: none;
+ border: none;
+ }
+
+ .translate-box {
+ background: rgba(255, 255, 255, 0.99);
+ backdrop-filter: blur(10px);
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/index.html b/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/index.html
index d32953c9..a6e02825 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/index.html
+++ b/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/index.html
@@ -1,99 +1,99 @@
-
-
-
-
-
- 在线翻译 - 支持109种语言
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ 在线翻译 - 支持109种语言
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/script.js b/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/script.js
index c0a5f087..af5222af 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/script.js
+++ b/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/script.js
@@ -1,452 +1,452 @@
-// 全局变量
-let supportedLanguages = {};
-let isTranslating = false;
-
-// DOM元素
-const elements = {
- fromLang: null,
- toLang: null,
- inputText: null,
- outputText: null,
- translateBtn: null,
- swapBtn: null,
- clearBtn: null,
- copyBtn: null,
- charCount: null,
- detectedLang: null,
- targetLang: null,
- pronounceSection: null
-};
-
-// 初始化
-document.addEventListener('DOMContentLoaded', function() {
- initializeElements();
- loadSupportedLanguages();
- bindEvents();
- updateCharCount();
-});
-
-// 初始化DOM元素
-function initializeElements() {
- elements.fromLang = document.getElementById('from-lang');
- elements.toLang = document.getElementById('to-lang');
- elements.inputText = document.getElementById('input-text');
- elements.outputText = document.getElementById('output-text');
- elements.translateBtn = document.getElementById('translate-btn');
- elements.swapBtn = document.getElementById('swap-btn');
- elements.clearBtn = document.getElementById('clear-btn');
- elements.copyBtn = document.getElementById('copy-btn');
- elements.charCount = document.getElementById('char-count');
- elements.detectedLang = document.getElementById('detected-lang');
- elements.targetLang = document.getElementById('target-lang');
- elements.pronounceSection = document.getElementById('pronounce-section');
-}
-
-// 加载支持的语言列表
-async function loadSupportedLanguages() {
- try {
- const response = await fetch('https://60s.viki.moe/v2/fanyi/langs');
- const data = await response.json();
-
- if (data.code === 200 && data.data && Array.isArray(data.data)) {
- // 转换数组格式为对象格式
- supportedLanguages = {};
- supportedLanguages['auto'] = '自动检测';
- data.data.forEach(lang => {
- supportedLanguages[lang.code] = lang.label;
- });
- populateLanguageSelectors();
- } else {
- throw new Error('获取语言列表失败');
- }
- } catch (error) {
- console.error('加载语言列表失败:', error);
- showToast('加载语言列表失败,请刷新页面重试', 'error');
- // 使用默认语言列表
- useDefaultLanguages();
- }
-}
-
-// 使用默认语言列表(备用方案)
-function useDefaultLanguages() {
- supportedLanguages = {
- 'auto': '自动检测',
- 'zh-CHS': '中文',
- 'en': '英语',
- 'ja': '日语',
- 'ko': '韩语',
- 'fr': '法语',
- 'de': '德语',
- 'es': '西班牙语',
- 'ru': '俄语',
- 'th': '泰语',
- 'ar': '阿拉伯语',
- 'pt': '葡萄牙语',
- 'it': '意大利语'
- };
- populateLanguageSelectors();
-}
-
-// 填充语言选择器
-function populateLanguageSelectors() {
- const fromSelect = elements.fromLang;
- const toSelect = elements.toLang;
-
- // 清空现有选项
- fromSelect.innerHTML = '';
- toSelect.innerHTML = '';
-
- // 添加语言选项
- Object.entries(supportedLanguages).forEach(([code, name]) => {
- const fromOption = new Option(name, code);
- const toOption = new Option(name, code);
-
- fromSelect.appendChild(fromOption);
- toSelect.appendChild(toOption);
- });
-
- // 设置默认值
- fromSelect.value = 'auto';
- toSelect.value = 'en';
-
- // 如果没有auto选项,则设置为中文
- if (!supportedLanguages['auto']) {
- fromSelect.value = 'zh-CHS';
- }
-}
-
-// 绑定事件
-function bindEvents() {
- // 输入框事件
- elements.inputText.addEventListener('input', function() {
- updateCharCount();
- clearOutput();
- });
-
- elements.inputText.addEventListener('keydown', function(e) {
- if (e.ctrlKey && e.key === 'Enter') {
- translateText();
- }
- });
-
- // 按钮事件
- elements.translateBtn.addEventListener('click', translateText);
- elements.swapBtn.addEventListener('click', swapLanguages);
- elements.clearBtn.addEventListener('click', clearInput);
- elements.copyBtn.addEventListener('click', copyOutput);
-
- // 语言选择器事件
- elements.fromLang.addEventListener('change', function() {
- clearOutput();
- updateLanguageLabels();
- });
-
- elements.toLang.addEventListener('change', function() {
- clearOutput();
- updateLanguageLabels();
- });
-}
-
-// 更新字符计数
-function updateCharCount() {
- const text = elements.inputText.value;
- const count = text.length;
- elements.charCount.textContent = `${count}/5000`;
-
- if (count > 5000) {
- elements.charCount.style.color = '#e74c3c';
- } else {
- elements.charCount.style.color = '#74c69d';
- }
-}
-
-// 更新语言标签
-function updateLanguageLabels() {
- const fromLang = elements.fromLang.value;
- const toLang = elements.toLang.value;
-
- elements.detectedLang.textContent = supportedLanguages[fromLang] || '未知语言';
- elements.targetLang.textContent = supportedLanguages[toLang] || '未知语言';
-}
-
-// 翻译文本
-async function translateText() {
- const text = elements.inputText.value.trim();
-
- if (!text) {
- showToast('请输入要翻译的文本', 'error');
- return;
- }
-
- if (text.length > 5000) {
- showToast('文本长度不能超过5000字符', 'error');
- return;
- }
-
- if (isTranslating) {
- return;
- }
-
- setTranslating(true);
-
- try {
- const fromLang = elements.fromLang.value;
- const toLang = elements.toLang.value;
-
- // 构建请求URL
- const params = new URLSearchParams({
- text: text,
- from: fromLang,
- to: toLang
- });
-
- const response = await fetch(`https://60s.viki.moe/v2/fanyi?${params}`);
- const data = await response.json();
-
- if (data.code === 200 && data.data) {
- displayTranslationResult(data.data);
- } else {
- throw new Error(data.msg || '翻译失败');
- }
- } catch (error) {
- console.error('翻译失败:', error);
- showToast('翻译失败: ' + error.message, 'error');
- elements.outputText.textContent = '翻译失败,请重试';
- } finally {
- setTranslating(false);
- }
-}
-
-// 显示翻译结果
-function displayTranslationResult(data) {
- // 显示翻译结果
- const translation = data.target ? data.target.text : '';
- elements.outputText.textContent = translation;
-
- // 更新检测到的语言
- if (data.source && data.source.type_desc) {
- elements.detectedLang.textContent = `检测: ${data.source.type_desc}`;
- }
-
- // 显示发音信息
- displayPronunciation(data);
-
- // 如果翻译结果为空
- if (!translation) {
- elements.outputText.textContent = '未获取到翻译结果';
- }
-}
-
-// 显示发音信息
-function displayPronunciation(data) {
- const pronounceSection = elements.pronounceSection;
- if (!pronounceSection) {
- return;
- }
- pronounceSection.innerHTML = '';
-
- // 原文发音
- if (data.source && data.source.pronounce) {
- const sourcePhoneticDiv = document.createElement('div');
- sourcePhoneticDiv.className = 'pronounce-item show';
- sourcePhoneticDiv.textContent = `原文发音: [${data.source.pronounce}]`;
- pronounceSection.appendChild(sourcePhoneticDiv);
- }
-
- // 译文发音
- if (data.target && data.target.pronounce) {
- const targetPhoneticDiv = document.createElement('div');
- targetPhoneticDiv.className = 'pronounce-item show';
- targetPhoneticDiv.textContent = `译文发音: [${data.target.pronounce}]`;
- pronounceSection.appendChild(targetPhoneticDiv);
- }
-}
-
-// 设置翻译状态
-function setTranslating(translating) {
- isTranslating = translating;
- elements.translateBtn.disabled = translating;
-
- if (translating) {
- elements.translateBtn.classList.add('loading');
- } else {
- elements.translateBtn.classList.remove('loading');
- }
-}
-
-// 交换语言
-function swapLanguages() {
- const fromValue = elements.fromLang.value;
- const toValue = elements.toLang.value;
-
- // 不能交换自动检测
- if (fromValue === 'auto') {
- showToast('自动检测语言无法交换', 'error');
- return;
- }
-
- elements.fromLang.value = toValue;
- elements.toLang.value = fromValue;
-
- // 交换文本内容
- const inputText = elements.inputText.value;
- const outputText = elements.outputText.textContent;
-
- if (outputText && outputText !== '翻译结果将在这里显示...' && outputText !== '翻译失败,请重试' && outputText !== '未获取到翻译结果') {
- elements.inputText.value = outputText;
- elements.outputText.textContent = inputText;
- }
-
- updateCharCount();
- updateLanguageLabels();
- clearPronunciation();
-}
-
-// 清空输入
-function clearInput() {
- elements.inputText.value = '';
- updateCharCount();
- clearOutput();
-}
-
-// 清空输出
-function clearOutput() {
- elements.outputText.textContent = '翻译结果将在这里显示...';
- clearPronunciation();
-}
-
-// 清空发音信息
-function clearPronunciation() {
- if (elements.pronounceSection) {
- elements.pronounceSection.innerHTML = '';
- }
-}
-
-// 复制输出
-function copyOutput() {
- const text = elements.outputText.textContent;
-
- if (!text || text === '翻译结果将在这里显示...' || text === '翻译失败,请重试' || text === '未获取到翻译结果') {
- showToast('没有可复制的内容', 'error');
- return;
- }
-
- // 使用现代API复制
- if (navigator.clipboard) {
- navigator.clipboard.writeText(text).then(() => {
- showToast('已复制到剪贴板');
- }).catch(() => {
- fallbackCopy(text);
- });
- } else {
- fallbackCopy(text);
- }
-}
-
-// 备用复制方法
-function fallbackCopy(text) {
- const textArea = document.createElement('textarea');
- textArea.value = text;
- textArea.style.position = 'fixed';
- textArea.style.opacity = '0';
- document.body.appendChild(textArea);
- textArea.select();
-
- try {
- document.execCommand('copy');
- showToast('已复制到剪贴板');
- } catch (err) {
- showToast('复制失败,请手动复制', 'error');
- }
-
- document.body.removeChild(textArea);
-}
-
-// 显示提示消息
-function showToast(message, type = 'success') {
- // 移除现有的toast
- const existingToast = document.querySelector('.toast');
- if (existingToast) {
- existingToast.remove();
- }
-
- const toast = document.createElement('div');
- toast.className = `toast ${type}`;
- toast.textContent = message;
-
- document.body.appendChild(toast);
-
- // 显示toast
- setTimeout(() => {
- toast.classList.add('show');
- }, 100);
-
- // 自动隐藏
- setTimeout(() => {
- toast.classList.remove('show');
- setTimeout(() => {
- if (toast.parentNode) {
- toast.parentNode.removeChild(toast);
- }
- }, 300);
- }, 3000);
-}
-
-// 工具函数:防抖
-function debounce(func, wait) {
- let timeout;
- return function executedFunction(...args) {
- const later = () => {
- clearTimeout(timeout);
- func(...args);
- };
- clearTimeout(timeout);
- timeout = setTimeout(later, wait);
- };
-}
-
-// 添加键盘快捷键支持
-document.addEventListener('keydown', function(e) {
- // Ctrl+Enter 翻译
- if (e.ctrlKey && e.key === 'Enter') {
- e.preventDefault();
- translateText();
- }
-
- // Ctrl+Shift+C 复制结果
- if (e.ctrlKey && e.shiftKey && e.key === 'C') {
- e.preventDefault();
- copyOutput();
- }
-
- // Ctrl+Shift+X 清空输入
- if (e.ctrlKey && e.shiftKey && e.key === 'X') {
- e.preventDefault();
- clearInput();
- }
-
- // Ctrl+Shift+S 交换语言
- if (e.ctrlKey && e.shiftKey && e.key === 'S') {
- e.preventDefault();
- swapLanguages();
- }
-});
-
-// 页面可见性变化时的处理
-document.addEventListener('visibilitychange', function() {
- if (document.hidden) {
- // 页面隐藏时暂停翻译请求
- if (isTranslating) {
- setTranslating(false);
- }
- }
-});
-
-// 错误处理
-window.addEventListener('error', function(e) {
- console.error('页面错误:', e.error);
-});
-
-window.addEventListener('unhandledrejection', function(e) {
- console.error('未处理的Promise拒绝:', e.reason);
+// 全局变量
+let supportedLanguages = {};
+let isTranslating = false;
+
+// DOM元素
+const elements = {
+ fromLang: null,
+ toLang: null,
+ inputText: null,
+ outputText: null,
+ translateBtn: null,
+ swapBtn: null,
+ clearBtn: null,
+ copyBtn: null,
+ charCount: null,
+ detectedLang: null,
+ targetLang: null,
+ pronounceSection: null
+};
+
+// 初始化
+document.addEventListener('DOMContentLoaded', function() {
+ initializeElements();
+ loadSupportedLanguages();
+ bindEvents();
+ updateCharCount();
+});
+
+// 初始化DOM元素
+function initializeElements() {
+ elements.fromLang = document.getElementById('from-lang');
+ elements.toLang = document.getElementById('to-lang');
+ elements.inputText = document.getElementById('input-text');
+ elements.outputText = document.getElementById('output-text');
+ elements.translateBtn = document.getElementById('translate-btn');
+ elements.swapBtn = document.getElementById('swap-btn');
+ elements.clearBtn = document.getElementById('clear-btn');
+ elements.copyBtn = document.getElementById('copy-btn');
+ elements.charCount = document.getElementById('char-count');
+ elements.detectedLang = document.getElementById('detected-lang');
+ elements.targetLang = document.getElementById('target-lang');
+ elements.pronounceSection = document.getElementById('pronounce-section');
+}
+
+// 加载支持的语言列表
+async function loadSupportedLanguages() {
+ try {
+ const response = await fetch('https://60s.viki.moe/v2/fanyi/langs');
+ const data = await response.json();
+
+ if (data.code === 200 && data.data && Array.isArray(data.data)) {
+ // 转换数组格式为对象格式
+ supportedLanguages = {};
+ supportedLanguages['auto'] = '自动检测';
+ data.data.forEach(lang => {
+ supportedLanguages[lang.code] = lang.label;
+ });
+ populateLanguageSelectors();
+ } else {
+ throw new Error('获取语言列表失败');
+ }
+ } catch (error) {
+ console.error('加载语言列表失败:', error);
+ showToast('加载语言列表失败,请刷新页面重试', 'error');
+ // 使用默认语言列表
+ useDefaultLanguages();
+ }
+}
+
+// 使用默认语言列表(备用方案)
+function useDefaultLanguages() {
+ supportedLanguages = {
+ 'auto': '自动检测',
+ 'zh-CHS': '中文',
+ 'en': '英语',
+ 'ja': '日语',
+ 'ko': '韩语',
+ 'fr': '法语',
+ 'de': '德语',
+ 'es': '西班牙语',
+ 'ru': '俄语',
+ 'th': '泰语',
+ 'ar': '阿拉伯语',
+ 'pt': '葡萄牙语',
+ 'it': '意大利语'
+ };
+ populateLanguageSelectors();
+}
+
+// 填充语言选择器
+function populateLanguageSelectors() {
+ const fromSelect = elements.fromLang;
+ const toSelect = elements.toLang;
+
+ // 清空现有选项
+ fromSelect.innerHTML = '';
+ toSelect.innerHTML = '';
+
+ // 添加语言选项
+ Object.entries(supportedLanguages).forEach(([code, name]) => {
+ const fromOption = new Option(name, code);
+ const toOption = new Option(name, code);
+
+ fromSelect.appendChild(fromOption);
+ toSelect.appendChild(toOption);
+ });
+
+ // 设置默认值
+ fromSelect.value = 'auto';
+ toSelect.value = 'en';
+
+ // 如果没有auto选项,则设置为中文
+ if (!supportedLanguages['auto']) {
+ fromSelect.value = 'zh-CHS';
+ }
+}
+
+// 绑定事件
+function bindEvents() {
+ // 输入框事件
+ elements.inputText.addEventListener('input', function() {
+ updateCharCount();
+ clearOutput();
+ });
+
+ elements.inputText.addEventListener('keydown', function(e) {
+ if (e.ctrlKey && e.key === 'Enter') {
+ translateText();
+ }
+ });
+
+ // 按钮事件
+ elements.translateBtn.addEventListener('click', translateText);
+ elements.swapBtn.addEventListener('click', swapLanguages);
+ elements.clearBtn.addEventListener('click', clearInput);
+ elements.copyBtn.addEventListener('click', copyOutput);
+
+ // 语言选择器事件
+ elements.fromLang.addEventListener('change', function() {
+ clearOutput();
+ updateLanguageLabels();
+ });
+
+ elements.toLang.addEventListener('change', function() {
+ clearOutput();
+ updateLanguageLabels();
+ });
+}
+
+// 更新字符计数
+function updateCharCount() {
+ const text = elements.inputText.value;
+ const count = text.length;
+ elements.charCount.textContent = `${count}/5000`;
+
+ if (count > 5000) {
+ elements.charCount.style.color = '#e74c3c';
+ } else {
+ elements.charCount.style.color = '#74c69d';
+ }
+}
+
+// 更新语言标签
+function updateLanguageLabels() {
+ const fromLang = elements.fromLang.value;
+ const toLang = elements.toLang.value;
+
+ elements.detectedLang.textContent = supportedLanguages[fromLang] || '未知语言';
+ elements.targetLang.textContent = supportedLanguages[toLang] || '未知语言';
+}
+
+// 翻译文本
+async function translateText() {
+ const text = elements.inputText.value.trim();
+
+ if (!text) {
+ showToast('请输入要翻译的文本', 'error');
+ return;
+ }
+
+ if (text.length > 5000) {
+ showToast('文本长度不能超过5000字符', 'error');
+ return;
+ }
+
+ if (isTranslating) {
+ return;
+ }
+
+ setTranslating(true);
+
+ try {
+ const fromLang = elements.fromLang.value;
+ const toLang = elements.toLang.value;
+
+ // 构建请求URL
+ const params = new URLSearchParams({
+ text: text,
+ from: fromLang,
+ to: toLang
+ });
+
+ const response = await fetch(`https://60s.viki.moe/v2/fanyi?${params}`);
+ const data = await response.json();
+
+ if (data.code === 200 && data.data) {
+ displayTranslationResult(data.data);
+ } else {
+ throw new Error(data.msg || '翻译失败');
+ }
+ } catch (error) {
+ console.error('翻译失败:', error);
+ showToast('翻译失败: ' + error.message, 'error');
+ elements.outputText.textContent = '翻译失败,请重试';
+ } finally {
+ setTranslating(false);
+ }
+}
+
+// 显示翻译结果
+function displayTranslationResult(data) {
+ // 显示翻译结果
+ const translation = data.target ? data.target.text : '';
+ elements.outputText.textContent = translation;
+
+ // 更新检测到的语言
+ if (data.source && data.source.type_desc) {
+ elements.detectedLang.textContent = `检测: ${data.source.type_desc}`;
+ }
+
+ // 显示发音信息
+ displayPronunciation(data);
+
+ // 如果翻译结果为空
+ if (!translation) {
+ elements.outputText.textContent = '未获取到翻译结果';
+ }
+}
+
+// 显示发音信息
+function displayPronunciation(data) {
+ const pronounceSection = elements.pronounceSection;
+ if (!pronounceSection) {
+ return;
+ }
+ pronounceSection.innerHTML = '';
+
+ // 原文发音
+ if (data.source && data.source.pronounce) {
+ const sourcePhoneticDiv = document.createElement('div');
+ sourcePhoneticDiv.className = 'pronounce-item show';
+ sourcePhoneticDiv.textContent = `原文发音: [${data.source.pronounce}]`;
+ pronounceSection.appendChild(sourcePhoneticDiv);
+ }
+
+ // 译文发音
+ if (data.target && data.target.pronounce) {
+ const targetPhoneticDiv = document.createElement('div');
+ targetPhoneticDiv.className = 'pronounce-item show';
+ targetPhoneticDiv.textContent = `译文发音: [${data.target.pronounce}]`;
+ pronounceSection.appendChild(targetPhoneticDiv);
+ }
+}
+
+// 设置翻译状态
+function setTranslating(translating) {
+ isTranslating = translating;
+ elements.translateBtn.disabled = translating;
+
+ if (translating) {
+ elements.translateBtn.classList.add('loading');
+ } else {
+ elements.translateBtn.classList.remove('loading');
+ }
+}
+
+// 交换语言
+function swapLanguages() {
+ const fromValue = elements.fromLang.value;
+ const toValue = elements.toLang.value;
+
+ // 不能交换自动检测
+ if (fromValue === 'auto') {
+ showToast('自动检测语言无法交换', 'error');
+ return;
+ }
+
+ elements.fromLang.value = toValue;
+ elements.toLang.value = fromValue;
+
+ // 交换文本内容
+ const inputText = elements.inputText.value;
+ const outputText = elements.outputText.textContent;
+
+ if (outputText && outputText !== '翻译结果将在这里显示...' && outputText !== '翻译失败,请重试' && outputText !== '未获取到翻译结果') {
+ elements.inputText.value = outputText;
+ elements.outputText.textContent = inputText;
+ }
+
+ updateCharCount();
+ updateLanguageLabels();
+ clearPronunciation();
+}
+
+// 清空输入
+function clearInput() {
+ elements.inputText.value = '';
+ updateCharCount();
+ clearOutput();
+}
+
+// 清空输出
+function clearOutput() {
+ elements.outputText.textContent = '翻译结果将在这里显示...';
+ clearPronunciation();
+}
+
+// 清空发音信息
+function clearPronunciation() {
+ if (elements.pronounceSection) {
+ elements.pronounceSection.innerHTML = '';
+ }
+}
+
+// 复制输出
+function copyOutput() {
+ const text = elements.outputText.textContent;
+
+ if (!text || text === '翻译结果将在这里显示...' || text === '翻译失败,请重试' || text === '未获取到翻译结果') {
+ showToast('没有可复制的内容', 'error');
+ return;
+ }
+
+ // 使用现代API复制
+ if (navigator.clipboard) {
+ navigator.clipboard.writeText(text).then(() => {
+ showToast('已复制到剪贴板');
+ }).catch(() => {
+ fallbackCopy(text);
+ });
+ } else {
+ fallbackCopy(text);
+ }
+}
+
+// 备用复制方法
+function fallbackCopy(text) {
+ const textArea = document.createElement('textarea');
+ textArea.value = text;
+ textArea.style.position = 'fixed';
+ textArea.style.opacity = '0';
+ document.body.appendChild(textArea);
+ textArea.select();
+
+ try {
+ document.execCommand('copy');
+ showToast('已复制到剪贴板');
+ } catch (err) {
+ showToast('复制失败,请手动复制', 'error');
+ }
+
+ document.body.removeChild(textArea);
+}
+
+// 显示提示消息
+function showToast(message, type = 'success') {
+ // 移除现有的toast
+ const existingToast = document.querySelector('.toast');
+ if (existingToast) {
+ existingToast.remove();
+ }
+
+ const toast = document.createElement('div');
+ toast.className = `toast ${type}`;
+ toast.textContent = message;
+
+ document.body.appendChild(toast);
+
+ // 显示toast
+ setTimeout(() => {
+ toast.classList.add('show');
+ }, 100);
+
+ // 自动隐藏
+ setTimeout(() => {
+ toast.classList.remove('show');
+ setTimeout(() => {
+ if (toast.parentNode) {
+ toast.parentNode.removeChild(toast);
+ }
+ }, 300);
+ }, 3000);
+}
+
+// 工具函数:防抖
+function debounce(func, wait) {
+ let timeout;
+ return function executedFunction(...args) {
+ const later = () => {
+ clearTimeout(timeout);
+ func(...args);
+ };
+ clearTimeout(timeout);
+ timeout = setTimeout(later, wait);
+ };
+}
+
+// 添加键盘快捷键支持
+document.addEventListener('keydown', function(e) {
+ // Ctrl+Enter 翻译
+ if (e.ctrlKey && e.key === 'Enter') {
+ e.preventDefault();
+ translateText();
+ }
+
+ // Ctrl+Shift+C 复制结果
+ if (e.ctrlKey && e.shiftKey && e.key === 'C') {
+ e.preventDefault();
+ copyOutput();
+ }
+
+ // Ctrl+Shift+X 清空输入
+ if (e.ctrlKey && e.shiftKey && e.key === 'X') {
+ e.preventDefault();
+ clearInput();
+ }
+
+ // Ctrl+Shift+S 交换语言
+ if (e.ctrlKey && e.shiftKey && e.key === 'S') {
+ e.preventDefault();
+ swapLanguages();
+ }
+});
+
+// 页面可见性变化时的处理
+document.addEventListener('visibilitychange', function() {
+ if (document.hidden) {
+ // 页面隐藏时暂停翻译请求
+ if (isTranslating) {
+ setTranslating(false);
+ }
+ }
+});
+
+// 错误处理
+window.addEventListener('error', function(e) {
+ console.error('页面错误:', e.error);
+});
+
+window.addEventListener('unhandledrejection', function(e) {
+ console.error('未处理的Promise拒绝:', e.reason);
});
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/styles.css b/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/styles.css
index 099b81a9..36f661d7 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/styles.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/styles.css
@@ -1,441 +1,441 @@
-/* 基础样式重置 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
- line-height: 1.6;
- color: #2d5a3d;
- min-height: 100vh;
-}
-
-.container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 20px;
- min-height: 100vh;
- display: flex;
- flex-direction: column;
-}
-
-/* 头部样式 */
-.header {
- text-align: center;
- margin-bottom: 30px;
-}
-
-.header h1 {
- font-size: 2.5rem;
- color: #1a4d2e;
- margin-bottom: 10px;
- font-weight: 700;
-}
-
-.subtitle {
- font-size: 1.1rem;
- color: #4a7c59;
- opacity: 0.9;
-}
-
-/* 主要内容区域 */
-.main-content {
- flex: 1;
- display: flex;
- justify-content: center;
- align-items: flex-start;
-}
-
-.translate-box {
- width: 100%;
- max-width: 900px;
- border-radius: 20px;
- padding: 30px;
- box-shadow: 0 10px 30px rgba(26, 77, 46, 0.1);
-}
-
-/* 语言选择器 */
-.language-selector {
- display: flex;
- align-items: center;
- gap: 20px;
- margin-bottom: 25px;
- justify-content: center;
-}
-
-.lang-group {
- display: flex;
- flex-direction: column;
- gap: 8px;
- flex: 1;
- max-width: 200px;
-}
-
-.lang-group label {
- font-size: 0.9rem;
- color: #2d5a3d;
- font-weight: 500;
-}
-
-.lang-select {
- padding: 12px 16px;
- border: 2px solid #74c69d;
- border-radius: 12px;
- color: #2d5a3d;
- font-size: 1rem;
- cursor: pointer;
- transition: all 0.3s ease;
-}
-
-.lang-select:focus {
- outline: none;
- border-color: #52b788;
- box-shadow: 0 0 0 3px rgba(116, 198, 157, 0.2);
-}
-
-.lang-select:hover {
- border-color: #52b788;
-}
-
-.swap-btn {
- border: none;
- border-radius: 50%;
- width: 45px;
- height: 45px;
- display: flex;
- align-items: center;
- justify-content: center;
- cursor: pointer;
- transition: all 0.3s ease;
- color: white;
- margin-top: 25px;
-}
-
-.swap-btn:hover {
- transform: rotate(180deg);
-}
-
-/* 文本区域 */
-.text-areas {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 20px;
- margin-bottom: 25px;
-}
-
-.input-section,
-.output-section {
- display: flex;
- flex-direction: column;
-}
-
-.textarea-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 10px;
- padding: 0 5px;
-}
-
-.detected-lang,
-.target-lang {
- font-size: 0.9rem;
- color: #4a7c59;
- font-weight: 500;
-}
-
-.clear-btn,
-.copy-btn {
- background: none;
- border: none;
- color: #74c69d;
- cursor: pointer;
- padding: 5px;
- border-radius: 6px;
- transition: all 0.3s ease;
-}
-
-.clear-btn:hover,
-.copy-btn:hover {
- color: #52b788;
-}
-
-#input-text {
- width: 100%;
- height: 200px;
- padding: 16px;
- border: 2px solid #74c69d;
- border-radius: 12px;
- font-size: 1rem;
- color: #2d5a3d;
- resize: vertical;
- transition: all 0.3s ease;
- font-family: inherit;
-}
-
-#input-text:focus {
- outline: none;
- border-color: #52b788;
- box-shadow: 0 0 0 3px rgba(116, 198, 157, 0.2);
-}
-
-#input-text::placeholder {
- color: #74c69d;
- opacity: 0.7;
-}
-
-.output-text {
- width: 100%;
- height: 200px;
- padding: 16px;
- border: 2px solid #b7e4c7;
- border-radius: 12px;
- font-size: 1rem;
- color: #2d5a3d;
- overflow-y: auto;
- line-height: 1.6;
-}
-
-.char-count {
- text-align: right;
- font-size: 0.8rem;
- color: #74c69d;
- margin-top: 5px;
-}
-
-.pronounce-section {
- margin-top: 10px;
- display: flex;
- flex-direction: column;
- gap: 5px;
-}
-
-.pronounce-item {
- font-size: 0.9rem;
- color: #4a7c59;
- font-style: italic;
- padding: 5px 10px;
- border-radius: 8px;
- display: none;
-}
-
-.pronounce-item.show {
- display: block;
-}
-
-/* 操作按钮 */
-.action-buttons {
- display: flex;
- justify-content: center;
-}
-
-.translate-btn {
- color: white;
- border: none;
- padding: 15px 40px;
- border-radius: 25px;
- font-size: 1.1rem;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.3s ease;
- position: relative;
- overflow: hidden;
- min-width: 120px;
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 10px;
-}
-
-.translate-btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 8px 20px rgba(116, 198, 157, 0.3);
-}
-
-.translate-btn:active {
- transform: translateY(0);
-}
-
-.translate-btn:disabled {
- cursor: not-allowed;
- transform: none;
- box-shadow: none;
-}
-
-.loading-spinner {
- width: 20px;
- height: 20px;
- border: 2px solid rgba(255, 255, 255, 0.3);
- border-top: 2px solid white;
- border-radius: 50%;
- animation: spin 1s linear infinite;
- display: none;
-}
-
-.translate-btn.loading .btn-text {
- display: none;
-}
-
-.translate-btn.loading .loading-spinner {
- display: block;
-}
-
-@keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-/* 页脚 */
-.footer {
- text-align: center;
- margin-top: 30px;
- padding: 20px;
- color: #4a7c59;
- font-size: 0.9rem;
- opacity: 0.8;
-}
-
-/* 提示消息 */
-.toast {
- position: fixed;
- top: 20px;
- right: 20px;
- color: white;
- padding: 12px 20px;
- border-radius: 8px;
- font-size: 0.9rem;
- transform: translateX(100%);
- transition: transform 0.3s ease;
- z-index: 1000;
- box-shadow: 0 4px 12px rgba(82, 183, 136, 0.3);
-}
-
-.toast.show {
- transform: translateX(0);
-}
-
-.toast.error {
- box-shadow: 0 4px 12px rgba(231, 76, 60, 0.3);
-}
-
-/* 平板适配 (768px - 1024px) */
-@media (max-width: 1024px) and (min-width: 768px) {
- .container {
- padding: 15px;
- }
-
- .header h1 {
- font-size: 2.2rem;
- }
-
- .translate-box {
- padding: 25px;
- }
-
- .language-selector {
- gap: 15px;
- }
-
- .text-areas {
- gap: 15px;
- }
-
- #input-text,
- .output-text {
- height: 180px;
- }
-}
-
-/* 手机端适配 (最大768px) */
-@media (max-width: 767px) {
- .container {
- padding: 10px;
- }
-
- .header h1 {
- font-size: 1.8rem;
- }
-
- .subtitle {
- font-size: 1rem;
- }
-
- .translate-box {
- padding: 20px 15px;
- border-radius: 15px;
- }
-
- .language-selector {
- flex-direction: column;
- gap: 15px;
- align-items: stretch;
- }
-
- .lang-group {
- max-width: none;
- }
-
- .swap-btn {
- align-self: center;
- margin-top: 0;
- order: 2;
- }
-
- .text-areas {
- grid-template-columns: 1fr;
- gap: 20px;
- }
-
- #input-text,
- .output-text {
- height: 150px;
- font-size: 0.95rem;
- }
-
- .translate-btn {
- padding: 12px 30px;
- font-size: 1rem;
- width: 100%;
- max-width: 200px;
- }
-
- .toast {
- right: 10px;
- left: 10px;
- transform: translateY(-100%);
- }
-
- .toast.show {
- transform: translateY(0);
- }
-}
-
-/* 超小屏幕适配 (最大480px) */
-@media (max-width: 480px) {
- .header h1 {
- font-size: 1.6rem;
- }
-
- .translate-box {
- padding: 15px 10px;
- }
-
- .lang-select {
- padding: 10px 12px;
- font-size: 0.9rem;
- }
-
- #input-text,
- .output-text {
- height: 120px;
- padding: 12px;
- font-size: 0.9rem;
- }
-
- .translate-btn {
- padding: 10px 25px;
- font-size: 0.95rem;
- }
+/* 基础样式重置 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
+ line-height: 1.6;
+ color: #2d5a3d;
+ min-height: 100vh;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+}
+
+/* 头部样式 */
+.header {
+ text-align: center;
+ margin-bottom: 30px;
+}
+
+.header h1 {
+ font-size: 2.5rem;
+ color: #1a4d2e;
+ margin-bottom: 10px;
+ font-weight: 700;
+}
+
+.subtitle {
+ font-size: 1.1rem;
+ color: #4a7c59;
+ opacity: 0.9;
+}
+
+/* 主要内容区域 */
+.main-content {
+ flex: 1;
+ display: flex;
+ justify-content: center;
+ align-items: flex-start;
+}
+
+.translate-box {
+ width: 100%;
+ max-width: 900px;
+ border-radius: 20px;
+ padding: 30px;
+ box-shadow: 0 10px 30px rgba(26, 77, 46, 0.1);
+}
+
+/* 语言选择器 */
+.language-selector {
+ display: flex;
+ align-items: center;
+ gap: 20px;
+ margin-bottom: 25px;
+ justify-content: center;
+}
+
+.lang-group {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ flex: 1;
+ max-width: 200px;
+}
+
+.lang-group label {
+ font-size: 0.9rem;
+ color: #2d5a3d;
+ font-weight: 500;
+}
+
+.lang-select {
+ padding: 12px 16px;
+ border: 2px solid #74c69d;
+ border-radius: 12px;
+ color: #2d5a3d;
+ font-size: 1rem;
+ cursor: pointer;
+ transition: all 0.3s ease;
+}
+
+.lang-select:focus {
+ outline: none;
+ border-color: #52b788;
+ box-shadow: 0 0 0 3px rgba(116, 198, 157, 0.2);
+}
+
+.lang-select:hover {
+ border-color: #52b788;
+}
+
+.swap-btn {
+ border: none;
+ border-radius: 50%;
+ width: 45px;
+ height: 45px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ color: white;
+ margin-top: 25px;
+}
+
+.swap-btn:hover {
+ transform: rotate(180deg);
+}
+
+/* 文本区域 */
+.text-areas {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 20px;
+ margin-bottom: 25px;
+}
+
+.input-section,
+.output-section {
+ display: flex;
+ flex-direction: column;
+}
+
+.textarea-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 10px;
+ padding: 0 5px;
+}
+
+.detected-lang,
+.target-lang {
+ font-size: 0.9rem;
+ color: #4a7c59;
+ font-weight: 500;
+}
+
+.clear-btn,
+.copy-btn {
+ background: none;
+ border: none;
+ color: #74c69d;
+ cursor: pointer;
+ padding: 5px;
+ border-radius: 6px;
+ transition: all 0.3s ease;
+}
+
+.clear-btn:hover,
+.copy-btn:hover {
+ color: #52b788;
+}
+
+#input-text {
+ width: 100%;
+ height: 200px;
+ padding: 16px;
+ border: 2px solid #74c69d;
+ border-radius: 12px;
+ font-size: 1rem;
+ color: #2d5a3d;
+ resize: vertical;
+ transition: all 0.3s ease;
+ font-family: inherit;
+}
+
+#input-text:focus {
+ outline: none;
+ border-color: #52b788;
+ box-shadow: 0 0 0 3px rgba(116, 198, 157, 0.2);
+}
+
+#input-text::placeholder {
+ color: #74c69d;
+ opacity: 0.7;
+}
+
+.output-text {
+ width: 100%;
+ height: 200px;
+ padding: 16px;
+ border: 2px solid #b7e4c7;
+ border-radius: 12px;
+ font-size: 1rem;
+ color: #2d5a3d;
+ overflow-y: auto;
+ line-height: 1.6;
+}
+
+.char-count {
+ text-align: right;
+ font-size: 0.8rem;
+ color: #74c69d;
+ margin-top: 5px;
+}
+
+.pronounce-section {
+ margin-top: 10px;
+ display: flex;
+ flex-direction: column;
+ gap: 5px;
+}
+
+.pronounce-item {
+ font-size: 0.9rem;
+ color: #4a7c59;
+ font-style: italic;
+ padding: 5px 10px;
+ border-radius: 8px;
+ display: none;
+}
+
+.pronounce-item.show {
+ display: block;
+}
+
+/* 操作按钮 */
+.action-buttons {
+ display: flex;
+ justify-content: center;
+}
+
+.translate-btn {
+ color: white;
+ border: none;
+ padding: 15px 40px;
+ border-radius: 25px;
+ font-size: 1.1rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ position: relative;
+ overflow: hidden;
+ min-width: 120px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 10px;
+}
+
+.translate-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 8px 20px rgba(116, 198, 157, 0.3);
+}
+
+.translate-btn:active {
+ transform: translateY(0);
+}
+
+.translate-btn:disabled {
+ cursor: not-allowed;
+ transform: none;
+ box-shadow: none;
+}
+
+.loading-spinner {
+ width: 20px;
+ height: 20px;
+ border: 2px solid rgba(255, 255, 255, 0.3);
+ border-top: 2px solid white;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ display: none;
+}
+
+.translate-btn.loading .btn-text {
+ display: none;
+}
+
+.translate-btn.loading .loading-spinner {
+ display: block;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+/* 页脚 */
+.footer {
+ text-align: center;
+ margin-top: 30px;
+ padding: 20px;
+ color: #4a7c59;
+ font-size: 0.9rem;
+ opacity: 0.8;
+}
+
+/* 提示消息 */
+.toast {
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ color: white;
+ padding: 12px 20px;
+ border-radius: 8px;
+ font-size: 0.9rem;
+ transform: translateX(100%);
+ transition: transform 0.3s ease;
+ z-index: 1000;
+ box-shadow: 0 4px 12px rgba(82, 183, 136, 0.3);
+}
+
+.toast.show {
+ transform: translateX(0);
+}
+
+.toast.error {
+ box-shadow: 0 4px 12px rgba(231, 76, 60, 0.3);
+}
+
+/* 平板适配 (768px - 1024px) */
+@media (max-width: 1024px) and (min-width: 768px) {
+ .container {
+ padding: 15px;
+ }
+
+ .header h1 {
+ font-size: 2.2rem;
+ }
+
+ .translate-box {
+ padding: 25px;
+ }
+
+ .language-selector {
+ gap: 15px;
+ }
+
+ .text-areas {
+ gap: 15px;
+ }
+
+ #input-text,
+ .output-text {
+ height: 180px;
+ }
+}
+
+/* 手机端适配 (最大768px) */
+@media (max-width: 767px) {
+ .container {
+ padding: 10px;
+ }
+
+ .header h1 {
+ font-size: 1.8rem;
+ }
+
+ .subtitle {
+ font-size: 1rem;
+ }
+
+ .translate-box {
+ padding: 20px 15px;
+ border-radius: 15px;
+ }
+
+ .language-selector {
+ flex-direction: column;
+ gap: 15px;
+ align-items: stretch;
+ }
+
+ .lang-group {
+ max-width: none;
+ }
+
+ .swap-btn {
+ align-self: center;
+ margin-top: 0;
+ order: 2;
+ }
+
+ .text-areas {
+ grid-template-columns: 1fr;
+ gap: 20px;
+ }
+
+ #input-text,
+ .output-text {
+ height: 150px;
+ font-size: 0.95rem;
+ }
+
+ .translate-btn {
+ padding: 12px 30px;
+ font-size: 1rem;
+ width: 100%;
+ max-width: 200px;
+ }
+
+ .toast {
+ right: 10px;
+ left: 10px;
+ transform: translateY(-100%);
+ }
+
+ .toast.show {
+ transform: translateY(0);
+ }
+}
+
+/* 超小屏幕适配 (最大480px) */
+@media (max-width: 480px) {
+ .header h1 {
+ font-size: 1.6rem;
+ }
+
+ .translate-box {
+ padding: 15px 10px;
+ }
+
+ .lang-select {
+ padding: 10px 12px;
+ font-size: 0.9rem;
+ }
+
+ #input-text,
+ .output-text {
+ height: 120px;
+ padding: 12px;
+ font-size: 0.9rem;
+ }
+
+ .translate-btn {
+ padding: 10px 25px;
+ font-size: 0.95rem;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/在线翻译支持语言列表接口.json b/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/在线翻译支持语言列表接口.json
index 5f4f0f2b..30242e4a 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/在线翻译支持语言列表接口.json
+++ b/InfoGenie-frontend/public/60sapi/实用功能/在线翻译/在线翻译支持语言列表接口.json
@@ -1,551 +1,551 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": [
- {
- "code": "sq",
- "label": "阿尔巴尼亚语",
- "alphabet": "A"
- },
- {
- "code": "ga",
- "label": "爱尔兰语",
- "alphabet": "A"
- },
- {
- "code": "et",
- "label": "爱沙尼亚语",
- "alphabet": "A"
- },
- {
- "code": "ar",
- "label": "阿拉伯语",
- "alphabet": "A"
- },
- {
- "code": "am",
- "label": "阿姆哈拉语",
- "alphabet": "A"
- },
- {
- "code": "az",
- "label": "阿塞拜疆语",
- "alphabet": "A"
- },
- {
- "code": "be",
- "label": "白俄罗斯语",
- "alphabet": "B"
- },
- {
- "code": "bg",
- "label": "保加利亚语",
- "alphabet": "B"
- },
- {
- "code": "eu",
- "label": "巴斯克语",
- "alphabet": "B"
- },
- {
- "code": "is",
- "label": "冰岛语",
- "alphabet": "B"
- },
- {
- "code": "pl",
- "label": "波兰语",
- "alphabet": "B"
- },
- {
- "code": "bs-Latn",
- "label": "波斯尼亚语(拉丁语)",
- "alphabet": "B"
- },
- {
- "code": "fa",
- "label": "波斯语",
- "alphabet": "B"
- },
- {
- "code": "da",
- "label": "丹麦语",
- "alphabet": "D"
- },
- {
- "code": "de",
- "label": "德语",
- "alphabet": "D"
- },
- {
- "code": "ru",
- "label": "俄语",
- "alphabet": "E"
- },
- {
- "code": "fr",
- "label": "法语",
- "alphabet": "F"
- },
- {
- "code": "tl",
- "label": "菲律宾语",
- "alphabet": "F"
- },
- {
- "code": "fi",
- "label": "芬兰语",
- "alphabet": "F"
- },
- {
- "code": "fy",
- "label": "弗里斯兰语",
- "alphabet": "F"
- },
- {
- "code": "km",
- "label": "高棉语",
- "alphabet": "G"
- },
- {
- "code": "ka",
- "label": "格鲁吉亚语",
- "alphabet": "G"
- },
- {
- "code": "gu",
- "label": "古吉拉特语",
- "alphabet": "G"
- },
- {
- "code": "ko",
- "label": "韩语",
- "alphabet": "H"
- },
- {
- "code": "ht",
- "label": "海地语",
- "alphabet": "H"
- },
- {
- "code": "ha",
- "label": "豪萨语",
- "alphabet": "H"
- },
- {
- "code": "kk",
- "label": "哈萨克语",
- "alphabet": "H"
- },
- {
- "code": "nl",
- "label": "荷兰语",
- "alphabet": "H"
- },
- {
- "code": "gl",
- "label": "加利西亚语",
- "alphabet": "J"
- },
- {
- "code": "ca",
- "label": "加泰罗尼亚语",
- "alphabet": "J"
- },
- {
- "code": "cs",
- "label": "捷克语",
- "alphabet": "J"
- },
- {
- "code": "ky",
- "label": "吉尔吉斯斯坦语",
- "alphabet": "J"
- },
- {
- "code": "kn",
- "label": "卡纳达语",
- "alphabet": "K"
- },
- {
- "code": "tlh",
- "label": "克林贡语",
- "alphabet": "K"
- },
- {
- "code": "hr",
- "label": "克罗地亚语",
- "alphabet": "K"
- },
- {
- "code": "otq",
- "label": "克洛塔罗乙巳语",
- "alphabet": "K"
- },
- {
- "code": "co",
- "label": "科西嘉语",
- "alphabet": "K"
- },
- {
- "code": "ku",
- "label": "库尔德语",
- "alphabet": "K"
- },
- {
- "code": "la",
- "label": "拉丁语",
- "alphabet": "L"
- },
- {
- "code": "lo",
- "label": "老挝语",
- "alphabet": "L"
- },
- {
- "code": "lv",
- "label": "拉脱维亚语",
- "alphabet": "L"
- },
- {
- "code": "lt",
- "label": "立陶宛语",
- "alphabet": "L"
- },
- {
- "code": "ro",
- "label": "罗马尼亚语",
- "alphabet": "L"
- },
- {
- "code": "lb",
- "label": "卢森堡语",
- "alphabet": "L"
- },
- {
- "code": "mg",
- "label": "马尔加什语",
- "alphabet": "M"
- },
- {
- "code": "mt",
- "label": "马耳他语",
- "alphabet": "M"
- },
- {
- "code": "mr",
- "label": "马拉地语",
- "alphabet": "M"
- },
- {
- "code": "ms",
- "label": "马来语",
- "alphabet": "M"
- },
- {
- "code": "ml",
- "label": "马拉雅拉姆语",
- "alphabet": "M"
- },
- {
- "code": "mi",
- "label": "毛利语",
- "alphabet": "M"
- },
- {
- "code": "mk",
- "label": "马其顿语",
- "alphabet": "M"
- },
- {
- "code": "mn",
- "label": "蒙古语",
- "alphabet": "M"
- },
- {
- "code": "bn",
- "label": "孟加拉语",
- "alphabet": "M"
- },
- {
- "code": "my",
- "label": "缅甸语",
- "alphabet": "M"
- },
- {
- "code": "mww",
- "label": "苗族昂山土语",
- "alphabet": "M"
- },
- {
- "code": "hmn",
- "label": "苗族语",
- "alphabet": "M"
- },
- {
- "code": "xh",
- "label": "南非科萨语",
- "alphabet": "N"
- },
- {
- "code": "zu",
- "label": "南非祖鲁语",
- "alphabet": "N"
- },
- {
- "code": "ne",
- "label": "尼泊尔语",
- "alphabet": "N"
- },
- {
- "code": "no",
- "label": "挪威语",
- "alphabet": "N"
- },
- {
- "code": "pa",
- "label": "旁遮普语",
- "alphabet": "P"
- },
- {
- "code": "ps",
- "label": "普什图语",
- "alphabet": "P"
- },
- {
- "code": "pt",
- "label": "葡萄牙语",
- "alphabet": "P"
- },
- {
- "code": "ny",
- "label": "齐切瓦语",
- "alphabet": "Q"
- },
- {
- "code": "ja",
- "label": "日语",
- "alphabet": "R"
- },
- {
- "code": "sv",
- "label": "瑞典语",
- "alphabet": "R"
- },
- {
- "code": "sr-Latn",
- "label": "塞尔维亚语(拉丁语)",
- "alphabet": "S"
- },
- {
- "code": "sr-Cyrl",
- "label": "塞尔维亚语(西里尔)",
- "alphabet": "S"
- },
- {
- "code": "st",
- "label": "塞索托语",
- "alphabet": "S"
- },
- {
- "code": "sm",
- "label": "萨摩亚语",
- "alphabet": "S"
- },
- {
- "code": "si",
- "label": "僧伽罗语",
- "alphabet": "S"
- },
- {
- "code": "eo",
- "label": "世界语",
- "alphabet": "S"
- },
- {
- "code": "sk",
- "label": "斯洛伐克语",
- "alphabet": "S"
- },
- {
- "code": "sl",
- "label": "斯洛语尼亚语",
- "alphabet": "S"
- },
- {
- "code": "sw",
- "label": "斯瓦希里语",
- "alphabet": "S"
- },
- {
- "code": "gd",
- "label": "苏格兰盖尔语",
- "alphabet": "S"
- },
- {
- "code": "so",
- "label": "索马里语",
- "alphabet": "S"
- },
- {
- "code": "ceb",
- "label": "宿务语",
- "alphabet": "S"
- },
- {
- "code": "te",
- "label": "泰卢固语",
- "alphabet": "T"
- },
- {
- "code": "ta",
- "label": "泰米尔语",
- "alphabet": "T"
- },
- {
- "code": "th",
- "label": "泰语",
- "alphabet": "T"
- },
- {
- "code": "tg",
- "label": "塔吉克语",
- "alphabet": "T"
- },
- {
- "code": "tr",
- "label": "土耳其语",
- "alphabet": "T"
- },
- {
- "code": "cy",
- "label": "威尔士语",
- "alphabet": "W"
- },
- {
- "code": "zh-lzh",
- "label": "文言文",
- "alphabet": "W"
- },
- {
- "code": "ur",
- "label": "乌尔都语",
- "alphabet": "W"
- },
- {
- "code": "uk",
- "label": "乌克兰语",
- "alphabet": "W"
- },
- {
- "code": "uz",
- "label": "乌兹别克语",
- "alphabet": "W"
- },
- {
- "code": "haw",
- "label": "夏威夷语",
- "alphabet": "X"
- },
- {
- "code": "es",
- "label": "西班牙语",
- "alphabet": "X"
- },
- {
- "code": "he",
- "label": "希伯来语",
- "alphabet": "X"
- },
- {
- "code": "el",
- "label": "希腊语",
- "alphabet": "X"
- },
- {
- "code": "sd",
- "label": "信德语",
- "alphabet": "X"
- },
- {
- "code": "hu",
- "label": "匈牙利语",
- "alphabet": "X"
- },
- {
- "code": "sn",
- "label": "修纳语",
- "alphabet": "X"
- },
- {
- "code": "en",
- "label": "英语",
- "alphabet": "Y"
- },
- {
- "code": "hy",
- "label": "亚美尼亚语",
- "alphabet": "Y"
- },
- {
- "code": "ig",
- "label": "伊博语",
- "alphabet": "Y"
- },
- {
- "code": "it",
- "label": "意大利语",
- "alphabet": "Y"
- },
- {
- "code": "yi",
- "label": "意第绪语",
- "alphabet": "Y"
- },
- {
- "code": "hi",
- "label": "印地语",
- "alphabet": "Y"
- },
- {
- "code": "id",
- "label": "印度尼西亚语",
- "alphabet": "Y"
- },
- {
- "code": "su",
- "label": "印尼巽他语",
- "alphabet": "Y"
- },
- {
- "code": "jw",
- "label": "印尼爪哇语",
- "alphabet": "Y"
- },
- {
- "code": "yua",
- "label": "尤卡坦玛雅语",
- "alphabet": "Y"
- },
- {
- "code": "yo",
- "label": "约鲁巴语",
- "alphabet": "Y"
- },
- {
- "code": "vi",
- "label": "越南语",
- "alphabet": "Y"
- },
- {
- "code": "zh-CHS",
- "label": "中文",
- "alphabet": "Z"
- },
- {
- "code": "zh-CHT",
- "label": "中文(繁体)",
- "alphabet": "Z"
- }
- ]
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": [
+ {
+ "code": "sq",
+ "label": "阿尔巴尼亚语",
+ "alphabet": "A"
+ },
+ {
+ "code": "ga",
+ "label": "爱尔兰语",
+ "alphabet": "A"
+ },
+ {
+ "code": "et",
+ "label": "爱沙尼亚语",
+ "alphabet": "A"
+ },
+ {
+ "code": "ar",
+ "label": "阿拉伯语",
+ "alphabet": "A"
+ },
+ {
+ "code": "am",
+ "label": "阿姆哈拉语",
+ "alphabet": "A"
+ },
+ {
+ "code": "az",
+ "label": "阿塞拜疆语",
+ "alphabet": "A"
+ },
+ {
+ "code": "be",
+ "label": "白俄罗斯语",
+ "alphabet": "B"
+ },
+ {
+ "code": "bg",
+ "label": "保加利亚语",
+ "alphabet": "B"
+ },
+ {
+ "code": "eu",
+ "label": "巴斯克语",
+ "alphabet": "B"
+ },
+ {
+ "code": "is",
+ "label": "冰岛语",
+ "alphabet": "B"
+ },
+ {
+ "code": "pl",
+ "label": "波兰语",
+ "alphabet": "B"
+ },
+ {
+ "code": "bs-Latn",
+ "label": "波斯尼亚语(拉丁语)",
+ "alphabet": "B"
+ },
+ {
+ "code": "fa",
+ "label": "波斯语",
+ "alphabet": "B"
+ },
+ {
+ "code": "da",
+ "label": "丹麦语",
+ "alphabet": "D"
+ },
+ {
+ "code": "de",
+ "label": "德语",
+ "alphabet": "D"
+ },
+ {
+ "code": "ru",
+ "label": "俄语",
+ "alphabet": "E"
+ },
+ {
+ "code": "fr",
+ "label": "法语",
+ "alphabet": "F"
+ },
+ {
+ "code": "tl",
+ "label": "菲律宾语",
+ "alphabet": "F"
+ },
+ {
+ "code": "fi",
+ "label": "芬兰语",
+ "alphabet": "F"
+ },
+ {
+ "code": "fy",
+ "label": "弗里斯兰语",
+ "alphabet": "F"
+ },
+ {
+ "code": "km",
+ "label": "高棉语",
+ "alphabet": "G"
+ },
+ {
+ "code": "ka",
+ "label": "格鲁吉亚语",
+ "alphabet": "G"
+ },
+ {
+ "code": "gu",
+ "label": "古吉拉特语",
+ "alphabet": "G"
+ },
+ {
+ "code": "ko",
+ "label": "韩语",
+ "alphabet": "H"
+ },
+ {
+ "code": "ht",
+ "label": "海地语",
+ "alphabet": "H"
+ },
+ {
+ "code": "ha",
+ "label": "豪萨语",
+ "alphabet": "H"
+ },
+ {
+ "code": "kk",
+ "label": "哈萨克语",
+ "alphabet": "H"
+ },
+ {
+ "code": "nl",
+ "label": "荷兰语",
+ "alphabet": "H"
+ },
+ {
+ "code": "gl",
+ "label": "加利西亚语",
+ "alphabet": "J"
+ },
+ {
+ "code": "ca",
+ "label": "加泰罗尼亚语",
+ "alphabet": "J"
+ },
+ {
+ "code": "cs",
+ "label": "捷克语",
+ "alphabet": "J"
+ },
+ {
+ "code": "ky",
+ "label": "吉尔吉斯斯坦语",
+ "alphabet": "J"
+ },
+ {
+ "code": "kn",
+ "label": "卡纳达语",
+ "alphabet": "K"
+ },
+ {
+ "code": "tlh",
+ "label": "克林贡语",
+ "alphabet": "K"
+ },
+ {
+ "code": "hr",
+ "label": "克罗地亚语",
+ "alphabet": "K"
+ },
+ {
+ "code": "otq",
+ "label": "克洛塔罗乙巳语",
+ "alphabet": "K"
+ },
+ {
+ "code": "co",
+ "label": "科西嘉语",
+ "alphabet": "K"
+ },
+ {
+ "code": "ku",
+ "label": "库尔德语",
+ "alphabet": "K"
+ },
+ {
+ "code": "la",
+ "label": "拉丁语",
+ "alphabet": "L"
+ },
+ {
+ "code": "lo",
+ "label": "老挝语",
+ "alphabet": "L"
+ },
+ {
+ "code": "lv",
+ "label": "拉脱维亚语",
+ "alphabet": "L"
+ },
+ {
+ "code": "lt",
+ "label": "立陶宛语",
+ "alphabet": "L"
+ },
+ {
+ "code": "ro",
+ "label": "罗马尼亚语",
+ "alphabet": "L"
+ },
+ {
+ "code": "lb",
+ "label": "卢森堡语",
+ "alphabet": "L"
+ },
+ {
+ "code": "mg",
+ "label": "马尔加什语",
+ "alphabet": "M"
+ },
+ {
+ "code": "mt",
+ "label": "马耳他语",
+ "alphabet": "M"
+ },
+ {
+ "code": "mr",
+ "label": "马拉地语",
+ "alphabet": "M"
+ },
+ {
+ "code": "ms",
+ "label": "马来语",
+ "alphabet": "M"
+ },
+ {
+ "code": "ml",
+ "label": "马拉雅拉姆语",
+ "alphabet": "M"
+ },
+ {
+ "code": "mi",
+ "label": "毛利语",
+ "alphabet": "M"
+ },
+ {
+ "code": "mk",
+ "label": "马其顿语",
+ "alphabet": "M"
+ },
+ {
+ "code": "mn",
+ "label": "蒙古语",
+ "alphabet": "M"
+ },
+ {
+ "code": "bn",
+ "label": "孟加拉语",
+ "alphabet": "M"
+ },
+ {
+ "code": "my",
+ "label": "缅甸语",
+ "alphabet": "M"
+ },
+ {
+ "code": "mww",
+ "label": "苗族昂山土语",
+ "alphabet": "M"
+ },
+ {
+ "code": "hmn",
+ "label": "苗族语",
+ "alphabet": "M"
+ },
+ {
+ "code": "xh",
+ "label": "南非科萨语",
+ "alphabet": "N"
+ },
+ {
+ "code": "zu",
+ "label": "南非祖鲁语",
+ "alphabet": "N"
+ },
+ {
+ "code": "ne",
+ "label": "尼泊尔语",
+ "alphabet": "N"
+ },
+ {
+ "code": "no",
+ "label": "挪威语",
+ "alphabet": "N"
+ },
+ {
+ "code": "pa",
+ "label": "旁遮普语",
+ "alphabet": "P"
+ },
+ {
+ "code": "ps",
+ "label": "普什图语",
+ "alphabet": "P"
+ },
+ {
+ "code": "pt",
+ "label": "葡萄牙语",
+ "alphabet": "P"
+ },
+ {
+ "code": "ny",
+ "label": "齐切瓦语",
+ "alphabet": "Q"
+ },
+ {
+ "code": "ja",
+ "label": "日语",
+ "alphabet": "R"
+ },
+ {
+ "code": "sv",
+ "label": "瑞典语",
+ "alphabet": "R"
+ },
+ {
+ "code": "sr-Latn",
+ "label": "塞尔维亚语(拉丁语)",
+ "alphabet": "S"
+ },
+ {
+ "code": "sr-Cyrl",
+ "label": "塞尔维亚语(西里尔)",
+ "alphabet": "S"
+ },
+ {
+ "code": "st",
+ "label": "塞索托语",
+ "alphabet": "S"
+ },
+ {
+ "code": "sm",
+ "label": "萨摩亚语",
+ "alphabet": "S"
+ },
+ {
+ "code": "si",
+ "label": "僧伽罗语",
+ "alphabet": "S"
+ },
+ {
+ "code": "eo",
+ "label": "世界语",
+ "alphabet": "S"
+ },
+ {
+ "code": "sk",
+ "label": "斯洛伐克语",
+ "alphabet": "S"
+ },
+ {
+ "code": "sl",
+ "label": "斯洛语尼亚语",
+ "alphabet": "S"
+ },
+ {
+ "code": "sw",
+ "label": "斯瓦希里语",
+ "alphabet": "S"
+ },
+ {
+ "code": "gd",
+ "label": "苏格兰盖尔语",
+ "alphabet": "S"
+ },
+ {
+ "code": "so",
+ "label": "索马里语",
+ "alphabet": "S"
+ },
+ {
+ "code": "ceb",
+ "label": "宿务语",
+ "alphabet": "S"
+ },
+ {
+ "code": "te",
+ "label": "泰卢固语",
+ "alphabet": "T"
+ },
+ {
+ "code": "ta",
+ "label": "泰米尔语",
+ "alphabet": "T"
+ },
+ {
+ "code": "th",
+ "label": "泰语",
+ "alphabet": "T"
+ },
+ {
+ "code": "tg",
+ "label": "塔吉克语",
+ "alphabet": "T"
+ },
+ {
+ "code": "tr",
+ "label": "土耳其语",
+ "alphabet": "T"
+ },
+ {
+ "code": "cy",
+ "label": "威尔士语",
+ "alphabet": "W"
+ },
+ {
+ "code": "zh-lzh",
+ "label": "文言文",
+ "alphabet": "W"
+ },
+ {
+ "code": "ur",
+ "label": "乌尔都语",
+ "alphabet": "W"
+ },
+ {
+ "code": "uk",
+ "label": "乌克兰语",
+ "alphabet": "W"
+ },
+ {
+ "code": "uz",
+ "label": "乌兹别克语",
+ "alphabet": "W"
+ },
+ {
+ "code": "haw",
+ "label": "夏威夷语",
+ "alphabet": "X"
+ },
+ {
+ "code": "es",
+ "label": "西班牙语",
+ "alphabet": "X"
+ },
+ {
+ "code": "he",
+ "label": "希伯来语",
+ "alphabet": "X"
+ },
+ {
+ "code": "el",
+ "label": "希腊语",
+ "alphabet": "X"
+ },
+ {
+ "code": "sd",
+ "label": "信德语",
+ "alphabet": "X"
+ },
+ {
+ "code": "hu",
+ "label": "匈牙利语",
+ "alphabet": "X"
+ },
+ {
+ "code": "sn",
+ "label": "修纳语",
+ "alphabet": "X"
+ },
+ {
+ "code": "en",
+ "label": "英语",
+ "alphabet": "Y"
+ },
+ {
+ "code": "hy",
+ "label": "亚美尼亚语",
+ "alphabet": "Y"
+ },
+ {
+ "code": "ig",
+ "label": "伊博语",
+ "alphabet": "Y"
+ },
+ {
+ "code": "it",
+ "label": "意大利语",
+ "alphabet": "Y"
+ },
+ {
+ "code": "yi",
+ "label": "意第绪语",
+ "alphabet": "Y"
+ },
+ {
+ "code": "hi",
+ "label": "印地语",
+ "alphabet": "Y"
+ },
+ {
+ "code": "id",
+ "label": "印度尼西亚语",
+ "alphabet": "Y"
+ },
+ {
+ "code": "su",
+ "label": "印尼巽他语",
+ "alphabet": "Y"
+ },
+ {
+ "code": "jw",
+ "label": "印尼爪哇语",
+ "alphabet": "Y"
+ },
+ {
+ "code": "yua",
+ "label": "尤卡坦玛雅语",
+ "alphabet": "Y"
+ },
+ {
+ "code": "yo",
+ "label": "约鲁巴语",
+ "alphabet": "Y"
+ },
+ {
+ "code": "vi",
+ "label": "越南语",
+ "alphabet": "Y"
+ },
+ {
+ "code": "zh-CHS",
+ "label": "中文",
+ "alphabet": "Z"
+ },
+ {
+ "code": "zh-CHT",
+ "label": "中文(繁体)",
+ "alphabet": "Z"
+ }
+ ]
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/天气预报/css/background.css b/InfoGenie-frontend/public/60sapi/实用功能/天气预报/css/background.css
index a9872b38..a81f4d67 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/天气预报/css/background.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/天气预报/css/background.css
@@ -1,145 +1,145 @@
-/* 背景样式文件 */
-body {
- background: linear-gradient(135deg, #e8f5e8 0%, #d4f1d4 25%, #c8ecc8 50%, #b8e6b8 75%, #a8d5ba 100%);
- background-attachment: fixed;
- background-size: 400% 400%;
- animation: gradientShift 15s ease infinite;
- position: relative;
- overflow-x: hidden;
-}
-
-/* 背景渐变动画 */
-@keyframes gradientShift {
- 0% {
- background-position: 0% 50%;
- }
- 50% {
- background-position: 100% 50%;
- }
- 100% {
- background-position: 0% 50%;
- }
-}
-
-/* 背景装饰元素 */
-body::before {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- radial-gradient(circle at 20% 80%, rgba(168, 213, 186, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 80% 20%, rgba(107, 183, 123, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 40% 40%, rgba(200, 236, 200, 0.1) 0%, transparent 50%);
- pointer-events: none;
- z-index: -1;
-}
-
-/* 浮动装饰圆点 */
-body::after {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- radial-gradient(2px 2px at 20px 30px, rgba(168, 213, 186, 0.3), transparent),
- radial-gradient(2px 2px at 40px 70px, rgba(107, 183, 123, 0.2), transparent),
- radial-gradient(1px 1px at 90px 40px, rgba(200, 236, 200, 0.4), transparent),
- radial-gradient(1px 1px at 130px 80px, rgba(168, 213, 186, 0.2), transparent),
- radial-gradient(2px 2px at 160px 30px, rgba(107, 183, 123, 0.3), transparent);
- background-repeat: repeat;
- background-size: 200px 100px;
- animation: float 20s linear infinite;
- pointer-events: none;
- z-index: -1;
-}
-
-@keyframes float {
- 0% {
- transform: translateY(0px);
- }
- 50% {
- transform: translateY(-10px);
- }
- 100% {
- transform: translateY(0px);
- }
-}
-
-/* 云朵装饰效果 */
-.container::before {
- content: '';
- position: absolute;
- top: -50px;
- right: -50px;
- width: 200px;
- height: 100px;
- background: rgba(255, 255, 255, 0.1);
- border-radius: 50px;
- box-shadow:
- -30px 20px 0 rgba(255, 255, 255, 0.08),
- 30px 40px 0 rgba(255, 255, 255, 0.06);
- animation: cloudFloat 25s ease-in-out infinite;
- pointer-events: none;
- z-index: -1;
-}
-
-.container::after {
- content: '';
- position: absolute;
- bottom: -30px;
- left: -30px;
- width: 150px;
- height: 80px;
- background: rgba(255, 255, 255, 0.08);
- border-radius: 40px;
- box-shadow:
- 20px 15px 0 rgba(255, 255, 255, 0.06),
- -20px 25px 0 rgba(255, 255, 255, 0.04);
- animation: cloudFloat 30s ease-in-out infinite reverse;
- pointer-events: none;
- z-index: -1;
-}
-
-@keyframes cloudFloat {
- 0%, 100% {
- transform: translateX(0px) translateY(0px);
- }
- 25% {
- transform: translateX(20px) translateY(-10px);
- }
- 50% {
- transform: translateX(-10px) translateY(-20px);
- }
- 75% {
- transform: translateX(15px) translateY(-5px);
- }
-}
-
-/* 响应式背景调整 */
-@media (max-width: 768px) {
- body::after {
- background-size: 150px 75px;
- }
-
- .container::before,
- .container::after {
- display: none;
- }
-}
-
-@media (max-width: 480px) {
- body {
- background: linear-gradient(135deg, #e8f5e8 0%, #d4f1d4 50%, #a8d5ba 100%);
- animation: none;
- }
-
- body::before,
- body::after {
- display: none;
- }
+/* 背景样式文件 */
+body {
+ background: linear-gradient(135deg, #e8f5e8 0%, #d4f1d4 25%, #c8ecc8 50%, #b8e6b8 75%, #a8d5ba 100%);
+ background-attachment: fixed;
+ background-size: 400% 400%;
+ animation: gradientShift 15s ease infinite;
+ position: relative;
+ overflow-x: hidden;
+}
+
+/* 背景渐变动画 */
+@keyframes gradientShift {
+ 0% {
+ background-position: 0% 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+ 100% {
+ background-position: 0% 50%;
+ }
+}
+
+/* 背景装饰元素 */
+body::before {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(circle at 20% 80%, rgba(168, 213, 186, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(107, 183, 123, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 40% 40%, rgba(200, 236, 200, 0.1) 0%, transparent 50%);
+ pointer-events: none;
+ z-index: -1;
+}
+
+/* 浮动装饰圆点 */
+body::after {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(2px 2px at 20px 30px, rgba(168, 213, 186, 0.3), transparent),
+ radial-gradient(2px 2px at 40px 70px, rgba(107, 183, 123, 0.2), transparent),
+ radial-gradient(1px 1px at 90px 40px, rgba(200, 236, 200, 0.4), transparent),
+ radial-gradient(1px 1px at 130px 80px, rgba(168, 213, 186, 0.2), transparent),
+ radial-gradient(2px 2px at 160px 30px, rgba(107, 183, 123, 0.3), transparent);
+ background-repeat: repeat;
+ background-size: 200px 100px;
+ animation: float 20s linear infinite;
+ pointer-events: none;
+ z-index: -1;
+}
+
+@keyframes float {
+ 0% {
+ transform: translateY(0px);
+ }
+ 50% {
+ transform: translateY(-10px);
+ }
+ 100% {
+ transform: translateY(0px);
+ }
+}
+
+/* 云朵装饰效果 */
+.container::before {
+ content: '';
+ position: absolute;
+ top: -50px;
+ right: -50px;
+ width: 200px;
+ height: 100px;
+ background: rgba(255, 255, 255, 0.1);
+ border-radius: 50px;
+ box-shadow:
+ -30px 20px 0 rgba(255, 255, 255, 0.08),
+ 30px 40px 0 rgba(255, 255, 255, 0.06);
+ animation: cloudFloat 25s ease-in-out infinite;
+ pointer-events: none;
+ z-index: -1;
+}
+
+.container::after {
+ content: '';
+ position: absolute;
+ bottom: -30px;
+ left: -30px;
+ width: 150px;
+ height: 80px;
+ background: rgba(255, 255, 255, 0.08);
+ border-radius: 40px;
+ box-shadow:
+ 20px 15px 0 rgba(255, 255, 255, 0.06),
+ -20px 25px 0 rgba(255, 255, 255, 0.04);
+ animation: cloudFloat 30s ease-in-out infinite reverse;
+ pointer-events: none;
+ z-index: -1;
+}
+
+@keyframes cloudFloat {
+ 0%, 100% {
+ transform: translateX(0px) translateY(0px);
+ }
+ 25% {
+ transform: translateX(20px) translateY(-10px);
+ }
+ 50% {
+ transform: translateX(-10px) translateY(-20px);
+ }
+ 75% {
+ transform: translateX(15px) translateY(-5px);
+ }
+}
+
+/* 响应式背景调整 */
+@media (max-width: 768px) {
+ body::after {
+ background-size: 150px 75px;
+ }
+
+ .container::before,
+ .container::after {
+ display: none;
+ }
+}
+
+@media (max-width: 480px) {
+ body {
+ background: linear-gradient(135deg, #e8f5e8 0%, #d4f1d4 50%, #a8d5ba 100%);
+ animation: none;
+ }
+
+ body::before,
+ body::after {
+ display: none;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/天气预报/css/style.css b/InfoGenie-frontend/public/60sapi/实用功能/天气预报/css/style.css
index f3d52bde..5b15eec1 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/天气预报/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/天气预报/css/style.css
@@ -1,412 +1,412 @@
-/* 基础样式重置 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: 'Microsoft YaHei', Arial, sans-serif;
- line-height: 1.6;
- color: #333;
- min-height: 100vh;
-}
-
-.container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 20px;
-}
-
-/* 头部样式 */
-.header {
- text-align: center;
- margin-bottom: 30px;
-}
-
-.header h1 {
- color: #2d5a3d;
- font-size: 2.5rem;
- font-weight: 300;
- margin-bottom: 10px;
-}
-
-/* 搜索区域 */
-.search-section {
- margin-bottom: 30px;
-}
-
-.search-box {
- display: flex;
- justify-content: center;
- gap: 10px;
- max-width: 500px;
- margin: 0 auto;
-}
-
-#cityInput {
- flex: 1;
- padding: 12px 16px;
- border: 2px solid #a8d5ba;
- border-radius: 25px;
- font-size: 16px;
- outline: none;
- transition: all 0.3s ease;
- background: rgba(255, 255, 255, 0.9);
-}
-
-#cityInput:focus {
- border-color: #6bb77b;
- box-shadow: 0 0 10px rgba(107, 183, 123, 0.3);
-}
-
-#searchBtn {
- padding: 12px 24px;
- background: linear-gradient(135deg, #6bb77b, #5a9f6a);
- color: white;
- border: none;
- border-radius: 25px;
- font-size: 16px;
- cursor: pointer;
- transition: all 0.3s ease;
- white-space: nowrap;
-}
-
-#searchBtn:hover {
- background: linear-gradient(135deg, #5a9f6a, #4a8759);
- transform: translateY(-2px);
- box-shadow: 0 4px 12px rgba(107, 183, 123, 0.4);
-}
-
-/* 加载动画 */
-.loading {
- text-align: center;
- padding: 40px;
-}
-
-.spinner {
- width: 40px;
- height: 40px;
- border: 4px solid #e8f5e8;
- border-top: 4px solid #6bb77b;
- border-radius: 50%;
- animation: spin 1s linear infinite;
- margin: 0 auto 20px;
-}
-
-@keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-/* 天气容器 */
-.weather-container {
- background: rgba(255, 255, 255, 0.95);
- border-radius: 20px;
- padding: 30px;
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
- backdrop-filter: blur(10px);
- border: 1px solid rgba(168, 213, 186, 0.3);
-}
-
-/* 位置信息 */
-.location-info {
- text-align: center;
- margin-bottom: 30px;
- padding-bottom: 20px;
- border-bottom: 2px solid #e8f5e8;
-}
-
-.location-info h2 {
- color: #2d5a3d;
- font-size: 2rem;
- margin-bottom: 5px;
-}
-
-.location-info p {
- color: #666;
- font-size: 14px;
-}
-
-/* 当前天气 */
-.current-weather {
- margin-bottom: 30px;
-}
-
-.weather-main {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 25px;
-}
-
-.temperature {
- font-size: 4rem;
- font-weight: 300;
- color: #2d5a3d;
-}
-
-.unit {
- font-size: 2rem;
- color: #6bb77b;
-}
-
-.weather-desc p:first-child {
- font-size: 1.5rem;
- color: #2d5a3d;
- margin-bottom: 5px;
-}
-
-.weather-desc p:last-child {
- color: #666;
- font-size: 14px;
-}
-
-/* 更新时间 */
-.update-time {
- text-align: center;
- margin-top: 30px;
- padding-top: 20px;
- border-top: 1px solid #e8f5e8;
- color: #666;
- font-size: 14px;
-}
-
-/* 错误信息 */
-.error-message {
- text-align: center;
- padding: 40px;
- background: rgba(255, 107, 107, 0.1);
- border-radius: 15px;
- border: 1px solid rgba(255, 107, 107, 0.2);
- color: #d63031;
-}
-
-/* 平板端适配 (768px - 1024px) */
-@media (min-width: 768px) and (max-width: 1024px) {
- .container {
- padding: 25px;
- }
-
- .header h1 {
- font-size: 2.2rem;
- }
-
- .temperature {
- font-size: 3.5rem;
- }
-
- .index-grid {
- grid-template-columns: repeat(2, 1fr);
- }
-}
-
-/* 电脑端适配 (1024px+) */
-@media (min-width: 1024px) {
- .container {
- padding: 40px;
- }
-
- .weather-container {
- padding: 40px;
- }
-
- .weather-main {
- justify-content: space-around;
- }
-
- .index-grid {
- grid-template-columns: repeat(3, 1fr);
- }
-
- .search-box {
- max-width: 600px;
- }
-}
-
-/* 手机端适配 (768px以下) */
-@media (max-width: 767px) {
- .container {
- padding: 15px;
- }
-
- .header h1 {
- font-size: 2rem;
- }
-
- .search-box {
- flex-direction: column;
- gap: 15px;
- }
-
- #searchBtn {
- padding: 14px 24px;
- }
-
- .weather-container {
- padding: 20px;
- margin: 0 -5px;
- }
-
- .weather-main {
- flex-direction: column;
- text-align: center;
- gap: 20px;
- }
-
- .temperature {
- font-size: 3rem;
- }
-
- .index-grid {
- grid-template-columns: 1fr;
- gap: 15px;
- }
-
- .index-item {
- padding: 15px;
- }
-
- .index-icon {
- font-size: 1.5rem;
- width: 40px;
- margin-right: 12px;
- }
-}
-
-/* 超小屏幕适配 (480px以下) */
-@media (max-width: 480px) {
- .container {
- padding: 10px;
- }
-
- .header h1 {
- font-size: 1.8rem;
- }
-
- .weather-container {
- padding: 15px;
- border-radius: 15px;
- }
-
- .temperature {
- font-size: 2.5rem;
- }
-}
-
-/* 预报区域样式 */
-.forecast-section {
- margin-top: 30px;
- padding: 20px;
- background: rgba(255, 255, 255, 0.95);
- border-radius: 20px;
- backdrop-filter: blur(10px);
- box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
-}
-
-.forecast-section h3 {
- color: #2d5a3d;
- font-size: 1.5rem;
- margin-bottom: 20px;
- text-align: center;
-}
-
-.forecast-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 15px;
-}
-
-.forecast-item {
- background: rgba(255, 255, 255, 0.8);
- border-radius: 15px;
- padding: 15px;
- text-align: center;
- border: 1px solid rgba(168, 213, 186, 0.3);
- transition: all 0.3s ease;
-}
-
-.forecast-item:hover {
- transform: translateY(-5px);
- box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
-}
-
-.forecast-date {
- font-weight: bold;
- color: #2d5a3d;
- margin-bottom: 10px;
- font-size: 1.1rem;
-}
-
-.forecast-weather {
- margin-bottom: 10px;
-}
-
-.weather-day {
- color: #666;
- font-size: 0.9rem;
-}
-
-.weather-night {
- color: #888;
- font-size: 0.85rem;
-}
-
-.forecast-temp {
- margin-bottom: 10px;
- display: flex;
- justify-content: center;
- gap: 10px;
-}
-
-.temp-high {
- color: #ff6b6b;
- font-weight: bold;
- font-size: 1.2rem;
-}
-
-.temp-low {
- color: #4ecdc4;
- font-size: 1rem;
-}
-
-.forecast-wind {
- color: #666;
- font-size: 0.85rem;
- margin-bottom: 5px;
-}
-
-.forecast-humidity {
- color: #888;
- font-size: 0.8rem;
-}
-
-/* 预报区域响应式设计 */
-@media (max-width: 768px) {
- .forecast-grid {
- grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
- gap: 10px;
- }
-
- .forecast-item {
- padding: 12px;
- }
-
- .forecast-date {
- font-size: 1rem;
- }
-
- .temp-high {
- font-size: 1.1rem;
- }
-}
-
-@media (max-width: 480px) {
- .forecast-section {
- padding: 15px;
- }
-
- .forecast-grid {
- grid-template-columns: repeat(2, 1fr);
- }
+/* 基础样式重置 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Microsoft YaHei', Arial, sans-serif;
+ line-height: 1.6;
+ color: #333;
+ min-height: 100vh;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+}
+
+/* 头部样式 */
+.header {
+ text-align: center;
+ margin-bottom: 30px;
+}
+
+.header h1 {
+ color: #2d5a3d;
+ font-size: 2.5rem;
+ font-weight: 300;
+ margin-bottom: 10px;
+}
+
+/* 搜索区域 */
+.search-section {
+ margin-bottom: 30px;
+}
+
+.search-box {
+ display: flex;
+ justify-content: center;
+ gap: 10px;
+ max-width: 500px;
+ margin: 0 auto;
+}
+
+#cityInput {
+ flex: 1;
+ padding: 12px 16px;
+ border: 2px solid #a8d5ba;
+ border-radius: 25px;
+ font-size: 16px;
+ outline: none;
+ transition: all 0.3s ease;
+ background: rgba(255, 255, 255, 0.9);
+}
+
+#cityInput:focus {
+ border-color: #6bb77b;
+ box-shadow: 0 0 10px rgba(107, 183, 123, 0.3);
+}
+
+#searchBtn {
+ padding: 12px 24px;
+ background: linear-gradient(135deg, #6bb77b, #5a9f6a);
+ color: white;
+ border: none;
+ border-radius: 25px;
+ font-size: 16px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ white-space: nowrap;
+}
+
+#searchBtn:hover {
+ background: linear-gradient(135deg, #5a9f6a, #4a8759);
+ transform: translateY(-2px);
+ box-shadow: 0 4px 12px rgba(107, 183, 123, 0.4);
+}
+
+/* 加载动画 */
+.loading {
+ text-align: center;
+ padding: 40px;
+}
+
+.spinner {
+ width: 40px;
+ height: 40px;
+ border: 4px solid #e8f5e8;
+ border-top: 4px solid #6bb77b;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ margin: 0 auto 20px;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+/* 天气容器 */
+.weather-container {
+ background: rgba(255, 255, 255, 0.95);
+ border-radius: 20px;
+ padding: 30px;
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
+ backdrop-filter: blur(10px);
+ border: 1px solid rgba(168, 213, 186, 0.3);
+}
+
+/* 位置信息 */
+.location-info {
+ text-align: center;
+ margin-bottom: 30px;
+ padding-bottom: 20px;
+ border-bottom: 2px solid #e8f5e8;
+}
+
+.location-info h2 {
+ color: #2d5a3d;
+ font-size: 2rem;
+ margin-bottom: 5px;
+}
+
+.location-info p {
+ color: #666;
+ font-size: 14px;
+}
+
+/* 当前天气 */
+.current-weather {
+ margin-bottom: 30px;
+}
+
+.weather-main {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 25px;
+}
+
+.temperature {
+ font-size: 4rem;
+ font-weight: 300;
+ color: #2d5a3d;
+}
+
+.unit {
+ font-size: 2rem;
+ color: #6bb77b;
+}
+
+.weather-desc p:first-child {
+ font-size: 1.5rem;
+ color: #2d5a3d;
+ margin-bottom: 5px;
+}
+
+.weather-desc p:last-child {
+ color: #666;
+ font-size: 14px;
+}
+
+/* 更新时间 */
+.update-time {
+ text-align: center;
+ margin-top: 30px;
+ padding-top: 20px;
+ border-top: 1px solid #e8f5e8;
+ color: #666;
+ font-size: 14px;
+}
+
+/* 错误信息 */
+.error-message {
+ text-align: center;
+ padding: 40px;
+ background: rgba(255, 107, 107, 0.1);
+ border-radius: 15px;
+ border: 1px solid rgba(255, 107, 107, 0.2);
+ color: #d63031;
+}
+
+/* 平板端适配 (768px - 1024px) */
+@media (min-width: 768px) and (max-width: 1024px) {
+ .container {
+ padding: 25px;
+ }
+
+ .header h1 {
+ font-size: 2.2rem;
+ }
+
+ .temperature {
+ font-size: 3.5rem;
+ }
+
+ .index-grid {
+ grid-template-columns: repeat(2, 1fr);
+ }
+}
+
+/* 电脑端适配 (1024px+) */
+@media (min-width: 1024px) {
+ .container {
+ padding: 40px;
+ }
+
+ .weather-container {
+ padding: 40px;
+ }
+
+ .weather-main {
+ justify-content: space-around;
+ }
+
+ .index-grid {
+ grid-template-columns: repeat(3, 1fr);
+ }
+
+ .search-box {
+ max-width: 600px;
+ }
+}
+
+/* 手机端适配 (768px以下) */
+@media (max-width: 767px) {
+ .container {
+ padding: 15px;
+ }
+
+ .header h1 {
+ font-size: 2rem;
+ }
+
+ .search-box {
+ flex-direction: column;
+ gap: 15px;
+ }
+
+ #searchBtn {
+ padding: 14px 24px;
+ }
+
+ .weather-container {
+ padding: 20px;
+ margin: 0 -5px;
+ }
+
+ .weather-main {
+ flex-direction: column;
+ text-align: center;
+ gap: 20px;
+ }
+
+ .temperature {
+ font-size: 3rem;
+ }
+
+ .index-grid {
+ grid-template-columns: 1fr;
+ gap: 15px;
+ }
+
+ .index-item {
+ padding: 15px;
+ }
+
+ .index-icon {
+ font-size: 1.5rem;
+ width: 40px;
+ margin-right: 12px;
+ }
+}
+
+/* 超小屏幕适配 (480px以下) */
+@media (max-width: 480px) {
+ .container {
+ padding: 10px;
+ }
+
+ .header h1 {
+ font-size: 1.8rem;
+ }
+
+ .weather-container {
+ padding: 15px;
+ border-radius: 15px;
+ }
+
+ .temperature {
+ font-size: 2.5rem;
+ }
+}
+
+/* 预报区域样式 */
+.forecast-section {
+ margin-top: 30px;
+ padding: 20px;
+ background: rgba(255, 255, 255, 0.95);
+ border-radius: 20px;
+ backdrop-filter: blur(10px);
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
+}
+
+.forecast-section h3 {
+ color: #2d5a3d;
+ font-size: 1.5rem;
+ margin-bottom: 20px;
+ text-align: center;
+}
+
+.forecast-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: 15px;
+}
+
+.forecast-item {
+ background: rgba(255, 255, 255, 0.8);
+ border-radius: 15px;
+ padding: 15px;
+ text-align: center;
+ border: 1px solid rgba(168, 213, 186, 0.3);
+ transition: all 0.3s ease;
+}
+
+.forecast-item:hover {
+ transform: translateY(-5px);
+ box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
+}
+
+.forecast-date {
+ font-weight: bold;
+ color: #2d5a3d;
+ margin-bottom: 10px;
+ font-size: 1.1rem;
+}
+
+.forecast-weather {
+ margin-bottom: 10px;
+}
+
+.weather-day {
+ color: #666;
+ font-size: 0.9rem;
+}
+
+.weather-night {
+ color: #888;
+ font-size: 0.85rem;
+}
+
+.forecast-temp {
+ margin-bottom: 10px;
+ display: flex;
+ justify-content: center;
+ gap: 10px;
+}
+
+.temp-high {
+ color: #ff6b6b;
+ font-weight: bold;
+ font-size: 1.2rem;
+}
+
+.temp-low {
+ color: #4ecdc4;
+ font-size: 1rem;
+}
+
+.forecast-wind {
+ color: #666;
+ font-size: 0.85rem;
+ margin-bottom: 5px;
+}
+
+.forecast-humidity {
+ color: #888;
+ font-size: 0.8rem;
+}
+
+/* 预报区域响应式设计 */
+@media (max-width: 768px) {
+ .forecast-grid {
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
+ gap: 10px;
+ }
+
+ .forecast-item {
+ padding: 12px;
+ }
+
+ .forecast-date {
+ font-size: 1rem;
+ }
+
+ .temp-high {
+ font-size: 1.1rem;
+ }
+}
+
+@media (max-width: 480px) {
+ .forecast-section {
+ padding: 15px;
+ }
+
+ .forecast-grid {
+ grid-template-columns: repeat(2, 1fr);
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/天气预报/index.html b/InfoGenie-frontend/public/60sapi/实用功能/天气预报/index.html
index fac47523..cb04b615 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/天气预报/index.html
+++ b/InfoGenie-frontend/public/60sapi/实用功能/天气预报/index.html
@@ -1,66 +1,66 @@
-
-
-
-
-
- 天气预报
-
-
-
-
-
-
-
-
+
+
+
+
+
+ 天气预报
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/天气预报/js/script.js b/InfoGenie-frontend/public/60sapi/实用功能/天气预报/js/script.js
index 2207d110..375275cc 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/天气预报/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/实用功能/天气预报/js/script.js
@@ -1,260 +1,260 @@
-// 天气查询应用
-class WeatherApp {
- constructor() {
- this.apiEndpoints = [
- "https://60s.api.shumengya.top/v2/weather/forecast",
- "https://60s-cf.viki.moe/v2/weather/forecast"
- ];
- this.currentEndpointIndex = 0;
- this.init();
- }
-
- init() {
- this.bindEvents();
- // 页面加载时自动查询北京天气
- this.searchWeather('北京');
- }
-
- bindEvents() {
- const searchBtn = document.getElementById('searchBtn');
- const cityInput = document.getElementById('cityInput');
-
- searchBtn.addEventListener('click', () => {
- const city = cityInput.value.trim();
- if (city) {
- this.searchWeather(city);
- } else {
- this.showError('请输入城市名称');
- }
- });
-
- cityInput.addEventListener('keypress', (e) => {
- if (e.key === 'Enter') {
- const city = cityInput.value.trim();
- if (city) {
- this.searchWeather(city);
- } else {
- this.showError('请输入城市名称');
- }
- }
- });
-
- // 防止输入框为空时查询
- cityInput.addEventListener('input', () => {
- const searchBtn = document.getElementById('searchBtn');
- searchBtn.disabled = !cityInput.value.trim();
- });
- }
-
- async searchWeather(city) {
- this.showLoading();
-
- for (let i = 0; i < this.apiEndpoints.length; i++) {
- try {
- const endpoint = this.apiEndpoints[this.currentEndpointIndex];
- const response = await this.fetchWeatherData(endpoint, city);
-
- if (response && response.code === 200) {
- this.displayWeatherData(response.data);
- return;
- }
- } catch (error) {
- console.warn(`API ${this.apiEndpoints[this.currentEndpointIndex]} 请求失败:`, error);
- }
-
- // 切换到下一个API端点
- this.currentEndpointIndex = (this.currentEndpointIndex + 1) % this.apiEndpoints.length;
- }
-
- // 所有API都失败了
- this.showError('获取天气信息失败,请检查网络连接或稍后重试');
- }
-
- async fetchWeatherData(endpoint, city) {
- const url = `${endpoint}?query=${encodeURIComponent(city)}`;
-
- const response = await fetch(url, {
- method: 'GET',
- headers: {
- 'Accept': 'application/json',
- 'Content-Type': 'application/json'
- },
- timeout: 10000
- });
-
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}`);
- }
-
- return await response.json();
- }
-
- displayWeatherData(data) {
- const { location, daily_forecast, hourly_forecast } = data;
-
- // 显示位置信息
- document.getElementById('locationName').textContent = location.name || '未知位置';
- document.getElementById('locationDetail').textContent =
- `${location.province || ''} ${location.city || ''} ${location.county || ''}`.trim();
-
- // 使用第一天的预报数据作为当前天气(今天的天气)
- const todayWeather = daily_forecast && daily_forecast[0];
-
- if (todayWeather) {
- // 显示当前天气(使用今天的最高温度)
- document.getElementById('temperature').textContent = todayWeather.max_temperature;
- document.getElementById('weatherCondition').textContent =
- `${todayWeather.day_condition} 转 ${todayWeather.night_condition}`;
-
- // 体感温度(使用温度范围)
- document.getElementById('feelsLike').textContent =
- `温度范围 ${todayWeather.min_temperature}°C - ${todayWeather.max_temperature}°C`;
- } else {
- // 如果没有日预报数据,尝试使用小时预报数据
- const currentHour = hourly_forecast && hourly_forecast[0];
- if (currentHour) {
- document.getElementById('temperature').textContent = currentHour.temperature;
- document.getElementById('weatherCondition').textContent = currentHour.condition;
- document.getElementById('feelsLike').textContent =
- `风向: ${currentHour.wind_direction} ${currentHour.wind_power}`;
- }
- }
-
- // 显示更新时间(使用当前时间)
- document.getElementById('updateTime').textContent =
- `${this.formatDate(new Date())} (基于预报数据)`;
-
- // 显示天气预报
- this.displayForecast(daily_forecast || []);
-
- this.showWeatherContainer();
- }
-
- displayForecast(forecast) {
- const forecastGrid = document.getElementById('forecastGrid');
- forecastGrid.innerHTML = '';
-
- if (!forecast || forecast.length === 0) {
- forecastGrid.innerHTML = '暂无预报数据
';
- return;
- }
-
- forecast.forEach((day, index) => {
- const forecastItem = document.createElement('div');
- forecastItem.className = 'forecast-item';
-
- // 格式化日期显示
- const dateStr = day.date || '';
- const dateDesc = this.formatDateDesc(dateStr);
-
- forecastItem.innerHTML = `
- ${dateDesc}
-
-
${day.day_condition || '未知'}
-
${day.night_condition || '未知'}
-
-
- ${day.max_temperature || '--'}°
- ${day.min_temperature || '--'}°
-
-
-
${day.day_wind_direction || ''} ${day.day_wind_power || ''}
-
- 空气质量: ${day.air_quality || '未知'}
- `;
-
- forecastGrid.appendChild(forecastItem);
- });
- }
-
- // 华氏度转摄氏度
- fahrenheitToCelsius(fahrenheit) {
- const celsius = (fahrenheit - 32) * 5 / 9;
- return Math.round(celsius * 10) / 10; // 保留一位小数
- }
-
- // 格式化时间
- formatDate(date) {
- const year = date.getFullYear();
- const month = String(date.getMonth() + 1).padStart(2, '0');
- const day = String(date.getDate()).padStart(2, '0');
- const hours = String(date.getHours()).padStart(2, '0');
- const minutes = String(date.getMinutes()).padStart(2, '0');
- const seconds = String(date.getSeconds()).padStart(2, '0');
-
- return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
- }
-
- // 格式化日期描述
- formatDateDesc(dateStr) {
- if (!dateStr) return '未知日期';
-
- try {
- const date = new Date(dateStr);
- const today = new Date();
- const tomorrow = new Date(today);
- tomorrow.setDate(today.getDate() + 1);
-
- const month = String(date.getMonth() + 1).padStart(2, '0');
- const day = String(date.getDate()).padStart(2, '0');
-
- // 判断是今天、明天还是其他日期
- if (date.toDateString() === today.toDateString()) {
- return `今天 ${month}-${day}`;
- } else if (date.toDateString() === tomorrow.toDateString()) {
- return `明天 ${month}-${day}`;
- } else {
- const weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
- const weekday = weekdays[date.getDay()];
- return `${weekday} ${month}-${day}`;
- }
- } catch (error) {
- return dateStr;
- }
- }
-
- showLoading() {
- document.getElementById('loading').style.display = 'block';
- document.getElementById('weatherContainer').style.display = 'none';
- document.getElementById('errorMessage').style.display = 'none';
- }
-
- showWeatherContainer() {
- document.getElementById('loading').style.display = 'none';
- document.getElementById('weatherContainer').style.display = 'block';
- document.getElementById('errorMessage').style.display = 'none';
- }
-
- showError(message) {
- document.getElementById('loading').style.display = 'none';
- document.getElementById('weatherContainer').style.display = 'none';
- const errorElement = document.getElementById('errorMessage');
- errorElement.style.display = 'block';
- errorElement.querySelector('p').textContent = message;
- }
-}
-
-// 页面加载完成后初始化应用
-document.addEventListener('DOMContentLoaded', () => {
- new WeatherApp();
-});
-
-// 添加页面可见性检测,当页面重新可见时刷新数据
-document.addEventListener('visibilitychange', () => {
- if (!document.hidden) {
- const cityInput = document.getElementById('cityInput');
- const city = cityInput.value.trim() || '北京';
- // 延迟1秒刷新,避免频繁请求
- setTimeout(() => {
- if (window.weatherApp) {
- window.weatherApp.searchWeather(city);
- }
- }, 1000);
- }
-});
-
-// 将应用实例暴露到全局,方便调试和其他功能调用
-window.weatherApp = null;
-document.addEventListener('DOMContentLoaded', () => {
- window.weatherApp = new WeatherApp();
+// 天气查询应用
+class WeatherApp {
+ constructor() {
+ this.apiEndpoints = [
+ "https://60s.api.shumengya.top/v2/weather/forecast",
+ "https://60s-cf.viki.moe/v2/weather/forecast"
+ ];
+ this.currentEndpointIndex = 0;
+ this.init();
+ }
+
+ init() {
+ this.bindEvents();
+ // 页面加载时自动查询北京天气
+ this.searchWeather('北京');
+ }
+
+ bindEvents() {
+ const searchBtn = document.getElementById('searchBtn');
+ const cityInput = document.getElementById('cityInput');
+
+ searchBtn.addEventListener('click', () => {
+ const city = cityInput.value.trim();
+ if (city) {
+ this.searchWeather(city);
+ } else {
+ this.showError('请输入城市名称');
+ }
+ });
+
+ cityInput.addEventListener('keypress', (e) => {
+ if (e.key === 'Enter') {
+ const city = cityInput.value.trim();
+ if (city) {
+ this.searchWeather(city);
+ } else {
+ this.showError('请输入城市名称');
+ }
+ }
+ });
+
+ // 防止输入框为空时查询
+ cityInput.addEventListener('input', () => {
+ const searchBtn = document.getElementById('searchBtn');
+ searchBtn.disabled = !cityInput.value.trim();
+ });
+ }
+
+ async searchWeather(city) {
+ this.showLoading();
+
+ for (let i = 0; i < this.apiEndpoints.length; i++) {
+ try {
+ const endpoint = this.apiEndpoints[this.currentEndpointIndex];
+ const response = await this.fetchWeatherData(endpoint, city);
+
+ if (response && response.code === 200) {
+ this.displayWeatherData(response.data);
+ return;
+ }
+ } catch (error) {
+ console.warn(`API ${this.apiEndpoints[this.currentEndpointIndex]} 请求失败:`, error);
+ }
+
+ // 切换到下一个API端点
+ this.currentEndpointIndex = (this.currentEndpointIndex + 1) % this.apiEndpoints.length;
+ }
+
+ // 所有API都失败了
+ this.showError('获取天气信息失败,请检查网络连接或稍后重试');
+ }
+
+ async fetchWeatherData(endpoint, city) {
+ const url = `${endpoint}?query=${encodeURIComponent(city)}`;
+
+ const response = await fetch(url, {
+ method: 'GET',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json'
+ },
+ timeout: 10000
+ });
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}`);
+ }
+
+ return await response.json();
+ }
+
+ displayWeatherData(data) {
+ const { location, daily_forecast, hourly_forecast } = data;
+
+ // 显示位置信息
+ document.getElementById('locationName').textContent = location.name || '未知位置';
+ document.getElementById('locationDetail').textContent =
+ `${location.province || ''} ${location.city || ''} ${location.county || ''}`.trim();
+
+ // 使用第一天的预报数据作为当前天气(今天的天气)
+ const todayWeather = daily_forecast && daily_forecast[0];
+
+ if (todayWeather) {
+ // 显示当前天气(使用今天的最高温度)
+ document.getElementById('temperature').textContent = todayWeather.max_temperature;
+ document.getElementById('weatherCondition').textContent =
+ `${todayWeather.day_condition} 转 ${todayWeather.night_condition}`;
+
+ // 体感温度(使用温度范围)
+ document.getElementById('feelsLike').textContent =
+ `温度范围 ${todayWeather.min_temperature}°C - ${todayWeather.max_temperature}°C`;
+ } else {
+ // 如果没有日预报数据,尝试使用小时预报数据
+ const currentHour = hourly_forecast && hourly_forecast[0];
+ if (currentHour) {
+ document.getElementById('temperature').textContent = currentHour.temperature;
+ document.getElementById('weatherCondition').textContent = currentHour.condition;
+ document.getElementById('feelsLike').textContent =
+ `风向: ${currentHour.wind_direction} ${currentHour.wind_power}`;
+ }
+ }
+
+ // 显示更新时间(使用当前时间)
+ document.getElementById('updateTime').textContent =
+ `${this.formatDate(new Date())} (基于预报数据)`;
+
+ // 显示天气预报
+ this.displayForecast(daily_forecast || []);
+
+ this.showWeatherContainer();
+ }
+
+ displayForecast(forecast) {
+ const forecastGrid = document.getElementById('forecastGrid');
+ forecastGrid.innerHTML = '';
+
+ if (!forecast || forecast.length === 0) {
+ forecastGrid.innerHTML = '暂无预报数据
';
+ return;
+ }
+
+ forecast.forEach((day, index) => {
+ const forecastItem = document.createElement('div');
+ forecastItem.className = 'forecast-item';
+
+ // 格式化日期显示
+ const dateStr = day.date || '';
+ const dateDesc = this.formatDateDesc(dateStr);
+
+ forecastItem.innerHTML = `
+ ${dateDesc}
+
+
${day.day_condition || '未知'}
+
${day.night_condition || '未知'}
+
+
+ ${day.max_temperature || '--'}°
+ ${day.min_temperature || '--'}°
+
+
+
${day.day_wind_direction || ''} ${day.day_wind_power || ''}
+
+ 空气质量: ${day.air_quality || '未知'}
+ `;
+
+ forecastGrid.appendChild(forecastItem);
+ });
+ }
+
+ // 华氏度转摄氏度
+ fahrenheitToCelsius(fahrenheit) {
+ const celsius = (fahrenheit - 32) * 5 / 9;
+ return Math.round(celsius * 10) / 10; // 保留一位小数
+ }
+
+ // 格式化时间
+ formatDate(date) {
+ const year = date.getFullYear();
+ const month = String(date.getMonth() + 1).padStart(2, '0');
+ const day = String(date.getDate()).padStart(2, '0');
+ const hours = String(date.getHours()).padStart(2, '0');
+ const minutes = String(date.getMinutes()).padStart(2, '0');
+ const seconds = String(date.getSeconds()).padStart(2, '0');
+
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+ }
+
+ // 格式化日期描述
+ formatDateDesc(dateStr) {
+ if (!dateStr) return '未知日期';
+
+ try {
+ const date = new Date(dateStr);
+ const today = new Date();
+ const tomorrow = new Date(today);
+ tomorrow.setDate(today.getDate() + 1);
+
+ const month = String(date.getMonth() + 1).padStart(2, '0');
+ const day = String(date.getDate()).padStart(2, '0');
+
+ // 判断是今天、明天还是其他日期
+ if (date.toDateString() === today.toDateString()) {
+ return `今天 ${month}-${day}`;
+ } else if (date.toDateString() === tomorrow.toDateString()) {
+ return `明天 ${month}-${day}`;
+ } else {
+ const weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
+ const weekday = weekdays[date.getDay()];
+ return `${weekday} ${month}-${day}`;
+ }
+ } catch (error) {
+ return dateStr;
+ }
+ }
+
+ showLoading() {
+ document.getElementById('loading').style.display = 'block';
+ document.getElementById('weatherContainer').style.display = 'none';
+ document.getElementById('errorMessage').style.display = 'none';
+ }
+
+ showWeatherContainer() {
+ document.getElementById('loading').style.display = 'none';
+ document.getElementById('weatherContainer').style.display = 'block';
+ document.getElementById('errorMessage').style.display = 'none';
+ }
+
+ showError(message) {
+ document.getElementById('loading').style.display = 'none';
+ document.getElementById('weatherContainer').style.display = 'none';
+ const errorElement = document.getElementById('errorMessage');
+ errorElement.style.display = 'block';
+ errorElement.querySelector('p').textContent = message;
+ }
+}
+
+// 页面加载完成后初始化应用
+document.addEventListener('DOMContentLoaded', () => {
+ new WeatherApp();
+});
+
+// 添加页面可见性检测,当页面重新可见时刷新数据
+document.addEventListener('visibilitychange', () => {
+ if (!document.hidden) {
+ const cityInput = document.getElementById('cityInput');
+ const city = cityInput.value.trim() || '北京';
+ // 延迟1秒刷新,避免频繁请求
+ setTimeout(() => {
+ if (window.weatherApp) {
+ window.weatherApp.searchWeather(city);
+ }
+ }, 1000);
+ }
+});
+
+// 将应用实例暴露到全局,方便调试和其他功能调用
+window.weatherApp = null;
+document.addEventListener('DOMContentLoaded', () => {
+ window.weatherApp = new WeatherApp();
});
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/background.css b/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/background.css
index 078de8fa..d52321e6 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/background.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/background.css
@@ -1,202 +1,202 @@
-/* 背景样式文件 - 独立管理背景相关CSS */
-
-/* 主体背景 */
-body {
- background: linear-gradient(135deg, #a8e6cf 0%, #dcedc8 50%, #f0f4c3 100%);
- background-attachment: fixed;
- background-size: cover;
- position: relative;
-}
-
-/* 背景装饰元素 */
-body::before {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- radial-gradient(circle at 20% 80%, rgba(120, 219, 226, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 80% 20%, rgba(168, 230, 207, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 40% 40%, rgba(220, 237, 200, 0.1) 0%, transparent 50%);
- pointer-events: none;
- z-index: -1;
-}
-
-/* 动态背景效果 */
-body::after {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background:
- linear-gradient(45deg, transparent 30%, rgba(255, 255, 255, 0.05) 50%, transparent 70%),
- linear-gradient(-45deg, transparent 30%, rgba(168, 230, 207, 0.05) 50%, transparent 70%);
- background-size: 200px 200px;
- animation: backgroundMove 20s linear infinite;
- pointer-events: none;
- z-index: -1;
-}
-
-/* 背景动画 */
-@keyframes backgroundMove {
- 0% {
- background-position: 0 0, 0 0;
- }
- 100% {
- background-position: 200px 200px, -200px -200px;
- }
-}
-
-/* 容器背景 */
-.container {
- background: rgba(255, 255, 255, 0.1);
- backdrop-filter: blur(5px);
- border-radius: 20px;
- border: 1px solid rgba(255, 255, 255, 0.2);
-}
-
-/* 卡片背景增强 */
-.weather-card {
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(15px);
- border: 1px solid rgba(168, 230, 207, 0.3);
- box-shadow:
- 0 10px 30px rgba(0, 0, 0, 0.1),
- 0 1px 8px rgba(168, 230, 207, 0.2),
- inset 0 1px 0 rgba(255, 255, 255, 0.8);
-}
-
-/* 当前天气区域背景 */
-.current-weather {
- background: linear-gradient(135deg,
- rgba(168, 230, 207, 0.8) 0%,
- rgba(220, 237, 200, 0.8) 50%,
- rgba(240, 244, 195, 0.8) 100%);
- backdrop-filter: blur(10px);
- border: 1px solid rgba(255, 255, 255, 0.3);
- box-shadow:
- 0 4px 15px rgba(39, 174, 96, 0.1),
- inset 0 1px 0 rgba(255, 255, 255, 0.6);
-}
-
-/* 详情项背景 */
-.detail-item {
- background: linear-gradient(135deg,
- rgba(168, 230, 207, 0.1) 0%,
- rgba(255, 255, 255, 0.1) 100%);
- backdrop-filter: blur(5px);
- border: 1px solid rgba(168, 230, 207, 0.2);
- box-shadow: 0 2px 8px rgba(39, 174, 96, 0.05);
-}
-
-/* 生活指数项背景 */
-.index-item {
- background: linear-gradient(135deg,
- rgba(168, 230, 207, 0.05) 0%,
- rgba(255, 255, 255, 0.1) 100%);
- backdrop-filter: blur(5px);
- border: 1px solid rgba(168, 230, 207, 0.15);
- box-shadow: 0 2px 10px rgba(39, 174, 96, 0.05);
-}
-
-.index-item:hover {
- background: linear-gradient(135deg,
- rgba(168, 230, 207, 0.1) 0%,
- rgba(255, 255, 255, 0.15) 100%);
- box-shadow: 0 5px 20px rgba(39, 174, 96, 0.1);
-}
-
-/* 输入框背景 */
-#cityInput {
- background: rgba(255, 255, 255, 0.9);
- backdrop-filter: blur(10px);
- border: 2px solid rgba(168, 230, 207, 0.6);
- box-shadow: 0 2px 10px rgba(39, 174, 96, 0.1);
-}
-
-#cityInput:focus {
- background: rgba(255, 255, 255, 0.95);
- box-shadow:
- 0 0 15px rgba(39, 174, 96, 0.2),
- 0 2px 10px rgba(39, 174, 96, 0.1);
-}
-
-/* 按钮背景 */
-#searchBtn {
- background: linear-gradient(135deg,
- #27ae60 0%,
- #2ecc71 50%,
- #58d68d 100%);
- box-shadow:
- 0 4px 15px rgba(39, 174, 96, 0.3),
- inset 0 1px 0 rgba(255, 255, 255, 0.2);
-}
-
-#searchBtn:hover {
- background: linear-gradient(135deg,
- #229954 0%,
- #27ae60 50%,
- #52c370 100%);
- box-shadow:
- 0 6px 20px rgba(39, 174, 96, 0.4),
- inset 0 1px 0 rgba(255, 255, 255, 0.3);
-}
-
-/* 错误消息背景 */
-.error-message {
- background: linear-gradient(135deg,
- rgba(231, 76, 60, 0.1) 0%,
- rgba(255, 255, 255, 0.1) 100%);
- backdrop-filter: blur(10px);
- border: 1px solid rgba(231, 76, 60, 0.2);
- box-shadow: 0 4px 15px rgba(231, 76, 60, 0.1);
-}
-
-/* 加载状态背景 */
-.loading {
- background: rgba(255, 255, 255, 0.8);
- backdrop-filter: blur(10px);
- border-radius: 15px;
- border: 1px solid rgba(168, 230, 207, 0.3);
- box-shadow: 0 4px 15px rgba(39, 174, 96, 0.1);
-}
-
-/* 移动端背景优化 */
-@media (max-width: 767px) {
- body::after {
- background-size: 100px 100px;
- animation-duration: 15s;
- }
-
- .container {
- background: rgba(255, 255, 255, 0.05);
- backdrop-filter: blur(3px);
- }
-
- .weather-card {
- backdrop-filter: blur(10px);
- }
-}
-
-/* 高性能设备背景增强 */
-@media (min-width: 1024px) {
- body::before {
- background-image:
- radial-gradient(circle at 20% 80%, rgba(120, 219, 226, 0.15) 0%, transparent 50%),
- radial-gradient(circle at 80% 20%, rgba(168, 230, 207, 0.15) 0%, transparent 50%),
- radial-gradient(circle at 40% 40%, rgba(220, 237, 200, 0.15) 0%, transparent 50%),
- radial-gradient(circle at 60% 70%, rgba(240, 244, 195, 0.1) 0%, transparent 50%);
- }
-
- .weather-card {
- backdrop-filter: blur(20px);
- }
-
- .current-weather {
- backdrop-filter: blur(15px);
- }
+/* 背景样式文件 - 独立管理背景相关CSS */
+
+/* 主体背景 */
+body {
+ background: linear-gradient(135deg, #a8e6cf 0%, #dcedc8 50%, #f0f4c3 100%);
+ background-attachment: fixed;
+ background-size: cover;
+ position: relative;
+}
+
+/* 背景装饰元素 */
+body::before {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(circle at 20% 80%, rgba(120, 219, 226, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(168, 230, 207, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 40% 40%, rgba(220, 237, 200, 0.1) 0%, transparent 50%);
+ pointer-events: none;
+ z-index: -1;
+}
+
+/* 动态背景效果 */
+body::after {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background:
+ linear-gradient(45deg, transparent 30%, rgba(255, 255, 255, 0.05) 50%, transparent 70%),
+ linear-gradient(-45deg, transparent 30%, rgba(168, 230, 207, 0.05) 50%, transparent 70%);
+ background-size: 200px 200px;
+ animation: backgroundMove 20s linear infinite;
+ pointer-events: none;
+ z-index: -1;
+}
+
+/* 背景动画 */
+@keyframes backgroundMove {
+ 0% {
+ background-position: 0 0, 0 0;
+ }
+ 100% {
+ background-position: 200px 200px, -200px -200px;
+ }
+}
+
+/* 容器背景 */
+.container {
+ background: rgba(255, 255, 255, 0.1);
+ backdrop-filter: blur(5px);
+ border-radius: 20px;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+}
+
+/* 卡片背景增强 */
+.weather-card {
+ background: rgba(255, 255, 255, 0.95);
+ backdrop-filter: blur(15px);
+ border: 1px solid rgba(168, 230, 207, 0.3);
+ box-shadow:
+ 0 10px 30px rgba(0, 0, 0, 0.1),
+ 0 1px 8px rgba(168, 230, 207, 0.2),
+ inset 0 1px 0 rgba(255, 255, 255, 0.8);
+}
+
+/* 当前天气区域背景 */
+.current-weather {
+ background: linear-gradient(135deg,
+ rgba(168, 230, 207, 0.8) 0%,
+ rgba(220, 237, 200, 0.8) 50%,
+ rgba(240, 244, 195, 0.8) 100%);
+ backdrop-filter: blur(10px);
+ border: 1px solid rgba(255, 255, 255, 0.3);
+ box-shadow:
+ 0 4px 15px rgba(39, 174, 96, 0.1),
+ inset 0 1px 0 rgba(255, 255, 255, 0.6);
+}
+
+/* 详情项背景 */
+.detail-item {
+ background: linear-gradient(135deg,
+ rgba(168, 230, 207, 0.1) 0%,
+ rgba(255, 255, 255, 0.1) 100%);
+ backdrop-filter: blur(5px);
+ border: 1px solid rgba(168, 230, 207, 0.2);
+ box-shadow: 0 2px 8px rgba(39, 174, 96, 0.05);
+}
+
+/* 生活指数项背景 */
+.index-item {
+ background: linear-gradient(135deg,
+ rgba(168, 230, 207, 0.05) 0%,
+ rgba(255, 255, 255, 0.1) 100%);
+ backdrop-filter: blur(5px);
+ border: 1px solid rgba(168, 230, 207, 0.15);
+ box-shadow: 0 2px 10px rgba(39, 174, 96, 0.05);
+}
+
+.index-item:hover {
+ background: linear-gradient(135deg,
+ rgba(168, 230, 207, 0.1) 0%,
+ rgba(255, 255, 255, 0.15) 100%);
+ box-shadow: 0 5px 20px rgba(39, 174, 96, 0.1);
+}
+
+/* 输入框背景 */
+#cityInput {
+ background: rgba(255, 255, 255, 0.9);
+ backdrop-filter: blur(10px);
+ border: 2px solid rgba(168, 230, 207, 0.6);
+ box-shadow: 0 2px 10px rgba(39, 174, 96, 0.1);
+}
+
+#cityInput:focus {
+ background: rgba(255, 255, 255, 0.95);
+ box-shadow:
+ 0 0 15px rgba(39, 174, 96, 0.2),
+ 0 2px 10px rgba(39, 174, 96, 0.1);
+}
+
+/* 按钮背景 */
+#searchBtn {
+ background: linear-gradient(135deg,
+ #27ae60 0%,
+ #2ecc71 50%,
+ #58d68d 100%);
+ box-shadow:
+ 0 4px 15px rgba(39, 174, 96, 0.3),
+ inset 0 1px 0 rgba(255, 255, 255, 0.2);
+}
+
+#searchBtn:hover {
+ background: linear-gradient(135deg,
+ #229954 0%,
+ #27ae60 50%,
+ #52c370 100%);
+ box-shadow:
+ 0 6px 20px rgba(39, 174, 96, 0.4),
+ inset 0 1px 0 rgba(255, 255, 255, 0.3);
+}
+
+/* 错误消息背景 */
+.error-message {
+ background: linear-gradient(135deg,
+ rgba(231, 76, 60, 0.1) 0%,
+ rgba(255, 255, 255, 0.1) 100%);
+ backdrop-filter: blur(10px);
+ border: 1px solid rgba(231, 76, 60, 0.2);
+ box-shadow: 0 4px 15px rgba(231, 76, 60, 0.1);
+}
+
+/* 加载状态背景 */
+.loading {
+ background: rgba(255, 255, 255, 0.8);
+ backdrop-filter: blur(10px);
+ border-radius: 15px;
+ border: 1px solid rgba(168, 230, 207, 0.3);
+ box-shadow: 0 4px 15px rgba(39, 174, 96, 0.1);
+}
+
+/* 移动端背景优化 */
+@media (max-width: 767px) {
+ body::after {
+ background-size: 100px 100px;
+ animation-duration: 15s;
+ }
+
+ .container {
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(3px);
+ }
+
+ .weather-card {
+ backdrop-filter: blur(10px);
+ }
+}
+
+/* 高性能设备背景增强 */
+@media (min-width: 1024px) {
+ body::before {
+ background-image:
+ radial-gradient(circle at 20% 80%, rgba(120, 219, 226, 0.15) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(168, 230, 207, 0.15) 0%, transparent 50%),
+ radial-gradient(circle at 40% 40%, rgba(220, 237, 200, 0.15) 0%, transparent 50%),
+ radial-gradient(circle at 60% 70%, rgba(240, 244, 195, 0.1) 0%, transparent 50%);
+ }
+
+ .weather-card {
+ backdrop-filter: blur(20px);
+ }
+
+ .current-weather {
+ backdrop-filter: blur(15px);
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/index.html b/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/index.html
index 5a632718..50672d90 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/index.html
+++ b/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/index.html
@@ -1,143 +1,143 @@
-
-
-
-
-
- 实时天气查询
-
-
-
-
-
-
-
-
- 正在加载天气数据...
-
-
-
-
-
-
-
-
- 体感温度
- --°C
-
-
- 湿度
- --%
-
-
- 风向
- --
-
-
- 风力
- --
-
-
- 气压
- -- hPa
-
-
- 能见度
- --
-
-
- 空气质量
- AQI --
-
-
- PM2.5
- -- μg/m³
-
-
-
-
-
-
-
-
获取天气数据失败,请检查网络连接或稍后重试
-
-
-
-
-
-
+
+
+
+
+
+ 实时天气查询
+
+
+
+
+
+
+
+
+ 正在加载天气数据...
+
+
+
+
+
+
+
+
+ 体感温度
+ --°C
+
+
+ 湿度
+ --%
+
+
+ 风向
+ --
+
+
+ 风力
+ --
+
+
+ 气压
+ -- hPa
+
+
+ 能见度
+ --
+
+
+ 空气质量
+ AQI --
+
+
+ PM2.5
+ -- μg/m³
+
+
+
+
+
+
+
+
获取天气数据失败,请检查网络连接或稍后重试
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/script.js b/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/script.js
index bb339d26..c1a3055f 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/script.js
+++ b/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/script.js
@@ -1,354 +1,354 @@
-// 天气应用主要功能
-class WeatherApp {
- constructor() {
- this.apiUrl = 'https://60s.api.shumengya.top/v2/weather';
- this.init();
- }
-
- init() {
- this.bindEvents();
- this.loadWeather('北京'); // 默认加载北京天气
- }
-
- bindEvents() {
- const searchBtn = document.getElementById('searchBtn');
- const cityInput = document.getElementById('cityInput');
-
- // 搜索按钮点击事件
- searchBtn.addEventListener('click', () => {
- const city = cityInput.value.trim();
- if (city) {
- this.loadWeather(city);
- }
- });
-
- // 输入框回车事件
- cityInput.addEventListener('keypress', (e) => {
- if (e.key === 'Enter') {
- const city = cityInput.value.trim();
- if (city) {
- this.loadWeather(city);
- }
- }
- });
- }
-
- async loadWeather(city) {
- this.showLoading();
-
- try {
- const response = await fetch(`${this.apiUrl}?query=${encodeURIComponent(city)}`);
-
- if (!response.ok) {
- throw new Error(`HTTP错误: ${response.status}`);
- }
-
- const data = await response.json();
- console.log('完整API响应:', data); // 调试日志
-
- if (data.code === 200 && data.data) {
- this.displayWeather(data.data);
- this.hideLoading();
- } else {
- throw new Error(data.message || `API返回错误: code=${data.code}`);
- }
- } catch (error) {
- console.error('获取天气数据失败:', error);
- console.error('错误详情:', {
- message: error.message,
- stack: error.stack
- });
- this.showError(error.message);
- this.hideLoading();
- }
- }
-
- showLoading() {
- document.getElementById('loading').style.display = 'block';
- document.getElementById('weatherCard').style.display = 'none';
- document.getElementById('errorMessage').style.display = 'none';
- }
-
- hideLoading() {
- document.getElementById('loading').style.display = 'none';
- }
-
- showError(message = '获取天气数据失败,请检查网络连接或稍后重试') {
- const errorElement = document.getElementById('errorMessage');
- const errorText = errorElement.querySelector('p');
-
- if (errorText) {
- errorText.textContent = message;
- }
-
- errorElement.style.display = 'block';
- document.getElementById('weatherCard').style.display = 'none';
- }
-
- displayWeather(data) {
- console.log('API返回数据:', data); // 调试日志
-
- // 根据实际API结构解构数据
- const location = data.location || {};
- const realtime = data.realtime || {};
- const air_quality = realtime.air_quality || {};
- const life_indices = realtime.life_indices || [];
-
- // 显示位置信息
- const locationName = location.formatted || location.city || location.name || '未知位置';
- document.getElementById('locationName').textContent = locationName;
-
- const updateTime = realtime.updated || '未知时间';
- document.getElementById('updateTime').textContent = `更新时间: ${updateTime}`;
-
- // 显示当前天气
- const temperature = realtime.temperature !== undefined ? realtime.temperature : '--';
- document.getElementById('temperature').textContent = `${temperature}°C`;
-
- const condition = realtime.weather || realtime.weather_desc || '未知';
- document.getElementById('weatherDesc').textContent = condition;
- document.getElementById('weatherIcon').textContent = this.getWeatherIcon(condition);
-
- // 显示天气详情
- const feelsLike = realtime.temperature_feels_like !== undefined ? realtime.temperature_feels_like : temperature;
- document.getElementById('feelsLike').textContent = `${feelsLike}°C`;
-
- const humidity = realtime.humidity !== undefined ? realtime.humidity : '--';
- document.getElementById('humidity').textContent = `${humidity}%`;
-
- const windDirection = realtime.wind_direction || '--';
- document.getElementById('windDirection').textContent = windDirection;
-
- const windPower = realtime.wind_power || realtime.wind_strength || '--';
- document.getElementById('windStrength').textContent = windPower;
-
- const pressure = realtime.pressure !== undefined ? realtime.pressure : '--';
- document.getElementById('pressure').textContent = `${pressure} hPa`;
-
- document.getElementById('visibility').textContent = '--'; // API中没有能见度数据
-
- const aqi = air_quality.aqi !== undefined ? air_quality.aqi : '--';
- document.getElementById('aqi').textContent = `AQI ${aqi}`;
-
- const pm25 = air_quality.pm25 !== undefined ? air_quality.pm25 : '--';
- document.getElementById('pm25').textContent = `${pm25} μg/m³`;
-
- // 显示生活指数
- if (life_indices && life_indices.length > 0) {
- this.displayLifeIndex(life_indices);
- } else {
- // 如果没有生活指数数据,重置显示
- this.resetLifeIndex();
- }
-
- // 显示天气卡片
- document.getElementById('weatherCard').style.display = 'block';
- }
-
- displayLifeIndex(lifeIndices) {
- const indexMap = {
- comfort: { level: 'comfortLevel', desc: 'comfortDesc' },
- clothes: { level: 'clothingLevel', desc: 'clothingDesc' },
- umbrella: { level: 'umbrellaLevel', desc: 'umbrellaDesc' },
- ultraviolet: { level: 'uvLevel', desc: 'uvDesc' },
- carwash: { level: 'carWashLevel', desc: 'carWashDesc' },
- tourism: { level: 'travelLevel', desc: 'travelDesc' },
- sports: { level: 'sportLevel', desc: 'sportDesc' }
- };
-
- // 重置所有指数显示
- this.resetLifeIndex();
-
- // 根据新的API数据结构更新生活指数
- if (Array.isArray(lifeIndices)) {
- lifeIndices.forEach(index => {
- if (index && index.key && indexMap[index.key]) {
- const { level, desc } = indexMap[index.key];
- const levelElement = document.getElementById(level);
- const descElement = document.getElementById(desc);
-
- if (levelElement) levelElement.textContent = index.level || '--';
- if (descElement) descElement.textContent = index.description || '--';
- }
- });
- }
- }
-
- resetLifeIndex() {
- const indexMap = {
- comfort: { level: 'comfortLevel', desc: 'comfortDesc' },
- clothes: { level: 'clothingLevel', desc: 'clothingDesc' },
- umbrella: { level: 'umbrellaLevel', desc: 'umbrellaDesc' },
- ultraviolet: { level: 'uvLevel', desc: 'uvDesc' },
- carwash: { level: 'carWashLevel', desc: 'carWashDesc' },
- tourism: { level: 'travelLevel', desc: 'travelDesc' },
- sports: { level: 'sportLevel', desc: 'sportDesc' }
- };
-
- Object.values(indexMap).forEach(({ level, desc }) => {
- const levelElement = document.getElementById(level);
- const descElement = document.getElementById(desc);
-
- if (levelElement) levelElement.textContent = '--';
- if (descElement) descElement.textContent = '--';
- });
- }
-
- getWeatherIcon(weather) {
- const iconMap = {
- '晴': '☀️',
- '多云': '⛅',
- '阴': '☁️',
- '小雨': '🌦️',
- '中雨': '🌧️',
- '大雨': '⛈️',
- '雷阵雨': '⛈️',
- '雪': '❄️',
- '小雪': '🌨️',
- '中雪': '❄️',
- '大雪': '❄️',
- '雾': '🌫️',
- '霾': '😷',
- '沙尘暴': '🌪️'
- };
-
- // 查找匹配的天气图标
- for (const [key, icon] of Object.entries(iconMap)) {
- if (weather.includes(key)) {
- return icon;
- }
- }
-
- // 默认图标
- return '🌤️';
- }
-
- // 获取空气质量等级颜色
- getAQIColor(aqi) {
- if (aqi <= 50) return '#00e400';
- if (aqi <= 100) return '#ffff00';
- if (aqi <= 150) return '#ff7e00';
- if (aqi <= 200) return '#ff0000';
- if (aqi <= 300) return '#8f3f97';
- return '#7e0023';
- }
-
- // 格式化时间
- formatTime(timeString) {
- try {
- const date = new Date(timeString);
- return date.toLocaleString('zh-CN', {
- year: 'numeric',
- month: '2-digit',
- day: '2-digit',
- hour: '2-digit',
- minute: '2-digit'
- });
- } catch (error) {
- return timeString;
- }
- }
-}
-
-// 页面加载完成后初始化应用
-document.addEventListener('DOMContentLoaded', () => {
- new WeatherApp();
-});
-
-// 添加一些实用的工具函数
-const utils = {
- // 防抖函数
- debounce(func, wait) {
- let timeout;
- return function executedFunction(...args) {
- const later = () => {
- clearTimeout(timeout);
- func(...args);
- };
- clearTimeout(timeout);
- timeout = setTimeout(later, wait);
- };
- },
-
- // 节流函数
- throttle(func, limit) {
- let inThrottle;
- return function() {
- const args = arguments;
- const context = this;
- if (!inThrottle) {
- func.apply(context, args);
- inThrottle = true;
- setTimeout(() => inThrottle = false, limit);
- }
- };
- },
-
- // 检查网络状态
- checkNetworkStatus() {
- return navigator.onLine;
- },
-
- // 显示提示消息
- showToast(message, type = 'info') {
- const toast = document.createElement('div');
- toast.className = `toast toast-${type}`;
- toast.textContent = message;
- toast.style.cssText = `
- position: fixed;
- top: 20px;
- right: 20px;
- padding: 12px 20px;
- background: ${type === 'error' ? '#e74c3c' : '#27ae60'};
- color: white;
- border-radius: 8px;
- z-index: 1000;
- animation: slideIn 0.3s ease;
- `;
-
- document.body.appendChild(toast);
-
- setTimeout(() => {
- toast.style.animation = 'slideOut 0.3s ease';
- setTimeout(() => {
- document.body.removeChild(toast);
- }, 300);
- }, 3000);
- }
-};
-
-// 添加CSS动画
-const style = document.createElement('style');
-style.textContent = `
- @keyframes slideIn {
- from {
- transform: translateX(100%);
- opacity: 0;
- }
- to {
- transform: translateX(0);
- opacity: 1;
- }
- }
-
- @keyframes slideOut {
- from {
- transform: translateX(0);
- opacity: 1;
- }
- to {
- transform: translateX(100%);
- opacity: 0;
- }
- }
-`;
-document.head.appendChild(style);
-
-// 网络状态监听
-window.addEventListener('online', () => {
- utils.showToast('网络连接已恢复', 'success');
-});
-
-window.addEventListener('offline', () => {
- utils.showToast('网络连接已断开', 'error');
+// 天气应用主要功能
+class WeatherApp {
+ constructor() {
+ this.apiUrl = 'https://60s.api.shumengya.top/v2/weather';
+ this.init();
+ }
+
+ init() {
+ this.bindEvents();
+ this.loadWeather('北京'); // 默认加载北京天气
+ }
+
+ bindEvents() {
+ const searchBtn = document.getElementById('searchBtn');
+ const cityInput = document.getElementById('cityInput');
+
+ // 搜索按钮点击事件
+ searchBtn.addEventListener('click', () => {
+ const city = cityInput.value.trim();
+ if (city) {
+ this.loadWeather(city);
+ }
+ });
+
+ // 输入框回车事件
+ cityInput.addEventListener('keypress', (e) => {
+ if (e.key === 'Enter') {
+ const city = cityInput.value.trim();
+ if (city) {
+ this.loadWeather(city);
+ }
+ }
+ });
+ }
+
+ async loadWeather(city) {
+ this.showLoading();
+
+ try {
+ const response = await fetch(`${this.apiUrl}?query=${encodeURIComponent(city)}`);
+
+ if (!response.ok) {
+ throw new Error(`HTTP错误: ${response.status}`);
+ }
+
+ const data = await response.json();
+ console.log('完整API响应:', data); // 调试日志
+
+ if (data.code === 200 && data.data) {
+ this.displayWeather(data.data);
+ this.hideLoading();
+ } else {
+ throw new Error(data.message || `API返回错误: code=${data.code}`);
+ }
+ } catch (error) {
+ console.error('获取天气数据失败:', error);
+ console.error('错误详情:', {
+ message: error.message,
+ stack: error.stack
+ });
+ this.showError(error.message);
+ this.hideLoading();
+ }
+ }
+
+ showLoading() {
+ document.getElementById('loading').style.display = 'block';
+ document.getElementById('weatherCard').style.display = 'none';
+ document.getElementById('errorMessage').style.display = 'none';
+ }
+
+ hideLoading() {
+ document.getElementById('loading').style.display = 'none';
+ }
+
+ showError(message = '获取天气数据失败,请检查网络连接或稍后重试') {
+ const errorElement = document.getElementById('errorMessage');
+ const errorText = errorElement.querySelector('p');
+
+ if (errorText) {
+ errorText.textContent = message;
+ }
+
+ errorElement.style.display = 'block';
+ document.getElementById('weatherCard').style.display = 'none';
+ }
+
+ displayWeather(data) {
+ console.log('API返回数据:', data); // 调试日志
+
+ // 根据实际API结构解构数据
+ const location = data.location || {};
+ const realtime = data.realtime || {};
+ const air_quality = realtime.air_quality || {};
+ const life_indices = realtime.life_indices || [];
+
+ // 显示位置信息
+ const locationName = location.formatted || location.city || location.name || '未知位置';
+ document.getElementById('locationName').textContent = locationName;
+
+ const updateTime = realtime.updated || '未知时间';
+ document.getElementById('updateTime').textContent = `更新时间: ${updateTime}`;
+
+ // 显示当前天气
+ const temperature = realtime.temperature !== undefined ? realtime.temperature : '--';
+ document.getElementById('temperature').textContent = `${temperature}°C`;
+
+ const condition = realtime.weather || realtime.weather_desc || '未知';
+ document.getElementById('weatherDesc').textContent = condition;
+ document.getElementById('weatherIcon').textContent = this.getWeatherIcon(condition);
+
+ // 显示天气详情
+ const feelsLike = realtime.temperature_feels_like !== undefined ? realtime.temperature_feels_like : temperature;
+ document.getElementById('feelsLike').textContent = `${feelsLike}°C`;
+
+ const humidity = realtime.humidity !== undefined ? realtime.humidity : '--';
+ document.getElementById('humidity').textContent = `${humidity}%`;
+
+ const windDirection = realtime.wind_direction || '--';
+ document.getElementById('windDirection').textContent = windDirection;
+
+ const windPower = realtime.wind_power || realtime.wind_strength || '--';
+ document.getElementById('windStrength').textContent = windPower;
+
+ const pressure = realtime.pressure !== undefined ? realtime.pressure : '--';
+ document.getElementById('pressure').textContent = `${pressure} hPa`;
+
+ document.getElementById('visibility').textContent = '--'; // API中没有能见度数据
+
+ const aqi = air_quality.aqi !== undefined ? air_quality.aqi : '--';
+ document.getElementById('aqi').textContent = `AQI ${aqi}`;
+
+ const pm25 = air_quality.pm25 !== undefined ? air_quality.pm25 : '--';
+ document.getElementById('pm25').textContent = `${pm25} μg/m³`;
+
+ // 显示生活指数
+ if (life_indices && life_indices.length > 0) {
+ this.displayLifeIndex(life_indices);
+ } else {
+ // 如果没有生活指数数据,重置显示
+ this.resetLifeIndex();
+ }
+
+ // 显示天气卡片
+ document.getElementById('weatherCard').style.display = 'block';
+ }
+
+ displayLifeIndex(lifeIndices) {
+ const indexMap = {
+ comfort: { level: 'comfortLevel', desc: 'comfortDesc' },
+ clothes: { level: 'clothingLevel', desc: 'clothingDesc' },
+ umbrella: { level: 'umbrellaLevel', desc: 'umbrellaDesc' },
+ ultraviolet: { level: 'uvLevel', desc: 'uvDesc' },
+ carwash: { level: 'carWashLevel', desc: 'carWashDesc' },
+ tourism: { level: 'travelLevel', desc: 'travelDesc' },
+ sports: { level: 'sportLevel', desc: 'sportDesc' }
+ };
+
+ // 重置所有指数显示
+ this.resetLifeIndex();
+
+ // 根据新的API数据结构更新生活指数
+ if (Array.isArray(lifeIndices)) {
+ lifeIndices.forEach(index => {
+ if (index && index.key && indexMap[index.key]) {
+ const { level, desc } = indexMap[index.key];
+ const levelElement = document.getElementById(level);
+ const descElement = document.getElementById(desc);
+
+ if (levelElement) levelElement.textContent = index.level || '--';
+ if (descElement) descElement.textContent = index.description || '--';
+ }
+ });
+ }
+ }
+
+ resetLifeIndex() {
+ const indexMap = {
+ comfort: { level: 'comfortLevel', desc: 'comfortDesc' },
+ clothes: { level: 'clothingLevel', desc: 'clothingDesc' },
+ umbrella: { level: 'umbrellaLevel', desc: 'umbrellaDesc' },
+ ultraviolet: { level: 'uvLevel', desc: 'uvDesc' },
+ carwash: { level: 'carWashLevel', desc: 'carWashDesc' },
+ tourism: { level: 'travelLevel', desc: 'travelDesc' },
+ sports: { level: 'sportLevel', desc: 'sportDesc' }
+ };
+
+ Object.values(indexMap).forEach(({ level, desc }) => {
+ const levelElement = document.getElementById(level);
+ const descElement = document.getElementById(desc);
+
+ if (levelElement) levelElement.textContent = '--';
+ if (descElement) descElement.textContent = '--';
+ });
+ }
+
+ getWeatherIcon(weather) {
+ const iconMap = {
+ '晴': '☀️',
+ '多云': '⛅',
+ '阴': '☁️',
+ '小雨': '🌦️',
+ '中雨': '🌧️',
+ '大雨': '⛈️',
+ '雷阵雨': '⛈️',
+ '雪': '❄️',
+ '小雪': '🌨️',
+ '中雪': '❄️',
+ '大雪': '❄️',
+ '雾': '🌫️',
+ '霾': '😷',
+ '沙尘暴': '🌪️'
+ };
+
+ // 查找匹配的天气图标
+ for (const [key, icon] of Object.entries(iconMap)) {
+ if (weather.includes(key)) {
+ return icon;
+ }
+ }
+
+ // 默认图标
+ return '🌤️';
+ }
+
+ // 获取空气质量等级颜色
+ getAQIColor(aqi) {
+ if (aqi <= 50) return '#00e400';
+ if (aqi <= 100) return '#ffff00';
+ if (aqi <= 150) return '#ff7e00';
+ if (aqi <= 200) return '#ff0000';
+ if (aqi <= 300) return '#8f3f97';
+ return '#7e0023';
+ }
+
+ // 格式化时间
+ formatTime(timeString) {
+ try {
+ const date = new Date(timeString);
+ return date.toLocaleString('zh-CN', {
+ year: 'numeric',
+ month: '2-digit',
+ day: '2-digit',
+ hour: '2-digit',
+ minute: '2-digit'
+ });
+ } catch (error) {
+ return timeString;
+ }
+ }
+}
+
+// 页面加载完成后初始化应用
+document.addEventListener('DOMContentLoaded', () => {
+ new WeatherApp();
+});
+
+// 添加一些实用的工具函数
+const utils = {
+ // 防抖函数
+ debounce(func, wait) {
+ let timeout;
+ return function executedFunction(...args) {
+ const later = () => {
+ clearTimeout(timeout);
+ func(...args);
+ };
+ clearTimeout(timeout);
+ timeout = setTimeout(later, wait);
+ };
+ },
+
+ // 节流函数
+ throttle(func, limit) {
+ let inThrottle;
+ return function() {
+ const args = arguments;
+ const context = this;
+ if (!inThrottle) {
+ func.apply(context, args);
+ inThrottle = true;
+ setTimeout(() => inThrottle = false, limit);
+ }
+ };
+ },
+
+ // 检查网络状态
+ checkNetworkStatus() {
+ return navigator.onLine;
+ },
+
+ // 显示提示消息
+ showToast(message, type = 'info') {
+ const toast = document.createElement('div');
+ toast.className = `toast toast-${type}`;
+ toast.textContent = message;
+ toast.style.cssText = `
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ padding: 12px 20px;
+ background: ${type === 'error' ? '#e74c3c' : '#27ae60'};
+ color: white;
+ border-radius: 8px;
+ z-index: 1000;
+ animation: slideIn 0.3s ease;
+ `;
+
+ document.body.appendChild(toast);
+
+ setTimeout(() => {
+ toast.style.animation = 'slideOut 0.3s ease';
+ setTimeout(() => {
+ document.body.removeChild(toast);
+ }, 300);
+ }, 3000);
+ }
+};
+
+// 添加CSS动画
+const style = document.createElement('style');
+style.textContent = `
+ @keyframes slideIn {
+ from {
+ transform: translateX(100%);
+ opacity: 0;
+ }
+ to {
+ transform: translateX(0);
+ opacity: 1;
+ }
+ }
+
+ @keyframes slideOut {
+ from {
+ transform: translateX(0);
+ opacity: 1;
+ }
+ to {
+ transform: translateX(100%);
+ opacity: 0;
+ }
+ }
+`;
+document.head.appendChild(style);
+
+// 网络状态监听
+window.addEventListener('online', () => {
+ utils.showToast('网络连接已恢复', 'success');
+});
+
+window.addEventListener('offline', () => {
+ utils.showToast('网络连接已断开', 'error');
});
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/styles.css b/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/styles.css
index 88113f63..48d72491 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/styles.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/styles.css
@@ -1,442 +1,442 @@
-/* 基础样式重置 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: 'Microsoft YaHei', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif;
- line-height: 1.6;
- color: #2c3e50;
- min-height: 100vh;
-}
-
-.container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 20px;
- min-height: 100vh;
-}
-
-/* 头部样式 */
-.header {
- text-align: center;
- margin-bottom: 30px;
-}
-
-.header h1 {
- font-size: 2.5rem;
- color: #27ae60;
- margin-bottom: 20px;
- font-weight: 300;
- text-shadow: 0 2px 4px rgba(39, 174, 96, 0.1);
-}
-
-.search-box {
- display: flex;
- justify-content: center;
- gap: 10px;
- margin-bottom: 20px;
-}
-
-#cityInput {
- padding: 12px 16px;
- border: 2px solid #a8e6cf;
- border-radius: 25px;
- font-size: 16px;
- outline: none;
- background: rgba(255, 255, 255, 0.9);
- transition: all 0.3s ease;
- min-width: 200px;
-}
-
-#cityInput:focus {
- border-color: #27ae60;
- box-shadow: 0 0 10px rgba(39, 174, 96, 0.2);
-}
-
-#searchBtn {
- padding: 12px 24px;
- background: linear-gradient(135deg, #27ae60, #2ecc71);
- color: white;
- border: none;
- border-radius: 25px;
- font-size: 16px;
- cursor: pointer;
- transition: all 0.3s ease;
- box-shadow: 0 4px 15px rgba(39, 174, 96, 0.3);
-}
-
-#searchBtn:hover {
- transform: translateY(-2px);
- box-shadow: 0 6px 20px rgba(39, 174, 96, 0.4);
-}
-
-#searchBtn:active {
- transform: translateY(0);
-}
-
-/* 主要内容区域 */
-.main-content {
- display: flex;
- justify-content: center;
- align-items: flex-start;
-}
-
-.loading {
- text-align: center;
- font-size: 18px;
- color: #27ae60;
- padding: 40px;
-}
-
-.weather-card {
- background: rgba(255, 255, 255, 0.95);
- border-radius: 20px;
- padding: 30px;
- box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
- backdrop-filter: blur(10px);
- border: 1px solid rgba(168, 230, 207, 0.3);
- width: 100%;
- max-width: 800px;
-}
-
-/* 位置信息 */
-.location-info {
- text-align: center;
- margin-bottom: 30px;
- padding-bottom: 20px;
- border-bottom: 2px solid #a8e6cf;
-}
-
-.location-info h2 {
- font-size: 2rem;
- color: #27ae60;
- margin-bottom: 10px;
-}
-
-.location-info p {
- color: #7f8c8d;
- font-size: 14px;
-}
-
-/* 当前天气 */
-.current-weather {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 30px;
- padding: 20px;
- background: linear-gradient(135deg, #a8e6cf, #dcedc8);
- border-radius: 15px;
-}
-
-.temperature-section {
- display: flex;
- flex-direction: column;
- align-items: flex-start;
-}
-
-.temperature {
- font-size: 3.5rem;
- font-weight: 300;
- color: #27ae60;
- line-height: 1;
-}
-
-.weather-desc {
- font-size: 1.2rem;
- color: #2c3e50;
- margin-top: 5px;
-}
-
-.weather-icon {
- font-size: 4rem;
- opacity: 0.8;
-}
-
-/* 天气详情 */
-.weather-details {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
- gap: 15px;
- margin-bottom: 30px;
-}
-
-.detail-item {
- display: flex;
- justify-content: space-between;
- align-items: center;
- padding: 15px;
- background: rgba(168, 230, 207, 0.1);
- border-radius: 10px;
- border-left: 4px solid #27ae60;
-}
-
-.detail-item .label {
- color: #7f8c8d;
- font-size: 14px;
-}
-
-.detail-item .value {
- color: #2c3e50;
- font-weight: 500;
- font-size: 16px;
-}
-
-/* 生活指数 */
-.life-index h3 {
- color: #27ae60;
- margin-bottom: 20px;
- font-size: 1.5rem;
- text-align: center;
-}
-
-.index-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
- gap: 20px;
-}
-
-.index-item {
- display: flex;
- align-items: flex-start;
- padding: 20px;
- background: rgba(168, 230, 207, 0.05);
- border-radius: 15px;
- border: 1px solid rgba(168, 230, 207, 0.2);
- transition: all 0.3s ease;
-}
-
-.index-item:hover {
- transform: translateY(-2px);
- box-shadow: 0 5px 15px rgba(39, 174, 96, 0.1);
-}
-
-.index-icon {
- font-size: 2rem;
- margin-right: 15px;
- opacity: 0.8;
-}
-
-.index-content {
- flex: 1;
-}
-
-.index-title {
- font-weight: 500;
- color: #2c3e50;
- margin-bottom: 5px;
-}
-
-.index-level {
- color: #27ae60;
- font-weight: 600;
- margin-bottom: 5px;
-}
-
-.index-desc {
- color: #7f8c8d;
- font-size: 14px;
- line-height: 1.4;
-}
-
-.error-message {
- text-align: center;
- padding: 40px;
- color: #e74c3c;
- background: rgba(231, 76, 60, 0.1);
- border-radius: 15px;
- border: 1px solid rgba(231, 76, 60, 0.2);
-}
-
-/* 平板端适配 (768px - 1024px) */
-@media (min-width: 768px) and (max-width: 1024px) {
- .container {
- padding: 25px;
- }
-
- .header h1 {
- font-size: 2.8rem;
- }
-
- .search-box {
- max-width: 500px;
- margin: 0 auto 20px;
- }
-
- .weather-details {
- grid-template-columns: repeat(2, 1fr);
- }
-
- .index-grid {
- grid-template-columns: repeat(2, 1fr);
- }
-
- .current-weather {
- padding: 25px;
- }
-
- .temperature {
- font-size: 4rem;
- }
-}
-
-/* 电脑端适配 (1024px+) */
-@media (min-width: 1024px) {
- .container {
- padding: 40px;
- }
-
- .header h1 {
- font-size: 3.2rem;
- }
-
- .search-box {
- max-width: 600px;
- margin: 0 auto 30px;
- }
-
- .weather-card {
- padding: 40px;
- }
-
- .weather-details {
- grid-template-columns: repeat(4, 1fr);
- }
-
- .index-grid {
- grid-template-columns: repeat(3, 1fr);
- }
-
- .current-weather {
- padding: 30px;
- }
-
- .temperature {
- font-size: 4.5rem;
- }
-
- .index-item {
- padding: 25px;
- }
-}
-
-/* 手机端适配 (优先优化) */
-@media (max-width: 767px) {
- .container {
- padding: 15px;
- }
-
- .header h1 {
- font-size: 2rem;
- margin-bottom: 15px;
- }
-
- .search-box {
- flex-direction: column;
- align-items: center;
- gap: 15px;
- }
-
- #cityInput {
- width: 100%;
- max-width: 300px;
- font-size: 16px;
- }
-
- #searchBtn {
- width: 100%;
- max-width: 300px;
- padding: 14px 24px;
- }
-
- .weather-card {
- padding: 20px;
- margin: 0;
- }
-
- .current-weather {
- flex-direction: column;
- text-align: center;
- gap: 20px;
- padding: 20px;
- }
-
- .temperature {
- font-size: 3rem;
- }
-
- .weather-icon {
- font-size: 3rem;
- }
-
- .weather-details {
- grid-template-columns: 1fr;
- gap: 10px;
- }
-
- .detail-item {
- padding: 12px;
- }
-
- .index-grid {
- grid-template-columns: 1fr;
- gap: 15px;
- }
-
- .index-item {
- padding: 15px;
- }
-
- .index-icon {
- font-size: 1.5rem;
- margin-right: 10px;
- }
-
- .life-index h3 {
- font-size: 1.3rem;
- margin-bottom: 15px;
- }
-
- .location-info h2 {
- font-size: 1.5rem;
- }
-}
-
-/* 超小屏幕适配 */
-@media (max-width: 480px) {
- .container {
- padding: 10px;
- }
-
- .header h1 {
- font-size: 1.8rem;
- }
-
- .weather-card {
- padding: 15px;
- }
-
- .temperature {
- font-size: 2.5rem;
- }
-
- .current-weather {
- padding: 15px;
- }
-
- .detail-item {
- padding: 10px;
- font-size: 14px;
- }
-
- .index-item {
- padding: 12px;
- }
-
- .index-desc {
- font-size: 13px;
- }
+/* 基础样式重置 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Microsoft YaHei', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif;
+ line-height: 1.6;
+ color: #2c3e50;
+ min-height: 100vh;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+ min-height: 100vh;
+}
+
+/* 头部样式 */
+.header {
+ text-align: center;
+ margin-bottom: 30px;
+}
+
+.header h1 {
+ font-size: 2.5rem;
+ color: #27ae60;
+ margin-bottom: 20px;
+ font-weight: 300;
+ text-shadow: 0 2px 4px rgba(39, 174, 96, 0.1);
+}
+
+.search-box {
+ display: flex;
+ justify-content: center;
+ gap: 10px;
+ margin-bottom: 20px;
+}
+
+#cityInput {
+ padding: 12px 16px;
+ border: 2px solid #a8e6cf;
+ border-radius: 25px;
+ font-size: 16px;
+ outline: none;
+ background: rgba(255, 255, 255, 0.9);
+ transition: all 0.3s ease;
+ min-width: 200px;
+}
+
+#cityInput:focus {
+ border-color: #27ae60;
+ box-shadow: 0 0 10px rgba(39, 174, 96, 0.2);
+}
+
+#searchBtn {
+ padding: 12px 24px;
+ background: linear-gradient(135deg, #27ae60, #2ecc71);
+ color: white;
+ border: none;
+ border-radius: 25px;
+ font-size: 16px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ box-shadow: 0 4px 15px rgba(39, 174, 96, 0.3);
+}
+
+#searchBtn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 6px 20px rgba(39, 174, 96, 0.4);
+}
+
+#searchBtn:active {
+ transform: translateY(0);
+}
+
+/* 主要内容区域 */
+.main-content {
+ display: flex;
+ justify-content: center;
+ align-items: flex-start;
+}
+
+.loading {
+ text-align: center;
+ font-size: 18px;
+ color: #27ae60;
+ padding: 40px;
+}
+
+.weather-card {
+ background: rgba(255, 255, 255, 0.95);
+ border-radius: 20px;
+ padding: 30px;
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
+ backdrop-filter: blur(10px);
+ border: 1px solid rgba(168, 230, 207, 0.3);
+ width: 100%;
+ max-width: 800px;
+}
+
+/* 位置信息 */
+.location-info {
+ text-align: center;
+ margin-bottom: 30px;
+ padding-bottom: 20px;
+ border-bottom: 2px solid #a8e6cf;
+}
+
+.location-info h2 {
+ font-size: 2rem;
+ color: #27ae60;
+ margin-bottom: 10px;
+}
+
+.location-info p {
+ color: #7f8c8d;
+ font-size: 14px;
+}
+
+/* 当前天气 */
+.current-weather {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 30px;
+ padding: 20px;
+ background: linear-gradient(135deg, #a8e6cf, #dcedc8);
+ border-radius: 15px;
+}
+
+.temperature-section {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+}
+
+.temperature {
+ font-size: 3.5rem;
+ font-weight: 300;
+ color: #27ae60;
+ line-height: 1;
+}
+
+.weather-desc {
+ font-size: 1.2rem;
+ color: #2c3e50;
+ margin-top: 5px;
+}
+
+.weather-icon {
+ font-size: 4rem;
+ opacity: 0.8;
+}
+
+/* 天气详情 */
+.weather-details {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
+ gap: 15px;
+ margin-bottom: 30px;
+}
+
+.detail-item {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 15px;
+ background: rgba(168, 230, 207, 0.1);
+ border-radius: 10px;
+ border-left: 4px solid #27ae60;
+}
+
+.detail-item .label {
+ color: #7f8c8d;
+ font-size: 14px;
+}
+
+.detail-item .value {
+ color: #2c3e50;
+ font-weight: 500;
+ font-size: 16px;
+}
+
+/* 生活指数 */
+.life-index h3 {
+ color: #27ae60;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+ text-align: center;
+}
+
+.index-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
+ gap: 20px;
+}
+
+.index-item {
+ display: flex;
+ align-items: flex-start;
+ padding: 20px;
+ background: rgba(168, 230, 207, 0.05);
+ border-radius: 15px;
+ border: 1px solid rgba(168, 230, 207, 0.2);
+ transition: all 0.3s ease;
+}
+
+.index-item:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 5px 15px rgba(39, 174, 96, 0.1);
+}
+
+.index-icon {
+ font-size: 2rem;
+ margin-right: 15px;
+ opacity: 0.8;
+}
+
+.index-content {
+ flex: 1;
+}
+
+.index-title {
+ font-weight: 500;
+ color: #2c3e50;
+ margin-bottom: 5px;
+}
+
+.index-level {
+ color: #27ae60;
+ font-weight: 600;
+ margin-bottom: 5px;
+}
+
+.index-desc {
+ color: #7f8c8d;
+ font-size: 14px;
+ line-height: 1.4;
+}
+
+.error-message {
+ text-align: center;
+ padding: 40px;
+ color: #e74c3c;
+ background: rgba(231, 76, 60, 0.1);
+ border-radius: 15px;
+ border: 1px solid rgba(231, 76, 60, 0.2);
+}
+
+/* 平板端适配 (768px - 1024px) */
+@media (min-width: 768px) and (max-width: 1024px) {
+ .container {
+ padding: 25px;
+ }
+
+ .header h1 {
+ font-size: 2.8rem;
+ }
+
+ .search-box {
+ max-width: 500px;
+ margin: 0 auto 20px;
+ }
+
+ .weather-details {
+ grid-template-columns: repeat(2, 1fr);
+ }
+
+ .index-grid {
+ grid-template-columns: repeat(2, 1fr);
+ }
+
+ .current-weather {
+ padding: 25px;
+ }
+
+ .temperature {
+ font-size: 4rem;
+ }
+}
+
+/* 电脑端适配 (1024px+) */
+@media (min-width: 1024px) {
+ .container {
+ padding: 40px;
+ }
+
+ .header h1 {
+ font-size: 3.2rem;
+ }
+
+ .search-box {
+ max-width: 600px;
+ margin: 0 auto 30px;
+ }
+
+ .weather-card {
+ padding: 40px;
+ }
+
+ .weather-details {
+ grid-template-columns: repeat(4, 1fr);
+ }
+
+ .index-grid {
+ grid-template-columns: repeat(3, 1fr);
+ }
+
+ .current-weather {
+ padding: 30px;
+ }
+
+ .temperature {
+ font-size: 4.5rem;
+ }
+
+ .index-item {
+ padding: 25px;
+ }
+}
+
+/* 手机端适配 (优先优化) */
+@media (max-width: 767px) {
+ .container {
+ padding: 15px;
+ }
+
+ .header h1 {
+ font-size: 2rem;
+ margin-bottom: 15px;
+ }
+
+ .search-box {
+ flex-direction: column;
+ align-items: center;
+ gap: 15px;
+ }
+
+ #cityInput {
+ width: 100%;
+ max-width: 300px;
+ font-size: 16px;
+ }
+
+ #searchBtn {
+ width: 100%;
+ max-width: 300px;
+ padding: 14px 24px;
+ }
+
+ .weather-card {
+ padding: 20px;
+ margin: 0;
+ }
+
+ .current-weather {
+ flex-direction: column;
+ text-align: center;
+ gap: 20px;
+ padding: 20px;
+ }
+
+ .temperature {
+ font-size: 3rem;
+ }
+
+ .weather-icon {
+ font-size: 3rem;
+ }
+
+ .weather-details {
+ grid-template-columns: 1fr;
+ gap: 10px;
+ }
+
+ .detail-item {
+ padding: 12px;
+ }
+
+ .index-grid {
+ grid-template-columns: 1fr;
+ gap: 15px;
+ }
+
+ .index-item {
+ padding: 15px;
+ }
+
+ .index-icon {
+ font-size: 1.5rem;
+ margin-right: 10px;
+ }
+
+ .life-index h3 {
+ font-size: 1.3rem;
+ margin-bottom: 15px;
+ }
+
+ .location-info h2 {
+ font-size: 1.5rem;
+ }
+}
+
+/* 超小屏幕适配 */
+@media (max-width: 480px) {
+ .container {
+ padding: 10px;
+ }
+
+ .header h1 {
+ font-size: 1.8rem;
+ }
+
+ .weather-card {
+ padding: 15px;
+ }
+
+ .temperature {
+ font-size: 2.5rem;
+ }
+
+ .current-weather {
+ padding: 15px;
+ }
+
+ .detail-item {
+ padding: 10px;
+ font-size: 14px;
+ }
+
+ .index-item {
+ padding: 12px;
+ }
+
+ .index-desc {
+ font-size: 13px;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/返回接口.json
index 671a75a4..b4bb104b 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/实用功能/实时天气[目前有问题]/返回接口.json
@@ -1,68 +1,68 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "location": {
- "province": "北京",
- "city": "北京",
- "town": "北京",
- "formatted": "北京",
- "location_id": "101010100",
- "detail_url": "http://www.weather.com.cn/weather/101010100.shtml",
- "is_province": true,
- "is_city": false,
- "is_town": false,
- "area_code": "10",
- "zip_code": "100000"
- },
- "realtime": {
- "weather": "晴转雷阵雨",
- "weather_desc": "未知",
- "weather_code": "d0",
- "temperature": 999,
- "temperature_feels_like": 75.6,
- "humidity": 63,
- "wind_direction": "南风",
- "wind_strength": "3-4级转\u003C3级",
- "wind_speed": "1km/h",
- "pressure": 1006,
- "visibility": "21km",
- "aqi": 41,
- "pm25": 41,
- "rainfall": 0,
- "rainfall_24h": 0,
- "updated": "2025-09-08 08:00:00",
- "updated_at": "20:30",
- "life_index": {
- "comfort": {
- "level": "舒适",
- "desc": "白天温度宜人,风力不大。"
- },
- "clothing": {
- "level": "舒适",
- "desc": "建议穿长袖衬衫单裤等服装。"
- },
- "umbrella": {
- "level": "带伞",
- "desc": "有降水,短时间出行不必带伞。"
- },
- "uv": {
- "level": "最弱",
- "desc": "辐射弱,涂擦SPF8-12防晒护肤品。"
- },
- "car_wash": {
- "level": "不宜",
- "desc": "有雨,雨水和泥水会弄脏爱车。"
- },
- "travel": {
- "level": "一般",
- "desc": "可能有雷暴,外出请尽量避开降雨时段。"
- },
- "sport": {
- "level": "较不宜",
- "desc": "有降水,推荐您在室内进行休闲运动。"
- }
- }
- }
- }
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "location": {
+ "province": "北京",
+ "city": "北京",
+ "town": "北京",
+ "formatted": "北京",
+ "location_id": "101010100",
+ "detail_url": "http://www.weather.com.cn/weather/101010100.shtml",
+ "is_province": true,
+ "is_city": false,
+ "is_town": false,
+ "area_code": "10",
+ "zip_code": "100000"
+ },
+ "realtime": {
+ "weather": "晴转雷阵雨",
+ "weather_desc": "未知",
+ "weather_code": "d0",
+ "temperature": 999,
+ "temperature_feels_like": 75.6,
+ "humidity": 63,
+ "wind_direction": "南风",
+ "wind_strength": "3-4级转\u003C3级",
+ "wind_speed": "1km/h",
+ "pressure": 1006,
+ "visibility": "21km",
+ "aqi": 41,
+ "pm25": 41,
+ "rainfall": 0,
+ "rainfall_24h": 0,
+ "updated": "2025-09-08 08:00:00",
+ "updated_at": "20:30",
+ "life_index": {
+ "comfort": {
+ "level": "舒适",
+ "desc": "白天温度宜人,风力不大。"
+ },
+ "clothing": {
+ "level": "舒适",
+ "desc": "建议穿长袖衬衫单裤等服装。"
+ },
+ "umbrella": {
+ "level": "带伞",
+ "desc": "有降水,短时间出行不必带伞。"
+ },
+ "uv": {
+ "level": "最弱",
+ "desc": "辐射弱,涂擦SPF8-12防晒护肤品。"
+ },
+ "car_wash": {
+ "level": "不宜",
+ "desc": "有雨,雨水和泥水会弄脏爱车。"
+ },
+ "travel": {
+ "level": "一般",
+ "desc": "可能有雷暴,外出请尽量避开降雨时段。"
+ },
+ "sport": {
+ "level": "较不宜",
+ "desc": "有降水,推荐您在室内进行休闲运动。"
+ }
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/css/style.css b/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/css/style.css
index 563b0930..23f4dd41 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/css/style.css
@@ -1,893 +1,893 @@
-/* 基础样式重置 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-/* 隐藏滚动条但保留滚动功能 */
-html {
- scrollbar-width: none;
- -ms-overflow-style: none;
-}
-
-body::-webkit-scrollbar,
-html::-webkit-scrollbar,
-*::-webkit-scrollbar {
- display: none;
-}
-
-body {
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
- line-height: 1.6;
- color: #2c3e50;
- min-height: 100vh;
- overflow-x: hidden;
- background: linear-gradient(135deg, #f0f8e8 0%, #e8f5e8 50%, #d4f4dd 100%);
- scrollbar-width: none;
- -ms-overflow-style: none;
-}
-
-/* 容器布局 */
-.container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 20px;
- min-height: 100vh;
- display: flex;
- flex-direction: column;
-}
-
-/* 头部样式 */
-.header {
- text-align: center;
- margin-bottom: 40px;
- padding: 40px 20px;
- background: linear-gradient(135deg, #228B22 0%, #32CD32 100%);
- border-radius: 20px;
- box-shadow: 0 10px 30px rgba(34, 139, 34, 0.3);
- color: white;
-}
-
-.header h1 {
- font-size: 2.8rem;
- font-weight: 700;
- margin-bottom: 15px;
- text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
-}
-
-.subtitle {
- font-size: 1.2rem;
- opacity: 0.9;
- font-weight: 400;
-}
-
-/* 主内容区域 */
-.main-content {
- flex: 1;
- display: flex;
- flex-direction: column;
- gap: 30px;
-}
-
-/* 输入容器 */
-.input-container {
- background: #ffffff;
- border-radius: 20px;
- padding: 40px;
- box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1);
- border: 1px solid #e8ecf4;
-}
-
-.input-group {
- margin-bottom: 30px;
-}
-
-.input-label {
- display: block;
- font-size: 1.1rem;
- font-weight: 600;
- color: #2c3e50;
- margin-bottom: 15px;
-}
-
-.password-input-wrapper {
- position: relative;
- margin-bottom: 15px;
-}
-
-.password-input {
- width: 100%;
- padding: 18px 60px 18px 20px;
- border: 2px solid #e8ecf4;
- border-radius: 12px;
- font-size: 1.1rem;
- font-family: 'Courier New', monospace;
- background: #f8fafc;
- transition: all 0.3s ease;
- letter-spacing: 1px;
-}
-
-.password-input:focus {
- outline: none;
- border-color: #228B22;
- background: #ffffff;
- box-shadow: 0 0 0 4px rgba(34, 139, 34, 0.1);
-}
-
-.password-input::placeholder {
- color: #94a3b8;
- letter-spacing: normal;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
-}
-
-.toggle-visibility {
- position: absolute;
- right: 15px;
- top: 50%;
- transform: translateY(-50%);
- background: none;
- border: none;
- cursor: pointer;
- padding: 8px;
- border-radius: 6px;
- color: #64748b;
- transition: all 0.3s ease;
-}
-
-.toggle-visibility:hover {
- background: #f1f5f9;
- color: #475569;
-}
-
-.input-hint {
- display: flex;
- align-items: center;
- gap: 8px;
- color: #64748b;
- font-size: 0.9rem;
-}
-
-.hint-icon {
- font-size: 1rem;
-}
-
-/* 检测按钮 */
-.check-btn {
- width: 100%;
- background: linear-gradient(135deg, #228B22 0%, #32CD32 100%);
- color: white;
- border: none;
- padding: 18px 32px;
- border-radius: 12px;
- font-size: 1.1rem;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.3s ease;
- box-shadow: 0 4px 20px rgba(34, 139, 34, 0.3);
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 10px;
- position: relative;
- overflow: hidden;
-}
-
-.check-btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 6px 25px rgba(34, 139, 34, 0.4);
-}
-
-.check-btn:active {
- transform: translateY(0);
-}
-
-.check-btn:disabled {
- opacity: 0.7;
- cursor: not-allowed;
- transform: none;
-}
-
-.btn-icon {
- font-size: 1.2rem;
-}
-
-/* 结果容器 */
-.result-container {
- background: #ffffff;
- border-radius: 20px;
- padding: 40px;
- box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1);
- border: 1px solid #e8ecf4;
- animation: slideIn 0.5s ease-out;
-}
-
-@keyframes slideIn {
- from {
- opacity: 0;
- transform: translateY(30px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-/* 强度概览 */
-.strength-overview {
- margin-bottom: 40px;
- padding: 30px;
- background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);
- border-radius: 16px;
- border: 1px solid #e2e8f0;
-}
-
-.strength-score {
- display: flex;
- align-items: center;
- gap: 30px;
- margin-bottom: 25px;
-}
-
-.score-circle {
- width: 120px;
- height: 120px;
- border-radius: 50%;
- background: conic-gradient(from 0deg, #e2e8f0 0deg, #e2e8f0 360deg);
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- position: relative;
- transition: all 0.5s ease;
-}
-
-.score-circle::before {
- content: '';
- position: absolute;
- width: 90px;
- height: 90px;
- background: white;
- border-radius: 50%;
- z-index: 1;
-}
-
-.score-value {
- font-size: 2.5rem;
- font-weight: 700;
- color: #2c3e50;
- z-index: 2;
- position: relative;
-}
-
-.score-label {
- font-size: 0.9rem;
- color: #64748b;
- z-index: 2;
- position: relative;
-}
-
-.strength-info {
- flex: 1;
-}
-
-.strength-level {
- font-size: 2rem;
- font-weight: 700;
- margin-bottom: 8px;
- color: #2c3e50;
-}
-
-.strength-description {
- font-size: 1.1rem;
- color: #64748b;
- line-height: 1.5;
-}
-
-.strength-bar {
- margin-top: 20px;
-}
-
-.bar-background {
- width: 100%;
- height: 12px;
- background: #e2e8f0;
- border-radius: 6px;
- overflow: hidden;
- margin-bottom: 10px;
-}
-
-.bar-fill {
- height: 100%;
- background: linear-gradient(90deg, #90EE90, #98FB98, #32CD32, #228B22);
- border-radius: 6px;
- width: 0%;
- transition: width 0.8s ease;
-}
-
-.bar-labels {
- display: flex;
- justify-content: space-between;
- font-size: 0.85rem;
- color: #64748b;
-}
-
-/* 详细信息网格 */
-.details-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
- gap: 25px;
- margin-bottom: 30px;
-}
-
-.detail-card {
- background: #f8fafc;
- border-radius: 16px;
- padding: 25px;
- border: 1px solid #e2e8f0;
- transition: all 0.3s ease;
-}
-
-.detail-card:hover {
- transform: translateY(-2px);
- box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
-}
-
-.card-header {
- display: flex;
- align-items: center;
- gap: 12px;
- margin-bottom: 20px;
-}
-
-.card-icon {
- font-size: 1.5rem;
-}
-
-.card-header h3 {
- font-size: 1.3rem;
- font-weight: 600;
- color: #2c3e50;
-}
-
-.card-content {
- display: flex;
- flex-direction: column;
- gap: 15px;
-}
-
-.info-row {
- display: flex;
- justify-content: space-between;
- align-items: center;
- padding: 12px 0;
- border-bottom: 1px solid #e2e8f0;
-}
-
-.info-row:last-child {
- border-bottom: none;
-}
-
-.info-label {
- font-weight: 500;
- color: #64748b;
-}
-
-.info-value {
- font-weight: 600;
- color: #2c3e50;
-}
-
-/* 字符类型分析 */
-.character-types {
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: 12px;
- margin-bottom: 20px;
-}
-
-.char-type {
- display: flex;
- align-items: center;
- gap: 8px;
- padding: 10px 12px;
- background: white;
- border-radius: 8px;
- border: 1px solid #e2e8f0;
- font-size: 0.9rem;
-}
-
-.char-type.has-type {
- background: #f0f8e8;
- border-color: #d4f4dd;
- color: #1e7e1e;
-}
-
-.char-type.has-type .type-icon {
- color: #228B22;
-}
-
-.type-icon {
- font-size: 1rem;
-}
-
-.character-issues {
- display: flex;
- flex-direction: column;
- gap: 8px;
-}
-
-.issue-item {
- display: flex;
- align-items: center;
- gap: 8px;
- padding: 8px 12px;
- background: #fef2f2;
- border: 1px solid #fecaca;
- border-radius: 8px;
- color: #dc2626;
- font-size: 0.9rem;
-}
-
-.issue-item.hidden {
- display: none;
-}
-
-.issue-icon {
- font-size: 1rem;
-}
-
-/* 建议和提示区域 */
-.recommendations-section {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
- gap: 25px;
-}
-
-.recommendations-card,
-.security-tips-card {
- background: #f8fafc;
- border-radius: 16px;
- padding: 25px;
- border: 1px solid #e2e8f0;
-}
-
-.recommendations-list {
- list-style: none;
- display: flex;
- flex-direction: column;
- gap: 12px;
-}
-
-.recommendations-list li {
- display: flex;
- align-items: flex-start;
- gap: 10px;
- padding: 12px 16px;
- background: white;
- border-radius: 10px;
- border: 1px solid #e2e8f0;
- color: #2c3e50;
- line-height: 1.5;
-}
-
-.recommendations-list li::before {
- content: '💡';
- font-size: 1rem;
- margin-top: 2px;
- flex-shrink: 0;
-}
-
-.tips-container {
- display: flex;
- flex-direction: column;
- gap: 12px;
-}
-
-.tip-item {
- display: flex;
- align-items: flex-start;
- gap: 12px;
- padding: 12px 16px;
- background: white;
- border-radius: 10px;
- border: 1px solid #e2e8f0;
- color: #2c3e50;
- line-height: 1.5;
-}
-
-.tip-icon {
- font-size: 1rem;
- margin-top: 2px;
- flex-shrink: 0;
-}
-
-/* 错误容器 */
-.error-container {
- background: #ffffff;
- border-radius: 20px;
- padding: 50px 40px;
- text-align: center;
- box-shadow: 0 10px 40px rgba(239, 68, 68, 0.1);
- border: 1px solid #fecaca;
-}
-
-.error-icon {
- font-size: 4rem;
- margin-bottom: 20px;
-}
-
-.error-container h3 {
- color: #dc2626;
- margin-bottom: 15px;
- font-size: 1.5rem;
- font-weight: 600;
-}
-
-.error-container p {
- color: #64748b;
- margin-bottom: 25px;
- font-size: 1.1rem;
-}
-
-.retry-btn {
- background: #dc2626;
- color: white;
- border: none;
- padding: 14px 28px;
- border-radius: 10px;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.3s ease;
- font-size: 1rem;
-}
-
-.retry-btn:hover {
- background: #b91c1c;
- transform: translateY(-1px);
-}
-
-/* 页脚 */
-.footer {
- text-align: center;
- padding: 40px 20px;
- color: #64748b;
- margin-top: 40px;
-}
-
-.footer p {
- margin-bottom: 8px;
- font-size: 1rem;
-}
-
-.footer-note {
- font-size: 0.9rem;
- opacity: 0.8;
-}
-
-/* 提示框 */
-.toast {
- position: fixed;
- top: 20px;
- right: 20px;
- background: #228B22;
- color: white;
- padding: 16px 24px;
- border-radius: 10px;
- box-shadow: 0 4px 20px rgba(34, 139, 34, 0.3);
- z-index: 1000;
- animation: toastSlide 0.3s ease-out;
- font-weight: 500;
-}
-
-@keyframes toastSlide {
- from {
- transform: translateX(100%);
- opacity: 0;
- }
- to {
- transform: translateX(0);
- opacity: 1;
- }
-}
-
-/* 强度等级颜色 */
-.strength-weak {
- color: #dc2626 !important;
-}
-
-.strength-medium {
- color: #f59e0b !important;
-}
-
-.strength-strong {
- color: #228B22 !important;
-}
-
-.strength-very-strong {
- color: #1e7e1e !important;
-}
-
-/* 分数圆圈颜色 */
-.score-weak {
- background: conic-gradient(from 0deg, #dc2626 0deg, #dc2626 var(--score-deg), #e2e8f0 var(--score-deg), #e2e8f0 360deg) !important;
-}
-
-.score-medium {
- background: conic-gradient(from 0deg, #f59e0b 0deg, #f59e0b var(--score-deg), #e2e8f0 var(--score-deg), #e2e8f0 360deg) !important;
-}
-
-.score-strong {
- background: conic-gradient(from 0deg, #228B22 0deg, #228B22 var(--score-deg), #e2e8f0 var(--score-deg), #e2e8f0 360deg) !important;
-}
-
-.score-very-strong {
- background: conic-gradient(from 0deg, #1e7e1e 0deg, #1e7e1e var(--score-deg), #e2e8f0 var(--score-deg), #e2e8f0 360deg) !important;
-}
-
-/* 平板端适配 (768px - 1024px) */
-@media (min-width: 768px) and (max-width: 1024px) {
- .container {
- max-width: 900px;
- padding: 25px;
- }
-
- .header h1 {
- font-size: 2.4rem;
- }
-
- .input-container,
- .result-container {
- padding: 30px;
- }
-
- .details-grid {
- grid-template-columns: 1fr;
- }
-
- .recommendations-section {
- grid-template-columns: 1fr;
- }
-
- .strength-score {
- flex-direction: column;
- text-align: center;
- gap: 20px;
- }
-}
-
-/* 手机端适配 (最大767px) */
-@media (max-width: 767px) {
- .container {
- padding: 15px;
- max-width: 100%;
- }
-
- .header {
- padding: 25px 15px;
- margin-bottom: 25px;
- }
-
- .header h1 {
- font-size: 2rem;
- }
-
- .subtitle {
- font-size: 1rem;
- }
-
- .input-container,
- .result-container {
- padding: 25px;
- border-radius: 15px;
- }
-
- .main-content {
- gap: 20px;
- }
-
- .password-input {
- padding: 16px 50px 16px 16px;
- font-size: 1rem;
- }
-
- .check-btn {
- padding: 16px 28px;
- font-size: 1rem;
- }
-
- .strength-overview {
- padding: 20px;
- margin-bottom: 25px;
- }
-
- .strength-score {
- flex-direction: column;
- text-align: center;
- gap: 20px;
- }
-
- .score-circle {
- width: 100px;
- height: 100px;
- }
-
- .score-circle::before {
- width: 75px;
- height: 75px;
- }
-
- .score-value {
- font-size: 2rem;
- }
-
- .strength-level {
- font-size: 1.6rem;
- }
-
- .details-grid {
- grid-template-columns: 1fr;
- gap: 20px;
- }
-
- .detail-card {
- padding: 20px;
- }
-
- .character-types {
- grid-template-columns: 1fr;
- }
-
- .recommendations-section {
- grid-template-columns: 1fr;
- gap: 20px;
- }
-
- .recommendations-card,
- .security-tips-card {
- padding: 20px;
- }
-
- .toast {
- right: 15px;
- left: 15px;
- top: 15px;
- text-align: center;
- }
-}
-
-/* 小屏手机适配 (最大480px) */
-@media (max-width: 480px) {
- .container {
- padding: 10px;
- }
-
- .header {
- padding: 20px 10px;
- margin-bottom: 20px;
- }
-
- .header h1 {
- font-size: 1.8rem;
- }
-
- .input-container,
- .result-container {
- padding: 20px;
- }
-
- .password-input {
- padding: 14px 45px 14px 14px;
- font-size: 0.95rem;
- }
-
- .check-btn {
- padding: 14px 24px;
- }
-
- .detail-card {
- padding: 15px;
- }
-
- .card-header h3 {
- font-size: 1.1rem;
- }
-}
-
-/* 触摸设备优化 */
-@media (hover: none) and (pointer: coarse) {
- .check-btn,
- .retry-btn,
- .toggle-visibility {
- min-height: 44px;
- }
-
- .toggle-visibility {
- padding: 12px;
- }
-}
-
-/* 高对比度模式支持 */
-@media (prefers-contrast: high) {
- .input-container,
- .result-container,
- .detail-card {
- border: 2px solid #2c3e50;
- }
-
- .password-input {
- border: 2px solid #2c3e50;
- }
-}
-
-/* 减少动画模式支持 */
-@media (prefers-reduced-motion: reduce) {
- * {
- animation-duration: 0.01ms !important;
- animation-iteration-count: 1 !important;
- transition-duration: 0.01ms !important;
- }
-}
-
-/* 深色模式支持 */
-@media (prefers-color-scheme: dark) {
- body {
- background: #0f172a;
- color: #e2e8f0;
- }
-
- .input-container,
- .result-container,
- .detail-card,
- .recommendations-card,
- .security-tips-card {
- background: #1e293b;
- border-color: #334155;
- }
-
- .password-input {
- background: #334155;
- border-color: #475569;
- color: #e2e8f0;
- }
-
- .password-input:focus {
- background: #1e293b;
- border-color: #667eea;
- }
-
- .strength-overview {
- background: #1e293b;
- border-color: #334155;
- }
-
- .char-type,
- .recommendations-list li,
- .tip-item {
- background: #334155;
- border-color: #475569;
- color: #e2e8f0;
- }
-}
-
-/* 打印样式 */
-@media print {
- .header {
- background: none !important;
- color: black !important;
- box-shadow: none !important;
- }
-
- .check-btn,
- .retry-btn,
- .toggle-visibility,
- .toast {
- display: none !important;
- }
-
- .input-container,
- .result-container {
- box-shadow: none !important;
- border: 1px solid #ccc !important;
- }
+/* 基础样式重置 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+/* 隐藏滚动条但保留滚动功能 */
+html {
+ scrollbar-width: none;
+ -ms-overflow-style: none;
+}
+
+body::-webkit-scrollbar,
+html::-webkit-scrollbar,
+*::-webkit-scrollbar {
+ display: none;
+}
+
+body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
+ line-height: 1.6;
+ color: #2c3e50;
+ min-height: 100vh;
+ overflow-x: hidden;
+ background: linear-gradient(135deg, #f0f8e8 0%, #e8f5e8 50%, #d4f4dd 100%);
+ scrollbar-width: none;
+ -ms-overflow-style: none;
+}
+
+/* 容器布局 */
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+}
+
+/* 头部样式 */
+.header {
+ text-align: center;
+ margin-bottom: 40px;
+ padding: 40px 20px;
+ background: linear-gradient(135deg, #228B22 0%, #32CD32 100%);
+ border-radius: 20px;
+ box-shadow: 0 10px 30px rgba(34, 139, 34, 0.3);
+ color: white;
+}
+
+.header h1 {
+ font-size: 2.8rem;
+ font-weight: 700;
+ margin-bottom: 15px;
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
+}
+
+.subtitle {
+ font-size: 1.2rem;
+ opacity: 0.9;
+ font-weight: 400;
+}
+
+/* 主内容区域 */
+.main-content {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 30px;
+}
+
+/* 输入容器 */
+.input-container {
+ background: #ffffff;
+ border-radius: 20px;
+ padding: 40px;
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1);
+ border: 1px solid #e8ecf4;
+}
+
+.input-group {
+ margin-bottom: 30px;
+}
+
+.input-label {
+ display: block;
+ font-size: 1.1rem;
+ font-weight: 600;
+ color: #2c3e50;
+ margin-bottom: 15px;
+}
+
+.password-input-wrapper {
+ position: relative;
+ margin-bottom: 15px;
+}
+
+.password-input {
+ width: 100%;
+ padding: 18px 60px 18px 20px;
+ border: 2px solid #e8ecf4;
+ border-radius: 12px;
+ font-size: 1.1rem;
+ font-family: 'Courier New', monospace;
+ background: #f8fafc;
+ transition: all 0.3s ease;
+ letter-spacing: 1px;
+}
+
+.password-input:focus {
+ outline: none;
+ border-color: #228B22;
+ background: #ffffff;
+ box-shadow: 0 0 0 4px rgba(34, 139, 34, 0.1);
+}
+
+.password-input::placeholder {
+ color: #94a3b8;
+ letter-spacing: normal;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
+}
+
+.toggle-visibility {
+ position: absolute;
+ right: 15px;
+ top: 50%;
+ transform: translateY(-50%);
+ background: none;
+ border: none;
+ cursor: pointer;
+ padding: 8px;
+ border-radius: 6px;
+ color: #64748b;
+ transition: all 0.3s ease;
+}
+
+.toggle-visibility:hover {
+ background: #f1f5f9;
+ color: #475569;
+}
+
+.input-hint {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ color: #64748b;
+ font-size: 0.9rem;
+}
+
+.hint-icon {
+ font-size: 1rem;
+}
+
+/* 检测按钮 */
+.check-btn {
+ width: 100%;
+ background: linear-gradient(135deg, #228B22 0%, #32CD32 100%);
+ color: white;
+ border: none;
+ padding: 18px 32px;
+ border-radius: 12px;
+ font-size: 1.1rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ box-shadow: 0 4px 20px rgba(34, 139, 34, 0.3);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 10px;
+ position: relative;
+ overflow: hidden;
+}
+
+.check-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 6px 25px rgba(34, 139, 34, 0.4);
+}
+
+.check-btn:active {
+ transform: translateY(0);
+}
+
+.check-btn:disabled {
+ opacity: 0.7;
+ cursor: not-allowed;
+ transform: none;
+}
+
+.btn-icon {
+ font-size: 1.2rem;
+}
+
+/* 结果容器 */
+.result-container {
+ background: #ffffff;
+ border-radius: 20px;
+ padding: 40px;
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1);
+ border: 1px solid #e8ecf4;
+ animation: slideIn 0.5s ease-out;
+}
+
+@keyframes slideIn {
+ from {
+ opacity: 0;
+ transform: translateY(30px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+/* 强度概览 */
+.strength-overview {
+ margin-bottom: 40px;
+ padding: 30px;
+ background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);
+ border-radius: 16px;
+ border: 1px solid #e2e8f0;
+}
+
+.strength-score {
+ display: flex;
+ align-items: center;
+ gap: 30px;
+ margin-bottom: 25px;
+}
+
+.score-circle {
+ width: 120px;
+ height: 120px;
+ border-radius: 50%;
+ background: conic-gradient(from 0deg, #e2e8f0 0deg, #e2e8f0 360deg);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ position: relative;
+ transition: all 0.5s ease;
+}
+
+.score-circle::before {
+ content: '';
+ position: absolute;
+ width: 90px;
+ height: 90px;
+ background: white;
+ border-radius: 50%;
+ z-index: 1;
+}
+
+.score-value {
+ font-size: 2.5rem;
+ font-weight: 700;
+ color: #2c3e50;
+ z-index: 2;
+ position: relative;
+}
+
+.score-label {
+ font-size: 0.9rem;
+ color: #64748b;
+ z-index: 2;
+ position: relative;
+}
+
+.strength-info {
+ flex: 1;
+}
+
+.strength-level {
+ font-size: 2rem;
+ font-weight: 700;
+ margin-bottom: 8px;
+ color: #2c3e50;
+}
+
+.strength-description {
+ font-size: 1.1rem;
+ color: #64748b;
+ line-height: 1.5;
+}
+
+.strength-bar {
+ margin-top: 20px;
+}
+
+.bar-background {
+ width: 100%;
+ height: 12px;
+ background: #e2e8f0;
+ border-radius: 6px;
+ overflow: hidden;
+ margin-bottom: 10px;
+}
+
+.bar-fill {
+ height: 100%;
+ background: linear-gradient(90deg, #90EE90, #98FB98, #32CD32, #228B22);
+ border-radius: 6px;
+ width: 0%;
+ transition: width 0.8s ease;
+}
+
+.bar-labels {
+ display: flex;
+ justify-content: space-between;
+ font-size: 0.85rem;
+ color: #64748b;
+}
+
+/* 详细信息网格 */
+.details-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
+ gap: 25px;
+ margin-bottom: 30px;
+}
+
+.detail-card {
+ background: #f8fafc;
+ border-radius: 16px;
+ padding: 25px;
+ border: 1px solid #e2e8f0;
+ transition: all 0.3s ease;
+}
+
+.detail-card:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
+}
+
+.card-header {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ margin-bottom: 20px;
+}
+
+.card-icon {
+ font-size: 1.5rem;
+}
+
+.card-header h3 {
+ font-size: 1.3rem;
+ font-weight: 600;
+ color: #2c3e50;
+}
+
+.card-content {
+ display: flex;
+ flex-direction: column;
+ gap: 15px;
+}
+
+.info-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 12px 0;
+ border-bottom: 1px solid #e2e8f0;
+}
+
+.info-row:last-child {
+ border-bottom: none;
+}
+
+.info-label {
+ font-weight: 500;
+ color: #64748b;
+}
+
+.info-value {
+ font-weight: 600;
+ color: #2c3e50;
+}
+
+/* 字符类型分析 */
+.character-types {
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ gap: 12px;
+ margin-bottom: 20px;
+}
+
+.char-type {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 10px 12px;
+ background: white;
+ border-radius: 8px;
+ border: 1px solid #e2e8f0;
+ font-size: 0.9rem;
+}
+
+.char-type.has-type {
+ background: #f0f8e8;
+ border-color: #d4f4dd;
+ color: #1e7e1e;
+}
+
+.char-type.has-type .type-icon {
+ color: #228B22;
+}
+
+.type-icon {
+ font-size: 1rem;
+}
+
+.character-issues {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.issue-item {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 8px 12px;
+ background: #fef2f2;
+ border: 1px solid #fecaca;
+ border-radius: 8px;
+ color: #dc2626;
+ font-size: 0.9rem;
+}
+
+.issue-item.hidden {
+ display: none;
+}
+
+.issue-icon {
+ font-size: 1rem;
+}
+
+/* 建议和提示区域 */
+.recommendations-section {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
+ gap: 25px;
+}
+
+.recommendations-card,
+.security-tips-card {
+ background: #f8fafc;
+ border-radius: 16px;
+ padding: 25px;
+ border: 1px solid #e2e8f0;
+}
+
+.recommendations-list {
+ list-style: none;
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.recommendations-list li {
+ display: flex;
+ align-items: flex-start;
+ gap: 10px;
+ padding: 12px 16px;
+ background: white;
+ border-radius: 10px;
+ border: 1px solid #e2e8f0;
+ color: #2c3e50;
+ line-height: 1.5;
+}
+
+.recommendations-list li::before {
+ content: '💡';
+ font-size: 1rem;
+ margin-top: 2px;
+ flex-shrink: 0;
+}
+
+.tips-container {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.tip-item {
+ display: flex;
+ align-items: flex-start;
+ gap: 12px;
+ padding: 12px 16px;
+ background: white;
+ border-radius: 10px;
+ border: 1px solid #e2e8f0;
+ color: #2c3e50;
+ line-height: 1.5;
+}
+
+.tip-icon {
+ font-size: 1rem;
+ margin-top: 2px;
+ flex-shrink: 0;
+}
+
+/* 错误容器 */
+.error-container {
+ background: #ffffff;
+ border-radius: 20px;
+ padding: 50px 40px;
+ text-align: center;
+ box-shadow: 0 10px 40px rgba(239, 68, 68, 0.1);
+ border: 1px solid #fecaca;
+}
+
+.error-icon {
+ font-size: 4rem;
+ margin-bottom: 20px;
+}
+
+.error-container h3 {
+ color: #dc2626;
+ margin-bottom: 15px;
+ font-size: 1.5rem;
+ font-weight: 600;
+}
+
+.error-container p {
+ color: #64748b;
+ margin-bottom: 25px;
+ font-size: 1.1rem;
+}
+
+.retry-btn {
+ background: #dc2626;
+ color: white;
+ border: none;
+ padding: 14px 28px;
+ border-radius: 10px;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ font-size: 1rem;
+}
+
+.retry-btn:hover {
+ background: #b91c1c;
+ transform: translateY(-1px);
+}
+
+/* 页脚 */
+.footer {
+ text-align: center;
+ padding: 40px 20px;
+ color: #64748b;
+ margin-top: 40px;
+}
+
+.footer p {
+ margin-bottom: 8px;
+ font-size: 1rem;
+}
+
+.footer-note {
+ font-size: 0.9rem;
+ opacity: 0.8;
+}
+
+/* 提示框 */
+.toast {
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ background: #228B22;
+ color: white;
+ padding: 16px 24px;
+ border-radius: 10px;
+ box-shadow: 0 4px 20px rgba(34, 139, 34, 0.3);
+ z-index: 1000;
+ animation: toastSlide 0.3s ease-out;
+ font-weight: 500;
+}
+
+@keyframes toastSlide {
+ from {
+ transform: translateX(100%);
+ opacity: 0;
+ }
+ to {
+ transform: translateX(0);
+ opacity: 1;
+ }
+}
+
+/* 强度等级颜色 */
+.strength-weak {
+ color: #dc2626 !important;
+}
+
+.strength-medium {
+ color: #f59e0b !important;
+}
+
+.strength-strong {
+ color: #228B22 !important;
+}
+
+.strength-very-strong {
+ color: #1e7e1e !important;
+}
+
+/* 分数圆圈颜色 */
+.score-weak {
+ background: conic-gradient(from 0deg, #dc2626 0deg, #dc2626 var(--score-deg), #e2e8f0 var(--score-deg), #e2e8f0 360deg) !important;
+}
+
+.score-medium {
+ background: conic-gradient(from 0deg, #f59e0b 0deg, #f59e0b var(--score-deg), #e2e8f0 var(--score-deg), #e2e8f0 360deg) !important;
+}
+
+.score-strong {
+ background: conic-gradient(from 0deg, #228B22 0deg, #228B22 var(--score-deg), #e2e8f0 var(--score-deg), #e2e8f0 360deg) !important;
+}
+
+.score-very-strong {
+ background: conic-gradient(from 0deg, #1e7e1e 0deg, #1e7e1e var(--score-deg), #e2e8f0 var(--score-deg), #e2e8f0 360deg) !important;
+}
+
+/* 平板端适配 (768px - 1024px) */
+@media (min-width: 768px) and (max-width: 1024px) {
+ .container {
+ max-width: 900px;
+ padding: 25px;
+ }
+
+ .header h1 {
+ font-size: 2.4rem;
+ }
+
+ .input-container,
+ .result-container {
+ padding: 30px;
+ }
+
+ .details-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .recommendations-section {
+ grid-template-columns: 1fr;
+ }
+
+ .strength-score {
+ flex-direction: column;
+ text-align: center;
+ gap: 20px;
+ }
+}
+
+/* 手机端适配 (最大767px) */
+@media (max-width: 767px) {
+ .container {
+ padding: 15px;
+ max-width: 100%;
+ }
+
+ .header {
+ padding: 25px 15px;
+ margin-bottom: 25px;
+ }
+
+ .header h1 {
+ font-size: 2rem;
+ }
+
+ .subtitle {
+ font-size: 1rem;
+ }
+
+ .input-container,
+ .result-container {
+ padding: 25px;
+ border-radius: 15px;
+ }
+
+ .main-content {
+ gap: 20px;
+ }
+
+ .password-input {
+ padding: 16px 50px 16px 16px;
+ font-size: 1rem;
+ }
+
+ .check-btn {
+ padding: 16px 28px;
+ font-size: 1rem;
+ }
+
+ .strength-overview {
+ padding: 20px;
+ margin-bottom: 25px;
+ }
+
+ .strength-score {
+ flex-direction: column;
+ text-align: center;
+ gap: 20px;
+ }
+
+ .score-circle {
+ width: 100px;
+ height: 100px;
+ }
+
+ .score-circle::before {
+ width: 75px;
+ height: 75px;
+ }
+
+ .score-value {
+ font-size: 2rem;
+ }
+
+ .strength-level {
+ font-size: 1.6rem;
+ }
+
+ .details-grid {
+ grid-template-columns: 1fr;
+ gap: 20px;
+ }
+
+ .detail-card {
+ padding: 20px;
+ }
+
+ .character-types {
+ grid-template-columns: 1fr;
+ }
+
+ .recommendations-section {
+ grid-template-columns: 1fr;
+ gap: 20px;
+ }
+
+ .recommendations-card,
+ .security-tips-card {
+ padding: 20px;
+ }
+
+ .toast {
+ right: 15px;
+ left: 15px;
+ top: 15px;
+ text-align: center;
+ }
+}
+
+/* 小屏手机适配 (最大480px) */
+@media (max-width: 480px) {
+ .container {
+ padding: 10px;
+ }
+
+ .header {
+ padding: 20px 10px;
+ margin-bottom: 20px;
+ }
+
+ .header h1 {
+ font-size: 1.8rem;
+ }
+
+ .input-container,
+ .result-container {
+ padding: 20px;
+ }
+
+ .password-input {
+ padding: 14px 45px 14px 14px;
+ font-size: 0.95rem;
+ }
+
+ .check-btn {
+ padding: 14px 24px;
+ }
+
+ .detail-card {
+ padding: 15px;
+ }
+
+ .card-header h3 {
+ font-size: 1.1rem;
+ }
+}
+
+/* 触摸设备优化 */
+@media (hover: none) and (pointer: coarse) {
+ .check-btn,
+ .retry-btn,
+ .toggle-visibility {
+ min-height: 44px;
+ }
+
+ .toggle-visibility {
+ padding: 12px;
+ }
+}
+
+/* 高对比度模式支持 */
+@media (prefers-contrast: high) {
+ .input-container,
+ .result-container,
+ .detail-card {
+ border: 2px solid #2c3e50;
+ }
+
+ .password-input {
+ border: 2px solid #2c3e50;
+ }
+}
+
+/* 减少动画模式支持 */
+@media (prefers-reduced-motion: reduce) {
+ * {
+ animation-duration: 0.01ms !important;
+ animation-iteration-count: 1 !important;
+ transition-duration: 0.01ms !important;
+ }
+}
+
+/* 深色模式支持 */
+@media (prefers-color-scheme: dark) {
+ body {
+ background: #0f172a;
+ color: #e2e8f0;
+ }
+
+ .input-container,
+ .result-container,
+ .detail-card,
+ .recommendations-card,
+ .security-tips-card {
+ background: #1e293b;
+ border-color: #334155;
+ }
+
+ .password-input {
+ background: #334155;
+ border-color: #475569;
+ color: #e2e8f0;
+ }
+
+ .password-input:focus {
+ background: #1e293b;
+ border-color: #667eea;
+ }
+
+ .strength-overview {
+ background: #1e293b;
+ border-color: #334155;
+ }
+
+ .char-type,
+ .recommendations-list li,
+ .tip-item {
+ background: #334155;
+ border-color: #475569;
+ color: #e2e8f0;
+ }
+}
+
+/* 打印样式 */
+@media print {
+ .header {
+ background: none !important;
+ color: black !important;
+ box-shadow: none !important;
+ }
+
+ .check-btn,
+ .retry-btn,
+ .toggle-visibility,
+ .toast {
+ display: none !important;
+ }
+
+ .input-container,
+ .result-container {
+ box-shadow: none !important;
+ border: 1px solid #ccc !important;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/index.html b/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/index.html
index f9b0c70a..f4f5fac7 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/index.html
+++ b/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/index.html
@@ -1,218 +1,218 @@
-
-
-
-
-
-
-
- 🔒 密码强度检测器
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 弱
- 中等
- 强
- 非常强
-
-
-
-
-
-
-
-
-
-
- 密码长度:
- -
-
-
- 熵值:
- -
-
-
- 破解时间:
- -
-
-
- 字符种类:
- -
-
-
-
-
-
-
-
-
-
- ❌
- 小写字母
-
-
- ❌
- 大写字母
-
-
- ❌
- 数字
-
-
- ❌
- 特殊符号
-
-
-
-
-
- ⚠️
- 包含重复字符
-
-
- ⚠️
- 包含连续字符
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 🔐
- 使用密码管理器生成和存储复杂密码
-
-
- 🔄
- 为不同账户使用不同的密码
-
-
- ⏰
- 定期更换重要账户的密码
-
-
- 🔒
- 启用双因素认证(2FA)增强安全性
-
-
-
-
-
-
-
-
-
-
⚠️
-
检测失败
-
请检查网络连接后重试
-
-
-
-
-
-
-
-
-
- 操作成功
-
-
-
-
+
+
+
+
+
+
+
+ 🔒 密码强度检测器
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 弱
+ 中等
+ 强
+ 非常强
+
+
+
+
+
+
+
+
+
+
+ 密码长度:
+ -
+
+
+ 熵值:
+ -
+
+
+ 破解时间:
+ -
+
+
+ 字符种类:
+ -
+
+
+
+
+
+
+
+
+
+ ❌
+ 小写字母
+
+
+ ❌
+ 大写字母
+
+
+ ❌
+ 数字
+
+
+ ❌
+ 特殊符号
+
+
+
+
+
+ ⚠️
+ 包含重复字符
+
+
+ ⚠️
+ 包含连续字符
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 🔐
+ 使用密码管理器生成和存储复杂密码
+
+
+ 🔄
+ 为不同账户使用不同的密码
+
+
+ ⏰
+ 定期更换重要账户的密码
+
+
+ 🔒
+ 启用双因素认证(2FA)增强安全性
+
+
+
+
+
+
+
+
+
+
⚠️
+
检测失败
+
请检查网络连接后重试
+
+
+
+
+
+
+
+
+
+ 操作成功
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/js/script.js b/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/js/script.js
index 8861664a..c60d37f4 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/js/script.js
@@ -1,516 +1,516 @@
-/**
- * 密码强度检测器
- * 提供密码强度分析和安全建议
- */
-class PasswordStrengthChecker {
- constructor() {
- this.apiUrl = 'https://60s.api.shumengya.top/v2/password/check';
- this.isChecking = false;
- this.currentPassword = '';
- this.init();
- }
-
- /**
- * 初始化应用
- */
- init() {
- this.bindEvents();
- this.setupFormValidation();
- this.hideResultContainer();
- this.hideErrorContainer();
- console.log('密码强度检测器初始化完成');
- }
-
- /**
- * 绑定事件监听器
- */
- bindEvents() {
- // 密码输入框事件
- const passwordInput = document.getElementById('passwordInput');
- if (passwordInput) {
- passwordInput.addEventListener('input', this.handlePasswordInput.bind(this));
- passwordInput.addEventListener('keypress', this.handleKeyPress.bind(this));
- }
-
- // 显示/隐藏密码按钮
- const toggleBtn = document.getElementById('toggleVisibility');
- if (toggleBtn) {
- toggleBtn.addEventListener('click', this.togglePasswordVisibility.bind(this));
- }
-
- // 检测按钮
- const checkBtn = document.getElementById('checkBtn');
- if (checkBtn) {
- checkBtn.addEventListener('click', this.handleCheckPassword.bind(this));
- }
-
- // 重试按钮
- const retryBtn = document.getElementById('retryBtn');
- if (retryBtn) {
- retryBtn.addEventListener('click', this.handleRetry.bind(this));
- }
- }
-
- /**
- * 设置表单验证
- */
- setupFormValidation() {
- const form = document.querySelector('.input-container');
- if (form) {
- form.addEventListener('submit', (e) => {
- e.preventDefault();
- this.handleCheckPassword();
- });
- }
- }
-
- /**
- * 处理密码输入
- */
- handlePasswordInput(event) {
- const password = event.target.value;
- this.currentPassword = password;
-
- // 更新按钮状态
- this.updateCheckButtonState();
-
- // 如果密码为空,隐藏结果
- if (!password.trim()) {
- this.hideResultContainer();
- this.hideErrorContainer();
- }
- }
-
- /**
- * 处理键盘事件
- */
- handleKeyPress(event) {
- if (event.key === 'Enter' && !this.isChecking) {
- event.preventDefault();
- this.handleCheckPassword();
- }
- }
-
- /**
- * 切换密码可见性
- */
- togglePasswordVisibility() {
- const passwordInput = document.getElementById('passwordInput');
- const toggleBtn = document.getElementById('toggleVisibility');
-
- if (passwordInput && toggleBtn) {
- const isPassword = passwordInput.type === 'password';
- passwordInput.type = isPassword ? 'text' : 'password';
- toggleBtn.innerHTML = isPassword ? '🙈' : '👁️';
- toggleBtn.title = isPassword ? '隐藏密码' : '显示密码';
- }
- }
-
- /**
- * 更新检测按钮状态
- */
- updateCheckButtonState() {
- const checkBtn = document.getElementById('checkBtn');
- const hasPassword = this.currentPassword.trim().length > 0;
-
- if (checkBtn) {
- checkBtn.disabled = !hasPassword || this.isChecking;
-
- if (this.isChecking) {
- checkBtn.innerHTML = '⏳检测中...';
- } else if (hasPassword) {
- checkBtn.innerHTML = '🔍检测密码强度';
- } else {
- checkBtn.innerHTML = '🔍请输入密码';
- }
- }
- }
-
- /**
- * 处理密码检测
- */
- async handleCheckPassword() {
- const password = this.currentPassword.trim();
-
- if (!password) {
- this.showToast('请输入要检测的密码', 'error');
- return;
- }
-
- if (this.isChecking) {
- return;
- }
-
- try {
- this.setLoadingState(true);
- this.hideErrorContainer();
-
- const result = await this.checkPasswordStrength(password);
-
- if (result.code === 200 && result.data) {
- this.displayResults(result.data);
- this.showResultContainer();
- this.showToast('密码强度检测完成', 'success');
- } else {
- throw new Error(result.message || '检测失败');
- }
- } catch (error) {
- console.error('密码检测错误:', error);
- this.showError(error.message || '检测服务暂时不可用,请稍后重试');
- } finally {
- this.setLoadingState(false);
- }
- }
-
- /**
- * 调用API检测密码强度
- */
- async checkPasswordStrength(password) {
- const url = new URL(this.apiUrl);
- url.searchParams.append('password', password);
- url.searchParams.append('encoding', 'utf-8');
-
- const response = await fetch(url.toString(), {
- method: 'GET',
- headers: {
- 'Accept': 'application/json',
- 'Content-Type': 'application/json'
- }
- });
-
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
- }
-
- return await response.json();
- }
-
- /**
- * 显示检测结果
- */
- displayResults(data) {
- this.updateStrengthOverview(data);
- this.updateDetailedInfo(data);
- this.updateRecommendations(data);
- }
-
- /**
- * 更新强度概览
- */
- updateStrengthOverview(data) {
- // 更新分数圆圈
- const scoreCircle = document.getElementById('scoreCircle');
- const scoreValue = document.getElementById('scoreValue');
- const strengthLevel = document.getElementById('strengthLevel');
- const strengthDescription = document.getElementById('strengthDescription');
- const barFill = document.getElementById('strengthBar');
-
- if (scoreValue) {
- scoreValue.textContent = data.score || 0;
- }
-
- if (strengthLevel) {
- strengthLevel.textContent = this.getStrengthText(data.strength);
- const strengthClass = this.getStrengthClass(data.strength);
- strengthLevel.className = `strength-level strength-${strengthClass}`;
- }
-
- if (strengthDescription) {
- strengthDescription.textContent = this.getStrengthDescription(data.strength);
- }
-
- // 更新分数圆圈
- if (scoreCircle) {
- const percentage = (data.score / 100) * 360;
- scoreCircle.style.setProperty('--score-deg', `${percentage}deg`);
- // 将中文强度转换为CSS类名
- const strengthClass = this.getStrengthClass(data.strength);
- scoreCircle.className = `score-circle score-${strengthClass}`;
- }
-
- // 更新强度条
- if (barFill) {
- setTimeout(() => {
- barFill.style.width = `${data.score}%`;
- }, 100);
- }
- }
-
- /**
- * 更新详细信息
- */
- updateDetailedInfo(data) {
- // 基本信息
- this.updateElement('passwordLength', data.length || 0);
- this.updateElement('entropyValue', data.entropy ? data.entropy.toFixed(2) : '0.00');
- this.updateElement('crackTime', data.time_to_crack || '未知');
-
- // 字符类型分析
- this.updateCharacterAnalysis(data.character_analysis || {});
- }
-
- /**
- * 更新字符类型分析
- */
- updateCharacterAnalysis(analysis) {
- const types = {
- 'has_lowercase': { element: 'hasLowercase', label: '小写字母', icon: '🔤' },
- 'has_uppercase': { element: 'hasUppercase', label: '大写字母', icon: '🔠' },
- 'has_numbers': { element: 'hasNumbers', label: '数字', icon: '🔢' },
- 'has_symbols': { element: 'hasSymbols', label: '特殊符号', icon: '🔣' }
- };
-
- Object.keys(types).forEach(key => {
- const element = document.getElementById(types[key].element);
- if (element) {
- const hasType = analysis[key] || false;
- element.className = `char-type ${hasType ? 'has-type' : ''}`;
- element.innerHTML = `
- ${hasType ? '✅' : '❌'}
- ${types[key].label}
- `;
- }
- });
-
- // 更新字符种类数量
- this.updateElement('characterVariety', analysis.character_variety || 0);
-
- // 更新问题提示
- this.updateCharacterIssues(analysis);
- }
-
- /**
- * 更新字符问题提示
- */
- updateCharacterIssues(analysis) {
- const issues = [
- { id: 'hasRepeated', condition: analysis.has_repeated, text: '包含重复字符' },
- { id: 'hasSequential', condition: analysis.has_sequential, text: '包含连续字符' }
- ];
-
- issues.forEach(issue => {
- const element = document.getElementById(issue.id);
- if (element) {
- if (issue.condition) {
- element.style.display = 'flex';
- element.innerHTML = `
- ⚠️
- ${issue.text}
- `;
- } else {
- element.style.display = 'none';
- }
- }
- });
- }
-
- /**
- * 更新建议和提示
- */
- updateRecommendations(data) {
- // 更新建议列表
- const recommendationsList = document.getElementById('recommendationsList');
- if (recommendationsList && data.recommendations) {
- recommendationsList.innerHTML = '';
- data.recommendations.forEach(recommendation => {
- const li = document.createElement('li');
- li.textContent = recommendation;
- recommendationsList.appendChild(li);
- });
- }
-
- // 更新安全提示
- const tipsContainer = document.getElementById('securityTips');
- if (tipsContainer && data.security_tips) {
- tipsContainer.innerHTML = '';
- data.security_tips.forEach((tip, index) => {
- const tipElement = document.createElement('div');
- tipElement.className = 'tip-item';
- tipElement.innerHTML = `
- ${this.getTipIcon(index)}
- ${tip}
- `;
- tipsContainer.appendChild(tipElement);
- });
- }
- }
-
- /**
- * 获取提示图标
- */
- getTipIcon(index) {
- const icons = ['🛡️', '🔐', '⚡', '🎯', '💡', '🔄'];
- return icons[index % icons.length];
- }
-
- /**
- * 获取强度文本
- */
- getStrengthText(strength) {
- // API直接返回中文强度,无需映射
- return strength || '未知';
- }
-
- /**
- * 获取强度CSS类名
- */
- getStrengthClass(strength) {
- const classMap = {
- '弱': 'weak',
- '中等': 'medium',
- '强': 'strong',
- '非常强': 'very-strong'
- };
- return classMap[strength] || 'unknown';
- }
-
- /**
- * 获取强度描述
- */
- getStrengthDescription(strength) {
- const descriptions = {
- '弱': '密码强度较弱,建议增加复杂度',
- '中等': '密码强度中等,可以进一步优化',
- '强': '密码强度良好,安全性较高',
- '非常强': '密码强度非常好,安全性很高'
- };
- return descriptions[strength] || '无法评估密码强度';
- }
-
- /**
- * 设置加载状态
- */
- setLoadingState(loading) {
- this.isChecking = loading;
- this.updateCheckButtonState();
-
- const passwordInput = document.getElementById('passwordInput');
- if (passwordInput) {
- passwordInput.disabled = loading;
- }
- }
-
- /**
- * 显示结果容器
- */
- showResultContainer() {
- const container = document.getElementById('resultContainer');
- if (container) {
- container.style.display = 'block';
- container.scrollIntoView({ behavior: 'smooth', block: 'start' });
- }
- }
-
- /**
- * 隐藏结果容器
- */
- hideResultContainer() {
- const container = document.getElementById('resultContainer');
- if (container) {
- container.style.display = 'none';
- }
- }
-
- /**
- * 显示错误
- */
- showError(message) {
- const errorContainer = document.getElementById('errorContainer');
- const errorMessage = document.getElementById('errorMessage');
-
- if (errorContainer && errorMessage) {
- errorMessage.textContent = message;
- errorContainer.style.display = 'block';
- this.hideResultContainer();
- errorContainer.scrollIntoView({ behavior: 'smooth', block: 'start' });
- }
- }
-
- /**
- * 隐藏错误容器
- */
- hideErrorContainer() {
- const container = document.getElementById('errorContainer');
- if (container) {
- container.style.display = 'none';
- }
- }
-
- /**
- * 处理重试
- */
- handleRetry() {
- this.hideErrorContainer();
- const passwordInput = document.getElementById('passwordInput');
- if (passwordInput) {
- passwordInput.focus();
- }
- }
-
- /**
- * 更新元素内容
- */
- updateElement(id, content) {
- const element = document.getElementById(id);
- if (element) {
- element.textContent = content;
- }
- }
-
- /**
- * 显示提示消息
- */
- showToast(message, type = 'success') {
- const toast = document.getElementById('toast');
- const toastMessage = document.getElementById('toastMessage');
-
- if (toast && toastMessage) {
- toastMessage.textContent = message;
- toast.className = `toast toast-${type}`;
- toast.style.display = 'block';
-
- // 3秒后自动隐藏
- setTimeout(() => {
- toast.style.display = 'none';
- }, 3000);
- }
- }
-}
-
-// 页面加载完成后初始化
-document.addEventListener('DOMContentLoaded', () => {
- try {
- window.passwordChecker = new PasswordStrengthChecker();
- console.log('密码强度检测器已启动');
- } catch (error) {
- console.error('初始化失败:', error);
- }
-});
-
-// 页面可见性变化处理
-document.addEventListener('visibilitychange', () => {
- if (document.visibilityState === 'visible' && window.passwordChecker) {
- console.log('页面重新激活');
- }
-});
-
-// 全局错误处理
-window.addEventListener('error', (event) => {
- console.error('全局错误:', event.error);
- if (window.passwordChecker) {
- window.passwordChecker.showToast('发生了意外错误,请刷新页面重试', 'error');
- }
-});
-
-// 网络状态监听
-window.addEventListener('online', () => {
- if (window.passwordChecker) {
- window.passwordChecker.showToast('网络连接已恢复', 'success');
- }
-});
-
-window.addEventListener('offline', () => {
- if (window.passwordChecker) {
- window.passwordChecker.showToast('网络连接已断开', 'error');
- }
+/**
+ * 密码强度检测器
+ * 提供密码强度分析和安全建议
+ */
+class PasswordStrengthChecker {
+ constructor() {
+ this.apiUrl = 'https://60s.api.shumengya.top/v2/password/check';
+ this.isChecking = false;
+ this.currentPassword = '';
+ this.init();
+ }
+
+ /**
+ * 初始化应用
+ */
+ init() {
+ this.bindEvents();
+ this.setupFormValidation();
+ this.hideResultContainer();
+ this.hideErrorContainer();
+ console.log('密码强度检测器初始化完成');
+ }
+
+ /**
+ * 绑定事件监听器
+ */
+ bindEvents() {
+ // 密码输入框事件
+ const passwordInput = document.getElementById('passwordInput');
+ if (passwordInput) {
+ passwordInput.addEventListener('input', this.handlePasswordInput.bind(this));
+ passwordInput.addEventListener('keypress', this.handleKeyPress.bind(this));
+ }
+
+ // 显示/隐藏密码按钮
+ const toggleBtn = document.getElementById('toggleVisibility');
+ if (toggleBtn) {
+ toggleBtn.addEventListener('click', this.togglePasswordVisibility.bind(this));
+ }
+
+ // 检测按钮
+ const checkBtn = document.getElementById('checkBtn');
+ if (checkBtn) {
+ checkBtn.addEventListener('click', this.handleCheckPassword.bind(this));
+ }
+
+ // 重试按钮
+ const retryBtn = document.getElementById('retryBtn');
+ if (retryBtn) {
+ retryBtn.addEventListener('click', this.handleRetry.bind(this));
+ }
+ }
+
+ /**
+ * 设置表单验证
+ */
+ setupFormValidation() {
+ const form = document.querySelector('.input-container');
+ if (form) {
+ form.addEventListener('submit', (e) => {
+ e.preventDefault();
+ this.handleCheckPassword();
+ });
+ }
+ }
+
+ /**
+ * 处理密码输入
+ */
+ handlePasswordInput(event) {
+ const password = event.target.value;
+ this.currentPassword = password;
+
+ // 更新按钮状态
+ this.updateCheckButtonState();
+
+ // 如果密码为空,隐藏结果
+ if (!password.trim()) {
+ this.hideResultContainer();
+ this.hideErrorContainer();
+ }
+ }
+
+ /**
+ * 处理键盘事件
+ */
+ handleKeyPress(event) {
+ if (event.key === 'Enter' && !this.isChecking) {
+ event.preventDefault();
+ this.handleCheckPassword();
+ }
+ }
+
+ /**
+ * 切换密码可见性
+ */
+ togglePasswordVisibility() {
+ const passwordInput = document.getElementById('passwordInput');
+ const toggleBtn = document.getElementById('toggleVisibility');
+
+ if (passwordInput && toggleBtn) {
+ const isPassword = passwordInput.type === 'password';
+ passwordInput.type = isPassword ? 'text' : 'password';
+ toggleBtn.innerHTML = isPassword ? '🙈' : '👁️';
+ toggleBtn.title = isPassword ? '隐藏密码' : '显示密码';
+ }
+ }
+
+ /**
+ * 更新检测按钮状态
+ */
+ updateCheckButtonState() {
+ const checkBtn = document.getElementById('checkBtn');
+ const hasPassword = this.currentPassword.trim().length > 0;
+
+ if (checkBtn) {
+ checkBtn.disabled = !hasPassword || this.isChecking;
+
+ if (this.isChecking) {
+ checkBtn.innerHTML = '⏳检测中...';
+ } else if (hasPassword) {
+ checkBtn.innerHTML = '🔍检测密码强度';
+ } else {
+ checkBtn.innerHTML = '🔍请输入密码';
+ }
+ }
+ }
+
+ /**
+ * 处理密码检测
+ */
+ async handleCheckPassword() {
+ const password = this.currentPassword.trim();
+
+ if (!password) {
+ this.showToast('请输入要检测的密码', 'error');
+ return;
+ }
+
+ if (this.isChecking) {
+ return;
+ }
+
+ try {
+ this.setLoadingState(true);
+ this.hideErrorContainer();
+
+ const result = await this.checkPasswordStrength(password);
+
+ if (result.code === 200 && result.data) {
+ this.displayResults(result.data);
+ this.showResultContainer();
+ this.showToast('密码强度检测完成', 'success');
+ } else {
+ throw new Error(result.message || '检测失败');
+ }
+ } catch (error) {
+ console.error('密码检测错误:', error);
+ this.showError(error.message || '检测服务暂时不可用,请稍后重试');
+ } finally {
+ this.setLoadingState(false);
+ }
+ }
+
+ /**
+ * 调用API检测密码强度
+ */
+ async checkPasswordStrength(password) {
+ const url = new URL(this.apiUrl);
+ url.searchParams.append('password', password);
+ url.searchParams.append('encoding', 'utf-8');
+
+ const response = await fetch(url.toString(), {
+ method: 'GET',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json'
+ }
+ });
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+ }
+
+ return await response.json();
+ }
+
+ /**
+ * 显示检测结果
+ */
+ displayResults(data) {
+ this.updateStrengthOverview(data);
+ this.updateDetailedInfo(data);
+ this.updateRecommendations(data);
+ }
+
+ /**
+ * 更新强度概览
+ */
+ updateStrengthOverview(data) {
+ // 更新分数圆圈
+ const scoreCircle = document.getElementById('scoreCircle');
+ const scoreValue = document.getElementById('scoreValue');
+ const strengthLevel = document.getElementById('strengthLevel');
+ const strengthDescription = document.getElementById('strengthDescription');
+ const barFill = document.getElementById('strengthBar');
+
+ if (scoreValue) {
+ scoreValue.textContent = data.score || 0;
+ }
+
+ if (strengthLevel) {
+ strengthLevel.textContent = this.getStrengthText(data.strength);
+ const strengthClass = this.getStrengthClass(data.strength);
+ strengthLevel.className = `strength-level strength-${strengthClass}`;
+ }
+
+ if (strengthDescription) {
+ strengthDescription.textContent = this.getStrengthDescription(data.strength);
+ }
+
+ // 更新分数圆圈
+ if (scoreCircle) {
+ const percentage = (data.score / 100) * 360;
+ scoreCircle.style.setProperty('--score-deg', `${percentage}deg`);
+ // 将中文强度转换为CSS类名
+ const strengthClass = this.getStrengthClass(data.strength);
+ scoreCircle.className = `score-circle score-${strengthClass}`;
+ }
+
+ // 更新强度条
+ if (barFill) {
+ setTimeout(() => {
+ barFill.style.width = `${data.score}%`;
+ }, 100);
+ }
+ }
+
+ /**
+ * 更新详细信息
+ */
+ updateDetailedInfo(data) {
+ // 基本信息
+ this.updateElement('passwordLength', data.length || 0);
+ this.updateElement('entropyValue', data.entropy ? data.entropy.toFixed(2) : '0.00');
+ this.updateElement('crackTime', data.time_to_crack || '未知');
+
+ // 字符类型分析
+ this.updateCharacterAnalysis(data.character_analysis || {});
+ }
+
+ /**
+ * 更新字符类型分析
+ */
+ updateCharacterAnalysis(analysis) {
+ const types = {
+ 'has_lowercase': { element: 'hasLowercase', label: '小写字母', icon: '🔤' },
+ 'has_uppercase': { element: 'hasUppercase', label: '大写字母', icon: '🔠' },
+ 'has_numbers': { element: 'hasNumbers', label: '数字', icon: '🔢' },
+ 'has_symbols': { element: 'hasSymbols', label: '特殊符号', icon: '🔣' }
+ };
+
+ Object.keys(types).forEach(key => {
+ const element = document.getElementById(types[key].element);
+ if (element) {
+ const hasType = analysis[key] || false;
+ element.className = `char-type ${hasType ? 'has-type' : ''}`;
+ element.innerHTML = `
+ ${hasType ? '✅' : '❌'}
+ ${types[key].label}
+ `;
+ }
+ });
+
+ // 更新字符种类数量
+ this.updateElement('characterVariety', analysis.character_variety || 0);
+
+ // 更新问题提示
+ this.updateCharacterIssues(analysis);
+ }
+
+ /**
+ * 更新字符问题提示
+ */
+ updateCharacterIssues(analysis) {
+ const issues = [
+ { id: 'hasRepeated', condition: analysis.has_repeated, text: '包含重复字符' },
+ { id: 'hasSequential', condition: analysis.has_sequential, text: '包含连续字符' }
+ ];
+
+ issues.forEach(issue => {
+ const element = document.getElementById(issue.id);
+ if (element) {
+ if (issue.condition) {
+ element.style.display = 'flex';
+ element.innerHTML = `
+ ⚠️
+ ${issue.text}
+ `;
+ } else {
+ element.style.display = 'none';
+ }
+ }
+ });
+ }
+
+ /**
+ * 更新建议和提示
+ */
+ updateRecommendations(data) {
+ // 更新建议列表
+ const recommendationsList = document.getElementById('recommendationsList');
+ if (recommendationsList && data.recommendations) {
+ recommendationsList.innerHTML = '';
+ data.recommendations.forEach(recommendation => {
+ const li = document.createElement('li');
+ li.textContent = recommendation;
+ recommendationsList.appendChild(li);
+ });
+ }
+
+ // 更新安全提示
+ const tipsContainer = document.getElementById('securityTips');
+ if (tipsContainer && data.security_tips) {
+ tipsContainer.innerHTML = '';
+ data.security_tips.forEach((tip, index) => {
+ const tipElement = document.createElement('div');
+ tipElement.className = 'tip-item';
+ tipElement.innerHTML = `
+ ${this.getTipIcon(index)}
+ ${tip}
+ `;
+ tipsContainer.appendChild(tipElement);
+ });
+ }
+ }
+
+ /**
+ * 获取提示图标
+ */
+ getTipIcon(index) {
+ const icons = ['🛡️', '🔐', '⚡', '🎯', '💡', '🔄'];
+ return icons[index % icons.length];
+ }
+
+ /**
+ * 获取强度文本
+ */
+ getStrengthText(strength) {
+ // API直接返回中文强度,无需映射
+ return strength || '未知';
+ }
+
+ /**
+ * 获取强度CSS类名
+ */
+ getStrengthClass(strength) {
+ const classMap = {
+ '弱': 'weak',
+ '中等': 'medium',
+ '强': 'strong',
+ '非常强': 'very-strong'
+ };
+ return classMap[strength] || 'unknown';
+ }
+
+ /**
+ * 获取强度描述
+ */
+ getStrengthDescription(strength) {
+ const descriptions = {
+ '弱': '密码强度较弱,建议增加复杂度',
+ '中等': '密码强度中等,可以进一步优化',
+ '强': '密码强度良好,安全性较高',
+ '非常强': '密码强度非常好,安全性很高'
+ };
+ return descriptions[strength] || '无法评估密码强度';
+ }
+
+ /**
+ * 设置加载状态
+ */
+ setLoadingState(loading) {
+ this.isChecking = loading;
+ this.updateCheckButtonState();
+
+ const passwordInput = document.getElementById('passwordInput');
+ if (passwordInput) {
+ passwordInput.disabled = loading;
+ }
+ }
+
+ /**
+ * 显示结果容器
+ */
+ showResultContainer() {
+ const container = document.getElementById('resultContainer');
+ if (container) {
+ container.style.display = 'block';
+ container.scrollIntoView({ behavior: 'smooth', block: 'start' });
+ }
+ }
+
+ /**
+ * 隐藏结果容器
+ */
+ hideResultContainer() {
+ const container = document.getElementById('resultContainer');
+ if (container) {
+ container.style.display = 'none';
+ }
+ }
+
+ /**
+ * 显示错误
+ */
+ showError(message) {
+ const errorContainer = document.getElementById('errorContainer');
+ const errorMessage = document.getElementById('errorMessage');
+
+ if (errorContainer && errorMessage) {
+ errorMessage.textContent = message;
+ errorContainer.style.display = 'block';
+ this.hideResultContainer();
+ errorContainer.scrollIntoView({ behavior: 'smooth', block: 'start' });
+ }
+ }
+
+ /**
+ * 隐藏错误容器
+ */
+ hideErrorContainer() {
+ const container = document.getElementById('errorContainer');
+ if (container) {
+ container.style.display = 'none';
+ }
+ }
+
+ /**
+ * 处理重试
+ */
+ handleRetry() {
+ this.hideErrorContainer();
+ const passwordInput = document.getElementById('passwordInput');
+ if (passwordInput) {
+ passwordInput.focus();
+ }
+ }
+
+ /**
+ * 更新元素内容
+ */
+ updateElement(id, content) {
+ const element = document.getElementById(id);
+ if (element) {
+ element.textContent = content;
+ }
+ }
+
+ /**
+ * 显示提示消息
+ */
+ showToast(message, type = 'success') {
+ const toast = document.getElementById('toast');
+ const toastMessage = document.getElementById('toastMessage');
+
+ if (toast && toastMessage) {
+ toastMessage.textContent = message;
+ toast.className = `toast toast-${type}`;
+ toast.style.display = 'block';
+
+ // 3秒后自动隐藏
+ setTimeout(() => {
+ toast.style.display = 'none';
+ }, 3000);
+ }
+ }
+}
+
+// 页面加载完成后初始化
+document.addEventListener('DOMContentLoaded', () => {
+ try {
+ window.passwordChecker = new PasswordStrengthChecker();
+ console.log('密码强度检测器已启动');
+ } catch (error) {
+ console.error('初始化失败:', error);
+ }
+});
+
+// 页面可见性变化处理
+document.addEventListener('visibilitychange', () => {
+ if (document.visibilityState === 'visible' && window.passwordChecker) {
+ console.log('页面重新激活');
+ }
+});
+
+// 全局错误处理
+window.addEventListener('error', (event) => {
+ console.error('全局错误:', event.error);
+ if (window.passwordChecker) {
+ window.passwordChecker.showToast('发生了意外错误,请刷新页面重试', 'error');
+ }
+});
+
+// 网络状态监听
+window.addEventListener('online', () => {
+ if (window.passwordChecker) {
+ window.passwordChecker.showToast('网络连接已恢复', 'success');
+ }
+});
+
+window.addEventListener('offline', () => {
+ if (window.passwordChecker) {
+ window.passwordChecker.showToast('网络连接已断开', 'error');
+ }
});
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/返回接口.json
index f9eba55a..ccba32e5 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/实用功能/密码强度检测/返回接口.json
@@ -1,37 +1,37 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "password": "adasdasdasdadasd",
- "length": 16,
- "score": 68,
- "strength": "中等",
- "entropy": 75.21,
- "time_to_crack": "数百万年",
- "character_analysis": {
- "has_lowercase": true,
- "has_uppercase": false,
- "has_numbers": false,
- "has_symbols": false,
- "has_repeated": false,
- "has_sequential": true,
- "character_variety": 26
- },
- "recommendations": [
- "建议包含大写字母",
- "建议包含数字",
- "建议包含特殊符号",
- "避免使用连续序列字符"
- ],
- "security_tips": [
- "使用密码管理器生成和存储复杂密码",
- "为不同账户使用不同的密码",
- "定期更换重要账户的密码",
- "启用双因素认证(2FA)增强安全性",
- "避免在公共场合输入密码",
- "不要将密码保存在浏览器中(除非使用可信的密码管理器)",
- "避免使用个人信息作为密码",
- "长密码比复杂密码更安全"
- ]
- }
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "password": "adasdasdasdadasd",
+ "length": 16,
+ "score": 68,
+ "strength": "中等",
+ "entropy": 75.21,
+ "time_to_crack": "数百万年",
+ "character_analysis": {
+ "has_lowercase": true,
+ "has_uppercase": false,
+ "has_numbers": false,
+ "has_symbols": false,
+ "has_repeated": false,
+ "has_sequential": true,
+ "character_variety": 26
+ },
+ "recommendations": [
+ "建议包含大写字母",
+ "建议包含数字",
+ "建议包含特殊符号",
+ "避免使用连续序列字符"
+ ],
+ "security_tips": [
+ "使用密码管理器生成和存储复杂密码",
+ "为不同账户使用不同的密码",
+ "定期更换重要账户的密码",
+ "启用双因素认证(2FA)增强安全性",
+ "避免在公共场合输入密码",
+ "不要将密码保存在浏览器中(除非使用可信的密码管理器)",
+ "避免使用个人信息作为密码",
+ "长密码比复杂密码更安全"
+ ]
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/css/background.css b/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/css/background.css
index f0cd4e04..7a42aa54 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/css/background.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/css/background.css
@@ -1,132 +1,132 @@
-/* 背景样式文件 - 独立分离便于迁移 */
-
-/* 主背景渐变 */
-body {
- background: linear-gradient(135deg,
- #e8f5e8 0%,
- #f1f8e9 25%,
- #e8f5e8 50%,
- #c8e6c9 75%,
- #e8f5e8 100%);
- background-size: 400% 400%;
- animation: backgroundShift 15s ease-in-out infinite;
- position: relative;
-}
-
-/* 背景动画 */
-@keyframes backgroundShift {
- 0%, 100% {
- background-position: 0% 50%;
- }
- 25% {
- background-position: 100% 50%;
- }
- 50% {
- background-position: 50% 100%;
- }
- 75% {
- background-position: 50% 0%;
- }
-}
-
-/* 背景装饰元素 */
-body::before {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- radial-gradient(circle at 20% 20%, rgba(76, 175, 80, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 80% 80%, rgba(129, 199, 132, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 40% 60%, rgba(165, 214, 167, 0.08) 0%, transparent 50%);
- pointer-events: none;
- z-index: -1;
- animation: floatingBubbles 20s ease-in-out infinite;
-}
-
-@keyframes floatingBubbles {
- 0%, 100% {
- transform: translateY(0px) rotate(0deg);
- opacity: 1;
- }
- 33% {
- transform: translateY(-20px) rotate(120deg);
- opacity: 0.8;
- }
- 66% {
- transform: translateY(10px) rotate(240deg);
- opacity: 0.9;
- }
-}
-
-/* 背景粒子效果 */
-body::after {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- radial-gradient(2px 2px at 20px 30px, rgba(76, 175, 80, 0.3), transparent),
- radial-gradient(2px 2px at 40px 70px, rgba(129, 199, 132, 0.2), transparent),
- radial-gradient(1px 1px at 90px 40px, rgba(165, 214, 167, 0.3), transparent),
- radial-gradient(1px 1px at 130px 80px, rgba(76, 175, 80, 0.2), transparent),
- radial-gradient(2px 2px at 160px 30px, rgba(129, 199, 132, 0.3), transparent);
- background-repeat: repeat;
- background-size: 200px 100px;
- pointer-events: none;
- z-index: -1;
- animation: particleFloat 25s linear infinite;
-}
-
-@keyframes particleFloat {
- 0% {
- transform: translateY(0px);
- }
- 100% {
- transform: translateY(-100px);
- }
-}
-
-/* 响应式背景调整 */
-@media (max-width: 768px) {
- body::after {
- background-size: 150px 75px;
- animation-duration: 20s;
- }
-
- body::before {
- animation-duration: 15s;
- }
-}
-
-@media (max-width: 480px) {
- body::after {
- background-size: 100px 50px;
- animation-duration: 15s;
- }
-
- body::before {
- animation-duration: 12s;
- }
-
- body {
- animation-duration: 12s;
- }
-}
-
-/* 高性能模式 - 减少动画 */
-@media (prefers-reduced-motion: reduce) {
- body,
- body::before,
- body::after {
- animation: none;
- }
-
- body {
- background: linear-gradient(135deg, #e8f5e8 0%, #f1f8e9 50%, #c8e6c9 100%);
- }
+/* 背景样式文件 - 独立分离便于迁移 */
+
+/* 主背景渐变 */
+body {
+ background: linear-gradient(135deg,
+ #e8f5e8 0%,
+ #f1f8e9 25%,
+ #e8f5e8 50%,
+ #c8e6c9 75%,
+ #e8f5e8 100%);
+ background-size: 400% 400%;
+ animation: backgroundShift 15s ease-in-out infinite;
+ position: relative;
+}
+
+/* 背景动画 */
+@keyframes backgroundShift {
+ 0%, 100% {
+ background-position: 0% 50%;
+ }
+ 25% {
+ background-position: 100% 50%;
+ }
+ 50% {
+ background-position: 50% 100%;
+ }
+ 75% {
+ background-position: 50% 0%;
+ }
+}
+
+/* 背景装饰元素 */
+body::before {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(circle at 20% 20%, rgba(76, 175, 80, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 80% 80%, rgba(129, 199, 132, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 40% 60%, rgba(165, 214, 167, 0.08) 0%, transparent 50%);
+ pointer-events: none;
+ z-index: -1;
+ animation: floatingBubbles 20s ease-in-out infinite;
+}
+
+@keyframes floatingBubbles {
+ 0%, 100% {
+ transform: translateY(0px) rotate(0deg);
+ opacity: 1;
+ }
+ 33% {
+ transform: translateY(-20px) rotate(120deg);
+ opacity: 0.8;
+ }
+ 66% {
+ transform: translateY(10px) rotate(240deg);
+ opacity: 0.9;
+ }
+}
+
+/* 背景粒子效果 */
+body::after {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(2px 2px at 20px 30px, rgba(76, 175, 80, 0.3), transparent),
+ radial-gradient(2px 2px at 40px 70px, rgba(129, 199, 132, 0.2), transparent),
+ radial-gradient(1px 1px at 90px 40px, rgba(165, 214, 167, 0.3), transparent),
+ radial-gradient(1px 1px at 130px 80px, rgba(76, 175, 80, 0.2), transparent),
+ radial-gradient(2px 2px at 160px 30px, rgba(129, 199, 132, 0.3), transparent);
+ background-repeat: repeat;
+ background-size: 200px 100px;
+ pointer-events: none;
+ z-index: -1;
+ animation: particleFloat 25s linear infinite;
+}
+
+@keyframes particleFloat {
+ 0% {
+ transform: translateY(0px);
+ }
+ 100% {
+ transform: translateY(-100px);
+ }
+}
+
+/* 响应式背景调整 */
+@media (max-width: 768px) {
+ body::after {
+ background-size: 150px 75px;
+ animation-duration: 20s;
+ }
+
+ body::before {
+ animation-duration: 15s;
+ }
+}
+
+@media (max-width: 480px) {
+ body::after {
+ background-size: 100px 50px;
+ animation-duration: 15s;
+ }
+
+ body::before {
+ animation-duration: 12s;
+ }
+
+ body {
+ animation-duration: 12s;
+ }
+}
+
+/* 高性能模式 - 减少动画 */
+@media (prefers-reduced-motion: reduce) {
+ body,
+ body::before,
+ body::after {
+ animation: none;
+ }
+
+ body {
+ background: linear-gradient(135deg, #e8f5e8 0%, #f1f8e9 50%, #c8e6c9 100%);
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/css/style.css b/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/css/style.css
index ca4dd96c..cb6f2b71 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/css/style.css
@@ -1,468 +1,468 @@
-/* 基础样式重置 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
- line-height: 1.6;
- color: #2d5a3d;
- min-height: 100vh;
- overflow-x: hidden;
-}
-
-/* 容器样式 */
-.container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 20px;
- min-height: 100vh;
- display: flex;
- flex-direction: column;
- position: relative;
- z-index: 1;
-}
-
-/* 头部样式 */
-.header {
- text-align: center;
- margin-bottom: 40px;
- padding: 40px 20px;
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(20px);
- border-radius: 20px;
- box-shadow: 0 8px 32px rgba(76, 175, 80, 0.1);
- border: 1px solid rgba(76, 175, 80, 0.2);
- position: relative;
- overflow: hidden;
-}
-
-.header::before {
- content: '';
- position: absolute;
- top: 0;
- left: -100%;
- width: 100%;
- height: 4px;
- background: linear-gradient(90deg, transparent, #4caf50, transparent);
- animation: headerGlow 3s ease-in-out infinite;
-}
-
-@keyframes headerGlow {
- 0% { left: -100%; }
- 50% { left: 100%; }
- 100% { left: 100%; }
-}
-
-.header h1 {
- font-size: 2.5rem;
- font-weight: 700;
- background: linear-gradient(135deg, #4caf50, #81c784, #4caf50);
- background-size: 200% 200%;
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
- margin-bottom: 10px;
- animation: titleGradient 4s ease-in-out infinite;
-}
-
-@keyframes titleGradient {
- 0%, 100% { background-position: 0% 50%; }
- 50% { background-position: 100% 50%; }
-}
-
-.header p {
- font-size: 1.1rem;
- color: #66bb6a;
- opacity: 0.9;
-}
-
-/* 主要内容区域 */
-.main {
- flex: 1;
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 40px;
- align-items: start;
-}
-
-/* 表单容器 */
-.form-container {
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(20px);
- padding: 35px;
- border-radius: 20px;
- box-shadow: 0 8px 32px rgba(76, 175, 80, 0.1);
- border: 1px solid rgba(76, 175, 80, 0.2);
- transition: all 0.3s ease;
-}
-
-.form-container:hover {
- transform: translateY(-5px);
- box-shadow: 0 12px 40px rgba(76, 175, 80, 0.15);
-}
-
-/* 表单样式 */
-.qr-form {
- display: flex;
- flex-direction: column;
- gap: 25px;
-}
-
-.input-group {
- display: flex;
- flex-direction: column;
- gap: 8px;
-}
-
-.input-group label {
- font-weight: 600;
- color: #2d5a3d;
- font-size: 0.95rem;
-}
-
-textarea, select {
- padding: 12px 16px;
- border: 2px solid rgba(76, 175, 80, 0.3);
- border-radius: 12px;
- font-size: 1rem;
- background: rgba(255, 255, 255, 0.9);
- transition: all 0.3s ease;
- resize: vertical;
-}
-
-textarea {
- min-height: 100px;
- font-family: inherit;
-}
-
-textarea:focus, select:focus {
- outline: none;
- border-color: #4caf50;
- box-shadow: 0 0 0 3px rgba(76, 175, 80, 0.1);
- background: rgba(255, 255, 255, 1);
-}
-
-.options-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
- gap: 20px;
-}
-
-/* 按钮样式 */
-.generate-btn {
- padding: 15px 30px;
- background: linear-gradient(135deg, #4caf50, #66bb6a);
- color: white;
- border: none;
- border-radius: 12px;
- font-size: 1.1rem;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.3s ease;
- position: relative;
- overflow: hidden;
- letter-spacing: 0.5px;
-}
-
-.generate-btn::before {
- content: '';
- position: absolute;
- top: 0;
- left: -100%;
- width: 100%;
- height: 100%;
- background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
- transition: left 0.5s ease;
-}
-
-.generate-btn:hover::before {
- left: 100%;
-}
-
-.generate-btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 8px 25px rgba(76, 175, 80, 0.3);
-}
-
-.generate-btn:active {
- transform: translateY(0);
-}
-
-.generate-btn.loading .btn-text {
- display: none;
-}
-
-.generate-btn.loading .btn-loading {
- display: inline;
-}
-
-.btn-loading {
- display: none;
-}
-
-/* 结果容器 */
-.result-container {
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(20px);
- padding: 35px;
- border-radius: 20px;
- box-shadow: 0 8px 32px rgba(76, 175, 80, 0.1);
- border: 1px solid rgba(76, 175, 80, 0.2);
- min-height: 400px;
- display: flex;
- align-items: center;
- justify-content: center;
- transition: all 0.3s ease;
-}
-
-/* 加载动画 */
-.loading {
- text-align: center;
- color: #4caf50;
-}
-
-.loading-spinner {
- width: 50px;
- height: 50px;
- border: 4px solid rgba(76, 175, 80, 0.2);
- border-top: 4px solid #4caf50;
- border-radius: 50%;
- animation: spin 1s linear infinite;
- margin: 0 auto 20px;
-}
-
-@keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-/* 错误样式 */
-.error {
- text-align: center;
- color: #d32f2f;
-}
-
-.error-icon {
- font-size: 3rem;
- margin-bottom: 15px;
-}
-
-.error-message {
- font-size: 1.1rem;
- margin-bottom: 20px;
- color: #666;
-}
-
-.retry-btn {
- padding: 10px 20px;
- background: #4caf50;
- color: white;
- border: none;
- border-radius: 8px;
- cursor: pointer;
- transition: all 0.3s ease;
-}
-
-.retry-btn:hover {
- background: #45a049;
- transform: translateY(-1px);
-}
-
-/* 结果显示 */
-.result {
- width: 100%;
- text-align: center;
-}
-
-.qr-display {
- margin-bottom: 25px;
-}
-
-.qr-display img {
- max-width: 100%;
- height: auto;
- border-radius: 12px;
- box-shadow: 0 4px 20px rgba(76, 175, 80, 0.2);
- transition: all 0.3s ease;
-}
-
-.qr-display img:hover {
- transform: scale(1.05);
- box-shadow: 0 8px 30px rgba(76, 175, 80, 0.3);
-}
-
-.result-info {
- display: flex;
- flex-direction: column;
- gap: 20px;
-}
-
-.result-text {
- font-size: 1rem;
- color: #666;
- word-break: break-all;
- background: rgba(76, 175, 80, 0.1);
- padding: 12px;
- border-radius: 8px;
- border-left: 4px solid #4caf50;
-}
-
-.result-actions {
- display: flex;
- gap: 10px;
- justify-content: center;
- flex-wrap: wrap;
-}
-
-.download-btn, .copy-btn, .new-btn {
- padding: 10px 16px;
- border: none;
- border-radius: 8px;
- cursor: pointer;
- font-size: 0.9rem;
- font-weight: 500;
- transition: all 0.3s ease;
-}
-
-.download-btn {
- background: #4caf50;
- color: white;
-}
-
-.copy-btn {
- background: #2196f3;
- color: white;
-}
-
-.new-btn {
- background: #ff9800;
- color: white;
-}
-
-.download-btn:hover, .copy-btn:hover, .new-btn:hover {
- transform: translateY(-1px);
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
-}
-
-/* 隐藏类 */
-.hidden {
- display: none !important;
-}
-
-/* 页脚样式 */
-.footer {
- text-align: center;
- margin-top: 40px;
- padding: 25px;
- background: rgba(255, 255, 255, 0.9);
- backdrop-filter: blur(15px);
- border-radius: 15px;
- color: #66bb6a;
- font-size: 0.9rem;
- border: 1px solid rgba(76, 175, 80, 0.1);
-}
-
-/* 平板端适配 (768px - 1024px) */
-@media (max-width: 1024px) and (min-width: 768px) {
- .container {
- max-width: 95%;
- padding: 15px;
- }
-
- .main {
- gap: 30px;
- }
-
- .header h1 {
- font-size: 2.2rem;
- }
-
- .form-container, .result-container {
- padding: 25px;
- }
-
- .options-grid {
- grid-template-columns: repeat(2, 1fr);
- }
-}
-
-/* 手机端适配 (最大768px) */
-@media (max-width: 768px) {
- .container {
- padding: 10px;
- }
-
- .header {
- margin-bottom: 25px;
- padding: 25px 15px;
- }
-
- .header h1 {
- font-size: 1.8rem;
- }
-
- .header p {
- font-size: 1rem;
- }
-
- .main {
- grid-template-columns: 1fr;
- gap: 25px;
- }
-
- .form-container, .result-container {
- padding: 20px;
- }
-
- .options-grid {
- grid-template-columns: 1fr;
- gap: 15px;
- }
-
- .result-actions {
- flex-direction: column;
- align-items: center;
- }
-
- .download-btn, .copy-btn, .new-btn {
- width: 100%;
- max-width: 200px;
- }
-}
-
-/* 小屏手机适配 (最大480px) */
-@media (max-width: 480px) {
- .container {
- padding: 8px;
- }
-
- .header {
- padding: 20px 10px;
- margin-bottom: 20px;
- }
-
- .header h1 {
- font-size: 1.6rem;
- }
-
- .form-container, .result-container {
- padding: 15px;
- border-radius: 15px;
- }
-
- .generate-btn {
- padding: 12px 20px;
- font-size: 1rem;
- }
-
- textarea {
- min-height: 80px;
- }
-
- .qr-display img {
- max-width: 90%;
- }
+/* 基础样式重置 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ line-height: 1.6;
+ color: #2d5a3d;
+ min-height: 100vh;
+ overflow-x: hidden;
+}
+
+/* 容器样式 */
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ position: relative;
+ z-index: 1;
+}
+
+/* 头部样式 */
+.header {
+ text-align: center;
+ margin-bottom: 40px;
+ padding: 40px 20px;
+ background: rgba(255, 255, 255, 0.95);
+ backdrop-filter: blur(20px);
+ border-radius: 20px;
+ box-shadow: 0 8px 32px rgba(76, 175, 80, 0.1);
+ border: 1px solid rgba(76, 175, 80, 0.2);
+ position: relative;
+ overflow: hidden;
+}
+
+.header::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: -100%;
+ width: 100%;
+ height: 4px;
+ background: linear-gradient(90deg, transparent, #4caf50, transparent);
+ animation: headerGlow 3s ease-in-out infinite;
+}
+
+@keyframes headerGlow {
+ 0% { left: -100%; }
+ 50% { left: 100%; }
+ 100% { left: 100%; }
+}
+
+.header h1 {
+ font-size: 2.5rem;
+ font-weight: 700;
+ background: linear-gradient(135deg, #4caf50, #81c784, #4caf50);
+ background-size: 200% 200%;
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ margin-bottom: 10px;
+ animation: titleGradient 4s ease-in-out infinite;
+}
+
+@keyframes titleGradient {
+ 0%, 100% { background-position: 0% 50%; }
+ 50% { background-position: 100% 50%; }
+}
+
+.header p {
+ font-size: 1.1rem;
+ color: #66bb6a;
+ opacity: 0.9;
+}
+
+/* 主要内容区域 */
+.main {
+ flex: 1;
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 40px;
+ align-items: start;
+}
+
+/* 表单容器 */
+.form-container {
+ background: rgba(255, 255, 255, 0.95);
+ backdrop-filter: blur(20px);
+ padding: 35px;
+ border-radius: 20px;
+ box-shadow: 0 8px 32px rgba(76, 175, 80, 0.1);
+ border: 1px solid rgba(76, 175, 80, 0.2);
+ transition: all 0.3s ease;
+}
+
+.form-container:hover {
+ transform: translateY(-5px);
+ box-shadow: 0 12px 40px rgba(76, 175, 80, 0.15);
+}
+
+/* 表单样式 */
+.qr-form {
+ display: flex;
+ flex-direction: column;
+ gap: 25px;
+}
+
+.input-group {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.input-group label {
+ font-weight: 600;
+ color: #2d5a3d;
+ font-size: 0.95rem;
+}
+
+textarea, select {
+ padding: 12px 16px;
+ border: 2px solid rgba(76, 175, 80, 0.3);
+ border-radius: 12px;
+ font-size: 1rem;
+ background: rgba(255, 255, 255, 0.9);
+ transition: all 0.3s ease;
+ resize: vertical;
+}
+
+textarea {
+ min-height: 100px;
+ font-family: inherit;
+}
+
+textarea:focus, select:focus {
+ outline: none;
+ border-color: #4caf50;
+ box-shadow: 0 0 0 3px rgba(76, 175, 80, 0.1);
+ background: rgba(255, 255, 255, 1);
+}
+
+.options-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
+ gap: 20px;
+}
+
+/* 按钮样式 */
+.generate-btn {
+ padding: 15px 30px;
+ background: linear-gradient(135deg, #4caf50, #66bb6a);
+ color: white;
+ border: none;
+ border-radius: 12px;
+ font-size: 1.1rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ position: relative;
+ overflow: hidden;
+ letter-spacing: 0.5px;
+}
+
+.generate-btn::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: -100%;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
+ transition: left 0.5s ease;
+}
+
+.generate-btn:hover::before {
+ left: 100%;
+}
+
+.generate-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 8px 25px rgba(76, 175, 80, 0.3);
+}
+
+.generate-btn:active {
+ transform: translateY(0);
+}
+
+.generate-btn.loading .btn-text {
+ display: none;
+}
+
+.generate-btn.loading .btn-loading {
+ display: inline;
+}
+
+.btn-loading {
+ display: none;
+}
+
+/* 结果容器 */
+.result-container {
+ background: rgba(255, 255, 255, 0.95);
+ backdrop-filter: blur(20px);
+ padding: 35px;
+ border-radius: 20px;
+ box-shadow: 0 8px 32px rgba(76, 175, 80, 0.1);
+ border: 1px solid rgba(76, 175, 80, 0.2);
+ min-height: 400px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: all 0.3s ease;
+}
+
+/* 加载动画 */
+.loading {
+ text-align: center;
+ color: #4caf50;
+}
+
+.loading-spinner {
+ width: 50px;
+ height: 50px;
+ border: 4px solid rgba(76, 175, 80, 0.2);
+ border-top: 4px solid #4caf50;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ margin: 0 auto 20px;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+/* 错误样式 */
+.error {
+ text-align: center;
+ color: #d32f2f;
+}
+
+.error-icon {
+ font-size: 3rem;
+ margin-bottom: 15px;
+}
+
+.error-message {
+ font-size: 1.1rem;
+ margin-bottom: 20px;
+ color: #666;
+}
+
+.retry-btn {
+ padding: 10px 20px;
+ background: #4caf50;
+ color: white;
+ border: none;
+ border-radius: 8px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+}
+
+.retry-btn:hover {
+ background: #45a049;
+ transform: translateY(-1px);
+}
+
+/* 结果显示 */
+.result {
+ width: 100%;
+ text-align: center;
+}
+
+.qr-display {
+ margin-bottom: 25px;
+}
+
+.qr-display img {
+ max-width: 100%;
+ height: auto;
+ border-radius: 12px;
+ box-shadow: 0 4px 20px rgba(76, 175, 80, 0.2);
+ transition: all 0.3s ease;
+}
+
+.qr-display img:hover {
+ transform: scale(1.05);
+ box-shadow: 0 8px 30px rgba(76, 175, 80, 0.3);
+}
+
+.result-info {
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+}
+
+.result-text {
+ font-size: 1rem;
+ color: #666;
+ word-break: break-all;
+ background: rgba(76, 175, 80, 0.1);
+ padding: 12px;
+ border-radius: 8px;
+ border-left: 4px solid #4caf50;
+}
+
+.result-actions {
+ display: flex;
+ gap: 10px;
+ justify-content: center;
+ flex-wrap: wrap;
+}
+
+.download-btn, .copy-btn, .new-btn {
+ padding: 10px 16px;
+ border: none;
+ border-radius: 8px;
+ cursor: pointer;
+ font-size: 0.9rem;
+ font-weight: 500;
+ transition: all 0.3s ease;
+}
+
+.download-btn {
+ background: #4caf50;
+ color: white;
+}
+
+.copy-btn {
+ background: #2196f3;
+ color: white;
+}
+
+.new-btn {
+ background: #ff9800;
+ color: white;
+}
+
+.download-btn:hover, .copy-btn:hover, .new-btn:hover {
+ transform: translateY(-1px);
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
+}
+
+/* 隐藏类 */
+.hidden {
+ display: none !important;
+}
+
+/* 页脚样式 */
+.footer {
+ text-align: center;
+ margin-top: 40px;
+ padding: 25px;
+ background: rgba(255, 255, 255, 0.9);
+ backdrop-filter: blur(15px);
+ border-radius: 15px;
+ color: #66bb6a;
+ font-size: 0.9rem;
+ border: 1px solid rgba(76, 175, 80, 0.1);
+}
+
+/* 平板端适配 (768px - 1024px) */
+@media (max-width: 1024px) and (min-width: 768px) {
+ .container {
+ max-width: 95%;
+ padding: 15px;
+ }
+
+ .main {
+ gap: 30px;
+ }
+
+ .header h1 {
+ font-size: 2.2rem;
+ }
+
+ .form-container, .result-container {
+ padding: 25px;
+ }
+
+ .options-grid {
+ grid-template-columns: repeat(2, 1fr);
+ }
+}
+
+/* 手机端适配 (最大768px) */
+@media (max-width: 768px) {
+ .container {
+ padding: 10px;
+ }
+
+ .header {
+ margin-bottom: 25px;
+ padding: 25px 15px;
+ }
+
+ .header h1 {
+ font-size: 1.8rem;
+ }
+
+ .header p {
+ font-size: 1rem;
+ }
+
+ .main {
+ grid-template-columns: 1fr;
+ gap: 25px;
+ }
+
+ .form-container, .result-container {
+ padding: 20px;
+ }
+
+ .options-grid {
+ grid-template-columns: 1fr;
+ gap: 15px;
+ }
+
+ .result-actions {
+ flex-direction: column;
+ align-items: center;
+ }
+
+ .download-btn, .copy-btn, .new-btn {
+ width: 100%;
+ max-width: 200px;
+ }
+}
+
+/* 小屏手机适配 (最大480px) */
+@media (max-width: 480px) {
+ .container {
+ padding: 8px;
+ }
+
+ .header {
+ padding: 20px 10px;
+ margin-bottom: 20px;
+ }
+
+ .header h1 {
+ font-size: 1.6rem;
+ }
+
+ .form-container, .result-container {
+ padding: 15px;
+ border-radius: 15px;
+ }
+
+ .generate-btn {
+ padding: 12px 20px;
+ font-size: 1rem;
+ }
+
+ textarea {
+ min-height: 80px;
+ }
+
+ .qr-display img {
+ max-width: 90%;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/index.html b/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/index.html
index f9366891..d2aeae8b 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/index.html
+++ b/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/index.html
@@ -1,98 +1,98 @@
-
-
-
-
-
- 二维码生成器
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
![生成的二维码]()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ 二维码生成器
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
![生成的二维码]()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/js/script.js b/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/js/script.js
index 1b17ffe6..b10d7602 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/js/script.js
@@ -1,453 +1,453 @@
-// 二维码生成器 JavaScript
-class QRCodeGenerator {
- constructor() {
- this.apiEndpoints = [];
- this.currentApiIndex = 0;
- this.init();
- }
-
- // 初始化
- async init() {
- await this.loadApiEndpoints();
- this.bindEvents();
- this.setupFormValidation();
- }
-
- // 加载API接口列表
- async loadApiEndpoints() {
- try {
- // 直接在代码中配置API接口,避免CORS问题
- this.apiEndpoints = [
- "https://60s.api.shumengya.top"
- ];
- console.log('已加载API接口:', this.apiEndpoints);
- } catch (error) {
- console.error('加载API接口失败:', error);
- this.showError('加载配置失败,请刷新页面重试');
- }
- }
-
- // 绑定事件
- bindEvents() {
- const form = document.getElementById('qrForm');
- const retryBtn = document.querySelector('.retry-btn');
- const downloadBtn = document.querySelector('.download-btn');
- const copyBtn = document.querySelector('.copy-btn');
- const newBtn = document.querySelector('.new-btn');
- const textArea = document.getElementById('text');
-
- if (form) {
- form.addEventListener('submit', (e) => this.handleSubmit(e));
- }
- if (retryBtn) {
- retryBtn.addEventListener('click', () => this.retryGeneration());
- }
- if (downloadBtn) {
- downloadBtn.addEventListener('click', () => this.downloadQRCode());
- }
- if (copyBtn) {
- copyBtn.addEventListener('click', () => this.copyImageLink());
- }
- if (newBtn) {
- newBtn.addEventListener('click', () => this.resetForm());
- }
- if (textArea) {
- textArea.addEventListener('input', () => this.updateCharCount());
- }
- }
-
- // 设置表单验证
- setupFormValidation() {
- const textArea = document.getElementById('text');
- const form = document.getElementById('qrForm');
-
- textArea.addEventListener('blur', () => {
- if (textArea.value.trim() === '') {
- this.showFieldError(textArea, '请输入要生成二维码的内容');
- } else {
- this.clearFieldError(textArea);
- }
- });
- }
-
- // 显示字段错误
- showFieldError(field, message) {
- this.clearFieldError(field);
- field.style.borderColor = '#d32f2f';
- const errorDiv = document.createElement('div');
- errorDiv.className = 'field-error';
- errorDiv.style.color = '#d32f2f';
- errorDiv.style.fontSize = '0.8rem';
- errorDiv.style.marginTop = '5px';
- errorDiv.textContent = message;
- field.parentNode.appendChild(errorDiv);
- }
-
- // 清除字段错误
- clearFieldError(field) {
- field.style.borderColor = '';
- const errorDiv = field.parentNode.querySelector('.field-error');
- if (errorDiv) {
- errorDiv.remove();
- }
- }
-
- // 更新字符计数
- updateCharCount() {
- const textArea = document.getElementById('text');
- const text = textArea.value;
- const length = text.length;
-
- // 移除旧的计数显示
- const oldCounter = textArea.parentNode.querySelector('.char-counter');
- if (oldCounter) oldCounter.remove();
-
- // 添加新的计数显示
- if (length > 0) {
- const counter = document.createElement('div');
- counter.className = 'char-counter';
- counter.style.fontSize = '0.8rem';
- counter.style.color = '#666';
- counter.style.textAlign = 'right';
- counter.style.marginTop = '5px';
- counter.textContent = `${length} 个字符`;
- textArea.parentNode.appendChild(counter);
- }
- }
-
- // 处理表单提交
- async handleSubmit(e) {
- e.preventDefault();
-
- const formData = new FormData(e.target);
- const params = {
- text: formData.get('text').trim(),
- size: formData.get('size'),
- level: formData.get('level'),
- encoding: formData.get('encoding')
- };
-
- // 验证输入
- if (!params.text) {
- this.showFieldError(document.getElementById('text'), '请输入要生成二维码的内容');
- return;
- }
-
- this.showLoading();
- await this.generateQRCode(params);
- }
-
- // 生成二维码
- async generateQRCode(params) {
- let success = false;
- let lastError = null;
-
- // 尝试所有API接口
- for (let i = 0; i < this.apiEndpoints.length; i++) {
- const apiIndex = (this.currentApiIndex + i) % this.apiEndpoints.length;
- const apiUrl = this.apiEndpoints[apiIndex];
-
- try {
- console.log(`尝试API ${apiIndex + 1}:`, apiUrl);
- const result = await this.callAPI(apiUrl, params);
-
- if (result.success) {
- this.currentApiIndex = apiIndex; // 记录成功的API
- this.showResult(result.data, params);
- success = true;
- break;
- }
- } catch (error) {
- console.warn(`API ${apiIndex + 1} 失败:`, error);
- lastError = error;
- }
- }
-
- if (!success) {
- this.showError(lastError?.message || '所有API接口都无法访问,请稍后重试');
- }
- }
-
- // 调用API
- async callAPI(baseUrl, params) {
- const url = new URL('/v2/qrcode', baseUrl);
-
- // 添加查询参数
- Object.entries(params).forEach(([key, value]) => {
- if (value !== null && value !== undefined && value !== '') {
- url.searchParams.append(key, value);
- }
- });
-
- console.log('请求URL:', url.toString());
-
- const controller = new AbortController();
- const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时
-
- try {
- const response = await fetch(url.toString(), {
- method: 'GET',
- signal: controller.signal,
- headers: {
- 'Accept': 'application/json, image/*'
- }
- });
-
- clearTimeout(timeoutId);
-
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
- }
-
- // 根据返回格式处理
- if (params.encoding === 'image' || !params.encoding) {
- // 默认返回图片格式
- const contentType = response.headers.get('content-type');
- if (contentType && contentType.startsWith('image/')) {
- const blob = await response.blob();
- const imageUrl = URL.createObjectURL(blob);
- return {
- success: true,
- data: {
- imageUrl: imageUrl,
- text: params.text,
- size: params.size,
- level: params.level,
- format: 'image'
- }
- };
- } else {
- // 如果返回的不是图片,尝试解析JSON
- const jsonData = await response.json();
- if (jsonData.code === 0 && jsonData.data && jsonData.data.data_uri) {
- return {
- success: true,
- data: {
- imageUrl: jsonData.data.data_uri,
- text: params.text,
- size: params.size,
- level: params.level,
- format: 'json',
- base64: jsonData.data.base64,
- mimeType: jsonData.data.mime_type
- }
- };
- } else {
- throw new Error(jsonData.message || '生成失败');
- }
- }
- } else {
- // JSON或text格式
- const jsonData = await response.json();
- if (jsonData.code === 0 && jsonData.data) {
- return {
- success: true,
- data: {
- imageUrl: jsonData.data.data_uri,
- text: params.text,
- size: params.size,
- level: params.level,
- format: params.encoding,
- base64: jsonData.data.base64,
- mimeType: jsonData.data.mime_type
- }
- };
- } else {
- throw new Error(jsonData.message || '生成失败');
- }
- }
- } catch (error) {
- clearTimeout(timeoutId);
- if (error.name === 'AbortError') {
- throw new Error('请求超时,请重试');
- }
- throw error;
- }
- }
-
- // 显示加载状态
- showLoading() {
- this.hideAllStates();
- document.getElementById('loading').classList.remove('hidden');
-
- const btn = document.querySelector('.generate-btn');
- btn.classList.add('loading');
- btn.disabled = true;
- }
-
- // 显示错误
- showError(message) {
- this.hideAllStates();
- const errorDiv = document.getElementById('error');
- const errorMessage = errorDiv.querySelector('.error-message');
- errorMessage.textContent = message;
- errorDiv.classList.remove('hidden');
-
- this.resetButton();
- }
-
- // 显示结果
- showResult(data, params) {
- this.hideAllStates();
-
- const resultDiv = document.getElementById('result');
- const qrImage = document.getElementById('qrImage');
- const resultText = document.querySelector('.result-text');
-
- qrImage.src = data.imageUrl;
- qrImage.alt = `二维码: ${data.text}`;
-
- resultText.innerHTML = `
- 内容: ${this.escapeHtml(data.text)}
- 尺寸: ${data.size}x${data.size}
- 容错级别: ${data.level}
- 格式: ${data.format.toUpperCase()}
- `;
-
- resultDiv.classList.remove('hidden');
- this.resetButton();
-
- // 保存数据供下载使用
- this.currentQRData = data;
- }
-
- // 隐藏所有状态
- hideAllStates() {
- document.getElementById('loading').classList.add('hidden');
- document.getElementById('error').classList.add('hidden');
- document.getElementById('result').classList.add('hidden');
- }
-
- // 重置按钮状态
- resetButton() {
- const btn = document.querySelector('.generate-btn');
- btn.classList.remove('loading');
- btn.disabled = false;
- }
-
- // 重试生成
- async retryGeneration() {
- const form = document.getElementById('qrForm');
- const formData = new FormData(form);
- const params = {
- text: formData.get('text').trim(),
- size: formData.get('size'),
- level: formData.get('level'),
- encoding: formData.get('encoding')
- };
-
- this.showLoading();
- await this.generateQRCode(params);
- }
-
- // 下载二维码
- downloadQRCode() {
- if (!this.currentQRData) return;
-
- const link = document.createElement('a');
- link.href = this.currentQRData.imageUrl;
- link.download = `qrcode_${Date.now()}.png`;
- document.body.appendChild(link);
- link.click();
- document.body.removeChild(link);
-
- this.showToast('二维码已下载');
- }
-
- // 复制图片链接
- async copyImageLink() {
- if (!this.currentQRData) return;
-
- try {
- await navigator.clipboard.writeText(this.currentQRData.imageUrl);
- this.showToast('链接已复制到剪贴板');
- } catch (error) {
- console.error('复制失败:', error);
- this.showToast('复制失败,请手动复制');
- }
- }
-
- // 重置表单
- resetForm() {
- document.getElementById('qrForm').reset();
- this.hideAllStates();
- this.currentQRData = null;
-
- // 清除字符计数
- const counter = document.querySelector('.char-counter');
- if (counter) counter.remove();
-
- // 清除字段错误
- document.querySelectorAll('input, textarea, select').forEach(field => {
- this.clearFieldError(field);
- });
-
- // 聚焦到文本框
- document.getElementById('text').focus();
- }
-
- // 显示提示消息
- showToast(message) {
- // 移除旧的toast
- const oldToast = document.querySelector('.toast');
- if (oldToast) oldToast.remove();
-
- const toast = document.createElement('div');
- toast.className = 'toast';
- toast.style.cssText = `
- position: fixed;
- top: 20px;
- right: 20px;
- background: #4caf50;
- color: white;
- padding: 12px 20px;
- border-radius: 8px;
- box-shadow: 0 4px 12px rgba(0,0,0,0.2);
- z-index: 1000;
- animation: slideIn 0.3s ease;
- `;
- toast.textContent = message;
-
- document.body.appendChild(toast);
-
- setTimeout(() => {
- toast.style.animation = 'slideOut 0.3s ease';
- setTimeout(() => toast.remove(), 300);
- }, 3000);
- }
-
- // HTML转义
- escapeHtml(text) {
- const div = document.createElement('div');
- div.textContent = text;
- return div.innerHTML;
- }
-}
-
-// 添加CSS动画
-const style = document.createElement('style');
-style.textContent = `
- @keyframes slideIn {
- from { transform: translateX(100%); opacity: 0; }
- to { transform: translateX(0); opacity: 1; }
- }
- @keyframes slideOut {
- from { transform: translateX(0); opacity: 1; }
- to { transform: translateX(100%); opacity: 0; }
- }
-`;
-document.head.appendChild(style);
-
-// 页面加载完成后初始化
-document.addEventListener('DOMContentLoaded', () => {
- new QRCodeGenerator();
-});
-
-// 错误处理
-window.addEventListener('error', (e) => {
- console.error('全局错误:', e.error);
-});
-
-window.addEventListener('unhandledrejection', (e) => {
- console.error('未处理的Promise拒绝:', e.reason);
+// 二维码生成器 JavaScript
+class QRCodeGenerator {
+ constructor() {
+ this.apiEndpoints = [];
+ this.currentApiIndex = 0;
+ this.init();
+ }
+
+ // 初始化
+ async init() {
+ await this.loadApiEndpoints();
+ this.bindEvents();
+ this.setupFormValidation();
+ }
+
+ // 加载API接口列表
+ async loadApiEndpoints() {
+ try {
+ // 直接在代码中配置API接口,避免CORS问题
+ this.apiEndpoints = [
+ "https://60s.api.shumengya.top"
+ ];
+ console.log('已加载API接口:', this.apiEndpoints);
+ } catch (error) {
+ console.error('加载API接口失败:', error);
+ this.showError('加载配置失败,请刷新页面重试');
+ }
+ }
+
+ // 绑定事件
+ bindEvents() {
+ const form = document.getElementById('qrForm');
+ const retryBtn = document.querySelector('.retry-btn');
+ const downloadBtn = document.querySelector('.download-btn');
+ const copyBtn = document.querySelector('.copy-btn');
+ const newBtn = document.querySelector('.new-btn');
+ const textArea = document.getElementById('text');
+
+ if (form) {
+ form.addEventListener('submit', (e) => this.handleSubmit(e));
+ }
+ if (retryBtn) {
+ retryBtn.addEventListener('click', () => this.retryGeneration());
+ }
+ if (downloadBtn) {
+ downloadBtn.addEventListener('click', () => this.downloadQRCode());
+ }
+ if (copyBtn) {
+ copyBtn.addEventListener('click', () => this.copyImageLink());
+ }
+ if (newBtn) {
+ newBtn.addEventListener('click', () => this.resetForm());
+ }
+ if (textArea) {
+ textArea.addEventListener('input', () => this.updateCharCount());
+ }
+ }
+
+ // 设置表单验证
+ setupFormValidation() {
+ const textArea = document.getElementById('text');
+ const form = document.getElementById('qrForm');
+
+ textArea.addEventListener('blur', () => {
+ if (textArea.value.trim() === '') {
+ this.showFieldError(textArea, '请输入要生成二维码的内容');
+ } else {
+ this.clearFieldError(textArea);
+ }
+ });
+ }
+
+ // 显示字段错误
+ showFieldError(field, message) {
+ this.clearFieldError(field);
+ field.style.borderColor = '#d32f2f';
+ const errorDiv = document.createElement('div');
+ errorDiv.className = 'field-error';
+ errorDiv.style.color = '#d32f2f';
+ errorDiv.style.fontSize = '0.8rem';
+ errorDiv.style.marginTop = '5px';
+ errorDiv.textContent = message;
+ field.parentNode.appendChild(errorDiv);
+ }
+
+ // 清除字段错误
+ clearFieldError(field) {
+ field.style.borderColor = '';
+ const errorDiv = field.parentNode.querySelector('.field-error');
+ if (errorDiv) {
+ errorDiv.remove();
+ }
+ }
+
+ // 更新字符计数
+ updateCharCount() {
+ const textArea = document.getElementById('text');
+ const text = textArea.value;
+ const length = text.length;
+
+ // 移除旧的计数显示
+ const oldCounter = textArea.parentNode.querySelector('.char-counter');
+ if (oldCounter) oldCounter.remove();
+
+ // 添加新的计数显示
+ if (length > 0) {
+ const counter = document.createElement('div');
+ counter.className = 'char-counter';
+ counter.style.fontSize = '0.8rem';
+ counter.style.color = '#666';
+ counter.style.textAlign = 'right';
+ counter.style.marginTop = '5px';
+ counter.textContent = `${length} 个字符`;
+ textArea.parentNode.appendChild(counter);
+ }
+ }
+
+ // 处理表单提交
+ async handleSubmit(e) {
+ e.preventDefault();
+
+ const formData = new FormData(e.target);
+ const params = {
+ text: formData.get('text').trim(),
+ size: formData.get('size'),
+ level: formData.get('level'),
+ encoding: formData.get('encoding')
+ };
+
+ // 验证输入
+ if (!params.text) {
+ this.showFieldError(document.getElementById('text'), '请输入要生成二维码的内容');
+ return;
+ }
+
+ this.showLoading();
+ await this.generateQRCode(params);
+ }
+
+ // 生成二维码
+ async generateQRCode(params) {
+ let success = false;
+ let lastError = null;
+
+ // 尝试所有API接口
+ for (let i = 0; i < this.apiEndpoints.length; i++) {
+ const apiIndex = (this.currentApiIndex + i) % this.apiEndpoints.length;
+ const apiUrl = this.apiEndpoints[apiIndex];
+
+ try {
+ console.log(`尝试API ${apiIndex + 1}:`, apiUrl);
+ const result = await this.callAPI(apiUrl, params);
+
+ if (result.success) {
+ this.currentApiIndex = apiIndex; // 记录成功的API
+ this.showResult(result.data, params);
+ success = true;
+ break;
+ }
+ } catch (error) {
+ console.warn(`API ${apiIndex + 1} 失败:`, error);
+ lastError = error;
+ }
+ }
+
+ if (!success) {
+ this.showError(lastError?.message || '所有API接口都无法访问,请稍后重试');
+ }
+ }
+
+ // 调用API
+ async callAPI(baseUrl, params) {
+ const url = new URL('/v2/qrcode', baseUrl);
+
+ // 添加查询参数
+ Object.entries(params).forEach(([key, value]) => {
+ if (value !== null && value !== undefined && value !== '') {
+ url.searchParams.append(key, value);
+ }
+ });
+
+ console.log('请求URL:', url.toString());
+
+ const controller = new AbortController();
+ const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时
+
+ try {
+ const response = await fetch(url.toString(), {
+ method: 'GET',
+ signal: controller.signal,
+ headers: {
+ 'Accept': 'application/json, image/*'
+ }
+ });
+
+ clearTimeout(timeoutId);
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+ }
+
+ // 根据返回格式处理
+ if (params.encoding === 'image' || !params.encoding) {
+ // 默认返回图片格式
+ const contentType = response.headers.get('content-type');
+ if (contentType && contentType.startsWith('image/')) {
+ const blob = await response.blob();
+ const imageUrl = URL.createObjectURL(blob);
+ return {
+ success: true,
+ data: {
+ imageUrl: imageUrl,
+ text: params.text,
+ size: params.size,
+ level: params.level,
+ format: 'image'
+ }
+ };
+ } else {
+ // 如果返回的不是图片,尝试解析JSON
+ const jsonData = await response.json();
+ if (jsonData.code === 0 && jsonData.data && jsonData.data.data_uri) {
+ return {
+ success: true,
+ data: {
+ imageUrl: jsonData.data.data_uri,
+ text: params.text,
+ size: params.size,
+ level: params.level,
+ format: 'json',
+ base64: jsonData.data.base64,
+ mimeType: jsonData.data.mime_type
+ }
+ };
+ } else {
+ throw new Error(jsonData.message || '生成失败');
+ }
+ }
+ } else {
+ // JSON或text格式
+ const jsonData = await response.json();
+ if (jsonData.code === 0 && jsonData.data) {
+ return {
+ success: true,
+ data: {
+ imageUrl: jsonData.data.data_uri,
+ text: params.text,
+ size: params.size,
+ level: params.level,
+ format: params.encoding,
+ base64: jsonData.data.base64,
+ mimeType: jsonData.data.mime_type
+ }
+ };
+ } else {
+ throw new Error(jsonData.message || '生成失败');
+ }
+ }
+ } catch (error) {
+ clearTimeout(timeoutId);
+ if (error.name === 'AbortError') {
+ throw new Error('请求超时,请重试');
+ }
+ throw error;
+ }
+ }
+
+ // 显示加载状态
+ showLoading() {
+ this.hideAllStates();
+ document.getElementById('loading').classList.remove('hidden');
+
+ const btn = document.querySelector('.generate-btn');
+ btn.classList.add('loading');
+ btn.disabled = true;
+ }
+
+ // 显示错误
+ showError(message) {
+ this.hideAllStates();
+ const errorDiv = document.getElementById('error');
+ const errorMessage = errorDiv.querySelector('.error-message');
+ errorMessage.textContent = message;
+ errorDiv.classList.remove('hidden');
+
+ this.resetButton();
+ }
+
+ // 显示结果
+ showResult(data, params) {
+ this.hideAllStates();
+
+ const resultDiv = document.getElementById('result');
+ const qrImage = document.getElementById('qrImage');
+ const resultText = document.querySelector('.result-text');
+
+ qrImage.src = data.imageUrl;
+ qrImage.alt = `二维码: ${data.text}`;
+
+ resultText.innerHTML = `
+ 内容: ${this.escapeHtml(data.text)}
+ 尺寸: ${data.size}x${data.size}
+ 容错级别: ${data.level}
+ 格式: ${data.format.toUpperCase()}
+ `;
+
+ resultDiv.classList.remove('hidden');
+ this.resetButton();
+
+ // 保存数据供下载使用
+ this.currentQRData = data;
+ }
+
+ // 隐藏所有状态
+ hideAllStates() {
+ document.getElementById('loading').classList.add('hidden');
+ document.getElementById('error').classList.add('hidden');
+ document.getElementById('result').classList.add('hidden');
+ }
+
+ // 重置按钮状态
+ resetButton() {
+ const btn = document.querySelector('.generate-btn');
+ btn.classList.remove('loading');
+ btn.disabled = false;
+ }
+
+ // 重试生成
+ async retryGeneration() {
+ const form = document.getElementById('qrForm');
+ const formData = new FormData(form);
+ const params = {
+ text: formData.get('text').trim(),
+ size: formData.get('size'),
+ level: formData.get('level'),
+ encoding: formData.get('encoding')
+ };
+
+ this.showLoading();
+ await this.generateQRCode(params);
+ }
+
+ // 下载二维码
+ downloadQRCode() {
+ if (!this.currentQRData) return;
+
+ const link = document.createElement('a');
+ link.href = this.currentQRData.imageUrl;
+ link.download = `qrcode_${Date.now()}.png`;
+ document.body.appendChild(link);
+ link.click();
+ document.body.removeChild(link);
+
+ this.showToast('二维码已下载');
+ }
+
+ // 复制图片链接
+ async copyImageLink() {
+ if (!this.currentQRData) return;
+
+ try {
+ await navigator.clipboard.writeText(this.currentQRData.imageUrl);
+ this.showToast('链接已复制到剪贴板');
+ } catch (error) {
+ console.error('复制失败:', error);
+ this.showToast('复制失败,请手动复制');
+ }
+ }
+
+ // 重置表单
+ resetForm() {
+ document.getElementById('qrForm').reset();
+ this.hideAllStates();
+ this.currentQRData = null;
+
+ // 清除字符计数
+ const counter = document.querySelector('.char-counter');
+ if (counter) counter.remove();
+
+ // 清除字段错误
+ document.querySelectorAll('input, textarea, select').forEach(field => {
+ this.clearFieldError(field);
+ });
+
+ // 聚焦到文本框
+ document.getElementById('text').focus();
+ }
+
+ // 显示提示消息
+ showToast(message) {
+ // 移除旧的toast
+ const oldToast = document.querySelector('.toast');
+ if (oldToast) oldToast.remove();
+
+ const toast = document.createElement('div');
+ toast.className = 'toast';
+ toast.style.cssText = `
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ background: #4caf50;
+ color: white;
+ padding: 12px 20px;
+ border-radius: 8px;
+ box-shadow: 0 4px 12px rgba(0,0,0,0.2);
+ z-index: 1000;
+ animation: slideIn 0.3s ease;
+ `;
+ toast.textContent = message;
+
+ document.body.appendChild(toast);
+
+ setTimeout(() => {
+ toast.style.animation = 'slideOut 0.3s ease';
+ setTimeout(() => toast.remove(), 300);
+ }, 3000);
+ }
+
+ // HTML转义
+ escapeHtml(text) {
+ const div = document.createElement('div');
+ div.textContent = text;
+ return div.innerHTML;
+ }
+}
+
+// 添加CSS动画
+const style = document.createElement('style');
+style.textContent = `
+ @keyframes slideIn {
+ from { transform: translateX(100%); opacity: 0; }
+ to { transform: translateX(0); opacity: 1; }
+ }
+ @keyframes slideOut {
+ from { transform: translateX(0); opacity: 1; }
+ to { transform: translateX(100%); opacity: 0; }
+ }
+`;
+document.head.appendChild(style);
+
+// 页面加载完成后初始化
+document.addEventListener('DOMContentLoaded', () => {
+ new QRCodeGenerator();
+});
+
+// 错误处理
+window.addEventListener('error', (e) => {
+ console.error('全局错误:', e.error);
+});
+
+window.addEventListener('unhandledrejection', (e) => {
+ console.error('未处理的Promise拒绝:', e.reason);
});
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/接口集合.json b/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/接口集合.json
index 547b2771..42245813 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/接口集合.json
+++ b/InfoGenie-frontend/public/60sapi/实用功能/生成二维码/接口集合.json
@@ -1,3 +1,3 @@
-[
- "https://60s.api.shumengya.top"
-]
+[
+ "https://60s.api.shumengya.top"
+]
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/css/background.css b/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/css/background.css
index 04fcd858..e09e36f3 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/css/background.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/css/background.css
@@ -1,192 +1,192 @@
-/* 彩虹渐变背景样式 */
-
-/* 主背景渐变 */
-body {
- background: linear-gradient(
- 135deg,
- rgba(255, 107, 107, 0.3) 0%,
- rgba(255, 165, 0, 0.3) 14.28%,
- rgba(255, 255, 0, 0.25) 28.56%,
- rgba(50, 205, 50, 0.3) 42.84%,
- rgba(0, 191, 255, 0.3) 57.12%,
- rgba(65, 105, 225, 0.3) 71.4%,
- rgba(147, 112, 219, 0.3) 85.68%,
- rgba(255, 105, 180, 0.3) 100%
- );
- background-size: 400% 400%;
- animation: rainbowShift 20s ease infinite;
- min-height: 100vh;
-}
-
-/* 彩虹渐变动画 */
-@keyframes rainbowShift {
- 0% {
- background-position: 0% 50%;
- }
- 50% {
- background-position: 100% 50%;
- }
- 100% {
- background-position: 0% 50%;
- }
-}
-
-/* 半透明覆盖层,增强可读性 */
-body::before {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: rgba(255, 255, 255, 0.4);
- backdrop-filter: blur(2px);
- z-index: -1;
- pointer-events: none;
-}
-
-/* 搜索按钮彩虹渐变 */
-.search-btn {
- background: linear-gradient(
- 45deg,
- rgba(255, 107, 107, 0.8),
- rgba(255, 165, 0, 0.8),
- rgba(255, 255, 0, 0.7),
- rgba(50, 205, 50, 0.8),
- rgba(0, 191, 255, 0.8),
- rgba(65, 105, 225, 0.8),
- rgba(147, 112, 219, 0.8)
- );
- background-size: 300% 300%;
- animation: buttonRainbow 12s ease infinite;
-}
-
-@keyframes buttonRainbow {
- 0%, 100% {
- background-position: 0% 50%;
- }
- 50% {
- background-position: 100% 50%;
- }
-}
-
-/* 结果卡片边框彩虹渐变 */
-.result-card {
- position: relative;
- overflow: hidden;
-}
-
-.result-card::before {
- content: '';
- position: absolute;
- top: -2px;
- left: -2px;
- right: -2px;
- bottom: -2px;
- background: linear-gradient(
- 45deg,
- rgba(255, 107, 107, 0.4),
- rgba(255, 165, 0, 0.4),
- rgba(255, 255, 0, 0.3),
- rgba(50, 205, 50, 0.4),
- rgba(0, 191, 255, 0.4),
- rgba(65, 105, 225, 0.4),
- rgba(147, 112, 219, 0.4),
- rgba(255, 107, 107, 0.4)
- );
- background-size: 400% 400%;
- animation: borderRainbow 15s linear infinite;
- border-radius: inherit;
- z-index: -1;
-}
-
-@keyframes borderRainbow {
- 0% {
- background-position: 0% 50%;
- }
- 100% {
- background-position: 400% 50%;
- }
-}
-
-/* 加载动画彩虹效果 */
-.loading-spinner {
- border: 4px solid rgba(255, 255, 255, 0.3);
- border-top: 4px solid transparent;
- border-image: linear-gradient(
- 45deg,
- #ff6b6b,
- #ffa500,
- #ffff00,
- #32cd32,
- #00bfff,
- #4169e1,
- #9370db
- ) 1;
- animation: spin 1s linear infinite, colorShift 3s ease infinite;
-}
-
-@keyframes colorShift {
- 0%, 100% {
- filter: hue-rotate(0deg);
- }
- 50% {
- filter: hue-rotate(180deg);
- }
-}
-
-/* 链接悬停彩虹效果 */
-.result-link:hover {
- background: linear-gradient(
- 90deg,
- rgba(255, 107, 107, 0.7),
- rgba(255, 165, 0, 0.7),
- rgba(255, 255, 0, 0.6),
- rgba(50, 205, 50, 0.7),
- rgba(0, 191, 255, 0.7),
- rgba(65, 105, 225, 0.7),
- rgba(147, 112, 219, 0.7)
- );
- background-size: 200% 200%;
- animation: linkRainbow 3s ease infinite;
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
-}
-
-@keyframes linkRainbow {
- 0%, 100% {
- background-position: 0% 50%;
- }
- 50% {
- background-position: 100% 50%;
- }
-}
-
-/* 标题彩虹文字效果 */
-.title {
- background: linear-gradient(
- 90deg,
- rgba(255, 107, 107, 0.8),
- rgba(255, 165, 0, 0.8),
- rgba(255, 255, 0, 0.7),
- rgba(50, 205, 50, 0.8),
- rgba(0, 191, 255, 0.8),
- rgba(65, 105, 225, 0.8),
- rgba(147, 112, 219, 0.8)
- );
- background-size: 200% 200%;
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
- animation: titleRainbow 8s ease infinite;
-}
-
-@keyframes titleRainbow {
- 0%, 100% {
- background-position: 0% 50%;
- }
- 50% {
- background-position: 100% 50%;
- }
+/* 彩虹渐变背景样式 */
+
+/* 主背景渐变 */
+body {
+ background: linear-gradient(
+ 135deg,
+ rgba(255, 107, 107, 0.3) 0%,
+ rgba(255, 165, 0, 0.3) 14.28%,
+ rgba(255, 255, 0, 0.25) 28.56%,
+ rgba(50, 205, 50, 0.3) 42.84%,
+ rgba(0, 191, 255, 0.3) 57.12%,
+ rgba(65, 105, 225, 0.3) 71.4%,
+ rgba(147, 112, 219, 0.3) 85.68%,
+ rgba(255, 105, 180, 0.3) 100%
+ );
+ background-size: 400% 400%;
+ animation: rainbowShift 20s ease infinite;
+ min-height: 100vh;
+}
+
+/* 彩虹渐变动画 */
+@keyframes rainbowShift {
+ 0% {
+ background-position: 0% 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+ 100% {
+ background-position: 0% 50%;
+ }
+}
+
+/* 半透明覆盖层,增强可读性 */
+body::before {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(255, 255, 255, 0.4);
+ backdrop-filter: blur(2px);
+ z-index: -1;
+ pointer-events: none;
+}
+
+/* 搜索按钮彩虹渐变 */
+.search-btn {
+ background: linear-gradient(
+ 45deg,
+ rgba(255, 107, 107, 0.8),
+ rgba(255, 165, 0, 0.8),
+ rgba(255, 255, 0, 0.7),
+ rgba(50, 205, 50, 0.8),
+ rgba(0, 191, 255, 0.8),
+ rgba(65, 105, 225, 0.8),
+ rgba(147, 112, 219, 0.8)
+ );
+ background-size: 300% 300%;
+ animation: buttonRainbow 12s ease infinite;
+}
+
+@keyframes buttonRainbow {
+ 0%, 100% {
+ background-position: 0% 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+}
+
+/* 结果卡片边框彩虹渐变 */
+.result-card {
+ position: relative;
+ overflow: hidden;
+}
+
+.result-card::before {
+ content: '';
+ position: absolute;
+ top: -2px;
+ left: -2px;
+ right: -2px;
+ bottom: -2px;
+ background: linear-gradient(
+ 45deg,
+ rgba(255, 107, 107, 0.4),
+ rgba(255, 165, 0, 0.4),
+ rgba(255, 255, 0, 0.3),
+ rgba(50, 205, 50, 0.4),
+ rgba(0, 191, 255, 0.4),
+ rgba(65, 105, 225, 0.4),
+ rgba(147, 112, 219, 0.4),
+ rgba(255, 107, 107, 0.4)
+ );
+ background-size: 400% 400%;
+ animation: borderRainbow 15s linear infinite;
+ border-radius: inherit;
+ z-index: -1;
+}
+
+@keyframes borderRainbow {
+ 0% {
+ background-position: 0% 50%;
+ }
+ 100% {
+ background-position: 400% 50%;
+ }
+}
+
+/* 加载动画彩虹效果 */
+.loading-spinner {
+ border: 4px solid rgba(255, 255, 255, 0.3);
+ border-top: 4px solid transparent;
+ border-image: linear-gradient(
+ 45deg,
+ #ff6b6b,
+ #ffa500,
+ #ffff00,
+ #32cd32,
+ #00bfff,
+ #4169e1,
+ #9370db
+ ) 1;
+ animation: spin 1s linear infinite, colorShift 3s ease infinite;
+}
+
+@keyframes colorShift {
+ 0%, 100% {
+ filter: hue-rotate(0deg);
+ }
+ 50% {
+ filter: hue-rotate(180deg);
+ }
+}
+
+/* 链接悬停彩虹效果 */
+.result-link:hover {
+ background: linear-gradient(
+ 90deg,
+ rgba(255, 107, 107, 0.7),
+ rgba(255, 165, 0, 0.7),
+ rgba(255, 255, 0, 0.6),
+ rgba(50, 205, 50, 0.7),
+ rgba(0, 191, 255, 0.7),
+ rgba(65, 105, 225, 0.7),
+ rgba(147, 112, 219, 0.7)
+ );
+ background-size: 200% 200%;
+ animation: linkRainbow 3s ease infinite;
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+@keyframes linkRainbow {
+ 0%, 100% {
+ background-position: 0% 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+}
+
+/* 标题彩虹文字效果 */
+.title {
+ background: linear-gradient(
+ 90deg,
+ rgba(255, 107, 107, 0.8),
+ rgba(255, 165, 0, 0.8),
+ rgba(255, 255, 0, 0.7),
+ rgba(50, 205, 50, 0.8),
+ rgba(0, 191, 255, 0.8),
+ rgba(65, 105, 225, 0.8),
+ rgba(147, 112, 219, 0.8)
+ );
+ background-size: 200% 200%;
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ animation: titleRainbow 8s ease infinite;
+}
+
+@keyframes titleRainbow {
+ 0%, 100% {
+ background-position: 0% 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/css/style.css b/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/css/style.css
index 8de2ae2c..e1530ded 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/css/style.css
@@ -1,530 +1,530 @@
-/* 基础样式重置 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: 'Microsoft YaHei', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif;
- line-height: 1.6;
- color: #333;
- overflow-x: hidden;
-}
-
-/* 容器布局 */
-.container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 20px;
- min-height: 100vh;
- display: flex;
- flex-direction: column;
-}
-
-/* 头部样式 */
-.header {
- text-align: center;
- margin-bottom: 40px;
- padding: 20px 0;
-}
-
-.title {
- font-size: 2.5rem;
- font-weight: 700;
- margin-bottom: 10px;
- text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1);
-}
-
-.subtitle {
- font-size: 1.1rem;
- color: rgba(255, 255, 255, 0.9);
- font-weight: 300;
- text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
-}
-
-/* 主内容区域 */
-.main {
- flex: 1;
- display: flex;
- flex-direction: column;
- gap: 30px;
-}
-
-/* 搜索区域 */
-.search-section {
- display: flex;
- justify-content: center;
- align-items: center;
-}
-
-.search-container {
- display: flex;
- width: 100%;
- max-width: 600px;
- background: rgba(255, 255, 255, 0.95);
- border-radius: 50px;
- padding: 8px;
- box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
- backdrop-filter: blur(10px);
- transition: all 0.3s ease;
-}
-
-.search-container:focus-within {
- transform: translateY(-2px);
- box-shadow: 0 15px 40px rgba(0, 0, 0, 0.3);
-}
-
-.search-input {
- flex: 1;
- border: none;
- outline: none;
- padding: 15px 25px;
- font-size: 1.1rem;
- background: transparent;
- color: #333;
- border-radius: 50px;
-}
-
-.search-input::placeholder {
- color: #999;
- font-weight: 300;
-}
-
-.search-btn {
- border: none;
- outline: none;
- padding: 15px 25px;
- border-radius: 50px;
- color: white;
- font-size: 1rem;
- font-weight: 600;
- cursor: pointer;
- display: flex;
- align-items: center;
- gap: 8px;
- transition: all 0.3s ease;
- min-width: 120px;
- justify-content: center;
-}
-
-.search-btn:hover {
- transform: scale(1.05);
- box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
-}
-
-.search-btn:active {
- transform: scale(0.98);
-}
-
-.search-icon {
- font-size: 1.2rem;
-}
-
-/* 结果区域 */
-.result-section {
- flex: 1;
- display: flex;
- justify-content: center;
- align-items: flex-start;
- min-height: 400px;
-}
-
-/* 加载动画 */
-.loading {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 20px;
- padding: 40px;
- color: rgba(255, 255, 255, 0.9);
-}
-
-.loading-spinner {
- width: 50px;
- height: 50px;
- border-radius: 50%;
- animation: spin 1s linear infinite;
-}
-
-@keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-/* 结果卡片 */
-.result-card {
- width: 100%;
- max-width: 800px;
- background: rgba(255, 255, 255, 0.95);
- border-radius: 20px;
- padding: 30px;
- box-shadow: 0 15px 40px rgba(0, 0, 0, 0.2);
- backdrop-filter: blur(10px);
- animation: slideUp 0.5s ease;
-}
-
-@keyframes slideUp {
- from {
- opacity: 0;
- transform: translateY(30px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-.result-header {
- margin-bottom: 25px;
- text-align: center;
-}
-
-.result-title {
- font-size: 2rem;
- font-weight: 700;
- color: #333;
- margin-bottom: 10px;
-}
-
-.result-description {
- font-size: 1.1rem;
- color: #666;
- font-weight: 400;
-}
-
-.result-content {
- display: grid;
- grid-template-columns: 1fr 2fr;
- gap: 30px;
- align-items: start;
-}
-
-.result-image-container {
- display: flex;
- justify-content: center;
-}
-
-.result-image {
- width: 100%;
- max-width: 250px;
- height: auto;
- border-radius: 15px;
- box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
- transition: transform 0.3s ease;
-}
-
-.result-image:hover {
- transform: scale(1.05);
-}
-
-.result-text {
- display: flex;
- flex-direction: column;
- gap: 20px;
-}
-
-.result-abstract h3 {
- font-size: 1.3rem;
- color: #333;
- margin-bottom: 10px;
- font-weight: 600;
-}
-
-.result-abstract p {
- font-size: 1rem;
- line-height: 1.8;
- color: #555;
- text-align: justify;
-}
-
-.result-actions {
- display: flex;
- justify-content: flex-end;
-}
-
-.result-link {
- display: inline-flex;
- align-items: center;
- gap: 8px;
- padding: 12px 24px;
- background: rgba(0, 123, 255, 0.1);
- color: #007bff;
- text-decoration: none;
- border-radius: 25px;
- font-weight: 600;
- transition: all 0.3s ease;
- border: 2px solid transparent;
-}
-
-.result-link:hover {
- background: rgba(0, 123, 255, 0.2);
- transform: translateY(-2px);
- box-shadow: 0 5px 15px rgba(0, 123, 255, 0.3);
-}
-
-.link-icon {
- font-size: 1.2rem;
- transition: transform 0.3s ease;
-}
-
-.result-link:hover .link-icon {
- transform: translateX(5px);
-}
-
-/* 错误消息 */
-.error-message {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 20px;
- padding: 40px;
- background: rgba(255, 255, 255, 0.95);
- border-radius: 20px;
- box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
- backdrop-filter: blur(10px);
- text-align: center;
- max-width: 500px;
- width: 100%;
-}
-
-.error-icon {
- font-size: 3rem;
-}
-
-.error-message h3 {
- color: #e74c3c;
- font-size: 1.5rem;
- margin-bottom: 10px;
-}
-
-.error-message p {
- color: #666;
- font-size: 1rem;
- line-height: 1.6;
-}
-
-.retry-btn {
- padding: 12px 24px;
- background: #e74c3c;
- color: white;
- border: none;
- border-radius: 25px;
- font-size: 1rem;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.3s ease;
-}
-
-.retry-btn:hover {
- background: #c0392b;
- transform: translateY(-2px);
- box-shadow: 0 5px 15px rgba(231, 76, 60, 0.3);
-}
-
-/* 欢迎消息 */
-.welcome-message {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 20px;
- padding: 60px 40px;
- background: rgba(255, 255, 255, 0.9);
- border-radius: 20px;
- box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
- backdrop-filter: blur(10px);
- text-align: center;
- max-width: 600px;
- width: 100%;
-}
-
-.welcome-icon {
- font-size: 4rem;
- opacity: 0.8;
-}
-
-.welcome-message h3 {
- color: #333;
- font-size: 1.8rem;
- font-weight: 600;
- margin-bottom: 10px;
-}
-
-.welcome-message p {
- color: #666;
- font-size: 1.1rem;
- line-height: 1.6;
- max-width: 400px;
-}
-
-/* 页脚 */
-.footer {
- text-align: center;
- padding: 20px 0;
- margin-top: 40px;
- color: rgba(255, 255, 255, 0.8);
- font-size: 0.9rem;
-}
-
-/* 平板端适配 (768px - 1024px) */
-@media (max-width: 1024px) and (min-width: 768px) {
- .container {
- padding: 15px;
- }
-
- .title {
- font-size: 2.2rem;
- }
-
- .result-content {
- grid-template-columns: 1fr 1.5fr;
- gap: 25px;
- }
-
- .result-card {
- padding: 25px;
- }
-}
-
-/* 手机端适配 (最大768px) */
-@media (max-width: 768px) {
- .container {
- padding: 10px;
- }
-
- .header {
- margin-bottom: 30px;
- padding: 15px 0;
- }
-
- .title {
- font-size: 1.8rem;
- }
-
- .subtitle {
- font-size: 1rem;
- }
-
- .search-container {
- max-width: 100%;
- padding: 6px;
- }
-
- .search-input {
- padding: 12px 20px;
- font-size: 1rem;
- }
-
- .search-btn {
- padding: 12px 20px;
- min-width: 100px;
- font-size: 0.9rem;
- }
-
- .search-text {
- display: none;
- }
-
- .result-card {
- padding: 20px;
- border-radius: 15px;
- }
-
- .result-title {
- font-size: 1.5rem;
- }
-
- .result-description {
- font-size: 1rem;
- }
-
- .result-content {
- grid-template-columns: 1fr;
- gap: 20px;
- }
-
- .result-image {
- max-width: 200px;
- }
-
- .result-abstract h3 {
- font-size: 1.2rem;
- }
-
- .result-abstract p {
- font-size: 0.95rem;
- line-height: 1.7;
- }
-
- .result-actions {
- justify-content: center;
- }
-
- .welcome-message {
- padding: 40px 20px;
- }
-
- .welcome-icon {
- font-size: 3rem;
- }
-
- .welcome-message h3 {
- font-size: 1.5rem;
- }
-
- .welcome-message p {
- font-size: 1rem;
- }
-
- .error-message {
- padding: 30px 20px;
- }
-
- .error-icon {
- font-size: 2.5rem;
- }
-
- .error-message h3 {
- font-size: 1.3rem;
- }
-}
-
-/* 小屏手机适配 (最大480px) */
-@media (max-width: 480px) {
- .title {
- font-size: 1.6rem;
- }
-
- .search-container {
- flex-direction: column;
- gap: 10px;
- padding: 15px;
- border-radius: 20px;
- }
-
- .search-input {
- border-radius: 15px;
- text-align: center;
- }
-
- .search-btn {
- border-radius: 15px;
- justify-content: center;
- }
-
- .search-text {
- display: inline;
- }
-
- .result-card {
- padding: 15px;
- }
-
- .result-title {
- font-size: 1.3rem;
- }
-
- .result-image {
- max-width: 150px;
- }
+/* 基础样式重置 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Microsoft YaHei', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif;
+ line-height: 1.6;
+ color: #333;
+ overflow-x: hidden;
+}
+
+/* 容器布局 */
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+}
+
+/* 头部样式 */
+.header {
+ text-align: center;
+ margin-bottom: 40px;
+ padding: 20px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+ font-weight: 700;
+ margin-bottom: 10px;
+ text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1);
+}
+
+.subtitle {
+ font-size: 1.1rem;
+ color: rgba(255, 255, 255, 0.9);
+ font-weight: 300;
+ text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
+}
+
+/* 主内容区域 */
+.main {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 30px;
+}
+
+/* 搜索区域 */
+.search-section {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.search-container {
+ display: flex;
+ width: 100%;
+ max-width: 600px;
+ background: rgba(255, 255, 255, 0.95);
+ border-radius: 50px;
+ padding: 8px;
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
+ backdrop-filter: blur(10px);
+ transition: all 0.3s ease;
+}
+
+.search-container:focus-within {
+ transform: translateY(-2px);
+ box-shadow: 0 15px 40px rgba(0, 0, 0, 0.3);
+}
+
+.search-input {
+ flex: 1;
+ border: none;
+ outline: none;
+ padding: 15px 25px;
+ font-size: 1.1rem;
+ background: transparent;
+ color: #333;
+ border-radius: 50px;
+}
+
+.search-input::placeholder {
+ color: #999;
+ font-weight: 300;
+}
+
+.search-btn {
+ border: none;
+ outline: none;
+ padding: 15px 25px;
+ border-radius: 50px;
+ color: white;
+ font-size: 1rem;
+ font-weight: 600;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ transition: all 0.3s ease;
+ min-width: 120px;
+ justify-content: center;
+}
+
+.search-btn:hover {
+ transform: scale(1.05);
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
+}
+
+.search-btn:active {
+ transform: scale(0.98);
+}
+
+.search-icon {
+ font-size: 1.2rem;
+}
+
+/* 结果区域 */
+.result-section {
+ flex: 1;
+ display: flex;
+ justify-content: center;
+ align-items: flex-start;
+ min-height: 400px;
+}
+
+/* 加载动画 */
+.loading {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 20px;
+ padding: 40px;
+ color: rgba(255, 255, 255, 0.9);
+}
+
+.loading-spinner {
+ width: 50px;
+ height: 50px;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+/* 结果卡片 */
+.result-card {
+ width: 100%;
+ max-width: 800px;
+ background: rgba(255, 255, 255, 0.95);
+ border-radius: 20px;
+ padding: 30px;
+ box-shadow: 0 15px 40px rgba(0, 0, 0, 0.2);
+ backdrop-filter: blur(10px);
+ animation: slideUp 0.5s ease;
+}
+
+@keyframes slideUp {
+ from {
+ opacity: 0;
+ transform: translateY(30px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.result-header {
+ margin-bottom: 25px;
+ text-align: center;
+}
+
+.result-title {
+ font-size: 2rem;
+ font-weight: 700;
+ color: #333;
+ margin-bottom: 10px;
+}
+
+.result-description {
+ font-size: 1.1rem;
+ color: #666;
+ font-weight: 400;
+}
+
+.result-content {
+ display: grid;
+ grid-template-columns: 1fr 2fr;
+ gap: 30px;
+ align-items: start;
+}
+
+.result-image-container {
+ display: flex;
+ justify-content: center;
+}
+
+.result-image {
+ width: 100%;
+ max-width: 250px;
+ height: auto;
+ border-radius: 15px;
+ box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
+ transition: transform 0.3s ease;
+}
+
+.result-image:hover {
+ transform: scale(1.05);
+}
+
+.result-text {
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+}
+
+.result-abstract h3 {
+ font-size: 1.3rem;
+ color: #333;
+ margin-bottom: 10px;
+ font-weight: 600;
+}
+
+.result-abstract p {
+ font-size: 1rem;
+ line-height: 1.8;
+ color: #555;
+ text-align: justify;
+}
+
+.result-actions {
+ display: flex;
+ justify-content: flex-end;
+}
+
+.result-link {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ padding: 12px 24px;
+ background: rgba(0, 123, 255, 0.1);
+ color: #007bff;
+ text-decoration: none;
+ border-radius: 25px;
+ font-weight: 600;
+ transition: all 0.3s ease;
+ border: 2px solid transparent;
+}
+
+.result-link:hover {
+ background: rgba(0, 123, 255, 0.2);
+ transform: translateY(-2px);
+ box-shadow: 0 5px 15px rgba(0, 123, 255, 0.3);
+}
+
+.link-icon {
+ font-size: 1.2rem;
+ transition: transform 0.3s ease;
+}
+
+.result-link:hover .link-icon {
+ transform: translateX(5px);
+}
+
+/* 错误消息 */
+.error-message {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 20px;
+ padding: 40px;
+ background: rgba(255, 255, 255, 0.95);
+ border-radius: 20px;
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
+ backdrop-filter: blur(10px);
+ text-align: center;
+ max-width: 500px;
+ width: 100%;
+}
+
+.error-icon {
+ font-size: 3rem;
+}
+
+.error-message h3 {
+ color: #e74c3c;
+ font-size: 1.5rem;
+ margin-bottom: 10px;
+}
+
+.error-message p {
+ color: #666;
+ font-size: 1rem;
+ line-height: 1.6;
+}
+
+.retry-btn {
+ padding: 12px 24px;
+ background: #e74c3c;
+ color: white;
+ border: none;
+ border-radius: 25px;
+ font-size: 1rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+}
+
+.retry-btn:hover {
+ background: #c0392b;
+ transform: translateY(-2px);
+ box-shadow: 0 5px 15px rgba(231, 76, 60, 0.3);
+}
+
+/* 欢迎消息 */
+.welcome-message {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 20px;
+ padding: 60px 40px;
+ background: rgba(255, 255, 255, 0.9);
+ border-radius: 20px;
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
+ backdrop-filter: blur(10px);
+ text-align: center;
+ max-width: 600px;
+ width: 100%;
+}
+
+.welcome-icon {
+ font-size: 4rem;
+ opacity: 0.8;
+}
+
+.welcome-message h3 {
+ color: #333;
+ font-size: 1.8rem;
+ font-weight: 600;
+ margin-bottom: 10px;
+}
+
+.welcome-message p {
+ color: #666;
+ font-size: 1.1rem;
+ line-height: 1.6;
+ max-width: 400px;
+}
+
+/* 页脚 */
+.footer {
+ text-align: center;
+ padding: 20px 0;
+ margin-top: 40px;
+ color: rgba(255, 255, 255, 0.8);
+ font-size: 0.9rem;
+}
+
+/* 平板端适配 (768px - 1024px) */
+@media (max-width: 1024px) and (min-width: 768px) {
+ .container {
+ padding: 15px;
+ }
+
+ .title {
+ font-size: 2.2rem;
+ }
+
+ .result-content {
+ grid-template-columns: 1fr 1.5fr;
+ gap: 25px;
+ }
+
+ .result-card {
+ padding: 25px;
+ }
+}
+
+/* 手机端适配 (最大768px) */
+@media (max-width: 768px) {
+ .container {
+ padding: 10px;
+ }
+
+ .header {
+ margin-bottom: 30px;
+ padding: 15px 0;
+ }
+
+ .title {
+ font-size: 1.8rem;
+ }
+
+ .subtitle {
+ font-size: 1rem;
+ }
+
+ .search-container {
+ max-width: 100%;
+ padding: 6px;
+ }
+
+ .search-input {
+ padding: 12px 20px;
+ font-size: 1rem;
+ }
+
+ .search-btn {
+ padding: 12px 20px;
+ min-width: 100px;
+ font-size: 0.9rem;
+ }
+
+ .search-text {
+ display: none;
+ }
+
+ .result-card {
+ padding: 20px;
+ border-radius: 15px;
+ }
+
+ .result-title {
+ font-size: 1.5rem;
+ }
+
+ .result-description {
+ font-size: 1rem;
+ }
+
+ .result-content {
+ grid-template-columns: 1fr;
+ gap: 20px;
+ }
+
+ .result-image {
+ max-width: 200px;
+ }
+
+ .result-abstract h3 {
+ font-size: 1.2rem;
+ }
+
+ .result-abstract p {
+ font-size: 0.95rem;
+ line-height: 1.7;
+ }
+
+ .result-actions {
+ justify-content: center;
+ }
+
+ .welcome-message {
+ padding: 40px 20px;
+ }
+
+ .welcome-icon {
+ font-size: 3rem;
+ }
+
+ .welcome-message h3 {
+ font-size: 1.5rem;
+ }
+
+ .welcome-message p {
+ font-size: 1rem;
+ }
+
+ .error-message {
+ padding: 30px 20px;
+ }
+
+ .error-icon {
+ font-size: 2.5rem;
+ }
+
+ .error-message h3 {
+ font-size: 1.3rem;
+ }
+}
+
+/* 小屏手机适配 (最大480px) */
+@media (max-width: 480px) {
+ .title {
+ font-size: 1.6rem;
+ }
+
+ .search-container {
+ flex-direction: column;
+ gap: 10px;
+ padding: 15px;
+ border-radius: 20px;
+ }
+
+ .search-input {
+ border-radius: 15px;
+ text-align: center;
+ }
+
+ .search-btn {
+ border-radius: 15px;
+ justify-content: center;
+ }
+
+ .search-text {
+ display: inline;
+ }
+
+ .result-card {
+ padding: 15px;
+ }
+
+ .result-title {
+ font-size: 1.3rem;
+ }
+
+ .result-image {
+ max-width: 150px;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/index.html b/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/index.html
index 6b52b446..c7da921e 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/index.html
+++ b/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/index.html
@@ -1,83 +1,83 @@
-
-
-
-
-
- 百度百科词条查询
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
![词条图片]()
-
-
-
-
-
-
-
-
-
-
📚
-
欢迎使用百度百科词条查询
-
在上方搜索框中输入您想了解的词条,开始探索知识的海洋
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ 百度百科词条查询
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
![词条图片]()
+
+
+
+
+
+
+
+
+
+
📚
+
欢迎使用百度百科词条查询
+
在上方搜索框中输入您想了解的词条,开始探索知识的海洋
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/js/script.js b/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/js/script.js
index 20a423bf..4d659a5d 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/js/script.js
@@ -1,320 +1,320 @@
-// 百度百科词条查询应用
-class BaikeApp {
- constructor() {
- // API接口列表
- this.apiEndpoints = [
- 'https://60s.api.shumengya.top',
- ];
-
- this.currentApiIndex = 0;
- this.isLoading = false;
-
- this.initElements();
- this.bindEvents();
- }
-
- // 初始化DOM元素
- initElements() {
- this.searchInput = document.getElementById('searchInput');
- this.searchBtn = document.getElementById('searchBtn');
- this.resultSection = document.getElementById('resultSection');
- this.loading = document.getElementById('loading');
- this.resultCard = document.getElementById('resultCard');
- this.errorMessage = document.getElementById('errorMessage');
- this.welcomeMessage = document.getElementById('welcomeMessage');
- this.retryBtn = document.getElementById('retryBtn');
-
- // 结果显示元素
- this.resultTitle = document.getElementById('resultTitle');
- this.resultDescription = document.getElementById('resultDescription');
- this.resultImage = document.getElementById('resultImage');
- this.resultAbstract = document.getElementById('resultAbstract');
- this.resultLink = document.getElementById('resultLink');
- this.errorText = document.getElementById('errorText');
- }
-
- // 绑定事件
- bindEvents() {
- // 搜索按钮点击事件
- this.searchBtn.addEventListener('click', () => {
- this.handleSearch();
- });
-
- // 输入框回车事件
- this.searchInput.addEventListener('keypress', (e) => {
- if (e.key === 'Enter') {
- this.handleSearch();
- }
- });
-
- // 重试按钮事件
- this.retryBtn.addEventListener('click', () => {
- this.handleSearch();
- });
-
- // 输入框焦点事件
- this.searchInput.addEventListener('focus', () => {
- this.searchInput.select();
- });
- }
-
- // 处理搜索
- async handleSearch() {
- const query = this.searchInput.value.trim();
-
- if (!query) {
- this.showError('请输入要查询的词条');
- this.searchInput.focus();
- return;
- }
-
- if (this.isLoading) {
- return;
- }
-
- await this.searchBaike(query);
- }
-
- // 搜索百科词条
- async searchBaike(query) {
- this.showLoading();
- this.isLoading = true;
-
- // 重置API索引
- this.currentApiIndex = 0;
-
- const success = await this.tryApiCall(query);
-
- if (!success) {
- this.showError('所有API接口都无法访问,请稍后重试');
- }
-
- this.isLoading = false;
- }
-
- // 尝试API调用
- async tryApiCall(query) {
- for (let i = 0; i < this.apiEndpoints.length; i++) {
- const endpoint = this.apiEndpoints[this.currentApiIndex];
-
- try {
- const result = await this.callApi(endpoint, query);
- if (result) {
- this.showResult(result);
- return true;
- }
- } catch (error) {
- console.warn(`API ${endpoint} 调用失败:`, error.message);
- }
-
- // 切换到下一个API
- this.currentApiIndex = (this.currentApiIndex + 1) % this.apiEndpoints.length;
- }
-
- return false;
- }
-
- // 调用API
- async callApi(endpoint, query) {
- const url = `${endpoint}/v2/baike?word=${encodeURIComponent(query)}`;
-
- const controller = new AbortController();
- const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时
-
- try {
- const response = await fetch(url, {
- method: 'GET',
- signal: controller.signal,
- headers: {
- 'Accept': 'application/json',
- }
- });
-
- clearTimeout(timeoutId);
-
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
- }
-
- const data = await response.json();
-
- if (data.code === 200 && data.data) {
- return data.data;
- } else {
- throw new Error(data.message || '未找到相关词条');
- }
-
- } catch (error) {
- clearTimeout(timeoutId);
-
- if (error.name === 'AbortError') {
- throw new Error('请求超时');
- }
-
- throw error;
- }
- }
-
- // 显示加载状态
- showLoading() {
- this.hideAllSections();
- this.loading.style.display = 'flex';
- }
-
- // 显示搜索结果
- showResult(data) {
- this.hideAllSections();
-
- // 填充数据
- this.resultTitle.textContent = data.title || '未知标题';
- this.resultDescription.textContent = data.description || '暂无描述';
- this.resultAbstract.textContent = data.abstract || '暂无摘要信息';
-
- // 处理图片
- if (data.cover) {
- this.resultImage.src = data.cover;
- this.resultImage.style.display = 'block';
- this.resultImage.onerror = () => {
- this.resultImage.style.display = 'none';
- };
- } else {
- this.resultImage.style.display = 'none';
- }
-
- // 处理链接
- if (data.link) {
- this.resultLink.href = data.link;
- this.resultLink.style.display = 'inline-flex';
- } else {
- this.resultLink.style.display = 'none';
- }
-
- this.resultCard.style.display = 'block';
-
- // 滚动到结果区域
- this.resultCard.scrollIntoView({
- behavior: 'smooth',
- block: 'start'
- });
- }
-
- // 显示错误信息
- showError(message) {
- this.hideAllSections();
- this.errorText.textContent = message;
- this.errorMessage.style.display = 'flex';
- }
-
- // 隐藏所有区域
- hideAllSections() {
- this.loading.style.display = 'none';
- this.resultCard.style.display = 'none';
- this.errorMessage.style.display = 'none';
- this.welcomeMessage.style.display = 'none';
- }
-
- // 显示欢迎信息
- showWelcome() {
- this.hideAllSections();
- this.welcomeMessage.style.display = 'flex';
- }
-}
-
-// 工具函数
-class Utils {
- // 防抖函数
- static debounce(func, wait) {
- let timeout;
- return function executedFunction(...args) {
- const later = () => {
- clearTimeout(timeout);
- func(...args);
- };
- clearTimeout(timeout);
- timeout = setTimeout(later, wait);
- };
- }
-
- // 节流函数
- static throttle(func, limit) {
- let inThrottle;
- return function() {
- const args = arguments;
- const context = this;
- if (!inThrottle) {
- func.apply(context, args);
- inThrottle = true;
- setTimeout(() => inThrottle = false, limit);
- }
- };
- }
-
- // 格式化文本长度
- static truncateText(text, maxLength) {
- if (text.length <= maxLength) {
- return text;
- }
- return text.substring(0, maxLength) + '...';
- }
-
- // 检查是否为移动设备
- static isMobile() {
- return window.innerWidth <= 768;
- }
-}
-
-// 页面加载完成后初始化应用
-document.addEventListener('DOMContentLoaded', () => {
- // 初始化应用
- const app = new BaikeApp();
-
- // 添加页面可见性变化监听
- document.addEventListener('visibilitychange', () => {
- if (document.visibilityState === 'visible') {
- // 页面重新可见时,聚焦搜索框
- if (!app.isLoading) {
- app.searchInput.focus();
- }
- }
- });
-
- // 添加窗口大小变化监听
- window.addEventListener('resize', Utils.throttle(() => {
- // 响应式调整
- if (Utils.isMobile()) {
- // 移动端特殊处理
- document.body.classList.add('mobile');
- } else {
- document.body.classList.remove('mobile');
- }
- }, 250));
-
- // 初始检查设备类型
- if (Utils.isMobile()) {
- document.body.classList.add('mobile');
- }
-
- // 页面加载完成后聚焦搜索框
- setTimeout(() => {
- app.searchInput.focus();
- }, 500);
-
- // 添加键盘快捷键支持
- document.addEventListener('keydown', (e) => {
- // Ctrl/Cmd + K 聚焦搜索框
- if ((e.ctrlKey || e.metaKey) && e.key === 'k') {
- e.preventDefault();
- app.searchInput.focus();
- app.searchInput.select();
- }
-
- // ESC 清空搜索框
- if (e.key === 'Escape') {
- app.searchInput.value = '';
- app.showWelcome();
- app.searchInput.focus();
- }
- });
-
- console.log('百度百科词条查询应用已初始化');
+// 百度百科词条查询应用
+class BaikeApp {
+ constructor() {
+ // API接口列表
+ this.apiEndpoints = [
+ 'https://60s.api.shumengya.top',
+ ];
+
+ this.currentApiIndex = 0;
+ this.isLoading = false;
+
+ this.initElements();
+ this.bindEvents();
+ }
+
+ // 初始化DOM元素
+ initElements() {
+ this.searchInput = document.getElementById('searchInput');
+ this.searchBtn = document.getElementById('searchBtn');
+ this.resultSection = document.getElementById('resultSection');
+ this.loading = document.getElementById('loading');
+ this.resultCard = document.getElementById('resultCard');
+ this.errorMessage = document.getElementById('errorMessage');
+ this.welcomeMessage = document.getElementById('welcomeMessage');
+ this.retryBtn = document.getElementById('retryBtn');
+
+ // 结果显示元素
+ this.resultTitle = document.getElementById('resultTitle');
+ this.resultDescription = document.getElementById('resultDescription');
+ this.resultImage = document.getElementById('resultImage');
+ this.resultAbstract = document.getElementById('resultAbstract');
+ this.resultLink = document.getElementById('resultLink');
+ this.errorText = document.getElementById('errorText');
+ }
+
+ // 绑定事件
+ bindEvents() {
+ // 搜索按钮点击事件
+ this.searchBtn.addEventListener('click', () => {
+ this.handleSearch();
+ });
+
+ // 输入框回车事件
+ this.searchInput.addEventListener('keypress', (e) => {
+ if (e.key === 'Enter') {
+ this.handleSearch();
+ }
+ });
+
+ // 重试按钮事件
+ this.retryBtn.addEventListener('click', () => {
+ this.handleSearch();
+ });
+
+ // 输入框焦点事件
+ this.searchInput.addEventListener('focus', () => {
+ this.searchInput.select();
+ });
+ }
+
+ // 处理搜索
+ async handleSearch() {
+ const query = this.searchInput.value.trim();
+
+ if (!query) {
+ this.showError('请输入要查询的词条');
+ this.searchInput.focus();
+ return;
+ }
+
+ if (this.isLoading) {
+ return;
+ }
+
+ await this.searchBaike(query);
+ }
+
+ // 搜索百科词条
+ async searchBaike(query) {
+ this.showLoading();
+ this.isLoading = true;
+
+ // 重置API索引
+ this.currentApiIndex = 0;
+
+ const success = await this.tryApiCall(query);
+
+ if (!success) {
+ this.showError('所有API接口都无法访问,请稍后重试');
+ }
+
+ this.isLoading = false;
+ }
+
+ // 尝试API调用
+ async tryApiCall(query) {
+ for (let i = 0; i < this.apiEndpoints.length; i++) {
+ const endpoint = this.apiEndpoints[this.currentApiIndex];
+
+ try {
+ const result = await this.callApi(endpoint, query);
+ if (result) {
+ this.showResult(result);
+ return true;
+ }
+ } catch (error) {
+ console.warn(`API ${endpoint} 调用失败:`, error.message);
+ }
+
+ // 切换到下一个API
+ this.currentApiIndex = (this.currentApiIndex + 1) % this.apiEndpoints.length;
+ }
+
+ return false;
+ }
+
+ // 调用API
+ async callApi(endpoint, query) {
+ const url = `${endpoint}/v2/baike?word=${encodeURIComponent(query)}`;
+
+ const controller = new AbortController();
+ const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时
+
+ try {
+ const response = await fetch(url, {
+ method: 'GET',
+ signal: controller.signal,
+ headers: {
+ 'Accept': 'application/json',
+ }
+ });
+
+ clearTimeout(timeoutId);
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+ }
+
+ const data = await response.json();
+
+ if (data.code === 200 && data.data) {
+ return data.data;
+ } else {
+ throw new Error(data.message || '未找到相关词条');
+ }
+
+ } catch (error) {
+ clearTimeout(timeoutId);
+
+ if (error.name === 'AbortError') {
+ throw new Error('请求超时');
+ }
+
+ throw error;
+ }
+ }
+
+ // 显示加载状态
+ showLoading() {
+ this.hideAllSections();
+ this.loading.style.display = 'flex';
+ }
+
+ // 显示搜索结果
+ showResult(data) {
+ this.hideAllSections();
+
+ // 填充数据
+ this.resultTitle.textContent = data.title || '未知标题';
+ this.resultDescription.textContent = data.description || '暂无描述';
+ this.resultAbstract.textContent = data.abstract || '暂无摘要信息';
+
+ // 处理图片
+ if (data.cover) {
+ this.resultImage.src = data.cover;
+ this.resultImage.style.display = 'block';
+ this.resultImage.onerror = () => {
+ this.resultImage.style.display = 'none';
+ };
+ } else {
+ this.resultImage.style.display = 'none';
+ }
+
+ // 处理链接
+ if (data.link) {
+ this.resultLink.href = data.link;
+ this.resultLink.style.display = 'inline-flex';
+ } else {
+ this.resultLink.style.display = 'none';
+ }
+
+ this.resultCard.style.display = 'block';
+
+ // 滚动到结果区域
+ this.resultCard.scrollIntoView({
+ behavior: 'smooth',
+ block: 'start'
+ });
+ }
+
+ // 显示错误信息
+ showError(message) {
+ this.hideAllSections();
+ this.errorText.textContent = message;
+ this.errorMessage.style.display = 'flex';
+ }
+
+ // 隐藏所有区域
+ hideAllSections() {
+ this.loading.style.display = 'none';
+ this.resultCard.style.display = 'none';
+ this.errorMessage.style.display = 'none';
+ this.welcomeMessage.style.display = 'none';
+ }
+
+ // 显示欢迎信息
+ showWelcome() {
+ this.hideAllSections();
+ this.welcomeMessage.style.display = 'flex';
+ }
+}
+
+// 工具函数
+class Utils {
+ // 防抖函数
+ static debounce(func, wait) {
+ let timeout;
+ return function executedFunction(...args) {
+ const later = () => {
+ clearTimeout(timeout);
+ func(...args);
+ };
+ clearTimeout(timeout);
+ timeout = setTimeout(later, wait);
+ };
+ }
+
+ // 节流函数
+ static throttle(func, limit) {
+ let inThrottle;
+ return function() {
+ const args = arguments;
+ const context = this;
+ if (!inThrottle) {
+ func.apply(context, args);
+ inThrottle = true;
+ setTimeout(() => inThrottle = false, limit);
+ }
+ };
+ }
+
+ // 格式化文本长度
+ static truncateText(text, maxLength) {
+ if (text.length <= maxLength) {
+ return text;
+ }
+ return text.substring(0, maxLength) + '...';
+ }
+
+ // 检查是否为移动设备
+ static isMobile() {
+ return window.innerWidth <= 768;
+ }
+}
+
+// 页面加载完成后初始化应用
+document.addEventListener('DOMContentLoaded', () => {
+ // 初始化应用
+ const app = new BaikeApp();
+
+ // 添加页面可见性变化监听
+ document.addEventListener('visibilitychange', () => {
+ if (document.visibilityState === 'visible') {
+ // 页面重新可见时,聚焦搜索框
+ if (!app.isLoading) {
+ app.searchInput.focus();
+ }
+ }
+ });
+
+ // 添加窗口大小变化监听
+ window.addEventListener('resize', Utils.throttle(() => {
+ // 响应式调整
+ if (Utils.isMobile()) {
+ // 移动端特殊处理
+ document.body.classList.add('mobile');
+ } else {
+ document.body.classList.remove('mobile');
+ }
+ }, 250));
+
+ // 初始检查设备类型
+ if (Utils.isMobile()) {
+ document.body.classList.add('mobile');
+ }
+
+ // 页面加载完成后聚焦搜索框
+ setTimeout(() => {
+ app.searchInput.focus();
+ }, 500);
+
+ // 添加键盘快捷键支持
+ document.addEventListener('keydown', (e) => {
+ // Ctrl/Cmd + K 聚焦搜索框
+ if ((e.ctrlKey || e.metaKey) && e.key === 'k') {
+ e.preventDefault();
+ app.searchInput.focus();
+ app.searchInput.select();
+ }
+
+ // ESC 清空搜索框
+ if (e.key === 'Escape') {
+ app.searchInput.value = '';
+ app.showWelcome();
+ app.searchInput.focus();
+ }
+ });
+
+ console.log('百度百科词条查询应用已初始化');
});
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/接口集合.json b/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/接口集合.json
index 547b2771..42245813 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/接口集合.json
+++ b/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/接口集合.json
@@ -1,3 +1,3 @@
-[
- "https://60s.api.shumengya.top"
-]
+[
+ "https://60s.api.shumengya.top"
+]
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/返回接口.json
index 55ec21dc..16d43ede 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/实用功能/百度百科词条/返回接口.json
@@ -1,12 +1,12 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "title": "西游记",
- "description": "明代吴承恩创作的章回体长篇神魔小说",
- "abstract": "《西游记》又名《西游释厄传》,是中国古代第一部浪漫主义章回体长篇神魔小说。最早的《西游记》版本是明代万历二十年金陵世德堂《新刻出像官板大字西游记》,未署作者姓名。鲁迅、董作宾等人根据《淮安府志》“吴承恩《西游记》”的记载予以最终论定“吴承恩原著”。该小说主要讲述了孙悟空出世,并寻菩提祖师学艺及大闹天宫后,与猪八戒、沙僧和白龙马一同护送唐僧西天取经,于路上历经险阻,降妖除魔,渡过了九九八十一难,成功...",
- "cover": "https://bkimg.cdn.bcebos.com/pic/b7fd5266d01609248d763e43db0735fae6cd3412?x-bce-process=image/format,f_auto",
- "has_other": true,
- "link": "http://baike.baidu.com/subview/2583/5315045.htm"
- }
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "title": "西游记",
+ "description": "明代吴承恩创作的章回体长篇神魔小说",
+ "abstract": "《西游记》又名《西游释厄传》,是中国古代第一部浪漫主义章回体长篇神魔小说。最早的《西游记》版本是明代万历二十年金陵世德堂《新刻出像官板大字西游记》,未署作者姓名。鲁迅、董作宾等人根据《淮安府志》“吴承恩《西游记》”的记载予以最终论定“吴承恩原著”。该小说主要讲述了孙悟空出世,并寻菩提祖师学艺及大闹天宫后,与猪八戒、沙僧和白龙马一同护送唐僧西天取经,于路上历经险阻,降妖除魔,渡过了九九八十一难,成功...",
+ "cover": "https://bkimg.cdn.bcebos.com/pic/b7fd5266d01609248d763e43db0735fae6cd3412?x-bce-process=image/format,f_auto",
+ "has_other": true,
+ "link": "http://baike.baidu.com/subview/2583/5315045.htm"
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/background.css b/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/background.css
index 9eb864ab..0daba4b5 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/background.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/background.css
@@ -1,243 +1,243 @@
-/* 背景样式文件 - 独立管理背景相关样式 */
-
-/* 主体背景 */
-body {
- background: linear-gradient(135deg, #e8f5e8 0%, #f0f8f0 25%, #e1f5e1 50%, #f5f9f5 75%, #e8f5e8 100%);
- background-size: 400% 400%;
- animation: gradientShift 15s ease infinite;
- position: relative;
- overflow-x: hidden;
-}
-
-/* 背景动画 */
-@keyframes gradientShift {
- 0% {
- background-position: 0% 50%;
- }
- 50% {
- background-position: 100% 50%;
- }
- 100% {
- background-position: 0% 50%;
- }
-}
-
-/* 装饰性背景元素 */
-body::before {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- radial-gradient(circle at 20% 80%, rgba(144, 238, 144, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 80% 20%, rgba(152, 251, 152, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 40% 40%, rgba(173, 255, 173, 0.08) 0%, transparent 50%);
- pointer-events: none;
- z-index: -2;
-}
-
-/* 浮动装饰圆点 */
-body::after {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- radial-gradient(2px 2px at 20px 30px, rgba(76, 175, 80, 0.3), transparent),
- radial-gradient(2px 2px at 40px 70px, rgba(129, 199, 132, 0.3), transparent),
- radial-gradient(1px 1px at 90px 40px, rgba(165, 214, 167, 0.3), transparent),
- radial-gradient(1px 1px at 130px 80px, rgba(200, 230, 201, 0.3), transparent),
- radial-gradient(2px 2px at 160px 30px, rgba(76, 175, 80, 0.2), transparent);
- background-repeat: repeat;
- background-size: 200px 100px;
- animation: floatDots 20s linear infinite;
- pointer-events: none;
- z-index: -1;
-}
-
-@keyframes floatDots {
- 0% {
- transform: translateY(0px);
- }
- 100% {
- transform: translateY(-100px);
- }
-}
-
-/* 容器背景增强 */
-.container {
- background: rgba(255, 255, 255, 0.02);
- backdrop-filter: blur(10px);
- border-radius: 20px;
- position: relative;
-}
-
-/* 表单区域背景 */
-.form-section {
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(20px);
- border: 1px solid rgba(144, 238, 144, 0.3);
- position: relative;
- overflow: hidden;
-}
-
-.form-section::before {
- content: '';
- position: absolute;
- top: -50%;
- left: -50%;
- width: 200%;
- height: 200%;
- background: linear-gradient(45deg, transparent, rgba(144, 238, 144, 0.05), transparent);
- animation: shimmer 3s ease-in-out infinite;
- pointer-events: none;
-}
-
-@keyframes shimmer {
- 0% {
- transform: translateX(-100%) translateY(-100%) rotate(45deg);
- }
- 50% {
- transform: translateX(100%) translateY(100%) rotate(45deg);
- }
- 100% {
- transform: translateX(-100%) translateY(-100%) rotate(45deg);
- }
-}
-
-/* 结果卡片背景 */
-.basic-info-card,
-.bmi-card,
-.weight-card,
-.metabolism-card,
-.body-fat-card,
-.measurements-card,
-.advice-card {
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(15px);
- border: 1px solid rgba(144, 238, 144, 0.2);
- position: relative;
- overflow: hidden;
-}
-
-/* 卡片悬停背景效果 */
-.basic-info-card:hover,
-.bmi-card:hover,
-.weight-card:hover,
-.metabolism-card:hover,
-.body-fat-card:hover,
-.measurements-card:hover,
-.advice-card:hover {
- background: rgba(255, 255, 255, 0.98);
- border-color: rgba(76, 175, 80, 0.4);
-}
-
-/* 免责声明卡片背景 */
-.disclaimer-card {
- background: rgba(255, 243, 205, 0.95);
- backdrop-filter: blur(15px);
- border: 1px solid rgba(255, 234, 167, 0.5);
-}
-
-/* 错误区域背景 */
-.error-content {
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(20px);
- border: 1px solid rgba(220, 53, 69, 0.2);
-}
-
-/* 输入框背景 */
-.form-input,
-.form-select {
- background: rgba(248, 255, 248, 0.9);
- backdrop-filter: blur(10px);
-}
-
-.form-input:focus,
-.form-select:focus {
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(15px);
-}
-
-/* 信息项背景 */
-.info-item {
- background: rgba(248, 255, 248, 0.8);
- backdrop-filter: blur(5px);
-}
-
-/* BMI分类背景 */
-.bmi-category {
- background: rgba(232, 245, 232, 0.9);
- backdrop-filter: blur(10px);
-}
-
-/* 健康建议列表项背景 */
-.health-tips li {
- background: rgba(248, 255, 248, 0.8);
- backdrop-filter: blur(5px);
-}
-
-/* 按钮背景增强 */
-.submit-btn {
- position: relative;
- overflow: hidden;
-}
-
-.submit-btn::before {
- content: '';
- position: absolute;
- top: 0;
- left: -100%;
- width: 100%;
- height: 100%;
- background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
- transition: left 0.5s;
-}
-
-.submit-btn:hover::before {
- left: 100%;
-}
-
-/* 重置按钮背景 */
-.reset-btn {
- background: rgba(232, 245, 232, 0.9);
- backdrop-filter: blur(10px);
-}
-
-.reset-btn:hover {
- background: rgba(212, 237, 218, 0.95);
-}
-
-/* 响应式背景调整 */
-@media (max-width: 767px) {
- body::after {
- background-size: 150px 75px;
- animation-duration: 15s;
- }
-
- .form-section::before {
- animation-duration: 2s;
- }
-}
-
-@media (min-width: 768px) and (max-width: 1024px) {
- body::after {
- background-size: 180px 90px;
- animation-duration: 18s;
- }
-}
-
-@media (min-width: 1024px) {
- body::after {
- background-size: 220px 110px;
- animation-duration: 25s;
- }
-
- .container {
- background: rgba(255, 255, 255, 0.05);
- }
+/* 背景样式文件 - 独立管理背景相关样式 */
+
+/* 主体背景 */
+body {
+ background: linear-gradient(135deg, #e8f5e8 0%, #f0f8f0 25%, #e1f5e1 50%, #f5f9f5 75%, #e8f5e8 100%);
+ background-size: 400% 400%;
+ animation: gradientShift 15s ease infinite;
+ position: relative;
+ overflow-x: hidden;
+}
+
+/* 背景动画 */
+@keyframes gradientShift {
+ 0% {
+ background-position: 0% 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+ 100% {
+ background-position: 0% 50%;
+ }
+}
+
+/* 装饰性背景元素 */
+body::before {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(circle at 20% 80%, rgba(144, 238, 144, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(152, 251, 152, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 40% 40%, rgba(173, 255, 173, 0.08) 0%, transparent 50%);
+ pointer-events: none;
+ z-index: -2;
+}
+
+/* 浮动装饰圆点 */
+body::after {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(2px 2px at 20px 30px, rgba(76, 175, 80, 0.3), transparent),
+ radial-gradient(2px 2px at 40px 70px, rgba(129, 199, 132, 0.3), transparent),
+ radial-gradient(1px 1px at 90px 40px, rgba(165, 214, 167, 0.3), transparent),
+ radial-gradient(1px 1px at 130px 80px, rgba(200, 230, 201, 0.3), transparent),
+ radial-gradient(2px 2px at 160px 30px, rgba(76, 175, 80, 0.2), transparent);
+ background-repeat: repeat;
+ background-size: 200px 100px;
+ animation: floatDots 20s linear infinite;
+ pointer-events: none;
+ z-index: -1;
+}
+
+@keyframes floatDots {
+ 0% {
+ transform: translateY(0px);
+ }
+ 100% {
+ transform: translateY(-100px);
+ }
+}
+
+/* 容器背景增强 */
+.container {
+ background: rgba(255, 255, 255, 0.02);
+ backdrop-filter: blur(10px);
+ border-radius: 20px;
+ position: relative;
+}
+
+/* 表单区域背景 */
+.form-section {
+ background: rgba(255, 255, 255, 0.95);
+ backdrop-filter: blur(20px);
+ border: 1px solid rgba(144, 238, 144, 0.3);
+ position: relative;
+ overflow: hidden;
+}
+
+.form-section::before {
+ content: '';
+ position: absolute;
+ top: -50%;
+ left: -50%;
+ width: 200%;
+ height: 200%;
+ background: linear-gradient(45deg, transparent, rgba(144, 238, 144, 0.05), transparent);
+ animation: shimmer 3s ease-in-out infinite;
+ pointer-events: none;
+}
+
+@keyframes shimmer {
+ 0% {
+ transform: translateX(-100%) translateY(-100%) rotate(45deg);
+ }
+ 50% {
+ transform: translateX(100%) translateY(100%) rotate(45deg);
+ }
+ 100% {
+ transform: translateX(-100%) translateY(-100%) rotate(45deg);
+ }
+}
+
+/* 结果卡片背景 */
+.basic-info-card,
+.bmi-card,
+.weight-card,
+.metabolism-card,
+.body-fat-card,
+.measurements-card,
+.advice-card {
+ background: rgba(255, 255, 255, 0.95);
+ backdrop-filter: blur(15px);
+ border: 1px solid rgba(144, 238, 144, 0.2);
+ position: relative;
+ overflow: hidden;
+}
+
+/* 卡片悬停背景效果 */
+.basic-info-card:hover,
+.bmi-card:hover,
+.weight-card:hover,
+.metabolism-card:hover,
+.body-fat-card:hover,
+.measurements-card:hover,
+.advice-card:hover {
+ background: rgba(255, 255, 255, 0.98);
+ border-color: rgba(76, 175, 80, 0.4);
+}
+
+/* 免责声明卡片背景 */
+.disclaimer-card {
+ background: rgba(255, 243, 205, 0.95);
+ backdrop-filter: blur(15px);
+ border: 1px solid rgba(255, 234, 167, 0.5);
+}
+
+/* 错误区域背景 */
+.error-content {
+ background: rgba(255, 255, 255, 0.95);
+ backdrop-filter: blur(20px);
+ border: 1px solid rgba(220, 53, 69, 0.2);
+}
+
+/* 输入框背景 */
+.form-input,
+.form-select {
+ background: rgba(248, 255, 248, 0.9);
+ backdrop-filter: blur(10px);
+}
+
+.form-input:focus,
+.form-select:focus {
+ background: rgba(255, 255, 255, 0.95);
+ backdrop-filter: blur(15px);
+}
+
+/* 信息项背景 */
+.info-item {
+ background: rgba(248, 255, 248, 0.8);
+ backdrop-filter: blur(5px);
+}
+
+/* BMI分类背景 */
+.bmi-category {
+ background: rgba(232, 245, 232, 0.9);
+ backdrop-filter: blur(10px);
+}
+
+/* 健康建议列表项背景 */
+.health-tips li {
+ background: rgba(248, 255, 248, 0.8);
+ backdrop-filter: blur(5px);
+}
+
+/* 按钮背景增强 */
+.submit-btn {
+ position: relative;
+ overflow: hidden;
+}
+
+.submit-btn::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: -100%;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
+ transition: left 0.5s;
+}
+
+.submit-btn:hover::before {
+ left: 100%;
+}
+
+/* 重置按钮背景 */
+.reset-btn {
+ background: rgba(232, 245, 232, 0.9);
+ backdrop-filter: blur(10px);
+}
+
+.reset-btn:hover {
+ background: rgba(212, 237, 218, 0.95);
+}
+
+/* 响应式背景调整 */
+@media (max-width: 767px) {
+ body::after {
+ background-size: 150px 75px;
+ animation-duration: 15s;
+ }
+
+ .form-section::before {
+ animation-duration: 2s;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 1024px) {
+ body::after {
+ background-size: 180px 90px;
+ animation-duration: 18s;
+ }
+}
+
+@media (min-width: 1024px) {
+ body::after {
+ background-size: 220px 110px;
+ animation-duration: 25s;
+ }
+
+ .container {
+ background: rgba(255, 255, 255, 0.05);
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/index.html b/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/index.html
index d34d508c..a60fb0a5 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/index.html
+++ b/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/index.html
@@ -1,115 +1,115 @@
-
-
-
-
-
- 身体健康分析
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ 身体健康分析
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/script.js b/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/script.js
index d0a440df..d7b7cb49 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/script.js
+++ b/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/script.js
@@ -1,515 +1,515 @@
-// 身体健康分析 JavaScript 功能
-
-// DOM 元素获取
-const healthForm = document.getElementById('healthForm');
-const analyzeBtn = document.getElementById('analyzeBtn');
-const btnText = analyzeBtn.querySelector('.btn-text');
-const loadingSpinner = analyzeBtn.querySelector('.loading-spinner');
-const resultSection = document.getElementById('resultSection');
-const errorSection = document.getElementById('errorSection');
-const resetBtn = document.getElementById('resetBtn');
-const retryBtn = document.getElementById('retryBtn');
-
-// API 配置
-const API_BASE_URL = 'https://60s.api.shumengya.top/v2/health';
-
-// 表单验证规则
-const validationRules = {
- height: {
- min: 100,
- max: 250,
- message: '身高应在100-250cm之间'
- },
- weight: {
- min: 30,
- max: 200,
- message: '体重应在30-200kg之间'
- },
- age: {
- min: 1,
- max: 120,
- message: '年龄应在1-120岁之间'
- }
-};
-
-// 初始化
-document.addEventListener('DOMContentLoaded', function() {
- initializeEventListeners();
- setupFormValidation();
-});
-
-// 事件监听器初始化
-function initializeEventListeners() {
- healthForm.addEventListener('submit', handleFormSubmit);
- resetBtn.addEventListener('click', resetForm);
- retryBtn.addEventListener('click', retryAnalysis);
-
- // 输入框实时验证
- const inputs = healthForm.querySelectorAll('input, select');
- inputs.forEach(input => {
- input.addEventListener('blur', validateField);
- input.addEventListener('input', clearFieldError);
- });
-}
-
-// 表单验证设置
-function setupFormValidation() {
- const inputs = healthForm.querySelectorAll('input[type="number"]');
- inputs.forEach(input => {
- input.addEventListener('input', function() {
- // 移除非数字字符
- this.value = this.value.replace(/[^0-9.]/g, '');
-
- // 防止多个小数点
- const parts = this.value.split('.');
- if (parts.length > 2) {
- this.value = parts[0] + '.' + parts.slice(1).join('');
- }
- });
- });
-}
-
-// 表单提交处理
-async function handleFormSubmit(event) {
- event.preventDefault();
-
- if (!validateForm()) {
- return;
- }
-
- const formData = getFormData();
-
- try {
- setLoadingState(true);
- hideAllSections();
-
- const result = await callHealthAPI(formData);
- displayResults(result);
-
- } catch (error) {
- console.error('分析失败:', error);
- displayError(error.message || '分析失败,请稍后重试');
- } finally {
- setLoadingState(false);
- }
-}
-
-// 获取表单数据
-function getFormData() {
- return {
- height: parseInt(document.getElementById('height').value),
- weight: parseInt(document.getElementById('weight').value),
- age: parseInt(document.getElementById('age').value),
- gender: document.getElementById('gender').value
- };
-}
-
-// 表单验证
-function validateForm() {
- let isValid = true;
- const inputs = healthForm.querySelectorAll('input, select');
-
- inputs.forEach(input => {
- if (!validateField({ target: input })) {
- isValid = false;
- }
- });
-
- return isValid;
-}
-
-// 单个字段验证
-function validateField(event) {
- const field = event.target;
- const value = field.value.trim();
- const fieldName = field.name;
-
- // 清除之前的错误状态
- clearFieldError(event);
-
- // 必填验证
- if (!value) {
- showFieldError(field, '此字段为必填项');
- return false;
- }
-
- // 数值范围验证
- if (validationRules[fieldName]) {
- const numValue = parseFloat(value);
- const rule = validationRules[fieldName];
-
- if (numValue < rule.min || numValue > rule.max) {
- showFieldError(field, rule.message);
- return false;
- }
- }
-
- return true;
-}
-
-// 显示字段错误
-function showFieldError(field, message) {
- field.classList.add('error');
-
- // 移除已存在的错误消息
- const existingError = field.parentNode.querySelector('.error-message');
- if (existingError) {
- existingError.remove();
- }
-
- // 添加错误消息
- const errorDiv = document.createElement('div');
- errorDiv.className = 'error-message';
- errorDiv.textContent = message;
- errorDiv.style.color = '#dc3545';
- errorDiv.style.fontSize = '0.875rem';
- errorDiv.style.marginTop = '5px';
-
- field.parentNode.appendChild(errorDiv);
-}
-
-// 清除字段错误
-function clearFieldError(event) {
- const field = event.target;
- field.classList.remove('error');
-
- const errorMessage = field.parentNode.querySelector('.error-message');
- if (errorMessage) {
- errorMessage.remove();
- }
-}
-
-// 调用健康分析API
-async function callHealthAPI(data) {
- const params = new URLSearchParams({
- height: data.height,
- weight: data.weight,
- age: data.age,
- gender: data.gender
- });
-
- const response = await fetch(`${API_BASE_URL}?${params}`);
-
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
- }
-
- const result = await response.json();
-
- if (result.code !== 200) {
- throw new Error(result.message || '分析失败');
- }
-
- return result.data;
-}
-
-// 显示分析结果
-function displayResults(data) {
- // 基本信息
- displayBasicInfo(data.basic_info);
-
- // BMI 分析
- displayBMIInfo(data.bmi);
-
- // 体重评估
- displayWeightAssessment(data.weight_assessment);
-
- // 代谢分析
- displayMetabolism(data.metabolism);
-
- // 体脂分析
- displayBodyFat(data.body_fat);
-
- // 理想三围
- displayMeasurements(data.ideal_measurements);
-
- // 健康建议
- displayHealthAdvice(data.health_advice);
-
- // 免责声明
- displayDisclaimer(data.disclaimer);
-
- // 显示结果区域
- resultSection.style.display = 'block';
- resultSection.scrollIntoView({ behavior: 'smooth' });
-}
-
-// 显示基本信息
-function displayBasicInfo(basicInfo) {
- const container = document.getElementById('basicInfo');
- container.innerHTML = '';
-
- const infoItems = [
- { label: basicInfo.height_desc, value: basicInfo.height },
- { label: basicInfo.weight_desc, value: basicInfo.weight },
- { label: basicInfo.age_desc, value: basicInfo.age },
- { label: basicInfo.gender_desc, value: basicInfo.gender }
- ];
-
- infoItems.forEach(item => {
- const itemDiv = createInfoItem(item.label, item.value);
- container.appendChild(itemDiv);
- });
-}
-
-// 显示BMI信息
-function displayBMIInfo(bmiData) {
- const container = document.getElementById('bmiContent');
- container.innerHTML = `
- ${bmiData.value}
- ${bmiData.category}
-
- ${createInfoItem(bmiData.evaluation_desc, bmiData.evaluation).outerHTML}
- ${createInfoItem(bmiData.risk_desc, bmiData.risk).outerHTML}
-
- `;
-}
-
-// 显示体重评估
-function displayWeightAssessment(weightData) {
- const container = document.getElementById('weightContent');
- container.innerHTML = '';
-
- const items = [
- { label: weightData.ideal_weight_range_desc, value: weightData.ideal_weight_range },
- { label: weightData.standard_weight_desc, value: weightData.standard_weight },
- { label: weightData.status_desc, value: weightData.status },
- { label: weightData.adjustment_desc, value: weightData.adjustment }
- ];
-
- const grid = document.createElement('div');
- grid.className = 'info-grid';
-
- items.forEach(item => {
- const itemDiv = createInfoItem(item.label, item.value);
- grid.appendChild(itemDiv);
- });
-
- container.appendChild(grid);
-}
-
-// 显示代谢分析
-function displayMetabolism(metabolismData) {
- const container = document.getElementById('metabolismContent');
- container.innerHTML = '';
-
- const items = [
- { label: metabolismData.bmr_desc, value: metabolismData.bmr },
- { label: metabolismData.tdee_desc, value: metabolismData.tdee },
- { label: metabolismData.recommended_calories_desc, value: metabolismData.recommended_calories },
- { label: metabolismData.weight_loss_calories_desc, value: metabolismData.weight_loss_calories },
- { label: metabolismData.weight_gain_calories_desc, value: metabolismData.weight_gain_calories }
- ];
-
- const grid = document.createElement('div');
- grid.className = 'info-grid';
-
- items.forEach(item => {
- const itemDiv = createInfoItem(item.label, item.value);
- grid.appendChild(itemDiv);
- });
-
- container.appendChild(grid);
-}
-
-// 显示体脂分析
-function displayBodyFat(bodyFatData) {
- const container = document.getElementById('bodyFatContent');
- container.innerHTML = '';
-
- const items = [
- { label: bodyFatData.percentage_desc, value: bodyFatData.percentage },
- { label: bodyFatData.category_desc, value: bodyFatData.category },
- { label: bodyFatData.fat_weight_desc, value: bodyFatData.fat_weight },
- { label: bodyFatData.lean_weight_desc, value: bodyFatData.lean_weight }
- ];
-
- const grid = document.createElement('div');
- grid.className = 'info-grid';
-
- items.forEach(item => {
- const itemDiv = createInfoItem(item.label, item.value);
- grid.appendChild(itemDiv);
- });
-
- container.appendChild(grid);
-}
-
-// 显示理想三围
-function displayMeasurements(measurementsData) {
- const container = document.getElementById('measurementsContent');
- container.innerHTML = '';
-
- const items = [
- { label: measurementsData.chest_desc, value: measurementsData.chest },
- { label: measurementsData.waist_desc, value: measurementsData.waist },
- { label: measurementsData.hip_desc, value: measurementsData.hip }
- ];
-
- const grid = document.createElement('div');
- grid.className = 'info-grid';
-
- items.forEach(item => {
- const itemDiv = createInfoItem(item.label, item.value);
- grid.appendChild(itemDiv);
- });
-
- // 添加说明
- const note = document.createElement('p');
- note.style.marginTop = '15px';
- note.style.fontSize = '0.9rem';
- note.style.color = '#4a7c59';
- note.style.textAlign = 'center';
- note.textContent = measurementsData.note;
-
- container.appendChild(grid);
- container.appendChild(note);
-}
-
-// 显示健康建议
-function displayHealthAdvice(adviceData) {
- const container = document.getElementById('adviceContent');
- container.innerHTML = '';
-
- // 饮水量建议
- const waterDiv = createAdviceSection(adviceData.daily_water_intake_desc, adviceData.daily_water_intake);
- container.appendChild(waterDiv);
-
- // 运动建议
- const exerciseDiv = createAdviceSection(adviceData.exercise_recommendation_desc, adviceData.exercise_recommendation);
- container.appendChild(exerciseDiv);
-
- // 营养建议
- const nutritionDiv = createAdviceSection(adviceData.nutrition_advice_desc, adviceData.nutrition_advice);
- container.appendChild(nutritionDiv);
-
- // 健康提示
- const tipsDiv = document.createElement('div');
- tipsDiv.innerHTML = `
- ${adviceData.health_tips_desc}
-
- `;
-
- const tipsList = tipsDiv.querySelector('.health-tips');
- adviceData.health_tips.forEach(tip => {
- const li = document.createElement('li');
- li.textContent = tip;
- tipsList.appendChild(li);
- });
-
- container.appendChild(tipsDiv);
-}
-
-// 创建建议区块
-function createAdviceSection(title, content) {
- const div = document.createElement('div');
- div.style.marginBottom = '20px';
- div.innerHTML = `
- ${title}
- ${content}
- `;
- return div;
-}
-
-// 显示免责声明
-function displayDisclaimer(disclaimer) {
- const container = document.getElementById('disclaimer');
- container.textContent = disclaimer;
-}
-
-// 创建信息项
-function createInfoItem(label, value) {
- const div = document.createElement('div');
- div.className = 'info-item';
- div.innerHTML = `
- ${label}
- ${value}
- `;
- return div;
-}
-
-// 显示错误信息
-function displayError(message) {
- const errorMessage = document.getElementById('errorMessage');
- errorMessage.textContent = message;
- errorSection.style.display = 'block';
- errorSection.scrollIntoView({ behavior: 'smooth' });
-}
-
-// 设置加载状态
-function setLoadingState(isLoading) {
- if (isLoading) {
- analyzeBtn.disabled = true;
- btnText.style.display = 'none';
- loadingSpinner.style.display = 'block';
- } else {
- analyzeBtn.disabled = false;
- btnText.style.display = 'block';
- loadingSpinner.style.display = 'none';
- }
-}
-
-// 隐藏所有结果区域
-function hideAllSections() {
- resultSection.style.display = 'none';
- errorSection.style.display = 'none';
-}
-
-// 重置表单
-function resetForm() {
- healthForm.reset();
- hideAllSections();
-
- // 清除所有错误状态
- const errorInputs = healthForm.querySelectorAll('.error');
- errorInputs.forEach(input => {
- input.classList.remove('error');
- });
-
- const errorMessages = healthForm.querySelectorAll('.error-message');
- errorMessages.forEach(msg => msg.remove());
-
- // 滚动到表单顶部
- healthForm.scrollIntoView({ behavior: 'smooth' });
-}
-
-// 重试分析
-function retryAnalysis() {
- hideAllSections();
- healthForm.scrollIntoView({ behavior: 'smooth' });
-}
-
-// 工具函数:防抖
-function debounce(func, wait) {
- let timeout;
- return function executedFunction(...args) {
- const later = () => {
- clearTimeout(timeout);
- func(...args);
- };
- clearTimeout(timeout);
- timeout = setTimeout(later, wait);
- };
-}
-
-// 添加CSS样式到错误输入框
-const style = document.createElement('style');
-style.textContent = `
- .form-input.error,
- .form-select.error {
- border-color: #dc3545 !important;
- box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.1) !important;
- }
-`;
-document.head.appendChild(style);
-
-// 页面可见性变化处理(用户切换标签页时暂停动画等)
-document.addEventListener('visibilitychange', function() {
- if (document.hidden) {
- // 页面隐藏时的处理
- document.body.style.animationPlayState = 'paused';
- } else {
- // 页面显示时的处理
- document.body.style.animationPlayState = 'running';
- }
+// 身体健康分析 JavaScript 功能
+
+// DOM 元素获取
+const healthForm = document.getElementById('healthForm');
+const analyzeBtn = document.getElementById('analyzeBtn');
+const btnText = analyzeBtn.querySelector('.btn-text');
+const loadingSpinner = analyzeBtn.querySelector('.loading-spinner');
+const resultSection = document.getElementById('resultSection');
+const errorSection = document.getElementById('errorSection');
+const resetBtn = document.getElementById('resetBtn');
+const retryBtn = document.getElementById('retryBtn');
+
+// API 配置
+const API_BASE_URL = 'https://60s.api.shumengya.top/v2/health';
+
+// 表单验证规则
+const validationRules = {
+ height: {
+ min: 100,
+ max: 250,
+ message: '身高应在100-250cm之间'
+ },
+ weight: {
+ min: 30,
+ max: 200,
+ message: '体重应在30-200kg之间'
+ },
+ age: {
+ min: 1,
+ max: 120,
+ message: '年龄应在1-120岁之间'
+ }
+};
+
+// 初始化
+document.addEventListener('DOMContentLoaded', function() {
+ initializeEventListeners();
+ setupFormValidation();
+});
+
+// 事件监听器初始化
+function initializeEventListeners() {
+ healthForm.addEventListener('submit', handleFormSubmit);
+ resetBtn.addEventListener('click', resetForm);
+ retryBtn.addEventListener('click', retryAnalysis);
+
+ // 输入框实时验证
+ const inputs = healthForm.querySelectorAll('input, select');
+ inputs.forEach(input => {
+ input.addEventListener('blur', validateField);
+ input.addEventListener('input', clearFieldError);
+ });
+}
+
+// 表单验证设置
+function setupFormValidation() {
+ const inputs = healthForm.querySelectorAll('input[type="number"]');
+ inputs.forEach(input => {
+ input.addEventListener('input', function() {
+ // 移除非数字字符
+ this.value = this.value.replace(/[^0-9.]/g, '');
+
+ // 防止多个小数点
+ const parts = this.value.split('.');
+ if (parts.length > 2) {
+ this.value = parts[0] + '.' + parts.slice(1).join('');
+ }
+ });
+ });
+}
+
+// 表单提交处理
+async function handleFormSubmit(event) {
+ event.preventDefault();
+
+ if (!validateForm()) {
+ return;
+ }
+
+ const formData = getFormData();
+
+ try {
+ setLoadingState(true);
+ hideAllSections();
+
+ const result = await callHealthAPI(formData);
+ displayResults(result);
+
+ } catch (error) {
+ console.error('分析失败:', error);
+ displayError(error.message || '分析失败,请稍后重试');
+ } finally {
+ setLoadingState(false);
+ }
+}
+
+// 获取表单数据
+function getFormData() {
+ return {
+ height: parseInt(document.getElementById('height').value),
+ weight: parseInt(document.getElementById('weight').value),
+ age: parseInt(document.getElementById('age').value),
+ gender: document.getElementById('gender').value
+ };
+}
+
+// 表单验证
+function validateForm() {
+ let isValid = true;
+ const inputs = healthForm.querySelectorAll('input, select');
+
+ inputs.forEach(input => {
+ if (!validateField({ target: input })) {
+ isValid = false;
+ }
+ });
+
+ return isValid;
+}
+
+// 单个字段验证
+function validateField(event) {
+ const field = event.target;
+ const value = field.value.trim();
+ const fieldName = field.name;
+
+ // 清除之前的错误状态
+ clearFieldError(event);
+
+ // 必填验证
+ if (!value) {
+ showFieldError(field, '此字段为必填项');
+ return false;
+ }
+
+ // 数值范围验证
+ if (validationRules[fieldName]) {
+ const numValue = parseFloat(value);
+ const rule = validationRules[fieldName];
+
+ if (numValue < rule.min || numValue > rule.max) {
+ showFieldError(field, rule.message);
+ return false;
+ }
+ }
+
+ return true;
+}
+
+// 显示字段错误
+function showFieldError(field, message) {
+ field.classList.add('error');
+
+ // 移除已存在的错误消息
+ const existingError = field.parentNode.querySelector('.error-message');
+ if (existingError) {
+ existingError.remove();
+ }
+
+ // 添加错误消息
+ const errorDiv = document.createElement('div');
+ errorDiv.className = 'error-message';
+ errorDiv.textContent = message;
+ errorDiv.style.color = '#dc3545';
+ errorDiv.style.fontSize = '0.875rem';
+ errorDiv.style.marginTop = '5px';
+
+ field.parentNode.appendChild(errorDiv);
+}
+
+// 清除字段错误
+function clearFieldError(event) {
+ const field = event.target;
+ field.classList.remove('error');
+
+ const errorMessage = field.parentNode.querySelector('.error-message');
+ if (errorMessage) {
+ errorMessage.remove();
+ }
+}
+
+// 调用健康分析API
+async function callHealthAPI(data) {
+ const params = new URLSearchParams({
+ height: data.height,
+ weight: data.weight,
+ age: data.age,
+ gender: data.gender
+ });
+
+ const response = await fetch(`${API_BASE_URL}?${params}`);
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+ }
+
+ const result = await response.json();
+
+ if (result.code !== 200) {
+ throw new Error(result.message || '分析失败');
+ }
+
+ return result.data;
+}
+
+// 显示分析结果
+function displayResults(data) {
+ // 基本信息
+ displayBasicInfo(data.basic_info);
+
+ // BMI 分析
+ displayBMIInfo(data.bmi);
+
+ // 体重评估
+ displayWeightAssessment(data.weight_assessment);
+
+ // 代谢分析
+ displayMetabolism(data.metabolism);
+
+ // 体脂分析
+ displayBodyFat(data.body_fat);
+
+ // 理想三围
+ displayMeasurements(data.ideal_measurements);
+
+ // 健康建议
+ displayHealthAdvice(data.health_advice);
+
+ // 免责声明
+ displayDisclaimer(data.disclaimer);
+
+ // 显示结果区域
+ resultSection.style.display = 'block';
+ resultSection.scrollIntoView({ behavior: 'smooth' });
+}
+
+// 显示基本信息
+function displayBasicInfo(basicInfo) {
+ const container = document.getElementById('basicInfo');
+ container.innerHTML = '';
+
+ const infoItems = [
+ { label: basicInfo.height_desc, value: basicInfo.height },
+ { label: basicInfo.weight_desc, value: basicInfo.weight },
+ { label: basicInfo.age_desc, value: basicInfo.age },
+ { label: basicInfo.gender_desc, value: basicInfo.gender }
+ ];
+
+ infoItems.forEach(item => {
+ const itemDiv = createInfoItem(item.label, item.value);
+ container.appendChild(itemDiv);
+ });
+}
+
+// 显示BMI信息
+function displayBMIInfo(bmiData) {
+ const container = document.getElementById('bmiContent');
+ container.innerHTML = `
+ ${bmiData.value}
+ ${bmiData.category}
+
+ ${createInfoItem(bmiData.evaluation_desc, bmiData.evaluation).outerHTML}
+ ${createInfoItem(bmiData.risk_desc, bmiData.risk).outerHTML}
+
+ `;
+}
+
+// 显示体重评估
+function displayWeightAssessment(weightData) {
+ const container = document.getElementById('weightContent');
+ container.innerHTML = '';
+
+ const items = [
+ { label: weightData.ideal_weight_range_desc, value: weightData.ideal_weight_range },
+ { label: weightData.standard_weight_desc, value: weightData.standard_weight },
+ { label: weightData.status_desc, value: weightData.status },
+ { label: weightData.adjustment_desc, value: weightData.adjustment }
+ ];
+
+ const grid = document.createElement('div');
+ grid.className = 'info-grid';
+
+ items.forEach(item => {
+ const itemDiv = createInfoItem(item.label, item.value);
+ grid.appendChild(itemDiv);
+ });
+
+ container.appendChild(grid);
+}
+
+// 显示代谢分析
+function displayMetabolism(metabolismData) {
+ const container = document.getElementById('metabolismContent');
+ container.innerHTML = '';
+
+ const items = [
+ { label: metabolismData.bmr_desc, value: metabolismData.bmr },
+ { label: metabolismData.tdee_desc, value: metabolismData.tdee },
+ { label: metabolismData.recommended_calories_desc, value: metabolismData.recommended_calories },
+ { label: metabolismData.weight_loss_calories_desc, value: metabolismData.weight_loss_calories },
+ { label: metabolismData.weight_gain_calories_desc, value: metabolismData.weight_gain_calories }
+ ];
+
+ const grid = document.createElement('div');
+ grid.className = 'info-grid';
+
+ items.forEach(item => {
+ const itemDiv = createInfoItem(item.label, item.value);
+ grid.appendChild(itemDiv);
+ });
+
+ container.appendChild(grid);
+}
+
+// 显示体脂分析
+function displayBodyFat(bodyFatData) {
+ const container = document.getElementById('bodyFatContent');
+ container.innerHTML = '';
+
+ const items = [
+ { label: bodyFatData.percentage_desc, value: bodyFatData.percentage },
+ { label: bodyFatData.category_desc, value: bodyFatData.category },
+ { label: bodyFatData.fat_weight_desc, value: bodyFatData.fat_weight },
+ { label: bodyFatData.lean_weight_desc, value: bodyFatData.lean_weight }
+ ];
+
+ const grid = document.createElement('div');
+ grid.className = 'info-grid';
+
+ items.forEach(item => {
+ const itemDiv = createInfoItem(item.label, item.value);
+ grid.appendChild(itemDiv);
+ });
+
+ container.appendChild(grid);
+}
+
+// 显示理想三围
+function displayMeasurements(measurementsData) {
+ const container = document.getElementById('measurementsContent');
+ container.innerHTML = '';
+
+ const items = [
+ { label: measurementsData.chest_desc, value: measurementsData.chest },
+ { label: measurementsData.waist_desc, value: measurementsData.waist },
+ { label: measurementsData.hip_desc, value: measurementsData.hip }
+ ];
+
+ const grid = document.createElement('div');
+ grid.className = 'info-grid';
+
+ items.forEach(item => {
+ const itemDiv = createInfoItem(item.label, item.value);
+ grid.appendChild(itemDiv);
+ });
+
+ // 添加说明
+ const note = document.createElement('p');
+ note.style.marginTop = '15px';
+ note.style.fontSize = '0.9rem';
+ note.style.color = '#4a7c59';
+ note.style.textAlign = 'center';
+ note.textContent = measurementsData.note;
+
+ container.appendChild(grid);
+ container.appendChild(note);
+}
+
+// 显示健康建议
+function displayHealthAdvice(adviceData) {
+ const container = document.getElementById('adviceContent');
+ container.innerHTML = '';
+
+ // 饮水量建议
+ const waterDiv = createAdviceSection(adviceData.daily_water_intake_desc, adviceData.daily_water_intake);
+ container.appendChild(waterDiv);
+
+ // 运动建议
+ const exerciseDiv = createAdviceSection(adviceData.exercise_recommendation_desc, adviceData.exercise_recommendation);
+ container.appendChild(exerciseDiv);
+
+ // 营养建议
+ const nutritionDiv = createAdviceSection(adviceData.nutrition_advice_desc, adviceData.nutrition_advice);
+ container.appendChild(nutritionDiv);
+
+ // 健康提示
+ const tipsDiv = document.createElement('div');
+ tipsDiv.innerHTML = `
+ ${adviceData.health_tips_desc}
+
+ `;
+
+ const tipsList = tipsDiv.querySelector('.health-tips');
+ adviceData.health_tips.forEach(tip => {
+ const li = document.createElement('li');
+ li.textContent = tip;
+ tipsList.appendChild(li);
+ });
+
+ container.appendChild(tipsDiv);
+}
+
+// 创建建议区块
+function createAdviceSection(title, content) {
+ const div = document.createElement('div');
+ div.style.marginBottom = '20px';
+ div.innerHTML = `
+ ${title}
+ ${content}
+ `;
+ return div;
+}
+
+// 显示免责声明
+function displayDisclaimer(disclaimer) {
+ const container = document.getElementById('disclaimer');
+ container.textContent = disclaimer;
+}
+
+// 创建信息项
+function createInfoItem(label, value) {
+ const div = document.createElement('div');
+ div.className = 'info-item';
+ div.innerHTML = `
+ ${label}
+ ${value}
+ `;
+ return div;
+}
+
+// 显示错误信息
+function displayError(message) {
+ const errorMessage = document.getElementById('errorMessage');
+ errorMessage.textContent = message;
+ errorSection.style.display = 'block';
+ errorSection.scrollIntoView({ behavior: 'smooth' });
+}
+
+// 设置加载状态
+function setLoadingState(isLoading) {
+ if (isLoading) {
+ analyzeBtn.disabled = true;
+ btnText.style.display = 'none';
+ loadingSpinner.style.display = 'block';
+ } else {
+ analyzeBtn.disabled = false;
+ btnText.style.display = 'block';
+ loadingSpinner.style.display = 'none';
+ }
+}
+
+// 隐藏所有结果区域
+function hideAllSections() {
+ resultSection.style.display = 'none';
+ errorSection.style.display = 'none';
+}
+
+// 重置表单
+function resetForm() {
+ healthForm.reset();
+ hideAllSections();
+
+ // 清除所有错误状态
+ const errorInputs = healthForm.querySelectorAll('.error');
+ errorInputs.forEach(input => {
+ input.classList.remove('error');
+ });
+
+ const errorMessages = healthForm.querySelectorAll('.error-message');
+ errorMessages.forEach(msg => msg.remove());
+
+ // 滚动到表单顶部
+ healthForm.scrollIntoView({ behavior: 'smooth' });
+}
+
+// 重试分析
+function retryAnalysis() {
+ hideAllSections();
+ healthForm.scrollIntoView({ behavior: 'smooth' });
+}
+
+// 工具函数:防抖
+function debounce(func, wait) {
+ let timeout;
+ return function executedFunction(...args) {
+ const later = () => {
+ clearTimeout(timeout);
+ func(...args);
+ };
+ clearTimeout(timeout);
+ timeout = setTimeout(later, wait);
+ };
+}
+
+// 添加CSS样式到错误输入框
+const style = document.createElement('style');
+style.textContent = `
+ .form-input.error,
+ .form-select.error {
+ border-color: #dc3545 !important;
+ box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.1) !important;
+ }
+`;
+document.head.appendChild(style);
+
+// 页面可见性变化处理(用户切换标签页时暂停动画等)
+document.addEventListener('visibilitychange', function() {
+ if (document.hidden) {
+ // 页面隐藏时的处理
+ document.body.style.animationPlayState = 'paused';
+ } else {
+ // 页面显示时的处理
+ document.body.style.animationPlayState = 'running';
+ }
});
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/styles.css b/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/styles.css
index 90fde65a..20780ffb 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/styles.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/styles.css
@@ -1,697 +1,697 @@
-/* 基础样式重置 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
- line-height: 1.6;
- color: #2d5a3d;
- min-height: 100vh;
-}
-
-/* 容器布局 */
-.container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 20px;
- min-height: 100vh;
- display: flex;
- flex-direction: column;
-}
-
-/* 头部样式 */
-.header {
- text-align: center;
- margin-bottom: 30px;
- padding: 20px 0;
-}
-
-.title {
- font-size: 2.5rem;
- font-weight: 700;
- color: #1a4d2e;
- margin-bottom: 10px;
- text-shadow: 0 2px 4px rgba(26, 77, 46, 0.1);
-}
-
-.subtitle {
- font-size: 1.1rem;
- color: #4a7c59;
- font-weight: 400;
-}
-
-/* 主内容区域 */
-.main-content {
- flex: 1;
- display: flex;
- flex-direction: column;
- gap: 30px;
-}
-
-/* 表单区域 */
-.form-section {
- background: rgba(255, 255, 255, 0.95);
- border-radius: 20px;
- padding: 30px;
- box-shadow: 0 8px 32px rgba(26, 77, 46, 0.1);
- border: 1px solid rgba(144, 238, 144, 0.3);
-}
-
-.health-form {
- display: grid;
- gap: 20px;
-}
-
-.form-group {
- display: flex;
- flex-direction: column;
- gap: 8px;
-}
-
-.form-label {
- font-weight: 600;
- color: #2d5a3d;
- font-size: 1rem;
-}
-
-.form-input,
-.form-select {
- padding: 15px 20px;
- border: 2px solid #a8e6a3;
- border-radius: 12px;
- font-size: 1rem;
- background: #f8fff8;
- color: #2d5a3d;
- transition: all 0.3s ease;
-}
-
-.form-input:focus,
-.form-select:focus {
- outline: none;
- border-color: #4caf50;
- box-shadow: 0 0 0 3px rgba(76, 175, 80, 0.1);
- background: #ffffff;
-}
-
-.form-input::placeholder {
- color: #81c784;
-}
-
-/* 提交按钮 */
-.submit-btn {
- background: linear-gradient(135deg, #4caf50, #66bb6a);
- color: white;
- border: none;
- padding: 18px 30px;
- border-radius: 12px;
- font-size: 1.1rem;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.3s ease;
- position: relative;
- overflow: hidden;
- margin-top: 10px;
-}
-
-.submit-btn:hover {
- background: linear-gradient(135deg, #45a049, #5cb85c);
- transform: translateY(-2px);
- box-shadow: 0 8px 25px rgba(76, 175, 80, 0.3);
-}
-
-.submit-btn:active {
- transform: translateY(0);
-}
-
-.submit-btn:disabled {
- background: #c8e6c9;
- cursor: not-allowed;
- transform: none;
- box-shadow: none;
-}
-
-/* 加载动画 */
-.loading-spinner {
- width: 20px;
- height: 20px;
- border: 2px solid rgba(255, 255, 255, 0.3);
- border-top: 2px solid white;
- border-radius: 50%;
- animation: spin 1s linear infinite;
- margin: 0 auto;
-}
-
-@keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-/* 结果区域 */
-.result-section {
- animation: fadeInUp 0.6s ease-out;
-}
-
-.result-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 25px;
- flex-wrap: wrap;
- gap: 15px;
-}
-
-.result-title {
- font-size: 2rem;
- color: #1a4d2e;
- font-weight: 700;
-}
-
-.reset-btn {
- background: #e8f5e8;
- color: #2d5a3d;
- border: 2px solid #a8e6a3;
- padding: 10px 20px;
- border-radius: 8px;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.3s ease;
-}
-
-.reset-btn:hover {
- background: #d4edda;
- border-color: #4caf50;
-}
-
-/* 结果卡片 */
-.result-content {
- display: grid;
- gap: 20px;
-}
-
-.basic-info-card,
-.bmi-card,
-.weight-card,
-.metabolism-card,
-.body-fat-card,
-.measurements-card,
-.advice-card,
-.disclaimer-card {
- background: rgba(255, 255, 255, 0.95);
- border-radius: 16px;
- padding: 25px;
- box-shadow: 0 6px 20px rgba(26, 77, 46, 0.08);
- border: 1px solid rgba(144, 238, 144, 0.2);
- transition: transform 0.3s ease, box-shadow 0.3s ease;
-}
-
-.basic-info-card:hover,
-.bmi-card:hover,
-.weight-card:hover,
-.metabolism-card:hover,
-.body-fat-card:hover,
-.measurements-card:hover,
-.advice-card:hover {
- transform: translateY(-2px);
- box-shadow: 0 8px 25px rgba(26, 77, 46, 0.12);
-}
-
-.card-title {
- font-size: 1.4rem;
- color: #1a4d2e;
- font-weight: 700;
- margin-bottom: 15px;
- border-bottom: 2px solid #e8f5e8;
- padding-bottom: 10px;
-}
-
-/* 信息网格 */
-.info-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 15px;
-}
-
-.info-item {
- background: #f8fff8;
- padding: 15px;
- border-radius: 10px;
- border-left: 4px solid #4caf50;
-}
-
-.info-label {
- font-size: 0.9rem;
- color: #4a7c59;
- font-weight: 600;
- margin-bottom: 5px;
-}
-
-.info-value {
- font-size: 1.2rem;
- color: #2d5a3d;
- font-weight: 700;
-}
-
-/* BMI 特殊样式 */
-.bmi-value {
- font-size: 2.5rem;
- font-weight: 800;
- color: #4caf50;
- text-align: center;
- margin: 15px 0;
-}
-
-.bmi-category {
- text-align: center;
- font-size: 1.3rem;
- font-weight: 600;
- color: #2d5a3d;
- background: #e8f5e8;
- padding: 10px;
- border-radius: 8px;
- margin: 10px 0;
-}
-
-/* 健康建议列表 */
-.health-tips {
- list-style: none;
- padding: 0;
-}
-
-.health-tips li {
- background: #f8fff8;
- margin: 10px 0;
- padding: 12px 15px;
- border-radius: 8px;
- border-left: 4px solid #81c784;
- position: relative;
-}
-
-.health-tips li::before {
- content: "✓";
- color: #4caf50;
- font-weight: bold;
- margin-right: 10px;
-}
-
-/* 免责声明 */
-.disclaimer {
- background: #fff3cd;
- border: 1px solid #ffeaa7;
- color: #856404;
- padding: 15px;
- border-radius: 8px;
- font-size: 0.95rem;
- line-height: 1.5;
- text-align: center;
-}
-
-/* 错误区域 */
-.error-section {
- text-align: center;
- padding: 40px 20px;
-}
-
-.error-content {
- background: rgba(255, 255, 255, 0.95);
- border-radius: 16px;
- padding: 30px;
- box-shadow: 0 6px 20px rgba(220, 53, 69, 0.1);
- border: 1px solid rgba(220, 53, 69, 0.2);
- max-width: 400px;
- margin: 0 auto;
-}
-
-.error-title {
- color: #dc3545;
- font-size: 1.5rem;
- margin-bottom: 15px;
-}
-
-.error-message {
- color: #6c757d;
- margin-bottom: 20px;
-}
-
-.retry-btn {
- background: #dc3545;
- color: white;
- border: none;
- padding: 12px 24px;
- border-radius: 8px;
- font-weight: 600;
- cursor: pointer;
- transition: background 0.3s ease;
-}
-
-.retry-btn:hover {
- background: #c82333;
-}
-
-/* 底部 */
-.footer {
- text-align: center;
- padding: 20px 0;
- margin-top: 30px;
- border-top: 1px solid rgba(144, 238, 144, 0.3);
-}
-
-.footer-text {
- color: #4a7c59;
- font-size: 0.9rem;
-}
-
-/* 动画效果 */
-@keyframes fadeInUp {
- from {
- opacity: 0;
- transform: translateY(30px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-/* 平板端适配 (768px - 1024px) */
-@media (min-width: 768px) and (max-width: 1024px) {
- .container {
- padding: 30px;
- }
-
- .title {
- font-size: 2.8rem;
- }
-
- .form-section {
- padding: 35px;
- }
-
- .health-form {
- grid-template-columns: repeat(2, 1fr);
- gap: 25px;
- }
-
- .form-group:last-child {
- grid-column: 1 / -1;
- }
-
- .result-content {
- grid-template-columns: repeat(2, 1fr);
- }
-
- .advice-card,
- .disclaimer-card {
- grid-column: 1 / -1;
- }
-}
-
-/* 电脑端适配 (1024px+) */
-@media (min-width: 1024px) {
- .container {
- padding: 40px;
- max-width: 1400px;
- }
-
- .title {
- font-size: 3.2rem;
- }
-
- .main-content {
- flex-direction: row;
- gap: 40px;
- align-items: flex-start;
- }
-
- .form-section {
- flex: 0 0 380px;
- position: sticky;
- top: 20px;
- max-height: calc(100vh - 40px);
- overflow-y: auto;
- }
-
- .result-section,
- .error-section {
- flex: 1;
- min-width: 0;
- }
-
- /* 桌面端结果区域重新设计 - 使用更清晰的布局 */
- .result-content {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- gap: 25px;
- grid-auto-rows: min-content;
- }
-
- /* 基本信息卡片 - 占满第一行 */
- .basic-info-card {
- grid-column: 1 / -1;
- }
-
- /* 第二行:BMI、体重评估、代谢分析 */
- .bmi-card,
- .weight-card,
- .metabolism-card {
- grid-column: span 1;
- }
-
- /* 第三行:体脂分析和理想三围 */
- .body-fat-card {
- grid-column: span 2;
- }
-
- .measurements-card {
- grid-column: span 1;
- }
-
- /* 第四行:健康建议 - 占满整行 */
- .advice-card {
- grid-column: 1 / -1;
- }
-
- /* 第五行:免责声明 - 占满整行 */
- .disclaimer-card {
- grid-column: 1 / -1;
- }
-
- /* 基本信息网格优化 */
- .basic-info-card .info-grid {
- grid-template-columns: repeat(4, 1fr);
- gap: 20px;
- }
-
- /* BMI卡片特殊布局 */
- .bmi-card {
- display: flex;
- flex-direction: column;
- min-height: 280px;
- }
-
- .bmi-card .bmi-content {
- flex: 1;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- text-align: center;
- }
-
- .bmi-value {
- font-size: 3rem;
- margin: 20px 0;
- }
-
- /* 体重评估卡片布局优化 */
- .weight-card {
- display: flex;
- flex-direction: column;
- min-height: 280px;
- }
-
- .weight-card .weight-content {
- flex: 1;
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- }
-
- .weight-card .info-grid {
- grid-template-columns: 1fr;
- gap: 12px;
- }
-
- /* 代谢分析卡片布局优化 */
- .metabolism-card {
- display: flex;
- flex-direction: column;
- min-height: 280px;
- }
-
- .metabolism-card .metabolism-content {
- flex: 1;
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- }
-
- .metabolism-card .info-grid {
- grid-template-columns: 1fr;
- gap: 12px;
- }
-
- /* 体脂分析卡片网格优化 */
- .body-fat-card .info-grid {
- grid-template-columns: repeat(2, 1fr);
- gap: 15px;
- }
-
- /* 理想三围卡片网格优化 */
- .measurements-card {
- display: flex;
- flex-direction: column;
- min-height: 200px;
- }
-
- .measurements-card .measurements-content {
- flex: 1;
- display: flex;
- flex-direction: column;
- justify-content: center;
- }
-
- .measurements-card .info-grid {
- grid-template-columns: 1fr;
- gap: 15px;
- }
-
- /* 健康建议卡片布局优化 */
- .advice-card {
- padding: 30px;
- }
-
- .advice-card .advice-content {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- gap: 25px;
- margin-bottom: 25px;
- }
-
- .advice-card .health-tips {
- grid-column: 1 / -1;
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: 15px;
- list-style: none;
- padding: 0;
- }
-
- /* 表单区域优化 */
- .health-form {
- display: grid;
- gap: 25px;
- }
-
- .form-group {
- margin-bottom: 0;
- }
-
- .submit-btn {
- margin-top: 20px;
- padding: 20px 30px;
- font-size: 1.2rem;
- }
-}
-
-/* 手机端适配 (最高优先级) */
-@media (max-width: 767px) {
- .container {
- padding: 15px;
- }
-
- .header {
- margin-bottom: 20px;
- padding: 15px 0;
- }
-
- .title {
- font-size: 2rem;
- }
-
- .subtitle {
- font-size: 1rem;
- }
-
- .form-section {
- padding: 20px;
- border-radius: 16px;
- }
-
- .form-input,
- .form-select {
- padding: 12px 16px;
- font-size: 16px; /* 防止iOS缩放 */
- }
-
- .submit-btn {
- padding: 16px 24px;
- font-size: 1rem;
- }
-
- .result-header {
- flex-direction: column;
- align-items: stretch;
- gap: 15px;
- }
-
- .result-title {
- font-size: 1.6rem;
- text-align: center;
- }
-
- .reset-btn {
- align-self: center;
- padding: 12px 24px;
- }
-
- .basic-info-card,
- .bmi-card,
- .weight-card,
- .metabolism-card,
- .body-fat-card,
- .measurements-card,
- .advice-card,
- .disclaimer-card {
- padding: 20px;
- border-radius: 12px;
- }
-
- .card-title {
- font-size: 1.2rem;
- }
-
- .info-grid {
- grid-template-columns: 1fr;
- gap: 12px;
- }
-
- .bmi-value {
- font-size: 2rem;
- }
-
- .bmi-category {
- font-size: 1.1rem;
- }
-
- .health-tips li {
- padding: 10px 12px;
- font-size: 0.95rem;
- }
-
- .error-content {
- padding: 25px 20px;
- }
+/* 基础样式重置 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
+ line-height: 1.6;
+ color: #2d5a3d;
+ min-height: 100vh;
+}
+
+/* 容器布局 */
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+}
+
+/* 头部样式 */
+.header {
+ text-align: center;
+ margin-bottom: 30px;
+ padding: 20px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+ font-weight: 700;
+ color: #1a4d2e;
+ margin-bottom: 10px;
+ text-shadow: 0 2px 4px rgba(26, 77, 46, 0.1);
+}
+
+.subtitle {
+ font-size: 1.1rem;
+ color: #4a7c59;
+ font-weight: 400;
+}
+
+/* 主内容区域 */
+.main-content {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 30px;
+}
+
+/* 表单区域 */
+.form-section {
+ background: rgba(255, 255, 255, 0.95);
+ border-radius: 20px;
+ padding: 30px;
+ box-shadow: 0 8px 32px rgba(26, 77, 46, 0.1);
+ border: 1px solid rgba(144, 238, 144, 0.3);
+}
+
+.health-form {
+ display: grid;
+ gap: 20px;
+}
+
+.form-group {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.form-label {
+ font-weight: 600;
+ color: #2d5a3d;
+ font-size: 1rem;
+}
+
+.form-input,
+.form-select {
+ padding: 15px 20px;
+ border: 2px solid #a8e6a3;
+ border-radius: 12px;
+ font-size: 1rem;
+ background: #f8fff8;
+ color: #2d5a3d;
+ transition: all 0.3s ease;
+}
+
+.form-input:focus,
+.form-select:focus {
+ outline: none;
+ border-color: #4caf50;
+ box-shadow: 0 0 0 3px rgba(76, 175, 80, 0.1);
+ background: #ffffff;
+}
+
+.form-input::placeholder {
+ color: #81c784;
+}
+
+/* 提交按钮 */
+.submit-btn {
+ background: linear-gradient(135deg, #4caf50, #66bb6a);
+ color: white;
+ border: none;
+ padding: 18px 30px;
+ border-radius: 12px;
+ font-size: 1.1rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ position: relative;
+ overflow: hidden;
+ margin-top: 10px;
+}
+
+.submit-btn:hover {
+ background: linear-gradient(135deg, #45a049, #5cb85c);
+ transform: translateY(-2px);
+ box-shadow: 0 8px 25px rgba(76, 175, 80, 0.3);
+}
+
+.submit-btn:active {
+ transform: translateY(0);
+}
+
+.submit-btn:disabled {
+ background: #c8e6c9;
+ cursor: not-allowed;
+ transform: none;
+ box-shadow: none;
+}
+
+/* 加载动画 */
+.loading-spinner {
+ width: 20px;
+ height: 20px;
+ border: 2px solid rgba(255, 255, 255, 0.3);
+ border-top: 2px solid white;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ margin: 0 auto;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+/* 结果区域 */
+.result-section {
+ animation: fadeInUp 0.6s ease-out;
+}
+
+.result-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 25px;
+ flex-wrap: wrap;
+ gap: 15px;
+}
+
+.result-title {
+ font-size: 2rem;
+ color: #1a4d2e;
+ font-weight: 700;
+}
+
+.reset-btn {
+ background: #e8f5e8;
+ color: #2d5a3d;
+ border: 2px solid #a8e6a3;
+ padding: 10px 20px;
+ border-radius: 8px;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+}
+
+.reset-btn:hover {
+ background: #d4edda;
+ border-color: #4caf50;
+}
+
+/* 结果卡片 */
+.result-content {
+ display: grid;
+ gap: 20px;
+}
+
+.basic-info-card,
+.bmi-card,
+.weight-card,
+.metabolism-card,
+.body-fat-card,
+.measurements-card,
+.advice-card,
+.disclaimer-card {
+ background: rgba(255, 255, 255, 0.95);
+ border-radius: 16px;
+ padding: 25px;
+ box-shadow: 0 6px 20px rgba(26, 77, 46, 0.08);
+ border: 1px solid rgba(144, 238, 144, 0.2);
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
+}
+
+.basic-info-card:hover,
+.bmi-card:hover,
+.weight-card:hover,
+.metabolism-card:hover,
+.body-fat-card:hover,
+.measurements-card:hover,
+.advice-card:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 8px 25px rgba(26, 77, 46, 0.12);
+}
+
+.card-title {
+ font-size: 1.4rem;
+ color: #1a4d2e;
+ font-weight: 700;
+ margin-bottom: 15px;
+ border-bottom: 2px solid #e8f5e8;
+ padding-bottom: 10px;
+}
+
+/* 信息网格 */
+.info-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: 15px;
+}
+
+.info-item {
+ background: #f8fff8;
+ padding: 15px;
+ border-radius: 10px;
+ border-left: 4px solid #4caf50;
+}
+
+.info-label {
+ font-size: 0.9rem;
+ color: #4a7c59;
+ font-weight: 600;
+ margin-bottom: 5px;
+}
+
+.info-value {
+ font-size: 1.2rem;
+ color: #2d5a3d;
+ font-weight: 700;
+}
+
+/* BMI 特殊样式 */
+.bmi-value {
+ font-size: 2.5rem;
+ font-weight: 800;
+ color: #4caf50;
+ text-align: center;
+ margin: 15px 0;
+}
+
+.bmi-category {
+ text-align: center;
+ font-size: 1.3rem;
+ font-weight: 600;
+ color: #2d5a3d;
+ background: #e8f5e8;
+ padding: 10px;
+ border-radius: 8px;
+ margin: 10px 0;
+}
+
+/* 健康建议列表 */
+.health-tips {
+ list-style: none;
+ padding: 0;
+}
+
+.health-tips li {
+ background: #f8fff8;
+ margin: 10px 0;
+ padding: 12px 15px;
+ border-radius: 8px;
+ border-left: 4px solid #81c784;
+ position: relative;
+}
+
+.health-tips li::before {
+ content: "✓";
+ color: #4caf50;
+ font-weight: bold;
+ margin-right: 10px;
+}
+
+/* 免责声明 */
+.disclaimer {
+ background: #fff3cd;
+ border: 1px solid #ffeaa7;
+ color: #856404;
+ padding: 15px;
+ border-radius: 8px;
+ font-size: 0.95rem;
+ line-height: 1.5;
+ text-align: center;
+}
+
+/* 错误区域 */
+.error-section {
+ text-align: center;
+ padding: 40px 20px;
+}
+
+.error-content {
+ background: rgba(255, 255, 255, 0.95);
+ border-radius: 16px;
+ padding: 30px;
+ box-shadow: 0 6px 20px rgba(220, 53, 69, 0.1);
+ border: 1px solid rgba(220, 53, 69, 0.2);
+ max-width: 400px;
+ margin: 0 auto;
+}
+
+.error-title {
+ color: #dc3545;
+ font-size: 1.5rem;
+ margin-bottom: 15px;
+}
+
+.error-message {
+ color: #6c757d;
+ margin-bottom: 20px;
+}
+
+.retry-btn {
+ background: #dc3545;
+ color: white;
+ border: none;
+ padding: 12px 24px;
+ border-radius: 8px;
+ font-weight: 600;
+ cursor: pointer;
+ transition: background 0.3s ease;
+}
+
+.retry-btn:hover {
+ background: #c82333;
+}
+
+/* 底部 */
+.footer {
+ text-align: center;
+ padding: 20px 0;
+ margin-top: 30px;
+ border-top: 1px solid rgba(144, 238, 144, 0.3);
+}
+
+.footer-text {
+ color: #4a7c59;
+ font-size: 0.9rem;
+}
+
+/* 动画效果 */
+@keyframes fadeInUp {
+ from {
+ opacity: 0;
+ transform: translateY(30px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+/* 平板端适配 (768px - 1024px) */
+@media (min-width: 768px) and (max-width: 1024px) {
+ .container {
+ padding: 30px;
+ }
+
+ .title {
+ font-size: 2.8rem;
+ }
+
+ .form-section {
+ padding: 35px;
+ }
+
+ .health-form {
+ grid-template-columns: repeat(2, 1fr);
+ gap: 25px;
+ }
+
+ .form-group:last-child {
+ grid-column: 1 / -1;
+ }
+
+ .result-content {
+ grid-template-columns: repeat(2, 1fr);
+ }
+
+ .advice-card,
+ .disclaimer-card {
+ grid-column: 1 / -1;
+ }
+}
+
+/* 电脑端适配 (1024px+) */
+@media (min-width: 1024px) {
+ .container {
+ padding: 40px;
+ max-width: 1400px;
+ }
+
+ .title {
+ font-size: 3.2rem;
+ }
+
+ .main-content {
+ flex-direction: row;
+ gap: 40px;
+ align-items: flex-start;
+ }
+
+ .form-section {
+ flex: 0 0 380px;
+ position: sticky;
+ top: 20px;
+ max-height: calc(100vh - 40px);
+ overflow-y: auto;
+ }
+
+ .result-section,
+ .error-section {
+ flex: 1;
+ min-width: 0;
+ }
+
+ /* 桌面端结果区域重新设计 - 使用更清晰的布局 */
+ .result-content {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 25px;
+ grid-auto-rows: min-content;
+ }
+
+ /* 基本信息卡片 - 占满第一行 */
+ .basic-info-card {
+ grid-column: 1 / -1;
+ }
+
+ /* 第二行:BMI、体重评估、代谢分析 */
+ .bmi-card,
+ .weight-card,
+ .metabolism-card {
+ grid-column: span 1;
+ }
+
+ /* 第三行:体脂分析和理想三围 */
+ .body-fat-card {
+ grid-column: span 2;
+ }
+
+ .measurements-card {
+ grid-column: span 1;
+ }
+
+ /* 第四行:健康建议 - 占满整行 */
+ .advice-card {
+ grid-column: 1 / -1;
+ }
+
+ /* 第五行:免责声明 - 占满整行 */
+ .disclaimer-card {
+ grid-column: 1 / -1;
+ }
+
+ /* 基本信息网格优化 */
+ .basic-info-card .info-grid {
+ grid-template-columns: repeat(4, 1fr);
+ gap: 20px;
+ }
+
+ /* BMI卡片特殊布局 */
+ .bmi-card {
+ display: flex;
+ flex-direction: column;
+ min-height: 280px;
+ }
+
+ .bmi-card .bmi-content {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ }
+
+ .bmi-value {
+ font-size: 3rem;
+ margin: 20px 0;
+ }
+
+ /* 体重评估卡片布局优化 */
+ .weight-card {
+ display: flex;
+ flex-direction: column;
+ min-height: 280px;
+ }
+
+ .weight-card .weight-content {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ }
+
+ .weight-card .info-grid {
+ grid-template-columns: 1fr;
+ gap: 12px;
+ }
+
+ /* 代谢分析卡片布局优化 */
+ .metabolism-card {
+ display: flex;
+ flex-direction: column;
+ min-height: 280px;
+ }
+
+ .metabolism-card .metabolism-content {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ }
+
+ .metabolism-card .info-grid {
+ grid-template-columns: 1fr;
+ gap: 12px;
+ }
+
+ /* 体脂分析卡片网格优化 */
+ .body-fat-card .info-grid {
+ grid-template-columns: repeat(2, 1fr);
+ gap: 15px;
+ }
+
+ /* 理想三围卡片网格优化 */
+ .measurements-card {
+ display: flex;
+ flex-direction: column;
+ min-height: 200px;
+ }
+
+ .measurements-card .measurements-content {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ }
+
+ .measurements-card .info-grid {
+ grid-template-columns: 1fr;
+ gap: 15px;
+ }
+
+ /* 健康建议卡片布局优化 */
+ .advice-card {
+ padding: 30px;
+ }
+
+ .advice-card .advice-content {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 25px;
+ margin-bottom: 25px;
+ }
+
+ .advice-card .health-tips {
+ grid-column: 1 / -1;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ gap: 15px;
+ list-style: none;
+ padding: 0;
+ }
+
+ /* 表单区域优化 */
+ .health-form {
+ display: grid;
+ gap: 25px;
+ }
+
+ .form-group {
+ margin-bottom: 0;
+ }
+
+ .submit-btn {
+ margin-top: 20px;
+ padding: 20px 30px;
+ font-size: 1.2rem;
+ }
+}
+
+/* 手机端适配 (最高优先级) */
+@media (max-width: 767px) {
+ .container {
+ padding: 15px;
+ }
+
+ .header {
+ margin-bottom: 20px;
+ padding: 15px 0;
+ }
+
+ .title {
+ font-size: 2rem;
+ }
+
+ .subtitle {
+ font-size: 1rem;
+ }
+
+ .form-section {
+ padding: 20px;
+ border-radius: 16px;
+ }
+
+ .form-input,
+ .form-select {
+ padding: 12px 16px;
+ font-size: 16px; /* 防止iOS缩放 */
+ }
+
+ .submit-btn {
+ padding: 16px 24px;
+ font-size: 1rem;
+ }
+
+ .result-header {
+ flex-direction: column;
+ align-items: stretch;
+ gap: 15px;
+ }
+
+ .result-title {
+ font-size: 1.6rem;
+ text-align: center;
+ }
+
+ .reset-btn {
+ align-self: center;
+ padding: 12px 24px;
+ }
+
+ .basic-info-card,
+ .bmi-card,
+ .weight-card,
+ .metabolism-card,
+ .body-fat-card,
+ .measurements-card,
+ .advice-card,
+ .disclaimer-card {
+ padding: 20px;
+ border-radius: 12px;
+ }
+
+ .card-title {
+ font-size: 1.2rem;
+ }
+
+ .info-grid {
+ grid-template-columns: 1fr;
+ gap: 12px;
+ }
+
+ .bmi-value {
+ font-size: 2rem;
+ }
+
+ .bmi-category {
+ font-size: 1.1rem;
+ }
+
+ .health-tips li {
+ padding: 10px 12px;
+ font-size: 0.95rem;
+ }
+
+ .error-content {
+ padding: 25px 20px;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/返回接口.json
index 455126d6..934ab11b 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/实用功能/身体健康分析/返回接口.json
@@ -1,93 +1,93 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "basic_info": {
- "height": "176cm",
- "height_desc": "身高",
- "weight": "60kg",
- "weight_desc": "体重",
- "gender": "男性",
- "gender_desc": "性别",
- "age": "24岁",
- "age_desc": "年龄"
- },
- "bmi": {
- "value": 19.37,
- "value_desc": "BMI 值",
- "category": "正常体重",
- "category_desc": "BMI 分类",
- "evaluation": "体重正常,保持良好",
- "evaluation_desc": "BMI 评价",
- "risk": "健康风险较低",
- "risk_desc": "健康风险"
- },
- "weight_assessment": {
- "ideal_weight_range": "57.3-74.3kg",
- "ideal_weight_range_desc": "理想体重范围",
- "standard_weight": "71kg",
- "standard_weight_desc": "标准体重",
- "status": "体重正常",
- "status_desc": "体重状态",
- "adjustment": "保持当前体重",
- "adjustment_desc": "调整建议"
- },
- "metabolism": {
- "bmr": "1601 卡路里/天",
- "bmr_desc": "基础代谢率",
- "tdee": "2561 卡路里/天",
- "tdee_desc": "每日总消耗",
- "recommended_calories": "2561 卡路里/天",
- "recommended_calories_desc": "推荐卡路里摄入",
- "weight_loss_calories": "2061 卡路里/天",
- "weight_loss_calories_desc": "减重卡路里",
- "weight_gain_calories": "2861 卡路里/天",
- "weight_gain_calories_desc": "增重卡路里"
- },
- "body_surface_area": {
- "value": "1.74m²",
- "value_desc": "体表面积",
- "formula": "Du Bois 公式",
- "formula_desc": "计算公式"
- },
- "body_fat": {
- "percentage": "12.6%",
- "percentage_desc": "体脂率",
- "category": "正常",
- "category_desc": "体脂分类",
- "fat_weight": "7.6kg",
- "fat_weight_desc": "脂肪重量",
- "lean_weight": "52.4kg",
- "lean_weight_desc": "瘦体重"
- },
- "health_advice": {
- "daily_water_intake": "2000ml (约 8 杯水),运动时需额外补充 500-1000ml",
- "daily_water_intake_desc": "每日饮水量",
- "exercise_recommendation": "继续保持运动习惯,有氧运动和力量训练相结合效果更佳。年轻人可选择多样化的运动方式,建议每周运动 3-5 次",
- "exercise_recommendation_desc": "运动建议",
- "nutrition_advice": "保持均衡饮食,三大营养素合理搭配,定时定量进餐。年轻人新陈代谢较快,可适当增加能量摄入,男性可适当增加蛋白质摄入",
- "nutrition_advice_desc": "营养建议",
- "health_tips": [
- "保持充足睡眠,成年人建议每天 7-9 小时",
- "定期体检有助于早期发现健康问题",
- "保持良好心态,适当释放压力",
- "年轻人要注意作息规律,合理安排工作与休息",
- "长时间用眼后适当休息,保护视力",
- "培养兴趣爱好,保持积极的生活态度",
- "多饮水,成年人每天 1500-2000ml 为宜"
- ],
- "health_tips_desc": "健康提示"
- },
- "ideal_measurements": {
- "chest": "84cm",
- "chest_desc": "胸围",
- "waist": "74cm",
- "waist_desc": "腰围",
- "hip": "83cm",
- "hip_desc": "臀围",
- "note": "男性理想三围参考标准",
- "note_desc": "说明"
- },
- "disclaimer": "结果基于通用公式和统计数据,仅供参考,不能替代专业医疗建议。如有健康问题,请咨询医生。"
- }
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "basic_info": {
+ "height": "176cm",
+ "height_desc": "身高",
+ "weight": "60kg",
+ "weight_desc": "体重",
+ "gender": "男性",
+ "gender_desc": "性别",
+ "age": "24岁",
+ "age_desc": "年龄"
+ },
+ "bmi": {
+ "value": 19.37,
+ "value_desc": "BMI 值",
+ "category": "正常体重",
+ "category_desc": "BMI 分类",
+ "evaluation": "体重正常,保持良好",
+ "evaluation_desc": "BMI 评价",
+ "risk": "健康风险较低",
+ "risk_desc": "健康风险"
+ },
+ "weight_assessment": {
+ "ideal_weight_range": "57.3-74.3kg",
+ "ideal_weight_range_desc": "理想体重范围",
+ "standard_weight": "71kg",
+ "standard_weight_desc": "标准体重",
+ "status": "体重正常",
+ "status_desc": "体重状态",
+ "adjustment": "保持当前体重",
+ "adjustment_desc": "调整建议"
+ },
+ "metabolism": {
+ "bmr": "1601 卡路里/天",
+ "bmr_desc": "基础代谢率",
+ "tdee": "2561 卡路里/天",
+ "tdee_desc": "每日总消耗",
+ "recommended_calories": "2561 卡路里/天",
+ "recommended_calories_desc": "推荐卡路里摄入",
+ "weight_loss_calories": "2061 卡路里/天",
+ "weight_loss_calories_desc": "减重卡路里",
+ "weight_gain_calories": "2861 卡路里/天",
+ "weight_gain_calories_desc": "增重卡路里"
+ },
+ "body_surface_area": {
+ "value": "1.74m²",
+ "value_desc": "体表面积",
+ "formula": "Du Bois 公式",
+ "formula_desc": "计算公式"
+ },
+ "body_fat": {
+ "percentage": "12.6%",
+ "percentage_desc": "体脂率",
+ "category": "正常",
+ "category_desc": "体脂分类",
+ "fat_weight": "7.6kg",
+ "fat_weight_desc": "脂肪重量",
+ "lean_weight": "52.4kg",
+ "lean_weight_desc": "瘦体重"
+ },
+ "health_advice": {
+ "daily_water_intake": "2000ml (约 8 杯水),运动时需额外补充 500-1000ml",
+ "daily_water_intake_desc": "每日饮水量",
+ "exercise_recommendation": "继续保持运动习惯,有氧运动和力量训练相结合效果更佳。年轻人可选择多样化的运动方式,建议每周运动 3-5 次",
+ "exercise_recommendation_desc": "运动建议",
+ "nutrition_advice": "保持均衡饮食,三大营养素合理搭配,定时定量进餐。年轻人新陈代谢较快,可适当增加能量摄入,男性可适当增加蛋白质摄入",
+ "nutrition_advice_desc": "营养建议",
+ "health_tips": [
+ "保持充足睡眠,成年人建议每天 7-9 小时",
+ "定期体检有助于早期发现健康问题",
+ "保持良好心态,适当释放压力",
+ "年轻人要注意作息规律,合理安排工作与休息",
+ "长时间用眼后适当休息,保护视力",
+ "培养兴趣爱好,保持积极的生活态度",
+ "多饮水,成年人每天 1500-2000ml 为宜"
+ ],
+ "health_tips_desc": "健康提示"
+ },
+ "ideal_measurements": {
+ "chest": "84cm",
+ "chest_desc": "胸围",
+ "waist": "74cm",
+ "waist_desc": "腰围",
+ "hip": "83cm",
+ "hip_desc": "臀围",
+ "note": "男性理想三围参考标准",
+ "note_desc": "说明"
+ },
+ "disclaimer": "结果基于通用公式和统计数据,仅供参考,不能替代专业医疗建议。如有健康问题,请咨询医生。"
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/配色方案/background.css b/InfoGenie-frontend/public/60sapi/实用功能/配色方案/background.css
index 13feaa42..b2138067 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/配色方案/background.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/配色方案/background.css
@@ -1,187 +1,187 @@
-/* 背景样式文件 - 单独管理所有背景相关样式 */
-
-/* 主体背景 */
-body {
- background: linear-gradient(135deg, #f0fff4 0%, #e6fffa 50%, #f0fff4 100%);
- background-attachment: fixed;
- position: relative;
-}
-
-/* 背景装饰元素 */
-body::before {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- radial-gradient(circle at 20% 80%, rgba(104, 211, 145, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 80% 20%, rgba(72, 187, 120, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 40% 40%, rgba(56, 161, 105, 0.05) 0%, transparent 50%);
- pointer-events: none;
- z-index: -1;
-}
-
-/* 容器背景 */
-.container {
- background: rgba(255, 255, 255, 0.1);
- backdrop-filter: blur(10px);
- border-radius: 20px;
- border: 1px solid rgba(255, 255, 255, 0.2);
-}
-
-/* 输入区域背景 */
-.input-section {
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(20px);
- border: 1px solid rgba(104, 211, 145, 0.2);
- position: relative;
- overflow: hidden;
-}
-
-.input-section::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- height: 3px;
- background: linear-gradient(90deg, #48bb78, #68d391, #9ae6b4);
-}
-
-/* 配色方案卡片背景 */
-.palette {
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(15px);
- border: 1px solid rgba(104, 211, 145, 0.15);
- position: relative;
- overflow: hidden;
-}
-
-.palette::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- height: 2px;
- background: linear-gradient(90deg, transparent, #68d391, transparent);
- opacity: 0;
- transition: opacity 0.3s ease;
-}
-
-.palette:hover::before {
- opacity: 1;
-}
-
-/* 颜色信息背景 */
-.color-info {
- background: rgba(255, 255, 255, 0.9);
- backdrop-filter: blur(10px);
- border: 1px solid rgba(104, 211, 145, 0.2);
-}
-
-/* 颜色项背景 */
-.color-item {
- background: rgba(255, 255, 255, 0.8);
- backdrop-filter: blur(5px);
- border: 1px solid rgba(104, 211, 145, 0.15);
- position: relative;
-}
-
-.color-item::after {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background: linear-gradient(45deg, transparent 48%, rgba(104, 211, 145, 0.05) 50%, transparent 52%);
- opacity: 0;
- transition: opacity 0.3s ease;
- pointer-events: none;
-}
-
-.color-item:hover::after {
- opacity: 1;
-}
-
-/* 颜色详情背景 */
-.color-detail {
- background: rgba(104, 211, 145, 0.08);
- border: 1px solid rgba(104, 211, 145, 0.1);
- position: relative;
-}
-
-.color-detail::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, transparent 100%);
- pointer-events: none;
-}
-
-/* 按钮背景 */
-.generate-btn {
- background: linear-gradient(135deg, #48bb78 0%, #68d391 50%, #9ae6b4 100%);
- position: relative;
- overflow: hidden;
-}
-
-.generate-btn::before {
- content: '';
- position: absolute;
- top: 0;
- left: -100%;
- width: 100%;
- height: 100%;
- background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
- transition: left 0.5s ease;
-}
-
-.generate-btn:hover::before {
- left: 100%;
-}
-
-/* 加载动画背景 */
-.loading {
- background: rgba(255, 255, 255, 0.9);
- backdrop-filter: blur(10px);
- border-radius: 12px;
- border: 1px solid rgba(104, 211, 145, 0.2);
-}
-
-/* 响应式背景调整 */
-@media (max-width: 768px) {
- body {
- background: linear-gradient(180deg, #f0fff4 0%, #e6fffa 100%);
- }
-
- .container {
- background: rgba(255, 255, 255, 0.05);
- backdrop-filter: blur(5px);
- }
-
- .input-section,
- .palette,
- .color-info {
- backdrop-filter: blur(10px);
- }
-}
-
-@media (max-width: 480px) {
- body::before {
- background-image:
- radial-gradient(circle at 50% 50%, rgba(104, 211, 145, 0.08) 0%, transparent 70%);
- }
-
- .container {
- background: transparent;
- backdrop-filter: none;
- border: none;
- }
+/* 背景样式文件 - 单独管理所有背景相关样式 */
+
+/* 主体背景 */
+body {
+ background: linear-gradient(135deg, #f0fff4 0%, #e6fffa 50%, #f0fff4 100%);
+ background-attachment: fixed;
+ position: relative;
+}
+
+/* 背景装饰元素 */
+body::before {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(circle at 20% 80%, rgba(104, 211, 145, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(72, 187, 120, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 40% 40%, rgba(56, 161, 105, 0.05) 0%, transparent 50%);
+ pointer-events: none;
+ z-index: -1;
+}
+
+/* 容器背景 */
+.container {
+ background: rgba(255, 255, 255, 0.1);
+ backdrop-filter: blur(10px);
+ border-radius: 20px;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+}
+
+/* 输入区域背景 */
+.input-section {
+ background: rgba(255, 255, 255, 0.95);
+ backdrop-filter: blur(20px);
+ border: 1px solid rgba(104, 211, 145, 0.2);
+ position: relative;
+ overflow: hidden;
+}
+
+.input-section::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 3px;
+ background: linear-gradient(90deg, #48bb78, #68d391, #9ae6b4);
+}
+
+/* 配色方案卡片背景 */
+.palette {
+ background: rgba(255, 255, 255, 0.95);
+ backdrop-filter: blur(15px);
+ border: 1px solid rgba(104, 211, 145, 0.15);
+ position: relative;
+ overflow: hidden;
+}
+
+.palette::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 2px;
+ background: linear-gradient(90deg, transparent, #68d391, transparent);
+ opacity: 0;
+ transition: opacity 0.3s ease;
+}
+
+.palette:hover::before {
+ opacity: 1;
+}
+
+/* 颜色信息背景 */
+.color-info {
+ background: rgba(255, 255, 255, 0.9);
+ backdrop-filter: blur(10px);
+ border: 1px solid rgba(104, 211, 145, 0.2);
+}
+
+/* 颜色项背景 */
+.color-item {
+ background: rgba(255, 255, 255, 0.8);
+ backdrop-filter: blur(5px);
+ border: 1px solid rgba(104, 211, 145, 0.15);
+ position: relative;
+}
+
+.color-item::after {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: linear-gradient(45deg, transparent 48%, rgba(104, 211, 145, 0.05) 50%, transparent 52%);
+ opacity: 0;
+ transition: opacity 0.3s ease;
+ pointer-events: none;
+}
+
+.color-item:hover::after {
+ opacity: 1;
+}
+
+/* 颜色详情背景 */
+.color-detail {
+ background: rgba(104, 211, 145, 0.08);
+ border: 1px solid rgba(104, 211, 145, 0.1);
+ position: relative;
+}
+
+.color-detail::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, transparent 100%);
+ pointer-events: none;
+}
+
+/* 按钮背景 */
+.generate-btn {
+ background: linear-gradient(135deg, #48bb78 0%, #68d391 50%, #9ae6b4 100%);
+ position: relative;
+ overflow: hidden;
+}
+
+.generate-btn::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: -100%;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
+ transition: left 0.5s ease;
+}
+
+.generate-btn:hover::before {
+ left: 100%;
+}
+
+/* 加载动画背景 */
+.loading {
+ background: rgba(255, 255, 255, 0.9);
+ backdrop-filter: blur(10px);
+ border-radius: 12px;
+ border: 1px solid rgba(104, 211, 145, 0.2);
+}
+
+/* 响应式背景调整 */
+@media (max-width: 768px) {
+ body {
+ background: linear-gradient(180deg, #f0fff4 0%, #e6fffa 100%);
+ }
+
+ .container {
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(5px);
+ }
+
+ .input-section,
+ .palette,
+ .color-info {
+ backdrop-filter: blur(10px);
+ }
+}
+
+@media (max-width: 480px) {
+ body::before {
+ background-image:
+ radial-gradient(circle at 50% 50%, rgba(104, 211, 145, 0.08) 0%, transparent 70%);
+ }
+
+ .container {
+ background: transparent;
+ backdrop-filter: none;
+ border: none;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/配色方案/index.html b/InfoGenie-frontend/public/60sapi/实用功能/配色方案/index.html
index 066b2764..f114803d 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/配色方案/index.html
+++ b/InfoGenie-frontend/public/60sapi/实用功能/配色方案/index.html
@@ -1,64 +1,64 @@
-
-
-
-
-
- 配色方案生成器
-
-
-
-
-
-
-
-
+
+
+
+
+
+ 配色方案生成器
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/配色方案/script.js b/InfoGenie-frontend/public/60sapi/实用功能/配色方案/script.js
index 3bf8719f..52c608cd 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/配色方案/script.js
+++ b/InfoGenie-frontend/public/60sapi/实用功能/配色方案/script.js
@@ -1,315 +1,315 @@
-// 配色方案生成器 JavaScript
-class ColorPaletteGenerator {
- constructor() {
- this.apiUrl = 'https://60s.api.shumengya.top/v2/color/palette';
- this.init();
- }
-
- init() {
- this.bindEvents();
- this.loadDefaultPalette();
- }
-
- bindEvents() {
- const colorInput = document.getElementById('colorInput');
- const colorPicker = document.getElementById('colorPicker');
- const generateBtn = document.getElementById('generateBtn');
- const formatSelect = document.getElementById('formatSelect');
-
- // 颜色输入框事件
- colorInput.addEventListener('input', (e) => {
- const color = e.target.value;
- if (this.isValidColor(color)) {
- colorPicker.value = color;
- }
- });
-
- // 颜色选择器事件
- colorPicker.addEventListener('change', (e) => {
- colorInput.value = e.target.value;
- });
-
- // 生成按钮事件
- generateBtn.addEventListener('click', () => {
- this.generatePalette();
- });
-
- // 回车键生成
- colorInput.addEventListener('keypress', (e) => {
- if (e.key === 'Enter') {
- this.generatePalette();
- }
- });
-
- // 格式选择事件
- formatSelect.addEventListener('change', () => {
- const currentColor = colorInput.value;
- if (currentColor && this.isValidColor(currentColor)) {
- this.generatePalette();
- }
- });
- }
-
- // 验证颜色格式
- isValidColor(color) {
- const hexRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;
- return hexRegex.test(color);
- }
-
- // 显示加载状态
- showLoading() {
- const loading = document.getElementById('loading');
- const colorInfo = document.getElementById('colorInfo');
- const palettesContainer = document.getElementById('palettesContainer');
-
- loading.style.display = 'block';
- colorInfo.style.display = 'none';
- palettesContainer.innerHTML = '';
- }
-
- // 隐藏加载状态
- hideLoading() {
- const loading = document.getElementById('loading');
- loading.style.display = 'none';
- }
-
- // 生成配色方案
- async generatePalette() {
- const colorInput = document.getElementById('colorInput');
- const formatSelect = document.getElementById('formatSelect');
- const color = colorInput.value.trim();
- const format = formatSelect.value;
-
- if (!color) {
- this.showError('请输入颜色值');
- return;
- }
-
- if (!this.isValidColor(color)) {
- this.showError('请输入有效的十六进制颜色值(如:#33AAFF)');
- return;
- }
-
- this.showLoading();
-
- try {
- const url = new URL(this.apiUrl);
- url.searchParams.append('color', color);
- url.searchParams.append('encoding', format);
-
- const response = await fetch(url);
-
- if (!response.ok) {
- throw new Error(`HTTP error! status: ${response.status}`);
- }
-
- const data = await response.json();
-
- if (data.code === 200) {
- this.displayResults(data.data);
- } else {
- throw new Error(data.message || '获取配色方案失败');
- }
- } catch (error) {
- console.error('Error:', error);
- this.showError('获取配色方案失败,请检查网络连接或稍后重试');
- } finally {
- this.hideLoading();
- }
- }
-
- // 显示错误信息
- showError(message) {
- const palettesContainer = document.getElementById('palettesContainer');
- palettesContainer.innerHTML = `
-
- `;
- }
-
- // 显示结果
- displayResults(data) {
- this.displayColorInfo(data.input);
- this.displayPalettes(data.palettes);
- }
-
- // 显示颜色信息
- displayColorInfo(inputData) {
- const colorInfo = document.getElementById('colorInfo');
- const colorPreview = document.getElementById('colorPreview');
- const colorDetails = document.getElementById('colorDetails');
-
- colorPreview.style.backgroundColor = inputData.hex;
-
- colorDetails.innerHTML = `
-
- HEX
- ${inputData.hex}
-
-
- RGB
- rgb(${inputData.rgb.r}, ${inputData.rgb.g}, ${inputData.rgb.b})
-
-
- HSL
- hsl(${inputData.hsl.h}°, ${inputData.hsl.s}%, ${inputData.hsl.l}%)
-
-
- 色系
- ${inputData.name}
-
- `;
-
- colorInfo.style.display = 'block';
- }
-
- // 显示配色方案
- displayPalettes(palettes) {
- const palettesContainer = document.getElementById('palettesContainer');
-
- palettesContainer.innerHTML = palettes.map(palette => `
-
-
-
- ${palette.colors.map(color => `
-
-
-
-
${color.name}
-
${color.hex}
-
${color.role} • ${color.theory}
-
- `).join('')}
-
-
- `).join('');
- }
-
- // 加载默认配色方案
- async loadDefaultPalette() {
- const colorInput = document.getElementById('colorInput');
- const defaultColor = colorInput.value;
-
- if (defaultColor && this.isValidColor(defaultColor)) {
- await this.generatePalette();
- }
- }
-}
-
-// 复制到剪贴板功能
-function copyToClipboard(text) {
- if (navigator.clipboard && window.isSecureContext) {
- navigator.clipboard.writeText(text).then(() => {
- showToast(`已复制 ${text} 到剪贴板`);
- }).catch(err => {
- console.error('复制失败:', err);
- fallbackCopyTextToClipboard(text);
- });
- } else {
- fallbackCopyTextToClipboard(text);
- }
-}
-
-// 备用复制方法
-function fallbackCopyTextToClipboard(text) {
- const textArea = document.createElement('textarea');
- textArea.value = text;
- textArea.style.position = 'fixed';
- textArea.style.left = '-999999px';
- textArea.style.top = '-999999px';
- document.body.appendChild(textArea);
- textArea.focus();
- textArea.select();
-
- try {
- document.execCommand('copy');
- showToast(`已复制 ${text} 到剪贴板`);
- } catch (err) {
- console.error('复制失败:', err);
- showToast('复制失败,请手动复制');
- }
-
- document.body.removeChild(textArea);
-}
-
-// 显示提示信息
-function showToast(message) {
- // 移除已存在的toast
- const existingToast = document.querySelector('.toast');
- if (existingToast) {
- existingToast.remove();
- }
-
- const toast = document.createElement('div');
- toast.className = 'toast';
- toast.textContent = message;
- toast.style.cssText = `
- position: fixed;
- top: 20px;
- right: 20px;
- background: rgba(45, 90, 39, 0.95);
- color: white;
- padding: 12px 20px;
- border-radius: 8px;
- font-size: 14px;
- font-weight: 500;
- z-index: 10000;
- box-shadow: 0 4px 12px rgba(45, 90, 39, 0.3);
- transform: translateX(100%);
- transition: transform 0.3s ease;
- backdrop-filter: blur(10px);
- `;
-
- document.body.appendChild(toast);
-
- // 动画显示
- setTimeout(() => {
- toast.style.transform = 'translateX(0)';
- }, 100);
-
- // 3秒后隐藏
- setTimeout(() => {
- toast.style.transform = 'translateX(100%)';
- setTimeout(() => {
- if (toast.parentNode) {
- toast.parentNode.removeChild(toast);
- }
- }, 300);
- }, 3000);
-}
-
-// 页面加载完成后初始化
-document.addEventListener('DOMContentLoaded', () => {
- new ColorPaletteGenerator();
-});
-
-// 添加移动端优化
-if ('ontouchstart' in window) {
- // 移动端触摸优化
- document.addEventListener('touchstart', function() {}, {passive: true});
-
- // 防止双击缩放
- let lastTouchEnd = 0;
- document.addEventListener('touchend', function (event) {
- const now = (new Date()).getTime();
- if (now - lastTouchEnd <= 300) {
- event.preventDefault();
- }
- lastTouchEnd = now;
- }, false);
+// 配色方案生成器 JavaScript
+class ColorPaletteGenerator {
+ constructor() {
+ this.apiUrl = 'https://60s.api.shumengya.top/v2/color/palette';
+ this.init();
+ }
+
+ init() {
+ this.bindEvents();
+ this.loadDefaultPalette();
+ }
+
+ bindEvents() {
+ const colorInput = document.getElementById('colorInput');
+ const colorPicker = document.getElementById('colorPicker');
+ const generateBtn = document.getElementById('generateBtn');
+ const formatSelect = document.getElementById('formatSelect');
+
+ // 颜色输入框事件
+ colorInput.addEventListener('input', (e) => {
+ const color = e.target.value;
+ if (this.isValidColor(color)) {
+ colorPicker.value = color;
+ }
+ });
+
+ // 颜色选择器事件
+ colorPicker.addEventListener('change', (e) => {
+ colorInput.value = e.target.value;
+ });
+
+ // 生成按钮事件
+ generateBtn.addEventListener('click', () => {
+ this.generatePalette();
+ });
+
+ // 回车键生成
+ colorInput.addEventListener('keypress', (e) => {
+ if (e.key === 'Enter') {
+ this.generatePalette();
+ }
+ });
+
+ // 格式选择事件
+ formatSelect.addEventListener('change', () => {
+ const currentColor = colorInput.value;
+ if (currentColor && this.isValidColor(currentColor)) {
+ this.generatePalette();
+ }
+ });
+ }
+
+ // 验证颜色格式
+ isValidColor(color) {
+ const hexRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;
+ return hexRegex.test(color);
+ }
+
+ // 显示加载状态
+ showLoading() {
+ const loading = document.getElementById('loading');
+ const colorInfo = document.getElementById('colorInfo');
+ const palettesContainer = document.getElementById('palettesContainer');
+
+ loading.style.display = 'block';
+ colorInfo.style.display = 'none';
+ palettesContainer.innerHTML = '';
+ }
+
+ // 隐藏加载状态
+ hideLoading() {
+ const loading = document.getElementById('loading');
+ loading.style.display = 'none';
+ }
+
+ // 生成配色方案
+ async generatePalette() {
+ const colorInput = document.getElementById('colorInput');
+ const formatSelect = document.getElementById('formatSelect');
+ const color = colorInput.value.trim();
+ const format = formatSelect.value;
+
+ if (!color) {
+ this.showError('请输入颜色值');
+ return;
+ }
+
+ if (!this.isValidColor(color)) {
+ this.showError('请输入有效的十六进制颜色值(如:#33AAFF)');
+ return;
+ }
+
+ this.showLoading();
+
+ try {
+ const url = new URL(this.apiUrl);
+ url.searchParams.append('color', color);
+ url.searchParams.append('encoding', format);
+
+ const response = await fetch(url);
+
+ if (!response.ok) {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+
+ const data = await response.json();
+
+ if (data.code === 200) {
+ this.displayResults(data.data);
+ } else {
+ throw new Error(data.message || '获取配色方案失败');
+ }
+ } catch (error) {
+ console.error('Error:', error);
+ this.showError('获取配色方案失败,请检查网络连接或稍后重试');
+ } finally {
+ this.hideLoading();
+ }
+ }
+
+ // 显示错误信息
+ showError(message) {
+ const palettesContainer = document.getElementById('palettesContainer');
+ palettesContainer.innerHTML = `
+
+ `;
+ }
+
+ // 显示结果
+ displayResults(data) {
+ this.displayColorInfo(data.input);
+ this.displayPalettes(data.palettes);
+ }
+
+ // 显示颜色信息
+ displayColorInfo(inputData) {
+ const colorInfo = document.getElementById('colorInfo');
+ const colorPreview = document.getElementById('colorPreview');
+ const colorDetails = document.getElementById('colorDetails');
+
+ colorPreview.style.backgroundColor = inputData.hex;
+
+ colorDetails.innerHTML = `
+
+ HEX
+ ${inputData.hex}
+
+
+ RGB
+ rgb(${inputData.rgb.r}, ${inputData.rgb.g}, ${inputData.rgb.b})
+
+
+ HSL
+ hsl(${inputData.hsl.h}°, ${inputData.hsl.s}%, ${inputData.hsl.l}%)
+
+
+ 色系
+ ${inputData.name}
+
+ `;
+
+ colorInfo.style.display = 'block';
+ }
+
+ // 显示配色方案
+ displayPalettes(palettes) {
+ const palettesContainer = document.getElementById('palettesContainer');
+
+ palettesContainer.innerHTML = palettes.map(palette => `
+
+
+
+ ${palette.colors.map(color => `
+
+
+
+
${color.name}
+
${color.hex}
+
${color.role} • ${color.theory}
+
+ `).join('')}
+
+
+ `).join('');
+ }
+
+ // 加载默认配色方案
+ async loadDefaultPalette() {
+ const colorInput = document.getElementById('colorInput');
+ const defaultColor = colorInput.value;
+
+ if (defaultColor && this.isValidColor(defaultColor)) {
+ await this.generatePalette();
+ }
+ }
+}
+
+// 复制到剪贴板功能
+function copyToClipboard(text) {
+ if (navigator.clipboard && window.isSecureContext) {
+ navigator.clipboard.writeText(text).then(() => {
+ showToast(`已复制 ${text} 到剪贴板`);
+ }).catch(err => {
+ console.error('复制失败:', err);
+ fallbackCopyTextToClipboard(text);
+ });
+ } else {
+ fallbackCopyTextToClipboard(text);
+ }
+}
+
+// 备用复制方法
+function fallbackCopyTextToClipboard(text) {
+ const textArea = document.createElement('textarea');
+ textArea.value = text;
+ textArea.style.position = 'fixed';
+ textArea.style.left = '-999999px';
+ textArea.style.top = '-999999px';
+ document.body.appendChild(textArea);
+ textArea.focus();
+ textArea.select();
+
+ try {
+ document.execCommand('copy');
+ showToast(`已复制 ${text} 到剪贴板`);
+ } catch (err) {
+ console.error('复制失败:', err);
+ showToast('复制失败,请手动复制');
+ }
+
+ document.body.removeChild(textArea);
+}
+
+// 显示提示信息
+function showToast(message) {
+ // 移除已存在的toast
+ const existingToast = document.querySelector('.toast');
+ if (existingToast) {
+ existingToast.remove();
+ }
+
+ const toast = document.createElement('div');
+ toast.className = 'toast';
+ toast.textContent = message;
+ toast.style.cssText = `
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ background: rgba(45, 90, 39, 0.95);
+ color: white;
+ padding: 12px 20px;
+ border-radius: 8px;
+ font-size: 14px;
+ font-weight: 500;
+ z-index: 10000;
+ box-shadow: 0 4px 12px rgba(45, 90, 39, 0.3);
+ transform: translateX(100%);
+ transition: transform 0.3s ease;
+ backdrop-filter: blur(10px);
+ `;
+
+ document.body.appendChild(toast);
+
+ // 动画显示
+ setTimeout(() => {
+ toast.style.transform = 'translateX(0)';
+ }, 100);
+
+ // 3秒后隐藏
+ setTimeout(() => {
+ toast.style.transform = 'translateX(100%)';
+ setTimeout(() => {
+ if (toast.parentNode) {
+ toast.parentNode.removeChild(toast);
+ }
+ }, 300);
+ }, 3000);
+}
+
+// 页面加载完成后初始化
+document.addEventListener('DOMContentLoaded', () => {
+ new ColorPaletteGenerator();
+});
+
+// 添加移动端优化
+if ('ontouchstart' in window) {
+ // 移动端触摸优化
+ document.addEventListener('touchstart', function() {}, {passive: true});
+
+ // 防止双击缩放
+ let lastTouchEnd = 0;
+ document.addEventListener('touchend', function (event) {
+ const now = (new Date()).getTime();
+ if (now - lastTouchEnd <= 300) {
+ event.preventDefault();
+ }
+ lastTouchEnd = now;
+ }, false);
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/配色方案/styles.css b/InfoGenie-frontend/public/60sapi/实用功能/配色方案/styles.css
index 68225012..f4dd9b67 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/配色方案/styles.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/配色方案/styles.css
@@ -1,422 +1,422 @@
-/* 基础样式重置 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
- line-height: 1.6;
- color: #2d3748;
- min-height: 100vh;
-}
-
-.container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 20px;
- min-height: 100vh;
- display: flex;
- flex-direction: column;
-}
-
-/* 头部样式 */
-.header {
- text-align: center;
- margin-bottom: 40px;
- padding: 30px 0;
-}
-
-.header h1 {
- font-size: 2.5rem;
- color: #2d5a27;
- margin-bottom: 10px;
- font-weight: 700;
-}
-
-.subtitle {
- font-size: 1.1rem;
- color: #68d391;
- font-weight: 400;
-}
-
-/* 主内容区域 */
-.main-content {
- flex: 1;
- display: flex;
- flex-direction: column;
- gap: 30px;
-}
-
-/* 输入区域 */
-.input-section {
- background: rgba(255, 255, 255, 0.9);
- padding: 30px;
- border-radius: 16px;
- box-shadow: 0 4px 20px rgba(45, 90, 39, 0.1);
- border: 1px solid rgba(104, 211, 145, 0.2);
-}
-
-.color-input-group {
- margin-bottom: 20px;
-}
-
-.color-input-group label,
-.format-select label {
- display: block;
- margin-bottom: 8px;
- font-weight: 600;
- color: #2d5a27;
- font-size: 0.95rem;
-}
-
-.input-wrapper {
- display: flex;
- gap: 10px;
- align-items: center;
-}
-
-#colorInput {
- flex: 1;
- padding: 12px 16px;
- border: 2px solid #e2e8f0;
- border-radius: 8px;
- font-size: 1rem;
- transition: all 0.3s ease;
- background: white;
-}
-
-#colorInput:focus {
- outline: none;
- border-color: #68d391;
- box-shadow: 0 0 0 3px rgba(104, 211, 145, 0.1);
-}
-
-#colorPicker {
- width: 50px;
- height: 44px;
- border: 2px solid #e2e8f0;
- border-radius: 8px;
- cursor: pointer;
- background: none;
-}
-
-.format-select {
- margin-bottom: 25px;
-}
-
-#formatSelect {
- width: 100%;
- padding: 12px 16px;
- border: 2px solid #e2e8f0;
- border-radius: 8px;
- font-size: 1rem;
- background: white;
- cursor: pointer;
- transition: all 0.3s ease;
-}
-
-#formatSelect:focus {
- outline: none;
- border-color: #68d391;
- box-shadow: 0 0 0 3px rgba(104, 211, 145, 0.1);
-}
-
-.generate-btn {
- width: 100%;
- padding: 14px 24px;
- background: linear-gradient(135deg, #48bb78, #68d391);
- color: white;
- border: none;
- border-radius: 8px;
- font-size: 1.1rem;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.3s ease;
- box-shadow: 0 4px 12px rgba(72, 187, 120, 0.3);
-}
-
-.generate-btn:hover {
- background: linear-gradient(135deg, #38a169, #48bb78);
- transform: translateY(-2px);
- box-shadow: 0 6px 20px rgba(72, 187, 120, 0.4);
-}
-
-.generate-btn:active {
- transform: translateY(0);
-}
-
-/* 结果区域 */
-.result-section {
- min-height: 200px;
-}
-
-.loading {
- text-align: center;
- padding: 40px;
-}
-
-.spinner {
- width: 40px;
- height: 40px;
- border: 4px solid #e2e8f0;
- border-top: 4px solid #68d391;
- border-radius: 50%;
- animation: spin 1s linear infinite;
- margin: 0 auto 20px;
-}
-
-@keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-.loading p {
- color: #68d391;
- font-weight: 500;
-}
-
-/* 颜色信息 */
-.color-info {
- background: rgba(255, 255, 255, 0.9);
- padding: 25px;
- border-radius: 12px;
- margin-bottom: 25px;
- box-shadow: 0 2px 10px rgba(45, 90, 39, 0.1);
- border: 1px solid rgba(104, 211, 145, 0.2);
-}
-
-.color-info h3 {
- color: #2d5a27;
- margin-bottom: 15px;
- font-size: 1.3rem;
-}
-
-.color-preview {
- width: 100%;
- height: 60px;
- border-radius: 8px;
- margin-bottom: 15px;
- border: 2px solid rgba(104, 211, 145, 0.3);
-}
-
-.color-details {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
- gap: 15px;
-}
-
-.color-detail {
- text-align: center;
- padding: 10px;
- background: rgba(104, 211, 145, 0.1);
- border-radius: 6px;
-}
-
-.color-detail strong {
- display: block;
- color: #2d5a27;
- font-size: 0.9rem;
- margin-bottom: 5px;
-}
-
-.color-detail span {
- color: #4a5568;
- font-size: 0.95rem;
-}
-
-/* 配色方案容器 */
-.palettes-container {
- display: grid;
- gap: 25px;
-}
-
-.palette {
- background: rgba(255, 255, 255, 0.9);
- border-radius: 12px;
- padding: 25px;
- box-shadow: 0 4px 15px rgba(45, 90, 39, 0.1);
- border: 1px solid rgba(104, 211, 145, 0.2);
- transition: transform 0.3s ease, box-shadow 0.3s ease;
-}
-
-.palette:hover {
- transform: translateY(-3px);
- box-shadow: 0 8px 25px rgba(45, 90, 39, 0.15);
-}
-
-.palette-header {
- margin-bottom: 20px;
-}
-
-.palette-name {
- font-size: 1.4rem;
- color: #2d5a27;
- margin-bottom: 8px;
- font-weight: 600;
-}
-
-.palette-description {
- color: #68d391;
- font-size: 0.95rem;
- line-height: 1.5;
-}
-
-.colors-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 15px;
-}
-
-.color-item {
- background: white;
- border-radius: 8px;
- padding: 15px;
- border: 1px solid rgba(104, 211, 145, 0.2);
- transition: all 0.3s ease;
-}
-
-.color-item:hover {
- transform: translateY(-2px);
- box-shadow: 0 4px 12px rgba(45, 90, 39, 0.1);
-}
-
-.color-swatch {
- width: 100%;
- height: 50px;
- border-radius: 6px;
- margin-bottom: 10px;
- border: 1px solid rgba(0, 0, 0, 0.1);
- cursor: pointer;
- position: relative;
- overflow: hidden;
-}
-
-.color-swatch::after {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background: linear-gradient(45deg, transparent 45%, rgba(255,255,255,0.1) 50%, transparent 55%);
- opacity: 0;
- transition: opacity 0.3s ease;
-}
-
-.color-swatch:hover::after {
- opacity: 1;
-}
-
-.color-name {
- font-weight: 600;
- color: #2d5a27;
- margin-bottom: 5px;
- font-size: 0.9rem;
-}
-
-.color-hex {
- font-family: 'Courier New', monospace;
- color: #4a5568;
- font-size: 0.85rem;
- margin-bottom: 3px;
-}
-
-.color-role {
- font-size: 0.8rem;
- color: #68d391;
- font-style: italic;
-}
-
-/* 底部 */
-.footer {
- text-align: center;
- padding: 30px 0;
- margin-top: 40px;
- color: #68d391;
- font-size: 0.9rem;
-}
-
-/* 平板端适配 */
-@media (max-width: 1024px) {
- .container {
- padding: 15px;
- }
-
- .header h1 {
- font-size: 2.2rem;
- }
-
- .colors-grid {
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
- }
-}
-
-/* 手机端适配 */
-@media (max-width: 768px) {
- .container {
- padding: 10px;
- }
-
- .header {
- margin-bottom: 25px;
- padding: 20px 0;
- }
-
- .header h1 {
- font-size: 1.8rem;
- }
-
- .subtitle {
- font-size: 1rem;
- }
-
- .input-section {
- padding: 20px;
- }
-
- .input-wrapper {
- flex-direction: column;
- align-items: stretch;
- }
-
- #colorPicker {
- width: 100%;
- height: 44px;
- }
-
- .colors-grid {
- grid-template-columns: 1fr;
- }
-
- .color-details {
- grid-template-columns: repeat(2, 1fr);
- }
-
- .palette {
- padding: 20px;
- }
-
- .palette-name {
- font-size: 1.2rem;
- }
-}
-
-@media (max-width: 480px) {
- .header h1 {
- font-size: 1.6rem;
- }
-
- .input-section {
- padding: 15px;
- }
-
- .palette {
- padding: 15px;
- }
-
- .color-details {
- grid-template-columns: 1fr;
- }
+/* 基础样式重置 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
+ line-height: 1.6;
+ color: #2d3748;
+ min-height: 100vh;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+}
+
+/* 头部样式 */
+.header {
+ text-align: center;
+ margin-bottom: 40px;
+ padding: 30px 0;
+}
+
+.header h1 {
+ font-size: 2.5rem;
+ color: #2d5a27;
+ margin-bottom: 10px;
+ font-weight: 700;
+}
+
+.subtitle {
+ font-size: 1.1rem;
+ color: #68d391;
+ font-weight: 400;
+}
+
+/* 主内容区域 */
+.main-content {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 30px;
+}
+
+/* 输入区域 */
+.input-section {
+ background: rgba(255, 255, 255, 0.9);
+ padding: 30px;
+ border-radius: 16px;
+ box-shadow: 0 4px 20px rgba(45, 90, 39, 0.1);
+ border: 1px solid rgba(104, 211, 145, 0.2);
+}
+
+.color-input-group {
+ margin-bottom: 20px;
+}
+
+.color-input-group label,
+.format-select label {
+ display: block;
+ margin-bottom: 8px;
+ font-weight: 600;
+ color: #2d5a27;
+ font-size: 0.95rem;
+}
+
+.input-wrapper {
+ display: flex;
+ gap: 10px;
+ align-items: center;
+}
+
+#colorInput {
+ flex: 1;
+ padding: 12px 16px;
+ border: 2px solid #e2e8f0;
+ border-radius: 8px;
+ font-size: 1rem;
+ transition: all 0.3s ease;
+ background: white;
+}
+
+#colorInput:focus {
+ outline: none;
+ border-color: #68d391;
+ box-shadow: 0 0 0 3px rgba(104, 211, 145, 0.1);
+}
+
+#colorPicker {
+ width: 50px;
+ height: 44px;
+ border: 2px solid #e2e8f0;
+ border-radius: 8px;
+ cursor: pointer;
+ background: none;
+}
+
+.format-select {
+ margin-bottom: 25px;
+}
+
+#formatSelect {
+ width: 100%;
+ padding: 12px 16px;
+ border: 2px solid #e2e8f0;
+ border-radius: 8px;
+ font-size: 1rem;
+ background: white;
+ cursor: pointer;
+ transition: all 0.3s ease;
+}
+
+#formatSelect:focus {
+ outline: none;
+ border-color: #68d391;
+ box-shadow: 0 0 0 3px rgba(104, 211, 145, 0.1);
+}
+
+.generate-btn {
+ width: 100%;
+ padding: 14px 24px;
+ background: linear-gradient(135deg, #48bb78, #68d391);
+ color: white;
+ border: none;
+ border-radius: 8px;
+ font-size: 1.1rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ box-shadow: 0 4px 12px rgba(72, 187, 120, 0.3);
+}
+
+.generate-btn:hover {
+ background: linear-gradient(135deg, #38a169, #48bb78);
+ transform: translateY(-2px);
+ box-shadow: 0 6px 20px rgba(72, 187, 120, 0.4);
+}
+
+.generate-btn:active {
+ transform: translateY(0);
+}
+
+/* 结果区域 */
+.result-section {
+ min-height: 200px;
+}
+
+.loading {
+ text-align: center;
+ padding: 40px;
+}
+
+.spinner {
+ width: 40px;
+ height: 40px;
+ border: 4px solid #e2e8f0;
+ border-top: 4px solid #68d391;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ margin: 0 auto 20px;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+.loading p {
+ color: #68d391;
+ font-weight: 500;
+}
+
+/* 颜色信息 */
+.color-info {
+ background: rgba(255, 255, 255, 0.9);
+ padding: 25px;
+ border-radius: 12px;
+ margin-bottom: 25px;
+ box-shadow: 0 2px 10px rgba(45, 90, 39, 0.1);
+ border: 1px solid rgba(104, 211, 145, 0.2);
+}
+
+.color-info h3 {
+ color: #2d5a27;
+ margin-bottom: 15px;
+ font-size: 1.3rem;
+}
+
+.color-preview {
+ width: 100%;
+ height: 60px;
+ border-radius: 8px;
+ margin-bottom: 15px;
+ border: 2px solid rgba(104, 211, 145, 0.3);
+}
+
+.color-details {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
+ gap: 15px;
+}
+
+.color-detail {
+ text-align: center;
+ padding: 10px;
+ background: rgba(104, 211, 145, 0.1);
+ border-radius: 6px;
+}
+
+.color-detail strong {
+ display: block;
+ color: #2d5a27;
+ font-size: 0.9rem;
+ margin-bottom: 5px;
+}
+
+.color-detail span {
+ color: #4a5568;
+ font-size: 0.95rem;
+}
+
+/* 配色方案容器 */
+.palettes-container {
+ display: grid;
+ gap: 25px;
+}
+
+.palette {
+ background: rgba(255, 255, 255, 0.9);
+ border-radius: 12px;
+ padding: 25px;
+ box-shadow: 0 4px 15px rgba(45, 90, 39, 0.1);
+ border: 1px solid rgba(104, 211, 145, 0.2);
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
+}
+
+.palette:hover {
+ transform: translateY(-3px);
+ box-shadow: 0 8px 25px rgba(45, 90, 39, 0.15);
+}
+
+.palette-header {
+ margin-bottom: 20px;
+}
+
+.palette-name {
+ font-size: 1.4rem;
+ color: #2d5a27;
+ margin-bottom: 8px;
+ font-weight: 600;
+}
+
+.palette-description {
+ color: #68d391;
+ font-size: 0.95rem;
+ line-height: 1.5;
+}
+
+.colors-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: 15px;
+}
+
+.color-item {
+ background: white;
+ border-radius: 8px;
+ padding: 15px;
+ border: 1px solid rgba(104, 211, 145, 0.2);
+ transition: all 0.3s ease;
+}
+
+.color-item:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 4px 12px rgba(45, 90, 39, 0.1);
+}
+
+.color-swatch {
+ width: 100%;
+ height: 50px;
+ border-radius: 6px;
+ margin-bottom: 10px;
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ cursor: pointer;
+ position: relative;
+ overflow: hidden;
+}
+
+.color-swatch::after {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: linear-gradient(45deg, transparent 45%, rgba(255,255,255,0.1) 50%, transparent 55%);
+ opacity: 0;
+ transition: opacity 0.3s ease;
+}
+
+.color-swatch:hover::after {
+ opacity: 1;
+}
+
+.color-name {
+ font-weight: 600;
+ color: #2d5a27;
+ margin-bottom: 5px;
+ font-size: 0.9rem;
+}
+
+.color-hex {
+ font-family: 'Courier New', monospace;
+ color: #4a5568;
+ font-size: 0.85rem;
+ margin-bottom: 3px;
+}
+
+.color-role {
+ font-size: 0.8rem;
+ color: #68d391;
+ font-style: italic;
+}
+
+/* 底部 */
+.footer {
+ text-align: center;
+ padding: 30px 0;
+ margin-top: 40px;
+ color: #68d391;
+ font-size: 0.9rem;
+}
+
+/* 平板端适配 */
+@media (max-width: 1024px) {
+ .container {
+ padding: 15px;
+ }
+
+ .header h1 {
+ font-size: 2.2rem;
+ }
+
+ .colors-grid {
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
+ }
+}
+
+/* 手机端适配 */
+@media (max-width: 768px) {
+ .container {
+ padding: 10px;
+ }
+
+ .header {
+ margin-bottom: 25px;
+ padding: 20px 0;
+ }
+
+ .header h1 {
+ font-size: 1.8rem;
+ }
+
+ .subtitle {
+ font-size: 1rem;
+ }
+
+ .input-section {
+ padding: 20px;
+ }
+
+ .input-wrapper {
+ flex-direction: column;
+ align-items: stretch;
+ }
+
+ #colorPicker {
+ width: 100%;
+ height: 44px;
+ }
+
+ .colors-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .color-details {
+ grid-template-columns: repeat(2, 1fr);
+ }
+
+ .palette {
+ padding: 20px;
+ }
+
+ .palette-name {
+ font-size: 1.2rem;
+ }
+}
+
+@media (max-width: 480px) {
+ .header h1 {
+ font-size: 1.6rem;
+ }
+
+ .input-section {
+ padding: 15px;
+ }
+
+ .palette {
+ padding: 15px;
+ }
+
+ .color-details {
+ grid-template-columns: 1fr;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/配色方案/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/配色方案/返回接口.json
index 6f353332..39f73207 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/配色方案/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/实用功能/配色方案/返回接口.json
@@ -1,273 +1,273 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "input": {
- "hex": "#DE4F99",
- "rgb": {
- "r": 222,
- "g": 79,
- "b": 153
- },
- "hsl": {
- "h": 329,
- "s": 68,
- "l": 59
- },
- "name": "红色系"
- },
- "palettes": [
- {
- "name": "单色配色",
- "description": "基于同一色相,通过调整明度和饱和度创建的和谐配色方案,适合营造统一、专业的视觉效果",
- "colors": [
- {
- "hex": "#DE4F99",
- "name": "主色",
- "role": "primary",
- "theory": "基础色相"
- },
- {
- "hex": "#7C184C",
- "name": "深色变体",
- "role": "dark",
- "theory": "降低明度"
- },
- {
- "hex": "#EEA5CB",
- "name": "浅色变体",
- "role": "light",
- "theory": "提高明度"
- },
- {
- "hex": "#C96498",
- "name": "柔和变体",
- "role": "muted",
- "theory": "降低饱和度"
- },
- {
- "hex": "#ED4099",
- "name": "鲜艳变体",
- "role": "vibrant",
- "theory": "提高饱和度"
- }
- ]
- },
- {
- "name": "互补配色",
- "description": "使用色轮上相对的颜色,创造强烈对比和视觉冲击力,适用于需要突出重点的设计",
- "colors": [
- {
- "hex": "#DE4F99",
- "name": "主色",
- "role": "primary",
- "theory": "基础色相"
- },
- {
- "hex": "#4FDE94",
- "name": "互补色",
- "role": "complementary",
- "theory": "色轮对面 +180°"
- },
- {
- "hex": "#F2BAD7",
- "name": "主色浅调",
- "role": "primary-light",
- "theory": "主色提高明度"
- },
- {
- "hex": "#BAF2D5",
- "name": "互补色浅调",
- "role": "complementary-light",
- "theory": "互补色提高明度"
- }
- ]
- },
- {
- "name": "邻近配色",
- "description": "使用色轮上相邻的颜色,创造自然和谐的渐变效果,常见于自然景观中",
- "colors": [
- {
- "hex": "#DB4FDE",
- "name": "邻近色1",
- "role": "analogous-1",
- "theory": "色相 -30°"
- },
- {
- "hex": "#DE4F99",
- "name": "主色",
- "role": "primary",
- "theory": "基础色相"
- },
- {
- "hex": "#DE4F52",
- "name": "邻近色2",
- "role": "analogous-2",
- "theory": "色相 +30°"
- },
- {
- "hex": "#DE944F",
- "name": "邻近色3",
- "role": "analogous-3",
- "theory": "色相 +60°"
- }
- ]
- },
- {
- "name": "三角配色",
- "description": "在色轮上形成等边三角形的三种颜色,提供丰富对比的同时保持和谐平衡",
- "colors": [
- {
- "hex": "#DE4F99",
- "name": "主色",
- "role": "primary",
- "theory": "基础色相"
- },
- {
- "hex": "#99DE4F",
- "name": "三角色1",
- "role": "triadic-1",
- "theory": "色相 +120°"
- },
- {
- "hex": "#4F99DE",
- "name": "三角色2",
- "role": "triadic-2",
- "theory": "色相 +240°"
- }
- ]
- },
- {
- "name": "分裂互补配色",
- "description": "使用互补色两侧的颜色,比纯互补配色更柔和,同时保持强烈的视觉对比",
- "colors": [
- {
- "hex": "#DE4F99",
- "name": "主色",
- "role": "primary",
- "theory": "基础色相"
- },
- {
- "hex": "#52DE4F",
- "name": "分裂互补色1",
- "role": "split-comp-1",
- "theory": "互补色 -30°"
- },
- {
- "hex": "#4FDEDB",
- "name": "分裂互补色2",
- "role": "split-comp-2",
- "theory": "互补色 +30°"
- }
- ]
- },
- {
- "name": "四边形配色",
- "description": "在色轮上形成正方形的四种颜色,提供最丰富的颜色变化,适合复杂的设计项目",
- "colors": [
- {
- "hex": "#DE4F99",
- "name": "主色",
- "role": "primary",
- "theory": "基础色相"
- },
- {
- "hex": "#DEDB4F",
- "name": "四边形色1",
- "role": "square-1",
- "theory": "色相 +90°"
- },
- {
- "hex": "#4FDE94",
- "name": "四边形色2",
- "role": "square-2",
- "theory": "色相 +180°"
- },
- {
- "hex": "#4F52DE",
- "name": "四边形色3",
- "role": "square-3",
- "theory": "色相 +270°"
- }
- ]
- },
- {
- "name": "Web 设计配色",
- "description": "专为 Web 界面设计优化的配色方案,考虑了可访问性和用户体验",
- "colors": [
- {
- "hex": "#DE4F99",
- "name": "品牌主色",
- "role": "brand-primary",
- "theory": "品牌识别色"
- },
- {
- "hex": "#982F65",
- "name": "按钮悬停",
- "role": "hover-state",
- "theory": "主色加深变体"
- },
- {
- "hex": "#F6E9F0",
- "name": "背景浅色",
- "role": "background",
- "theory": "高明度低饱和度"
- },
- {
- "hex": "#1BDE7A",
- "name": "强调色",
- "role": "accent",
- "theory": "互补色系强调"
- },
- {
- "hex": "#6B7280",
- "name": "文本辅助",
- "role": "text-secondary",
- "theory": "中性灰色文本"
- }
- ]
- },
- {
- "name": "暖色调配色",
- "description": "基于暖色系的配色方案,营造温暖、活力和友好的氛围,适合餐饮、儿童产品等",
- "colors": [
- {
- "hex": "#DE4F99",
- "name": "主暖色",
- "role": "warm-primary",
- "theory": "暖色系基调"
- },
- {
- "hex": "#DE4FC8",
- "name": "暖色变体1",
- "role": "warm-variant-1",
- "theory": "暖色范围内调整"
- },
- {
- "hex": "#DE4F5E",
- "name": "暖色变体2",
- "role": "warm-variant-2",
- "theory": "暖色范围内调整"
- },
- {
- "hex": "#EEA5CB",
- "name": "暖色浅调",
- "role": "warm-tint",
- "theory": "提高明度的暖色"
- }
- ]
- }
- ],
- "metadata": {
- "color_theory": "基于色彩理论生成的专业配色方案",
- "total_palettes": 8,
- "applications": [
- "Web 设计",
- "UI/UX",
- "品牌设计",
- "室内设计",
- "服装搭配"
- ]
- }
- }
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "input": {
+ "hex": "#DE4F99",
+ "rgb": {
+ "r": 222,
+ "g": 79,
+ "b": 153
+ },
+ "hsl": {
+ "h": 329,
+ "s": 68,
+ "l": 59
+ },
+ "name": "红色系"
+ },
+ "palettes": [
+ {
+ "name": "单色配色",
+ "description": "基于同一色相,通过调整明度和饱和度创建的和谐配色方案,适合营造统一、专业的视觉效果",
+ "colors": [
+ {
+ "hex": "#DE4F99",
+ "name": "主色",
+ "role": "primary",
+ "theory": "基础色相"
+ },
+ {
+ "hex": "#7C184C",
+ "name": "深色变体",
+ "role": "dark",
+ "theory": "降低明度"
+ },
+ {
+ "hex": "#EEA5CB",
+ "name": "浅色变体",
+ "role": "light",
+ "theory": "提高明度"
+ },
+ {
+ "hex": "#C96498",
+ "name": "柔和变体",
+ "role": "muted",
+ "theory": "降低饱和度"
+ },
+ {
+ "hex": "#ED4099",
+ "name": "鲜艳变体",
+ "role": "vibrant",
+ "theory": "提高饱和度"
+ }
+ ]
+ },
+ {
+ "name": "互补配色",
+ "description": "使用色轮上相对的颜色,创造强烈对比和视觉冲击力,适用于需要突出重点的设计",
+ "colors": [
+ {
+ "hex": "#DE4F99",
+ "name": "主色",
+ "role": "primary",
+ "theory": "基础色相"
+ },
+ {
+ "hex": "#4FDE94",
+ "name": "互补色",
+ "role": "complementary",
+ "theory": "色轮对面 +180°"
+ },
+ {
+ "hex": "#F2BAD7",
+ "name": "主色浅调",
+ "role": "primary-light",
+ "theory": "主色提高明度"
+ },
+ {
+ "hex": "#BAF2D5",
+ "name": "互补色浅调",
+ "role": "complementary-light",
+ "theory": "互补色提高明度"
+ }
+ ]
+ },
+ {
+ "name": "邻近配色",
+ "description": "使用色轮上相邻的颜色,创造自然和谐的渐变效果,常见于自然景观中",
+ "colors": [
+ {
+ "hex": "#DB4FDE",
+ "name": "邻近色1",
+ "role": "analogous-1",
+ "theory": "色相 -30°"
+ },
+ {
+ "hex": "#DE4F99",
+ "name": "主色",
+ "role": "primary",
+ "theory": "基础色相"
+ },
+ {
+ "hex": "#DE4F52",
+ "name": "邻近色2",
+ "role": "analogous-2",
+ "theory": "色相 +30°"
+ },
+ {
+ "hex": "#DE944F",
+ "name": "邻近色3",
+ "role": "analogous-3",
+ "theory": "色相 +60°"
+ }
+ ]
+ },
+ {
+ "name": "三角配色",
+ "description": "在色轮上形成等边三角形的三种颜色,提供丰富对比的同时保持和谐平衡",
+ "colors": [
+ {
+ "hex": "#DE4F99",
+ "name": "主色",
+ "role": "primary",
+ "theory": "基础色相"
+ },
+ {
+ "hex": "#99DE4F",
+ "name": "三角色1",
+ "role": "triadic-1",
+ "theory": "色相 +120°"
+ },
+ {
+ "hex": "#4F99DE",
+ "name": "三角色2",
+ "role": "triadic-2",
+ "theory": "色相 +240°"
+ }
+ ]
+ },
+ {
+ "name": "分裂互补配色",
+ "description": "使用互补色两侧的颜色,比纯互补配色更柔和,同时保持强烈的视觉对比",
+ "colors": [
+ {
+ "hex": "#DE4F99",
+ "name": "主色",
+ "role": "primary",
+ "theory": "基础色相"
+ },
+ {
+ "hex": "#52DE4F",
+ "name": "分裂互补色1",
+ "role": "split-comp-1",
+ "theory": "互补色 -30°"
+ },
+ {
+ "hex": "#4FDEDB",
+ "name": "分裂互补色2",
+ "role": "split-comp-2",
+ "theory": "互补色 +30°"
+ }
+ ]
+ },
+ {
+ "name": "四边形配色",
+ "description": "在色轮上形成正方形的四种颜色,提供最丰富的颜色变化,适合复杂的设计项目",
+ "colors": [
+ {
+ "hex": "#DE4F99",
+ "name": "主色",
+ "role": "primary",
+ "theory": "基础色相"
+ },
+ {
+ "hex": "#DEDB4F",
+ "name": "四边形色1",
+ "role": "square-1",
+ "theory": "色相 +90°"
+ },
+ {
+ "hex": "#4FDE94",
+ "name": "四边形色2",
+ "role": "square-2",
+ "theory": "色相 +180°"
+ },
+ {
+ "hex": "#4F52DE",
+ "name": "四边形色3",
+ "role": "square-3",
+ "theory": "色相 +270°"
+ }
+ ]
+ },
+ {
+ "name": "Web 设计配色",
+ "description": "专为 Web 界面设计优化的配色方案,考虑了可访问性和用户体验",
+ "colors": [
+ {
+ "hex": "#DE4F99",
+ "name": "品牌主色",
+ "role": "brand-primary",
+ "theory": "品牌识别色"
+ },
+ {
+ "hex": "#982F65",
+ "name": "按钮悬停",
+ "role": "hover-state",
+ "theory": "主色加深变体"
+ },
+ {
+ "hex": "#F6E9F0",
+ "name": "背景浅色",
+ "role": "background",
+ "theory": "高明度低饱和度"
+ },
+ {
+ "hex": "#1BDE7A",
+ "name": "强调色",
+ "role": "accent",
+ "theory": "互补色系强调"
+ },
+ {
+ "hex": "#6B7280",
+ "name": "文本辅助",
+ "role": "text-secondary",
+ "theory": "中性灰色文本"
+ }
+ ]
+ },
+ {
+ "name": "暖色调配色",
+ "description": "基于暖色系的配色方案,营造温暖、活力和友好的氛围,适合餐饮、儿童产品等",
+ "colors": [
+ {
+ "hex": "#DE4F99",
+ "name": "主暖色",
+ "role": "warm-primary",
+ "theory": "暖色系基调"
+ },
+ {
+ "hex": "#DE4FC8",
+ "name": "暖色变体1",
+ "role": "warm-variant-1",
+ "theory": "暖色范围内调整"
+ },
+ {
+ "hex": "#DE4F5E",
+ "name": "暖色变体2",
+ "role": "warm-variant-2",
+ "theory": "暖色范围内调整"
+ },
+ {
+ "hex": "#EEA5CB",
+ "name": "暖色浅调",
+ "role": "warm-tint",
+ "theory": "提高明度的暖色"
+ }
+ ]
+ }
+ ],
+ "metadata": {
+ "color_theory": "基于色彩理论生成的专业配色方案",
+ "total_palettes": 8,
+ "applications": [
+ "Web 设计",
+ "UI/UX",
+ "品牌设计",
+ "室内设计",
+ "服装搭配"
+ ]
+ }
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/css/background.css b/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/css/background.css
index 27d9e571..ead6699d 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/css/background.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/css/background.css
@@ -1,232 +1,232 @@
-/* 高维度背景特效样式 - 神秘高级风格 */
-
-/* 背景容器 */
-.background-container {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- z-index: 1;
- overflow: hidden;
- pointer-events: none;
- background: radial-gradient(ellipse at center,
- rgba(15, 0, 30, 0.95) 0%,
- rgba(5, 0, 15, 0.98) 50%,
- rgba(0, 0, 0, 1) 100%);
-}
-
-/* 几何网格层 */
-.geometric-grid {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- linear-gradient(rgba(138, 43, 226, 0.1) 1px, transparent 1px),
- linear-gradient(90deg, rgba(138, 43, 226, 0.1) 1px, transparent 1px),
- linear-gradient(rgba(75, 0, 130, 0.05) 1px, transparent 1px),
- linear-gradient(90deg, rgba(75, 0, 130, 0.05) 1px, transparent 1px);
- background-size: 100px 100px, 100px 100px, 20px 20px, 20px 20px;
- animation: gridPulse 8s ease-in-out infinite;
-}
-
-@keyframes gridPulse {
- 0%, 100% { opacity: 0.3; transform: scale(1); }
- 50% { opacity: 0.6; transform: scale(1.02); }
-}
-
-/* 神经网络效果 */
-.neural-network {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background:
- radial-gradient(circle at 20% 30%, rgba(138, 43, 226, 0.15) 2px, transparent 2px),
- radial-gradient(circle at 80% 20%, rgba(75, 0, 130, 0.12) 1px, transparent 1px),
- radial-gradient(circle at 40% 70%, rgba(147, 0, 211, 0.1) 1.5px, transparent 1.5px),
- radial-gradient(circle at 90% 80%, rgba(138, 43, 226, 0.08) 1px, transparent 1px),
- radial-gradient(circle at 10% 90%, rgba(75, 0, 130, 0.1) 2px, transparent 2px);
- background-size: 200px 200px, 150px 150px, 300px 300px, 180px 180px, 250px 250px;
- animation: neuralFlow 15s linear infinite;
-}
-
-@keyframes neuralFlow {
- 0% { transform: translate(0, 0) rotate(0deg); }
- 25% { transform: translate(-10px, -5px) rotate(90deg); }
- 50% { transform: translate(-5px, -10px) rotate(180deg); }
- 75% { transform: translate(5px, -5px) rotate(270deg); }
- 100% { transform: translate(0, 0) rotate(360deg); }
-}
-
-/* 粒子系统 */
-.particle-system {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- radial-gradient(circle, rgba(138, 43, 226, 0.4) 1px, transparent 1px),
- radial-gradient(circle, rgba(75, 0, 130, 0.3) 0.5px, transparent 0.5px),
- radial-gradient(circle, rgba(147, 0, 211, 0.2) 0.8px, transparent 0.8px);
- background-size: 80px 80px, 120px 120px, 160px 160px;
- background-position: 0 0, 40px 40px, 80px 80px;
- animation: particleFloat 20s ease-in-out infinite;
-}
-
-@keyframes particleFloat {
- 0%, 100% { transform: translateY(0px) translateX(0px); }
- 25% { transform: translateY(-20px) translateX(10px); }
- 50% { transform: translateY(-10px) translateX(-15px); }
- 75% { transform: translateY(-30px) translateX(5px); }
-}
-
-/* 扫描线效果 */
-.scan-lines {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: repeating-linear-gradient(
- 0deg,
- transparent 0px,
- transparent 2px,
- rgba(138, 43, 226, 0.03) 2px,
- rgba(138, 43, 226, 0.03) 4px
- );
- animation: scanMove 3s linear infinite;
-}
-
-@keyframes scanMove {
- 0% { transform: translateY(-100%); }
- 100% { transform: translateY(100%); }
-}
-
-/* 全息投影效果 */
-.holographic-overlay {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background:
- linear-gradient(45deg,
- transparent 30%,
- rgba(138, 43, 226, 0.05) 50%,
- transparent 70%),
- linear-gradient(-45deg,
- transparent 30%,
- rgba(75, 0, 130, 0.03) 50%,
- transparent 70%);
- background-size: 200px 200px, 150px 150px;
- animation: holographicShift 12s ease-in-out infinite;
-}
-
-@keyframes holographicShift {
- 0%, 100% {
- background-position: 0% 0%, 100% 100%;
- opacity: 0.7;
- }
- 50% {
- background-position: 100% 100%, 0% 0%;
- opacity: 1;
- }
-}
-
-/* 数据流效果 */
-.data-stream {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background:
- linear-gradient(90deg,
- transparent 0%,
- rgba(138, 43, 226, 0.1) 50%,
- transparent 100%);
- background-size: 300px 100%;
- animation: dataFlow 8s linear infinite;
-}
-
-@keyframes dataFlow {
- 0% { transform: translateX(-100%); }
- 100% { transform: translateX(100%); }
-}
-
-/* 量子波动效果 */
-.quantum-waves {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background:
- radial-gradient(ellipse 200px 100px at 50% 0%,
- rgba(138, 43, 226, 0.1) 0%,
- transparent 50%),
- radial-gradient(ellipse 300px 150px at 50% 100%,
- rgba(75, 0, 130, 0.08) 0%,
- transparent 50%);
- animation: quantumPulse 10s ease-in-out infinite;
-}
-
-@keyframes quantumPulse {
- 0%, 100% {
- transform: scale(1) rotate(0deg);
- opacity: 0.5;
- }
- 50% {
- transform: scale(1.1) rotate(180deg);
- opacity: 0.8;
- }
-}
-
-/* 响应式优化 */
-@media (max-width: 768px) {
- .geometric-grid {
- background-size: 50px 50px, 50px 50px, 10px 10px, 10px 10px;
- }
-
- .neural-network {
- background-size: 100px 100px, 75px 75px, 150px 150px, 90px 90px, 125px 125px;
- }
-
- .particle-system {
- background-size: 40px 40px, 60px 60px, 80px 80px;
- }
-}
-
-/* 减少动画偏好 */
-@media (prefers-reduced-motion: reduce) {
- .geometric-grid,
- .neural-network,
- .particle-system,
- .scan-lines,
- .holographic-overlay,
- .data-stream,
- .quantum-waves {
- animation: none;
- }
-}
-
-/* 高对比度模式 */
-@media (prefers-contrast: high) {
- .background-container {
- background: radial-gradient(ellipse at center,
- rgba(25, 0, 50, 0.95) 0%,
- rgba(10, 0, 25, 0.98) 50%,
- rgba(0, 0, 0, 1) 100%);
- }
-
- .geometric-grid {
- background-image:
- linear-gradient(rgba(200, 100, 255, 0.2) 1px, transparent 1px),
- linear-gradient(90deg, rgba(200, 100, 255, 0.2) 1px, transparent 1px);
- }
+/* 高维度背景特效样式 - 神秘高级风格 */
+
+/* 背景容器 */
+.background-container {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: 1;
+ overflow: hidden;
+ pointer-events: none;
+ background: radial-gradient(ellipse at center,
+ rgba(15, 0, 30, 0.95) 0%,
+ rgba(5, 0, 15, 0.98) 50%,
+ rgba(0, 0, 0, 1) 100%);
+}
+
+/* 几何网格层 */
+.geometric-grid {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ linear-gradient(rgba(138, 43, 226, 0.1) 1px, transparent 1px),
+ linear-gradient(90deg, rgba(138, 43, 226, 0.1) 1px, transparent 1px),
+ linear-gradient(rgba(75, 0, 130, 0.05) 1px, transparent 1px),
+ linear-gradient(90deg, rgba(75, 0, 130, 0.05) 1px, transparent 1px);
+ background-size: 100px 100px, 100px 100px, 20px 20px, 20px 20px;
+ animation: gridPulse 8s ease-in-out infinite;
+}
+
+@keyframes gridPulse {
+ 0%, 100% { opacity: 0.3; transform: scale(1); }
+ 50% { opacity: 0.6; transform: scale(1.02); }
+}
+
+/* 神经网络效果 */
+.neural-network {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background:
+ radial-gradient(circle at 20% 30%, rgba(138, 43, 226, 0.15) 2px, transparent 2px),
+ radial-gradient(circle at 80% 20%, rgba(75, 0, 130, 0.12) 1px, transparent 1px),
+ radial-gradient(circle at 40% 70%, rgba(147, 0, 211, 0.1) 1.5px, transparent 1.5px),
+ radial-gradient(circle at 90% 80%, rgba(138, 43, 226, 0.08) 1px, transparent 1px),
+ radial-gradient(circle at 10% 90%, rgba(75, 0, 130, 0.1) 2px, transparent 2px);
+ background-size: 200px 200px, 150px 150px, 300px 300px, 180px 180px, 250px 250px;
+ animation: neuralFlow 15s linear infinite;
+}
+
+@keyframes neuralFlow {
+ 0% { transform: translate(0, 0) rotate(0deg); }
+ 25% { transform: translate(-10px, -5px) rotate(90deg); }
+ 50% { transform: translate(-5px, -10px) rotate(180deg); }
+ 75% { transform: translate(5px, -5px) rotate(270deg); }
+ 100% { transform: translate(0, 0) rotate(360deg); }
+}
+
+/* 粒子系统 */
+.particle-system {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(circle, rgba(138, 43, 226, 0.4) 1px, transparent 1px),
+ radial-gradient(circle, rgba(75, 0, 130, 0.3) 0.5px, transparent 0.5px),
+ radial-gradient(circle, rgba(147, 0, 211, 0.2) 0.8px, transparent 0.8px);
+ background-size: 80px 80px, 120px 120px, 160px 160px;
+ background-position: 0 0, 40px 40px, 80px 80px;
+ animation: particleFloat 20s ease-in-out infinite;
+}
+
+@keyframes particleFloat {
+ 0%, 100% { transform: translateY(0px) translateX(0px); }
+ 25% { transform: translateY(-20px) translateX(10px); }
+ 50% { transform: translateY(-10px) translateX(-15px); }
+ 75% { transform: translateY(-30px) translateX(5px); }
+}
+
+/* 扫描线效果 */
+.scan-lines {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ 0deg,
+ transparent 0px,
+ transparent 2px,
+ rgba(138, 43, 226, 0.03) 2px,
+ rgba(138, 43, 226, 0.03) 4px
+ );
+ animation: scanMove 3s linear infinite;
+}
+
+@keyframes scanMove {
+ 0% { transform: translateY(-100%); }
+ 100% { transform: translateY(100%); }
+}
+
+/* 全息投影效果 */
+.holographic-overlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background:
+ linear-gradient(45deg,
+ transparent 30%,
+ rgba(138, 43, 226, 0.05) 50%,
+ transparent 70%),
+ linear-gradient(-45deg,
+ transparent 30%,
+ rgba(75, 0, 130, 0.03) 50%,
+ transparent 70%);
+ background-size: 200px 200px, 150px 150px;
+ animation: holographicShift 12s ease-in-out infinite;
+}
+
+@keyframes holographicShift {
+ 0%, 100% {
+ background-position: 0% 0%, 100% 100%;
+ opacity: 0.7;
+ }
+ 50% {
+ background-position: 100% 100%, 0% 0%;
+ opacity: 1;
+ }
+}
+
+/* 数据流效果 */
+.data-stream {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background:
+ linear-gradient(90deg,
+ transparent 0%,
+ rgba(138, 43, 226, 0.1) 50%,
+ transparent 100%);
+ background-size: 300px 100%;
+ animation: dataFlow 8s linear infinite;
+}
+
+@keyframes dataFlow {
+ 0% { transform: translateX(-100%); }
+ 100% { transform: translateX(100%); }
+}
+
+/* 量子波动效果 */
+.quantum-waves {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background:
+ radial-gradient(ellipse 200px 100px at 50% 0%,
+ rgba(138, 43, 226, 0.1) 0%,
+ transparent 50%),
+ radial-gradient(ellipse 300px 150px at 50% 100%,
+ rgba(75, 0, 130, 0.08) 0%,
+ transparent 50%);
+ animation: quantumPulse 10s ease-in-out infinite;
+}
+
+@keyframes quantumPulse {
+ 0%, 100% {
+ transform: scale(1) rotate(0deg);
+ opacity: 0.5;
+ }
+ 50% {
+ transform: scale(1.1) rotate(180deg);
+ opacity: 0.8;
+ }
+}
+
+/* 响应式优化 */
+@media (max-width: 768px) {
+ .geometric-grid {
+ background-size: 50px 50px, 50px 50px, 10px 10px, 10px 10px;
+ }
+
+ .neural-network {
+ background-size: 100px 100px, 75px 75px, 150px 150px, 90px 90px, 125px 125px;
+ }
+
+ .particle-system {
+ background-size: 40px 40px, 60px 60px, 80px 80px;
+ }
+}
+
+/* 减少动画偏好 */
+@media (prefers-reduced-motion: reduce) {
+ .geometric-grid,
+ .neural-network,
+ .particle-system,
+ .scan-lines,
+ .holographic-overlay,
+ .data-stream,
+ .quantum-waves {
+ animation: none;
+ }
+}
+
+/* 高对比度模式 */
+@media (prefers-contrast: high) {
+ .background-container {
+ background: radial-gradient(ellipse at center,
+ rgba(25, 0, 50, 0.95) 0%,
+ rgba(10, 0, 25, 0.98) 50%,
+ rgba(0, 0, 0, 1) 100%);
+ }
+
+ .geometric-grid {
+ background-image:
+ linear-gradient(rgba(200, 100, 255, 0.2) 1px, transparent 1px),
+ linear-gradient(90deg, rgba(200, 100, 255, 0.2) 1px, transparent 1px);
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/css/style.css b/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/css/style.css
index e36e7c0d..22b7392a 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/css/style.css
@@ -1,1159 +1,1159 @@
-/* 全局样式重置 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-/* 根变量定义 */
-:root {
- /* 神秘色彩系统 */
- --primary-dark: #0a0a0a;
- --secondary-dark: #1a1a1a;
- --accent-dark: #2a2a2a;
- --border-dark: #333333;
-
- /* 神秘绿色系统 */
- --neon-green: #00ff88;
- --dark-green: #004d2a;
- --light-green: #66ffaa;
- --glow-green: rgba(0, 255, 136, 0.3);
-
- /* 高级紫色系统 */
- --neon-purple: #8a2be2;
- --dark-purple: #4a0e4e;
- --light-purple: #b347d9;
- --glow-purple: rgba(138, 43, 226, 0.3);
-
- /* 文字颜色 */
- --text-primary: #ffffff;
- --text-secondary: #cccccc;
- --text-muted: #888888;
- --text-accent: var(--neon-green);
-
- /* 间距系统 */
- --spacing-xs: 0.5rem;
- --spacing-sm: 1rem;
- --spacing-md: 1.5rem;
- --spacing-lg: 2rem;
- --spacing-xl: 3rem;
-
- /* 字体系统 */
- --font-primary: 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
- --font-mono: 'SF Mono', 'Monaco', 'Cascadia Code', 'Roboto Mono', monospace;
-
- /* 阴影系统 */
- --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.3);
- --shadow-md: 0 4px 16px rgba(0, 0, 0, 0.4);
- --shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.5);
- --shadow-glow: 0 0 20px var(--glow-green);
- --shadow-purple-glow: 0 0 20px var(--glow-purple);
-
- /* 边框半径 */
- --radius-sm: 4px;
- --radius-md: 8px;
- --radius-lg: 12px;
- --radius-xl: 16px;
-
- /* 过渡效果 */
- --transition-fast: 0.2s ease;
- --transition-normal: 0.3s ease;
- --transition-slow: 0.5s ease;
-}
-
-/* 基础样式 */
-body {
- font-family: var(--font-primary);
- background: var(--primary-dark);
- color: var(--text-primary);
- line-height: 1.6;
- overflow-x: hidden;
- min-height: 100vh;
- position: relative;
-}
-
-/* 主容器 */
-.main-container {
- position: relative;
- z-index: 10;
- min-height: 100vh;
- display: flex;
- flex-direction: column;
- max-width: 1400px;
- margin: 0 auto;
- padding: var(--spacing-lg);
-}
-
-/* 头部样式 */
-.header {
- margin-bottom: var(--spacing-xl);
- position: relative;
-}
-
-.header-content {
- display: flex;
- justify-content: space-between;
- align-items: center;
- padding: var(--spacing-lg);
- background: linear-gradient(135deg, var(--secondary-dark), var(--accent-dark));
- border: 1px solid var(--border-dark);
- border-radius: var(--radius-xl);
- backdrop-filter: blur(10px);
- position: relative;
- overflow: hidden;
-}
-
-.header-content::before {
- content: '';
- position: absolute;
- top: 0;
- left: -100%;
- width: 100%;
- height: 100%;
- background: linear-gradient(90deg, transparent, var(--glow-green), transparent);
- animation: scanLine 3s infinite;
-}
-
-@keyframes scanLine {
- 0% { left: -100%; }
- 100% { left: 100%; }
-}
-
-.logo-section {
- display: flex;
- align-items: center;
- gap: var(--spacing-md);
-}
-
-.logo-icon {
- font-size: 2.5rem;
- color: var(--neon-green);
- filter: drop-shadow(0 0 10px var(--glow-green));
- animation: pulse 2s infinite;
-}
-
-@keyframes pulse {
- 0%, 100% { transform: scale(1); }
- 50% { transform: scale(1.1); }
-}
-
-.title {
- font-size: 2.5rem;
- font-weight: 700;
- background: linear-gradient(45deg, var(--neon-green), var(--light-green));
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
- text-shadow: 0 0 20px var(--glow-green);
-}
-
-.subtitle {
- font-size: 1rem;
- color: var(--text-secondary);
- font-family: var(--font-mono);
- opacity: 0.8;
-}
-
-.status-indicator {
- display: flex;
- align-items: center;
- gap: var(--spacing-xs);
- padding: var(--spacing-sm) var(--spacing-md);
- background: rgba(0, 255, 136, 0.1);
- border: 1px solid var(--neon-green);
- border-radius: var(--radius-lg);
- backdrop-filter: blur(5px);
-}
-
-.pulse-dot {
- width: 8px;
- height: 8px;
- background: var(--neon-green);
- border-radius: 50%;
- animation: pulseGlow 1.5s infinite;
-}
-
-@keyframes pulseGlow {
- 0%, 100% {
- opacity: 1;
- box-shadow: 0 0 5px var(--glow-green);
- }
- 50% {
- opacity: 0.5;
- box-shadow: 0 0 15px var(--glow-green);
- }
-}
-
-.status-text {
- font-size: 0.9rem;
- color: var(--neon-green);
- font-family: var(--font-mono);
-}
-
-/* 查询区域 */
-.query-section {
- margin-bottom: var(--spacing-xl);
-}
-
-.input-container {
- display: flex;
- gap: var(--spacing-md);
- align-items: stretch;
-}
-
-.input-wrapper {
- flex: 1;
- position: relative;
- background: var(--secondary-dark);
- border-radius: var(--radius-lg);
- overflow: hidden;
-}
-
-.input-icon {
- position: absolute;
- left: var(--spacing-md);
- top: 50%;
- transform: translateY(-50%);
- color: var(--text-muted);
- font-size: 1.2rem;
- z-index: 2;
- transition: var(--transition-normal);
-}
-
-.url-input {
- width: 100%;
- padding: var(--spacing-md) var(--spacing-md) var(--spacing-md) 3.5rem;
- background: transparent;
- border: 2px solid var(--border-dark);
- border-radius: var(--radius-lg);
- color: var(--text-primary);
- font-size: 1.1rem;
- font-family: var(--font-mono);
- transition: var(--transition-normal);
- position: relative;
- z-index: 1;
-}
-
-.url-input:focus {
- outline: none;
- border-color: var(--neon-green);
- box-shadow: var(--shadow-glow);
-}
-
-.url-input:focus + .input-border {
- opacity: 1;
- animation: borderGlow 2s infinite;
-}
-
-.url-input:focus ~ .input-icon {
- color: var(--neon-green);
-}
-
-.input-border {
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- border: 2px solid var(--neon-green);
- border-radius: var(--radius-lg);
- opacity: 0;
- pointer-events: none;
- transition: var(--transition-normal);
-}
-
-@keyframes borderGlow {
- 0%, 100% { box-shadow: 0 0 5px var(--glow-green); }
- 50% { box-shadow: 0 0 20px var(--glow-green); }
-}
-
-.analyze-btn {
- position: relative;
- padding: var(--spacing-md) var(--spacing-xl);
- background: linear-gradient(135deg, var(--dark-green), var(--neon-green));
- border: none;
- border-radius: var(--radius-lg);
- color: var(--primary-dark);
- font-size: 1.1rem;
- font-weight: 600;
- cursor: pointer;
- overflow: hidden;
- transition: var(--transition-normal);
- min-width: 150px;
-}
-
-.analyze-btn:hover {
- transform: translateY(-2px);
- box-shadow: var(--shadow-glow);
-}
-
-.analyze-btn:active {
- transform: translateY(0);
-}
-
-.btn-text {
- position: relative;
- z-index: 2;
-}
-
-.btn-effects {
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- pointer-events: none;
-}
-
-.ripple {
- position: absolute;
- top: 50%;
- left: 50%;
- width: 0;
- height: 0;
- background: rgba(255, 255, 255, 0.3);
- border-radius: 50%;
- transform: translate(-50%, -50%);
- transition: var(--transition-fast);
-}
-
-.analyze-btn:active .ripple {
- width: 200px;
- height: 200px;
-}
-
-/* 加载状态 */
-.loading-container {
- display: flex;
- justify-content: center;
- align-items: center;
- padding: var(--spacing-xl);
- margin: var(--spacing-xl) 0;
-}
-
-.loading-content {
- text-align: center;
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: var(--spacing-lg);
-}
-
-.scanner {
- position: relative;
- width: 200px;
- height: 200px;
- border: 2px solid var(--border-dark);
- border-radius: var(--radius-lg);
- background: var(--secondary-dark);
- overflow: hidden;
-}
-
-.scanner-line {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 2px;
- background: linear-gradient(90deg, transparent, var(--neon-green), transparent);
- animation: scannerMove 2s infinite;
-}
-
-@keyframes scannerMove {
- 0% { top: 0; }
- 100% { top: calc(100% - 2px); }
-}
-
-.scanner-grid {
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- display: grid;
- grid-template-columns: repeat(4, 1fr);
- gap: 1px;
-}
-
-.grid-line {
- background: var(--border-dark);
- opacity: 0.3;
- animation: gridPulse 1.5s infinite;
-}
-
-.grid-line:nth-child(1) { animation-delay: 0s; }
-.grid-line:nth-child(2) { animation-delay: 0.2s; }
-.grid-line:nth-child(3) { animation-delay: 0.4s; }
-.grid-line:nth-child(4) { animation-delay: 0.6s; }
-
-@keyframes gridPulse {
- 0%, 100% { opacity: 0.3; }
- 50% { opacity: 0.8; background: var(--glow-green); }
-}
-
-.loading-text {
- display: flex;
- flex-direction: column;
- gap: var(--spacing-xs);
-}
-
-.loading-title {
- font-size: 1.5rem;
- font-weight: 600;
- color: var(--neon-green);
-}
-
-.loading-subtitle {
- font-size: 1rem;
- color: var(--text-secondary);
- font-family: var(--font-mono);
-}
-
-/* 结果展示区域 */
-.results-section {
- margin-bottom: var(--spacing-xl);
-}
-
-.results-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: var(--spacing-lg);
- padding: var(--spacing-md);
- background: var(--secondary-dark);
- border-radius: var(--radius-lg);
- border: 1px solid var(--border-dark);
-}
-
-.results-title {
- display: flex;
- align-items: center;
- gap: var(--spacing-sm);
- font-size: 1.5rem;
- font-weight: 600;
- color: var(--neon-green);
-}
-
-.results-actions {
- display: flex;
- gap: var(--spacing-sm);
-}
-
-.action-btn {
- display: flex;
- align-items: center;
- gap: var(--spacing-xs);
- padding: var(--spacing-sm) var(--spacing-md);
- background: var(--accent-dark);
- border: 1px solid var(--border-dark);
- border-radius: var(--radius-md);
- color: var(--text-secondary);
- font-size: 0.9rem;
- cursor: pointer;
- transition: var(--transition-normal);
-}
-
-.action-btn:hover {
- background: var(--border-dark);
- color: var(--text-primary);
- border-color: var(--neon-green);
-}
-
-/* OG卡片 */
-.og-card {
- background: var(--secondary-dark);
- border: 1px solid var(--border-dark);
- border-radius: var(--radius-xl);
- overflow: hidden;
- box-shadow: var(--shadow-lg);
-}
-
-.info-section {
- padding: var(--spacing-lg);
- border-bottom: 1px solid var(--border-dark);
-}
-
-.info-section:last-child {
- border-bottom: none;
-}
-
-.section-header {
- display: flex;
- align-items: center;
- gap: var(--spacing-sm);
- margin-bottom: var(--spacing-md);
- font-size: 1.2rem;
- font-weight: 600;
- color: var(--text-accent);
-}
-
-.info-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
- gap: var(--spacing-md);
-}
-
-.info-item {
- display: flex;
- flex-direction: column;
- gap: var(--spacing-xs);
-}
-
-.info-item label {
- font-size: 0.9rem;
- color: var(--text-muted);
- font-family: var(--font-mono);
- text-transform: uppercase;
- letter-spacing: 0.5px;
-}
-
-.info-value {
- padding: var(--spacing-sm);
- background: var(--accent-dark);
- border: 1px solid var(--border-dark);
- border-radius: var(--radius-md);
- color: var(--text-primary);
- font-family: var(--font-mono);
- word-break: break-all;
- transition: var(--transition-normal);
-}
-
-.info-value:hover {
- border-color: var(--neon-green);
- box-shadow: 0 0 10px var(--glow-green);
-}
-
-.url-value {
- color: var(--light-green);
- cursor: pointer;
-}
-
-.url-value:hover {
- color: var(--neon-green);
-}
-
-/* 媒体预览 */
-.media-preview {
- margin-bottom: var(--spacing-md);
- border-radius: var(--radius-lg);
- overflow: hidden;
- background: var(--accent-dark);
- border: 1px solid var(--border-dark);
- min-height: 200px;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.media-preview img {
- max-width: 100%;
- max-height: 300px;
- object-fit: contain;
- border-radius: var(--radius-md);
-}
-
-.no-media {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: var(--spacing-sm);
- color: var(--text-muted);
- font-size: 1.1rem;
-}
-
-.no-media i {
- font-size: 2rem;
- opacity: 0.5;
-}
-
-.media-details {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
- gap: var(--spacing-md);
-}
-
-/* 错误状态 */
-.error-container {
- display: flex;
- justify-content: center;
- align-items: center;
- padding: var(--spacing-xl);
- margin: var(--spacing-xl) 0;
-}
-
-.error-content {
- text-align: center;
- padding: var(--spacing-xl);
- background: var(--secondary-dark);
- border: 2px solid #ff4444;
- border-radius: var(--radius-xl);
- max-width: 500px;
- box-shadow: 0 0 20px rgba(255, 68, 68, 0.3);
-}
-
-.error-icon {
- font-size: 3rem;
- color: #ff4444;
- margin-bottom: var(--spacing-md);
- animation: shake 0.5s infinite;
-}
-
-@keyframes shake {
- 0%, 100% { transform: translateX(0); }
- 25% { transform: translateX(-5px); }
- 75% { transform: translateX(5px); }
-}
-
-.error-title {
- font-size: 1.5rem;
- font-weight: 600;
- color: #ff4444;
- margin-bottom: var(--spacing-sm);
-}
-
-.error-message {
- color: var(--text-secondary);
- margin-bottom: var(--spacing-lg);
- font-family: var(--font-mono);
-}
-
-.retry-btn {
- display: inline-flex;
- align-items: center;
- gap: var(--spacing-xs);
- padding: var(--spacing-sm) var(--spacing-lg);
- background: #ff4444;
- border: none;
- border-radius: var(--radius-md);
- color: white;
- font-weight: 600;
- cursor: pointer;
- transition: var(--transition-normal);
-}
-
-.retry-btn:hover {
- background: #ff6666;
- transform: translateY(-2px);
-}
-
-/* Tip 消息样式 */
-.tip-container {
- position: fixed;
- bottom: 2rem;
- left: 2rem;
- z-index: 999;
- opacity: 0;
- transform: translateY(20px);
- transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
- pointer-events: none;
-}
-
-.tip-container.active {
- opacity: 1;
- transform: translateY(0);
- pointer-events: auto;
-}
-
-.tip-content {
- background: linear-gradient(135deg,
- rgba(138, 43, 226, 0.1) 0%,
- rgba(75, 0, 130, 0.1) 100%);
- border: 1px solid rgba(138, 43, 226, 0.3);
- border-radius: var(--radius-lg);
- padding: var(--spacing-md);
- backdrop-filter: blur(10px);
- box-shadow:
- 0 8px 32px rgba(0, 0, 0, 0.3),
- 0 0 20px rgba(138, 43, 226, 0.1),
- inset 0 1px 0 rgba(255, 255, 255, 0.1);
- display: flex;
- align-items: center;
- gap: var(--spacing-sm);
- min-width: 300px;
- max-width: 400px;
-}
-
-.tip-icon {
- font-size: 1.2rem;
- color: var(--neon-purple);
- flex-shrink: 0;
-}
-
-.tip-text {
- color: var(--text-secondary);
- font-size: 0.9rem;
- line-height: 1.4;
-}
-
-/* 提示消息 */
-.toast-container {
- position: fixed;
- top: var(--spacing-lg);
- right: var(--spacing-lg);
- z-index: 1000;
- transform: translateX(100%);
- transition: var(--transition-normal);
-}
-
-.toast-container.show {
- transform: translateX(0);
-}
-
-.toast-content {
- display: flex;
- align-items: center;
- gap: var(--spacing-sm);
- padding: var(--spacing-md) var(--spacing-lg);
- background: var(--secondary-dark);
- border: 1px solid var(--neon-green);
- border-radius: var(--radius-lg);
- color: var(--text-primary);
- box-shadow: var(--shadow-glow);
- backdrop-filter: blur(10px);
-}
-
-.toast-icon {
- font-size: 1.2rem;
- color: var(--neon-green);
-}
-
-.toast-message {
- font-family: var(--font-mono);
- font-size: 0.9rem;
-}
-
-/* 页脚 */
-.footer {
- margin-top: auto;
- padding: var(--spacing-lg);
- border-top: 1px solid var(--border-dark);
- background: var(--secondary-dark);
- border-radius: var(--radius-lg);
-}
-
-.footer-content {
- display: flex;
- justify-content: space-between;
- align-items: center;
- text-align: center;
-}
-
-.footer-text {
- display: flex;
- align-items: center;
- gap: var(--spacing-xs);
- color: var(--text-muted);
- font-size: 0.9rem;
- font-family: var(--font-mono);
-}
-
-.footer-links {
- display: flex;
- align-items: center;
- gap: var(--spacing-sm);
- font-size: 0.8rem;
- color: var(--text-muted);
-}
-
-.footer-link {
- cursor: pointer;
- transition: var(--transition-normal);
-}
-
-.footer-link:hover {
- color: var(--neon-green);
-}
-
-.footer-divider {
- opacity: 0.5;
-}
-
-/* 响应式设计 */
-
-/* 平板设备 */
-@media (max-width: 1024px) {
- .main-container {
- padding: var(--spacing-md);
- }
-
- .header-content {
- flex-direction: column;
- gap: var(--spacing-md);
- text-align: center;
- }
-
- .title {
- font-size: 2rem;
- }
-
- .input-container {
- flex-direction: column;
- }
-
- .analyze-btn {
- width: 100%;
- }
-
- .info-grid {
- grid-template-columns: 1fr;
- }
-
- .results-header {
- flex-direction: column;
- gap: var(--spacing-md);
- }
-
- .footer-content {
- flex-direction: column;
- gap: var(--spacing-sm);
- }
-}
-
-/* 交互动画增强 */
-.input-glow {
- position: absolute;
- top: -2px;
- left: -2px;
- right: -2px;
- bottom: -2px;
- background: linear-gradient(45deg,
- var(--neon-green),
- var(--light-green),
- var(--neon-purple));
- border-radius: inherit;
- z-index: -1;
- opacity: 0;
- animation: glowPulse 2s ease-in-out;
-}
-
-@keyframes glowPulse {
- 0%, 100% { opacity: 0; transform: scale(1); }
- 50% { opacity: 0.6; transform: scale(1.02); }
-}
-
-.input-container.shake {
- animation: inputShake 0.6s ease-in-out;
-}
-
-@keyframes inputShake {
- 0%, 100% { transform: translateX(0); }
- 10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); }
- 20%, 40%, 60%, 80% { transform: translateX(5px); }
-}
-
-.analyze-btn.flash,
-.action-btn.flash {
- animation: buttonFlash 0.3s ease-in-out;
-}
-
-@keyframes buttonFlash {
- 0%, 100% { background: linear-gradient(135deg, var(--dark-green), var(--neon-green)); }
- 50% { background: var(--neon-purple); box-shadow: 0 0 20px var(--glow-purple); }
-}
-
-.og-card.animate-in {
- animation: cardSlideIn 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;
-}
-
-@keyframes cardSlideIn {
- 0% {
- opacity: 0;
- transform: translateY(30px) scale(0.95);
- }
- 100% {
- opacity: 1;
- transform: translateY(0) scale(1);
- }
-}
-
-.header.animate-in {
- animation: headerFadeIn 1s ease-out forwards;
-}
-
-@keyframes headerFadeIn {
- 0% {
- opacity: 0;
- transform: translateY(-20px);
- }
- 100% {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-.query-section.animate-in {
- animation: sectionSlideUp 0.8s ease-out 0.2s forwards;
- opacity: 0;
-}
-
-@keyframes sectionSlideUp {
- 0% {
- opacity: 0;
- transform: translateY(40px);
- }
- 100% {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-@keyframes fadeInUp {
- 0% {
- opacity: 0;
- transform: translateY(20px);
- }
- 100% {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-@keyframes fadeOutDown {
- 0% {
- opacity: 1;
- transform: translateY(0);
- }
- 100% {
- opacity: 0;
- transform: translateY(20px);
- }
-}
-
-/* 高级悬浮效果 */
-.og-card:hover {
- transform: translateY(-5px) scale(1.02);
- box-shadow:
- 0 10px 30px var(--glow-purple),
- 0 0 20px rgba(138, 43, 226, 0.1),
- inset 0 1px 0 rgba(255, 255, 255, 0.1);
-}
-
-.analyze-btn:hover:not(:disabled) {
- transform: translateY(-3px);
- box-shadow:
- 0 8px 25px var(--glow-green),
- 0 0 15px rgba(0, 255, 136, 0.2);
-}
-
-.action-btn:hover:not(:disabled) {
- transform: translateY(-1px);
- box-shadow: 0 5px 15px var(--glow-purple);
-}
-
-/* 图片加载动画 */
-.media-preview img {
- transition: all 0.3s ease;
-}
-
-.media-preview img:hover {
- transform: scale(1.05);
- box-shadow: 0 8px 25px var(--glow-green);
-}
-
-.image-placeholder {
- background: linear-gradient(135deg,
- var(--glow-green) 0%,
- var(--glow-purple) 100%);
- border: 2px dashed rgba(138, 43, 226, 0.3);
- display: none;
- align-items: center;
- justify-content: center;
- min-height: 200px;
- border-radius: var(--radius-lg);
- color: var(--text-secondary);
- font-size: 0.9rem;
-}
-
-/* 手机设备 */
-@media (max-width: 768px) {
- .main-container {
- padding: var(--spacing-sm);
- }
-
- .header-content {
- padding: var(--spacing-md);
- }
-
- .title {
- font-size: 1.8rem;
- }
-
- .subtitle {
- font-size: 0.9rem;
- }
-
- .logo-icon {
- font-size: 2rem;
- }
-
- .url-input {
- font-size: 16px; /* 防止iOS缩放 */
- padding: var(--spacing-sm) var(--spacing-sm) var(--spacing-sm) 3rem;
- }
-
- .input-icon {
- left: var(--spacing-sm);
- font-size: 1rem;
- }
-
- .analyze-btn {
- padding: var(--spacing-sm) var(--spacing-md);
- font-size: 1rem;
- }
-
- .scanner {
- width: 150px;
- height: 150px;
- }
-
- .loading-title {
- font-size: 1.3rem;
- }
-
- .loading-subtitle {
- font-size: 0.9rem;
- }
-
- .results-title {
- font-size: 1.3rem;
- }
-
- .action-btn {
- font-size: 0.8rem;
- padding: var(--spacing-xs) var(--spacing-sm);
- }
-
- .info-section {
- padding: var(--spacing-md);
- }
-
- .section-header {
- font-size: 1.1rem;
- }
-
- .media-details {
- grid-template-columns: 1fr;
- }
-
- .toast-container {
- top: var(--spacing-sm);
- right: var(--spacing-sm);
- left: var(--spacing-sm);
- transform: translateY(-100%);
- }
-
- .toast-container.show {
- transform: translateY(0);
- }
-
- .footer-text {
- font-size: 0.8rem;
- }
-
- .footer-links {
- font-size: 0.7rem;
- }
-
- /* 移动设备上禁用部分悬浮效果 */
- .og-card:hover {
- transform: none;
- }
-
- .media-preview img:hover {
- transform: none;
- }
-}
-
-/* 小屏手机设备 */
-@media (max-width: 480px) {
- .main-container {
- padding: var(--spacing-xs);
- }
-
- .title {
- font-size: 1.5rem;
- }
-
- .logo-section {
- flex-direction: column;
- gap: var(--spacing-sm);
- }
-
- .scanner {
- width: 120px;
- height: 120px;
- }
-
- .error-content {
- padding: var(--spacing-md);
- }
-
- .error-icon {
- font-size: 2.5rem;
- }
-
- .error-title {
- font-size: 1.3rem;
- }
-}
-
-/* 高分辨率屏幕优化 */
-@media (min-width: 1440px) {
- .main-container {
- max-width: 1600px;
- }
-
- .title {
- font-size: 3rem;
- }
-
- .url-input {
- font-size: 1.2rem;
- }
-
- .analyze-btn {
- font-size: 1.2rem;
- padding: var(--spacing-lg) var(--spacing-xl);
- }
-}
-
-/* 深色模式优化 */
-@media (prefers-color-scheme: dark) {
- :root {
- --primary-dark: #000000;
- --secondary-dark: #111111;
- --accent-dark: #222222;
- }
-}
-
-/* 减少动画偏好 */
-@media (prefers-reduced-motion: reduce) {
- * {
- animation-duration: 0.01ms !important;
- animation-iteration-count: 1 !important;
- transition-duration: 0.01ms !important;
- }
-}
-
-/* 打印样式 */
-@media print {
- .background-container,
- .header,
- .query-section,
- .loading-container,
- .error-container,
- .toast-container,
- .footer {
- display: none;
- }
-
- .results-section {
- margin: 0;
- padding: 0;
- }
-
- .og-card {
- border: 1px solid #000;
- box-shadow: none;
- }
+/* 全局样式重置 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+/* 根变量定义 */
+:root {
+ /* 神秘色彩系统 */
+ --primary-dark: #0a0a0a;
+ --secondary-dark: #1a1a1a;
+ --accent-dark: #2a2a2a;
+ --border-dark: #333333;
+
+ /* 神秘绿色系统 */
+ --neon-green: #00ff88;
+ --dark-green: #004d2a;
+ --light-green: #66ffaa;
+ --glow-green: rgba(0, 255, 136, 0.3);
+
+ /* 高级紫色系统 */
+ --neon-purple: #8a2be2;
+ --dark-purple: #4a0e4e;
+ --light-purple: #b347d9;
+ --glow-purple: rgba(138, 43, 226, 0.3);
+
+ /* 文字颜色 */
+ --text-primary: #ffffff;
+ --text-secondary: #cccccc;
+ --text-muted: #888888;
+ --text-accent: var(--neon-green);
+
+ /* 间距系统 */
+ --spacing-xs: 0.5rem;
+ --spacing-sm: 1rem;
+ --spacing-md: 1.5rem;
+ --spacing-lg: 2rem;
+ --spacing-xl: 3rem;
+
+ /* 字体系统 */
+ --font-primary: 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
+ --font-mono: 'SF Mono', 'Monaco', 'Cascadia Code', 'Roboto Mono', monospace;
+
+ /* 阴影系统 */
+ --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.3);
+ --shadow-md: 0 4px 16px rgba(0, 0, 0, 0.4);
+ --shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.5);
+ --shadow-glow: 0 0 20px var(--glow-green);
+ --shadow-purple-glow: 0 0 20px var(--glow-purple);
+
+ /* 边框半径 */
+ --radius-sm: 4px;
+ --radius-md: 8px;
+ --radius-lg: 12px;
+ --radius-xl: 16px;
+
+ /* 过渡效果 */
+ --transition-fast: 0.2s ease;
+ --transition-normal: 0.3s ease;
+ --transition-slow: 0.5s ease;
+}
+
+/* 基础样式 */
+body {
+ font-family: var(--font-primary);
+ background: var(--primary-dark);
+ color: var(--text-primary);
+ line-height: 1.6;
+ overflow-x: hidden;
+ min-height: 100vh;
+ position: relative;
+}
+
+/* 主容器 */
+.main-container {
+ position: relative;
+ z-index: 10;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ max-width: 1400px;
+ margin: 0 auto;
+ padding: var(--spacing-lg);
+}
+
+/* 头部样式 */
+.header {
+ margin-bottom: var(--spacing-xl);
+ position: relative;
+}
+
+.header-content {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: var(--spacing-lg);
+ background: linear-gradient(135deg, var(--secondary-dark), var(--accent-dark));
+ border: 1px solid var(--border-dark);
+ border-radius: var(--radius-xl);
+ backdrop-filter: blur(10px);
+ position: relative;
+ overflow: hidden;
+}
+
+.header-content::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: -100%;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(90deg, transparent, var(--glow-green), transparent);
+ animation: scanLine 3s infinite;
+}
+
+@keyframes scanLine {
+ 0% { left: -100%; }
+ 100% { left: 100%; }
+}
+
+.logo-section {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-md);
+}
+
+.logo-icon {
+ font-size: 2.5rem;
+ color: var(--neon-green);
+ filter: drop-shadow(0 0 10px var(--glow-green));
+ animation: pulse 2s infinite;
+}
+
+@keyframes pulse {
+ 0%, 100% { transform: scale(1); }
+ 50% { transform: scale(1.1); }
+}
+
+.title {
+ font-size: 2.5rem;
+ font-weight: 700;
+ background: linear-gradient(45deg, var(--neon-green), var(--light-green));
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ text-shadow: 0 0 20px var(--glow-green);
+}
+
+.subtitle {
+ font-size: 1rem;
+ color: var(--text-secondary);
+ font-family: var(--font-mono);
+ opacity: 0.8;
+}
+
+.status-indicator {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-xs);
+ padding: var(--spacing-sm) var(--spacing-md);
+ background: rgba(0, 255, 136, 0.1);
+ border: 1px solid var(--neon-green);
+ border-radius: var(--radius-lg);
+ backdrop-filter: blur(5px);
+}
+
+.pulse-dot {
+ width: 8px;
+ height: 8px;
+ background: var(--neon-green);
+ border-radius: 50%;
+ animation: pulseGlow 1.5s infinite;
+}
+
+@keyframes pulseGlow {
+ 0%, 100% {
+ opacity: 1;
+ box-shadow: 0 0 5px var(--glow-green);
+ }
+ 50% {
+ opacity: 0.5;
+ box-shadow: 0 0 15px var(--glow-green);
+ }
+}
+
+.status-text {
+ font-size: 0.9rem;
+ color: var(--neon-green);
+ font-family: var(--font-mono);
+}
+
+/* 查询区域 */
+.query-section {
+ margin-bottom: var(--spacing-xl);
+}
+
+.input-container {
+ display: flex;
+ gap: var(--spacing-md);
+ align-items: stretch;
+}
+
+.input-wrapper {
+ flex: 1;
+ position: relative;
+ background: var(--secondary-dark);
+ border-radius: var(--radius-lg);
+ overflow: hidden;
+}
+
+.input-icon {
+ position: absolute;
+ left: var(--spacing-md);
+ top: 50%;
+ transform: translateY(-50%);
+ color: var(--text-muted);
+ font-size: 1.2rem;
+ z-index: 2;
+ transition: var(--transition-normal);
+}
+
+.url-input {
+ width: 100%;
+ padding: var(--spacing-md) var(--spacing-md) var(--spacing-md) 3.5rem;
+ background: transparent;
+ border: 2px solid var(--border-dark);
+ border-radius: var(--radius-lg);
+ color: var(--text-primary);
+ font-size: 1.1rem;
+ font-family: var(--font-mono);
+ transition: var(--transition-normal);
+ position: relative;
+ z-index: 1;
+}
+
+.url-input:focus {
+ outline: none;
+ border-color: var(--neon-green);
+ box-shadow: var(--shadow-glow);
+}
+
+.url-input:focus + .input-border {
+ opacity: 1;
+ animation: borderGlow 2s infinite;
+}
+
+.url-input:focus ~ .input-icon {
+ color: var(--neon-green);
+}
+
+.input-border {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ border: 2px solid var(--neon-green);
+ border-radius: var(--radius-lg);
+ opacity: 0;
+ pointer-events: none;
+ transition: var(--transition-normal);
+}
+
+@keyframes borderGlow {
+ 0%, 100% { box-shadow: 0 0 5px var(--glow-green); }
+ 50% { box-shadow: 0 0 20px var(--glow-green); }
+}
+
+.analyze-btn {
+ position: relative;
+ padding: var(--spacing-md) var(--spacing-xl);
+ background: linear-gradient(135deg, var(--dark-green), var(--neon-green));
+ border: none;
+ border-radius: var(--radius-lg);
+ color: var(--primary-dark);
+ font-size: 1.1rem;
+ font-weight: 600;
+ cursor: pointer;
+ overflow: hidden;
+ transition: var(--transition-normal);
+ min-width: 150px;
+}
+
+.analyze-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: var(--shadow-glow);
+}
+
+.analyze-btn:active {
+ transform: translateY(0);
+}
+
+.btn-text {
+ position: relative;
+ z-index: 2;
+}
+
+.btn-effects {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ pointer-events: none;
+}
+
+.ripple {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 0;
+ height: 0;
+ background: rgba(255, 255, 255, 0.3);
+ border-radius: 50%;
+ transform: translate(-50%, -50%);
+ transition: var(--transition-fast);
+}
+
+.analyze-btn:active .ripple {
+ width: 200px;
+ height: 200px;
+}
+
+/* 加载状态 */
+.loading-container {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ padding: var(--spacing-xl);
+ margin: var(--spacing-xl) 0;
+}
+
+.loading-content {
+ text-align: center;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: var(--spacing-lg);
+}
+
+.scanner {
+ position: relative;
+ width: 200px;
+ height: 200px;
+ border: 2px solid var(--border-dark);
+ border-radius: var(--radius-lg);
+ background: var(--secondary-dark);
+ overflow: hidden;
+}
+
+.scanner-line {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 2px;
+ background: linear-gradient(90deg, transparent, var(--neon-green), transparent);
+ animation: scannerMove 2s infinite;
+}
+
+@keyframes scannerMove {
+ 0% { top: 0; }
+ 100% { top: calc(100% - 2px); }
+}
+
+.scanner-grid {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 1px;
+}
+
+.grid-line {
+ background: var(--border-dark);
+ opacity: 0.3;
+ animation: gridPulse 1.5s infinite;
+}
+
+.grid-line:nth-child(1) { animation-delay: 0s; }
+.grid-line:nth-child(2) { animation-delay: 0.2s; }
+.grid-line:nth-child(3) { animation-delay: 0.4s; }
+.grid-line:nth-child(4) { animation-delay: 0.6s; }
+
+@keyframes gridPulse {
+ 0%, 100% { opacity: 0.3; }
+ 50% { opacity: 0.8; background: var(--glow-green); }
+}
+
+.loading-text {
+ display: flex;
+ flex-direction: column;
+ gap: var(--spacing-xs);
+}
+
+.loading-title {
+ font-size: 1.5rem;
+ font-weight: 600;
+ color: var(--neon-green);
+}
+
+.loading-subtitle {
+ font-size: 1rem;
+ color: var(--text-secondary);
+ font-family: var(--font-mono);
+}
+
+/* 结果展示区域 */
+.results-section {
+ margin-bottom: var(--spacing-xl);
+}
+
+.results-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: var(--spacing-lg);
+ padding: var(--spacing-md);
+ background: var(--secondary-dark);
+ border-radius: var(--radius-lg);
+ border: 1px solid var(--border-dark);
+}
+
+.results-title {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-sm);
+ font-size: 1.5rem;
+ font-weight: 600;
+ color: var(--neon-green);
+}
+
+.results-actions {
+ display: flex;
+ gap: var(--spacing-sm);
+}
+
+.action-btn {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-xs);
+ padding: var(--spacing-sm) var(--spacing-md);
+ background: var(--accent-dark);
+ border: 1px solid var(--border-dark);
+ border-radius: var(--radius-md);
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ cursor: pointer;
+ transition: var(--transition-normal);
+}
+
+.action-btn:hover {
+ background: var(--border-dark);
+ color: var(--text-primary);
+ border-color: var(--neon-green);
+}
+
+/* OG卡片 */
+.og-card {
+ background: var(--secondary-dark);
+ border: 1px solid var(--border-dark);
+ border-radius: var(--radius-xl);
+ overflow: hidden;
+ box-shadow: var(--shadow-lg);
+}
+
+.info-section {
+ padding: var(--spacing-lg);
+ border-bottom: 1px solid var(--border-dark);
+}
+
+.info-section:last-child {
+ border-bottom: none;
+}
+
+.section-header {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-sm);
+ margin-bottom: var(--spacing-md);
+ font-size: 1.2rem;
+ font-weight: 600;
+ color: var(--text-accent);
+}
+
+.info-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
+ gap: var(--spacing-md);
+}
+
+.info-item {
+ display: flex;
+ flex-direction: column;
+ gap: var(--spacing-xs);
+}
+
+.info-item label {
+ font-size: 0.9rem;
+ color: var(--text-muted);
+ font-family: var(--font-mono);
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.info-value {
+ padding: var(--spacing-sm);
+ background: var(--accent-dark);
+ border: 1px solid var(--border-dark);
+ border-radius: var(--radius-md);
+ color: var(--text-primary);
+ font-family: var(--font-mono);
+ word-break: break-all;
+ transition: var(--transition-normal);
+}
+
+.info-value:hover {
+ border-color: var(--neon-green);
+ box-shadow: 0 0 10px var(--glow-green);
+}
+
+.url-value {
+ color: var(--light-green);
+ cursor: pointer;
+}
+
+.url-value:hover {
+ color: var(--neon-green);
+}
+
+/* 媒体预览 */
+.media-preview {
+ margin-bottom: var(--spacing-md);
+ border-radius: var(--radius-lg);
+ overflow: hidden;
+ background: var(--accent-dark);
+ border: 1px solid var(--border-dark);
+ min-height: 200px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.media-preview img {
+ max-width: 100%;
+ max-height: 300px;
+ object-fit: contain;
+ border-radius: var(--radius-md);
+}
+
+.no-media {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: var(--spacing-sm);
+ color: var(--text-muted);
+ font-size: 1.1rem;
+}
+
+.no-media i {
+ font-size: 2rem;
+ opacity: 0.5;
+}
+
+.media-details {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
+ gap: var(--spacing-md);
+}
+
+/* 错误状态 */
+.error-container {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ padding: var(--spacing-xl);
+ margin: var(--spacing-xl) 0;
+}
+
+.error-content {
+ text-align: center;
+ padding: var(--spacing-xl);
+ background: var(--secondary-dark);
+ border: 2px solid #ff4444;
+ border-radius: var(--radius-xl);
+ max-width: 500px;
+ box-shadow: 0 0 20px rgba(255, 68, 68, 0.3);
+}
+
+.error-icon {
+ font-size: 3rem;
+ color: #ff4444;
+ margin-bottom: var(--spacing-md);
+ animation: shake 0.5s infinite;
+}
+
+@keyframes shake {
+ 0%, 100% { transform: translateX(0); }
+ 25% { transform: translateX(-5px); }
+ 75% { transform: translateX(5px); }
+}
+
+.error-title {
+ font-size: 1.5rem;
+ font-weight: 600;
+ color: #ff4444;
+ margin-bottom: var(--spacing-sm);
+}
+
+.error-message {
+ color: var(--text-secondary);
+ margin-bottom: var(--spacing-lg);
+ font-family: var(--font-mono);
+}
+
+.retry-btn {
+ display: inline-flex;
+ align-items: center;
+ gap: var(--spacing-xs);
+ padding: var(--spacing-sm) var(--spacing-lg);
+ background: #ff4444;
+ border: none;
+ border-radius: var(--radius-md);
+ color: white;
+ font-weight: 600;
+ cursor: pointer;
+ transition: var(--transition-normal);
+}
+
+.retry-btn:hover {
+ background: #ff6666;
+ transform: translateY(-2px);
+}
+
+/* Tip 消息样式 */
+.tip-container {
+ position: fixed;
+ bottom: 2rem;
+ left: 2rem;
+ z-index: 999;
+ opacity: 0;
+ transform: translateY(20px);
+ transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
+ pointer-events: none;
+}
+
+.tip-container.active {
+ opacity: 1;
+ transform: translateY(0);
+ pointer-events: auto;
+}
+
+.tip-content {
+ background: linear-gradient(135deg,
+ rgba(138, 43, 226, 0.1) 0%,
+ rgba(75, 0, 130, 0.1) 100%);
+ border: 1px solid rgba(138, 43, 226, 0.3);
+ border-radius: var(--radius-lg);
+ padding: var(--spacing-md);
+ backdrop-filter: blur(10px);
+ box-shadow:
+ 0 8px 32px rgba(0, 0, 0, 0.3),
+ 0 0 20px rgba(138, 43, 226, 0.1),
+ inset 0 1px 0 rgba(255, 255, 255, 0.1);
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-sm);
+ min-width: 300px;
+ max-width: 400px;
+}
+
+.tip-icon {
+ font-size: 1.2rem;
+ color: var(--neon-purple);
+ flex-shrink: 0;
+}
+
+.tip-text {
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+ line-height: 1.4;
+}
+
+/* 提示消息 */
+.toast-container {
+ position: fixed;
+ top: var(--spacing-lg);
+ right: var(--spacing-lg);
+ z-index: 1000;
+ transform: translateX(100%);
+ transition: var(--transition-normal);
+}
+
+.toast-container.show {
+ transform: translateX(0);
+}
+
+.toast-content {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-sm);
+ padding: var(--spacing-md) var(--spacing-lg);
+ background: var(--secondary-dark);
+ border: 1px solid var(--neon-green);
+ border-radius: var(--radius-lg);
+ color: var(--text-primary);
+ box-shadow: var(--shadow-glow);
+ backdrop-filter: blur(10px);
+}
+
+.toast-icon {
+ font-size: 1.2rem;
+ color: var(--neon-green);
+}
+
+.toast-message {
+ font-family: var(--font-mono);
+ font-size: 0.9rem;
+}
+
+/* 页脚 */
+.footer {
+ margin-top: auto;
+ padding: var(--spacing-lg);
+ border-top: 1px solid var(--border-dark);
+ background: var(--secondary-dark);
+ border-radius: var(--radius-lg);
+}
+
+.footer-content {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ text-align: center;
+}
+
+.footer-text {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-xs);
+ color: var(--text-muted);
+ font-size: 0.9rem;
+ font-family: var(--font-mono);
+}
+
+.footer-links {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-sm);
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+.footer-link {
+ cursor: pointer;
+ transition: var(--transition-normal);
+}
+
+.footer-link:hover {
+ color: var(--neon-green);
+}
+
+.footer-divider {
+ opacity: 0.5;
+}
+
+/* 响应式设计 */
+
+/* 平板设备 */
+@media (max-width: 1024px) {
+ .main-container {
+ padding: var(--spacing-md);
+ }
+
+ .header-content {
+ flex-direction: column;
+ gap: var(--spacing-md);
+ text-align: center;
+ }
+
+ .title {
+ font-size: 2rem;
+ }
+
+ .input-container {
+ flex-direction: column;
+ }
+
+ .analyze-btn {
+ width: 100%;
+ }
+
+ .info-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .results-header {
+ flex-direction: column;
+ gap: var(--spacing-md);
+ }
+
+ .footer-content {
+ flex-direction: column;
+ gap: var(--spacing-sm);
+ }
+}
+
+/* 交互动画增强 */
+.input-glow {
+ position: absolute;
+ top: -2px;
+ left: -2px;
+ right: -2px;
+ bottom: -2px;
+ background: linear-gradient(45deg,
+ var(--neon-green),
+ var(--light-green),
+ var(--neon-purple));
+ border-radius: inherit;
+ z-index: -1;
+ opacity: 0;
+ animation: glowPulse 2s ease-in-out;
+}
+
+@keyframes glowPulse {
+ 0%, 100% { opacity: 0; transform: scale(1); }
+ 50% { opacity: 0.6; transform: scale(1.02); }
+}
+
+.input-container.shake {
+ animation: inputShake 0.6s ease-in-out;
+}
+
+@keyframes inputShake {
+ 0%, 100% { transform: translateX(0); }
+ 10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); }
+ 20%, 40%, 60%, 80% { transform: translateX(5px); }
+}
+
+.analyze-btn.flash,
+.action-btn.flash {
+ animation: buttonFlash 0.3s ease-in-out;
+}
+
+@keyframes buttonFlash {
+ 0%, 100% { background: linear-gradient(135deg, var(--dark-green), var(--neon-green)); }
+ 50% { background: var(--neon-purple); box-shadow: 0 0 20px var(--glow-purple); }
+}
+
+.og-card.animate-in {
+ animation: cardSlideIn 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;
+}
+
+@keyframes cardSlideIn {
+ 0% {
+ opacity: 0;
+ transform: translateY(30px) scale(0.95);
+ }
+ 100% {
+ opacity: 1;
+ transform: translateY(0) scale(1);
+ }
+}
+
+.header.animate-in {
+ animation: headerFadeIn 1s ease-out forwards;
+}
+
+@keyframes headerFadeIn {
+ 0% {
+ opacity: 0;
+ transform: translateY(-20px);
+ }
+ 100% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.query-section.animate-in {
+ animation: sectionSlideUp 0.8s ease-out 0.2s forwards;
+ opacity: 0;
+}
+
+@keyframes sectionSlideUp {
+ 0% {
+ opacity: 0;
+ transform: translateY(40px);
+ }
+ 100% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@keyframes fadeInUp {
+ 0% {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+ 100% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@keyframes fadeOutDown {
+ 0% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+ 100% {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+}
+
+/* 高级悬浮效果 */
+.og-card:hover {
+ transform: translateY(-5px) scale(1.02);
+ box-shadow:
+ 0 10px 30px var(--glow-purple),
+ 0 0 20px rgba(138, 43, 226, 0.1),
+ inset 0 1px 0 rgba(255, 255, 255, 0.1);
+}
+
+.analyze-btn:hover:not(:disabled) {
+ transform: translateY(-3px);
+ box-shadow:
+ 0 8px 25px var(--glow-green),
+ 0 0 15px rgba(0, 255, 136, 0.2);
+}
+
+.action-btn:hover:not(:disabled) {
+ transform: translateY(-1px);
+ box-shadow: 0 5px 15px var(--glow-purple);
+}
+
+/* 图片加载动画 */
+.media-preview img {
+ transition: all 0.3s ease;
+}
+
+.media-preview img:hover {
+ transform: scale(1.05);
+ box-shadow: 0 8px 25px var(--glow-green);
+}
+
+.image-placeholder {
+ background: linear-gradient(135deg,
+ var(--glow-green) 0%,
+ var(--glow-purple) 100%);
+ border: 2px dashed rgba(138, 43, 226, 0.3);
+ display: none;
+ align-items: center;
+ justify-content: center;
+ min-height: 200px;
+ border-radius: var(--radius-lg);
+ color: var(--text-secondary);
+ font-size: 0.9rem;
+}
+
+/* 手机设备 */
+@media (max-width: 768px) {
+ .main-container {
+ padding: var(--spacing-sm);
+ }
+
+ .header-content {
+ padding: var(--spacing-md);
+ }
+
+ .title {
+ font-size: 1.8rem;
+ }
+
+ .subtitle {
+ font-size: 0.9rem;
+ }
+
+ .logo-icon {
+ font-size: 2rem;
+ }
+
+ .url-input {
+ font-size: 16px; /* 防止iOS缩放 */
+ padding: var(--spacing-sm) var(--spacing-sm) var(--spacing-sm) 3rem;
+ }
+
+ .input-icon {
+ left: var(--spacing-sm);
+ font-size: 1rem;
+ }
+
+ .analyze-btn {
+ padding: var(--spacing-sm) var(--spacing-md);
+ font-size: 1rem;
+ }
+
+ .scanner {
+ width: 150px;
+ height: 150px;
+ }
+
+ .loading-title {
+ font-size: 1.3rem;
+ }
+
+ .loading-subtitle {
+ font-size: 0.9rem;
+ }
+
+ .results-title {
+ font-size: 1.3rem;
+ }
+
+ .action-btn {
+ font-size: 0.8rem;
+ padding: var(--spacing-xs) var(--spacing-sm);
+ }
+
+ .info-section {
+ padding: var(--spacing-md);
+ }
+
+ .section-header {
+ font-size: 1.1rem;
+ }
+
+ .media-details {
+ grid-template-columns: 1fr;
+ }
+
+ .toast-container {
+ top: var(--spacing-sm);
+ right: var(--spacing-sm);
+ left: var(--spacing-sm);
+ transform: translateY(-100%);
+ }
+
+ .toast-container.show {
+ transform: translateY(0);
+ }
+
+ .footer-text {
+ font-size: 0.8rem;
+ }
+
+ .footer-links {
+ font-size: 0.7rem;
+ }
+
+ /* 移动设备上禁用部分悬浮效果 */
+ .og-card:hover {
+ transform: none;
+ }
+
+ .media-preview img:hover {
+ transform: none;
+ }
+}
+
+/* 小屏手机设备 */
+@media (max-width: 480px) {
+ .main-container {
+ padding: var(--spacing-xs);
+ }
+
+ .title {
+ font-size: 1.5rem;
+ }
+
+ .logo-section {
+ flex-direction: column;
+ gap: var(--spacing-sm);
+ }
+
+ .scanner {
+ width: 120px;
+ height: 120px;
+ }
+
+ .error-content {
+ padding: var(--spacing-md);
+ }
+
+ .error-icon {
+ font-size: 2.5rem;
+ }
+
+ .error-title {
+ font-size: 1.3rem;
+ }
+}
+
+/* 高分辨率屏幕优化 */
+@media (min-width: 1440px) {
+ .main-container {
+ max-width: 1600px;
+ }
+
+ .title {
+ font-size: 3rem;
+ }
+
+ .url-input {
+ font-size: 1.2rem;
+ }
+
+ .analyze-btn {
+ font-size: 1.2rem;
+ padding: var(--spacing-lg) var(--spacing-xl);
+ }
+}
+
+/* 深色模式优化 */
+@media (prefers-color-scheme: dark) {
+ :root {
+ --primary-dark: #000000;
+ --secondary-dark: #111111;
+ --accent-dark: #222222;
+ }
+}
+
+/* 减少动画偏好 */
+@media (prefers-reduced-motion: reduce) {
+ * {
+ animation-duration: 0.01ms !important;
+ animation-iteration-count: 1 !important;
+ transition-duration: 0.01ms !important;
+ }
+}
+
+/* 打印样式 */
+@media print {
+ .background-container,
+ .header,
+ .query-section,
+ .loading-container,
+ .error-container,
+ .toast-container,
+ .footer {
+ display: none;
+ }
+
+ .results-section {
+ margin: 0;
+ padding: 0;
+ }
+
+ .og-card {
+ border: 1px solid #000;
+ box-shadow: none;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/index.html b/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/index.html
index 2f603665..14ef75e5 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/index.html
+++ b/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/index.html
@@ -1,227 +1,227 @@
-
-
-
-
-
- 链接OG信息查询 - 神秘解析器
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 正在解析链接
- 深度扫描元数据中...
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ 链接OG信息查询 - 神秘解析器
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 正在解析链接
+ 深度扫描元数据中...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/js/script.js b/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/js/script.js
index f7059a9c..8a14386a 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/js/script.js
@@ -1,617 +1,617 @@
-// 链接OG信息查询 - JavaScript功能代码
-// 神秘高级风格的交互体验
-
-class OGAnalyzer {
- constructor() {
- this.apiUrl = 'https://60s.api.shumengya.top/v2/og';
- this.isAnalyzing = false;
- this.currentUrl = '';
- this.animationFrameId = null;
-
- this.init();
- }
-
- init() {
- this.bindEvents();
- this.createBackgroundEffects();
- this.initializeAnimations();
- this.showWelcomeMessage();
- this.initPageAnimations();
- }
-
- // 初始化页面动画
- initPageAnimations() {
- // 延迟添加动画类,确保CSS已加载
- setTimeout(() => {
- const header = document.querySelector('.header');
- const querySection = document.querySelector('.query-section');
-
- if (header) header.classList.add('animate-in');
- if (querySection) querySection.classList.add('animate-in');
- }, 100);
- }
-
- bindEvents() {
- const urlInput = document.getElementById('url-input');
- const analyzeBtn = document.getElementById('analyze-btn');
- const copyBtn = document.getElementById('copy-btn');
- const clearBtn = document.getElementById('clear-btn');
-
- // 输入框事件
- urlInput.addEventListener('input', (e) => this.handleUrlInput(e));
- urlInput.addEventListener('keypress', (e) => {
- if (e.key === 'Enter' && !this.isAnalyzing) {
- this.analyzeUrl();
- }
- });
- urlInput.addEventListener('focus', () => this.handleInputFocus());
- urlInput.addEventListener('blur', () => this.handleInputBlur());
-
- // 按钮事件
- analyzeBtn.addEventListener('click', () => this.analyzeUrl());
- copyBtn.addEventListener('click', () => this.copyResults());
- clearBtn.addEventListener('click', () => this.clearResults());
-
- // 键盘快捷键
- document.addEventListener('keydown', (e) => this.handleKeyboard(e));
- }
-
- handleUrlInput(e) {
- const url = e.target.value.trim();
- const analyzeBtn = document.getElementById('analyze-btn');
-
- if (this.isValidUrl(url)) {
- analyzeBtn.classList.add('ready');
- e.target.classList.remove('error');
- } else {
- analyzeBtn.classList.remove('ready');
- if (url.length > 0) {
- e.target.classList.add('error');
- } else {
- e.target.classList.remove('error');
- }
- }
- }
-
- handleInputFocus() {
- const inputContainer = document.querySelector('.input-container');
- inputContainer.classList.add('focused');
- this.createInputGlow();
- }
-
- handleInputBlur() {
- const inputContainer = document.querySelector('.input-container');
- inputContainer.classList.remove('focused');
- }
-
- handleKeyboard(e) {
- // Ctrl/Cmd + Enter 快速分析
- if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {
- e.preventDefault();
- if (!this.isAnalyzing) {
- this.analyzeUrl();
- }
- }
-
- // Escape 清除结果
- if (e.key === 'Escape') {
- this.clearResults();
- }
- }
-
- isValidUrl(string) {
- try {
- const url = new URL(string);
- return url.protocol === 'http:' || url.protocol === 'https:';
- } catch (_) {
- return false;
- }
- }
-
- async analyzeUrl() {
- const urlInput = document.getElementById('url-input');
- const url = urlInput.value.trim();
-
- if (!this.isValidUrl(url)) {
- this.showError('请输入有效的URL地址');
- this.shakeInput();
- return;
- }
-
- if (this.isAnalyzing) {
- return;
- }
-
- this.currentUrl = url;
- this.isAnalyzing = true;
- this.startTime = Date.now(); // 记录开始时间
- this.showLoading();
- this.hideError();
- this.hideResults();
-
- try {
- const response = await fetch(`${this.apiUrl}?url=${encodeURIComponent(url)}`);
-
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
- }
-
- const data = await response.json();
-
- if (data.code === 200 && data.data) {
- await this.displayResults(data.data);
- this.showSuccessMessage('分析完成!');
-
- // 添加按钮闪烁效果
- const analyzeBtn = document.getElementById('analyze-btn');
- analyzeBtn.classList.add('flash');
- setTimeout(() => {
- analyzeBtn.classList.remove('flash');
- }, 300);
- } else {
- throw new Error(data.message || '获取OG信息失败');
- }
- } catch (error) {
- console.error('分析失败:', error);
- this.showError(`分析失败: ${error.message}`);
- } finally {
- this.isAnalyzing = false;
- this.hideLoading();
- }
- }
-
- showLoading() {
- const loadingElement = document.getElementById('loading');
- const analyzeBtn = document.getElementById('analyze-btn');
-
- loadingElement.classList.add('active');
- analyzeBtn.disabled = true;
- analyzeBtn.textContent = '分析中...';
-
- this.startScannerAnimation();
- }
-
- hideLoading() {
- const loadingElement = document.getElementById('loading');
- const analyzeBtn = document.getElementById('analyze-btn');
-
- loadingElement.classList.remove('active');
- analyzeBtn.disabled = false;
- analyzeBtn.textContent = '开始分析';
-
- this.stopScannerAnimation();
- }
-
- async displayResults(data) {
- const resultsElement = document.getElementById('results');
- const ogCard = document.getElementById('og-card');
-
- // 检查是否有有效数据 - 放宽检查条件,只要有任何非空字段就显示
- const hasValidData = Object.values(data).some(value => {
- if (value === null || value === undefined) return false;
- if (typeof value === 'string') return value.trim() !== '';
- return true; // 其他类型的值都认为是有效的
- });
-
- if (!hasValidData) {
- this.showError('该链接暂无可获取的OG信息,请检查链接是否正确或稍后重试');
- return;
- }
-
- // 基础信息 - 只显示有数据的字段
- this.updateElementWithVisibility('og-title', data.title, '标题');
- this.updateElementWithVisibility('og-description', data.description, '描述');
- this.updateElement('og-url', data.url || this.currentUrl); // URL始终显示
- this.updateElementWithVisibility('og-site-name', data.site_name, '网站名称');
- this.updateElement('og-type', data.type || 'website'); // 类型始终显示
-
- // 媒体信息
- this.updateImageElementWithVisibility('og-image', data.image);
- this.updateElementWithVisibility('og-image-alt', data.image_alt, '图片描述');
-
- // 技术信息
- this.updateElementWithVisibility('og-locale', data.locale, '语言');
- this.updateElementWithVisibility('og-updated-time', this.formatDate(data.updated_time), '更新时间');
- this.updateElement('response-time', `${Date.now() - this.startTime}ms`); // 响应时间始终显示
-
- // 显示结果
- resultsElement.style.display = 'block';
- resultsElement.classList.add('active');
-
- // 添加动画效果
- await this.animateResults();
-
- // 启用操作按钮
- document.getElementById('copy-btn').disabled = false;
- document.getElementById('clear-btn').disabled = false;
- }
-
- updateElement(id, content) {
- const element = document.getElementById(id);
- if (element) {
- element.textContent = content;
- }
- }
-
- updateElementWithVisibility(id, content, fieldName) {
- const element = document.getElementById(id);
- if (!element) return;
-
- const parentItem = element.closest('.info-item');
- if (!parentItem) return;
-
- if (content && content.trim() !== '') {
- element.textContent = content;
- parentItem.style.display = 'block';
- } else {
- parentItem.style.display = 'none';
- }
- }
-
- updateImageElement(id, imageSrc) {
- const element = document.getElementById(id);
- if (element && imageSrc) {
- element.src = imageSrc;
- element.style.display = 'block';
- element.onerror = () => {
- element.style.display = 'none';
- const placeholder = element.nextElementSibling;
- if (placeholder && placeholder.classList.contains('image-placeholder')) {
- placeholder.style.display = 'flex';
- }
- };
- } else if (element) {
- element.style.display = 'none';
- const placeholder = element.nextElementSibling;
- if (placeholder && placeholder.classList.contains('image-placeholder')) {
- placeholder.style.display = 'flex';
- }
- }
- }
-
- updateImageElementWithVisibility(id, imageSrc) {
- const element = document.getElementById(id);
- const mediaSection = document.querySelector('.media-info');
- const mediaPreview = document.getElementById('media-preview');
-
- if (imageSrc && imageSrc.trim() !== '') {
- element.textContent = imageSrc;
- if (mediaSection) mediaSection.style.display = 'block';
-
- if (mediaPreview) {
- mediaPreview.innerHTML = `
-
-
-
- 图片加载失败
-
- `;
- }
- } else {
- if (mediaSection) mediaSection.style.display = 'none';
- }
- }
-
- formatDate(timestamp) {
- if (!timestamp) return '未知';
- try {
- const date = new Date(timestamp);
- return date.toLocaleString('zh-CN');
- } catch (e) {
- return '格式错误';
- }
- }
-
- async animateResults() {
- const cards = document.querySelectorAll('.info-card');
-
- for (let i = 0; i < cards.length; i++) {
- setTimeout(() => {
- cards[i].classList.add('animate-in');
- }, i * 100);
- }
-
- // 等待动画完成
- await new Promise(resolve => setTimeout(resolve, cards.length * 100 + 300));
- }
-
- showError(message) {
- const errorElement = document.getElementById('error-message');
- const errorText = errorElement.querySelector('.error-text');
- const inputContainer = document.querySelector('.input-container');
-
- errorText.textContent = message;
- errorElement.classList.add('active');
-
- // 添加震动效果
- if (inputContainer) {
- inputContainer.classList.add('shake');
- setTimeout(() => {
- inputContainer.classList.remove('shake');
- }, 600);
- }
-
- // 自动隐藏错误信息
- setTimeout(() => {
- this.hideError();
- }, 5000);
- }
-
- hideError() {
- const errorElement = document.getElementById('error-message');
- errorElement.classList.remove('active');
- }
-
- hideResults() {
- const resultsElement = document.getElementById('results');
- resultsElement.style.display = 'none';
- resultsElement.classList.remove('active');
-
- // 重置动画状态
- const cards = document.querySelectorAll('.info-card');
- cards.forEach(card => card.classList.remove('animate-in'));
- }
-
- showSuccessMessage(message) {
- const tipElement = document.getElementById('tip-message');
- const tipText = tipElement.querySelector('.tip-text');
-
- tipText.textContent = message;
- tipElement.classList.add('active');
-
- setTimeout(() => {
- tipElement.classList.remove('active');
- }, 3000);
- }
-
- shakeInput() {
- const inputContainer = document.querySelector('.input-container');
- inputContainer.classList.add('shake');
-
- setTimeout(() => {
- inputContainer.classList.remove('shake');
- }, 600);
- }
-
- copyResults() {
- const ogData = {
- title: document.getElementById('og-title').textContent,
- description: document.getElementById('og-description').textContent,
- url: document.getElementById('og-url').textContent,
- site_name: document.getElementById('og-site-name').textContent,
- type: document.getElementById('og-type').textContent,
- image: document.getElementById('og-image').src,
- locale: document.getElementById('og-locale').textContent
- };
-
- const jsonString = JSON.stringify(ogData, null, 2);
-
- navigator.clipboard.writeText(jsonString).then(() => {
- this.showSuccessMessage('结果已复制到剪贴板!');
- this.flashCopyButton();
- }).catch(err => {
- console.error('复制失败:', err);
- this.showError('复制失败,请手动选择内容');
- });
- }
-
- flashCopyButton() {
- const copyBtn = document.getElementById('copy-btn');
- copyBtn.classList.add('flash');
-
- setTimeout(() => {
- copyBtn.classList.remove('flash');
- }, 300);
- }
-
- clearResults() {
- const urlInput = document.getElementById('url-input');
- const resultsElement = document.getElementById('results');
- const errorElement = document.getElementById('error-message');
-
- urlInput.value = '';
- urlInput.classList.remove('error');
- resultsElement.style.display = 'none';
- resultsElement.classList.remove('active');
- errorElement.classList.remove('active');
-
- document.getElementById('analyze-btn').classList.remove('ready');
- document.getElementById('copy-btn').disabled = true;
- document.getElementById('clear-btn').disabled = true;
-
- this.currentUrl = '';
-
- // 重置所有字段的显示状态
- const infoItems = document.querySelectorAll('.info-item');
- infoItems.forEach(item => item.style.display = 'block');
-
- const mediaSection = document.querySelector('.media-info');
- if (mediaSection) mediaSection.style.display = 'block';
-
- // 重置动画状态
- const cards = document.querySelectorAll('.info-card');
- cards.forEach(card => card.classList.remove('animate-in'));
-
- this.showSuccessMessage('已清除所有内容');
- }
-
- createBackgroundEffects() {
- const container = document.querySelector('.background-container');
-
- // 创建各种背景效果层
- const effects = [
- 'geometric-grid',
- 'neural-network',
- 'particle-system',
- 'scan-lines',
- 'holographic-overlay',
- 'data-stream',
- 'quantum-waves'
- ];
-
- effects.forEach(effectClass => {
- const layer = document.createElement('div');
- layer.className = effectClass;
- container.appendChild(layer);
- });
- }
-
- createInputGlow() {
- const inputContainer = document.querySelector('.input-container');
-
- // 创建光晕效果
- const glow = document.createElement('div');
- glow.className = 'input-glow';
- inputContainer.appendChild(glow);
-
- setTimeout(() => {
- if (glow.parentNode) {
- glow.remove();
- }
- }, 2000);
- }
-
- startScannerAnimation() {
- const scanner = document.querySelector('.scanner');
- if (scanner) {
- scanner.classList.add('active');
- }
- }
-
- stopScannerAnimation() {
- const scanner = document.querySelector('.scanner');
- if (scanner) {
- scanner.classList.remove('active');
- }
- }
-
- initializeAnimations() {
- // 初始化页面动画
- const header = document.querySelector('.header');
- const querySection = document.querySelector('.query-section');
-
- setTimeout(() => {
- header.classList.add('animate-in');
- }, 100);
-
- setTimeout(() => {
- querySection.classList.add('animate-in');
- }, 300);
- }
-
- showWelcomeMessage() {
- const tips = [
- '支持分析网页的标题、描述、图片等元信息',
- '可以预览社交媒体分享时的显示效果',
- '检测网页的SEO优化情况',
- '分析Open Graph协议标签'
- ];
-
- setTimeout(() => {
- this.showSuccessMessage('欢迎使用链接OG信息分析器!');
- }, 1000);
-
- // 显示提示信息
- this.showTips(tips);
- }
-
- // 显示提示信息
- showTips(tips) {
- const tipElement = document.getElementById('tip-message');
- const tipText = tipElement.querySelector('.tip-text');
-
- let currentTip = 0;
-
- const showNextTip = () => {
- tipText.textContent = tips[currentTip];
- tipElement.classList.add('active');
- tipElement.style.animation = 'fadeInUp 0.5s ease-out';
-
- setTimeout(() => {
- tipElement.style.animation = 'fadeOutDown 0.5s ease-in';
- setTimeout(() => {
- tipElement.classList.remove('active');
- currentTip = (currentTip + 1) % tips.length;
- }, 500);
- }, 3000);
- };
-
- // 首次显示
- setTimeout(showNextTip, 2000);
-
- // 每8秒显示一次
- setInterval(showNextTip, 8000);
- }
-}
-
-// 工具函数
-function debounce(func, wait) {
- let timeout;
- return function executedFunction(...args) {
- const later = () => {
- clearTimeout(timeout);
- func(...args);
- };
- clearTimeout(timeout);
- timeout = setTimeout(later, wait);
- };
-}
-
-function throttle(func, limit) {
- let inThrottle;
- return function() {
- const args = arguments;
- const context = this;
- if (!inThrottle) {
- func.apply(context, args);
- inThrottle = true;
- setTimeout(() => inThrottle = false, limit);
- }
- }
-}
-
-// 页面加载完成后初始化
-document.addEventListener('DOMContentLoaded', () => {
- // 检查必要的DOM元素
- const requiredElements = [
- 'url-input', 'analyze-btn', 'copy-btn', 'clear-btn',
- 'loading', 'results', 'error-message', 'tip-message'
- ];
-
- const missingElements = requiredElements.filter(id => !document.getElementById(id));
-
- if (missingElements.length > 0) {
- console.error('缺少必要的DOM元素:', missingElements);
- return;
- }
-
- // 初始化应用
- window.ogAnalyzer = new OGAnalyzer();
-
- // 添加全局错误处理
- window.addEventListener('error', (e) => {
- console.error('全局错误:', e.error);
- if (window.ogAnalyzer) {
- window.ogAnalyzer.showError('发生未知错误,请刷新页面重试');
- }
- });
-
- // 添加网络状态监听
- window.addEventListener('online', () => {
- if (window.ogAnalyzer) {
- window.ogAnalyzer.showSuccessMessage('网络连接已恢复');
- }
- });
-
- window.addEventListener('offline', () => {
- if (window.ogAnalyzer) {
- window.ogAnalyzer.showError('网络连接已断开');
- }
- });
-});
-
-// 导出给其他模块使用
-if (typeof module !== 'undefined' && module.exports) {
- module.exports = { OGAnalyzer, debounce, throttle };
+// 链接OG信息查询 - JavaScript功能代码
+// 神秘高级风格的交互体验
+
+class OGAnalyzer {
+ constructor() {
+ this.apiUrl = 'https://60s.api.shumengya.top/v2/og';
+ this.isAnalyzing = false;
+ this.currentUrl = '';
+ this.animationFrameId = null;
+
+ this.init();
+ }
+
+ init() {
+ this.bindEvents();
+ this.createBackgroundEffects();
+ this.initializeAnimations();
+ this.showWelcomeMessage();
+ this.initPageAnimations();
+ }
+
+ // 初始化页面动画
+ initPageAnimations() {
+ // 延迟添加动画类,确保CSS已加载
+ setTimeout(() => {
+ const header = document.querySelector('.header');
+ const querySection = document.querySelector('.query-section');
+
+ if (header) header.classList.add('animate-in');
+ if (querySection) querySection.classList.add('animate-in');
+ }, 100);
+ }
+
+ bindEvents() {
+ const urlInput = document.getElementById('url-input');
+ const analyzeBtn = document.getElementById('analyze-btn');
+ const copyBtn = document.getElementById('copy-btn');
+ const clearBtn = document.getElementById('clear-btn');
+
+ // 输入框事件
+ urlInput.addEventListener('input', (e) => this.handleUrlInput(e));
+ urlInput.addEventListener('keypress', (e) => {
+ if (e.key === 'Enter' && !this.isAnalyzing) {
+ this.analyzeUrl();
+ }
+ });
+ urlInput.addEventListener('focus', () => this.handleInputFocus());
+ urlInput.addEventListener('blur', () => this.handleInputBlur());
+
+ // 按钮事件
+ analyzeBtn.addEventListener('click', () => this.analyzeUrl());
+ copyBtn.addEventListener('click', () => this.copyResults());
+ clearBtn.addEventListener('click', () => this.clearResults());
+
+ // 键盘快捷键
+ document.addEventListener('keydown', (e) => this.handleKeyboard(e));
+ }
+
+ handleUrlInput(e) {
+ const url = e.target.value.trim();
+ const analyzeBtn = document.getElementById('analyze-btn');
+
+ if (this.isValidUrl(url)) {
+ analyzeBtn.classList.add('ready');
+ e.target.classList.remove('error');
+ } else {
+ analyzeBtn.classList.remove('ready');
+ if (url.length > 0) {
+ e.target.classList.add('error');
+ } else {
+ e.target.classList.remove('error');
+ }
+ }
+ }
+
+ handleInputFocus() {
+ const inputContainer = document.querySelector('.input-container');
+ inputContainer.classList.add('focused');
+ this.createInputGlow();
+ }
+
+ handleInputBlur() {
+ const inputContainer = document.querySelector('.input-container');
+ inputContainer.classList.remove('focused');
+ }
+
+ handleKeyboard(e) {
+ // Ctrl/Cmd + Enter 快速分析
+ if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {
+ e.preventDefault();
+ if (!this.isAnalyzing) {
+ this.analyzeUrl();
+ }
+ }
+
+ // Escape 清除结果
+ if (e.key === 'Escape') {
+ this.clearResults();
+ }
+ }
+
+ isValidUrl(string) {
+ try {
+ const url = new URL(string);
+ return url.protocol === 'http:' || url.protocol === 'https:';
+ } catch (_) {
+ return false;
+ }
+ }
+
+ async analyzeUrl() {
+ const urlInput = document.getElementById('url-input');
+ const url = urlInput.value.trim();
+
+ if (!this.isValidUrl(url)) {
+ this.showError('请输入有效的URL地址');
+ this.shakeInput();
+ return;
+ }
+
+ if (this.isAnalyzing) {
+ return;
+ }
+
+ this.currentUrl = url;
+ this.isAnalyzing = true;
+ this.startTime = Date.now(); // 记录开始时间
+ this.showLoading();
+ this.hideError();
+ this.hideResults();
+
+ try {
+ const response = await fetch(`${this.apiUrl}?url=${encodeURIComponent(url)}`);
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+ }
+
+ const data = await response.json();
+
+ if (data.code === 200 && data.data) {
+ await this.displayResults(data.data);
+ this.showSuccessMessage('分析完成!');
+
+ // 添加按钮闪烁效果
+ const analyzeBtn = document.getElementById('analyze-btn');
+ analyzeBtn.classList.add('flash');
+ setTimeout(() => {
+ analyzeBtn.classList.remove('flash');
+ }, 300);
+ } else {
+ throw new Error(data.message || '获取OG信息失败');
+ }
+ } catch (error) {
+ console.error('分析失败:', error);
+ this.showError(`分析失败: ${error.message}`);
+ } finally {
+ this.isAnalyzing = false;
+ this.hideLoading();
+ }
+ }
+
+ showLoading() {
+ const loadingElement = document.getElementById('loading');
+ const analyzeBtn = document.getElementById('analyze-btn');
+
+ loadingElement.classList.add('active');
+ analyzeBtn.disabled = true;
+ analyzeBtn.textContent = '分析中...';
+
+ this.startScannerAnimation();
+ }
+
+ hideLoading() {
+ const loadingElement = document.getElementById('loading');
+ const analyzeBtn = document.getElementById('analyze-btn');
+
+ loadingElement.classList.remove('active');
+ analyzeBtn.disabled = false;
+ analyzeBtn.textContent = '开始分析';
+
+ this.stopScannerAnimation();
+ }
+
+ async displayResults(data) {
+ const resultsElement = document.getElementById('results');
+ const ogCard = document.getElementById('og-card');
+
+ // 检查是否有有效数据 - 放宽检查条件,只要有任何非空字段就显示
+ const hasValidData = Object.values(data).some(value => {
+ if (value === null || value === undefined) return false;
+ if (typeof value === 'string') return value.trim() !== '';
+ return true; // 其他类型的值都认为是有效的
+ });
+
+ if (!hasValidData) {
+ this.showError('该链接暂无可获取的OG信息,请检查链接是否正确或稍后重试');
+ return;
+ }
+
+ // 基础信息 - 只显示有数据的字段
+ this.updateElementWithVisibility('og-title', data.title, '标题');
+ this.updateElementWithVisibility('og-description', data.description, '描述');
+ this.updateElement('og-url', data.url || this.currentUrl); // URL始终显示
+ this.updateElementWithVisibility('og-site-name', data.site_name, '网站名称');
+ this.updateElement('og-type', data.type || 'website'); // 类型始终显示
+
+ // 媒体信息
+ this.updateImageElementWithVisibility('og-image', data.image);
+ this.updateElementWithVisibility('og-image-alt', data.image_alt, '图片描述');
+
+ // 技术信息
+ this.updateElementWithVisibility('og-locale', data.locale, '语言');
+ this.updateElementWithVisibility('og-updated-time', this.formatDate(data.updated_time), '更新时间');
+ this.updateElement('response-time', `${Date.now() - this.startTime}ms`); // 响应时间始终显示
+
+ // 显示结果
+ resultsElement.style.display = 'block';
+ resultsElement.classList.add('active');
+
+ // 添加动画效果
+ await this.animateResults();
+
+ // 启用操作按钮
+ document.getElementById('copy-btn').disabled = false;
+ document.getElementById('clear-btn').disabled = false;
+ }
+
+ updateElement(id, content) {
+ const element = document.getElementById(id);
+ if (element) {
+ element.textContent = content;
+ }
+ }
+
+ updateElementWithVisibility(id, content, fieldName) {
+ const element = document.getElementById(id);
+ if (!element) return;
+
+ const parentItem = element.closest('.info-item');
+ if (!parentItem) return;
+
+ if (content && content.trim() !== '') {
+ element.textContent = content;
+ parentItem.style.display = 'block';
+ } else {
+ parentItem.style.display = 'none';
+ }
+ }
+
+ updateImageElement(id, imageSrc) {
+ const element = document.getElementById(id);
+ if (element && imageSrc) {
+ element.src = imageSrc;
+ element.style.display = 'block';
+ element.onerror = () => {
+ element.style.display = 'none';
+ const placeholder = element.nextElementSibling;
+ if (placeholder && placeholder.classList.contains('image-placeholder')) {
+ placeholder.style.display = 'flex';
+ }
+ };
+ } else if (element) {
+ element.style.display = 'none';
+ const placeholder = element.nextElementSibling;
+ if (placeholder && placeholder.classList.contains('image-placeholder')) {
+ placeholder.style.display = 'flex';
+ }
+ }
+ }
+
+ updateImageElementWithVisibility(id, imageSrc) {
+ const element = document.getElementById(id);
+ const mediaSection = document.querySelector('.media-info');
+ const mediaPreview = document.getElementById('media-preview');
+
+ if (imageSrc && imageSrc.trim() !== '') {
+ element.textContent = imageSrc;
+ if (mediaSection) mediaSection.style.display = 'block';
+
+ if (mediaPreview) {
+ mediaPreview.innerHTML = `
+
+
+
+ 图片加载失败
+
+ `;
+ }
+ } else {
+ if (mediaSection) mediaSection.style.display = 'none';
+ }
+ }
+
+ formatDate(timestamp) {
+ if (!timestamp) return '未知';
+ try {
+ const date = new Date(timestamp);
+ return date.toLocaleString('zh-CN');
+ } catch (e) {
+ return '格式错误';
+ }
+ }
+
+ async animateResults() {
+ const cards = document.querySelectorAll('.info-card');
+
+ for (let i = 0; i < cards.length; i++) {
+ setTimeout(() => {
+ cards[i].classList.add('animate-in');
+ }, i * 100);
+ }
+
+ // 等待动画完成
+ await new Promise(resolve => setTimeout(resolve, cards.length * 100 + 300));
+ }
+
+ showError(message) {
+ const errorElement = document.getElementById('error-message');
+ const errorText = errorElement.querySelector('.error-text');
+ const inputContainer = document.querySelector('.input-container');
+
+ errorText.textContent = message;
+ errorElement.classList.add('active');
+
+ // 添加震动效果
+ if (inputContainer) {
+ inputContainer.classList.add('shake');
+ setTimeout(() => {
+ inputContainer.classList.remove('shake');
+ }, 600);
+ }
+
+ // 自动隐藏错误信息
+ setTimeout(() => {
+ this.hideError();
+ }, 5000);
+ }
+
+ hideError() {
+ const errorElement = document.getElementById('error-message');
+ errorElement.classList.remove('active');
+ }
+
+ hideResults() {
+ const resultsElement = document.getElementById('results');
+ resultsElement.style.display = 'none';
+ resultsElement.classList.remove('active');
+
+ // 重置动画状态
+ const cards = document.querySelectorAll('.info-card');
+ cards.forEach(card => card.classList.remove('animate-in'));
+ }
+
+ showSuccessMessage(message) {
+ const tipElement = document.getElementById('tip-message');
+ const tipText = tipElement.querySelector('.tip-text');
+
+ tipText.textContent = message;
+ tipElement.classList.add('active');
+
+ setTimeout(() => {
+ tipElement.classList.remove('active');
+ }, 3000);
+ }
+
+ shakeInput() {
+ const inputContainer = document.querySelector('.input-container');
+ inputContainer.classList.add('shake');
+
+ setTimeout(() => {
+ inputContainer.classList.remove('shake');
+ }, 600);
+ }
+
+ copyResults() {
+ const ogData = {
+ title: document.getElementById('og-title').textContent,
+ description: document.getElementById('og-description').textContent,
+ url: document.getElementById('og-url').textContent,
+ site_name: document.getElementById('og-site-name').textContent,
+ type: document.getElementById('og-type').textContent,
+ image: document.getElementById('og-image').src,
+ locale: document.getElementById('og-locale').textContent
+ };
+
+ const jsonString = JSON.stringify(ogData, null, 2);
+
+ navigator.clipboard.writeText(jsonString).then(() => {
+ this.showSuccessMessage('结果已复制到剪贴板!');
+ this.flashCopyButton();
+ }).catch(err => {
+ console.error('复制失败:', err);
+ this.showError('复制失败,请手动选择内容');
+ });
+ }
+
+ flashCopyButton() {
+ const copyBtn = document.getElementById('copy-btn');
+ copyBtn.classList.add('flash');
+
+ setTimeout(() => {
+ copyBtn.classList.remove('flash');
+ }, 300);
+ }
+
+ clearResults() {
+ const urlInput = document.getElementById('url-input');
+ const resultsElement = document.getElementById('results');
+ const errorElement = document.getElementById('error-message');
+
+ urlInput.value = '';
+ urlInput.classList.remove('error');
+ resultsElement.style.display = 'none';
+ resultsElement.classList.remove('active');
+ errorElement.classList.remove('active');
+
+ document.getElementById('analyze-btn').classList.remove('ready');
+ document.getElementById('copy-btn').disabled = true;
+ document.getElementById('clear-btn').disabled = true;
+
+ this.currentUrl = '';
+
+ // 重置所有字段的显示状态
+ const infoItems = document.querySelectorAll('.info-item');
+ infoItems.forEach(item => item.style.display = 'block');
+
+ const mediaSection = document.querySelector('.media-info');
+ if (mediaSection) mediaSection.style.display = 'block';
+
+ // 重置动画状态
+ const cards = document.querySelectorAll('.info-card');
+ cards.forEach(card => card.classList.remove('animate-in'));
+
+ this.showSuccessMessage('已清除所有内容');
+ }
+
+ createBackgroundEffects() {
+ const container = document.querySelector('.background-container');
+
+ // 创建各种背景效果层
+ const effects = [
+ 'geometric-grid',
+ 'neural-network',
+ 'particle-system',
+ 'scan-lines',
+ 'holographic-overlay',
+ 'data-stream',
+ 'quantum-waves'
+ ];
+
+ effects.forEach(effectClass => {
+ const layer = document.createElement('div');
+ layer.className = effectClass;
+ container.appendChild(layer);
+ });
+ }
+
+ createInputGlow() {
+ const inputContainer = document.querySelector('.input-container');
+
+ // 创建光晕效果
+ const glow = document.createElement('div');
+ glow.className = 'input-glow';
+ inputContainer.appendChild(glow);
+
+ setTimeout(() => {
+ if (glow.parentNode) {
+ glow.remove();
+ }
+ }, 2000);
+ }
+
+ startScannerAnimation() {
+ const scanner = document.querySelector('.scanner');
+ if (scanner) {
+ scanner.classList.add('active');
+ }
+ }
+
+ stopScannerAnimation() {
+ const scanner = document.querySelector('.scanner');
+ if (scanner) {
+ scanner.classList.remove('active');
+ }
+ }
+
+ initializeAnimations() {
+ // 初始化页面动画
+ const header = document.querySelector('.header');
+ const querySection = document.querySelector('.query-section');
+
+ setTimeout(() => {
+ header.classList.add('animate-in');
+ }, 100);
+
+ setTimeout(() => {
+ querySection.classList.add('animate-in');
+ }, 300);
+ }
+
+ showWelcomeMessage() {
+ const tips = [
+ '支持分析网页的标题、描述、图片等元信息',
+ '可以预览社交媒体分享时的显示效果',
+ '检测网页的SEO优化情况',
+ '分析Open Graph协议标签'
+ ];
+
+ setTimeout(() => {
+ this.showSuccessMessage('欢迎使用链接OG信息分析器!');
+ }, 1000);
+
+ // 显示提示信息
+ this.showTips(tips);
+ }
+
+ // 显示提示信息
+ showTips(tips) {
+ const tipElement = document.getElementById('tip-message');
+ const tipText = tipElement.querySelector('.tip-text');
+
+ let currentTip = 0;
+
+ const showNextTip = () => {
+ tipText.textContent = tips[currentTip];
+ tipElement.classList.add('active');
+ tipElement.style.animation = 'fadeInUp 0.5s ease-out';
+
+ setTimeout(() => {
+ tipElement.style.animation = 'fadeOutDown 0.5s ease-in';
+ setTimeout(() => {
+ tipElement.classList.remove('active');
+ currentTip = (currentTip + 1) % tips.length;
+ }, 500);
+ }, 3000);
+ };
+
+ // 首次显示
+ setTimeout(showNextTip, 2000);
+
+ // 每8秒显示一次
+ setInterval(showNextTip, 8000);
+ }
+}
+
+// 工具函数
+function debounce(func, wait) {
+ let timeout;
+ return function executedFunction(...args) {
+ const later = () => {
+ clearTimeout(timeout);
+ func(...args);
+ };
+ clearTimeout(timeout);
+ timeout = setTimeout(later, wait);
+ };
+}
+
+function throttle(func, limit) {
+ let inThrottle;
+ return function() {
+ const args = arguments;
+ const context = this;
+ if (!inThrottle) {
+ func.apply(context, args);
+ inThrottle = true;
+ setTimeout(() => inThrottle = false, limit);
+ }
+ }
+}
+
+// 页面加载完成后初始化
+document.addEventListener('DOMContentLoaded', () => {
+ // 检查必要的DOM元素
+ const requiredElements = [
+ 'url-input', 'analyze-btn', 'copy-btn', 'clear-btn',
+ 'loading', 'results', 'error-message', 'tip-message'
+ ];
+
+ const missingElements = requiredElements.filter(id => !document.getElementById(id));
+
+ if (missingElements.length > 0) {
+ console.error('缺少必要的DOM元素:', missingElements);
+ return;
+ }
+
+ // 初始化应用
+ window.ogAnalyzer = new OGAnalyzer();
+
+ // 添加全局错误处理
+ window.addEventListener('error', (e) => {
+ console.error('全局错误:', e.error);
+ if (window.ogAnalyzer) {
+ window.ogAnalyzer.showError('发生未知错误,请刷新页面重试');
+ }
+ });
+
+ // 添加网络状态监听
+ window.addEventListener('online', () => {
+ if (window.ogAnalyzer) {
+ window.ogAnalyzer.showSuccessMessage('网络连接已恢复');
+ }
+ });
+
+ window.addEventListener('offline', () => {
+ if (window.ogAnalyzer) {
+ window.ogAnalyzer.showError('网络连接已断开');
+ }
+ });
+});
+
+// 导出给其他模块使用
+if (typeof module !== 'undefined' && module.exports) {
+ module.exports = { OGAnalyzer, debounce, throttle };
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/接口集合.json b/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/接口集合.json
index 547b2771..42245813 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/接口集合.json
+++ b/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/接口集合.json
@@ -1,3 +1,3 @@
-[
- "https://60s.api.shumengya.top"
-]
+[
+ "https://60s.api.shumengya.top"
+]
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/返回接口.json
index de8516ab..8d9efe77 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/实用功能/链接OG信息/返回接口.json
@@ -1,66 +1,66 @@
-{
- "code": 200,
- "message": "success",
- "data": {
- "url": "https://example.com",
- "title": "示例网站标题",
- "description": "这是一个示例网站的描述信息,用于展示OG标签解析功能。",
- "image": "https://example.com/og-image.jpg",
- "site_name": "示例网站",
- "type": "website",
- "locale": "zh_CN",
- "author": "网站作者",
- "keywords": "示例,网站,OG标签,元数据",
- "favicon": "https://example.com/favicon.ico",
- "canonical_url": "https://example.com",
- "robots": "index,follow",
- "viewport": "width=device-width, initial-scale=1.0",
- "charset": "UTF-8",
- "language": "zh-CN",
- "published_time": "2024-01-01T00:00:00Z",
- "modified_time": "2024-01-15T12:30:00Z",
- "section": "技术",
- "tags": ["前端", "元数据", "SEO"],
- "twitter": {
- "card": "summary_large_image",
- "site": "@example",
- "creator": "@author",
- "title": "Twitter标题",
- "description": "Twitter描述",
- "image": "https://example.com/twitter-image.jpg"
- },
- "facebook": {
- "app_id": "123456789",
- "admins": "987654321"
- },
- "structured_data": {
- "@context": "https://schema.org",
- "@type": "WebPage",
- "name": "示例网页",
- "description": "示例网页描述",
- "url": "https://example.com"
- },
- "meta_tags": {
- "generator": "WordPress 6.0",
- "theme-color": "#000000",
- "msapplication-TileColor": "#ffffff",
- "apple-mobile-web-app-capable": "yes",
- "apple-mobile-web-app-status-bar-style": "default"
- },
- "performance": {
- "load_time": 1.25,
- "page_size": "2.3MB",
- "requests_count": 45
- },
- "seo_score": {
- "overall": 85,
- "title_score": 90,
- "description_score": 80,
- "image_score": 85,
- "structure_score": 88
- }
- },
- "timestamp": "2024-01-15T12:30:45Z",
- "request_id": "req_123456789",
- "processing_time": 0.85
+{
+ "code": 200,
+ "message": "success",
+ "data": {
+ "url": "https://example.com",
+ "title": "示例网站标题",
+ "description": "这是一个示例网站的描述信息,用于展示OG标签解析功能。",
+ "image": "https://example.com/og-image.jpg",
+ "site_name": "示例网站",
+ "type": "website",
+ "locale": "zh_CN",
+ "author": "网站作者",
+ "keywords": "示例,网站,OG标签,元数据",
+ "favicon": "https://example.com/favicon.ico",
+ "canonical_url": "https://example.com",
+ "robots": "index,follow",
+ "viewport": "width=device-width, initial-scale=1.0",
+ "charset": "UTF-8",
+ "language": "zh-CN",
+ "published_time": "2024-01-01T00:00:00Z",
+ "modified_time": "2024-01-15T12:30:00Z",
+ "section": "技术",
+ "tags": ["前端", "元数据", "SEO"],
+ "twitter": {
+ "card": "summary_large_image",
+ "site": "@example",
+ "creator": "@author",
+ "title": "Twitter标题",
+ "description": "Twitter描述",
+ "image": "https://example.com/twitter-image.jpg"
+ },
+ "facebook": {
+ "app_id": "123456789",
+ "admins": "987654321"
+ },
+ "structured_data": {
+ "@context": "https://schema.org",
+ "@type": "WebPage",
+ "name": "示例网页",
+ "description": "示例网页描述",
+ "url": "https://example.com"
+ },
+ "meta_tags": {
+ "generator": "WordPress 6.0",
+ "theme-color": "#000000",
+ "msapplication-TileColor": "#ffffff",
+ "apple-mobile-web-app-capable": "yes",
+ "apple-mobile-web-app-status-bar-style": "default"
+ },
+ "performance": {
+ "load_time": 1.25,
+ "page_size": "2.3MB",
+ "requests_count": 45
+ },
+ "seo_score": {
+ "overall": 85,
+ "title_score": 90,
+ "description_score": 80,
+ "image_score": 85,
+ "structure_score": 88
+ }
+ },
+ "timestamp": "2024-01-15T12:30:45Z",
+ "request_id": "req_123456789",
+ "processing_time": 0.85
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/css/background.css b/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/css/background.css
index 4108e5b7..fec4d821 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/css/background.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/css/background.css
@@ -1,252 +1,252 @@
-/* 背景样式文件 */
-
-/* 主背景渐变 */
-body {
- background: linear-gradient(135deg, #e8f5e8 0%, #f0f9f0 25%, #f8fdf8 50%, #e8f5e8 75%, #f0f9f0 100%);
- background-size: 400% 400%;
- animation: gradientShift 15s ease infinite;
- position: relative;
- overflow-x: hidden;
-}
-
-/* 背景渐变动画 */
-@keyframes gradientShift {
- 0% {
- background-position: 0% 50%;
- }
- 50% {
- background-position: 100% 50%;
- }
- 100% {
- background-position: 0% 50%;
- }
-}
-
-/* 装饰性背景元素 */
-body::before {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- radial-gradient(circle at 20% 80%, rgba(76, 175, 80, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 80% 20%, rgba(45, 90, 61, 0.08) 0%, transparent 50%),
- radial-gradient(circle at 40% 40%, rgba(76, 175, 80, 0.05) 0%, transparent 50%);
- pointer-events: none;
- z-index: -2;
-}
-
-/* 浮动装饰圆点 */
-body::after {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- radial-gradient(2px 2px at 20px 30px, rgba(76, 175, 80, 0.3), transparent),
- radial-gradient(2px 2px at 40px 70px, rgba(45, 90, 61, 0.2), transparent),
- radial-gradient(1px 1px at 90px 40px, rgba(76, 175, 80, 0.4), transparent),
- radial-gradient(1px 1px at 130px 80px, rgba(45, 90, 61, 0.3), transparent),
- radial-gradient(2px 2px at 160px 30px, rgba(76, 175, 80, 0.2), transparent);
- background-repeat: repeat;
- background-size: 200px 100px;
- animation: floatDots 20s linear infinite;
- pointer-events: none;
- z-index: -1;
- opacity: 0.6;
-}
-
-/* 圆点浮动动画 */
-@keyframes floatDots {
- 0% {
- transform: translateY(0px) translateX(0px);
- }
- 33% {
- transform: translateY(-10px) translateX(5px);
- }
- 66% {
- transform: translateY(5px) translateX(-5px);
- }
- 100% {
- transform: translateY(0px) translateX(0px);
- }
-}
-
-/* 网格背景(可选,默认隐藏) */
-.grid-background {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- linear-gradient(rgba(76, 175, 80, 0.03) 1px, transparent 1px),
- linear-gradient(90deg, rgba(76, 175, 80, 0.03) 1px, transparent 1px);
- background-size: 50px 50px;
- pointer-events: none;
- z-index: -3;
- opacity: 0;
- transition: opacity 0.3s ease;
-}
-
-.grid-background.active {
- opacity: 1;
-}
-
-/* 响应式背景调整 */
-@media (max-width: 768px) {
- body::after {
- background-size: 150px 75px;
- animation-duration: 25s;
- }
-
- body::before {
- background-image:
- radial-gradient(circle at 30% 70%, rgba(76, 175, 80, 0.08) 0%, transparent 50%),
- radial-gradient(circle at 70% 30%, rgba(45, 90, 61, 0.06) 0%, transparent 50%);
- }
-}
-
-@media (max-width: 480px) {
- body {
- animation-duration: 20s;
- }
-
- body::after {
- background-size: 100px 50px;
- opacity: 0.4;
- }
-}
-
-/* 高对比度模式下的背景调整 */
-@media (prefers-contrast: high) {
- body {
- background: #f8fdf8;
- animation: none;
- }
-
- body::before,
- body::after {
- display: none;
- }
-}
-
-/* 减少动画模式下的背景调整 */
-@media (prefers-reduced-motion: reduce) {
- body {
- animation: none;
- background: linear-gradient(135deg, #e8f5e8 0%, #f0f9f0 50%, #f8fdf8 100%);
- }
-
- body::after {
- animation: none;
- }
-
- @keyframes gradientShift {
- 0%, 100% {
- background-position: 0% 50%;
- }
- }
-
- @keyframes floatDots {
- 0%, 100% {
- transform: translateY(0px) translateX(0px);
- }
- }
-}
-
-/* 深色模式支持 */
-@media (prefers-color-scheme: dark) {
- body {
- background: linear-gradient(135deg, #1a2e1a 0%, #2d4a2d 25%, #1f3a1f 50%, #1a2e1a 75%, #2d4a2d 100%);
- }
-
- body::before {
- background-image:
- radial-gradient(circle at 20% 80%, rgba(76, 175, 80, 0.15) 0%, transparent 50%),
- radial-gradient(circle at 80% 20%, rgba(144, 238, 144, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 40% 40%, rgba(76, 175, 80, 0.08) 0%, transparent 50%);
- }
-
- body::after {
- background-image:
- radial-gradient(2px 2px at 20px 30px, rgba(144, 238, 144, 0.4), transparent),
- radial-gradient(2px 2px at 40px 70px, rgba(76, 175, 80, 0.3), transparent),
- radial-gradient(1px 1px at 90px 40px, rgba(144, 238, 144, 0.5), transparent),
- radial-gradient(1px 1px at 130px 80px, rgba(76, 175, 80, 0.4), transparent),
- radial-gradient(2px 2px at 160px 30px, rgba(144, 238, 144, 0.3), transparent);
- }
-}
-
-/* 打印样式 */
-@media print {
- body {
- background: white !important;
- animation: none !important;
- }
-
- body::before,
- body::after {
- display: none !important;
- }
-}
-
-/* 特殊效果:鼠标悬停时的背景变化 */
-@media (hover: hover) {
- .container:hover {
- position: relative;
- }
-
- .container:hover::before {
- content: '';
- position: absolute;
- top: -20px;
- left: -20px;
- right: -20px;
- bottom: -20px;
- background: radial-gradient(circle at var(--mouse-x, 50%) var(--mouse-y, 50%), rgba(76, 175, 80, 0.05) 0%, transparent 50%);
- border-radius: 30px;
- pointer-events: none;
- z-index: -1;
- transition: opacity 0.3s ease;
- }
-}
-
-/* 季节性主题变化(可通过JavaScript控制) */
-.theme-spring body {
- background: linear-gradient(135deg, #e8f5e8 0%, #f0f9f0 25%, #e1f5e1 50%, #f8fdf8 75%, #e8f5e8 100%);
-}
-
-.theme-summer body {
- background: linear-gradient(135deg, #f0f9f0 0%, #e8f5e8 25%, #f8fdf8 50%, #e1f5e1 75%, #f0f9f0 100%);
-}
-
-.theme-autumn body {
- background: linear-gradient(135deg, #f5f0e8 0%, #f9f5f0 25%, #fdf8f0 50%, #f5f0e8 75%, #f9f5f0 100%);
-}
-
-.theme-winter body {
- background: linear-gradient(135deg, #f0f5f8 0%, #f5f9fc 25%, #f8fbfd 50%, #f0f5f8 75%, #f5f9fc 100%);
-}
-
-/* 性能优化:GPU加速 */
-body,
-body::before,
-body::after {
- will-change: transform;
- transform: translateZ(0);
-}
-
-/* 无障碍支持:为屏幕阅读器隐藏装饰元素 */
-body::before,
-body::after {
- speak: none;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
+/* 背景样式文件 */
+
+/* 主背景渐变 */
+body {
+ background: linear-gradient(135deg, #e8f5e8 0%, #f0f9f0 25%, #f8fdf8 50%, #e8f5e8 75%, #f0f9f0 100%);
+ background-size: 400% 400%;
+ animation: gradientShift 15s ease infinite;
+ position: relative;
+ overflow-x: hidden;
+}
+
+/* 背景渐变动画 */
+@keyframes gradientShift {
+ 0% {
+ background-position: 0% 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+ 100% {
+ background-position: 0% 50%;
+ }
+}
+
+/* 装饰性背景元素 */
+body::before {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(circle at 20% 80%, rgba(76, 175, 80, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(45, 90, 61, 0.08) 0%, transparent 50%),
+ radial-gradient(circle at 40% 40%, rgba(76, 175, 80, 0.05) 0%, transparent 50%);
+ pointer-events: none;
+ z-index: -2;
+}
+
+/* 浮动装饰圆点 */
+body::after {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(2px 2px at 20px 30px, rgba(76, 175, 80, 0.3), transparent),
+ radial-gradient(2px 2px at 40px 70px, rgba(45, 90, 61, 0.2), transparent),
+ radial-gradient(1px 1px at 90px 40px, rgba(76, 175, 80, 0.4), transparent),
+ radial-gradient(1px 1px at 130px 80px, rgba(45, 90, 61, 0.3), transparent),
+ radial-gradient(2px 2px at 160px 30px, rgba(76, 175, 80, 0.2), transparent);
+ background-repeat: repeat;
+ background-size: 200px 100px;
+ animation: floatDots 20s linear infinite;
+ pointer-events: none;
+ z-index: -1;
+ opacity: 0.6;
+}
+
+/* 圆点浮动动画 */
+@keyframes floatDots {
+ 0% {
+ transform: translateY(0px) translateX(0px);
+ }
+ 33% {
+ transform: translateY(-10px) translateX(5px);
+ }
+ 66% {
+ transform: translateY(5px) translateX(-5px);
+ }
+ 100% {
+ transform: translateY(0px) translateX(0px);
+ }
+}
+
+/* 网格背景(可选,默认隐藏) */
+.grid-background {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ linear-gradient(rgba(76, 175, 80, 0.03) 1px, transparent 1px),
+ linear-gradient(90deg, rgba(76, 175, 80, 0.03) 1px, transparent 1px);
+ background-size: 50px 50px;
+ pointer-events: none;
+ z-index: -3;
+ opacity: 0;
+ transition: opacity 0.3s ease;
+}
+
+.grid-background.active {
+ opacity: 1;
+}
+
+/* 响应式背景调整 */
+@media (max-width: 768px) {
+ body::after {
+ background-size: 150px 75px;
+ animation-duration: 25s;
+ }
+
+ body::before {
+ background-image:
+ radial-gradient(circle at 30% 70%, rgba(76, 175, 80, 0.08) 0%, transparent 50%),
+ radial-gradient(circle at 70% 30%, rgba(45, 90, 61, 0.06) 0%, transparent 50%);
+ }
+}
+
+@media (max-width: 480px) {
+ body {
+ animation-duration: 20s;
+ }
+
+ body::after {
+ background-size: 100px 50px;
+ opacity: 0.4;
+ }
+}
+
+/* 高对比度模式下的背景调整 */
+@media (prefers-contrast: high) {
+ body {
+ background: #f8fdf8;
+ animation: none;
+ }
+
+ body::before,
+ body::after {
+ display: none;
+ }
+}
+
+/* 减少动画模式下的背景调整 */
+@media (prefers-reduced-motion: reduce) {
+ body {
+ animation: none;
+ background: linear-gradient(135deg, #e8f5e8 0%, #f0f9f0 50%, #f8fdf8 100%);
+ }
+
+ body::after {
+ animation: none;
+ }
+
+ @keyframes gradientShift {
+ 0%, 100% {
+ background-position: 0% 50%;
+ }
+ }
+
+ @keyframes floatDots {
+ 0%, 100% {
+ transform: translateY(0px) translateX(0px);
+ }
+ }
+}
+
+/* 深色模式支持 */
+@media (prefers-color-scheme: dark) {
+ body {
+ background: linear-gradient(135deg, #1a2e1a 0%, #2d4a2d 25%, #1f3a1f 50%, #1a2e1a 75%, #2d4a2d 100%);
+ }
+
+ body::before {
+ background-image:
+ radial-gradient(circle at 20% 80%, rgba(76, 175, 80, 0.15) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(144, 238, 144, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 40% 40%, rgba(76, 175, 80, 0.08) 0%, transparent 50%);
+ }
+
+ body::after {
+ background-image:
+ radial-gradient(2px 2px at 20px 30px, rgba(144, 238, 144, 0.4), transparent),
+ radial-gradient(2px 2px at 40px 70px, rgba(76, 175, 80, 0.3), transparent),
+ radial-gradient(1px 1px at 90px 40px, rgba(144, 238, 144, 0.5), transparent),
+ radial-gradient(1px 1px at 130px 80px, rgba(76, 175, 80, 0.4), transparent),
+ radial-gradient(2px 2px at 160px 30px, rgba(144, 238, 144, 0.3), transparent);
+ }
+}
+
+/* 打印样式 */
+@media print {
+ body {
+ background: white !important;
+ animation: none !important;
+ }
+
+ body::before,
+ body::after {
+ display: none !important;
+ }
+}
+
+/* 特殊效果:鼠标悬停时的背景变化 */
+@media (hover: hover) {
+ .container:hover {
+ position: relative;
+ }
+
+ .container:hover::before {
+ content: '';
+ position: absolute;
+ top: -20px;
+ left: -20px;
+ right: -20px;
+ bottom: -20px;
+ background: radial-gradient(circle at var(--mouse-x, 50%) var(--mouse-y, 50%), rgba(76, 175, 80, 0.05) 0%, transparent 50%);
+ border-radius: 30px;
+ pointer-events: none;
+ z-index: -1;
+ transition: opacity 0.3s ease;
+ }
+}
+
+/* 季节性主题变化(可通过JavaScript控制) */
+.theme-spring body {
+ background: linear-gradient(135deg, #e8f5e8 0%, #f0f9f0 25%, #e1f5e1 50%, #f8fdf8 75%, #e8f5e8 100%);
+}
+
+.theme-summer body {
+ background: linear-gradient(135deg, #f0f9f0 0%, #e8f5e8 25%, #f8fdf8 50%, #e1f5e1 75%, #f0f9f0 100%);
+}
+
+.theme-autumn body {
+ background: linear-gradient(135deg, #f5f0e8 0%, #f9f5f0 25%, #fdf8f0 50%, #f5f0e8 75%, #f9f5f0 100%);
+}
+
+.theme-winter body {
+ background: linear-gradient(135deg, #f0f5f8 0%, #f5f9fc 25%, #f8fbfd 50%, #f0f5f8 75%, #f5f9fc 100%);
+}
+
+/* 性能优化:GPU加速 */
+body,
+body::before,
+body::after {
+ will-change: transform;
+ transform: translateZ(0);
+}
+
+/* 无障碍支持:为屏幕阅读器隐藏装饰元素 */
+body::before,
+body::after {
+ speak: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/css/style.css b/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/css/style.css
index 2793ae86..bb7703c7 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/css/style.css
@@ -1,647 +1,647 @@
-/* 基础样式重置 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
- line-height: 1.6;
- color: #2d5a3d;
- min-height: 100vh;
- overflow-x: hidden;
-}
-
-/* 容器布局 */
-.container {
- max-width: 800px;
- margin: 0 auto;
- padding: 20px;
- min-height: 100vh;
- display: flex;
- flex-direction: column;
-}
-
-/* 头部样式 */
-.header {
- text-align: center;
- margin-bottom: 40px;
- padding: 30px 20px;
- background: linear-gradient(135deg, #e8f5e8 0%, #f0f9f0 100%);
- border-radius: 20px;
- box-shadow: 0 4px 20px rgba(45, 90, 61, 0.1);
-}
-
-.header h1 {
- font-size: 2.5rem;
- font-weight: 700;
- color: #2d5a3d;
- margin-bottom: 10px;
- text-shadow: 0 2px 4px rgba(45, 90, 61, 0.1);
-}
-
-.subtitle {
- font-size: 1.1rem;
- color: #5a8a6b;
- font-weight: 400;
-}
-
-/* 主内容区域 */
-.main-content {
- flex: 1;
- display: flex;
- flex-direction: column;
- gap: 30px;
-}
-
-/* 表单容器 */
-.form-container {
- background: #ffffff;
- border-radius: 16px;
- padding: 30px;
- box-shadow: 0 8px 32px rgba(45, 90, 61, 0.1);
- border: 1px solid #e8f5e8;
-}
-
-.password-form {
- display: flex;
- flex-direction: column;
- gap: 25px;
-}
-
-/* 表单组样式 */
-.form-group {
- display: flex;
- flex-direction: column;
- gap: 12px;
-}
-
-.form-group label {
- font-weight: 600;
- color: #2d5a3d;
- font-size: 1rem;
-}
-
-.section-title {
- font-size: 1.1rem;
- color: #2d5a3d;
- font-weight: 600;
- margin-bottom: 8px;
-}
-
-/* 长度控制 */
-.length-control {
- display: flex;
- align-items: center;
- gap: 15px;
- padding: 15px;
- background: #f8fdf8;
- border-radius: 12px;
- border: 2px solid #e8f5e8;
-}
-
-.length-slider {
- flex: 1;
- height: 6px;
- background: #e8f5e8;
- border-radius: 3px;
- outline: none;
- -webkit-appearance: none;
-}
-
-.length-slider::-webkit-slider-thumb {
- -webkit-appearance: none;
- width: 20px;
- height: 20px;
- background: linear-gradient(135deg, #4caf50, #45a049);
- border-radius: 50%;
- cursor: pointer;
- box-shadow: 0 2px 8px rgba(76, 175, 80, 0.3);
-}
-
-.length-slider::-moz-range-thumb {
- width: 20px;
- height: 20px;
- background: linear-gradient(135deg, #4caf50, #45a049);
- border-radius: 50%;
- cursor: pointer;
- border: none;
- box-shadow: 0 2px 8px rgba(76, 175, 80, 0.3);
-}
-
-.length-display {
- min-width: 40px;
- text-align: center;
- font-weight: 700;
- font-size: 1.2rem;
- color: #2d5a3d;
- background: #ffffff;
- padding: 8px 12px;
- border-radius: 8px;
- border: 2px solid #e8f5e8;
-}
-
-/* 复选框组 */
-.checkbox-group {
- display: flex;
- flex-direction: column;
- gap: 12px;
-}
-
-.checkbox-item {
- display: flex;
- align-items: center;
- gap: 12px;
- padding: 12px 16px;
- background: #f8fdf8;
- border-radius: 10px;
- border: 2px solid #e8f5e8;
- transition: all 0.3s ease;
- cursor: pointer;
-}
-
-.checkbox-item:hover {
- background: #f0f9f0;
- border-color: #d4edda;
- transform: translateY(-1px);
-}
-
-.checkbox-item input[type="checkbox"] {
- width: 18px;
- height: 18px;
- accent-color: #4caf50;
- cursor: pointer;
-}
-
-.checkbox-item label {
- flex: 1;
- cursor: pointer;
- font-weight: 500;
- color: #2d5a3d;
- margin: 0;
-}
-
-/* 生成按钮 */
-.generate-btn {
- background: linear-gradient(135deg, #4caf50, #45a049);
- color: white;
- border: none;
- padding: 16px 32px;
- border-radius: 12px;
- font-size: 1.1rem;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.3s ease;
- box-shadow: 0 4px 16px rgba(76, 175, 80, 0.3);
- position: relative;
- overflow: hidden;
-}
-
-.generate-btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 6px 20px rgba(76, 175, 80, 0.4);
-}
-
-.generate-btn:active {
- transform: translateY(0);
-}
-
-.generate-btn:disabled {
- opacity: 0.7;
- cursor: not-allowed;
- transform: none;
-}
-
-/* 结果容器 */
-.result-container {
- background: #ffffff;
- border-radius: 16px;
- padding: 30px;
- box-shadow: 0 8px 32px rgba(45, 90, 61, 0.1);
- border: 1px solid #e8f5e8;
- animation: slideIn 0.5s ease-out;
-}
-
-@keyframes slideIn {
- from {
- opacity: 0;
- transform: translateY(20px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-.result-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 20px;
-}
-
-.result-header h3 {
- color: #2d5a3d;
- font-size: 1.3rem;
- font-weight: 600;
-}
-
-.copy-btn {
- background: #4caf50;
- color: white;
- border: none;
- padding: 10px;
- border-radius: 8px;
- cursor: pointer;
- transition: all 0.3s ease;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.copy-btn:hover {
- background: #45a049;
- transform: scale(1.05);
-}
-
-/* 密码显示 */
-.password-display {
- margin-bottom: 25px;
-}
-
-.password-input {
- width: 100%;
- padding: 16px 20px;
- border: 2px solid #e8f5e8;
- border-radius: 12px;
- font-family: 'Courier New', monospace;
- font-size: 1.1rem;
- font-weight: 600;
- color: #2d5a3d;
- background: #f8fdf8;
- text-align: center;
- letter-spacing: 1px;
- word-break: break-all;
-}
-
-.password-input:focus {
- outline: none;
- border-color: #4caf50;
- box-shadow: 0 0 0 3px rgba(76, 175, 80, 0.1);
-}
-
-/* 密码信息 */
-.password-info {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
- gap: 15px;
- margin-bottom: 25px;
-}
-
-.info-item {
- display: flex;
- flex-direction: column;
- gap: 5px;
- padding: 12px 16px;
- background: #f8fdf8;
- border-radius: 10px;
- border: 1px solid #e8f5e8;
-}
-
-.info-item.full-width {
- grid-column: 1 / -1;
-}
-
-.info-label {
- font-size: 0.9rem;
- color: #5a8a6b;
- font-weight: 500;
-}
-
-.info-value {
- font-size: 1rem;
- color: #2d5a3d;
- font-weight: 600;
-}
-
-.info-value.strength {
- padding: 4px 8px;
- border-radius: 6px;
- text-align: center;
- color: white;
- font-weight: 700;
-}
-
-.strength.weak {
- background: #f44336;
-}
-
-.strength.medium {
- background: #ff9800;
-}
-
-.strength.strong {
- background: #4caf50;
-}
-
-.strength.very-strong {
- background: #2e7d32;
-}
-
-/* 字符集显示 */
-.character-sets {
- border-top: 1px solid #e8f5e8;
- padding-top: 20px;
-}
-
-.character-sets h4 {
- color: #2d5a3d;
- margin-bottom: 15px;
- font-size: 1.1rem;
-}
-
-.sets-list {
- display: flex;
- flex-wrap: wrap;
- gap: 10px;
-}
-
-.set-item {
- background: #e8f5e8;
- color: #2d5a3d;
- padding: 6px 12px;
- border-radius: 20px;
- font-size: 0.9rem;
- font-weight: 500;
-}
-
-/* 错误容器 */
-.error-container {
- background: #ffffff;
- border-radius: 16px;
- padding: 40px 30px;
- text-align: center;
- box-shadow: 0 8px 32px rgba(244, 67, 54, 0.1);
- border: 1px solid #ffebee;
-}
-
-.error-icon {
- font-size: 3rem;
- margin-bottom: 15px;
-}
-
-.error-container h3 {
- color: #d32f2f;
- margin-bottom: 10px;
- font-size: 1.3rem;
-}
-
-.error-container p {
- color: #666;
- margin-bottom: 20px;
-}
-
-.retry-btn {
- background: #f44336;
- color: white;
- border: none;
- padding: 12px 24px;
- border-radius: 8px;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.3s ease;
-}
-
-.retry-btn:hover {
- background: #d32f2f;
- transform: translateY(-1px);
-}
-
-/* 页脚 */
-.footer {
- text-align: center;
- padding: 30px 20px;
- color: #5a8a6b;
- font-size: 0.9rem;
-}
-
-/* 提示框 */
-.toast {
- position: fixed;
- top: 20px;
- right: 20px;
- background: #4caf50;
- color: white;
- padding: 12px 20px;
- border-radius: 8px;
- box-shadow: 0 4px 12px rgba(76, 175, 80, 0.3);
- z-index: 1000;
- animation: toastSlide 0.3s ease-out;
-}
-
-@keyframes toastSlide {
- from {
- transform: translateX(100%);
- opacity: 0;
- }
- to {
- transform: translateX(0);
- opacity: 1;
- }
-}
-
-/* 平板端适配 (768px - 1024px) */
-@media (min-width: 768px) and (max-width: 1024px) {
- .container {
- max-width: 700px;
- padding: 25px;
- }
-
- .header h1 {
- font-size: 2.2rem;
- }
-
- .form-container,
- .result-container {
- padding: 25px;
- }
-
- .password-info {
- grid-template-columns: repeat(2, 1fr);
- }
-}
-
-/* 手机端适配 (最大767px) */
-@media (max-width: 767px) {
- .container {
- padding: 15px;
- max-width: 100%;
- }
-
- .header {
- padding: 20px 15px;
- margin-bottom: 25px;
- }
-
- .header h1 {
- font-size: 1.8rem;
- }
-
- .subtitle {
- font-size: 1rem;
- }
-
- .form-container,
- .result-container {
- padding: 20px;
- border-radius: 12px;
- }
-
- .password-form {
- gap: 20px;
- }
-
- .form-group {
- gap: 10px;
- }
-
- .length-control {
- padding: 12px;
- gap: 12px;
- }
-
- .length-display {
- min-width: 35px;
- padding: 6px 10px;
- font-size: 1.1rem;
- }
-
- .checkbox-item {
- padding: 10px 12px;
- gap: 10px;
- }
-
- .checkbox-item input[type="checkbox"] {
- width: 16px;
- height: 16px;
- }
-
- .generate-btn {
- padding: 14px 28px;
- font-size: 1rem;
- }
-
- .password-input {
- padding: 14px 16px;
- font-size: 1rem;
- letter-spacing: 0.5px;
- }
-
- .password-info {
- grid-template-columns: 1fr;
- gap: 12px;
- }
-
- .info-item {
- padding: 10px 12px;
- }
-
- .result-header {
- flex-direction: column;
- gap: 15px;
- align-items: stretch;
- }
-
- .copy-btn {
- align-self: center;
- padding: 12px 20px;
- border-radius: 10px;
- }
-
- .toast {
- right: 15px;
- left: 15px;
- top: 15px;
- text-align: center;
- }
-}
-
-/* 小屏手机适配 (最大480px) */
-@media (max-width: 480px) {
- .container {
- padding: 10px;
- }
-
- .header {
- padding: 15px 10px;
- margin-bottom: 20px;
- }
-
- .header h1 {
- font-size: 1.6rem;
- }
-
- .form-container,
- .result-container {
- padding: 15px;
- }
-
- .checkbox-item {
- padding: 8px 10px;
- }
-
- .generate-btn {
- padding: 12px 24px;
- }
-
- .password-input {
- padding: 12px 14px;
- font-size: 0.95rem;
- }
-}
-
-/* 触摸设备优化 */
-@media (hover: none) and (pointer: coarse) {
- .checkbox-item,
- .generate-btn,
- .copy-btn,
- .retry-btn {
- min-height: 44px;
- }
-
- .checkbox-item input[type="checkbox"] {
- width: 20px;
- height: 20px;
- }
-
- .length-slider::-webkit-slider-thumb {
- width: 24px;
- height: 24px;
- }
-}
-
-/* 高对比度模式支持 */
-@media (prefers-contrast: high) {
- .form-container,
- .result-container {
- border: 2px solid #2d5a3d;
- }
-
- .checkbox-item {
- border: 1px solid #2d5a3d;
- }
-
- .password-input {
- border: 2px solid #2d5a3d;
- }
-}
-
-/* 减少动画模式支持 */
-@media (prefers-reduced-motion: reduce) {
- * {
- animation-duration: 0.01ms !important;
- animation-iteration-count: 1 !important;
- transition-duration: 0.01ms !important;
- }
+/* 基础样式重置 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
+ line-height: 1.6;
+ color: #2d5a3d;
+ min-height: 100vh;
+ overflow-x: hidden;
+}
+
+/* 容器布局 */
+.container {
+ max-width: 800px;
+ margin: 0 auto;
+ padding: 20px;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+}
+
+/* 头部样式 */
+.header {
+ text-align: center;
+ margin-bottom: 40px;
+ padding: 30px 20px;
+ background: linear-gradient(135deg, #e8f5e8 0%, #f0f9f0 100%);
+ border-radius: 20px;
+ box-shadow: 0 4px 20px rgba(45, 90, 61, 0.1);
+}
+
+.header h1 {
+ font-size: 2.5rem;
+ font-weight: 700;
+ color: #2d5a3d;
+ margin-bottom: 10px;
+ text-shadow: 0 2px 4px rgba(45, 90, 61, 0.1);
+}
+
+.subtitle {
+ font-size: 1.1rem;
+ color: #5a8a6b;
+ font-weight: 400;
+}
+
+/* 主内容区域 */
+.main-content {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 30px;
+}
+
+/* 表单容器 */
+.form-container {
+ background: #ffffff;
+ border-radius: 16px;
+ padding: 30px;
+ box-shadow: 0 8px 32px rgba(45, 90, 61, 0.1);
+ border: 1px solid #e8f5e8;
+}
+
+.password-form {
+ display: flex;
+ flex-direction: column;
+ gap: 25px;
+}
+
+/* 表单组样式 */
+.form-group {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.form-group label {
+ font-weight: 600;
+ color: #2d5a3d;
+ font-size: 1rem;
+}
+
+.section-title {
+ font-size: 1.1rem;
+ color: #2d5a3d;
+ font-weight: 600;
+ margin-bottom: 8px;
+}
+
+/* 长度控制 */
+.length-control {
+ display: flex;
+ align-items: center;
+ gap: 15px;
+ padding: 15px;
+ background: #f8fdf8;
+ border-radius: 12px;
+ border: 2px solid #e8f5e8;
+}
+
+.length-slider {
+ flex: 1;
+ height: 6px;
+ background: #e8f5e8;
+ border-radius: 3px;
+ outline: none;
+ -webkit-appearance: none;
+}
+
+.length-slider::-webkit-slider-thumb {
+ -webkit-appearance: none;
+ width: 20px;
+ height: 20px;
+ background: linear-gradient(135deg, #4caf50, #45a049);
+ border-radius: 50%;
+ cursor: pointer;
+ box-shadow: 0 2px 8px rgba(76, 175, 80, 0.3);
+}
+
+.length-slider::-moz-range-thumb {
+ width: 20px;
+ height: 20px;
+ background: linear-gradient(135deg, #4caf50, #45a049);
+ border-radius: 50%;
+ cursor: pointer;
+ border: none;
+ box-shadow: 0 2px 8px rgba(76, 175, 80, 0.3);
+}
+
+.length-display {
+ min-width: 40px;
+ text-align: center;
+ font-weight: 700;
+ font-size: 1.2rem;
+ color: #2d5a3d;
+ background: #ffffff;
+ padding: 8px 12px;
+ border-radius: 8px;
+ border: 2px solid #e8f5e8;
+}
+
+/* 复选框组 */
+.checkbox-group {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.checkbox-item {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding: 12px 16px;
+ background: #f8fdf8;
+ border-radius: 10px;
+ border: 2px solid #e8f5e8;
+ transition: all 0.3s ease;
+ cursor: pointer;
+}
+
+.checkbox-item:hover {
+ background: #f0f9f0;
+ border-color: #d4edda;
+ transform: translateY(-1px);
+}
+
+.checkbox-item input[type="checkbox"] {
+ width: 18px;
+ height: 18px;
+ accent-color: #4caf50;
+ cursor: pointer;
+}
+
+.checkbox-item label {
+ flex: 1;
+ cursor: pointer;
+ font-weight: 500;
+ color: #2d5a3d;
+ margin: 0;
+}
+
+/* 生成按钮 */
+.generate-btn {
+ background: linear-gradient(135deg, #4caf50, #45a049);
+ color: white;
+ border: none;
+ padding: 16px 32px;
+ border-radius: 12px;
+ font-size: 1.1rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ box-shadow: 0 4px 16px rgba(76, 175, 80, 0.3);
+ position: relative;
+ overflow: hidden;
+}
+
+.generate-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 6px 20px rgba(76, 175, 80, 0.4);
+}
+
+.generate-btn:active {
+ transform: translateY(0);
+}
+
+.generate-btn:disabled {
+ opacity: 0.7;
+ cursor: not-allowed;
+ transform: none;
+}
+
+/* 结果容器 */
+.result-container {
+ background: #ffffff;
+ border-radius: 16px;
+ padding: 30px;
+ box-shadow: 0 8px 32px rgba(45, 90, 61, 0.1);
+ border: 1px solid #e8f5e8;
+ animation: slideIn 0.5s ease-out;
+}
+
+@keyframes slideIn {
+ from {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.result-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 20px;
+}
+
+.result-header h3 {
+ color: #2d5a3d;
+ font-size: 1.3rem;
+ font-weight: 600;
+}
+
+.copy-btn {
+ background: #4caf50;
+ color: white;
+ border: none;
+ padding: 10px;
+ border-radius: 8px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.copy-btn:hover {
+ background: #45a049;
+ transform: scale(1.05);
+}
+
+/* 密码显示 */
+.password-display {
+ margin-bottom: 25px;
+}
+
+.password-input {
+ width: 100%;
+ padding: 16px 20px;
+ border: 2px solid #e8f5e8;
+ border-radius: 12px;
+ font-family: 'Courier New', monospace;
+ font-size: 1.1rem;
+ font-weight: 600;
+ color: #2d5a3d;
+ background: #f8fdf8;
+ text-align: center;
+ letter-spacing: 1px;
+ word-break: break-all;
+}
+
+.password-input:focus {
+ outline: none;
+ border-color: #4caf50;
+ box-shadow: 0 0 0 3px rgba(76, 175, 80, 0.1);
+}
+
+/* 密码信息 */
+.password-info {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
+ gap: 15px;
+ margin-bottom: 25px;
+}
+
+.info-item {
+ display: flex;
+ flex-direction: column;
+ gap: 5px;
+ padding: 12px 16px;
+ background: #f8fdf8;
+ border-radius: 10px;
+ border: 1px solid #e8f5e8;
+}
+
+.info-item.full-width {
+ grid-column: 1 / -1;
+}
+
+.info-label {
+ font-size: 0.9rem;
+ color: #5a8a6b;
+ font-weight: 500;
+}
+
+.info-value {
+ font-size: 1rem;
+ color: #2d5a3d;
+ font-weight: 600;
+}
+
+.info-value.strength {
+ padding: 4px 8px;
+ border-radius: 6px;
+ text-align: center;
+ color: white;
+ font-weight: 700;
+}
+
+.strength.weak {
+ background: #f44336;
+}
+
+.strength.medium {
+ background: #ff9800;
+}
+
+.strength.strong {
+ background: #4caf50;
+}
+
+.strength.very-strong {
+ background: #2e7d32;
+}
+
+/* 字符集显示 */
+.character-sets {
+ border-top: 1px solid #e8f5e8;
+ padding-top: 20px;
+}
+
+.character-sets h4 {
+ color: #2d5a3d;
+ margin-bottom: 15px;
+ font-size: 1.1rem;
+}
+
+.sets-list {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+}
+
+.set-item {
+ background: #e8f5e8;
+ color: #2d5a3d;
+ padding: 6px 12px;
+ border-radius: 20px;
+ font-size: 0.9rem;
+ font-weight: 500;
+}
+
+/* 错误容器 */
+.error-container {
+ background: #ffffff;
+ border-radius: 16px;
+ padding: 40px 30px;
+ text-align: center;
+ box-shadow: 0 8px 32px rgba(244, 67, 54, 0.1);
+ border: 1px solid #ffebee;
+}
+
+.error-icon {
+ font-size: 3rem;
+ margin-bottom: 15px;
+}
+
+.error-container h3 {
+ color: #d32f2f;
+ margin-bottom: 10px;
+ font-size: 1.3rem;
+}
+
+.error-container p {
+ color: #666;
+ margin-bottom: 20px;
+}
+
+.retry-btn {
+ background: #f44336;
+ color: white;
+ border: none;
+ padding: 12px 24px;
+ border-radius: 8px;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+}
+
+.retry-btn:hover {
+ background: #d32f2f;
+ transform: translateY(-1px);
+}
+
+/* 页脚 */
+.footer {
+ text-align: center;
+ padding: 30px 20px;
+ color: #5a8a6b;
+ font-size: 0.9rem;
+}
+
+/* 提示框 */
+.toast {
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ background: #4caf50;
+ color: white;
+ padding: 12px 20px;
+ border-radius: 8px;
+ box-shadow: 0 4px 12px rgba(76, 175, 80, 0.3);
+ z-index: 1000;
+ animation: toastSlide 0.3s ease-out;
+}
+
+@keyframes toastSlide {
+ from {
+ transform: translateX(100%);
+ opacity: 0;
+ }
+ to {
+ transform: translateX(0);
+ opacity: 1;
+ }
+}
+
+/* 平板端适配 (768px - 1024px) */
+@media (min-width: 768px) and (max-width: 1024px) {
+ .container {
+ max-width: 700px;
+ padding: 25px;
+ }
+
+ .header h1 {
+ font-size: 2.2rem;
+ }
+
+ .form-container,
+ .result-container {
+ padding: 25px;
+ }
+
+ .password-info {
+ grid-template-columns: repeat(2, 1fr);
+ }
+}
+
+/* 手机端适配 (最大767px) */
+@media (max-width: 767px) {
+ .container {
+ padding: 15px;
+ max-width: 100%;
+ }
+
+ .header {
+ padding: 20px 15px;
+ margin-bottom: 25px;
+ }
+
+ .header h1 {
+ font-size: 1.8rem;
+ }
+
+ .subtitle {
+ font-size: 1rem;
+ }
+
+ .form-container,
+ .result-container {
+ padding: 20px;
+ border-radius: 12px;
+ }
+
+ .password-form {
+ gap: 20px;
+ }
+
+ .form-group {
+ gap: 10px;
+ }
+
+ .length-control {
+ padding: 12px;
+ gap: 12px;
+ }
+
+ .length-display {
+ min-width: 35px;
+ padding: 6px 10px;
+ font-size: 1.1rem;
+ }
+
+ .checkbox-item {
+ padding: 10px 12px;
+ gap: 10px;
+ }
+
+ .checkbox-item input[type="checkbox"] {
+ width: 16px;
+ height: 16px;
+ }
+
+ .generate-btn {
+ padding: 14px 28px;
+ font-size: 1rem;
+ }
+
+ .password-input {
+ padding: 14px 16px;
+ font-size: 1rem;
+ letter-spacing: 0.5px;
+ }
+
+ .password-info {
+ grid-template-columns: 1fr;
+ gap: 12px;
+ }
+
+ .info-item {
+ padding: 10px 12px;
+ }
+
+ .result-header {
+ flex-direction: column;
+ gap: 15px;
+ align-items: stretch;
+ }
+
+ .copy-btn {
+ align-self: center;
+ padding: 12px 20px;
+ border-radius: 10px;
+ }
+
+ .toast {
+ right: 15px;
+ left: 15px;
+ top: 15px;
+ text-align: center;
+ }
+}
+
+/* 小屏手机适配 (最大480px) */
+@media (max-width: 480px) {
+ .container {
+ padding: 10px;
+ }
+
+ .header {
+ padding: 15px 10px;
+ margin-bottom: 20px;
+ }
+
+ .header h1 {
+ font-size: 1.6rem;
+ }
+
+ .form-container,
+ .result-container {
+ padding: 15px;
+ }
+
+ .checkbox-item {
+ padding: 8px 10px;
+ }
+
+ .generate-btn {
+ padding: 12px 24px;
+ }
+
+ .password-input {
+ padding: 12px 14px;
+ font-size: 0.95rem;
+ }
+}
+
+/* 触摸设备优化 */
+@media (hover: none) and (pointer: coarse) {
+ .checkbox-item,
+ .generate-btn,
+ .copy-btn,
+ .retry-btn {
+ min-height: 44px;
+ }
+
+ .checkbox-item input[type="checkbox"] {
+ width: 20px;
+ height: 20px;
+ }
+
+ .length-slider::-webkit-slider-thumb {
+ width: 24px;
+ height: 24px;
+ }
+}
+
+/* 高对比度模式支持 */
+@media (prefers-contrast: high) {
+ .form-container,
+ .result-container {
+ border: 2px solid #2d5a3d;
+ }
+
+ .checkbox-item {
+ border: 1px solid #2d5a3d;
+ }
+
+ .password-input {
+ border: 2px solid #2d5a3d;
+ }
+}
+
+/* 减少动画模式支持 */
+@media (prefers-reduced-motion: reduce) {
+ * {
+ animation-duration: 0.01ms !important;
+ animation-iteration-count: 1 !important;
+ transition-duration: 0.01ms !important;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/index.html b/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/index.html
index baada2f2..f64a925d 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/index.html
+++ b/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/index.html
@@ -1,146 +1,146 @@
-
-
-
-
-
- 随机密码生成器
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 长度:
- -
-
-
- 强度:
- -
-
-
- 熵值:
- -
-
-
- 数字:
- -
-
-
- 大写:
- -
-
-
- 小写:
- -
-
-
- 符号:
- -
-
-
- 破解时间:
- -
-
-
-
-
-
-
-
-
⚠️
-
生成失败
-
请检查网络连接后重试
-
-
-
-
-
-
-
-
- 密码已复制到剪贴板
-
-
-
-
+
+
+
+
+
+ 随机密码生成器
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 长度:
+ -
+
+
+ 强度:
+ -
+
+
+ 熵值:
+ -
+
+
+ 数字:
+ -
+
+
+ 大写:
+ -
+
+
+ 小写:
+ -
+
+
+ 符号:
+ -
+
+
+ 破解时间:
+ -
+
+
+
+
+
+
+
+
⚠️
+
生成失败
+
请检查网络连接后重试
+
+
+
+
+
+
+
+
+ 密码已复制到剪贴板
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/js/script.js b/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/js/script.js
index a8e56061..9dadfd98 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/js/script.js
@@ -1,412 +1,412 @@
-class PasswordGenerator {
- constructor() {
- this.apiUrl = 'https://60s.api.shumengya.top/v2/password';
- this.loadStartTime = 0;
- this.init();
- }
-
- init() {
- this.bindEvents();
- this.updateLengthDisplay();
- this.preloadResources();
- }
-
- preloadResources() {
- // 预连接API服务器
- const link = document.createElement('link');
- link.rel = 'preconnect';
- link.href = 'https://60s.api.shumengya.top';
- document.head.appendChild(link);
- }
-
- bindEvents() {
- // 长度滑块事件
- const lengthSlider = document.getElementById('length');
- lengthSlider.addEventListener('input', () => this.updateLengthDisplay());
-
- // 生成按钮事件
- const generateBtn = document.getElementById('generateBtn');
- generateBtn.addEventListener('click', () => this.generatePassword());
-
- // 复制按钮事件
- const copyBtn = document.getElementById('copyBtn');
- copyBtn.addEventListener('click', () => this.copyPassword());
-
- // 重试按钮事件
- const retryBtn = document.getElementById('retryBtn');
- retryBtn.addEventListener('click', () => this.generatePassword());
-
- // 复选框变化事件
- const checkboxes = document.querySelectorAll('input[type="checkbox"]');
- checkboxes.forEach(checkbox => {
- checkbox.addEventListener('change', () => this.validateForm());
- });
-
- // 键盘快捷键
- document.addEventListener('keydown', (e) => {
- if (e.ctrlKey && e.key === 'Enter') {
- e.preventDefault();
- this.generatePassword();
- }
- if (e.ctrlKey && e.key === 'c' && document.activeElement.id === 'passwordResult') {
- this.copyPassword();
- }
- });
- }
-
- updateLengthDisplay() {
- const lengthSlider = document.getElementById('length');
- const lengthDisplay = document.getElementById('lengthDisplay');
- lengthDisplay.textContent = lengthSlider.value;
- }
-
- validateForm() {
- const checkboxes = document.querySelectorAll('input[type="checkbox"]:checked');
- const generateBtn = document.getElementById('generateBtn');
-
- // 至少需要选择一种字符类型
- const hasCharacterType = Array.from(checkboxes).some(cb =>
- ['numbers', 'uppercase', 'lowercase', 'symbols'].includes(cb.id)
- );
-
- generateBtn.disabled = !hasCharacterType;
-
- if (!hasCharacterType) {
- this.showToast('请至少选择一种字符类型', 'warning');
- }
- }
-
- async generatePassword() {
- this.loadStartTime = Date.now();
-
- try {
- this.showLoading(true);
- this.hideError();
-
- const params = this.getFormParams();
- const password = await this.callAPI(params);
-
- if (password) {
- this.displayPassword(password, params);
- this.showToast('密码生成成功!', 'success');
-
- const loadTime = Date.now() - this.loadStartTime;
- console.log(`密码生成完成,耗时: ${loadTime}ms`);
- }
- } catch (error) {
- console.error('生成密码失败:', error);
- this.showError(error.message || '生成密码时发生错误,请重试');
- } finally {
- this.showLoading(false);
- }
- }
-
- getFormParams() {
- const length = document.getElementById('length').value;
- const numbers = document.getElementById('numbers').checked;
- const uppercase = document.getElementById('uppercase').checked;
- const lowercase = document.getElementById('lowercase').checked;
- const symbols = document.getElementById('symbols').checked;
- const excludeSimilar = document.getElementById('excludeSimilar').checked;
- const excludeAmbiguous = document.getElementById('excludeAmbiguous').checked;
-
- return {
- length: parseInt(length),
- numbers: numbers ? 'true' : 'false',
- uppercase: uppercase ? 'true' : 'false',
- lowercase: lowercase ? 'true' : 'false',
- symbols: symbols ? 'true' : 'false',
- exclude_similar: excludeSimilar ? 'true' : 'false',
- exclude_ambiguous: excludeAmbiguous ? 'true' : 'false',
- encoding: 'json'
- };
- }
-
- async callAPI(params) {
- const controller = new AbortController();
- const timeoutId = setTimeout(() => controller.abort(), 5000);
-
- try {
- const url = new URL(this.apiUrl);
- Object.keys(params).forEach(key => {
- if (params[key] !== undefined && params[key] !== null) {
- url.searchParams.append(key, params[key]);
- }
- });
-
- const response = await fetch(url.toString(), {
- method: 'GET',
- signal: controller.signal,
- headers: {
- 'Accept': 'application/json',
- 'User-Agent': 'PasswordGenerator/1.0'
- }
- });
-
- clearTimeout(timeoutId);
-
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
- }
-
- const data = await response.json();
-
- if (data.code === 200 && data.data && data.data.password) {
- return data.data.password;
- } else {
- throw new Error(data.message || '服务器返回了无效的密码数据');
- }
- } catch (error) {
- clearTimeout(timeoutId);
-
- if (error.name === 'AbortError') {
- throw new Error('请求超时,请检查网络连接后重试');
- }
-
- if (error.message.includes('Failed to fetch')) {
- throw new Error('网络连接失败,请检查网络后重试');
- }
-
- throw error;
- }
- }
-
- displayPassword(password, params) {
- // 显示结果容器
- const resultContainer = document.getElementById('resultContainer');
- const errorContainer = document.getElementById('errorContainer');
-
- resultContainer.style.display = 'block';
- errorContainer.style.display = 'none';
-
- // 设置密码
- const passwordInput = document.getElementById('passwordResult');
- passwordInput.value = password;
-
- // 计算并显示密码信息
- this.updatePasswordInfo(password, params);
-
- // 滚动到结果区域
- resultContainer.scrollIntoView({ behavior: 'smooth', block: 'start' });
- }
-
- updatePasswordInfo(password, params) {
- // 基本信息
- document.getElementById('infoLength').textContent = password.length;
- document.getElementById('infoEntropy').textContent = this.calculateEntropy(password).toFixed(1);
-
- // 密码强度
- const strength = this.calculateStrength(password);
- const strengthElement = document.getElementById('infoStrength');
- strengthElement.textContent = strength.text;
- strengthElement.className = `info-value strength ${strength.class}`;
-
- // 字符类型统计
- const stats = this.analyzeCharacters(password);
- document.getElementById('infoNumbers').textContent = stats.numbers;
- document.getElementById('infoUppercase').textContent = stats.uppercase;
- document.getElementById('infoLowercase').textContent = stats.lowercase;
- document.getElementById('infoSymbols').textContent = stats.symbols;
-
- // 使用的字符集
- this.updateCharacterSets(params);
-
- // 破解时间估算
- document.getElementById('infoCrackTime').textContent = this.estimateCrackTime(password);
- }
-
- calculateEntropy(password) {
- const charset = this.getCharsetSize(password);
- return Math.log2(Math.pow(charset, password.length));
- }
-
- getCharsetSize(password) {
- let size = 0;
- if (/[0-9]/.test(password)) size += 10;
- if (/[a-z]/.test(password)) size += 26;
- if (/[A-Z]/.test(password)) size += 26;
- if (/[^a-zA-Z0-9]/.test(password)) size += 32;
- return size;
- }
-
- calculateStrength(password) {
- const entropy = this.calculateEntropy(password);
-
- if (entropy < 30) {
- return { text: '弱', class: 'weak' };
- } else if (entropy < 50) {
- return { text: '中等', class: 'medium' };
- } else if (entropy < 70) {
- return { text: '强', class: 'strong' };
- } else {
- return { text: '非常强', class: 'very-strong' };
- }
- }
-
- analyzeCharacters(password) {
- return {
- numbers: (password.match(/[0-9]/g) || []).length,
- uppercase: (password.match(/[A-Z]/g) || []).length,
- lowercase: (password.match(/[a-z]/g) || []).length,
- symbols: (password.match(/[^a-zA-Z0-9]/g) || []).length
- };
- }
-
- updateCharacterSets(params) {
- const setsList = document.getElementById('setsList');
- const sets = [];
-
- if (params.numbers === 'true') sets.push('数字 (0-9)');
- if (params.uppercase === 'true') sets.push('大写字母 (A-Z)');
- if (params.lowercase === 'true') sets.push('小写字母 (a-z)');
- if (params.symbols === 'true') sets.push('特殊字符 (!@#$...)');
-
- setsList.innerHTML = sets.map(set => `${set}`).join('');
- }
-
- estimateCrackTime(password) {
- const charset = this.getCharsetSize(password);
- const combinations = Math.pow(charset, password.length);
- const guessesPerSecond = 1e9; // 假设每秒10亿次尝试
- const secondsToCrack = combinations / (2 * guessesPerSecond);
-
- if (secondsToCrack < 60) {
- return '不到1分钟';
- } else if (secondsToCrack < 3600) {
- return `${Math.ceil(secondsToCrack / 60)}分钟`;
- } else if (secondsToCrack < 86400) {
- return `${Math.ceil(secondsToCrack / 3600)}小时`;
- } else if (secondsToCrack < 31536000) {
- return `${Math.ceil(secondsToCrack / 86400)}天`;
- } else if (secondsToCrack < 31536000000) {
- return `${Math.ceil(secondsToCrack / 31536000)}年`;
- } else {
- return '数千年以上';
- }
- }
-
- async copyPassword() {
- const passwordInput = document.getElementById('passwordResult');
-
- try {
- if (navigator.clipboard && window.isSecureContext) {
- await navigator.clipboard.writeText(passwordInput.value);
- } else {
- // 降级方案
- passwordInput.select();
- passwordInput.setSelectionRange(0, 99999);
- document.execCommand('copy');
- }
-
- this.showToast('密码已复制到剪贴板!', 'success');
-
- // 复制按钮反馈
- const copyBtn = document.getElementById('copyBtn');
- const originalText = copyBtn.innerHTML;
- copyBtn.innerHTML = '✓ 已复制';
- copyBtn.style.background = '#2e7d32';
-
- setTimeout(() => {
- copyBtn.innerHTML = originalText;
- copyBtn.style.background = '';
- }, 2000);
-
- } catch (error) {
- console.error('复制失败:', error);
- this.showToast('复制失败,请手动选择密码', 'error');
- }
- }
-
- showLoading(show) {
- const generateBtn = document.getElementById('generateBtn');
-
- if (show) {
- generateBtn.disabled = true;
- generateBtn.innerHTML = '⟳ 生成中...';
- } else {
- generateBtn.disabled = false;
- generateBtn.innerHTML = '🔐 生成密码';
- }
- }
-
- showError(message) {
- const errorContainer = document.getElementById('errorContainer');
- const resultContainer = document.getElementById('resultContainer');
- const errorMessage = document.getElementById('errorMessage');
-
- errorMessage.textContent = message;
- errorContainer.style.display = 'block';
- resultContainer.style.display = 'none';
-
- errorContainer.scrollIntoView({ behavior: 'smooth', block: 'start' });
- }
-
- hideError() {
- const errorContainer = document.getElementById('errorContainer');
- errorContainer.style.display = 'none';
- }
-
- showToast(message, type = 'info') {
- // 移除现有的toast
- const existingToast = document.querySelector('.toast');
- if (existingToast) {
- existingToast.remove();
- }
-
- const toast = document.createElement('div');
- toast.className = 'toast';
- toast.textContent = message;
-
- // 根据类型设置颜色
- const colors = {
- success: '#4caf50',
- error: '#f44336',
- warning: '#ff9800',
- info: '#2196f3'
- };
-
- toast.style.background = colors[type] || colors.info;
-
- document.body.appendChild(toast);
-
- // 3秒后自动移除
- setTimeout(() => {
- if (toast.parentNode) {
- toast.remove();
- }
- }, 3000);
- }
-}
-
-// 添加旋转动画样式
-const style = document.createElement('style');
-style.textContent = `
- @keyframes spin {
- from { transform: rotate(0deg); }
- to { transform: rotate(360deg); }
- }
-`;
-document.head.appendChild(style);
-
-// 页面加载完成后初始化
-document.addEventListener('DOMContentLoaded', () => {
- new PasswordGenerator();
-});
-
-// 页面可见性变化时的处理
-document.addEventListener('visibilitychange', () => {
- if (document.visibilityState === 'visible') {
- // 页面重新可见时,可以进行一些刷新操作
- console.log('页面重新可见');
- }
-});
-
-// 错误处理
-window.addEventListener('error', (event) => {
- console.error('全局错误:', event.error);
-});
-
-window.addEventListener('unhandledrejection', (event) => {
- console.error('未处理的Promise拒绝:', event.reason);
- event.preventDefault();
+class PasswordGenerator {
+ constructor() {
+ this.apiUrl = 'https://60s.api.shumengya.top/v2/password';
+ this.loadStartTime = 0;
+ this.init();
+ }
+
+ init() {
+ this.bindEvents();
+ this.updateLengthDisplay();
+ this.preloadResources();
+ }
+
+ preloadResources() {
+ // 预连接API服务器
+ const link = document.createElement('link');
+ link.rel = 'preconnect';
+ link.href = 'https://60s.api.shumengya.top';
+ document.head.appendChild(link);
+ }
+
+ bindEvents() {
+ // 长度滑块事件
+ const lengthSlider = document.getElementById('length');
+ lengthSlider.addEventListener('input', () => this.updateLengthDisplay());
+
+ // 生成按钮事件
+ const generateBtn = document.getElementById('generateBtn');
+ generateBtn.addEventListener('click', () => this.generatePassword());
+
+ // 复制按钮事件
+ const copyBtn = document.getElementById('copyBtn');
+ copyBtn.addEventListener('click', () => this.copyPassword());
+
+ // 重试按钮事件
+ const retryBtn = document.getElementById('retryBtn');
+ retryBtn.addEventListener('click', () => this.generatePassword());
+
+ // 复选框变化事件
+ const checkboxes = document.querySelectorAll('input[type="checkbox"]');
+ checkboxes.forEach(checkbox => {
+ checkbox.addEventListener('change', () => this.validateForm());
+ });
+
+ // 键盘快捷键
+ document.addEventListener('keydown', (e) => {
+ if (e.ctrlKey && e.key === 'Enter') {
+ e.preventDefault();
+ this.generatePassword();
+ }
+ if (e.ctrlKey && e.key === 'c' && document.activeElement.id === 'passwordResult') {
+ this.copyPassword();
+ }
+ });
+ }
+
+ updateLengthDisplay() {
+ const lengthSlider = document.getElementById('length');
+ const lengthDisplay = document.getElementById('lengthDisplay');
+ lengthDisplay.textContent = lengthSlider.value;
+ }
+
+ validateForm() {
+ const checkboxes = document.querySelectorAll('input[type="checkbox"]:checked');
+ const generateBtn = document.getElementById('generateBtn');
+
+ // 至少需要选择一种字符类型
+ const hasCharacterType = Array.from(checkboxes).some(cb =>
+ ['numbers', 'uppercase', 'lowercase', 'symbols'].includes(cb.id)
+ );
+
+ generateBtn.disabled = !hasCharacterType;
+
+ if (!hasCharacterType) {
+ this.showToast('请至少选择一种字符类型', 'warning');
+ }
+ }
+
+ async generatePassword() {
+ this.loadStartTime = Date.now();
+
+ try {
+ this.showLoading(true);
+ this.hideError();
+
+ const params = this.getFormParams();
+ const password = await this.callAPI(params);
+
+ if (password) {
+ this.displayPassword(password, params);
+ this.showToast('密码生成成功!', 'success');
+
+ const loadTime = Date.now() - this.loadStartTime;
+ console.log(`密码生成完成,耗时: ${loadTime}ms`);
+ }
+ } catch (error) {
+ console.error('生成密码失败:', error);
+ this.showError(error.message || '生成密码时发生错误,请重试');
+ } finally {
+ this.showLoading(false);
+ }
+ }
+
+ getFormParams() {
+ const length = document.getElementById('length').value;
+ const numbers = document.getElementById('numbers').checked;
+ const uppercase = document.getElementById('uppercase').checked;
+ const lowercase = document.getElementById('lowercase').checked;
+ const symbols = document.getElementById('symbols').checked;
+ const excludeSimilar = document.getElementById('excludeSimilar').checked;
+ const excludeAmbiguous = document.getElementById('excludeAmbiguous').checked;
+
+ return {
+ length: parseInt(length),
+ numbers: numbers ? 'true' : 'false',
+ uppercase: uppercase ? 'true' : 'false',
+ lowercase: lowercase ? 'true' : 'false',
+ symbols: symbols ? 'true' : 'false',
+ exclude_similar: excludeSimilar ? 'true' : 'false',
+ exclude_ambiguous: excludeAmbiguous ? 'true' : 'false',
+ encoding: 'json'
+ };
+ }
+
+ async callAPI(params) {
+ const controller = new AbortController();
+ const timeoutId = setTimeout(() => controller.abort(), 5000);
+
+ try {
+ const url = new URL(this.apiUrl);
+ Object.keys(params).forEach(key => {
+ if (params[key] !== undefined && params[key] !== null) {
+ url.searchParams.append(key, params[key]);
+ }
+ });
+
+ const response = await fetch(url.toString(), {
+ method: 'GET',
+ signal: controller.signal,
+ headers: {
+ 'Accept': 'application/json',
+ 'User-Agent': 'PasswordGenerator/1.0'
+ }
+ });
+
+ clearTimeout(timeoutId);
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+ }
+
+ const data = await response.json();
+
+ if (data.code === 200 && data.data && data.data.password) {
+ return data.data.password;
+ } else {
+ throw new Error(data.message || '服务器返回了无效的密码数据');
+ }
+ } catch (error) {
+ clearTimeout(timeoutId);
+
+ if (error.name === 'AbortError') {
+ throw new Error('请求超时,请检查网络连接后重试');
+ }
+
+ if (error.message.includes('Failed to fetch')) {
+ throw new Error('网络连接失败,请检查网络后重试');
+ }
+
+ throw error;
+ }
+ }
+
+ displayPassword(password, params) {
+ // 显示结果容器
+ const resultContainer = document.getElementById('resultContainer');
+ const errorContainer = document.getElementById('errorContainer');
+
+ resultContainer.style.display = 'block';
+ errorContainer.style.display = 'none';
+
+ // 设置密码
+ const passwordInput = document.getElementById('passwordResult');
+ passwordInput.value = password;
+
+ // 计算并显示密码信息
+ this.updatePasswordInfo(password, params);
+
+ // 滚动到结果区域
+ resultContainer.scrollIntoView({ behavior: 'smooth', block: 'start' });
+ }
+
+ updatePasswordInfo(password, params) {
+ // 基本信息
+ document.getElementById('infoLength').textContent = password.length;
+ document.getElementById('infoEntropy').textContent = this.calculateEntropy(password).toFixed(1);
+
+ // 密码强度
+ const strength = this.calculateStrength(password);
+ const strengthElement = document.getElementById('infoStrength');
+ strengthElement.textContent = strength.text;
+ strengthElement.className = `info-value strength ${strength.class}`;
+
+ // 字符类型统计
+ const stats = this.analyzeCharacters(password);
+ document.getElementById('infoNumbers').textContent = stats.numbers;
+ document.getElementById('infoUppercase').textContent = stats.uppercase;
+ document.getElementById('infoLowercase').textContent = stats.lowercase;
+ document.getElementById('infoSymbols').textContent = stats.symbols;
+
+ // 使用的字符集
+ this.updateCharacterSets(params);
+
+ // 破解时间估算
+ document.getElementById('infoCrackTime').textContent = this.estimateCrackTime(password);
+ }
+
+ calculateEntropy(password) {
+ const charset = this.getCharsetSize(password);
+ return Math.log2(Math.pow(charset, password.length));
+ }
+
+ getCharsetSize(password) {
+ let size = 0;
+ if (/[0-9]/.test(password)) size += 10;
+ if (/[a-z]/.test(password)) size += 26;
+ if (/[A-Z]/.test(password)) size += 26;
+ if (/[^a-zA-Z0-9]/.test(password)) size += 32;
+ return size;
+ }
+
+ calculateStrength(password) {
+ const entropy = this.calculateEntropy(password);
+
+ if (entropy < 30) {
+ return { text: '弱', class: 'weak' };
+ } else if (entropy < 50) {
+ return { text: '中等', class: 'medium' };
+ } else if (entropy < 70) {
+ return { text: '强', class: 'strong' };
+ } else {
+ return { text: '非常强', class: 'very-strong' };
+ }
+ }
+
+ analyzeCharacters(password) {
+ return {
+ numbers: (password.match(/[0-9]/g) || []).length,
+ uppercase: (password.match(/[A-Z]/g) || []).length,
+ lowercase: (password.match(/[a-z]/g) || []).length,
+ symbols: (password.match(/[^a-zA-Z0-9]/g) || []).length
+ };
+ }
+
+ updateCharacterSets(params) {
+ const setsList = document.getElementById('setsList');
+ const sets = [];
+
+ if (params.numbers === 'true') sets.push('数字 (0-9)');
+ if (params.uppercase === 'true') sets.push('大写字母 (A-Z)');
+ if (params.lowercase === 'true') sets.push('小写字母 (a-z)');
+ if (params.symbols === 'true') sets.push('特殊字符 (!@#$...)');
+
+ setsList.innerHTML = sets.map(set => `${set}`).join('');
+ }
+
+ estimateCrackTime(password) {
+ const charset = this.getCharsetSize(password);
+ const combinations = Math.pow(charset, password.length);
+ const guessesPerSecond = 1e9; // 假设每秒10亿次尝试
+ const secondsToCrack = combinations / (2 * guessesPerSecond);
+
+ if (secondsToCrack < 60) {
+ return '不到1分钟';
+ } else if (secondsToCrack < 3600) {
+ return `${Math.ceil(secondsToCrack / 60)}分钟`;
+ } else if (secondsToCrack < 86400) {
+ return `${Math.ceil(secondsToCrack / 3600)}小时`;
+ } else if (secondsToCrack < 31536000) {
+ return `${Math.ceil(secondsToCrack / 86400)}天`;
+ } else if (secondsToCrack < 31536000000) {
+ return `${Math.ceil(secondsToCrack / 31536000)}年`;
+ } else {
+ return '数千年以上';
+ }
+ }
+
+ async copyPassword() {
+ const passwordInput = document.getElementById('passwordResult');
+
+ try {
+ if (navigator.clipboard && window.isSecureContext) {
+ await navigator.clipboard.writeText(passwordInput.value);
+ } else {
+ // 降级方案
+ passwordInput.select();
+ passwordInput.setSelectionRange(0, 99999);
+ document.execCommand('copy');
+ }
+
+ this.showToast('密码已复制到剪贴板!', 'success');
+
+ // 复制按钮反馈
+ const copyBtn = document.getElementById('copyBtn');
+ const originalText = copyBtn.innerHTML;
+ copyBtn.innerHTML = '✓ 已复制';
+ copyBtn.style.background = '#2e7d32';
+
+ setTimeout(() => {
+ copyBtn.innerHTML = originalText;
+ copyBtn.style.background = '';
+ }, 2000);
+
+ } catch (error) {
+ console.error('复制失败:', error);
+ this.showToast('复制失败,请手动选择密码', 'error');
+ }
+ }
+
+ showLoading(show) {
+ const generateBtn = document.getElementById('generateBtn');
+
+ if (show) {
+ generateBtn.disabled = true;
+ generateBtn.innerHTML = '⟳ 生成中...';
+ } else {
+ generateBtn.disabled = false;
+ generateBtn.innerHTML = '🔐 生成密码';
+ }
+ }
+
+ showError(message) {
+ const errorContainer = document.getElementById('errorContainer');
+ const resultContainer = document.getElementById('resultContainer');
+ const errorMessage = document.getElementById('errorMessage');
+
+ errorMessage.textContent = message;
+ errorContainer.style.display = 'block';
+ resultContainer.style.display = 'none';
+
+ errorContainer.scrollIntoView({ behavior: 'smooth', block: 'start' });
+ }
+
+ hideError() {
+ const errorContainer = document.getElementById('errorContainer');
+ errorContainer.style.display = 'none';
+ }
+
+ showToast(message, type = 'info') {
+ // 移除现有的toast
+ const existingToast = document.querySelector('.toast');
+ if (existingToast) {
+ existingToast.remove();
+ }
+
+ const toast = document.createElement('div');
+ toast.className = 'toast';
+ toast.textContent = message;
+
+ // 根据类型设置颜色
+ const colors = {
+ success: '#4caf50',
+ error: '#f44336',
+ warning: '#ff9800',
+ info: '#2196f3'
+ };
+
+ toast.style.background = colors[type] || colors.info;
+
+ document.body.appendChild(toast);
+
+ // 3秒后自动移除
+ setTimeout(() => {
+ if (toast.parentNode) {
+ toast.remove();
+ }
+ }, 3000);
+ }
+}
+
+// 添加旋转动画样式
+const style = document.createElement('style');
+style.textContent = `
+ @keyframes spin {
+ from { transform: rotate(0deg); }
+ to { transform: rotate(360deg); }
+ }
+`;
+document.head.appendChild(style);
+
+// 页面加载完成后初始化
+document.addEventListener('DOMContentLoaded', () => {
+ new PasswordGenerator();
+});
+
+// 页面可见性变化时的处理
+document.addEventListener('visibilitychange', () => {
+ if (document.visibilityState === 'visible') {
+ // 页面重新可见时,可以进行一些刷新操作
+ console.log('页面重新可见');
+ }
+});
+
+// 错误处理
+window.addEventListener('error', (event) => {
+ console.error('全局错误:', event.error);
+});
+
+window.addEventListener('unhandledrejection', (event) => {
+ console.error('未处理的Promise拒绝:', event.reason);
+ event.preventDefault();
});
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/返回接口.json
index 3b91a5e8..e3d1344c 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/实用功能/随机密码生成器/返回接口.json
@@ -1,32 +1,32 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "password": "8mr2M7dZ6E3saj3F",
- "length": 16,
- "config": {
- "include_numbers": true,
- "include_symbols": false,
- "include_lowercase": true,
- "include_uppercase": true,
- "exclude_similar": true,
- "exclude_ambiguous": true
- },
- "character_sets": {
- "lowercase": "abcdefghjkmnpqrstuvwxyz",
- "uppercase": "ABCDEFGHIJKMNPQRSTUVWXYZ",
- "numbers": "23456789",
- "symbols": "",
- "used_sets": [
- "lowercase",
- "uppercase",
- "numbers"
- ]
- },
- "generation_info": {
- "entropy": 92.5,
- "strength": "极强",
- "time_to_crack": "数百万年"
- }
- }
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "password": "8mr2M7dZ6E3saj3F",
+ "length": 16,
+ "config": {
+ "include_numbers": true,
+ "include_symbols": false,
+ "include_lowercase": true,
+ "include_uppercase": true,
+ "exclude_similar": true,
+ "exclude_ambiguous": true
+ },
+ "character_sets": {
+ "lowercase": "abcdefghjkmnpqrstuvwxyz",
+ "uppercase": "ABCDEFGHIJKMNPQRSTUVWXYZ",
+ "numbers": "23456789",
+ "symbols": "",
+ "used_sets": [
+ "lowercase",
+ "uppercase",
+ "numbers"
+ ]
+ },
+ "generation_info": {
+ "entropy": 92.5,
+ "strength": "极强",
+ "time_to_crack": "数百万年"
+ }
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/background.css b/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/background.css
index 81e610a9..70003b94 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/background.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/background.css
@@ -1,215 +1,215 @@
-/* 背景样式文件 - 独立管理背景相关样式 */
-
-/* 主体背景 */
-body {
- background: linear-gradient(135deg, #e8f5e8 0%, #f0fff0 50%, #e8f5e8 100%);
- background-attachment: fixed;
- background-size: 400% 400%;
- animation: gradientShift 15s ease infinite;
-}
-
-/* 背景动画 */
-@keyframes gradientShift {
- 0% {
- background-position: 0% 50%;
- }
- 50% {
- background-position: 100% 50%;
- }
- 100% {
- background-position: 0% 50%;
- }
-}
-
-/* 容器背景装饰 */
-.container::before {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- radial-gradient(circle at 20% 80%, rgba(144, 205, 144, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 80% 20%, rgba(45, 90, 39, 0.05) 0%, transparent 50%),
- radial-gradient(circle at 40% 40%, rgba(144, 205, 144, 0.08) 0%, transparent 50%);
- pointer-events: none;
- z-index: -1;
-}
-
-/* 输入区域背景 */
-.input-section {
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(10px);
- -webkit-backdrop-filter: blur(10px);
-}
-
-/* 结果区域背景 */
-.result-section {
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(10px);
- -webkit-backdrop-filter: blur(10px);
-}
-
-/* 格式组背景 */
-.format-group {
- background: rgba(248, 255, 248, 0.8);
- backdrop-filter: blur(5px);
- -webkit-backdrop-filter: blur(5px);
-}
-
-/* 属性项背景 */
-.property-item {
- background: rgba(248, 255, 248, 0.8);
- backdrop-filter: blur(5px);
- -webkit-backdrop-filter: blur(5px);
-}
-
-/* 调色板项背景 */
-.palette-item {
- background: rgba(248, 255, 248, 0.8);
- backdrop-filter: blur(5px);
- -webkit-backdrop-filter: blur(5px);
-}
-
-/* 无障碍项背景 */
-.accessibility-item {
- background: rgba(248, 255, 248, 0.8);
- backdrop-filter: blur(5px);
- -webkit-backdrop-filter: blur(5px);
-}
-
-/* 颜色预览背景 */
-.color-preview {
- background: rgba(248, 255, 248, 0.6);
- backdrop-filter: blur(8px);
- -webkit-backdrop-filter: blur(8px);
-}
-
-/* 输入框背景 */
-.input-group input,
-.input-group select {
- background: rgba(248, 255, 248, 0.9);
- backdrop-filter: blur(5px);
- -webkit-backdrop-filter: blur(5px);
-}
-
-.input-group input:focus,
-.input-group select:focus {
- background: rgba(255, 255, 255, 0.95);
-}
-
-/* 格式组内部元素背景 */
-.format-group p {
- background: rgba(255, 255, 255, 0.9);
- backdrop-filter: blur(3px);
- -webkit-backdrop-filter: blur(3px);
-}
-
-/* 手机端背景优化 */
-@media (max-width: 767px) {
- body {
- background: linear-gradient(180deg, #e8f5e8 0%, #f0fff0 50%, #e8f5e8 100%);
- background-attachment: scroll; /* 手机端使用scroll避免性能问题 */
- }
-
- .container::before {
- background-image:
- radial-gradient(circle at 30% 70%, rgba(144, 205, 144, 0.08) 0%, transparent 40%),
- radial-gradient(circle at 70% 30%, rgba(45, 90, 39, 0.04) 0%, transparent 40%);
- }
-
- /* 减少手机端的模糊效果以提升性能 */
- .input-section,
- .result-section {
- backdrop-filter: blur(5px);
- -webkit-backdrop-filter: blur(5px);
- }
-
- .format-group,
- .property-item,
- .palette-item,
- .accessibility-item {
- backdrop-filter: blur(3px);
- -webkit-backdrop-filter: blur(3px);
- }
-}
-
-/* 平板端背景优化 */
-@media (min-width: 768px) and (max-width: 1024px) {
- .container::before {
- background-image:
- radial-gradient(circle at 25% 75%, rgba(144, 205, 144, 0.12) 0%, transparent 60%),
- radial-gradient(circle at 75% 25%, rgba(45, 90, 39, 0.06) 0%, transparent 60%),
- radial-gradient(circle at 50% 50%, rgba(144, 205, 144, 0.04) 0%, transparent 40%);
- }
-}
-
-/* 电脑端背景优化 */
-@media (min-width: 1025px) {
- body {
- background-size: 300% 300%;
- animation-duration: 20s;
- }
-
- .container::before {
- background-image:
- radial-gradient(circle at 15% 85%, rgba(144, 205, 144, 0.15) 0%, transparent 70%),
- radial-gradient(circle at 85% 15%, rgba(45, 90, 39, 0.08) 0%, transparent 70%),
- radial-gradient(circle at 35% 35%, rgba(144, 205, 144, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 65% 65%, rgba(45, 90, 39, 0.05) 0%, transparent 50%);
- }
-
- /* 电脑端增强模糊效果 */
- .input-section,
- .result-section {
- backdrop-filter: blur(15px);
- -webkit-backdrop-filter: blur(15px);
- }
-
- .format-group,
- .property-item,
- .palette-item,
- .accessibility-item {
- backdrop-filter: blur(8px);
- -webkit-backdrop-filter: blur(8px);
- }
-}
-
-/* 深色模式支持(如果用户系统设置为深色模式) */
-@media (prefers-color-scheme: dark) {
- body {
- background: linear-gradient(135deg, #1a2e1a 0%, #0f1f0f 50%, #1a2e1a 100%);
- }
-
- .container::before {
- background-image:
- radial-gradient(circle at 20% 80%, rgba(144, 205, 144, 0.05) 0%, transparent 50%),
- radial-gradient(circle at 80% 20%, rgba(45, 90, 39, 0.03) 0%, transparent 50%);
- }
-
- .input-section,
- .result-section {
- background: rgba(26, 46, 26, 0.9);
- }
-
- .format-group,
- .property-item,
- .palette-item,
- .accessibility-item,
- .color-preview {
- background: rgba(26, 46, 26, 0.6);
- }
-
- .input-group input,
- .input-group select {
- background: rgba(26, 46, 26, 0.8);
- color: #e8f5e8;
- border-color: rgba(144, 205, 144, 0.3);
- }
-
- .format-group p {
- background: rgba(15, 31, 15, 0.8);
- color: #e8f5e8;
- }
+/* 背景样式文件 - 独立管理背景相关样式 */
+
+/* 主体背景 */
+body {
+ background: linear-gradient(135deg, #e8f5e8 0%, #f0fff0 50%, #e8f5e8 100%);
+ background-attachment: fixed;
+ background-size: 400% 400%;
+ animation: gradientShift 15s ease infinite;
+}
+
+/* 背景动画 */
+@keyframes gradientShift {
+ 0% {
+ background-position: 0% 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+ 100% {
+ background-position: 0% 50%;
+ }
+}
+
+/* 容器背景装饰 */
+.container::before {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(circle at 20% 80%, rgba(144, 205, 144, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(45, 90, 39, 0.05) 0%, transparent 50%),
+ radial-gradient(circle at 40% 40%, rgba(144, 205, 144, 0.08) 0%, transparent 50%);
+ pointer-events: none;
+ z-index: -1;
+}
+
+/* 输入区域背景 */
+.input-section {
+ background: rgba(255, 255, 255, 0.95);
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px);
+}
+
+/* 结果区域背景 */
+.result-section {
+ background: rgba(255, 255, 255, 0.95);
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px);
+}
+
+/* 格式组背景 */
+.format-group {
+ background: rgba(248, 255, 248, 0.8);
+ backdrop-filter: blur(5px);
+ -webkit-backdrop-filter: blur(5px);
+}
+
+/* 属性项背景 */
+.property-item {
+ background: rgba(248, 255, 248, 0.8);
+ backdrop-filter: blur(5px);
+ -webkit-backdrop-filter: blur(5px);
+}
+
+/* 调色板项背景 */
+.palette-item {
+ background: rgba(248, 255, 248, 0.8);
+ backdrop-filter: blur(5px);
+ -webkit-backdrop-filter: blur(5px);
+}
+
+/* 无障碍项背景 */
+.accessibility-item {
+ background: rgba(248, 255, 248, 0.8);
+ backdrop-filter: blur(5px);
+ -webkit-backdrop-filter: blur(5px);
+}
+
+/* 颜色预览背景 */
+.color-preview {
+ background: rgba(248, 255, 248, 0.6);
+ backdrop-filter: blur(8px);
+ -webkit-backdrop-filter: blur(8px);
+}
+
+/* 输入框背景 */
+.input-group input,
+.input-group select {
+ background: rgba(248, 255, 248, 0.9);
+ backdrop-filter: blur(5px);
+ -webkit-backdrop-filter: blur(5px);
+}
+
+.input-group input:focus,
+.input-group select:focus {
+ background: rgba(255, 255, 255, 0.95);
+}
+
+/* 格式组内部元素背景 */
+.format-group p {
+ background: rgba(255, 255, 255, 0.9);
+ backdrop-filter: blur(3px);
+ -webkit-backdrop-filter: blur(3px);
+}
+
+/* 手机端背景优化 */
+@media (max-width: 767px) {
+ body {
+ background: linear-gradient(180deg, #e8f5e8 0%, #f0fff0 50%, #e8f5e8 100%);
+ background-attachment: scroll; /* 手机端使用scroll避免性能问题 */
+ }
+
+ .container::before {
+ background-image:
+ radial-gradient(circle at 30% 70%, rgba(144, 205, 144, 0.08) 0%, transparent 40%),
+ radial-gradient(circle at 70% 30%, rgba(45, 90, 39, 0.04) 0%, transparent 40%);
+ }
+
+ /* 减少手机端的模糊效果以提升性能 */
+ .input-section,
+ .result-section {
+ backdrop-filter: blur(5px);
+ -webkit-backdrop-filter: blur(5px);
+ }
+
+ .format-group,
+ .property-item,
+ .palette-item,
+ .accessibility-item {
+ backdrop-filter: blur(3px);
+ -webkit-backdrop-filter: blur(3px);
+ }
+}
+
+/* 平板端背景优化 */
+@media (min-width: 768px) and (max-width: 1024px) {
+ .container::before {
+ background-image:
+ radial-gradient(circle at 25% 75%, rgba(144, 205, 144, 0.12) 0%, transparent 60%),
+ radial-gradient(circle at 75% 25%, rgba(45, 90, 39, 0.06) 0%, transparent 60%),
+ radial-gradient(circle at 50% 50%, rgba(144, 205, 144, 0.04) 0%, transparent 40%);
+ }
+}
+
+/* 电脑端背景优化 */
+@media (min-width: 1025px) {
+ body {
+ background-size: 300% 300%;
+ animation-duration: 20s;
+ }
+
+ .container::before {
+ background-image:
+ radial-gradient(circle at 15% 85%, rgba(144, 205, 144, 0.15) 0%, transparent 70%),
+ radial-gradient(circle at 85% 15%, rgba(45, 90, 39, 0.08) 0%, transparent 70%),
+ radial-gradient(circle at 35% 35%, rgba(144, 205, 144, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 65% 65%, rgba(45, 90, 39, 0.05) 0%, transparent 50%);
+ }
+
+ /* 电脑端增强模糊效果 */
+ .input-section,
+ .result-section {
+ backdrop-filter: blur(15px);
+ -webkit-backdrop-filter: blur(15px);
+ }
+
+ .format-group,
+ .property-item,
+ .palette-item,
+ .accessibility-item {
+ backdrop-filter: blur(8px);
+ -webkit-backdrop-filter: blur(8px);
+ }
+}
+
+/* 深色模式支持(如果用户系统设置为深色模式) */
+@media (prefers-color-scheme: dark) {
+ body {
+ background: linear-gradient(135deg, #1a2e1a 0%, #0f1f0f 50%, #1a2e1a 100%);
+ }
+
+ .container::before {
+ background-image:
+ radial-gradient(circle at 20% 80%, rgba(144, 205, 144, 0.05) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(45, 90, 39, 0.03) 0%, transparent 50%);
+ }
+
+ .input-section,
+ .result-section {
+ background: rgba(26, 46, 26, 0.9);
+ }
+
+ .format-group,
+ .property-item,
+ .palette-item,
+ .accessibility-item,
+ .color-preview {
+ background: rgba(26, 46, 26, 0.6);
+ }
+
+ .input-group input,
+ .input-group select {
+ background: rgba(26, 46, 26, 0.8);
+ color: #e8f5e8;
+ border-color: rgba(144, 205, 144, 0.3);
+ }
+
+ .format-group p {
+ background: rgba(15, 31, 15, 0.8);
+ color: #e8f5e8;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/index.html b/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/index.html
index cf9be12c..ba950f3a 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/index.html
+++ b/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/index.html
@@ -1,187 +1,187 @@
-
-
-
-
-
- 随机颜色/颜色转换工具
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
-
- 0
-
-
-
- 0
-
-
-
- #000000
-
-
-
-
-
配色方案
-
-
-
-
-
-
- #000000
- #000000
-
-
-
-
-
-
- #000000
- #000000
-
-
-
-
-
-
-
无障碍性
-
-
- AA 普通文本:
- 否
-
-
- AA 大文本:
- 否
-
-
- AAA 普通文本:
- 否
-
-
- AAA 大文本:
- 否
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ 随机颜色/颜色转换工具
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+ 0
+
+
+
+ 0
+
+
+
+ #000000
+
+
+
+
+
配色方案
+
+
+
+
+
+
+ #000000
+ #000000
+
+
+
+
+
+
+ #000000
+ #000000
+
+
+
+
+
+
+
无障碍性
+
+
+ AA 普通文本:
+ 否
+
+
+ AA 大文本:
+ 否
+
+
+ AAA 普通文本:
+ 否
+
+
+ AAA 大文本:
+ 否
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/script.js b/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/script.js
index e641efe4..ff8f3d81 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/script.js
+++ b/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/script.js
@@ -1,426 +1,426 @@
-// 随机颜色/颜色转换工具 JavaScript
-
-class ColorTool {
- constructor() {
- this.apiUrl = 'https://60s.api.shumengya.top/v2/color';
- this.init();
- }
-
- init() {
- this.bindEvents();
- this.hideResultSection();
- }
-
- bindEvents() {
- const randomBtn = document.getElementById('randomBtn');
- const convertBtn = document.getElementById('convertBtn');
- const colorInput = document.getElementById('colorInput');
-
- randomBtn.addEventListener('click', () => this.getRandomColor());
- convertBtn.addEventListener('click', () => this.convertColor());
-
- // 回车键支持
- colorInput.addEventListener('keypress', (e) => {
- if (e.key === 'Enter') {
- this.convertColor();
- }
- });
- }
-
- hideResultSection() {
- const resultSection = document.querySelector('.result-section');
- resultSection.style.display = 'none';
- }
-
- showResultSection() {
- const resultSection = document.querySelector('.result-section');
- resultSection.style.display = 'block';
- }
-
- showLoading() {
- const loading = document.getElementById('loading');
- const error = document.getElementById('error');
- loading.style.display = 'block';
- error.style.display = 'none';
- this.hideResultSection();
- }
-
- hideLoading() {
- const loading = document.getElementById('loading');
- loading.style.display = 'none';
- }
-
- showError(message) {
- const error = document.getElementById('error');
- const errorMessage = document.getElementById('errorMessage');
- const loading = document.getElementById('loading');
-
- loading.style.display = 'none';
- errorMessage.textContent = message;
- error.style.display = 'block';
- this.hideResultSection();
- }
-
- hideError() {
- const error = document.getElementById('error');
- error.style.display = 'none';
- }
-
- async getRandomColor() {
- try {
- this.showLoading();
- const encoding = document.getElementById('encodingSelect').value;
- const url = `${this.apiUrl}?encoding=${encoding}`;
-
- const response = await fetch(url);
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
- }
-
- const data = await response.json();
-
- if (data.code === 200) {
- this.displayColorData(data.data);
- this.hideLoading();
- this.hideError();
- this.showResultSection();
- } else {
- throw new Error(data.message || '获取颜色信息失败');
- }
- } catch (error) {
- console.error('获取随机颜色失败:', error);
- this.showError(`获取随机颜色失败: ${error.message}`);
- }
- }
-
- async convertColor() {
- const colorInput = document.getElementById('colorInput');
- const colorValue = colorInput.value.trim();
-
- if (!colorValue) {
- this.showError('请输入要转换的颜色值');
- return;
- }
-
- // 简单的颜色格式验证
- if (!this.isValidColor(colorValue)) {
- this.showError('请输入有效的颜色值(如 #33AAFF)');
- return;
- }
-
- try {
- this.showLoading();
- const encoding = document.getElementById('encodingSelect').value;
- const url = `${this.apiUrl}?color=${encodeURIComponent(colorValue)}&encoding=${encoding}`;
-
- const response = await fetch(url);
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
- }
-
- const data = await response.json();
-
- if (data.code === 200) {
- this.displayColorData(data.data);
- this.hideLoading();
- this.hideError();
- this.showResultSection();
- } else {
- throw new Error(data.message || '转换颜色失败');
- }
- } catch (error) {
- console.error('转换颜色失败:', error);
- this.showError(`转换颜色失败: ${error.message}`);
- }
- }
-
- isValidColor(color) {
- // 支持十六进制颜色格式
- const hexPattern = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;
- // 支持RGB格式
- const rgbPattern = /^rgb\(\s*\d+\s*,\s*\d+\s*,\s*\d+\s*\)$/;
- // 支持HSL格式
- const hslPattern = /^hsl\(\s*\d+\s*,\s*\d+%\s*,\s*\d+%\s*\)$/;
-
- return hexPattern.test(color) || rgbPattern.test(color) || hslPattern.test(color);
- }
-
- displayColorData(data) {
- // 显示主要颜色信息
- this.updateColorDisplay(data);
-
- // 显示各种格式
- this.updateColorFormats(data);
-
- // 显示颜色属性
- this.updateColorProperties(data);
-
- // 显示配色方案
- this.updateColorPalette(data);
-
- // 显示无障碍性信息
- this.updateAccessibilityInfo(data);
- }
-
- updateColorDisplay(data) {
- const colorDisplay = document.getElementById('colorDisplay');
- const colorName = document.getElementById('colorName');
- const hexValue = document.getElementById('hexValue');
-
- colorDisplay.style.backgroundColor = data.hex;
- colorName.textContent = data.name || '未知颜色';
- hexValue.textContent = data.hex;
- }
-
- updateColorFormats(data) {
- // RGB
- if (data.rgb) {
- document.getElementById('rgbR').textContent = data.rgb.r;
- document.getElementById('rgbG').textContent = data.rgb.g;
- document.getElementById('rgbB').textContent = data.rgb.b;
- document.getElementById('rgbString').textContent = data.rgb.string;
- }
-
- // HSL
- if (data.hsl) {
- document.getElementById('hslH').textContent = data.hsl.h + '°';
- document.getElementById('hslS').textContent = data.hsl.s + '%';
- document.getElementById('hslL').textContent = data.hsl.l + '%';
- document.getElementById('hslString').textContent = data.hsl.string;
- }
-
- // HSV
- if (data.hsv) {
- document.getElementById('hsvH').textContent = data.hsv.h + '°';
- document.getElementById('hsvS').textContent = data.hsv.s + '%';
- document.getElementById('hsvV').textContent = data.hsv.v + '%';
- document.getElementById('hsvString').textContent = data.hsv.string;
- }
-
- // CMYK
- if (data.cmyk) {
- document.getElementById('cmykC').textContent = data.cmyk.c + '%';
- document.getElementById('cmykM').textContent = data.cmyk.m + '%';
- document.getElementById('cmykY').textContent = data.cmyk.y + '%';
- document.getElementById('cmykK').textContent = data.cmyk.k + '%';
- document.getElementById('cmykString').textContent = data.cmyk.string;
- }
-
- // LAB
- if (data.lab) {
- document.getElementById('labL').textContent = data.lab.l;
- document.getElementById('labA').textContent = data.lab.a;
- document.getElementById('labB').textContent = data.lab.b;
- document.getElementById('labString').textContent = data.lab.string;
- }
- }
-
- updateColorProperties(data) {
- // 亮度
- if (data.brightness !== undefined) {
- document.getElementById('brightness').textContent = data.brightness.toFixed(2);
- }
-
- // 对比度
- if (data.contrast) {
- document.getElementById('contrastWhite').textContent = data.contrast.white.toFixed(2);
- document.getElementById('contrastBlack').textContent = data.contrast.black.toFixed(2);
- }
-
- // 最佳文字颜色
- if (data.accessibility && data.accessibility.best_text_color) {
- const bestTextColor = document.getElementById('bestTextColor');
- bestTextColor.textContent = data.accessibility.best_text_color;
- bestTextColor.style.color = data.accessibility.best_text_color;
- }
- }
-
- updateColorPalette(data) {
- // 互补色
- if (data.complementary) {
- const complementary = document.getElementById('complementary');
- const complementaryHex = document.getElementById('complementaryHex');
- complementary.style.backgroundColor = data.complementary;
- complementaryHex.textContent = data.complementary;
- }
-
- // 类似色
- if (data.analogous && data.analogous.length >= 2) {
- const analogous1 = document.getElementById('analogous1');
- const analogous2 = document.getElementById('analogous2');
- const analogous1Hex = document.getElementById('analogous1Hex');
- const analogous2Hex = document.getElementById('analogous2Hex');
-
- analogous1.style.backgroundColor = data.analogous[0];
- analogous2.style.backgroundColor = data.analogous[1];
- analogous1Hex.textContent = data.analogous[0];
- analogous2Hex.textContent = data.analogous[1];
- }
-
- // 三角色
- if (data.triadic && data.triadic.length >= 2) {
- const triadic1 = document.getElementById('triadic1');
- const triadic2 = document.getElementById('triadic2');
- const triadic1Hex = document.getElementById('triadic1Hex');
- const triadic2Hex = document.getElementById('triadic2Hex');
-
- triadic1.style.backgroundColor = data.triadic[0];
- triadic2.style.backgroundColor = data.triadic[1];
- triadic1Hex.textContent = data.triadic[0];
- triadic2Hex.textContent = data.triadic[1];
- }
- }
-
- updateAccessibilityInfo(data) {
- if (data.accessibility) {
- const aaNormal = document.getElementById('aaNormal');
- const aaLarge = document.getElementById('aaLarge');
- const aaaNormal = document.getElementById('aaaNormal');
- const aaaLarge = document.getElementById('aaaLarge');
-
- this.updateAccessibilityStatus(aaNormal, data.accessibility.aa_normal);
- this.updateAccessibilityStatus(aaLarge, data.accessibility.aa_large);
- this.updateAccessibilityStatus(aaaNormal, data.accessibility.aaa_normal);
- this.updateAccessibilityStatus(aaaLarge, data.accessibility.aaa_large);
- }
- }
-
- updateAccessibilityStatus(element, status) {
- element.textContent = status ? '通过' : '未通过';
- element.className = 'status ' + (status ? 'pass' : 'fail');
- }
-
- // 复制颜色值到剪贴板
- copyToClipboard(text) {
- if (navigator.clipboard) {
- navigator.clipboard.writeText(text).then(() => {
- this.showToast('已复制到剪贴板');
- }).catch(err => {
- console.error('复制失败:', err);
- this.fallbackCopyTextToClipboard(text);
- });
- } else {
- this.fallbackCopyTextToClipboard(text);
- }
- }
-
- fallbackCopyTextToClipboard(text) {
- const textArea = document.createElement('textarea');
- textArea.value = text;
- textArea.style.top = '0';
- textArea.style.left = '0';
- textArea.style.position = 'fixed';
-
- document.body.appendChild(textArea);
- textArea.focus();
- textArea.select();
-
- try {
- const successful = document.execCommand('copy');
- if (successful) {
- this.showToast('已复制到剪贴板');
- } else {
- this.showToast('复制失败');
- }
- } catch (err) {
- console.error('复制失败:', err);
- this.showToast('复制失败');
- }
-
- document.body.removeChild(textArea);
- }
-
- showToast(message) {
- // 创建简单的提示框
- const toast = document.createElement('div');
- toast.textContent = message;
- toast.style.cssText = `
- position: fixed;
- top: 20px;
- right: 20px;
- background: #2d5a27;
- color: white;
- padding: 12px 20px;
- border-radius: 8px;
- z-index: 1000;
- font-size: 14px;
- box-shadow: 0 4px 12px rgba(0,0,0,0.15);
- animation: slideIn 0.3s ease;
- `;
-
- // 添加动画样式
- const style = document.createElement('style');
- style.textContent = `
- @keyframes slideIn {
- from { transform: translateX(100%); opacity: 0; }
- to { transform: translateX(0); opacity: 1; }
- }
- `;
- document.head.appendChild(style);
-
- document.body.appendChild(toast);
-
- setTimeout(() => {
- toast.style.animation = 'slideIn 0.3s ease reverse';
- setTimeout(() => {
- document.body.removeChild(toast);
- document.head.removeChild(style);
- }, 300);
- }, 2000);
- }
-}
-
-// 添加点击复制功能
-function addCopyListeners() {
- const colorTool = window.colorTool;
-
- // 为所有颜色值添加点击复制功能
- document.addEventListener('click', (e) => {
- const target = e.target;
-
- // 检查是否点击了颜色值相关元素
- if (target.id === 'hexValue' ||
- target.id === 'rgbString' ||
- target.id === 'hslString' ||
- target.id === 'hsvString' ||
- target.id === 'cmykString' ||
- target.id === 'labString' ||
- target.id === 'complementaryHex' ||
- target.id === 'analogous1Hex' ||
- target.id === 'analogous2Hex' ||
- target.id === 'triadic1Hex' ||
- target.id === 'triadic2Hex') {
-
- const text = target.textContent;
- if (text && colorTool) {
- colorTool.copyToClipboard(text);
- }
- }
- });
-}
-
-// 页面加载完成后初始化
-document.addEventListener('DOMContentLoaded', () => {
- window.colorTool = new ColorTool();
- addCopyListeners();
-
- // 添加复制提示
- const style = document.createElement('style');
- style.textContent = `
- #hexValue, #rgbString, #hslString, #hsvString, #cmykString, #labString,
- #complementaryHex, #analogous1Hex, #analogous2Hex, #triadic1Hex, #triadic2Hex {
- cursor: pointer;
- transition: all 0.2s ease;
- }
-
- #hexValue:hover, #rgbString:hover, #hslString:hover, #hsvString:hover,
- #cmykString:hover, #labString:hover, #complementaryHex:hover,
- #analogous1Hex:hover, #analogous2Hex:hover, #triadic1Hex:hover, #triadic2Hex:hover {
- background: rgba(45, 90, 39, 0.1);
- border-radius: 4px;
- padding: 2px 4px;
- margin: -2px -4px;
- }
- `;
- document.head.appendChild(style);
+// 随机颜色/颜色转换工具 JavaScript
+
+class ColorTool {
+ constructor() {
+ this.apiUrl = 'https://60s.api.shumengya.top/v2/color';
+ this.init();
+ }
+
+ init() {
+ this.bindEvents();
+ this.hideResultSection();
+ }
+
+ bindEvents() {
+ const randomBtn = document.getElementById('randomBtn');
+ const convertBtn = document.getElementById('convertBtn');
+ const colorInput = document.getElementById('colorInput');
+
+ randomBtn.addEventListener('click', () => this.getRandomColor());
+ convertBtn.addEventListener('click', () => this.convertColor());
+
+ // 回车键支持
+ colorInput.addEventListener('keypress', (e) => {
+ if (e.key === 'Enter') {
+ this.convertColor();
+ }
+ });
+ }
+
+ hideResultSection() {
+ const resultSection = document.querySelector('.result-section');
+ resultSection.style.display = 'none';
+ }
+
+ showResultSection() {
+ const resultSection = document.querySelector('.result-section');
+ resultSection.style.display = 'block';
+ }
+
+ showLoading() {
+ const loading = document.getElementById('loading');
+ const error = document.getElementById('error');
+ loading.style.display = 'block';
+ error.style.display = 'none';
+ this.hideResultSection();
+ }
+
+ hideLoading() {
+ const loading = document.getElementById('loading');
+ loading.style.display = 'none';
+ }
+
+ showError(message) {
+ const error = document.getElementById('error');
+ const errorMessage = document.getElementById('errorMessage');
+ const loading = document.getElementById('loading');
+
+ loading.style.display = 'none';
+ errorMessage.textContent = message;
+ error.style.display = 'block';
+ this.hideResultSection();
+ }
+
+ hideError() {
+ const error = document.getElementById('error');
+ error.style.display = 'none';
+ }
+
+ async getRandomColor() {
+ try {
+ this.showLoading();
+ const encoding = document.getElementById('encodingSelect').value;
+ const url = `${this.apiUrl}?encoding=${encoding}`;
+
+ const response = await fetch(url);
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+ }
+
+ const data = await response.json();
+
+ if (data.code === 200) {
+ this.displayColorData(data.data);
+ this.hideLoading();
+ this.hideError();
+ this.showResultSection();
+ } else {
+ throw new Error(data.message || '获取颜色信息失败');
+ }
+ } catch (error) {
+ console.error('获取随机颜色失败:', error);
+ this.showError(`获取随机颜色失败: ${error.message}`);
+ }
+ }
+
+ async convertColor() {
+ const colorInput = document.getElementById('colorInput');
+ const colorValue = colorInput.value.trim();
+
+ if (!colorValue) {
+ this.showError('请输入要转换的颜色值');
+ return;
+ }
+
+ // 简单的颜色格式验证
+ if (!this.isValidColor(colorValue)) {
+ this.showError('请输入有效的颜色值(如 #33AAFF)');
+ return;
+ }
+
+ try {
+ this.showLoading();
+ const encoding = document.getElementById('encodingSelect').value;
+ const url = `${this.apiUrl}?color=${encodeURIComponent(colorValue)}&encoding=${encoding}`;
+
+ const response = await fetch(url);
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+ }
+
+ const data = await response.json();
+
+ if (data.code === 200) {
+ this.displayColorData(data.data);
+ this.hideLoading();
+ this.hideError();
+ this.showResultSection();
+ } else {
+ throw new Error(data.message || '转换颜色失败');
+ }
+ } catch (error) {
+ console.error('转换颜色失败:', error);
+ this.showError(`转换颜色失败: ${error.message}`);
+ }
+ }
+
+ isValidColor(color) {
+ // 支持十六进制颜色格式
+ const hexPattern = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;
+ // 支持RGB格式
+ const rgbPattern = /^rgb\(\s*\d+\s*,\s*\d+\s*,\s*\d+\s*\)$/;
+ // 支持HSL格式
+ const hslPattern = /^hsl\(\s*\d+\s*,\s*\d+%\s*,\s*\d+%\s*\)$/;
+
+ return hexPattern.test(color) || rgbPattern.test(color) || hslPattern.test(color);
+ }
+
+ displayColorData(data) {
+ // 显示主要颜色信息
+ this.updateColorDisplay(data);
+
+ // 显示各种格式
+ this.updateColorFormats(data);
+
+ // 显示颜色属性
+ this.updateColorProperties(data);
+
+ // 显示配色方案
+ this.updateColorPalette(data);
+
+ // 显示无障碍性信息
+ this.updateAccessibilityInfo(data);
+ }
+
+ updateColorDisplay(data) {
+ const colorDisplay = document.getElementById('colorDisplay');
+ const colorName = document.getElementById('colorName');
+ const hexValue = document.getElementById('hexValue');
+
+ colorDisplay.style.backgroundColor = data.hex;
+ colorName.textContent = data.name || '未知颜色';
+ hexValue.textContent = data.hex;
+ }
+
+ updateColorFormats(data) {
+ // RGB
+ if (data.rgb) {
+ document.getElementById('rgbR').textContent = data.rgb.r;
+ document.getElementById('rgbG').textContent = data.rgb.g;
+ document.getElementById('rgbB').textContent = data.rgb.b;
+ document.getElementById('rgbString').textContent = data.rgb.string;
+ }
+
+ // HSL
+ if (data.hsl) {
+ document.getElementById('hslH').textContent = data.hsl.h + '°';
+ document.getElementById('hslS').textContent = data.hsl.s + '%';
+ document.getElementById('hslL').textContent = data.hsl.l + '%';
+ document.getElementById('hslString').textContent = data.hsl.string;
+ }
+
+ // HSV
+ if (data.hsv) {
+ document.getElementById('hsvH').textContent = data.hsv.h + '°';
+ document.getElementById('hsvS').textContent = data.hsv.s + '%';
+ document.getElementById('hsvV').textContent = data.hsv.v + '%';
+ document.getElementById('hsvString').textContent = data.hsv.string;
+ }
+
+ // CMYK
+ if (data.cmyk) {
+ document.getElementById('cmykC').textContent = data.cmyk.c + '%';
+ document.getElementById('cmykM').textContent = data.cmyk.m + '%';
+ document.getElementById('cmykY').textContent = data.cmyk.y + '%';
+ document.getElementById('cmykK').textContent = data.cmyk.k + '%';
+ document.getElementById('cmykString').textContent = data.cmyk.string;
+ }
+
+ // LAB
+ if (data.lab) {
+ document.getElementById('labL').textContent = data.lab.l;
+ document.getElementById('labA').textContent = data.lab.a;
+ document.getElementById('labB').textContent = data.lab.b;
+ document.getElementById('labString').textContent = data.lab.string;
+ }
+ }
+
+ updateColorProperties(data) {
+ // 亮度
+ if (data.brightness !== undefined) {
+ document.getElementById('brightness').textContent = data.brightness.toFixed(2);
+ }
+
+ // 对比度
+ if (data.contrast) {
+ document.getElementById('contrastWhite').textContent = data.contrast.white.toFixed(2);
+ document.getElementById('contrastBlack').textContent = data.contrast.black.toFixed(2);
+ }
+
+ // 最佳文字颜色
+ if (data.accessibility && data.accessibility.best_text_color) {
+ const bestTextColor = document.getElementById('bestTextColor');
+ bestTextColor.textContent = data.accessibility.best_text_color;
+ bestTextColor.style.color = data.accessibility.best_text_color;
+ }
+ }
+
+ updateColorPalette(data) {
+ // 互补色
+ if (data.complementary) {
+ const complementary = document.getElementById('complementary');
+ const complementaryHex = document.getElementById('complementaryHex');
+ complementary.style.backgroundColor = data.complementary;
+ complementaryHex.textContent = data.complementary;
+ }
+
+ // 类似色
+ if (data.analogous && data.analogous.length >= 2) {
+ const analogous1 = document.getElementById('analogous1');
+ const analogous2 = document.getElementById('analogous2');
+ const analogous1Hex = document.getElementById('analogous1Hex');
+ const analogous2Hex = document.getElementById('analogous2Hex');
+
+ analogous1.style.backgroundColor = data.analogous[0];
+ analogous2.style.backgroundColor = data.analogous[1];
+ analogous1Hex.textContent = data.analogous[0];
+ analogous2Hex.textContent = data.analogous[1];
+ }
+
+ // 三角色
+ if (data.triadic && data.triadic.length >= 2) {
+ const triadic1 = document.getElementById('triadic1');
+ const triadic2 = document.getElementById('triadic2');
+ const triadic1Hex = document.getElementById('triadic1Hex');
+ const triadic2Hex = document.getElementById('triadic2Hex');
+
+ triadic1.style.backgroundColor = data.triadic[0];
+ triadic2.style.backgroundColor = data.triadic[1];
+ triadic1Hex.textContent = data.triadic[0];
+ triadic2Hex.textContent = data.triadic[1];
+ }
+ }
+
+ updateAccessibilityInfo(data) {
+ if (data.accessibility) {
+ const aaNormal = document.getElementById('aaNormal');
+ const aaLarge = document.getElementById('aaLarge');
+ const aaaNormal = document.getElementById('aaaNormal');
+ const aaaLarge = document.getElementById('aaaLarge');
+
+ this.updateAccessibilityStatus(aaNormal, data.accessibility.aa_normal);
+ this.updateAccessibilityStatus(aaLarge, data.accessibility.aa_large);
+ this.updateAccessibilityStatus(aaaNormal, data.accessibility.aaa_normal);
+ this.updateAccessibilityStatus(aaaLarge, data.accessibility.aaa_large);
+ }
+ }
+
+ updateAccessibilityStatus(element, status) {
+ element.textContent = status ? '通过' : '未通过';
+ element.className = 'status ' + (status ? 'pass' : 'fail');
+ }
+
+ // 复制颜色值到剪贴板
+ copyToClipboard(text) {
+ if (navigator.clipboard) {
+ navigator.clipboard.writeText(text).then(() => {
+ this.showToast('已复制到剪贴板');
+ }).catch(err => {
+ console.error('复制失败:', err);
+ this.fallbackCopyTextToClipboard(text);
+ });
+ } else {
+ this.fallbackCopyTextToClipboard(text);
+ }
+ }
+
+ fallbackCopyTextToClipboard(text) {
+ const textArea = document.createElement('textarea');
+ textArea.value = text;
+ textArea.style.top = '0';
+ textArea.style.left = '0';
+ textArea.style.position = 'fixed';
+
+ document.body.appendChild(textArea);
+ textArea.focus();
+ textArea.select();
+
+ try {
+ const successful = document.execCommand('copy');
+ if (successful) {
+ this.showToast('已复制到剪贴板');
+ } else {
+ this.showToast('复制失败');
+ }
+ } catch (err) {
+ console.error('复制失败:', err);
+ this.showToast('复制失败');
+ }
+
+ document.body.removeChild(textArea);
+ }
+
+ showToast(message) {
+ // 创建简单的提示框
+ const toast = document.createElement('div');
+ toast.textContent = message;
+ toast.style.cssText = `
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ background: #2d5a27;
+ color: white;
+ padding: 12px 20px;
+ border-radius: 8px;
+ z-index: 1000;
+ font-size: 14px;
+ box-shadow: 0 4px 12px rgba(0,0,0,0.15);
+ animation: slideIn 0.3s ease;
+ `;
+
+ // 添加动画样式
+ const style = document.createElement('style');
+ style.textContent = `
+ @keyframes slideIn {
+ from { transform: translateX(100%); opacity: 0; }
+ to { transform: translateX(0); opacity: 1; }
+ }
+ `;
+ document.head.appendChild(style);
+
+ document.body.appendChild(toast);
+
+ setTimeout(() => {
+ toast.style.animation = 'slideIn 0.3s ease reverse';
+ setTimeout(() => {
+ document.body.removeChild(toast);
+ document.head.removeChild(style);
+ }, 300);
+ }, 2000);
+ }
+}
+
+// 添加点击复制功能
+function addCopyListeners() {
+ const colorTool = window.colorTool;
+
+ // 为所有颜色值添加点击复制功能
+ document.addEventListener('click', (e) => {
+ const target = e.target;
+
+ // 检查是否点击了颜色值相关元素
+ if (target.id === 'hexValue' ||
+ target.id === 'rgbString' ||
+ target.id === 'hslString' ||
+ target.id === 'hsvString' ||
+ target.id === 'cmykString' ||
+ target.id === 'labString' ||
+ target.id === 'complementaryHex' ||
+ target.id === 'analogous1Hex' ||
+ target.id === 'analogous2Hex' ||
+ target.id === 'triadic1Hex' ||
+ target.id === 'triadic2Hex') {
+
+ const text = target.textContent;
+ if (text && colorTool) {
+ colorTool.copyToClipboard(text);
+ }
+ }
+ });
+}
+
+// 页面加载完成后初始化
+document.addEventListener('DOMContentLoaded', () => {
+ window.colorTool = new ColorTool();
+ addCopyListeners();
+
+ // 添加复制提示
+ const style = document.createElement('style');
+ style.textContent = `
+ #hexValue, #rgbString, #hslString, #hsvString, #cmykString, #labString,
+ #complementaryHex, #analogous1Hex, #analogous2Hex, #triadic1Hex, #triadic2Hex {
+ cursor: pointer;
+ transition: all 0.2s ease;
+ }
+
+ #hexValue:hover, #rgbString:hover, #hslString:hover, #hsvString:hover,
+ #cmykString:hover, #labString:hover, #complementaryHex:hover,
+ #analogous1Hex:hover, #analogous2Hex:hover, #triadic1Hex:hover, #triadic2Hex:hover {
+ background: rgba(45, 90, 39, 0.1);
+ border-radius: 4px;
+ padding: 2px 4px;
+ margin: -2px -4px;
+ }
+ `;
+ document.head.appendChild(style);
});
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/styles.css b/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/styles.css
index cd53529c..5d990823 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/styles.css
+++ b/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/styles.css
@@ -1,637 +1,637 @@
-/* 基础样式重置 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
- line-height: 1.6;
- color: #2d3748;
- min-height: 100vh;
-}
-
-.container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 20px;
- min-height: 100vh;
-}
-
-/* 头部样式 */
-.header {
- text-align: center;
- margin-bottom: 30px;
- padding: 20px 0;
-}
-
-.header h1 {
- font-size: 2rem;
- color: #2d5a27;
- margin-bottom: 10px;
- font-weight: 600;
-}
-
-.subtitle {
- color: #4a5568;
- font-size: 1rem;
- opacity: 0.8;
-}
-
-/* 主要内容区域 */
-.main-content {
- display: flex;
- flex-direction: column;
- gap: 30px;
-}
-
-/* 输入区域 */
-.input-section {
- background: rgba(255, 255, 255, 0.9);
- padding: 25px;
- border-radius: 15px;
- box-shadow: 0 4px 20px rgba(45, 90, 39, 0.1);
- border: 1px solid rgba(144, 205, 144, 0.3);
-}
-
-.input-group {
- margin-bottom: 20px;
-}
-
-.input-group label {
- display: block;
- margin-bottom: 8px;
- font-weight: 500;
- color: #2d5a27;
- font-size: 0.95rem;
-}
-
-.input-group input,
-.input-group select {
- width: 100%;
- padding: 12px 15px;
- border: 2px solid #90cd90;
- border-radius: 10px;
- font-size: 1rem;
- transition: all 0.3s ease;
- background: #f8fff8;
-}
-
-.input-group input:focus,
-.input-group select:focus {
- outline: none;
- border-color: #2d5a27;
- box-shadow: 0 0 0 3px rgba(45, 90, 39, 0.1);
- background: #ffffff;
-}
-
-.button-group {
- display: flex;
- gap: 15px;
- margin-top: 25px;
-}
-
-.btn {
- flex: 1;
- padding: 15px 20px;
- border: none;
- border-radius: 10px;
- font-size: 1rem;
- font-weight: 500;
- cursor: pointer;
- transition: all 0.3s ease;
- text-transform: none;
-}
-
-.btn-primary {
- background: linear-gradient(135deg, #2d5a27, #4a7c59);
- color: white;
-}
-
-.btn-primary:hover {
- background: linear-gradient(135deg, #1e3a1a, #2d5a27);
- transform: translateY(-2px);
- box-shadow: 0 6px 20px rgba(45, 90, 39, 0.3);
-}
-
-.btn-secondary {
- background: linear-gradient(135deg, #90cd90, #a8d8a8);
- color: #2d5a27;
-}
-
-.btn-secondary:hover {
- background: linear-gradient(135deg, #7bb87b, #90cd90);
- transform: translateY(-2px);
- box-shadow: 0 6px 20px rgba(144, 205, 144, 0.4);
-}
-
-/* 结果展示区域 */
-.result-section {
- background: rgba(255, 255, 255, 0.9);
- padding: 25px;
- border-radius: 15px;
- box-shadow: 0 4px 20px rgba(45, 90, 39, 0.1);
- border: 1px solid rgba(144, 205, 144, 0.3);
-}
-
-/* 颜色预览 */
-.color-preview {
- display: flex;
- align-items: center;
- gap: 20px;
- margin-bottom: 30px;
- padding: 20px;
- background: #f8fff8;
- border-radius: 12px;
- border: 1px solid rgba(144, 205, 144, 0.2);
-}
-
-.color-box {
- width: 80px;
- height: 80px;
- border-radius: 12px;
- border: 3px solid #ffffff;
- box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
- flex-shrink: 0;
-}
-
-.color-info h3 {
- color: #2d5a27;
- margin-bottom: 5px;
- font-size: 1.2rem;
-}
-
-.color-info p {
- color: #4a5568;
- font-size: 1.1rem;
- font-weight: 500;
- font-family: 'Courier New', monospace;
-}
-
-/* 颜色格式展示 */
-.color-formats {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 20px;
- margin-bottom: 30px;
-}
-
-.format-group {
- background: #f8fff8;
- padding: 15px;
- border-radius: 10px;
- border: 1px solid rgba(144, 205, 144, 0.2);
-}
-
-.format-group h4 {
- color: #2d5a27;
- margin-bottom: 10px;
- font-size: 1rem;
- font-weight: 600;
-}
-
-.format-values {
- display: flex;
- gap: 8px;
- margin-bottom: 8px;
- flex-wrap: wrap;
-}
-
-.format-values span {
- background: #90cd90;
- color: #2d5a27;
- padding: 4px 8px;
- border-radius: 6px;
- font-size: 0.85rem;
- font-weight: 500;
-}
-
-.format-group p {
- font-family: 'Courier New', monospace;
- color: #4a5568;
- font-size: 0.9rem;
- background: #ffffff;
- padding: 8px;
- border-radius: 6px;
- border: 1px solid rgba(144, 205, 144, 0.2);
-}
-
-/* 颜色属性 */
-.color-properties {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 15px;
- margin-bottom: 30px;
-}
-
-.property-item {
- display: flex;
- justify-content: space-between;
- align-items: center;
- background: #f8fff8;
- padding: 12px 15px;
- border-radius: 8px;
- border: 1px solid rgba(144, 205, 144, 0.2);
-}
-
-.property-item label {
- color: #2d5a27;
- font-weight: 500;
- font-size: 0.9rem;
-}
-
-.property-item span {
- color: #4a5568;
- font-weight: 600;
- font-family: 'Courier New', monospace;
-}
-
-/* 配色方案 */
-.color-palette {
- margin-bottom: 30px;
-}
-
-.color-palette h4 {
- color: #2d5a27;
- margin-bottom: 15px;
- font-size: 1.1rem;
- font-weight: 600;
-}
-
-.palette-group {
- display: flex;
- flex-direction: column;
- gap: 15px;
-}
-
-.palette-item {
- background: #f8fff8;
- padding: 15px;
- border-radius: 10px;
- border: 1px solid rgba(144, 205, 144, 0.2);
-}
-
-.palette-item label {
- display: block;
- color: #2d5a27;
- font-weight: 500;
- margin-bottom: 10px;
- font-size: 0.95rem;
-}
-
-.color-sample {
- width: 40px;
- height: 40px;
- border-radius: 8px;
- border: 2px solid #ffffff;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
- display: inline-block;
- margin-right: 10px;
-}
-
-.analogous-colors,
-.triadic-colors {
- display: flex;
- gap: 10px;
- margin-bottom: 8px;
-}
-
-.analogous-hex,
-.triadic-hex {
- display: flex;
- gap: 10px;
- font-family: 'Courier New', monospace;
- font-size: 0.85rem;
- color: #4a5568;
-}
-
-/* 无障碍性信息 */
-.accessibility-info h4 {
- color: #2d5a27;
- margin-bottom: 15px;
- font-size: 1.1rem;
- font-weight: 600;
-}
-
-.accessibility-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 10px;
-}
-
-.accessibility-item {
- display: flex;
- justify-content: space-between;
- align-items: center;
- background: #f8fff8;
- padding: 10px 15px;
- border-radius: 8px;
- border: 1px solid rgba(144, 205, 144, 0.2);
-}
-
-.accessibility-item span:first-child {
- color: #2d5a27;
- font-weight: 500;
- font-size: 0.9rem;
-}
-
-.status {
- padding: 4px 8px;
- border-radius: 6px;
- font-size: 0.8rem;
- font-weight: 600;
-}
-
-.status.pass {
- background: #90cd90;
- color: #2d5a27;
-}
-
-.status.fail {
- background: #ffcccb;
- color: #d32f2f;
-}
-
-/* 加载和错误状态 */
-.loading,
-.error {
- text-align: center;
- padding: 40px 20px;
- border-radius: 12px;
- margin: 20px 0;
-}
-
-.loading {
- background: rgba(144, 205, 144, 0.1);
- border: 1px solid rgba(144, 205, 144, 0.3);
-}
-
-.error {
- background: rgba(255, 204, 203, 0.3);
- border: 1px solid rgba(211, 47, 47, 0.3);
-}
-
-.spinner {
- width: 40px;
- height: 40px;
- border: 4px solid rgba(144, 205, 144, 0.3);
- border-top: 4px solid #2d5a27;
- border-radius: 50%;
- animation: spin 1s linear infinite;
- margin: 0 auto 15px;
-}
-
-@keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-.loading p {
- color: #2d5a27;
- font-weight: 500;
-}
-
-.error p {
- color: #d32f2f;
- font-weight: 500;
-}
-
-/* 平板端适配 (768px - 1024px) */
-@media (min-width: 768px) and (max-width: 1024px) {
- .container {
- padding: 30px;
- }
-
- .header h1 {
- font-size: 2.5rem;
- }
-
- .main-content {
- gap: 35px;
- }
-
- .input-section,
- .result-section {
- padding: 30px;
- }
-
- .color-preview {
- gap: 25px;
- }
-
- .color-box {
- width: 100px;
- height: 100px;
- }
-
- .color-formats {
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
- }
-
- .palette-group {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
- gap: 20px;
- }
-}
-
-/* 电脑端适配 (1025px+) */
-@media (min-width: 1025px) {
- .container {
- padding: 40px;
- }
-
- .header h1 {
- font-size: 3rem;
- }
-
- .subtitle {
- font-size: 1.1rem;
- }
-
- .main-content {
- gap: 40px;
- }
-
- .input-section,
- .result-section {
- padding: 35px;
- }
-
- .color-preview {
- gap: 30px;
- padding: 25px;
- }
-
- .color-box {
- width: 120px;
- height: 120px;
- }
-
- .color-info h3 {
- font-size: 1.4rem;
- }
-
- .color-info p {
- font-size: 1.2rem;
- }
-
- .color-formats {
- grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
- gap: 25px;
- }
-
- .format-group {
- padding: 20px;
- }
-
- .palette-group {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- gap: 25px;
- }
-
- .button-group {
- max-width: 500px;
- margin: 25px auto 0;
- }
-
- .btn {
- padding: 18px 25px;
- font-size: 1.1rem;
- }
-}
-
-/* 手机端优化 (最高优先级) */
-@media (max-width: 767px) {
- .container {
- padding: 15px;
- }
-
- .header {
- margin-bottom: 25px;
- padding: 15px 0;
- }
-
- .header h1 {
- font-size: 1.8rem;
- }
-
- .subtitle {
- font-size: 0.9rem;
- }
-
- .main-content {
- gap: 25px;
- }
-
- .input-section,
- .result-section {
- padding: 20px;
- border-radius: 12px;
- }
-
- .input-group {
- margin-bottom: 18px;
- }
-
- .input-group input,
- .input-group select {
- padding: 14px 12px;
- font-size: 16px; /* 防止iOS缩放 */
- }
-
- .button-group {
- flex-direction: column;
- gap: 12px;
- margin-top: 20px;
- }
-
- .btn {
- padding: 16px 20px;
- font-size: 1rem;
- border-radius: 8px;
- }
-
- .color-preview {
- flex-direction: column;
- text-align: center;
- gap: 15px;
- padding: 15px;
- }
-
- .color-box {
- width: 100px;
- height: 100px;
- margin: 0 auto;
- }
-
- .color-formats {
- grid-template-columns: 1fr;
- gap: 15px;
- }
-
- .format-group {
- padding: 12px;
- }
-
- .format-values {
- justify-content: center;
- }
-
- .color-properties {
- grid-template-columns: 1fr;
- gap: 12px;
- }
-
- .property-item {
- flex-direction: column;
- gap: 5px;
- text-align: center;
- padding: 15px;
- }
-
- .palette-group {
- gap: 12px;
- }
-
- .palette-item {
- padding: 12px;
- text-align: center;
- }
-
- .analogous-colors,
- .triadic-colors {
- justify-content: center;
- }
-
- .analogous-hex,
- .triadic-hex {
- justify-content: center;
- flex-wrap: wrap;
- }
-
- .accessibility-grid {
- grid-template-columns: 1fr;
- gap: 8px;
- }
-
- .accessibility-item {
- flex-direction: column;
- gap: 5px;
- text-align: center;
- padding: 12px;
- }
-
- .loading,
- .error {
- padding: 30px 15px;
- margin: 15px 0;
- }
-
- .spinner {
- width: 35px;
- height: 35px;
- }
+/* 基础样式重置 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
+ line-height: 1.6;
+ color: #2d3748;
+ min-height: 100vh;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+ min-height: 100vh;
+}
+
+/* 头部样式 */
+.header {
+ text-align: center;
+ margin-bottom: 30px;
+ padding: 20px 0;
+}
+
+.header h1 {
+ font-size: 2rem;
+ color: #2d5a27;
+ margin-bottom: 10px;
+ font-weight: 600;
+}
+
+.subtitle {
+ color: #4a5568;
+ font-size: 1rem;
+ opacity: 0.8;
+}
+
+/* 主要内容区域 */
+.main-content {
+ display: flex;
+ flex-direction: column;
+ gap: 30px;
+}
+
+/* 输入区域 */
+.input-section {
+ background: rgba(255, 255, 255, 0.9);
+ padding: 25px;
+ border-radius: 15px;
+ box-shadow: 0 4px 20px rgba(45, 90, 39, 0.1);
+ border: 1px solid rgba(144, 205, 144, 0.3);
+}
+
+.input-group {
+ margin-bottom: 20px;
+}
+
+.input-group label {
+ display: block;
+ margin-bottom: 8px;
+ font-weight: 500;
+ color: #2d5a27;
+ font-size: 0.95rem;
+}
+
+.input-group input,
+.input-group select {
+ width: 100%;
+ padding: 12px 15px;
+ border: 2px solid #90cd90;
+ border-radius: 10px;
+ font-size: 1rem;
+ transition: all 0.3s ease;
+ background: #f8fff8;
+}
+
+.input-group input:focus,
+.input-group select:focus {
+ outline: none;
+ border-color: #2d5a27;
+ box-shadow: 0 0 0 3px rgba(45, 90, 39, 0.1);
+ background: #ffffff;
+}
+
+.button-group {
+ display: flex;
+ gap: 15px;
+ margin-top: 25px;
+}
+
+.btn {
+ flex: 1;
+ padding: 15px 20px;
+ border: none;
+ border-radius: 10px;
+ font-size: 1rem;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ text-transform: none;
+}
+
+.btn-primary {
+ background: linear-gradient(135deg, #2d5a27, #4a7c59);
+ color: white;
+}
+
+.btn-primary:hover {
+ background: linear-gradient(135deg, #1e3a1a, #2d5a27);
+ transform: translateY(-2px);
+ box-shadow: 0 6px 20px rgba(45, 90, 39, 0.3);
+}
+
+.btn-secondary {
+ background: linear-gradient(135deg, #90cd90, #a8d8a8);
+ color: #2d5a27;
+}
+
+.btn-secondary:hover {
+ background: linear-gradient(135deg, #7bb87b, #90cd90);
+ transform: translateY(-2px);
+ box-shadow: 0 6px 20px rgba(144, 205, 144, 0.4);
+}
+
+/* 结果展示区域 */
+.result-section {
+ background: rgba(255, 255, 255, 0.9);
+ padding: 25px;
+ border-radius: 15px;
+ box-shadow: 0 4px 20px rgba(45, 90, 39, 0.1);
+ border: 1px solid rgba(144, 205, 144, 0.3);
+}
+
+/* 颜色预览 */
+.color-preview {
+ display: flex;
+ align-items: center;
+ gap: 20px;
+ margin-bottom: 30px;
+ padding: 20px;
+ background: #f8fff8;
+ border-radius: 12px;
+ border: 1px solid rgba(144, 205, 144, 0.2);
+}
+
+.color-box {
+ width: 80px;
+ height: 80px;
+ border-radius: 12px;
+ border: 3px solid #ffffff;
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
+ flex-shrink: 0;
+}
+
+.color-info h3 {
+ color: #2d5a27;
+ margin-bottom: 5px;
+ font-size: 1.2rem;
+}
+
+.color-info p {
+ color: #4a5568;
+ font-size: 1.1rem;
+ font-weight: 500;
+ font-family: 'Courier New', monospace;
+}
+
+/* 颜色格式展示 */
+.color-formats {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: 20px;
+ margin-bottom: 30px;
+}
+
+.format-group {
+ background: #f8fff8;
+ padding: 15px;
+ border-radius: 10px;
+ border: 1px solid rgba(144, 205, 144, 0.2);
+}
+
+.format-group h4 {
+ color: #2d5a27;
+ margin-bottom: 10px;
+ font-size: 1rem;
+ font-weight: 600;
+}
+
+.format-values {
+ display: flex;
+ gap: 8px;
+ margin-bottom: 8px;
+ flex-wrap: wrap;
+}
+
+.format-values span {
+ background: #90cd90;
+ color: #2d5a27;
+ padding: 4px 8px;
+ border-radius: 6px;
+ font-size: 0.85rem;
+ font-weight: 500;
+}
+
+.format-group p {
+ font-family: 'Courier New', monospace;
+ color: #4a5568;
+ font-size: 0.9rem;
+ background: #ffffff;
+ padding: 8px;
+ border-radius: 6px;
+ border: 1px solid rgba(144, 205, 144, 0.2);
+}
+
+/* 颜色属性 */
+.color-properties {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: 15px;
+ margin-bottom: 30px;
+}
+
+.property-item {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ background: #f8fff8;
+ padding: 12px 15px;
+ border-radius: 8px;
+ border: 1px solid rgba(144, 205, 144, 0.2);
+}
+
+.property-item label {
+ color: #2d5a27;
+ font-weight: 500;
+ font-size: 0.9rem;
+}
+
+.property-item span {
+ color: #4a5568;
+ font-weight: 600;
+ font-family: 'Courier New', monospace;
+}
+
+/* 配色方案 */
+.color-palette {
+ margin-bottom: 30px;
+}
+
+.color-palette h4 {
+ color: #2d5a27;
+ margin-bottom: 15px;
+ font-size: 1.1rem;
+ font-weight: 600;
+}
+
+.palette-group {
+ display: flex;
+ flex-direction: column;
+ gap: 15px;
+}
+
+.palette-item {
+ background: #f8fff8;
+ padding: 15px;
+ border-radius: 10px;
+ border: 1px solid rgba(144, 205, 144, 0.2);
+}
+
+.palette-item label {
+ display: block;
+ color: #2d5a27;
+ font-weight: 500;
+ margin-bottom: 10px;
+ font-size: 0.95rem;
+}
+
+.color-sample {
+ width: 40px;
+ height: 40px;
+ border-radius: 8px;
+ border: 2px solid #ffffff;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.analogous-colors,
+.triadic-colors {
+ display: flex;
+ gap: 10px;
+ margin-bottom: 8px;
+}
+
+.analogous-hex,
+.triadic-hex {
+ display: flex;
+ gap: 10px;
+ font-family: 'Courier New', monospace;
+ font-size: 0.85rem;
+ color: #4a5568;
+}
+
+/* 无障碍性信息 */
+.accessibility-info h4 {
+ color: #2d5a27;
+ margin-bottom: 15px;
+ font-size: 1.1rem;
+ font-weight: 600;
+}
+
+.accessibility-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: 10px;
+}
+
+.accessibility-item {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ background: #f8fff8;
+ padding: 10px 15px;
+ border-radius: 8px;
+ border: 1px solid rgba(144, 205, 144, 0.2);
+}
+
+.accessibility-item span:first-child {
+ color: #2d5a27;
+ font-weight: 500;
+ font-size: 0.9rem;
+}
+
+.status {
+ padding: 4px 8px;
+ border-radius: 6px;
+ font-size: 0.8rem;
+ font-weight: 600;
+}
+
+.status.pass {
+ background: #90cd90;
+ color: #2d5a27;
+}
+
+.status.fail {
+ background: #ffcccb;
+ color: #d32f2f;
+}
+
+/* 加载和错误状态 */
+.loading,
+.error {
+ text-align: center;
+ padding: 40px 20px;
+ border-radius: 12px;
+ margin: 20px 0;
+}
+
+.loading {
+ background: rgba(144, 205, 144, 0.1);
+ border: 1px solid rgba(144, 205, 144, 0.3);
+}
+
+.error {
+ background: rgba(255, 204, 203, 0.3);
+ border: 1px solid rgba(211, 47, 47, 0.3);
+}
+
+.spinner {
+ width: 40px;
+ height: 40px;
+ border: 4px solid rgba(144, 205, 144, 0.3);
+ border-top: 4px solid #2d5a27;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ margin: 0 auto 15px;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+.loading p {
+ color: #2d5a27;
+ font-weight: 500;
+}
+
+.error p {
+ color: #d32f2f;
+ font-weight: 500;
+}
+
+/* 平板端适配 (768px - 1024px) */
+@media (min-width: 768px) and (max-width: 1024px) {
+ .container {
+ padding: 30px;
+ }
+
+ .header h1 {
+ font-size: 2.5rem;
+ }
+
+ .main-content {
+ gap: 35px;
+ }
+
+ .input-section,
+ .result-section {
+ padding: 30px;
+ }
+
+ .color-preview {
+ gap: 25px;
+ }
+
+ .color-box {
+ width: 100px;
+ height: 100px;
+ }
+
+ .color-formats {
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
+ }
+
+ .palette-group {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
+ gap: 20px;
+ }
+}
+
+/* 电脑端适配 (1025px+) */
+@media (min-width: 1025px) {
+ .container {
+ padding: 40px;
+ }
+
+ .header h1 {
+ font-size: 3rem;
+ }
+
+ .subtitle {
+ font-size: 1.1rem;
+ }
+
+ .main-content {
+ gap: 40px;
+ }
+
+ .input-section,
+ .result-section {
+ padding: 35px;
+ }
+
+ .color-preview {
+ gap: 30px;
+ padding: 25px;
+ }
+
+ .color-box {
+ width: 120px;
+ height: 120px;
+ }
+
+ .color-info h3 {
+ font-size: 1.4rem;
+ }
+
+ .color-info p {
+ font-size: 1.2rem;
+ }
+
+ .color-formats {
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
+ gap: 25px;
+ }
+
+ .format-group {
+ padding: 20px;
+ }
+
+ .palette-group {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 25px;
+ }
+
+ .button-group {
+ max-width: 500px;
+ margin: 25px auto 0;
+ }
+
+ .btn {
+ padding: 18px 25px;
+ font-size: 1.1rem;
+ }
+}
+
+/* 手机端优化 (最高优先级) */
+@media (max-width: 767px) {
+ .container {
+ padding: 15px;
+ }
+
+ .header {
+ margin-bottom: 25px;
+ padding: 15px 0;
+ }
+
+ .header h1 {
+ font-size: 1.8rem;
+ }
+
+ .subtitle {
+ font-size: 0.9rem;
+ }
+
+ .main-content {
+ gap: 25px;
+ }
+
+ .input-section,
+ .result-section {
+ padding: 20px;
+ border-radius: 12px;
+ }
+
+ .input-group {
+ margin-bottom: 18px;
+ }
+
+ .input-group input,
+ .input-group select {
+ padding: 14px 12px;
+ font-size: 16px; /* 防止iOS缩放 */
+ }
+
+ .button-group {
+ flex-direction: column;
+ gap: 12px;
+ margin-top: 20px;
+ }
+
+ .btn {
+ padding: 16px 20px;
+ font-size: 1rem;
+ border-radius: 8px;
+ }
+
+ .color-preview {
+ flex-direction: column;
+ text-align: center;
+ gap: 15px;
+ padding: 15px;
+ }
+
+ .color-box {
+ width: 100px;
+ height: 100px;
+ margin: 0 auto;
+ }
+
+ .color-formats {
+ grid-template-columns: 1fr;
+ gap: 15px;
+ }
+
+ .format-group {
+ padding: 12px;
+ }
+
+ .format-values {
+ justify-content: center;
+ }
+
+ .color-properties {
+ grid-template-columns: 1fr;
+ gap: 12px;
+ }
+
+ .property-item {
+ flex-direction: column;
+ gap: 5px;
+ text-align: center;
+ padding: 15px;
+ }
+
+ .palette-group {
+ gap: 12px;
+ }
+
+ .palette-item {
+ padding: 12px;
+ text-align: center;
+ }
+
+ .analogous-colors,
+ .triadic-colors {
+ justify-content: center;
+ }
+
+ .analogous-hex,
+ .triadic-hex {
+ justify-content: center;
+ flex-wrap: wrap;
+ }
+
+ .accessibility-grid {
+ grid-template-columns: 1fr;
+ gap: 8px;
+ }
+
+ .accessibility-item {
+ flex-direction: column;
+ gap: 5px;
+ text-align: center;
+ padding: 12px;
+ }
+
+ .loading,
+ .error {
+ padding: 30px 15px;
+ margin: 15px 0;
+ }
+
+ .spinner {
+ width: 35px;
+ height: 35px;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/返回接口.json b/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/返回接口.json
index 46d731ff..f1d44f5e 100755
--- a/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/实用功能/随机颜色/返回接口.json
@@ -1,60 +1,60 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "hex": "#A59619",
- "name": "红色系",
- "rgb": {
- "r": 165,
- "g": 150,
- "b": 25,
- "string": "rgb(165, 150, 25)"
- },
- "hsl": {
- "h": 54,
- "s": 74,
- "l": 37,
- "string": "hsl(54, 74%, 37%)"
- },
- "hsv": {
- "h": 54,
- "s": 85,
- "v": 65,
- "string": "hsv(54, 85%, 65%)"
- },
- "cmyk": {
- "c": 0,
- "m": 9,
- "y": 85,
- "k": 35,
- "string": "cmyk(0%, 9%, 85%, 35%)"
- },
- "lab": {
- "l": 62,
- "a": -7,
- "b": 61,
- "string": "lab(62, -7, 61)"
- },
- "brightness": 140.235,
- "contrast": {
- "white": 3.01,
- "black": 6.98
- },
- "accessibility": {
- "aa_normal": true,
- "aa_large": true,
- "aaa_normal": false,
- "aaa_large": true,
- "best_text_color": "#000000"
- },
- "complementary": "#1926A4",
- "analogous": [
- "#A45019",
- "#6CA419"
- ],
- "triadic": [
- "#19A496",
- "#9619A4"
- ]
- }
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "hex": "#A59619",
+ "name": "红色系",
+ "rgb": {
+ "r": 165,
+ "g": 150,
+ "b": 25,
+ "string": "rgb(165, 150, 25)"
+ },
+ "hsl": {
+ "h": 54,
+ "s": 74,
+ "l": 37,
+ "string": "hsl(54, 74%, 37%)"
+ },
+ "hsv": {
+ "h": 54,
+ "s": 85,
+ "v": 65,
+ "string": "hsv(54, 85%, 65%)"
+ },
+ "cmyk": {
+ "c": 0,
+ "m": 9,
+ "y": 85,
+ "k": 35,
+ "string": "cmyk(0%, 9%, 85%, 35%)"
+ },
+ "lab": {
+ "l": 62,
+ "a": -7,
+ "b": 61,
+ "string": "lab(62, -7, 61)"
+ },
+ "brightness": 140.235,
+ "contrast": {
+ "white": 3.01,
+ "black": 6.98
+ },
+ "accessibility": {
+ "aa_normal": true,
+ "aa_large": true,
+ "aaa_normal": false,
+ "aaa_large": true,
+ "best_text_color": "#000000"
+ },
+ "complementary": "#1926A4",
+ "analogous": [
+ "#A45019",
+ "#6CA419"
+ ],
+ "triadic": [
+ "#19A496",
+ "#9619A4"
+ ]
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/css/style.css b/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/css/style.css
index 69f3edbf..868c5f16 100755
--- a/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/css/style.css
@@ -1,423 +1,423 @@
-/* 历史上的今天 - 手机端优先的响应式设计 */
-
-/* 重置样式 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
- background: linear-gradient(135deg,
- #e8f5e8 0%, /* 淡绿色 */
- #f0f8e8 25%, /* 浅绿黄 */
- #fff8dc 50%, /* 淡黄色 */
- #f5f5dc 75%, /* 米色 */
- #e8f5e8 100% /* 淡绿色 */
- );
- background-size: 400% 400%;
- animation: freshGradientShift 20s ease infinite;
- min-height: 100vh;
- color: #2c3e50;
- line-height: 1.6;
- overflow-x: hidden;
-}
-
-@keyframes freshGradientShift {
- 0% { background-position: 0% 50%; }
- 25% { background-position: 100% 50%; }
- 50% { background-position: 100% 100%; }
- 75% { background-position: 0% 100%; }
- 100% { background-position: 0% 50%; }
-}
-
-.container {
- max-width: 100%;
- margin: 0 auto;
- padding: 10px;
-}
-
-/* 头部样式 - 手机端优先 */
-.header {
- text-align: center;
- margin-bottom: 20px;
- background: rgba(255, 255, 255, 0.9);
- border-radius: 20px;
- padding: 25px 20px;
- box-shadow: 0 8px 32px rgba(46, 125, 50, 0.15);
- backdrop-filter: blur(15px);
- border: 1px solid rgba(139, 195, 74, 0.2);
-}
-
-.header h1 {
- font-size: 1.8rem;
- color: #2c3e50;
- margin-bottom: 8px;
- font-weight: 700;
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 10px;
- flex-wrap: wrap;
-}
-
-.header p {
- color: #7f8c8d;
- font-size: 0.9rem;
- line-height: 1.4;
-}
-
-/* 日期显示 */
-.date-section {
- background: rgba(255, 255, 255, 0.9);
- border-radius: 16px;
- padding: 20px;
- margin-bottom: 20px;
- text-align: center;
- box-shadow: 0 6px 24px rgba(76, 175, 80, 0.12);
- border: 1px solid rgba(139, 195, 74, 0.2);
-}
-
-.date-display h2 {
- font-size: 1.4rem;
- color: #2e7d32;
- margin-bottom: 8px;
- font-weight: 600;
-}
-
-.date-display .date-text {
- color: #558b2f;
- font-size: 1rem;
- font-weight: 500;
-}
-
-/* 加载状态 */
-.loading {
- text-align: center;
- padding: 40px 20px;
- background: rgba(255, 255, 255, 0.9);
- border-radius: 16px;
- box-shadow: 0 6px 24px rgba(76, 175, 80, 0.12);
- border: 1px solid rgba(139, 195, 74, 0.2);
-}
-
-.loading-spinner {
- width: 40px;
- height: 40px;
- border: 3px solid rgba(139, 195, 74, 0.2);
- border-top: 3px solid #689f38;
- border-radius: 50%;
- animation: spin 1.2s linear infinite;
- margin: 0 auto 20px;
-}
-
-@keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-/* 历史事件容器 */
-.events-container {
- background: rgba(255, 255, 255, 0.9);
- border-radius: 20px;
- padding: 25px;
- margin-bottom: 20px;
- box-shadow: 0 8px 32px rgba(76, 175, 80, 0.15);
- backdrop-filter: blur(15px);
- border: 1px solid rgba(139, 195, 74, 0.2);
-}
-
-/* 统计信息 */
-.stats {
- display: grid;
- grid-template-columns: repeat(4, 1fr);
- gap: 12px;
- margin-bottom: 25px;
-}
-
-.stat-item {
- background: rgba(139, 195, 74, 0.15);
- border-radius: 12px;
- padding: 16px 12px;
- text-align: center;
- border: 1px solid rgba(139, 195, 74, 0.2);
- transition: all 0.3s ease;
-}
-
-.stat-item:hover {
- background: rgba(139, 195, 74, 0.2);
- transform: translateY(-2px);
-}
-
-.stat-number {
- font-size: 1.5rem;
- font-weight: 700;
- color: #558b2f;
- display: block;
-}
-
-.stat-label {
- color: #689f38;
- font-size: 0.85rem;
- margin-top: 4px;
- font-weight: 500;
-}
-
-/* 事件列表 */
-.events-list {
- display: flex;
- flex-direction: column;
- gap: 12px;
-}
-
-.event-card {
- background: rgba(255, 255, 255, 0.95);
- border-radius: 16px;
- padding: 20px;
- box-shadow: 0 4px 16px rgba(76, 175, 80, 0.1);
- transition: all 0.3s ease;
- border-left: 4px solid #81c784;
- position: relative;
- border: 1px solid rgba(139, 195, 74, 0.15);
-}
-
-.event-card:hover {
- transform: translateY(-3px);
- box-shadow: 0 8px 24px rgba(76, 175, 80, 0.15);
- border-left-color: #66bb6a;
-}
-
-/* 事件类型标签 */
-.event-type {
- position: absolute;
- top: 10px;
- right: 10px;
- padding: 4px 8px;
- border-radius: 12px;
- font-size: 0.7rem;
- font-weight: 600;
- text-transform: uppercase;
-}
-
-.event-type.birth {
- background: #e8f5e8;
- color: #2e7d32;
-}
-
-.event-type.death {
- background: #fff3e0;
- color: #f57c00;
-}
-
-.event-type.event {
- background: #f1f8e9;
- color: #558b2f;
-}
-
-/* 事件年份 */
-.event-year {
- font-size: 1.1rem;
- font-weight: 700;
- color: #558b2f;
- margin-bottom: 10px;
- display: flex;
- align-items: center;
- gap: 8px;
-}
-
-.event-year::before {
- content: "📅";
- font-size: 1rem;
-}
-
-/* 事件标题 */
-.event-title {
- font-size: 1rem;
- font-weight: 600;
- color: #2c3e50;
- margin-bottom: 8px;
- line-height: 1.4;
-}
-
-/* 事件描述 */
-.event-description {
- color: #7f8c8d;
- font-size: 0.85rem;
- line-height: 1.5;
- margin-bottom: 10px;
-}
-
-/* 链接按钮 */
-.event-link {
- display: inline-flex;
- align-items: center;
- gap: 6px;
- color: #558b2f;
- text-decoration: none;
- font-size: 0.85rem;
- font-weight: 500;
- padding: 8px 14px;
- background: rgba(139, 195, 74, 0.15);
- border-radius: 18px;
- transition: all 0.3s ease;
- border: 1px solid rgba(139, 195, 74, 0.2);
-}
-
-.event-link:hover {
- background: rgba(139, 195, 74, 0.25);
- transform: translateX(2px);
- color: #2e7d32;
-}
-
-.event-link::after {
- content: "🔗";
- font-size: 0.7rem;
-}
-
-/* 错误提示 */
-.error {
- background: #fed7d7;
- color: #c53030;
- padding: 15px;
- border-radius: 12px;
- text-align: center;
- border: 1px solid #feb2b2;
- margin: 15px 0;
- font-size: 0.9rem;
-}
-
-/* 隐藏类 */
-.hidden {
- display: none;
-}
-
-/* 淡入动画 */
-.fade-in {
- animation: fadeIn 0.6s ease-in;
-}
-
-@keyframes fadeIn {
- from {
- opacity: 0;
- transform: translateY(20px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-/* 平板端适配 (768px+) */
-@media (min-width: 768px) {
- .container {
- max-width: 750px;
- padding: 20px;
- }
-
- .header {
- padding: 30px 25px;
- }
-
- .header h1 {
- font-size: 2.2rem;
- }
-
- .header p {
- font-size: 1rem;
- }
-
- .date-info {
- padding: 20px;
- }
-
- .date-info h2 {
- font-size: 1.5rem;
- }
-
- .events-container {
- padding: 25px;
- }
-
- .stats {
- gap: 15px;
- }
-
- .event-card {
- padding: 20px;
- }
-
- .event-title {
- font-size: 1.1rem;
- }
-
- .event-description {
- font-size: 0.9rem;
- }
-}
-
-/* 电脑端适配 (1024px+) */
-@media (min-width: 1024px) {
- .container {
- max-width: 1000px;
- padding: 30px;
- }
-
- .header {
- padding: 40px 35px;
- }
-
- .header h1 {
- font-size: 2.5rem;
- }
-
- .events-list {
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: 20px;
- }
-
- .event-card {
- padding: 25px;
- }
-
- .event-title {
- font-size: 1.2rem;
- }
-
- .event-description {
- font-size: 0.95rem;
- }
-}
-
-/* 大屏幕优化 (1200px+) */
-@media (min-width: 1200px) {
- .container {
- max-width: 1200px;
- padding: 40px;
- }
-
- .events-list {
- grid-template-columns: repeat(3, 1fr);
- gap: 25px;
- }
-}
-
-/* 滚动条样式 */
-::-webkit-scrollbar {
- width: 8px;
-}
-
-::-webkit-scrollbar-track {
- background: rgba(139, 195, 74, 0.1);
- border-radius: 4px;
-}
-
-::-webkit-scrollbar-thumb {
- background: rgba(139, 195, 74, 0.5);
- border-radius: 4px;
-}
-
-::-webkit-scrollbar-thumb:hover {
- background: rgba(139, 195, 74, 0.7);
+/* 历史上的今天 - 手机端优先的响应式设计 */
+
+/* 重置样式 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ background: linear-gradient(135deg,
+ #e8f5e8 0%, /* 淡绿色 */
+ #f0f8e8 25%, /* 浅绿黄 */
+ #fff8dc 50%, /* 淡黄色 */
+ #f5f5dc 75%, /* 米色 */
+ #e8f5e8 100% /* 淡绿色 */
+ );
+ background-size: 400% 400%;
+ animation: freshGradientShift 20s ease infinite;
+ min-height: 100vh;
+ color: #2c3e50;
+ line-height: 1.6;
+ overflow-x: hidden;
+}
+
+@keyframes freshGradientShift {
+ 0% { background-position: 0% 50%; }
+ 25% { background-position: 100% 50%; }
+ 50% { background-position: 100% 100%; }
+ 75% { background-position: 0% 100%; }
+ 100% { background-position: 0% 50%; }
+}
+
+.container {
+ max-width: 100%;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+/* 头部样式 - 手机端优先 */
+.header {
+ text-align: center;
+ margin-bottom: 20px;
+ background: rgba(255, 255, 255, 0.9);
+ border-radius: 20px;
+ padding: 25px 20px;
+ box-shadow: 0 8px 32px rgba(46, 125, 50, 0.15);
+ backdrop-filter: blur(15px);
+ border: 1px solid rgba(139, 195, 74, 0.2);
+}
+
+.header h1 {
+ font-size: 1.8rem;
+ color: #2c3e50;
+ margin-bottom: 8px;
+ font-weight: 700;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 10px;
+ flex-wrap: wrap;
+}
+
+.header p {
+ color: #7f8c8d;
+ font-size: 0.9rem;
+ line-height: 1.4;
+}
+
+/* 日期显示 */
+.date-section {
+ background: rgba(255, 255, 255, 0.9);
+ border-radius: 16px;
+ padding: 20px;
+ margin-bottom: 20px;
+ text-align: center;
+ box-shadow: 0 6px 24px rgba(76, 175, 80, 0.12);
+ border: 1px solid rgba(139, 195, 74, 0.2);
+}
+
+.date-display h2 {
+ font-size: 1.4rem;
+ color: #2e7d32;
+ margin-bottom: 8px;
+ font-weight: 600;
+}
+
+.date-display .date-text {
+ color: #558b2f;
+ font-size: 1rem;
+ font-weight: 500;
+}
+
+/* 加载状态 */
+.loading {
+ text-align: center;
+ padding: 40px 20px;
+ background: rgba(255, 255, 255, 0.9);
+ border-radius: 16px;
+ box-shadow: 0 6px 24px rgba(76, 175, 80, 0.12);
+ border: 1px solid rgba(139, 195, 74, 0.2);
+}
+
+.loading-spinner {
+ width: 40px;
+ height: 40px;
+ border: 3px solid rgba(139, 195, 74, 0.2);
+ border-top: 3px solid #689f38;
+ border-radius: 50%;
+ animation: spin 1.2s linear infinite;
+ margin: 0 auto 20px;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+/* 历史事件容器 */
+.events-container {
+ background: rgba(255, 255, 255, 0.9);
+ border-radius: 20px;
+ padding: 25px;
+ margin-bottom: 20px;
+ box-shadow: 0 8px 32px rgba(76, 175, 80, 0.15);
+ backdrop-filter: blur(15px);
+ border: 1px solid rgba(139, 195, 74, 0.2);
+}
+
+/* 统计信息 */
+.stats {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 12px;
+ margin-bottom: 25px;
+}
+
+.stat-item {
+ background: rgba(139, 195, 74, 0.15);
+ border-radius: 12px;
+ padding: 16px 12px;
+ text-align: center;
+ border: 1px solid rgba(139, 195, 74, 0.2);
+ transition: all 0.3s ease;
+}
+
+.stat-item:hover {
+ background: rgba(139, 195, 74, 0.2);
+ transform: translateY(-2px);
+}
+
+.stat-number {
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: #558b2f;
+ display: block;
+}
+
+.stat-label {
+ color: #689f38;
+ font-size: 0.85rem;
+ margin-top: 4px;
+ font-weight: 500;
+}
+
+/* 事件列表 */
+.events-list {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.event-card {
+ background: rgba(255, 255, 255, 0.95);
+ border-radius: 16px;
+ padding: 20px;
+ box-shadow: 0 4px 16px rgba(76, 175, 80, 0.1);
+ transition: all 0.3s ease;
+ border-left: 4px solid #81c784;
+ position: relative;
+ border: 1px solid rgba(139, 195, 74, 0.15);
+}
+
+.event-card:hover {
+ transform: translateY(-3px);
+ box-shadow: 0 8px 24px rgba(76, 175, 80, 0.15);
+ border-left-color: #66bb6a;
+}
+
+/* 事件类型标签 */
+.event-type {
+ position: absolute;
+ top: 10px;
+ right: 10px;
+ padding: 4px 8px;
+ border-radius: 12px;
+ font-size: 0.7rem;
+ font-weight: 600;
+ text-transform: uppercase;
+}
+
+.event-type.birth {
+ background: #e8f5e8;
+ color: #2e7d32;
+}
+
+.event-type.death {
+ background: #fff3e0;
+ color: #f57c00;
+}
+
+.event-type.event {
+ background: #f1f8e9;
+ color: #558b2f;
+}
+
+/* 事件年份 */
+.event-year {
+ font-size: 1.1rem;
+ font-weight: 700;
+ color: #558b2f;
+ margin-bottom: 10px;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.event-year::before {
+ content: "📅";
+ font-size: 1rem;
+}
+
+/* 事件标题 */
+.event-title {
+ font-size: 1rem;
+ font-weight: 600;
+ color: #2c3e50;
+ margin-bottom: 8px;
+ line-height: 1.4;
+}
+
+/* 事件描述 */
+.event-description {
+ color: #7f8c8d;
+ font-size: 0.85rem;
+ line-height: 1.5;
+ margin-bottom: 10px;
+}
+
+/* 链接按钮 */
+.event-link {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ color: #558b2f;
+ text-decoration: none;
+ font-size: 0.85rem;
+ font-weight: 500;
+ padding: 8px 14px;
+ background: rgba(139, 195, 74, 0.15);
+ border-radius: 18px;
+ transition: all 0.3s ease;
+ border: 1px solid rgba(139, 195, 74, 0.2);
+}
+
+.event-link:hover {
+ background: rgba(139, 195, 74, 0.25);
+ transform: translateX(2px);
+ color: #2e7d32;
+}
+
+.event-link::after {
+ content: "🔗";
+ font-size: 0.7rem;
+}
+
+/* 错误提示 */
+.error {
+ background: #fed7d7;
+ color: #c53030;
+ padding: 15px;
+ border-radius: 12px;
+ text-align: center;
+ border: 1px solid #feb2b2;
+ margin: 15px 0;
+ font-size: 0.9rem;
+}
+
+/* 隐藏类 */
+.hidden {
+ display: none;
+}
+
+/* 淡入动画 */
+.fade-in {
+ animation: fadeIn 0.6s ease-in;
+}
+
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+/* 平板端适配 (768px+) */
+@media (min-width: 768px) {
+ .container {
+ max-width: 750px;
+ padding: 20px;
+ }
+
+ .header {
+ padding: 30px 25px;
+ }
+
+ .header h1 {
+ font-size: 2.2rem;
+ }
+
+ .header p {
+ font-size: 1rem;
+ }
+
+ .date-info {
+ padding: 20px;
+ }
+
+ .date-info h2 {
+ font-size: 1.5rem;
+ }
+
+ .events-container {
+ padding: 25px;
+ }
+
+ .stats {
+ gap: 15px;
+ }
+
+ .event-card {
+ padding: 20px;
+ }
+
+ .event-title {
+ font-size: 1.1rem;
+ }
+
+ .event-description {
+ font-size: 0.9rem;
+ }
+}
+
+/* 电脑端适配 (1024px+) */
+@media (min-width: 1024px) {
+ .container {
+ max-width: 1000px;
+ padding: 30px;
+ }
+
+ .header {
+ padding: 40px 35px;
+ }
+
+ .header h1 {
+ font-size: 2.5rem;
+ }
+
+ .events-list {
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ gap: 20px;
+ }
+
+ .event-card {
+ padding: 25px;
+ }
+
+ .event-title {
+ font-size: 1.2rem;
+ }
+
+ .event-description {
+ font-size: 0.95rem;
+ }
+}
+
+/* 大屏幕优化 (1200px+) */
+@media (min-width: 1200px) {
+ .container {
+ max-width: 1200px;
+ padding: 40px;
+ }
+
+ .events-list {
+ grid-template-columns: repeat(3, 1fr);
+ gap: 25px;
+ }
+}
+
+/* 滚动条样式 */
+::-webkit-scrollbar {
+ width: 8px;
+}
+
+::-webkit-scrollbar-track {
+ background: rgba(139, 195, 74, 0.1);
+ border-radius: 4px;
+}
+
+::-webkit-scrollbar-thumb {
+ background: rgba(139, 195, 74, 0.5);
+ border-radius: 4px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: rgba(139, 195, 74, 0.7);
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/index.html b/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/index.html
index 2f941a44..ececc84d 100755
--- a/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/index.html
+++ b/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/index.html
@@ -1,83 +1,83 @@
-
-
-
-
-
-
-
- 历史上的今天 - 60s API集合
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+ 历史上的今天 - 60s API集合
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/js/script.js b/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/js/script.js
index bb0ca469..a979d6a4 100755
--- a/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/js/script.js
@@ -1,295 +1,295 @@
-// 历史上的今天 - JavaScript 功能实现
-
-// API 配置
-const API = {
- endpoints: [],
- currentIndex: 0,
- encoding: 'utf-8',
- // 初始化API接口列表
- async init() {
- try {
- const res = await fetch('./接口集合.json');
- const endpoints = await res.json();
- this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/today_in_history`);
- } catch (e) {
- // 如果无法加载接口集合,使用默认接口
- this.endpoints = ['https://60s.api.shumengya.top/v2/today_in_history'];
- }
- },
- // 获取当前接口URL
- getCurrentUrl() {
- if (this.endpoints.length === 0) return null;
- const url = new URL(this.endpoints[this.currentIndex]);
- url.searchParams.append('encoding', this.encoding);
- return url.toString();
- },
- // 切换到下一个接口
- switchToNext() {
- this.currentIndex = (this.currentIndex + 1) % this.endpoints.length;
- return this.currentIndex < this.endpoints.length;
- },
- // 重置到第一个接口
- reset() {
- this.currentIndex = 0;
- }
-};
-
-// 事件类型映射
-const EVENT_TYPE_MAP = {
- 'birth': { name: '诞生', icon: '🎂', color: '#27ae60' },
- 'death': { name: '逝世', icon: '🕊️', color: '#e67e22' },
- 'event': { name: '事件', icon: '📰', color: '#3498db' }
-};
-
-// DOM 元素
-let elements = {};
-let currentData = null;
-
-// 页面加载完成后初始化
-document.addEventListener('DOMContentLoaded', function() {
- initElements();
- loadTodayInHistory();
-});
-
-// 初始化 DOM 元素
-function initElements() {
- elements = {
- loading: document.getElementById('loading'),
- content: document.getElementById('history-content'),
- dateInfo: document.getElementById('date-info'),
- dateText: document.getElementById('date-text'),
- totalEvents: document.getElementById('total-events'),
- birthEvents: document.getElementById('birth-events'),
- deathEvents: document.getElementById('death-events'),
- otherEvents: document.getElementById('other-events'),
- eventsList: document.getElementById('events-list')
- };
-}
-
-// 加载历史上的今天数据
-async function loadTodayInHistory() {
- try {
- showLoading(true);
-
- // 初始化API接口列表
- await API.init();
-
- // 重置API索引到第一个接口
- API.reset();
-
- // 尝试所有API接口
- for (let i = 0; i < API.endpoints.length; i++) {
- try {
- const url = API.getCurrentUrl();
- console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`);
-
- const response = await fetch(url, {
- cache: 'no-store',
- timeout: 10000 // 10秒超时
- });
-
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
- }
-
- const data = await response.json();
- console.log('API响应数据:', data);
-
- if (data.code === 200 && data.data) {
- console.log(`接口 ${i + 1} 请求成功`);
- currentData = data.data;
- displayHistoryData(data.data);
- return;
- } else {
- throw new Error(data.message || '获取数据失败');
- }
-
- } catch (error) {
- console.warn(`接口 ${i + 1} 失败:`, error.message);
-
- // 如果不是最后一个接口,切换到下一个
- if (i < API.endpoints.length - 1) {
- API.switchToNext();
- continue;
- }
-
- // 所有接口都失败了,抛出错误
- throw new Error('所有接口都无法访问');
- }
- }
-
- } catch (error) {
- console.error('加载历史数据失败:', error);
- showError(`加载失败: ${error.message}`);
- } finally {
- showLoading(false);
- }
-}
-
-// 显示历史数据
-function displayHistoryData(data) {
- if (!data || !data.items) {
- showError('没有获取到历史数据');
- return;
- }
-
- // 更新日期信息
- updateDateInfo(data);
-
- // 更新统计信息
- updateStats(data.items);
-
- // 显示事件列表
- renderEventsList(data.items);
-
- // 显示内容区域
- if (elements.content) {
- elements.content.classList.add('fade-in');
- elements.content.style.display = 'block';
- }
-}
-
-// 更新日期信息
-function updateDateInfo(data) {
- if (elements.dateText && data.date) {
- const today = new Date();
- const year = today.getFullYear();
- elements.dateText.textContent = `${year}年${data.month}月${data.day}日`;
- }
-}
-
-// 更新统计信息
-function updateStats(items) {
- const stats = {
- total: items.length,
- birth: items.filter(item => item.event_type === 'birth').length,
- death: items.filter(item => item.event_type === 'death').length,
- event: items.filter(item => item.event_type === 'event').length
- };
-
- if (elements.totalEvents) {
- elements.totalEvents.textContent = stats.total;
- }
-
- if (elements.birthEvents) {
- elements.birthEvents.textContent = stats.birth;
- }
-
- if (elements.deathEvents) {
- elements.deathEvents.textContent = stats.death;
- }
-
- if (elements.otherEvents) {
- elements.otherEvents.textContent = stats.event;
- }
-}
-
-// 渲染事件列表
-function renderEventsList(items) {
- if (!elements.eventsList || !items) return;
-
- // 按年份排序(从今到古)
- const sortedItems = [...items].sort((a, b) => {
- return parseInt(b.year) - parseInt(a.year);
- });
-
- elements.eventsList.innerHTML = '';
-
- sortedItems.forEach(item => {
- const eventCard = createEventCard(item);
- elements.eventsList.appendChild(eventCard);
- });
-}
-
-// 创建事件卡片
-function createEventCard(item) {
- const card = document.createElement('div');
- card.className = 'event-card';
-
- const eventType = EVENT_TYPE_MAP[item.event_type] || EVENT_TYPE_MAP['event'];
-
- card.innerHTML = `
- ${eventType.name}
- ${formatYear(item.year)}
- ${escapeHtml(item.title)}
- ${escapeHtml(item.description)}
- ${item.link ? `了解更多` : ''}
- `;
-
- return card;
-}
-
-// 格式化年份显示
-function formatYear(year) {
- const yearNum = parseInt(year);
- if (yearNum < 0) {
- return `公元前${Math.abs(yearNum)}年`;
- } else if (yearNum < 1000) {
- return `公元${yearNum}年`;
- } else {
- return `${yearNum}年`;
- }
-}
-
-// 显示加载状态
-function showLoading(show) {
- if (elements.loading) {
- elements.loading.style.display = show ? 'block' : 'none';
- }
-
- if (elements.content) {
- elements.content.style.display = show ? 'none' : 'block';
- }
-}
-
-// 显示错误信息
-function showError(message) {
- if (elements.content) {
- elements.content.innerHTML = `
-
-
😔 加载失败
-
${escapeHtml(message)}
-
-
- `;
- elements.content.style.display = 'block';
- }
-}
-
-// HTML 转义
-function escapeHtml(text) {
- const div = document.createElement('div');
- div.textContent = text;
- return div.innerHTML;
-}
-
-// 错误处理
-window.addEventListener('error', function(event) {
- console.error('页面错误:', event.error);
-});
-
-// 网络状态监听
-window.addEventListener('online', function() {
- console.log('网络已连接');
-});
-
-window.addEventListener('offline', function() {
- console.log('网络已断开');
- showError('网络连接已断开,请检查网络设置');
-});
-
-// 导出全局方法
-window.TodayInHistory = {
- loadTodayInHistory,
- showError,
- showLoading
+// 历史上的今天 - JavaScript 功能实现
+
+// API 配置
+const API = {
+ endpoints: [],
+ currentIndex: 0,
+ encoding: 'utf-8',
+ // 初始化API接口列表
+ async init() {
+ try {
+ const res = await fetch('./接口集合.json');
+ const endpoints = await res.json();
+ this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/today_in_history`);
+ } catch (e) {
+ // 如果无法加载接口集合,使用默认接口
+ this.endpoints = ['https://60s.api.shumengya.top/v2/today_in_history'];
+ }
+ },
+ // 获取当前接口URL
+ getCurrentUrl() {
+ if (this.endpoints.length === 0) return null;
+ const url = new URL(this.endpoints[this.currentIndex]);
+ url.searchParams.append('encoding', this.encoding);
+ return url.toString();
+ },
+ // 切换到下一个接口
+ switchToNext() {
+ this.currentIndex = (this.currentIndex + 1) % this.endpoints.length;
+ return this.currentIndex < this.endpoints.length;
+ },
+ // 重置到第一个接口
+ reset() {
+ this.currentIndex = 0;
+ }
+};
+
+// 事件类型映射
+const EVENT_TYPE_MAP = {
+ 'birth': { name: '诞生', icon: '🎂', color: '#27ae60' },
+ 'death': { name: '逝世', icon: '🕊️', color: '#e67e22' },
+ 'event': { name: '事件', icon: '📰', color: '#3498db' }
+};
+
+// DOM 元素
+let elements = {};
+let currentData = null;
+
+// 页面加载完成后初始化
+document.addEventListener('DOMContentLoaded', function() {
+ initElements();
+ loadTodayInHistory();
+});
+
+// 初始化 DOM 元素
+function initElements() {
+ elements = {
+ loading: document.getElementById('loading'),
+ content: document.getElementById('history-content'),
+ dateInfo: document.getElementById('date-info'),
+ dateText: document.getElementById('date-text'),
+ totalEvents: document.getElementById('total-events'),
+ birthEvents: document.getElementById('birth-events'),
+ deathEvents: document.getElementById('death-events'),
+ otherEvents: document.getElementById('other-events'),
+ eventsList: document.getElementById('events-list')
+ };
+}
+
+// 加载历史上的今天数据
+async function loadTodayInHistory() {
+ try {
+ showLoading(true);
+
+ // 初始化API接口列表
+ await API.init();
+
+ // 重置API索引到第一个接口
+ API.reset();
+
+ // 尝试所有API接口
+ for (let i = 0; i < API.endpoints.length; i++) {
+ try {
+ const url = API.getCurrentUrl();
+ console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`);
+
+ const response = await fetch(url, {
+ cache: 'no-store',
+ timeout: 10000 // 10秒超时
+ });
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+ }
+
+ const data = await response.json();
+ console.log('API响应数据:', data);
+
+ if (data.code === 200 && data.data) {
+ console.log(`接口 ${i + 1} 请求成功`);
+ currentData = data.data;
+ displayHistoryData(data.data);
+ return;
+ } else {
+ throw new Error(data.message || '获取数据失败');
+ }
+
+ } catch (error) {
+ console.warn(`接口 ${i + 1} 失败:`, error.message);
+
+ // 如果不是最后一个接口,切换到下一个
+ if (i < API.endpoints.length - 1) {
+ API.switchToNext();
+ continue;
+ }
+
+ // 所有接口都失败了,抛出错误
+ throw new Error('所有接口都无法访问');
+ }
+ }
+
+ } catch (error) {
+ console.error('加载历史数据失败:', error);
+ showError(`加载失败: ${error.message}`);
+ } finally {
+ showLoading(false);
+ }
+}
+
+// 显示历史数据
+function displayHistoryData(data) {
+ if (!data || !data.items) {
+ showError('没有获取到历史数据');
+ return;
+ }
+
+ // 更新日期信息
+ updateDateInfo(data);
+
+ // 更新统计信息
+ updateStats(data.items);
+
+ // 显示事件列表
+ renderEventsList(data.items);
+
+ // 显示内容区域
+ if (elements.content) {
+ elements.content.classList.add('fade-in');
+ elements.content.style.display = 'block';
+ }
+}
+
+// 更新日期信息
+function updateDateInfo(data) {
+ if (elements.dateText && data.date) {
+ const today = new Date();
+ const year = today.getFullYear();
+ elements.dateText.textContent = `${year}年${data.month}月${data.day}日`;
+ }
+}
+
+// 更新统计信息
+function updateStats(items) {
+ const stats = {
+ total: items.length,
+ birth: items.filter(item => item.event_type === 'birth').length,
+ death: items.filter(item => item.event_type === 'death').length,
+ event: items.filter(item => item.event_type === 'event').length
+ };
+
+ if (elements.totalEvents) {
+ elements.totalEvents.textContent = stats.total;
+ }
+
+ if (elements.birthEvents) {
+ elements.birthEvents.textContent = stats.birth;
+ }
+
+ if (elements.deathEvents) {
+ elements.deathEvents.textContent = stats.death;
+ }
+
+ if (elements.otherEvents) {
+ elements.otherEvents.textContent = stats.event;
+ }
+}
+
+// 渲染事件列表
+function renderEventsList(items) {
+ if (!elements.eventsList || !items) return;
+
+ // 按年份排序(从今到古)
+ const sortedItems = [...items].sort((a, b) => {
+ return parseInt(b.year) - parseInt(a.year);
+ });
+
+ elements.eventsList.innerHTML = '';
+
+ sortedItems.forEach(item => {
+ const eventCard = createEventCard(item);
+ elements.eventsList.appendChild(eventCard);
+ });
+}
+
+// 创建事件卡片
+function createEventCard(item) {
+ const card = document.createElement('div');
+ card.className = 'event-card';
+
+ const eventType = EVENT_TYPE_MAP[item.event_type] || EVENT_TYPE_MAP['event'];
+
+ card.innerHTML = `
+ ${eventType.name}
+ ${formatYear(item.year)}
+ ${escapeHtml(item.title)}
+ ${escapeHtml(item.description)}
+ ${item.link ? `了解更多` : ''}
+ `;
+
+ return card;
+}
+
+// 格式化年份显示
+function formatYear(year) {
+ const yearNum = parseInt(year);
+ if (yearNum < 0) {
+ return `公元前${Math.abs(yearNum)}年`;
+ } else if (yearNum < 1000) {
+ return `公元${yearNum}年`;
+ } else {
+ return `${yearNum}年`;
+ }
+}
+
+// 显示加载状态
+function showLoading(show) {
+ if (elements.loading) {
+ elements.loading.style.display = show ? 'block' : 'none';
+ }
+
+ if (elements.content) {
+ elements.content.style.display = show ? 'none' : 'block';
+ }
+}
+
+// 显示错误信息
+function showError(message) {
+ if (elements.content) {
+ elements.content.innerHTML = `
+
+
😔 加载失败
+
${escapeHtml(message)}
+
+
+ `;
+ elements.content.style.display = 'block';
+ }
+}
+
+// HTML 转义
+function escapeHtml(text) {
+ const div = document.createElement('div');
+ div.textContent = text;
+ return div.innerHTML;
+}
+
+// 错误处理
+window.addEventListener('error', function(event) {
+ console.error('页面错误:', event.error);
+});
+
+// 网络状态监听
+window.addEventListener('online', function() {
+ console.log('网络已连接');
+});
+
+window.addEventListener('offline', function() {
+ console.log('网络已断开');
+ showError('网络连接已断开,请检查网络设置');
+});
+
+// 导出全局方法
+window.TodayInHistory = {
+ loadTodayInHistory,
+ showError,
+ showLoading
};
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/接口集合.json b/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/接口集合.json
index 547b2771..42245813 100755
--- a/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/接口集合.json
+++ b/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/接口集合.json
@@ -1,3 +1,3 @@
-[
- "https://60s.api.shumengya.top"
-]
+[
+ "https://60s.api.shumengya.top"
+]
diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/返回接口.json b/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/返回接口.json
index 8531e735..7efaf65b 100755
--- a/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/日更资讯/历史上的今天/返回接口.json
@@ -1,102 +1,102 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "date": "8-19",
- "month": 8,
- "day": 19,
- "items": [
- {
- "title": "罗马帝国开国皇帝奥古斯都逝世",
- "year": "14",
- "description": "奥古斯都(拉丁文 Augustus的中译,复数型 Augusti)的原意为“神圣的”、“高贵的”,带有宗教与神学式的意味。",
- "event_type": "death",
- "link": "https://baike.baidu.com/item/%E5%A5%A5%E5%8F%A4%E6%96%AF%E9%83%BD/14291"
- },
- {
- "title": "近代概率论的奠基者帕斯卡逝世",
- "year": "1662",
- "description": "布莱士·帕斯卡(Blaise Pascal ,1623-1662)是法国数学家、物理学家、哲学家、散文家。",
- "event_type": "death",
- "link": "https://baike.baidu.com/item/%E5%B8%83%E8%8E%B1%E5%A3%AB%C2%B7%E5%B8%95%E6%96%AF%E5%8D%A1"
- },
- {
- "title": "瑞典国王古斯塔夫三世发动政变夺取权力",
- "year": "1772",
- "description": "古斯塔夫三世(Gustavus III,1746-1792)是瑞典历史上褒贬最多的国王(1771-1792)。阿道夫·弗里德里克国王的儿子和继承者。",
- "event_type": "event",
- "link": "https://baike.baidu.com/item/%E5%8F%A4%E6%96%AF%E5%A1%94%E5%A4%AB%E4%B8%89%E4%B8%96"
- },
- {
- "title": "美国飞机设计师奥维尔·莱特诞生",
- "year": "1871",
- "description": "奥威尔莱特(公元1871~公元1948)。 奥维尔·莱特1871年生于美国俄亥俄州代顿市。上过中学,但实际上未获得毕业文凭。",
- "event_type": "birth",
- "link": "https://baike.baidu.com/item/%E5%A5%A5%E7%BB%B4%E5%B0%94%C2%B7%E8%8E%B1%E7%89%B9"
- },
- {
- "title": "法国著名时装设计师、香奈儿品牌创始人加布里埃·香奈儿出生",
- "year": "1883",
- "description": "香奈儿儿时入读修女院学校学得一手针线活。后来她与许多上流社会男士有过交往。1910年,毅然放弃嫁入豪门做阔太太的她在巴黎开设了一家女装帽子店,从此开创了香奈儿时尚帝国。",
- "event_type": "birth",
- "link": "https://baike.baidu.com/item/%E5%8A%A0%E5%B8%83%E9%87%8C%E5%9F%83%C2%B7%E9%A6%99%E5%A5%88%E5%84%BF/9480318"
- },
- {
- "title": "美国宇航员斯托里·马斯格雷夫出生",
- "year": "1935",
- "description": "斯托里·马斯格雷夫(Franklin Story Musgrave,1935年8月19日-),美国宇航员,拥有医学、数学、文学等六个学位,入选美国国家航空航天局(NASA)科学家宇航员。",
- "event_type": "birth",
- "link": "https://baike.baidu.com/item/%E6%96%AF%E6%89%98%E9%87%8C%C2%B7%E9%A9%AC%E6%96%AF%E6%A0%BC%E9%9B%B7%E5%A4%AB"
- },
- {
- "title": "纳粹德国陆军元帅京特·冯·克鲁格畏罪自杀",
- "year": "1944",
- "description": "汉斯·京特·冯·克卢格(Günther·von·Kluge, 1882年10月30日-1944年8月19日),纳粹德国陆军元帅(1940.7.19),著名军事家、统帅。",
- "event_type": "death",
- "link": "https://baike.baidu.com/item/%E4%BA%AC%E7%89%B9%C2%B7%E5%86%AF%C2%B7%E5%85%8B%E9%B2%81%E6%A0%BC"
- },
- {
- "title": "美国第42任总统克林顿出生",
- "year": "1946",
- "description": "威廉·杰斐逊·克林顿,美国律师、政治家,美国民主党成员,曾任阿肯色州州长和第42任美国总统。克林顿基金会主席 。",
- "event_type": "birth",
- "link": "https://baike.baidu.com/item/%E5%A8%81%E5%BB%89%C2%B7%E6%9D%B0%E6%96%90%E9%80%8A%C2%B7%E5%85%8B%E6%9E%97%E9%A1%BF"
- },
- {
- "title": "美国演员马修·派瑞出生",
- "year": "1969",
- "description": "马修·派瑞(Matthew Perry,1969年8月19日—2023年10月28日),出生于美国马萨诸塞州普利茅斯,美国、加拿大籍男演员、编剧。",
- "event_type": "birth",
- "link": "https://baike.baidu.com/item/%E9%A9%AC%E4%BF%AE%C2%B7%E6%B4%BE%E7%91%9E"
- },
- {
- "title": "北回归线标志塔在广州落成",
- "year": "1985",
- "description": "北回归线标志塔,是标志地理学上北回归线经过地方的建筑物。",
- "event_type": "event",
- "link": "https://baike.baidu.com/item/%E5%8C%97%E5%9B%9E%E5%BD%92%E7%BA%BF%E6%A0%87%E5%BF%97%E5%A1%94"
- },
- {
- "title": "“八一九事件”,苏联八月政变",
- "year": "1991",
- "description": "八一九事件,又称“苏联政变”、“八月政变”,指1991年8月19日-8月21日在苏联发生的一次政变。",
- "event_type": "event",
- "link": "https://baike.baidu.com/item/%E5%85%AB%E4%B8%80%E4%B9%9D%E4%BA%8B%E4%BB%B6"
- },
- {
- "title": "量子化学家莱纳斯·卡尔·鲍林逝世",
- "year": "1994",
- "description": "莱纳斯·卡尔·鲍林(Linus Carl Pauling,1901年2月28日—1994年8月19日),出生于美国俄勒冈州波特兰,化学家、美国国家科学院院士、美国艺术与科学院院士,1954年诺贝尔化学奖获得者。",
- "event_type": "death",
- "link": "https://baike.baidu.com/item/%E8%8E%B1%E7%BA%B3%E6%96%AF%C2%B7%E5%8D%A1%E5%B0%94%C2%B7%E9%B2%8D%E6%9E%97"
- },
- {
- "title": "中国三江源自然保护区成立",
- "year": "2000",
- "description": "青海三江源国家级自然保护区位于青藏高原腹地,青海省南部,地理位置介于东经89°24′~102°23′,北纬31°39′~36°16′之间,青海三江源国家级自然保护区属湿地类型的自然保护区。",
- "event_type": "event",
- "link": "https://baike.baidu.com/item/%E4%B8%89%E6%B1%9F%E6%BA%90%E8%87%AA%E7%84%B6%E4%BF%9D%E6%8A%A4%E5%8C%BA"
- }
- ]
- }
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "date": "8-19",
+ "month": 8,
+ "day": 19,
+ "items": [
+ {
+ "title": "罗马帝国开国皇帝奥古斯都逝世",
+ "year": "14",
+ "description": "奥古斯都(拉丁文 Augustus的中译,复数型 Augusti)的原意为“神圣的”、“高贵的”,带有宗教与神学式的意味。",
+ "event_type": "death",
+ "link": "https://baike.baidu.com/item/%E5%A5%A5%E5%8F%A4%E6%96%AF%E9%83%BD/14291"
+ },
+ {
+ "title": "近代概率论的奠基者帕斯卡逝世",
+ "year": "1662",
+ "description": "布莱士·帕斯卡(Blaise Pascal ,1623-1662)是法国数学家、物理学家、哲学家、散文家。",
+ "event_type": "death",
+ "link": "https://baike.baidu.com/item/%E5%B8%83%E8%8E%B1%E5%A3%AB%C2%B7%E5%B8%95%E6%96%AF%E5%8D%A1"
+ },
+ {
+ "title": "瑞典国王古斯塔夫三世发动政变夺取权力",
+ "year": "1772",
+ "description": "古斯塔夫三世(Gustavus III,1746-1792)是瑞典历史上褒贬最多的国王(1771-1792)。阿道夫·弗里德里克国王的儿子和继承者。",
+ "event_type": "event",
+ "link": "https://baike.baidu.com/item/%E5%8F%A4%E6%96%AF%E5%A1%94%E5%A4%AB%E4%B8%89%E4%B8%96"
+ },
+ {
+ "title": "美国飞机设计师奥维尔·莱特诞生",
+ "year": "1871",
+ "description": "奥威尔莱特(公元1871~公元1948)。 奥维尔·莱特1871年生于美国俄亥俄州代顿市。上过中学,但实际上未获得毕业文凭。",
+ "event_type": "birth",
+ "link": "https://baike.baidu.com/item/%E5%A5%A5%E7%BB%B4%E5%B0%94%C2%B7%E8%8E%B1%E7%89%B9"
+ },
+ {
+ "title": "法国著名时装设计师、香奈儿品牌创始人加布里埃·香奈儿出生",
+ "year": "1883",
+ "description": "香奈儿儿时入读修女院学校学得一手针线活。后来她与许多上流社会男士有过交往。1910年,毅然放弃嫁入豪门做阔太太的她在巴黎开设了一家女装帽子店,从此开创了香奈儿时尚帝国。",
+ "event_type": "birth",
+ "link": "https://baike.baidu.com/item/%E5%8A%A0%E5%B8%83%E9%87%8C%E5%9F%83%C2%B7%E9%A6%99%E5%A5%88%E5%84%BF/9480318"
+ },
+ {
+ "title": "美国宇航员斯托里·马斯格雷夫出生",
+ "year": "1935",
+ "description": "斯托里·马斯格雷夫(Franklin Story Musgrave,1935年8月19日-),美国宇航员,拥有医学、数学、文学等六个学位,入选美国国家航空航天局(NASA)科学家宇航员。",
+ "event_type": "birth",
+ "link": "https://baike.baidu.com/item/%E6%96%AF%E6%89%98%E9%87%8C%C2%B7%E9%A9%AC%E6%96%AF%E6%A0%BC%E9%9B%B7%E5%A4%AB"
+ },
+ {
+ "title": "纳粹德国陆军元帅京特·冯·克鲁格畏罪自杀",
+ "year": "1944",
+ "description": "汉斯·京特·冯·克卢格(Günther·von·Kluge, 1882年10月30日-1944年8月19日),纳粹德国陆军元帅(1940.7.19),著名军事家、统帅。",
+ "event_type": "death",
+ "link": "https://baike.baidu.com/item/%E4%BA%AC%E7%89%B9%C2%B7%E5%86%AF%C2%B7%E5%85%8B%E9%B2%81%E6%A0%BC"
+ },
+ {
+ "title": "美国第42任总统克林顿出生",
+ "year": "1946",
+ "description": "威廉·杰斐逊·克林顿,美国律师、政治家,美国民主党成员,曾任阿肯色州州长和第42任美国总统。克林顿基金会主席 。",
+ "event_type": "birth",
+ "link": "https://baike.baidu.com/item/%E5%A8%81%E5%BB%89%C2%B7%E6%9D%B0%E6%96%90%E9%80%8A%C2%B7%E5%85%8B%E6%9E%97%E9%A1%BF"
+ },
+ {
+ "title": "美国演员马修·派瑞出生",
+ "year": "1969",
+ "description": "马修·派瑞(Matthew Perry,1969年8月19日—2023年10月28日),出生于美国马萨诸塞州普利茅斯,美国、加拿大籍男演员、编剧。",
+ "event_type": "birth",
+ "link": "https://baike.baidu.com/item/%E9%A9%AC%E4%BF%AE%C2%B7%E6%B4%BE%E7%91%9E"
+ },
+ {
+ "title": "北回归线标志塔在广州落成",
+ "year": "1985",
+ "description": "北回归线标志塔,是标志地理学上北回归线经过地方的建筑物。",
+ "event_type": "event",
+ "link": "https://baike.baidu.com/item/%E5%8C%97%E5%9B%9E%E5%BD%92%E7%BA%BF%E6%A0%87%E5%BF%97%E5%A1%94"
+ },
+ {
+ "title": "“八一九事件”,苏联八月政变",
+ "year": "1991",
+ "description": "八一九事件,又称“苏联政变”、“八月政变”,指1991年8月19日-8月21日在苏联发生的一次政变。",
+ "event_type": "event",
+ "link": "https://baike.baidu.com/item/%E5%85%AB%E4%B8%80%E4%B9%9D%E4%BA%8B%E4%BB%B6"
+ },
+ {
+ "title": "量子化学家莱纳斯·卡尔·鲍林逝世",
+ "year": "1994",
+ "description": "莱纳斯·卡尔·鲍林(Linus Carl Pauling,1901年2月28日—1994年8月19日),出生于美国俄勒冈州波特兰,化学家、美国国家科学院院士、美国艺术与科学院院士,1954年诺贝尔化学奖获得者。",
+ "event_type": "death",
+ "link": "https://baike.baidu.com/item/%E8%8E%B1%E7%BA%B3%E6%96%AF%C2%B7%E5%8D%A1%E5%B0%94%C2%B7%E9%B2%8D%E6%9E%97"
+ },
+ {
+ "title": "中国三江源自然保护区成立",
+ "year": "2000",
+ "description": "青海三江源国家级自然保护区位于青藏高原腹地,青海省南部,地理位置介于东经89°24′~102°23′,北纬31°39′~36°16′之间,青海三江源国家级自然保护区属湿地类型的自然保护区。",
+ "event_type": "event",
+ "link": "https://baike.baidu.com/item/%E4%B8%89%E6%B1%9F%E6%BA%90%E8%87%AA%E7%84%B6%E4%BF%9D%E6%8A%A4%E5%8C%BA"
+ }
+ ]
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/css/style.css b/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/css/style.css
index ac8ca0e5..9d2c3c38 100755
--- a/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/css/style.css
@@ -1,326 +1,326 @@
-/* 必应每日壁纸 - 淡绿色清新风格样式 */
-
-/* 重置样式 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
- background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%);
- min-height: 100vh;
- color: #2d5016;
- line-height: 1.6;
- overflow-x: hidden;
-}
-
-.container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 20px;
-}
-
-/* 头部样式 */
-.header {
- text-align: center;
- margin-bottom: 30px;
- background: rgba(255, 255, 255, 0.85);
- border-radius: 20px;
- padding: 30px;
- box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08);
- backdrop-filter: blur(10px);
-}
-
-.header h1 {
- font-size: 2.5rem;
- color: #2d5016;
- margin-bottom: 10px;
- font-weight: 700;
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 15px;
-}
-
-.header p {
- color: #5a7c65;
- font-size: 1.1rem;
-}
-
-/* 加载状态 */
-.loading {
- text-align: center;
- padding: 40px;
- background: rgba(255, 255, 255, 0.85);
- border-radius: 15px;
- box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08);
-}
-
-.spinner {
- width: 40px;
- height: 40px;
- border: 4px solid #e8f5e8;
- border-top: 4px solid #81c784;
- border-radius: 50%;
- animation: spin 1s linear infinite;
- margin: 0 auto 20px;
-}
-
-@keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-/* 壁纸容器 */
-.wallpaper-container {
- background: rgba(255, 255, 255, 0.85);
- border-radius: 20px;
- padding: 30px;
- box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08);
- backdrop-filter: blur(10px);
- margin-bottom: 20px;
-}
-
-/* 壁纸信息 */
-.wallpaper-info {
- text-align: center;
- margin-bottom: 25px;
-}
-
-.wallpaper-title {
- font-size: 1.8rem;
- font-weight: 700;
- color: #2d5016;
- margin-bottom: 10px;
-}
-
-.wallpaper-date {
- color: #5a7c65;
- font-size: 1rem;
- margin-bottom: 15px;
-}
-
-.wallpaper-description {
- color: #2d5016;
- font-size: 1.1rem;
- line-height: 1.6;
- max-width: 800px;
- margin: 0 auto;
-}
-
-/* 壁纸图片 */
-.wallpaper-image {
- position: relative;
- border-radius: 15px;
- overflow: hidden;
- box-shadow: 0 10px 30px rgba(45, 80, 22, 0.15);
- margin: 20px 0;
-}
-
-.wallpaper-image img {
- width: 100%;
- height: auto;
- display: block;
- transition: transform 0.3s ease;
-}
-
-.wallpaper-image:hover img {
- transform: scale(1.02);
-}
-
-/* 下载按钮 */
-.download-section {
- text-align: center;
- margin-top: 25px;
-}
-
-.download-btn {
- background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%);
- color: white;
- border: none;
- padding: 15px 30px;
- border-radius: 25px;
- font-size: 1.1rem;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.3s ease;
- box-shadow: 0 4px 15px rgba(129, 199, 132, 0.3);
- text-decoration: none;
- display: inline-flex;
- align-items: center;
- gap: 10px;
-}
-
-.download-btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 6px 20px rgba(129, 199, 132, 0.4);
-}
-
-.download-btn:active {
- transform: translateY(0);
-}
-
-/* 错误提示 */
-.error {
- background: #fed7d7;
- color: #c53030;
- padding: 20px;
- border-radius: 15px;
- text-align: center;
- border: 1px solid #feb2b2;
- margin: 20px 0;
-}
-
-/* 版权信息 */
-.copyright {
- background: rgba(255, 255, 255, 0.7);
- border-radius: 15px;
- padding: 20px;
- text-align: center;
- color: #5a7c65;
- font-size: 0.9rem;
- margin-top: 20px;
-}
-
-/* 响应式设计 */
-
-/* 平板端 */
-@media (max-width: 768px) {
- .container {
- padding: 15px;
- }
-
- .header h1 {
- font-size: 2rem;
- flex-direction: column;
- gap: 10px;
- }
-
- .header {
- padding: 20px;
- }
-
- .wallpaper-container {
- padding: 20px;
- }
-
- .wallpaper-title {
- font-size: 1.5rem;
- }
-
- .wallpaper-description {
- font-size: 1rem;
- }
-}
-
-/* 手机端 */
-@media (max-width: 480px) {
- .container {
- padding: 10px;
- }
-
- .header {
- padding: 15px;
- margin-bottom: 20px;
- }
-
- .header h1 {
- font-size: 1.8rem;
- }
-
- .wallpaper-container {
- padding: 15px;
- }
-
- .wallpaper-title {
- font-size: 1.3rem;
- }
-
- .wallpaper-description {
- font-size: 0.95rem;
- }
-
- .download-btn {
- padding: 12px 25px;
- font-size: 1rem;
- width: 100%;
- justify-content: center;
- }
-
- .copyright {
- padding: 15px;
- font-size: 0.8rem;
- }
-}
-
-/* 大屏幕优化 */
-@media (min-width: 1200px) {
- .container {
- padding: 40px;
- }
-
- .header {
- padding: 40px;
- }
-
- .wallpaper-container {
- padding: 40px;
- }
-
- .wallpaper-image {
- max-height: 70vh;
- overflow: hidden;
- }
-
- .wallpaper-image img {
- width: 100%;
- height: 100%;
- object-fit: cover;
- }
-}
-
-/* 特殊效果 */
-.fade-in {
- animation: fadeIn 0.6s ease-in;
-}
-
-@keyframes fadeIn {
- from {
- opacity: 0;
- transform: translateY(20px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-/* 图片加载效果 */
-.wallpaper-image img {
- opacity: 0;
- transition: opacity 0.3s ease;
-}
-
-.wallpaper-image img.loaded {
- opacity: 1;
-}
-
-/* 滚动条样式 */
-::-webkit-scrollbar {
- width: 8px;
-}
-
-::-webkit-scrollbar-track {
- background: rgba(255, 255, 255, 0.1);
-}
-
-::-webkit-scrollbar-thumb {
- background: rgba(129, 199, 132, 0.5);
- border-radius: 4px;
-}
-
-::-webkit-scrollbar-thumb:hover {
- background: rgba(129, 199, 132, 0.7);
+/* 必应每日壁纸 - 淡绿色清新风格样式 */
+
+/* 重置样式 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%);
+ min-height: 100vh;
+ color: #2d5016;
+ line-height: 1.6;
+ overflow-x: hidden;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+}
+
+/* 头部样式 */
+.header {
+ text-align: center;
+ margin-bottom: 30px;
+ background: rgba(255, 255, 255, 0.85);
+ border-radius: 20px;
+ padding: 30px;
+ box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08);
+ backdrop-filter: blur(10px);
+}
+
+.header h1 {
+ font-size: 2.5rem;
+ color: #2d5016;
+ margin-bottom: 10px;
+ font-weight: 700;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 15px;
+}
+
+.header p {
+ color: #5a7c65;
+ font-size: 1.1rem;
+}
+
+/* 加载状态 */
+.loading {
+ text-align: center;
+ padding: 40px;
+ background: rgba(255, 255, 255, 0.85);
+ border-radius: 15px;
+ box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08);
+}
+
+.spinner {
+ width: 40px;
+ height: 40px;
+ border: 4px solid #e8f5e8;
+ border-top: 4px solid #81c784;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ margin: 0 auto 20px;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+/* 壁纸容器 */
+.wallpaper-container {
+ background: rgba(255, 255, 255, 0.85);
+ border-radius: 20px;
+ padding: 30px;
+ box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08);
+ backdrop-filter: blur(10px);
+ margin-bottom: 20px;
+}
+
+/* 壁纸信息 */
+.wallpaper-info {
+ text-align: center;
+ margin-bottom: 25px;
+}
+
+.wallpaper-title {
+ font-size: 1.8rem;
+ font-weight: 700;
+ color: #2d5016;
+ margin-bottom: 10px;
+}
+
+.wallpaper-date {
+ color: #5a7c65;
+ font-size: 1rem;
+ margin-bottom: 15px;
+}
+
+.wallpaper-description {
+ color: #2d5016;
+ font-size: 1.1rem;
+ line-height: 1.6;
+ max-width: 800px;
+ margin: 0 auto;
+}
+
+/* 壁纸图片 */
+.wallpaper-image {
+ position: relative;
+ border-radius: 15px;
+ overflow: hidden;
+ box-shadow: 0 10px 30px rgba(45, 80, 22, 0.15);
+ margin: 20px 0;
+}
+
+.wallpaper-image img {
+ width: 100%;
+ height: auto;
+ display: block;
+ transition: transform 0.3s ease;
+}
+
+.wallpaper-image:hover img {
+ transform: scale(1.02);
+}
+
+/* 下载按钮 */
+.download-section {
+ text-align: center;
+ margin-top: 25px;
+}
+
+.download-btn {
+ background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%);
+ color: white;
+ border: none;
+ padding: 15px 30px;
+ border-radius: 25px;
+ font-size: 1.1rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ box-shadow: 0 4px 15px rgba(129, 199, 132, 0.3);
+ text-decoration: none;
+ display: inline-flex;
+ align-items: center;
+ gap: 10px;
+}
+
+.download-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 6px 20px rgba(129, 199, 132, 0.4);
+}
+
+.download-btn:active {
+ transform: translateY(0);
+}
+
+/* 错误提示 */
+.error {
+ background: #fed7d7;
+ color: #c53030;
+ padding: 20px;
+ border-radius: 15px;
+ text-align: center;
+ border: 1px solid #feb2b2;
+ margin: 20px 0;
+}
+
+/* 版权信息 */
+.copyright {
+ background: rgba(255, 255, 255, 0.7);
+ border-radius: 15px;
+ padding: 20px;
+ text-align: center;
+ color: #5a7c65;
+ font-size: 0.9rem;
+ margin-top: 20px;
+}
+
+/* 响应式设计 */
+
+/* 平板端 */
+@media (max-width: 768px) {
+ .container {
+ padding: 15px;
+ }
+
+ .header h1 {
+ font-size: 2rem;
+ flex-direction: column;
+ gap: 10px;
+ }
+
+ .header {
+ padding: 20px;
+ }
+
+ .wallpaper-container {
+ padding: 20px;
+ }
+
+ .wallpaper-title {
+ font-size: 1.5rem;
+ }
+
+ .wallpaper-description {
+ font-size: 1rem;
+ }
+}
+
+/* 手机端 */
+@media (max-width: 480px) {
+ .container {
+ padding: 10px;
+ }
+
+ .header {
+ padding: 15px;
+ margin-bottom: 20px;
+ }
+
+ .header h1 {
+ font-size: 1.8rem;
+ }
+
+ .wallpaper-container {
+ padding: 15px;
+ }
+
+ .wallpaper-title {
+ font-size: 1.3rem;
+ }
+
+ .wallpaper-description {
+ font-size: 0.95rem;
+ }
+
+ .download-btn {
+ padding: 12px 25px;
+ font-size: 1rem;
+ width: 100%;
+ justify-content: center;
+ }
+
+ .copyright {
+ padding: 15px;
+ font-size: 0.8rem;
+ }
+}
+
+/* 大屏幕优化 */
+@media (min-width: 1200px) {
+ .container {
+ padding: 40px;
+ }
+
+ .header {
+ padding: 40px;
+ }
+
+ .wallpaper-container {
+ padding: 40px;
+ }
+
+ .wallpaper-image {
+ max-height: 70vh;
+ overflow: hidden;
+ }
+
+ .wallpaper-image img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ }
+}
+
+/* 特殊效果 */
+.fade-in {
+ animation: fadeIn 0.6s ease-in;
+}
+
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+/* 图片加载效果 */
+.wallpaper-image img {
+ opacity: 0;
+ transition: opacity 0.3s ease;
+}
+
+.wallpaper-image img.loaded {
+ opacity: 1;
+}
+
+/* 滚动条样式 */
+::-webkit-scrollbar {
+ width: 8px;
+}
+
+::-webkit-scrollbar-track {
+ background: rgba(255, 255, 255, 0.1);
+}
+
+::-webkit-scrollbar-thumb {
+ background: rgba(129, 199, 132, 0.5);
+ border-radius: 4px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: rgba(129, 199, 132, 0.7);
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/index.html b/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/index.html
index ac3ecb85..39adad89 100755
--- a/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/index.html
+++ b/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/index.html
@@ -1,42 +1,42 @@
-
-
-
-
-
-
-
- 必应每日壁纸
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+ 必应每日壁纸
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/js/script.js b/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/js/script.js
index 35ac3881..25104e8e 100755
--- a/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/js/script.js
@@ -1,315 +1,315 @@
-// 必应每日壁纸 JavaScript 功能
-
-// API配置
-const API = {
- endpoints: [],
- currentIndex: 0,
- params: {
- encoding: 'json'
- },
- // 初始化API接口列表
- async init() {
- try {
- const res = await fetch('./接口集合.json');
- const endpoints = await res.json();
- this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/bing`);
- } catch (e) {
- // 如果无法加载接口集合,使用默认接口
- this.endpoints = ['https://60s.api.shumengya.top/v2/bing'];
- }
- },
- // 获取当前接口URL
- getCurrentUrl() {
- if (this.endpoints.length === 0) return null;
- const url = new URL(this.endpoints[this.currentIndex]);
- Object.keys(this.params).forEach(key => {
- url.searchParams.append(key, this.params[key]);
- });
- return url.toString();
- },
- // 切换到下一个接口
- switchToNext() {
- this.currentIndex = (this.currentIndex + 1) % this.endpoints.length;
- return this.currentIndex < this.endpoints.length;
- },
- // 重置到第一个接口
- reset() {
- this.currentIndex = 0;
- }
-};
-
-// DOM元素
-let elements = {};
-
-// 初始化
-document.addEventListener('DOMContentLoaded', function() {
- initElements();
- loadWallpaper();
-});
-
-// 初始化DOM元素
-function initElements() {
- elements = {
- container: document.getElementById('wallpaper-content'),
- loading: document.getElementById('loading')
- };
-}
-
-// 加载壁纸数据
-async function loadWallpaper() {
- try {
- showLoading(true);
-
- // 初始化API接口列表
- await API.init();
-
- // 重置API索引到第一个接口
- API.reset();
-
- // 尝试所有API接口
- for (let i = 0; i < API.endpoints.length; i++) {
- try {
- const url = API.getCurrentUrl();
- console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`);
-
- const response = await fetch(url, {
- cache: 'no-store',
- timeout: 10000 // 10秒超时
- });
-
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
- }
-
- const data = await response.json();
- console.log('API响应数据:', data);
-
- // 检查数据有效性
- if (data && (data.code === 200 || data.data)) {
- console.log(`接口 ${i + 1} 请求成功`);
- displayWallpaper(data);
- return;
- }
-
- throw new Error(data && data.message ? data.message : '接口返回异常');
-
- } catch (error) {
- console.warn(`接口 ${i + 1} 失败:`, error.message);
-
- // 如果不是最后一个接口,切换到下一个
- if (i < API.endpoints.length - 1) {
- API.switchToNext();
- continue;
- }
-
- // 所有接口都失败了,抛出错误
- throw new Error('所有接口都无法访问');
- }
- }
-
- } catch (error) {
- console.error('加载壁纸失败:', error);
- showError('加载壁纸失败,请稍后重试');
- } finally {
- showLoading(false);
- }
-}
-
-// 显示壁纸
-function displayWallpaper(data) {
- if (!data) {
- showError('没有获取到壁纸数据');
- return;
- }
-
- // 提取壁纸信息
- const wallpaperInfo = extractWallpaperInfo(data);
-
- if (!wallpaperInfo || !wallpaperInfo.imageUrl) {
- showError('壁纸图片链接无效');
- return;
- }
-
- // 生成HTML内容
- const html = generateWallpaperHTML(wallpaperInfo);
-
- // 显示内容
- elements.container.innerHTML = html;
- elements.container.classList.add('fade-in');
-
- // 绑定图片加载事件
- bindImageEvents();
-}
-
-// 提取壁纸信息
-function extractWallpaperInfo(data) {
- // 根据API响应结构提取信息
- let imageUrl = '';
- let title = '必应每日壁纸';
- let description = '';
- let date = new Date().toLocaleDateString('zh-CN');
- let copyright = '';
-
- // 处理新的API响应格式
- if (data.data) {
- const wallpaperData = data.data;
- title = wallpaperData.title || title;
- description = wallpaperData.description || wallpaperData.main_text || '';
- copyright = wallpaperData.copyright || '';
- date = wallpaperData.update_date || date;
-
- // 提取图片URL,去除反引号
- if (wallpaperData.cover) {
- imageUrl = wallpaperData.cover.replace(/`/g, '').trim();
- }
- }
- // 处理其他可能的API响应格式
- else if (data.url) {
- imageUrl = data.url;
- } else if (data.image_url) {
- imageUrl = data.image_url;
- } else if (data.images && data.images.length > 0) {
- imageUrl = data.images[0].url || data.images[0].image_url;
- title = data.images[0].title || title;
- description = data.images[0].description || data.images[0].copyright || '';
- copyright = data.images[0].copyright || '';
- }
-
- // 如果是相对路径,转换为完整URL
- if (imageUrl && imageUrl.startsWith('/')) {
- imageUrl = 'https://www.bing.com' + imageUrl;
- }
-
- // 确保图片URL有效
- if (!imageUrl || imageUrl === '') {
- console.error('无法提取图片URL,原始数据:', data);
- return null;
- }
-
- return {
- imageUrl,
- title,
- description: description || copyright,
- date,
- copyright
- };
-}
-
-// 生成壁纸HTML
-function generateWallpaperHTML(info) {
- return `
-
-
-
${escapeHtml(info.title)}
-
${info.date}
- ${info.description ? `
${escapeHtml(info.description)}
` : ''}
-
-
-
-

-
-
-
-
-
- ${info.copyright ? `
-
-
${escapeHtml(info.copyright)}
-
- ` : ''}
- `;
-}
-
-// 绑定图片事件
-function bindImageEvents() {
- const images = elements.container.querySelectorAll('img');
-
- images.forEach(img => {
- img.addEventListener('load', function() {
- this.classList.add('loaded');
- });
-
- img.addEventListener('error', function() {
- console.error('图片加载失败:', this.src);
- this.parentElement.innerHTML = `
-
-
🖼️ 图片加载失败
-
请检查网络连接或稍后重试
-
- `;
- });
- });
-}
-
-// 显示/隐藏加载状态
-function showLoading(show) {
- if (elements.loading) {
- elements.loading.style.display = show ? 'block' : 'none';
- }
- if (elements.container) {
- elements.container.style.display = show ? 'none' : 'block';
- }
-}
-
-// 显示错误信息
-function showError(message) {
- if (elements.container) {
- elements.container.innerHTML = `
-
-
⚠️ 加载失败
-
${escapeHtml(message)}
-
请检查网络连接或稍后重试
-
- `;
- elements.container.style.display = 'block';
- }
-}
-
-// HTML转义
-function escapeHtml(text) {
- if (!text) return '';
- const div = document.createElement('div');
- div.textContent = text;
- return div.innerHTML;
-}
-
-// 格式化日期
-function formatDate(dateString) {
- try {
- const date = new Date(dateString);
- return date.toLocaleDateString('zh-CN', {
- year: 'numeric',
- month: 'long',
- day: 'numeric'
- });
- } catch (error) {
- return dateString;
- }
-}
-
-// 错误处理
-window.addEventListener('error', function(event) {
- console.error('页面错误:', event.error);
-});
-
-// 网络状态监听
-window.addEventListener('online', function() {
- console.log('网络已连接');
-});
-
-window.addEventListener('offline', function() {
- console.log('网络已断开');
- showError('网络连接已断开,请检查网络设置');
-});
-
-// 导出函数供外部调用
-window.BingWallpaper = {
- loadWallpaper,
- showError,
- showLoading
+// 必应每日壁纸 JavaScript 功能
+
+// API配置
+const API = {
+ endpoints: [],
+ currentIndex: 0,
+ params: {
+ encoding: 'json'
+ },
+ // 初始化API接口列表
+ async init() {
+ try {
+ const res = await fetch('./接口集合.json');
+ const endpoints = await res.json();
+ this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/bing`);
+ } catch (e) {
+ // 如果无法加载接口集合,使用默认接口
+ this.endpoints = ['https://60s.api.shumengya.top/v2/bing'];
+ }
+ },
+ // 获取当前接口URL
+ getCurrentUrl() {
+ if (this.endpoints.length === 0) return null;
+ const url = new URL(this.endpoints[this.currentIndex]);
+ Object.keys(this.params).forEach(key => {
+ url.searchParams.append(key, this.params[key]);
+ });
+ return url.toString();
+ },
+ // 切换到下一个接口
+ switchToNext() {
+ this.currentIndex = (this.currentIndex + 1) % this.endpoints.length;
+ return this.currentIndex < this.endpoints.length;
+ },
+ // 重置到第一个接口
+ reset() {
+ this.currentIndex = 0;
+ }
+};
+
+// DOM元素
+let elements = {};
+
+// 初始化
+document.addEventListener('DOMContentLoaded', function() {
+ initElements();
+ loadWallpaper();
+});
+
+// 初始化DOM元素
+function initElements() {
+ elements = {
+ container: document.getElementById('wallpaper-content'),
+ loading: document.getElementById('loading')
+ };
+}
+
+// 加载壁纸数据
+async function loadWallpaper() {
+ try {
+ showLoading(true);
+
+ // 初始化API接口列表
+ await API.init();
+
+ // 重置API索引到第一个接口
+ API.reset();
+
+ // 尝试所有API接口
+ for (let i = 0; i < API.endpoints.length; i++) {
+ try {
+ const url = API.getCurrentUrl();
+ console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`);
+
+ const response = await fetch(url, {
+ cache: 'no-store',
+ timeout: 10000 // 10秒超时
+ });
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+ }
+
+ const data = await response.json();
+ console.log('API响应数据:', data);
+
+ // 检查数据有效性
+ if (data && (data.code === 200 || data.data)) {
+ console.log(`接口 ${i + 1} 请求成功`);
+ displayWallpaper(data);
+ return;
+ }
+
+ throw new Error(data && data.message ? data.message : '接口返回异常');
+
+ } catch (error) {
+ console.warn(`接口 ${i + 1} 失败:`, error.message);
+
+ // 如果不是最后一个接口,切换到下一个
+ if (i < API.endpoints.length - 1) {
+ API.switchToNext();
+ continue;
+ }
+
+ // 所有接口都失败了,抛出错误
+ throw new Error('所有接口都无法访问');
+ }
+ }
+
+ } catch (error) {
+ console.error('加载壁纸失败:', error);
+ showError('加载壁纸失败,请稍后重试');
+ } finally {
+ showLoading(false);
+ }
+}
+
+// 显示壁纸
+function displayWallpaper(data) {
+ if (!data) {
+ showError('没有获取到壁纸数据');
+ return;
+ }
+
+ // 提取壁纸信息
+ const wallpaperInfo = extractWallpaperInfo(data);
+
+ if (!wallpaperInfo || !wallpaperInfo.imageUrl) {
+ showError('壁纸图片链接无效');
+ return;
+ }
+
+ // 生成HTML内容
+ const html = generateWallpaperHTML(wallpaperInfo);
+
+ // 显示内容
+ elements.container.innerHTML = html;
+ elements.container.classList.add('fade-in');
+
+ // 绑定图片加载事件
+ bindImageEvents();
+}
+
+// 提取壁纸信息
+function extractWallpaperInfo(data) {
+ // 根据API响应结构提取信息
+ let imageUrl = '';
+ let title = '必应每日壁纸';
+ let description = '';
+ let date = new Date().toLocaleDateString('zh-CN');
+ let copyright = '';
+
+ // 处理新的API响应格式
+ if (data.data) {
+ const wallpaperData = data.data;
+ title = wallpaperData.title || title;
+ description = wallpaperData.description || wallpaperData.main_text || '';
+ copyright = wallpaperData.copyright || '';
+ date = wallpaperData.update_date || date;
+
+ // 提取图片URL,去除反引号
+ if (wallpaperData.cover) {
+ imageUrl = wallpaperData.cover.replace(/`/g, '').trim();
+ }
+ }
+ // 处理其他可能的API响应格式
+ else if (data.url) {
+ imageUrl = data.url;
+ } else if (data.image_url) {
+ imageUrl = data.image_url;
+ } else if (data.images && data.images.length > 0) {
+ imageUrl = data.images[0].url || data.images[0].image_url;
+ title = data.images[0].title || title;
+ description = data.images[0].description || data.images[0].copyright || '';
+ copyright = data.images[0].copyright || '';
+ }
+
+ // 如果是相对路径,转换为完整URL
+ if (imageUrl && imageUrl.startsWith('/')) {
+ imageUrl = 'https://www.bing.com' + imageUrl;
+ }
+
+ // 确保图片URL有效
+ if (!imageUrl || imageUrl === '') {
+ console.error('无法提取图片URL,原始数据:', data);
+ return null;
+ }
+
+ return {
+ imageUrl,
+ title,
+ description: description || copyright,
+ date,
+ copyright
+ };
+}
+
+// 生成壁纸HTML
+function generateWallpaperHTML(info) {
+ return `
+
+
+
${escapeHtml(info.title)}
+
${info.date}
+ ${info.description ? `
${escapeHtml(info.description)}
` : ''}
+
+
+
+

+
+
+
+
+
+ ${info.copyright ? `
+
+
${escapeHtml(info.copyright)}
+
+ ` : ''}
+ `;
+}
+
+// 绑定图片事件
+function bindImageEvents() {
+ const images = elements.container.querySelectorAll('img');
+
+ images.forEach(img => {
+ img.addEventListener('load', function() {
+ this.classList.add('loaded');
+ });
+
+ img.addEventListener('error', function() {
+ console.error('图片加载失败:', this.src);
+ this.parentElement.innerHTML = `
+
+
🖼️ 图片加载失败
+
请检查网络连接或稍后重试
+
+ `;
+ });
+ });
+}
+
+// 显示/隐藏加载状态
+function showLoading(show) {
+ if (elements.loading) {
+ elements.loading.style.display = show ? 'block' : 'none';
+ }
+ if (elements.container) {
+ elements.container.style.display = show ? 'none' : 'block';
+ }
+}
+
+// 显示错误信息
+function showError(message) {
+ if (elements.container) {
+ elements.container.innerHTML = `
+
+
⚠️ 加载失败
+
${escapeHtml(message)}
+
请检查网络连接或稍后重试
+
+ `;
+ elements.container.style.display = 'block';
+ }
+}
+
+// HTML转义
+function escapeHtml(text) {
+ if (!text) return '';
+ const div = document.createElement('div');
+ div.textContent = text;
+ return div.innerHTML;
+}
+
+// 格式化日期
+function formatDate(dateString) {
+ try {
+ const date = new Date(dateString);
+ return date.toLocaleDateString('zh-CN', {
+ year: 'numeric',
+ month: 'long',
+ day: 'numeric'
+ });
+ } catch (error) {
+ return dateString;
+ }
+}
+
+// 错误处理
+window.addEventListener('error', function(event) {
+ console.error('页面错误:', event.error);
+});
+
+// 网络状态监听
+window.addEventListener('online', function() {
+ console.log('网络已连接');
+});
+
+window.addEventListener('offline', function() {
+ console.log('网络已断开');
+ showError('网络连接已断开,请检查网络设置');
+});
+
+// 导出函数供外部调用
+window.BingWallpaper = {
+ loadWallpaper,
+ showError,
+ showLoading
};
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/接口集合.json b/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/接口集合.json
index 547b2771..42245813 100755
--- a/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/接口集合.json
+++ b/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/接口集合.json
@@ -1,3 +1,3 @@
-[
- "https://60s.api.shumengya.top"
-]
+[
+ "https://60s.api.shumengya.top"
+]
diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/返回接口.json b/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/返回接口.json
index 2c6a72a4..122ff1ef 100755
--- a/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/日更资讯/必应每日壁纸/返回接口.json
@@ -1,15 +1,15 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "title": "瑟沃格湖,瓦加尔岛,法罗群岛",
- "headline": "海洋上方的湖泊",
- "description": "大自然自有其奇妙之处,瑟沃格湖(Sørvágsvatn)便是其中最精彩的之一。世界湖泊日是探索法罗群岛(丹麦王国的一个自治行政区)这片视错觉的绝佳时机。这座位于沃格岛上的湖泊也被称为莱蒂斯湖(Leitisvatn),看似漂浮在海平面之上。实际上,它的海拔不到100英尺。索尔瓦格斯湖是法罗群岛最大的湖泊,面积约1.3平方英里,为Bøsdalafossur瀑布Bøsdalafossur提供水源,瀑布的湖水在那里奔腾而下,最终倾泻而入大海。",
- "main_text": "该湖位于瓦加尔岛南部,通过Bøsdalafossur瀑布与大西洋相连,形成了壮丽的“悬湖”景观。",
- "cover": "https://bing.com/th?id=OHR.FaroeLake_ZH-CN3977660997_1920x1080.jpg",
- "cover_4k": "https://bing.com/th?id=OHR.FaroeLake_ZH-CN3977660997_UHD.jpg",
- "copyright": "© Anton Petrus/Getty Images",
- "update_date": "2025-08-27 13:24:37",
- "update_date_at": 1756301077809
- }
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "title": "瑟沃格湖,瓦加尔岛,法罗群岛",
+ "headline": "海洋上方的湖泊",
+ "description": "大自然自有其奇妙之处,瑟沃格湖(Sørvágsvatn)便是其中最精彩的之一。世界湖泊日是探索法罗群岛(丹麦王国的一个自治行政区)这片视错觉的绝佳时机。这座位于沃格岛上的湖泊也被称为莱蒂斯湖(Leitisvatn),看似漂浮在海平面之上。实际上,它的海拔不到100英尺。索尔瓦格斯湖是法罗群岛最大的湖泊,面积约1.3平方英里,为Bøsdalafossur瀑布Bøsdalafossur提供水源,瀑布的湖水在那里奔腾而下,最终倾泻而入大海。",
+ "main_text": "该湖位于瓦加尔岛南部,通过Bøsdalafossur瀑布与大西洋相连,形成了壮丽的“悬湖”景观。",
+ "cover": "https://bing.com/th?id=OHR.FaroeLake_ZH-CN3977660997_1920x1080.jpg",
+ "cover_4k": "https://bing.com/th?id=OHR.FaroeLake_ZH-CN3977660997_UHD.jpg",
+ "copyright": "© Anton Petrus/Getty Images",
+ "update_date": "2025-08-27 13:24:37",
+ "update_date_at": 1756301077809
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/css/style.css b/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/css/style.css
index 9bd66ac6..0cf52951 100755
--- a/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/css/style.css
@@ -1,327 +1,327 @@
-/* 每天60s读懂世界 - 清新风格样式 */
-
-/* 重置样式 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
- background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%);
- min-height: 100vh;
- color: #2d5016;
- line-height: 1.6;
-}
-
-.container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 20px;
-}
-
-/* 头部样式 */
-.header {
- text-align: center;
- margin-bottom: 30px;
- background: rgba(255, 255, 255, 0.85);
- border-radius: 20px;
- padding: 30px;
- box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08);
- backdrop-filter: blur(10px);
-}
-
-.header h1 {
- font-size: 2.5rem;
- color: #2d5016;
- margin-bottom: 10px;
- font-weight: 700;
-}
-
-.header p {
- color: #5a7c65;
- font-size: 1.1rem;
-}
-
-/* 控制面板 */
-.controls {
- background: rgba(255, 255, 255, 0.85);
- border-radius: 15px;
- padding: 20px;
- margin-bottom: 30px;
- box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08);
- backdrop-filter: blur(10px);
-}
-
-.date-selector {
- display: flex;
- align-items: center;
- gap: 15px;
- margin-bottom: 20px;
- flex-wrap: wrap;
-}
-
-.date-selector label {
- font-weight: 600;
- color: #4a5568;
-}
-
-.date-selector input {
- padding: 10px 15px;
- border: 2px solid #e2e8f0;
- border-radius: 10px;
- font-size: 1rem;
- transition: all 0.3s ease;
-}
-
-.date-selector input:focus {
- outline: none;
- border-color: #81c784;
- box-shadow: 0 0 0 3px rgba(129, 199, 132, 0.1);
-}
-
-.btn {
- background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%);
- color: white;
- border: none;
- padding: 12px 25px;
- border-radius: 10px;
- font-size: 1rem;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.3s ease;
- box-shadow: 0 4px 15px rgba(129, 199, 132, 0.3);
-}
-
-.btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 6px 20px rgba(129, 199, 132, 0.4);
-}
-
-.btn:active {
- transform: translateY(0);
-}
-
-/* 加载状态 */
-.loading {
- text-align: center;
- padding: 40px;
- background: rgba(255, 255, 255, 0.85);
- border-radius: 15px;
- box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08);
-}
-
-.spinner {
- width: 40px;
- height: 40px;
- border: 4px solid #e8f5e8;
- border-top: 4px solid #81c784;
- border-radius: 50%;
- animation: spin 1s linear infinite;
- margin: 0 auto 20px;
-}
-
-@keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-/* 内容区域 */
-.content {
- background: rgba(255, 255, 255, 0.85);
- border-radius: 20px;
- padding: 30px;
- box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08);
- backdrop-filter: blur(10px);
-}
-
-.news-header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- margin-bottom: 25px;
- flex-wrap: wrap;
- gap: 15px;
-}
-
-.news-date {
- font-size: 1.5rem;
- font-weight: 700;
- color: #2d5016;
-}
-
-.lunar-date {
- color: #5a7c65;
- font-size: 1rem;
-}
-
-/* 新闻图片 */
-.news-image {
- width: 100%;
- max-width: 600px;
- height: auto;
- border-radius: 15px;
- margin: 20px auto;
- display: block;
- box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
-}
-
-/* 新闻列表 */
-.news-list {
- margin: 25px 0;
-}
-
-.news-item {
- background: #f1f8e9;
- border-left: 4px solid #81c784;
- padding: 15px 20px;
- margin-bottom: 15px;
- border-radius: 0 10px 10px 0;
- transition: all 0.3s ease;
- position: relative;
-}
-
-.news-item:hover {
- background: #e8f5e8;
- transform: translateX(5px);
- box-shadow: 0 4px 15px rgba(45, 80, 22, 0.1);
-}
-
-.news-item::before {
- content: counter(news-counter);
- counter-increment: news-counter;
- position: absolute;
- left: -15px;
- top: 50%;
- transform: translateY(-50%);
- background: #81c784;
- color: white;
- width: 25px;
- height: 25px;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
- font-size: 0.8rem;
- font-weight: bold;
-}
-
-.news-list {
- counter-reset: news-counter;
-}
-
-/* 每日一句 */
-.daily-tip {
- background: linear-gradient(135deg, #ffecd2 0%, #fcb69f 100%);
- padding: 20px;
- border-radius: 15px;
- margin: 25px 0;
- text-align: center;
- font-style: italic;
- font-size: 1.1rem;
- color: #744210;
- box-shadow: 0 5px 20px rgba(252, 182, 159, 0.3);
-}
-
-/* 错误提示 */
-.error {
- background: #fed7d7;
- color: #c53030;
- padding: 20px;
- border-radius: 10px;
- text-align: center;
- border: 1px solid #feb2b2;
-}
-
-/* 响应式设计 */
-
-/* 平板端 */
-@media (max-width: 768px) {
- .container {
- padding: 15px;
- }
-
- .header h1 {
- font-size: 2rem;
- }
-
- .header {
- padding: 20px;
- }
-
- .content {
- padding: 20px;
- }
-
- .date-selector {
- flex-direction: column;
- align-items: stretch;
- }
-
- .news-header {
- flex-direction: column;
- align-items: flex-start;
- }
-}
-
-/* 手机端 */
-@media (max-width: 480px) {
- .container {
- padding: 10px;
- }
-
- .header {
- padding: 15px;
- margin-bottom: 20px;
- }
-
- .header h1 {
- font-size: 1.8rem;
- }
-
- .controls {
- padding: 15px;
- }
-
- .content {
- padding: 15px;
- }
-
- .news-item {
- padding: 12px 15px;
- margin-left: 10px;
- }
-
- .news-item::before {
- left: -10px;
- width: 20px;
- height: 20px;
- font-size: 0.7rem;
- }
-
- .daily-tip {
- padding: 15px;
- font-size: 1rem;
- }
-
- .btn {
- width: 100%;
- padding: 15px;
- }
-}
-
-/* 大屏幕优化 */
-@media (min-width: 1200px) {
- .container {
- padding: 40px;
- }
-
- .header {
- padding: 40px;
- }
-
- .content {
- padding: 40px;
- }
+/* 每天60s读懂世界 - 清新风格样式 */
+
+/* 重置样式 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%);
+ min-height: 100vh;
+ color: #2d5016;
+ line-height: 1.6;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+}
+
+/* 头部样式 */
+.header {
+ text-align: center;
+ margin-bottom: 30px;
+ background: rgba(255, 255, 255, 0.85);
+ border-radius: 20px;
+ padding: 30px;
+ box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08);
+ backdrop-filter: blur(10px);
+}
+
+.header h1 {
+ font-size: 2.5rem;
+ color: #2d5016;
+ margin-bottom: 10px;
+ font-weight: 700;
+}
+
+.header p {
+ color: #5a7c65;
+ font-size: 1.1rem;
+}
+
+/* 控制面板 */
+.controls {
+ background: rgba(255, 255, 255, 0.85);
+ border-radius: 15px;
+ padding: 20px;
+ margin-bottom: 30px;
+ box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08);
+ backdrop-filter: blur(10px);
+}
+
+.date-selector {
+ display: flex;
+ align-items: center;
+ gap: 15px;
+ margin-bottom: 20px;
+ flex-wrap: wrap;
+}
+
+.date-selector label {
+ font-weight: 600;
+ color: #4a5568;
+}
+
+.date-selector input {
+ padding: 10px 15px;
+ border: 2px solid #e2e8f0;
+ border-radius: 10px;
+ font-size: 1rem;
+ transition: all 0.3s ease;
+}
+
+.date-selector input:focus {
+ outline: none;
+ border-color: #81c784;
+ box-shadow: 0 0 0 3px rgba(129, 199, 132, 0.1);
+}
+
+.btn {
+ background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%);
+ color: white;
+ border: none;
+ padding: 12px 25px;
+ border-radius: 10px;
+ font-size: 1rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ box-shadow: 0 4px 15px rgba(129, 199, 132, 0.3);
+}
+
+.btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 6px 20px rgba(129, 199, 132, 0.4);
+}
+
+.btn:active {
+ transform: translateY(0);
+}
+
+/* 加载状态 */
+.loading {
+ text-align: center;
+ padding: 40px;
+ background: rgba(255, 255, 255, 0.85);
+ border-radius: 15px;
+ box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08);
+}
+
+.spinner {
+ width: 40px;
+ height: 40px;
+ border: 4px solid #e8f5e8;
+ border-top: 4px solid #81c784;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ margin: 0 auto 20px;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+/* 内容区域 */
+.content {
+ background: rgba(255, 255, 255, 0.85);
+ border-radius: 20px;
+ padding: 30px;
+ box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08);
+ backdrop-filter: blur(10px);
+}
+
+.news-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 25px;
+ flex-wrap: wrap;
+ gap: 15px;
+}
+
+.news-date {
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: #2d5016;
+}
+
+.lunar-date {
+ color: #5a7c65;
+ font-size: 1rem;
+}
+
+/* 新闻图片 */
+.news-image {
+ width: 100%;
+ max-width: 600px;
+ height: auto;
+ border-radius: 15px;
+ margin: 20px auto;
+ display: block;
+ box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
+}
+
+/* 新闻列表 */
+.news-list {
+ margin: 25px 0;
+}
+
+.news-item {
+ background: #f1f8e9;
+ border-left: 4px solid #81c784;
+ padding: 15px 20px;
+ margin-bottom: 15px;
+ border-radius: 0 10px 10px 0;
+ transition: all 0.3s ease;
+ position: relative;
+}
+
+.news-item:hover {
+ background: #e8f5e8;
+ transform: translateX(5px);
+ box-shadow: 0 4px 15px rgba(45, 80, 22, 0.1);
+}
+
+.news-item::before {
+ content: counter(news-counter);
+ counter-increment: news-counter;
+ position: absolute;
+ left: -15px;
+ top: 50%;
+ transform: translateY(-50%);
+ background: #81c784;
+ color: white;
+ width: 25px;
+ height: 25px;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 0.8rem;
+ font-weight: bold;
+}
+
+.news-list {
+ counter-reset: news-counter;
+}
+
+/* 每日一句 */
+.daily-tip {
+ background: linear-gradient(135deg, #ffecd2 0%, #fcb69f 100%);
+ padding: 20px;
+ border-radius: 15px;
+ margin: 25px 0;
+ text-align: center;
+ font-style: italic;
+ font-size: 1.1rem;
+ color: #744210;
+ box-shadow: 0 5px 20px rgba(252, 182, 159, 0.3);
+}
+
+/* 错误提示 */
+.error {
+ background: #fed7d7;
+ color: #c53030;
+ padding: 20px;
+ border-radius: 10px;
+ text-align: center;
+ border: 1px solid #feb2b2;
+}
+
+/* 响应式设计 */
+
+/* 平板端 */
+@media (max-width: 768px) {
+ .container {
+ padding: 15px;
+ }
+
+ .header h1 {
+ font-size: 2rem;
+ }
+
+ .header {
+ padding: 20px;
+ }
+
+ .content {
+ padding: 20px;
+ }
+
+ .date-selector {
+ flex-direction: column;
+ align-items: stretch;
+ }
+
+ .news-header {
+ flex-direction: column;
+ align-items: flex-start;
+ }
+}
+
+/* 手机端 */
+@media (max-width: 480px) {
+ .container {
+ padding: 10px;
+ }
+
+ .header {
+ padding: 15px;
+ margin-bottom: 20px;
+ }
+
+ .header h1 {
+ font-size: 1.8rem;
+ }
+
+ .controls {
+ padding: 15px;
+ }
+
+ .content {
+ padding: 15px;
+ }
+
+ .news-item {
+ padding: 12px 15px;
+ margin-left: 10px;
+ }
+
+ .news-item::before {
+ left: -10px;
+ width: 20px;
+ height: 20px;
+ font-size: 0.7rem;
+ }
+
+ .daily-tip {
+ padding: 15px;
+ font-size: 1rem;
+ }
+
+ .btn {
+ width: 100%;
+ padding: 15px;
+ }
+}
+
+/* 大屏幕优化 */
+@media (min-width: 1200px) {
+ .container {
+ padding: 40px;
+ }
+
+ .header {
+ padding: 40px;
+ }
+
+ .content {
+ padding: 40px;
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/index.html b/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/index.html
index 3240ff17..93e57f27 100755
--- a/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/index.html
+++ b/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/index.html
@@ -1,49 +1,49 @@
-
-
-
-
-
-
-
- 每天60秒读懂世界 | 最新资讯
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+ 每天60秒读懂世界 | 最新资讯
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/js/script.js b/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/js/script.js
index a8d48404..5e50e87f 100755
--- a/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/js/script.js
@@ -1,305 +1,305 @@
-// 每天60s读懂世界 - JavaScript功能实现
-
-const API = {
- endpoints: [],
- currentIndex: 0,
- params: {
- encoding: 'json'
- },
- localFallback: '返回接口.json',
- // 初始化API接口列表
- async init() {
- try {
- const res = await fetch('./接口集合.json');
- const endpoints = await res.json();
- this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/60s`);
- } catch (e) {
- // 如果无法加载接口集合,使用默认接口
- this.endpoints = ['https://60s.api.shumengya.top/v2/60s'];
- }
- },
- // 获取当前接口URL
- getCurrentUrl() {
- if (this.endpoints.length === 0) return null;
- const url = new URL(this.endpoints[this.currentIndex]);
- Object.entries(this.params).forEach(([k, v]) => url.searchParams.append(k, v));
- return url.toString();
- },
- // 切换到下一个接口
- switchToNext() {
- this.currentIndex = (this.currentIndex + 1) % this.endpoints.length;
- return this.currentIndex < this.endpoints.length;
- },
- // 重置到第一个接口
- reset() {
- this.currentIndex = 0;
- }
-};
-
-class NewsApp {
- constructor() {
- this.apiUrl = 'https://60s.viki.moe/v2/60s';
- this.init();
- }
-
- init() {
- this.bindEvents();
- this.loadTodayNews();
- }
-
- bindEvents() {
- // 移除了刷新按钮,不需要绑定事件
- }
-
- formatDate(date) {
- const year = date.getFullYear();
- const month = String(date.getMonth() + 1).padStart(2, '0');
- const day = String(date.getDate()).padStart(2, '0');
- return `${year}-${month}-${day}`;
- }
-
- showLoading() {
- const contentDiv = document.getElementById('content');
- if (contentDiv) {
- contentDiv.innerHTML = `
-
- `;
- }
- }
-
- showError(message) {
- const contentDiv = document.getElementById('content');
- if (contentDiv) {
- contentDiv.innerHTML = `
-
- `;
- }
- }
-
- async loadNews() {
- try {
- this.showLoading();
-
- // 尝试从API获取数据
- let data = await this.fetchFromAPI();
-
- // 如果API失败,尝试本地数据
- if (!data) {
- data = await this.fetchFromLocal();
- }
-
- if (!data) {
- throw new Error('无法获取数据,请检查网络连接或稍后重试');
- }
-
- if (data.code !== 200) {
- throw new Error(data.message || '获取数据失败');
- }
-
- this.renderNews(data.data);
-
- } catch (error) {
- console.error('获取新闻失败:', error);
- this.showError(error.message || '网络连接失败,请检查网络后重试');
- }
- }
-
- async fetchFromAPI() {
- // 初始化API接口列表
- await API.init();
-
- // 重置API索引到第一个接口
- API.reset();
-
- // 尝试所有API接口
- for (let i = 0; i < API.endpoints.length; i++) {
- try {
- const url = API.getCurrentUrl();
- console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`);
-
- const resp = await fetch(url, {
- cache: 'no-store'
- });
-
- if (!resp.ok) {
- throw new Error(`HTTP ${resp.status}: ${resp.statusText}`);
- }
-
- const data = await resp.json();
-
- if (data && data.code === 200) {
- console.log(`接口 ${i + 1} 请求成功`);
- return data;
- }
-
- throw new Error(data && data.message ? data.message : '接口返回异常');
-
- } catch (e) {
- console.warn(`接口 ${i + 1} 失败:`, e.message);
-
- // 如果不是最后一个接口,切换到下一个
- if (i < API.endpoints.length - 1) {
- API.switchToNext();
- continue;
- }
-
- // 所有接口都失败了
- console.warn('所有远程接口都失败,尝试本地数据');
- return null;
- }
- }
- }
-
- async fetchFromLocal() {
- try {
- const resp = await fetch(API.localFallback + `?t=${Date.now()}`);
- if (!resp.ok) throw new Error(`本地文件HTTP ${resp.status}`);
- const data = await resp.json();
- return data;
- } catch (e) {
- console.error('读取本地返回接口.json失败:', e);
- return null;
- }
- }
-
- loadTodayNews() {
- this.loadNews();
- }
-
- renderNews(newsData) {
- const contentDiv = document.getElementById('content');
- if (!contentDiv || !newsData) return;
-
- const {
- date,
- day_of_week,
- lunar_date,
- news,
- tip,
- link
- } = newsData;
-
- let newsListHtml = '';
- if (news && news.length > 0) {
- newsListHtml = news.map(item => `
-
- ${this.escapeHtml(item)}
-
- `).join('');
- }
-
- // 移除图片显示功能
-
- const tipHtml = tip ? `
-
- 💡 ${this.escapeHtml(tip)}
-
- ` : '';
-
- const linkHtml = link ? `
-
- ` : '';
-
- contentDiv.innerHTML = `
-
-
- ${tipHtml}
-
-
-
📰 今日要闻
- ${newsListHtml}
-
-
- ${linkHtml}
-
-
-
数据来源:每天60秒读懂世界
-
更新时间:${newsData.api_updated || '未知'}
-
- `;
- }
-
- escapeHtml(text) {
- if (typeof text !== 'string') return text;
- const div = document.createElement('div');
- div.textContent = text;
- return div.innerHTML;
- }
-}
-
-// 页面加载完成后初始化应用
-document.addEventListener('DOMContentLoaded', function() {
- window.newsApp = new NewsApp();
-});
-
-// 添加一些实用功能
-function copyToClipboard(text) {
- navigator.clipboard.writeText(text).then(() => {
- showToast('已复制到剪贴板');
- }).catch(() => {
- showToast('复制失败,请手动复制');
- });
-}
-
-function showToast(message) {
- // 创建提示框
- const toast = document.createElement('div');
- toast.style.cssText = `
- position: fixed;
- top: 20px;
- right: 20px;
- background: #4a5568;
- color: white;
- padding: 12px 20px;
- border-radius: 8px;
- z-index: 1000;
- font-size: 14px;
- box-shadow: 0 4px 12px rgba(0,0,0,0.3);
- animation: slideIn 0.3s ease;
- `;
- toast.textContent = message;
-
- // 添加动画样式
- const style = document.createElement('style');
- style.textContent = `
- @keyframes slideIn {
- from { transform: translateX(100%); opacity: 0; }
- to { transform: translateX(0); opacity: 1; }
- }
- `;
- document.head.appendChild(style);
-
- document.body.appendChild(toast);
-
- // 3秒后自动移除
- setTimeout(() => {
- toast.remove();
- style.remove();
- }, 3000);
-}
-
-// 添加键盘快捷键支持
-document.addEventListener('keydown', function(e) {
- // Ctrl/Cmd + R 刷新数据
- if ((e.ctrlKey || e.metaKey) && e.key === 'r') {
- e.preventDefault();
- if (window.newsApp) {
- window.newsApp.loadNews();
- }
- }
+// 每天60s读懂世界 - JavaScript功能实现
+
+const API = {
+ endpoints: [],
+ currentIndex: 0,
+ params: {
+ encoding: 'json'
+ },
+ localFallback: '返回接口.json',
+ // 初始化API接口列表
+ async init() {
+ try {
+ const res = await fetch('./接口集合.json');
+ const endpoints = await res.json();
+ this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/60s`);
+ } catch (e) {
+ // 如果无法加载接口集合,使用默认接口
+ this.endpoints = ['https://60s.api.shumengya.top/v2/60s'];
+ }
+ },
+ // 获取当前接口URL
+ getCurrentUrl() {
+ if (this.endpoints.length === 0) return null;
+ const url = new URL(this.endpoints[this.currentIndex]);
+ Object.entries(this.params).forEach(([k, v]) => url.searchParams.append(k, v));
+ return url.toString();
+ },
+ // 切换到下一个接口
+ switchToNext() {
+ this.currentIndex = (this.currentIndex + 1) % this.endpoints.length;
+ return this.currentIndex < this.endpoints.length;
+ },
+ // 重置到第一个接口
+ reset() {
+ this.currentIndex = 0;
+ }
+};
+
+class NewsApp {
+ constructor() {
+ this.apiUrl = 'https://60s.viki.moe/v2/60s';
+ this.init();
+ }
+
+ init() {
+ this.bindEvents();
+ this.loadTodayNews();
+ }
+
+ bindEvents() {
+ // 移除了刷新按钮,不需要绑定事件
+ }
+
+ formatDate(date) {
+ const year = date.getFullYear();
+ const month = String(date.getMonth() + 1).padStart(2, '0');
+ const day = String(date.getDate()).padStart(2, '0');
+ return `${year}-${month}-${day}`;
+ }
+
+ showLoading() {
+ const contentDiv = document.getElementById('content');
+ if (contentDiv) {
+ contentDiv.innerHTML = `
+
+ `;
+ }
+ }
+
+ showError(message) {
+ const contentDiv = document.getElementById('content');
+ if (contentDiv) {
+ contentDiv.innerHTML = `
+
+ `;
+ }
+ }
+
+ async loadNews() {
+ try {
+ this.showLoading();
+
+ // 尝试从API获取数据
+ let data = await this.fetchFromAPI();
+
+ // 如果API失败,尝试本地数据
+ if (!data) {
+ data = await this.fetchFromLocal();
+ }
+
+ if (!data) {
+ throw new Error('无法获取数据,请检查网络连接或稍后重试');
+ }
+
+ if (data.code !== 200) {
+ throw new Error(data.message || '获取数据失败');
+ }
+
+ this.renderNews(data.data);
+
+ } catch (error) {
+ console.error('获取新闻失败:', error);
+ this.showError(error.message || '网络连接失败,请检查网络后重试');
+ }
+ }
+
+ async fetchFromAPI() {
+ // 初始化API接口列表
+ await API.init();
+
+ // 重置API索引到第一个接口
+ API.reset();
+
+ // 尝试所有API接口
+ for (let i = 0; i < API.endpoints.length; i++) {
+ try {
+ const url = API.getCurrentUrl();
+ console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`);
+
+ const resp = await fetch(url, {
+ cache: 'no-store'
+ });
+
+ if (!resp.ok) {
+ throw new Error(`HTTP ${resp.status}: ${resp.statusText}`);
+ }
+
+ const data = await resp.json();
+
+ if (data && data.code === 200) {
+ console.log(`接口 ${i + 1} 请求成功`);
+ return data;
+ }
+
+ throw new Error(data && data.message ? data.message : '接口返回异常');
+
+ } catch (e) {
+ console.warn(`接口 ${i + 1} 失败:`, e.message);
+
+ // 如果不是最后一个接口,切换到下一个
+ if (i < API.endpoints.length - 1) {
+ API.switchToNext();
+ continue;
+ }
+
+ // 所有接口都失败了
+ console.warn('所有远程接口都失败,尝试本地数据');
+ return null;
+ }
+ }
+ }
+
+ async fetchFromLocal() {
+ try {
+ const resp = await fetch(API.localFallback + `?t=${Date.now()}`);
+ if (!resp.ok) throw new Error(`本地文件HTTP ${resp.status}`);
+ const data = await resp.json();
+ return data;
+ } catch (e) {
+ console.error('读取本地返回接口.json失败:', e);
+ return null;
+ }
+ }
+
+ loadTodayNews() {
+ this.loadNews();
+ }
+
+ renderNews(newsData) {
+ const contentDiv = document.getElementById('content');
+ if (!contentDiv || !newsData) return;
+
+ const {
+ date,
+ day_of_week,
+ lunar_date,
+ news,
+ tip,
+ link
+ } = newsData;
+
+ let newsListHtml = '';
+ if (news && news.length > 0) {
+ newsListHtml = news.map(item => `
+
+ ${this.escapeHtml(item)}
+
+ `).join('');
+ }
+
+ // 移除图片显示功能
+
+ const tipHtml = tip ? `
+
+ 💡 ${this.escapeHtml(tip)}
+
+ ` : '';
+
+ const linkHtml = link ? `
+
+ ` : '';
+
+ contentDiv.innerHTML = `
+
+
+ ${tipHtml}
+
+
+
📰 今日要闻
+ ${newsListHtml}
+
+
+ ${linkHtml}
+
+
+
数据来源:每天60秒读懂世界
+
更新时间:${newsData.api_updated || '未知'}
+
+ `;
+ }
+
+ escapeHtml(text) {
+ if (typeof text !== 'string') return text;
+ const div = document.createElement('div');
+ div.textContent = text;
+ return div.innerHTML;
+ }
+}
+
+// 页面加载完成后初始化应用
+document.addEventListener('DOMContentLoaded', function() {
+ window.newsApp = new NewsApp();
+});
+
+// 添加一些实用功能
+function copyToClipboard(text) {
+ navigator.clipboard.writeText(text).then(() => {
+ showToast('已复制到剪贴板');
+ }).catch(() => {
+ showToast('复制失败,请手动复制');
+ });
+}
+
+function showToast(message) {
+ // 创建提示框
+ const toast = document.createElement('div');
+ toast.style.cssText = `
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ background: #4a5568;
+ color: white;
+ padding: 12px 20px;
+ border-radius: 8px;
+ z-index: 1000;
+ font-size: 14px;
+ box-shadow: 0 4px 12px rgba(0,0,0,0.3);
+ animation: slideIn 0.3s ease;
+ `;
+ toast.textContent = message;
+
+ // 添加动画样式
+ const style = document.createElement('style');
+ style.textContent = `
+ @keyframes slideIn {
+ from { transform: translateX(100%); opacity: 0; }
+ to { transform: translateX(0); opacity: 1; }
+ }
+ `;
+ document.head.appendChild(style);
+
+ document.body.appendChild(toast);
+
+ // 3秒后自动移除
+ setTimeout(() => {
+ toast.remove();
+ style.remove();
+ }, 3000);
+}
+
+// 添加键盘快捷键支持
+document.addEventListener('keydown', function(e) {
+ // Ctrl/Cmd + R 刷新数据
+ if ((e.ctrlKey || e.metaKey) && e.key === 'r') {
+ e.preventDefault();
+ if (window.newsApp) {
+ window.newsApp.loadNews();
+ }
+ }
});
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/接口集合.json b/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/接口集合.json
index 547b2771..42245813 100755
--- a/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/接口集合.json
+++ b/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/接口集合.json
@@ -1,3 +1,3 @@
-[
- "https://60s.api.shumengya.top"
-]
+[
+ "https://60s.api.shumengya.top"
+]
diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/返回接口.json b/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/返回接口.json
index 7804d62a..be3aa159 100755
--- a/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/日更资讯/每天60s读懂世界/返回接口.json
@@ -1,66 +1,66 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": [
- {
- "id": "9aa227e2ba294bb1a95c95fde892eb31",
- "title": "《Totally Reliable Delivery Service》 Standard Edition",
- "cover": "https://cdn1.epicgames.com/52b90f9a982a404781b189f6a7903226/offer/EGS_TotallyReliableDeliveryService_WereFiveGames_S1-2560x1440-47e6e9562d62705a75ea7b7096d0b8dc.jpg",
- "original_price": 52,
- "original_price_desc": "¥52.00",
- "description": "穿好护腰护具,发动货车,送货的时间到啦!在一个高度互动的沙盒世界中,与最多三位好友一起随意地完成送货。货物已试投,这就是我们靠谱快递(Totally Reliable Delivery Service)的品质保证!",
- "seller": "Infogrames LLC",
- "is_free_now": true,
- "free_start": "2025/08/14 23:00:00",
- "free_start_at": 1755183600000,
- "free_end": "2025/08/21 23:00:00",
- "free_end_at": 1755788400000,
- "link": "https://store.epicgames.com/store/zh-CN/p/totally-reliable-delivery-service/home"
- },
- {
- "id": "8ea3500dc38e4f429702bf889c172d3d",
- "title": "Hidden Folks",
- "cover": "https://cdn1.epicgames.com/spt-assets/7bfd56b0586348dcb139945d9e59f988/hidden-folks-1b7hh.png",
- "original_price": 47,
- "original_price_desc": "¥47.00",
- "description": "Search for hidden folks in hand-drawn, interactive, miniature landscapes. Unfurl tent flaps, cut through bushes, slam doors, and poke some crocodiles! Rooooaaaarrrr!!!!!",
- "seller": "Adriaan de Jongh",
- "is_free_now": true,
- "free_start": "2025/08/14 23:00:00",
- "free_start_at": 1755183600000,
- "free_end": "2025/08/21 23:00:00",
- "free_end_at": 1755788400000,
- "link": "https://store.epicgames.com/store/zh-CN/p/hidden-folks-239d16"
- },
- {
- "id": "4cbb6c3704d240f19c3dd5f5cb2b0cb4",
- "title": "Kamaeru",
- "cover": "https://cdn1.epicgames.com/spt-assets/44313cfbb62b4df5801d0c8d541c2624/kamaeru-40asc.png",
- "original_price": 62,
- "original_price_desc": "¥62.00",
- "description": "Foster a sanctuary for frogs and restore the biodiversity of the wetlands in Kamaeru, a cozy frog collecting game, where you take pictures of frogs, play mini-games and decorate your habitat. Hop right to it!",
- "seller": "Armor Games Studios",
- "is_free_now": false,
- "free_start": "2025/08/21 23:00:00",
- "free_start_at": 1755788400000,
- "free_end": "2025/08/28 23:00:00",
- "free_end_at": 1756393200000,
- "link": "https://store.epicgames.com/store/zh-CN/p/kamaeru-0c301e"
- },
- {
- "id": "0d9a533f0e684cc18620a8f408e8e72c",
- "title": "Strange Horticulture",
- "cover": "https://cdn1.epicgames.com/spt-assets/15e8e3eba65a4763a815d6eae1d763b2/strange-horticulture-offer-2wghv.png",
- "original_price": 45,
- "original_price_desc": "¥45.00",
- "description": "款神秘学解谜游戏,你将扮演当地植物商店的店主,寻找并识别新的植物,悠闲撸猫,与女巫团体交谈,或加入异教。收集各种强大的植物,用它们来影响故事走向,揭开昂德米尔镇的黑暗谜团。",
- "seller": "Iceberg Interactive",
- "is_free_now": false,
- "free_start": "2025/08/21 23:00:00",
- "free_start_at": 1755788400000,
- "free_end": "2025/08/28 23:00:00",
- "free_end_at": 1756393200000,
- "link": "https://store.epicgames.com/store/zh-CN/p/strange-horticulture-360e80"
- }
- ]
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": [
+ {
+ "id": "9aa227e2ba294bb1a95c95fde892eb31",
+ "title": "《Totally Reliable Delivery Service》 Standard Edition",
+ "cover": "https://cdn1.epicgames.com/52b90f9a982a404781b189f6a7903226/offer/EGS_TotallyReliableDeliveryService_WereFiveGames_S1-2560x1440-47e6e9562d62705a75ea7b7096d0b8dc.jpg",
+ "original_price": 52,
+ "original_price_desc": "¥52.00",
+ "description": "穿好护腰护具,发动货车,送货的时间到啦!在一个高度互动的沙盒世界中,与最多三位好友一起随意地完成送货。货物已试投,这就是我们靠谱快递(Totally Reliable Delivery Service)的品质保证!",
+ "seller": "Infogrames LLC",
+ "is_free_now": true,
+ "free_start": "2025/08/14 23:00:00",
+ "free_start_at": 1755183600000,
+ "free_end": "2025/08/21 23:00:00",
+ "free_end_at": 1755788400000,
+ "link": "https://store.epicgames.com/store/zh-CN/p/totally-reliable-delivery-service/home"
+ },
+ {
+ "id": "8ea3500dc38e4f429702bf889c172d3d",
+ "title": "Hidden Folks",
+ "cover": "https://cdn1.epicgames.com/spt-assets/7bfd56b0586348dcb139945d9e59f988/hidden-folks-1b7hh.png",
+ "original_price": 47,
+ "original_price_desc": "¥47.00",
+ "description": "Search for hidden folks in hand-drawn, interactive, miniature landscapes. Unfurl tent flaps, cut through bushes, slam doors, and poke some crocodiles! Rooooaaaarrrr!!!!!",
+ "seller": "Adriaan de Jongh",
+ "is_free_now": true,
+ "free_start": "2025/08/14 23:00:00",
+ "free_start_at": 1755183600000,
+ "free_end": "2025/08/21 23:00:00",
+ "free_end_at": 1755788400000,
+ "link": "https://store.epicgames.com/store/zh-CN/p/hidden-folks-239d16"
+ },
+ {
+ "id": "4cbb6c3704d240f19c3dd5f5cb2b0cb4",
+ "title": "Kamaeru",
+ "cover": "https://cdn1.epicgames.com/spt-assets/44313cfbb62b4df5801d0c8d541c2624/kamaeru-40asc.png",
+ "original_price": 62,
+ "original_price_desc": "¥62.00",
+ "description": "Foster a sanctuary for frogs and restore the biodiversity of the wetlands in Kamaeru, a cozy frog collecting game, where you take pictures of frogs, play mini-games and decorate your habitat. Hop right to it!",
+ "seller": "Armor Games Studios",
+ "is_free_now": false,
+ "free_start": "2025/08/21 23:00:00",
+ "free_start_at": 1755788400000,
+ "free_end": "2025/08/28 23:00:00",
+ "free_end_at": 1756393200000,
+ "link": "https://store.epicgames.com/store/zh-CN/p/kamaeru-0c301e"
+ },
+ {
+ "id": "0d9a533f0e684cc18620a8f408e8e72c",
+ "title": "Strange Horticulture",
+ "cover": "https://cdn1.epicgames.com/spt-assets/15e8e3eba65a4763a815d6eae1d763b2/strange-horticulture-offer-2wghv.png",
+ "original_price": 45,
+ "original_price_desc": "¥45.00",
+ "description": "款神秘学解谜游戏,你将扮演当地植物商店的店主,寻找并识别新的植物,悠闲撸猫,与女巫团体交谈,或加入异教。收集各种强大的植物,用它们来影响故事走向,揭开昂德米尔镇的黑暗谜团。",
+ "seller": "Iceberg Interactive",
+ "is_free_now": false,
+ "free_start": "2025/08/21 23:00:00",
+ "free_start_at": 1755788400000,
+ "free_end": "2025/08/28 23:00:00",
+ "free_end_at": 1756393200000,
+ "link": "https://store.epicgames.com/store/zh-CN/p/strange-horticulture-360e80"
+ }
+ ]
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/css/style.css b/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/css/style.css
index 7c20bd21..1a296e45 100755
--- a/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/css/style.css
@@ -1,474 +1,474 @@
-/* 每日国际汇率 - 淡绿色清新风格样式 */
-
-/* 重置样式 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
- background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%);
- min-height: 100vh;
- color: #2d5016;
- line-height: 1.6;
- overflow-x: hidden;
-}
-
-.container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 20px;
-}
-
-/* 头部样式 */
-.header {
- text-align: center;
- margin-bottom: 30px;
- background: rgba(255, 255, 255, 0.85);
- border-radius: 20px;
- padding: 30px;
- box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08);
- backdrop-filter: blur(10px);
-}
-
-.header h1 {
- font-size: 2.5rem;
- color: #2d5016;
- margin-bottom: 10px;
- font-weight: 700;
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 15px;
-}
-
-.header p {
- color: #5a7c65;
- font-size: 1.1rem;
-}
-
-/* 货币选择器 */
-.currency-selector {
- background: rgba(255, 255, 255, 0.85);
- border-radius: 15px;
- padding: 20px;
- margin-bottom: 20px;
- box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08);
- text-align: center;
-}
-
-.currency-selector label {
- display: block;
- margin-bottom: 10px;
- font-weight: 600;
- color: #2d5016;
-}
-
-.currency-selector select {
- padding: 12px 20px;
- border: 2px solid #c8e6c9;
- border-radius: 25px;
- background: white;
- color: #2d5016;
- font-size: 1rem;
- min-width: 200px;
- cursor: pointer;
- transition: all 0.3s ease;
-}
-
-.currency-selector select:focus {
- outline: none;
- border-color: #81c784;
- box-shadow: 0 0 0 3px rgba(129, 199, 132, 0.2);
-}
-
-/* 加载状态 */
-.loading {
- text-align: center;
- padding: 40px;
- background: rgba(255, 255, 255, 0.85);
- border-radius: 15px;
- box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08);
-}
-
-.spinner {
- width: 40px;
- height: 40px;
- border: 4px solid #e8f5e8;
- border-top: 4px solid #81c784;
- border-radius: 50%;
- animation: spin 1s linear infinite;
- margin: 0 auto 20px;
-}
-
-@keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-/* 汇率信息容器 */
-.exchange-info {
- background: rgba(255, 255, 255, 0.85);
- border-radius: 20px;
- padding: 25px;
- margin-bottom: 20px;
- box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08);
- backdrop-filter: blur(10px);
-}
-
-.base-currency {
- text-align: center;
- margin-bottom: 20px;
-}
-
-.base-currency h2 {
- font-size: 1.8rem;
- color: #2d5016;
- margin-bottom: 10px;
-}
-
-.update-time {
- color: #5a7c65;
- font-size: 0.9rem;
-}
-
-/* 汇率网格 */
-.rates-grid {
- display: grid;
- grid-template-columns: repeat(8, 1fr);
- gap: 10px;
- margin-top: 20px;
-}
-
-.rate-card {
- background: rgba(255, 255, 255, 0.9);
- border-radius: 10px;
- padding: 12px;
- box-shadow: 0 3px 10px rgba(45, 80, 22, 0.06);
- transition: all 0.3s ease;
- border: 1px solid rgba(200, 230, 201, 0.5);
- text-align: center;
-}
-
-.rate-card:hover {
- transform: translateY(-1px);
- box-shadow: 0 4px 15px rgba(45, 80, 22, 0.1);
- border-color: #81c784;
-}
-
-.currency-code {
- font-size: 1rem;
- font-weight: 700;
- color: #2d5016;
- margin-bottom: 6px;
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 6px;
-}
-
-.currency-flag {
- font-size: 1.2rem;
-}
-
-.exchange-rate {
- font-size: 1.1rem;
- font-weight: 600;
- color: #388e3c;
- margin-bottom: 4px;
-}
-
-.currency-name {
- color: #5a7c65;
- font-size: 0.8rem;
- line-height: 1.2;
-}
-
-/* 搜索框 */
-.search-container {
- background: rgba(255, 255, 255, 0.85);
- border-radius: 15px;
- padding: 20px;
- margin-bottom: 20px;
- box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08);
-}
-
-.search-input {
- width: 100%;
- padding: 12px 20px;
- border: 2px solid #c8e6c9;
- border-radius: 25px;
- background: white;
- color: #2d5016;
- font-size: 1rem;
- transition: all 0.3s ease;
-}
-
-.search-input:focus {
- outline: none;
- border-color: #81c784;
- box-shadow: 0 0 0 3px rgba(129, 199, 132, 0.2);
-}
-
-.search-input::placeholder {
- color: #81c784;
-}
-
-/* 错误提示 */
-.error {
- background: #fed7d7;
- color: #c53030;
- padding: 20px;
- border-radius: 15px;
- text-align: center;
- border: 1px solid #feb2b2;
- margin: 20px 0;
-}
-
-/* 统计信息 */
-.stats {
- background: rgba(255, 255, 255, 0.85);
- border-radius: 15px;
- padding: 20px;
- margin-bottom: 20px;
- box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08);
- text-align: center;
-}
-
-.stats-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
- gap: 20px;
- margin-top: 15px;
-}
-
-.stat-item {
- padding: 15px;
- background: rgba(129, 199, 132, 0.1);
- border-radius: 10px;
-}
-
-.stat-number {
- font-size: 1.5rem;
- font-weight: 700;
- color: #2d5016;
-}
-
-.stat-label {
- color: #5a7c65;
- font-size: 0.9rem;
- margin-top: 5px;
-}
-
-/* 响应式设计 */
-
-/* 平板端 */
-@media (max-width: 768px) and (min-width: 481px) {
- .container {
- padding: 15px;
- }
-
- .header h1 {
- font-size: 2rem;
- flex-direction: column;
- gap: 10px;
- }
-
- .header {
- padding: 20px;
- }
-
- .rates-grid {
- grid-template-columns: repeat(6, 1fr);
- gap: 8px;
- }
-
- .rate-card {
- padding: 10px;
- }
-
- .currency-selector select {
- min-width: 180px;
- }
-}
-
-/* 手机端 */
-@media (max-width: 480px) {
- body {
- overflow-x: hidden;
- }
-
- .container {
- padding: 8px;
- margin: 8px;
- max-width: calc(100vw - 16px);
- width: calc(100vw - 16px);
- }
-
- .header {
- padding: 12px;
- margin-bottom: 16px;
- }
-
- .header h1 {
- font-size: 1.6rem;
- flex-direction: column;
- gap: 8px;
- }
-
- .header p {
- font-size: 0.9rem;
- }
-
- .rates-grid {
- grid-template-columns: repeat(2, 1fr);
- gap: 8px;
- width: 100%;
- overflow: hidden;
- }
-
- .rate-card {
- padding: 10px 6px;
- border-radius: 8px;
- min-width: 0;
- width: 100%;
- }
-
- .currency-code {
- font-size: 0.8rem;
- margin-bottom: 4px;
- gap: 3px;
- word-break: break-all;
- }
-
- .currency-flag {
- font-size: 0.9rem;
- }
-
- .exchange-rate {
- font-size: 0.85rem;
- margin-bottom: 3px;
- word-break: break-all;
- }
-
- .currency-name {
- font-size: 0.65rem;
- line-height: 1.1;
- word-break: break-all;
- overflow: hidden;
- text-overflow: ellipsis;
- display: -webkit-box;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical;
- }
-
- .currency-selector {
- padding: 12px;
- margin-bottom: 16px;
- }
-
- .currency-selector select {
- width: 100%;
- max-width: 100%;
- padding: 10px 15px;
- font-size: 0.9rem;
- }
-
- .search-container {
- padding: 12px;
- margin-bottom: 16px;
- }
-
- .search-input {
- padding: 10px 15px;
- font-size: 0.9rem;
- width: 100%;
- }
-
- .stats {
- padding: 15px;
- margin-bottom: 16px;
- }
-
- .stats-grid {
- grid-template-columns: repeat(2, 1fr);
- gap: 10px;
- }
-
- .stat-item {
- padding: 12px;
- }
-
- .stat-number {
- font-size: 1.3rem;
- }
-
- .stat-label {
- font-size: 0.8rem;
- }
-
- .exchange-info {
- padding: 15px;
- margin-bottom: 16px;
- }
-
- .base-currency h2 {
- font-size: 1.5rem;
- }
-
- .update-time {
- font-size: 0.8rem;
- }
-}
-
-/* 大屏幕优化 */
-@media (min-width: 1200px) {
- .container {
- padding: 40px;
- }
-
- .header {
- padding: 40px;
- }
-}
-
-/* 特殊效果 */
-.fade-in {
- animation: fadeIn 0.6s ease-in;
-}
-
-@keyframes fadeIn {
- from {
- opacity: 0;
- transform: translateY(20px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-/* 滚动条样式 */
-::-webkit-scrollbar {
- width: 8px;
-}
-
-::-webkit-scrollbar-track {
- background: rgba(255, 255, 255, 0.1);
-}
-
-::-webkit-scrollbar-thumb {
- background: rgba(129, 199, 132, 0.5);
- border-radius: 4px;
-}
-
-::-webkit-scrollbar-thumb:hover {
- background: rgba(129, 199, 132, 0.7);
-}
-
-/* 隐藏类 */
-.hidden {
- display: none;
+/* 每日国际汇率 - 淡绿色清新风格样式 */
+
+/* 重置样式 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%);
+ min-height: 100vh;
+ color: #2d5016;
+ line-height: 1.6;
+ overflow-x: hidden;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+}
+
+/* 头部样式 */
+.header {
+ text-align: center;
+ margin-bottom: 30px;
+ background: rgba(255, 255, 255, 0.85);
+ border-radius: 20px;
+ padding: 30px;
+ box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08);
+ backdrop-filter: blur(10px);
+}
+
+.header h1 {
+ font-size: 2.5rem;
+ color: #2d5016;
+ margin-bottom: 10px;
+ font-weight: 700;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 15px;
+}
+
+.header p {
+ color: #5a7c65;
+ font-size: 1.1rem;
+}
+
+/* 货币选择器 */
+.currency-selector {
+ background: rgba(255, 255, 255, 0.85);
+ border-radius: 15px;
+ padding: 20px;
+ margin-bottom: 20px;
+ box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08);
+ text-align: center;
+}
+
+.currency-selector label {
+ display: block;
+ margin-bottom: 10px;
+ font-weight: 600;
+ color: #2d5016;
+}
+
+.currency-selector select {
+ padding: 12px 20px;
+ border: 2px solid #c8e6c9;
+ border-radius: 25px;
+ background: white;
+ color: #2d5016;
+ font-size: 1rem;
+ min-width: 200px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+}
+
+.currency-selector select:focus {
+ outline: none;
+ border-color: #81c784;
+ box-shadow: 0 0 0 3px rgba(129, 199, 132, 0.2);
+}
+
+/* 加载状态 */
+.loading {
+ text-align: center;
+ padding: 40px;
+ background: rgba(255, 255, 255, 0.85);
+ border-radius: 15px;
+ box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08);
+}
+
+.spinner {
+ width: 40px;
+ height: 40px;
+ border: 4px solid #e8f5e8;
+ border-top: 4px solid #81c784;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ margin: 0 auto 20px;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+/* 汇率信息容器 */
+.exchange-info {
+ background: rgba(255, 255, 255, 0.85);
+ border-radius: 20px;
+ padding: 25px;
+ margin-bottom: 20px;
+ box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08);
+ backdrop-filter: blur(10px);
+}
+
+.base-currency {
+ text-align: center;
+ margin-bottom: 20px;
+}
+
+.base-currency h2 {
+ font-size: 1.8rem;
+ color: #2d5016;
+ margin-bottom: 10px;
+}
+
+.update-time {
+ color: #5a7c65;
+ font-size: 0.9rem;
+}
+
+/* 汇率网格 */
+.rates-grid {
+ display: grid;
+ grid-template-columns: repeat(8, 1fr);
+ gap: 10px;
+ margin-top: 20px;
+}
+
+.rate-card {
+ background: rgba(255, 255, 255, 0.9);
+ border-radius: 10px;
+ padding: 12px;
+ box-shadow: 0 3px 10px rgba(45, 80, 22, 0.06);
+ transition: all 0.3s ease;
+ border: 1px solid rgba(200, 230, 201, 0.5);
+ text-align: center;
+}
+
+.rate-card:hover {
+ transform: translateY(-1px);
+ box-shadow: 0 4px 15px rgba(45, 80, 22, 0.1);
+ border-color: #81c784;
+}
+
+.currency-code {
+ font-size: 1rem;
+ font-weight: 700;
+ color: #2d5016;
+ margin-bottom: 6px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 6px;
+}
+
+.currency-flag {
+ font-size: 1.2rem;
+}
+
+.exchange-rate {
+ font-size: 1.1rem;
+ font-weight: 600;
+ color: #388e3c;
+ margin-bottom: 4px;
+}
+
+.currency-name {
+ color: #5a7c65;
+ font-size: 0.8rem;
+ line-height: 1.2;
+}
+
+/* 搜索框 */
+.search-container {
+ background: rgba(255, 255, 255, 0.85);
+ border-radius: 15px;
+ padding: 20px;
+ margin-bottom: 20px;
+ box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08);
+}
+
+.search-input {
+ width: 100%;
+ padding: 12px 20px;
+ border: 2px solid #c8e6c9;
+ border-radius: 25px;
+ background: white;
+ color: #2d5016;
+ font-size: 1rem;
+ transition: all 0.3s ease;
+}
+
+.search-input:focus {
+ outline: none;
+ border-color: #81c784;
+ box-shadow: 0 0 0 3px rgba(129, 199, 132, 0.2);
+}
+
+.search-input::placeholder {
+ color: #81c784;
+}
+
+/* 错误提示 */
+.error {
+ background: #fed7d7;
+ color: #c53030;
+ padding: 20px;
+ border-radius: 15px;
+ text-align: center;
+ border: 1px solid #feb2b2;
+ margin: 20px 0;
+}
+
+/* 统计信息 */
+.stats {
+ background: rgba(255, 255, 255, 0.85);
+ border-radius: 15px;
+ padding: 20px;
+ margin-bottom: 20px;
+ box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08);
+ text-align: center;
+}
+
+.stats-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
+ gap: 20px;
+ margin-top: 15px;
+}
+
+.stat-item {
+ padding: 15px;
+ background: rgba(129, 199, 132, 0.1);
+ border-radius: 10px;
+}
+
+.stat-number {
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: #2d5016;
+}
+
+.stat-label {
+ color: #5a7c65;
+ font-size: 0.9rem;
+ margin-top: 5px;
+}
+
+/* 响应式设计 */
+
+/* 平板端 */
+@media (max-width: 768px) and (min-width: 481px) {
+ .container {
+ padding: 15px;
+ }
+
+ .header h1 {
+ font-size: 2rem;
+ flex-direction: column;
+ gap: 10px;
+ }
+
+ .header {
+ padding: 20px;
+ }
+
+ .rates-grid {
+ grid-template-columns: repeat(6, 1fr);
+ gap: 8px;
+ }
+
+ .rate-card {
+ padding: 10px;
+ }
+
+ .currency-selector select {
+ min-width: 180px;
+ }
+}
+
+/* 手机端 */
+@media (max-width: 480px) {
+ body {
+ overflow-x: hidden;
+ }
+
+ .container {
+ padding: 8px;
+ margin: 8px;
+ max-width: calc(100vw - 16px);
+ width: calc(100vw - 16px);
+ }
+
+ .header {
+ padding: 12px;
+ margin-bottom: 16px;
+ }
+
+ .header h1 {
+ font-size: 1.6rem;
+ flex-direction: column;
+ gap: 8px;
+ }
+
+ .header p {
+ font-size: 0.9rem;
+ }
+
+ .rates-grid {
+ grid-template-columns: repeat(2, 1fr);
+ gap: 8px;
+ width: 100%;
+ overflow: hidden;
+ }
+
+ .rate-card {
+ padding: 10px 6px;
+ border-radius: 8px;
+ min-width: 0;
+ width: 100%;
+ }
+
+ .currency-code {
+ font-size: 0.8rem;
+ margin-bottom: 4px;
+ gap: 3px;
+ word-break: break-all;
+ }
+
+ .currency-flag {
+ font-size: 0.9rem;
+ }
+
+ .exchange-rate {
+ font-size: 0.85rem;
+ margin-bottom: 3px;
+ word-break: break-all;
+ }
+
+ .currency-name {
+ font-size: 0.65rem;
+ line-height: 1.1;
+ word-break: break-all;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ }
+
+ .currency-selector {
+ padding: 12px;
+ margin-bottom: 16px;
+ }
+
+ .currency-selector select {
+ width: 100%;
+ max-width: 100%;
+ padding: 10px 15px;
+ font-size: 0.9rem;
+ }
+
+ .search-container {
+ padding: 12px;
+ margin-bottom: 16px;
+ }
+
+ .search-input {
+ padding: 10px 15px;
+ font-size: 0.9rem;
+ width: 100%;
+ }
+
+ .stats {
+ padding: 15px;
+ margin-bottom: 16px;
+ }
+
+ .stats-grid {
+ grid-template-columns: repeat(2, 1fr);
+ gap: 10px;
+ }
+
+ .stat-item {
+ padding: 12px;
+ }
+
+ .stat-number {
+ font-size: 1.3rem;
+ }
+
+ .stat-label {
+ font-size: 0.8rem;
+ }
+
+ .exchange-info {
+ padding: 15px;
+ margin-bottom: 16px;
+ }
+
+ .base-currency h2 {
+ font-size: 1.5rem;
+ }
+
+ .update-time {
+ font-size: 0.8rem;
+ }
+}
+
+/* 大屏幕优化 */
+@media (min-width: 1200px) {
+ .container {
+ padding: 40px;
+ }
+
+ .header {
+ padding: 40px;
+ }
+}
+
+/* 特殊效果 */
+.fade-in {
+ animation: fadeIn 0.6s ease-in;
+}
+
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+/* 滚动条样式 */
+::-webkit-scrollbar {
+ width: 8px;
+}
+
+::-webkit-scrollbar-track {
+ background: rgba(255, 255, 255, 0.1);
+}
+
+::-webkit-scrollbar-thumb {
+ background: rgba(129, 199, 132, 0.5);
+ border-radius: 4px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: rgba(129, 199, 132, 0.7);
+}
+
+/* 隐藏类 */
+.hidden {
+ display: none;
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/index.html b/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/index.html
index 644740d2..d1bc7eb1 100755
--- a/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/index.html
+++ b/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/index.html
@@ -1,86 +1,86 @@
-
-
-
-
-
-
-
- 每日国际汇率
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+ 每日国际汇率
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/js/script.js b/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/js/script.js
index 4f820299..f815bd54 100755
--- a/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/js/script.js
@@ -1,520 +1,520 @@
-// 每日国际汇率 JavaScript 功能
-
-// API配置
-const API = {
- endpoints: [],
- currentIndex: 0,
- defaultCurrency: 'CNY',
- localFallback: '返回接口.json',
- // 初始化API接口列表
- async init() {
- try {
- const res = await fetch('./接口集合.json');
- const endpoints = await res.json();
- this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/exchange_rate`);
- } catch (e) {
- // 如果无法加载接口集合,使用默认接口
- this.endpoints = ['https://60s.api.shumengya.top/v2/exchange_rate'];
- }
- },
- // 获取当前接口URL
- getCurrentUrl(currency) {
- if (this.endpoints.length === 0) return null;
- const url = new URL(this.endpoints[this.currentIndex]);
- url.searchParams.append('currency', currency);
- return url.toString();
- },
- // 切换到下一个接口
- switchToNext() {
- this.currentIndex = (this.currentIndex + 1) % this.endpoints.length;
- return this.currentIndex < this.endpoints.length;
- },
- // 重置到第一个接口
- reset() {
- this.currentIndex = 0;
- }
-};
-
-// 常用货币列表
-const POPULAR_CURRENCIES = [
- { code: 'CNY', name: '人民币', flag: '🇨🇳' },
- { code: 'USD', name: '美元', flag: '🇺🇸' },
- { code: 'EUR', name: '欧元', flag: '🇪🇺' },
- { code: 'JPY', name: '日元', flag: '🇯🇵' },
- { code: 'GBP', name: '英镑', flag: '🇬🇧' },
- { code: 'AUD', name: '澳元', flag: '🇦🇺' },
- { code: 'CAD', name: '加元', flag: '🇨🇦' },
- { code: 'CHF', name: '瑞士法郎', flag: '🇨🇭' },
- { code: 'HKD', name: '港币', flag: '🇭🇰' },
- { code: 'SGD', name: '新加坡元', flag: '🇸🇬' },
- { code: 'KRW', name: '韩元', flag: '🇰🇷' },
- { code: 'THB', name: '泰铢', flag: '🇹🇭' }
-];
-
-// 货币优先级排序 - 经济发达、交易频繁的国家货币优先
-const CURRENCY_PRIORITY = {
- // 第一梯队:全球主要储备货币和交易货币
- 'USD': 1, // 美元 - 全球储备货币
- 'EUR': 2, // 欧元 - 欧盟统一货币
- 'JPY': 3, // 日元 - 亚洲主要货币
- 'GBP': 4, // 英镑 - 传统储备货币
- 'CNY': 5, // 人民币 - 中国货币
-
- // 第二梯队:发达国家货币
- 'CHF': 10, // 瑞士法郎 - 避险货币
- 'CAD': 11, // 加拿大元
- 'AUD': 12, // 澳大利亚元
- 'NZD': 13, // 新西兰元
- 'SEK': 14, // 瑞典克朗
- 'NOK': 15, // 挪威克朗
- 'DKK': 16, // 丹麦克朗
-
- // 第三梯队:亚洲发达经济体
- 'HKD': 20, // 港币
- 'SGD': 21, // 新加坡元
- 'KRW': 22, // 韩元
- 'TWD': 23, // 新台币
-
- // 第四梯队:重要新兴市场货币
- 'RUB': 30, // 俄罗斯卢布
- 'INR': 31, // 印度卢比
- 'BRL': 32, // 巴西雷亚尔
- 'MXN': 33, // 墨西哥比索
- 'ZAR': 34, // 南非兰特
- 'TRY': 35, // 土耳其里拉
-
- // 第五梯队:亚洲重要货币
- 'THB': 40, // 泰铢
- 'MYR': 41, // 马来西亚林吉特
- 'IDR': 42, // 印尼盾
- 'PHP': 43, // 菲律宾比索
- 'VND': 44, // 越南盾
-
- // 第六梯队:中东石油国家货币
- 'SAR': 50, // 沙特里亚尔
- 'AED': 51, // 阿联酋迪拉姆
- 'QAR': 52, // 卡塔尔里亚尔
- 'KWD': 53, // 科威特第纳尔
-
- // 第七梯队:欧洲其他货币
- 'PLN': 60, // 波兰兹罗提
- 'CZK': 61, // 捷克克朗
- 'HUF': 62, // 匈牙利福林
- 'RON': 63, // 罗马尼亚列伊
- 'BGN': 64, // 保加利亚列弗
- 'HRK': 65, // 克罗地亚库纳
-
- // 第八梯队:拉美货币
- 'ARS': 70, // 阿根廷比索
- 'CLP': 71, // 智利比索
- 'COP': 72, // 哥伦比亚比索
- 'PEN': 73, // 秘鲁索尔
- 'UYU': 74, // 乌拉圭比索
-
- // 其他货币默认优先级为 999
-};
-
-// 货币名称映射
-const CURRENCY_NAMES = {
- 'CNY': '人民币', 'USD': '美元', 'EUR': '欧元', 'JPY': '日元', 'GBP': '英镑',
- 'AUD': '澳元', 'CAD': '加元', 'CHF': '瑞士法郎', 'HKD': '港币', 'SGD': '新加坡元',
- 'KRW': '韩元', 'THB': '泰铢', 'AED': '阿联酋迪拉姆', 'AFN': '阿富汗尼',
- 'ALL': '阿尔巴尼亚列克', 'AMD': '亚美尼亚德拉姆', 'ANG': '荷属安的列斯盾',
- 'AOA': '安哥拉宽扎', 'ARS': '阿根廷比索', 'AWG': '阿鲁巴弗罗林',
- 'AZN': '阿塞拜疆马纳特', 'BAM': '波黑马克', 'BBD': '巴巴多斯元',
- 'BDT': '孟加拉塔卡', 'BGN': '保加利亚列弗', 'BHD': '巴林第纳尔',
- 'BIF': '布隆迪法郎', 'BMD': '百慕大元', 'BND': '文莱元', 'BOB': '玻利维亚诺',
- 'BRL': '巴西雷亚尔', 'BSD': '巴哈马元', 'BTN': '不丹努尔特鲁姆',
- 'BWP': '博茨瓦纳普拉', 'BYN': '白俄罗斯卢布', 'BZD': '伯利兹元',
- 'CDF': '刚果法郎', 'CLP': '智利比索', 'COP': '哥伦比亚比索', 'CRC': '哥斯达黎加科朗',
- 'CUP': '古巴比索', 'CVE': '佛得角埃斯库多', 'CZK': '捷克克朗', 'DJF': '吉布提法郎',
- 'DKK': '丹麦克朗', 'DOP': '多米尼加比索', 'DZD': '阿尔及利亚第纳尔', 'EGP': '埃及镑',
- 'ERN': '厄立特里亚纳克法', 'ETB': '埃塞俄比亚比尔', 'FJD': '斐济元', 'FKP': '福克兰群岛镑',
- 'FOK': '法罗群岛克朗', 'GEL': '格鲁吉亚拉里', 'GGP': '根西岛镑', 'GHS': '加纳塞地',
- 'GIP': '直布罗陀镑', 'GMD': '冈比亚达拉西', 'GNF': '几内亚法郎', 'GTQ': '危地马拉格查尔',
- 'GYD': '圭亚那元', 'HNL': '洪都拉斯伦皮拉', 'HRK': '克罗地亚库纳', 'HTG': '海地古德',
- 'HUF': '匈牙利福林', 'IDR': '印尼盾', 'ILS': '以色列新谢克尔', 'IMP': '马恩岛镑',
- 'INR': '印度卢比', 'IQD': '伊拉克第纳尔', 'IRR': '伊朗里亚尔', 'ISK': '冰岛克朗',
- 'JEP': '泽西岛镑', 'JMD': '牙买加元', 'JOD': '约旦第纳尔', 'KES': '肯尼亚先令',
- 'KGS': '吉尔吉斯斯坦索姆', 'KHR': '柬埔寨瑞尔', 'KID': '基里巴斯元', 'KMF': '科摩罗法郎',
- 'KWD': '科威特第纳尔', 'KYD': '开曼群岛元', 'KZT': '哈萨克斯坦坚戈', 'LAK': '老挝基普',
- 'LBP': '黎巴嫩镑', 'LKR': '斯里兰卡卢比', 'LRD': '利比里亚元', 'LSL': '莱索托洛蒂',
- 'LYD': '利比亚第纳尔', 'MAD': '摩洛哥迪拉姆', 'MDL': '摩尔多瓦列伊', 'MGA': '马达加斯加阿里亚里',
- 'MKD': '北马其顿第纳尔', 'MMK': '缅甸缅元', 'MNT': '蒙古图格里克', 'MOP': '澳门帕塔卡',
- 'MRU': '毛里塔尼亚乌吉亚', 'MUR': '毛里求斯卢比', 'MVR': '马尔代夫拉菲亚', 'MWK': '马拉维克瓦查',
- 'MXN': '墨西哥比索', 'MYR': '马来西亚林吉特', 'MZN': '莫桑比克梅蒂卡尔', 'NAD': '纳米比亚元',
- 'NGN': '尼日利亚奈拉', 'NIO': '尼加拉瓜科多巴', 'NOK': '挪威克朗', 'NPR': '尼泊尔卢比',
- 'NZD': '新西兰元', 'OMR': '阿曼里亚尔', 'PAB': '巴拿马巴波亚', 'PEN': '秘鲁索尔',
- 'PGK': '巴布亚新几内亚基那', 'PHP': '菲律宾比索', 'PKR': '巴基斯坦卢比', 'PLN': '波兰兹罗提',
- 'PYG': '巴拉圭瓜拉尼', 'QAR': '卡塔尔里亚尔', 'RON': '罗马尼亚列伊', 'RSD': '塞尔维亚第纳尔',
- 'RUB': '俄罗斯卢布', 'RWF': '卢旺达法郎', 'SAR': '沙特里亚尔', 'SBD': '所罗门群岛元',
- 'SCR': '塞舌尔卢比', 'SDG': '苏丹镑', 'SEK': '瑞典克朗', 'SHP': '圣赫勒拿镑',
- 'SLE': '塞拉利昂利昂', 'SLL': '塞拉利昂利昂(旧)', 'SOS': '索马里先令', 'SRD': '苏里南元',
- 'SSP': '南苏丹镑', 'STN': '圣多美和普林西比多布拉', 'SYP': '叙利亚镑', 'SZL': '斯威士兰里兰吉尼',
- 'TJS': '塔吉克斯坦索莫尼', 'TMT': '土库曼斯坦马纳特', 'TND': '突尼斯第纳尔', 'TOP': '汤加潘加',
- 'TRY': '土耳其里拉', 'TTD': '特立尼达和多巴哥元', 'TVD': '图瓦卢元', 'TWD': '新台币',
- 'TZS': '坦桑尼亚先令', 'UAH': '乌克兰格里夫纳', 'UGX': '乌干达先令', 'UYU': '乌拉圭比索',
- 'UZS': '乌兹别克斯坦苏姆', 'VES': '委内瑞拉玻利瓦尔', 'VND': '越南盾', 'VUV': '瓦努阿图瓦图',
- 'WST': '萨摩亚塔拉', 'XAF': '中非法郎', 'XCD': '东加勒比元', 'XCG': '加勒比盾',
- 'XDR': '特别提款权', 'XOF': '西非法郎', 'XPF': '太平洋法郎', 'YER': '也门里亚尔',
- 'ZAR': '南非兰特', 'ZMW': '赞比亚克瓦查', 'ZWL': '津巴布韦元'
-};
-
-// 货币旗帜映射
-const CURRENCY_FLAGS = {
- 'CNY': '🇨🇳', 'USD': '🇺🇸', 'EUR': '🇪🇺', 'JPY': '🇯🇵', 'GBP': '🇬🇧',
- 'AUD': '🇦🇺', 'CAD': '🇨🇦', 'CHF': '🇨🇭', 'HKD': '🇭🇰', 'SGD': '🇸🇬',
- 'KRW': '🇰🇷', 'THB': '🇹🇭', 'AED': '🇦🇪', 'AFN': '🇦🇫', 'ALL': '🇦🇱',
- 'AMD': '🇦🇲', 'ANG': '🇳🇱', 'AOA': '🇦🇴', 'ARS': '🇦🇷', 'AWG': '🇦🇼',
- 'AZN': '🇦🇿', 'BAM': '🇧🇦', 'BBD': '🇧🇧', 'BDT': '🇧🇩', 'BGN': '🇧🇬',
- 'BHD': '🇧🇭', 'BIF': '🇧🇮', 'BMD': '🇧🇲', 'BND': '🇧🇳', 'BOB': '🇧🇴',
- 'BRL': '🇧🇷', 'BSD': '🇧🇸', 'BTN': '🇧🇹', 'BWP': '🇧🇼', 'BYN': '🇧🇾',
- 'BZD': '🇧🇿', 'CDF': '🇨🇩', 'CLP': '🇨🇱', 'COP': '🇨🇴', 'CRC': '🇨🇷',
- 'CUP': '🇨🇺', 'CVE': '🇨🇻', 'CZK': '🇨🇿', 'DJF': '🇩🇯', 'DKK': '🇩🇰',
- 'DOP': '🇩🇴', 'DZD': '🇩🇿', 'EGP': '🇪🇬', 'ERN': '🇪🇷', 'ETB': '🇪🇹',
- 'FJD': '🇫🇯', 'FKP': '🇫🇰', 'FOK': '🇫🇴', 'GEL': '🇬🇪', 'GGP': '🇬🇬',
- 'GHS': '🇬🇭', 'GIP': '🇬🇮', 'GMD': '🇬🇲', 'GNF': '🇬🇳', 'GTQ': '🇬🇹',
- 'GYD': '🇬🇾', 'HNL': '🇭🇳', 'HRK': '🇭🇷', 'HTG': '🇭🇹', 'HUF': '🇭🇺',
- 'IDR': '🇮🇩', 'ILS': '🇮🇱', 'IMP': '🇮🇲', 'INR': '🇮🇳', 'IQD': '🇮🇶',
- 'IRR': '🇮🇷', 'ISK': '🇮🇸', 'JEP': '🇯🇪', 'JMD': '🇯🇲', 'JOD': '🇯🇴',
- 'KES': '🇰🇪', 'KGS': '🇰🇬', 'KHR': '🇰🇭', 'KID': '🇰🇮', 'KMF': '🇰🇲',
- 'KWD': '🇰🇼', 'KYD': '🇰🇾', 'KZT': '🇰🇿', 'LAK': '🇱🇦', 'LBP': '🇱🇧',
- 'LKR': '🇱🇰', 'LRD': '🇱🇷', 'LSL': '🇱🇸', 'LYD': '🇱🇾', 'MAD': '🇲🇦',
- 'MDL': '🇲🇩', 'MGA': '🇲🇬', 'MKD': '🇲🇰', 'MMK': '🇲🇲', 'MNT': '🇲🇳',
- 'MOP': '🇲🇴', 'MRU': '🇲🇷', 'MUR': '🇲🇺', 'MVR': '🇲🇻', 'MWK': '🇲🇼',
- 'MXN': '🇲🇽', 'MYR': '🇲🇾', 'MZN': '🇲🇿', 'NAD': '🇳🇦', 'NGN': '🇳🇬',
- 'NIO': '🇳🇮', 'NOK': '🇳🇴', 'NPR': '🇳🇵', 'NZD': '🇳🇿', 'OMR': '🇴🇲',
- 'PAB': '🇵🇦', 'PEN': '🇵🇪', 'PGK': '🇵🇬', 'PHP': '🇵🇭', 'PKR': '🇵🇰',
- 'PLN': '🇵🇱', 'PYG': '🇵🇾', 'QAR': '🇶🇦', 'RON': '🇷🇴', 'RSD': '🇷🇸',
- 'RUB': '🇷🇺', 'RWF': '🇷🇼', 'SAR': '🇸🇦', 'SBD': '🇸🇧', 'SCR': '🇸🇨',
- 'SDG': '🇸🇩', 'SEK': '🇸🇪', 'SHP': '🇸🇭', 'SLE': '🇸🇱', 'SLL': '🇸🇱',
- 'SOS': '🇸🇴', 'SRD': '🇸🇷', 'SSP': '🇸🇸', 'STN': '🇸🇹', 'SYP': '🇸🇾',
- 'SZL': '🇸🇿', 'TJS': '🇹🇯', 'TMT': '🇹🇲', 'TND': '🇹🇳', 'TOP': '🇹🇴',
- 'TRY': '🇹🇷', 'TTD': '🇹🇹', 'TVD': '🇹🇻', 'TWD': '🇹🇼', 'TZS': '🇹🇿',
- 'UAH': '🇺🇦', 'UGX': '🇺🇬', 'UYU': '🇺🇾', 'UZS': '🇺🇿', 'VES': '🇻🇪',
- 'VND': '🇻🇳', 'VUV': '🇻🇺', 'WST': '🇼🇸', 'XAF': '🌍', 'XCD': '🏝️',
- 'XCG': '🏝️', 'XDR': '🌐', 'XOF': '🌍', 'XPF': '🌊', 'YER': '🇾🇪',
- 'ZAR': '🇿🇦', 'ZMW': '🇿🇲', 'ZWL': '🇿🇼'
-};
-
-// DOM元素
-let elements = {};
-let currentRates = [];
-let filteredRates = [];
-
-// 初始化
-document.addEventListener('DOMContentLoaded', function() {
- initElements();
- initCurrencySelector();
- bindEvents();
- loadExchangeRates();
-});
-
-// 初始化DOM元素
-function initElements() {
- elements = {
- currencySelect: document.getElementById('currency-select'),
- searchInput: document.getElementById('search-input'),
- loading: document.getElementById('loading'),
- content: document.getElementById('exchange-content'),
- baseCurrency: document.getElementById('base-currency'),
- updateTime: document.getElementById('update-time'),
- ratesGrid: document.getElementById('rates-grid'),
- totalCurrencies: document.getElementById('total-currencies'),
- lastUpdate: document.getElementById('last-update')
- };
-}
-
-// 初始化货币选择器
-function initCurrencySelector() {
- if (!elements.currencySelect) return;
-
- // 添加常用货币选项
- POPULAR_CURRENCIES.forEach(currency => {
- const option = document.createElement('option');
- option.value = currency.code;
- option.textContent = `${currency.flag} ${currency.code} - ${currency.name}`;
- if (currency.code === API.defaultCurrency) {
- option.selected = true;
- }
- elements.currencySelect.appendChild(option);
- });
-}
-
-// 绑定事件
-function bindEvents() {
- // 货币选择变化
- if (elements.currencySelect) {
- elements.currencySelect.addEventListener('change', function() {
- loadExchangeRates(this.value);
- });
- }
-
- // 搜索功能
- if (elements.searchInput) {
- elements.searchInput.addEventListener('input', function() {
- filterRates(this.value);
- });
- }
-}
-
-// 加载汇率数据
-async function loadExchangeRates(currency = API.defaultCurrency) {
- try {
- showLoading(true);
-
- // 尝试从API获取数据
- const data = await fetchFromAPI(currency);
-
- if (data && data.code === 200 && data.data) {
- currentRates = data.data.rates || [];
- displayExchangeRates(data.data);
- } else {
- // 尝试从本地获取数据
- const localData = await fetchFromLocal();
- if (localData && localData.code === 200 && localData.data) {
- currentRates = localData.data.rates || [];
- displayExchangeRates(localData.data);
- showError('使用本地数据,可能不是最新汇率');
- } else {
- throw new Error('无法获取汇率数据');
- }
- }
-
- } catch (error) {
- console.error('加载汇率失败:', error);
- showError('加载汇率数据失败,请稍后重试');
- } finally {
- showLoading(false);
- }
-}
-
-// 从API获取数据
-async function fetchFromAPI(currency) {
- // 初始化API接口列表
- await API.init();
-
- // 重置API索引到第一个接口
- API.reset();
-
- // 尝试所有API接口
- for (let i = 0; i < API.endpoints.length; i++) {
- try {
- const url = API.getCurrentUrl(currency);
- console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`);
-
- const response = await fetch(url, {
- cache: 'no-store'
- });
-
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
- }
-
- const data = await response.json();
-
- if (data && data.code === 200) {
- console.log(`接口 ${i + 1} 请求成功`);
- return data;
- }
-
- throw new Error(data && data.message ? data.message : '接口返回异常');
-
- } catch (e) {
- console.warn(`接口 ${i + 1} 失败:`, e.message);
-
- // 如果不是最后一个接口,切换到下一个
- if (i < API.endpoints.length - 1) {
- API.switchToNext();
- continue;
- }
-
- // 所有接口都失败了
- console.warn('所有远程接口都失败,尝试本地数据');
- return null;
- }
- }
-}
-
-// 从本地获取数据
-async function fetchFromLocal() {
- try {
- const response = await fetch(API.localFallback + `?t=${Date.now()}`);
- if (!response.ok) throw new Error(`本地文件HTTP ${response.status}`);
- const data = await response.json();
- return data;
- } catch (e) {
- console.error('读取本地返回接口.json失败:', e);
- return null;
- }
-}
-
-// 显示汇率数据
-function displayExchangeRates(data) {
- if (!data || !data.rates) {
- showError('没有获取到汇率数据');
- return;
- }
-
- // 更新基础货币信息
- if (elements.baseCurrency) {
- const baseCurrencyName = CURRENCY_NAMES[data.base_code] || data.base_code;
- const baseCurrencyFlag = CURRENCY_FLAGS[data.base_code] || '💱';
- elements.baseCurrency.textContent = `${baseCurrencyFlag} ${data.base_code} - ${baseCurrencyName}`;
- }
-
- // 更新时间信息
- if (elements.updateTime && data.updated) {
- elements.updateTime.textContent = `更新时间: ${data.updated}`;
- }
-
- // 更新统计信息
- updateStats(data);
-
- // 显示汇率列表
- filteredRates = data.rates;
- renderRates(filteredRates);
-
- // 显示内容区域
- if (elements.content) {
- elements.content.classList.add('fade-in');
- elements.content.style.display = 'block';
- }
-}
-
-// 更新统计信息
-function updateStats(data) {
- if (elements.totalCurrencies) {
- elements.totalCurrencies.textContent = data.rates ? data.rates.length : 0;
- }
-
- if (elements.lastUpdate && data.updated) {
- elements.lastUpdate.textContent = data.updated;
- }
-}
-
-// 渲染汇率列表
-function renderRates(rates) {
- if (!elements.ratesGrid || !rates) return;
-
- // 按优先级排序货币
- const sortedRates = [...rates].sort((a, b) => {
- const priorityA = CURRENCY_PRIORITY[a.currency] || 999;
- const priorityB = CURRENCY_PRIORITY[b.currency] || 999;
-
- // 优先级相同时按货币代码字母顺序排序
- if (priorityA === priorityB) {
- return a.currency.localeCompare(b.currency);
- }
-
- return priorityA - priorityB;
- });
-
- elements.ratesGrid.innerHTML = '';
-
- sortedRates.forEach(rate => {
- const rateCard = createRateCard(rate);
- elements.ratesGrid.appendChild(rateCard);
- });
-}
-
-// 创建汇率卡片
-function createRateCard(rate) {
- const card = document.createElement('div');
- card.className = 'rate-card';
-
- const currencyName = CURRENCY_NAMES[rate.currency] || rate.currency;
- const currencyFlag = CURRENCY_FLAGS[rate.currency] || '💱';
-
- card.innerHTML = `
-
- ${currencyFlag}
- ${rate.currency}
-
- ${formatRate(rate.rate)}
- ${currencyName}
- `;
-
- return card;
-}
-
-// 格式化汇率
-function formatRate(rate) {
- if (rate >= 1) {
- return rate.toFixed(4);
- } else if (rate >= 0.01) {
- return rate.toFixed(6);
- } else {
- return rate.toFixed(8);
- }
-}
-
-// 过滤汇率数据
-function filterRates(searchTerm) {
- if (!searchTerm.trim()) {
- renderRates(currentRates);
- return;
- }
-
- const filtered = currentRates.filter(rate => {
- const currencyName = CURRENCY_NAMES[rate.currency] || rate.currency;
- return rate.currency.toLowerCase().includes(searchTerm.toLowerCase()) ||
- currencyName.toLowerCase().includes(searchTerm.toLowerCase());
- });
-
- renderRates(filtered);
-}
-
-// 显示/隐藏加载状态
-function showLoading(show) {
- if (elements.loading) {
- elements.loading.style.display = show ? 'block' : 'none';
- }
- if (elements.content) {
- elements.content.style.display = show ? 'none' : 'block';
- }
-}
-
-// 显示错误信息
-function showError(message) {
- if (elements.content) {
- elements.content.innerHTML = `
-
-
⚠️ 加载失败
-
${escapeHtml(message)}
-
请检查网络连接或稍后重试
-
- `;
- elements.content.style.display = 'block';
- }
-}
-
-// HTML转义
-function escapeHtml(text) {
- if (!text) return '';
- const div = document.createElement('div');
- div.textContent = text;
- return div.innerHTML;
-}
-
-// 错误处理
-window.addEventListener('error', function(event) {
- console.error('页面错误:', event.error);
-});
-
-// 网络状态监听
-window.addEventListener('online', function() {
- console.log('网络已连接');
-});
-
-window.addEventListener('offline', function() {
- console.log('网络已断开');
- showError('网络连接已断开,请检查网络设置');
-});
-
-// 导出函数供外部调用
-window.ExchangeRate = {
- loadExchangeRates,
- showError,
- showLoading
+// 每日国际汇率 JavaScript 功能
+
+// API配置
+const API = {
+ endpoints: [],
+ currentIndex: 0,
+ defaultCurrency: 'CNY',
+ localFallback: '返回接口.json',
+ // 初始化API接口列表
+ async init() {
+ try {
+ const res = await fetch('./接口集合.json');
+ const endpoints = await res.json();
+ this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/exchange_rate`);
+ } catch (e) {
+ // 如果无法加载接口集合,使用默认接口
+ this.endpoints = ['https://60s.api.shumengya.top/v2/exchange_rate'];
+ }
+ },
+ // 获取当前接口URL
+ getCurrentUrl(currency) {
+ if (this.endpoints.length === 0) return null;
+ const url = new URL(this.endpoints[this.currentIndex]);
+ url.searchParams.append('currency', currency);
+ return url.toString();
+ },
+ // 切换到下一个接口
+ switchToNext() {
+ this.currentIndex = (this.currentIndex + 1) % this.endpoints.length;
+ return this.currentIndex < this.endpoints.length;
+ },
+ // 重置到第一个接口
+ reset() {
+ this.currentIndex = 0;
+ }
+};
+
+// 常用货币列表
+const POPULAR_CURRENCIES = [
+ { code: 'CNY', name: '人民币', flag: '🇨🇳' },
+ { code: 'USD', name: '美元', flag: '🇺🇸' },
+ { code: 'EUR', name: '欧元', flag: '🇪🇺' },
+ { code: 'JPY', name: '日元', flag: '🇯🇵' },
+ { code: 'GBP', name: '英镑', flag: '🇬🇧' },
+ { code: 'AUD', name: '澳元', flag: '🇦🇺' },
+ { code: 'CAD', name: '加元', flag: '🇨🇦' },
+ { code: 'CHF', name: '瑞士法郎', flag: '🇨🇭' },
+ { code: 'HKD', name: '港币', flag: '🇭🇰' },
+ { code: 'SGD', name: '新加坡元', flag: '🇸🇬' },
+ { code: 'KRW', name: '韩元', flag: '🇰🇷' },
+ { code: 'THB', name: '泰铢', flag: '🇹🇭' }
+];
+
+// 货币优先级排序 - 经济发达、交易频繁的国家货币优先
+const CURRENCY_PRIORITY = {
+ // 第一梯队:全球主要储备货币和交易货币
+ 'USD': 1, // 美元 - 全球储备货币
+ 'EUR': 2, // 欧元 - 欧盟统一货币
+ 'JPY': 3, // 日元 - 亚洲主要货币
+ 'GBP': 4, // 英镑 - 传统储备货币
+ 'CNY': 5, // 人民币 - 中国货币
+
+ // 第二梯队:发达国家货币
+ 'CHF': 10, // 瑞士法郎 - 避险货币
+ 'CAD': 11, // 加拿大元
+ 'AUD': 12, // 澳大利亚元
+ 'NZD': 13, // 新西兰元
+ 'SEK': 14, // 瑞典克朗
+ 'NOK': 15, // 挪威克朗
+ 'DKK': 16, // 丹麦克朗
+
+ // 第三梯队:亚洲发达经济体
+ 'HKD': 20, // 港币
+ 'SGD': 21, // 新加坡元
+ 'KRW': 22, // 韩元
+ 'TWD': 23, // 新台币
+
+ // 第四梯队:重要新兴市场货币
+ 'RUB': 30, // 俄罗斯卢布
+ 'INR': 31, // 印度卢比
+ 'BRL': 32, // 巴西雷亚尔
+ 'MXN': 33, // 墨西哥比索
+ 'ZAR': 34, // 南非兰特
+ 'TRY': 35, // 土耳其里拉
+
+ // 第五梯队:亚洲重要货币
+ 'THB': 40, // 泰铢
+ 'MYR': 41, // 马来西亚林吉特
+ 'IDR': 42, // 印尼盾
+ 'PHP': 43, // 菲律宾比索
+ 'VND': 44, // 越南盾
+
+ // 第六梯队:中东石油国家货币
+ 'SAR': 50, // 沙特里亚尔
+ 'AED': 51, // 阿联酋迪拉姆
+ 'QAR': 52, // 卡塔尔里亚尔
+ 'KWD': 53, // 科威特第纳尔
+
+ // 第七梯队:欧洲其他货币
+ 'PLN': 60, // 波兰兹罗提
+ 'CZK': 61, // 捷克克朗
+ 'HUF': 62, // 匈牙利福林
+ 'RON': 63, // 罗马尼亚列伊
+ 'BGN': 64, // 保加利亚列弗
+ 'HRK': 65, // 克罗地亚库纳
+
+ // 第八梯队:拉美货币
+ 'ARS': 70, // 阿根廷比索
+ 'CLP': 71, // 智利比索
+ 'COP': 72, // 哥伦比亚比索
+ 'PEN': 73, // 秘鲁索尔
+ 'UYU': 74, // 乌拉圭比索
+
+ // 其他货币默认优先级为 999
+};
+
+// 货币名称映射
+const CURRENCY_NAMES = {
+ 'CNY': '人民币', 'USD': '美元', 'EUR': '欧元', 'JPY': '日元', 'GBP': '英镑',
+ 'AUD': '澳元', 'CAD': '加元', 'CHF': '瑞士法郎', 'HKD': '港币', 'SGD': '新加坡元',
+ 'KRW': '韩元', 'THB': '泰铢', 'AED': '阿联酋迪拉姆', 'AFN': '阿富汗尼',
+ 'ALL': '阿尔巴尼亚列克', 'AMD': '亚美尼亚德拉姆', 'ANG': '荷属安的列斯盾',
+ 'AOA': '安哥拉宽扎', 'ARS': '阿根廷比索', 'AWG': '阿鲁巴弗罗林',
+ 'AZN': '阿塞拜疆马纳特', 'BAM': '波黑马克', 'BBD': '巴巴多斯元',
+ 'BDT': '孟加拉塔卡', 'BGN': '保加利亚列弗', 'BHD': '巴林第纳尔',
+ 'BIF': '布隆迪法郎', 'BMD': '百慕大元', 'BND': '文莱元', 'BOB': '玻利维亚诺',
+ 'BRL': '巴西雷亚尔', 'BSD': '巴哈马元', 'BTN': '不丹努尔特鲁姆',
+ 'BWP': '博茨瓦纳普拉', 'BYN': '白俄罗斯卢布', 'BZD': '伯利兹元',
+ 'CDF': '刚果法郎', 'CLP': '智利比索', 'COP': '哥伦比亚比索', 'CRC': '哥斯达黎加科朗',
+ 'CUP': '古巴比索', 'CVE': '佛得角埃斯库多', 'CZK': '捷克克朗', 'DJF': '吉布提法郎',
+ 'DKK': '丹麦克朗', 'DOP': '多米尼加比索', 'DZD': '阿尔及利亚第纳尔', 'EGP': '埃及镑',
+ 'ERN': '厄立特里亚纳克法', 'ETB': '埃塞俄比亚比尔', 'FJD': '斐济元', 'FKP': '福克兰群岛镑',
+ 'FOK': '法罗群岛克朗', 'GEL': '格鲁吉亚拉里', 'GGP': '根西岛镑', 'GHS': '加纳塞地',
+ 'GIP': '直布罗陀镑', 'GMD': '冈比亚达拉西', 'GNF': '几内亚法郎', 'GTQ': '危地马拉格查尔',
+ 'GYD': '圭亚那元', 'HNL': '洪都拉斯伦皮拉', 'HRK': '克罗地亚库纳', 'HTG': '海地古德',
+ 'HUF': '匈牙利福林', 'IDR': '印尼盾', 'ILS': '以色列新谢克尔', 'IMP': '马恩岛镑',
+ 'INR': '印度卢比', 'IQD': '伊拉克第纳尔', 'IRR': '伊朗里亚尔', 'ISK': '冰岛克朗',
+ 'JEP': '泽西岛镑', 'JMD': '牙买加元', 'JOD': '约旦第纳尔', 'KES': '肯尼亚先令',
+ 'KGS': '吉尔吉斯斯坦索姆', 'KHR': '柬埔寨瑞尔', 'KID': '基里巴斯元', 'KMF': '科摩罗法郎',
+ 'KWD': '科威特第纳尔', 'KYD': '开曼群岛元', 'KZT': '哈萨克斯坦坚戈', 'LAK': '老挝基普',
+ 'LBP': '黎巴嫩镑', 'LKR': '斯里兰卡卢比', 'LRD': '利比里亚元', 'LSL': '莱索托洛蒂',
+ 'LYD': '利比亚第纳尔', 'MAD': '摩洛哥迪拉姆', 'MDL': '摩尔多瓦列伊', 'MGA': '马达加斯加阿里亚里',
+ 'MKD': '北马其顿第纳尔', 'MMK': '缅甸缅元', 'MNT': '蒙古图格里克', 'MOP': '澳门帕塔卡',
+ 'MRU': '毛里塔尼亚乌吉亚', 'MUR': '毛里求斯卢比', 'MVR': '马尔代夫拉菲亚', 'MWK': '马拉维克瓦查',
+ 'MXN': '墨西哥比索', 'MYR': '马来西亚林吉特', 'MZN': '莫桑比克梅蒂卡尔', 'NAD': '纳米比亚元',
+ 'NGN': '尼日利亚奈拉', 'NIO': '尼加拉瓜科多巴', 'NOK': '挪威克朗', 'NPR': '尼泊尔卢比',
+ 'NZD': '新西兰元', 'OMR': '阿曼里亚尔', 'PAB': '巴拿马巴波亚', 'PEN': '秘鲁索尔',
+ 'PGK': '巴布亚新几内亚基那', 'PHP': '菲律宾比索', 'PKR': '巴基斯坦卢比', 'PLN': '波兰兹罗提',
+ 'PYG': '巴拉圭瓜拉尼', 'QAR': '卡塔尔里亚尔', 'RON': '罗马尼亚列伊', 'RSD': '塞尔维亚第纳尔',
+ 'RUB': '俄罗斯卢布', 'RWF': '卢旺达法郎', 'SAR': '沙特里亚尔', 'SBD': '所罗门群岛元',
+ 'SCR': '塞舌尔卢比', 'SDG': '苏丹镑', 'SEK': '瑞典克朗', 'SHP': '圣赫勒拿镑',
+ 'SLE': '塞拉利昂利昂', 'SLL': '塞拉利昂利昂(旧)', 'SOS': '索马里先令', 'SRD': '苏里南元',
+ 'SSP': '南苏丹镑', 'STN': '圣多美和普林西比多布拉', 'SYP': '叙利亚镑', 'SZL': '斯威士兰里兰吉尼',
+ 'TJS': '塔吉克斯坦索莫尼', 'TMT': '土库曼斯坦马纳特', 'TND': '突尼斯第纳尔', 'TOP': '汤加潘加',
+ 'TRY': '土耳其里拉', 'TTD': '特立尼达和多巴哥元', 'TVD': '图瓦卢元', 'TWD': '新台币',
+ 'TZS': '坦桑尼亚先令', 'UAH': '乌克兰格里夫纳', 'UGX': '乌干达先令', 'UYU': '乌拉圭比索',
+ 'UZS': '乌兹别克斯坦苏姆', 'VES': '委内瑞拉玻利瓦尔', 'VND': '越南盾', 'VUV': '瓦努阿图瓦图',
+ 'WST': '萨摩亚塔拉', 'XAF': '中非法郎', 'XCD': '东加勒比元', 'XCG': '加勒比盾',
+ 'XDR': '特别提款权', 'XOF': '西非法郎', 'XPF': '太平洋法郎', 'YER': '也门里亚尔',
+ 'ZAR': '南非兰特', 'ZMW': '赞比亚克瓦查', 'ZWL': '津巴布韦元'
+};
+
+// 货币旗帜映射
+const CURRENCY_FLAGS = {
+ 'CNY': '🇨🇳', 'USD': '🇺🇸', 'EUR': '🇪🇺', 'JPY': '🇯🇵', 'GBP': '🇬🇧',
+ 'AUD': '🇦🇺', 'CAD': '🇨🇦', 'CHF': '🇨🇭', 'HKD': '🇭🇰', 'SGD': '🇸🇬',
+ 'KRW': '🇰🇷', 'THB': '🇹🇭', 'AED': '🇦🇪', 'AFN': '🇦🇫', 'ALL': '🇦🇱',
+ 'AMD': '🇦🇲', 'ANG': '🇳🇱', 'AOA': '🇦🇴', 'ARS': '🇦🇷', 'AWG': '🇦🇼',
+ 'AZN': '🇦🇿', 'BAM': '🇧🇦', 'BBD': '🇧🇧', 'BDT': '🇧🇩', 'BGN': '🇧🇬',
+ 'BHD': '🇧🇭', 'BIF': '🇧🇮', 'BMD': '🇧🇲', 'BND': '🇧🇳', 'BOB': '🇧🇴',
+ 'BRL': '🇧🇷', 'BSD': '🇧🇸', 'BTN': '🇧🇹', 'BWP': '🇧🇼', 'BYN': '🇧🇾',
+ 'BZD': '🇧🇿', 'CDF': '🇨🇩', 'CLP': '🇨🇱', 'COP': '🇨🇴', 'CRC': '🇨🇷',
+ 'CUP': '🇨🇺', 'CVE': '🇨🇻', 'CZK': '🇨🇿', 'DJF': '🇩🇯', 'DKK': '🇩🇰',
+ 'DOP': '🇩🇴', 'DZD': '🇩🇿', 'EGP': '🇪🇬', 'ERN': '🇪🇷', 'ETB': '🇪🇹',
+ 'FJD': '🇫🇯', 'FKP': '🇫🇰', 'FOK': '🇫🇴', 'GEL': '🇬🇪', 'GGP': '🇬🇬',
+ 'GHS': '🇬🇭', 'GIP': '🇬🇮', 'GMD': '🇬🇲', 'GNF': '🇬🇳', 'GTQ': '🇬🇹',
+ 'GYD': '🇬🇾', 'HNL': '🇭🇳', 'HRK': '🇭🇷', 'HTG': '🇭🇹', 'HUF': '🇭🇺',
+ 'IDR': '🇮🇩', 'ILS': '🇮🇱', 'IMP': '🇮🇲', 'INR': '🇮🇳', 'IQD': '🇮🇶',
+ 'IRR': '🇮🇷', 'ISK': '🇮🇸', 'JEP': '🇯🇪', 'JMD': '🇯🇲', 'JOD': '🇯🇴',
+ 'KES': '🇰🇪', 'KGS': '🇰🇬', 'KHR': '🇰🇭', 'KID': '🇰🇮', 'KMF': '🇰🇲',
+ 'KWD': '🇰🇼', 'KYD': '🇰🇾', 'KZT': '🇰🇿', 'LAK': '🇱🇦', 'LBP': '🇱🇧',
+ 'LKR': '🇱🇰', 'LRD': '🇱🇷', 'LSL': '🇱🇸', 'LYD': '🇱🇾', 'MAD': '🇲🇦',
+ 'MDL': '🇲🇩', 'MGA': '🇲🇬', 'MKD': '🇲🇰', 'MMK': '🇲🇲', 'MNT': '🇲🇳',
+ 'MOP': '🇲🇴', 'MRU': '🇲🇷', 'MUR': '🇲🇺', 'MVR': '🇲🇻', 'MWK': '🇲🇼',
+ 'MXN': '🇲🇽', 'MYR': '🇲🇾', 'MZN': '🇲🇿', 'NAD': '🇳🇦', 'NGN': '🇳🇬',
+ 'NIO': '🇳🇮', 'NOK': '🇳🇴', 'NPR': '🇳🇵', 'NZD': '🇳🇿', 'OMR': '🇴🇲',
+ 'PAB': '🇵🇦', 'PEN': '🇵🇪', 'PGK': '🇵🇬', 'PHP': '🇵🇭', 'PKR': '🇵🇰',
+ 'PLN': '🇵🇱', 'PYG': '🇵🇾', 'QAR': '🇶🇦', 'RON': '🇷🇴', 'RSD': '🇷🇸',
+ 'RUB': '🇷🇺', 'RWF': '🇷🇼', 'SAR': '🇸🇦', 'SBD': '🇸🇧', 'SCR': '🇸🇨',
+ 'SDG': '🇸🇩', 'SEK': '🇸🇪', 'SHP': '🇸🇭', 'SLE': '🇸🇱', 'SLL': '🇸🇱',
+ 'SOS': '🇸🇴', 'SRD': '🇸🇷', 'SSP': '🇸🇸', 'STN': '🇸🇹', 'SYP': '🇸🇾',
+ 'SZL': '🇸🇿', 'TJS': '🇹🇯', 'TMT': '🇹🇲', 'TND': '🇹🇳', 'TOP': '🇹🇴',
+ 'TRY': '🇹🇷', 'TTD': '🇹🇹', 'TVD': '🇹🇻', 'TWD': '🇹🇼', 'TZS': '🇹🇿',
+ 'UAH': '🇺🇦', 'UGX': '🇺🇬', 'UYU': '🇺🇾', 'UZS': '🇺🇿', 'VES': '🇻🇪',
+ 'VND': '🇻🇳', 'VUV': '🇻🇺', 'WST': '🇼🇸', 'XAF': '🌍', 'XCD': '🏝️',
+ 'XCG': '🏝️', 'XDR': '🌐', 'XOF': '🌍', 'XPF': '🌊', 'YER': '🇾🇪',
+ 'ZAR': '🇿🇦', 'ZMW': '🇿🇲', 'ZWL': '🇿🇼'
+};
+
+// DOM元素
+let elements = {};
+let currentRates = [];
+let filteredRates = [];
+
+// 初始化
+document.addEventListener('DOMContentLoaded', function() {
+ initElements();
+ initCurrencySelector();
+ bindEvents();
+ loadExchangeRates();
+});
+
+// 初始化DOM元素
+function initElements() {
+ elements = {
+ currencySelect: document.getElementById('currency-select'),
+ searchInput: document.getElementById('search-input'),
+ loading: document.getElementById('loading'),
+ content: document.getElementById('exchange-content'),
+ baseCurrency: document.getElementById('base-currency'),
+ updateTime: document.getElementById('update-time'),
+ ratesGrid: document.getElementById('rates-grid'),
+ totalCurrencies: document.getElementById('total-currencies'),
+ lastUpdate: document.getElementById('last-update')
+ };
+}
+
+// 初始化货币选择器
+function initCurrencySelector() {
+ if (!elements.currencySelect) return;
+
+ // 添加常用货币选项
+ POPULAR_CURRENCIES.forEach(currency => {
+ const option = document.createElement('option');
+ option.value = currency.code;
+ option.textContent = `${currency.flag} ${currency.code} - ${currency.name}`;
+ if (currency.code === API.defaultCurrency) {
+ option.selected = true;
+ }
+ elements.currencySelect.appendChild(option);
+ });
+}
+
+// 绑定事件
+function bindEvents() {
+ // 货币选择变化
+ if (elements.currencySelect) {
+ elements.currencySelect.addEventListener('change', function() {
+ loadExchangeRates(this.value);
+ });
+ }
+
+ // 搜索功能
+ if (elements.searchInput) {
+ elements.searchInput.addEventListener('input', function() {
+ filterRates(this.value);
+ });
+ }
+}
+
+// 加载汇率数据
+async function loadExchangeRates(currency = API.defaultCurrency) {
+ try {
+ showLoading(true);
+
+ // 尝试从API获取数据
+ const data = await fetchFromAPI(currency);
+
+ if (data && data.code === 200 && data.data) {
+ currentRates = data.data.rates || [];
+ displayExchangeRates(data.data);
+ } else {
+ // 尝试从本地获取数据
+ const localData = await fetchFromLocal();
+ if (localData && localData.code === 200 && localData.data) {
+ currentRates = localData.data.rates || [];
+ displayExchangeRates(localData.data);
+ showError('使用本地数据,可能不是最新汇率');
+ } else {
+ throw new Error('无法获取汇率数据');
+ }
+ }
+
+ } catch (error) {
+ console.error('加载汇率失败:', error);
+ showError('加载汇率数据失败,请稍后重试');
+ } finally {
+ showLoading(false);
+ }
+}
+
+// 从API获取数据
+async function fetchFromAPI(currency) {
+ // 初始化API接口列表
+ await API.init();
+
+ // 重置API索引到第一个接口
+ API.reset();
+
+ // 尝试所有API接口
+ for (let i = 0; i < API.endpoints.length; i++) {
+ try {
+ const url = API.getCurrentUrl(currency);
+ console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`);
+
+ const response = await fetch(url, {
+ cache: 'no-store'
+ });
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+ }
+
+ const data = await response.json();
+
+ if (data && data.code === 200) {
+ console.log(`接口 ${i + 1} 请求成功`);
+ return data;
+ }
+
+ throw new Error(data && data.message ? data.message : '接口返回异常');
+
+ } catch (e) {
+ console.warn(`接口 ${i + 1} 失败:`, e.message);
+
+ // 如果不是最后一个接口,切换到下一个
+ if (i < API.endpoints.length - 1) {
+ API.switchToNext();
+ continue;
+ }
+
+ // 所有接口都失败了
+ console.warn('所有远程接口都失败,尝试本地数据');
+ return null;
+ }
+ }
+}
+
+// 从本地获取数据
+async function fetchFromLocal() {
+ try {
+ const response = await fetch(API.localFallback + `?t=${Date.now()}`);
+ if (!response.ok) throw new Error(`本地文件HTTP ${response.status}`);
+ const data = await response.json();
+ return data;
+ } catch (e) {
+ console.error('读取本地返回接口.json失败:', e);
+ return null;
+ }
+}
+
+// 显示汇率数据
+function displayExchangeRates(data) {
+ if (!data || !data.rates) {
+ showError('没有获取到汇率数据');
+ return;
+ }
+
+ // 更新基础货币信息
+ if (elements.baseCurrency) {
+ const baseCurrencyName = CURRENCY_NAMES[data.base_code] || data.base_code;
+ const baseCurrencyFlag = CURRENCY_FLAGS[data.base_code] || '💱';
+ elements.baseCurrency.textContent = `${baseCurrencyFlag} ${data.base_code} - ${baseCurrencyName}`;
+ }
+
+ // 更新时间信息
+ if (elements.updateTime && data.updated) {
+ elements.updateTime.textContent = `更新时间: ${data.updated}`;
+ }
+
+ // 更新统计信息
+ updateStats(data);
+
+ // 显示汇率列表
+ filteredRates = data.rates;
+ renderRates(filteredRates);
+
+ // 显示内容区域
+ if (elements.content) {
+ elements.content.classList.add('fade-in');
+ elements.content.style.display = 'block';
+ }
+}
+
+// 更新统计信息
+function updateStats(data) {
+ if (elements.totalCurrencies) {
+ elements.totalCurrencies.textContent = data.rates ? data.rates.length : 0;
+ }
+
+ if (elements.lastUpdate && data.updated) {
+ elements.lastUpdate.textContent = data.updated;
+ }
+}
+
+// 渲染汇率列表
+function renderRates(rates) {
+ if (!elements.ratesGrid || !rates) return;
+
+ // 按优先级排序货币
+ const sortedRates = [...rates].sort((a, b) => {
+ const priorityA = CURRENCY_PRIORITY[a.currency] || 999;
+ const priorityB = CURRENCY_PRIORITY[b.currency] || 999;
+
+ // 优先级相同时按货币代码字母顺序排序
+ if (priorityA === priorityB) {
+ return a.currency.localeCompare(b.currency);
+ }
+
+ return priorityA - priorityB;
+ });
+
+ elements.ratesGrid.innerHTML = '';
+
+ sortedRates.forEach(rate => {
+ const rateCard = createRateCard(rate);
+ elements.ratesGrid.appendChild(rateCard);
+ });
+}
+
+// 创建汇率卡片
+function createRateCard(rate) {
+ const card = document.createElement('div');
+ card.className = 'rate-card';
+
+ const currencyName = CURRENCY_NAMES[rate.currency] || rate.currency;
+ const currencyFlag = CURRENCY_FLAGS[rate.currency] || '💱';
+
+ card.innerHTML = `
+
+ ${currencyFlag}
+ ${rate.currency}
+
+ ${formatRate(rate.rate)}
+ ${currencyName}
+ `;
+
+ return card;
+}
+
+// 格式化汇率
+function formatRate(rate) {
+ if (rate >= 1) {
+ return rate.toFixed(4);
+ } else if (rate >= 0.01) {
+ return rate.toFixed(6);
+ } else {
+ return rate.toFixed(8);
+ }
+}
+
+// 过滤汇率数据
+function filterRates(searchTerm) {
+ if (!searchTerm.trim()) {
+ renderRates(currentRates);
+ return;
+ }
+
+ const filtered = currentRates.filter(rate => {
+ const currencyName = CURRENCY_NAMES[rate.currency] || rate.currency;
+ return rate.currency.toLowerCase().includes(searchTerm.toLowerCase()) ||
+ currencyName.toLowerCase().includes(searchTerm.toLowerCase());
+ });
+
+ renderRates(filtered);
+}
+
+// 显示/隐藏加载状态
+function showLoading(show) {
+ if (elements.loading) {
+ elements.loading.style.display = show ? 'block' : 'none';
+ }
+ if (elements.content) {
+ elements.content.style.display = show ? 'none' : 'block';
+ }
+}
+
+// 显示错误信息
+function showError(message) {
+ if (elements.content) {
+ elements.content.innerHTML = `
+
+
⚠️ 加载失败
+
${escapeHtml(message)}
+
请检查网络连接或稍后重试
+
+ `;
+ elements.content.style.display = 'block';
+ }
+}
+
+// HTML转义
+function escapeHtml(text) {
+ if (!text) return '';
+ const div = document.createElement('div');
+ div.textContent = text;
+ return div.innerHTML;
+}
+
+// 错误处理
+window.addEventListener('error', function(event) {
+ console.error('页面错误:', event.error);
+});
+
+// 网络状态监听
+window.addEventListener('online', function() {
+ console.log('网络已连接');
+});
+
+window.addEventListener('offline', function() {
+ console.log('网络已断开');
+ showError('网络连接已断开,请检查网络设置');
+});
+
+// 导出函数供外部调用
+window.ExchangeRate = {
+ loadExchangeRates,
+ showError,
+ showLoading
};
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/接口集合.json b/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/接口集合.json
index 547b2771..42245813 100755
--- a/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/接口集合.json
+++ b/InfoGenie-frontend/public/60sapi/日更资讯/每日国际汇率/接口集合.json
@@ -1,3 +1,3 @@
-[
- "https://60s.api.shumengya.top"
-]
+[
+ "https://60s.api.shumengya.top"
+]
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/css/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/css/background.css
index a6678b42..8ccdf2c6 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/css/background.css
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/css/background.css
@@ -1,65 +1,65 @@
-/* 彩虹背景相关样式 */
-body {
- background: linear-gradient(
- 135deg,
- #e8f5e8 0%,
- #f1f8e9 25%,
- #dcedc8 50%,
- #c8e6c8 75%,
- #e8f5e8 100%
- );
- background-size: 200% 200%;
- animation: gentleGradient 20s ease infinite;
- background-attachment: fixed;
- min-height: 100vh;
- position: relative;
-}
-
-@keyframes gentleGradient {
- 0% {
- background-position: 0% 50%;
- }
- 50% {
- background-position: 100% 50%;
- }
- 100% {
- background-position: 0% 50%;
- }
-}
-
-/* 淡雅绿色装饰层 */
-body::before {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background:
- radial-gradient(circle at 20% 20%, rgba(129, 199, 132, 0.08) 0%, transparent 50%),
- radial-gradient(circle at 80% 80%, rgba(165, 214, 167, 0.06) 0%, transparent 50%),
- radial-gradient(circle at 40% 80%, rgba(200, 230, 201, 0.05) 0%, transparent 40%),
- radial-gradient(circle at 60% 20%, rgba(220, 237, 200, 0.04) 0%, transparent 40%);
- pointer-events: none;
- z-index: -1;
-}
-
-/* 淡雅绿色点缀 */
-body::after {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- radial-gradient(circle at 15% 15%, rgba(129, 199, 132, 0.3) 1px, transparent 1px),
- radial-gradient(circle at 45% 25%, rgba(165, 214, 167, 0.25) 1px, transparent 1px),
- radial-gradient(circle at 75% 35%, rgba(200, 230, 201, 0.2) 1px, transparent 1px),
- radial-gradient(circle at 25% 65%, rgba(220, 237, 200, 0.15) 1px, transparent 1px),
- radial-gradient(circle at 85% 75%, rgba(129, 199, 132, 0.2) 1px, transparent 1px);
- background-size: 300px 300px, 400px 400px, 350px 350px, 450px 450px, 380px 380px;
- pointer-events: none;
- z-index: -1;
- opacity: 0.4;
-}
+/* 彩虹背景相关样式 */
+body {
+ background: linear-gradient(
+ 135deg,
+ #e8f5e8 0%,
+ #f1f8e9 25%,
+ #dcedc8 50%,
+ #c8e6c8 75%,
+ #e8f5e8 100%
+ );
+ background-size: 200% 200%;
+ animation: gentleGradient 20s ease infinite;
+ background-attachment: fixed;
+ min-height: 100vh;
+ position: relative;
+}
+
+@keyframes gentleGradient {
+ 0% {
+ background-position: 0% 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+ 100% {
+ background-position: 0% 50%;
+ }
+}
+
+/* 淡雅绿色装饰层 */
+body::before {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background:
+ radial-gradient(circle at 20% 20%, rgba(129, 199, 132, 0.08) 0%, transparent 50%),
+ radial-gradient(circle at 80% 80%, rgba(165, 214, 167, 0.06) 0%, transparent 50%),
+ radial-gradient(circle at 40% 80%, rgba(200, 230, 201, 0.05) 0%, transparent 40%),
+ radial-gradient(circle at 60% 20%, rgba(220, 237, 200, 0.04) 0%, transparent 40%);
+ pointer-events: none;
+ z-index: -1;
+}
+
+/* 淡雅绿色点缀 */
+body::after {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(circle at 15% 15%, rgba(129, 199, 132, 0.3) 1px, transparent 1px),
+ radial-gradient(circle at 45% 25%, rgba(165, 214, 167, 0.25) 1px, transparent 1px),
+ radial-gradient(circle at 75% 35%, rgba(200, 230, 201, 0.2) 1px, transparent 1px),
+ radial-gradient(circle at 25% 65%, rgba(220, 237, 200, 0.15) 1px, transparent 1px),
+ radial-gradient(circle at 85% 75%, rgba(129, 199, 132, 0.2) 1px, transparent 1px);
+ background-size: 300px 300px, 400px 400px, 350px 350px, 450px 450px, 380px 380px;
+ pointer-events: none;
+ z-index: -1;
+ opacity: 0.4;
+}
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/css/style.css b/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/css/style.css
index ebb660af..5c19dc4d 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/css/style.css
@@ -1,860 +1,860 @@
-/* 背景样式 */
-.background-container {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- z-index: -1;
- overflow: hidden;
- background-color: #f8f9fa;
-}
-
-.modern-gradient {
- position: absolute;
- top: -50%;
- left: -50%;
- width: 200%;
- height: 200%;
- background: linear-gradient(
- 135deg,
- rgba(129, 199, 132, 0.4) 0%,
- rgba(165, 214, 167, 0.3) 25%,
- rgba(200, 230, 201, 0.2) 50%,
- rgba(220, 237, 200, 0.3) 75%,
- rgba(232, 245, 233, 0.4) 100%
- );
- animation: gradient-flow 20s ease-in-out infinite;
- border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
-}
-
-.modern-gradient::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: radial-gradient(
- circle at 30% 70%,
- rgba(129, 199, 132, 0.5) 0%,
- transparent 50%
- ), radial-gradient(
- circle at 70% 30%,
- rgba(165, 214, 167, 0.4) 0%,
- transparent 50%
- );
- animation: pulse-effect 15s ease-in-out infinite alternate;
- border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
-}
-
-@keyframes gradient-flow {
- 0%, 100% {
- transform: rotate(0deg) scale(1);
- opacity: 0.8;
- }
- 25% {
- transform: rotate(90deg) scale(1.1);
- opacity: 0.6;
- }
- 50% {
- transform: rotate(180deg) scale(0.9);
- opacity: 0.9;
- }
- 75% {
- transform: rotate(270deg) scale(1.05);
- opacity: 0.7;
- }
-}
-
-@keyframes pulse-effect {
- 0% {
- transform: scale(1) rotate(0deg);
- opacity: 0.5;
- }
- 50% {
- transform: scale(1.2) rotate(180deg);
- opacity: 0.8;
- }
- 100% {
- transform: scale(1) rotate(360deg);
- opacity: 0.6;
- }
-}
-
-/* 主样式 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
- color: #333;
- background-color: #f8f9fa;
- position: relative;
- min-height: 100vh;
-}
-
-.container {
- max-width: 800px;
- margin: 0 auto;
- padding: 24px;
- position: relative;
- z-index: 1;
- background-color: rgba(255, 255, 255, 0.85);
- border-radius: 16px;
- box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08);
- backdrop-filter: blur(10px);
-}
-
-header, .header {
- text-align: center;
- margin-bottom: 28px;
- padding-bottom: 20px;
- border-bottom: 1px solid rgba(0, 0, 0, 0.06);
-}
-
-.header-icon {
- font-size: 3rem;
- margin-bottom: 10px;
- display: block;
-}
-
-header h1, .title {
- background: linear-gradient(135deg, #66bb6a, #81c784);
- -webkit-background-clip: text;
- background-clip: text;
- color: transparent;
- margin-bottom: 14px;
- font-size: 2.4rem;
- font-weight: 700;
- letter-spacing: -0.5px;
-}
-
-.subtitle {
- color: #666;
- font-size: 1.1rem;
- margin-bottom: 20px;
- font-weight: 400;
-}
-
-.tab-container {
- display: flex;
- justify-content: center;
- gap: 12px;
- margin-bottom: 20px;
- flex-wrap: wrap;
-}
-
-.tab-btn {
- background: linear-gradient(135deg, #f0f0f0, #e8e8e8);
- border: none;
- padding: 12px 20px;
- border-radius: 25px;
- cursor: pointer;
- font-size: 0.95rem;
- font-weight: 500;
- color: #666;
- transition: all 0.3s ease;
- display: flex;
- align-items: center;
- gap: 6px;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-}
-
-.tab-btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
-}
-
-.tab-btn.active {
- background: linear-gradient(135deg, #66bb6a, #81c784);
- color: white;
- box-shadow: 0 4px 16px rgba(102, 187, 106, 0.3);
-}
-
-.tab-icon {
- font-size: 1.1rem;
-}
-
-.refresh-btn {
- background: linear-gradient(135deg, #81c784, #a5d6a7);
- border: none;
- padding: 12px 24px;
- border-radius: 25px;
- color: white;
- cursor: pointer;
- font-size: 0.95rem;
- font-weight: 500;
- margin-top: 15px;
- transition: all 0.3s ease;
- display: inline-flex;
- align-items: center;
- gap: 8px;
- box-shadow: 0 4px 12px rgba(129, 199, 132, 0.3);
-}
-
-.refresh-btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 6px 16px rgba(129, 199, 132, 0.4);
-}
-
-.btn-icon {
- font-size: 1.1rem;
-}
-
-.time-icon {
- margin-right: 6px;
-}
-
-.update-time {
- color: #666;
- font-size: 0.9rem;
- background-color: rgba(0, 0, 0, 0.03);
- padding: 8px 16px;
- border-radius: 24px;
- display: inline-block;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
-}
-
-.hot-list {
- list-style: none;
-}
-
-.hot-item {
- padding: 20px;
- margin-bottom: 16px;
- border-radius: 12px;
- background-color: white;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04);
- transition: all 0.3s ease;
- display: flex;
- align-items: center;
- border: 1px solid rgba(0, 0, 0, 0.03);
-}
-
-.hot-item:hover {
- transform: translateY(-3px);
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
- border-color: rgba(129, 199, 132, 0.3);
-}
-
-.hot-rank {
- font-size: 1.2rem;
- font-weight: bold;
- color: #66bb6a;
- margin-right: 18px;
- min-width: 38px;
- text-align: center;
- background-color: rgba(129, 199, 132, 0.1);
- border-radius: 50%;
- width: 38px;
- height: 38px;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.hot-rank.top-1 {
- background: linear-gradient(135deg, #66bb6a, #81c784);
- color: white;
-}
-
-.hot-rank.top-2 {
- background: linear-gradient(135deg, #81c784, #a5d6a7);
- color: white;
-}
-
-.hot-rank.top-3 {
- background: linear-gradient(135deg, #a5d6a7, #c8e6c9);
- color: #333;
-}
-
-.hot-content {
- flex: 1;
-}
-
-.hot-title {
- font-size: 1.15rem;
- margin-bottom: 8px;
- color: #333;
- text-decoration: none;
- display: block;
- line-height: 1.5;
- font-weight: 500;
- transition: color 0.2s ease;
-}
-
-.hot-title:hover {
- color: #66bb6a;
- text-decoration: none;
-}
-
-.loading {
- text-align: center;
- padding: 40px;
- color: #666;
- font-size: 1.1rem;
- display: none;
-}
-
-.loading-content {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 20px;
-}
-
-.rainbow-spinner {
- width: 50px;
- height: 50px;
- border: 4px solid rgba(129, 199, 132, 0.2);
- border-top: 4px solid #81c784;
- border-radius: 50%;
- animation: spin 1s linear infinite;
-}
-
-@keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-.loading-text {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 10px;
-}
-
-.loading-emoji {
- font-size: 2rem;
- animation: bounce 1.5s ease-in-out infinite;
-}
-
-@keyframes bounce {
- 0%, 20%, 50%, 80%, 100% {
- transform: translateY(0);
- }
- 40% {
- transform: translateY(-10px);
- }
- 60% {
- transform: translateY(-5px);
- }
-}
-
-.loading-dots {
- display: flex;
- gap: 4px;
-}
-
-.loading-dots span {
- width: 8px;
- height: 8px;
- background: #81c784;
- border-radius: 50%;
- animation: loadingDots 1.4s ease-in-out infinite both;
-}
-
-.loading-dots span:nth-child(1) { animation-delay: -0.32s; }
-.loading-dots span:nth-child(2) { animation-delay: -0.16s; }
-.loading-dots span:nth-child(3) { animation-delay: 0s; }
-
-@keyframes loadingDots {
- 0%, 80%, 100% {
- transform: scale(0);
- }
- 40% {
- transform: scale(1);
- }
-}
-
-.news-list {
- margin-top: 20px;
-}
-
-/* 新闻项目卡片 - 移动端优先设计 */
-.news-item {
- background: white;
- border-radius: 16px;
- padding: 16px;
- margin-bottom: 12px;
- box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
- transition: all 0.3s ease;
- border: 1px solid rgba(0, 0, 0, 0.05);
- display: flex;
- gap: 12px;
- position: relative;
- overflow: hidden;
-}
-
-.news-item:hover {
- transform: translateY(-2px);
- box-shadow: 0 6px 20px rgba(0, 0, 0, 0.1);
- border-color: rgba(129, 199, 132, 0.3);
-}
-
-/* 排名容器 */
-.news-rank-container {
- flex-shrink: 0;
- display: flex;
- align-items: flex-start;
- padding-top: 2px;
-}
-
-.news-rank {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- width: 48px;
- height: 48px;
- border-radius: 12px;
- background: linear-gradient(135deg, #f0f0f0, #e8e8e8);
- color: #666;
- font-weight: 600;
- position: relative;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-}
-
-.news-rank.rank-1 {
- background: linear-gradient(135deg, #66bb6a, #81c784);
- color: white;
- box-shadow: 0 4px 12px rgba(102, 187, 106, 0.3);
-}
-
-.news-rank.rank-2 {
- background: linear-gradient(135deg, #81c784, #a5d6a7);
- color: white;
- box-shadow: 0 4px 12px rgba(129, 199, 132, 0.3);
-}
-
-.news-rank.rank-3 {
- background: linear-gradient(135deg, #a5d6a7, #c8e6c9);
- color: #333;
- box-shadow: 0 4px 12px rgba(165, 214, 167, 0.3);
-}
-
-.rank-number {
- font-size: 0.9rem;
- font-weight: 700;
- line-height: 1;
-}
-
-.rank-emoji {
- font-size: 0.7rem;
- line-height: 1;
- margin-top: 1px;
-}
-
-/* 内容包装器 */
-.news-content-wrapper {
- flex: 1;
- min-width: 0;
- display: flex;
- flex-direction: column;
- gap: 8px;
-}
-
-/* 标题 */
-.news-title {
- font-size: 1rem;
- font-weight: 600;
- color: #333;
- line-height: 1.4;
- margin: 0;
- display: -webkit-box;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical;
- overflow: hidden;
- text-overflow: ellipsis;
- cursor: pointer;
- transition: color 0.2s ease;
-}
-
-.news-title:hover {
- color: #66bb6a;
-}
-
-/* 元信息行 */
-.news-meta-row {
- display: flex;
- justify-content: space-between;
- align-items: center;
- gap: 12px;
- flex-wrap: wrap;
-}
-
-.news-author, .news-time {
- display: flex;
- align-items: center;
- gap: 4px;
- color: #666;
- font-size: 0.8rem;
- flex: 1;
- min-width: 0;
-}
-
-.meta-icon {
- font-size: 0.9rem;
- flex-shrink: 0;
-}
-
-.meta-text {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-/* 统计信息行 */
-.news-stats-row {
- display: flex;
- justify-content: space-between;
- align-items: center;
- gap: 12px;
- margin-top: 4px;
-}
-
-.news-score {
- display: flex;
- align-items: center;
- gap: 4px;
- background: linear-gradient(135deg, #81c784, #a5d6a7);
- color: white;
- padding: 4px 10px;
- border-radius: 12px;
- font-size: 0.75rem;
- font-weight: 600;
- box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
-}
-
-.heat-level {
- font-size: 0.8rem;
-}
-
-.score-text {
- font-size: 0.75rem;
-}
-
-.news-link {
- display: flex;
- align-items: center;
- gap: 4px;
- background: linear-gradient(135deg, #66bb6a, #81c784);
- color: white;
- text-decoration: none;
- padding: 6px 12px;
- border-radius: 12px;
- font-size: 0.75rem;
- font-weight: 600;
- transition: all 0.3s ease;
- box-shadow: 0 2px 6px rgba(102, 187, 106, 0.3);
- flex-shrink: 0;
-}
-
-.news-link:hover {
- transform: translateY(-1px);
- box-shadow: 0 4px 10px rgba(102, 187, 106, 0.4);
- text-decoration: none;
- color: white;
-}
-
-.link-icon {
- font-size: 0.8rem;
-}
-
-.link-text {
- font-size: 0.75rem;
-}
-
-.error-message {
- text-align: center;
- padding: 40px;
- background: white;
- border-radius: 12px;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04);
-}
-
-.error-content {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 16px;
-}
-
-.error-icon {
- font-size: 3rem;
-}
-
-.error-content h3 {
- color: #66bb6a;
- margin: 0;
- font-size: 1.3rem;
-}
-
-.error-content p {
- color: #666;
- margin: 0;
- font-size: 1rem;
-}
-
-.retry-btn {
- background: linear-gradient(135deg, #66bb6a, #81c784);
- border: none;
- padding: 12px 24px;
- border-radius: 25px;
- color: white;
- cursor: pointer;
- font-size: 0.95rem;
- font-weight: 500;
- transition: all 0.3s ease;
- display: inline-flex;
- align-items: center;
- gap: 8px;
- box-shadow: 0 4px 12px rgba(102, 187, 106, 0.3);
-}
-
-.retry-btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 6px 16px rgba(102, 187, 106, 0.4);
-}
-
-footer {
- text-align: center;
- margin-top: 30px;
- padding-top: 20px;
- border-top: 1px solid rgba(0, 0, 0, 0.06);
- color: #666;
- font-size: 0.9rem;
-}
-
-/* 响应式设计 - 移动端优化 */
-@media (max-width: 1024px) and (min-width: 768px) {
- .container {
- max-width: 90%;
- padding: 20px;
- }
-
- header h1 {
- font-size: 2.2rem;
- }
-
- .hot-item {
- padding: 18px;
- }
-
- .hot-title {
- font-size: 1.1rem;
- }
-}
-
-@media (max-width: 768px) {
- body {
- background-color: #f8f9fa;
- }
-
- .container {
- max-width: 95%;
- margin: 12px auto;
- padding: 8px;
- border-radius: 12px;
- }
-
- header, .header {
- margin-bottom: 20px;
- padding: 12px 0 16px 0;
- }
-
- header h1, .title {
- font-size: 1.6rem;
- margin-bottom: 10px;
- }
-
- .subtitle {
- font-size: 0.85rem;
- }
-
- .tab-container {
- gap: 8px;
- margin: 16px 0;
- }
-
- .tab-btn {
- padding: 8px 12px;
- font-size: 0.8rem;
- min-width: auto;
- }
-
- .refresh-btn {
- padding: 8px 10px;
- font-size: 0.8rem;
- }
-
- .update-time {
- font-size: 0.85rem;
- padding: 6px 12px;
- }
-
- .hot-item {
- padding: 16px;
- margin-bottom: 12px;
- border-radius: 10px;
- flex-direction: row;
- align-items: flex-start;
- }
-
- .hot-rank {
- font-size: 1.1rem;
- margin-right: 14px;
- min-width: 32px;
- width: 32px;
- height: 32px;
- margin-top: 2px;
- }
-
- .hot-title {
- font-size: 1rem;
- line-height: 1.5;
- margin-bottom: 6px;
- }
-
- .news-item {
- padding: 12px;
- margin-bottom: 10px;
- gap: 10px;
- }
-
- .news-rank {
- width: 40px;
- height: 40px;
- }
-
- .rank-number {
- font-size: 0.8rem;
- }
-
- .rank-emoji {
- font-size: 0.6rem;
- }
-
- .news-title {
- font-size: 0.9rem;
- line-height: 1.3;
- }
-
- .news-meta-row {
- gap: 8px;
- }
-
- .news-author, .news-time {
- font-size: 0.75rem;
- }
-
- .news-score {
- padding: 3px 8px;
- font-size: 0.7rem;
- }
-
- .news-link {
- padding: 5px 10px;
- font-size: 0.7rem;
- }
-
- .link-text {
- font-size: 0.7rem;
- }
-
- footer {
- margin-top: 24px;
- padding-top: 16px;
- font-size: 0.85rem;
- }
-}
-
-@media (max-width: 480px) {
- .container {
- margin: 8px auto;
- padding: 6px;
- }
-
- header h1, .title {
- font-size: 1.6rem;
- }
-
- .hot-item {
- padding: 14px;
- margin-bottom: 10px;
- }
-
- .hot-rank {
- font-size: 1rem;
- margin-right: 12px;
- min-width: 30px;
- width: 30px;
- height: 30px;
- }
-
- .hot-title {
- font-size: 0.95rem;
- }
-
- .news-item {
- padding: 10px;
- gap: 8px;
- }
-
- .news-rank {
- width: 36px;
- height: 36px;
- }
-
- .rank-number {
- font-size: 0.75rem;
- }
-
- .news-title {
- font-size: 0.85rem;
- }
-
- .news-meta-row {
- flex-direction: column;
- align-items: flex-start;
- gap: 6px;
- }
-
- .news-stats-row {
- gap: 8px;
- }
-
- .news-author, .news-time {
- font-size: 0.7rem;
- }
-
- .news-score {
- font-size: 0.65rem;
- }
-
- .news-link {
- font-size: 0.65rem;
- padding: 4px 8px;
- }
-}
-
-/* 减少动画以节省电池 */
-@media (prefers-reduced-motion: reduce) {
- .modern-gradient,
- .modern-gradient::before {
- animation: none;
- }
-
- .modern-gradient {
- background: linear-gradient(
- 135deg,
- rgba(129, 199, 132, 0.3) 0%,
- rgba(200, 230, 201, 0.2) 50%,
- rgba(232, 245, 233, 0.25) 100%
- );
- }
+/* 背景样式 */
+.background-container {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: -1;
+ overflow: hidden;
+ background-color: #f8f9fa;
+}
+
+.modern-gradient {
+ position: absolute;
+ top: -50%;
+ left: -50%;
+ width: 200%;
+ height: 200%;
+ background: linear-gradient(
+ 135deg,
+ rgba(129, 199, 132, 0.4) 0%,
+ rgba(165, 214, 167, 0.3) 25%,
+ rgba(200, 230, 201, 0.2) 50%,
+ rgba(220, 237, 200, 0.3) 75%,
+ rgba(232, 245, 233, 0.4) 100%
+ );
+ animation: gradient-flow 20s ease-in-out infinite;
+ border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
+}
+
+.modern-gradient::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: radial-gradient(
+ circle at 30% 70%,
+ rgba(129, 199, 132, 0.5) 0%,
+ transparent 50%
+ ), radial-gradient(
+ circle at 70% 30%,
+ rgba(165, 214, 167, 0.4) 0%,
+ transparent 50%
+ );
+ animation: pulse-effect 15s ease-in-out infinite alternate;
+ border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
+}
+
+@keyframes gradient-flow {
+ 0%, 100% {
+ transform: rotate(0deg) scale(1);
+ opacity: 0.8;
+ }
+ 25% {
+ transform: rotate(90deg) scale(1.1);
+ opacity: 0.6;
+ }
+ 50% {
+ transform: rotate(180deg) scale(0.9);
+ opacity: 0.9;
+ }
+ 75% {
+ transform: rotate(270deg) scale(1.05);
+ opacity: 0.7;
+ }
+}
+
+@keyframes pulse-effect {
+ 0% {
+ transform: scale(1) rotate(0deg);
+ opacity: 0.5;
+ }
+ 50% {
+ transform: scale(1.2) rotate(180deg);
+ opacity: 0.8;
+ }
+ 100% {
+ transform: scale(1) rotate(360deg);
+ opacity: 0.6;
+ }
+}
+
+/* 主样式 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
+ color: #333;
+ background-color: #f8f9fa;
+ position: relative;
+ min-height: 100vh;
+}
+
+.container {
+ max-width: 800px;
+ margin: 0 auto;
+ padding: 24px;
+ position: relative;
+ z-index: 1;
+ background-color: rgba(255, 255, 255, 0.85);
+ border-radius: 16px;
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08);
+ backdrop-filter: blur(10px);
+}
+
+header, .header {
+ text-align: center;
+ margin-bottom: 28px;
+ padding-bottom: 20px;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.06);
+}
+
+.header-icon {
+ font-size: 3rem;
+ margin-bottom: 10px;
+ display: block;
+}
+
+header h1, .title {
+ background: linear-gradient(135deg, #66bb6a, #81c784);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+ margin-bottom: 14px;
+ font-size: 2.4rem;
+ font-weight: 700;
+ letter-spacing: -0.5px;
+}
+
+.subtitle {
+ color: #666;
+ font-size: 1.1rem;
+ margin-bottom: 20px;
+ font-weight: 400;
+}
+
+.tab-container {
+ display: flex;
+ justify-content: center;
+ gap: 12px;
+ margin-bottom: 20px;
+ flex-wrap: wrap;
+}
+
+.tab-btn {
+ background: linear-gradient(135deg, #f0f0f0, #e8e8e8);
+ border: none;
+ padding: 12px 20px;
+ border-radius: 25px;
+ cursor: pointer;
+ font-size: 0.95rem;
+ font-weight: 500;
+ color: #666;
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+}
+
+.tab-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+}
+
+.tab-btn.active {
+ background: linear-gradient(135deg, #66bb6a, #81c784);
+ color: white;
+ box-shadow: 0 4px 16px rgba(102, 187, 106, 0.3);
+}
+
+.tab-icon {
+ font-size: 1.1rem;
+}
+
+.refresh-btn {
+ background: linear-gradient(135deg, #81c784, #a5d6a7);
+ border: none;
+ padding: 12px 24px;
+ border-radius: 25px;
+ color: white;
+ cursor: pointer;
+ font-size: 0.95rem;
+ font-weight: 500;
+ margin-top: 15px;
+ transition: all 0.3s ease;
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ box-shadow: 0 4px 12px rgba(129, 199, 132, 0.3);
+}
+
+.refresh-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 6px 16px rgba(129, 199, 132, 0.4);
+}
+
+.btn-icon {
+ font-size: 1.1rem;
+}
+
+.time-icon {
+ margin-right: 6px;
+}
+
+.update-time {
+ color: #666;
+ font-size: 0.9rem;
+ background-color: rgba(0, 0, 0, 0.03);
+ padding: 8px 16px;
+ border-radius: 24px;
+ display: inline-block;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
+}
+
+.hot-list {
+ list-style: none;
+}
+
+.hot-item {
+ padding: 20px;
+ margin-bottom: 16px;
+ border-radius: 12px;
+ background-color: white;
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04);
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ border: 1px solid rgba(0, 0, 0, 0.03);
+}
+
+.hot-item:hover {
+ transform: translateY(-3px);
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
+ border-color: rgba(129, 199, 132, 0.3);
+}
+
+.hot-rank {
+ font-size: 1.2rem;
+ font-weight: bold;
+ color: #66bb6a;
+ margin-right: 18px;
+ min-width: 38px;
+ text-align: center;
+ background-color: rgba(129, 199, 132, 0.1);
+ border-radius: 50%;
+ width: 38px;
+ height: 38px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.hot-rank.top-1 {
+ background: linear-gradient(135deg, #66bb6a, #81c784);
+ color: white;
+}
+
+.hot-rank.top-2 {
+ background: linear-gradient(135deg, #81c784, #a5d6a7);
+ color: white;
+}
+
+.hot-rank.top-3 {
+ background: linear-gradient(135deg, #a5d6a7, #c8e6c9);
+ color: #333;
+}
+
+.hot-content {
+ flex: 1;
+}
+
+.hot-title {
+ font-size: 1.15rem;
+ margin-bottom: 8px;
+ color: #333;
+ text-decoration: none;
+ display: block;
+ line-height: 1.5;
+ font-weight: 500;
+ transition: color 0.2s ease;
+}
+
+.hot-title:hover {
+ color: #66bb6a;
+ text-decoration: none;
+}
+
+.loading {
+ text-align: center;
+ padding: 40px;
+ color: #666;
+ font-size: 1.1rem;
+ display: none;
+}
+
+.loading-content {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 20px;
+}
+
+.rainbow-spinner {
+ width: 50px;
+ height: 50px;
+ border: 4px solid rgba(129, 199, 132, 0.2);
+ border-top: 4px solid #81c784;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+.loading-text {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 10px;
+}
+
+.loading-emoji {
+ font-size: 2rem;
+ animation: bounce 1.5s ease-in-out infinite;
+}
+
+@keyframes bounce {
+ 0%, 20%, 50%, 80%, 100% {
+ transform: translateY(0);
+ }
+ 40% {
+ transform: translateY(-10px);
+ }
+ 60% {
+ transform: translateY(-5px);
+ }
+}
+
+.loading-dots {
+ display: flex;
+ gap: 4px;
+}
+
+.loading-dots span {
+ width: 8px;
+ height: 8px;
+ background: #81c784;
+ border-radius: 50%;
+ animation: loadingDots 1.4s ease-in-out infinite both;
+}
+
+.loading-dots span:nth-child(1) { animation-delay: -0.32s; }
+.loading-dots span:nth-child(2) { animation-delay: -0.16s; }
+.loading-dots span:nth-child(3) { animation-delay: 0s; }
+
+@keyframes loadingDots {
+ 0%, 80%, 100% {
+ transform: scale(0);
+ }
+ 40% {
+ transform: scale(1);
+ }
+}
+
+.news-list {
+ margin-top: 20px;
+}
+
+/* 新闻项目卡片 - 移动端优先设计 */
+.news-item {
+ background: white;
+ border-radius: 16px;
+ padding: 16px;
+ margin-bottom: 12px;
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
+ transition: all 0.3s ease;
+ border: 1px solid rgba(0, 0, 0, 0.05);
+ display: flex;
+ gap: 12px;
+ position: relative;
+ overflow: hidden;
+}
+
+.news-item:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.1);
+ border-color: rgba(129, 199, 132, 0.3);
+}
+
+/* 排名容器 */
+.news-rank-container {
+ flex-shrink: 0;
+ display: flex;
+ align-items: flex-start;
+ padding-top: 2px;
+}
+
+.news-rank {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ width: 48px;
+ height: 48px;
+ border-radius: 12px;
+ background: linear-gradient(135deg, #f0f0f0, #e8e8e8);
+ color: #666;
+ font-weight: 600;
+ position: relative;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+}
+
+.news-rank.rank-1 {
+ background: linear-gradient(135deg, #66bb6a, #81c784);
+ color: white;
+ box-shadow: 0 4px 12px rgba(102, 187, 106, 0.3);
+}
+
+.news-rank.rank-2 {
+ background: linear-gradient(135deg, #81c784, #a5d6a7);
+ color: white;
+ box-shadow: 0 4px 12px rgba(129, 199, 132, 0.3);
+}
+
+.news-rank.rank-3 {
+ background: linear-gradient(135deg, #a5d6a7, #c8e6c9);
+ color: #333;
+ box-shadow: 0 4px 12px rgba(165, 214, 167, 0.3);
+}
+
+.rank-number {
+ font-size: 0.9rem;
+ font-weight: 700;
+ line-height: 1;
+}
+
+.rank-emoji {
+ font-size: 0.7rem;
+ line-height: 1;
+ margin-top: 1px;
+}
+
+/* 内容包装器 */
+.news-content-wrapper {
+ flex: 1;
+ min-width: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+/* 标题 */
+.news-title {
+ font-size: 1rem;
+ font-weight: 600;
+ color: #333;
+ line-height: 1.4;
+ margin: 0;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ cursor: pointer;
+ transition: color 0.2s ease;
+}
+
+.news-title:hover {
+ color: #66bb6a;
+}
+
+/* 元信息行 */
+.news-meta-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 12px;
+ flex-wrap: wrap;
+}
+
+.news-author, .news-time {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ color: #666;
+ font-size: 0.8rem;
+ flex: 1;
+ min-width: 0;
+}
+
+.meta-icon {
+ font-size: 0.9rem;
+ flex-shrink: 0;
+}
+
+.meta-text {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+/* 统计信息行 */
+.news-stats-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 12px;
+ margin-top: 4px;
+}
+
+.news-score {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ background: linear-gradient(135deg, #81c784, #a5d6a7);
+ color: white;
+ padding: 4px 10px;
+ border-radius: 12px;
+ font-size: 0.75rem;
+ font-weight: 600;
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
+}
+
+.heat-level {
+ font-size: 0.8rem;
+}
+
+.score-text {
+ font-size: 0.75rem;
+}
+
+.news-link {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ background: linear-gradient(135deg, #66bb6a, #81c784);
+ color: white;
+ text-decoration: none;
+ padding: 6px 12px;
+ border-radius: 12px;
+ font-size: 0.75rem;
+ font-weight: 600;
+ transition: all 0.3s ease;
+ box-shadow: 0 2px 6px rgba(102, 187, 106, 0.3);
+ flex-shrink: 0;
+}
+
+.news-link:hover {
+ transform: translateY(-1px);
+ box-shadow: 0 4px 10px rgba(102, 187, 106, 0.4);
+ text-decoration: none;
+ color: white;
+}
+
+.link-icon {
+ font-size: 0.8rem;
+}
+
+.link-text {
+ font-size: 0.75rem;
+}
+
+.error-message {
+ text-align: center;
+ padding: 40px;
+ background: white;
+ border-radius: 12px;
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04);
+}
+
+.error-content {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 16px;
+}
+
+.error-icon {
+ font-size: 3rem;
+}
+
+.error-content h3 {
+ color: #66bb6a;
+ margin: 0;
+ font-size: 1.3rem;
+}
+
+.error-content p {
+ color: #666;
+ margin: 0;
+ font-size: 1rem;
+}
+
+.retry-btn {
+ background: linear-gradient(135deg, #66bb6a, #81c784);
+ border: none;
+ padding: 12px 24px;
+ border-radius: 25px;
+ color: white;
+ cursor: pointer;
+ font-size: 0.95rem;
+ font-weight: 500;
+ transition: all 0.3s ease;
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ box-shadow: 0 4px 12px rgba(102, 187, 106, 0.3);
+}
+
+.retry-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 6px 16px rgba(102, 187, 106, 0.4);
+}
+
+footer {
+ text-align: center;
+ margin-top: 30px;
+ padding-top: 20px;
+ border-top: 1px solid rgba(0, 0, 0, 0.06);
+ color: #666;
+ font-size: 0.9rem;
+}
+
+/* 响应式设计 - 移动端优化 */
+@media (max-width: 1024px) and (min-width: 768px) {
+ .container {
+ max-width: 90%;
+ padding: 20px;
+ }
+
+ header h1 {
+ font-size: 2.2rem;
+ }
+
+ .hot-item {
+ padding: 18px;
+ }
+
+ .hot-title {
+ font-size: 1.1rem;
+ }
+}
+
+@media (max-width: 768px) {
+ body {
+ background-color: #f8f9fa;
+ }
+
+ .container {
+ max-width: 95%;
+ margin: 12px auto;
+ padding: 8px;
+ border-radius: 12px;
+ }
+
+ header, .header {
+ margin-bottom: 20px;
+ padding: 12px 0 16px 0;
+ }
+
+ header h1, .title {
+ font-size: 1.6rem;
+ margin-bottom: 10px;
+ }
+
+ .subtitle {
+ font-size: 0.85rem;
+ }
+
+ .tab-container {
+ gap: 8px;
+ margin: 16px 0;
+ }
+
+ .tab-btn {
+ padding: 8px 12px;
+ font-size: 0.8rem;
+ min-width: auto;
+ }
+
+ .refresh-btn {
+ padding: 8px 10px;
+ font-size: 0.8rem;
+ }
+
+ .update-time {
+ font-size: 0.85rem;
+ padding: 6px 12px;
+ }
+
+ .hot-item {
+ padding: 16px;
+ margin-bottom: 12px;
+ border-radius: 10px;
+ flex-direction: row;
+ align-items: flex-start;
+ }
+
+ .hot-rank {
+ font-size: 1.1rem;
+ margin-right: 14px;
+ min-width: 32px;
+ width: 32px;
+ height: 32px;
+ margin-top: 2px;
+ }
+
+ .hot-title {
+ font-size: 1rem;
+ line-height: 1.5;
+ margin-bottom: 6px;
+ }
+
+ .news-item {
+ padding: 12px;
+ margin-bottom: 10px;
+ gap: 10px;
+ }
+
+ .news-rank {
+ width: 40px;
+ height: 40px;
+ }
+
+ .rank-number {
+ font-size: 0.8rem;
+ }
+
+ .rank-emoji {
+ font-size: 0.6rem;
+ }
+
+ .news-title {
+ font-size: 0.9rem;
+ line-height: 1.3;
+ }
+
+ .news-meta-row {
+ gap: 8px;
+ }
+
+ .news-author, .news-time {
+ font-size: 0.75rem;
+ }
+
+ .news-score {
+ padding: 3px 8px;
+ font-size: 0.7rem;
+ }
+
+ .news-link {
+ padding: 5px 10px;
+ font-size: 0.7rem;
+ }
+
+ .link-text {
+ font-size: 0.7rem;
+ }
+
+ footer {
+ margin-top: 24px;
+ padding-top: 16px;
+ font-size: 0.85rem;
+ }
+}
+
+@media (max-width: 480px) {
+ .container {
+ margin: 8px auto;
+ padding: 6px;
+ }
+
+ header h1, .title {
+ font-size: 1.6rem;
+ }
+
+ .hot-item {
+ padding: 14px;
+ margin-bottom: 10px;
+ }
+
+ .hot-rank {
+ font-size: 1rem;
+ margin-right: 12px;
+ min-width: 30px;
+ width: 30px;
+ height: 30px;
+ }
+
+ .hot-title {
+ font-size: 0.95rem;
+ }
+
+ .news-item {
+ padding: 10px;
+ gap: 8px;
+ }
+
+ .news-rank {
+ width: 36px;
+ height: 36px;
+ }
+
+ .rank-number {
+ font-size: 0.75rem;
+ }
+
+ .news-title {
+ font-size: 0.85rem;
+ }
+
+ .news-meta-row {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 6px;
+ }
+
+ .news-stats-row {
+ gap: 8px;
+ }
+
+ .news-author, .news-time {
+ font-size: 0.7rem;
+ }
+
+ .news-score {
+ font-size: 0.65rem;
+ }
+
+ .news-link {
+ font-size: 0.65rem;
+ padding: 4px 8px;
+ }
+}
+
+/* 减少动画以节省电池 */
+@media (prefers-reduced-motion: reduce) {
+ .modern-gradient,
+ .modern-gradient::before {
+ animation: none;
+ }
+
+ .modern-gradient {
+ background: linear-gradient(
+ 135deg,
+ rgba(129, 199, 132, 0.3) 0%,
+ rgba(200, 230, 201, 0.2) 50%,
+ rgba(232, 245, 233, 0.25) 100%
+ );
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/index.html
index 2dc101fa..9c4b11cf 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/index.html
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/index.html
@@ -1,68 +1,68 @@
-
-
-
-
-
- HackerNews 热门榜单
-
-
-
-
-
-
-
-
-
-
-
-
正在获取最新榜单...
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
加载失败了
-
网络连接出现问题,请稍后重试
-
-
-
-
-
-
-
-
+
+
+
+
+
+ HackerNews 热门榜单
+
+
+
+
+
+
+
+
+
+
+
+
正在获取最新榜单...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
加载失败了
+
网络连接出现问题,请稍后重试
+
+
+
+
+
+
+
+
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/js/script.js b/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/js/script.js
index 4f77ee12..a944bfcd 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/js/script.js
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/js/script.js
@@ -1,339 +1,339 @@
-// API接口列表
-const API_ENDPOINTS = [
- "https://60s.api.shumengya.top",
-];
-
-// 当前使用的API索引
-let currentApiIndex = 0;
-let currentType = 'top';
-
-// DOM元素
-const loadingElement = document.getElementById('loading');
-const newsListElement = document.getElementById('newsList');
-const errorMessageElement = document.getElementById('errorMessage');
-const updateTimeElement = document.getElementById('updateTime');
-const refreshBtn = document.getElementById('refreshBtn');
-const tabBtns = document.querySelectorAll('.tab-btn');
-
-// 页面加载完成后自动加载数据
-document.addEventListener('DOMContentLoaded', function() {
- loadNewsList();
- initTabEvents();
-});
-
-// 初始化标签事件
-function initTabEvents() {
- tabBtns.forEach(btn => {
- btn.addEventListener('click', function() {
- const type = this.getAttribute('data-type');
- if (type !== currentType) {
- currentType = type;
- updateActiveTab(this);
- loadNewsList();
- }
- });
- });
-}
-
-// 更新活跃标签
-function updateActiveTab(activeBtn) {
- tabBtns.forEach(btn => btn.classList.remove('active'));
- activeBtn.classList.add('active');
-}
-
-// 刷新按钮点击事件
-refreshBtn.addEventListener('click', function() {
- loadNewsList();
-});
-
-// 加载新闻列表
-async function loadNewsList() {
- showLoading();
- hideError();
-
- try {
- const data = await fetchData();
- displayNewsList(data.data);
- updateRefreshTime();
- } catch (error) {
- console.error('加载失败:', error);
- showError();
- }
-
- hideLoading();
-}
-
-// 获取数据
-async function fetchData() {
- for (let i = 0; i < API_ENDPOINTS.length; i++) {
- const apiUrl = API_ENDPOINTS[currentApiIndex];
-
- try {
- const response = await fetch(`${apiUrl}/v2/hacker-news/${currentType}`, {
- method: 'GET',
- headers: {
- 'Accept': 'application/json',
- },
- timeout: 10000
- });
-
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}`);
- }
-
- const data = await response.json();
-
- if (data.code === 200 && data.data) {
- return data;
- } else {
- throw new Error('数据格式错误');
- }
- } catch (error) {
- console.error(`API ${apiUrl} 请求失败:`, error);
- currentApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length;
-
- if (i === API_ENDPOINTS.length - 1) {
- throw new Error('所有API接口都无法访问');
- }
- }
- }
-}
-
-// 显示新闻列表
-function displayNewsList(newsData) {
- newsListElement.innerHTML = '';
-
- newsData.forEach((item, index) => {
- const newsItem = createNewsItem(item, index + 1);
- newsListElement.appendChild(newsItem);
- });
-}
-
-// 创建新闻项目
-function createNewsItem(item, rank) {
- const newsItem = document.createElement('div');
- newsItem.className = 'news-item';
-
- const rankClass = rank <= 3 ? `news-rank rank-${rank}` : 'news-rank';
- const formattedScore = formatScore(item.score);
- const formattedTime = formatTime(item.created);
-
- // 根据评分添加热度指示
- let heatLevel = '';
- if (item.score >= 1000) heatLevel = 'HOT';
- else if (item.score >= 500) heatLevel = 'WARM';
- else if (item.score >= 100) heatLevel = 'COOL';
- else heatLevel = 'NEW';
-
- newsItem.innerHTML = `
-
-
-
${escapeHtml(item.title)}
-
-
-
- ${heatLevel}
- ${formattedScore} 分
-
-
- 阅读全文
-
-
-
- `;
-
- return newsItem;
-}
-
-// 格式化评分
-function formatScore(score) {
- if (score >= 1000) {
- return (score / 1000).toFixed(1) + 'K';
- } else {
- return score.toString();
- }
-}
-
-// 格式化时间
-function formatTime(timeStr) {
- try {
- const date = new Date(timeStr);
- const now = new Date();
- const diff = now - date;
- const minutes = Math.floor(diff / (1000 * 60));
- const hours = Math.floor(minutes / 60);
- const days = Math.floor(hours / 24);
-
- if (days > 0) {
- return `${days}天前`;
- } else if (hours > 0) {
- return `${hours}小时前`;
- } else if (minutes > 0) {
- return `${minutes}分钟前`;
- } else {
- return '刚刚';
- }
- } catch (error) {
- return timeStr;
- }
-}
-
-// HTML转义
-function escapeHtml(text) {
- const div = document.createElement('div');
- div.textContent = text;
- return div.innerHTML;
-}
-
-// 更新刷新时间
-function updateRefreshTime() {
- const now = new Date();
- const timeStr = now.toLocaleString('zh-CN', {
- year: 'numeric',
- month: '2-digit',
- day: '2-digit',
- hour: '2-digit',
- minute: '2-digit',
- second: '2-digit'
- });
- updateTimeElement.textContent = `最后更新: ${timeStr}`;
-
- // 添加成功提示
- showSuccessMessage('🌈 数据已更新');
-}
-
-// 显示成功消息
-function showSuccessMessage(message) {
- // 移除之前的提示
- const existingToast = document.querySelector('.success-toast');
- if (existingToast) {
- existingToast.remove();
- }
-
- const toast = document.createElement('div');
- toast.className = 'success-toast';
- toast.textContent = message;
- toast.style.cssText = `
- position: fixed;
- top: 20px;
- right: 20px;
- background: linear-gradient(135deg, #ff6b6b, #4ecdc4, #45b7d1);
- color: white;
- padding: 12px 20px;
- border-radius: 25px;
- box-shadow: 0 4px 20px rgba(255, 107, 107, 0.3);
- z-index: 1000;
- font-weight: 600;
- font-size: 0.9em;
- animation: rainbowToastSlide 0.5s ease-out;
- backdrop-filter: blur(10px);
- `;
-
- document.body.appendChild(toast);
-
- // 3秒后自动移除
- setTimeout(() => {
- toast.style.animation = 'rainbowToastSlideOut 0.5s ease-in forwards';
- setTimeout(() => toast.remove(), 500);
- }, 3000);
-}
-
-// 显示加载状态
-function showLoading() {
- loadingElement.style.display = 'block';
- newsListElement.style.display = 'none';
-}
-
-// 隐藏加载状态
-function hideLoading() {
- loadingElement.style.display = 'none';
- newsListElement.style.display = 'block';
-}
-
-// 显示错误信息
-function showError() {
- errorMessageElement.style.display = 'block';
- newsListElement.style.display = 'none';
-}
-
-// 隐藏错误信息
-function hideError() {
- errorMessageElement.style.display = 'none';
-}
-
-// 添加CSS动画到页面
-if (!document.querySelector('#toast-styles')) {
- const style = document.createElement('style');
- style.id = 'toast-styles';
- style.textContent = `
- @keyframes rainbowToastSlide {
- from {
- opacity: 0;
- transform: translateX(100px) scale(0.8);
- }
- to {
- opacity: 1;
- transform: translateX(0) scale(1);
- }
- }
-
- @keyframes rainbowToastSlideOut {
- from {
- opacity: 1;
- transform: translateX(0) scale(1);
- }
- to {
- opacity: 0;
- transform: translateX(100px) scale(0.8);
- }
- }
-
- .success-toast {
- background-size: 200% 200%;
- animation: rainbowToastSlide 0.5s ease-out, toastRainbow 2s ease-in-out infinite !important;
- }
-
- @keyframes toastRainbow {
- 0%, 100% { background-position: 0% 50%; }
- 50% { background-position: 100% 50%; }
- }
- `;
- document.head.appendChild(style);
-}
-
-// 自动刷新 (每5分钟)
-setInterval(function() {
- loadNewsList();
-}, 5 * 60 * 1000);
-
-// 键盘快捷键支持
-document.addEventListener('keydown', function(e) {
- if (e.key === 'r' && (e.ctrlKey || e.metaKey)) {
- e.preventDefault();
- loadNewsList();
- }
-
- // 数字键切换标签
- if (e.key >= '1' && e.key <= '3') {
- e.preventDefault();
- const typeMap = { '1': 'top', '2': 'new', '3': 'best' };
- const targetType = typeMap[e.key];
- const targetBtn = document.querySelector(`[data-type="${targetType}"]`);
- if (targetBtn && targetType !== currentType) {
- currentType = targetType;
- updateActiveTab(targetBtn);
- loadNewsList();
- }
- }
-});
+// API接口列表
+const API_ENDPOINTS = [
+ "https://60s.api.shumengya.top",
+];
+
+// 当前使用的API索引
+let currentApiIndex = 0;
+let currentType = 'top';
+
+// DOM元素
+const loadingElement = document.getElementById('loading');
+const newsListElement = document.getElementById('newsList');
+const errorMessageElement = document.getElementById('errorMessage');
+const updateTimeElement = document.getElementById('updateTime');
+const refreshBtn = document.getElementById('refreshBtn');
+const tabBtns = document.querySelectorAll('.tab-btn');
+
+// 页面加载完成后自动加载数据
+document.addEventListener('DOMContentLoaded', function() {
+ loadNewsList();
+ initTabEvents();
+});
+
+// 初始化标签事件
+function initTabEvents() {
+ tabBtns.forEach(btn => {
+ btn.addEventListener('click', function() {
+ const type = this.getAttribute('data-type');
+ if (type !== currentType) {
+ currentType = type;
+ updateActiveTab(this);
+ loadNewsList();
+ }
+ });
+ });
+}
+
+// 更新活跃标签
+function updateActiveTab(activeBtn) {
+ tabBtns.forEach(btn => btn.classList.remove('active'));
+ activeBtn.classList.add('active');
+}
+
+// 刷新按钮点击事件
+refreshBtn.addEventListener('click', function() {
+ loadNewsList();
+});
+
+// 加载新闻列表
+async function loadNewsList() {
+ showLoading();
+ hideError();
+
+ try {
+ const data = await fetchData();
+ displayNewsList(data.data);
+ updateRefreshTime();
+ } catch (error) {
+ console.error('加载失败:', error);
+ showError();
+ }
+
+ hideLoading();
+}
+
+// 获取数据
+async function fetchData() {
+ for (let i = 0; i < API_ENDPOINTS.length; i++) {
+ const apiUrl = API_ENDPOINTS[currentApiIndex];
+
+ try {
+ const response = await fetch(`${apiUrl}/v2/hacker-news/${currentType}`, {
+ method: 'GET',
+ headers: {
+ 'Accept': 'application/json',
+ },
+ timeout: 10000
+ });
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}`);
+ }
+
+ const data = await response.json();
+
+ if (data.code === 200 && data.data) {
+ return data;
+ } else {
+ throw new Error('数据格式错误');
+ }
+ } catch (error) {
+ console.error(`API ${apiUrl} 请求失败:`, error);
+ currentApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length;
+
+ if (i === API_ENDPOINTS.length - 1) {
+ throw new Error('所有API接口都无法访问');
+ }
+ }
+ }
+}
+
+// 显示新闻列表
+function displayNewsList(newsData) {
+ newsListElement.innerHTML = '';
+
+ newsData.forEach((item, index) => {
+ const newsItem = createNewsItem(item, index + 1);
+ newsListElement.appendChild(newsItem);
+ });
+}
+
+// 创建新闻项目
+function createNewsItem(item, rank) {
+ const newsItem = document.createElement('div');
+ newsItem.className = 'news-item';
+
+ const rankClass = rank <= 3 ? `news-rank rank-${rank}` : 'news-rank';
+ const formattedScore = formatScore(item.score);
+ const formattedTime = formatTime(item.created);
+
+ // 根据评分添加热度指示
+ let heatLevel = '';
+ if (item.score >= 1000) heatLevel = 'HOT';
+ else if (item.score >= 500) heatLevel = 'WARM';
+ else if (item.score >= 100) heatLevel = 'COOL';
+ else heatLevel = 'NEW';
+
+ newsItem.innerHTML = `
+
+
+
${escapeHtml(item.title)}
+
+
+
+ ${heatLevel}
+ ${formattedScore} 分
+
+
+ 阅读全文
+
+
+
+ `;
+
+ return newsItem;
+}
+
+// 格式化评分
+function formatScore(score) {
+ if (score >= 1000) {
+ return (score / 1000).toFixed(1) + 'K';
+ } else {
+ return score.toString();
+ }
+}
+
+// 格式化时间
+function formatTime(timeStr) {
+ try {
+ const date = new Date(timeStr);
+ const now = new Date();
+ const diff = now - date;
+ const minutes = Math.floor(diff / (1000 * 60));
+ const hours = Math.floor(minutes / 60);
+ const days = Math.floor(hours / 24);
+
+ if (days > 0) {
+ return `${days}天前`;
+ } else if (hours > 0) {
+ return `${hours}小时前`;
+ } else if (minutes > 0) {
+ return `${minutes}分钟前`;
+ } else {
+ return '刚刚';
+ }
+ } catch (error) {
+ return timeStr;
+ }
+}
+
+// HTML转义
+function escapeHtml(text) {
+ const div = document.createElement('div');
+ div.textContent = text;
+ return div.innerHTML;
+}
+
+// 更新刷新时间
+function updateRefreshTime() {
+ const now = new Date();
+ const timeStr = now.toLocaleString('zh-CN', {
+ year: 'numeric',
+ month: '2-digit',
+ day: '2-digit',
+ hour: '2-digit',
+ minute: '2-digit',
+ second: '2-digit'
+ });
+ updateTimeElement.textContent = `最后更新: ${timeStr}`;
+
+ // 添加成功提示
+ showSuccessMessage('🌈 数据已更新');
+}
+
+// 显示成功消息
+function showSuccessMessage(message) {
+ // 移除之前的提示
+ const existingToast = document.querySelector('.success-toast');
+ if (existingToast) {
+ existingToast.remove();
+ }
+
+ const toast = document.createElement('div');
+ toast.className = 'success-toast';
+ toast.textContent = message;
+ toast.style.cssText = `
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ background: linear-gradient(135deg, #ff6b6b, #4ecdc4, #45b7d1);
+ color: white;
+ padding: 12px 20px;
+ border-radius: 25px;
+ box-shadow: 0 4px 20px rgba(255, 107, 107, 0.3);
+ z-index: 1000;
+ font-weight: 600;
+ font-size: 0.9em;
+ animation: rainbowToastSlide 0.5s ease-out;
+ backdrop-filter: blur(10px);
+ `;
+
+ document.body.appendChild(toast);
+
+ // 3秒后自动移除
+ setTimeout(() => {
+ toast.style.animation = 'rainbowToastSlideOut 0.5s ease-in forwards';
+ setTimeout(() => toast.remove(), 500);
+ }, 3000);
+}
+
+// 显示加载状态
+function showLoading() {
+ loadingElement.style.display = 'block';
+ newsListElement.style.display = 'none';
+}
+
+// 隐藏加载状态
+function hideLoading() {
+ loadingElement.style.display = 'none';
+ newsListElement.style.display = 'block';
+}
+
+// 显示错误信息
+function showError() {
+ errorMessageElement.style.display = 'block';
+ newsListElement.style.display = 'none';
+}
+
+// 隐藏错误信息
+function hideError() {
+ errorMessageElement.style.display = 'none';
+}
+
+// 添加CSS动画到页面
+if (!document.querySelector('#toast-styles')) {
+ const style = document.createElement('style');
+ style.id = 'toast-styles';
+ style.textContent = `
+ @keyframes rainbowToastSlide {
+ from {
+ opacity: 0;
+ transform: translateX(100px) scale(0.8);
+ }
+ to {
+ opacity: 1;
+ transform: translateX(0) scale(1);
+ }
+ }
+
+ @keyframes rainbowToastSlideOut {
+ from {
+ opacity: 1;
+ transform: translateX(0) scale(1);
+ }
+ to {
+ opacity: 0;
+ transform: translateX(100px) scale(0.8);
+ }
+ }
+
+ .success-toast {
+ background-size: 200% 200%;
+ animation: rainbowToastSlide 0.5s ease-out, toastRainbow 2s ease-in-out infinite !important;
+ }
+
+ @keyframes toastRainbow {
+ 0%, 100% { background-position: 0% 50%; }
+ 50% { background-position: 100% 50%; }
+ }
+ `;
+ document.head.appendChild(style);
+}
+
+// 自动刷新 (每5分钟)
+setInterval(function() {
+ loadNewsList();
+}, 5 * 60 * 1000);
+
+// 键盘快捷键支持
+document.addEventListener('keydown', function(e) {
+ if (e.key === 'r' && (e.ctrlKey || e.metaKey)) {
+ e.preventDefault();
+ loadNewsList();
+ }
+
+ // 数字键切换标签
+ if (e.key >= '1' && e.key <= '3') {
+ e.preventDefault();
+ const typeMap = { '1': 'top', '2': 'new', '3': 'best' };
+ const targetType = typeMap[e.key];
+ const targetBtn = document.querySelector(`[data-type="${targetType}"]`);
+ if (targetBtn && targetType !== currentType) {
+ currentType = targetType;
+ updateActiveTab(targetBtn);
+ loadNewsList();
+ }
+ }
+});
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/接口集合.json b/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/接口集合.json
index 547b2771..42245813 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/接口集合.json
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/接口集合.json
@@ -1,3 +1,3 @@
-[
- "https://60s.api.shumengya.top"
-]
+[
+ "https://60s.api.shumengya.top"
+]
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/返回接口.json
index 0008f691..d823f439 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/Hacker News 榜单/返回接口.json
@@ -1,87 +1,87 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": [
- {
- "id": 45087396,
- "title": "We should have the ability to run any code we want on hardware we own",
- "link": "https://hugotunius.se/2025/08/31/what-every-argument-about-sideloading-gets-wrong.html",
- "score": 995,
- "author": "K0nserv",
- "created": "2025-08-31 21:46:26",
- "created_at": 1756676786000
- },
- {
- "id": 45053029,
- "title": "Why countries trade with each other while fighting",
- "link": "https://news.mit.edu/2025/why-countries-trade-each-other-while-fighting-mariya-grinberg-book-0828",
- "score": 32,
- "author": "LorenDB",
- "created": "2025-08-28 14:58:28",
- "created_at": 1756393108000
- },
- {
- "id": 45086020,
- "title": "Eternal Struggle",
- "link": "https://yoavg.github.io/eternal/",
- "score": 481,
- "author": "yurivish",
- "created": "2025-08-31 19:04:03",
- "created_at": 1756667043000
- },
- {
- "id": 45052960,
- "title": "C++: Strongly Happens Before?",
- "link": "https://nekrozqliphort.github.io/posts/happens-b4/",
- "score": 16,
- "author": "signa11",
- "created": "2025-08-28 14:54:37",
- "created_at": 1756392877000
- },
- {
- "id": 45087971,
- "title": "Nintendo Switch 2 Dock USB-C Compatibility",
- "link": "https://www.lttlabs.com/blog/2025/08/30/nintendo-switch-2-dock",
- "score": 192,
- "author": "croes",
- "created": "2025-08-31 23:21:46",
- "created_at": 1756682506000
- },
- {
- "id": 45082731,
- "title": "“This telegram must be closely paraphrased before being communicated to anyone”",
- "link": "https://history.stackexchange.com/questions/79371/this-telegram-must-be-closely-paraphrased-before-being-communicated-to-anyone",
- "score": 645,
- "author": "azeemba",
- "created": "2025-08-31 12:39:47",
- "created_at": 1756643987000
- },
- {
- "id": 45089256,
- "title": "What Is Complexity in Chess?",
- "link": "https://lichess.org/@/Toadofsky/blog/what-is-complexity/pKo1swFh",
- "score": 41,
- "author": "fzliu",
- "created": "2025-09-01 03:45:33",
- "created_at": 1756698333000
- },
- {
- "id": 45087815,
- "title": "Lewis and Clark marked their trail with laxatives",
- "link": "https://offbeatoregon.com/2501d1006d_biliousPills-686.077.html",
- "score": 141,
- "author": "toomuchtodo",
- "created": "2025-08-31 22:54:26",
- "created_at": 1756680866000
- },
- {
- "id": 45083952,
- "title": "Jujutsu for everyone",
- "link": "https://jj-for-everyone.github.io/",
- "score": 363,
- "author": "Bogdanp",
- "created": "2025-08-31 15:31:04",
- "created_at": 1756654264000
- }
- ]
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": [
+ {
+ "id": 45087396,
+ "title": "We should have the ability to run any code we want on hardware we own",
+ "link": "https://hugotunius.se/2025/08/31/what-every-argument-about-sideloading-gets-wrong.html",
+ "score": 995,
+ "author": "K0nserv",
+ "created": "2025-08-31 21:46:26",
+ "created_at": 1756676786000
+ },
+ {
+ "id": 45053029,
+ "title": "Why countries trade with each other while fighting",
+ "link": "https://news.mit.edu/2025/why-countries-trade-each-other-while-fighting-mariya-grinberg-book-0828",
+ "score": 32,
+ "author": "LorenDB",
+ "created": "2025-08-28 14:58:28",
+ "created_at": 1756393108000
+ },
+ {
+ "id": 45086020,
+ "title": "Eternal Struggle",
+ "link": "https://yoavg.github.io/eternal/",
+ "score": 481,
+ "author": "yurivish",
+ "created": "2025-08-31 19:04:03",
+ "created_at": 1756667043000
+ },
+ {
+ "id": 45052960,
+ "title": "C++: Strongly Happens Before?",
+ "link": "https://nekrozqliphort.github.io/posts/happens-b4/",
+ "score": 16,
+ "author": "signa11",
+ "created": "2025-08-28 14:54:37",
+ "created_at": 1756392877000
+ },
+ {
+ "id": 45087971,
+ "title": "Nintendo Switch 2 Dock USB-C Compatibility",
+ "link": "https://www.lttlabs.com/blog/2025/08/30/nintendo-switch-2-dock",
+ "score": 192,
+ "author": "croes",
+ "created": "2025-08-31 23:21:46",
+ "created_at": 1756682506000
+ },
+ {
+ "id": 45082731,
+ "title": "“This telegram must be closely paraphrased before being communicated to anyone”",
+ "link": "https://history.stackexchange.com/questions/79371/this-telegram-must-be-closely-paraphrased-before-being-communicated-to-anyone",
+ "score": 645,
+ "author": "azeemba",
+ "created": "2025-08-31 12:39:47",
+ "created_at": 1756643987000
+ },
+ {
+ "id": 45089256,
+ "title": "What Is Complexity in Chess?",
+ "link": "https://lichess.org/@/Toadofsky/blog/what-is-complexity/pKo1swFh",
+ "score": 41,
+ "author": "fzliu",
+ "created": "2025-09-01 03:45:33",
+ "created_at": 1756698333000
+ },
+ {
+ "id": 45087815,
+ "title": "Lewis and Clark marked their trail with laxatives",
+ "link": "https://offbeatoregon.com/2501d1006d_biliousPills-686.077.html",
+ "score": 141,
+ "author": "toomuchtodo",
+ "created": "2025-08-31 22:54:26",
+ "created_at": 1756680866000
+ },
+ {
+ "id": 45083952,
+ "title": "Jujutsu for everyone",
+ "link": "https://jj-for-everyone.github.io/",
+ "score": 363,
+ "author": "Bogdanp",
+ "created": "2025-08-31 15:31:04",
+ "created_at": 1756654264000
+ }
+ ]
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/css/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/css/background.css
index 7a26d1e7..894b8e82 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/css/background.css
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/css/background.css
@@ -1,203 +1,203 @@
-.background-container {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- z-index: -1;
- overflow: hidden;
- background-color: #f0f7ff;
-}
-
-/* 太阳元素 */
-.sun {
- position: absolute;
- top: 50px;
- right: 35%;
- width: 60px;
- height: 60px;
- background: radial-gradient(circle, #ffeb3b 30%, #ff9800 70%);
- border-radius: 50%;
- box-shadow: 0 0 40px rgba(255, 152, 0, 0.6);
- z-index: 0;
- animation: sun-pulse 8s ease-in-out infinite;
-}
-
-/* 蓝色云元素 */
-.cloud {
- position: absolute;
- background: rgba(135, 206, 250, 0.8);
- border-radius: 50px;
- box-shadow: 0 8px 15px rgba(0, 0, 0, 0.1);
- z-index: -1;
-}
-
-.cloud-1 {
- top: 120px;
- left: -150px;
- width: 120px;
- height: 40px;
- animation: cloud-float 15s linear infinite;
-}
-
-.cloud-2 {
- top: 180px;
- right: -150px;
- width: 160px;
- height: 50px;
- animation: cloud-float 20s linear infinite reverse;
-}
-
-.cloud-3 {
- top: 60px;
- left: -100px;
- width: 100px;
- height: 35px;
- animation: cloud-float 12s linear infinite;
-}
-
-/* 云朵的伪元素,创建更自然的形状 */
-.cloud::before,
-.cloud::after {
- content: '';
- position: absolute;
- background: rgba(135, 206, 250, 0.8);
- border-radius: 50%;
-}
-
-.cloud::before {
- width: 50px;
- height: 50px;
- top: -20px;
- left: 15px;
-}
-
-.cloud::after {
- width: 60px;
- height: 60px;
- top: -30px;
- right: 15px;
-}
-
-@keyframes sun-pulse {
- 0%, 100% {
- transform: scale(1);
- box-shadow: 0 0 40px rgba(255, 152, 0, 0.6);
- }
- 50% {
- transform: scale(1.1);
- box-shadow: 0 0 60px rgba(255, 152, 0, 0.8);
- }
-}
-
-@keyframes cloud-float {
- 0% {
- transform: translateX(-150px);
- }
- 100% {
- transform: translateX(calc(100vw + 150px));
- }
-}
-
-.modern-gradient {
- position: absolute;
- top: -50%;
- left: -50%;
- width: 200%;
- height: 200%;
- background: linear-gradient(
- 135deg,
- rgba(24, 144, 255, 0.6) 0%,
- rgba(64, 169, 255, 0.5) 20%,
- rgba(135, 208, 255, 0.4) 40%,
- rgba(255, 175, 64, 0.4) 60%,
- rgba(255, 122, 69, 0.5) 80%,
- rgba(245, 85, 65, 0.6) 100%
- );
- animation: gradient-flow 25s ease-in-out infinite;
- border-radius: 40% 60% 60% 40% / 40% 40% 60% 60%;
- filter: blur(30px);
-}
-
-.modern-gradient::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: radial-gradient(
- circle at 25% 65%,
- rgba(24, 144, 255, 0.6) 0%,
- transparent 60%
- ), radial-gradient(
- circle at 75% 35%,
- rgba(245, 85, 65, 0.5) 0%,
- transparent 60%
- );
- animation: pulse-effect 18s ease-in-out infinite alternate;
- border-radius: 40% 60% 60% 40% / 40% 40% 60% 60%;
- filter: blur(20px);
-}
-
-@keyframes gradient-flow {
- 0%, 100% {
- transform: rotate(0deg) scale(1);
- opacity: 0.8;
- }
- 25% {
- transform: rotate(90deg) scale(1.1);
- opacity: 0.6;
- }
- 50% {
- transform: rotate(180deg) scale(0.9);
- opacity: 0.9;
- }
- 75% {
- transform: rotate(270deg) scale(1.05);
- opacity: 0.7;
- }
-}
-
-@keyframes pulse-effect {
- 0% {
- transform: scale(1) rotate(0deg);
- opacity: 0.5;
- }
- 50% {
- transform: scale(1.2) rotate(180deg);
- opacity: 0.8;
- }
- 100% {
- transform: scale(1) rotate(360deg);
- opacity: 0.6;
- }
-}
-
-/* 手机端背景优化 */
-@media (max-width: 768px) {
- .modern-gradient {
- animation-duration: 25s;
- }
-
- .modern-gradient::before {
- animation-duration: 18s;
- }
-}
-
-/* 减少动画以节省电池 */
-@media (prefers-reduced-motion: reduce) {
- .modern-gradient,
- .modern-gradient::before {
- animation: none;
- }
-
- .modern-gradient {
- background: linear-gradient(
- 135deg,
- rgba(64, 169, 255, 0.3) 0%,
- rgba(255, 175, 64, 0.2) 50%,
- rgba(255, 122, 69, 0.25) 100%
- );
- }
+.background-container {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: -1;
+ overflow: hidden;
+ background-color: #f0f7ff;
+}
+
+/* 太阳元素 */
+.sun {
+ position: absolute;
+ top: 50px;
+ right: 35%;
+ width: 60px;
+ height: 60px;
+ background: radial-gradient(circle, #ffeb3b 30%, #ff9800 70%);
+ border-radius: 50%;
+ box-shadow: 0 0 40px rgba(255, 152, 0, 0.6);
+ z-index: 0;
+ animation: sun-pulse 8s ease-in-out infinite;
+}
+
+/* 蓝色云元素 */
+.cloud {
+ position: absolute;
+ background: rgba(135, 206, 250, 0.8);
+ border-radius: 50px;
+ box-shadow: 0 8px 15px rgba(0, 0, 0, 0.1);
+ z-index: -1;
+}
+
+.cloud-1 {
+ top: 120px;
+ left: -150px;
+ width: 120px;
+ height: 40px;
+ animation: cloud-float 15s linear infinite;
+}
+
+.cloud-2 {
+ top: 180px;
+ right: -150px;
+ width: 160px;
+ height: 50px;
+ animation: cloud-float 20s linear infinite reverse;
+}
+
+.cloud-3 {
+ top: 60px;
+ left: -100px;
+ width: 100px;
+ height: 35px;
+ animation: cloud-float 12s linear infinite;
+}
+
+/* 云朵的伪元素,创建更自然的形状 */
+.cloud::before,
+.cloud::after {
+ content: '';
+ position: absolute;
+ background: rgba(135, 206, 250, 0.8);
+ border-radius: 50%;
+}
+
+.cloud::before {
+ width: 50px;
+ height: 50px;
+ top: -20px;
+ left: 15px;
+}
+
+.cloud::after {
+ width: 60px;
+ height: 60px;
+ top: -30px;
+ right: 15px;
+}
+
+@keyframes sun-pulse {
+ 0%, 100% {
+ transform: scale(1);
+ box-shadow: 0 0 40px rgba(255, 152, 0, 0.6);
+ }
+ 50% {
+ transform: scale(1.1);
+ box-shadow: 0 0 60px rgba(255, 152, 0, 0.8);
+ }
+}
+
+@keyframes cloud-float {
+ 0% {
+ transform: translateX(-150px);
+ }
+ 100% {
+ transform: translateX(calc(100vw + 150px));
+ }
+}
+
+.modern-gradient {
+ position: absolute;
+ top: -50%;
+ left: -50%;
+ width: 200%;
+ height: 200%;
+ background: linear-gradient(
+ 135deg,
+ rgba(24, 144, 255, 0.6) 0%,
+ rgba(64, 169, 255, 0.5) 20%,
+ rgba(135, 208, 255, 0.4) 40%,
+ rgba(255, 175, 64, 0.4) 60%,
+ rgba(255, 122, 69, 0.5) 80%,
+ rgba(245, 85, 65, 0.6) 100%
+ );
+ animation: gradient-flow 25s ease-in-out infinite;
+ border-radius: 40% 60% 60% 40% / 40% 40% 60% 60%;
+ filter: blur(30px);
+}
+
+.modern-gradient::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: radial-gradient(
+ circle at 25% 65%,
+ rgba(24, 144, 255, 0.6) 0%,
+ transparent 60%
+ ), radial-gradient(
+ circle at 75% 35%,
+ rgba(245, 85, 65, 0.5) 0%,
+ transparent 60%
+ );
+ animation: pulse-effect 18s ease-in-out infinite alternate;
+ border-radius: 40% 60% 60% 40% / 40% 40% 60% 60%;
+ filter: blur(20px);
+}
+
+@keyframes gradient-flow {
+ 0%, 100% {
+ transform: rotate(0deg) scale(1);
+ opacity: 0.8;
+ }
+ 25% {
+ transform: rotate(90deg) scale(1.1);
+ opacity: 0.6;
+ }
+ 50% {
+ transform: rotate(180deg) scale(0.9);
+ opacity: 0.9;
+ }
+ 75% {
+ transform: rotate(270deg) scale(1.05);
+ opacity: 0.7;
+ }
+}
+
+@keyframes pulse-effect {
+ 0% {
+ transform: scale(1) rotate(0deg);
+ opacity: 0.5;
+ }
+ 50% {
+ transform: scale(1.2) rotate(180deg);
+ opacity: 0.8;
+ }
+ 100% {
+ transform: scale(1) rotate(360deg);
+ opacity: 0.6;
+ }
+}
+
+/* 手机端背景优化 */
+@media (max-width: 768px) {
+ .modern-gradient {
+ animation-duration: 25s;
+ }
+
+ .modern-gradient::before {
+ animation-duration: 18s;
+ }
+}
+
+/* 减少动画以节省电池 */
+@media (prefers-reduced-motion: reduce) {
+ .modern-gradient,
+ .modern-gradient::before {
+ animation: none;
+ }
+
+ .modern-gradient {
+ background: linear-gradient(
+ 135deg,
+ rgba(64, 169, 255, 0.3) 0%,
+ rgba(255, 175, 64, 0.2) 50%,
+ rgba(255, 122, 69, 0.25) 100%
+ );
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/css/style.css b/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/css/style.css
index d172b7e7..69b0bab6 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/css/style.css
@@ -1,352 +1,352 @@
-/* 背景样式 */
-.background-container {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- z-index: -1;
- overflow: hidden;
- background-color: #f8f9fa;
-}
-
-.modern-gradient {
- position: absolute;
- top: -50%;
- left: -50%;
- width: 200%;
- height: 200%;
- background: linear-gradient(
- 135deg,
- rgba(64, 169, 255, 0.4) 0%,
- rgba(120, 192, 255, 0.3) 25%,
- rgba(255, 175, 64, 0.2) 50%,
- rgba(255, 140, 50, 0.3) 75%,
- rgba(255, 122, 69, 0.4) 100%
- );
- animation: gradient-flow 20s ease-in-out infinite;
- border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
-}
-
-.modern-gradient::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: radial-gradient(
- circle at 30% 70%,
- rgba(64, 169, 255, 0.5) 0%,
- transparent 50%
- ), radial-gradient(
- circle at 70% 30%,
- rgba(255, 140, 50, 0.4) 0%,
- transparent 50%
- );
- animation: pulse-effect 15s ease-in-out infinite alternate;
- border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
-}
-
-@keyframes gradient-flow {
- 0%, 100% {
- transform: rotate(0deg) scale(1);
- opacity: 0.8;
- }
- 25% {
- transform: rotate(90deg) scale(1.1);
- opacity: 0.6;
- }
- 50% {
- transform: rotate(180deg) scale(0.9);
- opacity: 0.9;
- }
- 75% {
- transform: rotate(270deg) scale(1.05);
- opacity: 0.7;
- }
-}
-
-@keyframes pulse-effect {
- 0% {
- transform: scale(1) rotate(0deg);
- opacity: 0.5;
- }
- 50% {
- transform: scale(1.2) rotate(180deg);
- opacity: 0.8;
- }
- 100% {
- transform: scale(1) rotate(360deg);
- opacity: 0.6;
- }
-}
-
-/* 主样式 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
- color: #333;
- background-color: #f0f7ff;
- position: relative;
- min-height: 100vh;
-}
-
-.container {
- max-width: 800px;
- margin: 20px auto;
- padding: 28px;
- position: relative;
- z-index: 1;
- background-color: rgba(255, 255, 255, 0.8);
- border-radius: 24px;
- box-shadow: 0 15px 40px rgba(0, 0, 0, 0.1);
- backdrop-filter: blur(15px);
- border: 1px solid rgba(255, 255, 255, 0.6);
-}
-
-header {
- text-align: center;
- margin-bottom: 32px;
- padding-bottom: 24px;
- border-bottom: 1px solid rgba(0, 0, 0, 0.04);
-}
-
-header h1 {
- background: linear-gradient(135deg, #1890ff, #ff7a45);
- -webkit-background-clip: text;
- background-clip: text;
- color: transparent;
- margin-bottom: 16px;
- font-size: 2.6rem;
- font-weight: 800;
- letter-spacing: -0.5px;
- text-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
-}
-
-.update-time {
- color: #666;
- font-size: 0.9rem;
- background-color: rgba(255, 255, 255, 0.7);
- padding: 10px 20px;
- border-radius: 30px;
- display: inline-block;
- box-shadow: 0 4px 15px rgba(0, 0, 0, 0.05);
- border: 1px solid rgba(255, 255, 255, 0.8);
-}
-
-.hot-list {
- list-style: none;
-}
-
-.hot-item {
- padding: 22px;
- margin-bottom: 20px;
- border-radius: 16px;
- background-color: white;
- box-shadow: 0 8px 20px rgba(0, 0, 0, 0.06);
- transition: all 0.3s ease;
- display: flex;
- align-items: center;
- border: 1px solid rgba(255, 255, 255, 0.8);
-}
-
-.hot-item:hover {
- transform: translateY(-3px);
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
- border-color: rgba(64, 169, 255, 0.3);
-}
-
-.hot-rank {
- font-size: 1.2rem;
- font-weight: bold;
- color: #4096ff;
- margin-right: 18px;
- min-width: 38px;
- text-align: center;
- background-color: rgba(64, 169, 255, 0.1);
- border-radius: 50%;
- width: 38px;
- height: 38px;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.hot-rank.top-1 {
- background: linear-gradient(135deg, #ff4d4f, #ff7a45);
- color: white;
-}
-
-.hot-rank.top-2 {
- background: linear-gradient(135deg, #ff7a45, #ffa940);
- color: white;
-}
-
-.hot-rank.top-3 {
- background: linear-gradient(135deg, #ffa940, #ffec3d);
- color: white;
-}
-
-.hot-content {
- flex: 1;
-}
-
-.hot-title {
- font-size: 1.15rem;
- margin-bottom: 8px;
- color: #333;
- text-decoration: none;
- display: block;
- line-height: 1.5;
- font-weight: 500;
- transition: color 0.2s ease;
-}
-
-.hot-title:hover {
- color: #4096ff;
- text-decoration: none;
-}
-
-.loading {
- text-align: center;
- padding: 40px;
- color: #666;
- font-size: 1.1rem;
-}
-
-footer {
- text-align: center;
- margin-top: 30px;
- padding-top: 20px;
- border-top: 1px solid rgba(0, 0, 0, 0.06);
- color: #666;
- font-size: 0.9rem;
-}
-
-/* 响应式设计 */
-@media (max-width: 1024px) and (min-width: 768px) {
- .container {
- max-width: 90%;
- padding: 20px;
- }
-
- header h1 {
- font-size: 2.2rem;
- }
-
- .hot-item {
- padding: 18px;
- }
-
- .hot-title {
- font-size: 1.1rem;
- }
-}
-
-@media (max-width: 768px) {
- body {
- background-color: #f8f9fa;
- }
-
- .container {
- max-width: 95%;
- margin: 12px auto;
- padding: 16px;
- border-radius: 12px;
- }
-
- header {
- margin-bottom: 20px;
- padding-bottom: 16px;
- }
-
- header h1 {
- font-size: 1.8rem;
- margin-bottom: 10px;
- }
-
- .update-time {
- font-size: 0.85rem;
- padding: 6px 12px;
- }
-
- .hot-item {
- padding: 16px;
- margin-bottom: 12px;
- border-radius: 10px;
- flex-direction: row;
- align-items: flex-start;
- }
-
- .hot-rank {
- font-size: 1.1rem;
- margin-right: 14px;
- min-width: 32px;
- width: 32px;
- height: 32px;
- margin-top: 2px;
- }
-
- .hot-title {
- font-size: 1rem;
- line-height: 1.5;
- margin-bottom: 6px;
- }
-
- footer {
- margin-top: 24px;
- padding-top: 16px;
- font-size: 0.85rem;
- }
-}
-
-@media (max-width: 480px) {
- .container {
- margin: 8px auto;
- padding: 14px;
- }
-
- header h1 {
- font-size: 1.6rem;
- }
-
- .hot-item {
- padding: 14px;
- margin-bottom: 10px;
- }
-
- .hot-rank {
- font-size: 1rem;
- margin-right: 12px;
- min-width: 30px;
- width: 30px;
- height: 30px;
- }
-
- .hot-title {
- font-size: 0.95rem;
- }
-}
-
-/* 减少动画以节省电池 */
-@media (prefers-reduced-motion: reduce) {
- .modern-gradient,
- .modern-gradient::before {
- animation: none;
- }
-
- .modern-gradient {
- background: linear-gradient(
- 135deg,
- rgba(64, 169, 255, 0.3) 0%,
- rgba(255, 175, 64, 0.2) 50%,
- rgba(255, 122, 69, 0.25) 100%
- );
- }
+/* 背景样式 */
+.background-container {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: -1;
+ overflow: hidden;
+ background-color: #f8f9fa;
+}
+
+.modern-gradient {
+ position: absolute;
+ top: -50%;
+ left: -50%;
+ width: 200%;
+ height: 200%;
+ background: linear-gradient(
+ 135deg,
+ rgba(64, 169, 255, 0.4) 0%,
+ rgba(120, 192, 255, 0.3) 25%,
+ rgba(255, 175, 64, 0.2) 50%,
+ rgba(255, 140, 50, 0.3) 75%,
+ rgba(255, 122, 69, 0.4) 100%
+ );
+ animation: gradient-flow 20s ease-in-out infinite;
+ border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
+}
+
+.modern-gradient::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: radial-gradient(
+ circle at 30% 70%,
+ rgba(64, 169, 255, 0.5) 0%,
+ transparent 50%
+ ), radial-gradient(
+ circle at 70% 30%,
+ rgba(255, 140, 50, 0.4) 0%,
+ transparent 50%
+ );
+ animation: pulse-effect 15s ease-in-out infinite alternate;
+ border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
+}
+
+@keyframes gradient-flow {
+ 0%, 100% {
+ transform: rotate(0deg) scale(1);
+ opacity: 0.8;
+ }
+ 25% {
+ transform: rotate(90deg) scale(1.1);
+ opacity: 0.6;
+ }
+ 50% {
+ transform: rotate(180deg) scale(0.9);
+ opacity: 0.9;
+ }
+ 75% {
+ transform: rotate(270deg) scale(1.05);
+ opacity: 0.7;
+ }
+}
+
+@keyframes pulse-effect {
+ 0% {
+ transform: scale(1) rotate(0deg);
+ opacity: 0.5;
+ }
+ 50% {
+ transform: scale(1.2) rotate(180deg);
+ opacity: 0.8;
+ }
+ 100% {
+ transform: scale(1) rotate(360deg);
+ opacity: 0.6;
+ }
+}
+
+/* 主样式 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
+ color: #333;
+ background-color: #f0f7ff;
+ position: relative;
+ min-height: 100vh;
+}
+
+.container {
+ max-width: 800px;
+ margin: 20px auto;
+ padding: 28px;
+ position: relative;
+ z-index: 1;
+ background-color: rgba(255, 255, 255, 0.8);
+ border-radius: 24px;
+ box-shadow: 0 15px 40px rgba(0, 0, 0, 0.1);
+ backdrop-filter: blur(15px);
+ border: 1px solid rgba(255, 255, 255, 0.6);
+}
+
+header {
+ text-align: center;
+ margin-bottom: 32px;
+ padding-bottom: 24px;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.04);
+}
+
+header h1 {
+ background: linear-gradient(135deg, #1890ff, #ff7a45);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+ margin-bottom: 16px;
+ font-size: 2.6rem;
+ font-weight: 800;
+ letter-spacing: -0.5px;
+ text-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
+}
+
+.update-time {
+ color: #666;
+ font-size: 0.9rem;
+ background-color: rgba(255, 255, 255, 0.7);
+ padding: 10px 20px;
+ border-radius: 30px;
+ display: inline-block;
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.05);
+ border: 1px solid rgba(255, 255, 255, 0.8);
+}
+
+.hot-list {
+ list-style: none;
+}
+
+.hot-item {
+ padding: 22px;
+ margin-bottom: 20px;
+ border-radius: 16px;
+ background-color: white;
+ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.06);
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ border: 1px solid rgba(255, 255, 255, 0.8);
+}
+
+.hot-item:hover {
+ transform: translateY(-3px);
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
+ border-color: rgba(64, 169, 255, 0.3);
+}
+
+.hot-rank {
+ font-size: 1.2rem;
+ font-weight: bold;
+ color: #4096ff;
+ margin-right: 18px;
+ min-width: 38px;
+ text-align: center;
+ background-color: rgba(64, 169, 255, 0.1);
+ border-radius: 50%;
+ width: 38px;
+ height: 38px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.hot-rank.top-1 {
+ background: linear-gradient(135deg, #ff4d4f, #ff7a45);
+ color: white;
+}
+
+.hot-rank.top-2 {
+ background: linear-gradient(135deg, #ff7a45, #ffa940);
+ color: white;
+}
+
+.hot-rank.top-3 {
+ background: linear-gradient(135deg, #ffa940, #ffec3d);
+ color: white;
+}
+
+.hot-content {
+ flex: 1;
+}
+
+.hot-title {
+ font-size: 1.15rem;
+ margin-bottom: 8px;
+ color: #333;
+ text-decoration: none;
+ display: block;
+ line-height: 1.5;
+ font-weight: 500;
+ transition: color 0.2s ease;
+}
+
+.hot-title:hover {
+ color: #4096ff;
+ text-decoration: none;
+}
+
+.loading {
+ text-align: center;
+ padding: 40px;
+ color: #666;
+ font-size: 1.1rem;
+}
+
+footer {
+ text-align: center;
+ margin-top: 30px;
+ padding-top: 20px;
+ border-top: 1px solid rgba(0, 0, 0, 0.06);
+ color: #666;
+ font-size: 0.9rem;
+}
+
+/* 响应式设计 */
+@media (max-width: 1024px) and (min-width: 768px) {
+ .container {
+ max-width: 90%;
+ padding: 20px;
+ }
+
+ header h1 {
+ font-size: 2.2rem;
+ }
+
+ .hot-item {
+ padding: 18px;
+ }
+
+ .hot-title {
+ font-size: 1.1rem;
+ }
+}
+
+@media (max-width: 768px) {
+ body {
+ background-color: #f8f9fa;
+ }
+
+ .container {
+ max-width: 95%;
+ margin: 12px auto;
+ padding: 16px;
+ border-radius: 12px;
+ }
+
+ header {
+ margin-bottom: 20px;
+ padding-bottom: 16px;
+ }
+
+ header h1 {
+ font-size: 1.8rem;
+ margin-bottom: 10px;
+ }
+
+ .update-time {
+ font-size: 0.85rem;
+ padding: 6px 12px;
+ }
+
+ .hot-item {
+ padding: 16px;
+ margin-bottom: 12px;
+ border-radius: 10px;
+ flex-direction: row;
+ align-items: flex-start;
+ }
+
+ .hot-rank {
+ font-size: 1.1rem;
+ margin-right: 14px;
+ min-width: 32px;
+ width: 32px;
+ height: 32px;
+ margin-top: 2px;
+ }
+
+ .hot-title {
+ font-size: 1rem;
+ line-height: 1.5;
+ margin-bottom: 6px;
+ }
+
+ footer {
+ margin-top: 24px;
+ padding-top: 16px;
+ font-size: 0.85rem;
+ }
+}
+
+@media (max-width: 480px) {
+ .container {
+ margin: 8px auto;
+ padding: 14px;
+ }
+
+ header h1 {
+ font-size: 1.6rem;
+ }
+
+ .hot-item {
+ padding: 14px;
+ margin-bottom: 10px;
+ }
+
+ .hot-rank {
+ font-size: 1rem;
+ margin-right: 12px;
+ min-width: 30px;
+ width: 30px;
+ height: 30px;
+ }
+
+ .hot-title {
+ font-size: 0.95rem;
+ }
+}
+
+/* 减少动画以节省电池 */
+@media (prefers-reduced-motion: reduce) {
+ .modern-gradient,
+ .modern-gradient::before {
+ animation: none;
+ }
+
+ .modern-gradient {
+ background: linear-gradient(
+ 135deg,
+ rgba(64, 169, 255, 0.3) 0%,
+ rgba(255, 175, 64, 0.2) 50%,
+ rgba(255, 122, 69, 0.25) 100%
+ );
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/index.html
index 5c58a175..f83e14c7 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/index.html
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/index.html
@@ -1,34 +1,34 @@
-
-
-
-
-
- 哔哩哔哩热搜榜
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ 哔哩哔哩热搜榜
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/js/main.js b/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/js/main.js
index 7de0e4b9..642848e0 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/js/main.js
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/js/main.js
@@ -1,130 +1,130 @@
-// API接口列表
-const API_ENDPOINTS = [
- "https://60s.api.shumengya.top/v2/bili"
-];
-
-// 当前使用的API索引
-let currentApiIndex = 0;
-
-// DOM元素
-const hotListElement = document.getElementById('hotList');
-const updateTimeElement = document.getElementById('updateTime');
-
-// 格式化时间
-function formatDate(date) {
- const year = date.getFullYear();
- const month = String(date.getMonth() + 1).padStart(2, '0');
- const day = String(date.getDate()).padStart(2, '0');
- const hours = String(date.getHours()).padStart(2, '0');
- const minutes = String(date.getMinutes()).padStart(2, '0');
- const seconds = String(date.getSeconds()).padStart(2, '0');
-
- return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
-}
-
-// 渲染热搜列表
-function renderHotList(data) {
- hotListElement.innerHTML = '';
-
- data.forEach((item, index) => {
- const hotItem = document.createElement('div');
- hotItem.className = 'hot-item';
-
- const rankClass = index < 3 ? `top-${index + 1}` : '';
-
- hotItem.innerHTML = `
- ${index + 1}
-
- `;
-
- hotListElement.appendChild(hotItem);
- });
-
- // 更新时间
- updateTimeElement.textContent = `更新时间:${formatDate(new Date())}`;
-}
-
-// 显示加载状态
-function showLoading() {
- hotListElement.innerHTML = '加载中...
';
-}
-
-// 显示错误状态
-function showError(message) {
- hotListElement.innerHTML = `${message}
`;
-}
-
-// 获取哔哩哔哩热搜数据
-async function fetchBiliHotList() {
- showLoading();
-
- try {
- const response = await fetch(API_ENDPOINTS[currentApiIndex]);
-
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
- }
-
- const result = await response.json();
-
- if (result.code === 200 && result.data && Array.isArray(result.data)) {
- if (result.data.length > 0) {
- renderHotList(result.data);
- } else {
- showError('暂无热搜数据');
- }
- } else {
- throw new Error('数据格式错误或无数据');
- }
- } catch (error) {
- console.error('获取数据失败:', error);
-
- // 尝试切换到下一个API
- const nextApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length;
-
- if (nextApiIndex !== 0) {
- // 还有其他API可以尝试
- currentApiIndex = nextApiIndex;
- showError('获取数据失败,正在尝试其他接口...');
-
- // 延迟后重试
- setTimeout(fetchBiliHotList, 2000);
- } else {
- // 所有API都尝试过了
- currentApiIndex = 0;
- showError('所有接口都无法访问,请稍后再试');
- }
- }
-}
-
-// 手动刷新数据
-function refreshData() {
- currentApiIndex = 0; // 重置API索引
- fetchBiliHotList();
-}
-
-// 页面加载完成后获取数据
-document.addEventListener('DOMContentLoaded', () => {
- fetchBiliHotList();
-
- // 每隔5分钟刷新一次数据
- setInterval(fetchBiliHotList, 5 * 60 * 1000);
-
- // 添加键盘快捷键支持(按R键刷新)
- document.addEventListener('keydown', (event) => {
- if (event.key === 'r' || event.key === 'R') {
- event.preventDefault();
- refreshData();
- }
- });
-});
-
-// 页面可见性变化时的处理
-document.addEventListener('visibilitychange', () => {
- if (!document.hidden) {
- // 页面重新可见时刷新数据
- refreshData();
- }
+// API接口列表
+const API_ENDPOINTS = [
+ "https://60s.api.shumengya.top/v2/bili"
+];
+
+// 当前使用的API索引
+let currentApiIndex = 0;
+
+// DOM元素
+const hotListElement = document.getElementById('hotList');
+const updateTimeElement = document.getElementById('updateTime');
+
+// 格式化时间
+function formatDate(date) {
+ const year = date.getFullYear();
+ const month = String(date.getMonth() + 1).padStart(2, '0');
+ const day = String(date.getDate()).padStart(2, '0');
+ const hours = String(date.getHours()).padStart(2, '0');
+ const minutes = String(date.getMinutes()).padStart(2, '0');
+ const seconds = String(date.getSeconds()).padStart(2, '0');
+
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+}
+
+// 渲染热搜列表
+function renderHotList(data) {
+ hotListElement.innerHTML = '';
+
+ data.forEach((item, index) => {
+ const hotItem = document.createElement('div');
+ hotItem.className = 'hot-item';
+
+ const rankClass = index < 3 ? `top-${index + 1}` : '';
+
+ hotItem.innerHTML = `
+ ${index + 1}
+
+ `;
+
+ hotListElement.appendChild(hotItem);
+ });
+
+ // 更新时间
+ updateTimeElement.textContent = `更新时间:${formatDate(new Date())}`;
+}
+
+// 显示加载状态
+function showLoading() {
+ hotListElement.innerHTML = '加载中...
';
+}
+
+// 显示错误状态
+function showError(message) {
+ hotListElement.innerHTML = `${message}
`;
+}
+
+// 获取哔哩哔哩热搜数据
+async function fetchBiliHotList() {
+ showLoading();
+
+ try {
+ const response = await fetch(API_ENDPOINTS[currentApiIndex]);
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+ }
+
+ const result = await response.json();
+
+ if (result.code === 200 && result.data && Array.isArray(result.data)) {
+ if (result.data.length > 0) {
+ renderHotList(result.data);
+ } else {
+ showError('暂无热搜数据');
+ }
+ } else {
+ throw new Error('数据格式错误或无数据');
+ }
+ } catch (error) {
+ console.error('获取数据失败:', error);
+
+ // 尝试切换到下一个API
+ const nextApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length;
+
+ if (nextApiIndex !== 0) {
+ // 还有其他API可以尝试
+ currentApiIndex = nextApiIndex;
+ showError('获取数据失败,正在尝试其他接口...');
+
+ // 延迟后重试
+ setTimeout(fetchBiliHotList, 2000);
+ } else {
+ // 所有API都尝试过了
+ currentApiIndex = 0;
+ showError('所有接口都无法访问,请稍后再试');
+ }
+ }
+}
+
+// 手动刷新数据
+function refreshData() {
+ currentApiIndex = 0; // 重置API索引
+ fetchBiliHotList();
+}
+
+// 页面加载完成后获取数据
+document.addEventListener('DOMContentLoaded', () => {
+ fetchBiliHotList();
+
+ // 每隔5分钟刷新一次数据
+ setInterval(fetchBiliHotList, 5 * 60 * 1000);
+
+ // 添加键盘快捷键支持(按R键刷新)
+ document.addEventListener('keydown', (event) => {
+ if (event.key === 'r' || event.key === 'R') {
+ event.preventDefault();
+ refreshData();
+ }
+ });
+});
+
+// 页面可见性变化时的处理
+document.addEventListener('visibilitychange', () => {
+ if (!document.hidden) {
+ // 页面重新可见时刷新数据
+ refreshData();
+ }
});
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/接口集合.json b/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/接口集合.json
index 084d6336..07ea2fd8 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/接口集合.json
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/接口集合.json
@@ -1,3 +1,3 @@
-[
- "https://60s.api.shumengya.top"
-]
+[
+ "https://60s.api.shumengya.top"
+]
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/返回接口.json
index e377277d..e14dc7f1 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/哔哩哔哩热搜榜/返回接口.json
@@ -1,18 +1,18 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": [
- {
- "title": "18次阅兵76年逆袭路",
- "link": "https://search.bilibili.com/all?keyword=18%E6%AC%A1%E9%98%85%E5%85%B576%E5%B9%B4%E9%80%86%E8%A2%AD%E8%B7%AF"
- },
- {
- "title": "80年前的今天日本签署投降书",
- "link": "https://search.bilibili.com/all?keyword=80%E5%B9%B4%E5%89%8D%E7%9A%84%E4%BB%8A%E5%A4%A9%E6%97%A5%E6%9C%AC%E7%AD%BE%E7%BD%B2%E6%8A%95%E9%99%8D%E4%B9%A6"
- },
- {
- "title": "九三阅兵具体安排公布",
- "link": "https://search.bilibili.com/all?keyword=%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5%E5%85%B7%E4%BD%93%E5%AE%89%E6%8E%92%E5%85%AC%E5%B8%83"
- }
- ]
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": [
+ {
+ "title": "18次阅兵76年逆袭路",
+ "link": "https://search.bilibili.com/all?keyword=18%E6%AC%A1%E9%98%85%E5%85%B576%E5%B9%B4%E9%80%86%E8%A2%AD%E8%B7%AF"
+ },
+ {
+ "title": "80年前的今天日本签署投降书",
+ "link": "https://search.bilibili.com/all?keyword=80%E5%B9%B4%E5%89%8D%E7%9A%84%E4%BB%8A%E5%A4%A9%E6%97%A5%E6%9C%AC%E7%AD%BE%E7%BD%B2%E6%8A%95%E9%99%8D%E4%B9%A6"
+ },
+ {
+ "title": "九三阅兵具体安排公布",
+ "link": "https://search.bilibili.com/all?keyword=%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5%E5%85%B7%E4%BD%93%E5%AE%89%E6%8E%92%E5%85%AC%E5%B8%83"
+ }
+ ]
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/css/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/css/background.css
index 2c0951fb..b8af5266 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/css/background.css
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/css/background.css
@@ -1,107 +1,107 @@
-.background-container {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- z-index: -1;
- overflow: hidden;
-}
-
-.green-gradient {
- position: absolute;
- top: -50%;
- left: -50%;
- width: 200%;
- height: 200%;
- background: linear-gradient(
- 135deg,
- rgba(168, 230, 207, 0.3) 0%,
- rgba(220, 237, 193, 0.2) 25%,
- rgba(200, 245, 200, 0.1) 50%,
- rgba(180, 235, 180, 0.2) 75%,
- rgba(168, 230, 207, 0.3) 100%
- );
- animation: green-flow 20s ease-in-out infinite;
-}
-
-.green-gradient::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: radial-gradient(
- circle at 30% 70%,
- rgba(129, 199, 132, 0.3) 0%,
- transparent 50%
- ), radial-gradient(
- circle at 70% 30%,
- rgba(165, 214, 167, 0.25) 0%,
- transparent 50%
- );
- animation: green-pulse 15s ease-in-out infinite alternate;
-}
-
-@keyframes green-flow {
- 0%, 100% {
- transform: rotate(0deg) scale(1);
- opacity: 0.8;
- }
- 25% {
- transform: rotate(90deg) scale(1.1);
- opacity: 0.6;
- }
- 50% {
- transform: rotate(180deg) scale(0.9);
- opacity: 0.9;
- }
- 75% {
- transform: rotate(270deg) scale(1.05);
- opacity: 0.7;
- }
-}
-
-@keyframes green-pulse {
- 0% {
- transform: scale(1) rotate(0deg);
- opacity: 0.5;
- }
- 50% {
- transform: scale(1.2) rotate(180deg);
- opacity: 0.8;
- }
- 100% {
- transform: scale(1) rotate(360deg);
- opacity: 0.6;
- }
-}
-
-/* 手机端背景优化 */
-@media (max-width: 768px) {
- .green-gradient {
- animation-duration: 25s;
- }
-
- .green-gradient::before {
- animation-duration: 18s;
- }
-}
-
-/* 减少动画以节省电池 */
-@media (prefers-reduced-motion: reduce) {
- .green-gradient,
- .green-gradient::before {
- animation: none;
- }
-
- .green-gradient {
- background: linear-gradient(
- 135deg,
- rgba(76, 175, 80, 0.2) 0%,
- rgba(165, 214, 167, 0.1) 50%,
- rgba(200, 230, 201, 0.15) 100%
- );
- }
+.background-container {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: -1;
+ overflow: hidden;
+}
+
+.green-gradient {
+ position: absolute;
+ top: -50%;
+ left: -50%;
+ width: 200%;
+ height: 200%;
+ background: linear-gradient(
+ 135deg,
+ rgba(168, 230, 207, 0.3) 0%,
+ rgba(220, 237, 193, 0.2) 25%,
+ rgba(200, 245, 200, 0.1) 50%,
+ rgba(180, 235, 180, 0.2) 75%,
+ rgba(168, 230, 207, 0.3) 100%
+ );
+ animation: green-flow 20s ease-in-out infinite;
+}
+
+.green-gradient::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: radial-gradient(
+ circle at 30% 70%,
+ rgba(129, 199, 132, 0.3) 0%,
+ transparent 50%
+ ), radial-gradient(
+ circle at 70% 30%,
+ rgba(165, 214, 167, 0.25) 0%,
+ transparent 50%
+ );
+ animation: green-pulse 15s ease-in-out infinite alternate;
+}
+
+@keyframes green-flow {
+ 0%, 100% {
+ transform: rotate(0deg) scale(1);
+ opacity: 0.8;
+ }
+ 25% {
+ transform: rotate(90deg) scale(1.1);
+ opacity: 0.6;
+ }
+ 50% {
+ transform: rotate(180deg) scale(0.9);
+ opacity: 0.9;
+ }
+ 75% {
+ transform: rotate(270deg) scale(1.05);
+ opacity: 0.7;
+ }
+}
+
+@keyframes green-pulse {
+ 0% {
+ transform: scale(1) rotate(0deg);
+ opacity: 0.5;
+ }
+ 50% {
+ transform: scale(1.2) rotate(180deg);
+ opacity: 0.8;
+ }
+ 100% {
+ transform: scale(1) rotate(360deg);
+ opacity: 0.6;
+ }
+}
+
+/* 手机端背景优化 */
+@media (max-width: 768px) {
+ .green-gradient {
+ animation-duration: 25s;
+ }
+
+ .green-gradient::before {
+ animation-duration: 18s;
+ }
+}
+
+/* 减少动画以节省电池 */
+@media (prefers-reduced-motion: reduce) {
+ .green-gradient,
+ .green-gradient::before {
+ animation: none;
+ }
+
+ .green-gradient {
+ background: linear-gradient(
+ 135deg,
+ rgba(76, 175, 80, 0.2) 0%,
+ rgba(165, 214, 167, 0.1) 50%,
+ rgba(200, 230, 201, 0.15) 100%
+ );
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/css/style.css b/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/css/style.css
index 7974d204..fb74134e 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/css/style.css
@@ -1,571 +1,571 @@
-/* 背景样式 */
-.background-container {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- z-index: -1;
- overflow: hidden;
- background-color: #f8f9fa;
-}
-
-.modern-gradient {
- position: absolute;
- top: -50%;
- left: -50%;
- width: 200%;
- height: 200%;
- background: linear-gradient(
- 135deg,
- rgba(168, 230, 207, 0.3) 0%,
- rgba(220, 237, 193, 0.25) 25%,
- rgba(200, 245, 200, 0.15) 50%,
- rgba(180, 235, 180, 0.25) 75%,
- rgba(168, 230, 207, 0.3) 100%
- );
- animation: gradient-flow 20s ease-in-out infinite;
- border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
-}
-
-.modern-gradient::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: radial-gradient(
- circle at 30% 70%,
- rgba(129, 199, 132, 0.4) 0%,
- transparent 50%
- ), radial-gradient(
- circle at 70% 30%,
- rgba(165, 214, 167, 0.3) 0%,
- transparent 50%
- );
- animation: pulse-effect 15s ease-in-out infinite alternate;
- border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
-}
-
-@keyframes gradient-flow {
- 0%, 100% {
- transform: rotate(0deg) scale(1);
- opacity: 0.8;
- }
- 25% {
- transform: rotate(90deg) scale(1.1);
- opacity: 0.6;
- }
- 50% {
- transform: rotate(180deg) scale(0.9);
- opacity: 0.9;
- }
- 75% {
- transform: rotate(270deg) scale(1.05);
- opacity: 0.7;
- }
-}
-
-@keyframes pulse-effect {
- 0% {
- transform: scale(1) rotate(0deg);
- opacity: 0.5;
- }
- 50% {
- transform: scale(1.2) rotate(180deg);
- opacity: 0.8;
- }
- 100% {
- transform: scale(1) rotate(360deg);
- opacity: 0.6;
- }
-}
-
-/* 主样式 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
- color: #333;
- background-color: #f8f9fa;
- position: relative;
- min-height: 100vh;
-}
-
-/* 几何装饰样式 */
-.title-container {
- display: flex;
- align-items: center;
- justify-content: center;
- margin-bottom: 10px;
-}
-
-.geometric-decoration {
- font-size: 16px;
- color: #81c784;
- margin: 0 10px;
- font-weight: normal;
- letter-spacing: 3px;
- text-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
- opacity: 0.6;
-}
-
-.geometric-decoration.left {
- transform: rotate(-10deg);
-}
-
-.geometric-decoration.right {
- transform: rotate(10deg);
-}
-
-@keyframes float-effect {
- 0% {
- transform: translateY(0) rotate(-10deg);
- }
- 100% {
- transform: translateY(-5px) rotate(-8deg);
- }
-}
-
-.update-time-container {
- display: flex;
- align-items: center;
- justify-content: center;
- margin-top: 10px;
-}
-
-.time-decoration {
- font-size: 14px;
- color: #a5d6a7;
- margin: 0 8px;
- font-weight: normal;
- letter-spacing: 2px;
- text-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
- opacity: 0.5;
-}
-
-@keyframes pulse {
- 0% {
- opacity: 0.5;
- transform: scale(0.8);
- }
- 50% {
- opacity: 1;
- transform: scale(1.2);
- }
- 100% {
- opacity: 0.5;
- transform: scale(0.8);
- }
-}
-
-.geometric-header, .geometric-footer {
- text-align: center;
- color: #a5d6a7;
- margin: 10px 0;
- font-size: 14px;
- letter-spacing: 2px;
- opacity: 0.5;
-}
-
-.geometric-header {
- margin-bottom: 20px;
-}
-
-.geometric-footer {
- margin-top: 20px;
-}
-
-.container {
- max-width: 800px;
- margin: 0 auto;
- padding: 24px;
- position: relative;
- z-index: 1;
- background-color: rgba(255, 255, 255, 0.85);
- border-radius: 16px;
- box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08);
- backdrop-filter: blur(10px);
- border: 1px solid rgba(129, 199, 132, 0.2);
- position: relative;
-}
-
-.container::before,
-.container::after {
- content: '';
- position: absolute;
- width: 30px;
- height: 30px;
- border-color: #a5d6a7;
- opacity: 0.7;
-}
-
-.container::before {
- top: 10px;
- left: 10px;
- border-top: 3px solid;
- border-left: 3px solid;
- border-radius: 10px 0 0 0;
-}
-
-.container::after {
- bottom: 10px;
- right: 10px;
- border-bottom: 3px solid;
- border-right: 3px solid;
- border-radius: 0 0 10px 0;
-}
-
-header {
- text-align: center;
- margin-bottom: 28px;
- padding-bottom: 20px;
- border-bottom: 1px solid rgba(0, 0, 0, 0.06);
-}
-
-header h1 {
- background: linear-gradient(135deg, #66bb6a, #81c784);
- -webkit-background-clip: text;
- background-clip: text;
- color: transparent;
- margin-bottom: 14px;
- font-size: 2.4rem;
- font-weight: 700;
- letter-spacing: -0.5px;
-}
-
-.update-time {
- color: #666;
- font-size: 0.9rem;
- background-color: rgba(0, 0, 0, 0.03);
- padding: 8px 16px;
- border-radius: 24px;
- display: inline-block;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
- position: relative;
- border: 1px dashed rgba(129, 199, 132, 0.3);
-}
-
-.update-time::before {
- content: '';
- position: absolute;
- top: -5px;
- left: -5px;
- right: -5px;
- bottom: -5px;
- border: 1px solid rgba(129, 199, 132, 0.3);
- border-radius: 28px;
- animation: pulse-border 2s infinite;
- pointer-events: none;
-}
-
-@keyframes pulse-border {
- 0% {
- transform: scale(1);
- opacity: 0.7;
- }
- 50% {
- transform: scale(1.05);
- opacity: 0.3;
- }
- 100% {
- transform: scale(1);
- opacity: 0.7;
- }
-}
-
-.hot-list {
- list-style: none;
-}
-
-.hot-item {
- padding: 20px;
- margin-bottom: 16px;
- border-radius: 12px;
- background-color: white;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04);
- transition: all 0.3s ease;
- display: flex;
- align-items: center;
- border: 1px solid rgba(0, 0, 0, 0.03);
- position: relative;
- overflow: hidden;
-}
-
-.hot-item::before {
- content: '◆';
- position: absolute;
- top: 5px;
- right: 10px;
- color: #a5d6a7;
- opacity: 0.15;
- font-size: 12px;
-}
-
-.hot-item::after {
- content: '◆';
- position: absolute;
- bottom: 5px;
- left: 10px;
- color: #a5d6a7;
- opacity: 0.15;
- font-size: 12px;
-}
-
-.even-item {
- border-left: 2px solid #81c784;
-}
-
-.odd-item {
- border-right: 2px solid #81c784;
-}
-
-.title-decoration {
- color: #81c784;
- font-weight: normal;
- margin-right: 5px;
- display: inline-block;
- transform: translateY(1px);
- opacity: 0.7;
-}
-
-.source-icon, .time-icon {
- color: #81c784;
- font-size: 14px;
- margin-right: 3px;
- opacity: 0.6;
-}
-
-.hot-title {
- position: relative;
- display: inline-flex;
- align-items: center;
-}
-
-.hot-stats {
- display: flex;
- flex-wrap: wrap;
- gap: 8px;
- margin-top: 8px;
-}
-
-.hot-item:hover {
- transform: translateY(-3px);
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
- border-color: rgba(129, 199, 132, 0.4);
-}
-
-.hot-rank {
- font-size: 1.2rem;
- font-weight: bold;
- color: #66bb6a;
- margin-right: 18px;
- min-width: 38px;
- text-align: center;
- background-color: rgba(129, 199, 132, 0.1);
- border-radius: 50%;
- width: 38px;
- height: 38px;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.hot-rank.top-1 {
- background: linear-gradient(135deg, #4caf50, #66bb6a);
- color: white;
-}
-
-.hot-rank.top-2 {
- background: linear-gradient(135deg, #66bb6a, #81c784);
- color: white;
-}
-
-.hot-rank.top-3 {
- background: linear-gradient(135deg, #81c784, #a5d6a7);
- color: white;
-}
-
-.hot-content {
- flex: 1;
-}
-
-.hot-title {
- font-size: 1.15rem;
- margin-bottom: 8px;
- color: #333;
- text-decoration: none;
- display: block;
- line-height: 1.5;
- font-weight: 500;
- transition: color 0.2s ease;
-}
-
-.hot-title:hover {
- color: #66bb6a;
- text-decoration: none;
-}
-
-.loading {
- text-align: center;
- padding: 40px;
- color: #666;
- font-size: 1.1rem;
-}
-
-footer {
- text-align: center;
- margin-top: 40px;
- padding-top: 20px;
- border-top: 1px solid rgba(0, 0, 0, 0.06);
- color: #999;
- font-size: 0.9rem;
-}
-
-.footer-decoration {
- display: flex;
- justify-content: center;
- margin: 10px 0;
- gap: 15px;
-}
-
-.geo-symbol {
- color: #a5d6a7;
- font-size: 14px;
- opacity: 0.5;
- transition: all 0.3s ease;
-}
-
-.geo-symbol:hover {
- opacity: 1;
- transform: scale(1.2) rotate(15deg);
-}
-
-
-
-/* 响应式设计 */
-@media (max-width: 1024px) and (min-width: 768px) {
- .container {
- max-width: 90%;
- padding: 20px;
- }
-
- header h1 {
- font-size: 2.2rem;
- }
-
- .hot-item {
- padding: 18px;
- }
-
- .hot-title {
- font-size: 1.1rem;
- }
-}
-
-@media (max-width: 768px) {
- body {
- background-color: #f8f9fa;
- }
-
- .container {
- max-width: 95%;
- margin: 12px auto;
- padding: 16px;
- border-radius: 12px;
- }
-
- header {
- margin-bottom: 20px;
- padding-bottom: 16px;
- }
-
- header h1 {
- font-size: 1.8rem;
- margin-bottom: 10px;
- }
-
- .update-time {
- font-size: 0.85rem;
- padding: 6px 12px;
- }
-
- .hot-item {
- padding: 16px;
- margin-bottom: 12px;
- border-radius: 10px;
- flex-direction: row;
- align-items: flex-start;
- }
-
- .hot-rank {
- font-size: 1.1rem;
- margin-right: 14px;
- min-width: 32px;
- width: 32px;
- height: 32px;
- margin-top: 2px;
- }
-
- .hot-title {
- font-size: 1rem;
- line-height: 1.5;
- margin-bottom: 6px;
- }
-
- footer {
- margin-top: 24px;
- padding-top: 16px;
- font-size: 0.85rem;
- }
-}
-
-@media (max-width: 480px) {
- .container {
- margin: 8px auto;
- padding: 14px;
- }
-
- header h1 {
- font-size: 1.6rem;
- }
-
- .hot-item {
- padding: 14px;
- margin-bottom: 10px;
- }
-
- .hot-rank {
- font-size: 1rem;
- margin-right: 12px;
- min-width: 30px;
- width: 30px;
- height: 30px;
- }
-
- .hot-title {
- font-size: 0.95rem;
- }
-}
-
-/* 减少动画以节省电池 */
-@media (prefers-reduced-motion: reduce) {
- .modern-gradient,
- .modern-gradient::before {
- animation: none;
- }
-
- .modern-gradient {
- background: linear-gradient(
- 135deg,
- rgba(168, 230, 207, 0.25) 0%,
- rgba(200, 245, 200, 0.15) 50%,
- rgba(180, 235, 180, 0.2) 100%
- );
- }
+/* 背景样式 */
+.background-container {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: -1;
+ overflow: hidden;
+ background-color: #f8f9fa;
+}
+
+.modern-gradient {
+ position: absolute;
+ top: -50%;
+ left: -50%;
+ width: 200%;
+ height: 200%;
+ background: linear-gradient(
+ 135deg,
+ rgba(168, 230, 207, 0.3) 0%,
+ rgba(220, 237, 193, 0.25) 25%,
+ rgba(200, 245, 200, 0.15) 50%,
+ rgba(180, 235, 180, 0.25) 75%,
+ rgba(168, 230, 207, 0.3) 100%
+ );
+ animation: gradient-flow 20s ease-in-out infinite;
+ border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
+}
+
+.modern-gradient::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: radial-gradient(
+ circle at 30% 70%,
+ rgba(129, 199, 132, 0.4) 0%,
+ transparent 50%
+ ), radial-gradient(
+ circle at 70% 30%,
+ rgba(165, 214, 167, 0.3) 0%,
+ transparent 50%
+ );
+ animation: pulse-effect 15s ease-in-out infinite alternate;
+ border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
+}
+
+@keyframes gradient-flow {
+ 0%, 100% {
+ transform: rotate(0deg) scale(1);
+ opacity: 0.8;
+ }
+ 25% {
+ transform: rotate(90deg) scale(1.1);
+ opacity: 0.6;
+ }
+ 50% {
+ transform: rotate(180deg) scale(0.9);
+ opacity: 0.9;
+ }
+ 75% {
+ transform: rotate(270deg) scale(1.05);
+ opacity: 0.7;
+ }
+}
+
+@keyframes pulse-effect {
+ 0% {
+ transform: scale(1) rotate(0deg);
+ opacity: 0.5;
+ }
+ 50% {
+ transform: scale(1.2) rotate(180deg);
+ opacity: 0.8;
+ }
+ 100% {
+ transform: scale(1) rotate(360deg);
+ opacity: 0.6;
+ }
+}
+
+/* 主样式 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
+ color: #333;
+ background-color: #f8f9fa;
+ position: relative;
+ min-height: 100vh;
+}
+
+/* 几何装饰样式 */
+.title-container {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-bottom: 10px;
+}
+
+.geometric-decoration {
+ font-size: 16px;
+ color: #81c784;
+ margin: 0 10px;
+ font-weight: normal;
+ letter-spacing: 3px;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+ opacity: 0.6;
+}
+
+.geometric-decoration.left {
+ transform: rotate(-10deg);
+}
+
+.geometric-decoration.right {
+ transform: rotate(10deg);
+}
+
+@keyframes float-effect {
+ 0% {
+ transform: translateY(0) rotate(-10deg);
+ }
+ 100% {
+ transform: translateY(-5px) rotate(-8deg);
+ }
+}
+
+.update-time-container {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-top: 10px;
+}
+
+.time-decoration {
+ font-size: 14px;
+ color: #a5d6a7;
+ margin: 0 8px;
+ font-weight: normal;
+ letter-spacing: 2px;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+ opacity: 0.5;
+}
+
+@keyframes pulse {
+ 0% {
+ opacity: 0.5;
+ transform: scale(0.8);
+ }
+ 50% {
+ opacity: 1;
+ transform: scale(1.2);
+ }
+ 100% {
+ opacity: 0.5;
+ transform: scale(0.8);
+ }
+}
+
+.geometric-header, .geometric-footer {
+ text-align: center;
+ color: #a5d6a7;
+ margin: 10px 0;
+ font-size: 14px;
+ letter-spacing: 2px;
+ opacity: 0.5;
+}
+
+.geometric-header {
+ margin-bottom: 20px;
+}
+
+.geometric-footer {
+ margin-top: 20px;
+}
+
+.container {
+ max-width: 800px;
+ margin: 0 auto;
+ padding: 24px;
+ position: relative;
+ z-index: 1;
+ background-color: rgba(255, 255, 255, 0.85);
+ border-radius: 16px;
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08);
+ backdrop-filter: blur(10px);
+ border: 1px solid rgba(129, 199, 132, 0.2);
+ position: relative;
+}
+
+.container::before,
+.container::after {
+ content: '';
+ position: absolute;
+ width: 30px;
+ height: 30px;
+ border-color: #a5d6a7;
+ opacity: 0.7;
+}
+
+.container::before {
+ top: 10px;
+ left: 10px;
+ border-top: 3px solid;
+ border-left: 3px solid;
+ border-radius: 10px 0 0 0;
+}
+
+.container::after {
+ bottom: 10px;
+ right: 10px;
+ border-bottom: 3px solid;
+ border-right: 3px solid;
+ border-radius: 0 0 10px 0;
+}
+
+header {
+ text-align: center;
+ margin-bottom: 28px;
+ padding-bottom: 20px;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.06);
+}
+
+header h1 {
+ background: linear-gradient(135deg, #66bb6a, #81c784);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+ margin-bottom: 14px;
+ font-size: 2.4rem;
+ font-weight: 700;
+ letter-spacing: -0.5px;
+}
+
+.update-time {
+ color: #666;
+ font-size: 0.9rem;
+ background-color: rgba(0, 0, 0, 0.03);
+ padding: 8px 16px;
+ border-radius: 24px;
+ display: inline-block;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
+ position: relative;
+ border: 1px dashed rgba(129, 199, 132, 0.3);
+}
+
+.update-time::before {
+ content: '';
+ position: absolute;
+ top: -5px;
+ left: -5px;
+ right: -5px;
+ bottom: -5px;
+ border: 1px solid rgba(129, 199, 132, 0.3);
+ border-radius: 28px;
+ animation: pulse-border 2s infinite;
+ pointer-events: none;
+}
+
+@keyframes pulse-border {
+ 0% {
+ transform: scale(1);
+ opacity: 0.7;
+ }
+ 50% {
+ transform: scale(1.05);
+ opacity: 0.3;
+ }
+ 100% {
+ transform: scale(1);
+ opacity: 0.7;
+ }
+}
+
+.hot-list {
+ list-style: none;
+}
+
+.hot-item {
+ padding: 20px;
+ margin-bottom: 16px;
+ border-radius: 12px;
+ background-color: white;
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04);
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ border: 1px solid rgba(0, 0, 0, 0.03);
+ position: relative;
+ overflow: hidden;
+}
+
+.hot-item::before {
+ content: '◆';
+ position: absolute;
+ top: 5px;
+ right: 10px;
+ color: #a5d6a7;
+ opacity: 0.15;
+ font-size: 12px;
+}
+
+.hot-item::after {
+ content: '◆';
+ position: absolute;
+ bottom: 5px;
+ left: 10px;
+ color: #a5d6a7;
+ opacity: 0.15;
+ font-size: 12px;
+}
+
+.even-item {
+ border-left: 2px solid #81c784;
+}
+
+.odd-item {
+ border-right: 2px solid #81c784;
+}
+
+.title-decoration {
+ color: #81c784;
+ font-weight: normal;
+ margin-right: 5px;
+ display: inline-block;
+ transform: translateY(1px);
+ opacity: 0.7;
+}
+
+.source-icon, .time-icon {
+ color: #81c784;
+ font-size: 14px;
+ margin-right: 3px;
+ opacity: 0.6;
+}
+
+.hot-title {
+ position: relative;
+ display: inline-flex;
+ align-items: center;
+}
+
+.hot-stats {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-top: 8px;
+}
+
+.hot-item:hover {
+ transform: translateY(-3px);
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
+ border-color: rgba(129, 199, 132, 0.4);
+}
+
+.hot-rank {
+ font-size: 1.2rem;
+ font-weight: bold;
+ color: #66bb6a;
+ margin-right: 18px;
+ min-width: 38px;
+ text-align: center;
+ background-color: rgba(129, 199, 132, 0.1);
+ border-radius: 50%;
+ width: 38px;
+ height: 38px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.hot-rank.top-1 {
+ background: linear-gradient(135deg, #4caf50, #66bb6a);
+ color: white;
+}
+
+.hot-rank.top-2 {
+ background: linear-gradient(135deg, #66bb6a, #81c784);
+ color: white;
+}
+
+.hot-rank.top-3 {
+ background: linear-gradient(135deg, #81c784, #a5d6a7);
+ color: white;
+}
+
+.hot-content {
+ flex: 1;
+}
+
+.hot-title {
+ font-size: 1.15rem;
+ margin-bottom: 8px;
+ color: #333;
+ text-decoration: none;
+ display: block;
+ line-height: 1.5;
+ font-weight: 500;
+ transition: color 0.2s ease;
+}
+
+.hot-title:hover {
+ color: #66bb6a;
+ text-decoration: none;
+}
+
+.loading {
+ text-align: center;
+ padding: 40px;
+ color: #666;
+ font-size: 1.1rem;
+}
+
+footer {
+ text-align: center;
+ margin-top: 40px;
+ padding-top: 20px;
+ border-top: 1px solid rgba(0, 0, 0, 0.06);
+ color: #999;
+ font-size: 0.9rem;
+}
+
+.footer-decoration {
+ display: flex;
+ justify-content: center;
+ margin: 10px 0;
+ gap: 15px;
+}
+
+.geo-symbol {
+ color: #a5d6a7;
+ font-size: 14px;
+ opacity: 0.5;
+ transition: all 0.3s ease;
+}
+
+.geo-symbol:hover {
+ opacity: 1;
+ transform: scale(1.2) rotate(15deg);
+}
+
+
+
+/* 响应式设计 */
+@media (max-width: 1024px) and (min-width: 768px) {
+ .container {
+ max-width: 90%;
+ padding: 20px;
+ }
+
+ header h1 {
+ font-size: 2.2rem;
+ }
+
+ .hot-item {
+ padding: 18px;
+ }
+
+ .hot-title {
+ font-size: 1.1rem;
+ }
+}
+
+@media (max-width: 768px) {
+ body {
+ background-color: #f8f9fa;
+ }
+
+ .container {
+ max-width: 95%;
+ margin: 12px auto;
+ padding: 16px;
+ border-radius: 12px;
+ }
+
+ header {
+ margin-bottom: 20px;
+ padding-bottom: 16px;
+ }
+
+ header h1 {
+ font-size: 1.8rem;
+ margin-bottom: 10px;
+ }
+
+ .update-time {
+ font-size: 0.85rem;
+ padding: 6px 12px;
+ }
+
+ .hot-item {
+ padding: 16px;
+ margin-bottom: 12px;
+ border-radius: 10px;
+ flex-direction: row;
+ align-items: flex-start;
+ }
+
+ .hot-rank {
+ font-size: 1.1rem;
+ margin-right: 14px;
+ min-width: 32px;
+ width: 32px;
+ height: 32px;
+ margin-top: 2px;
+ }
+
+ .hot-title {
+ font-size: 1rem;
+ line-height: 1.5;
+ margin-bottom: 6px;
+ }
+
+ footer {
+ margin-top: 24px;
+ padding-top: 16px;
+ font-size: 0.85rem;
+ }
+}
+
+@media (max-width: 480px) {
+ .container {
+ margin: 8px auto;
+ padding: 14px;
+ }
+
+ header h1 {
+ font-size: 1.6rem;
+ }
+
+ .hot-item {
+ padding: 14px;
+ margin-bottom: 10px;
+ }
+
+ .hot-rank {
+ font-size: 1rem;
+ margin-right: 12px;
+ min-width: 30px;
+ width: 30px;
+ height: 30px;
+ }
+
+ .hot-title {
+ font-size: 0.95rem;
+ }
+}
+
+/* 减少动画以节省电池 */
+@media (prefers-reduced-motion: reduce) {
+ .modern-gradient,
+ .modern-gradient::before {
+ animation: none;
+ }
+
+ .modern-gradient {
+ background: linear-gradient(
+ 135deg,
+ rgba(168, 230, 207, 0.25) 0%,
+ rgba(200, 245, 200, 0.15) 50%,
+ rgba(180, 235, 180, 0.2) 100%
+ );
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/index.html
index bb45284f..2292ab23 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/index.html
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/index.html
@@ -1,62 +1,62 @@
-
-
-
-
-
- 头条热搜榜
-
-
-
-
-
-
-
-
-
-
◢ ◣ ▲
-
头条热搜榜
-
▼ ◥ ◤
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ 头条热搜榜
+
+
+
+
+
+
+
+
+
+
◢ ◣ ▲
+
头条热搜榜
+
▼ ◥ ◤
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/js/main.js b/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/js/main.js
index 2d7b0367..b3e41a34 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/js/main.js
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/js/main.js
@@ -1,171 +1,171 @@
-// API接口列表
-const API_ENDPOINTS = [
- "https://60s.api.shumengya.top/v2/toutiao",
-];
-
-// 当前使用的API索引
-let currentApiIndex = 0;
-
-// DOM元素
-const hotListElement = document.getElementById('hotList');
-const updateTimeElement = document.getElementById('updateTime');
-
-// 格式化时间
-function formatDate(date) {
- const year = date.getFullYear();
- const month = String(date.getMonth() + 1).padStart(2, '0');
- const day = String(date.getDate()).padStart(2, '0');
- const hours = String(date.getHours()).padStart(2, '0');
- const minutes = String(date.getMinutes()).padStart(2, '0');
- const seconds = String(date.getSeconds()).padStart(2, '0');
-
- return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
-}
-
-// 格式化数字
-function formatNumber(num) {
- if (num >= 10000) {
- return (num / 10000).toFixed(1) + '万';
- }
- return num.toString();
-}
-
-// 渲染热搜列表
-function renderHotList(data) {
- hotListElement.innerHTML = '';
-
- // 几何装饰符号数组
- const geometricSymbols = ['◆', '■', '▲', '●', '★', '◈', '◇', '□', '△', '○'];
-
- data.forEach((item, index) => {
- const hotItem = document.createElement('div');
- hotItem.className = 'hot-item';
-
- const rankClass = index < 3 ? `top-${index + 1}` : '';
-
- // 随机选择几何符号作为装饰
- const randomSymbol = geometricSymbols[index % geometricSymbols.length];
-
- // 处理热度值显示
- const hotValueDisplay = item.hot_value ?
- `${randomSymbol} ${formatNumber(item.hot_value)} 热度
` : '';
-
- // 处理标签显示
- const tagDisplay = item.tag ?
- `${randomSymbol} ${item.tag}
` : '';
-
- hotItem.innerHTML = `
- ${index + 1}
-
-
- ${randomSymbol} ${item.title}
-
-
- ${hotValueDisplay}
- ${tagDisplay}
- ${item.source ? `
${randomSymbol} ${item.source}
` : ''}
- ${item.time ? `
${randomSymbol} ${item.time}
` : ''}
-
-
- `;
-
- hotListElement.appendChild(hotItem);
- });
-
- // 添加几何装饰到列表项
- const hotItems = document.querySelectorAll('.hot-item');
- hotItems.forEach((item, index) => {
- // 为奇数和偶数项添加不同的装饰类
- if (index % 2 === 0) {
- item.classList.add('even-item');
- } else {
- item.classList.add('odd-item');
- }
- });
-
- // 更新时间
- updateTimeElement.textContent = `更新时间:${formatDate(new Date())}`;
-}
-
-// 显示加载状态
-function showLoading() {
- hotListElement.innerHTML = '加载中...
';
-}
-
-// 显示错误状态
-function showError(message) {
- hotListElement.innerHTML = `${message}
`;
-}
-
-// 获取头条热搜数据
-async function fetchToutiaoHotList() {
- showLoading();
-
- try {
- const response = await fetch(API_ENDPOINTS[currentApiIndex]);
-
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
- }
-
- const result = await response.json();
-
- if (result.code === 200 && result.data && Array.isArray(result.data)) {
- if (result.data.length > 0) {
- renderHotList(result.data);
- } else {
- showError('暂无热搜数据');
- }
- } else {
- throw new Error('数据格式错误或无数据');
- }
- } catch (error) {
- console.error('获取数据失败:', error);
-
- // 尝试切换到下一个API
- const nextApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length;
-
- if (nextApiIndex !== 0) {
- // 还有其他API可以尝试
- currentApiIndex = nextApiIndex;
- showError('获取数据失败,正在尝试其他接口...');
-
- // 延迟后重试
- setTimeout(fetchToutiaoHotList, 2000);
- } else {
- // 所有API都尝试过了
- currentApiIndex = 0;
- showError('所有接口都无法访问,请稍后再试');
- }
- }
-}
-
-// 手动刷新数据
-function refreshData() {
- currentApiIndex = 0; // 重置API索引
- fetchToutiaoHotList();
-}
-
-// 页面加载完成后获取数据
-document.addEventListener('DOMContentLoaded', () => {
- fetchToutiaoHotList();
-
- // 每隔5分钟刷新一次数据
- setInterval(fetchToutiaoHotList, 5 * 60 * 1000);
-
- // 添加键盘快捷键支持(按R键刷新)
- document.addEventListener('keydown', (event) => {
- if (event.key === 'r' || event.key === 'R') {
- event.preventDefault();
- refreshData();
- }
- });
-});
-
-// 页面可见性变化时的处理
-document.addEventListener('visibilitychange', () => {
- if (!document.hidden) {
- // 页面重新可见时刷新数据
- refreshData();
- }
+// API接口列表
+const API_ENDPOINTS = [
+ "https://60s.api.shumengya.top/v2/toutiao",
+];
+
+// 当前使用的API索引
+let currentApiIndex = 0;
+
+// DOM元素
+const hotListElement = document.getElementById('hotList');
+const updateTimeElement = document.getElementById('updateTime');
+
+// 格式化时间
+function formatDate(date) {
+ const year = date.getFullYear();
+ const month = String(date.getMonth() + 1).padStart(2, '0');
+ const day = String(date.getDate()).padStart(2, '0');
+ const hours = String(date.getHours()).padStart(2, '0');
+ const minutes = String(date.getMinutes()).padStart(2, '0');
+ const seconds = String(date.getSeconds()).padStart(2, '0');
+
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+}
+
+// 格式化数字
+function formatNumber(num) {
+ if (num >= 10000) {
+ return (num / 10000).toFixed(1) + '万';
+ }
+ return num.toString();
+}
+
+// 渲染热搜列表
+function renderHotList(data) {
+ hotListElement.innerHTML = '';
+
+ // 几何装饰符号数组
+ const geometricSymbols = ['◆', '■', '▲', '●', '★', '◈', '◇', '□', '△', '○'];
+
+ data.forEach((item, index) => {
+ const hotItem = document.createElement('div');
+ hotItem.className = 'hot-item';
+
+ const rankClass = index < 3 ? `top-${index + 1}` : '';
+
+ // 随机选择几何符号作为装饰
+ const randomSymbol = geometricSymbols[index % geometricSymbols.length];
+
+ // 处理热度值显示
+ const hotValueDisplay = item.hot_value ?
+ `${randomSymbol} ${formatNumber(item.hot_value)} 热度
` : '';
+
+ // 处理标签显示
+ const tagDisplay = item.tag ?
+ `${randomSymbol} ${item.tag}
` : '';
+
+ hotItem.innerHTML = `
+ ${index + 1}
+
+
+ ${randomSymbol} ${item.title}
+
+
+ ${hotValueDisplay}
+ ${tagDisplay}
+ ${item.source ? `
${randomSymbol} ${item.source}
` : ''}
+ ${item.time ? `
${randomSymbol} ${item.time}
` : ''}
+
+
+ `;
+
+ hotListElement.appendChild(hotItem);
+ });
+
+ // 添加几何装饰到列表项
+ const hotItems = document.querySelectorAll('.hot-item');
+ hotItems.forEach((item, index) => {
+ // 为奇数和偶数项添加不同的装饰类
+ if (index % 2 === 0) {
+ item.classList.add('even-item');
+ } else {
+ item.classList.add('odd-item');
+ }
+ });
+
+ // 更新时间
+ updateTimeElement.textContent = `更新时间:${formatDate(new Date())}`;
+}
+
+// 显示加载状态
+function showLoading() {
+ hotListElement.innerHTML = '加载中...
';
+}
+
+// 显示错误状态
+function showError(message) {
+ hotListElement.innerHTML = `${message}
`;
+}
+
+// 获取头条热搜数据
+async function fetchToutiaoHotList() {
+ showLoading();
+
+ try {
+ const response = await fetch(API_ENDPOINTS[currentApiIndex]);
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+ }
+
+ const result = await response.json();
+
+ if (result.code === 200 && result.data && Array.isArray(result.data)) {
+ if (result.data.length > 0) {
+ renderHotList(result.data);
+ } else {
+ showError('暂无热搜数据');
+ }
+ } else {
+ throw new Error('数据格式错误或无数据');
+ }
+ } catch (error) {
+ console.error('获取数据失败:', error);
+
+ // 尝试切换到下一个API
+ const nextApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length;
+
+ if (nextApiIndex !== 0) {
+ // 还有其他API可以尝试
+ currentApiIndex = nextApiIndex;
+ showError('获取数据失败,正在尝试其他接口...');
+
+ // 延迟后重试
+ setTimeout(fetchToutiaoHotList, 2000);
+ } else {
+ // 所有API都尝试过了
+ currentApiIndex = 0;
+ showError('所有接口都无法访问,请稍后再试');
+ }
+ }
+}
+
+// 手动刷新数据
+function refreshData() {
+ currentApiIndex = 0; // 重置API索引
+ fetchToutiaoHotList();
+}
+
+// 页面加载完成后获取数据
+document.addEventListener('DOMContentLoaded', () => {
+ fetchToutiaoHotList();
+
+ // 每隔5分钟刷新一次数据
+ setInterval(fetchToutiaoHotList, 5 * 60 * 1000);
+
+ // 添加键盘快捷键支持(按R键刷新)
+ document.addEventListener('keydown', (event) => {
+ if (event.key === 'r' || event.key === 'R') {
+ event.preventDefault();
+ refreshData();
+ }
+ });
+});
+
+// 页面可见性变化时的处理
+document.addEventListener('visibilitychange', () => {
+ if (!document.hidden) {
+ // 页面重新可见时刷新数据
+ refreshData();
+ }
});
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/接口集合.json b/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/接口集合.json
index 547b2771..42245813 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/接口集合.json
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/接口集合.json
@@ -1,3 +1,3 @@
-[
- "https://60s.api.shumengya.top"
-]
+[
+ "https://60s.api.shumengya.top"
+]
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/返回接口.json
index 778e5e45..8960c5d1 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/头条热搜榜/返回接口.json
@@ -1,30 +1,30 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": [
- {
- "title": "九三阅兵具体安排公布",
- "hot_value": 11821633,
- "tag": "热",
- "source": "头条新闻",
- "time": "2小时前",
- "link": "https://www.toutiao.com/article/7404567890123456789/"
- },
- {
- "title": "九月第一天",
- "hot_value": 11327170,
- "tag": "新",
- "source": "今日头条",
- "time": "1小时前",
- "link": "https://www.toutiao.com/article/7404567890123456790/"
- },
- {
- "title": "遇见上合共享津彩",
- "hot_value": 11222444,
- "tag": "推荐",
- "source": "头条资讯",
- "time": "3小时前",
- "link": "https://www.toutiao.com/article/7404567890123456791/"
- }
- ]
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": [
+ {
+ "title": "九三阅兵具体安排公布",
+ "hot_value": 11821633,
+ "tag": "热",
+ "source": "头条新闻",
+ "time": "2小时前",
+ "link": "https://www.toutiao.com/article/7404567890123456789/"
+ },
+ {
+ "title": "九月第一天",
+ "hot_value": 11327170,
+ "tag": "新",
+ "source": "今日头条",
+ "time": "1小时前",
+ "link": "https://www.toutiao.com/article/7404567890123456790/"
+ },
+ {
+ "title": "遇见上合共享津彩",
+ "hot_value": 11222444,
+ "tag": "推荐",
+ "source": "头条资讯",
+ "time": "3小时前",
+ "link": "https://www.toutiao.com/article/7404567890123456791/"
+ }
+ ]
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/background.css
index 8a5a8569..77498383 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/background.css
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/background.css
@@ -1,144 +1,144 @@
-/* 背景样式文件 - 独立管理所有背景相关样式 */
-
-/* 页面主背景 */
-body {
- background: linear-gradient(135deg, #f8fffe 0%, #f0f9f4 50%, #e8f5e8 100%);
- background-attachment: fixed;
- background-size: cover;
- position: relative;
-}
-
-/* 背景装饰元素 */
-body::before {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- radial-gradient(circle at 20% 80%, rgba(168, 230, 207, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 80% 20%, rgba(39, 174, 96, 0.08) 0%, transparent 50%),
- radial-gradient(circle at 40% 40%, rgba(46, 204, 113, 0.05) 0%, transparent 50%);
- pointer-events: none;
- z-index: -1;
-}
-
-/* 容器背景 */
-.container {
- background: rgba(255, 255, 255, 0.7);
- backdrop-filter: blur(10px);
- border-radius: 20px;
- margin-top: 20px;
- margin-bottom: 20px;
- box-shadow: 0 8px 32px rgba(39, 174, 96, 0.1);
-}
-
-/* 头部背景 */
-.header {
- background: linear-gradient(135deg, rgba(168, 230, 207, 0.2) 0%, rgba(39, 174, 96, 0.1) 100%);
- border-radius: 20px 20px 0 0;
- position: relative;
- overflow: hidden;
-}
-
-.header::before {
- content: '';
- position: absolute;
- top: -50%;
- left: -50%;
- width: 200%;
- height: 200%;
- background: radial-gradient(circle, rgba(39, 174, 96, 0.05) 0%, transparent 70%);
- animation: float 6s ease-in-out infinite;
-}
-
-@keyframes float {
- 0%, 100% {
- transform: translate(0, 0) rotate(0deg);
- }
- 50% {
- transform: translate(-10px, -10px) rotate(180deg);
- }
-}
-
-/* 热点项目背景 */
-.hot-item {
- background: rgba(255, 255, 255, 0.9);
- backdrop-filter: blur(5px);
- position: relative;
-}
-
-.hot-item::after {
- content: '';
- position: absolute;
- top: 0;
- right: 0;
- width: 60px;
- height: 60px;
- background: radial-gradient(circle, rgba(168, 230, 207, 0.1) 0%, transparent 70%);
- border-radius: 50%;
- transform: translate(30px, -30px);
- pointer-events: none;
-}
-
-/* 前三名特殊背景效果 */
-.hot-item:nth-child(1) {
- background: linear-gradient(135deg, rgba(255, 215, 0, 0.1) 0%, rgba(255, 255, 255, 0.9) 100%);
-}
-
-.hot-item:nth-child(2) {
- background: linear-gradient(135deg, rgba(192, 192, 192, 0.1) 0%, rgba(255, 255, 255, 0.9) 100%);
-}
-
-.hot-item:nth-child(3) {
- background: linear-gradient(135deg, rgba(205, 127, 50, 0.1) 0%, rgba(255, 255, 255, 0.9) 100%);
-}
-
-/* 底部背景 */
-.footer {
- background: linear-gradient(135deg, rgba(168, 230, 207, 0.1) 0%, rgba(39, 174, 96, 0.05) 100%);
- border-radius: 0 0 20px 20px;
-}
-
-/* 加载状态背景 */
-.loading {
- background: rgba(255, 255, 255, 0.8);
- border-radius: 12px;
- backdrop-filter: blur(5px);
-}
-
-/* 错误信息背景 */
-.error-message {
- background: rgba(255, 255, 255, 0.9);
- border: 1px solid rgba(231, 76, 60, 0.2);
- border-radius: 12px;
- backdrop-filter: blur(5px);
-}
-
-/* 响应式背景调整 */
-@media (max-width: 768px) {
- .container {
- margin-top: 10px;
- margin-bottom: 10px;
- border-radius: 16px;
- }
-
- .header {
- border-radius: 16px 16px 0 0;
- }
-
- .footer {
- border-radius: 0 0 16px 16px;
- }
-}
-
-@media (min-width: 1025px) {
- body::before {
- background-image:
- radial-gradient(circle at 15% 85%, rgba(168, 230, 207, 0.15) 0%, transparent 50%),
- radial-gradient(circle at 85% 15%, rgba(39, 174, 96, 0.12) 0%, transparent 50%),
- radial-gradient(circle at 50% 50%, rgba(46, 204, 113, 0.08) 0%, transparent 50%),
- radial-gradient(circle at 25% 25%, rgba(168, 230, 207, 0.06) 0%, transparent 50%);
- }
+/* 背景样式文件 - 独立管理所有背景相关样式 */
+
+/* 页面主背景 */
+body {
+ background: linear-gradient(135deg, #f8fffe 0%, #f0f9f4 50%, #e8f5e8 100%);
+ background-attachment: fixed;
+ background-size: cover;
+ position: relative;
+}
+
+/* 背景装饰元素 */
+body::before {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(circle at 20% 80%, rgba(168, 230, 207, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(39, 174, 96, 0.08) 0%, transparent 50%),
+ radial-gradient(circle at 40% 40%, rgba(46, 204, 113, 0.05) 0%, transparent 50%);
+ pointer-events: none;
+ z-index: -1;
+}
+
+/* 容器背景 */
+.container {
+ background: rgba(255, 255, 255, 0.7);
+ backdrop-filter: blur(10px);
+ border-radius: 20px;
+ margin-top: 20px;
+ margin-bottom: 20px;
+ box-shadow: 0 8px 32px rgba(39, 174, 96, 0.1);
+}
+
+/* 头部背景 */
+.header {
+ background: linear-gradient(135deg, rgba(168, 230, 207, 0.2) 0%, rgba(39, 174, 96, 0.1) 100%);
+ border-radius: 20px 20px 0 0;
+ position: relative;
+ overflow: hidden;
+}
+
+.header::before {
+ content: '';
+ position: absolute;
+ top: -50%;
+ left: -50%;
+ width: 200%;
+ height: 200%;
+ background: radial-gradient(circle, rgba(39, 174, 96, 0.05) 0%, transparent 70%);
+ animation: float 6s ease-in-out infinite;
+}
+
+@keyframes float {
+ 0%, 100% {
+ transform: translate(0, 0) rotate(0deg);
+ }
+ 50% {
+ transform: translate(-10px, -10px) rotate(180deg);
+ }
+}
+
+/* 热点项目背景 */
+.hot-item {
+ background: rgba(255, 255, 255, 0.9);
+ backdrop-filter: blur(5px);
+ position: relative;
+}
+
+.hot-item::after {
+ content: '';
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 60px;
+ height: 60px;
+ background: radial-gradient(circle, rgba(168, 230, 207, 0.1) 0%, transparent 70%);
+ border-radius: 50%;
+ transform: translate(30px, -30px);
+ pointer-events: none;
+}
+
+/* 前三名特殊背景效果 */
+.hot-item:nth-child(1) {
+ background: linear-gradient(135deg, rgba(255, 215, 0, 0.1) 0%, rgba(255, 255, 255, 0.9) 100%);
+}
+
+.hot-item:nth-child(2) {
+ background: linear-gradient(135deg, rgba(192, 192, 192, 0.1) 0%, rgba(255, 255, 255, 0.9) 100%);
+}
+
+.hot-item:nth-child(3) {
+ background: linear-gradient(135deg, rgba(205, 127, 50, 0.1) 0%, rgba(255, 255, 255, 0.9) 100%);
+}
+
+/* 底部背景 */
+.footer {
+ background: linear-gradient(135deg, rgba(168, 230, 207, 0.1) 0%, rgba(39, 174, 96, 0.05) 100%);
+ border-radius: 0 0 20px 20px;
+}
+
+/* 加载状态背景 */
+.loading {
+ background: rgba(255, 255, 255, 0.8);
+ border-radius: 12px;
+ backdrop-filter: blur(5px);
+}
+
+/* 错误信息背景 */
+.error-message {
+ background: rgba(255, 255, 255, 0.9);
+ border: 1px solid rgba(231, 76, 60, 0.2);
+ border-radius: 12px;
+ backdrop-filter: blur(5px);
+}
+
+/* 响应式背景调整 */
+@media (max-width: 768px) {
+ .container {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ border-radius: 16px;
+ }
+
+ .header {
+ border-radius: 16px 16px 0 0;
+ }
+
+ .footer {
+ border-radius: 0 0 16px 16px;
+ }
+}
+
+@media (min-width: 1025px) {
+ body::before {
+ background-image:
+ radial-gradient(circle at 15% 85%, rgba(168, 230, 207, 0.15) 0%, transparent 50%),
+ radial-gradient(circle at 85% 15%, rgba(39, 174, 96, 0.12) 0%, transparent 50%),
+ radial-gradient(circle at 50% 50%, rgba(46, 204, 113, 0.08) 0%, transparent 50%),
+ radial-gradient(circle at 25% 25%, rgba(168, 230, 207, 0.06) 0%, transparent 50%);
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/index.html
index 007cfc91..ab9170bb 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/index.html
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/index.html
@@ -1,40 +1,40 @@
-
-
-
-
-
- 小红书热点榜单
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ 小红书热点榜单
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/script.js b/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/script.js
index 5fcd322c..77460ed3 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/script.js
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/script.js
@@ -1,180 +1,180 @@
-// 小红书热点榜单 JavaScript 逻辑
-
-// DOM 元素
-const loadingEl = document.getElementById('loading');
-const errorEl = document.getElementById('error');
-const hotListEl = document.getElementById('hotList');
-const updateTimeEl = document.getElementById('updateTime');
-
-// 页面加载完成后初始化
-document.addEventListener('DOMContentLoaded', function() {
- loadData();
-});
-
-// 加载数据函数
-async function loadData() {
- try {
- showLoading();
-
- // 从API接口获取数据
- const response = await fetch('https://60s.api.shumengya.top/v2/rednote');
-
- if (!response.ok) {
- throw new Error(`HTTP error! status: ${response.status}`);
- }
-
- const data = await response.json();
-
- if (data.code === 200 && data.data) {
- renderHotList(data.data);
- updateTime();
- showSuccess();
- } else {
- throw new Error('数据格式错误');
- }
-
- } catch (error) {
- console.error('加载数据失败:', error);
- showError();
- }
-}
-
-// 显示加载状态
-function showLoading() {
- loadingEl.style.display = 'block';
- errorEl.style.display = 'none';
- hotListEl.style.display = 'none';
-}
-
-// 显示错误状态
-function showError() {
- loadingEl.style.display = 'none';
- errorEl.style.display = 'block';
- hotListEl.style.display = 'none';
-}
-
-// 显示成功状态
-function showSuccess() {
- loadingEl.style.display = 'none';
- errorEl.style.display = 'none';
- hotListEl.style.display = 'block';
-}
-
-// 渲染热点列表
-function renderHotList(hotData) {
- hotListEl.innerHTML = '';
-
- hotData.forEach((item, index) => {
- const hotItem = createHotItem(item, index);
- hotListEl.appendChild(hotItem);
- });
-}
-
-// 创建热点项目元素
-function createHotItem(item, index) {
- const itemEl = document.createElement('div');
- itemEl.className = 'hot-item';
-
- // 添加点击事件
- itemEl.addEventListener('click', () => {
- if (item.link) {
- window.open(item.link, '_blank');
- }
- });
-
- // 构建HTML内容
- itemEl.innerHTML = `
-
-
-
${escapeHtml(item.title)}
-
热度: ${item.score}
-
- `;
-
- return itemEl;
-}
-
-// 获取类型样式类名
-function getTypeClass(wordType) {
- switch (wordType) {
- case '热':
- return 'hot';
- case '新':
- return 'new';
- default:
- return 'default';
- }
-}
-
-// HTML转义函数
-function escapeHtml(text) {
- const div = document.createElement('div');
- div.textContent = text;
- return div.innerHTML;
-}
-
-// 更新时间显示
-function updateTime() {
- const now = new Date();
- const timeString = now.toLocaleString('zh-CN', {
- year: 'numeric',
- month: '2-digit',
- day: '2-digit',
- hour: '2-digit',
- minute: '2-digit',
- second: '2-digit'
- });
- updateTimeEl.textContent = `最后更新: ${timeString}`;
-}
-
-// 添加页面可见性变化监听,当页面重新可见时刷新数据
-document.addEventListener('visibilitychange', function() {
- if (!document.hidden) {
- // 页面变为可见时,延迟1秒后刷新数据
- setTimeout(() => {
- loadData();
- }, 1000);
- }
-});
-
-// 添加网络状态监听
-window.addEventListener('online', function() {
- // 网络恢复时自动重新加载
- setTimeout(() => {
- loadData();
- }, 500);
-});
-
-// 添加错误处理
-window.addEventListener('error', function(e) {
- console.error('页面错误:', e.error);
-});
-
-// 添加未处理的Promise拒绝监听
-window.addEventListener('unhandledrejection', function(e) {
- console.error('未处理的Promise拒绝:', e.reason);
- e.preventDefault();
-});
-
-// 添加触摸设备的优化
-if ('ontouchstart' in window) {
- // 为触摸设备添加触摸反馈
- document.addEventListener('touchstart', function() {}, { passive: true });
-}
-
-// 添加键盘导航支持
-document.addEventListener('keydown', function(e) {
- if (e.key === 'F5' || (e.ctrlKey && e.key === 'r')) {
- e.preventDefault();
- loadData();
- }
-});
-
-// 导出函数供全局使用
+// 小红书热点榜单 JavaScript 逻辑
+
+// DOM 元素
+const loadingEl = document.getElementById('loading');
+const errorEl = document.getElementById('error');
+const hotListEl = document.getElementById('hotList');
+const updateTimeEl = document.getElementById('updateTime');
+
+// 页面加载完成后初始化
+document.addEventListener('DOMContentLoaded', function() {
+ loadData();
+});
+
+// 加载数据函数
+async function loadData() {
+ try {
+ showLoading();
+
+ // 从API接口获取数据
+ const response = await fetch('https://60s.api.shumengya.top/v2/rednote');
+
+ if (!response.ok) {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+
+ const data = await response.json();
+
+ if (data.code === 200 && data.data) {
+ renderHotList(data.data);
+ updateTime();
+ showSuccess();
+ } else {
+ throw new Error('数据格式错误');
+ }
+
+ } catch (error) {
+ console.error('加载数据失败:', error);
+ showError();
+ }
+}
+
+// 显示加载状态
+function showLoading() {
+ loadingEl.style.display = 'block';
+ errorEl.style.display = 'none';
+ hotListEl.style.display = 'none';
+}
+
+// 显示错误状态
+function showError() {
+ loadingEl.style.display = 'none';
+ errorEl.style.display = 'block';
+ hotListEl.style.display = 'none';
+}
+
+// 显示成功状态
+function showSuccess() {
+ loadingEl.style.display = 'none';
+ errorEl.style.display = 'none';
+ hotListEl.style.display = 'block';
+}
+
+// 渲染热点列表
+function renderHotList(hotData) {
+ hotListEl.innerHTML = '';
+
+ hotData.forEach((item, index) => {
+ const hotItem = createHotItem(item, index);
+ hotListEl.appendChild(hotItem);
+ });
+}
+
+// 创建热点项目元素
+function createHotItem(item, index) {
+ const itemEl = document.createElement('div');
+ itemEl.className = 'hot-item';
+
+ // 添加点击事件
+ itemEl.addEventListener('click', () => {
+ if (item.link) {
+ window.open(item.link, '_blank');
+ }
+ });
+
+ // 构建HTML内容
+ itemEl.innerHTML = `
+
+
+
${escapeHtml(item.title)}
+
热度: ${item.score}
+
+ `;
+
+ return itemEl;
+}
+
+// 获取类型样式类名
+function getTypeClass(wordType) {
+ switch (wordType) {
+ case '热':
+ return 'hot';
+ case '新':
+ return 'new';
+ default:
+ return 'default';
+ }
+}
+
+// HTML转义函数
+function escapeHtml(text) {
+ const div = document.createElement('div');
+ div.textContent = text;
+ return div.innerHTML;
+}
+
+// 更新时间显示
+function updateTime() {
+ const now = new Date();
+ const timeString = now.toLocaleString('zh-CN', {
+ year: 'numeric',
+ month: '2-digit',
+ day: '2-digit',
+ hour: '2-digit',
+ minute: '2-digit',
+ second: '2-digit'
+ });
+ updateTimeEl.textContent = `最后更新: ${timeString}`;
+}
+
+// 添加页面可见性变化监听,当页面重新可见时刷新数据
+document.addEventListener('visibilitychange', function() {
+ if (!document.hidden) {
+ // 页面变为可见时,延迟1秒后刷新数据
+ setTimeout(() => {
+ loadData();
+ }, 1000);
+ }
+});
+
+// 添加网络状态监听
+window.addEventListener('online', function() {
+ // 网络恢复时自动重新加载
+ setTimeout(() => {
+ loadData();
+ }, 500);
+});
+
+// 添加错误处理
+window.addEventListener('error', function(e) {
+ console.error('页面错误:', e.error);
+});
+
+// 添加未处理的Promise拒绝监听
+window.addEventListener('unhandledrejection', function(e) {
+ console.error('未处理的Promise拒绝:', e.reason);
+ e.preventDefault();
+});
+
+// 添加触摸设备的优化
+if ('ontouchstart' in window) {
+ // 为触摸设备添加触摸反馈
+ document.addEventListener('touchstart', function() {}, { passive: true });
+}
+
+// 添加键盘导航支持
+document.addEventListener('keydown', function(e) {
+ if (e.key === 'F5' || (e.ctrlKey && e.key === 'r')) {
+ e.preventDefault();
+ loadData();
+ }
+});
+
+// 导出函数供全局使用
window.loadData = loadData;
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/styles.css b/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/styles.css
index a9385421..a925070e 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/styles.css
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/styles.css
@@ -1,299 +1,299 @@
-/* 基础样式重置 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
- line-height: 1.6;
- color: #2c3e50;
- overflow-x: hidden;
-}
-
-.container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 0 16px;
- min-height: 100vh;
- display: flex;
- flex-direction: column;
-}
-
-/* 头部样式 */
-.header {
- text-align: center;
- padding: 24px 0;
- border-bottom: 2px solid #a8e6cf;
- margin-bottom: 24px;
-}
-
-.title {
- font-size: 28px;
- font-weight: 700;
- color: #27ae60;
- margin-bottom: 8px;
- text-shadow: 0 2px 4px rgba(39, 174, 96, 0.1);
-}
-
-.subtitle {
- font-size: 14px;
- color: #7f8c8d;
- font-weight: 400;
-}
-
-/* 主内容区域 */
-.main-content {
- flex: 1;
- position: relative;
-}
-
-/* 加载状态 */
-.loading {
- text-align: center;
- padding: 60px 20px;
- color: #27ae60;
-}
-
-.loading-spinner {
- width: 40px;
- height: 40px;
- border: 3px solid #a8e6cf;
- border-top: 3px solid #27ae60;
- border-radius: 50%;
- animation: spin 1s linear infinite;
- margin: 0 auto 16px;
-}
-
-@keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-/* 错误信息 */
-.error-message {
- text-align: center;
- padding: 40px 20px;
- color: #e74c3c;
-}
-
-.retry-btn {
- background: #27ae60;
- color: white;
- border: none;
- padding: 10px 20px;
- border-radius: 20px;
- cursor: pointer;
- font-size: 14px;
- margin-top: 16px;
- transition: background 0.3s ease;
-}
-
-.retry-btn:hover {
- background: #219a52;
-}
-
-/* 热点列表 */
-.hot-list {
- display: grid;
- gap: 12px;
-}
-
-.hot-item {
- background: #ffffff;
- border: 1px solid #e8f5e8;
- border-radius: 12px;
- padding: 16px;
- transition: all 0.3s ease;
- box-shadow: 0 2px 8px rgba(39, 174, 96, 0.08);
- position: relative;
- overflow: hidden;
-}
-
-.hot-item:hover {
- transform: translateY(-2px);
- box-shadow: 0 4px 16px rgba(39, 174, 96, 0.15);
- border-color: #a8e6cf;
-}
-
-.hot-item::before {
- content: '';
- position: absolute;
- left: 0;
- top: 0;
- width: 4px;
- height: 100%;
- background: linear-gradient(to bottom, #27ae60, #a8e6cf);
-}
-
-.item-header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- margin-bottom: 8px;
-}
-
-.rank {
- background: linear-gradient(135deg, #27ae60, #2ecc71);
- color: white;
- width: 28px;
- height: 28px;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
- font-weight: 700;
- font-size: 14px;
- flex-shrink: 0;
-}
-
-.rank.top3 {
- background: linear-gradient(135deg, #f39c12, #e67e22);
-}
-
-.word-type {
- display: flex;
- align-items: center;
- gap: 4px;
-}
-
-.type-icon {
- width: 16px;
- height: 16px;
- object-fit: contain;
-}
-
-.type-text {
- font-size: 12px;
- padding: 2px 8px;
- border-radius: 10px;
- font-weight: 500;
-}
-
-.type-hot {
- background: #ffe6e6;
- color: #e74c3c;
-}
-
-.type-new {
- background: #e6f3ff;
- color: #3498db;
-}
-
-.item-content {
- margin-bottom: 8px;
-}
-
-.item-title {
- font-size: 16px;
- font-weight: 600;
- color: #2c3e50;
- line-height: 1.4;
- margin-bottom: 4px;
- cursor: pointer;
- transition: color 0.3s ease;
-}
-
-.item-title:hover {
- color: #27ae60;
-}
-
-.item-score {
- font-size: 14px;
- color: #7f8c8d;
- font-weight: 500;
-}
-
-/* 底部 */
-.footer {
- text-align: center;
- padding: 24px 0;
- border-top: 1px solid #e8f5e8;
- margin-top: 32px;
-}
-
-.update-time {
- font-size: 12px;
- color: #95a5a6;
-}
-
-/* 手机端优化 (默认) */
-@media (max-width: 768px) {
- .container {
- padding: 0 12px;
- }
-
- .header {
- padding: 20px 0;
- }
-
- .title {
- font-size: 24px;
- }
-
- .subtitle {
- font-size: 13px;
- }
-
- .hot-item {
- padding: 14px;
- }
-
- .item-title {
- font-size: 15px;
- }
-
- .rank {
- width: 26px;
- height: 26px;
- font-size: 13px;
- }
-}
-
-/* 平板端适配 */
-@media (min-width: 769px) and (max-width: 1024px) {
- .container {
- padding: 0 24px;
- }
-
- .hot-list {
- grid-template-columns: repeat(2, 1fr);
- gap: 16px;
- }
-
- .title {
- font-size: 32px;
- }
-}
-
-/* 电脑端适配 */
-@media (min-width: 1025px) {
- .container {
- padding: 0 32px;
- }
-
- .hot-list {
- grid-template-columns: repeat(2, 1fr);
- gap: 20px;
- }
-
- .title {
- font-size: 36px;
- }
-
- .hot-item {
- padding: 20px;
- }
-
- .item-title {
- font-size: 17px;
- }
-}
-
-/* 大屏幕优化 */
-@media (min-width: 1400px) {
- .hot-list {
- grid-template-columns: repeat(3, 1fr);
- }
+/* 基础样式重置 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
+ line-height: 1.6;
+ color: #2c3e50;
+ overflow-x: hidden;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 16px;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+}
+
+/* 头部样式 */
+.header {
+ text-align: center;
+ padding: 24px 0;
+ border-bottom: 2px solid #a8e6cf;
+ margin-bottom: 24px;
+}
+
+.title {
+ font-size: 28px;
+ font-weight: 700;
+ color: #27ae60;
+ margin-bottom: 8px;
+ text-shadow: 0 2px 4px rgba(39, 174, 96, 0.1);
+}
+
+.subtitle {
+ font-size: 14px;
+ color: #7f8c8d;
+ font-weight: 400;
+}
+
+/* 主内容区域 */
+.main-content {
+ flex: 1;
+ position: relative;
+}
+
+/* 加载状态 */
+.loading {
+ text-align: center;
+ padding: 60px 20px;
+ color: #27ae60;
+}
+
+.loading-spinner {
+ width: 40px;
+ height: 40px;
+ border: 3px solid #a8e6cf;
+ border-top: 3px solid #27ae60;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ margin: 0 auto 16px;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+/* 错误信息 */
+.error-message {
+ text-align: center;
+ padding: 40px 20px;
+ color: #e74c3c;
+}
+
+.retry-btn {
+ background: #27ae60;
+ color: white;
+ border: none;
+ padding: 10px 20px;
+ border-radius: 20px;
+ cursor: pointer;
+ font-size: 14px;
+ margin-top: 16px;
+ transition: background 0.3s ease;
+}
+
+.retry-btn:hover {
+ background: #219a52;
+}
+
+/* 热点列表 */
+.hot-list {
+ display: grid;
+ gap: 12px;
+}
+
+.hot-item {
+ background: #ffffff;
+ border: 1px solid #e8f5e8;
+ border-radius: 12px;
+ padding: 16px;
+ transition: all 0.3s ease;
+ box-shadow: 0 2px 8px rgba(39, 174, 96, 0.08);
+ position: relative;
+ overflow: hidden;
+}
+
+.hot-item:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 4px 16px rgba(39, 174, 96, 0.15);
+ border-color: #a8e6cf;
+}
+
+.hot-item::before {
+ content: '';
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 4px;
+ height: 100%;
+ background: linear-gradient(to bottom, #27ae60, #a8e6cf);
+}
+
+.item-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 8px;
+}
+
+.rank {
+ background: linear-gradient(135deg, #27ae60, #2ecc71);
+ color: white;
+ width: 28px;
+ height: 28px;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-weight: 700;
+ font-size: 14px;
+ flex-shrink: 0;
+}
+
+.rank.top3 {
+ background: linear-gradient(135deg, #f39c12, #e67e22);
+}
+
+.word-type {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+}
+
+.type-icon {
+ width: 16px;
+ height: 16px;
+ object-fit: contain;
+}
+
+.type-text {
+ font-size: 12px;
+ padding: 2px 8px;
+ border-radius: 10px;
+ font-weight: 500;
+}
+
+.type-hot {
+ background: #ffe6e6;
+ color: #e74c3c;
+}
+
+.type-new {
+ background: #e6f3ff;
+ color: #3498db;
+}
+
+.item-content {
+ margin-bottom: 8px;
+}
+
+.item-title {
+ font-size: 16px;
+ font-weight: 600;
+ color: #2c3e50;
+ line-height: 1.4;
+ margin-bottom: 4px;
+ cursor: pointer;
+ transition: color 0.3s ease;
+}
+
+.item-title:hover {
+ color: #27ae60;
+}
+
+.item-score {
+ font-size: 14px;
+ color: #7f8c8d;
+ font-weight: 500;
+}
+
+/* 底部 */
+.footer {
+ text-align: center;
+ padding: 24px 0;
+ border-top: 1px solid #e8f5e8;
+ margin-top: 32px;
+}
+
+.update-time {
+ font-size: 12px;
+ color: #95a5a6;
+}
+
+/* 手机端优化 (默认) */
+@media (max-width: 768px) {
+ .container {
+ padding: 0 12px;
+ }
+
+ .header {
+ padding: 20px 0;
+ }
+
+ .title {
+ font-size: 24px;
+ }
+
+ .subtitle {
+ font-size: 13px;
+ }
+
+ .hot-item {
+ padding: 14px;
+ }
+
+ .item-title {
+ font-size: 15px;
+ }
+
+ .rank {
+ width: 26px;
+ height: 26px;
+ font-size: 13px;
+ }
+}
+
+/* 平板端适配 */
+@media (min-width: 769px) and (max-width: 1024px) {
+ .container {
+ padding: 0 24px;
+ }
+
+ .hot-list {
+ grid-template-columns: repeat(2, 1fr);
+ gap: 16px;
+ }
+
+ .title {
+ font-size: 32px;
+ }
+}
+
+/* 电脑端适配 */
+@media (min-width: 1025px) {
+ .container {
+ padding: 0 32px;
+ }
+
+ .hot-list {
+ grid-template-columns: repeat(2, 1fr);
+ gap: 20px;
+ }
+
+ .title {
+ font-size: 36px;
+ }
+
+ .hot-item {
+ padding: 20px;
+ }
+
+ .item-title {
+ font-size: 17px;
+ }
+}
+
+/* 大屏幕优化 */
+@media (min-width: 1400px) {
+ .hot-list {
+ grid-template-columns: repeat(3, 1fr);
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/返回接口.json
index 493aa294..60506d2b 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/返回接口.json
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/小红书热点/返回接口.json
@@ -1,166 +1,166 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": [
- {
- "rank": 1,
- "title": "九三阅兵",
- "score": "908.5w",
- "word_type": "热",
- "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png",
- "link": "https://www.xiaohongshu.com/search_result?keyword=%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5&type=51"
- },
- {
- "rank": 2,
- "title": "我镜头下的中式建筑美学",
- "score": "872.9w",
- "word_type": "新",
- "work_type_icon": "https://sns-img-qc.xhscdn.com/search/trends/icon/label/new/version/1",
- "link": "https://www.xiaohongshu.com/search_result?keyword=%E6%88%91%E9%95%9C%E5%A4%B4%E4%B8%8B%E7%9A%84%E4%B8%AD%E5%BC%8F%E5%BB%BA%E7%AD%91%E7%BE%8E%E5%AD%A6&type=51"
- },
- {
- "rank": 3,
- "title": "原来人机感才是出片的秘诀",
- "score": "754.4w",
- "word_type": "无",
- "work_type_icon": "",
- "link": "https://www.xiaohongshu.com/search_result?keyword=%E5%8E%9F%E6%9D%A5%E4%BA%BA%E6%9C%BA%E6%84%9F%E6%89%8D%E6%98%AF%E5%87%BA%E7%89%87%E7%9A%84%E7%A7%98%E8%AF%80&type=51"
- },
- {
- "rank": 4,
- "title": "我的二十年航天路",
- "score": "703.9w",
- "word_type": "热",
- "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png",
- "link": "https://www.xiaohongshu.com/search_result?keyword=%E6%88%91%E7%9A%84%E4%BA%8C%E5%8D%81%E5%B9%B4%E8%88%AA%E5%A4%A9%E8%B7%AF&type=51"
- },
- {
- "rank": 5,
- "title": "用横图的方式打开香格里拉",
- "score": "458.5w",
- "word_type": "新",
- "work_type_icon": "https://sns-img-qc.xhscdn.com/search/trends/icon/label/new/version/1",
- "link": "https://www.xiaohongshu.com/search_result?keyword=%E7%94%A8%E6%A8%AA%E5%9B%BE%E7%9A%84%E6%96%B9%E5%BC%8F%E6%89%93%E5%BC%80%E9%A6%99%E6%A0%BC%E9%87%8C%E6%8B%89&type=51"
- },
- {
- "rank": 6,
- "title": "我拍到了苏州丰收的景象",
- "score": "392w",
- "word_type": "无",
- "work_type_icon": "",
- "link": "https://www.xiaohongshu.com/search_result?keyword=%E6%88%91%E6%8B%8D%E5%88%B0%E4%BA%86%E8%8B%8F%E5%B7%9E%E4%B8%B0%E6%94%B6%E7%9A%84%E6%99%AF%E8%B1%A1&type=51"
- },
- {
- "rank": 7,
- "title": "我拍下了960万平方公里的中国",
- "score": "390.7w",
- "word_type": "热",
- "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png",
- "link": "https://www.xiaohongshu.com/search_result?keyword=%E6%88%91%E6%8B%8D%E4%B8%8B%E4%BA%86960%E4%B8%87%E5%B9%B3%E6%96%B9%E5%85%AC%E9%87%8C%E7%9A%84%E4%B8%AD%E5%9B%BD&type=51"
- },
- {
- "rank": 8,
- "title": "12岁冰岛少年的川剧变脸梦",
- "score": "389.7w",
- "word_type": "热",
- "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png",
- "link": "https://www.xiaohongshu.com/search_result?keyword=12%E5%B2%81%E5%86%B0%E5%B2%9B%E5%B0%91%E5%B9%B4%E7%9A%84%E5%B7%9D%E5%89%A7%E5%8F%98%E8%84%B8%E6%A2%A6&type=51"
- },
- {
- "rank": 9,
- "title": "人生总要去一次阿勒泰吧",
- "score": "389.6w",
- "word_type": "新",
- "work_type_icon": "https://sns-img-qc.xhscdn.com/search/trends/icon/label/new/version/1",
- "link": "https://www.xiaohongshu.com/search_result?keyword=%E4%BA%BA%E7%94%9F%E6%80%BB%E8%A6%81%E5%8E%BB%E4%B8%80%E6%AC%A1%E9%98%BF%E5%8B%92%E6%B3%B0%E5%90%A7&type=51"
- },
- {
- "rank": 10,
- "title": "普通人的10年绘画进步史",
- "score": "389.4w",
- "word_type": "无",
- "work_type_icon": "",
- "link": "https://www.xiaohongshu.com/search_result?keyword=%E6%99%AE%E9%80%9A%E4%BA%BA%E7%9A%8410%E5%B9%B4%E7%BB%98%E7%94%BB%E8%BF%9B%E6%AD%A5%E5%8F%B2&type=51"
- },
- {
- "rank": 11,
- "title": "过生日不要忘记反转镜头",
- "score": "389.2w",
- "word_type": "热",
- "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png",
- "link": "https://www.xiaohongshu.com/search_result?keyword=%E8%BF%87%E7%94%9F%E6%97%A5%E4%B8%8D%E8%A6%81%E5%BF%98%E8%AE%B0%E5%8F%8D%E8%BD%AC%E9%95%9C%E5%A4%B4&type=51"
- },
- {
- "rank": 12,
- "title": "低卡又解馋的报恩零食",
- "score": "389.2w",
- "word_type": "无",
- "work_type_icon": "",
- "link": "https://www.xiaohongshu.com/search_result?keyword=%E4%BD%8E%E5%8D%A1%E5%8F%88%E8%A7%A3%E9%A6%8B%E7%9A%84%E6%8A%A5%E6%81%A9%E9%9B%B6%E9%A3%9F&type=51"
- },
- {
- "rank": 13,
- "title": "和爸妈去旅游 我是水印",
- "score": "389w",
- "word_type": "新",
- "work_type_icon": "https://sns-img-qc.xhscdn.com/search/trends/icon/label/new/version/1",
- "link": "https://www.xiaohongshu.com/search_result?keyword=%E5%92%8C%E7%88%B8%E5%A6%88%E5%8E%BB%E6%97%85%E6%B8%B8%20%E6%88%91%E6%98%AF%E6%B0%B4%E5%8D%B0&type=51"
- },
- {
- "rank": 14,
- "title": "一种很新的镜子拍谷法出现了",
- "score": "389w",
- "word_type": "热",
- "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png",
- "link": "https://www.xiaohongshu.com/search_result?keyword=%E4%B8%80%E7%A7%8D%E5%BE%88%E6%96%B0%E7%9A%84%E9%95%9C%E5%AD%90%E6%8B%8D%E8%B0%B7%E6%B3%95%E5%87%BA%E7%8E%B0%E4%BA%86&type=51"
- },
- {
- "rank": 15,
- "title": "二次构图带来的故事感",
- "score": "389w",
- "word_type": "无",
- "work_type_icon": "",
- "link": "https://www.xiaohongshu.com/search_result?keyword=%E4%BA%8C%E6%AC%A1%E6%9E%84%E5%9B%BE%E5%B8%A6%E6%9D%A5%E7%9A%84%E6%95%85%E4%BA%8B%E6%84%9F&type=51"
- },
- {
- "rank": 16,
- "title": "当我在老动画片里找美妆灵感",
- "score": "389w",
- "word_type": "无",
- "work_type_icon": "",
- "link": "https://www.xiaohongshu.com/search_result?keyword=%E5%BD%93%E6%88%91%E5%9C%A8%E8%80%81%E5%8A%A8%E7%94%BB%E7%89%87%E9%87%8C%E6%89%BE%E7%BE%8E%E5%A6%86%E7%81%B5%E6%84%9F&type=51"
- },
- {
- "rank": 17,
- "title": "在蓝调时刻起舞告别夏天",
- "score": "389w",
- "word_type": "热",
- "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png",
- "link": "https://www.xiaohongshu.com/search_result?keyword=%E5%9C%A8%E8%93%9D%E8%B0%83%E6%97%B6%E5%88%BB%E8%B5%B7%E8%88%9E%E5%91%8A%E5%88%AB%E5%A4%8F%E5%A4%A9&type=51"
- },
- {
- "rank": 18,
- "title": "人生建议:去看一次鱼灯巡游",
- "score": "389w",
- "word_type": "无",
- "work_type_icon": "",
- "link": "https://www.xiaohongshu.com/search_result?keyword=%E4%BA%BA%E7%94%9F%E5%BB%BA%E8%AE%AE%EF%BC%9A%E5%8E%BB%E7%9C%8B%E4%B8%80%E6%AC%A1%E9%B1%BC%E7%81%AF%E5%B7%A1%E6%B8%B8&type=51"
- },
- {
- "rank": 19,
- "title": "夜晚的树是大自然送给天空的星星",
- "score": "389w",
- "word_type": "新",
- "work_type_icon": "https://sns-img-qc.xhscdn.com/search/trends/icon/label/new/version/1",
- "link": "https://www.xiaohongshu.com/search_result?keyword=%E5%A4%9C%E6%99%9A%E7%9A%84%E6%A0%91%E6%98%AF%E5%A4%A7%E8%87%AA%E7%84%B6%E9%80%81%E7%BB%99%E5%A4%A9%E7%A9%BA%E7%9A%84%E6%98%9F%E6%98%9F&type=51"
- },
- {
- "rank": 20,
- "title": "欢迎收看老师开学的一天",
- "score": "389w",
- "word_type": "无",
- "work_type_icon": "",
- "link": "https://www.xiaohongshu.com/search_result?keyword=%E6%AC%A2%E8%BF%8E%E6%94%B6%E7%9C%8B%E8%80%81%E5%B8%88%E5%BC%80%E5%AD%A6%E7%9A%84%E4%B8%80%E5%A4%A9&type=51"
- }
- ]
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": [
+ {
+ "rank": 1,
+ "title": "九三阅兵",
+ "score": "908.5w",
+ "word_type": "热",
+ "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png",
+ "link": "https://www.xiaohongshu.com/search_result?keyword=%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5&type=51"
+ },
+ {
+ "rank": 2,
+ "title": "我镜头下的中式建筑美学",
+ "score": "872.9w",
+ "word_type": "新",
+ "work_type_icon": "https://sns-img-qc.xhscdn.com/search/trends/icon/label/new/version/1",
+ "link": "https://www.xiaohongshu.com/search_result?keyword=%E6%88%91%E9%95%9C%E5%A4%B4%E4%B8%8B%E7%9A%84%E4%B8%AD%E5%BC%8F%E5%BB%BA%E7%AD%91%E7%BE%8E%E5%AD%A6&type=51"
+ },
+ {
+ "rank": 3,
+ "title": "原来人机感才是出片的秘诀",
+ "score": "754.4w",
+ "word_type": "无",
+ "work_type_icon": "",
+ "link": "https://www.xiaohongshu.com/search_result?keyword=%E5%8E%9F%E6%9D%A5%E4%BA%BA%E6%9C%BA%E6%84%9F%E6%89%8D%E6%98%AF%E5%87%BA%E7%89%87%E7%9A%84%E7%A7%98%E8%AF%80&type=51"
+ },
+ {
+ "rank": 4,
+ "title": "我的二十年航天路",
+ "score": "703.9w",
+ "word_type": "热",
+ "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png",
+ "link": "https://www.xiaohongshu.com/search_result?keyword=%E6%88%91%E7%9A%84%E4%BA%8C%E5%8D%81%E5%B9%B4%E8%88%AA%E5%A4%A9%E8%B7%AF&type=51"
+ },
+ {
+ "rank": 5,
+ "title": "用横图的方式打开香格里拉",
+ "score": "458.5w",
+ "word_type": "新",
+ "work_type_icon": "https://sns-img-qc.xhscdn.com/search/trends/icon/label/new/version/1",
+ "link": "https://www.xiaohongshu.com/search_result?keyword=%E7%94%A8%E6%A8%AA%E5%9B%BE%E7%9A%84%E6%96%B9%E5%BC%8F%E6%89%93%E5%BC%80%E9%A6%99%E6%A0%BC%E9%87%8C%E6%8B%89&type=51"
+ },
+ {
+ "rank": 6,
+ "title": "我拍到了苏州丰收的景象",
+ "score": "392w",
+ "word_type": "无",
+ "work_type_icon": "",
+ "link": "https://www.xiaohongshu.com/search_result?keyword=%E6%88%91%E6%8B%8D%E5%88%B0%E4%BA%86%E8%8B%8F%E5%B7%9E%E4%B8%B0%E6%94%B6%E7%9A%84%E6%99%AF%E8%B1%A1&type=51"
+ },
+ {
+ "rank": 7,
+ "title": "我拍下了960万平方公里的中国",
+ "score": "390.7w",
+ "word_type": "热",
+ "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png",
+ "link": "https://www.xiaohongshu.com/search_result?keyword=%E6%88%91%E6%8B%8D%E4%B8%8B%E4%BA%86960%E4%B8%87%E5%B9%B3%E6%96%B9%E5%85%AC%E9%87%8C%E7%9A%84%E4%B8%AD%E5%9B%BD&type=51"
+ },
+ {
+ "rank": 8,
+ "title": "12岁冰岛少年的川剧变脸梦",
+ "score": "389.7w",
+ "word_type": "热",
+ "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png",
+ "link": "https://www.xiaohongshu.com/search_result?keyword=12%E5%B2%81%E5%86%B0%E5%B2%9B%E5%B0%91%E5%B9%B4%E7%9A%84%E5%B7%9D%E5%89%A7%E5%8F%98%E8%84%B8%E6%A2%A6&type=51"
+ },
+ {
+ "rank": 9,
+ "title": "人生总要去一次阿勒泰吧",
+ "score": "389.6w",
+ "word_type": "新",
+ "work_type_icon": "https://sns-img-qc.xhscdn.com/search/trends/icon/label/new/version/1",
+ "link": "https://www.xiaohongshu.com/search_result?keyword=%E4%BA%BA%E7%94%9F%E6%80%BB%E8%A6%81%E5%8E%BB%E4%B8%80%E6%AC%A1%E9%98%BF%E5%8B%92%E6%B3%B0%E5%90%A7&type=51"
+ },
+ {
+ "rank": 10,
+ "title": "普通人的10年绘画进步史",
+ "score": "389.4w",
+ "word_type": "无",
+ "work_type_icon": "",
+ "link": "https://www.xiaohongshu.com/search_result?keyword=%E6%99%AE%E9%80%9A%E4%BA%BA%E7%9A%8410%E5%B9%B4%E7%BB%98%E7%94%BB%E8%BF%9B%E6%AD%A5%E5%8F%B2&type=51"
+ },
+ {
+ "rank": 11,
+ "title": "过生日不要忘记反转镜头",
+ "score": "389.2w",
+ "word_type": "热",
+ "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png",
+ "link": "https://www.xiaohongshu.com/search_result?keyword=%E8%BF%87%E7%94%9F%E6%97%A5%E4%B8%8D%E8%A6%81%E5%BF%98%E8%AE%B0%E5%8F%8D%E8%BD%AC%E9%95%9C%E5%A4%B4&type=51"
+ },
+ {
+ "rank": 12,
+ "title": "低卡又解馋的报恩零食",
+ "score": "389.2w",
+ "word_type": "无",
+ "work_type_icon": "",
+ "link": "https://www.xiaohongshu.com/search_result?keyword=%E4%BD%8E%E5%8D%A1%E5%8F%88%E8%A7%A3%E9%A6%8B%E7%9A%84%E6%8A%A5%E6%81%A9%E9%9B%B6%E9%A3%9F&type=51"
+ },
+ {
+ "rank": 13,
+ "title": "和爸妈去旅游 我是水印",
+ "score": "389w",
+ "word_type": "新",
+ "work_type_icon": "https://sns-img-qc.xhscdn.com/search/trends/icon/label/new/version/1",
+ "link": "https://www.xiaohongshu.com/search_result?keyword=%E5%92%8C%E7%88%B8%E5%A6%88%E5%8E%BB%E6%97%85%E6%B8%B8%20%E6%88%91%E6%98%AF%E6%B0%B4%E5%8D%B0&type=51"
+ },
+ {
+ "rank": 14,
+ "title": "一种很新的镜子拍谷法出现了",
+ "score": "389w",
+ "word_type": "热",
+ "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png",
+ "link": "https://www.xiaohongshu.com/search_result?keyword=%E4%B8%80%E7%A7%8D%E5%BE%88%E6%96%B0%E7%9A%84%E9%95%9C%E5%AD%90%E6%8B%8D%E8%B0%B7%E6%B3%95%E5%87%BA%E7%8E%B0%E4%BA%86&type=51"
+ },
+ {
+ "rank": 15,
+ "title": "二次构图带来的故事感",
+ "score": "389w",
+ "word_type": "无",
+ "work_type_icon": "",
+ "link": "https://www.xiaohongshu.com/search_result?keyword=%E4%BA%8C%E6%AC%A1%E6%9E%84%E5%9B%BE%E5%B8%A6%E6%9D%A5%E7%9A%84%E6%95%85%E4%BA%8B%E6%84%9F&type=51"
+ },
+ {
+ "rank": 16,
+ "title": "当我在老动画片里找美妆灵感",
+ "score": "389w",
+ "word_type": "无",
+ "work_type_icon": "",
+ "link": "https://www.xiaohongshu.com/search_result?keyword=%E5%BD%93%E6%88%91%E5%9C%A8%E8%80%81%E5%8A%A8%E7%94%BB%E7%89%87%E9%87%8C%E6%89%BE%E7%BE%8E%E5%A6%86%E7%81%B5%E6%84%9F&type=51"
+ },
+ {
+ "rank": 17,
+ "title": "在蓝调时刻起舞告别夏天",
+ "score": "389w",
+ "word_type": "热",
+ "work_type_icon": "https://picasso-static.xiaohongshu.com/fe-platform/cfd317ff14757c7ede6ef5176ec487589565e49e.png",
+ "link": "https://www.xiaohongshu.com/search_result?keyword=%E5%9C%A8%E8%93%9D%E8%B0%83%E6%97%B6%E5%88%BB%E8%B5%B7%E8%88%9E%E5%91%8A%E5%88%AB%E5%A4%8F%E5%A4%A9&type=51"
+ },
+ {
+ "rank": 18,
+ "title": "人生建议:去看一次鱼灯巡游",
+ "score": "389w",
+ "word_type": "无",
+ "work_type_icon": "",
+ "link": "https://www.xiaohongshu.com/search_result?keyword=%E4%BA%BA%E7%94%9F%E5%BB%BA%E8%AE%AE%EF%BC%9A%E5%8E%BB%E7%9C%8B%E4%B8%80%E6%AC%A1%E9%B1%BC%E7%81%AF%E5%B7%A1%E6%B8%B8&type=51"
+ },
+ {
+ "rank": 19,
+ "title": "夜晚的树是大自然送给天空的星星",
+ "score": "389w",
+ "word_type": "新",
+ "work_type_icon": "https://sns-img-qc.xhscdn.com/search/trends/icon/label/new/version/1",
+ "link": "https://www.xiaohongshu.com/search_result?keyword=%E5%A4%9C%E6%99%9A%E7%9A%84%E6%A0%91%E6%98%AF%E5%A4%A7%E8%87%AA%E7%84%B6%E9%80%81%E7%BB%99%E5%A4%A9%E7%A9%BA%E7%9A%84%E6%98%9F%E6%98%9F&type=51"
+ },
+ {
+ "rank": 20,
+ "title": "欢迎收看老师开学的一天",
+ "score": "389w",
+ "word_type": "无",
+ "work_type_icon": "",
+ "link": "https://www.xiaohongshu.com/search_result?keyword=%E6%AC%A2%E8%BF%8E%E6%94%B6%E7%9C%8B%E8%80%81%E5%B8%88%E5%BC%80%E5%AD%A6%E7%9A%84%E4%B8%80%E5%A4%A9&type=51"
+ }
+ ]
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/css/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/css/background.css
index 4b71bd0d..d7719878 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/css/background.css
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/css/background.css
@@ -1,37 +1,37 @@
-.background-container {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- z-index: -1;
- overflow: hidden;
- background-color: #f8f9fa;
-}
-
-.modern-gradient {
- position: absolute;
- top: -50%;
- left: -50%;
- width: 200%;
- height: 200%;
- background: linear-gradient(
- 135deg,
- rgba(230, 22, 45, 0.4) 0%,
- rgba(245, 80, 80, 0.3) 25%,
- rgba(250, 120, 110, 0.2) 50%,
- rgba(255, 140, 140, 0.3) 75%,
- rgba(255, 90, 90, 0.4) 100%
- );
- animation: gradient-flow 20s ease-in-out infinite;
- border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
-}
-
-@keyframes rainbow-rotate {
- 0% {
- transform: rotate(0deg);
- }
- 100% {
- transform: rotate(360deg);
- }
+.background-container {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: -1;
+ overflow: hidden;
+ background-color: #f8f9fa;
+}
+
+.modern-gradient {
+ position: absolute;
+ top: -50%;
+ left: -50%;
+ width: 200%;
+ height: 200%;
+ background: linear-gradient(
+ 135deg,
+ rgba(230, 22, 45, 0.4) 0%,
+ rgba(245, 80, 80, 0.3) 25%,
+ rgba(250, 120, 110, 0.2) 50%,
+ rgba(255, 140, 140, 0.3) 75%,
+ rgba(255, 90, 90, 0.4) 100%
+ );
+ animation: gradient-flow 20s ease-in-out infinite;
+ border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
+}
+
+@keyframes rainbow-rotate {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/css/style.css b/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/css/style.css
index 0a661dcc..c73ae589 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/css/style.css
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/css/style.css
@@ -1,384 +1,384 @@
-/* 背景样式 */
-.background-container {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- z-index: -1;
- overflow: hidden;
- background-color: #f8f9fa;
-}
-
-.modern-gradient {
- position: absolute;
- top: -50%;
- left: -50%;
- width: 200%;
- height: 200%;
- background: linear-gradient(
- 135deg,
- rgba(64, 169, 255, 0.4) 0%,
- rgba(120, 192, 255, 0.3) 25%,
- rgba(255, 175, 64, 0.2) 50%,
- rgba(255, 140, 50, 0.3) 75%,
- rgba(255, 122, 69, 0.4) 100%
- );
- animation: gradient-flow 20s ease-in-out infinite;
- border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
-}
-
-.modern-gradient::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: radial-gradient(
- circle at 30% 70%,
- rgba(64, 169, 255, 0.5) 0%,
- transparent 50%
- ), radial-gradient(
- circle at 70% 30%,
- rgba(255, 140, 50, 0.4) 0%,
- transparent 50%
- );
- animation: pulse-effect 15s ease-in-out infinite alternate;
- border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
-}
-
-@keyframes gradient-flow {
- 0%, 100% {
- transform: rotate(0deg) scale(1);
- opacity: 0.8;
- }
- 25% {
- transform: rotate(90deg) scale(1.1);
- opacity: 0.6;
- }
- 50% {
- transform: rotate(180deg) scale(0.9);
- opacity: 0.9;
- }
- 75% {
- transform: rotate(270deg) scale(1.05);
- opacity: 0.7;
- }
-}
-
-@keyframes pulse-effect {
- 0% {
- transform: scale(1) rotate(0deg);
- opacity: 0.5;
- }
- 50% {
- transform: scale(1.2) rotate(180deg);
- opacity: 0.8;
- }
- 100% {
- transform: scale(1) rotate(360deg);
- opacity: 0.6;
- }
-}
-
-/* 主样式 */
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
- color: #333;
- background-color: #f8f9fa;
- position: relative;
- min-height: 100vh;
-}
-
-/* 微博Logo样式 */
-.title-container {
- display: flex;
- flex-direction: column;
- align-items: center;
- margin-bottom: 10px;
-}
-
-.weibo-logo-container {
- margin-top: 10px;
-}
-
-.weibo-logo {
- background-color: #e6162d;
- color: white;
- font-weight: bold;
- padding: 4px 10px;
- border-radius: 15px;
- font-size: 16px;
- display: inline-block;
- box-shadow: 0 2px 5px rgba(0,0,0,0.2);
-}
-
-/* Q版眨眼动画样式 */
-.qeye-container {
- display: flex;
- justify-content: center;
- margin-bottom: 10px;
-}
-
-.qeye {
- width: 80px;
- height: 48px;
-}
-
-.container {
- max-width: 800px;
- margin: 0 auto;
- padding: 24px;
- position: relative;
- z-index: 1;
- background-color: rgba(255, 255, 255, 0.85);
- border-radius: 16px;
- box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08);
- backdrop-filter: blur(10px);
-}
-
-header {
- text-align: center;
- margin-bottom: 28px;
- padding-bottom: 20px;
- border-bottom: 1px solid rgba(0, 0, 0, 0.06);
-}
-
-header h1 {
- background: linear-gradient(135deg, #4096ff, #ff7a45);
- -webkit-background-clip: text;
- background-clip: text;
- color: transparent;
- margin-bottom: 14px;
- font-size: 2.4rem;
- font-weight: 700;
- letter-spacing: -0.5px;
-}
-
-.update-time {
- color: #666;
- font-size: 0.9rem;
- background-color: rgba(0, 0, 0, 0.03);
- padding: 8px 16px;
- border-radius: 24px;
- display: inline-block;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
-}
-
-.hot-list {
- list-style: none;
-}
-
-.hot-item {
- padding: 20px;
- margin-bottom: 16px;
- border-radius: 12px;
- background-color: white;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04);
- transition: all 0.3s ease;
- display: flex;
- align-items: center;
- border: 1px solid rgba(0, 0, 0, 0.03);
-}
-
-.hot-item:hover {
- transform: translateY(-3px);
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
- border-color: rgba(64, 169, 255, 0.3);
-}
-
-.hot-rank {
- font-size: 1.2rem;
- font-weight: bold;
- color: #4096ff;
- margin-right: 18px;
- min-width: 38px;
- text-align: center;
- background-color: rgba(64, 169, 255, 0.1);
- border-radius: 50%;
- width: 38px;
- height: 38px;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.hot-rank.top-1 {
- background: linear-gradient(135deg, #ff4d4f, #ff7a45);
- color: white;
-}
-
-.hot-rank.top-2 {
- background: linear-gradient(135deg, #ff7a45, #ffa940);
- color: white;
-}
-
-.hot-rank.top-3 {
- background: linear-gradient(135deg, #ffa940, #ffec3d);
- color: white;
-}
-
-.hot-content {
- flex: 1;
-}
-
-.hot-title {
- font-size: 1.15rem;
- margin-bottom: 8px;
- color: #333;
- text-decoration: none;
- display: block;
- line-height: 1.5;
- font-weight: 500;
- transition: color 0.2s ease;
-}
-
-.hot-title:hover {
- color: #4096ff;
- text-decoration: none;
-}
-
-.loading {
- text-align: center;
- padding: 40px;
- color: #666;
- font-size: 1.1rem;
-}
-
-footer {
- text-align: center;
- margin-top: 30px;
- padding-top: 20px;
- border-top: 1px solid rgba(0, 0, 0, 0.06);
- color: #666;
- font-size: 0.9rem;
-}
-
-/* 响应式设计 */
-@media (max-width: 1024px) and (min-width: 768px) {
- .container {
- max-width: 90%;
- padding: 20px;
- }
-
- header h1 {
- font-size: 2.2rem;
- }
-
- .hot-item {
- padding: 18px;
- }
-
- .hot-title {
- font-size: 1.1rem;
- }
-}
-
-@media (max-width: 768px) {
- body {
- background-color: #f8f9fa;
- }
-
- .container {
- max-width: 95%;
- margin: 12px auto;
- padding: 16px;
- border-radius: 12px;
- }
-
- header {
- margin-bottom: 20px;
- padding-bottom: 16px;
- }
-
- header h1 {
- font-size: 1.8rem;
- margin-bottom: 10px;
- }
-
- .update-time {
- font-size: 0.85rem;
- padding: 6px 12px;
- }
-
- .hot-item {
- padding: 16px;
- margin-bottom: 12px;
- border-radius: 10px;
- flex-direction: row;
- align-items: flex-start;
- }
-
- .hot-rank {
- font-size: 1.1rem;
- margin-right: 14px;
- min-width: 32px;
- width: 32px;
- height: 32px;
- margin-top: 2px;
- }
-
- .hot-title {
- font-size: 1rem;
- line-height: 1.5;
- margin-bottom: 6px;
- }
-
- footer {
- margin-top: 24px;
- padding-top: 16px;
- font-size: 0.85rem;
- }
-}
-
-@media (max-width: 480px) {
- .container {
- margin: 8px auto;
- padding: 14px;
- }
-
- header h1 {
- font-size: 1.6rem;
- }
-
- .hot-item {
- padding: 14px;
- margin-bottom: 10px;
- }
-
- .hot-rank {
- font-size: 1rem;
- margin-right: 12px;
- min-width: 30px;
- width: 30px;
- height: 30px;
- }
-
- .hot-title {
- font-size: 0.95rem;
- }
-}
-
-/* 减少动画以节省电池 */
-@media (prefers-reduced-motion: reduce) {
- .modern-gradient,
- .modern-gradient::before {
- animation: none;
- }
-
- .modern-gradient {
- background: linear-gradient(
- 135deg,
- rgba(64, 169, 255, 0.3) 0%,
- rgba(255, 175, 64, 0.2) 50%,
- rgba(255, 122, 69, 0.25) 100%
- );
- }
+/* 背景样式 */
+.background-container {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: -1;
+ overflow: hidden;
+ background-color: #f8f9fa;
+}
+
+.modern-gradient {
+ position: absolute;
+ top: -50%;
+ left: -50%;
+ width: 200%;
+ height: 200%;
+ background: linear-gradient(
+ 135deg,
+ rgba(64, 169, 255, 0.4) 0%,
+ rgba(120, 192, 255, 0.3) 25%,
+ rgba(255, 175, 64, 0.2) 50%,
+ rgba(255, 140, 50, 0.3) 75%,
+ rgba(255, 122, 69, 0.4) 100%
+ );
+ animation: gradient-flow 20s ease-in-out infinite;
+ border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
+}
+
+.modern-gradient::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: radial-gradient(
+ circle at 30% 70%,
+ rgba(64, 169, 255, 0.5) 0%,
+ transparent 50%
+ ), radial-gradient(
+ circle at 70% 30%,
+ rgba(255, 140, 50, 0.4) 0%,
+ transparent 50%
+ );
+ animation: pulse-effect 15s ease-in-out infinite alternate;
+ border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
+}
+
+@keyframes gradient-flow {
+ 0%, 100% {
+ transform: rotate(0deg) scale(1);
+ opacity: 0.8;
+ }
+ 25% {
+ transform: rotate(90deg) scale(1.1);
+ opacity: 0.6;
+ }
+ 50% {
+ transform: rotate(180deg) scale(0.9);
+ opacity: 0.9;
+ }
+ 75% {
+ transform: rotate(270deg) scale(1.05);
+ opacity: 0.7;
+ }
+}
+
+@keyframes pulse-effect {
+ 0% {
+ transform: scale(1) rotate(0deg);
+ opacity: 0.5;
+ }
+ 50% {
+ transform: scale(1.2) rotate(180deg);
+ opacity: 0.8;
+ }
+ 100% {
+ transform: scale(1) rotate(360deg);
+ opacity: 0.6;
+ }
+}
+
+/* 主样式 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
+ color: #333;
+ background-color: #f8f9fa;
+ position: relative;
+ min-height: 100vh;
+}
+
+/* 微博Logo样式 */
+.title-container {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ margin-bottom: 10px;
+}
+
+.weibo-logo-container {
+ margin-top: 10px;
+}
+
+.weibo-logo {
+ background-color: #e6162d;
+ color: white;
+ font-weight: bold;
+ padding: 4px 10px;
+ border-radius: 15px;
+ font-size: 16px;
+ display: inline-block;
+ box-shadow: 0 2px 5px rgba(0,0,0,0.2);
+}
+
+/* Q版眨眼动画样式 */
+.qeye-container {
+ display: flex;
+ justify-content: center;
+ margin-bottom: 10px;
+}
+
+.qeye {
+ width: 80px;
+ height: 48px;
+}
+
+.container {
+ max-width: 800px;
+ margin: 0 auto;
+ padding: 24px;
+ position: relative;
+ z-index: 1;
+ background-color: rgba(255, 255, 255, 0.85);
+ border-radius: 16px;
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08);
+ backdrop-filter: blur(10px);
+}
+
+header {
+ text-align: center;
+ margin-bottom: 28px;
+ padding-bottom: 20px;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.06);
+}
+
+header h1 {
+ background: linear-gradient(135deg, #4096ff, #ff7a45);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+ margin-bottom: 14px;
+ font-size: 2.4rem;
+ font-weight: 700;
+ letter-spacing: -0.5px;
+}
+
+.update-time {
+ color: #666;
+ font-size: 0.9rem;
+ background-color: rgba(0, 0, 0, 0.03);
+ padding: 8px 16px;
+ border-radius: 24px;
+ display: inline-block;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
+}
+
+.hot-list {
+ list-style: none;
+}
+
+.hot-item {
+ padding: 20px;
+ margin-bottom: 16px;
+ border-radius: 12px;
+ background-color: white;
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04);
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ border: 1px solid rgba(0, 0, 0, 0.03);
+}
+
+.hot-item:hover {
+ transform: translateY(-3px);
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
+ border-color: rgba(64, 169, 255, 0.3);
+}
+
+.hot-rank {
+ font-size: 1.2rem;
+ font-weight: bold;
+ color: #4096ff;
+ margin-right: 18px;
+ min-width: 38px;
+ text-align: center;
+ background-color: rgba(64, 169, 255, 0.1);
+ border-radius: 50%;
+ width: 38px;
+ height: 38px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.hot-rank.top-1 {
+ background: linear-gradient(135deg, #ff4d4f, #ff7a45);
+ color: white;
+}
+
+.hot-rank.top-2 {
+ background: linear-gradient(135deg, #ff7a45, #ffa940);
+ color: white;
+}
+
+.hot-rank.top-3 {
+ background: linear-gradient(135deg, #ffa940, #ffec3d);
+ color: white;
+}
+
+.hot-content {
+ flex: 1;
+}
+
+.hot-title {
+ font-size: 1.15rem;
+ margin-bottom: 8px;
+ color: #333;
+ text-decoration: none;
+ display: block;
+ line-height: 1.5;
+ font-weight: 500;
+ transition: color 0.2s ease;
+}
+
+.hot-title:hover {
+ color: #4096ff;
+ text-decoration: none;
+}
+
+.loading {
+ text-align: center;
+ padding: 40px;
+ color: #666;
+ font-size: 1.1rem;
+}
+
+footer {
+ text-align: center;
+ margin-top: 30px;
+ padding-top: 20px;
+ border-top: 1px solid rgba(0, 0, 0, 0.06);
+ color: #666;
+ font-size: 0.9rem;
+}
+
+/* 响应式设计 */
+@media (max-width: 1024px) and (min-width: 768px) {
+ .container {
+ max-width: 90%;
+ padding: 20px;
+ }
+
+ header h1 {
+ font-size: 2.2rem;
+ }
+
+ .hot-item {
+ padding: 18px;
+ }
+
+ .hot-title {
+ font-size: 1.1rem;
+ }
+}
+
+@media (max-width: 768px) {
+ body {
+ background-color: #f8f9fa;
+ }
+
+ .container {
+ max-width: 95%;
+ margin: 12px auto;
+ padding: 16px;
+ border-radius: 12px;
+ }
+
+ header {
+ margin-bottom: 20px;
+ padding-bottom: 16px;
+ }
+
+ header h1 {
+ font-size: 1.8rem;
+ margin-bottom: 10px;
+ }
+
+ .update-time {
+ font-size: 0.85rem;
+ padding: 6px 12px;
+ }
+
+ .hot-item {
+ padding: 16px;
+ margin-bottom: 12px;
+ border-radius: 10px;
+ flex-direction: row;
+ align-items: flex-start;
+ }
+
+ .hot-rank {
+ font-size: 1.1rem;
+ margin-right: 14px;
+ min-width: 32px;
+ width: 32px;
+ height: 32px;
+ margin-top: 2px;
+ }
+
+ .hot-title {
+ font-size: 1rem;
+ line-height: 1.5;
+ margin-bottom: 6px;
+ }
+
+ footer {
+ margin-top: 24px;
+ padding-top: 16px;
+ font-size: 0.85rem;
+ }
+}
+
+@media (max-width: 480px) {
+ .container {
+ margin: 8px auto;
+ padding: 14px;
+ }
+
+ header h1 {
+ font-size: 1.6rem;
+ }
+
+ .hot-item {
+ padding: 14px;
+ margin-bottom: 10px;
+ }
+
+ .hot-rank {
+ font-size: 1rem;
+ margin-right: 12px;
+ min-width: 30px;
+ width: 30px;
+ height: 30px;
+ }
+
+ .hot-title {
+ font-size: 0.95rem;
+ }
+}
+
+/* 减少动画以节省电池 */
+@media (prefers-reduced-motion: reduce) {
+ .modern-gradient,
+ .modern-gradient::before {
+ animation: none;
+ }
+
+ .modern-gradient {
+ background: linear-gradient(
+ 135deg,
+ rgba(64, 169, 255, 0.3) 0%,
+ rgba(255, 175, 64, 0.2) 50%,
+ rgba(255, 122, 69, 0.25) 100%
+ );
+ }
}
\ No newline at end of file
diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/img/qeye.svg b/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/img/qeye.svg
index 4e14cff6..43c4ca7d 100755
--- a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/img/qeye.svg
+++ b/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/img/qeye.svg
@@ -1,42 +1,42 @@
-
-