From 939442e0619abfe7d3736f9ffe4798777d6ac898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A0=91=E8=90=8C=E8=8A=BD?= <3205788256@qq.com> Date: Thu, 12 Mar 2026 18:58:26 +0800 Subject: [PATCH] chore: sync local changes (2026-03-12) --- .dockerignore | 36 - .gitignore | 5 - .vscode/settings.json | 6 +- Dockerfile | 57 - InfoGenie-backend/.dockerignore | 19 + InfoGenie-backend/.gitignore | 3 + InfoGenie-backend/Dockerfile | 30 + InfoGenie-backend/ai_config.json | 24 +- InfoGenie-backend/app.py | 4 +- InfoGenie-backend/config.py | 170 +- .../docker-compose.yml | 75 +- InfoGenie-backend/modules/aimodelapp.py | 2172 +- InfoGenie-backend/modules/auth.py | 908 +- InfoGenie-backend/modules/email_service.py | 564 +- InfoGenie-backend/modules/user_management.py | 1098 +- InfoGenie-backend/requirements.txt | 58 +- InfoGenie-backend/start_backend.bat | 2 +- InfoGenie-backend/start_backend.sh | 4 +- InfoGenie-backend/test/email_test.py | 34 - InfoGenie-backend/test/mongo_test.py | 49 - InfoGenie-backend/test/test_add_coins.py | 100 - InfoGenie-backend/test/test_email.py | 35 - InfoGenie-backend/test/test_email_fix.py | 81 - InfoGenie-backend/test/test_mongo.py | 70 - InfoGenie-backend/test/test_user_list.py | 81 - InfoGenie-backend/后端架构文档.md | 792 +- InfoGenie-backend/用户数据模板.json | 24 +- InfoGenie-frontend/build_frontend.bat | 6 +- InfoGenie-frontend/env.backup | 8 +- InfoGenie-frontend/package-lock.json | 41400 ++++++++-------- InfoGenie-frontend/package.json | 110 +- .../随机JavaScript趣味题/css/background.css | 378 +- .../随机JavaScript趣味题/css/style.css | 1192 +- .../娱乐消遣/随机JavaScript趣味题/index.html | 180 +- .../随机JavaScript趣味题/js/script.js | 1162 +- .../随机JavaScript趣味题/接口集合.json | 6 +- .../随机JavaScript趣味题/返回接口.json | 32 +- .../娱乐消遣/随机KFC文案/css/background.css | 160 +- .../60sapi/娱乐消遣/随机KFC文案/css/style.css | 676 +- .../60sapi/娱乐消遣/随机KFC文案/index.html | 90 +- .../60sapi/娱乐消遣/随机KFC文案/js/main.js | 478 +- .../60sapi/娱乐消遣/随机KFC文案/接口集合.json | 6 +- .../60sapi/娱乐消遣/随机KFC文案/返回接口.json | 14 +- .../娱乐消遣/随机一言/css/background.css | 332 +- .../60sapi/娱乐消遣/随机一言/css/style.css | 712 +- .../60sapi/娱乐消遣/随机一言/index.html | 102 +- .../60sapi/娱乐消遣/随机一言/js/script.js | 442 +- .../60sapi/娱乐消遣/随机一言/接口集合.json | 6 +- .../60sapi/娱乐消遣/随机一言/返回接口.json | 14 +- .../娱乐消遣/随机冷笑话/css/Untitled-1.html | 30 +- .../娱乐消遣/随机冷笑话/css/background.css | 212 +- .../60sapi/娱乐消遣/随机冷笑话/css/style.css | 432 +- .../60sapi/娱乐消遣/随机冷笑话/index.html | 114 +- .../60sapi/娱乐消遣/随机冷笑话/js/script.js | 232 +- .../60sapi/娱乐消遣/随机冷笑话/返回接口.json | 14 +- .../娱乐消遣/随机发病文学/css/background.css | 178 +- .../娱乐消遣/随机发病文学/css/style.css | 468 +- .../60sapi/娱乐消遣/随机发病文学/index.html | 66 +- .../60sapi/娱乐消遣/随机发病文学/js/script.js | 292 +- .../娱乐消遣/随机发病文学/返回接口.json | 14 +- .../娱乐消遣/随机唱歌音频/css/style.css | 500 +- .../60sapi/娱乐消遣/随机唱歌音频/index.html | 132 +- .../60sapi/娱乐消遣/随机唱歌音频/js/script.js | 502 +- .../娱乐消遣/随机唱歌音频/接口集合.json | 6 +- .../娱乐消遣/随机唱歌音频/返回接口.json | 62 +- .../娱乐消遣/随机搞笑段子/css/background.css | 70 +- .../娱乐消遣/随机搞笑段子/css/style.css | 398 +- .../60sapi/娱乐消遣/随机搞笑段子/index.html | 112 +- .../60sapi/娱乐消遣/随机搞笑段子/js/script.js | 242 +- .../娱乐消遣/随机搞笑段子/返回接口.json | 14 +- .../娱乐消遣/随机答案之书/返回接口.json | 18 +- .../娱乐消遣/随机运势/css/background.css | 50 +- .../60sapi/娱乐消遣/随机运势/css/style.css | 682 +- .../60sapi/娱乐消遣/随机运势/index.html | 140 +- .../60sapi/娱乐消遣/随机运势/js/script.js | 338 +- .../60sapi/娱乐消遣/随机运势/接口集合.json | 6 +- .../60sapi/娱乐消遣/随机运势/返回接口.json | 18 +- .../实用功能/EpicGames免费游戏/css/style.css | 658 +- .../实用功能/EpicGames免费游戏/index.html | 124 +- .../实用功能/EpicGames免费游戏/js/script.js | 530 +- .../实用功能/EpicGames免费游戏/接口集合.json | 6 +- .../实用功能/EpicGames免费游戏/返回接口.json | 130 +- .../实用功能/公网IP地址/css/background.css | 464 +- .../60sapi/实用功能/公网IP地址/css/style.css | 920 +- .../60sapi/实用功能/公网IP地址/index.html | 260 +- .../60sapi/实用功能/公网IP地址/js/script.js | 684 +- .../60sapi/实用功能/公网IP地址/接口集合.json | 4 +- .../60sapi/实用功能/公网IP地址/返回接口.json | 32 +- .../实用功能/农历信息/css/background.css | 1180 +- .../60sapi/实用功能/农历信息/css/style.css | 2536 +- .../60sapi/实用功能/农历信息/index.html | 216 +- .../60sapi/实用功能/农历信息/js/script.js | 950 +- .../60sapi/实用功能/农历信息/接口集合.json | 6 +- .../60sapi/实用功能/农历信息/返回接口.json | 1292 +- .../实用功能/哈希解压压缩/css/style.css | 1152 +- .../60sapi/实用功能/哈希解压压缩/index.html | 422 +- .../60sapi/实用功能/哈希解压压缩/js/script.js | 786 +- .../实用功能/哈希解压压缩/接口集合.json | 6 +- .../实用功能/哈希解压压缩/返回接口.json | 68 +- .../60sapi/实用功能/在线翻译/background.css | 272 +- .../60sapi/实用功能/在线翻译/index.html | 196 +- .../public/60sapi/实用功能/在线翻译/script.js | 902 +- .../60sapi/实用功能/在线翻译/styles.css | 880 +- .../在线翻译/在线翻译支持语言列表接口.json | 1100 +- .../实用功能/天气预报/css/background.css | 288 +- .../60sapi/实用功能/天气预报/css/style.css | 822 +- .../60sapi/实用功能/天气预报/index.html | 130 +- .../60sapi/实用功能/天气预报/js/script.js | 518 +- .../实时天气[目前有问题]/background.css | 402 +- .../实用功能/实时天气[目前有问题]/index.html | 284 +- .../实用功能/实时天气[目前有问题]/script.js | 706 +- .../实用功能/实时天气[目前有问题]/styles.css | 882 +- .../实时天气[目前有问题]/返回接口.json | 134 +- .../实用功能/密码强度检测/css/style.css | 1784 +- .../60sapi/实用功能/密码强度检测/index.html | 434 +- .../60sapi/实用功能/密码强度检测/js/script.js | 1030 +- .../实用功能/密码强度检测/返回接口.json | 72 +- .../实用功能/生成二维码/css/background.css | 262 +- .../60sapi/实用功能/生成二维码/css/style.css | 934 +- .../60sapi/实用功能/生成二维码/index.html | 194 +- .../60sapi/实用功能/生成二维码/js/script.js | 904 +- .../60sapi/实用功能/生成二维码/接口集合.json | 6 +- .../实用功能/百度百科词条/css/background.css | 382 +- .../实用功能/百度百科词条/css/style.css | 1058 +- .../60sapi/实用功能/百度百科词条/index.html | 164 +- .../60sapi/实用功能/百度百科词条/js/script.js | 638 +- .../实用功能/百度百科词条/接口集合.json | 6 +- .../实用功能/百度百科词条/返回接口.json | 22 +- .../实用功能/身体健康分析/background.css | 484 +- .../60sapi/实用功能/身体健康分析/index.html | 228 +- .../60sapi/实用功能/身体健康分析/script.js | 1028 +- .../60sapi/实用功能/身体健康分析/styles.css | 1392 +- .../实用功能/身体健康分析/返回接口.json | 184 +- .../60sapi/实用功能/配色方案/background.css | 372 +- .../60sapi/实用功能/配色方案/index.html | 126 +- .../public/60sapi/实用功能/配色方案/script.js | 628 +- .../60sapi/实用功能/配色方案/styles.css | 842 +- .../60sapi/实用功能/配色方案/返回接口.json | 544 +- .../实用功能/链接OG信息/css/background.css | 462 +- .../60sapi/实用功能/链接OG信息/css/style.css | 2316 +- .../60sapi/实用功能/链接OG信息/index.html | 452 +- .../60sapi/实用功能/链接OG信息/js/script.js | 1232 +- .../60sapi/实用功能/链接OG信息/接口集合.json | 6 +- .../60sapi/实用功能/链接OG信息/返回接口.json | 130 +- .../随机密码生成器/css/background.css | 502 +- .../实用功能/随机密码生成器/css/style.css | 1292 +- .../60sapi/实用功能/随机密码生成器/index.html | 290 +- .../实用功能/随机密码生成器/js/script.js | 822 +- .../实用功能/随机密码生成器/返回接口.json | 62 +- .../60sapi/实用功能/随机颜色/background.css | 428 +- .../60sapi/实用功能/随机颜色/index.html | 372 +- .../public/60sapi/实用功能/随机颜色/script.js | 850 +- .../60sapi/实用功能/随机颜色/styles.css | 1272 +- .../60sapi/实用功能/随机颜色/返回接口.json | 118 +- .../日更资讯/历史上的今天/css/style.css | 844 +- .../60sapi/日更资讯/历史上的今天/index.html | 164 +- .../60sapi/日更资讯/历史上的今天/js/script.js | 588 +- .../日更资讯/历史上的今天/接口集合.json | 6 +- .../日更资讯/历史上的今天/返回接口.json | 202 +- .../日更资讯/必应每日壁纸/css/style.css | 650 +- .../60sapi/日更资讯/必应每日壁纸/index.html | 82 +- .../60sapi/日更资讯/必应每日壁纸/js/script.js | 628 +- .../日更资讯/必应每日壁纸/接口集合.json | 6 +- .../日更资讯/必应每日壁纸/返回接口.json | 28 +- .../日更资讯/每天60s读懂世界/css/style.css | 652 +- .../日更资讯/每天60s读懂世界/index.html | 96 +- .../日更资讯/每天60s读懂世界/js/script.js | 608 +- .../日更资讯/每天60s读懂世界/接口集合.json | 6 +- .../日更资讯/每天60s读懂世界/返回接口.json | 130 +- .../日更资讯/每日国际汇率/css/style.css | 946 +- .../60sapi/日更资讯/每日国际汇率/index.html | 170 +- .../60sapi/日更资讯/每日国际汇率/js/script.js | 1038 +- .../日更资讯/每日国际汇率/接口集合.json | 6 +- .../Hacker News 榜单/css/background.css | 130 +- .../热搜榜单/Hacker News 榜单/css/style.css | 1718 +- .../热搜榜单/Hacker News 榜单/index.html | 136 +- .../热搜榜单/Hacker News 榜单/js/script.js | 678 +- .../热搜榜单/Hacker News 榜单/接口集合.json | 6 +- .../热搜榜单/Hacker News 榜单/返回接口.json | 172 +- .../哔哩哔哩热搜榜/css/background.css | 404 +- .../热搜榜单/哔哩哔哩热搜榜/css/style.css | 702 +- .../60sapi/热搜榜单/哔哩哔哩热搜榜/index.html | 66 +- .../60sapi/热搜榜单/哔哩哔哩热搜榜/js/main.js | 258 +- .../热搜榜单/哔哩哔哩热搜榜/接口集合.json | 6 +- .../热搜榜单/哔哩哔哩热搜榜/返回接口.json | 34 +- .../热搜榜单/头条热搜榜/css/background.css | 212 +- .../60sapi/热搜榜单/头条热搜榜/css/style.css | 1140 +- .../60sapi/热搜榜单/头条热搜榜/index.html | 122 +- .../60sapi/热搜榜单/头条热搜榜/js/main.js | 340 +- .../60sapi/热搜榜单/头条热搜榜/接口集合.json | 6 +- .../60sapi/热搜榜单/头条热搜榜/返回接口.json | 58 +- .../60sapi/热搜榜单/小红书热点/background.css | 286 +- .../60sapi/热搜榜单/小红书热点/index.html | 78 +- .../60sapi/热搜榜单/小红书热点/script.js | 358 +- .../60sapi/热搜榜单/小红书热点/styles.css | 596 +- .../60sapi/热搜榜单/小红书热点/返回接口.json | 330 +- .../热搜榜单/微博热搜榜/css/background.css | 72 +- .../60sapi/热搜榜单/微博热搜榜/css/style.css | 766 +- .../60sapi/热搜榜单/微博热搜榜/img/qeye.svg | 82 +- .../60sapi/热搜榜单/微博热搜榜/index.html | 66 +- .../60sapi/热搜榜单/微博热搜榜/js/main.js | 180 +- .../60sapi/热搜榜单/微博热搜榜/返回接口.json | 520 +- .../public/60sapi/热搜榜单/懂车帝热搜/api.js | 358 +- .../public/60sapi/热搜榜单/懂车帝热搜/app.js | 624 +- .../60sapi/热搜榜单/懂车帝热搜/background.css | 108 +- .../60sapi/热搜榜单/懂车帝热搜/index.html | 142 +- .../60sapi/热搜榜单/懂车帝热搜/styles.css | 1062 +- .../public/60sapi/热搜榜单/懂车帝热搜/ui.js | 818 +- .../60sapi/热搜榜单/懂车帝热搜/返回接口.json | 130 +- .../热搜榜单/抖音热搜榜/css/background.css | 96 +- .../60sapi/热搜榜单/抖音热搜榜/css/style.css | 1320 +- .../60sapi/热搜榜单/抖音热搜榜/index.html | 112 +- .../60sapi/热搜榜单/抖音热搜榜/js/script.js | 660 +- .../60sapi/热搜榜单/抖音热搜榜/接口集合.json | 6 +- .../60sapi/热搜榜单/抖音热搜榜/返回接口.json | 990 +- .../猫眼电影实时票房/css/background.css | 2 +- .../热搜榜单/猫眼电影实时票房/css/style.css | 2 +- .../热搜榜单/猫眼电影实时票房/index.html | 2 +- .../热搜榜单/猫眼电影实时票房/js/main.js | 2 +- .../热搜榜单/猫眼电影实时票房/返回接口.json | 3720 +- .../热搜榜单/猫眼电视收视排行/index.html | 2 +- .../热搜榜单/猫眼电视收视排行/js/main.js | 2 +- .../热搜榜单/猫眼电视收视排行/返回接口.json | 868 +- .../热搜榜单/猫眼票房排行榜/css/style.css | 1162 +- .../60sapi/热搜榜单/猫眼票房排行榜/index.html | 80 +- .../热搜榜单/猫眼票房排行榜/js/script.js | 530 +- .../热搜榜单/猫眼票房排行榜/接口集合.json | 6 +- .../热搜榜单/猫眼票房排行榜/返回接口.json | 340 +- .../猫眼网剧实时热度/css/background.css | 2 +- .../热搜榜单/猫眼网剧实时热度/css/style.css | 2 +- .../热搜榜单/猫眼网剧实时热度/index.html | 2 +- .../热搜榜单/猫眼网剧实时热度/js/main.js | 2 +- .../热搜榜单/猫眼网剧实时热度/返回接口.json | 620 +- .../热搜榜单/百度实时热搜/background.css | 390 +- .../60sapi/热搜榜单/百度实时热搜/index.html | 78 +- .../60sapi/热搜榜单/百度实时热搜/script.js | 390 +- .../60sapi/热搜榜单/百度实时热搜/styles.css | 740 +- .../热搜榜单/百度实时热搜/返回接口.json | 1210 +- .../热搜榜单/百度电视剧榜/background.css | 482 +- .../60sapi/热搜榜单/百度电视剧榜/index.html | 78 +- .../60sapi/热搜榜单/百度电视剧榜/script.js | 532 +- .../60sapi/热搜榜单/百度电视剧榜/styles.css | 754 +- .../热搜榜单/百度电视剧榜/返回接口.json | 550 +- .../60sapi/热搜榜单/百度贴吧话题榜/api.js | 290 +- .../60sapi/热搜榜单/百度贴吧话题榜/app.js | 400 +- .../60sapi/热搜榜单/百度贴吧话题榜/index.html | 112 +- .../60sapi/热搜榜单/百度贴吧话题榜/styles.css | 836 +- .../60sapi/热搜榜单/百度贴吧话题榜/ui.js | 706 +- .../热搜榜单/百度贴吧话题榜/返回接口.json | 610 +- .../热搜榜单/知乎热门话题/css/background.css | 214 +- .../热搜榜单/知乎热门话题/css/style.css | 1146 +- .../热搜榜单/知乎热门话题/img/zhihu-logo.svg | 10 +- .../60sapi/热搜榜单/知乎热门话题/index.html | 66 +- .../60sapi/热搜榜单/知乎热门话题/js/main.js | 316 +- .../热搜榜单/知乎热门话题/接口集合.json | 6 +- .../热搜榜单/知乎热门话题/返回接口.json | 58 +- .../热搜榜单/网易云榜单/css/background.css | 254 +- .../热搜榜单/网易云榜单/css/responsive.css | 386 +- .../60sapi/热搜榜单/网易云榜单/css/style.css | 946 +- .../60sapi/热搜榜单/网易云榜单/index.html | 96 +- .../60sapi/热搜榜单/网易云榜单/js/app.js | 502 +- .../60sapi/热搜榜单/网易云榜单/接口集合.json | 6 +- .../60sapi/热搜榜单/网易云榜单/返回接口.json | 1498 +- .../public/60sapi/生成要求模板.txt | 12 +- .../public/aimodelapp/AI写诗小助手/index.html | 490 +- .../public/aimodelapp/AI写诗小助手/script.js | 238 +- .../aimodelapp/AI变量命名助手/index.html | 84 +- .../aimodelapp/AI变量命名助手/script.js | 518 +- .../aimodelapp/AI变量命名助手/styles.css | 880 +- .../public/aimodelapp/AI姓名评测/index.html | 112 +- .../public/aimodelapp/AI姓名评测/script.js | 522 +- .../public/aimodelapp/AI姓名评测/styles.css | 528 +- .../aimodelapp/AI文章转文言文/index.html | 130 +- .../aimodelapp/AI文章转文言文/script.js | 596 +- .../aimodelapp/AI文章转文言文/styles.css | 1204 +- .../aimodelapp/AI生成Linux命令/index.html | 98 +- .../aimodelapp/AI生成Linux命令/script.js | 720 +- .../aimodelapp/AI生成Linux命令/styles.css | 1150 +- .../public/aimodelapp/AI生成表情包/index.html | 102 +- .../public/aimodelapp/AI生成表情包/script.js | 672 +- .../public/aimodelapp/AI生成表情包/styles.css | 870 +- .../aimodelapp/AI语言翻译助手/index.html | 122 +- .../aimodelapp/AI语言翻译助手/script.js | 498 +- .../aimodelapp/AI语言翻译助手/styles.css | 974 +- .../public/aimodelapp/生成要求.txt | 24 +- .../public/icons/apple-touch-icon.png | Bin 0 -> 46797 bytes .../public/icons/favicon-16.png | Bin 0 -> 1184 bytes .../public/icons/favicon-32.png | Bin 0 -> 3000 bytes .../public/icons/icon-192-maskable.png | Bin 0 -> 41281 bytes InfoGenie-frontend/public/icons/icon-192.png | Bin 0 -> 51569 bytes .../public/icons/icon-512-maskable.png | Bin 0 -> 210279 bytes InfoGenie-frontend/public/icons/icon-512.png | Bin 0 -> 262104 bytes InfoGenie-frontend/public/index.html | 705 +- InfoGenie-frontend/public/manifest.json | 41 +- .../public/smallgame/2048/controls.js | 872 +- .../public/smallgame/2048/game-logic.js | 1244 +- .../public/smallgame/2048/gamedata.js | 38 +- .../smallgame/俄罗斯方块/game-controls.js | 574 +- .../public/smallgame/俄罗斯方块/gamedata.js | 38 +- .../public/smallgame/俄罗斯方块/index.html | 184 +- .../public/smallgame/俄罗斯方块/styles.css | 1148 +- .../public/smallgame/俄罗斯方块/tetris.js | 972 +- .../public/smallgame/别踩白方块/game.js | 824 +- .../public/smallgame/别踩白方块/gamedata.js | 38 +- .../public/smallgame/别踩白方块/index.html | 666 +- .../public/smallgame/扫雷/css/style.css | 156 +- .../public/smallgame/扫雷/gamedata.js | 38 +- .../public/smallgame/扫雷/index.html | 110 +- .../public/smallgame/扫雷/js/main.js | 544 +- .../public/smallgame/生成要求.txt | 8 +- .../public/smallgame/贪吃蛇/game-controls.js | 380 +- .../public/smallgame/贪吃蛇/game-core.js | 1088 +- .../public/smallgame/贪吃蛇/game-stats.js | 534 +- .../public/smallgame/贪吃蛇/gamedata.js | 98 +- .../public/smallgame/贪吃蛇/styles.css | 662 +- InfoGenie-frontend/public/sw.js | 168 +- .../toolbox/在线JavaScript执行/styles.css | 350 +- .../public/toolbox/视频播放器/index.html | 822 +- InfoGenie-frontend/setting.json | 14 +- InfoGenie-frontend/src/App.js | 200 +- InfoGenie-frontend/src/components/Footer.js | 224 +- InfoGenie-frontend/src/components/Header.js | 900 +- .../src/components/Navigation.js | 416 +- .../src/config/StaticPageConfig.js | 568 +- InfoGenie-frontend/src/config/env.js | 110 +- .../src/contexts/UserContext.js | 306 +- InfoGenie-frontend/src/index.js | 16 +- InfoGenie-frontend/src/pages/AiModelPage.js | 1458 +- InfoGenie-frontend/src/pages/Api60sPage.js | 1290 +- InfoGenie-frontend/src/pages/HomePage.js | 1174 +- InfoGenie-frontend/src/pages/LoginPage.js | 1214 +- InfoGenie-frontend/src/pages/SmallGamePage.js | 1210 +- .../src/pages/UserProfilePage.js | 2 +- InfoGenie-frontend/src/styles/global.css | 704 +- InfoGenie-frontend/src/styles/index.css | 616 +- InfoGenie-frontend/src/utils/api.js | 222 +- InfoGenie-frontend/start_frontend.bat | 4 +- InfoGenie-frontend/start_frontend.sh | 4 +- InfoGenie-frontend/前端架构文档.md | 942 +- LICENSE | 402 +- README.md | 606 +- docker/default.conf | 74 - docker/entrypoint.sh | 26 - docker/nginx.conf | 41 - docker/supervisord.conf | 24 - nginx-frontend.conf | 89 + 万象口袋 | 0 项目架构说明.md | 606 +- 348 files changed, 91638 insertions(+), 92091 deletions(-) delete mode 100644 .dockerignore delete mode 100755 .gitignore delete mode 100644 Dockerfile create mode 100644 InfoGenie-backend/.dockerignore create mode 100644 InfoGenie-backend/.gitignore create mode 100644 InfoGenie-backend/Dockerfile rename docker-compose.yml => InfoGenie-backend/docker-compose.yml (59%) delete mode 100755 InfoGenie-backend/test/email_test.py delete mode 100755 InfoGenie-backend/test/mongo_test.py delete mode 100644 InfoGenie-backend/test/test_add_coins.py delete mode 100755 InfoGenie-backend/test/test_email.py delete mode 100755 InfoGenie-backend/test/test_email_fix.py delete mode 100755 InfoGenie-backend/test/test_mongo.py delete mode 100644 InfoGenie-backend/test/test_user_list.py create mode 100644 InfoGenie-frontend/public/icons/apple-touch-icon.png create mode 100644 InfoGenie-frontend/public/icons/favicon-16.png create mode 100644 InfoGenie-frontend/public/icons/favicon-32.png create mode 100644 InfoGenie-frontend/public/icons/icon-192-maskable.png create mode 100644 InfoGenie-frontend/public/icons/icon-192.png create mode 100644 InfoGenie-frontend/public/icons/icon-512-maskable.png create mode 100644 InfoGenie-frontend/public/icons/icon-512.png delete mode 100644 docker/default.conf delete mode 100644 docker/entrypoint.sh delete mode 100644 docker/nginx.conf delete mode 100644 docker/supervisord.conf create mode 100644 nginx-frontend.conf create mode 100644 万象口袋 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趣味题

-

测试你的JavaScript知识

-
- -
-
-
-

正在加载题目...

-
- - - - -
- -
-

JavaScript趣味题集合

-
-
- - - + + + + + + 随机JavaScript趣味题 + + + + + + + + + +
+
+

JavaScript趣味题

+

测试你的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 = `
-            
- - - -
-
导出成功!
-
${filename}
-
-
- `; - - // 添加动画样式 - 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 = `
+            
+ + + +
+
导出成功!
+
${filename}
+
+
+ `; + + // 添加动画样式 + 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文案生成器

-

疯狂星期四,文案来一套!

-
- -
-
-
-

点击按钮获取随机KFC文案...

-
- -
- - -
- - -
-
- -
-

© 2024 KFC文案生成器 | 让每个星期四都疯狂起来

-
-
- -
- - - + + + + + + 随机KFC文案生成器 + + + + +
+
+

🍗 随机KFC文案生成器

+

疯狂星期四,文案来一套!

+
+ +
+
+
+

点击按钮获取随机KFC文案...

+
+ +
+ + +
+ + +
+
+ +
+

© 2024 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 @@ - - - - - - 随机冷笑话 - - - - - -
-
-
- - - -
-
-

冷笑话生成器

-
- -
- -

点击下面的按钮,来点冷笑话吧!

-
- -
- -
- -
- - - - -
-
- -
-

© 2024 冷笑话工坊

-
- - - - - - + + + + + + 随机冷笑话 + + + + + +
+
+
+ + + +
+
+

冷笑话生成器

+
+ +
+ +

点击下面的按钮,来点冷笑话吧!

+
+ +
+ +
+ +
+ + + + +
+
+ +
+

© 2024 冷笑话工坊

+
+ + + + + + \ 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 免费游戏 -

-
- - -
-
-

正在加载游戏数据,请稍候…

-
- - - - -
- -
-
-
0
-
总游戏数
-
-
-
0
-
当前免费
-
-
-
0
-
即将免费
-
-
- - -
- -
- - -
- -
-
-
- - - + + + + + + + Epic Games 免费游戏 - 60s API 集合 + + + + + +
+
+

+ 🎮 Epic Games 免费游戏 +

+
+ + +
+
+

正在加载游戏数据,请稍候…

+
+ + + + +
+ +
+
+
0
+
总游戏数
+
+
+
0
+
当前免费
+
+
+
0
+
即将免费
+
+
+ + +
+ +
+ + +
+ +
+
+
+ + + \ 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.title)}

-

${safeText(game.description)}

- -
-
- ${safeText(game.original_price_desc)} - 免费 -
-
${safeText(game.seller)}
-
- -
-
- 开始:${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.title)}

+

${safeText(game.description)}

+ +
+
+ ${safeText(game.original_price_desc)} + 免费 +
+
${safeText(game.seller)}
+
+ +
+
+ 开始:${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地址信息

-
- - -
- -
- -
- - - - - - - - - -
- - -
- - - + + + + + + 公网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 ` -
-
-
-
十二时辰宜忌
-
-
-
- ${hourCards} -
-
-
- `; -} - -// 更新查询时间 -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 ` +
+
+
+
十二时辰宜忌
+
+
+
+ ${hourCards} +
+
+
+ `; +} + +// 更新查询时间 +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种语言互译

-
- -
-
-
-
- - -
- - - -
- - -
-
- -
-
-
- - -
- -
- 0/5000 -
-
- -
-
- - -
-
翻译结果将显示在这里...
-
-
-
-
-
-
- -
- -
-
-
- -
-

数据来源于有道翻译,与其网页端同步

-
-
- -
- - - + + + + + + 在线翻译 - 支持109种语言 + + + + +
+
+

在线机器翻译

+

支持109种语言互译

+
+ +
+
+
+
+ + +
+ + + +
+ + +
+
+ +
+
+
+ + +
+ +
+ 0/5000 +
+
+ +
+
+ + +
+
翻译结果将显示在这里...
+
+
+
+
+
+
+ +
+ +
+
+
+ +
+

数据来源于有道翻译,与其网页端同步

+
+
+ +
+ + + \ 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 @@ - - - - - - 实时天气查询 - - - - -
-
-

实时天气

- -
- -
-
正在加载天气数据...
- - - - -
-
- - - + + + + + + 实时天气查询 + + + + +
+
+

实时天气

+ +
+ +
+
正在加载天气数据...
+ + + + +
+
+ + + \ 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 @@ - - - - - - - - 🔒 密码强度检测器 - - - - - - -
-
-

🔒 密码强度检测器

-

实时分析密码安全性,保护您的数字生活

-
- -
- -
-
- -
- - -
-
- 💡 - 输入密码后将实时显示安全性分析结果 -
-
- - -
- - - - - - -
- -
-

🔒 保护您的数字安全,从强密码开始

- -
-
- - - - - - + + + + + + + + 🔒 密码强度检测器 + + + + + + +
+
+

🔒 密码强度检测器

+

实时分析密码安全性,保护您的数字生活

+
+ +
+ +
+
+ +
+ + +
+
+ 💡 + 输入密码后将实时显示安全性分析结果 +
+
+ + +
+ + + + + + +
+ +
+

🔒 保护您的数字安全,从强密码开始

+ +
+
+ + + + + + \ 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 @@ - - - - - - 二维码生成器 - - - - -
-
-

🔗 二维码生成器

-

快速生成高质量二维码

-
- -
-
-
-
- - -
- -
-
- - -
- -
- - -
- -
- - -
-
- - -
-
- -
- - - - - -
-
- -
-

© 2024 二维码生成器 - 简单快捷的二维码生成工具

-
-
- - - + + + + + + 二维码生成器 + + + + +
+
+

🔗 二维码生成器

+

快速生成高质量二维码

+
+ +
+
+
+
+ + +
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+
+ + +
+
+ +
+ + + + + +
+
+ +
+

© 2024 二维码生成器 - 简单快捷的二维码生成工具

+
+
+ + + \ 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 = ` -
      -

      ❌ ${message}

      -
      - `; - } - - // 显示结果 - 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.name}

      -

      ${palette.description}

      -
      -
      - ${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 = ` +
      +

      ❌ ${message}

      +
      + `; + } + + // 显示结果 + 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.name}

      +

      ${palette.description}

      +
      +
      + ${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 解析器

      - 链接元数据神秘解析 -
      -
      -
      - 系统就绪 -
      -
      -
      - - -
      -
      -
      - - -
      -
      - -
      -
      - - - - - - - - - -
      - - -
      -
      - - -
      -
      - - -
      -
      - - -
      -
      - - -
      - -
      - - - + + + + + + 链接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 = ` - OG Image - - `; - } - } 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 = ` + OG Image + + `; + } + } 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 @@ - - - - - - 随机密码生成器 - - - - -
      -
      -

      🔐 随机密码生成器

      -

      生成安全可靠的随机密码

      -
      - -
      -
      -
      -
      - -
      - - 16 -
      -
      - -
      - -
      -
      - - -
      -
      - - -
      -
      - - -
      -
      - - -
      -
      -
      - -
      - -
      -
      - - -
      -
      - - -
      -
      -
      - - -
      -
      - - - - -
      - -
      -

      安全密码生成工具

      -
      -
      - - - - - + + + + + + 随机密码生成器 + + + + +
      +
      +

      🔐 随机密码生成器

      +

      生成安全可靠的随机密码

      +
      + +
      +
      +
      +
      + +
      + + 16 +
      +
      + +
      + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      +
      + +
      + +
      +
      + + +
      +
      + + +
      +
      +
      + + +
      +
      + + + + +
      + +
      +

      安全密码生成工具

      +
      +
      + + + + + \ 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 @@ - - - - - - 随机颜色/颜色转换工具 - - - - -
      -
      -

      随机颜色/颜色转换工具

      -

      获取随机颜色或转换指定颜色格式

      -
      - -
      -
      -
      - - -
      -
      - - -
      -
      - - -
      -
      - -
      -
      -
      -
      -

      颜色名称

      -

      #000000

      -
      -
      - -
      -
      -

      RGB

      -
      - 0 - 0 - 0 -
      -

      rgb(0, 0, 0)

      -
      - -
      -

      HSL

      -
      - - 0% - 0% -
      -

      hsl(0, 0%, 0%)

      -
      - -
      -

      HSV

      -
      - - 0% - 0% -
      -

      hsv(0, 0%, 0%)

      -
      - -
      -

      CMYK

      -
      - 0% - 0% - 0% - 0% -
      -

      cmyk(0%, 0%, 0%, 0%)

      -
      - -
      -

      LAB

      -
      - 0 - 0 - 0 -
      -

      lab(0, 0, 0)

      -
      -
      - -
      -
      - - 0 -
      -
      - - 0 -
      -
      - - 0 -
      -
      - - #000000 -
      -
      - -
      -

      配色方案

      -
      -
      - -
      - #000000 -
      -
      - -
      -
      -
      -
      -
      - #000000 - #000000 -
      -
      -
      - -
      -
      -
      -
      -
      - #000000 - #000000 -
      -
      -
      -
      - -
      -

      无障碍性

      -
      -
      - AA 普通文本: - -
      -
      - AA 大文本: - -
      -
      - AAA 普通文本: - -
      -
      - AAA 大文本: - -
      -
      -
      -
      - - - - -
      -
      - - - + + + + + + 随机颜色/颜色转换工具 + + + + +
      +
      +

      随机颜色/颜色转换工具

      +

      获取随机颜色或转换指定颜色格式

      +
      + +
      +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + +
      +
      +
      +
      +

      颜色名称

      +

      #000000

      +
      +
      + +
      +
      +

      RGB

      +
      + 0 + 0 + 0 +
      +

      rgb(0, 0, 0)

      +
      + +
      +

      HSL

      +
      + + 0% + 0% +
      +

      hsl(0, 0%, 0%)

      +
      + +
      +

      HSV

      +
      + + 0% + 0% +
      +

      hsv(0, 0%, 0%)

      +
      + +
      +

      CMYK

      +
      + 0% + 0% + 0% + 0% +
      +

      cmyk(0%, 0%, 0%, 0%)

      +
      + +
      +

      LAB

      +
      + 0 + 0 + 0 +
      +

      lab(0, 0, 0)

      +
      +
      + +
      +
      + + 0 +
      +
      + + 0 +
      +
      + + 0 +
      +
      + + #000000 +
      +
      + +
      +

      配色方案

      +
      +
      + +
      + #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)}
      ` : ''} -
      - -
      - ${escapeHtml(info.title)} -
      - - -
      - - ${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)}
      ` : ''} +
      + +
      + ${escapeHtml(info.title)} +
      + + +
      + + ${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秒读懂世界

      -

      获取最新资讯,了解天下大事

      -
      - - - - -
      - -
      -
      -

      正在加载今日资讯...

      -
      -
      -
      - - -
      -

      Made with ❤️ | 数据来源:每天60秒读懂世界API

      -
      - - - - + + + + + + + + 每天60秒读懂世界 | 最新资讯 + + + + + + + + + + + + + +
      + +
      +

      📰 每天60秒读懂世界

      +

      获取最新资讯,了解天下大事

      +
      + + + + +
      + +
      +
      +

      正在加载今日资讯...

      +
      +
      +
      + + +
      +

      Made with ❤️ | 数据来源:每天60秒读懂世界API

      +
      + + + + \ 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 = ` -
      -

      😔 获取失败

      -

      ${message}

      -
      - `; - } - } - - 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 = ` -
      -
      -
      ${this.escapeHtml(date)} ${this.escapeHtml(day_of_week || '')}
      - ${lunar_date ? `
      ${this.escapeHtml(lunar_date)}
      ` : ''} -
      -
      - - ${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 = ` +
      +

      😔 获取失败

      +

      ${message}

      +
      + `; + } + } + + 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 = ` +
      +
      +
      ${this.escapeHtml(date)} ${this.escapeHtml(day_of_week || '')}
      + ${lunar_date ? `
      ${this.escapeHtml(lunar_date)}
      ` : ''} +
      +
      + + ${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 热门榜单

      -

      全球技术社区 · 实时热门话题

      - -
      - - - -
      - -
      - 加载中... -
      - - -
      - -
      -
      -
      -
      -

      正在获取最新榜单...

      -
      - - - -
      -
      -
      -
      - -
      - -
      - - -
      - - - - + + + + + + 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 = ` -
      -
      - ${rank} -
      -
      -
      -

      ${escapeHtml(item.title)}

      -
      -
      - ${escapeHtml(item.author)} -
      -
      - ${formattedTime} -
      -
      -
      -
      - ${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 = ` +
      +
      + ${rank} +
      +
      +
      +

      ${escapeHtml(item.title)}

      +
      +
      + ${escapeHtml(item.author)} +
      +
      + ${formattedTime} +
      +
      +
      +
      + ${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 = ` -
      -
      ${item.rank}
      -
      - ${item.work_type_icon ? `${item.word_type}` : ''} - ${item.word_type && item.word_type !== '无' ? `${item.word_type}` : ''} -
      -
      -
      -

      ${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 = ` +
      +
      ${item.rank}
      +
      + ${item.work_type_icon ? `${item.word_type}` : ''} + ${item.word_type && item.word_type !== '无' ? `${item.word_type}` : ''} +
      +
      +
      +

      ${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 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/index.html index 45a71d19..ec6e1643 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 1e5448eb..bd14a76d 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/js/main.js +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/js/main.js @@ -1,91 +1,91 @@ -// API接口列表 -const API_ENDPOINTS = [ - "https://60s.api.shumengya.top/v2/weibo", - "https://60s-cf.viki.moe/v2/weibo", -]; - -// 当前使用的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}
      -
      - ${item.title} - ${item.hot_value ? `
      ${item.hot_value}
      ` : ''} -
      - `; - - hotListElement.appendChild(hotItem); - }); - - // 更新时间 - updateTimeElement.textContent = `更新时间:${formatDate(new Date())}`; -} - -// 获取微博热搜数据 -async function fetchWeiboHotList() { - try { - const response = await fetch(API_ENDPOINTS[currentApiIndex]); - - if (!response.ok) { - throw new Error('网络响应不正常'); - } - - const result = await response.json(); - - if (result.code === 200 && result.data) { - renderHotList(result.data); - } else { - throw new Error('数据格式错误'); - } - } catch (error) { - console.error('获取数据失败:', error); - - // 尝试切换到下一个API - currentApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length; - - // 显示错误信息 - hotListElement.innerHTML = ` -
      - 正在尝试其他接口... -
      - `; - - // 延迟后重试 - setTimeout(fetchWeiboHotList, 2000); - } -} - -// 页面加载完成后获取数据 -document.addEventListener('DOMContentLoaded', () => { - fetchWeiboHotList(); - - // 每隔5分钟刷新一次数据 - setInterval(fetchWeiboHotList, 5 * 60 * 1000); +// API接口列表 +const API_ENDPOINTS = [ + "https://60s.api.shumengya.top/v2/weibo", + "https://60s-cf.viki.moe/v2/weibo", +]; + +// 当前使用的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}
      +
      + ${item.title} + ${item.hot_value ? `
      ${item.hot_value}
      ` : ''} +
      + `; + + hotListElement.appendChild(hotItem); + }); + + // 更新时间 + updateTimeElement.textContent = `更新时间:${formatDate(new Date())}`; +} + +// 获取微博热搜数据 +async function fetchWeiboHotList() { + try { + const response = await fetch(API_ENDPOINTS[currentApiIndex]); + + if (!response.ok) { + throw new Error('网络响应不正常'); + } + + const result = await response.json(); + + if (result.code === 200 && result.data) { + renderHotList(result.data); + } else { + throw new Error('数据格式错误'); + } + } catch (error) { + console.error('获取数据失败:', error); + + // 尝试切换到下一个API + currentApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length; + + // 显示错误信息 + hotListElement.innerHTML = ` +
      + 正在尝试其他接口... +
      + `; + + // 延迟后重试 + setTimeout(fetchWeiboHotList, 2000); + } +} + +// 页面加载完成后获取数据 +document.addEventListener('DOMContentLoaded', () => { + fetchWeiboHotList(); + + // 每隔5分钟刷新一次数据 + setInterval(fetchWeiboHotList, 5 * 60 * 1000); }); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/返回接口.json index 0779a075..f51566ee 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/返回接口.json +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/微博热搜榜/返回接口.json @@ -1,261 +1,261 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "title": "00后男生0.6秒飞针采血惊呆患者", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=00%E5%90%8E%E7%94%B7%E7%94%9F0.6%E7%A7%92%E9%A3%9E%E9%92%88%E9%87%87%E8%A1%80%E6%83%8A%E5%91%86%E6%82%A3%E8%80%85" - }, - { - "title": "普京带3位副总理10多位部长到中国", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%99%AE%E4%BA%AC%E5%B8%A63%E4%BD%8D%E5%89%AF%E6%80%BB%E7%90%8610%E5%A4%9A%E4%BD%8D%E9%83%A8%E9%95%BF%E5%88%B0%E4%B8%AD%E5%9B%BD" - }, - { - "title": "始终高举上海精神旗帜", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%A7%8B%E7%BB%88%E9%AB%98%E4%B8%BE%E4%B8%8A%E6%B5%B7%E7%B2%BE%E7%A5%9E%E6%97%97%E5%B8%9C" - }, - { - "title": "女生苦练化妆1年的变化", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%A5%B3%E7%94%9F%E8%8B%A6%E7%BB%83%E5%8C%96%E5%A6%861%E5%B9%B4%E7%9A%84%E5%8F%98%E5%8C%96" - }, - { - "title": "香港1200架无人机重现日本投降矣", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E9%A6%99%E6%B8%AF1200%E6%9E%B6%E6%97%A0%E4%BA%BA%E6%9C%BA%E9%87%8D%E7%8E%B0%E6%97%A5%E6%9C%AC%E6%8A%95%E9%99%8D%E7%9F%A3" - }, - { - "title": "尚公主全阵容官宣", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%B0%9A%E5%85%AC%E4%B8%BB%E5%85%A8%E9%98%B5%E5%AE%B9%E5%AE%98%E5%AE%A3" - }, - { - "title": "真的可以永远相信刘宇舞台", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E7%9C%9F%E7%9A%84%E5%8F%AF%E4%BB%A5%E6%B0%B8%E8%BF%9C%E7%9B%B8%E4%BF%A1%E5%88%98%E5%AE%87%E8%88%9E%E5%8F%B0" - }, - { - "title": "九三阅兵徒步方队铿锵步伐", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5%E5%BE%92%E6%AD%A5%E6%96%B9%E9%98%9F%E9%93%BF%E9%94%B5%E6%AD%A5%E4%BC%90" - }, - { - "title": "唐朝诡事录", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%94%90%E6%9C%9D%E8%AF%A1%E4%BA%8B%E5%BD%95" - }, - { - "title": "抗战胜利80周年第3场记者招待会", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%8A%97%E6%88%98%E8%83%9C%E5%88%A980%E5%91%A8%E5%B9%B4%E7%AC%AC3%E5%9C%BA%E8%AE%B0%E8%80%85%E6%8B%9B%E5%BE%85%E4%BC%9A" - }, - { - "title": "王曼昱钱天一3比2蒯曼孙颖莎", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E7%8E%8B%E6%9B%BC%E6%98%B1%E9%92%B1%E5%A4%A9%E4%B8%803%E6%AF%942%E8%92%AF%E6%9B%BC%E5%AD%99%E9%A2%96%E8%8E%8E" - }, - { - "title": "张维伊对96岁的姥姥说长命百岁", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%BC%A0%E7%BB%B4%E4%BC%8A%E5%AF%B996%E5%B2%81%E7%9A%84%E5%A7%A5%E5%A7%A5%E8%AF%B4%E9%95%BF%E5%91%BD%E7%99%BE%E5%B2%81" - }, - { - "title": "孟子义李昀锐定妆照", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%AD%9F%E5%AD%90%E4%B9%89%E6%9D%8E%E6%98%80%E9%94%90%E5%AE%9A%E5%A6%86%E7%85%A7" - }, - { - "title": "以为张艺兴穿的蓝色抹胸", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E4%BB%A5%E4%B8%BA%E5%BC%A0%E8%89%BA%E5%85%B4%E7%A9%BF%E7%9A%84%E8%93%9D%E8%89%B2%E6%8A%B9%E8%83%B8" - }, - { - "title": "尚公主开机", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%B0%9A%E5%85%AC%E4%B8%BB%E5%BC%80%E6%9C%BA" - }, - { - "title": "心动的信号8", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%BF%83%E5%8A%A8%E7%9A%84%E4%BF%A1%E5%8F%B78" - }, - { - "title": "霍建华病娇疯批演爽了", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E9%9C%8D%E5%BB%BA%E5%8D%8E%E7%97%85%E5%A8%87%E7%96%AF%E6%89%B9%E6%BC%94%E7%88%BD%E4%BA%86" - }, - { - "title": "普京抵达天津", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%99%AE%E4%BA%AC%E6%8A%B5%E8%BE%BE%E5%A4%A9%E6%B4%A5" - }, - { - "title": "龚俊的体面只给旅游前几天", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E9%BE%9A%E4%BF%8A%E7%9A%84%E4%BD%93%E9%9D%A2%E5%8F%AA%E7%BB%99%E6%97%85%E6%B8%B8%E5%89%8D%E5%87%A0%E5%A4%A9" - }, - { - "title": "开学焦虑更严重的另有其人", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%BC%80%E5%AD%A6%E7%84%A6%E8%99%91%E6%9B%B4%E4%B8%A5%E9%87%8D%E7%9A%84%E5%8F%A6%E6%9C%89%E5%85%B6%E4%BA%BA" - }, - { - "title": "那英小发雷霆", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E9%82%A3%E8%8B%B1%E5%B0%8F%E5%8F%91%E9%9B%B7%E9%9C%86" - }, - { - "title": "居然有演员一句台词背1小时", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%B1%85%E7%84%B6%E6%9C%89%E6%BC%94%E5%91%98%E4%B8%80%E5%8F%A5%E5%8F%B0%E8%AF%8D%E8%83%8C1%E5%B0%8F%E6%97%B6" - }, - { - "title": "谁教魏哲鸣冷脸跳这些的", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E8%B0%81%E6%95%99%E9%AD%8F%E5%93%B2%E9%B8%A3%E5%86%B7%E8%84%B8%E8%B7%B3%E8%BF%99%E4%BA%9B%E7%9A%84" - }, - { - "title": "朱孝天爆冷出局", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%9C%B1%E5%AD%9D%E5%A4%A9%E7%88%86%E5%86%B7%E5%87%BA%E5%B1%80" - }, - { - "title": "俄军称掌握战略主动权", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E4%BF%84%E5%86%9B%E7%A7%B0%E6%8E%8C%E6%8F%A1%E6%88%98%E7%95%A5%E4%B8%BB%E5%8A%A8%E6%9D%83" - }, - { - "title": "谈恋爱3个月定律", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E8%B0%88%E6%81%8B%E7%88%B13%E4%B8%AA%E6%9C%88%E5%AE%9A%E5%BE%8B" - }, - { - "title": "沈腾说错了最怕人笨还不勤快", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%B2%88%E8%85%BE%E8%AF%B4%E9%94%99%E4%BA%86%E6%9C%80%E6%80%95%E4%BA%BA%E7%AC%A8%E8%BF%98%E4%B8%8D%E5%8B%A4%E5%BF%AB" - }, - { - "title": "王菲最新状态", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E7%8E%8B%E8%8F%B2%E6%9C%80%E6%96%B0%E7%8A%B6%E6%80%81" - }, - { - "title": "张紫宁转行当拉拉队经理人了", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%BC%A0%E7%B4%AB%E5%AE%81%E8%BD%AC%E8%A1%8C%E5%BD%93%E6%8B%89%E6%8B%89%E9%98%9F%E7%BB%8F%E7%90%86%E4%BA%BA%E4%BA%86" - }, - { - "title": "金价大涨两大原因", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E9%87%91%E4%BB%B7%E5%A4%A7%E6%B6%A8%E4%B8%A4%E5%A4%A7%E5%8E%9F%E5%9B%A0" - }, - { - "title": "陕西Shaanxi官方标准拼音", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E9%99%95%E8%A5%BFShaanxi%E5%AE%98%E6%96%B9%E6%A0%87%E5%87%86%E6%8B%BC%E9%9F%B3" - }, - { - "title": "边伯贤跳刀马刀马", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E8%BE%B9%E4%BC%AF%E8%B4%A4%E8%B7%B3%E5%88%80%E9%A9%AC%E5%88%80%E9%A9%AC" - }, - { - "title": "冷冻太久的肉就不要再吃了", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%86%B7%E5%86%BB%E5%A4%AA%E4%B9%85%E7%9A%84%E8%82%89%E5%B0%B1%E4%B8%8D%E8%A6%81%E5%86%8D%E5%90%83%E4%BA%86" - }, - { - "title": "95后00后恋爱有代沟", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=95%E5%90%8E00%E5%90%8E%E6%81%8B%E7%88%B1%E6%9C%89%E4%BB%A3%E6%B2%9F" - }, - { - "title": "易烊千玺抢票", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%98%93%E7%83%8A%E5%8D%83%E7%8E%BA%E6%8A%A2%E7%A5%A8" - }, - { - "title": "孙闻被乒协处罚", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%AD%99%E9%97%BB%E8%A2%AB%E4%B9%92%E5%8D%8F%E5%A4%84%E7%BD%9A" - }, - { - "title": "这居然是白举纲", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E8%BF%99%E5%B1%85%E7%84%B6%E6%98%AF%E7%99%BD%E4%B8%BE%E7%BA%B2" - }, - { - "title": "纪凌尘出演孟子义新剧", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E7%BA%AA%E5%87%8C%E5%B0%98%E5%87%BA%E6%BC%94%E5%AD%9F%E5%AD%90%E4%B9%89%E6%96%B0%E5%89%A7" - }, - { - "title": "外卖员妈妈暴雨中将孩子托付派出所", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%A4%96%E5%8D%96%E5%91%98%E5%A6%88%E5%A6%88%E6%9A%B4%E9%9B%A8%E4%B8%AD%E5%B0%86%E5%AD%A9%E5%AD%90%E6%89%98%E4%BB%98%E6%B4%BE%E5%87%BA%E6%89%80" - }, - { - "title": "我点外卖没用上券就这样", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%88%91%E7%82%B9%E5%A4%96%E5%8D%96%E6%B2%A1%E7%94%A8%E4%B8%8A%E5%88%B8%E5%B0%B1%E8%BF%99%E6%A0%B7" - }, - { - "title": "孙颖莎小时候真来过新疆", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%AD%99%E9%A2%96%E8%8E%8E%E5%B0%8F%E6%97%B6%E5%80%99%E7%9C%9F%E6%9D%A5%E8%BF%87%E6%96%B0%E7%96%86" - }, - { - "title": "印尼首都交通瘫痪", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%8D%B0%E5%B0%BC%E9%A6%96%E9%83%BD%E4%BA%A4%E9%80%9A%E7%98%AB%E7%97%AA" - }, - { - "title": "停狗位停满了小狗", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%81%9C%E7%8B%97%E4%BD%8D%E5%81%9C%E6%BB%A1%E4%BA%86%E5%B0%8F%E7%8B%97" - }, - { - "title": "怪不得校服裤子屁股锃亮", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%80%AA%E4%B8%8D%E5%BE%97%E6%A0%A1%E6%9C%8D%E8%A3%A4%E5%AD%90%E5%B1%81%E8%82%A1%E9%94%83%E4%BA%AE" - }, - { - "title": "这一幕幕中国浪漫看得心暖暖", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E8%BF%99%E4%B8%80%E5%B9%95%E5%B9%95%E4%B8%AD%E5%9B%BD%E6%B5%AA%E6%BC%AB%E7%9C%8B%E5%BE%97%E5%BF%83%E6%9A%96%E6%9A%96" - }, - { - "title": "林书豪退役", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E6%9E%97%E4%B9%A6%E8%B1%AA%E9%80%80%E5%BD%B9" - }, - { - "title": "小猫咪舔毛把自己累睡着", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%B0%8F%E7%8C%AB%E5%92%AA%E8%88%94%E6%AF%9B%E6%8A%8A%E8%87%AA%E5%B7%B1%E7%B4%AF%E7%9D%A1%E7%9D%80" - }, - { - "title": "iPhone17国行预计涨价500元", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=iPhone17%E5%9B%BD%E8%A1%8C%E9%A2%84%E8%AE%A1%E6%B6%A8%E4%BB%B7500%E5%85%83" - }, - { - "title": "土耳其总统埃尔多安抵达天津", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%9C%9F%E8%80%B3%E5%85%B6%E6%80%BB%E7%BB%9F%E5%9F%83%E5%B0%94%E5%A4%9A%E5%AE%89%E6%8A%B5%E8%BE%BE%E5%A4%A9%E6%B4%A5" - }, - { - "title": "脱口秀和Ta的朋友们", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E8%84%B1%E5%8F%A3%E7%A7%80%E5%92%8CTa%E7%9A%84%E6%9C%8B%E5%8F%8B%E4%BB%AC" - }, - { - "title": "孟子义暮晚摇", - "hot_value": 0, - "link": "https://s.weibo.com/weibo?q=%E5%AD%9F%E5%AD%90%E4%B9%89%E6%9A%AE%E6%99%9A%E6%91%87" - } - ] +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": [ + { + "title": "00后男生0.6秒飞针采血惊呆患者", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=00%E5%90%8E%E7%94%B7%E7%94%9F0.6%E7%A7%92%E9%A3%9E%E9%92%88%E9%87%87%E8%A1%80%E6%83%8A%E5%91%86%E6%82%A3%E8%80%85" + }, + { + "title": "普京带3位副总理10多位部长到中国", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E6%99%AE%E4%BA%AC%E5%B8%A63%E4%BD%8D%E5%89%AF%E6%80%BB%E7%90%8610%E5%A4%9A%E4%BD%8D%E9%83%A8%E9%95%BF%E5%88%B0%E4%B8%AD%E5%9B%BD" + }, + { + "title": "始终高举上海精神旗帜", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%A7%8B%E7%BB%88%E9%AB%98%E4%B8%BE%E4%B8%8A%E6%B5%B7%E7%B2%BE%E7%A5%9E%E6%97%97%E5%B8%9C" + }, + { + "title": "女生苦练化妆1年的变化", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%A5%B3%E7%94%9F%E8%8B%A6%E7%BB%83%E5%8C%96%E5%A6%861%E5%B9%B4%E7%9A%84%E5%8F%98%E5%8C%96" + }, + { + "title": "香港1200架无人机重现日本投降矣", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E9%A6%99%E6%B8%AF1200%E6%9E%B6%E6%97%A0%E4%BA%BA%E6%9C%BA%E9%87%8D%E7%8E%B0%E6%97%A5%E6%9C%AC%E6%8A%95%E9%99%8D%E7%9F%A3" + }, + { + "title": "尚公主全阵容官宣", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%B0%9A%E5%85%AC%E4%B8%BB%E5%85%A8%E9%98%B5%E5%AE%B9%E5%AE%98%E5%AE%A3" + }, + { + "title": "真的可以永远相信刘宇舞台", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E7%9C%9F%E7%9A%84%E5%8F%AF%E4%BB%A5%E6%B0%B8%E8%BF%9C%E7%9B%B8%E4%BF%A1%E5%88%98%E5%AE%87%E8%88%9E%E5%8F%B0" + }, + { + "title": "九三阅兵徒步方队铿锵步伐", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5%E5%BE%92%E6%AD%A5%E6%96%B9%E9%98%9F%E9%93%BF%E9%94%B5%E6%AD%A5%E4%BC%90" + }, + { + "title": "唐朝诡事录", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%94%90%E6%9C%9D%E8%AF%A1%E4%BA%8B%E5%BD%95" + }, + { + "title": "抗战胜利80周年第3场记者招待会", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E6%8A%97%E6%88%98%E8%83%9C%E5%88%A980%E5%91%A8%E5%B9%B4%E7%AC%AC3%E5%9C%BA%E8%AE%B0%E8%80%85%E6%8B%9B%E5%BE%85%E4%BC%9A" + }, + { + "title": "王曼昱钱天一3比2蒯曼孙颖莎", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E7%8E%8B%E6%9B%BC%E6%98%B1%E9%92%B1%E5%A4%A9%E4%B8%803%E6%AF%942%E8%92%AF%E6%9B%BC%E5%AD%99%E9%A2%96%E8%8E%8E" + }, + { + "title": "张维伊对96岁的姥姥说长命百岁", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%BC%A0%E7%BB%B4%E4%BC%8A%E5%AF%B996%E5%B2%81%E7%9A%84%E5%A7%A5%E5%A7%A5%E8%AF%B4%E9%95%BF%E5%91%BD%E7%99%BE%E5%B2%81" + }, + { + "title": "孟子义李昀锐定妆照", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%AD%9F%E5%AD%90%E4%B9%89%E6%9D%8E%E6%98%80%E9%94%90%E5%AE%9A%E5%A6%86%E7%85%A7" + }, + { + "title": "以为张艺兴穿的蓝色抹胸", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E4%BB%A5%E4%B8%BA%E5%BC%A0%E8%89%BA%E5%85%B4%E7%A9%BF%E7%9A%84%E8%93%9D%E8%89%B2%E6%8A%B9%E8%83%B8" + }, + { + "title": "尚公主开机", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%B0%9A%E5%85%AC%E4%B8%BB%E5%BC%80%E6%9C%BA" + }, + { + "title": "心动的信号8", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%BF%83%E5%8A%A8%E7%9A%84%E4%BF%A1%E5%8F%B78" + }, + { + "title": "霍建华病娇疯批演爽了", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E9%9C%8D%E5%BB%BA%E5%8D%8E%E7%97%85%E5%A8%87%E7%96%AF%E6%89%B9%E6%BC%94%E7%88%BD%E4%BA%86" + }, + { + "title": "普京抵达天津", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E6%99%AE%E4%BA%AC%E6%8A%B5%E8%BE%BE%E5%A4%A9%E6%B4%A5" + }, + { + "title": "龚俊的体面只给旅游前几天", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E9%BE%9A%E4%BF%8A%E7%9A%84%E4%BD%93%E9%9D%A2%E5%8F%AA%E7%BB%99%E6%97%85%E6%B8%B8%E5%89%8D%E5%87%A0%E5%A4%A9" + }, + { + "title": "开学焦虑更严重的另有其人", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%BC%80%E5%AD%A6%E7%84%A6%E8%99%91%E6%9B%B4%E4%B8%A5%E9%87%8D%E7%9A%84%E5%8F%A6%E6%9C%89%E5%85%B6%E4%BA%BA" + }, + { + "title": "那英小发雷霆", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E9%82%A3%E8%8B%B1%E5%B0%8F%E5%8F%91%E9%9B%B7%E9%9C%86" + }, + { + "title": "居然有演员一句台词背1小时", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%B1%85%E7%84%B6%E6%9C%89%E6%BC%94%E5%91%98%E4%B8%80%E5%8F%A5%E5%8F%B0%E8%AF%8D%E8%83%8C1%E5%B0%8F%E6%97%B6" + }, + { + "title": "谁教魏哲鸣冷脸跳这些的", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E8%B0%81%E6%95%99%E9%AD%8F%E5%93%B2%E9%B8%A3%E5%86%B7%E8%84%B8%E8%B7%B3%E8%BF%99%E4%BA%9B%E7%9A%84" + }, + { + "title": "朱孝天爆冷出局", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E6%9C%B1%E5%AD%9D%E5%A4%A9%E7%88%86%E5%86%B7%E5%87%BA%E5%B1%80" + }, + { + "title": "俄军称掌握战略主动权", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E4%BF%84%E5%86%9B%E7%A7%B0%E6%8E%8C%E6%8F%A1%E6%88%98%E7%95%A5%E4%B8%BB%E5%8A%A8%E6%9D%83" + }, + { + "title": "谈恋爱3个月定律", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E8%B0%88%E6%81%8B%E7%88%B13%E4%B8%AA%E6%9C%88%E5%AE%9A%E5%BE%8B" + }, + { + "title": "沈腾说错了最怕人笨还不勤快", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E6%B2%88%E8%85%BE%E8%AF%B4%E9%94%99%E4%BA%86%E6%9C%80%E6%80%95%E4%BA%BA%E7%AC%A8%E8%BF%98%E4%B8%8D%E5%8B%A4%E5%BF%AB" + }, + { + "title": "王菲最新状态", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E7%8E%8B%E8%8F%B2%E6%9C%80%E6%96%B0%E7%8A%B6%E6%80%81" + }, + { + "title": "张紫宁转行当拉拉队经理人了", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%BC%A0%E7%B4%AB%E5%AE%81%E8%BD%AC%E8%A1%8C%E5%BD%93%E6%8B%89%E6%8B%89%E9%98%9F%E7%BB%8F%E7%90%86%E4%BA%BA%E4%BA%86" + }, + { + "title": "金价大涨两大原因", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E9%87%91%E4%BB%B7%E5%A4%A7%E6%B6%A8%E4%B8%A4%E5%A4%A7%E5%8E%9F%E5%9B%A0" + }, + { + "title": "陕西Shaanxi官方标准拼音", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E9%99%95%E8%A5%BFShaanxi%E5%AE%98%E6%96%B9%E6%A0%87%E5%87%86%E6%8B%BC%E9%9F%B3" + }, + { + "title": "边伯贤跳刀马刀马", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E8%BE%B9%E4%BC%AF%E8%B4%A4%E8%B7%B3%E5%88%80%E9%A9%AC%E5%88%80%E9%A9%AC" + }, + { + "title": "冷冻太久的肉就不要再吃了", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%86%B7%E5%86%BB%E5%A4%AA%E4%B9%85%E7%9A%84%E8%82%89%E5%B0%B1%E4%B8%8D%E8%A6%81%E5%86%8D%E5%90%83%E4%BA%86" + }, + { + "title": "95后00后恋爱有代沟", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=95%E5%90%8E00%E5%90%8E%E6%81%8B%E7%88%B1%E6%9C%89%E4%BB%A3%E6%B2%9F" + }, + { + "title": "易烊千玺抢票", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E6%98%93%E7%83%8A%E5%8D%83%E7%8E%BA%E6%8A%A2%E7%A5%A8" + }, + { + "title": "孙闻被乒协处罚", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%AD%99%E9%97%BB%E8%A2%AB%E4%B9%92%E5%8D%8F%E5%A4%84%E7%BD%9A" + }, + { + "title": "这居然是白举纲", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E8%BF%99%E5%B1%85%E7%84%B6%E6%98%AF%E7%99%BD%E4%B8%BE%E7%BA%B2" + }, + { + "title": "纪凌尘出演孟子义新剧", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E7%BA%AA%E5%87%8C%E5%B0%98%E5%87%BA%E6%BC%94%E5%AD%9F%E5%AD%90%E4%B9%89%E6%96%B0%E5%89%A7" + }, + { + "title": "外卖员妈妈暴雨中将孩子托付派出所", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%A4%96%E5%8D%96%E5%91%98%E5%A6%88%E5%A6%88%E6%9A%B4%E9%9B%A8%E4%B8%AD%E5%B0%86%E5%AD%A9%E5%AD%90%E6%89%98%E4%BB%98%E6%B4%BE%E5%87%BA%E6%89%80" + }, + { + "title": "我点外卖没用上券就这样", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E6%88%91%E7%82%B9%E5%A4%96%E5%8D%96%E6%B2%A1%E7%94%A8%E4%B8%8A%E5%88%B8%E5%B0%B1%E8%BF%99%E6%A0%B7" + }, + { + "title": "孙颖莎小时候真来过新疆", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%AD%99%E9%A2%96%E8%8E%8E%E5%B0%8F%E6%97%B6%E5%80%99%E7%9C%9F%E6%9D%A5%E8%BF%87%E6%96%B0%E7%96%86" + }, + { + "title": "印尼首都交通瘫痪", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%8D%B0%E5%B0%BC%E9%A6%96%E9%83%BD%E4%BA%A4%E9%80%9A%E7%98%AB%E7%97%AA" + }, + { + "title": "停狗位停满了小狗", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%81%9C%E7%8B%97%E4%BD%8D%E5%81%9C%E6%BB%A1%E4%BA%86%E5%B0%8F%E7%8B%97" + }, + { + "title": "怪不得校服裤子屁股锃亮", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E6%80%AA%E4%B8%8D%E5%BE%97%E6%A0%A1%E6%9C%8D%E8%A3%A4%E5%AD%90%E5%B1%81%E8%82%A1%E9%94%83%E4%BA%AE" + }, + { + "title": "这一幕幕中国浪漫看得心暖暖", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E8%BF%99%E4%B8%80%E5%B9%95%E5%B9%95%E4%B8%AD%E5%9B%BD%E6%B5%AA%E6%BC%AB%E7%9C%8B%E5%BE%97%E5%BF%83%E6%9A%96%E6%9A%96" + }, + { + "title": "林书豪退役", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E6%9E%97%E4%B9%A6%E8%B1%AA%E9%80%80%E5%BD%B9" + }, + { + "title": "小猫咪舔毛把自己累睡着", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%B0%8F%E7%8C%AB%E5%92%AA%E8%88%94%E6%AF%9B%E6%8A%8A%E8%87%AA%E5%B7%B1%E7%B4%AF%E7%9D%A1%E7%9D%80" + }, + { + "title": "iPhone17国行预计涨价500元", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=iPhone17%E5%9B%BD%E8%A1%8C%E9%A2%84%E8%AE%A1%E6%B6%A8%E4%BB%B7500%E5%85%83" + }, + { + "title": "土耳其总统埃尔多安抵达天津", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%9C%9F%E8%80%B3%E5%85%B6%E6%80%BB%E7%BB%9F%E5%9F%83%E5%B0%94%E5%A4%9A%E5%AE%89%E6%8A%B5%E8%BE%BE%E5%A4%A9%E6%B4%A5" + }, + { + "title": "脱口秀和Ta的朋友们", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E8%84%B1%E5%8F%A3%E7%A7%80%E5%92%8CTa%E7%9A%84%E6%9C%8B%E5%8F%8B%E4%BB%AC" + }, + { + "title": "孟子义暮晚摇", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%AD%9F%E5%AD%90%E4%B9%89%E6%9A%AE%E6%99%9A%E6%91%87" + } + ] } \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/api.js b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/api.js index a5ec529e..e171569d 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/api.js +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/api.js @@ -1,180 +1,180 @@ -/** - * 懂车帝热搜API模块 - * 负责数据获取、验证和格式化 - */ -class CarHotTopicsAPI { - constructor() { - this.baseURL = 'https://60s.api.shumengya.top/v2/dongchedi'; - this.timeout = 10000; // 10秒超时 - this.retryCount = 3; - this.retryDelay = 1000; // 1秒重试延迟 - } - - /** - * 获取热搜数据 - * @param {string} encoding - 编码格式(可选) - * @returns {Promise} 热搜数据 - */ - async fetchHotTopics(encoding = '') { - const url = encoding ? `${this.baseURL}?encoding=${encodeURIComponent(encoding)}` : this.baseURL; - - for (let attempt = 1; attempt <= this.retryCount; attempt++) { - try { - console.log(`[API] 尝试获取数据 (${attempt}/${this.retryCount}): ${url}`); - - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), this.timeout); - - const response = await fetch(url, { - method: 'GET', - headers: { - 'Accept': 'application/json', - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' - }, - signal: controller.signal - }); - - clearTimeout(timeoutId); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - - const data = await response.json(); - console.log('[API] 数据获取成功:', data); - - // 验证数据格式 - const validatedData = this.validateData(data); - return this.formatData(validatedData); - - } catch (error) { - console.error(`[API] 第${attempt}次请求失败:`, error.message); - - if (attempt === this.retryCount) { - throw new Error(`获取数据失败: ${error.message}`); - } - - // 等待后重试 - await this.delay(this.retryDelay * attempt); - } - } - } - - /** - * 验证API返回数据格式 - * @param {Object} data - API返回的原始数据 - * @returns {Object} 验证后的数据 - */ - validateData(data) { - if (!data || typeof data !== 'object') { - throw new Error('数据格式错误:响应不是有效的JSON对象'); - } - - if (data.code !== 200) { - throw new Error(`API错误:${data.message || '未知错误'}`); - } - - if (!Array.isArray(data.data)) { - throw new Error('数据格式错误:data字段不是数组'); - } - - // 验证每个热搜项目的必需字段 - data.data.forEach((item, index) => { - const requiredFields = ['rank', 'title', 'score', 'score_desc']; - const missingFields = requiredFields.filter(field => !(field in item)); - - if (missingFields.length > 0) { - console.warn(`[API] 第${index + 1}项数据缺少字段:`, missingFields); - } - }); - - return data; - } - - /** - * 格式化数据 - * @param {Object} data - 验证后的数据 - * @returns {Object} 格式化后的数据 - */ - formatData(data) { - const formattedTopics = data.data.map(item => ({ - rank: parseInt(item.rank) || 0, - title: String(item.title || '').trim(), - score: parseInt(item.score) || 0, - scoreDesc: String(item.score_desc || '').trim(), - // 添加一些计算字段 - isTop3: parseInt(item.rank) <= 3, - formattedScore: this.formatScore(item.score), - searchUrl: this.generateSearchUrl(item.title) - })); - - return { - code: data.code, - message: data.message, - data: formattedTopics, - updateTime: new Date().toLocaleString('zh-CN'), - total: formattedTopics.length - }; - } - - /** - * 格式化分数显示 - * @param {number} score - 原始分数 - * @returns {string} 格式化后的分数 - */ - formatScore(score) { - if (!score || isNaN(score)) return '0'; - - if (score >= 10000) { - return (score / 10000).toFixed(1) + 'w'; - } - - return score.toLocaleString(); - } - - /** - * 生成搜索URL - * @param {string} title - 热搜标题 - * @returns {string} 搜索URL - */ - generateSearchUrl(title) { - const encodedTitle = encodeURIComponent(title); - return `https://www.dongchedi.com/search?query=${encodedTitle}`; - } - - /** - * 延迟函数 - * @param {number} ms - 延迟毫秒数 - * @returns {Promise} Promise对象 - */ - delay(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); - } - - /** - * 获取API状态 - * @returns {Promise} API状态信息 - */ - async getAPIStatus() { - try { - const startTime = Date.now(); - await this.fetchHotTopics(); - const responseTime = Date.now() - startTime; - - return { - status: 'online', - responseTime: responseTime, - message: 'API服务正常' - }; - } catch (error) { - return { - status: 'offline', - responseTime: null, - message: error.message - }; - } - } -} - -// 导出API实例 +/** + * 懂车帝热搜API模块 + * 负责数据获取、验证和格式化 + */ +class CarHotTopicsAPI { + constructor() { + this.baseURL = 'https://60s.api.shumengya.top/v2/dongchedi'; + this.timeout = 10000; // 10秒超时 + this.retryCount = 3; + this.retryDelay = 1000; // 1秒重试延迟 + } + + /** + * 获取热搜数据 + * @param {string} encoding - 编码格式(可选) + * @returns {Promise} 热搜数据 + */ + async fetchHotTopics(encoding = '') { + const url = encoding ? `${this.baseURL}?encoding=${encodeURIComponent(encoding)}` : this.baseURL; + + for (let attempt = 1; attempt <= this.retryCount; attempt++) { + try { + console.log(`[API] 尝试获取数据 (${attempt}/${this.retryCount}): ${url}`); + + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), this.timeout); + + const response = await fetch(url, { + method: 'GET', + headers: { + 'Accept': 'application/json', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' + }, + signal: controller.signal + }); + + clearTimeout(timeoutId); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + const data = await response.json(); + console.log('[API] 数据获取成功:', data); + + // 验证数据格式 + const validatedData = this.validateData(data); + return this.formatData(validatedData); + + } catch (error) { + console.error(`[API] 第${attempt}次请求失败:`, error.message); + + if (attempt === this.retryCount) { + throw new Error(`获取数据失败: ${error.message}`); + } + + // 等待后重试 + await this.delay(this.retryDelay * attempt); + } + } + } + + /** + * 验证API返回数据格式 + * @param {Object} data - API返回的原始数据 + * @returns {Object} 验证后的数据 + */ + validateData(data) { + if (!data || typeof data !== 'object') { + throw new Error('数据格式错误:响应不是有效的JSON对象'); + } + + if (data.code !== 200) { + throw new Error(`API错误:${data.message || '未知错误'}`); + } + + if (!Array.isArray(data.data)) { + throw new Error('数据格式错误:data字段不是数组'); + } + + // 验证每个热搜项目的必需字段 + data.data.forEach((item, index) => { + const requiredFields = ['rank', 'title', 'score', 'score_desc']; + const missingFields = requiredFields.filter(field => !(field in item)); + + if (missingFields.length > 0) { + console.warn(`[API] 第${index + 1}项数据缺少字段:`, missingFields); + } + }); + + return data; + } + + /** + * 格式化数据 + * @param {Object} data - 验证后的数据 + * @returns {Object} 格式化后的数据 + */ + formatData(data) { + const formattedTopics = data.data.map(item => ({ + rank: parseInt(item.rank) || 0, + title: String(item.title || '').trim(), + score: parseInt(item.score) || 0, + scoreDesc: String(item.score_desc || '').trim(), + // 添加一些计算字段 + isTop3: parseInt(item.rank) <= 3, + formattedScore: this.formatScore(item.score), + searchUrl: this.generateSearchUrl(item.title) + })); + + return { + code: data.code, + message: data.message, + data: formattedTopics, + updateTime: new Date().toLocaleString('zh-CN'), + total: formattedTopics.length + }; + } + + /** + * 格式化分数显示 + * @param {number} score - 原始分数 + * @returns {string} 格式化后的分数 + */ + formatScore(score) { + if (!score || isNaN(score)) return '0'; + + if (score >= 10000) { + return (score / 10000).toFixed(1) + 'w'; + } + + return score.toLocaleString(); + } + + /** + * 生成搜索URL + * @param {string} title - 热搜标题 + * @returns {string} 搜索URL + */ + generateSearchUrl(title) { + const encodedTitle = encodeURIComponent(title); + return `https://www.dongchedi.com/search?query=${encodedTitle}`; + } + + /** + * 延迟函数 + * @param {number} ms - 延迟毫秒数 + * @returns {Promise} Promise对象 + */ + delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } + + /** + * 获取API状态 + * @returns {Promise} API状态信息 + */ + async getAPIStatus() { + try { + const startTime = Date.now(); + await this.fetchHotTopics(); + const responseTime = Date.now() - startTime; + + return { + status: 'online', + responseTime: responseTime, + message: 'API服务正常' + }; + } catch (error) { + return { + status: 'offline', + responseTime: null, + message: error.message + }; + } + } +} + +// 导出API实例 window.CarHotTopicsAPI = CarHotTopicsAPI; \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/app.js b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/app.js index 9972067a..65a677a7 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/app.js +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/app.js @@ -1,313 +1,313 @@ -/** - * 懂车帝热搜应用主程序 - * 整合API和UI模块,管理应用生命周期 - */ -class CarHotTopicsApp { - constructor() { - this.api = null; - this.ui = null; - this.autoRefreshInterval = null; - this.autoRefreshDelay = 5 * 60 * 1000; // 5分钟自动刷新 - this.isInitialized = false; - - this.init(); - } - - /** - * 初始化应用 - */ - async init() { - try { - console.log('[App] 开始初始化懂车帝热搜应用...'); - - // 等待DOM加载完成 - if (document.readyState === 'loading') { - await new Promise(resolve => { - document.addEventListener('DOMContentLoaded', resolve); - }); - } - - // 检查必需的类是否存在 - if (!window.CarHotTopicsAPI || !window.UIManager) { - throw new Error('缺少必需的模块:CarHotTopicsAPI 或 UIManager'); - } - - // 初始化模块 - this.api = new window.CarHotTopicsAPI(); - this.ui = new window.UIManager(); - - // 检查必需的DOM元素 - this.checkRequiredElements(); - - // 绑定事件 - this.bindEvents(); - - // 首次加载数据 - await this.loadData(); - - // 设置自动刷新 - this.setupAutoRefresh(); - - // 设置页面可见性监听 - this.setupVisibilityListener(); - - this.isInitialized = true; - console.log('[App] 应用初始化完成'); - - } catch (error) { - console.error('[App] 初始化失败:', error); - this.handleInitError(error); - } - } - - /** - * 检查必需的DOM元素 - */ - checkRequiredElements() { - const requiredIds = ['loading', 'error', 'hotList', 'topicsContainer', 'refreshBtn']; - const missingElements = requiredIds.filter(id => !document.getElementById(id)); - - if (missingElements.length > 0) { - throw new Error(`缺少必需的DOM元素: ${missingElements.join(', ')}`); - } - } - - /** - * 绑定事件监听器 - */ - bindEvents() { - // 监听UI触发的刷新事件 - document.addEventListener('refreshData', () => { - this.handleManualRefresh(); - }); - - // 监听网络状态变化 - window.addEventListener('online', () => { - console.log('[App] 网络已连接,尝试刷新数据'); - this.ui.showToast('网络已连接'); - this.loadData(); - }); - - window.addEventListener('offline', () => { - console.log('[App] 网络已断开'); - this.ui.showToast('网络连接已断开'); - }); - - // 监听页面错误 - window.addEventListener('error', (event) => { - console.error('[App] 页面错误:', event.error); - }); - - // 监听未处理的Promise拒绝 - window.addEventListener('unhandledrejection', (event) => { - console.error('[App] 未处理的Promise拒绝:', event.reason); - event.preventDefault(); - }); - } - - /** - * 加载热搜数据 - * @param {boolean} showLoading - 是否显示加载状态 - */ - async loadData(showLoading = true) { - try { - if (showLoading) { - this.ui.showLoading(); - } - - console.log('[App] 开始加载热搜数据...'); - const data = await this.api.fetchHotTopics(); - - console.log('[App] 数据加载成功:', data); - this.ui.showHotList(data); - - // 重置自动刷新计时器 - this.resetAutoRefresh(); - - } catch (error) { - console.error('[App] 数据加载失败:', error); - this.ui.showError(error.message); - - // 如果是网络错误,延迟重试 - if (this.isNetworkError(error)) { - setTimeout(() => { - if (navigator.onLine) { - this.loadData(false); - } - }, 30000); // 30秒后重试 - } - } - } - - /** - * 处理手动刷新 - */ - async handleManualRefresh() { - console.log('[App] 手动刷新数据'); - await this.loadData(); - } - - /** - * 设置自动刷新 - */ - setupAutoRefresh() { - if (this.autoRefreshInterval) { - clearInterval(this.autoRefreshInterval); - } - - this.autoRefreshInterval = setInterval(() => { - if (document.visibilityState === 'visible' && navigator.onLine) { - console.log('[App] 自动刷新数据'); - this.loadData(false); - } - }, this.autoRefreshDelay); - - console.log(`[App] 自动刷新已设置,间隔: ${this.autoRefreshDelay / 1000}秒`); - } - - /** - * 重置自动刷新计时器 - */ - resetAutoRefresh() { - this.setupAutoRefresh(); - } - - /** - * 设置页面可见性监听 - */ - setupVisibilityListener() { - document.addEventListener('visibilitychange', () => { - if (document.visibilityState === 'visible') { - console.log('[App] 页面变为可见'); - - // 检查数据是否需要更新 - const currentData = this.ui.getCurrentData(); - if (currentData) { - const lastUpdate = new Date(currentData.updateTime); - const now = new Date(); - const timeDiff = now - lastUpdate; - - // 如果数据超过3分钟,自动刷新 - if (timeDiff > 3 * 60 * 1000) { - console.log('[App] 数据已过期,自动刷新'); - this.loadData(false); - } - } - } else { - console.log('[App] 页面变为隐藏'); - } - }); - } - - /** - * 判断是否为网络错误 - * @param {Error} error - 错误对象 - * @returns {boolean} 是否为网络错误 - */ - isNetworkError(error) { - const networkErrorMessages = [ - 'fetch', - 'network', - 'timeout', - 'connection', - 'offline' - ]; - - return networkErrorMessages.some(msg => - error.message.toLowerCase().includes(msg) - ); - } - - /** - * 处理初始化错误 - * @param {Error} error - 错误对象 - */ - handleInitError(error) { - // 显示基本错误信息 - const errorContainer = document.getElementById('error'); - if (errorContainer) { - errorContainer.style.display = 'flex'; - const errorMessage = errorContainer.querySelector('.error-message'); - if (errorMessage) { - errorMessage.textContent = `初始化失败: ${error.message}`; - } - } - - // 隐藏加载状态 - const loadingContainer = document.getElementById('loading'); - if (loadingContainer) { - loadingContainer.style.display = 'none'; - } - } - - /** - * 获取应用状态 - * @returns {Object} 应用状态信息 - */ - getStatus() { - return { - isInitialized: this.isInitialized, - hasData: !!this.ui?.getCurrentData(), - autoRefreshEnabled: !!this.autoRefreshInterval, - isOnline: navigator.onLine, - isVisible: document.visibilityState === 'visible' - }; - } - - /** - * 销毁应用 - */ - destroy() { - console.log('[App] 销毁应用'); - - if (this.autoRefreshInterval) { - clearInterval(this.autoRefreshInterval); - this.autoRefreshInterval = null; - } - - if (this.ui) { - this.ui.clearData(); - } - - this.isInitialized = false; - } -} - -// 全局错误处理 -window.addEventListener('error', (event) => { - console.error('[Global] JavaScript错误:', { - message: event.message, - filename: event.filename, - lineno: event.lineno, - colno: event.colno, - error: event.error - }); -}); - -window.addEventListener('unhandledrejection', (event) => { - console.error('[Global] 未处理的Promise拒绝:', event.reason); -}); - -// 应用启动 -let app; - -// 确保在DOM加载完成后启动应用 -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', () => { - app = new CarHotTopicsApp(); - }); -} else { - app = new CarHotTopicsApp(); -} - -// 导出应用实例(用于调试) -window.CarHotTopicsApp = CarHotTopicsApp; -window.app = app; - -// 调试信息 -console.log('[App] 懂车帝热搜应用脚本已加载'); -console.log('[Debug] 可用的全局对象:', { - CarHotTopicsAPI: !!window.CarHotTopicsAPI, - UIManager: !!window.UIManager, - CarHotTopicsApp: !!window.CarHotTopicsApp +/** + * 懂车帝热搜应用主程序 + * 整合API和UI模块,管理应用生命周期 + */ +class CarHotTopicsApp { + constructor() { + this.api = null; + this.ui = null; + this.autoRefreshInterval = null; + this.autoRefreshDelay = 5 * 60 * 1000; // 5分钟自动刷新 + this.isInitialized = false; + + this.init(); + } + + /** + * 初始化应用 + */ + async init() { + try { + console.log('[App] 开始初始化懂车帝热搜应用...'); + + // 等待DOM加载完成 + if (document.readyState === 'loading') { + await new Promise(resolve => { + document.addEventListener('DOMContentLoaded', resolve); + }); + } + + // 检查必需的类是否存在 + if (!window.CarHotTopicsAPI || !window.UIManager) { + throw new Error('缺少必需的模块:CarHotTopicsAPI 或 UIManager'); + } + + // 初始化模块 + this.api = new window.CarHotTopicsAPI(); + this.ui = new window.UIManager(); + + // 检查必需的DOM元素 + this.checkRequiredElements(); + + // 绑定事件 + this.bindEvents(); + + // 首次加载数据 + await this.loadData(); + + // 设置自动刷新 + this.setupAutoRefresh(); + + // 设置页面可见性监听 + this.setupVisibilityListener(); + + this.isInitialized = true; + console.log('[App] 应用初始化完成'); + + } catch (error) { + console.error('[App] 初始化失败:', error); + this.handleInitError(error); + } + } + + /** + * 检查必需的DOM元素 + */ + checkRequiredElements() { + const requiredIds = ['loading', 'error', 'hotList', 'topicsContainer', 'refreshBtn']; + const missingElements = requiredIds.filter(id => !document.getElementById(id)); + + if (missingElements.length > 0) { + throw new Error(`缺少必需的DOM元素: ${missingElements.join(', ')}`); + } + } + + /** + * 绑定事件监听器 + */ + bindEvents() { + // 监听UI触发的刷新事件 + document.addEventListener('refreshData', () => { + this.handleManualRefresh(); + }); + + // 监听网络状态变化 + window.addEventListener('online', () => { + console.log('[App] 网络已连接,尝试刷新数据'); + this.ui.showToast('网络已连接'); + this.loadData(); + }); + + window.addEventListener('offline', () => { + console.log('[App] 网络已断开'); + this.ui.showToast('网络连接已断开'); + }); + + // 监听页面错误 + window.addEventListener('error', (event) => { + console.error('[App] 页面错误:', event.error); + }); + + // 监听未处理的Promise拒绝 + window.addEventListener('unhandledrejection', (event) => { + console.error('[App] 未处理的Promise拒绝:', event.reason); + event.preventDefault(); + }); + } + + /** + * 加载热搜数据 + * @param {boolean} showLoading - 是否显示加载状态 + */ + async loadData(showLoading = true) { + try { + if (showLoading) { + this.ui.showLoading(); + } + + console.log('[App] 开始加载热搜数据...'); + const data = await this.api.fetchHotTopics(); + + console.log('[App] 数据加载成功:', data); + this.ui.showHotList(data); + + // 重置自动刷新计时器 + this.resetAutoRefresh(); + + } catch (error) { + console.error('[App] 数据加载失败:', error); + this.ui.showError(error.message); + + // 如果是网络错误,延迟重试 + if (this.isNetworkError(error)) { + setTimeout(() => { + if (navigator.onLine) { + this.loadData(false); + } + }, 30000); // 30秒后重试 + } + } + } + + /** + * 处理手动刷新 + */ + async handleManualRefresh() { + console.log('[App] 手动刷新数据'); + await this.loadData(); + } + + /** + * 设置自动刷新 + */ + setupAutoRefresh() { + if (this.autoRefreshInterval) { + clearInterval(this.autoRefreshInterval); + } + + this.autoRefreshInterval = setInterval(() => { + if (document.visibilityState === 'visible' && navigator.onLine) { + console.log('[App] 自动刷新数据'); + this.loadData(false); + } + }, this.autoRefreshDelay); + + console.log(`[App] 自动刷新已设置,间隔: ${this.autoRefreshDelay / 1000}秒`); + } + + /** + * 重置自动刷新计时器 + */ + resetAutoRefresh() { + this.setupAutoRefresh(); + } + + /** + * 设置页面可见性监听 + */ + setupVisibilityListener() { + document.addEventListener('visibilitychange', () => { + if (document.visibilityState === 'visible') { + console.log('[App] 页面变为可见'); + + // 检查数据是否需要更新 + const currentData = this.ui.getCurrentData(); + if (currentData) { + const lastUpdate = new Date(currentData.updateTime); + const now = new Date(); + const timeDiff = now - lastUpdate; + + // 如果数据超过3分钟,自动刷新 + if (timeDiff > 3 * 60 * 1000) { + console.log('[App] 数据已过期,自动刷新'); + this.loadData(false); + } + } + } else { + console.log('[App] 页面变为隐藏'); + } + }); + } + + /** + * 判断是否为网络错误 + * @param {Error} error - 错误对象 + * @returns {boolean} 是否为网络错误 + */ + isNetworkError(error) { + const networkErrorMessages = [ + 'fetch', + 'network', + 'timeout', + 'connection', + 'offline' + ]; + + return networkErrorMessages.some(msg => + error.message.toLowerCase().includes(msg) + ); + } + + /** + * 处理初始化错误 + * @param {Error} error - 错误对象 + */ + handleInitError(error) { + // 显示基本错误信息 + const errorContainer = document.getElementById('error'); + if (errorContainer) { + errorContainer.style.display = 'flex'; + const errorMessage = errorContainer.querySelector('.error-message'); + if (errorMessage) { + errorMessage.textContent = `初始化失败: ${error.message}`; + } + } + + // 隐藏加载状态 + const loadingContainer = document.getElementById('loading'); + if (loadingContainer) { + loadingContainer.style.display = 'none'; + } + } + + /** + * 获取应用状态 + * @returns {Object} 应用状态信息 + */ + getStatus() { + return { + isInitialized: this.isInitialized, + hasData: !!this.ui?.getCurrentData(), + autoRefreshEnabled: !!this.autoRefreshInterval, + isOnline: navigator.onLine, + isVisible: document.visibilityState === 'visible' + }; + } + + /** + * 销毁应用 + */ + destroy() { + console.log('[App] 销毁应用'); + + if (this.autoRefreshInterval) { + clearInterval(this.autoRefreshInterval); + this.autoRefreshInterval = null; + } + + if (this.ui) { + this.ui.clearData(); + } + + this.isInitialized = false; + } +} + +// 全局错误处理 +window.addEventListener('error', (event) => { + console.error('[Global] JavaScript错误:', { + message: event.message, + filename: event.filename, + lineno: event.lineno, + colno: event.colno, + error: event.error + }); +}); + +window.addEventListener('unhandledrejection', (event) => { + console.error('[Global] 未处理的Promise拒绝:', event.reason); +}); + +// 应用启动 +let app; + +// 确保在DOM加载完成后启动应用 +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', () => { + app = new CarHotTopicsApp(); + }); +} else { + app = new CarHotTopicsApp(); +} + +// 导出应用实例(用于调试) +window.CarHotTopicsApp = CarHotTopicsApp; +window.app = app; + +// 调试信息 +console.log('[App] 懂车帝热搜应用脚本已加载'); +console.log('[Debug] 可用的全局对象:', { + CarHotTopicsAPI: !!window.CarHotTopicsAPI, + UIManager: !!window.UIManager, + CarHotTopicsApp: !!window.CarHotTopicsApp }); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/background.css index 4b43a29f..ca247e00 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/background.css +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/background.css @@ -1,55 +1,55 @@ -/* 背景样式文件 */ -body { - background: linear-gradient(135deg, #e8f5e8 0%, #f0f8f0 25%, #f5f9f5 50%, #fafcfa 75%, #ffffff 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 { - background: rgba(255, 255, 255, 0.1); - backdrop-filter: blur(10px); - border-radius: 20px; - margin-top: 20px; - margin-bottom: 20px; - box-shadow: 0 8px 32px rgba(139, 195, 74, 0.1); -} - -/* 移动端背景优化 */ -@media (max-width: 767px) { - body { - background-attachment: scroll; - } - - .container { - margin-top: 10px; - margin-bottom: 10px; - border-radius: 16px; - } -} - -/* 深色模式支持 */ -@media (prefers-color-scheme: dark) { - body { - background: linear-gradient(135deg, #1a2e1a 0%, #2d4a2d 25%, #3a5a3a 50%, #4a6a4a 75%, #5a7a5a 100%); - } - - .container { - background: rgba(0, 0, 0, 0.2); - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); - } +/* 背景样式文件 */ +body { + background: linear-gradient(135deg, #e8f5e8 0%, #f0f8f0 25%, #f5f9f5 50%, #fafcfa 75%, #ffffff 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 { + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(10px); + border-radius: 20px; + margin-top: 20px; + margin-bottom: 20px; + box-shadow: 0 8px 32px rgba(139, 195, 74, 0.1); +} + +/* 移动端背景优化 */ +@media (max-width: 767px) { + body { + background-attachment: scroll; + } + + .container { + margin-top: 10px; + margin-bottom: 10px; + border-radius: 16px; + } +} + +/* 深色模式支持 */ +@media (prefers-color-scheme: dark) { + body { + background: linear-gradient(135deg, #1a2e1a 0%, #2d4a2d 25%, #3a5a3a 50%, #4a6a4a 75%, #5a7a5a 100%); + } + + .container { + background: rgba(0, 0, 0, 0.2); + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); + } } \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/index.html index 6c84eae6..7ee397bf 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/index.html +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/index.html @@ -1,72 +1,72 @@ - - - - - - - - 懂车帝热搜榜单 - - - - - -
      - -
      - - -
      - - -
      - -
      -
      -

      正在加载热搜数据...

      -
      - - - - - - -
      - - -
      - -
      -
      - - -
      - - - - - + + + + + + + + 懂车帝热搜榜单 + + + + + +
      + +
      + + +
      + + +
      + +
      +
      +

      正在加载热搜数据...

      +
      + + + + + + +
      + + +
      + +
      +
      + + +
      + + + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/styles.css b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/styles.css index b5fc8011..c8285093 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/styles.css +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/styles.css @@ -1,532 +1,532 @@ -/* 全局样式重置 */ -* { - 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: #333; - min-height: 100vh; - overflow-x: hidden; -} - -/* 容器布局 */ -.container { - max-width: 1200px; - margin: 0 auto; - min-height: 100vh; - display: flex; - flex-direction: column; - padding: 0 16px; -} - -/* 头部样式 */ -.header { - display: flex; - justify-content: space-between; - align-items: center; - padding: 20px 0; - border-bottom: 1px solid rgba(139, 195, 74, 0.2); - margin-bottom: 20px; -} - -.logo { - display: flex; - align-items: center; - gap: 12px; -} - -.logo i { - font-size: 28px; - color: #8bc34a; - background: linear-gradient(135deg, #a5d6a7, #81c784); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} - -.logo h1 { - font-size: 24px; - font-weight: 600; - color: #2e7d32; - margin: 0; -} - -.refresh-btn { - display: flex; - align-items: center; - gap: 8px; - padding: 10px 16px; - background: linear-gradient(135deg, #a5d6a7, #81c784); - color: white; - border: none; - border-radius: 20px; - cursor: pointer; - font-size: 14px; - font-weight: 500; - transition: all 0.3s ease; - box-shadow: 0 2px 8px rgba(139, 195, 74, 0.3); -} - -.refresh-btn:hover { - background: linear-gradient(135deg, #81c784, #66bb6a); - transform: translateY(-1px); - box-shadow: 0 4px 12px rgba(139, 195, 74, 0.4); -} - -.refresh-btn:active { - transform: translateY(0); -} - -.refresh-btn i { - font-size: 14px; -} - -.refresh-btn.loading i { - animation: spin 1s linear infinite; -} - -/* 主内容区域 */ -.main-content { - flex: 1; - position: relative; -} - -/* 加载状态 */ -.loading { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 60px 20px; - text-align: center; -} - -.loading-spinner { - width: 40px; - height: 40px; - border: 3px solid rgba(139, 195, 74, 0.2); - border-top: 3px solid #8bc34a; - border-radius: 50%; - animation: spin 1s linear infinite; - margin-bottom: 16px; -} - -.loading p { - color: #666; - font-size: 16px; -} - -/* 错误状态 */ -.error { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 60px 20px; - text-align: center; -} - -.error-icon i { - font-size: 48px; - color: #ff7043; - margin-bottom: 16px; -} - -.error-message { - color: #666; - font-size: 16px; - margin-bottom: 20px; -} - -.retry-btn { - padding: 10px 20px; - background: linear-gradient(135deg, #a5d6a7, #81c784); - color: white; - border: none; - border-radius: 20px; - cursor: pointer; - font-size: 14px; - transition: all 0.3s ease; -} - -.retry-btn:hover { - background: linear-gradient(135deg, #81c784, #66bb6a); -} - -/* 热搜列表 */ -.hot-list { - animation: fadeIn 0.5s ease-in; -} - -.list-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 20px; - padding-bottom: 12px; - border-bottom: 2px solid rgba(139, 195, 74, 0.2); -} - -.list-header h2 { - font-size: 20px; - font-weight: 600; - color: #2e7d32; - margin: 0; -} - -.update-time { - font-size: 12px; - color: #666; - background: rgba(139, 195, 74, 0.1); - padding: 4px 8px; - border-radius: 12px; -} - -.topics-container { - display: grid; - gap: 12px; -} - -/* 热搜项目 */ -.topic-item { - background: white; - border-radius: 12px; - padding: 16px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); - border: 1px solid rgba(139, 195, 74, 0.1); - transition: all 0.3s ease; - cursor: pointer; - position: relative; - overflow: hidden; -} - -.topic-item:hover { - transform: translateY(-2px); - box-shadow: 0 4px 16px rgba(139, 195, 74, 0.15); - border-color: rgba(139, 195, 74, 0.3); -} - -.topic-item::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 4px; - height: 100%; - background: linear-gradient(135deg, #a5d6a7, #81c784); - opacity: 0; - transition: opacity 0.3s ease; -} - -.topic-item:hover::before { - opacity: 1; -} - -.topic-header { - display: flex; - align-items: center; - gap: 12px; - margin-bottom: 8px; -} - -.rank-badge { - display: flex; - align-items: center; - justify-content: center; - width: 24px; - height: 24px; - border-radius: 50%; - font-size: 12px; - font-weight: 600; - color: white; - flex-shrink: 0; -} - -.rank-badge.top-3 { - background: linear-gradient(135deg, #ffb74d, #ff9800); - box-shadow: 0 2px 6px rgba(255, 152, 0, 0.3); -} - -.rank-badge.normal { - background: linear-gradient(135deg, #a5d6a7, #81c784); - box-shadow: 0 2px 6px rgba(139, 195, 74, 0.3); -} - -.topic-title { - font-size: 16px; - font-weight: 500; - color: #333; - line-height: 1.4; - flex: 1; - word-break: break-word; -} - -.topic-footer { - display: flex; - justify-content: space-between; - align-items: center; - margin-top: 12px; - padding-top: 8px; - border-top: 1px solid rgba(139, 195, 74, 0.1); -} - -.topic-score { - font-size: 14px; - font-weight: 600; - color: #8bc34a; -} - -.topic-actions { - display: flex; - gap: 8px; -} - -.action-btn { - padding: 4px 8px; - background: rgba(139, 195, 74, 0.1); - color: #8bc34a; - border: none; - border-radius: 6px; - cursor: pointer; - font-size: 12px; - transition: all 0.3s ease; -} - -.action-btn:hover { - background: rgba(139, 195, 74, 0.2); -} - -/* 底部样式 */ -.footer { - margin-top: 40px; - padding: 20px 0; - border-top: 1px solid rgba(139, 195, 74, 0.2); - text-align: center; -} - -.footer-content p { - margin: 4px 0; - font-size: 12px; - color: #666; -} - -.data-source { - font-weight: 500; -} - -/* 提示消息 */ -.toast { - position: fixed; - top: 20px; - left: 50%; - transform: translateX(-50%); - background: rgba(46, 125, 50, 0.9); - color: white; - padding: 12px 20px; - border-radius: 20px; - font-size: 14px; - z-index: 1000; - opacity: 0; - visibility: hidden; - transition: all 0.3s ease; - backdrop-filter: blur(10px); -} - -.toast.show { - opacity: 1; - visibility: visible; -} - -/* 动画效果 */ -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -@keyframes fadeIn { - 0% { - opacity: 0; - transform: translateY(20px); - } - 100% { - opacity: 1; - transform: translateY(0); - } -} - -/* 平板端适配 */ -@media (min-width: 768px) and (max-width: 1024px) { - .container { - padding: 0 24px; - } - - .topics-container { - grid-template-columns: repeat(2, 1fr); - gap: 16px; - } - - .topic-item { - padding: 18px; - } - - .logo h1 { - font-size: 26px; - } - - .topic-title { - font-size: 17px; - } -} - -/* 桌面端适配 */ -@media (min-width: 1025px) { - .container { - padding: 0 32px; - } - - .header { - padding: 24px 0; - } - - .topics-container { - grid-template-columns: repeat(3, 1fr); - gap: 20px; - } - - .topic-item { - padding: 20px; - } - - .logo h1 { - font-size: 28px; - } - - .topic-title { - font-size: 18px; - } - - .refresh-btn { - padding: 12px 20px; - font-size: 15px; - } -} - -/* 移动端优化 */ -@media (max-width: 767px) { - .container { - padding: 0 12px; - } - - .header { - padding: 16px 0; - margin-bottom: 16px; - } - - .logo h1 { - font-size: 20px; - } - - .logo i { - font-size: 24px; - } - - .refresh-btn { - padding: 8px 12px; - font-size: 13px; - } - - .refresh-btn span { - display: none; - } - - .topics-container { - grid-template-columns: 1fr; - gap: 10px; - } - - .topic-item { - padding: 14px; - } - - .topic-title { - font-size: 15px; - line-height: 1.3; - } - - .rank-badge { - width: 22px; - height: 22px; - font-size: 11px; - } - - .topic-score { - font-size: 13px; - } - - .action-btn { - padding: 3px 6px; - font-size: 11px; - } - - .list-header h2 { - font-size: 18px; - } - - .update-time { - font-size: 11px; - } - - .footer { - margin-top: 30px; - padding: 16px 0; - } - - .toast { - left: 12px; - right: 12px; - transform: none; - border-radius: 12px; - } -} - -/* 超小屏幕优化 */ -@media (max-width: 360px) { - .container { - padding: 0 8px; - } - - .topic-item { - padding: 12px; - } - - .topic-title { - font-size: 14px; - } - - .logo h1 { - font-size: 18px; - } -} - -/* 滚动条样式 */ -::-webkit-scrollbar { - width: 6px; -} - -::-webkit-scrollbar-track { - background: rgba(139, 195, 74, 0.1); - border-radius: 3px; -} - -::-webkit-scrollbar-thumb { - background: rgba(139, 195, 74, 0.5); - border-radius: 3px; -} - -::-webkit-scrollbar-thumb:hover { - background: rgba(139, 195, 74, 0.7); +/* 全局样式重置 */ +* { + 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: #333; + min-height: 100vh; + overflow-x: hidden; +} + +/* 容器布局 */ +.container { + max-width: 1200px; + margin: 0 auto; + min-height: 100vh; + display: flex; + flex-direction: column; + padding: 0 16px; +} + +/* 头部样式 */ +.header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20px 0; + border-bottom: 1px solid rgba(139, 195, 74, 0.2); + margin-bottom: 20px; +} + +.logo { + display: flex; + align-items: center; + gap: 12px; +} + +.logo i { + font-size: 28px; + color: #8bc34a; + background: linear-gradient(135deg, #a5d6a7, #81c784); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.logo h1 { + font-size: 24px; + font-weight: 600; + color: #2e7d32; + margin: 0; +} + +.refresh-btn { + display: flex; + align-items: center; + gap: 8px; + padding: 10px 16px; + background: linear-gradient(135deg, #a5d6a7, #81c784); + color: white; + border: none; + border-radius: 20px; + cursor: pointer; + font-size: 14px; + font-weight: 500; + transition: all 0.3s ease; + box-shadow: 0 2px 8px rgba(139, 195, 74, 0.3); +} + +.refresh-btn:hover { + background: linear-gradient(135deg, #81c784, #66bb6a); + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(139, 195, 74, 0.4); +} + +.refresh-btn:active { + transform: translateY(0); +} + +.refresh-btn i { + font-size: 14px; +} + +.refresh-btn.loading i { + animation: spin 1s linear infinite; +} + +/* 主内容区域 */ +.main-content { + flex: 1; + position: relative; +} + +/* 加载状态 */ +.loading { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 60px 20px; + text-align: center; +} + +.loading-spinner { + width: 40px; + height: 40px; + border: 3px solid rgba(139, 195, 74, 0.2); + border-top: 3px solid #8bc34a; + border-radius: 50%; + animation: spin 1s linear infinite; + margin-bottom: 16px; +} + +.loading p { + color: #666; + font-size: 16px; +} + +/* 错误状态 */ +.error { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 60px 20px; + text-align: center; +} + +.error-icon i { + font-size: 48px; + color: #ff7043; + margin-bottom: 16px; +} + +.error-message { + color: #666; + font-size: 16px; + margin-bottom: 20px; +} + +.retry-btn { + padding: 10px 20px; + background: linear-gradient(135deg, #a5d6a7, #81c784); + color: white; + border: none; + border-radius: 20px; + cursor: pointer; + font-size: 14px; + transition: all 0.3s ease; +} + +.retry-btn:hover { + background: linear-gradient(135deg, #81c784, #66bb6a); +} + +/* 热搜列表 */ +.hot-list { + animation: fadeIn 0.5s ease-in; +} + +.list-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; + padding-bottom: 12px; + border-bottom: 2px solid rgba(139, 195, 74, 0.2); +} + +.list-header h2 { + font-size: 20px; + font-weight: 600; + color: #2e7d32; + margin: 0; +} + +.update-time { + font-size: 12px; + color: #666; + background: rgba(139, 195, 74, 0.1); + padding: 4px 8px; + border-radius: 12px; +} + +.topics-container { + display: grid; + gap: 12px; +} + +/* 热搜项目 */ +.topic-item { + background: white; + border-radius: 12px; + padding: 16px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); + border: 1px solid rgba(139, 195, 74, 0.1); + transition: all 0.3s ease; + cursor: pointer; + position: relative; + overflow: hidden; +} + +.topic-item:hover { + transform: translateY(-2px); + box-shadow: 0 4px 16px rgba(139, 195, 74, 0.15); + border-color: rgba(139, 195, 74, 0.3); +} + +.topic-item::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 4px; + height: 100%; + background: linear-gradient(135deg, #a5d6a7, #81c784); + opacity: 0; + transition: opacity 0.3s ease; +} + +.topic-item:hover::before { + opacity: 1; +} + +.topic-header { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 8px; +} + +.rank-badge { + display: flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + border-radius: 50%; + font-size: 12px; + font-weight: 600; + color: white; + flex-shrink: 0; +} + +.rank-badge.top-3 { + background: linear-gradient(135deg, #ffb74d, #ff9800); + box-shadow: 0 2px 6px rgba(255, 152, 0, 0.3); +} + +.rank-badge.normal { + background: linear-gradient(135deg, #a5d6a7, #81c784); + box-shadow: 0 2px 6px rgba(139, 195, 74, 0.3); +} + +.topic-title { + font-size: 16px; + font-weight: 500; + color: #333; + line-height: 1.4; + flex: 1; + word-break: break-word; +} + +.topic-footer { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: 12px; + padding-top: 8px; + border-top: 1px solid rgba(139, 195, 74, 0.1); +} + +.topic-score { + font-size: 14px; + font-weight: 600; + color: #8bc34a; +} + +.topic-actions { + display: flex; + gap: 8px; +} + +.action-btn { + padding: 4px 8px; + background: rgba(139, 195, 74, 0.1); + color: #8bc34a; + border: none; + border-radius: 6px; + cursor: pointer; + font-size: 12px; + transition: all 0.3s ease; +} + +.action-btn:hover { + background: rgba(139, 195, 74, 0.2); +} + +/* 底部样式 */ +.footer { + margin-top: 40px; + padding: 20px 0; + border-top: 1px solid rgba(139, 195, 74, 0.2); + text-align: center; +} + +.footer-content p { + margin: 4px 0; + font-size: 12px; + color: #666; +} + +.data-source { + font-weight: 500; +} + +/* 提示消息 */ +.toast { + position: fixed; + top: 20px; + left: 50%; + transform: translateX(-50%); + background: rgba(46, 125, 50, 0.9); + color: white; + padding: 12px 20px; + border-radius: 20px; + font-size: 14px; + z-index: 1000; + opacity: 0; + visibility: hidden; + transition: all 0.3s ease; + backdrop-filter: blur(10px); +} + +.toast.show { + opacity: 1; + visibility: visible; +} + +/* 动画效果 */ +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +@keyframes fadeIn { + 0% { + opacity: 0; + transform: translateY(20px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + +/* 平板端适配 */ +@media (min-width: 768px) and (max-width: 1024px) { + .container { + padding: 0 24px; + } + + .topics-container { + grid-template-columns: repeat(2, 1fr); + gap: 16px; + } + + .topic-item { + padding: 18px; + } + + .logo h1 { + font-size: 26px; + } + + .topic-title { + font-size: 17px; + } +} + +/* 桌面端适配 */ +@media (min-width: 1025px) { + .container { + padding: 0 32px; + } + + .header { + padding: 24px 0; + } + + .topics-container { + grid-template-columns: repeat(3, 1fr); + gap: 20px; + } + + .topic-item { + padding: 20px; + } + + .logo h1 { + font-size: 28px; + } + + .topic-title { + font-size: 18px; + } + + .refresh-btn { + padding: 12px 20px; + font-size: 15px; + } +} + +/* 移动端优化 */ +@media (max-width: 767px) { + .container { + padding: 0 12px; + } + + .header { + padding: 16px 0; + margin-bottom: 16px; + } + + .logo h1 { + font-size: 20px; + } + + .logo i { + font-size: 24px; + } + + .refresh-btn { + padding: 8px 12px; + font-size: 13px; + } + + .refresh-btn span { + display: none; + } + + .topics-container { + grid-template-columns: 1fr; + gap: 10px; + } + + .topic-item { + padding: 14px; + } + + .topic-title { + font-size: 15px; + line-height: 1.3; + } + + .rank-badge { + width: 22px; + height: 22px; + font-size: 11px; + } + + .topic-score { + font-size: 13px; + } + + .action-btn { + padding: 3px 6px; + font-size: 11px; + } + + .list-header h2 { + font-size: 18px; + } + + .update-time { + font-size: 11px; + } + + .footer { + margin-top: 30px; + padding: 16px 0; + } + + .toast { + left: 12px; + right: 12px; + transform: none; + border-radius: 12px; + } +} + +/* 超小屏幕优化 */ +@media (max-width: 360px) { + .container { + padding: 0 8px; + } + + .topic-item { + padding: 12px; + } + + .topic-title { + font-size: 14px; + } + + .logo h1 { + font-size: 18px; + } +} + +/* 滚动条样式 */ +::-webkit-scrollbar { + width: 6px; +} + +::-webkit-scrollbar-track { + background: rgba(139, 195, 74, 0.1); + border-radius: 3px; +} + +::-webkit-scrollbar-thumb { + background: rgba(139, 195, 74, 0.5); + border-radius: 3px; +} + +::-webkit-scrollbar-thumb:hover { + background: rgba(139, 195, 74, 0.7); } \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/ui.js b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/ui.js index bb151216..9c8d15c3 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/ui.js +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/ui.js @@ -1,410 +1,410 @@ -/** - * UI管理模块 - * 负责页面渲染、交互和状态管理 - */ -class UIManager { - constructor() { - this.elements = {}; - this.isLoading = false; - this.currentData = null; - this.touchStartY = 0; - this.pullThreshold = 80; - this.isPulling = false; - - this.initElements(); - this.bindEvents(); - } - - /** - * 初始化DOM元素引用 - */ - initElements() { - this.elements = { - loading: document.getElementById('loading'), - error: document.getElementById('error'), - hotList: document.getElementById('hotList'), - topicsContainer: document.getElementById('topicsContainer'), - refreshBtn: document.getElementById('refreshBtn'), - updateTime: document.getElementById('updateTime'), - toast: document.getElementById('toast') - }; - - // 检查必需元素 - const missingElements = Object.entries(this.elements) - .filter(([key, element]) => !element) - .map(([key]) => key); - - if (missingElements.length > 0) { - console.error('[UI] 缺少必需的DOM元素:', missingElements); - } - } - - /** - * 绑定事件监听器 - */ - bindEvents() { - // 刷新按钮点击事件 - if (this.elements.refreshBtn) { - this.elements.refreshBtn.addEventListener('click', () => { - this.handleRefresh(); - }); - } - - // 键盘快捷键 - document.addEventListener('keydown', (e) => { - if (e.key === 'F5' || (e.ctrlKey && e.key === 'r')) { - e.preventDefault(); - this.handleRefresh(); - } - }); - - // 移动端下拉刷新 - this.initPullToRefresh(); - - // 页面可见性变化 - document.addEventListener('visibilitychange', () => { - if (!document.hidden && this.currentData) { - // 页面重新可见时检查数据是否过期(5分钟) - const lastUpdate = new Date(this.currentData.updateTime); - const now = new Date(); - if (now - lastUpdate > 5 * 60 * 1000) { - this.handleRefresh(); - } - } - }); - } - - /** - * 初始化下拉刷新功能 - */ - initPullToRefresh() { - let startY = 0; - let currentY = 0; - let pullDistance = 0; - - document.addEventListener('touchstart', (e) => { - if (window.scrollY === 0) { - startY = e.touches[0].clientY; - this.isPulling = true; - } - }, { passive: true }); - - document.addEventListener('touchmove', (e) => { - if (!this.isPulling || this.isLoading) return; - - currentY = e.touches[0].clientY; - pullDistance = currentY - startY; - - if (pullDistance > 0 && window.scrollY === 0) { - e.preventDefault(); - - // 添加视觉反馈 - const progress = Math.min(pullDistance / this.pullThreshold, 1); - document.body.style.transform = `translateY(${pullDistance * 0.3}px)`; - document.body.style.opacity = 1 - progress * 0.1; - } - }, { passive: false }); - - document.addEventListener('touchend', () => { - if (this.isPulling) { - document.body.style.transform = ''; - document.body.style.opacity = ''; - - if (pullDistance > this.pullThreshold && !this.isLoading) { - this.handleRefresh(); - } - - this.isPulling = false; - pullDistance = 0; - } - }); - } - - /** - * 处理刷新操作 - */ - async handleRefresh() { - if (this.isLoading) return; - - this.showToast('正在刷新数据...'); - - // 触发自定义刷新事件 - const refreshEvent = new CustomEvent('refreshData'); - document.dispatchEvent(refreshEvent); - } - - /** - * 显示加载状态 - */ - showLoading() { - this.isLoading = true; - this.hideAllStates(); - if (this.elements.loading) { - this.elements.loading.style.display = 'flex'; - } - - // 刷新按钮加载状态 - if (this.elements.refreshBtn) { - this.elements.refreshBtn.classList.add('loading'); - this.elements.refreshBtn.disabled = true; - } - } - - /** - * 显示错误状态 - * @param {string} message - 错误消息 - */ - showError(message = '加载失败,请稍后重试') { - this.isLoading = false; - this.hideAllStates(); - - if (this.elements.error) { - this.elements.error.style.display = 'flex'; - const errorMessage = this.elements.error.querySelector('.error-message'); - if (errorMessage) { - errorMessage.textContent = message; - } - } - - this.resetRefreshButton(); - } - - /** - * 显示热搜列表 - * @param {Object} data - 热搜数据 - */ - showHotList(data) { - this.isLoading = false; - this.currentData = data; - this.hideAllStates(); - - if (this.elements.hotList) { - this.elements.hotList.style.display = 'block'; - } - - this.renderTopics(data.data); - this.updateTime(data.updateTime); - this.resetRefreshButton(); - - this.showToast(`已更新 ${data.total} 条热搜数据`); - } - - /** - * 隐藏所有状态 - */ - hideAllStates() { - ['loading', 'error', 'hotList'].forEach(state => { - if (this.elements[state]) { - this.elements[state].style.display = 'none'; - } - }); - } - - /** - * 重置刷新按钮状态 - */ - resetRefreshButton() { - if (this.elements.refreshBtn) { - this.elements.refreshBtn.classList.remove('loading'); - this.elements.refreshBtn.disabled = false; - } - } - - /** - * 渲染热搜话题列表 - * @param {Array} topics - 话题数组 - */ - renderTopics(topics) { - if (!this.elements.topicsContainer) return; - - this.elements.topicsContainer.innerHTML = ''; - - topics.forEach((topic, index) => { - const topicElement = this.createTopicElement(topic, index); - this.elements.topicsContainer.appendChild(topicElement); - }); - } - - /** - * 创建单个话题元素 - * @param {Object} topic - 话题数据 - * @param {number} index - 索引 - * @returns {HTMLElement} 话题元素 - */ - createTopicElement(topic, index) { - const item = document.createElement('div'); - item.className = 'topic-item'; - item.style.animationDelay = `${index * 0.1}s`; - - item.innerHTML = ` -
      -
      - ${topic.rank} -
      -
      ${this.escapeHtml(topic.title)}
      -
      - - `; - - this.bindTopicEvents(item, topic); - return item; - } - - /** - * 绑定话题元素事件 - * @param {HTMLElement} element - 话题元素 - * @param {Object} topic - 话题数据 - */ - bindTopicEvents(element, topic) { - // 点击整个项目跳转搜索 - element.addEventListener('click', (e) => { - if (!e.target.closest('.action-btn')) { - window.open(topic.searchUrl, '_blank'); - } - }); - - // 复制按钮 - const copyBtn = element.querySelector('.copy-btn'); - if (copyBtn) { - copyBtn.addEventListener('click', (e) => { - e.stopPropagation(); - this.copyToClipboard(topic.title); - }); - } - - // 搜索按钮 - const searchBtn = element.querySelector('.search-btn'); - if (searchBtn) { - searchBtn.addEventListener('click', (e) => { - e.stopPropagation(); - window.open(topic.searchUrl, '_blank'); - }); - } - - // 长按显示详情 - let longPressTimer; - element.addEventListener('touchstart', () => { - longPressTimer = setTimeout(() => { - this.showTopicDetails(topic); - }, 800); - }); - - element.addEventListener('touchend', () => { - clearTimeout(longPressTimer); - }); - - element.addEventListener('touchmove', () => { - clearTimeout(longPressTimer); - }); - } - - /** - * 显示话题详情 - * @param {Object} topic - 话题数据 - */ - showTopicDetails(topic) { - const details = ` - 标题: ${topic.title} - 排名: 第${topic.rank}名 - 热度: ${topic.scoreDesc} - 原始分数: ${topic.score.toLocaleString()} - `; - - this.showToast(details, 3000); - } - - /** - * 复制文本到剪贴板 - * @param {string} text - 要复制的文本 - */ - async 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.opacity = '0'; - document.body.appendChild(textArea); - textArea.select(); - document.execCommand('copy'); - document.body.removeChild(textArea); - } - - this.showToast('已复制到剪贴板'); - } catch (error) { - console.error('[UI] 复制失败:', error); - this.showToast('复制失败'); - } - } - - /** - * 更新时间显示 - * @param {string} time - 更新时间 - */ - updateTime(time) { - if (this.elements.updateTime) { - this.elements.updateTime.textContent = `更新时间: ${time}`; - } - } - - /** - * 显示提示消息 - * @param {string} message - 消息内容 - * @param {number} duration - 显示时长(毫秒) - */ - showToast(message, duration = 2000) { - if (!this.elements.toast) return; - - this.elements.toast.textContent = message; - this.elements.toast.classList.add('show'); - - setTimeout(() => { - this.elements.toast.classList.remove('show'); - }, duration); - } - - /** - * HTML转义 - * @param {string} text - 原始文本 - * @returns {string} 转义后的文本 - */ - escapeHtml(text) { - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; - } - - /** - * 获取当前数据 - * @returns {Object|null} 当前数据 - */ - getCurrentData() { - return this.currentData; - } - - /** - * 清除当前数据 - */ - clearData() { - this.currentData = null; - if (this.elements.topicsContainer) { - this.elements.topicsContainer.innerHTML = ''; - } - } -} - -// 导出UI管理器 +/** + * UI管理模块 + * 负责页面渲染、交互和状态管理 + */ +class UIManager { + constructor() { + this.elements = {}; + this.isLoading = false; + this.currentData = null; + this.touchStartY = 0; + this.pullThreshold = 80; + this.isPulling = false; + + this.initElements(); + this.bindEvents(); + } + + /** + * 初始化DOM元素引用 + */ + initElements() { + this.elements = { + loading: document.getElementById('loading'), + error: document.getElementById('error'), + hotList: document.getElementById('hotList'), + topicsContainer: document.getElementById('topicsContainer'), + refreshBtn: document.getElementById('refreshBtn'), + updateTime: document.getElementById('updateTime'), + toast: document.getElementById('toast') + }; + + // 检查必需元素 + const missingElements = Object.entries(this.elements) + .filter(([key, element]) => !element) + .map(([key]) => key); + + if (missingElements.length > 0) { + console.error('[UI] 缺少必需的DOM元素:', missingElements); + } + } + + /** + * 绑定事件监听器 + */ + bindEvents() { + // 刷新按钮点击事件 + if (this.elements.refreshBtn) { + this.elements.refreshBtn.addEventListener('click', () => { + this.handleRefresh(); + }); + } + + // 键盘快捷键 + document.addEventListener('keydown', (e) => { + if (e.key === 'F5' || (e.ctrlKey && e.key === 'r')) { + e.preventDefault(); + this.handleRefresh(); + } + }); + + // 移动端下拉刷新 + this.initPullToRefresh(); + + // 页面可见性变化 + document.addEventListener('visibilitychange', () => { + if (!document.hidden && this.currentData) { + // 页面重新可见时检查数据是否过期(5分钟) + const lastUpdate = new Date(this.currentData.updateTime); + const now = new Date(); + if (now - lastUpdate > 5 * 60 * 1000) { + this.handleRefresh(); + } + } + }); + } + + /** + * 初始化下拉刷新功能 + */ + initPullToRefresh() { + let startY = 0; + let currentY = 0; + let pullDistance = 0; + + document.addEventListener('touchstart', (e) => { + if (window.scrollY === 0) { + startY = e.touches[0].clientY; + this.isPulling = true; + } + }, { passive: true }); + + document.addEventListener('touchmove', (e) => { + if (!this.isPulling || this.isLoading) return; + + currentY = e.touches[0].clientY; + pullDistance = currentY - startY; + + if (pullDistance > 0 && window.scrollY === 0) { + e.preventDefault(); + + // 添加视觉反馈 + const progress = Math.min(pullDistance / this.pullThreshold, 1); + document.body.style.transform = `translateY(${pullDistance * 0.3}px)`; + document.body.style.opacity = 1 - progress * 0.1; + } + }, { passive: false }); + + document.addEventListener('touchend', () => { + if (this.isPulling) { + document.body.style.transform = ''; + document.body.style.opacity = ''; + + if (pullDistance > this.pullThreshold && !this.isLoading) { + this.handleRefresh(); + } + + this.isPulling = false; + pullDistance = 0; + } + }); + } + + /** + * 处理刷新操作 + */ + async handleRefresh() { + if (this.isLoading) return; + + this.showToast('正在刷新数据...'); + + // 触发自定义刷新事件 + const refreshEvent = new CustomEvent('refreshData'); + document.dispatchEvent(refreshEvent); + } + + /** + * 显示加载状态 + */ + showLoading() { + this.isLoading = true; + this.hideAllStates(); + if (this.elements.loading) { + this.elements.loading.style.display = 'flex'; + } + + // 刷新按钮加载状态 + if (this.elements.refreshBtn) { + this.elements.refreshBtn.classList.add('loading'); + this.elements.refreshBtn.disabled = true; + } + } + + /** + * 显示错误状态 + * @param {string} message - 错误消息 + */ + showError(message = '加载失败,请稍后重试') { + this.isLoading = false; + this.hideAllStates(); + + if (this.elements.error) { + this.elements.error.style.display = 'flex'; + const errorMessage = this.elements.error.querySelector('.error-message'); + if (errorMessage) { + errorMessage.textContent = message; + } + } + + this.resetRefreshButton(); + } + + /** + * 显示热搜列表 + * @param {Object} data - 热搜数据 + */ + showHotList(data) { + this.isLoading = false; + this.currentData = data; + this.hideAllStates(); + + if (this.elements.hotList) { + this.elements.hotList.style.display = 'block'; + } + + this.renderTopics(data.data); + this.updateTime(data.updateTime); + this.resetRefreshButton(); + + this.showToast(`已更新 ${data.total} 条热搜数据`); + } + + /** + * 隐藏所有状态 + */ + hideAllStates() { + ['loading', 'error', 'hotList'].forEach(state => { + if (this.elements[state]) { + this.elements[state].style.display = 'none'; + } + }); + } + + /** + * 重置刷新按钮状态 + */ + resetRefreshButton() { + if (this.elements.refreshBtn) { + this.elements.refreshBtn.classList.remove('loading'); + this.elements.refreshBtn.disabled = false; + } + } + + /** + * 渲染热搜话题列表 + * @param {Array} topics - 话题数组 + */ + renderTopics(topics) { + if (!this.elements.topicsContainer) return; + + this.elements.topicsContainer.innerHTML = ''; + + topics.forEach((topic, index) => { + const topicElement = this.createTopicElement(topic, index); + this.elements.topicsContainer.appendChild(topicElement); + }); + } + + /** + * 创建单个话题元素 + * @param {Object} topic - 话题数据 + * @param {number} index - 索引 + * @returns {HTMLElement} 话题元素 + */ + createTopicElement(topic, index) { + const item = document.createElement('div'); + item.className = 'topic-item'; + item.style.animationDelay = `${index * 0.1}s`; + + item.innerHTML = ` +
      +
      + ${topic.rank} +
      +
      ${this.escapeHtml(topic.title)}
      +
      + + `; + + this.bindTopicEvents(item, topic); + return item; + } + + /** + * 绑定话题元素事件 + * @param {HTMLElement} element - 话题元素 + * @param {Object} topic - 话题数据 + */ + bindTopicEvents(element, topic) { + // 点击整个项目跳转搜索 + element.addEventListener('click', (e) => { + if (!e.target.closest('.action-btn')) { + window.open(topic.searchUrl, '_blank'); + } + }); + + // 复制按钮 + const copyBtn = element.querySelector('.copy-btn'); + if (copyBtn) { + copyBtn.addEventListener('click', (e) => { + e.stopPropagation(); + this.copyToClipboard(topic.title); + }); + } + + // 搜索按钮 + const searchBtn = element.querySelector('.search-btn'); + if (searchBtn) { + searchBtn.addEventListener('click', (e) => { + e.stopPropagation(); + window.open(topic.searchUrl, '_blank'); + }); + } + + // 长按显示详情 + let longPressTimer; + element.addEventListener('touchstart', () => { + longPressTimer = setTimeout(() => { + this.showTopicDetails(topic); + }, 800); + }); + + element.addEventListener('touchend', () => { + clearTimeout(longPressTimer); + }); + + element.addEventListener('touchmove', () => { + clearTimeout(longPressTimer); + }); + } + + /** + * 显示话题详情 + * @param {Object} topic - 话题数据 + */ + showTopicDetails(topic) { + const details = ` + 标题: ${topic.title} + 排名: 第${topic.rank}名 + 热度: ${topic.scoreDesc} + 原始分数: ${topic.score.toLocaleString()} + `; + + this.showToast(details, 3000); + } + + /** + * 复制文本到剪贴板 + * @param {string} text - 要复制的文本 + */ + async 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.opacity = '0'; + document.body.appendChild(textArea); + textArea.select(); + document.execCommand('copy'); + document.body.removeChild(textArea); + } + + this.showToast('已复制到剪贴板'); + } catch (error) { + console.error('[UI] 复制失败:', error); + this.showToast('复制失败'); + } + } + + /** + * 更新时间显示 + * @param {string} time - 更新时间 + */ + updateTime(time) { + if (this.elements.updateTime) { + this.elements.updateTime.textContent = `更新时间: ${time}`; + } + } + + /** + * 显示提示消息 + * @param {string} message - 消息内容 + * @param {number} duration - 显示时长(毫秒) + */ + showToast(message, duration = 2000) { + if (!this.elements.toast) return; + + this.elements.toast.textContent = message; + this.elements.toast.classList.add('show'); + + setTimeout(() => { + this.elements.toast.classList.remove('show'); + }, duration); + } + + /** + * HTML转义 + * @param {string} text - 原始文本 + * @returns {string} 转义后的文本 + */ + escapeHtml(text) { + const div = document.createElement('div'); + div.textContent = text; + return div.innerHTML; + } + + /** + * 获取当前数据 + * @returns {Object|null} 当前数据 + */ + getCurrentData() { + return this.currentData; + } + + /** + * 清除当前数据 + */ + clearData() { + this.currentData = null; + if (this.elements.topicsContainer) { + this.elements.topicsContainer.innerHTML = ''; + } + } +} + +// 导出UI管理器 window.UIManager = UIManager; \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/返回接口.json index 441f0095..718f5881 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/返回接口.json +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/懂车帝热搜/返回接口.json @@ -1,66 +1,66 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "rank": 1, - "title": "吉利银河星耀6将于9月5日发布", - "score": 846099, - "score_desc": "84.6w" - }, - { - "rank": 2, - "title": "销售称Model Y L日均订单近万辆", - "score": 602350, - "score_desc": "60.2w" - }, - { - "rank": 3, - "title": "极氪9X将于9月底上市", - "score": 241114, - "score_desc": "24.1w" - }, - { - "rank": 4, - "title": "比亚迪“全家福”亮相齐鲁秋季车展", - "score": 239586, - "score_desc": "24.0w" - }, - { - "rank": 5, - "title": "新一代宝马X5内饰曝光", - "score": 209847, - "score_desc": "21.0w" - }, - { - "rank": 6, - "title": "LOL前职业选手PDD喜提理想MEGA", - "score": 204628, - "score_desc": "20.5w" - }, - { - "rank": 7, - "title": "零跑Lafa5伪装车曝光", - "score": 143127, - "score_desc": "14.3w" - }, - { - "rank": 8, - "title": "方程豹钛7将于9月9日上市", - "score": 135759, - "score_desc": "13.6w" - }, - { - "rank": 9, - "title": "零跑9月购车政策", - "score": 94419, - "score_desc": "9.4w" - }, - { - "rank": 10, - "title": "捷途X70L将于9月10日预售", - "score": 74292, - "score_desc": "7.4w" - } - ] +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": [ + { + "rank": 1, + "title": "吉利银河星耀6将于9月5日发布", + "score": 846099, + "score_desc": "84.6w" + }, + { + "rank": 2, + "title": "销售称Model Y L日均订单近万辆", + "score": 602350, + "score_desc": "60.2w" + }, + { + "rank": 3, + "title": "极氪9X将于9月底上市", + "score": 241114, + "score_desc": "24.1w" + }, + { + "rank": 4, + "title": "比亚迪“全家福”亮相齐鲁秋季车展", + "score": 239586, + "score_desc": "24.0w" + }, + { + "rank": 5, + "title": "新一代宝马X5内饰曝光", + "score": 209847, + "score_desc": "21.0w" + }, + { + "rank": 6, + "title": "LOL前职业选手PDD喜提理想MEGA", + "score": 204628, + "score_desc": "20.5w" + }, + { + "rank": 7, + "title": "零跑Lafa5伪装车曝光", + "score": 143127, + "score_desc": "14.3w" + }, + { + "rank": 8, + "title": "方程豹钛7将于9月9日上市", + "score": 135759, + "score_desc": "13.6w" + }, + { + "rank": 9, + "title": "零跑9月购车政策", + "score": 94419, + "score_desc": "9.4w" + }, + { + "rank": 10, + "title": "捷途X70L将于9月10日预售", + "score": 74292, + "score_desc": "7.4w" + } + ] } \ 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 bfd3e264..84545b14 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/css/background.css +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/css/background.css @@ -1,48 +1,48 @@ -/* 背景相关样式 */ -body { - background: linear-gradient(135deg, #f1f8e9 0%, #dcedc8 25%, #c8e6c9 50%, #a8e6cf 75%, #81c784 100%); - background-attachment: fixed; - min-height: 100vh; - position: relative; -} - -/* 简化的背景装饰元素 */ -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.08) 0%, transparent 40%), - radial-gradient(circle at 80% 20%, rgba(129, 199, 132, 0.06) 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 30% 70%, rgba(76, 175, 80, 0.04) 1px, transparent 1px), - radial-gradient(circle at 70% 30%, rgba(129, 199, 132, 0.03) 1px, transparent 1px); - background-size: 120px 120px, 180px 180px; - animation: float 25s ease-in-out infinite alternate; - pointer-events: none; - z-index: -1; -} - -@keyframes float { - 0% { - transform: translateY(0px) rotate(0deg); - } - 100% { - transform: translateY(-10px) rotate(1deg); - } -} +/* 背景相关样式 */ +body { + background: linear-gradient(135deg, #f1f8e9 0%, #dcedc8 25%, #c8e6c9 50%, #a8e6cf 75%, #81c784 100%); + background-attachment: fixed; + min-height: 100vh; + position: relative; +} + +/* 简化的背景装饰元素 */ +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.08) 0%, transparent 40%), + radial-gradient(circle at 80% 20%, rgba(129, 199, 132, 0.06) 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 30% 70%, rgba(76, 175, 80, 0.04) 1px, transparent 1px), + radial-gradient(circle at 70% 30%, rgba(129, 199, 132, 0.03) 1px, transparent 1px); + background-size: 120px 120px, 180px 180px; + animation: float 25s ease-in-out infinite alternate; + pointer-events: none; + z-index: -1; +} + +@keyframes float { + 0% { + transform: translateY(0px) rotate(0deg); + } + 100% { + transform: translateY(-10px) rotate(1deg); + } +} diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/css/style.css b/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/css/style.css index 482bc9eb..d74a625f 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/css/style.css +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/css/style.css @@ -1,661 +1,661 @@ -/* 背景样式 */ -.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(76, 175, 80, 0.15) 0%, - rgba(129, 199, 132, 0.1) 25%, - rgba(165, 214, 167, 0.08) 50%, - rgba(200, 230, 201, 0.06) 75%, - rgba(232, 245, 233, 0.05) 100% - ); - animation: gradient-flow 30s ease-in-out infinite; - border-radius: 40% 60% 60% 40% / 40% 40% 60% 60%; -} - -.modern-gradient::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: radial-gradient( - circle at 30% 70%, - rgba(76, 175, 80, 0.1) 0%, - transparent 40% - ), radial-gradient( - circle at 70% 30%, - rgba(129, 199, 132, 0.08) 0%, - transparent 40% - ); - animation: pulse-effect 25s ease-in-out infinite alternate; - border-radius: 40% 60% 60% 40% / 40% 40% 60% 60%; -} - -@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.9); - border-radius: 16px; - box-shadow: 0 8px 24px rgba(76, 175, 80, 0.08); - backdrop-filter: blur(12px); - border: 1px solid rgba(76, 175, 80, 0.1); -} - -header { - text-align: center; - margin-bottom: 28px; - padding-bottom: 20px; - border-bottom: 1px solid rgba(76, 175, 80, 0.15); -} - -header h1 { - background: linear-gradient(135deg, #2e7d32, #4caf50, #66bb6a); - -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: #4caf50; - font-size: 0.9rem; - background-color: rgba(76, 175, 80, 0.08); - padding: 8px 16px; - border-radius: 24px; - display: inline-block; - box-shadow: 0 2px 8px rgba(76, 175, 80, 0.1); - border: 1px solid rgba(76, 175, 80, 0.15); -} - -.refresh-btn { - background: linear-gradient(135deg, #4caf50, #66bb6a); - color: white; - border: none; - padding: 10px 20px; - border-radius: 24px; - font-size: 0.9rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - margin-top: 12px; - box-shadow: 0 4px 12px rgba(76, 175, 80, 0.25); - display: inline-flex; - align-items: center; - gap: 6px; -} - -.refresh-btn:hover { - background: linear-gradient(135deg, #388e3c, #4caf50); - transform: translateY(-2px); - box-shadow: 0 6px 16px rgba(76, 175, 80, 0.35); -} - -.refresh-btn:active { - transform: translateY(0); - box-shadow: 0 2px 8px rgba(76, 175, 80, 0.3); -} - -.btn-icon { - font-size: 1rem; - animation: rotate 2s linear infinite paused; -} - -.refresh-btn:hover .btn-icon { - animation-play-state: running; -} - -@keyframes rotate { - from { transform: rotate(0deg); } - to { transform: rotate(360deg); } -} - -/* 热搜列表 - 移动端优先设计 */ -.hot-list { - list-style: none; -} - -.hot-item { - background: rgba(255, 255, 255, 0.95); - border-radius: 16px; - padding: 16px; - margin-bottom: 12px; - box-shadow: 0 2px 12px rgba(76, 175, 80, 0.08); - transition: all 0.3s ease; - border: 1px solid rgba(76, 175, 80, 0.1); - display: flex; - align-items: center; - gap: 12px; - position: relative; - overflow: hidden; -} - -.hot-item:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(76, 175, 80, 0.15); - border-color: rgba(76, 175, 80, 0.25); - background: rgba(255, 255, 255, 1); -} - -/* 排名容器 */ -.hot-rank-container { - flex-shrink: 0; - display: flex; - align-items: center; -} - -.hot-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); -} - -.hot-rank.rank-1 { - background: linear-gradient(135deg, #4caf50, #66bb6a); - color: white; - box-shadow: 0 4px 12px rgba(76, 175, 80, 0.3); -} - -.hot-rank.rank-2 { - background: linear-gradient(135deg, #66bb6a, #81c784); - color: white; - box-shadow: 0 4px 12px rgba(102, 187, 106, 0.3); -} - -.hot-rank.rank-3 { - background: linear-gradient(135deg, #81c784, #a5d6a7); - color: #2e7d32; - box-shadow: 0 4px 12px rgba(129, 199, 132, 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; -} - -/* 内容包装器 */ -.hot-content-wrapper { - flex: 1; - min-width: 0; - display: flex; - flex-direction: column; - justify-content: center; - gap: 8px; -} - -/* 标题 */ -.hot-title { - font-size: 1rem; - font-weight: 600; - color: #333; - line-height: 1.3; - margin: 0; - display: -webkit-box; - -webkit-line-clamp: 1; - -webkit-box-orient: vertical; - overflow: hidden; - text-overflow: ellipsis; - cursor: pointer; - transition: color 0.2s ease; -} - -.hot-title:hover { - color: #4caf50; -} - -/* 底部行 */ -.hot-bottom-row { - display: flex; - align-items: center; - gap: 12px; - flex-wrap: nowrap; -} - -.hot-time { - display: flex; - align-items: center; - gap: 4px; - color: #666; - font-size: 0.8rem; - flex-shrink: 0; -} - -.meta-icon { - font-size: 0.9rem; - flex-shrink: 0; -} - -.meta-text { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.hot-value { - display: flex; - align-items: center; - gap: 4px; - background: linear-gradient(135deg, #81c784, #a5d6a7); - color: #2e7d32; - padding: 4px 10px; - border-radius: 12px; - font-size: 0.75rem; - font-weight: 600; - box-shadow: 0 2px 6px rgba(76, 175, 80, 0.15); - flex-shrink: 0; -} - -.heat-level { - font-size: 0.8rem; -} - -.value-text { - font-size: 0.75rem; -} - -/* 图片样式 */ -.hot-cover { - width: 80px; - height: 60px; - object-fit: cover; - border-radius: 8px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); - flex-shrink: 0; -} - -.hot-link { - display: flex; - align-items: center; - gap: 4px; - background: linear-gradient(135deg, #4caf50, #66bb6a); - 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(76, 175, 80, 0.3); - flex-shrink: 0; -} - -.hot-link:hover { - transform: translateY(-1px); - box-shadow: 0 4px 10px rgba(76, 175, 80, 0.4); - text-decoration: none; - color: white; - background: linear-gradient(135deg, #388e3c, #4caf50); -} - -.link-icon { - font-size: 0.8rem; -} - -.link-text { - font-size: 0.75rem; -} - -.loading { - text-align: center; - padding: 40px; - color: #4caf50; - font-size: 1.1rem; -} - -.spinner { - width: 40px; - height: 40px; - 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 16px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -footer { - text-align: center; - margin-top: 30px; - padding-top: 20px; - border-top: 1px solid rgba(76, 175, 80, 0.15); - color: #4caf50; - 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; - gap: 14px; - } - - .hot-rank { - width: 52px; - height: 52px; - } - - .hot-title { - font-size: 1.1rem; - } -} - -@media (max-width: 768px) { - .container { - max-width: 95%; - margin: 12px auto; - padding: 8px; - border-radius: 12px; - } - - header { - margin-bottom: 20px; - padding: 12px 0 16px 0; - } - - header h1 { - font-size: 1.8rem; - margin-bottom: 10px; - } - - .update-time { - font-size: 0.85rem; - padding: 6px 12px; - } - - .hot-item { - padding: 12px; - margin-bottom: 10px; - gap: 10px; - } - - .hot-rank { - width: 40px; - height: 40px; - } - - .rank-number { - font-size: 0.8rem; - } - - .rank-emoji { - font-size: 0.6rem; - } - - .hot-title { - font-size: 0.9rem; - line-height: 1.3; - } - - .hot-meta-row { - gap: 8px; - } - - .hot-time { - font-size: 0.75rem; - } - - .hot-value { - padding: 3px 8px; - font-size: 0.7rem; - } - - .hot-cover { - width: 70px; - height: 50px; - } - - .hot-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) { - body { - overflow-x: hidden; - } - - .container { - margin: 8px; - padding: 8px; - max-width: calc(100vw - 16px); - width: calc(100vw - 16px); - } - - header { - padding: 12px 0 16px 0; - margin-bottom: 16px; - } - - header h1 { - font-size: 1.5rem; - margin-bottom: 8px; - } - - .update-time { - font-size: 0.8rem; - padding: 6px 12px; - } - - .refresh-btn { - font-size: 0.8rem; - padding: 8px 16px; - margin-top: 12px; - } - - .hot-item { - padding: 12px; - margin-bottom: 10px; - gap: 10px; - width: 100%; - min-width: 0; - } - - .hot-rank-container { - flex-shrink: 0; - } - - .hot-rank { - width: 36px; - height: 36px; - } - - .rank-number { - font-size: 0.75rem; - } - - .hot-content-wrapper { - flex: 1; - min-width: 0; - overflow: hidden; - } - - .hot-title { - font-size: 0.9rem; - line-height: 1.3; - word-break: break-all; - overflow: hidden; - text-overflow: ellipsis; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - } - - .hot-bottom-row { - flex-wrap: wrap; - gap: 8px; - } - - .hot-time { - font-size: 0.7rem; - flex-shrink: 0; - } - - .hot-value { - font-size: 0.65rem; - padding: 3px 8px; - flex-shrink: 0; - } - - .hot-cover { - width: 60px; - height: 45px; - flex-shrink: 0; - } - - .hot-link { - font-size: 0.65rem; - padding: 4px 8px; - flex-shrink: 0; - } - - .link-text { - font-size: 0.65rem; - } - - .loading { - padding: 30px; - font-size: 1rem; - } - - .loading-content { - padding: 20px; - } - - .loading-text p { - font-size: 0.9rem; - } - - footer { - margin-top: 20px; - padding-top: 16px; - font-size: 0.8rem; - } -} - -/* 减少动画以节省电池 */ -@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(76, 175, 80, 0.15) 0%, + rgba(129, 199, 132, 0.1) 25%, + rgba(165, 214, 167, 0.08) 50%, + rgba(200, 230, 201, 0.06) 75%, + rgba(232, 245, 233, 0.05) 100% + ); + animation: gradient-flow 30s ease-in-out infinite; + border-radius: 40% 60% 60% 40% / 40% 40% 60% 60%; +} + +.modern-gradient::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: radial-gradient( + circle at 30% 70%, + rgba(76, 175, 80, 0.1) 0%, + transparent 40% + ), radial-gradient( + circle at 70% 30%, + rgba(129, 199, 132, 0.08) 0%, + transparent 40% + ); + animation: pulse-effect 25s ease-in-out infinite alternate; + border-radius: 40% 60% 60% 40% / 40% 40% 60% 60%; +} + +@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.9); + border-radius: 16px; + box-shadow: 0 8px 24px rgba(76, 175, 80, 0.08); + backdrop-filter: blur(12px); + border: 1px solid rgba(76, 175, 80, 0.1); +} + +header { + text-align: center; + margin-bottom: 28px; + padding-bottom: 20px; + border-bottom: 1px solid rgba(76, 175, 80, 0.15); +} + +header h1 { + background: linear-gradient(135deg, #2e7d32, #4caf50, #66bb6a); + -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: #4caf50; + font-size: 0.9rem; + background-color: rgba(76, 175, 80, 0.08); + padding: 8px 16px; + border-radius: 24px; + display: inline-block; + box-shadow: 0 2px 8px rgba(76, 175, 80, 0.1); + border: 1px solid rgba(76, 175, 80, 0.15); +} + +.refresh-btn { + background: linear-gradient(135deg, #4caf50, #66bb6a); + color: white; + border: none; + padding: 10px 20px; + border-radius: 24px; + font-size: 0.9rem; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + margin-top: 12px; + box-shadow: 0 4px 12px rgba(76, 175, 80, 0.25); + display: inline-flex; + align-items: center; + gap: 6px; +} + +.refresh-btn:hover { + background: linear-gradient(135deg, #388e3c, #4caf50); + transform: translateY(-2px); + box-shadow: 0 6px 16px rgba(76, 175, 80, 0.35); +} + +.refresh-btn:active { + transform: translateY(0); + box-shadow: 0 2px 8px rgba(76, 175, 80, 0.3); +} + +.btn-icon { + font-size: 1rem; + animation: rotate 2s linear infinite paused; +} + +.refresh-btn:hover .btn-icon { + animation-play-state: running; +} + +@keyframes rotate { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } +} + +/* 热搜列表 - 移动端优先设计 */ +.hot-list { + list-style: none; +} + +.hot-item { + background: rgba(255, 255, 255, 0.95); + border-radius: 16px; + padding: 16px; + margin-bottom: 12px; + box-shadow: 0 2px 12px rgba(76, 175, 80, 0.08); + transition: all 0.3s ease; + border: 1px solid rgba(76, 175, 80, 0.1); + display: flex; + align-items: center; + gap: 12px; + position: relative; + overflow: hidden; +} + +.hot-item:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(76, 175, 80, 0.15); + border-color: rgba(76, 175, 80, 0.25); + background: rgba(255, 255, 255, 1); +} + +/* 排名容器 */ +.hot-rank-container { + flex-shrink: 0; + display: flex; + align-items: center; +} + +.hot-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); +} + +.hot-rank.rank-1 { + background: linear-gradient(135deg, #4caf50, #66bb6a); + color: white; + box-shadow: 0 4px 12px rgba(76, 175, 80, 0.3); +} + +.hot-rank.rank-2 { + background: linear-gradient(135deg, #66bb6a, #81c784); + color: white; + box-shadow: 0 4px 12px rgba(102, 187, 106, 0.3); +} + +.hot-rank.rank-3 { + background: linear-gradient(135deg, #81c784, #a5d6a7); + color: #2e7d32; + box-shadow: 0 4px 12px rgba(129, 199, 132, 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; +} + +/* 内容包装器 */ +.hot-content-wrapper { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + justify-content: center; + gap: 8px; +} + +/* 标题 */ +.hot-title { + font-size: 1rem; + font-weight: 600; + color: #333; + line-height: 1.3; + margin: 0; + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; + cursor: pointer; + transition: color 0.2s ease; +} + +.hot-title:hover { + color: #4caf50; +} + +/* 底部行 */ +.hot-bottom-row { + display: flex; + align-items: center; + gap: 12px; + flex-wrap: nowrap; +} + +.hot-time { + display: flex; + align-items: center; + gap: 4px; + color: #666; + font-size: 0.8rem; + flex-shrink: 0; +} + +.meta-icon { + font-size: 0.9rem; + flex-shrink: 0; +} + +.meta-text { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.hot-value { + display: flex; + align-items: center; + gap: 4px; + background: linear-gradient(135deg, #81c784, #a5d6a7); + color: #2e7d32; + padding: 4px 10px; + border-radius: 12px; + font-size: 0.75rem; + font-weight: 600; + box-shadow: 0 2px 6px rgba(76, 175, 80, 0.15); + flex-shrink: 0; +} + +.heat-level { + font-size: 0.8rem; +} + +.value-text { + font-size: 0.75rem; +} + +/* 图片样式 */ +.hot-cover { + width: 80px; + height: 60px; + object-fit: cover; + border-radius: 8px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + flex-shrink: 0; +} + +.hot-link { + display: flex; + align-items: center; + gap: 4px; + background: linear-gradient(135deg, #4caf50, #66bb6a); + 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(76, 175, 80, 0.3); + flex-shrink: 0; +} + +.hot-link:hover { + transform: translateY(-1px); + box-shadow: 0 4px 10px rgba(76, 175, 80, 0.4); + text-decoration: none; + color: white; + background: linear-gradient(135deg, #388e3c, #4caf50); +} + +.link-icon { + font-size: 0.8rem; +} + +.link-text { + font-size: 0.75rem; +} + +.loading { + text-align: center; + padding: 40px; + color: #4caf50; + font-size: 1.1rem; +} + +.spinner { + width: 40px; + height: 40px; + 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 16px; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +footer { + text-align: center; + margin-top: 30px; + padding-top: 20px; + border-top: 1px solid rgba(76, 175, 80, 0.15); + color: #4caf50; + 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; + gap: 14px; + } + + .hot-rank { + width: 52px; + height: 52px; + } + + .hot-title { + font-size: 1.1rem; + } +} + +@media (max-width: 768px) { + .container { + max-width: 95%; + margin: 12px auto; + padding: 8px; + border-radius: 12px; + } + + header { + margin-bottom: 20px; + padding: 12px 0 16px 0; + } + + header h1 { + font-size: 1.8rem; + margin-bottom: 10px; + } + + .update-time { + font-size: 0.85rem; + padding: 6px 12px; + } + + .hot-item { + padding: 12px; + margin-bottom: 10px; + gap: 10px; + } + + .hot-rank { + width: 40px; + height: 40px; + } + + .rank-number { + font-size: 0.8rem; + } + + .rank-emoji { + font-size: 0.6rem; + } + + .hot-title { + font-size: 0.9rem; + line-height: 1.3; + } + + .hot-meta-row { + gap: 8px; + } + + .hot-time { + font-size: 0.75rem; + } + + .hot-value { + padding: 3px 8px; + font-size: 0.7rem; + } + + .hot-cover { + width: 70px; + height: 50px; + } + + .hot-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) { + body { + overflow-x: hidden; + } + + .container { + margin: 8px; + padding: 8px; + max-width: calc(100vw - 16px); + width: calc(100vw - 16px); + } + + header { + padding: 12px 0 16px 0; + margin-bottom: 16px; + } + + header h1 { + font-size: 1.5rem; + margin-bottom: 8px; + } + + .update-time { + font-size: 0.8rem; + padding: 6px 12px; + } + + .refresh-btn { + font-size: 0.8rem; + padding: 8px 16px; + margin-top: 12px; + } + + .hot-item { + padding: 12px; + margin-bottom: 10px; + gap: 10px; + width: 100%; + min-width: 0; + } + + .hot-rank-container { + flex-shrink: 0; + } + + .hot-rank { + width: 36px; + height: 36px; + } + + .rank-number { + font-size: 0.75rem; + } + + .hot-content-wrapper { + flex: 1; + min-width: 0; + overflow: hidden; + } + + .hot-title { + font-size: 0.9rem; + line-height: 1.3; + word-break: break-all; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + } + + .hot-bottom-row { + flex-wrap: wrap; + gap: 8px; + } + + .hot-time { + font-size: 0.7rem; + flex-shrink: 0; + } + + .hot-value { + font-size: 0.65rem; + padding: 3px 8px; + flex-shrink: 0; + } + + .hot-cover { + width: 60px; + height: 45px; + flex-shrink: 0; + } + + .hot-link { + font-size: 0.65rem; + padding: 4px 8px; + flex-shrink: 0; + } + + .link-text { + font-size: 0.65rem; + } + + .loading { + padding: 30px; + font-size: 1rem; + } + + .loading-content { + padding: 20px; + } + + .loading-text p { + font-size: 0.9rem; + } + + footer { + margin-top: 20px; + padding-top: 16px; + font-size: 0.8rem; + } +} + +/* 减少动画以节省电池 */ +@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 a1e9875d..b4f51b94 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/index.html +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/index.html @@ -1,56 +1,56 @@ - - - - - - 抖音热搜榜 - - - - -
      -
      -

      抖音热搜榜

      -

      实时热门话题 · 紧跟潮流趋势

      -
      - 加载中... -
      - -
      - -
      -
      -
      -
      - 🎭 -

      正在获取最新热搜...

      -
      - - - -
      -
      -
      -
      - -
      - -
      - - -
      - - - - + + + + + + 抖音热搜榜 + + + + +
      +
      +

      抖音热搜榜

      +

      实时热门话题 · 紧跟潮流趋势

      +
      + 加载中... +
      + +
      + +
      +
      +
      +
      + 🎭 +

      正在获取最新热搜...

      +
      + + + +
      +
      +
      +
      + +
      + +
      + + +
      + + + + diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/js/script.js b/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/js/script.js index 26642b67..606568d1 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/js/script.js +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/js/script.js @@ -1,330 +1,330 @@ -// 本地后端API接口 -const LOCAL_API_BASE = 'https://infogenie.api.shumengya.top/api/60s'; - -// API接口列表(备用) -const API_ENDPOINTS = [ - "https://60s.api.shumengya.top", -]; - -// 当前使用的API索引 -let currentApiIndex = 0; -let useLocalApi = true; - -// DOM元素 -const loadingElement = document.getElementById('loading'); -const hotListElement = document.getElementById('hotList'); -const errorMessageElement = document.getElementById('errorMessage'); -const updateTimeElement = document.getElementById('updateTime'); -const refreshBtn = document.getElementById('refreshBtn'); - -// 页面加载完成后自动加载数据 -document.addEventListener('DOMContentLoaded', function() { - loadHotList(); -}); - -// 刷新按钮点击事件 -refreshBtn.addEventListener('click', function() { - loadHotList(); -}); - -// 加载热搜列表 -async function loadHotList() { - showLoading(); - hideError(); - - try { - const data = await fetchData(); - displayHotList(data.data); - updateRefreshTime(); - } catch (error) { - console.error('加载失败:', error); - showError(); - } - - hideLoading(); -} - -// 获取数据 -async function fetchData() { - // 优先尝试本地API - if (useLocalApi) { - try { - const response = await fetch(`${LOCAL_API_BASE}/douyin`, { - method: 'GET', - headers: { - 'Accept': 'application/json', - }, - timeout: 10000 - }); - - if (response.ok) { - const data = await response.json(); - if (data.code === 200 && data.data) { - return data; - } - } - } catch (error) { - console.warn('本地API请求失败,切换到外部API:', error); - useLocalApi = false; - } - } - - // 使用外部API作为备用 - for (let i = 0; i < API_ENDPOINTS.length; i++) { - const apiUrl = API_ENDPOINTS[currentApiIndex]; - - try { - const response = await fetch(`${apiUrl}/v2/douyin`, { - 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 displayHotList(hotData) { - hotListElement.innerHTML = ''; - - hotData.forEach((item, index) => { - const hotItem = createHotItem(item, index + 1); - hotListElement.appendChild(hotItem); - }); -} - -// 创建热搜项目 -function createHotItem(item, rank) { - const hotItem = document.createElement('div'); - hotItem.className = 'hot-item'; - - // 排名样式类 - let rankClass = 'hot-rank'; - if (rank === 1) rankClass += ' rank-1'; - else if (rank === 2) rankClass += ' rank-2'; - else if (rank === 3) rankClass += ' rank-3'; - - const formattedHotValue = formatHotValue(item.hot_value); - const formattedTime = formatTime(item.event_time); - - // 根据排名添加特殊标识 - let rankEmoji = ''; - if (rank === 1) rankEmoji = '👑'; - else if (rank === 2) rankEmoji = '🥈'; - else if (rank === 3) rankEmoji = '🥉'; - else if (rank <= 10) rankEmoji = '🔥'; - - // 根据热度值添加火焰等级 - let fireLevel = ''; - if (item.hot_value >= 10000000) fireLevel = '🔥'; - else if (item.hot_value >= 5000000) fireLevel = '🔥'; - else fireLevel = '🔥'; - - hotItem.innerHTML = ` -
      -
      -
      ${rank}
      -
      ${rankEmoji}
      -
      -
      - ${escapeHtml(item.title)} -
      -
      ${escapeHtml(item.title)}
      -
      -
      - ${formattedTime} -
      -
      - ${fireLevel} - ${formattedHotValue} -
      - - 观看视频 - -
      -
      - `; - - return hotItem; -} - -// 格式化热度值 -function formatHotValue(value) { - if (value >= 100000000) { - return (value / 100000000).toFixed(1) + '亿'; - } else if (value >= 10000) { - return (value / 10000).toFixed(1) + '万'; - } else { - return value.toLocaleString(); - } -} - -// 格式化时间 -function formatTime(timeStr) { - try { - const formattedTime = timeStr.replace(/\//g, '-'); - const date = new Date(formattedTime); - 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 handleImageError(img) { - img.src = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjgwIiBoZWlnaHQ9IjgwIiBmaWxsPSIjZjVmNWY1Ii8+CjxwYXRoIGQ9Ik00MCAyMEM0NCAyMCA0NyAyMyA0NyAyN1Y1M0M0NyA1NyA0NCA2MCA0MCA2MEgxNkMxMiA2MCA5IDU3IDkgNTNWMjdDOSAyMyAxMiAyMCAxNiAyMEg0MFoiIHN0cm9rZT0iI2NjY2NjYyIgc3Ryb2tlLXdpZHRoPSIyIi8+CjxjaXJjbGUgY3g9IjMzIiBjeT0iMzIiIHI9IjMiIGZpbGw9IiNjY2NjY2MiLz4KPHBhdGggZD0iTTEzIDQ4TDIzIDM4TDMzIDQ4TDQzIDM4TDUzIDQ4IiBzdHJva2U9IiNjY2NjY2MiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+Cjwvc3ZnPgo='; - img.alt = '图片加载失败'; -} - -// 更新刷新时间 -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, #4caf50, #66bb6a); - color: white; - padding: 12px 20px; - border-radius: 25px; - box-shadow: 0 4px 20px rgba(76, 175, 80, 0.3); - z-index: 1000; - font-weight: 600; - font-size: 0.9em; - animation: slideIn 0.3s ease-out; - backdrop-filter: blur(10px); - `; - - document.body.appendChild(toast); - - // 3秒后自动移除 - setTimeout(() => { - toast.style.animation = 'slideOut 0.3s ease-in forwards'; - setTimeout(() => toast.remove(), 300); - }, 3000); -} - -// 添加CSS动画到页面 -if (!document.querySelector('#toast-styles')) { - const style = document.createElement('style'); - style.id = 'toast-styles'; - style.textContent = ` - @keyframes slideIn { - from { - opacity: 0; - transform: translateX(100px); - } - to { - opacity: 1; - transform: translateX(0); - } - } - - @keyframes slideOut { - from { - opacity: 1; - transform: translateX(0); - } - to { - opacity: 0; - transform: translateX(100px); - } - } - `; - document.head.appendChild(style); -} - -// 显示加载状态 -function showLoading() { - loadingElement.style.display = 'block'; - hotListElement.style.display = 'none'; -} - -// 隐藏加载状态 -function hideLoading() { - loadingElement.style.display = 'none'; - hotListElement.style.display = 'block'; -} - -// 显示错误信息 -function showError() { - errorMessageElement.style.display = 'block'; - hotListElement.style.display = 'none'; -} - -// 隐藏错误信息 -function hideError() { - errorMessageElement.style.display = 'none'; -} - -// 自动刷新 (每5分钟) -setInterval(function() { - loadHotList(); -}, 5 * 60 * 1000); +// 本地后端API接口 +const LOCAL_API_BASE = 'https://infogenie.api.shumengya.top/api/60s'; + +// API接口列表(备用) +const API_ENDPOINTS = [ + "https://60s.api.shumengya.top", +]; + +// 当前使用的API索引 +let currentApiIndex = 0; +let useLocalApi = true; + +// DOM元素 +const loadingElement = document.getElementById('loading'); +const hotListElement = document.getElementById('hotList'); +const errorMessageElement = document.getElementById('errorMessage'); +const updateTimeElement = document.getElementById('updateTime'); +const refreshBtn = document.getElementById('refreshBtn'); + +// 页面加载完成后自动加载数据 +document.addEventListener('DOMContentLoaded', function() { + loadHotList(); +}); + +// 刷新按钮点击事件 +refreshBtn.addEventListener('click', function() { + loadHotList(); +}); + +// 加载热搜列表 +async function loadHotList() { + showLoading(); + hideError(); + + try { + const data = await fetchData(); + displayHotList(data.data); + updateRefreshTime(); + } catch (error) { + console.error('加载失败:', error); + showError(); + } + + hideLoading(); +} + +// 获取数据 +async function fetchData() { + // 优先尝试本地API + if (useLocalApi) { + try { + const response = await fetch(`${LOCAL_API_BASE}/douyin`, { + method: 'GET', + headers: { + 'Accept': 'application/json', + }, + timeout: 10000 + }); + + if (response.ok) { + const data = await response.json(); + if (data.code === 200 && data.data) { + return data; + } + } + } catch (error) { + console.warn('本地API请求失败,切换到外部API:', error); + useLocalApi = false; + } + } + + // 使用外部API作为备用 + for (let i = 0; i < API_ENDPOINTS.length; i++) { + const apiUrl = API_ENDPOINTS[currentApiIndex]; + + try { + const response = await fetch(`${apiUrl}/v2/douyin`, { + 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 displayHotList(hotData) { + hotListElement.innerHTML = ''; + + hotData.forEach((item, index) => { + const hotItem = createHotItem(item, index + 1); + hotListElement.appendChild(hotItem); + }); +} + +// 创建热搜项目 +function createHotItem(item, rank) { + const hotItem = document.createElement('div'); + hotItem.className = 'hot-item'; + + // 排名样式类 + let rankClass = 'hot-rank'; + if (rank === 1) rankClass += ' rank-1'; + else if (rank === 2) rankClass += ' rank-2'; + else if (rank === 3) rankClass += ' rank-3'; + + const formattedHotValue = formatHotValue(item.hot_value); + const formattedTime = formatTime(item.event_time); + + // 根据排名添加特殊标识 + let rankEmoji = ''; + if (rank === 1) rankEmoji = '👑'; + else if (rank === 2) rankEmoji = '🥈'; + else if (rank === 3) rankEmoji = '🥉'; + else if (rank <= 10) rankEmoji = '🔥'; + + // 根据热度值添加火焰等级 + let fireLevel = ''; + if (item.hot_value >= 10000000) fireLevel = '🔥'; + else if (item.hot_value >= 5000000) fireLevel = '🔥'; + else fireLevel = '🔥'; + + hotItem.innerHTML = ` +
      +
      +
      ${rank}
      +
      ${rankEmoji}
      +
      +
      + ${escapeHtml(item.title)} +
      +
      ${escapeHtml(item.title)}
      +
      +
      + ${formattedTime} +
      +
      + ${fireLevel} + ${formattedHotValue} +
      + + 观看视频 + +
      +
      + `; + + return hotItem; +} + +// 格式化热度值 +function formatHotValue(value) { + if (value >= 100000000) { + return (value / 100000000).toFixed(1) + '亿'; + } else if (value >= 10000) { + return (value / 10000).toFixed(1) + '万'; + } else { + return value.toLocaleString(); + } +} + +// 格式化时间 +function formatTime(timeStr) { + try { + const formattedTime = timeStr.replace(/\//g, '-'); + const date = new Date(formattedTime); + 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 handleImageError(img) { + img.src = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjgwIiBoZWlnaHQ9IjgwIiBmaWxsPSIjZjVmNWY1Ii8+CjxwYXRoIGQ9Ik00MCAyMEM0NCAyMCA0NyAyMyA0NyAyN1Y1M0M0NyA1NyA0NCA2MCA0MCA2MEgxNkMxMiA2MCA5IDU3IDkgNTNWMjdDOSAyMyAxMiAyMCAxNiAyMEg0MFoiIHN0cm9rZT0iI2NjY2NjYyIgc3Ryb2tlLXdpZHRoPSIyIi8+CjxjaXJjbGUgY3g9IjMzIiBjeT0iMzIiIHI9IjMiIGZpbGw9IiNjY2NjY2MiLz4KPHBhdGggZD0iTTEzIDQ4TDIzIDM4TDMzIDQ4TDQzIDM4TDUzIDQ4IiBzdHJva2U9IiNjY2NjY2MiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+Cjwvc3ZnPgo='; + img.alt = '图片加载失败'; +} + +// 更新刷新时间 +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, #4caf50, #66bb6a); + color: white; + padding: 12px 20px; + border-radius: 25px; + box-shadow: 0 4px 20px rgba(76, 175, 80, 0.3); + z-index: 1000; + font-weight: 600; + font-size: 0.9em; + animation: slideIn 0.3s ease-out; + backdrop-filter: blur(10px); + `; + + document.body.appendChild(toast); + + // 3秒后自动移除 + setTimeout(() => { + toast.style.animation = 'slideOut 0.3s ease-in forwards'; + setTimeout(() => toast.remove(), 300); + }, 3000); +} + +// 添加CSS动画到页面 +if (!document.querySelector('#toast-styles')) { + const style = document.createElement('style'); + style.id = 'toast-styles'; + style.textContent = ` + @keyframes slideIn { + from { + opacity: 0; + transform: translateX(100px); + } + to { + opacity: 1; + transform: translateX(0); + } + } + + @keyframes slideOut { + from { + opacity: 1; + transform: translateX(0); + } + to { + opacity: 0; + transform: translateX(100px); + } + } + `; + document.head.appendChild(style); +} + +// 显示加载状态 +function showLoading() { + loadingElement.style.display = 'block'; + hotListElement.style.display = 'none'; +} + +// 隐藏加载状态 +function hideLoading() { + loadingElement.style.display = 'none'; + hotListElement.style.display = 'block'; +} + +// 显示错误信息 +function showError() { + errorMessageElement.style.display = 'block'; + hotListElement.style.display = 'none'; +} + +// 隐藏错误信息 +function hideError() { + errorMessageElement.style.display = 'none'; +} + +// 自动刷新 (每5分钟) +setInterval(function() { + loadHotList(); +}, 5 * 60 * 1000); 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 5094d4ec..8dedd1fd 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/返回接口.json +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/抖音热搜榜/返回接口.json @@ -1,496 +1,496 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "title": "九三阅兵具体安排公布", - "hot_value": 11821633, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oY1c972B7QzApGweaeQD3fGRo5aLIBrpCAuUSa~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=q01Se46GlLKYNv2klGKP1aM1cT0%3D&from=3218412987", - "link": "https://www.douyin.com/search/%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", - "event_time": "2025/09/01 15:20:34", - "event_time_at": 1756711234, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "九月第一天", - "hot_value": 11327170, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oofTvDaDRCSs4hBFEFVJlAI9BBs0faZAc7IpGf~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=otkowVCSglk%2BS3tPrmBQFq6rIDw%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E4%B9%9D%E6%9C%88%E7%AC%AC%E4%B8%80%E5%A4%A9", - "event_time": "2025/09/01 07:28:57", - "event_time_at": 1756682937, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "遇见上合共享津彩", - "hot_value": 11222444, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oIJeINhBDBAiHADD4gi9Ae0CGALg1BqWI7vg0i~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=K%2BaEx5p%2BDv%2B1h3RgNnH0Yb9WT%2B8%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E9%81%87%E8%A7%81%E4%B8%8A%E5%90%88%E5%85%B1%E4%BA%AB%E6%B4%A5%E5%BD%A9", - "event_time": "2025/09/01 11:46:59", - "event_time_at": 1756698419, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "2025年开学第一课铭记与奋斗", - "hot_value": 11078403, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oA9NgVCRBABg7r70pQue8IzAUlfMaXf3hawOIB~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=3xYeXsD6JpXLDOVp6gYRxrvKFaM%3D&from=3218412987", - "link": "https://www.douyin.com/search/2025%E5%B9%B4%E5%BC%80%E5%AD%A6%E7%AC%AC%E4%B8%80%E8%AF%BE%E9%93%AD%E8%AE%B0%E4%B8%8E%E5%A5%8B%E6%96%97", - "event_time": "2025/09/01 11:21:13", - "event_time_at": 1756696873, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "石宇奇首夺世锦赛男单冠军", - "hot_value": 10395092, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oAf9IAlEuyE3lFiogfBuQFl8gDFqAoAHtFDNkE~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=tamoorhMGYhajvpmVNdX0TuUuZM%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%9F%B3%E5%AE%87%E5%A5%87%E9%A6%96%E5%A4%BA%E4%B8%96%E9%94%A6%E8%B5%9B%E7%94%B7%E5%8D%95%E5%86%A0%E5%86%9B", - "event_time": "2025/09/01 07:47:03", - "event_time_at": 1756684023, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "告别信息裸奔 国家网络身份认证来了", - "hot_value": 10255200, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oskNjrEUQIN9BBRCfeiDTGPE0geX0q6eAAyLr2~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=FrZQSxERPOBd6ktV8K%2Bt%2F3LgJ4A%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%91%8A%E5%88%AB%E4%BF%A1%E6%81%AF%E8%A3%B8%E5%A5%94%20%E5%9B%BD%E5%AE%B6%E7%BD%91%E7%BB%9C%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81%E6%9D%A5%E4%BA%86", - "event_time": "2025/09/01 10:28:41", - "event_time_at": 1756693721, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "记录我的开学第一天", - "hot_value": 9133236, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/owTXhhk40MlJDQHi8P2B07AviaBqAL0VI9EQi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=pTEfiV%2FfsmGuQxNllsV8PqT0RYc%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%AE%B0%E5%BD%95%E6%88%91%E7%9A%84%E5%BC%80%E5%AD%A6%E7%AC%AC%E4%B8%80%E5%A4%A9", - "event_time": "2025/09/01 12:43:33", - "event_time_at": 1756701813, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "9月起这些新规开始施行", - "hot_value": 9105252, - "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015/oEE9BseGagtA7JRBmzYA1aRMoCMAeIxfLFY5gA~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=YgH%2BJdVPmi76okIWTRoyEEZ3iDg%3D&from=3218412987", - "link": "https://www.douyin.com/search/9%E6%9C%88%E8%B5%B7%E8%BF%99%E4%BA%9B%E6%96%B0%E8%A7%84%E5%BC%80%E5%A7%8B%E6%96%BD%E8%A1%8C", - "event_time": "2025/09/01 11:48:01", - "event_time_at": 1756698481, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "李幼斌与李云龙跨时空对话", - "hot_value": 8998174, - "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015/oAarINBoAgRIPi9VTEMIfHeA11nDtF7hRDuGcA~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=3x7yTXHYKiIcnNJjznvZjCw%2FW94%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E6%9D%8E%E5%B9%BC%E6%96%8C%E4%B8%8E%E6%9D%8E%E4%BA%91%E9%BE%99%E8%B7%A8%E6%97%B6%E7%A9%BA%E5%AF%B9%E8%AF%9D", - "event_time": "2025/09/01 12:01:05", - "event_time_at": 1756699265, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "幼儿园第一天开学哀嚎一片", - "hot_value": 8962824, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/osbXMAQYgIwwpkDCfeiDpGaE0gb9MXfeAAuLV2~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=w1l8V4VvjuO%2BvOvuQkXiEuXYko0%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%B9%BC%E5%84%BF%E5%9B%AD%E7%AC%AC%E4%B8%80%E5%A4%A9%E5%BC%80%E5%AD%A6%E5%93%80%E5%9A%8E%E4%B8%80%E7%89%87", - "event_time": "2025/09/01 11:05:01", - "event_time_at": 1756695901, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "田汉把国歌歌词写烟盒上系谣传", - "hot_value": 8930615, - "cover": "https://p3-sign.douyinpic.com/tos-cn-i-0813c001/ogA2AoCCXZMEAGF9f9QAlSACKRgfsC2oAFtIgD~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=7%2F8qsoQJd6TgpAEylOW1VyQrqeY%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%94%B0%E6%B1%89%E6%8A%8A%E5%9B%BD%E6%AD%8C%E6%AD%8C%E8%AF%8D%E5%86%99%E7%83%9F%E7%9B%92%E4%B8%8A%E7%B3%BB%E8%B0%A3%E4%BC%A0", - "event_time": "2025/09/01 13:51:28", - "event_time_at": 1756705888, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "苏超联赛积分榜", - "hot_value": 8838219, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/o4vPLtWIQAaiggBRkQq5kw9ZlIVA0v1iDAILU~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=JJlPUPmWRzT3UPMenizW639pqVg%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%8B%8F%E8%B6%85%E8%81%94%E8%B5%9B%E7%A7%AF%E5%88%86%E6%A6%9C", - "event_time": "2025/08/31 22:01:53", - "event_time_at": 1756648913, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "一切正开始", - "hot_value": 8609507, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/o8wN0EuXoETsyMz0ADCFFaAsFFTQeQf9fAublW~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=5I8uLkfpNYrGArQm%2BXLBa81NhYY%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E4%B8%80%E5%88%87%E6%AD%A3%E5%BC%80%E5%A7%8B", - "event_time": "2025/09/01 11:56:50", - "event_time_at": 1756699010, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "张玉宁为与球迷起冲突致歉", - "hot_value": 8511631, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oMfoIAFMN5GEWOzpBCDAQfaj7yRArCdByaEUfE~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=59ipMtNxZ8W3R5NNAJamlSOEbPo%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%BC%A0%E7%8E%89%E5%AE%81%E4%B8%BA%E4%B8%8E%E7%90%83%E8%BF%B7%E8%B5%B7%E5%86%B2%E7%AA%81%E8%87%B4%E6%AD%89", - "event_time": "2025/09/01 07:53:39", - "event_time_at": 1756684419, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "这一口会很疯狂", - "hot_value": 8454971, - "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015/oUIozRIBqC0ahA7FimIAmFEBeqDFfZK3Qfo8PE~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=ZBSuTMuu4678gSfReaVIfdK22J8%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%BF%99%E4%B8%80%E5%8F%A3%E4%BC%9A%E5%BE%88%E7%96%AF%E7%8B%82", - "event_time": "2025/09/01 10:36:16", - "event_time_at": 1756694176, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "邓超鹿晗合唱超级英雄", - "hot_value": 8357197, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oUBPIdtyQx0j8THRZAmZbyATihavQHI0niLIP~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=%2F66dsj8evHN94wNNFCn%2Bfhagee0%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E9%82%93%E8%B6%85%E9%B9%BF%E6%99%97%E5%90%88%E5%94%B1%E8%B6%85%E7%BA%A7%E8%8B%B1%E9%9B%84", - "event_time": "2025/09/01 07:45:11", - "event_time_at": 1756683911, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "伊萨克加盟利物浦", - "hot_value": 7963081, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/ocAw2yaT4I99iDIPh9I3LaIiLBTnBASvH0Q1a~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=v4Gq0Iz87wyZ6lEYYOnKmaeur%2FM%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E4%BC%8A%E8%90%A8%E5%85%8B%E5%8A%A0%E7%9B%9F%E5%88%A9%E7%89%A9%E6%B5%A6", - "event_time": "2025/09/01 09:12:12", - "event_time_at": 1756689132, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "山东泰山6:0北京国安", - "hot_value": 7830358, - "cover": "https://p9-sign.douyinpic.com/tos-cn-p-0015/ogtA9BEEJZDJ9SgzBBLfFN0AflNDGoIAQ2I8A8~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=gu6O%2BhGDarr%2BHQe1P%2BHo9pUmBGU%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%B1%B1%E4%B8%9C%E6%B3%B0%E5%B1%B16%3A0%E5%8C%97%E4%BA%AC%E5%9B%BD%E5%AE%89", - "event_time": "2025/08/31 20:32:53", - "event_time_at": 1756643573, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "又到开学你包书皮了吗", - "hot_value": 7828995, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oUAwaPjCIiLAQI6ADQMAm06TBJxPJFAkCpIIi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=aUkYTtkfaUKbK2DhznXU69sg8SU%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%8F%88%E5%88%B0%E5%BC%80%E5%AD%A6%E4%BD%A0%E5%8C%85%E4%B9%A6%E7%9A%AE%E4%BA%86%E5%90%97", - "event_time": "2025/08/31 17:04:09", - "event_time_at": 1756631049, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "樊振东德甲首秀两连败", - "hot_value": 7754365, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/osOdEdibznClYwP0AABAIZW1eg0gbBmAzjiJfl~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=AyWBGXt%2FFFSp0QBM%2Bd5%2F9B4GPvo%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E6%A8%8A%E6%8C%AF%E4%B8%9C%E5%BE%B7%E7%94%B2%E9%A6%96%E7%A7%80%E4%B8%A4%E8%BF%9E%E8%B4%A5", - "event_time": "2025/09/01 07:16:58", - "event_time_at": 1756682218, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "为什么说00后的童年含金量高", - "hot_value": 7735122, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/ogOQEQsnAACDBICh7LeFWRGCjeZneIB9I3oVFy~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=Htnqu7SupC%2FmvQpF2DDsLDh5FYA%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%AF%B400%E5%90%8E%E7%9A%84%E7%AB%A5%E5%B9%B4%E5%90%AB%E9%87%91%E9%87%8F%E9%AB%98", - "event_time": "2025/08/31 16:38:30", - "event_time_at": 1756629510, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "刘宇千年直拍", - "hot_value": 7734149, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/ostjBSmQ78E8estIXgFlHQxZQALRFfMepbTJWC~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=CPNw9h%2BpBB82qBykpuT11uMVFjo%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%88%98%E5%AE%87%E5%8D%83%E5%B9%B4%E7%9B%B4%E6%8B%8D", - "event_time": "2025/08/31 21:39:38", - "event_time_at": 1756647578, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "胡塞武装称将对以军袭击发起报复", - "hot_value": 7728698, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oseWgjCRBAfgft7c3QUm8JGApnYMaWdJdGj0SB~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=fX6AvTWQvNrihcvEraPHjJIS9iY%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%83%A1%E5%A1%9E%E6%AD%A6%E8%A3%85%E7%A7%B0%E5%B0%86%E5%AF%B9%E4%BB%A5%E5%86%9B%E8%A2%AD%E5%87%BB%E5%8F%91%E8%B5%B7%E6%8A%A5%E5%A4%8D", - "event_time": "2025/09/01 09:40:13", - "event_time_at": 1756690813, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "手把手教你手机变车机", - "hot_value": 7725104, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/o47qAXUjDQN6KLr9AjFSCq92ZBf4okAQEfgSAp~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=OoNNciUVTOwZbl17IUYBOjFyBJ4%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E6%89%8B%E6%8A%8A%E6%89%8B%E6%95%99%E4%BD%A0%E6%89%8B%E6%9C%BA%E5%8F%98%E8%BD%A6%E6%9C%BA", - "event_time": "2025/09/01 11:15:15", - "event_time_at": 1756696515, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "莫迪与普京拥抱手拉手热聊", - "hot_value": 7723445, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oIaWAojVPLRUILGIyvvg1Sd1ZiLAKiCB6zQIX~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=u1IGnKz%2FAckLe%2BYFCQulFw0ioB8%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%8E%AB%E8%BF%AA%E4%B8%8E%E6%99%AE%E4%BA%AC%E6%8B%A5%E6%8A%B1%E6%89%8B%E6%8B%89%E6%89%8B%E7%83%AD%E8%81%8A", - "event_time": "2025/09/01 15:38:27", - "event_time_at": 1756712307, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "原来猪猪侠搞抽象领先我20年", - "hot_value": 7706786, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oINGyAfS2oFpfAgF2kYxEJAqTbSeEcgotfxeHv~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=S1Ve0ORP5%2BrHumx%2FK7uJbfm8PbM%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%8E%9F%E6%9D%A5%E7%8C%AA%E7%8C%AA%E4%BE%A0%E6%90%9E%E6%8A%BD%E8%B1%A1%E9%A2%86%E5%85%88%E6%88%9120%E5%B9%B4", - "event_time": "2025/09/01 10:52:59", - "event_time_at": 1756695179, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "北京国安就惨败道歉", - "hot_value": 7702358, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oYiXICjfn7uEi3AeK6W04BiXu3iBjigAAs9W0B~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=hgh%2Bfy4Ul82LWgXAL2hkIBMEpJM%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%8C%97%E4%BA%AC%E5%9B%BD%E5%AE%89%E5%B0%B1%E6%83%A8%E8%B4%A5%E9%81%93%E6%AD%89", - "event_time": "2025/09/01 09:21:10", - "event_time_at": 1756689670, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "港姐冠军陈咏诗是博士生", - "hot_value": 7702059, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/okoRaMGvQBCI6KmVeBAAQ1eLEg1HK2foQuM7aB~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=5Lattu1v38oeQ8xGdXiDLcK4fwM%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E6%B8%AF%E5%A7%90%E5%86%A0%E5%86%9B%E9%99%88%E5%92%8F%E8%AF%97%E6%98%AF%E5%8D%9A%E5%A3%AB%E7%94%9F", - "event_time": "2025/09/01 10:47:23", - "event_time_at": 1756694843, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "王楚钦2:3徐瑛彬", - "hot_value": 7699514, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/o00BTIi1ogMR8LBAiQdLmSaIPAuEyIQv1IP48~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=2%2BI5KkQpEugBkQcVCrSLgOtC088%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%8E%8B%E6%A5%9A%E9%92%A62%3A3%E5%BE%90%E7%91%9B%E5%BD%AC", - "event_time": "2025/08/31 21:21:08", - "event_time_at": 1756646468, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "王源 高音", - "hot_value": 7693290, - "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015/oYzDIaQiavwPRBUpanIkjAIWzwLCIgPkAyiOj~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=uXVN6xfkB3tz3iVo0DQuxqeaGk0%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%8E%8B%E6%BA%90%20%E9%AB%98%E9%9F%B3", - "event_time": "2025/08/31 20:30:04", - "event_time_at": 1756643404, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "俄乌在苏贾前线展开阵地争夺", - "hot_value": 7691808, - "cover": "https://p9-sign.douyinpic.com/tos-cn-p-0015/oo7iATIG8vA5hIIQBILB4oCgvygsUNzBS1aPi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=SNzQbbxAJqqtdIkck9kvtRUJnZg%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E4%BF%84%E4%B9%8C%E5%9C%A8%E8%8B%8F%E8%B4%BE%E5%89%8D%E7%BA%BF%E5%B1%95%E5%BC%80%E9%98%B5%E5%9C%B0%E4%BA%89%E5%A4%BA", - "event_time": "2025/09/01 12:56:05", - "event_time_at": 1756702565, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "范丞丞温柔版一个人的夜变装", - "hot_value": 7689433, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oAPLWIAoR3CsXgVBuIQIRiTDyS14gaLPwELAi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=yp9l95J9xlKf55IEP14P7sD7J%2F4%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%8C%83%E4%B8%9E%E4%B8%9E%E6%B8%A9%E6%9F%94%E7%89%88%E4%B8%80%E4%B8%AA%E4%BA%BA%E7%9A%84%E5%A4%9C%E5%8F%98%E8%A3%85", - "event_time": "2025/09/01 15:32:00", - "event_time_at": 1756711920, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "用美食致敬这场胜利", - "hot_value": 7681826, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oIFcUfHotAXxALhJEj2EK9SBNp0fQwKhAbCgQD~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=Dkuyg5REqCAMEIsp0Dr%2B%2BkAO%2BmQ%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%94%A8%E7%BE%8E%E9%A3%9F%E8%87%B4%E6%95%AC%E8%BF%99%E5%9C%BA%E8%83%9C%E5%88%A9", - "event_time": "2025/09/01 12:08:24", - "event_time_at": 1756699704, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "田曦薇猫猫本体藏不住了", - "hot_value": 7674729, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015c000-ce/oceyeLnbxAXFERxnPfLR2egAkYaXeRpHfhAQME~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=omEVZta%2FQeV%2FSBRNZ3%2BJF0iMXPQ%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%94%B0%E6%9B%A6%E8%96%87%E7%8C%AB%E7%8C%AB%E6%9C%AC%E4%BD%93%E8%97%8F%E4%B8%8D%E4%BD%8F%E4%BA%86", - "event_time": "2025/09/01 14:33:25", - "event_time_at": 1756708405, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "少年心气是不可再生之物", - "hot_value": 7673518, - "cover": "https://p3-sign.douyinpic.com/tos-cn-i-0813c001/oAUJIWFyAFCmtGpmAADAQis69JogkCFAA0Eqff~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=YHeldSJZXPEBMLF2i%2Bj%2Fc60oKsQ%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%B0%91%E5%B9%B4%E5%BF%83%E6%B0%94%E6%98%AF%E4%B8%8D%E5%8F%AF%E5%86%8D%E7%94%9F%E4%B9%8B%E7%89%A9", - "event_time": "2025/09/01 07:54:31", - "event_time_at": 1756684471, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "南通2:1战胜苏州", - "hot_value": 7670255, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/o4WAaBigTGBaeBgrqm5Kir0Af6DGO0IAF6IQPA~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=uV2f%2FvbzU4Y9DfhXxnPBc3hOAxY%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%8D%97%E9%80%9A2%3A1%E6%88%98%E8%83%9C%E8%8B%8F%E5%B7%9E", - "event_time": "2025/08/31 18:02:42", - "event_time_at": 1756634562, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "起猛了差点以为入冬了", - "hot_value": 7669368, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/ogA5HPw1xiIwS2szhaBPMZvC1P0LAPPQAigEZ~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=UQNTgz2vyL2UMvzVj2gzBmPbM2A%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%B5%B7%E7%8C%9B%E4%BA%86%E5%B7%AE%E7%82%B9%E4%BB%A5%E4%B8%BA%E5%85%A5%E5%86%AC%E4%BA%86", - "event_time": "2025/09/01 14:23:50", - "event_time_at": 1756707830, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "终于轮到我围观军训了", - "hot_value": 7655201, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/oobwIeLUf4O7iiazJOGAQLZO7DRgCDCBLhI2ez~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=WQn5PvdzvIerbF%2B1iNjF3b6itqQ%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%BB%88%E4%BA%8E%E8%BD%AE%E5%88%B0%E6%88%91%E5%9B%B4%E8%A7%82%E5%86%9B%E8%AE%AD%E4%BA%86", - "event_time": "2025/08/31 13:09:34", - "event_time_at": 1756616974, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "金铲铲陪伴是李现最长情的告白", - "hot_value": 7653496, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/oYPAKIM2vpBnPULXOmBbAEac6KzbOhSiILiLP~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=rsA7DcONzMySFGRNa4PMk6ftyBk%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E9%87%91%E9%93%B2%E9%93%B2%E9%99%AA%E4%BC%B4%E6%98%AF%E6%9D%8E%E7%8E%B0%E6%9C%80%E9%95%BF%E6%83%85%E7%9A%84%E5%91%8A%E7%99%BD", - "event_time": "2025/08/31 22:58:48", - "event_time_at": 1756652328, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "张予曦妈妈不介意女儿谈姐弟恋", - "hot_value": 7650811, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oEB5A1NsLFeadA9HQoED9TfmQ8jHgUPxACzjw9~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=KF3nedfpt5iPcUZ%2Fv9SyYI0ZSWg%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%BC%A0%E4%BA%88%E6%9B%A6%E5%A6%88%E5%A6%88%E4%B8%8D%E4%BB%8B%E6%84%8F%E5%A5%B3%E5%84%BF%E8%B0%88%E5%A7%90%E5%BC%9F%E6%81%8B", - "event_time": "2025/08/31 17:44:23", - "event_time_at": 1756633463, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "边伯贤也来刀马刀马了", - "hot_value": 7650164, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/ogfBltLZDIGmRGCAseKAeaIBRnQH79gBGOb4kC~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=nLrGTCoyqEGU882IYRhJOStMdpg%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%BE%B9%E4%BC%AF%E8%B4%A4%E4%B9%9F%E6%9D%A5%E5%88%80%E9%A9%AC%E5%88%80%E9%A9%AC%E4%BA%86", - "event_time": "2025/08/31 13:44:44", - "event_time_at": 1756619084, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "金靖演绎甜美女孩", - "hot_value": 7649913, - "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/o0cBcsRQjiGGFCOOArGzzeIfLBA7FEYojeKwGQ~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=9BY7gGsW39uBcs06t%2BrXTCQ5J5k%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E9%87%91%E9%9D%96%E6%BC%94%E7%BB%8E%E7%94%9C%E7%BE%8E%E5%A5%B3%E5%AD%A9", - "event_time": "2025/08/31 19:00:32", - "event_time_at": 1756638032, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "一口气看日本如何造出反华体制", - "hot_value": 7648850, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oUoyIxcAADE55goYWdhBfFF4HACpRIpy9Xse6K~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=xjjRJGl0AzxkaEnOiVrzRx1hoZ8%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E4%B8%80%E5%8F%A3%E6%B0%94%E7%9C%8B%E6%97%A5%E6%9C%AC%E5%A6%82%E4%BD%95%E9%80%A0%E5%87%BA%E5%8F%8D%E5%8D%8E%E4%BD%93%E5%88%B6", - "event_time": "2025/08/30 21:50:31", - "event_time_at": 1756561831, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "张艺兴真空西装跳狼与美女", - "hot_value": 7646868, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/o4YKfLEIEEwo5stfDSFe0s2TFRjxXAAZDCE9Bl~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=gqBuLvszd8eew81uXP8rf7idtog%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%BC%A0%E8%89%BA%E5%85%B4%E7%9C%9F%E7%A9%BA%E8%A5%BF%E8%A3%85%E8%B7%B3%E7%8B%BC%E4%B8%8E%E7%BE%8E%E5%A5%B3", - "event_time": "2025/08/31 22:12:44", - "event_time_at": 1756649564, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "罗永浩对谈脱口秀新王何广智", - "hot_value": 7644688, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/okQ0qo1AKBQP3g981qQA1FEAzGDYjtFFdfYVeD~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=Mg24ss6tlv%2FY%2B%2B9PS5UdijEG1Dw%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E7%BD%97%E6%B0%B8%E6%B5%A9%E5%AF%B9%E8%B0%88%E8%84%B1%E5%8F%A3%E7%A7%80%E6%96%B0%E7%8E%8B%E4%BD%95%E5%B9%BF%E6%99%BA", - "event_time": "2025/09/01 13:56:14", - "event_time_at": 1756706174, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "周深的刀马刀马好可爱", - "hot_value": 7644052, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/osAPL0laAbWHtEmVBUIKMQDypItTiF3HI0PQi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=qcK3K8uko38iBuRXDg4uCTaqEPc%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%91%A8%E6%B7%B1%E7%9A%84%E5%88%80%E9%A9%AC%E5%88%80%E9%A9%AC%E5%A5%BD%E5%8F%AF%E7%88%B1", - "event_time": "2025/08/31 18:31:56", - "event_time_at": 1756636316, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "杜克一哥的对话太好哭了", - "hot_value": 7639907, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oofoeQ9VAPDsphKEAiFQbQwCAEwoQgBpLtBC0A~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=wulyNlwPrSoIJu1JKBdKpE142mA%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E6%9D%9C%E5%85%8B%E4%B8%80%E5%93%A5%E7%9A%84%E5%AF%B9%E8%AF%9D%E5%A4%AA%E5%A5%BD%E5%93%AD%E4%BA%86", - "event_time": "2025/08/30 21:17:58", - "event_time_at": 1756559878, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "外媒全景记录普京抵华现场", - "hot_value": 7637541, - "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oIGC9LxDIQ6QAI1fG1eEipfA2eZjiGInCHFFEJ~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=HiKj%2FiLGiaN2D5GdS5OlAISbGHo%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E5%A4%96%E5%AA%92%E5%85%A8%E6%99%AF%E8%AE%B0%E5%BD%95%E6%99%AE%E4%BA%AC%E6%8A%B5%E5%8D%8E%E7%8E%B0%E5%9C%BA", - "event_time": "2025/09/01 11:59:34", - "event_time_at": 1756699174, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - }, - { - "title": "赵丽颖工作室明兰代班营业", - "hot_value": 7635755, - "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015c000-ce/oIhHELPBeI6Ieb0A9OpCuWXh0CAAgiuniEweIw~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=xmQOeLdWN4FaeZjFBqtMQuctYv8%3D&from=3218412987", - "link": "https://www.douyin.com/search/%E8%B5%B5%E4%B8%BD%E9%A2%96%E5%B7%A5%E4%BD%9C%E5%AE%A4%E6%98%8E%E5%85%B0%E4%BB%A3%E7%8F%AD%E8%90%A5%E4%B8%9A", - "event_time": "2025/08/31 20:52:34", - "event_time_at": 1756644754, - "active_time": "2025-09-01 16:46:46", - "active_time_at": 1756745206000 - } - ] +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": [ + { + "title": "九三阅兵具体安排公布", + "hot_value": 11821633, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oY1c972B7QzApGweaeQD3fGRo5aLIBrpCAuUSa~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=q01Se46GlLKYNv2klGKP1aM1cT0%3D&from=3218412987", + "link": "https://www.douyin.com/search/%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", + "event_time": "2025/09/01 15:20:34", + "event_time_at": 1756711234, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "九月第一天", + "hot_value": 11327170, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oofTvDaDRCSs4hBFEFVJlAI9BBs0faZAc7IpGf~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=otkowVCSglk%2BS3tPrmBQFq6rIDw%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E4%B9%9D%E6%9C%88%E7%AC%AC%E4%B8%80%E5%A4%A9", + "event_time": "2025/09/01 07:28:57", + "event_time_at": 1756682937, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "遇见上合共享津彩", + "hot_value": 11222444, + "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oIJeINhBDBAiHADD4gi9Ae0CGALg1BqWI7vg0i~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=K%2BaEx5p%2BDv%2B1h3RgNnH0Yb9WT%2B8%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E9%81%87%E8%A7%81%E4%B8%8A%E5%90%88%E5%85%B1%E4%BA%AB%E6%B4%A5%E5%BD%A9", + "event_time": "2025/09/01 11:46:59", + "event_time_at": 1756698419, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "2025年开学第一课铭记与奋斗", + "hot_value": 11078403, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oA9NgVCRBABg7r70pQue8IzAUlfMaXf3hawOIB~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=3xYeXsD6JpXLDOVp6gYRxrvKFaM%3D&from=3218412987", + "link": "https://www.douyin.com/search/2025%E5%B9%B4%E5%BC%80%E5%AD%A6%E7%AC%AC%E4%B8%80%E8%AF%BE%E9%93%AD%E8%AE%B0%E4%B8%8E%E5%A5%8B%E6%96%97", + "event_time": "2025/09/01 11:21:13", + "event_time_at": 1756696873, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "石宇奇首夺世锦赛男单冠军", + "hot_value": 10395092, + "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oAf9IAlEuyE3lFiogfBuQFl8gDFqAoAHtFDNkE~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=tamoorhMGYhajvpmVNdX0TuUuZM%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E7%9F%B3%E5%AE%87%E5%A5%87%E9%A6%96%E5%A4%BA%E4%B8%96%E9%94%A6%E8%B5%9B%E7%94%B7%E5%8D%95%E5%86%A0%E5%86%9B", + "event_time": "2025/09/01 07:47:03", + "event_time_at": 1756684023, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "告别信息裸奔 国家网络身份认证来了", + "hot_value": 10255200, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oskNjrEUQIN9BBRCfeiDTGPE0geX0q6eAAyLr2~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=FrZQSxERPOBd6ktV8K%2Bt%2F3LgJ4A%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%91%8A%E5%88%AB%E4%BF%A1%E6%81%AF%E8%A3%B8%E5%A5%94%20%E5%9B%BD%E5%AE%B6%E7%BD%91%E7%BB%9C%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81%E6%9D%A5%E4%BA%86", + "event_time": "2025/09/01 10:28:41", + "event_time_at": 1756693721, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "记录我的开学第一天", + "hot_value": 9133236, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/owTXhhk40MlJDQHi8P2B07AviaBqAL0VI9EQi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=pTEfiV%2FfsmGuQxNllsV8PqT0RYc%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E8%AE%B0%E5%BD%95%E6%88%91%E7%9A%84%E5%BC%80%E5%AD%A6%E7%AC%AC%E4%B8%80%E5%A4%A9", + "event_time": "2025/09/01 12:43:33", + "event_time_at": 1756701813, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "9月起这些新规开始施行", + "hot_value": 9105252, + "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015/oEE9BseGagtA7JRBmzYA1aRMoCMAeIxfLFY5gA~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=YgH%2BJdVPmi76okIWTRoyEEZ3iDg%3D&from=3218412987", + "link": "https://www.douyin.com/search/9%E6%9C%88%E8%B5%B7%E8%BF%99%E4%BA%9B%E6%96%B0%E8%A7%84%E5%BC%80%E5%A7%8B%E6%96%BD%E8%A1%8C", + "event_time": "2025/09/01 11:48:01", + "event_time_at": 1756698481, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "李幼斌与李云龙跨时空对话", + "hot_value": 8998174, + "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015/oAarINBoAgRIPi9VTEMIfHeA11nDtF7hRDuGcA~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=3x7yTXHYKiIcnNJjznvZjCw%2FW94%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E6%9D%8E%E5%B9%BC%E6%96%8C%E4%B8%8E%E6%9D%8E%E4%BA%91%E9%BE%99%E8%B7%A8%E6%97%B6%E7%A9%BA%E5%AF%B9%E8%AF%9D", + "event_time": "2025/09/01 12:01:05", + "event_time_at": 1756699265, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "幼儿园第一天开学哀嚎一片", + "hot_value": 8962824, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/osbXMAQYgIwwpkDCfeiDpGaE0gb9MXfeAAuLV2~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=w1l8V4VvjuO%2BvOvuQkXiEuXYko0%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%B9%BC%E5%84%BF%E5%9B%AD%E7%AC%AC%E4%B8%80%E5%A4%A9%E5%BC%80%E5%AD%A6%E5%93%80%E5%9A%8E%E4%B8%80%E7%89%87", + "event_time": "2025/09/01 11:05:01", + "event_time_at": 1756695901, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "田汉把国歌歌词写烟盒上系谣传", + "hot_value": 8930615, + "cover": "https://p3-sign.douyinpic.com/tos-cn-i-0813c001/ogA2AoCCXZMEAGF9f9QAlSACKRgfsC2oAFtIgD~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=7%2F8qsoQJd6TgpAEylOW1VyQrqeY%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E7%94%B0%E6%B1%89%E6%8A%8A%E5%9B%BD%E6%AD%8C%E6%AD%8C%E8%AF%8D%E5%86%99%E7%83%9F%E7%9B%92%E4%B8%8A%E7%B3%BB%E8%B0%A3%E4%BC%A0", + "event_time": "2025/09/01 13:51:28", + "event_time_at": 1756705888, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "苏超联赛积分榜", + "hot_value": 8838219, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/o4vPLtWIQAaiggBRkQq5kw9ZlIVA0v1iDAILU~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=JJlPUPmWRzT3UPMenizW639pqVg%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E8%8B%8F%E8%B6%85%E8%81%94%E8%B5%9B%E7%A7%AF%E5%88%86%E6%A6%9C", + "event_time": "2025/08/31 22:01:53", + "event_time_at": 1756648913, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "一切正开始", + "hot_value": 8609507, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/o8wN0EuXoETsyMz0ADCFFaAsFFTQeQf9fAublW~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=5I8uLkfpNYrGArQm%2BXLBa81NhYY%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E4%B8%80%E5%88%87%E6%AD%A3%E5%BC%80%E5%A7%8B", + "event_time": "2025/09/01 11:56:50", + "event_time_at": 1756699010, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "张玉宁为与球迷起冲突致歉", + "hot_value": 8511631, + "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oMfoIAFMN5GEWOzpBCDAQfaj7yRArCdByaEUfE~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=59ipMtNxZ8W3R5NNAJamlSOEbPo%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%BC%A0%E7%8E%89%E5%AE%81%E4%B8%BA%E4%B8%8E%E7%90%83%E8%BF%B7%E8%B5%B7%E5%86%B2%E7%AA%81%E8%87%B4%E6%AD%89", + "event_time": "2025/09/01 07:53:39", + "event_time_at": 1756684419, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "这一口会很疯狂", + "hot_value": 8454971, + "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015/oUIozRIBqC0ahA7FimIAmFEBeqDFfZK3Qfo8PE~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=ZBSuTMuu4678gSfReaVIfdK22J8%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E8%BF%99%E4%B8%80%E5%8F%A3%E4%BC%9A%E5%BE%88%E7%96%AF%E7%8B%82", + "event_time": "2025/09/01 10:36:16", + "event_time_at": 1756694176, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "邓超鹿晗合唱超级英雄", + "hot_value": 8357197, + "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oUBPIdtyQx0j8THRZAmZbyATihavQHI0niLIP~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=%2F66dsj8evHN94wNNFCn%2Bfhagee0%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E9%82%93%E8%B6%85%E9%B9%BF%E6%99%97%E5%90%88%E5%94%B1%E8%B6%85%E7%BA%A7%E8%8B%B1%E9%9B%84", + "event_time": "2025/09/01 07:45:11", + "event_time_at": 1756683911, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "伊萨克加盟利物浦", + "hot_value": 7963081, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/ocAw2yaT4I99iDIPh9I3LaIiLBTnBASvH0Q1a~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=v4Gq0Iz87wyZ6lEYYOnKmaeur%2FM%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E4%BC%8A%E8%90%A8%E5%85%8B%E5%8A%A0%E7%9B%9F%E5%88%A9%E7%89%A9%E6%B5%A6", + "event_time": "2025/09/01 09:12:12", + "event_time_at": 1756689132, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "山东泰山6:0北京国安", + "hot_value": 7830358, + "cover": "https://p9-sign.douyinpic.com/tos-cn-p-0015/ogtA9BEEJZDJ9SgzBBLfFN0AflNDGoIAQ2I8A8~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=gu6O%2BhGDarr%2BHQe1P%2BHo9pUmBGU%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%B1%B1%E4%B8%9C%E6%B3%B0%E5%B1%B16%3A0%E5%8C%97%E4%BA%AC%E5%9B%BD%E5%AE%89", + "event_time": "2025/08/31 20:32:53", + "event_time_at": 1756643573, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "又到开学你包书皮了吗", + "hot_value": 7828995, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oUAwaPjCIiLAQI6ADQMAm06TBJxPJFAkCpIIi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=aUkYTtkfaUKbK2DhznXU69sg8SU%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%8F%88%E5%88%B0%E5%BC%80%E5%AD%A6%E4%BD%A0%E5%8C%85%E4%B9%A6%E7%9A%AE%E4%BA%86%E5%90%97", + "event_time": "2025/08/31 17:04:09", + "event_time_at": 1756631049, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "樊振东德甲首秀两连败", + "hot_value": 7754365, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/osOdEdibznClYwP0AABAIZW1eg0gbBmAzjiJfl~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=AyWBGXt%2FFFSp0QBM%2Bd5%2F9B4GPvo%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E6%A8%8A%E6%8C%AF%E4%B8%9C%E5%BE%B7%E7%94%B2%E9%A6%96%E7%A7%80%E4%B8%A4%E8%BF%9E%E8%B4%A5", + "event_time": "2025/09/01 07:16:58", + "event_time_at": 1756682218, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "为什么说00后的童年含金量高", + "hot_value": 7735122, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/ogOQEQsnAACDBICh7LeFWRGCjeZneIB9I3oVFy~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=Htnqu7SupC%2FmvQpF2DDsLDh5FYA%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%AF%B400%E5%90%8E%E7%9A%84%E7%AB%A5%E5%B9%B4%E5%90%AB%E9%87%91%E9%87%8F%E9%AB%98", + "event_time": "2025/08/31 16:38:30", + "event_time_at": 1756629510, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "刘宇千年直拍", + "hot_value": 7734149, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/ostjBSmQ78E8estIXgFlHQxZQALRFfMepbTJWC~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=CPNw9h%2BpBB82qBykpuT11uMVFjo%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%88%98%E5%AE%87%E5%8D%83%E5%B9%B4%E7%9B%B4%E6%8B%8D", + "event_time": "2025/08/31 21:39:38", + "event_time_at": 1756647578, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "胡塞武装称将对以军袭击发起报复", + "hot_value": 7728698, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oseWgjCRBAfgft7c3QUm8JGApnYMaWdJdGj0SB~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=fX6AvTWQvNrihcvEraPHjJIS9iY%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E8%83%A1%E5%A1%9E%E6%AD%A6%E8%A3%85%E7%A7%B0%E5%B0%86%E5%AF%B9%E4%BB%A5%E5%86%9B%E8%A2%AD%E5%87%BB%E5%8F%91%E8%B5%B7%E6%8A%A5%E5%A4%8D", + "event_time": "2025/09/01 09:40:13", + "event_time_at": 1756690813, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "手把手教你手机变车机", + "hot_value": 7725104, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/o47qAXUjDQN6KLr9AjFSCq92ZBf4okAQEfgSAp~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=OoNNciUVTOwZbl17IUYBOjFyBJ4%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E6%89%8B%E6%8A%8A%E6%89%8B%E6%95%99%E4%BD%A0%E6%89%8B%E6%9C%BA%E5%8F%98%E8%BD%A6%E6%9C%BA", + "event_time": "2025/09/01 11:15:15", + "event_time_at": 1756696515, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "莫迪与普京拥抱手拉手热聊", + "hot_value": 7723445, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oIaWAojVPLRUILGIyvvg1Sd1ZiLAKiCB6zQIX~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=u1IGnKz%2FAckLe%2BYFCQulFw0ioB8%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E8%8E%AB%E8%BF%AA%E4%B8%8E%E6%99%AE%E4%BA%AC%E6%8B%A5%E6%8A%B1%E6%89%8B%E6%8B%89%E6%89%8B%E7%83%AD%E8%81%8A", + "event_time": "2025/09/01 15:38:27", + "event_time_at": 1756712307, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "原来猪猪侠搞抽象领先我20年", + "hot_value": 7706786, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oINGyAfS2oFpfAgF2kYxEJAqTbSeEcgotfxeHv~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=S1Ve0ORP5%2BrHumx%2FK7uJbfm8PbM%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%8E%9F%E6%9D%A5%E7%8C%AA%E7%8C%AA%E4%BE%A0%E6%90%9E%E6%8A%BD%E8%B1%A1%E9%A2%86%E5%85%88%E6%88%9120%E5%B9%B4", + "event_time": "2025/09/01 10:52:59", + "event_time_at": 1756695179, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "北京国安就惨败道歉", + "hot_value": 7702358, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oYiXICjfn7uEi3AeK6W04BiXu3iBjigAAs9W0B~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=hgh%2Bfy4Ul82LWgXAL2hkIBMEpJM%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%8C%97%E4%BA%AC%E5%9B%BD%E5%AE%89%E5%B0%B1%E6%83%A8%E8%B4%A5%E9%81%93%E6%AD%89", + "event_time": "2025/09/01 09:21:10", + "event_time_at": 1756689670, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "港姐冠军陈咏诗是博士生", + "hot_value": 7702059, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/okoRaMGvQBCI6KmVeBAAQ1eLEg1HK2foQuM7aB~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=5Lattu1v38oeQ8xGdXiDLcK4fwM%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E6%B8%AF%E5%A7%90%E5%86%A0%E5%86%9B%E9%99%88%E5%92%8F%E8%AF%97%E6%98%AF%E5%8D%9A%E5%A3%AB%E7%94%9F", + "event_time": "2025/09/01 10:47:23", + "event_time_at": 1756694843, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "王楚钦2:3徐瑛彬", + "hot_value": 7699514, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/o00BTIi1ogMR8LBAiQdLmSaIPAuEyIQv1IP48~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=2%2BI5KkQpEugBkQcVCrSLgOtC088%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E7%8E%8B%E6%A5%9A%E9%92%A62%3A3%E5%BE%90%E7%91%9B%E5%BD%AC", + "event_time": "2025/08/31 21:21:08", + "event_time_at": 1756646468, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "王源 高音", + "hot_value": 7693290, + "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015/oYzDIaQiavwPRBUpanIkjAIWzwLCIgPkAyiOj~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=uXVN6xfkB3tz3iVo0DQuxqeaGk0%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E7%8E%8B%E6%BA%90%20%E9%AB%98%E9%9F%B3", + "event_time": "2025/08/31 20:30:04", + "event_time_at": 1756643404, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "俄乌在苏贾前线展开阵地争夺", + "hot_value": 7691808, + "cover": "https://p9-sign.douyinpic.com/tos-cn-p-0015/oo7iATIG8vA5hIIQBILB4oCgvygsUNzBS1aPi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=SNzQbbxAJqqtdIkck9kvtRUJnZg%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E4%BF%84%E4%B9%8C%E5%9C%A8%E8%8B%8F%E8%B4%BE%E5%89%8D%E7%BA%BF%E5%B1%95%E5%BC%80%E9%98%B5%E5%9C%B0%E4%BA%89%E5%A4%BA", + "event_time": "2025/09/01 12:56:05", + "event_time_at": 1756702565, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "范丞丞温柔版一个人的夜变装", + "hot_value": 7689433, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oAPLWIAoR3CsXgVBuIQIRiTDyS14gaLPwELAi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=yp9l95J9xlKf55IEP14P7sD7J%2F4%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E8%8C%83%E4%B8%9E%E4%B8%9E%E6%B8%A9%E6%9F%94%E7%89%88%E4%B8%80%E4%B8%AA%E4%BA%BA%E7%9A%84%E5%A4%9C%E5%8F%98%E8%A3%85", + "event_time": "2025/09/01 15:32:00", + "event_time_at": 1756711920, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "用美食致敬这场胜利", + "hot_value": 7681826, + "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oIFcUfHotAXxALhJEj2EK9SBNp0fQwKhAbCgQD~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=Dkuyg5REqCAMEIsp0Dr%2B%2BkAO%2BmQ%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E7%94%A8%E7%BE%8E%E9%A3%9F%E8%87%B4%E6%95%AC%E8%BF%99%E5%9C%BA%E8%83%9C%E5%88%A9", + "event_time": "2025/09/01 12:08:24", + "event_time_at": 1756699704, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "田曦薇猫猫本体藏不住了", + "hot_value": 7674729, + "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015c000-ce/oceyeLnbxAXFERxnPfLR2egAkYaXeRpHfhAQME~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=omEVZta%2FQeV%2FSBRNZ3%2BJF0iMXPQ%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E7%94%B0%E6%9B%A6%E8%96%87%E7%8C%AB%E7%8C%AB%E6%9C%AC%E4%BD%93%E8%97%8F%E4%B8%8D%E4%BD%8F%E4%BA%86", + "event_time": "2025/09/01 14:33:25", + "event_time_at": 1756708405, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "少年心气是不可再生之物", + "hot_value": 7673518, + "cover": "https://p3-sign.douyinpic.com/tos-cn-i-0813c001/oAUJIWFyAFCmtGpmAADAQis69JogkCFAA0Eqff~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=YHeldSJZXPEBMLF2i%2Bj%2Fc60oKsQ%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%B0%91%E5%B9%B4%E5%BF%83%E6%B0%94%E6%98%AF%E4%B8%8D%E5%8F%AF%E5%86%8D%E7%94%9F%E4%B9%8B%E7%89%A9", + "event_time": "2025/09/01 07:54:31", + "event_time_at": 1756684471, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "南通2:1战胜苏州", + "hot_value": 7670255, + "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/o4WAaBigTGBaeBgrqm5Kir0Af6DGO0IAF6IQPA~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=uV2f%2FvbzU4Y9DfhXxnPBc3hOAxY%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%8D%97%E9%80%9A2%3A1%E6%88%98%E8%83%9C%E8%8B%8F%E5%B7%9E", + "event_time": "2025/08/31 18:02:42", + "event_time_at": 1756634562, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "起猛了差点以为入冬了", + "hot_value": 7669368, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/ogA5HPw1xiIwS2szhaBPMZvC1P0LAPPQAigEZ~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=UQNTgz2vyL2UMvzVj2gzBmPbM2A%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E8%B5%B7%E7%8C%9B%E4%BA%86%E5%B7%AE%E7%82%B9%E4%BB%A5%E4%B8%BA%E5%85%A5%E5%86%AC%E4%BA%86", + "event_time": "2025/09/01 14:23:50", + "event_time_at": 1756707830, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "终于轮到我围观军训了", + "hot_value": 7655201, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/oobwIeLUf4O7iiazJOGAQLZO7DRgCDCBLhI2ez~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=WQn5PvdzvIerbF%2B1iNjF3b6itqQ%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E7%BB%88%E4%BA%8E%E8%BD%AE%E5%88%B0%E6%88%91%E5%9B%B4%E8%A7%82%E5%86%9B%E8%AE%AD%E4%BA%86", + "event_time": "2025/08/31 13:09:34", + "event_time_at": 1756616974, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "金铲铲陪伴是李现最长情的告白", + "hot_value": 7653496, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/oYPAKIM2vpBnPULXOmBbAEac6KzbOhSiILiLP~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=rsA7DcONzMySFGRNa4PMk6ftyBk%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E9%87%91%E9%93%B2%E9%93%B2%E9%99%AA%E4%BC%B4%E6%98%AF%E6%9D%8E%E7%8E%B0%E6%9C%80%E9%95%BF%E6%83%85%E7%9A%84%E5%91%8A%E7%99%BD", + "event_time": "2025/08/31 22:58:48", + "event_time_at": 1756652328, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "张予曦妈妈不介意女儿谈姐弟恋", + "hot_value": 7650811, + "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oEB5A1NsLFeadA9HQoED9TfmQ8jHgUPxACzjw9~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=KF3nedfpt5iPcUZ%2Fv9SyYI0ZSWg%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%BC%A0%E4%BA%88%E6%9B%A6%E5%A6%88%E5%A6%88%E4%B8%8D%E4%BB%8B%E6%84%8F%E5%A5%B3%E5%84%BF%E8%B0%88%E5%A7%90%E5%BC%9F%E6%81%8B", + "event_time": "2025/08/31 17:44:23", + "event_time_at": 1756633463, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "边伯贤也来刀马刀马了", + "hot_value": 7650164, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/ogfBltLZDIGmRGCAseKAeaIBRnQH79gBGOb4kC~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=nLrGTCoyqEGU882IYRhJOStMdpg%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E8%BE%B9%E4%BC%AF%E8%B4%A4%E4%B9%9F%E6%9D%A5%E5%88%80%E9%A9%AC%E5%88%80%E9%A9%AC%E4%BA%86", + "event_time": "2025/08/31 13:44:44", + "event_time_at": 1756619084, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "金靖演绎甜美女孩", + "hot_value": 7649913, + "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/o0cBcsRQjiGGFCOOArGzzeIfLBA7FEYojeKwGQ~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=9BY7gGsW39uBcs06t%2BrXTCQ5J5k%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E9%87%91%E9%9D%96%E6%BC%94%E7%BB%8E%E7%94%9C%E7%BE%8E%E5%A5%B3%E5%AD%A9", + "event_time": "2025/08/31 19:00:32", + "event_time_at": 1756638032, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "一口气看日本如何造出反华体制", + "hot_value": 7648850, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oUoyIxcAADE55goYWdhBfFF4HACpRIpy9Xse6K~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=xjjRJGl0AzxkaEnOiVrzRx1hoZ8%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E4%B8%80%E5%8F%A3%E6%B0%94%E7%9C%8B%E6%97%A5%E6%9C%AC%E5%A6%82%E4%BD%95%E9%80%A0%E5%87%BA%E5%8F%8D%E5%8D%8E%E4%BD%93%E5%88%B6", + "event_time": "2025/08/30 21:50:31", + "event_time_at": 1756561831, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "张艺兴真空西装跳狼与美女", + "hot_value": 7646868, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/o4YKfLEIEEwo5stfDSFe0s2TFRjxXAAZDCE9Bl~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=gqBuLvszd8eew81uXP8rf7idtog%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%BC%A0%E8%89%BA%E5%85%B4%E7%9C%9F%E7%A9%BA%E8%A5%BF%E8%A3%85%E8%B7%B3%E7%8B%BC%E4%B8%8E%E7%BE%8E%E5%A5%B3", + "event_time": "2025/08/31 22:12:44", + "event_time_at": 1756649564, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "罗永浩对谈脱口秀新王何广智", + "hot_value": 7644688, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/okQ0qo1AKBQP3g981qQA1FEAzGDYjtFFdfYVeD~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=Mg24ss6tlv%2FY%2B%2B9PS5UdijEG1Dw%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E7%BD%97%E6%B0%B8%E6%B5%A9%E5%AF%B9%E8%B0%88%E8%84%B1%E5%8F%A3%E7%A7%80%E6%96%B0%E7%8E%8B%E4%BD%95%E5%B9%BF%E6%99%BA", + "event_time": "2025/09/01 13:56:14", + "event_time_at": 1756706174, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "周深的刀马刀马好可爱", + "hot_value": 7644052, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/osAPL0laAbWHtEmVBUIKMQDypItTiF3HI0PQi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=qcK3K8uko38iBuRXDg4uCTaqEPc%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%91%A8%E6%B7%B1%E7%9A%84%E5%88%80%E9%A9%AC%E5%88%80%E9%A9%AC%E5%A5%BD%E5%8F%AF%E7%88%B1", + "event_time": "2025/08/31 18:31:56", + "event_time_at": 1756636316, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "杜克一哥的对话太好哭了", + "hot_value": 7639907, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oofoeQ9VAPDsphKEAiFQbQwCAEwoQgBpLtBC0A~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=wulyNlwPrSoIJu1JKBdKpE142mA%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E6%9D%9C%E5%85%8B%E4%B8%80%E5%93%A5%E7%9A%84%E5%AF%B9%E8%AF%9D%E5%A4%AA%E5%A5%BD%E5%93%AD%E4%BA%86", + "event_time": "2025/08/30 21:17:58", + "event_time_at": 1756559878, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "外媒全景记录普京抵华现场", + "hot_value": 7637541, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oIGC9LxDIQ6QAI1fG1eEipfA2eZjiGInCHFFEJ~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=HiKj%2FiLGiaN2D5GdS5OlAISbGHo%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%A4%96%E5%AA%92%E5%85%A8%E6%99%AF%E8%AE%B0%E5%BD%95%E6%99%AE%E4%BA%AC%E6%8A%B5%E5%8D%8E%E7%8E%B0%E5%9C%BA", + "event_time": "2025/09/01 11:59:34", + "event_time_at": 1756699174, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "赵丽颖工作室明兰代班营业", + "hot_value": 7635755, + "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015c000-ce/oIhHELPBeI6Ieb0A9OpCuWXh0CAAgiuniEweIw~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=xmQOeLdWN4FaeZjFBqtMQuctYv8%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E8%B5%B5%E4%B8%BD%E9%A2%96%E5%B7%A5%E4%BD%9C%E5%AE%A4%E6%98%8E%E5%85%B0%E4%BB%A3%E7%8F%AD%E8%90%A5%E4%B8%9A", + "event_time": "2025/08/31 20:52:34", + "event_time_at": 1756644754, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + } + ] } \ 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 38b225b0..e84677ca 100644 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/css/background.css +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/css/background.css @@ -76,4 +76,4 @@ top: 55%; left: 48%; } -} +} diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/css/style.css b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/css/style.css index c419cfdd..da392817 100644 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/css/style.css +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/css/style.css @@ -429,4 +429,4 @@ body { transition-duration: 0.01ms !important; scroll-behavior: auto !important; } -} +} diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/index.html index cbe589f8..f49ef244 100644 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/index.html +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/index.html @@ -64,4 +64,4 @@ - + diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/js/main.js b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/js/main.js index b0653db8..8cfa5195 100644 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/js/main.js +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/js/main.js @@ -294,4 +294,4 @@ if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", init); } else { init(); -} +} diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/返回接口.json index 7a06cb86..9651c7d3 100644 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/返回接口.json +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电影实时票房/返回接口.json @@ -1,1861 +1,1861 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "title": "实时大盘", - "show_count_desc": "35.4万", - "view_count_desc": "73.2万", - "split_box_office": "2669.5", - "split_box_office_unit": "万", - "box_office": "2669.5", - "box_office_unit": "万", - "update_gap_second": 5, - "updated": "2025-09-26 08:02:00", - "updated_at": 1758873720693, - "list": [ - { - "movie_id": 1207331, - "movie_name": "731", - "release_info": "上映9天", - "box_office": "1791.41", - "box_office_unit": "万", - "box_office_desc": "1791.41万", - "box_office_rate": "67.1%", - "split_box_office": "1686.17", - "split_box_office_unit": "万", - "split_box_office_desc": "1686.17万", - "split_box_office_rate": "67.2%", - "show_count": 206074, - "show_count_rate": "58.2%", - "avg_show_view": "2.4", - "avg_seat_view": "1.7%", - "sum_box_desc": "13.86亿", - "sum_split_box_desc": "12.59亿" - }, - { - "movie_id": 1505571, - "movie_name": "捕风追影", - "release_info": "上映42天", - "box_office": "226.43", - "box_office_unit": "万", - "box_office_desc": "226.43万", - "box_office_rate": "8.4%", - "split_box_office": "202.53", - "split_box_office_unit": "万", - "split_box_office_desc": "202.53万", - "split_box_office_rate": "8.0%", - "show_count": 44432, - "show_count_rate": "12.5%", - "avg_show_view": "1.4", - "avg_seat_view": "1.3%", - "sum_box_desc": "12.06亿", - "sum_split_box_desc": "10.71亿" - }, - { - "movie_id": 1531082, - "movie_name": "窗外是蓝星", - "release_info": "上映22天", - "box_office": "102.39", - "box_office_unit": "万", - "box_office_desc": "102.39万", - "box_office_rate": "3.8%", - "split_box_office": "100.65", - "split_box_office_unit": "万", - "split_box_office_desc": "100.65万", - "split_box_office_rate": "4.0%", - "show_count": 5681, - "show_count_rate": "1.6%", - "avg_show_view": "5.0", - "avg_seat_view": "4.7%", - "sum_box_desc": "3807.1万", - "sum_split_box_desc": "3634.0万" - }, - { - "movie_id": 1515448, - "movie_name": "浪浪山小妖怪", - "release_info": "上映56天", - "box_office": "88.95", - "box_office_unit": "万", - "box_office_desc": "88.95万", - "box_office_rate": "3.3%", - "split_box_office": "78.92", - "split_box_office_unit": "万", - "split_box_office_desc": "78.92万", - "split_box_office_rate": "3.1%", - "show_count": 28121, - "show_count_rate": "7.9%", - "avg_show_view": "0.9", - "avg_seat_view": "0.8%", - "sum_box_desc": "16.41亿", - "sum_split_box_desc": "14.66亿" - }, - { - "movie_id": 1522657, - "movie_name": "南京照相馆", - "release_info": "上映64天", - "box_office": "82.47", - "box_office_unit": "万", - "box_office_desc": "82.47万", - "box_office_rate": "3.0%", - "split_box_office": "77.50", - "split_box_office_unit": "万", - "split_box_office_desc": "77.50万", - "split_box_office_rate": "3.0%", - "show_count": 19778, - "show_count_rate": "5.5%", - "avg_show_view": "1.2", - "avg_seat_view": "1.2%", - "sum_box_desc": "30.03亿", - "sum_split_box_desc": "26.94亿" - }, - { - "movie_id": 1547369, - "movie_name": "红丝绸", - "release_info": "上映21天", - "box_office": "60.55", - "box_office_unit": "万", - "box_office_desc": "60.55万", - "box_office_rate": "2.2%", - "split_box_office": "60.35", - "split_box_office_unit": "万", - "split_box_office_desc": "60.35万", - "split_box_office_rate": "2.4%", - "show_count": 313, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "50.9", - "avg_seat_view": "46.8%", - "sum_box_desc": "1114.9万", - "sum_split_box_desc": "1095.2万" - }, - { - "movie_id": 1536837, - "movie_name": "营救飞虎", - "release_info": "上映24天", - "box_office": "35.54", - "box_office_unit": "万", - "box_office_desc": "35.54万", - "box_office_rate": "1.3%", - "split_box_office": "35.42", - "split_box_office_unit": "万", - "split_box_office_desc": "35.42万", - "split_box_office_rate": "1.4%", - "show_count": 257, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "32.9", - "avg_seat_view": "32.4%", - "sum_box_desc": "2456.3万", - "sum_split_box_desc": "2431.0万" - }, - { - "movie_id": 1298226, - "movie_name": "死神来了:血脉诅咒", - "release_info": "上映36天", - "box_office": "31.42", - "box_office_unit": "万", - "box_office_desc": "31.42万", - "box_office_rate": "1.1%", - "split_box_office": "27.59", - "split_box_office_unit": "万", - "split_box_office_desc": "27.59万", - "split_box_office_rate": "1.1%", - "show_count": 9723, - "show_count_rate": "2.7%", - "avg_show_view": "0.8", - "avg_seat_view": "0.8%", - "sum_box_desc": "1.91亿", - "sum_split_box_desc": "1.69亿" - }, - { - "movie_id": 1523743, - "movie_name": "坏蛋联盟2", - "release_info": "上映42天", - "box_office": "28.70", - "box_office_unit": "万", - "box_office_desc": "28.70万", - "box_office_rate": "1.0%", - "split_box_office": "27.49", - "split_box_office_unit": "万", - "split_box_office_desc": "27.49万", - "split_box_office_rate": "1.0%", - "show_count": 4622, - "show_count_rate": "1.3%", - "avg_show_view": "1.2", - "avg_seat_view": "1.3%", - "sum_box_desc": "1.98亿", - "sum_split_box_desc": "1.78亿" - }, - { - "movie_id": 1499675, - "movie_name": "毕正明的证明", - "release_info": "点映", - "box_office": "25.80", - "box_office_unit": "万", - "box_office_desc": "25.80万", - "box_office_rate": "0.9%", - "split_box_office": "25.59", - "split_box_office_unit": "万", - "split_box_office_desc": "25.59万", - "split_box_office_rate": "1.0%", - "show_count": 28, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "157.6", - "avg_seat_view": "100.0%", - "sum_box_desc": "25.8万", - "sum_split_box_desc": "25.5万" - }, - { - "movie_id": 1572273, - "movie_name": "山河为证", - "release_info": "上映43天", - "box_office": "24.89", - "box_office_unit": "万", - "box_office_desc": "24.89万", - "box_office_rate": "0.9%", - "split_box_office": "24.88", - "split_box_office_unit": "万", - "split_box_office_desc": "24.88万", - "split_box_office_rate": "0.9%", - "show_count": 126, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "44.3", - "avg_seat_view": "37.1%", - "sum_box_desc": "2904.6万", - "sum_split_box_desc": "2894.9万" - }, - { - "movie_id": 1250679, - "movie_name": "洛桑的家事", - "release_info": "上映16天", - "box_office": "20.09", - "box_office_unit": "万", - "box_office_desc": "20.09万", - "box_office_rate": "0.7%", - "split_box_office": "20.08", - "split_box_office_unit": "万", - "split_box_office_desc": "20.08万", - "split_box_office_rate": "0.8%", - "show_count": 167, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "22.4", - "avg_seat_view": "20.7%", - "sum_box_desc": "519.8万", - "sum_split_box_desc": "517.7万" - }, - { - "movie_id": 1542730, - "movie_name": "奇遇", - "release_info": "上映50天", - "box_office": "16.11", - "box_office_unit": "万", - "box_office_desc": "16.11万", - "box_office_rate": "0.6%", - "split_box_office": "13.96", - "split_box_office_unit": "万", - "split_box_office_desc": "13.96万", - "split_box_office_rate": "0.5%", - "show_count": 4473, - "show_count_rate": "1.2%", - "avg_show_view": "1.1", - "avg_seat_view": "1.3%", - "sum_box_desc": "1.86亿", - "sum_split_box_desc": "1.63亿" - }, - { - "movie_id": 1500636, - "movie_name": "罗小黑战记2", - "release_info": "上映71天", - "box_office": "15.94", - "box_office_unit": "万", - "box_office_desc": "15.94万", - "box_office_rate": "0.5%", - "split_box_office": "14.14", - "split_box_office_unit": "万", - "split_box_office_desc": "14.14万", - "split_box_office_rate": "0.5%", - "show_count": 3761, - "show_count_rate": "1.0%", - "avg_show_view": "1.1", - "avg_seat_view": "1.2%", - "sum_box_desc": "5.21亿", - "sum_split_box_desc": "4.64亿" - }, - { - "movie_id": 1489329, - "movie_name": "浪浪人生", - "release_info": "点映", - "box_office": "15.34", - "box_office_unit": "万", - "box_office_desc": "15.34万", - "box_office_rate": "0.5%", - "split_box_office": "15.34", - "split_box_office_unit": "万", - "split_box_office_desc": "15.34万", - "split_box_office_rate": "0.6%", - "show_count": 19, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "143.8", - "avg_seat_view": "84.7%", - "sum_box_desc": "69.2万", - "sum_split_box_desc": "66.7万" - }, - { - "movie_id": 1454962, - "movie_name": "F1:狂飙飞车", - "release_info": "上映92天", - "box_office": "13.84", - "box_office_unit": "万", - "box_office_desc": "13.84万", - "box_office_rate": "0.5%", - "split_box_office": "12.42", - "split_box_office_unit": "万", - "split_box_office_desc": "12.42万", - "split_box_office_rate": "0.4%", - "show_count": 979, - "show_count_rate": "0.2%", - "avg_show_view": "2.5", - "avg_seat_view": "1.5%", - "sum_box_desc": "4.41亿", - "sum_split_box_desc": "3.94亿" - }, - { - "movie_id": 1584781, - "movie_name": "生还", - "release_info": "上映24天", - "box_office": "12.97", - "box_office_unit": "万", - "box_office_desc": "12.97万", - "box_office_rate": "0.4%", - "split_box_office": "12.94", - "split_box_office_unit": "万", - "split_box_office_desc": "12.94万", - "split_box_office_rate": "0.5%", - "show_count": 115, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "29.4", - "avg_seat_view": "26.0%", - "sum_box_desc": "358.2万", - "sum_split_box_desc": "354.7万" - }, - { - "movie_id": 1552050, - "movie_name": "汉斯·季默与朋友们:沙漠之钻音乐会", - "release_info": "上映7天", - "box_office": "9.52", - "box_office_unit": "万", - "box_office_desc": "9.52万", - "box_office_rate": "0.3%", - "split_box_office": "8.50", - "split_box_office_unit": "万", - "split_box_office_desc": "8.50万", - "split_box_office_rate": "0.3%", - "show_count": 822, - "show_count_rate": "0.2%", - "avg_show_view": "2.4", - "avg_seat_view": "1.8%", - "sum_box_desc": "181.7万", - "sum_split_box_desc": "164.7万" - }, - { - "movie_id": 343898, - "movie_name": "东极岛", - "release_info": "上映50天", - "box_office": "9.05", - "box_office_unit": "万", - "box_office_desc": "9.05万", - "box_office_rate": "0.3%", - "split_box_office": "8.67", - "split_box_office_unit": "万", - "split_box_office_desc": "8.67万", - "split_box_office_rate": "0.3%", - "show_count": 1837, - "show_count_rate": "0.5%", - "avg_show_view": "1.3", - "avg_seat_view": "1.4%", - "sum_box_desc": "3.96亿", - "sum_split_box_desc": "3.54亿" - }, - { - "movie_id": 1520596, - "movie_name": "轻于鸿毛", - "release_info": "上映14天", - "box_office": "8.85", - "box_office_unit": "万", - "box_office_desc": "8.85万", - "box_office_rate": "0.3%", - "split_box_office": "8.14", - "split_box_office_unit": "万", - "split_box_office_desc": "8.14万", - "split_box_office_rate": "0.3%", - "show_count": 4420, - "show_count_rate": "1.2%", - "avg_show_view": "0.5", - "avg_seat_view": "0.6%", - "sum_box_desc": "1479.7万", - "sum_split_box_desc": "1325.2万" - }, - { - "movie_id": 431882, - "movie_name": "新三峡", - "release_info": "上映93天", - "box_office": "4.82", - "box_office_unit": "万", - "box_office_desc": "4.82万", - "box_office_rate": "0.1%", - "split_box_office": "4.82", - "split_box_office_unit": "万", - "split_box_office_desc": "4.82万", - "split_box_office_rate": "0.1%", - "show_count": 12, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "78.9", - "avg_seat_view": "38.8%", - "sum_box_desc": "893.9万", - "sum_split_box_desc": "891.7万" - }, - { - "movie_id": 1511555, - "movie_name": "有朵云像你", - "release_info": "上映29天", - "box_office": "4.78", - "box_office_unit": "万", - "box_office_desc": "4.78万", - "box_office_rate": "0.1%", - "split_box_office": "4.09", - "split_box_office_unit": "万", - "split_box_office_desc": "4.09万", - "split_box_office_rate": "0.1%", - "show_count": 2017, - "show_count_rate": "0.5%", - "avg_show_view": "0.7", - "avg_seat_view": "0.8%", - "sum_box_desc": "5131.8万", - "sum_split_box_desc": "4540.4万" - }, - { - "movie_id": 1489326, - "movie_name": "7天", - "release_info": "上映29天", - "box_office": "4.19", - "box_office_unit": "万", - "box_office_desc": "4.19万", - "box_office_rate": "0.1%", - "split_box_office": "4.01", - "split_box_office_unit": "万", - "split_box_office_desc": "4.01万", - "split_box_office_rate": "0.1%", - "show_count": 842, - "show_count_rate": "0.2%", - "avg_show_view": "1.3", - "avg_seat_view": "1.6%", - "sum_box_desc": "6214.2万", - "sum_split_box_desc": "5481.7万" - }, - { - "movie_id": 1538211, - "movie_name": "临时决斗", - "release_info": "上映8天", - "box_office": "4.04", - "box_office_unit": "万", - "box_office_desc": "4.04万", - "box_office_rate": "0.1%", - "split_box_office": "3.73", - "split_box_office_unit": "万", - "split_box_office_desc": "3.73万", - "split_box_office_rate": "0.1%", - "show_count": 1843, - "show_count_rate": "0.5%", - "avg_show_view": "0.6", - "avg_seat_view": "0.6%", - "sum_box_desc": "126.1万", - "sum_split_box_desc": "112.0万" - }, - { - "movie_id": 1523868, - "movie_name": "三国的星空第一部", - "release_info": "点映", - "box_office": "3.36", - "box_office_unit": "万", - "box_office_desc": "3.36万", - "box_office_rate": "0.1%", - "split_box_office": "3.19", - "split_box_office_unit": "万", - "split_box_office_desc": "3.19万", - "split_box_office_rate": "0.1%", - "show_count": 3, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "261.0", - "avg_seat_view": "94.6%", - "sum_box_desc": "13.8万", - "sum_split_box_desc": "13.6万" - }, - { - "movie_id": 1547424, - "movie_name": "关于约会的一切", - "release_info": "上映22天", - "box_office": "3.15", - "box_office_unit": "万", - "box_office_desc": "3.15万", - "box_office_rate": "0.1%", - "split_box_office": "2.83", - "split_box_office_unit": "万", - "split_box_office_desc": "2.83万", - "split_box_office_rate": "0.1%", - "show_count": 441, - "show_count_rate": "0.1%", - "avg_show_view": "1.6", - "avg_seat_view": "1.5%", - "sum_box_desc": "381.5万", - "sum_split_box_desc": "342.6万" - }, - { - "movie_id": 1593640, - "movie_name": "疯狂电脑城", - "release_info": "点映", - "box_office": "3.07", - "box_office_unit": "万", - "box_office_desc": "3.07万", - "box_office_rate": "0.1%", - "split_box_office": "3.01", - "split_box_office_unit": "万", - "split_box_office_desc": "3.01万", - "split_box_office_rate": "0.1%", - "show_count": 10, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "101.0", - "avg_seat_view": "98.9%", - "sum_box_desc": "3.0万", - "sum_split_box_desc": "3.0万" - }, - { - "movie_id": 1462786, - "movie_name": "爱心之拳", - "release_info": "上映29天", - "box_office": "2.84", - "box_office_unit": "万", - "box_office_desc": "2.84万", - "box_office_rate": "0.1%", - "split_box_office": "2.84", - "split_box_office_unit": "万", - "split_box_office_desc": "2.84万", - "split_box_office_rate": "0.1%", - "show_count": 14, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "101.5", - "avg_seat_view": "27.0%", - "sum_box_desc": "93.6万", - "sum_split_box_desc": "93.6万" - }, - { - "movie_id": 1575780, - "movie_name": "蛟龙行动(特别版)", - "release_info": "上映28天", - "box_office": "2.79", - "box_office_unit": "万", - "box_office_desc": "2.79万", - "box_office_rate": "0.1%", - "split_box_office": "2.69", - "split_box_office_unit": "万", - "split_box_office_desc": "2.69万", - "split_box_office_rate": "0.1%", - "show_count": 952, - "show_count_rate": "0.2%", - "avg_show_view": "0.7", - "avg_seat_view": "0.7%", - "sum_box_desc": "2463.4万", - "sum_split_box_desc": "2194.8万" - }, - { - "movie_id": 1591480, - "movie_name": "白马姐妹", - "release_info": "", - "box_office": "2.09", - "box_office_unit": "万", - "box_office_desc": "2.09万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "2.09", - "split_box_office_unit": "万", - "split_box_office_desc": "2.09万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 2, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "418.0", - "avg_seat_view": "65.7%", - "sum_box_desc": "2.0万", - "sum_split_box_desc": "2.0万" - }, - { - "movie_id": 1519217, - "movie_name": "坪石先生", - "release_info": "上映43天", - "box_office": "1.76", - "box_office_unit": "万", - "box_office_desc": "1.76万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "1.76", - "split_box_office_unit": "万", - "split_box_office_desc": "1.76万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 11, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "61.4", - "avg_seat_view": "84.2%", - "sum_box_desc": "233.0万", - "sum_split_box_desc": "228.0万" - }, - { - "movie_id": 1499719, - "movie_name": "只此青绿", - "release_info": "", - "box_office": "1.66", - "box_office_unit": "万", - "box_office_desc": "1.66万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "1.44", - "split_box_office_unit": "万", - "split_box_office_desc": "1.44万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 823, - "show_count_rate": "0.2%", - "avg_show_view": "0.7", - "avg_seat_view": "0.6%", - "sum_box_desc": "5318.8万", - "sum_split_box_desc": "4830.5万" - }, - { - "movie_id": 1496400, - "movie_name": "天大的事", - "release_info": "上映12天", - "box_office": "1.29", - "box_office_unit": "万", - "box_office_desc": "1.29万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "1.18", - "split_box_office_unit": "万", - "split_box_office_desc": "1.18万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 4936, - "show_count_rate": "1.3%", - "avg_show_view": "\u003C0.1", - "avg_seat_view": "0.0%", - "sum_box_desc": "31.4万", - "sum_split_box_desc": "28.4万" - }, - { - "movie_id": 1461072, - "movie_name": "长空之王", - "release_info": "", - "box_office": "1.15", - "box_office_unit": "万", - "box_office_desc": "1.15万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "1.09", - "split_box_office_unit": "万", - "split_box_office_desc": "1.09万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 70, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "4.4", - "avg_seat_view": "5.7%", - "sum_box_desc": "8.54亿", - "sum_split_box_desc": "7.85亿" - }, - { - "movie_id": 1522287, - "movie_name": "长安的荔枝", - "release_info": "上映71天", - "box_office": "1.10", - "box_office_unit": "万", - "box_office_desc": "1.10万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.97", - "split_box_office_unit": "万", - "split_box_office_desc": "0.97万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 397, - "show_count_rate": "0.1%", - "avg_show_view": "0.8", - "avg_seat_view": "1.0%", - "sum_box_desc": "6.90亿", - "sum_split_box_desc": "6.15亿" - }, - { - "movie_id": 1562636, - "movie_name": "爱的暂停键", - "release_info": "上映22天", - "box_office": "1.06", - "box_office_unit": "万", - "box_office_desc": "1.06万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.94", - "split_box_office_unit": "万", - "split_box_office_desc": "0.94万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 182, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.3", - "avg_seat_view": "1.5%", - "sum_box_desc": "140.4万", - "sum_split_box_desc": "125.1万" - }, - { - "movie_id": 1592162, - "movie_name": "地球脉动:万物有道", - "release_info": "上映15天", - "box_office": "0.97", - "box_office_unit": "万", - "box_office_desc": "0.97万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.88", - "split_box_office_unit": "万", - "split_box_office_desc": "0.88万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 288, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.8", - "avg_seat_view": "0.7%", - "sum_box_desc": "43.4万", - "sum_split_box_desc": "39.2万" - }, - { - "movie_id": 1498162, - "movie_name": "午夜怪谈2", - "release_info": "上映15天", - "box_office": "0.97", - "box_office_unit": "万", - "box_office_desc": "0.97万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.87", - "split_box_office_unit": "万", - "split_box_office_desc": "0.87万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1792, - "show_count_rate": "0.5%", - "avg_show_view": "0.2", - "avg_seat_view": "0.1%", - "sum_box_desc": "156.3万", - "sum_split_box_desc": "138.9万" - }, - { - "movie_id": 1288259, - "movie_name": "如果悲伤可以解释", - "release_info": "上映30天", - "box_office": "0.82", - "box_office_unit": "万", - "box_office_desc": "0.82万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.75", - "split_box_office_unit": "万", - "split_box_office_desc": "0.75万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 2, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "110.0", - "avg_seat_view": "70.5%", - "sum_box_desc": "8.6万", - "sum_split_box_desc": "8.1万" - }, - { - "movie_id": 1470241, - "movie_name": "以法之名", - "release_info": "", - "box_office": "0.54", - "box_office_unit": "万", - "box_office_desc": "0.54万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.54", - "split_box_office_unit": "万", - "split_box_office_desc": "0.54万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 9, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "25.1", - "avg_seat_view": "29.6%", - "sum_box_desc": "93.9万", - "sum_split_box_desc": "93.8万" - }, - { - "movie_id": 1435060, - "movie_name": "夏雨来", - "release_info": "上映42天", - "box_office": "0.50", - "box_office_unit": "万", - "box_office_desc": "0.50万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.45", - "split_box_office_unit": "万", - "split_box_office_desc": "0.45万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 207, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.8", - "avg_seat_view": "0.8%", - "sum_box_desc": "2784.3万", - "sum_split_box_desc": "2498.7万" - }, - { - "movie_id": 1395730, - "movie_name": "老墙", - "release_info": "", - "box_office": "0.49", - "box_office_unit": "万", - "box_office_desc": "0.49万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.49", - "split_box_office_unit": "万", - "split_box_office_desc": "0.49万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 10, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "16.5", - "avg_seat_view": "11.0%", - "sum_box_desc": "123.5万", - "sum_split_box_desc": "121.5万" - }, - { - "movie_id": 1573266, - "movie_name": "带你回家", - "release_info": "点映", - "box_office": "0.47", - "box_office_unit": "万", - "box_office_desc": "0.47万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.45", - "split_box_office_unit": "万", - "split_box_office_desc": "0.45万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "131.0", - "avg_seat_view": "100.0%", - "sum_box_desc": "1.9万", - "sum_split_box_desc": "1.8万" - }, - { - "movie_id": 1360592, - "movie_name": "当男人恋爱时", - "release_info": "", - "box_office": "0.43", - "box_office_unit": "万", - "box_office_desc": "0.43万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.37", - "split_box_office_unit": "万", - "split_box_office_desc": "0.37万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 403, - "show_count_rate": "0.1%", - "avg_show_view": "0.3", - "avg_seat_view": "0.2%", - "sum_box_desc": "2.64亿", - "sum_split_box_desc": "2.32亿" - }, - { - "movie_id": 1449451, - "movie_name": "人生一世", - "release_info": "展映", - "box_office": "0.36", - "box_office_unit": "万", - "box_office_desc": "0.36万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.34", - "split_box_office_unit": "万", - "split_box_office_desc": "0.34万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "68.0", - "avg_seat_view": "68.0%", - "sum_box_desc": "2.2万", - "sum_split_box_desc": "2.1万" - }, - { - "movie_id": 1530212, - "movie_name": "蔡伦传奇", - "release_info": "上映首日", - "box_office": "0.33", - "box_office_unit": "万", - "box_office_desc": "0.33万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.33", - "split_box_office_unit": "万", - "split_box_office_desc": "0.33万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "134.0", - "avg_seat_view": "76.5%", - "sum_box_desc": "3352", - "sum_split_box_desc": "3352" - }, - { - "movie_id": 1530145, - "movie_name": "蜗牛回忆录", - "release_info": "上映22天", - "box_office": "0.28", - "box_office_unit": "万", - "box_office_desc": "0.28万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.25", - "split_box_office_unit": "万", - "split_box_office_desc": "0.25万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 88, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.8", - "avg_seat_view": "0.8%", - "sum_box_desc": "73.8万", - "sum_split_box_desc": "66.4万" - }, - { - "movie_id": 1469373, - "movie_name": "逃离抢钱镇", - "release_info": "上映14天", - "box_office": "0.28", - "box_office_unit": "万", - "box_office_desc": "0.28万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.25", - "split_box_office_unit": "万", - "split_box_office_desc": "0.25万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 110, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.6", - "avg_seat_view": "0.7%", - "sum_box_desc": "38.5万", - "sum_split_box_desc": "34.5万" - }, - { - "movie_id": 1490948, - "movie_name": "聊斋:兰若寺", - "release_info": "上映77天", - "box_office": "0.26", - "box_office_unit": "万", - "box_office_desc": "0.26万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.23", - "split_box_office_unit": "万", - "split_box_office_desc": "0.23万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 99, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.8", - "avg_seat_view": "0.9%", - "sum_box_desc": "2.43亿", - "sum_split_box_desc": "2.15亿" - }, - { - "movie_id": 1518617, - "movie_name": "小鹿斑比:清算", - "release_info": "上映21天", - "box_office": "0.26", - "box_office_unit": "万", - "box_office_desc": "0.26万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.23", - "split_box_office_unit": "万", - "split_box_office_desc": "0.23万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 590, - "show_count_rate": "0.1%", - "avg_show_view": "0.1", - "avg_seat_view": "0.1%", - "sum_box_desc": "217.6万", - "sum_split_box_desc": "194.5万" - }, - { - "movie_id": 1524059, - "movie_name": "别把作文当回事儿", - "release_info": "上映15天", - "box_office": "0.25", - "box_office_unit": "万", - "box_office_desc": "0.25万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.23", - "split_box_office_unit": "万", - "split_box_office_desc": "0.23万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 2, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "33.5", - "avg_seat_view": "20.1%", - "sum_box_desc": "55.8万", - "sum_split_box_desc": "55.0万" - }, - { - "movie_id": 1427899, - "movie_name": "天宝", - "release_info": "上映79天", - "box_office": "0.23", - "box_office_unit": "万", - "box_office_desc": "0.23万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.23", - "split_box_office_unit": "万", - "split_box_office_desc": "0.23万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 3, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "21.3", - "avg_seat_view": "16.9%", - "sum_box_desc": "351.2万", - "sum_split_box_desc": "343.0万" - }, - { - "movie_id": 1593298, - "movie_name": "海洋之谜", - "release_info": "展映", - "box_office": "0.20", - "box_office_unit": "万", - "box_office_desc": "0.20万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.19", - "split_box_office_unit": "万", - "split_box_office_desc": "0.19万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "41.0", - "avg_seat_view": "12.0%", - "sum_box_desc": "6.4万", - "sum_split_box_desc": "6.0万" - }, - { - "movie_id": 1487834, - "movie_name": "熊孩子·探险熊兵", - "release_info": "上映14天", - "box_office": "0.17", - "box_office_unit": "万", - "box_office_desc": "0.17万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.16", - "split_box_office_unit": "万", - "split_box_office_desc": "0.16万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 651, - "show_count_rate": "0.1%", - "avg_show_view": "\u003C0.1", - "avg_seat_view": "0.0%", - "sum_box_desc": "172.8万", - "sum_split_box_desc": "165.3万" - }, - { - "movie_id": 1491476, - "movie_name": "超人", - "release_info": "上映78天", - "box_office": "0.13", - "box_office_unit": "万", - "box_office_desc": "0.13万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.12", - "split_box_office_unit": "万", - "split_box_office_desc": "0.12万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 44, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.5", - "avg_seat_view": "0.5%", - "sum_box_desc": "6392.8万", - "sum_split_box_desc": "5729.0万" - }, - { - "movie_id": 1527997, - "movie_name": "大别山久生", - "release_info": "上映17天", - "box_office": "0.12", - "box_office_unit": "万", - "box_office_desc": "0.12万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.12", - "split_box_office_unit": "万", - "split_box_office_desc": "0.12万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 2, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "25.5", - "avg_seat_view": "18.8%", - "sum_box_desc": "3.1万", - "sum_split_box_desc": "3.1万" - }, - { - "movie_id": 1528424, - "movie_name": "午夜凶镜", - "release_info": "上映29天", - "box_office": "0.12", - "box_office_unit": "万", - "box_office_desc": "0.12万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.11", - "split_box_office_unit": "万", - "split_box_office_desc": "0.11万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 292, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.1", - "avg_seat_view": "0.1%", - "sum_box_desc": "172.0万", - "sum_split_box_desc": "152.2万" - }, - { - "movie_id": 1289244, - "movie_name": "吉普赛女王", - "release_info": "展映", - "box_office": "0.09", - "box_office_unit": "万", - "box_office_desc": "0.09万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.08", - "split_box_office_unit": "万", - "split_box_office_desc": "0.08万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "20.0", - "avg_seat_view": "10.1%", - "sum_box_desc": "6553", - "sum_split_box_desc": "6117" - }, - { - "movie_id": 1509826, - "movie_name": "伊甸", - "release_info": "上映36天", - "box_office": "0.08", - "box_office_unit": "万", - "box_office_desc": "0.08万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.07", - "split_box_office_unit": "万", - "split_box_office_desc": "0.07万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 15, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.5", - "avg_seat_view": "1.7%", - "sum_box_desc": "235.0万", - "sum_split_box_desc": "208.4万" - }, - { - "movie_id": 1320548, - "movie_name": "家庭简史", - "release_info": "上映15天", - "box_office": "0.08", - "box_office_unit": "万", - "box_office_desc": "0.08万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.07", - "split_box_office_unit": "万", - "split_box_office_desc": "0.07万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 41, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.5", - "avg_seat_view": "0.7%", - "sum_box_desc": "29.9万", - "sum_split_box_desc": "28.8万" - }, - { - "movie_id": 1470975, - "movie_name": "这周五的游乐场", - "release_info": "上映8天", - "box_office": "0.08", - "box_office_unit": "万", - "box_office_desc": "0.08万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.07", - "split_box_office_unit": "万", - "split_box_office_desc": "0.07万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 17, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.3", - "avg_seat_view": "1.5%", - "sum_box_desc": "15.0万", - "sum_split_box_desc": "14.7万" - }, - { - "movie_id": 1593302, - "movie_name": "飓风", - "release_info": "展映", - "box_office": "0.07", - "box_office_unit": "万", - "box_office_desc": "0.07万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.07", - "split_box_office_unit": "万", - "split_box_office_desc": "0.07万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "15.0", - "avg_seat_view": "4.4%", - "sum_box_desc": "3.3万", - "sum_split_box_desc": "3.1万" - }, - { - "movie_id": 1487768, - "movie_name": "巴扎喜事", - "release_info": "上映36天", - "box_office": "0.07", - "box_office_unit": "万", - "box_office_desc": "0.07万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.07", - "split_box_office_unit": "万", - "split_box_office_desc": "0.07万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 22, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.8", - "avg_seat_view": "0.9%", - "sum_box_desc": "144.9万", - "sum_split_box_desc": "137.1万" - }, - { - "movie_id": 1568020, - "movie_name": "喜羊羊与灰太狼之异国破晓", - "release_info": "上映63天", - "box_office": "0.07", - "box_office_unit": "万", - "box_office_desc": "0.07万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.06", - "split_box_office_unit": "万", - "split_box_office_desc": "0.06万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 80, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.3", - "avg_seat_view": "0.2%", - "sum_box_desc": "6206.1万", - "sum_split_box_desc": "5555.4万" - }, - { - "movie_id": 1525122, - "movie_name": "康熙与路易十四", - "release_info": "", - "box_office": "0.06", - "box_office_unit": "万", - "box_office_desc": "0.06万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.05", - "split_box_office_unit": "万", - "split_box_office_desc": "0.05万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "10.0", - "avg_seat_view": "40.0%", - "sum_box_desc": "304.0万", - "sum_split_box_desc": "298.6万" - }, - { - "movie_id": 1250604, - "movie_name": "里斯本丸沉没", - "release_info": "", - "box_office": "0.05", - "box_office_unit": "万", - "box_office_desc": "0.05万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.05", - "split_box_office_unit": "万", - "split_box_office_desc": "0.05万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 30, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.5", - "avg_seat_view": "0.6%", - "sum_box_desc": "4763.2万", - "sum_split_box_desc": "4345.3万" - }, - { - "movie_id": 1432141, - "movie_name": "戏台", - "release_info": "上映64天", - "box_office": "0.05", - "box_office_unit": "万", - "box_office_desc": "0.05万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.04", - "split_box_office_unit": "万", - "split_box_office_desc": "0.04万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 24, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.6", - "avg_seat_view": "0.7%", - "sum_box_desc": "4.11亿", - "sum_split_box_desc": "3.66亿" - }, - { - "movie_id": 40308, - "movie_name": "玛丽和麦克斯", - "release_info": "上映50天", - "box_office": "0.04", - "box_office_unit": "万", - "box_office_desc": "0.04万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.04", - "split_box_office_unit": "万", - "split_box_office_desc": "0.04万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 10, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.3", - "avg_seat_view": "1.7%", - "sum_box_desc": "107.1万", - "sum_split_box_desc": "97.2万" - }, - { - "movie_id": 1451361, - "movie_name": "我们的那一年", - "release_info": "上映29天", - "box_office": "0.04", - "box_office_unit": "万", - "box_office_desc": "0.04万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.04", - "split_box_office_unit": "万", - "split_box_office_desc": "0.04万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "9.0", - "avg_seat_view": "4.0%", - "sum_box_desc": "1.5万", - "sum_split_box_desc": "1.5万" - }, - { - "movie_id": 1431675, - "movie_name": "赎梦", - "release_info": "上映35天", - "box_office": "0.04", - "box_office_unit": "万", - "box_office_desc": "0.04万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.03", - "split_box_office_unit": "万", - "split_box_office_desc": "0.03万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 53, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.2", - "avg_seat_view": "0.2%", - "sum_box_desc": "561.8万", - "sum_split_box_desc": "503.4万" - }, - { - "movie_id": 308316, - "movie_name": "蜡笔小新:大人王国的反击", - "release_info": "上映91天", - "box_office": "0.04", - "box_office_unit": "万", - "box_office_desc": "0.04万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.03", - "split_box_office_unit": "万", - "split_box_office_desc": "0.03万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 9, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.2", - "avg_seat_view": "1.2%", - "sum_box_desc": "6827.9万", - "sum_split_box_desc": "6120.8万" - }, - { - "movie_id": 122157, - "movie_name": "孩子王", - "release_info": "", - "box_office": "0.03", - "box_office_unit": "万", - "box_office_desc": "0.03万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.03", - "split_box_office_unit": "万", - "split_box_office_desc": "0.03万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "6.0", - "avg_seat_view": "6.0%", - "sum_box_desc": "1.1万", - "sum_split_box_desc": "1.0万" - }, - { - "movie_id": 1452520, - "movie_name": "一生交给党", - "release_info": "", - "box_office": "0.03", - "box_office_unit": "万", - "box_office_desc": "0.03万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.03", - "split_box_office_unit": "万", - "split_box_office_desc": "0.03万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 4, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "2.3", - "avg_seat_view": "2.0%", - "sum_box_desc": "675.7万", - "sum_split_box_desc": "671.2万" - }, - { - "movie_id": 1481712, - "movie_name": "寻找1999的月老", - "release_info": "上映29天", - "box_office": "0.02", - "box_office_unit": "万", - "box_office_desc": "0.02万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.02", - "split_box_office_unit": "万", - "split_box_office_desc": "0.02万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 2, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "2.0", - "avg_seat_view": "2.2%", - "sum_box_desc": "52.3万", - "sum_split_box_desc": "50.1万" - }, - { - "movie_id": 1552267, - "movie_name": "山庄·惊魂", - "release_info": "上映92天", - "box_office": "0.02", - "box_office_unit": "万", - "box_office_desc": "0.02万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.02", - "split_box_office_unit": "万", - "split_box_office_desc": "0.02万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 3, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.3", - "avg_seat_view": "1.2%", - "sum_box_desc": "201.5万", - "sum_split_box_desc": "177.2万" - }, - { - "movie_id": 1551836, - "movie_name": "麦克白", - "release_info": "上映56天", - "box_office": "0.02", - "box_office_unit": "万", - "box_office_desc": "0.02万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.02", - "split_box_office_unit": "万", - "split_box_office_desc": "0.02万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "7.0", - "avg_seat_view": "14.0%", - "sum_box_desc": "37.9万", - "sum_split_box_desc": "34.7万" - }, - { - "movie_id": 1302189, - "movie_name": "零卡社团", - "release_info": "展映", - "box_office": "0.02", - "box_office_unit": "万", - "box_office_desc": "0.02万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.02", - "split_box_office_unit": "万", - "split_box_office_desc": "0.02万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 2, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.5", - "avg_seat_view": "1.7%", - "sum_box_desc": "3.9万", - "sum_split_box_desc": "3.7万" - }, - { - "movie_id": 1547375, - "movie_name": "同甘共苦", - "release_info": "展映", - "box_office": "0.02", - "box_office_unit": "万", - "box_office_desc": "0.02万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.01", - "split_box_office_unit": "万", - "split_box_office_desc": "0.01万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 18, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.3", - "avg_seat_view": "0.2%", - "sum_box_desc": "31.8万", - "sum_split_box_desc": "28.4万" - }, - { - "movie_id": 1462651, - "movie_name": "我们终将要和世界握手言和", - "release_info": "上映17天", - "box_office": "0.01", - "box_office_unit": "万", - "box_office_desc": "0.01万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.01", - "split_box_office_unit": "万", - "split_box_office_desc": "0.01万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 2, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "2.0", - "avg_seat_view": "1.6%", - "sum_box_desc": "3.4万", - "sum_split_box_desc": "3.3万" - }, - { - "movie_id": 1415196, - "movie_name": "无名", - "release_info": "", - "box_office": "0.01", - "box_office_unit": "万", - "box_office_desc": "0.01万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.01", - "split_box_office_unit": "万", - "split_box_office_desc": "0.01万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 4, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.0", - "avg_seat_view": "1.3%", - "sum_box_desc": "9.43亿", - "sum_split_box_desc": "8.88亿" - }, - { - "movie_id": 1301793, - "movie_name": "掬水月在手", - "release_info": "", - "box_office": "0.01", - "box_office_unit": "万", - "box_office_desc": "0.01万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.01", - "split_box_office_unit": "万", - "split_box_office_desc": "0.01万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "4.0", - "avg_seat_view": "4.0%", - "sum_box_desc": "790.8万", - "sum_split_box_desc": "728.3万" - }, - { - "movie_id": 1501764, - "movie_name": "威风锣鼓", - "release_info": "上映50天", - "box_office": "0.01", - "box_office_unit": "万", - "box_office_desc": "0.01万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.01", - "split_box_office_unit": "万", - "split_box_office_desc": "0.01万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "4.0", - "avg_seat_view": "4.3%", - "sum_box_desc": "1.3万", - "sum_split_box_desc": "1.2万" - }, - { - "movie_id": 1187439, - "movie_name": "侏罗纪世界3", - "release_info": "", - "box_office": "0.01", - "box_office_unit": "万", - "box_office_desc": "0.01万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.01", - "split_box_office_unit": "万", - "split_box_office_desc": "0.01万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "3.0", - "avg_seat_view": "2.7%", - "sum_box_desc": "10.59亿", - "sum_split_box_desc": "9.45亿" - }, - { - "movie_id": 1532831, - "movie_name": "潜艇总动员:冒险岛", - "release_info": "", - "box_office": "0.01", - "box_office_unit": "万", - "box_office_desc": "0.01万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.01", - "split_box_office_unit": "万", - "split_box_office_desc": "0.01万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 2, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.5", - "avg_seat_view": "1.0%", - "sum_box_desc": "1053.3万", - "sum_split_box_desc": "1002.9万" - }, - { - "movie_id": 1566861, - "movie_name": "血色牢笼", - "release_info": "上映22天", - "box_office": "0.01", - "box_office_unit": "万", - "box_office_desc": "0.01万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.01", - "split_box_office_unit": "万", - "split_box_office_desc": "0.01万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 8, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.4", - "avg_seat_view": "0.5%", - "sum_box_desc": "7.2万", - "sum_split_box_desc": "6.7万" - }, - { - "movie_id": 443609, - "movie_name": "圆梦餐厅", - "release_info": "上映50天", - "box_office": "0.01", - "box_office_unit": "万", - "box_office_desc": "0.01万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.01", - "split_box_office_unit": "万", - "split_box_office_desc": "0.01万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "3.0", - "avg_seat_view": "3.3%", - "sum_box_desc": "7.1万", - "sum_split_box_desc": "6.8万" - }, - { - "movie_id": 1524039, - "movie_name": "潍遗灯火阑珊处", - "release_info": "上映8天", - "box_office": "0.01", - "box_office_unit": "万", - "box_office_desc": "0.01万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "3.0", - "avg_seat_view": "6.2%", - "sum_box_desc": "673", - "sum_split_box_desc": "515" - }, - { - "movie_id": 1227946, - "movie_name": "甜蜜恰好也三十", - "release_info": "上映22天", - "box_office": "0.00", - "box_office_unit": "万", - "box_office_desc": "0.00万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 6, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.3", - "avg_seat_view": "0.4%", - "sum_box_desc": "10.3万", - "sum_split_box_desc": "10.1万" - }, - { - "movie_id": 246386, - "movie_name": "小王子", - "release_info": "", - "box_office": "0.00", - "box_office_unit": "万", - "box_office_desc": "0.00万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "2.0", - "avg_seat_view": "2.7%", - "sum_box_desc": "1.59亿", - "sum_split_box_desc": "1.59亿" - }, - { - "movie_id": 1583990, - "movie_name": "与世界的最后一眼相遇", - "release_info": "上映42天", - "box_office": "0.00", - "box_office_unit": "万", - "box_office_desc": "0.00万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 4, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.5", - "avg_seat_view": "0.6%", - "sum_box_desc": "75.5万", - "sum_split_box_desc": "68.5万" - }, - { - "movie_id": 1581104, - "movie_name": "生死狙杀", - "release_info": "上映26天", - "box_office": "0.00", - "box_office_unit": "万", - "box_office_desc": "0.00万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 18, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.1", - "avg_seat_view": "0.1%", - "sum_box_desc": "1849", - "sum_split_box_desc": "1635" - }, - { - "movie_id": 1547294, - "movie_name": "翡翠城巫师", - "release_info": "上映29天", - "box_office": "0.00", - "box_office_unit": "万", - "box_office_desc": "0.00万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 7, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "0.3", - "avg_seat_view": "0.2%", - "sum_box_desc": "11.7万", - "sum_split_box_desc": "10.5万" - }, - { - "movie_id": 1475139, - "movie_name": "魔法鼠乐园·神秘魔法球", - "release_info": "上映28天", - "box_office": "0.00", - "box_office_unit": "万", - "box_office_desc": "0.00万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 21, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "\u003C0.1", - "avg_seat_view": "0.1%", - "sum_box_desc": "25.8万", - "sum_split_box_desc": "22.9万" - }, - { - "movie_id": 78602, - "movie_name": "侏罗纪世界", - "release_info": "", - "box_office": "0.00", - "box_office_unit": "万", - "box_office_desc": "0.00万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.0", - "avg_seat_view": "0.8%", - "sum_box_desc": "14.18亿", - "sum_split_box_desc": "14.18亿" - }, - { - "movie_id": 296020, - "movie_name": "开国大典", - "release_info": "", - "box_office": "0.00", - "box_office_unit": "万", - "box_office_desc": "0.00万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.0", - "avg_seat_view": "1.0%", - "sum_box_desc": "4.4万", - "sum_split_box_desc": "4.4万" - }, - { - "movie_id": 246339, - "movie_name": "平原游击队", - "release_info": "展映", - "box_office": "0.00", - "box_office_unit": "万", - "box_office_desc": "0.00万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.0", - "avg_seat_view": "2.6%", - "sum_box_desc": "952", - "sum_split_box_desc": "916" - }, - { - "movie_id": 1387874, - "movie_name": "大突围", - "release_info": "", - "box_office": "0.00", - "box_office_unit": "万", - "box_office_desc": "0.00万", - "box_office_rate": "\u003C0.1%", - "split_box_office": "0.00", - "split_box_office_unit": "万", - "split_box_office_desc": "0.00万", - "split_box_office_rate": "\u003C0.1%", - "show_count": 1, - "show_count_rate": "\u003C0.1%", - "avg_show_view": "1.0", - "avg_seat_view": "0.6%", - "sum_box_desc": "1330.9万", - "sum_split_box_desc": "1313.2万" - } - ] - } +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": { + "title": "实时大盘", + "show_count_desc": "35.4万", + "view_count_desc": "73.2万", + "split_box_office": "2669.5", + "split_box_office_unit": "万", + "box_office": "2669.5", + "box_office_unit": "万", + "update_gap_second": 5, + "updated": "2025-09-26 08:02:00", + "updated_at": 1758873720693, + "list": [ + { + "movie_id": 1207331, + "movie_name": "731", + "release_info": "上映9天", + "box_office": "1791.41", + "box_office_unit": "万", + "box_office_desc": "1791.41万", + "box_office_rate": "67.1%", + "split_box_office": "1686.17", + "split_box_office_unit": "万", + "split_box_office_desc": "1686.17万", + "split_box_office_rate": "67.2%", + "show_count": 206074, + "show_count_rate": "58.2%", + "avg_show_view": "2.4", + "avg_seat_view": "1.7%", + "sum_box_desc": "13.86亿", + "sum_split_box_desc": "12.59亿" + }, + { + "movie_id": 1505571, + "movie_name": "捕风追影", + "release_info": "上映42天", + "box_office": "226.43", + "box_office_unit": "万", + "box_office_desc": "226.43万", + "box_office_rate": "8.4%", + "split_box_office": "202.53", + "split_box_office_unit": "万", + "split_box_office_desc": "202.53万", + "split_box_office_rate": "8.0%", + "show_count": 44432, + "show_count_rate": "12.5%", + "avg_show_view": "1.4", + "avg_seat_view": "1.3%", + "sum_box_desc": "12.06亿", + "sum_split_box_desc": "10.71亿" + }, + { + "movie_id": 1531082, + "movie_name": "窗外是蓝星", + "release_info": "上映22天", + "box_office": "102.39", + "box_office_unit": "万", + "box_office_desc": "102.39万", + "box_office_rate": "3.8%", + "split_box_office": "100.65", + "split_box_office_unit": "万", + "split_box_office_desc": "100.65万", + "split_box_office_rate": "4.0%", + "show_count": 5681, + "show_count_rate": "1.6%", + "avg_show_view": "5.0", + "avg_seat_view": "4.7%", + "sum_box_desc": "3807.1万", + "sum_split_box_desc": "3634.0万" + }, + { + "movie_id": 1515448, + "movie_name": "浪浪山小妖怪", + "release_info": "上映56天", + "box_office": "88.95", + "box_office_unit": "万", + "box_office_desc": "88.95万", + "box_office_rate": "3.3%", + "split_box_office": "78.92", + "split_box_office_unit": "万", + "split_box_office_desc": "78.92万", + "split_box_office_rate": "3.1%", + "show_count": 28121, + "show_count_rate": "7.9%", + "avg_show_view": "0.9", + "avg_seat_view": "0.8%", + "sum_box_desc": "16.41亿", + "sum_split_box_desc": "14.66亿" + }, + { + "movie_id": 1522657, + "movie_name": "南京照相馆", + "release_info": "上映64天", + "box_office": "82.47", + "box_office_unit": "万", + "box_office_desc": "82.47万", + "box_office_rate": "3.0%", + "split_box_office": "77.50", + "split_box_office_unit": "万", + "split_box_office_desc": "77.50万", + "split_box_office_rate": "3.0%", + "show_count": 19778, + "show_count_rate": "5.5%", + "avg_show_view": "1.2", + "avg_seat_view": "1.2%", + "sum_box_desc": "30.03亿", + "sum_split_box_desc": "26.94亿" + }, + { + "movie_id": 1547369, + "movie_name": "红丝绸", + "release_info": "上映21天", + "box_office": "60.55", + "box_office_unit": "万", + "box_office_desc": "60.55万", + "box_office_rate": "2.2%", + "split_box_office": "60.35", + "split_box_office_unit": "万", + "split_box_office_desc": "60.35万", + "split_box_office_rate": "2.4%", + "show_count": 313, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "50.9", + "avg_seat_view": "46.8%", + "sum_box_desc": "1114.9万", + "sum_split_box_desc": "1095.2万" + }, + { + "movie_id": 1536837, + "movie_name": "营救飞虎", + "release_info": "上映24天", + "box_office": "35.54", + "box_office_unit": "万", + "box_office_desc": "35.54万", + "box_office_rate": "1.3%", + "split_box_office": "35.42", + "split_box_office_unit": "万", + "split_box_office_desc": "35.42万", + "split_box_office_rate": "1.4%", + "show_count": 257, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "32.9", + "avg_seat_view": "32.4%", + "sum_box_desc": "2456.3万", + "sum_split_box_desc": "2431.0万" + }, + { + "movie_id": 1298226, + "movie_name": "死神来了:血脉诅咒", + "release_info": "上映36天", + "box_office": "31.42", + "box_office_unit": "万", + "box_office_desc": "31.42万", + "box_office_rate": "1.1%", + "split_box_office": "27.59", + "split_box_office_unit": "万", + "split_box_office_desc": "27.59万", + "split_box_office_rate": "1.1%", + "show_count": 9723, + "show_count_rate": "2.7%", + "avg_show_view": "0.8", + "avg_seat_view": "0.8%", + "sum_box_desc": "1.91亿", + "sum_split_box_desc": "1.69亿" + }, + { + "movie_id": 1523743, + "movie_name": "坏蛋联盟2", + "release_info": "上映42天", + "box_office": "28.70", + "box_office_unit": "万", + "box_office_desc": "28.70万", + "box_office_rate": "1.0%", + "split_box_office": "27.49", + "split_box_office_unit": "万", + "split_box_office_desc": "27.49万", + "split_box_office_rate": "1.0%", + "show_count": 4622, + "show_count_rate": "1.3%", + "avg_show_view": "1.2", + "avg_seat_view": "1.3%", + "sum_box_desc": "1.98亿", + "sum_split_box_desc": "1.78亿" + }, + { + "movie_id": 1499675, + "movie_name": "毕正明的证明", + "release_info": "点映", + "box_office": "25.80", + "box_office_unit": "万", + "box_office_desc": "25.80万", + "box_office_rate": "0.9%", + "split_box_office": "25.59", + "split_box_office_unit": "万", + "split_box_office_desc": "25.59万", + "split_box_office_rate": "1.0%", + "show_count": 28, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "157.6", + "avg_seat_view": "100.0%", + "sum_box_desc": "25.8万", + "sum_split_box_desc": "25.5万" + }, + { + "movie_id": 1572273, + "movie_name": "山河为证", + "release_info": "上映43天", + "box_office": "24.89", + "box_office_unit": "万", + "box_office_desc": "24.89万", + "box_office_rate": "0.9%", + "split_box_office": "24.88", + "split_box_office_unit": "万", + "split_box_office_desc": "24.88万", + "split_box_office_rate": "0.9%", + "show_count": 126, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "44.3", + "avg_seat_view": "37.1%", + "sum_box_desc": "2904.6万", + "sum_split_box_desc": "2894.9万" + }, + { + "movie_id": 1250679, + "movie_name": "洛桑的家事", + "release_info": "上映16天", + "box_office": "20.09", + "box_office_unit": "万", + "box_office_desc": "20.09万", + "box_office_rate": "0.7%", + "split_box_office": "20.08", + "split_box_office_unit": "万", + "split_box_office_desc": "20.08万", + "split_box_office_rate": "0.8%", + "show_count": 167, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "22.4", + "avg_seat_view": "20.7%", + "sum_box_desc": "519.8万", + "sum_split_box_desc": "517.7万" + }, + { + "movie_id": 1542730, + "movie_name": "奇遇", + "release_info": "上映50天", + "box_office": "16.11", + "box_office_unit": "万", + "box_office_desc": "16.11万", + "box_office_rate": "0.6%", + "split_box_office": "13.96", + "split_box_office_unit": "万", + "split_box_office_desc": "13.96万", + "split_box_office_rate": "0.5%", + "show_count": 4473, + "show_count_rate": "1.2%", + "avg_show_view": "1.1", + "avg_seat_view": "1.3%", + "sum_box_desc": "1.86亿", + "sum_split_box_desc": "1.63亿" + }, + { + "movie_id": 1500636, + "movie_name": "罗小黑战记2", + "release_info": "上映71天", + "box_office": "15.94", + "box_office_unit": "万", + "box_office_desc": "15.94万", + "box_office_rate": "0.5%", + "split_box_office": "14.14", + "split_box_office_unit": "万", + "split_box_office_desc": "14.14万", + "split_box_office_rate": "0.5%", + "show_count": 3761, + "show_count_rate": "1.0%", + "avg_show_view": "1.1", + "avg_seat_view": "1.2%", + "sum_box_desc": "5.21亿", + "sum_split_box_desc": "4.64亿" + }, + { + "movie_id": 1489329, + "movie_name": "浪浪人生", + "release_info": "点映", + "box_office": "15.34", + "box_office_unit": "万", + "box_office_desc": "15.34万", + "box_office_rate": "0.5%", + "split_box_office": "15.34", + "split_box_office_unit": "万", + "split_box_office_desc": "15.34万", + "split_box_office_rate": "0.6%", + "show_count": 19, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "143.8", + "avg_seat_view": "84.7%", + "sum_box_desc": "69.2万", + "sum_split_box_desc": "66.7万" + }, + { + "movie_id": 1454962, + "movie_name": "F1:狂飙飞车", + "release_info": "上映92天", + "box_office": "13.84", + "box_office_unit": "万", + "box_office_desc": "13.84万", + "box_office_rate": "0.5%", + "split_box_office": "12.42", + "split_box_office_unit": "万", + "split_box_office_desc": "12.42万", + "split_box_office_rate": "0.4%", + "show_count": 979, + "show_count_rate": "0.2%", + "avg_show_view": "2.5", + "avg_seat_view": "1.5%", + "sum_box_desc": "4.41亿", + "sum_split_box_desc": "3.94亿" + }, + { + "movie_id": 1584781, + "movie_name": "生还", + "release_info": "上映24天", + "box_office": "12.97", + "box_office_unit": "万", + "box_office_desc": "12.97万", + "box_office_rate": "0.4%", + "split_box_office": "12.94", + "split_box_office_unit": "万", + "split_box_office_desc": "12.94万", + "split_box_office_rate": "0.5%", + "show_count": 115, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "29.4", + "avg_seat_view": "26.0%", + "sum_box_desc": "358.2万", + "sum_split_box_desc": "354.7万" + }, + { + "movie_id": 1552050, + "movie_name": "汉斯·季默与朋友们:沙漠之钻音乐会", + "release_info": "上映7天", + "box_office": "9.52", + "box_office_unit": "万", + "box_office_desc": "9.52万", + "box_office_rate": "0.3%", + "split_box_office": "8.50", + "split_box_office_unit": "万", + "split_box_office_desc": "8.50万", + "split_box_office_rate": "0.3%", + "show_count": 822, + "show_count_rate": "0.2%", + "avg_show_view": "2.4", + "avg_seat_view": "1.8%", + "sum_box_desc": "181.7万", + "sum_split_box_desc": "164.7万" + }, + { + "movie_id": 343898, + "movie_name": "东极岛", + "release_info": "上映50天", + "box_office": "9.05", + "box_office_unit": "万", + "box_office_desc": "9.05万", + "box_office_rate": "0.3%", + "split_box_office": "8.67", + "split_box_office_unit": "万", + "split_box_office_desc": "8.67万", + "split_box_office_rate": "0.3%", + "show_count": 1837, + "show_count_rate": "0.5%", + "avg_show_view": "1.3", + "avg_seat_view": "1.4%", + "sum_box_desc": "3.96亿", + "sum_split_box_desc": "3.54亿" + }, + { + "movie_id": 1520596, + "movie_name": "轻于鸿毛", + "release_info": "上映14天", + "box_office": "8.85", + "box_office_unit": "万", + "box_office_desc": "8.85万", + "box_office_rate": "0.3%", + "split_box_office": "8.14", + "split_box_office_unit": "万", + "split_box_office_desc": "8.14万", + "split_box_office_rate": "0.3%", + "show_count": 4420, + "show_count_rate": "1.2%", + "avg_show_view": "0.5", + "avg_seat_view": "0.6%", + "sum_box_desc": "1479.7万", + "sum_split_box_desc": "1325.2万" + }, + { + "movie_id": 431882, + "movie_name": "新三峡", + "release_info": "上映93天", + "box_office": "4.82", + "box_office_unit": "万", + "box_office_desc": "4.82万", + "box_office_rate": "0.1%", + "split_box_office": "4.82", + "split_box_office_unit": "万", + "split_box_office_desc": "4.82万", + "split_box_office_rate": "0.1%", + "show_count": 12, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "78.9", + "avg_seat_view": "38.8%", + "sum_box_desc": "893.9万", + "sum_split_box_desc": "891.7万" + }, + { + "movie_id": 1511555, + "movie_name": "有朵云像你", + "release_info": "上映29天", + "box_office": "4.78", + "box_office_unit": "万", + "box_office_desc": "4.78万", + "box_office_rate": "0.1%", + "split_box_office": "4.09", + "split_box_office_unit": "万", + "split_box_office_desc": "4.09万", + "split_box_office_rate": "0.1%", + "show_count": 2017, + "show_count_rate": "0.5%", + "avg_show_view": "0.7", + "avg_seat_view": "0.8%", + "sum_box_desc": "5131.8万", + "sum_split_box_desc": "4540.4万" + }, + { + "movie_id": 1489326, + "movie_name": "7天", + "release_info": "上映29天", + "box_office": "4.19", + "box_office_unit": "万", + "box_office_desc": "4.19万", + "box_office_rate": "0.1%", + "split_box_office": "4.01", + "split_box_office_unit": "万", + "split_box_office_desc": "4.01万", + "split_box_office_rate": "0.1%", + "show_count": 842, + "show_count_rate": "0.2%", + "avg_show_view": "1.3", + "avg_seat_view": "1.6%", + "sum_box_desc": "6214.2万", + "sum_split_box_desc": "5481.7万" + }, + { + "movie_id": 1538211, + "movie_name": "临时决斗", + "release_info": "上映8天", + "box_office": "4.04", + "box_office_unit": "万", + "box_office_desc": "4.04万", + "box_office_rate": "0.1%", + "split_box_office": "3.73", + "split_box_office_unit": "万", + "split_box_office_desc": "3.73万", + "split_box_office_rate": "0.1%", + "show_count": 1843, + "show_count_rate": "0.5%", + "avg_show_view": "0.6", + "avg_seat_view": "0.6%", + "sum_box_desc": "126.1万", + "sum_split_box_desc": "112.0万" + }, + { + "movie_id": 1523868, + "movie_name": "三国的星空第一部", + "release_info": "点映", + "box_office": "3.36", + "box_office_unit": "万", + "box_office_desc": "3.36万", + "box_office_rate": "0.1%", + "split_box_office": "3.19", + "split_box_office_unit": "万", + "split_box_office_desc": "3.19万", + "split_box_office_rate": "0.1%", + "show_count": 3, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "261.0", + "avg_seat_view": "94.6%", + "sum_box_desc": "13.8万", + "sum_split_box_desc": "13.6万" + }, + { + "movie_id": 1547424, + "movie_name": "关于约会的一切", + "release_info": "上映22天", + "box_office": "3.15", + "box_office_unit": "万", + "box_office_desc": "3.15万", + "box_office_rate": "0.1%", + "split_box_office": "2.83", + "split_box_office_unit": "万", + "split_box_office_desc": "2.83万", + "split_box_office_rate": "0.1%", + "show_count": 441, + "show_count_rate": "0.1%", + "avg_show_view": "1.6", + "avg_seat_view": "1.5%", + "sum_box_desc": "381.5万", + "sum_split_box_desc": "342.6万" + }, + { + "movie_id": 1593640, + "movie_name": "疯狂电脑城", + "release_info": "点映", + "box_office": "3.07", + "box_office_unit": "万", + "box_office_desc": "3.07万", + "box_office_rate": "0.1%", + "split_box_office": "3.01", + "split_box_office_unit": "万", + "split_box_office_desc": "3.01万", + "split_box_office_rate": "0.1%", + "show_count": 10, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "101.0", + "avg_seat_view": "98.9%", + "sum_box_desc": "3.0万", + "sum_split_box_desc": "3.0万" + }, + { + "movie_id": 1462786, + "movie_name": "爱心之拳", + "release_info": "上映29天", + "box_office": "2.84", + "box_office_unit": "万", + "box_office_desc": "2.84万", + "box_office_rate": "0.1%", + "split_box_office": "2.84", + "split_box_office_unit": "万", + "split_box_office_desc": "2.84万", + "split_box_office_rate": "0.1%", + "show_count": 14, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "101.5", + "avg_seat_view": "27.0%", + "sum_box_desc": "93.6万", + "sum_split_box_desc": "93.6万" + }, + { + "movie_id": 1575780, + "movie_name": "蛟龙行动(特别版)", + "release_info": "上映28天", + "box_office": "2.79", + "box_office_unit": "万", + "box_office_desc": "2.79万", + "box_office_rate": "0.1%", + "split_box_office": "2.69", + "split_box_office_unit": "万", + "split_box_office_desc": "2.69万", + "split_box_office_rate": "0.1%", + "show_count": 952, + "show_count_rate": "0.2%", + "avg_show_view": "0.7", + "avg_seat_view": "0.7%", + "sum_box_desc": "2463.4万", + "sum_split_box_desc": "2194.8万" + }, + { + "movie_id": 1591480, + "movie_name": "白马姐妹", + "release_info": "", + "box_office": "2.09", + "box_office_unit": "万", + "box_office_desc": "2.09万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "2.09", + "split_box_office_unit": "万", + "split_box_office_desc": "2.09万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 2, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "418.0", + "avg_seat_view": "65.7%", + "sum_box_desc": "2.0万", + "sum_split_box_desc": "2.0万" + }, + { + "movie_id": 1519217, + "movie_name": "坪石先生", + "release_info": "上映43天", + "box_office": "1.76", + "box_office_unit": "万", + "box_office_desc": "1.76万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "1.76", + "split_box_office_unit": "万", + "split_box_office_desc": "1.76万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 11, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "61.4", + "avg_seat_view": "84.2%", + "sum_box_desc": "233.0万", + "sum_split_box_desc": "228.0万" + }, + { + "movie_id": 1499719, + "movie_name": "只此青绿", + "release_info": "", + "box_office": "1.66", + "box_office_unit": "万", + "box_office_desc": "1.66万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "1.44", + "split_box_office_unit": "万", + "split_box_office_desc": "1.44万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 823, + "show_count_rate": "0.2%", + "avg_show_view": "0.7", + "avg_seat_view": "0.6%", + "sum_box_desc": "5318.8万", + "sum_split_box_desc": "4830.5万" + }, + { + "movie_id": 1496400, + "movie_name": "天大的事", + "release_info": "上映12天", + "box_office": "1.29", + "box_office_unit": "万", + "box_office_desc": "1.29万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "1.18", + "split_box_office_unit": "万", + "split_box_office_desc": "1.18万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 4936, + "show_count_rate": "1.3%", + "avg_show_view": "\u003C0.1", + "avg_seat_view": "0.0%", + "sum_box_desc": "31.4万", + "sum_split_box_desc": "28.4万" + }, + { + "movie_id": 1461072, + "movie_name": "长空之王", + "release_info": "", + "box_office": "1.15", + "box_office_unit": "万", + "box_office_desc": "1.15万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "1.09", + "split_box_office_unit": "万", + "split_box_office_desc": "1.09万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 70, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "4.4", + "avg_seat_view": "5.7%", + "sum_box_desc": "8.54亿", + "sum_split_box_desc": "7.85亿" + }, + { + "movie_id": 1522287, + "movie_name": "长安的荔枝", + "release_info": "上映71天", + "box_office": "1.10", + "box_office_unit": "万", + "box_office_desc": "1.10万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.97", + "split_box_office_unit": "万", + "split_box_office_desc": "0.97万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 397, + "show_count_rate": "0.1%", + "avg_show_view": "0.8", + "avg_seat_view": "1.0%", + "sum_box_desc": "6.90亿", + "sum_split_box_desc": "6.15亿" + }, + { + "movie_id": 1562636, + "movie_name": "爱的暂停键", + "release_info": "上映22天", + "box_office": "1.06", + "box_office_unit": "万", + "box_office_desc": "1.06万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.94", + "split_box_office_unit": "万", + "split_box_office_desc": "0.94万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 182, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "1.3", + "avg_seat_view": "1.5%", + "sum_box_desc": "140.4万", + "sum_split_box_desc": "125.1万" + }, + { + "movie_id": 1592162, + "movie_name": "地球脉动:万物有道", + "release_info": "上映15天", + "box_office": "0.97", + "box_office_unit": "万", + "box_office_desc": "0.97万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.88", + "split_box_office_unit": "万", + "split_box_office_desc": "0.88万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 288, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "0.8", + "avg_seat_view": "0.7%", + "sum_box_desc": "43.4万", + "sum_split_box_desc": "39.2万" + }, + { + "movie_id": 1498162, + "movie_name": "午夜怪谈2", + "release_info": "上映15天", + "box_office": "0.97", + "box_office_unit": "万", + "box_office_desc": "0.97万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.87", + "split_box_office_unit": "万", + "split_box_office_desc": "0.87万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1792, + "show_count_rate": "0.5%", + "avg_show_view": "0.2", + "avg_seat_view": "0.1%", + "sum_box_desc": "156.3万", + "sum_split_box_desc": "138.9万" + }, + { + "movie_id": 1288259, + "movie_name": "如果悲伤可以解释", + "release_info": "上映30天", + "box_office": "0.82", + "box_office_unit": "万", + "box_office_desc": "0.82万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.75", + "split_box_office_unit": "万", + "split_box_office_desc": "0.75万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 2, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "110.0", + "avg_seat_view": "70.5%", + "sum_box_desc": "8.6万", + "sum_split_box_desc": "8.1万" + }, + { + "movie_id": 1470241, + "movie_name": "以法之名", + "release_info": "", + "box_office": "0.54", + "box_office_unit": "万", + "box_office_desc": "0.54万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.54", + "split_box_office_unit": "万", + "split_box_office_desc": "0.54万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 9, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "25.1", + "avg_seat_view": "29.6%", + "sum_box_desc": "93.9万", + "sum_split_box_desc": "93.8万" + }, + { + "movie_id": 1435060, + "movie_name": "夏雨来", + "release_info": "上映42天", + "box_office": "0.50", + "box_office_unit": "万", + "box_office_desc": "0.50万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.45", + "split_box_office_unit": "万", + "split_box_office_desc": "0.45万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 207, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "0.8", + "avg_seat_view": "0.8%", + "sum_box_desc": "2784.3万", + "sum_split_box_desc": "2498.7万" + }, + { + "movie_id": 1395730, + "movie_name": "老墙", + "release_info": "", + "box_office": "0.49", + "box_office_unit": "万", + "box_office_desc": "0.49万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.49", + "split_box_office_unit": "万", + "split_box_office_desc": "0.49万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 10, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "16.5", + "avg_seat_view": "11.0%", + "sum_box_desc": "123.5万", + "sum_split_box_desc": "121.5万" + }, + { + "movie_id": 1573266, + "movie_name": "带你回家", + "release_info": "点映", + "box_office": "0.47", + "box_office_unit": "万", + "box_office_desc": "0.47万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.45", + "split_box_office_unit": "万", + "split_box_office_desc": "0.45万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "131.0", + "avg_seat_view": "100.0%", + "sum_box_desc": "1.9万", + "sum_split_box_desc": "1.8万" + }, + { + "movie_id": 1360592, + "movie_name": "当男人恋爱时", + "release_info": "", + "box_office": "0.43", + "box_office_unit": "万", + "box_office_desc": "0.43万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.37", + "split_box_office_unit": "万", + "split_box_office_desc": "0.37万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 403, + "show_count_rate": "0.1%", + "avg_show_view": "0.3", + "avg_seat_view": "0.2%", + "sum_box_desc": "2.64亿", + "sum_split_box_desc": "2.32亿" + }, + { + "movie_id": 1449451, + "movie_name": "人生一世", + "release_info": "展映", + "box_office": "0.36", + "box_office_unit": "万", + "box_office_desc": "0.36万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.34", + "split_box_office_unit": "万", + "split_box_office_desc": "0.34万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "68.0", + "avg_seat_view": "68.0%", + "sum_box_desc": "2.2万", + "sum_split_box_desc": "2.1万" + }, + { + "movie_id": 1530212, + "movie_name": "蔡伦传奇", + "release_info": "上映首日", + "box_office": "0.33", + "box_office_unit": "万", + "box_office_desc": "0.33万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.33", + "split_box_office_unit": "万", + "split_box_office_desc": "0.33万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "134.0", + "avg_seat_view": "76.5%", + "sum_box_desc": "3352", + "sum_split_box_desc": "3352" + }, + { + "movie_id": 1530145, + "movie_name": "蜗牛回忆录", + "release_info": "上映22天", + "box_office": "0.28", + "box_office_unit": "万", + "box_office_desc": "0.28万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.25", + "split_box_office_unit": "万", + "split_box_office_desc": "0.25万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 88, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "0.8", + "avg_seat_view": "0.8%", + "sum_box_desc": "73.8万", + "sum_split_box_desc": "66.4万" + }, + { + "movie_id": 1469373, + "movie_name": "逃离抢钱镇", + "release_info": "上映14天", + "box_office": "0.28", + "box_office_unit": "万", + "box_office_desc": "0.28万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.25", + "split_box_office_unit": "万", + "split_box_office_desc": "0.25万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 110, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "0.6", + "avg_seat_view": "0.7%", + "sum_box_desc": "38.5万", + "sum_split_box_desc": "34.5万" + }, + { + "movie_id": 1490948, + "movie_name": "聊斋:兰若寺", + "release_info": "上映77天", + "box_office": "0.26", + "box_office_unit": "万", + "box_office_desc": "0.26万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.23", + "split_box_office_unit": "万", + "split_box_office_desc": "0.23万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 99, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "0.8", + "avg_seat_view": "0.9%", + "sum_box_desc": "2.43亿", + "sum_split_box_desc": "2.15亿" + }, + { + "movie_id": 1518617, + "movie_name": "小鹿斑比:清算", + "release_info": "上映21天", + "box_office": "0.26", + "box_office_unit": "万", + "box_office_desc": "0.26万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.23", + "split_box_office_unit": "万", + "split_box_office_desc": "0.23万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 590, + "show_count_rate": "0.1%", + "avg_show_view": "0.1", + "avg_seat_view": "0.1%", + "sum_box_desc": "217.6万", + "sum_split_box_desc": "194.5万" + }, + { + "movie_id": 1524059, + "movie_name": "别把作文当回事儿", + "release_info": "上映15天", + "box_office": "0.25", + "box_office_unit": "万", + "box_office_desc": "0.25万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.23", + "split_box_office_unit": "万", + "split_box_office_desc": "0.23万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 2, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "33.5", + "avg_seat_view": "20.1%", + "sum_box_desc": "55.8万", + "sum_split_box_desc": "55.0万" + }, + { + "movie_id": 1427899, + "movie_name": "天宝", + "release_info": "上映79天", + "box_office": "0.23", + "box_office_unit": "万", + "box_office_desc": "0.23万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.23", + "split_box_office_unit": "万", + "split_box_office_desc": "0.23万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 3, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "21.3", + "avg_seat_view": "16.9%", + "sum_box_desc": "351.2万", + "sum_split_box_desc": "343.0万" + }, + { + "movie_id": 1593298, + "movie_name": "海洋之谜", + "release_info": "展映", + "box_office": "0.20", + "box_office_unit": "万", + "box_office_desc": "0.20万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.19", + "split_box_office_unit": "万", + "split_box_office_desc": "0.19万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "41.0", + "avg_seat_view": "12.0%", + "sum_box_desc": "6.4万", + "sum_split_box_desc": "6.0万" + }, + { + "movie_id": 1487834, + "movie_name": "熊孩子·探险熊兵", + "release_info": "上映14天", + "box_office": "0.17", + "box_office_unit": "万", + "box_office_desc": "0.17万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.16", + "split_box_office_unit": "万", + "split_box_office_desc": "0.16万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 651, + "show_count_rate": "0.1%", + "avg_show_view": "\u003C0.1", + "avg_seat_view": "0.0%", + "sum_box_desc": "172.8万", + "sum_split_box_desc": "165.3万" + }, + { + "movie_id": 1491476, + "movie_name": "超人", + "release_info": "上映78天", + "box_office": "0.13", + "box_office_unit": "万", + "box_office_desc": "0.13万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.12", + "split_box_office_unit": "万", + "split_box_office_desc": "0.12万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 44, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "0.5", + "avg_seat_view": "0.5%", + "sum_box_desc": "6392.8万", + "sum_split_box_desc": "5729.0万" + }, + { + "movie_id": 1527997, + "movie_name": "大别山久生", + "release_info": "上映17天", + "box_office": "0.12", + "box_office_unit": "万", + "box_office_desc": "0.12万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.12", + "split_box_office_unit": "万", + "split_box_office_desc": "0.12万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 2, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "25.5", + "avg_seat_view": "18.8%", + "sum_box_desc": "3.1万", + "sum_split_box_desc": "3.1万" + }, + { + "movie_id": 1528424, + "movie_name": "午夜凶镜", + "release_info": "上映29天", + "box_office": "0.12", + "box_office_unit": "万", + "box_office_desc": "0.12万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.11", + "split_box_office_unit": "万", + "split_box_office_desc": "0.11万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 292, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "0.1", + "avg_seat_view": "0.1%", + "sum_box_desc": "172.0万", + "sum_split_box_desc": "152.2万" + }, + { + "movie_id": 1289244, + "movie_name": "吉普赛女王", + "release_info": "展映", + "box_office": "0.09", + "box_office_unit": "万", + "box_office_desc": "0.09万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.08", + "split_box_office_unit": "万", + "split_box_office_desc": "0.08万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "20.0", + "avg_seat_view": "10.1%", + "sum_box_desc": "6553", + "sum_split_box_desc": "6117" + }, + { + "movie_id": 1509826, + "movie_name": "伊甸", + "release_info": "上映36天", + "box_office": "0.08", + "box_office_unit": "万", + "box_office_desc": "0.08万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.07", + "split_box_office_unit": "万", + "split_box_office_desc": "0.07万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 15, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "1.5", + "avg_seat_view": "1.7%", + "sum_box_desc": "235.0万", + "sum_split_box_desc": "208.4万" + }, + { + "movie_id": 1320548, + "movie_name": "家庭简史", + "release_info": "上映15天", + "box_office": "0.08", + "box_office_unit": "万", + "box_office_desc": "0.08万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.07", + "split_box_office_unit": "万", + "split_box_office_desc": "0.07万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 41, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "0.5", + "avg_seat_view": "0.7%", + "sum_box_desc": "29.9万", + "sum_split_box_desc": "28.8万" + }, + { + "movie_id": 1470975, + "movie_name": "这周五的游乐场", + "release_info": "上映8天", + "box_office": "0.08", + "box_office_unit": "万", + "box_office_desc": "0.08万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.07", + "split_box_office_unit": "万", + "split_box_office_desc": "0.07万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 17, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "1.3", + "avg_seat_view": "1.5%", + "sum_box_desc": "15.0万", + "sum_split_box_desc": "14.7万" + }, + { + "movie_id": 1593302, + "movie_name": "飓风", + "release_info": "展映", + "box_office": "0.07", + "box_office_unit": "万", + "box_office_desc": "0.07万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.07", + "split_box_office_unit": "万", + "split_box_office_desc": "0.07万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "15.0", + "avg_seat_view": "4.4%", + "sum_box_desc": "3.3万", + "sum_split_box_desc": "3.1万" + }, + { + "movie_id": 1487768, + "movie_name": "巴扎喜事", + "release_info": "上映36天", + "box_office": "0.07", + "box_office_unit": "万", + "box_office_desc": "0.07万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.07", + "split_box_office_unit": "万", + "split_box_office_desc": "0.07万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 22, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "0.8", + "avg_seat_view": "0.9%", + "sum_box_desc": "144.9万", + "sum_split_box_desc": "137.1万" + }, + { + "movie_id": 1568020, + "movie_name": "喜羊羊与灰太狼之异国破晓", + "release_info": "上映63天", + "box_office": "0.07", + "box_office_unit": "万", + "box_office_desc": "0.07万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.06", + "split_box_office_unit": "万", + "split_box_office_desc": "0.06万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 80, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "0.3", + "avg_seat_view": "0.2%", + "sum_box_desc": "6206.1万", + "sum_split_box_desc": "5555.4万" + }, + { + "movie_id": 1525122, + "movie_name": "康熙与路易十四", + "release_info": "", + "box_office": "0.06", + "box_office_unit": "万", + "box_office_desc": "0.06万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.05", + "split_box_office_unit": "万", + "split_box_office_desc": "0.05万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "10.0", + "avg_seat_view": "40.0%", + "sum_box_desc": "304.0万", + "sum_split_box_desc": "298.6万" + }, + { + "movie_id": 1250604, + "movie_name": "里斯本丸沉没", + "release_info": "", + "box_office": "0.05", + "box_office_unit": "万", + "box_office_desc": "0.05万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.05", + "split_box_office_unit": "万", + "split_box_office_desc": "0.05万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 30, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "0.5", + "avg_seat_view": "0.6%", + "sum_box_desc": "4763.2万", + "sum_split_box_desc": "4345.3万" + }, + { + "movie_id": 1432141, + "movie_name": "戏台", + "release_info": "上映64天", + "box_office": "0.05", + "box_office_unit": "万", + "box_office_desc": "0.05万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.04", + "split_box_office_unit": "万", + "split_box_office_desc": "0.04万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 24, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "0.6", + "avg_seat_view": "0.7%", + "sum_box_desc": "4.11亿", + "sum_split_box_desc": "3.66亿" + }, + { + "movie_id": 40308, + "movie_name": "玛丽和麦克斯", + "release_info": "上映50天", + "box_office": "0.04", + "box_office_unit": "万", + "box_office_desc": "0.04万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.04", + "split_box_office_unit": "万", + "split_box_office_desc": "0.04万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 10, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "1.3", + "avg_seat_view": "1.7%", + "sum_box_desc": "107.1万", + "sum_split_box_desc": "97.2万" + }, + { + "movie_id": 1451361, + "movie_name": "我们的那一年", + "release_info": "上映29天", + "box_office": "0.04", + "box_office_unit": "万", + "box_office_desc": "0.04万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.04", + "split_box_office_unit": "万", + "split_box_office_desc": "0.04万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "9.0", + "avg_seat_view": "4.0%", + "sum_box_desc": "1.5万", + "sum_split_box_desc": "1.5万" + }, + { + "movie_id": 1431675, + "movie_name": "赎梦", + "release_info": "上映35天", + "box_office": "0.04", + "box_office_unit": "万", + "box_office_desc": "0.04万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.03", + "split_box_office_unit": "万", + "split_box_office_desc": "0.03万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 53, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "0.2", + "avg_seat_view": "0.2%", + "sum_box_desc": "561.8万", + "sum_split_box_desc": "503.4万" + }, + { + "movie_id": 308316, + "movie_name": "蜡笔小新:大人王国的反击", + "release_info": "上映91天", + "box_office": "0.04", + "box_office_unit": "万", + "box_office_desc": "0.04万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.03", + "split_box_office_unit": "万", + "split_box_office_desc": "0.03万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 9, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "1.2", + "avg_seat_view": "1.2%", + "sum_box_desc": "6827.9万", + "sum_split_box_desc": "6120.8万" + }, + { + "movie_id": 122157, + "movie_name": "孩子王", + "release_info": "", + "box_office": "0.03", + "box_office_unit": "万", + "box_office_desc": "0.03万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.03", + "split_box_office_unit": "万", + "split_box_office_desc": "0.03万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "6.0", + "avg_seat_view": "6.0%", + "sum_box_desc": "1.1万", + "sum_split_box_desc": "1.0万" + }, + { + "movie_id": 1452520, + "movie_name": "一生交给党", + "release_info": "", + "box_office": "0.03", + "box_office_unit": "万", + "box_office_desc": "0.03万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.03", + "split_box_office_unit": "万", + "split_box_office_desc": "0.03万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 4, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "2.3", + "avg_seat_view": "2.0%", + "sum_box_desc": "675.7万", + "sum_split_box_desc": "671.2万" + }, + { + "movie_id": 1481712, + "movie_name": "寻找1999的月老", + "release_info": "上映29天", + "box_office": "0.02", + "box_office_unit": "万", + "box_office_desc": "0.02万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.02", + "split_box_office_unit": "万", + "split_box_office_desc": "0.02万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 2, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "2.0", + "avg_seat_view": "2.2%", + "sum_box_desc": "52.3万", + "sum_split_box_desc": "50.1万" + }, + { + "movie_id": 1552267, + "movie_name": "山庄·惊魂", + "release_info": "上映92天", + "box_office": "0.02", + "box_office_unit": "万", + "box_office_desc": "0.02万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.02", + "split_box_office_unit": "万", + "split_box_office_desc": "0.02万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 3, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "1.3", + "avg_seat_view": "1.2%", + "sum_box_desc": "201.5万", + "sum_split_box_desc": "177.2万" + }, + { + "movie_id": 1551836, + "movie_name": "麦克白", + "release_info": "上映56天", + "box_office": "0.02", + "box_office_unit": "万", + "box_office_desc": "0.02万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.02", + "split_box_office_unit": "万", + "split_box_office_desc": "0.02万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "7.0", + "avg_seat_view": "14.0%", + "sum_box_desc": "37.9万", + "sum_split_box_desc": "34.7万" + }, + { + "movie_id": 1302189, + "movie_name": "零卡社团", + "release_info": "展映", + "box_office": "0.02", + "box_office_unit": "万", + "box_office_desc": "0.02万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.02", + "split_box_office_unit": "万", + "split_box_office_desc": "0.02万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 2, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "1.5", + "avg_seat_view": "1.7%", + "sum_box_desc": "3.9万", + "sum_split_box_desc": "3.7万" + }, + { + "movie_id": 1547375, + "movie_name": "同甘共苦", + "release_info": "展映", + "box_office": "0.02", + "box_office_unit": "万", + "box_office_desc": "0.02万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.01", + "split_box_office_unit": "万", + "split_box_office_desc": "0.01万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 18, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "0.3", + "avg_seat_view": "0.2%", + "sum_box_desc": "31.8万", + "sum_split_box_desc": "28.4万" + }, + { + "movie_id": 1462651, + "movie_name": "我们终将要和世界握手言和", + "release_info": "上映17天", + "box_office": "0.01", + "box_office_unit": "万", + "box_office_desc": "0.01万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.01", + "split_box_office_unit": "万", + "split_box_office_desc": "0.01万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 2, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "2.0", + "avg_seat_view": "1.6%", + "sum_box_desc": "3.4万", + "sum_split_box_desc": "3.3万" + }, + { + "movie_id": 1415196, + "movie_name": "无名", + "release_info": "", + "box_office": "0.01", + "box_office_unit": "万", + "box_office_desc": "0.01万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.01", + "split_box_office_unit": "万", + "split_box_office_desc": "0.01万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 4, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "1.0", + "avg_seat_view": "1.3%", + "sum_box_desc": "9.43亿", + "sum_split_box_desc": "8.88亿" + }, + { + "movie_id": 1301793, + "movie_name": "掬水月在手", + "release_info": "", + "box_office": "0.01", + "box_office_unit": "万", + "box_office_desc": "0.01万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.01", + "split_box_office_unit": "万", + "split_box_office_desc": "0.01万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "4.0", + "avg_seat_view": "4.0%", + "sum_box_desc": "790.8万", + "sum_split_box_desc": "728.3万" + }, + { + "movie_id": 1501764, + "movie_name": "威风锣鼓", + "release_info": "上映50天", + "box_office": "0.01", + "box_office_unit": "万", + "box_office_desc": "0.01万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.01", + "split_box_office_unit": "万", + "split_box_office_desc": "0.01万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "4.0", + "avg_seat_view": "4.3%", + "sum_box_desc": "1.3万", + "sum_split_box_desc": "1.2万" + }, + { + "movie_id": 1187439, + "movie_name": "侏罗纪世界3", + "release_info": "", + "box_office": "0.01", + "box_office_unit": "万", + "box_office_desc": "0.01万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.01", + "split_box_office_unit": "万", + "split_box_office_desc": "0.01万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "3.0", + "avg_seat_view": "2.7%", + "sum_box_desc": "10.59亿", + "sum_split_box_desc": "9.45亿" + }, + { + "movie_id": 1532831, + "movie_name": "潜艇总动员:冒险岛", + "release_info": "", + "box_office": "0.01", + "box_office_unit": "万", + "box_office_desc": "0.01万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.01", + "split_box_office_unit": "万", + "split_box_office_desc": "0.01万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 2, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "1.5", + "avg_seat_view": "1.0%", + "sum_box_desc": "1053.3万", + "sum_split_box_desc": "1002.9万" + }, + { + "movie_id": 1566861, + "movie_name": "血色牢笼", + "release_info": "上映22天", + "box_office": "0.01", + "box_office_unit": "万", + "box_office_desc": "0.01万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.01", + "split_box_office_unit": "万", + "split_box_office_desc": "0.01万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 8, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "0.4", + "avg_seat_view": "0.5%", + "sum_box_desc": "7.2万", + "sum_split_box_desc": "6.7万" + }, + { + "movie_id": 443609, + "movie_name": "圆梦餐厅", + "release_info": "上映50天", + "box_office": "0.01", + "box_office_unit": "万", + "box_office_desc": "0.01万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.01", + "split_box_office_unit": "万", + "split_box_office_desc": "0.01万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "3.0", + "avg_seat_view": "3.3%", + "sum_box_desc": "7.1万", + "sum_split_box_desc": "6.8万" + }, + { + "movie_id": 1524039, + "movie_name": "潍遗灯火阑珊处", + "release_info": "上映8天", + "box_office": "0.01", + "box_office_unit": "万", + "box_office_desc": "0.01万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.00", + "split_box_office_unit": "万", + "split_box_office_desc": "0.00万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "3.0", + "avg_seat_view": "6.2%", + "sum_box_desc": "673", + "sum_split_box_desc": "515" + }, + { + "movie_id": 1227946, + "movie_name": "甜蜜恰好也三十", + "release_info": "上映22天", + "box_office": "0.00", + "box_office_unit": "万", + "box_office_desc": "0.00万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.00", + "split_box_office_unit": "万", + "split_box_office_desc": "0.00万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 6, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "0.3", + "avg_seat_view": "0.4%", + "sum_box_desc": "10.3万", + "sum_split_box_desc": "10.1万" + }, + { + "movie_id": 246386, + "movie_name": "小王子", + "release_info": "", + "box_office": "0.00", + "box_office_unit": "万", + "box_office_desc": "0.00万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.00", + "split_box_office_unit": "万", + "split_box_office_desc": "0.00万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "2.0", + "avg_seat_view": "2.7%", + "sum_box_desc": "1.59亿", + "sum_split_box_desc": "1.59亿" + }, + { + "movie_id": 1583990, + "movie_name": "与世界的最后一眼相遇", + "release_info": "上映42天", + "box_office": "0.00", + "box_office_unit": "万", + "box_office_desc": "0.00万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.00", + "split_box_office_unit": "万", + "split_box_office_desc": "0.00万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 4, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "0.5", + "avg_seat_view": "0.6%", + "sum_box_desc": "75.5万", + "sum_split_box_desc": "68.5万" + }, + { + "movie_id": 1581104, + "movie_name": "生死狙杀", + "release_info": "上映26天", + "box_office": "0.00", + "box_office_unit": "万", + "box_office_desc": "0.00万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.00", + "split_box_office_unit": "万", + "split_box_office_desc": "0.00万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 18, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "0.1", + "avg_seat_view": "0.1%", + "sum_box_desc": "1849", + "sum_split_box_desc": "1635" + }, + { + "movie_id": 1547294, + "movie_name": "翡翠城巫师", + "release_info": "上映29天", + "box_office": "0.00", + "box_office_unit": "万", + "box_office_desc": "0.00万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.00", + "split_box_office_unit": "万", + "split_box_office_desc": "0.00万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 7, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "0.3", + "avg_seat_view": "0.2%", + "sum_box_desc": "11.7万", + "sum_split_box_desc": "10.5万" + }, + { + "movie_id": 1475139, + "movie_name": "魔法鼠乐园·神秘魔法球", + "release_info": "上映28天", + "box_office": "0.00", + "box_office_unit": "万", + "box_office_desc": "0.00万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.00", + "split_box_office_unit": "万", + "split_box_office_desc": "0.00万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 21, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "\u003C0.1", + "avg_seat_view": "0.1%", + "sum_box_desc": "25.8万", + "sum_split_box_desc": "22.9万" + }, + { + "movie_id": 78602, + "movie_name": "侏罗纪世界", + "release_info": "", + "box_office": "0.00", + "box_office_unit": "万", + "box_office_desc": "0.00万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.00", + "split_box_office_unit": "万", + "split_box_office_desc": "0.00万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "1.0", + "avg_seat_view": "0.8%", + "sum_box_desc": "14.18亿", + "sum_split_box_desc": "14.18亿" + }, + { + "movie_id": 296020, + "movie_name": "开国大典", + "release_info": "", + "box_office": "0.00", + "box_office_unit": "万", + "box_office_desc": "0.00万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.00", + "split_box_office_unit": "万", + "split_box_office_desc": "0.00万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "1.0", + "avg_seat_view": "1.0%", + "sum_box_desc": "4.4万", + "sum_split_box_desc": "4.4万" + }, + { + "movie_id": 246339, + "movie_name": "平原游击队", + "release_info": "展映", + "box_office": "0.00", + "box_office_unit": "万", + "box_office_desc": "0.00万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.00", + "split_box_office_unit": "万", + "split_box_office_desc": "0.00万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "1.0", + "avg_seat_view": "2.6%", + "sum_box_desc": "952", + "sum_split_box_desc": "916" + }, + { + "movie_id": 1387874, + "movie_name": "大突围", + "release_info": "", + "box_office": "0.00", + "box_office_unit": "万", + "box_office_desc": "0.00万", + "box_office_rate": "\u003C0.1%", + "split_box_office": "0.00", + "split_box_office_unit": "万", + "split_box_office_desc": "0.00万", + "split_box_office_rate": "\u003C0.1%", + "show_count": 1, + "show_count_rate": "\u003C0.1%", + "avg_show_view": "1.0", + "avg_seat_view": "0.6%", + "sum_box_desc": "1330.9万", + "sum_split_box_desc": "1313.2万" + } + ] + } } \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/index.html index d8d34dd3..986169cd 100644 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/index.html +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/index.html @@ -59,4 +59,4 @@ - + diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/js/main.js b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/js/main.js index 2d2764dd..f64fb5b8 100644 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/js/main.js +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/js/main.js @@ -287,4 +287,4 @@ if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", init); } else { init(); -} +} diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/返回接口.json index 509e4ae9..a62cc456 100644 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/返回接口.json +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼电视收视排行/返回接口.json @@ -1,435 +1,435 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "update_gap_second": 3, - "updated": "2025-09-26 16:22:45", - "updated_at": 1758874965018, - "list": [ - { - "programme_name": "六姊妹37", - "channel_name": "CCTV-1", - "market_rate": 16.1709, - "market_rate_desc": "16.1709%", - "attention_rate": 1.2816, - "attention_rate_desc": "1.2816%" - }, - { - "programme_name": "太行山上6", - "channel_name": "CCTV-4", - "market_rate": 8.2684, - "market_rate_desc": "8.2684%", - "attention_rate": 0.6553, - "attention_rate_desc": "0.6553%" - }, - { - "programme_name": "星推荐", - "channel_name": "CCTV-8", - "market_rate": 7.3725, - "market_rate_desc": "7.3725%", - "attention_rate": 0.5843, - "attention_rate_desc": "0.5843%" - }, - { - "programme_name": "炮兵司令朱瑞", - "channel_name": "CCTV-6", - "market_rate": 7.3315, - "market_rate_desc": "7.3315%", - "attention_rate": 0.5811, - "attention_rate_desc": "0.5811%" - }, - { - "programme_name": "新闻直播间", - "channel_name": "CCTV-13", - "market_rate": 4.4396, - "market_rate_desc": "4.4396%", - "attention_rate": 0.3519, - "attention_rate_desc": "0.3519%" - }, - { - "programme_name": "百姓剧场二:征服15", - "channel_name": "浙江卫视", - "market_rate": 4.3651, - "market_rate_desc": "4.3651%", - "attention_rate": 0.346, - "attention_rate_desc": "0.346%" - }, - { - "programme_name": "新相亲大会精华版", - "channel_name": "江苏卫视", - "market_rate": 4.0919, - "market_rate_desc": "4.0919%", - "attention_rate": 0.3243, - "attention_rate_desc": "0.3243%" - }, - { - "programme_name": "青春独播剧场:底线11", - "channel_name": "湖南卫视", - "market_rate": 3.9014, - "market_rate_desc": "3.9014%", - "attention_rate": 0.3092, - "attention_rate_desc": "0.3092%" - }, - { - "programme_name": "全景自然:黄石公园-飞翔的生命", - "channel_name": "CCTV-9", - "market_rate": 2.504, - "market_rate_desc": "2.504%", - "attention_rate": 0.1985, - "attention_rate_desc": "0.1985%" - }, - { - "programme_name": "运动一起赢", - "channel_name": "CCTV-5", - "market_rate": 2.0781, - "market_rate_desc": "2.0781%", - "attention_rate": 0.1647, - "attention_rate_desc": "0.1647%" - }, - { - "programme_name": "小日子19", - "channel_name": "东方卫视", - "market_rate": 1.9804, - "market_rate_desc": "1.9804%", - "attention_rate": 0.157, - "attention_rate_desc": "0.157%" - }, - { - "programme_name": "向幸福出发", - "channel_name": "CCTV-3", - "market_rate": 1.8832, - "market_rate_desc": "1.8832%", - "attention_rate": 0.1493, - "attention_rate_desc": "0.1493%" - }, - { - "programme_name": "浴血十四年16", - "channel_name": "CCTV-7", - "market_rate": 1.8485, - "market_rate_desc": "1.8485%", - "attention_rate": 0.1465, - "attention_rate_desc": "0.1465%" - }, - { - "programme_name": "正点财经", - "channel_name": "CCTV-2", - "market_rate": 1.7255, - "market_rate_desc": "1.7255%", - "attention_rate": 0.1368, - "attention_rate_desc": "0.1368%" - }, - { - "programme_name": "热播剧场:太行山上6", - "channel_name": "深圳卫视", - "market_rate": 1.6132, - "market_rate_desc": "1.6132%", - "attention_rate": 0.1279, - "attention_rate_desc": "0.1279%" - }, - { - "programme_name": "爱家剧场:父母爱情37", - "channel_name": "山东卫视", - "market_rate": 1.5558, - "market_rate_desc": "1.5558%", - "attention_rate": 0.1233, - "attention_rate_desc": "0.1233%" - }, - { - "programme_name": "刘家媳妇4", - "channel_name": "CCTV-17", - "market_rate": 1.3905, - "market_rate_desc": "1.3905%", - "attention_rate": 0.1102, - "attention_rate_desc": "0.1102%" - }, - { - "programme_name": "午茶剧场:归队8", - "channel_name": "北京卫视", - "market_rate": 1.1078, - "market_rate_desc": "1.1078%", - "attention_rate": 0.0878, - "attention_rate_desc": "0.0878%" - }, - { - "programme_name": "吉视剧场:武工队传奇46", - "channel_name": "吉林卫视", - "market_rate": 0.9407, - "market_rate_desc": "0.9407%", - "attention_rate": 0.0745, - "attention_rate_desc": "0.0745%" - }, - { - "programme_name": "情感剧场:朱元璋64", - "channel_name": "河北卫视", - "market_rate": 0.9211, - "market_rate_desc": "0.9211%", - "attention_rate": 0.073, - "attention_rate_desc": "0.073%" - }, - { - "programme_name": "下午剧场:战火青春3", - "channel_name": "广东卫视", - "market_rate": 0.9211, - "market_rate_desc": "0.9211%", - "attention_rate": 0.073, - "attention_rate_desc": "0.073%" - }, - { - "programme_name": "探索.发现-奥秘54", - "channel_name": "CCTV-10", - "market_rate": 0.822, - "market_rate_desc": "0.822%", - "attention_rate": 0.0652, - "attention_rate_desc": "0.0652%" - }, - { - "programme_name": "一线", - "channel_name": "CCTV-12", - "market_rate": 0.7949, - "market_rate_desc": "0.7949%", - "attention_rate": 0.063, - "attention_rate_desc": "0.063%" - }, - { - "programme_name": "海豚真情剧场:重案六组Ⅱ-45", - "channel_name": "安徽卫视", - "market_rate": 0.7684, - "market_rate_desc": "0.7684%", - "attention_rate": 0.0609, - "attention_rate_desc": "0.0609%" - }, - { - "programme_name": "中国女子围棋甲级联赛-第10轮", - "channel_name": "CCTV-5+", - "market_rate": 0.7621, - "market_rate_desc": "0.7621%", - "attention_rate": 0.0604, - "attention_rate_desc": "0.0604%" - }, - { - "programme_name": "休闲剧场:女子特战队2", - "channel_name": "天津卫视", - "market_rate": 0.6694, - "market_rate_desc": "0.6694%", - "attention_rate": 0.0531, - "attention_rate_desc": "0.0531%" - }, - { - "programme_name": "动画大放映:猪猪侠之超星五灵侠第八季", - "channel_name": "CCTV-14", - "market_rate": 0.6637, - "market_rate_desc": "0.6637%", - "attention_rate": 0.0526, - "attention_rate_desc": "0.0526%" - }, - { - "programme_name": "昆仑剧场:康熙微服私访记第三部30", - "channel_name": "青海卫视", - "market_rate": 0.6511, - "market_rate_desc": "0.6511%", - "attention_rate": 0.0516, - "attention_rate_desc": "0.0516%" - }, - { - "programme_name": "京剧电影工程-大闹天宫", - "channel_name": "CCTV-11", - "market_rate": 0.6069, - "market_rate_desc": "0.6069%", - "attention_rate": 0.0481, - "attention_rate_desc": "0.0481%" - }, - { - "programme_name": "温情剧场:神探狄仁杰Ⅱ-14", - "channel_name": "陕西卫视", - "market_rate": 0.571, - "market_rate_desc": "0.571%", - "attention_rate": 0.0453, - "attention_rate_desc": "0.0453%" - }, - { - "programme_name": "下午剧场:狙击部队30", - "channel_name": "贵州卫视", - "market_rate": 0.5558, - "market_rate_desc": "0.5558%", - "attention_rate": 0.0441, - "attention_rate_desc": "0.0441%" - }, - { - "programme_name": "白天剧场:西游记26", - "channel_name": "湖北卫视", - "market_rate": 0.5463, - "market_rate_desc": "0.5463%", - "attention_rate": 0.0433, - "attention_rate_desc": "0.0433%" - }, - { - "programme_name": "中国爱大剧场:神枪21", - "channel_name": "四川卫视", - "market_rate": 0.5388, - "market_rate_desc": "0.5388%", - "attention_rate": 0.0427, - "attention_rate_desc": "0.0427%" - }, - { - "programme_name": "全民开麦", - "channel_name": "CCTV-15", - "market_rate": 0.4915, - "market_rate_desc": "0.4915%", - "attention_rate": 0.039, - "attention_rate_desc": "0.039%" - }, - { - "programme_name": "下午剧场:仁心俱乐部10", - "channel_name": "东南卫视", - "market_rate": 0.4858, - "market_rate_desc": "0.4858%", - "attention_rate": 0.0385, - "attention_rate_desc": "0.0385%" - }, - { - "programme_name": "生活服务", - "channel_name": "江西卫视", - "market_rate": 0.4113, - "market_rate_desc": "0.4113%", - "attention_rate": 0.0326, - "attention_rate_desc": "0.0326%" - }, - { - "programme_name": "白天剧场:神医喜来乐25", - "channel_name": "宁夏卫视", - "market_rate": 0.4044, - "market_rate_desc": "0.4044%", - "attention_rate": 0.032, - "attention_rate_desc": "0.032%" - }, - { - "programme_name": "传奇剧场:铁血玫瑰15", - "channel_name": "黑龙江卫视", - "market_rate": 0.4031, - "market_rate_desc": "0.4031%", - "attention_rate": 0.032, - "attention_rate_desc": "0.032%" - }, - { - "programme_name": "经典剧场:亮剑30", - "channel_name": "广西卫视", - "market_rate": 0.3836, - "market_rate_desc": "0.3836%", - "attention_rate": 0.0304, - "attention_rate_desc": "0.0304%" - }, - { - "programme_name": "中国网球公开赛-女单-第二轮", - "channel_name": "CCTV-16", - "market_rate": 0.3539, - "market_rate_desc": "0.3539%", - "attention_rate": 0.0281, - "attention_rate_desc": "0.0281%" - }, - { - "programme_name": "生活服务", - "channel_name": "河南卫视", - "market_rate": 0.3413, - "market_rate_desc": "0.3413%", - "attention_rate": 0.0271, - "attention_rate_desc": "0.0271%" - }, - { - "programme_name": "生活服务", - "channel_name": "辽宁卫视", - "market_rate": 0.3318, - "market_rate_desc": "0.3318%", - "attention_rate": 0.0263, - "attention_rate_desc": "0.0263%" - }, - { - "programme_name": "传奇剧场:狼烟21", - "channel_name": "内蒙古卫视", - "market_rate": 0.3262, - "market_rate_desc": "0.3262%", - "attention_rate": 0.0258, - "attention_rate_desc": "0.0258%" - }, - { - "programme_name": "炫酷剧场:薛平贵与王宝钏19", - "channel_name": "云南卫视", - "market_rate": 0.3079, - "market_rate_desc": "0.3079%", - "attention_rate": 0.0244, - "attention_rate_desc": "0.0244%" - }, - { - "programme_name": "休闲剧场:历史转折中的邓小平17", - "channel_name": "兵团卫视", - "market_rate": 0.3035, - "market_rate_desc": "0.3035%", - "attention_rate": 0.0241, - "attention_rate_desc": "0.0241%" - }, - { - "programme_name": "亮剑12", - "channel_name": "重庆卫视", - "market_rate": 0.2656, - "market_rate_desc": "0.2656%", - "attention_rate": 0.0211, - "attention_rate_desc": "0.0211%" - }, - { - "programme_name": "阳光剧场:飞哥大英雄39", - "channel_name": "海南卫视", - "market_rate": 0.2643, - "market_rate_desc": "0.2643%", - "attention_rate": 0.021, - "attention_rate_desc": "0.021%" - }, - { - "programme_name": "劫中劫15-17", - "channel_name": "厦门卫视", - "market_rate": 0.246, - "market_rate_desc": "0.246%", - "attention_rate": 0.0195, - "attention_rate_desc": "0.0195%" - }, - { - "programme_name": "生活服务", - "channel_name": "甘肃卫视", - "market_rate": 0.2448, - "market_rate_desc": "0.2448%", - "attention_rate": 0.0194, - "attention_rate_desc": "0.0194%" - }, - { - "programme_name": "花季剧场:神枪7", - "channel_name": "中国教育台-1", - "market_rate": 0.1703, - "market_rate_desc": "0.1703%", - "attention_rate": 0.0135, - "attention_rate_desc": "0.0135%" - }, - { - "programme_name": "雪莲剧场:南来北往21", - "channel_name": "西藏卫视", - "market_rate": 0.1634, - "market_rate_desc": "0.1634%", - "attention_rate": 0.013, - "attention_rate_desc": "0.013%" - }, - { - "programme_name": "生活服务", - "channel_name": "山西卫视", - "market_rate": 0.1438, - "market_rate_desc": "0.1438%", - "attention_rate": 0.0114, - "attention_rate_desc": "0.0114%" - }, - { - "programme_name": "生活服务", - "channel_name": "新疆卫视", - "market_rate": 0.0656, - "market_rate_desc": "0.0656%", - "attention_rate": 0.0052, - "attention_rate_desc": "0.0052%" - } - ] - } +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": { + "update_gap_second": 3, + "updated": "2025-09-26 16:22:45", + "updated_at": 1758874965018, + "list": [ + { + "programme_name": "六姊妹37", + "channel_name": "CCTV-1", + "market_rate": 16.1709, + "market_rate_desc": "16.1709%", + "attention_rate": 1.2816, + "attention_rate_desc": "1.2816%" + }, + { + "programme_name": "太行山上6", + "channel_name": "CCTV-4", + "market_rate": 8.2684, + "market_rate_desc": "8.2684%", + "attention_rate": 0.6553, + "attention_rate_desc": "0.6553%" + }, + { + "programme_name": "星推荐", + "channel_name": "CCTV-8", + "market_rate": 7.3725, + "market_rate_desc": "7.3725%", + "attention_rate": 0.5843, + "attention_rate_desc": "0.5843%" + }, + { + "programme_name": "炮兵司令朱瑞", + "channel_name": "CCTV-6", + "market_rate": 7.3315, + "market_rate_desc": "7.3315%", + "attention_rate": 0.5811, + "attention_rate_desc": "0.5811%" + }, + { + "programme_name": "新闻直播间", + "channel_name": "CCTV-13", + "market_rate": 4.4396, + "market_rate_desc": "4.4396%", + "attention_rate": 0.3519, + "attention_rate_desc": "0.3519%" + }, + { + "programme_name": "百姓剧场二:征服15", + "channel_name": "浙江卫视", + "market_rate": 4.3651, + "market_rate_desc": "4.3651%", + "attention_rate": 0.346, + "attention_rate_desc": "0.346%" + }, + { + "programme_name": "新相亲大会精华版", + "channel_name": "江苏卫视", + "market_rate": 4.0919, + "market_rate_desc": "4.0919%", + "attention_rate": 0.3243, + "attention_rate_desc": "0.3243%" + }, + { + "programme_name": "青春独播剧场:底线11", + "channel_name": "湖南卫视", + "market_rate": 3.9014, + "market_rate_desc": "3.9014%", + "attention_rate": 0.3092, + "attention_rate_desc": "0.3092%" + }, + { + "programme_name": "全景自然:黄石公园-飞翔的生命", + "channel_name": "CCTV-9", + "market_rate": 2.504, + "market_rate_desc": "2.504%", + "attention_rate": 0.1985, + "attention_rate_desc": "0.1985%" + }, + { + "programme_name": "运动一起赢", + "channel_name": "CCTV-5", + "market_rate": 2.0781, + "market_rate_desc": "2.0781%", + "attention_rate": 0.1647, + "attention_rate_desc": "0.1647%" + }, + { + "programme_name": "小日子19", + "channel_name": "东方卫视", + "market_rate": 1.9804, + "market_rate_desc": "1.9804%", + "attention_rate": 0.157, + "attention_rate_desc": "0.157%" + }, + { + "programme_name": "向幸福出发", + "channel_name": "CCTV-3", + "market_rate": 1.8832, + "market_rate_desc": "1.8832%", + "attention_rate": 0.1493, + "attention_rate_desc": "0.1493%" + }, + { + "programme_name": "浴血十四年16", + "channel_name": "CCTV-7", + "market_rate": 1.8485, + "market_rate_desc": "1.8485%", + "attention_rate": 0.1465, + "attention_rate_desc": "0.1465%" + }, + { + "programme_name": "正点财经", + "channel_name": "CCTV-2", + "market_rate": 1.7255, + "market_rate_desc": "1.7255%", + "attention_rate": 0.1368, + "attention_rate_desc": "0.1368%" + }, + { + "programme_name": "热播剧场:太行山上6", + "channel_name": "深圳卫视", + "market_rate": 1.6132, + "market_rate_desc": "1.6132%", + "attention_rate": 0.1279, + "attention_rate_desc": "0.1279%" + }, + { + "programme_name": "爱家剧场:父母爱情37", + "channel_name": "山东卫视", + "market_rate": 1.5558, + "market_rate_desc": "1.5558%", + "attention_rate": 0.1233, + "attention_rate_desc": "0.1233%" + }, + { + "programme_name": "刘家媳妇4", + "channel_name": "CCTV-17", + "market_rate": 1.3905, + "market_rate_desc": "1.3905%", + "attention_rate": 0.1102, + "attention_rate_desc": "0.1102%" + }, + { + "programme_name": "午茶剧场:归队8", + "channel_name": "北京卫视", + "market_rate": 1.1078, + "market_rate_desc": "1.1078%", + "attention_rate": 0.0878, + "attention_rate_desc": "0.0878%" + }, + { + "programme_name": "吉视剧场:武工队传奇46", + "channel_name": "吉林卫视", + "market_rate": 0.9407, + "market_rate_desc": "0.9407%", + "attention_rate": 0.0745, + "attention_rate_desc": "0.0745%" + }, + { + "programme_name": "情感剧场:朱元璋64", + "channel_name": "河北卫视", + "market_rate": 0.9211, + "market_rate_desc": "0.9211%", + "attention_rate": 0.073, + "attention_rate_desc": "0.073%" + }, + { + "programme_name": "下午剧场:战火青春3", + "channel_name": "广东卫视", + "market_rate": 0.9211, + "market_rate_desc": "0.9211%", + "attention_rate": 0.073, + "attention_rate_desc": "0.073%" + }, + { + "programme_name": "探索.发现-奥秘54", + "channel_name": "CCTV-10", + "market_rate": 0.822, + "market_rate_desc": "0.822%", + "attention_rate": 0.0652, + "attention_rate_desc": "0.0652%" + }, + { + "programme_name": "一线", + "channel_name": "CCTV-12", + "market_rate": 0.7949, + "market_rate_desc": "0.7949%", + "attention_rate": 0.063, + "attention_rate_desc": "0.063%" + }, + { + "programme_name": "海豚真情剧场:重案六组Ⅱ-45", + "channel_name": "安徽卫视", + "market_rate": 0.7684, + "market_rate_desc": "0.7684%", + "attention_rate": 0.0609, + "attention_rate_desc": "0.0609%" + }, + { + "programme_name": "中国女子围棋甲级联赛-第10轮", + "channel_name": "CCTV-5+", + "market_rate": 0.7621, + "market_rate_desc": "0.7621%", + "attention_rate": 0.0604, + "attention_rate_desc": "0.0604%" + }, + { + "programme_name": "休闲剧场:女子特战队2", + "channel_name": "天津卫视", + "market_rate": 0.6694, + "market_rate_desc": "0.6694%", + "attention_rate": 0.0531, + "attention_rate_desc": "0.0531%" + }, + { + "programme_name": "动画大放映:猪猪侠之超星五灵侠第八季", + "channel_name": "CCTV-14", + "market_rate": 0.6637, + "market_rate_desc": "0.6637%", + "attention_rate": 0.0526, + "attention_rate_desc": "0.0526%" + }, + { + "programme_name": "昆仑剧场:康熙微服私访记第三部30", + "channel_name": "青海卫视", + "market_rate": 0.6511, + "market_rate_desc": "0.6511%", + "attention_rate": 0.0516, + "attention_rate_desc": "0.0516%" + }, + { + "programme_name": "京剧电影工程-大闹天宫", + "channel_name": "CCTV-11", + "market_rate": 0.6069, + "market_rate_desc": "0.6069%", + "attention_rate": 0.0481, + "attention_rate_desc": "0.0481%" + }, + { + "programme_name": "温情剧场:神探狄仁杰Ⅱ-14", + "channel_name": "陕西卫视", + "market_rate": 0.571, + "market_rate_desc": "0.571%", + "attention_rate": 0.0453, + "attention_rate_desc": "0.0453%" + }, + { + "programme_name": "下午剧场:狙击部队30", + "channel_name": "贵州卫视", + "market_rate": 0.5558, + "market_rate_desc": "0.5558%", + "attention_rate": 0.0441, + "attention_rate_desc": "0.0441%" + }, + { + "programme_name": "白天剧场:西游记26", + "channel_name": "湖北卫视", + "market_rate": 0.5463, + "market_rate_desc": "0.5463%", + "attention_rate": 0.0433, + "attention_rate_desc": "0.0433%" + }, + { + "programme_name": "中国爱大剧场:神枪21", + "channel_name": "四川卫视", + "market_rate": 0.5388, + "market_rate_desc": "0.5388%", + "attention_rate": 0.0427, + "attention_rate_desc": "0.0427%" + }, + { + "programme_name": "全民开麦", + "channel_name": "CCTV-15", + "market_rate": 0.4915, + "market_rate_desc": "0.4915%", + "attention_rate": 0.039, + "attention_rate_desc": "0.039%" + }, + { + "programme_name": "下午剧场:仁心俱乐部10", + "channel_name": "东南卫视", + "market_rate": 0.4858, + "market_rate_desc": "0.4858%", + "attention_rate": 0.0385, + "attention_rate_desc": "0.0385%" + }, + { + "programme_name": "生活服务", + "channel_name": "江西卫视", + "market_rate": 0.4113, + "market_rate_desc": "0.4113%", + "attention_rate": 0.0326, + "attention_rate_desc": "0.0326%" + }, + { + "programme_name": "白天剧场:神医喜来乐25", + "channel_name": "宁夏卫视", + "market_rate": 0.4044, + "market_rate_desc": "0.4044%", + "attention_rate": 0.032, + "attention_rate_desc": "0.032%" + }, + { + "programme_name": "传奇剧场:铁血玫瑰15", + "channel_name": "黑龙江卫视", + "market_rate": 0.4031, + "market_rate_desc": "0.4031%", + "attention_rate": 0.032, + "attention_rate_desc": "0.032%" + }, + { + "programme_name": "经典剧场:亮剑30", + "channel_name": "广西卫视", + "market_rate": 0.3836, + "market_rate_desc": "0.3836%", + "attention_rate": 0.0304, + "attention_rate_desc": "0.0304%" + }, + { + "programme_name": "中国网球公开赛-女单-第二轮", + "channel_name": "CCTV-16", + "market_rate": 0.3539, + "market_rate_desc": "0.3539%", + "attention_rate": 0.0281, + "attention_rate_desc": "0.0281%" + }, + { + "programme_name": "生活服务", + "channel_name": "河南卫视", + "market_rate": 0.3413, + "market_rate_desc": "0.3413%", + "attention_rate": 0.0271, + "attention_rate_desc": "0.0271%" + }, + { + "programme_name": "生活服务", + "channel_name": "辽宁卫视", + "market_rate": 0.3318, + "market_rate_desc": "0.3318%", + "attention_rate": 0.0263, + "attention_rate_desc": "0.0263%" + }, + { + "programme_name": "传奇剧场:狼烟21", + "channel_name": "内蒙古卫视", + "market_rate": 0.3262, + "market_rate_desc": "0.3262%", + "attention_rate": 0.0258, + "attention_rate_desc": "0.0258%" + }, + { + "programme_name": "炫酷剧场:薛平贵与王宝钏19", + "channel_name": "云南卫视", + "market_rate": 0.3079, + "market_rate_desc": "0.3079%", + "attention_rate": 0.0244, + "attention_rate_desc": "0.0244%" + }, + { + "programme_name": "休闲剧场:历史转折中的邓小平17", + "channel_name": "兵团卫视", + "market_rate": 0.3035, + "market_rate_desc": "0.3035%", + "attention_rate": 0.0241, + "attention_rate_desc": "0.0241%" + }, + { + "programme_name": "亮剑12", + "channel_name": "重庆卫视", + "market_rate": 0.2656, + "market_rate_desc": "0.2656%", + "attention_rate": 0.0211, + "attention_rate_desc": "0.0211%" + }, + { + "programme_name": "阳光剧场:飞哥大英雄39", + "channel_name": "海南卫视", + "market_rate": 0.2643, + "market_rate_desc": "0.2643%", + "attention_rate": 0.021, + "attention_rate_desc": "0.021%" + }, + { + "programme_name": "劫中劫15-17", + "channel_name": "厦门卫视", + "market_rate": 0.246, + "market_rate_desc": "0.246%", + "attention_rate": 0.0195, + "attention_rate_desc": "0.0195%" + }, + { + "programme_name": "生活服务", + "channel_name": "甘肃卫视", + "market_rate": 0.2448, + "market_rate_desc": "0.2448%", + "attention_rate": 0.0194, + "attention_rate_desc": "0.0194%" + }, + { + "programme_name": "花季剧场:神枪7", + "channel_name": "中国教育台-1", + "market_rate": 0.1703, + "market_rate_desc": "0.1703%", + "attention_rate": 0.0135, + "attention_rate_desc": "0.0135%" + }, + { + "programme_name": "雪莲剧场:南来北往21", + "channel_name": "西藏卫视", + "market_rate": 0.1634, + "market_rate_desc": "0.1634%", + "attention_rate": 0.013, + "attention_rate_desc": "0.013%" + }, + { + "programme_name": "生活服务", + "channel_name": "山西卫视", + "market_rate": 0.1438, + "market_rate_desc": "0.1438%", + "attention_rate": 0.0114, + "attention_rate_desc": "0.0114%" + }, + { + "programme_name": "生活服务", + "channel_name": "新疆卫视", + "market_rate": 0.0656, + "market_rate_desc": "0.0656%", + "attention_rate": 0.0052, + "attention_rate_desc": "0.0052%" + } + ] + } } \ 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 c6e8a215..9f2c3b64 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/css/style.css +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/css/style.css @@ -1,582 +1,582 @@ -/* 现代化猫眼票房排行榜样式 */ - -/* 全局重置和基础样式 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -:root { - /* 主色调 */ - --primary-color: #667eea; - --primary-light: #764ba2; - --secondary-color: #f093fb; - --accent-color: #4facfe; - - /* 中性色 */ - --text-primary: #2d3748; - --text-secondary: #4a5568; - --text-muted: #718096; - --bg-primary: #ffffff; - --bg-secondary: #f7fafc; - --bg-tertiary: #edf2f7; - - /* 状态色 */ - --success-color: #48bb78; - --warning-color: #ed8936; - --error-color: #f56565; - - /* 阴影 */ - --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1); - --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1); - --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1); - --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.15); - - /* 圆角 */ - --radius-sm: 6px; - --radius-md: 12px; - --radius-lg: 16px; - --radius-xl: 24px; - - /* 间距 */ - --space-xs: 4px; - --space-sm: 8px; - --space-md: 16px; - --space-lg: 24px; - --space-xl: 32px; - --space-2xl: 48px; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; - line-height: 1.6; - color: var(--text-primary); - background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); - min-height: 100vh; - position: relative; - overflow-x: hidden; -} - -/* 动态背景效果 */ -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: - radial-gradient(circle at 20% 80%, rgba(168, 230, 207, 0.15) 0%, transparent 40%), - radial-gradient(circle at 80% 20%, rgba(220, 237, 193, 0.12) 0%, transparent 40%), - radial-gradient(circle at 40% 40%, rgba(255, 211, 165, 0.1) 0%, transparent 40%); - z-index: -1; - animation: backgroundShift 30s ease-in-out infinite; -} - -@keyframes backgroundShift { - 0%, 100% { - transform: scale(1) rotate(0deg); - opacity: 0.8; - } - 50% { - transform: scale(1.1) rotate(180deg); - opacity: 0.6; - } -} - -/* 主容器 */ -.container { - max-width: 900px; - margin: var(--space-lg) auto; - padding: var(--space-xl); - background: rgba(255, 255, 255, 0.92); - backdrop-filter: blur(15px); - border-radius: var(--radius-xl); - box-shadow: 0 8px 32px rgba(76, 175, 80, 0.15); - border: 1px solid rgba(168, 230, 207, 0.3); - position: relative; - animation: slideUp 0.8s ease-out; -} - -@keyframes slideUp { - from { - opacity: 0; - transform: translateY(30px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -/* 头部样式 */ -.header { - text-align: center; - margin-bottom: var(--space-2xl); - padding-bottom: var(--space-lg); - border-bottom: 2px solid var(--bg-tertiary); - position: relative; -} - -.header::after { - content: ''; - position: absolute; - bottom: -2px; - left: 50%; - transform: translateX(-50%); - width: 60px; - height: 4px; - background: linear-gradient(90deg, #4caf50, #81c784); - border-radius: 2px; -} - -.header h1 { - display: flex; - align-items: center; - justify-content: center; - gap: var(--space-md); - margin-bottom: var(--space-md); - font-size: clamp(1.8rem, 4vw, 2.5rem); - font-weight: 700; - letter-spacing: -0.02em; - flex-wrap: wrap; -} - -.header h1 .icon { - font-size: 1.2em; - animation: bounce 2s infinite; - filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1)); -} - -@keyframes bounce { - 0%, 20%, 50%, 80%, 100% { - transform: translateY(0); - } - 40% { - transform: translateY(-8px); - } - 60% { - transform: translateY(-4px); - } -} - -.header h1 .title-text { - background: linear-gradient(135deg, #2e7d32, #4caf50); - -webkit-background-clip: text; - background-clip: text; - color: transparent; - position: relative; -} - -.header h1 .update-badge { - font-size: 0.4em; - background: linear-gradient(135deg, #66bb6a, #a5d6a7); - color: white; - padding: var(--space-xs) var(--space-md); - border-radius: var(--radius-xl); - font-weight: 600; - box-shadow: 0 4px 6px rgba(76, 175, 80, 0.3); - animation: pulse 3s infinite; - white-space: nowrap; -} - -@keyframes pulse { - 0%, 100% { - transform: scale(1); - box-shadow: var(--shadow-md); - } - 50% { - transform: scale(1.05); - box-shadow: var(--shadow-lg); - } -} - -.header-desc { - color: var(--text-secondary); - font-size: 1.1rem; - font-weight: 500; - margin-top: var(--space-sm); -} - -/* 加载状态 */ -.loading { - text-align: center; - padding: var(--space-2xl); - color: var(--text-secondary); -} - -.spinner { - width: 40px; - height: 40px; - margin: 0 auto var(--space-md); - border: 3px solid rgba(76, 175, 80, 0.2); - border-top: 3px solid #4caf50; - border-radius: 50%; - animation: spin 1s linear infinite; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* 内容区域 */ -.content { - animation: fadeIn 0.6s ease-out 0.2s both; -} - -@keyframes fadeIn { - from { - opacity: 0; - transform: translateY(20px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.ranking-title { - font-size: 1.5rem; - font-weight: 600; - color: var(--text-primary); - margin-bottom: var(--space-lg); - text-align: center; - position: relative; -} - -/* 电影列表 */ -.movie-list { - display: flex; - flex-direction: column; - gap: var(--space-md); -} - -.movie-item { - display: flex; - align-items: center; - gap: var(--space-md); - padding: var(--space-lg); - background: var(--bg-primary); - border-radius: var(--radius-lg); - box-shadow: var(--shadow-sm); - border: 1px solid rgba(0, 0, 0, 0.05); - transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); - position: relative; - overflow: hidden; -} - -.movie-item::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: linear-gradient(135deg, transparent 0%, rgba(76, 175, 80, 0.03) 100%); - opacity: 0; - transition: opacity 0.3s ease; -} - -.movie-item:hover { - transform: translateY(-4px); - box-shadow: 0 10px 25px rgba(76, 175, 80, 0.15); - border-color: rgba(76, 175, 80, 0.3); -} - -.movie-item:hover::before { - opacity: 1; -} - -/* 特殊排名样式 */ -.movie-item.top-1 { - background: linear-gradient(135deg, rgba(76, 175, 80, 0.08) 0%, var(--bg-primary) 100%); - border-color: rgba(76, 175, 80, 0.4); -} - -.movie-item.top-2 { - background: linear-gradient(135deg, rgba(129, 199, 132, 0.06) 0%, var(--bg-primary) 100%); - border-color: rgba(129, 199, 132, 0.3); -} - -.movie-item.top-3 { - background: linear-gradient(135deg, rgba(165, 214, 167, 0.05) 0%, var(--bg-primary) 100%); - border-color: rgba(165, 214, 167, 0.3); -} - -/* 排名徽章 */ -.movie-rank { - display: flex; - align-items: center; - justify-content: center; - width: 50px; - height: 50px; - border-radius: var(--radius-md); - font-size: 1.2rem; - font-weight: 700; - flex-shrink: 0; - transition: all 0.3s ease; - position: relative; -} - -.movie-item:hover .movie-rank { - transform: scale(1.1); -} - -.movie-rank.gold { - background: linear-gradient(135deg, #2e7d32, #4caf50); - color: white; - box-shadow: 0 4px 15px rgba(46, 125, 50, 0.4); -} - -.movie-rank.silver { - background: linear-gradient(135deg, #388e3c, #66bb6a); - color: white; - box-shadow: 0 4px 15px rgba(56, 142, 60, 0.4); -} - -.movie-rank.bronze { - background: linear-gradient(135deg, #4caf50, #81c784); - color: white; - box-shadow: 0 4px 15px rgba(76, 175, 80, 0.4); -} - -.movie-rank.regular { - background: linear-gradient(135deg, #66bb6a, #a5d6a7); - color: white; - box-shadow: 0 4px 15px rgba(102, 187, 106, 0.3); -} - -/* 电影内容 */ -.movie-content { - flex: 1; - display: flex; - flex-direction: column; - gap: var(--space-sm); - min-width: 0; -} - -.movie-title { - font-size: 1.1rem; - font-weight: 600; - color: var(--text-primary); - line-height: 1.4; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.movie-meta { - display: flex; - align-items: center; - justify-content: space-between; - gap: var(--space-md); - flex-wrap: wrap; -} - -.movie-year { - color: var(--text-muted); - font-size: 0.85rem; - background: var(--bg-tertiary); - padding: var(--space-xs) var(--space-sm); - border-radius: var(--radius-sm); - font-weight: 500; -} - -.movie-boxoffice { - font-weight: 700; - color: var(--warning-color); - font-size: 1rem; - white-space: nowrap; -} - -/* 更新时间 */ -.update-time { - text-align: center; - margin-top: var(--space-lg); - padding: var(--space-md); - background: var(--bg-secondary); - border-radius: var(--radius-md); - color: var(--text-secondary); - font-size: 0.9rem; - border: 1px solid var(--bg-tertiary); -} - -/* 错误状态 */ -.error { - text-align: center; - padding: var(--space-2xl); - color: var(--error-color); -} - -.error h3 { - font-size: 1.2rem; - margin-bottom: var(--space-md); -} - -.error p { - margin-bottom: var(--space-sm); - color: var(--text-secondary); -} - -/* 响应式设计 */ -@media (max-width: 768px) { - .container { - margin: var(--space-md); - padding: var(--space-lg); - border-radius: var(--radius-lg); - } - - .header { - margin-bottom: var(--space-lg); - padding-bottom: var(--space-md); - } - - .header h1 { - font-size: 1.8rem; - gap: var(--space-sm); - } - - .header h1 .update-badge { - font-size: 0.35em; - padding: 2px var(--space-sm); - } - - .movie-item { - padding: var(--space-md); - gap: var(--space-sm); - } - - .movie-rank { - width: 42px; - height: 42px; - font-size: 1rem; - } - - .movie-title { - font-size: 1rem; - } - - .movie-meta { - gap: var(--space-sm); - } - - .movie-year { - font-size: 0.8rem; - } - - .movie-boxoffice { - font-size: 0.9rem; - } -} - -@media (max-width: 480px) { - .container { - margin: var(--space-sm); - padding: var(--space-md); - } - - .header h1 { - font-size: 1.6rem; - flex-direction: column; - gap: var(--space-xs); - } - - .movie-list { - gap: var(--space-sm); - } - - .movie-item { - padding: var(--space-sm); - } - - .movie-rank { - width: 38px; - height: 38px; - font-size: 0.9rem; - } - - .movie-title { - font-size: 0.95rem; - } - - .movie-meta { - flex-direction: column; - align-items: flex-start; - gap: var(--space-xs); - } -} - -/* 减少动画以节省电池 */ -@media (prefers-reduced-motion: reduce) { - *, - *::before, - *::after { - animation-duration: 0.01ms !important; - animation-iteration-count: 1 !important; - transition-duration: 0.01ms !important; - } - - body::before { - animation: none; - } -} - -/* 深色模式支持 */ -@media (prefers-color-scheme: dark) { - :root { - --text-primary: #f7fafc; - --text-secondary: #e2e8f0; - --text-muted: #a0aec0; - --bg-primary: #2d3748; - --bg-secondary: #4a5568; - --bg-tertiary: #718096; - } - - body { - background: linear-gradient(135deg, #2d3748 0%, #4a5568 100%); - } - - .container { - background: rgba(45, 55, 72, 0.95); - border-color: rgba(255, 255, 255, 0.1); - } - - .movie-item { - background: var(--bg-primary); - border-color: rgba(255, 255, 255, 0.1); - } - - .movie-item:hover { - border-color: rgba(102, 126, 234, 0.4); - } -} - -/* 打印样式 */ -@media print { - body { - background: white; - color: black; - } - - body::before { - display: none; - } - - .container { - background: white; - box-shadow: none; - border: 1px solid #ccc; - } - - .movie-item { - break-inside: avoid; - box-shadow: none; - border: 1px solid #ddd; - } - - .header h1 .update-badge { - background: #666; - } +/* 现代化猫眼票房排行榜样式 */ + +/* 全局重置和基础样式 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +:root { + /* 主色调 */ + --primary-color: #667eea; + --primary-light: #764ba2; + --secondary-color: #f093fb; + --accent-color: #4facfe; + + /* 中性色 */ + --text-primary: #2d3748; + --text-secondary: #4a5568; + --text-muted: #718096; + --bg-primary: #ffffff; + --bg-secondary: #f7fafc; + --bg-tertiary: #edf2f7; + + /* 状态色 */ + --success-color: #48bb78; + --warning-color: #ed8936; + --error-color: #f56565; + + /* 阴影 */ + --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1); + --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1); + --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1); + --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.15); + + /* 圆角 */ + --radius-sm: 6px; + --radius-md: 12px; + --radius-lg: 16px; + --radius-xl: 24px; + + /* 间距 */ + --space-xs: 4px; + --space-sm: 8px; + --space-md: 16px; + --space-lg: 24px; + --space-xl: 32px; + --space-2xl: 48px; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; + line-height: 1.6; + color: var(--text-primary); + background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); + min-height: 100vh; + position: relative; + overflow-x: hidden; +} + +/* 动态背景效果 */ +body::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: + radial-gradient(circle at 20% 80%, rgba(168, 230, 207, 0.15) 0%, transparent 40%), + radial-gradient(circle at 80% 20%, rgba(220, 237, 193, 0.12) 0%, transparent 40%), + radial-gradient(circle at 40% 40%, rgba(255, 211, 165, 0.1) 0%, transparent 40%); + z-index: -1; + animation: backgroundShift 30s ease-in-out infinite; +} + +@keyframes backgroundShift { + 0%, 100% { + transform: scale(1) rotate(0deg); + opacity: 0.8; + } + 50% { + transform: scale(1.1) rotate(180deg); + opacity: 0.6; + } +} + +/* 主容器 */ +.container { + max-width: 900px; + margin: var(--space-lg) auto; + padding: var(--space-xl); + background: rgba(255, 255, 255, 0.92); + backdrop-filter: blur(15px); + border-radius: var(--radius-xl); + box-shadow: 0 8px 32px rgba(76, 175, 80, 0.15); + border: 1px solid rgba(168, 230, 207, 0.3); + position: relative; + animation: slideUp 0.8s ease-out; +} + +@keyframes slideUp { + from { + opacity: 0; + transform: translateY(30px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* 头部样式 */ +.header { + text-align: center; + margin-bottom: var(--space-2xl); + padding-bottom: var(--space-lg); + border-bottom: 2px solid var(--bg-tertiary); + position: relative; +} + +.header::after { + content: ''; + position: absolute; + bottom: -2px; + left: 50%; + transform: translateX(-50%); + width: 60px; + height: 4px; + background: linear-gradient(90deg, #4caf50, #81c784); + border-radius: 2px; +} + +.header h1 { + display: flex; + align-items: center; + justify-content: center; + gap: var(--space-md); + margin-bottom: var(--space-md); + font-size: clamp(1.8rem, 4vw, 2.5rem); + font-weight: 700; + letter-spacing: -0.02em; + flex-wrap: wrap; +} + +.header h1 .icon { + font-size: 1.2em; + animation: bounce 2s infinite; + filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1)); +} + +@keyframes bounce { + 0%, 20%, 50%, 80%, 100% { + transform: translateY(0); + } + 40% { + transform: translateY(-8px); + } + 60% { + transform: translateY(-4px); + } +} + +.header h1 .title-text { + background: linear-gradient(135deg, #2e7d32, #4caf50); + -webkit-background-clip: text; + background-clip: text; + color: transparent; + position: relative; +} + +.header h1 .update-badge { + font-size: 0.4em; + background: linear-gradient(135deg, #66bb6a, #a5d6a7); + color: white; + padding: var(--space-xs) var(--space-md); + border-radius: var(--radius-xl); + font-weight: 600; + box-shadow: 0 4px 6px rgba(76, 175, 80, 0.3); + animation: pulse 3s infinite; + white-space: nowrap; +} + +@keyframes pulse { + 0%, 100% { + transform: scale(1); + box-shadow: var(--shadow-md); + } + 50% { + transform: scale(1.05); + box-shadow: var(--shadow-lg); + } +} + +.header-desc { + color: var(--text-secondary); + font-size: 1.1rem; + font-weight: 500; + margin-top: var(--space-sm); +} + +/* 加载状态 */ +.loading { + text-align: center; + padding: var(--space-2xl); + color: var(--text-secondary); +} + +.spinner { + width: 40px; + height: 40px; + margin: 0 auto var(--space-md); + border: 3px solid rgba(76, 175, 80, 0.2); + border-top: 3px solid #4caf50; + border-radius: 50%; + animation: spin 1s linear infinite; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* 内容区域 */ +.content { + animation: fadeIn 0.6s ease-out 0.2s both; +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.ranking-title { + font-size: 1.5rem; + font-weight: 600; + color: var(--text-primary); + margin-bottom: var(--space-lg); + text-align: center; + position: relative; +} + +/* 电影列表 */ +.movie-list { + display: flex; + flex-direction: column; + gap: var(--space-md); +} + +.movie-item { + display: flex; + align-items: center; + gap: var(--space-md); + padding: var(--space-lg); + background: var(--bg-primary); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-sm); + border: 1px solid rgba(0, 0, 0, 0.05); + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + position: relative; + overflow: hidden; +} + +.movie-item::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: linear-gradient(135deg, transparent 0%, rgba(76, 175, 80, 0.03) 100%); + opacity: 0; + transition: opacity 0.3s ease; +} + +.movie-item:hover { + transform: translateY(-4px); + box-shadow: 0 10px 25px rgba(76, 175, 80, 0.15); + border-color: rgba(76, 175, 80, 0.3); +} + +.movie-item:hover::before { + opacity: 1; +} + +/* 特殊排名样式 */ +.movie-item.top-1 { + background: linear-gradient(135deg, rgba(76, 175, 80, 0.08) 0%, var(--bg-primary) 100%); + border-color: rgba(76, 175, 80, 0.4); +} + +.movie-item.top-2 { + background: linear-gradient(135deg, rgba(129, 199, 132, 0.06) 0%, var(--bg-primary) 100%); + border-color: rgba(129, 199, 132, 0.3); +} + +.movie-item.top-3 { + background: linear-gradient(135deg, rgba(165, 214, 167, 0.05) 0%, var(--bg-primary) 100%); + border-color: rgba(165, 214, 167, 0.3); +} + +/* 排名徽章 */ +.movie-rank { + display: flex; + align-items: center; + justify-content: center; + width: 50px; + height: 50px; + border-radius: var(--radius-md); + font-size: 1.2rem; + font-weight: 700; + flex-shrink: 0; + transition: all 0.3s ease; + position: relative; +} + +.movie-item:hover .movie-rank { + transform: scale(1.1); +} + +.movie-rank.gold { + background: linear-gradient(135deg, #2e7d32, #4caf50); + color: white; + box-shadow: 0 4px 15px rgba(46, 125, 50, 0.4); +} + +.movie-rank.silver { + background: linear-gradient(135deg, #388e3c, #66bb6a); + color: white; + box-shadow: 0 4px 15px rgba(56, 142, 60, 0.4); +} + +.movie-rank.bronze { + background: linear-gradient(135deg, #4caf50, #81c784); + color: white; + box-shadow: 0 4px 15px rgba(76, 175, 80, 0.4); +} + +.movie-rank.regular { + background: linear-gradient(135deg, #66bb6a, #a5d6a7); + color: white; + box-shadow: 0 4px 15px rgba(102, 187, 106, 0.3); +} + +/* 电影内容 */ +.movie-content { + flex: 1; + display: flex; + flex-direction: column; + gap: var(--space-sm); + min-width: 0; +} + +.movie-title { + font-size: 1.1rem; + font-weight: 600; + color: var(--text-primary); + line-height: 1.4; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.movie-meta { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-md); + flex-wrap: wrap; +} + +.movie-year { + color: var(--text-muted); + font-size: 0.85rem; + background: var(--bg-tertiary); + padding: var(--space-xs) var(--space-sm); + border-radius: var(--radius-sm); + font-weight: 500; +} + +.movie-boxoffice { + font-weight: 700; + color: var(--warning-color); + font-size: 1rem; + white-space: nowrap; +} + +/* 更新时间 */ +.update-time { + text-align: center; + margin-top: var(--space-lg); + padding: var(--space-md); + background: var(--bg-secondary); + border-radius: var(--radius-md); + color: var(--text-secondary); + font-size: 0.9rem; + border: 1px solid var(--bg-tertiary); +} + +/* 错误状态 */ +.error { + text-align: center; + padding: var(--space-2xl); + color: var(--error-color); +} + +.error h3 { + font-size: 1.2rem; + margin-bottom: var(--space-md); +} + +.error p { + margin-bottom: var(--space-sm); + color: var(--text-secondary); +} + +/* 响应式设计 */ +@media (max-width: 768px) { + .container { + margin: var(--space-md); + padding: var(--space-lg); + border-radius: var(--radius-lg); + } + + .header { + margin-bottom: var(--space-lg); + padding-bottom: var(--space-md); + } + + .header h1 { + font-size: 1.8rem; + gap: var(--space-sm); + } + + .header h1 .update-badge { + font-size: 0.35em; + padding: 2px var(--space-sm); + } + + .movie-item { + padding: var(--space-md); + gap: var(--space-sm); + } + + .movie-rank { + width: 42px; + height: 42px; + font-size: 1rem; + } + + .movie-title { + font-size: 1rem; + } + + .movie-meta { + gap: var(--space-sm); + } + + .movie-year { + font-size: 0.8rem; + } + + .movie-boxoffice { + font-size: 0.9rem; + } +} + +@media (max-width: 480px) { + .container { + margin: var(--space-sm); + padding: var(--space-md); + } + + .header h1 { + font-size: 1.6rem; + flex-direction: column; + gap: var(--space-xs); + } + + .movie-list { + gap: var(--space-sm); + } + + .movie-item { + padding: var(--space-sm); + } + + .movie-rank { + width: 38px; + height: 38px; + font-size: 0.9rem; + } + + .movie-title { + font-size: 0.95rem; + } + + .movie-meta { + flex-direction: column; + align-items: flex-start; + gap: var(--space-xs); + } +} + +/* 减少动画以节省电池 */ +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } + + body::before { + animation: none; + } +} + +/* 深色模式支持 */ +@media (prefers-color-scheme: dark) { + :root { + --text-primary: #f7fafc; + --text-secondary: #e2e8f0; + --text-muted: #a0aec0; + --bg-primary: #2d3748; + --bg-secondary: #4a5568; + --bg-tertiary: #718096; + } + + body { + background: linear-gradient(135deg, #2d3748 0%, #4a5568 100%); + } + + .container { + background: rgba(45, 55, 72, 0.95); + border-color: rgba(255, 255, 255, 0.1); + } + + .movie-item { + background: var(--bg-primary); + border-color: rgba(255, 255, 255, 0.1); + } + + .movie-item:hover { + border-color: rgba(102, 126, 234, 0.4); + } +} + +/* 打印样式 */ +@media print { + body { + background: white; + color: black; + } + + body::before { + display: none; + } + + .container { + background: white; + box-shadow: none; + border: 1px solid #ccc; + } + + .movie-item { + break-inside: avoid; + box-shadow: none; + border: 1px solid #ddd; + } + + .header h1 .update-badge { + background: #666; + } } \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/index.html index 8ce9b1b3..69ebcdca 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/index.html +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/index.html @@ -1,41 +1,41 @@ - - - - - - - - 猫眼票房排行榜 | 全球电影总票房 - - - - - - - - -
      - -
      -

      - 🎬 - 猫眼票房排行榜 - 实时更新 -

      -

      全球电影总票房榜单 | 权威数据 | 实时更新

      -
      - - -
      -
      -

      正在加载票房数据...

      -
      - - -
      -
      - - - - + + + + + + + + 猫眼票房排行榜 | 全球电影总票房 + + + + + + + + +
      + +
      +

      + 🎬 + 猫眼票房排行榜 + 实时更新 +

      +

      全球电影总票房榜单 | 权威数据 | 实时更新

      +
      + + +
      +
      +

      正在加载票房数据...

      +
      + + +
      +
      + + + + \ 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 b66a2537..126db9fa 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/js/script.js +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/js/script.js @@ -1,266 +1,266 @@ -// 猫眼票房排行榜 - 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/maoyan`); - } catch (e) { - // 如果无法加载接口集合,使用默认接口 - this.endpoints = ['https://60s.api.shumengya.top/v2/maoyan']; - } - }, - // 获取当前接口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; - } -}; - -let elements = {}; - -// 初始化 -window.addEventListener('DOMContentLoaded', () => { - initElements(); - loadMaoyanList(); -}); - -function initElements() { - elements = { - container: document.getElementById('ranking-content'), - loading: document.getElementById('loading'), - updateTime: document.getElementById('api-update-time'), - statsTotal: document.getElementById('stats-total'), - statsTop10: document.getElementById('stats-top10') - }; -} - -async function loadMaoyanList() { - try { - showLoading(true); - - // 优先从线上API请求 - let data = await fetchFromAPI(); - - // 如果线上失败,尝试从本地返回接口.json加载 - if (!data) { - data = await fetchFromLocal(); - } - - if (!data || data.code !== 200 || !data.data) { - throw new Error(data && data.message ? data.message : '未能获取到有效数据'); - } - - renderRanking(data.data); - } catch (error) { - console.error('加载排行榜失败:', error); - showError(error.message || '加载失败,请稍后重试'); - } finally { - showLoading(false); - } -} - -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 renderRanking(payload) { - const { list = [], tip = '', update_time = '', update_time_at } = payload || {}; - - // 更新时间 - if (elements.updateTime) { - elements.updateTime.textContent = update_time ? `更新时间:${update_time}` : ''; - } - - // 统计信息 - if (elements.statsTotal) { - elements.statsTotal.textContent = list.length; - } - if (elements.statsTop10) { - elements.statsTop10.textContent = Math.min(10, list.length); - } - - // 渲染列表 - const html = ` -
      -

      全球电影总票房排行榜

      -
      - ${list.map(item => renderMovieItem(item)).join('')} -
      -
      - ${tip ? `
      ${escapeHtml(tip)}
      ` : ''} - ${update_time ? `
      更新时间:${escapeHtml(update_time)}
      ` : ''} - `; - - elements.container.innerHTML = html; - elements.container.classList.add('fade-in'); -} - -// 格式化票房数据,将数字转换为更易读的形式 -function formatBoxOffice(value) { - if (!value) return '未知'; - - // 将字符串转换为数字 - const num = typeof value === 'string' ? parseFloat(value.replace(/[^0-9.]/g, '')) : value; - - if (isNaN(num)) return value; - - if (num >= 100000000) { - return (num / 100000000).toFixed(2) + ' 亿'; - } else if (num >= 10000) { - return (num / 10000).toFixed(2) + ' 万'; - } else { - return num.toLocaleString(); - } -} - -function renderMovieItem(item) { - const rank = item.rank; - const cls = rank === 1 ? 'top-1' : rank === 2 ? 'top-2' : rank === 3 ? 'top-3' : ''; - const badgeCls = rank === 1 ? 'gold' : rank === 2 ? 'silver' : rank === 3 ? 'bronze' : 'regular'; - - // 格式化票房数据 - const boxOffice = formatBoxOffice(item.boxoffice || item.box_office); - - // 美化排名显示 - let rankDisplay; - if (rank === 1) { - rankDisplay = '🏆'; - } else if (rank === 2) { - rankDisplay = '🥈'; - } else if (rank === 3) { - rankDisplay = '🥉'; - } else { - rankDisplay = rank; - } - - return ` -
      -
      ${rankDisplay}
      -
      -
      ${escapeHtml(item.movie_name)}
      -
      - ${escapeHtml(item.release_year || '未知')} - ¥${boxOffice} -
      -
      -
      `; -} - - -function formatCurrencyDesc(desc, num) { - if (desc && typeof desc === 'string' && desc.trim()) return desc; - if (typeof num === 'number') { - // 人民币按亿元显示 - if (num >= 1e8) return (num / 1e8).toFixed(2) + '亿元'; - if (num >= 1e4) return (num / 1e4).toFixed(2) + '万元'; - return num.toLocaleString('zh-CN') + '元'; - } - return '—'; -} - -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) return; - elements.container.innerHTML = ` -
      -

      ⚠️ 加载失败

      -

      ${escapeHtml(message)}

      -

      请稍后重试

      -
      - `; - elements.container.style.display = 'block'; -} - -function escapeHtml(text) { - if (text == null) return ''; - const div = document.createElement('div'); - div.textContent = String(text); - return div.innerHTML; -} - -// 键盘刷新快捷键 Ctrl/Cmd + R 刷新数据区域(不刷新整页) -window.addEventListener('keydown', (e) => { - if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'r') { - e.preventDefault(); - loadMaoyanList(); - } +// 猫眼票房排行榜 - 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/maoyan`); + } catch (e) { + // 如果无法加载接口集合,使用默认接口 + this.endpoints = ['https://60s.api.shumengya.top/v2/maoyan']; + } + }, + // 获取当前接口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; + } +}; + +let elements = {}; + +// 初始化 +window.addEventListener('DOMContentLoaded', () => { + initElements(); + loadMaoyanList(); +}); + +function initElements() { + elements = { + container: document.getElementById('ranking-content'), + loading: document.getElementById('loading'), + updateTime: document.getElementById('api-update-time'), + statsTotal: document.getElementById('stats-total'), + statsTop10: document.getElementById('stats-top10') + }; +} + +async function loadMaoyanList() { + try { + showLoading(true); + + // 优先从线上API请求 + let data = await fetchFromAPI(); + + // 如果线上失败,尝试从本地返回接口.json加载 + if (!data) { + data = await fetchFromLocal(); + } + + if (!data || data.code !== 200 || !data.data) { + throw new Error(data && data.message ? data.message : '未能获取到有效数据'); + } + + renderRanking(data.data); + } catch (error) { + console.error('加载排行榜失败:', error); + showError(error.message || '加载失败,请稍后重试'); + } finally { + showLoading(false); + } +} + +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 renderRanking(payload) { + const { list = [], tip = '', update_time = '', update_time_at } = payload || {}; + + // 更新时间 + if (elements.updateTime) { + elements.updateTime.textContent = update_time ? `更新时间:${update_time}` : ''; + } + + // 统计信息 + if (elements.statsTotal) { + elements.statsTotal.textContent = list.length; + } + if (elements.statsTop10) { + elements.statsTop10.textContent = Math.min(10, list.length); + } + + // 渲染列表 + const html = ` +
      +

      全球电影总票房排行榜

      +
      + ${list.map(item => renderMovieItem(item)).join('')} +
      +
      + ${tip ? `
      ${escapeHtml(tip)}
      ` : ''} + ${update_time ? `
      更新时间:${escapeHtml(update_time)}
      ` : ''} + `; + + elements.container.innerHTML = html; + elements.container.classList.add('fade-in'); +} + +// 格式化票房数据,将数字转换为更易读的形式 +function formatBoxOffice(value) { + if (!value) return '未知'; + + // 将字符串转换为数字 + const num = typeof value === 'string' ? parseFloat(value.replace(/[^0-9.]/g, '')) : value; + + if (isNaN(num)) return value; + + if (num >= 100000000) { + return (num / 100000000).toFixed(2) + ' 亿'; + } else if (num >= 10000) { + return (num / 10000).toFixed(2) + ' 万'; + } else { + return num.toLocaleString(); + } +} + +function renderMovieItem(item) { + const rank = item.rank; + const cls = rank === 1 ? 'top-1' : rank === 2 ? 'top-2' : rank === 3 ? 'top-3' : ''; + const badgeCls = rank === 1 ? 'gold' : rank === 2 ? 'silver' : rank === 3 ? 'bronze' : 'regular'; + + // 格式化票房数据 + const boxOffice = formatBoxOffice(item.boxoffice || item.box_office); + + // 美化排名显示 + let rankDisplay; + if (rank === 1) { + rankDisplay = '🏆'; + } else if (rank === 2) { + rankDisplay = '🥈'; + } else if (rank === 3) { + rankDisplay = '🥉'; + } else { + rankDisplay = rank; + } + + return ` +
      +
      ${rankDisplay}
      +
      +
      ${escapeHtml(item.movie_name)}
      +
      + ${escapeHtml(item.release_year || '未知')} + ¥${boxOffice} +
      +
      +
      `; +} + + +function formatCurrencyDesc(desc, num) { + if (desc && typeof desc === 'string' && desc.trim()) return desc; + if (typeof num === 'number') { + // 人民币按亿元显示 + if (num >= 1e8) return (num / 1e8).toFixed(2) + '亿元'; + if (num >= 1e4) return (num / 1e4).toFixed(2) + '万元'; + return num.toLocaleString('zh-CN') + '元'; + } + return '—'; +} + +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) return; + elements.container.innerHTML = ` +
      +

      ⚠️ 加载失败

      +

      ${escapeHtml(message)}

      +

      请稍后重试

      +
      + `; + elements.container.style.display = 'block'; +} + +function escapeHtml(text) { + if (text == null) return ''; + const div = document.createElement('div'); + div.textContent = String(text); + return div.innerHTML; +} + +// 键盘刷新快捷键 Ctrl/Cmd + R 刷新数据区域(不刷新整页) +window.addEventListener('keydown', (e) => { + if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'r') { + e.preventDefault(); + loadMaoyanList(); + } }); \ 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 945e5cfe..e430d395 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/返回接口.json +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼票房排行榜/返回接口.json @@ -1,171 +1,171 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "list": [ - { - "rank": 1, - "maoyan_id": 243, - "movie_name": "阿凡达", - "release_year": "2009", - "box_office": 21200972239, - "box_office_desc": "212.01亿元" - }, - { - "rank": 2, - "maoyan_id": 248172, - "movie_name": "复仇者联盟 4:终局之战", - "release_year": "2019", - "box_office": 20299852689, - "box_office_desc": "203亿元" - }, - { - "rank": 3, - "maoyan_id": 78461, - "movie_name": "阿凡达:水之道", - "release_year": "2022", - "box_office": 16825062887, - "box_office_desc": "168.25亿元" - }, - { - "rank": 4, - "maoyan_id": 267, - "movie_name": "泰坦尼克号", - "release_year": "1997", - "box_office": 16423064756, - "box_office_desc": "164.23亿元" - }, - { - "rank": 5, - "maoyan_id": 1294273, - "movie_name": "哪吒之魔童闹海", - "release_year": "2025", - "box_office": 15908714214, - "box_office_desc": "159.09亿元" - }, - { - "rank": 6, - "maoyan_id": 78536, - "movie_name": "星球大战:原力觉醒", - "release_year": "2015", - "box_office": 15019898914, - "box_office_desc": "150.2亿元" - }, - { - "rank": 7, - "maoyan_id": 248170, - "movie_name": "复仇者联盟 3:无限战争", - "release_year": "2018", - "box_office": 14882882413, - "box_office_desc": "148.83亿元" - }, - { - "rank": 8, - "maoyan_id": 1254435, - "movie_name": "蜘蛛侠:英雄无归", - "release_year": "2021", - "box_office": 14160042137, - "box_office_desc": "141.6亿元" - }, - { - "rank": 9, - "maoyan_id": 1479534, - "movie_name": "头脑特工队 2", - "release_year": "2024", - "box_office": 12319141075, - "box_office_desc": "123.19亿元" - }, - { - "rank": 10, - "maoyan_id": 78602, - "movie_name": "侏罗纪世界", - "release_year": "2015", - "box_office": 12120986621, - "box_office_desc": "121.21亿元" - }, - { - "rank": 11, - "maoyan_id": 1189879, - "movie_name": "狮子王", - "release_year": "2019", - "box_office": 12051977766, - "box_office_desc": "120.52亿元" - }, - { - "rank": 12, - "maoyan_id": 262, - "movie_name": "复仇者联盟", - "release_year": "2012", - "box_office": 11026033139, - "box_office_desc": "110.26亿元" - }, - { - "rank": 13, - "maoyan_id": 78405, - "movie_name": "速度与激情 7", - "release_year": "2015", - "box_office": 10988354292, - "box_office_desc": "109.88亿元" - }, - { - "rank": 14, - "maoyan_id": 341152, - "movie_name": "壮志凌云 2:独行侠", - "release_year": "2022", - "box_office": 10845892091, - "box_office_desc": "108.46亿元" - }, - { - "rank": 15, - "maoyan_id": 247949, - "movie_name": "冰雪奇缘 2", - "release_year": "2019", - "box_office": 10541240357, - "box_office_desc": "105.41亿元" - }, - { - "rank": 16, - "maoyan_id": 344942, - "movie_name": "芭比", - "release_year": "2023", - "box_office": 10493054406, - "box_office_desc": "104.93亿元" - }, - { - "rank": 17, - "maoyan_id": 78429, - "movie_name": "复仇者联盟 2:奥创纪元", - "release_year": "2015", - "box_office": 10188347873, - "box_office_desc": "101.88亿元" - }, - { - "rank": 18, - "maoyan_id": 1250896, - "movie_name": "超级马里奥兄弟大电影", - "release_year": "2023", - "box_office": 9868050757, - "box_office_desc": "98.68亿元" - }, - { - "rank": 19, - "maoyan_id": 341138, - "movie_name": "黑豹", - "release_year": "2018", - "box_office": 9788853998, - "box_office_desc": "97.89亿元" - }, - { - "rank": 20, - "maoyan_id": 916, - "movie_name": "哈利・波特与死亡圣器(下)", - "release_year": "2011", - "box_office": 9735002643, - "box_office_desc": "97.35亿元" - } - ], - "tip": "注:内地票房数据实时更新,包括点映及预售票房。港澳台及海外票房为统计数据,每小时更新。汇率采用 2025年1月31日市场汇率,1美元≈7.2514人民币", - "update_time": "2025/08/19 14:41:34", - "update_time_at": 1755585694385 - } +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": { + "list": [ + { + "rank": 1, + "maoyan_id": 243, + "movie_name": "阿凡达", + "release_year": "2009", + "box_office": 21200972239, + "box_office_desc": "212.01亿元" + }, + { + "rank": 2, + "maoyan_id": 248172, + "movie_name": "复仇者联盟 4:终局之战", + "release_year": "2019", + "box_office": 20299852689, + "box_office_desc": "203亿元" + }, + { + "rank": 3, + "maoyan_id": 78461, + "movie_name": "阿凡达:水之道", + "release_year": "2022", + "box_office": 16825062887, + "box_office_desc": "168.25亿元" + }, + { + "rank": 4, + "maoyan_id": 267, + "movie_name": "泰坦尼克号", + "release_year": "1997", + "box_office": 16423064756, + "box_office_desc": "164.23亿元" + }, + { + "rank": 5, + "maoyan_id": 1294273, + "movie_name": "哪吒之魔童闹海", + "release_year": "2025", + "box_office": 15908714214, + "box_office_desc": "159.09亿元" + }, + { + "rank": 6, + "maoyan_id": 78536, + "movie_name": "星球大战:原力觉醒", + "release_year": "2015", + "box_office": 15019898914, + "box_office_desc": "150.2亿元" + }, + { + "rank": 7, + "maoyan_id": 248170, + "movie_name": "复仇者联盟 3:无限战争", + "release_year": "2018", + "box_office": 14882882413, + "box_office_desc": "148.83亿元" + }, + { + "rank": 8, + "maoyan_id": 1254435, + "movie_name": "蜘蛛侠:英雄无归", + "release_year": "2021", + "box_office": 14160042137, + "box_office_desc": "141.6亿元" + }, + { + "rank": 9, + "maoyan_id": 1479534, + "movie_name": "头脑特工队 2", + "release_year": "2024", + "box_office": 12319141075, + "box_office_desc": "123.19亿元" + }, + { + "rank": 10, + "maoyan_id": 78602, + "movie_name": "侏罗纪世界", + "release_year": "2015", + "box_office": 12120986621, + "box_office_desc": "121.21亿元" + }, + { + "rank": 11, + "maoyan_id": 1189879, + "movie_name": "狮子王", + "release_year": "2019", + "box_office": 12051977766, + "box_office_desc": "120.52亿元" + }, + { + "rank": 12, + "maoyan_id": 262, + "movie_name": "复仇者联盟", + "release_year": "2012", + "box_office": 11026033139, + "box_office_desc": "110.26亿元" + }, + { + "rank": 13, + "maoyan_id": 78405, + "movie_name": "速度与激情 7", + "release_year": "2015", + "box_office": 10988354292, + "box_office_desc": "109.88亿元" + }, + { + "rank": 14, + "maoyan_id": 341152, + "movie_name": "壮志凌云 2:独行侠", + "release_year": "2022", + "box_office": 10845892091, + "box_office_desc": "108.46亿元" + }, + { + "rank": 15, + "maoyan_id": 247949, + "movie_name": "冰雪奇缘 2", + "release_year": "2019", + "box_office": 10541240357, + "box_office_desc": "105.41亿元" + }, + { + "rank": 16, + "maoyan_id": 344942, + "movie_name": "芭比", + "release_year": "2023", + "box_office": 10493054406, + "box_office_desc": "104.93亿元" + }, + { + "rank": 17, + "maoyan_id": 78429, + "movie_name": "复仇者联盟 2:奥创纪元", + "release_year": "2015", + "box_office": 10188347873, + "box_office_desc": "101.88亿元" + }, + { + "rank": 18, + "maoyan_id": 1250896, + "movie_name": "超级马里奥兄弟大电影", + "release_year": "2023", + "box_office": 9868050757, + "box_office_desc": "98.68亿元" + }, + { + "rank": 19, + "maoyan_id": 341138, + "movie_name": "黑豹", + "release_year": "2018", + "box_office": 9788853998, + "box_office_desc": "97.89亿元" + }, + { + "rank": 20, + "maoyan_id": 916, + "movie_name": "哈利・波特与死亡圣器(下)", + "release_year": "2011", + "box_office": 9735002643, + "box_office_desc": "97.35亿元" + } + ], + "tip": "注:内地票房数据实时更新,包括点映及预售票房。港澳台及海外票房为统计数据,每小时更新。汇率采用 2025年1月31日市场汇率,1美元≈7.2514人民币", + "update_time": "2025/08/19 14:41:34", + "update_time_at": 1755585694385 + } } \ 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 d0f81de8..f9843a4d 100644 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/css/background.css +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/css/background.css @@ -73,4 +73,4 @@ bottom: -140px; right: -120px; } -} +} diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/css/style.css b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/css/style.css index 295f26e9..18ffe2c7 100644 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/css/style.css +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/css/style.css @@ -390,4 +390,4 @@ body { transition-duration: 0.01ms !important; scroll-behavior: auto !important; } -} +} diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/index.html index 83480eae..7057cfaf 100644 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/index.html +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/index.html @@ -59,4 +59,4 @@ - + diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/js/main.js b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/js/main.js index 67b44e88..dfd8c965 100644 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/js/main.js +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/js/main.js @@ -290,4 +290,4 @@ if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", init); } else { init(); -} +} diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/返回接口.json index 7afcbc25..3c212306 100644 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/返回接口.json +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/猫眼网剧实时热度/返回接口.json @@ -1,311 +1,311 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": { - "update_gap_second": 3, - "updated": "2025-09-26 16:36:56", - "updated_at": 1758875816062, - "list": [ - { - "series_id": 1517707, - "series_name": "赴山海", - "release_info": "上线16天", - "platform_desc": "多平台播放", - "platform_txt": -1, - "curr_heat": 6290.29, - "curr_heat_desc": "6290.29", - "bar_value": 6290.29 - }, - { - "series_id": 1528168, - "series_name": "许我耀眼", - "release_info": "上线首日", - "platform_desc": "腾讯视频独播", - "platform_txt": -1, - "curr_heat": 6231.35, - "curr_heat_desc": "6231.35", - "bar_value": 5749.54721862606 - }, - { - "series_id": 1528151, - "series_name": "欢乐家长群2", - "release_info": "上线12天", - "platform_desc": "芒果TV独播", - "platform_txt": -1, - "curr_heat": 6012.95, - "curr_heat_desc": "6012.95", - "bar_value": 5119.06438712135 - }, - { - "series_id": 1492955, - "series_name": "吴邪私家笔记", - "release_info": "上线7天", - "platform_desc": "腾讯视频独播", - "platform_txt": -1, - "curr_heat": 5851.91, - "curr_heat_desc": "5851.91", - "bar_value": 4596.76326056356 - }, - { - "series_id": 1538034, - "series_name": "不眠日", - "release_info": "上线10天", - "platform_desc": "多平台播放", - "platform_txt": -1, - "curr_heat": 5804.09, - "curr_heat_desc": "5804.09", - "bar_value": 4206.68639815508 - }, - { - "series_id": 1501684, - "series_name": "灼灼韶华", - "release_info": "上线16天", - "platform_desc": "优酷独播", - "platform_txt": 0, - "curr_heat": 5799.01, - "curr_heat_desc": "5799.01", - "bar_value": 3878.03171596132 - }, - { - "series_id": 1474248, - "series_name": "围猎", - "release_info": "上线2天", - "platform_desc": "多平台播放", - "platform_txt": -1, - "curr_heat": 5752.05, - "curr_heat_desc": "5752.05", - "bar_value": 3549.20963005863 - }, - { - "series_id": 1501687, - "series_name": "守护者们", - "release_info": "上线4天", - "platform_desc": "多平台播放", - "platform_txt": -1, - "curr_heat": 5730.63, - "curr_heat_desc": "5730.63", - "bar_value": 3262.59275525736 - }, - { - "series_id": 1520710, - "series_name": "生万物", - "release_info": "上线45天", - "platform_desc": "爱奇艺独播", - "platform_txt": 1, - "curr_heat": 5475.27, - "curr_heat_desc": "5475.27", - "bar_value": 2876.18977832356 - }, - { - "series_id": 1520734, - "series_name": "芬芳喜事", - "release_info": "上线5天", - "platform_desc": "腾讯视频独播", - "platform_txt": -1, - "curr_heat": 5462.54, - "curr_heat_desc": "5462.54", - "bar_value": 2647.63508938203 - }, - { - "series_id": 1506349, - "series_name": "子夜归", - "release_info": "上线40天", - "platform_desc": "腾讯视频独播", - "platform_txt": -1, - "curr_heat": 5414.09, - "curr_heat_desc": "5414.09", - "bar_value": 2421.25465526037 - }, - { - "series_id": 1568466, - "series_name": "照镜辞", - "release_info": "上线8天", - "platform_desc": "哔哩哔哩独播", - "platform_txt": -1, - "curr_heat": 5405.94, - "curr_heat_desc": "5405.94", - "bar_value": 2230.68228745166 - }, - { - "series_id": 1501665, - "series_name": "足迹", - "release_info": "上线23天", - "platform_desc": "多平台播放", - "platform_txt": -1, - "curr_heat": 5345.55, - "curr_heat_desc": "5345.55", - "bar_value": 2035.21546242053 - }, - { - "series_id": 1481475, - "series_name": "与晋长安", - "release_info": "上线34天", - "platform_desc": "爱奇艺独播", - "platform_txt": 1, - "curr_heat": 5231.26, - "curr_heat_desc": "5231.26", - "bar_value": 1837.70502435479 - }, - { - "series_id": 1500426, - "series_name": "归队", - "release_info": "上线33天", - "platform_desc": "腾讯视频独播", - "platform_txt": -1, - "curr_heat": 5167.29, - "curr_heat_desc": "5167.29", - "bar_value": 1674.88052510491 - }, - { - "series_id": 1513970, - "series_name": "阵地", - "release_info": "上线11天", - "platform_desc": "多平台播放", - "platform_txt": -1, - "curr_heat": 5155.5, - "curr_heat_desc": "5155.50", - "bar_value": 1541.8541283172 - }, - { - "series_id": 1578416, - "series_name": "金式森林", - "release_info": "上线10天", - "platform_desc": "腾讯视频独播", - "platform_txt": -1, - "curr_heat": 5098.99, - "curr_heat_desc": "5098.99", - "bar_value": 1407.04554929882 - }, - { - "series_id": 1500365, - "series_name": "锦月如歌", - "release_info": "上线52天", - "platform_desc": "多平台播放", - "platform_txt": -1, - "curr_heat": 5082.9, - "curr_heat_desc": "5082.90", - "bar_value": 1294.15728646218 - }, - { - "series_id": 1481543, - "series_name": "凡人修仙传", - "release_info": "上线62天", - "platform_desc": "优酷独播", - "platform_txt": 0, - "curr_heat": 5064.74, - "curr_heat_desc": "5064.74", - "bar_value": 1189.82790916312 - }, - { - "series_id": 1521009, - "series_name": "十二封信", - "release_info": "上线29天", - "platform_desc": "腾讯视频独播", - "platform_txt": -1, - "curr_heat": 5029.58, - "curr_heat_desc": "5029.58", - "bar_value": 1090.21013799029 - }, - { - "series_id": 1492917, - "series_name": "献鱼", - "release_info": "上线42天", - "platform_desc": "优酷独播", - "platform_txt": 0, - "curr_heat": 5010.95, - "curr_heat_desc": "5010.95", - "bar_value": 1002.19 - }, - { - "series_id": 1444502, - "series_name": "利剑·玫瑰", - "release_info": "上线61天", - "platform_desc": "多平台播放", - "platform_txt": -1, - "curr_heat": 4972.54, - "curr_heat_desc": "4972.54", - "bar_value": 917.613471447017 - }, - { - "series_id": 1518217, - "series_name": "扫毒风暴", - "release_info": "上线77天", - "platform_desc": "腾讯视频独播", - "platform_txt": -1, - "curr_heat": 4896.37, - "curr_heat_desc": "4896.37", - "bar_value": 833.695051286619 - }, - { - "series_id": 1500364, - "series_name": "桃花映江山", - "release_info": "上线94天", - "platform_desc": "腾讯视频独播", - "platform_txt": -1, - "curr_heat": 4806.34, - "curr_heat_desc": "4806.34", - "bar_value": 755.090462080828 - }, - { - "series_id": 1505465, - "series_name": "定风波", - "release_info": "上线57天", - "platform_desc": "爱奇艺独播", - "platform_txt": 1, - "curr_heat": 4744.14, - "curr_heat_desc": "4744.14", - "bar_value": 687.69123872798 - }, - { - "series_id": 1531702, - "series_name": "书卷一梦", - "release_info": "上线93天", - "platform_desc": "爱奇艺独播", - "platform_txt": 1, - "curr_heat": 4733.39, - "curr_heat_desc": "4733.39", - "bar_value": 633.081734434469 - }, - { - "series_id": 1500328, - "series_name": "蓄意宠爱", - "release_info": "上线5天", - "platform_desc": "优酷独播", - "platform_txt": 0, - "curr_heat": 4730.18, - "curr_heat_desc": "4730.18", - "bar_value": 583.736247352187 - }, - { - "series_id": 1532221, - "series_name": "目之所及", - "release_info": "上线30天", - "platform_desc": "爱奇艺独播", - "platform_txt": 1, - "curr_heat": 4712.48, - "curr_heat_desc": "4712.48", - "bar_value": 536.586836256929 - }, - { - "series_id": 1524115, - "series_name": "白夜宸缘起三生", - "release_info": "上线13天", - "platform_desc": "腾讯视频独播", - "platform_txt": -1, - "curr_heat": 4653.77, - "curr_heat_desc": "4653.77", - "bar_value": 488.930252012005 - }, - { - "series_id": 1491942, - "series_name": "朝雪录", - "release_info": "上线76天", - "platform_desc": "爱奇艺独播", - "platform_txt": 1, - "curr_heat": 4623.3, - "curr_heat_desc": "4623.30", - "bar_value": 448.172875941959 - } - ] - } +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": { + "update_gap_second": 3, + "updated": "2025-09-26 16:36:56", + "updated_at": 1758875816062, + "list": [ + { + "series_id": 1517707, + "series_name": "赴山海", + "release_info": "上线16天", + "platform_desc": "多平台播放", + "platform_txt": -1, + "curr_heat": 6290.29, + "curr_heat_desc": "6290.29", + "bar_value": 6290.29 + }, + { + "series_id": 1528168, + "series_name": "许我耀眼", + "release_info": "上线首日", + "platform_desc": "腾讯视频独播", + "platform_txt": -1, + "curr_heat": 6231.35, + "curr_heat_desc": "6231.35", + "bar_value": 5749.54721862606 + }, + { + "series_id": 1528151, + "series_name": "欢乐家长群2", + "release_info": "上线12天", + "platform_desc": "芒果TV独播", + "platform_txt": -1, + "curr_heat": 6012.95, + "curr_heat_desc": "6012.95", + "bar_value": 5119.06438712135 + }, + { + "series_id": 1492955, + "series_name": "吴邪私家笔记", + "release_info": "上线7天", + "platform_desc": "腾讯视频独播", + "platform_txt": -1, + "curr_heat": 5851.91, + "curr_heat_desc": "5851.91", + "bar_value": 4596.76326056356 + }, + { + "series_id": 1538034, + "series_name": "不眠日", + "release_info": "上线10天", + "platform_desc": "多平台播放", + "platform_txt": -1, + "curr_heat": 5804.09, + "curr_heat_desc": "5804.09", + "bar_value": 4206.68639815508 + }, + { + "series_id": 1501684, + "series_name": "灼灼韶华", + "release_info": "上线16天", + "platform_desc": "优酷独播", + "platform_txt": 0, + "curr_heat": 5799.01, + "curr_heat_desc": "5799.01", + "bar_value": 3878.03171596132 + }, + { + "series_id": 1474248, + "series_name": "围猎", + "release_info": "上线2天", + "platform_desc": "多平台播放", + "platform_txt": -1, + "curr_heat": 5752.05, + "curr_heat_desc": "5752.05", + "bar_value": 3549.20963005863 + }, + { + "series_id": 1501687, + "series_name": "守护者们", + "release_info": "上线4天", + "platform_desc": "多平台播放", + "platform_txt": -1, + "curr_heat": 5730.63, + "curr_heat_desc": "5730.63", + "bar_value": 3262.59275525736 + }, + { + "series_id": 1520710, + "series_name": "生万物", + "release_info": "上线45天", + "platform_desc": "爱奇艺独播", + "platform_txt": 1, + "curr_heat": 5475.27, + "curr_heat_desc": "5475.27", + "bar_value": 2876.18977832356 + }, + { + "series_id": 1520734, + "series_name": "芬芳喜事", + "release_info": "上线5天", + "platform_desc": "腾讯视频独播", + "platform_txt": -1, + "curr_heat": 5462.54, + "curr_heat_desc": "5462.54", + "bar_value": 2647.63508938203 + }, + { + "series_id": 1506349, + "series_name": "子夜归", + "release_info": "上线40天", + "platform_desc": "腾讯视频独播", + "platform_txt": -1, + "curr_heat": 5414.09, + "curr_heat_desc": "5414.09", + "bar_value": 2421.25465526037 + }, + { + "series_id": 1568466, + "series_name": "照镜辞", + "release_info": "上线8天", + "platform_desc": "哔哩哔哩独播", + "platform_txt": -1, + "curr_heat": 5405.94, + "curr_heat_desc": "5405.94", + "bar_value": 2230.68228745166 + }, + { + "series_id": 1501665, + "series_name": "足迹", + "release_info": "上线23天", + "platform_desc": "多平台播放", + "platform_txt": -1, + "curr_heat": 5345.55, + "curr_heat_desc": "5345.55", + "bar_value": 2035.21546242053 + }, + { + "series_id": 1481475, + "series_name": "与晋长安", + "release_info": "上线34天", + "platform_desc": "爱奇艺独播", + "platform_txt": 1, + "curr_heat": 5231.26, + "curr_heat_desc": "5231.26", + "bar_value": 1837.70502435479 + }, + { + "series_id": 1500426, + "series_name": "归队", + "release_info": "上线33天", + "platform_desc": "腾讯视频独播", + "platform_txt": -1, + "curr_heat": 5167.29, + "curr_heat_desc": "5167.29", + "bar_value": 1674.88052510491 + }, + { + "series_id": 1513970, + "series_name": "阵地", + "release_info": "上线11天", + "platform_desc": "多平台播放", + "platform_txt": -1, + "curr_heat": 5155.5, + "curr_heat_desc": "5155.50", + "bar_value": 1541.8541283172 + }, + { + "series_id": 1578416, + "series_name": "金式森林", + "release_info": "上线10天", + "platform_desc": "腾讯视频独播", + "platform_txt": -1, + "curr_heat": 5098.99, + "curr_heat_desc": "5098.99", + "bar_value": 1407.04554929882 + }, + { + "series_id": 1500365, + "series_name": "锦月如歌", + "release_info": "上线52天", + "platform_desc": "多平台播放", + "platform_txt": -1, + "curr_heat": 5082.9, + "curr_heat_desc": "5082.90", + "bar_value": 1294.15728646218 + }, + { + "series_id": 1481543, + "series_name": "凡人修仙传", + "release_info": "上线62天", + "platform_desc": "优酷独播", + "platform_txt": 0, + "curr_heat": 5064.74, + "curr_heat_desc": "5064.74", + "bar_value": 1189.82790916312 + }, + { + "series_id": 1521009, + "series_name": "十二封信", + "release_info": "上线29天", + "platform_desc": "腾讯视频独播", + "platform_txt": -1, + "curr_heat": 5029.58, + "curr_heat_desc": "5029.58", + "bar_value": 1090.21013799029 + }, + { + "series_id": 1492917, + "series_name": "献鱼", + "release_info": "上线42天", + "platform_desc": "优酷独播", + "platform_txt": 0, + "curr_heat": 5010.95, + "curr_heat_desc": "5010.95", + "bar_value": 1002.19 + }, + { + "series_id": 1444502, + "series_name": "利剑·玫瑰", + "release_info": "上线61天", + "platform_desc": "多平台播放", + "platform_txt": -1, + "curr_heat": 4972.54, + "curr_heat_desc": "4972.54", + "bar_value": 917.613471447017 + }, + { + "series_id": 1518217, + "series_name": "扫毒风暴", + "release_info": "上线77天", + "platform_desc": "腾讯视频独播", + "platform_txt": -1, + "curr_heat": 4896.37, + "curr_heat_desc": "4896.37", + "bar_value": 833.695051286619 + }, + { + "series_id": 1500364, + "series_name": "桃花映江山", + "release_info": "上线94天", + "platform_desc": "腾讯视频独播", + "platform_txt": -1, + "curr_heat": 4806.34, + "curr_heat_desc": "4806.34", + "bar_value": 755.090462080828 + }, + { + "series_id": 1505465, + "series_name": "定风波", + "release_info": "上线57天", + "platform_desc": "爱奇艺独播", + "platform_txt": 1, + "curr_heat": 4744.14, + "curr_heat_desc": "4744.14", + "bar_value": 687.69123872798 + }, + { + "series_id": 1531702, + "series_name": "书卷一梦", + "release_info": "上线93天", + "platform_desc": "爱奇艺独播", + "platform_txt": 1, + "curr_heat": 4733.39, + "curr_heat_desc": "4733.39", + "bar_value": 633.081734434469 + }, + { + "series_id": 1500328, + "series_name": "蓄意宠爱", + "release_info": "上线5天", + "platform_desc": "优酷独播", + "platform_txt": 0, + "curr_heat": 4730.18, + "curr_heat_desc": "4730.18", + "bar_value": 583.736247352187 + }, + { + "series_id": 1532221, + "series_name": "目之所及", + "release_info": "上线30天", + "platform_desc": "爱奇艺独播", + "platform_txt": 1, + "curr_heat": 4712.48, + "curr_heat_desc": "4712.48", + "bar_value": 536.586836256929 + }, + { + "series_id": 1524115, + "series_name": "白夜宸缘起三生", + "release_info": "上线13天", + "platform_desc": "腾讯视频独播", + "platform_txt": -1, + "curr_heat": 4653.77, + "curr_heat_desc": "4653.77", + "bar_value": 488.930252012005 + }, + { + "series_id": 1491942, + "series_name": "朝雪录", + "release_info": "上线76天", + "platform_desc": "爱奇艺独播", + "platform_txt": 1, + "curr_heat": 4623.3, + "curr_heat_desc": "4623.30", + "bar_value": 448.172875941959 + } + ] + } } \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/background.css index 7be1cfe9..2069753d 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/background.css +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/background.css @@ -1,196 +1,196 @@ -/* 页面主背景 */ -body { - background: linear-gradient(135deg, #f8fffe 0%, #e8f5e8 50%, #d4f1d4 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(39, 174, 96, 0.05) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(46, 204, 113, 0.05) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(168, 230, 207, 0.08) 0%, transparent 50%); - pointer-events: none; - z-index: -1; -} - -/* 容器背景 */ -.container { - background: rgba(255, 255, 255, 0.7); - backdrop-filter: blur(10px); - border-radius: 16px; - box-shadow: 0 8px 32px rgba(39, 174, 96, 0.1); - margin-top: 20px; - margin-bottom: 20px; -} - -/* 头部背景 */ -.header { - background: linear-gradient(135deg, rgba(39, 174, 96, 0.05) 0%, rgba(168, 230, 207, 0.05) 100%); - border-radius: 16px 16px 0 0; - position: relative; - overflow: hidden; -} - -.header::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: - radial-gradient(circle at 30% 20%, rgba(39, 174, 96, 0.1) 0%, transparent 40%), - radial-gradient(circle at 70% 80%, rgba(46, 204, 113, 0.08) 0%, transparent 40%); - pointer-events: none; -} - -/* 热搜项目背景 */ -.hot-item { - background: rgba(255, 255, 255, 0.9); - backdrop-filter: blur(8px); - position: relative; - overflow: hidden; -} - -.hot-item::after { - content: ''; - position: absolute; - top: 0; - right: 0; - width: 60px; - height: 100%; - background: linear-gradient(90deg, transparent 0%, rgba(39, 174, 96, 0.02) 100%); - pointer-events: none; -} - -/* 前三名特殊背景效果 */ -.hot-item:nth-child(1) { - background: linear-gradient(135deg, rgba(231, 76, 60, 0.05) 0%, rgba(255, 255, 255, 0.95) 100%); -} - -.hot-item:nth-child(2) { - background: linear-gradient(135deg, rgba(243, 156, 18, 0.05) 0%, rgba(255, 255, 255, 0.95) 100%); -} - -.hot-item:nth-child(3) { - background: linear-gradient(135deg, rgba(52, 152, 219, 0.05) 0%, rgba(255, 255, 255, 0.95) 100%); -} - -/* 加载状态背景 */ -.loading { - background: rgba(255, 255, 255, 0.8); - backdrop-filter: blur(8px); - border-radius: 12px; - margin: 20px; -} - -/* 错误信息背景 */ -.error-message { - background: linear-gradient(135deg, rgba(231, 76, 60, 0.05) 0%, rgba(255, 255, 255, 0.9) 100%); - backdrop-filter: blur(8px); - border-radius: 12px; - border: 1px solid rgba(231, 76, 60, 0.1); - margin: 20px; -} - -/* 底部背景 */ -.footer { - background: linear-gradient(135deg, rgba(39, 174, 96, 0.03) 0%, rgba(168, 230, 207, 0.03) 100%); - border-radius: 0 0 16px 16px; - position: relative; -} - -.footer::before { - content: ''; - position: absolute; - top: 0; - left: 50%; - transform: translateX(-50%); - width: 60px; - height: 1px; - background: linear-gradient(90deg, transparent 0%, rgba(39, 174, 96, 0.3) 50%, transparent 100%); -} - -/* 响应式背景调整 */ -@media (max-width: 768px) { - .container { - margin-top: 10px; - margin-bottom: 10px; - border-radius: 12px; - } - - .header { - border-radius: 12px 12px 0 0; - } - - .footer { - border-radius: 0 0 12px 12px; - } - - body::before { - background-image: - radial-gradient(circle at 20% 80%, rgba(39, 174, 96, 0.03) 0%, transparent 40%), - radial-gradient(circle at 80% 20%, rgba(46, 204, 113, 0.03) 0%, transparent 40%); - } -} - -@media (min-width: 1025px) { - .container { - margin-top: 40px; - margin-bottom: 40px; - } - - body::before { - background-image: - radial-gradient(circle at 15% 85%, rgba(39, 174, 96, 0.06) 0%, transparent 60%), - radial-gradient(circle at 85% 15%, rgba(46, 204, 113, 0.06) 0%, transparent 60%), - radial-gradient(circle at 50% 50%, rgba(168, 230, 207, 0.04) 0%, transparent 70%); - } -} - -/* 动画效果 */ -@keyframes backgroundShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 悬浮时的背景变化 */ -.hot-item:hover { - background: rgba(255, 255, 255, 0.95); -} - -.hot-item:hover::after { - background: linear-gradient(90deg, transparent 0%, rgba(39, 174, 96, 0.05) 100%); -} - -/* 排名背景渐变 */ -.rank { - position: relative; - overflow: hidden; -} - -.rank::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: linear-gradient(45deg, rgba(255, 255, 255, 0.2) 0%, transparent 100%); - pointer-events: none; +/* 页面主背景 */ +body { + background: linear-gradient(135deg, #f8fffe 0%, #e8f5e8 50%, #d4f1d4 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(39, 174, 96, 0.05) 0%, transparent 50%), + radial-gradient(circle at 80% 20%, rgba(46, 204, 113, 0.05) 0%, transparent 50%), + radial-gradient(circle at 40% 40%, rgba(168, 230, 207, 0.08) 0%, transparent 50%); + pointer-events: none; + z-index: -1; +} + +/* 容器背景 */ +.container { + background: rgba(255, 255, 255, 0.7); + backdrop-filter: blur(10px); + border-radius: 16px; + box-shadow: 0 8px 32px rgba(39, 174, 96, 0.1); + margin-top: 20px; + margin-bottom: 20px; +} + +/* 头部背景 */ +.header { + background: linear-gradient(135deg, rgba(39, 174, 96, 0.05) 0%, rgba(168, 230, 207, 0.05) 100%); + border-radius: 16px 16px 0 0; + position: relative; + overflow: hidden; +} + +.header::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: + radial-gradient(circle at 30% 20%, rgba(39, 174, 96, 0.1) 0%, transparent 40%), + radial-gradient(circle at 70% 80%, rgba(46, 204, 113, 0.08) 0%, transparent 40%); + pointer-events: none; +} + +/* 热搜项目背景 */ +.hot-item { + background: rgba(255, 255, 255, 0.9); + backdrop-filter: blur(8px); + position: relative; + overflow: hidden; +} + +.hot-item::after { + content: ''; + position: absolute; + top: 0; + right: 0; + width: 60px; + height: 100%; + background: linear-gradient(90deg, transparent 0%, rgba(39, 174, 96, 0.02) 100%); + pointer-events: none; +} + +/* 前三名特殊背景效果 */ +.hot-item:nth-child(1) { + background: linear-gradient(135deg, rgba(231, 76, 60, 0.05) 0%, rgba(255, 255, 255, 0.95) 100%); +} + +.hot-item:nth-child(2) { + background: linear-gradient(135deg, rgba(243, 156, 18, 0.05) 0%, rgba(255, 255, 255, 0.95) 100%); +} + +.hot-item:nth-child(3) { + background: linear-gradient(135deg, rgba(52, 152, 219, 0.05) 0%, rgba(255, 255, 255, 0.95) 100%); +} + +/* 加载状态背景 */ +.loading { + background: rgba(255, 255, 255, 0.8); + backdrop-filter: blur(8px); + border-radius: 12px; + margin: 20px; +} + +/* 错误信息背景 */ +.error-message { + background: linear-gradient(135deg, rgba(231, 76, 60, 0.05) 0%, rgba(255, 255, 255, 0.9) 100%); + backdrop-filter: blur(8px); + border-radius: 12px; + border: 1px solid rgba(231, 76, 60, 0.1); + margin: 20px; +} + +/* 底部背景 */ +.footer { + background: linear-gradient(135deg, rgba(39, 174, 96, 0.03) 0%, rgba(168, 230, 207, 0.03) 100%); + border-radius: 0 0 16px 16px; + position: relative; +} + +.footer::before { + content: ''; + position: absolute; + top: 0; + left: 50%; + transform: translateX(-50%); + width: 60px; + height: 1px; + background: linear-gradient(90deg, transparent 0%, rgba(39, 174, 96, 0.3) 50%, transparent 100%); +} + +/* 响应式背景调整 */ +@media (max-width: 768px) { + .container { + margin-top: 10px; + margin-bottom: 10px; + border-radius: 12px; + } + + .header { + border-radius: 12px 12px 0 0; + } + + .footer { + border-radius: 0 0 12px 12px; + } + + body::before { + background-image: + radial-gradient(circle at 20% 80%, rgba(39, 174, 96, 0.03) 0%, transparent 40%), + radial-gradient(circle at 80% 20%, rgba(46, 204, 113, 0.03) 0%, transparent 40%); + } +} + +@media (min-width: 1025px) { + .container { + margin-top: 40px; + margin-bottom: 40px; + } + + body::before { + background-image: + radial-gradient(circle at 15% 85%, rgba(39, 174, 96, 0.06) 0%, transparent 60%), + radial-gradient(circle at 85% 15%, rgba(46, 204, 113, 0.06) 0%, transparent 60%), + radial-gradient(circle at 50% 50%, rgba(168, 230, 207, 0.04) 0%, transparent 70%); + } +} + +/* 动画效果 */ +@keyframes backgroundShift { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} + +/* 悬浮时的背景变化 */ +.hot-item:hover { + background: rgba(255, 255, 255, 0.95); +} + +.hot-item:hover::after { + background: linear-gradient(90deg, transparent 0%, rgba(39, 174, 96, 0.05) 100%); +} + +/* 排名背景渐变 */ +.rank { + position: relative; + overflow: hidden; +} + +.rank::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: linear-gradient(45deg, rgba(255, 255, 255, 0.2) 0%, transparent 100%); + pointer-events: none; } \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/index.html index 41d8157f..f119e25e 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 049f2d9b..d5324715 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/script.js +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/script.js @@ -1,196 +1,196 @@ -// DOM元素获取 -const loadingElement = document.getElementById('loading'); -const errorElement = document.getElementById('error'); -const hotListElement = document.getElementById('hotList'); -const updateTimeElement = document.getElementById('updateTime'); - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', function() { - loadData(); - - // 每5分钟自动刷新数据 - setInterval(loadData, 5 * 60 * 1000); - - // 监听页面可见性变化,页面重新可见时刷新数据 - document.addEventListener('visibilitychange', function() { - if (!document.hidden) { - loadData(); - } - }); - - // 监听网络状态变化 - window.addEventListener('online', loadData); -}); - -// 加载数据函数 -async function loadData() { - try { - showLoading(); - - // 调用百度实时热搜API - const response = await fetch('https://60s.api.shumengya.top/v2/baidu/realtime'); - - 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(); - hideLoading(); - } else { - throw new Error(data.message || '数据格式错误'); - } - - } catch (error) { - console.error('加载数据失败:', error); - showError(); - } -} - -// 渲染热搜列表 -function renderHotList(hotData) { - if (!hotData || !Array.isArray(hotData)) { - showError(); - return; - } - - const listHTML = hotData.map((item, index) => { - const rank = index + 1; - const rankClass = rank <= 3 ? (rank === 1 ? 'top1' : 'top3') : ''; - - // 处理封面图片 - const coverImg = item.pic ? - `${item.title}` : - ''; - - // 处理描述信息 - const description = item.desc || ''; - - // 处理热度值 - const hotValue = item.hot || ''; - - // 处理链接 - const linkUrl = item.url || '#'; - - return ` -
      -
      ${rank}
      - ${coverImg} -
      -
      -

      ${item.title || '无标题'}

      -
      - ${description ? `

      ${description}

      ` : ''} - -
      -
      - `; - }).join(''); - - hotListElement.innerHTML = listHTML; - hotListElement.style.display = 'block'; -} - -// 格式化热度值 -function formatHotValue(value) { - if (!value) return ''; - - // 如果是数字,进行格式化 - if (typeof value === 'number') { - if (value >= 10000) { - return (value / 10000).toFixed(1) + '万'; - } - return value.toString(); - } - - // 如果是字符串,直接返回 - return value.toString(); -} - -// 打开链接 -function openLink(url) { - if (url && url !== '#') { - window.open(url, '_blank'); - } -} - -// 显示加载状态 -function showLoading() { - loadingElement.style.display = 'block'; - errorElement.style.display = 'none'; - hotListElement.style.display = 'none'; -} - -// 隐藏加载状态 -function hideLoading() { - loadingElement.style.display = 'none'; -} - -// 显示错误信息 -function showError() { - loadingElement.style.display = 'none'; - errorElement.style.display = 'block'; - hotListElement.style.display = 'none'; -} - -// 更新时间显示 -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' - }); - updateTimeElement.textContent = `最后更新时间: ${timeString}`; -} - -// 重试加载数据 -function retryLoad() { - loadData(); -} - -// 页面滚动优化 -let ticking = false; - -function updateScrollPosition() { - // 可以在这里添加滚动相关的优化逻辑 - ticking = false; -} - -window.addEventListener('scroll', function() { - if (!ticking) { - requestAnimationFrame(updateScrollPosition); - ticking = true; - } -}); - -// 错误处理和日志记录 -window.addEventListener('error', function(e) { - console.error('页面错误:', e.error); -}); - -window.addEventListener('unhandledrejection', function(e) { - console.error('未处理的Promise拒绝:', e.reason); -}); - -// 性能监控 -if ('performance' in window) { - window.addEventListener('load', function() { - setTimeout(function() { - const perfData = performance.timing; - const loadTime = perfData.loadEventEnd - perfData.navigationStart; - console.log('页面加载时间:', loadTime + 'ms'); - }, 0); - }); +// DOM元素获取 +const loadingElement = document.getElementById('loading'); +const errorElement = document.getElementById('error'); +const hotListElement = document.getElementById('hotList'); +const updateTimeElement = document.getElementById('updateTime'); + +// 页面加载完成后初始化 +document.addEventListener('DOMContentLoaded', function() { + loadData(); + + // 每5分钟自动刷新数据 + setInterval(loadData, 5 * 60 * 1000); + + // 监听页面可见性变化,页面重新可见时刷新数据 + document.addEventListener('visibilitychange', function() { + if (!document.hidden) { + loadData(); + } + }); + + // 监听网络状态变化 + window.addEventListener('online', loadData); +}); + +// 加载数据函数 +async function loadData() { + try { + showLoading(); + + // 调用百度实时热搜API + const response = await fetch('https://60s.api.shumengya.top/v2/baidu/realtime'); + + 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(); + hideLoading(); + } else { + throw new Error(data.message || '数据格式错误'); + } + + } catch (error) { + console.error('加载数据失败:', error); + showError(); + } +} + +// 渲染热搜列表 +function renderHotList(hotData) { + if (!hotData || !Array.isArray(hotData)) { + showError(); + return; + } + + const listHTML = hotData.map((item, index) => { + const rank = index + 1; + const rankClass = rank <= 3 ? (rank === 1 ? 'top1' : 'top3') : ''; + + // 处理封面图片 + const coverImg = item.pic ? + `${item.title}` : + ''; + + // 处理描述信息 + const description = item.desc || ''; + + // 处理热度值 + const hotValue = item.hot || ''; + + // 处理链接 + const linkUrl = item.url || '#'; + + return ` +
      +
      ${rank}
      + ${coverImg} +
      +
      +

      ${item.title || '无标题'}

      +
      + ${description ? `

      ${description}

      ` : ''} + +
      +
      + `; + }).join(''); + + hotListElement.innerHTML = listHTML; + hotListElement.style.display = 'block'; +} + +// 格式化热度值 +function formatHotValue(value) { + if (!value) return ''; + + // 如果是数字,进行格式化 + if (typeof value === 'number') { + if (value >= 10000) { + return (value / 10000).toFixed(1) + '万'; + } + return value.toString(); + } + + // 如果是字符串,直接返回 + return value.toString(); +} + +// 打开链接 +function openLink(url) { + if (url && url !== '#') { + window.open(url, '_blank'); + } +} + +// 显示加载状态 +function showLoading() { + loadingElement.style.display = 'block'; + errorElement.style.display = 'none'; + hotListElement.style.display = 'none'; +} + +// 隐藏加载状态 +function hideLoading() { + loadingElement.style.display = 'none'; +} + +// 显示错误信息 +function showError() { + loadingElement.style.display = 'none'; + errorElement.style.display = 'block'; + hotListElement.style.display = 'none'; +} + +// 更新时间显示 +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' + }); + updateTimeElement.textContent = `最后更新时间: ${timeString}`; +} + +// 重试加载数据 +function retryLoad() { + loadData(); +} + +// 页面滚动优化 +let ticking = false; + +function updateScrollPosition() { + // 可以在这里添加滚动相关的优化逻辑 + ticking = false; +} + +window.addEventListener('scroll', function() { + if (!ticking) { + requestAnimationFrame(updateScrollPosition); + ticking = true; + } +}); + +// 错误处理和日志记录 +window.addEventListener('error', function(e) { + console.error('页面错误:', e.error); +}); + +window.addEventListener('unhandledrejection', function(e) { + console.error('未处理的Promise拒绝:', e.reason); +}); + +// 性能监控 +if ('performance' in window) { + window.addEventListener('load', function() { + setTimeout(function() { + const perfData = performance.timing; + const loadTime = perfData.loadEventEnd - perfData.navigationStart; + console.log('页面加载时间:', loadTime + 'ms'); + }, 0); + }); } \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/styles.css b/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/styles.css index 766cde4e..ace4270b 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/styles.css +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/styles.css @@ -1,371 +1,371 @@ -/* 基础样式重置 */ -* { - 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: 16px; -} - -.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; - display: flex; - gap: 12px; - cursor: pointer; -} - -.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); -} - -/* 排名样式 */ -.rank { - background: linear-gradient(135deg, #27ae60, #2ecc71); - color: white; - width: 32px; - height: 32px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - font-weight: 700; - font-size: 14px; - flex-shrink: 0; - margin-top: 4px; -} - -.rank.top3 { - background: linear-gradient(135deg, #f39c12, #e67e22); -} - -.rank.top1 { - background: linear-gradient(135deg, #e74c3c, #c0392b); -} - -/* 封面图片 */ -.item-cover { - width: 80px; - height: 60px; - border-radius: 8px; - object-fit: cover; - flex-shrink: 0; - border: 1px solid #e8f5e8; -} - -/* 内容区域 */ -.item-content { - flex: 1; - display: flex; - flex-direction: column; - justify-content: space-between; - min-height: 60px; -} - -.item-header { - display: flex; - align-items: flex-start; - justify-content: space-between; - margin-bottom: 8px; -} - -.item-title { - font-size: 16px; - font-weight: 600; - color: #2c3e50; - line-height: 1.4; - margin-bottom: 4px; - transition: color 0.3s ease; - flex: 1; -} - -.item-title:hover { - color: #27ae60; -} - -.item-desc { - font-size: 13px; - color: #7f8c8d; - line-height: 1.3; - margin-bottom: 8px; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; -} - -.item-footer { - display: flex; - align-items: center; - justify-content: space-between; - gap: 8px; -} - -.item-score { - font-size: 14px; - color: #27ae60; - font-weight: 600; -} - -.item-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; -} - -.type-default { - background: #f8f9fa; - color: #6c757d; -} - -/* 底部 */ -.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; - gap: 10px; - } - - .item-cover { - width: 60px; - height: 45px; - } - - .item-title { - font-size: 15px; - } - - .item-desc { - font-size: 12px; - } - - .rank { - width: 28px; - height: 28px; - font-size: 13px; - } -} - -/* 平板端适配 */ -@media (min-width: 769px) and (max-width: 1024px) { - .container { - padding: 0 24px; - } - - .hot-list { - grid-template-columns: repeat(1, 1fr); - gap: 18px; - } - - .title { - font-size: 32px; - } - - .hot-item { - padding: 18px; - } -} - -/* 电脑端适配 */ -@media (min-width: 1025px) { - .container { - padding: 0 32px; - } - - .hot-list { - grid-template-columns: repeat(1, 1fr); - gap: 20px; - } - - .title { - font-size: 36px; - } - - .hot-item { - padding: 20px; - gap: 16px; - } - - .item-cover { - width: 100px; - height: 75px; - } - - .item-title { - font-size: 17px; - } - - .item-desc { - font-size: 14px; - } -} - -/* 大屏幕优化 */ -@media (min-width: 1400px) { - .hot-list { - grid-template-columns: repeat(2, 1fr); - gap: 24px; - } +/* 基础样式重置 */ +* { + 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: 16px; +} + +.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; + display: flex; + gap: 12px; + cursor: pointer; +} + +.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); +} + +/* 排名样式 */ +.rank { + background: linear-gradient(135deg, #27ae60, #2ecc71); + color: white; + width: 32px; + height: 32px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-weight: 700; + font-size: 14px; + flex-shrink: 0; + margin-top: 4px; +} + +.rank.top3 { + background: linear-gradient(135deg, #f39c12, #e67e22); +} + +.rank.top1 { + background: linear-gradient(135deg, #e74c3c, #c0392b); +} + +/* 封面图片 */ +.item-cover { + width: 80px; + height: 60px; + border-radius: 8px; + object-fit: cover; + flex-shrink: 0; + border: 1px solid #e8f5e8; +} + +/* 内容区域 */ +.item-content { + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-between; + min-height: 60px; +} + +.item-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + margin-bottom: 8px; +} + +.item-title { + font-size: 16px; + font-weight: 600; + color: #2c3e50; + line-height: 1.4; + margin-bottom: 4px; + transition: color 0.3s ease; + flex: 1; +} + +.item-title:hover { + color: #27ae60; +} + +.item-desc { + font-size: 13px; + color: #7f8c8d; + line-height: 1.3; + margin-bottom: 8px; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.item-footer { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; +} + +.item-score { + font-size: 14px; + color: #27ae60; + font-weight: 600; +} + +.item-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; +} + +.type-default { + background: #f8f9fa; + color: #6c757d; +} + +/* 底部 */ +.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; + gap: 10px; + } + + .item-cover { + width: 60px; + height: 45px; + } + + .item-title { + font-size: 15px; + } + + .item-desc { + font-size: 12px; + } + + .rank { + width: 28px; + height: 28px; + font-size: 13px; + } +} + +/* 平板端适配 */ +@media (min-width: 769px) and (max-width: 1024px) { + .container { + padding: 0 24px; + } + + .hot-list { + grid-template-columns: repeat(1, 1fr); + gap: 18px; + } + + .title { + font-size: 32px; + } + + .hot-item { + padding: 18px; + } +} + +/* 电脑端适配 */ +@media (min-width: 1025px) { + .container { + padding: 0 32px; + } + + .hot-list { + grid-template-columns: repeat(1, 1fr); + gap: 20px; + } + + .title { + font-size: 36px; + } + + .hot-item { + padding: 20px; + gap: 16px; + } + + .item-cover { + width: 100px; + height: 75px; + } + + .item-title { + font-size: 17px; + } + + .item-desc { + font-size: 14px; + } +} + +/* 大屏幕优化 */ +@media (min-width: 1400px) { + .hot-list { + grid-template-columns: repeat(2, 1fr); + gap: 24px; + } } \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/返回接口.json index 0a68ca26..cb3330c3 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/返回接口.json +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/百度实时热搜/返回接口.json @@ -1,606 +1,606 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "rank": 1, - "title": "102岁老兵ICU看阅兵后安详离世", - "desc": "", - "score": "7807952", - "score_desc": "780.8w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/e190dea8327f8295c8a5883878fe6d14", - "type": "1", - "type_desc": "新", - "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", - "url": "https://www.baidu.com/s?wd=102%E5%B2%81%E8%80%81%E5%85%B5ICU%E7%9C%8B%E9%98%85%E5%85%B5%E5%90%8E%E5%AE%89%E8%AF%A6%E7%A6%BB%E4%B8%96&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 2, - "title": "看阅兵明白了耿爽联合国发言含金量", - "desc": "", - "score": "7714187", - "score_desc": "771.42w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/83340b647c7a2f569c0a03482d5b40f1", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E7%9C%8B%E9%98%85%E5%85%B5%E6%98%8E%E7%99%BD%E4%BA%86%E8%80%BF%E7%88%BD%E8%81%94%E5%90%88%E5%9B%BD%E5%8F%91%E8%A8%80%E5%90%AB%E9%87%91%E9%87%8F&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 3, - "title": "80秒带你回顾阅兵“高燃瞬间”", - "desc": "", - "score": "7616477", - "score_desc": "761.65w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/a64eb808789c7bae99eb3e0f98a20621", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=80%E7%A7%92%E5%B8%A6%E4%BD%A0%E5%9B%9E%E9%A1%BE%E9%98%85%E5%85%B5%E2%80%9C%E9%AB%98%E7%87%83%E7%9E%AC%E9%97%B4%E2%80%9D&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 4, - "title": "新华社认证的帅兵哥已婚", - "desc": "", - "score": "7522472", - "score_desc": "752.25w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/493dd01d2abf915809eb1387e5b8a026", - "type": "1", - "type_desc": "新", - "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", - "url": "https://www.baidu.com/s?wd=%E6%96%B0%E5%8D%8E%E7%A4%BE%E8%AE%A4%E8%AF%81%E7%9A%84%E5%B8%85%E5%85%B5%E5%93%A5%E5%B7%B2%E5%A9%9A&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 5, - "title": "普京记者会身后的大红灯笼亮了", - "desc": "", - "score": "7426902", - "score_desc": "742.69w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/1e895a56da47054e111ce225b1efd58f", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E6%99%AE%E4%BA%AC%E8%AE%B0%E8%80%85%E4%BC%9A%E8%BA%AB%E5%90%8E%E7%9A%84%E5%A4%A7%E7%BA%A2%E7%81%AF%E7%AC%BC%E4%BA%AE%E4%BA%86&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 6, - "title": "中国网警:烽火烬处 赓续前行", - "desc": "", - "score": "7332067", - "score_desc": "733.21w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/0d872743f2cfabc8fd9ee1da970a5fed", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD%E7%BD%91%E8%AD%A6%EF%BC%9A%E7%83%BD%E7%81%AB%E7%83%AC%E5%A4%84+%E8%B5%93%E7%BB%AD%E5%89%8D%E8%A1%8C&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 7, - "title": "“呼叫81192!” 这一刻含泪量太高", - "desc": "", - "score": "7237296", - "score_desc": "723.73w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/552c202f87db2219d6e150a39976bad7", - "type": "1", - "type_desc": "新", - "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", - "url": "https://www.baidu.com/s?wd=%E2%80%9C%E5%91%BC%E5%8F%AB81192%EF%BC%81%E2%80%9D+%E8%BF%99%E4%B8%80%E5%88%BB%E5%90%AB%E6%B3%AA%E9%87%8F%E5%A4%AA%E9%AB%98&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 8, - "title": "天津和平鸽归巢主人激动吹哨迎接", - "desc": "", - "score": "7139286", - "score_desc": "713.93w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/1c5dfd83c55b6482d1307f310d5642a7", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E5%A4%A9%E6%B4%A5%E5%92%8C%E5%B9%B3%E9%B8%BD%E5%BD%92%E5%B7%A2%E4%B8%BB%E4%BA%BA%E6%BF%80%E5%8A%A8%E5%90%B9%E5%93%A8%E8%BF%8E%E6%8E%A5&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 9, - "title": "中国排面给全世界亿点点震撼", - "desc": "", - "score": "7042854", - "score_desc": "704.29w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/986b69bb82a32bbd72f4c90281ece503", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD%E6%8E%92%E9%9D%A2%E7%BB%99%E5%85%A8%E4%B8%96%E7%95%8C%E4%BA%BF%E7%82%B9%E7%82%B9%E9%9C%87%E6%92%BC&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 10, - "title": "8万只气球缘何直径都是26厘米左右", - "desc": "", - "score": "6943236", - "score_desc": "694.32w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/783293899ac972283b13501deb5772fa", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=8%E4%B8%87%E5%8F%AA%E6%B0%94%E7%90%83%E7%BC%98%E4%BD%95%E7%9B%B4%E5%BE%84%E9%83%BD%E6%98%AF26%E5%8E%98%E7%B1%B3%E5%B7%A6%E5%8F%B3&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 11, - "title": "江苏足协辟谣“苏超”要改名", - "desc": "近日,有部分自媒体称“苏超”已改名,对此,江苏省足协回应:“苏超”没有改名,也没有想过要改名。", - "score": "6853163", - "score_desc": "685.32w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/fe16124a5cd018feee2e941d05850e00", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E6%B1%9F%E8%8B%8F%E8%B6%B3%E5%8D%8F%E8%BE%9F%E8%B0%A3%E2%80%9C%E8%8B%8F%E8%B6%85%E2%80%9D%E8%A6%81%E6%94%B9%E5%90%8D&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 12, - "title": "金正恩只回了韩议长一个字", - "desc": "", - "score": "6760236", - "score_desc": "676.02w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/68824cd0db12d3d6b71f6d79dc9cd1e4", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E9%87%91%E6%AD%A3%E6%81%A9%E5%8F%AA%E5%9B%9E%E4%BA%86%E9%9F%A9%E8%AE%AE%E9%95%BF%E4%B8%80%E4%B8%AA%E5%AD%97&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 13, - "title": "特朗普称看了九三阅兵:很精彩很震撼", - "desc": "", - "score": "6656922", - "score_desc": "665.69w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/bb902e423148eb1e83e78955f2eb9adb", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E7%89%B9%E6%9C%97%E6%99%AE%E7%A7%B0%E7%9C%8B%E4%BA%86%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5%EF%BC%9A%E5%BE%88%E7%B2%BE%E5%BD%A9%E5%BE%88%E9%9C%87%E6%92%BC&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 14, - "title": "韩国高铁站直播九三阅兵", - "desc": "", - "score": "6566970", - "score_desc": "656.7w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/b68cb01b4b20989cea82c78c9fe39c3b", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E9%9F%A9%E5%9B%BD%E9%AB%98%E9%93%81%E7%AB%99%E7%9B%B4%E6%92%AD%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 15, - "title": "在中国的加沙人看阅兵时落泪", - "desc": "", - "score": "6476621", - "score_desc": "647.66w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/f16f082786ac14ea20dc709c527dec4b", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E5%9C%A8%E4%B8%AD%E5%9B%BD%E7%9A%84%E5%8A%A0%E6%B2%99%E4%BA%BA%E7%9C%8B%E9%98%85%E5%85%B5%E6%97%B6%E8%90%BD%E6%B3%AA&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 16, - "title": "专家:东风-61出现改变命名规则", - "desc": "", - "score": "6376137", - "score_desc": "637.61w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/66c1c659e7b1a37732b2735253716d60", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E4%B8%93%E5%AE%B6%EF%BC%9A%E4%B8%9C%E9%A3%8E-61%E5%87%BA%E7%8E%B0%E6%94%B9%E5%8F%98%E5%91%BD%E5%90%8D%E8%A7%84%E5%88%99&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 17, - "title": "军嫂盯着徒步方队找丈夫迷糊了", - "desc": "", - "score": "6274961", - "score_desc": "627.5w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/90ac62b9f3b3365dc7fed40c62259a9f", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E5%86%9B%E5%AB%82%E7%9B%AF%E7%9D%80%E5%BE%92%E6%AD%A5%E6%96%B9%E9%98%9F%E6%89%BE%E4%B8%88%E5%A4%AB%E8%BF%B7%E7%B3%8A%E4%BA%86&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 18, - "title": "普京调侃佩斯科夫:懒虫 不想工作", - "desc": "", - "score": "6180590", - "score_desc": "618.06w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/8e9fae0b3a1b23049cfdb9323d6a1efe", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E6%99%AE%E4%BA%AC%E8%B0%83%E4%BE%83%E4%BD%A9%E6%96%AF%E7%A7%91%E5%A4%AB%EF%BC%9A%E6%87%92%E8%99%AB+%E4%B8%8D%E6%83%B3%E5%B7%A5%E4%BD%9C&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 19, - "title": "原陆军第31集团军军长王昭堃逝世", - "desc": "", - "score": "6089180", - "score_desc": "608.92w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/778f1aa16cdfc4db09926956ae5b5741", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E5%8E%9F%E9%99%86%E5%86%9B%E7%AC%AC31%E9%9B%86%E5%9B%A2%E5%86%9B%E5%86%9B%E9%95%BF%E7%8E%8B%E6%98%AD%E5%A0%83%E9%80%9D%E4%B8%96&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 20, - "title": "“防霸凌”儿童指纹水杯被吐槽费妈", - "desc": "", - "score": "5986581", - "score_desc": "598.66w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/c590f4412c1aa6904b65a94cba7de275", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E2%80%9C%E9%98%B2%E9%9C%B8%E5%87%8C%E2%80%9D%E5%84%BF%E7%AB%A5%E6%8C%87%E7%BA%B9%E6%B0%B4%E6%9D%AF%E8%A2%AB%E5%90%90%E6%A7%BD%E8%B4%B9%E5%A6%88&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 21, - "title": "特朗普下令重振美国军队", - "desc": "", - "score": "5902417", - "score_desc": "590.24w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/de99b4697f6d926890dc31d686c1222c", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E7%89%B9%E6%9C%97%E6%99%AE%E4%B8%8B%E4%BB%A4%E9%87%8D%E6%8C%AF%E7%BE%8E%E5%9B%BD%E5%86%9B%E9%98%9F&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 22, - "title": "间谍张某某死缓:出轨外国女官员生子", - "desc": "", - "score": "5790606", - "score_desc": "579.06w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/f93c1366d41c7cfbb2383dcb17449c28", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E9%97%B4%E8%B0%8D%E5%BC%A0%E6%9F%90%E6%9F%90%E6%AD%BB%E7%BC%93%EF%BC%9A%E5%87%BA%E8%BD%A8%E5%A4%96%E5%9B%BD%E5%A5%B3%E5%AE%98%E5%91%98%E7%94%9F%E5%AD%90&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 23, - "title": "5万余人观礼离场后干干净净", - "desc": "", - "score": "5717616", - "score_desc": "571.76w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/53c6b971cef08daf3104bb5133b4b6ed", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=5%E4%B8%87%E4%BD%99%E4%BA%BA%E8%A7%82%E7%A4%BC%E7%A6%BB%E5%9C%BA%E5%90%8E%E5%B9%B2%E5%B9%B2%E5%87%80%E5%87%80&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 24, - "title": "普京乘机回国 王毅送行", - "desc": "", - "score": "5607811", - "score_desc": "560.78w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/5f7afddd2e0a570573b245b6f31a1338", - "type": "1", - "type_desc": "新", - "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", - "url": "https://www.baidu.com/s?wd=%E6%99%AE%E4%BA%AC%E4%B9%98%E6%9C%BA%E5%9B%9E%E5%9B%BD+%E7%8E%8B%E6%AF%85%E9%80%81%E8%A1%8C&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 25, - "title": "刘老庄连战旗为何多了一个点", - "desc": "", - "score": "5513446", - "score_desc": "551.34w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/7084449234aed77c74438ca263fdcd58", - "type": "1", - "type_desc": "新", - "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", - "url": "https://www.baidu.com/s?wd=%E5%88%98%E8%80%81%E5%BA%84%E8%BF%9E%E6%88%98%E6%97%97%E4%B8%BA%E4%BD%95%E5%A4%9A%E4%BA%86%E4%B8%80%E4%B8%AA%E7%82%B9&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 26, - "title": "迎面感受东风-61东风-5C的视觉冲击", - "desc": "", - "score": "5426660", - "score_desc": "542.67w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/40210a63cf69ddbbedbe59a19730e374", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E8%BF%8E%E9%9D%A2%E6%84%9F%E5%8F%97%E4%B8%9C%E9%A3%8E-61%E4%B8%9C%E9%A3%8E-5C%E7%9A%84%E8%A7%86%E8%A7%89%E5%86%B2%E5%87%BB&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 27, - "title": "阅兵当天的北京处处都有追飞机的人", - "desc": "", - "score": "5336487", - "score_desc": "533.65w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/1513230ae41ba37f680dccbc526b7145", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E9%98%85%E5%85%B5%E5%BD%93%E5%A4%A9%E7%9A%84%E5%8C%97%E4%BA%AC%E5%A4%84%E5%A4%84%E9%83%BD%E6%9C%89%E8%BF%BD%E9%A3%9E%E6%9C%BA%E7%9A%84%E4%BA%BA&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 28, - "title": "歼-35大片来了", - "desc": "", - "score": "5240364", - "score_desc": "524.04w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/017c3b52514fb3ae83405da1da5fc350", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E6%AD%BC-35%E5%A4%A7%E7%89%87%E6%9D%A5%E4%BA%86&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 29, - "title": "普京透露与特朗普“车内密谈”细节", - "desc": "", - "score": "5123571", - "score_desc": "512.36w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/5548e90353e4696a1116ffc0e65e086d", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E6%99%AE%E4%BA%AC%E9%80%8F%E9%9C%B2%E4%B8%8E%E7%89%B9%E6%9C%97%E6%99%AE%E2%80%9C%E8%BD%A6%E5%86%85%E5%AF%86%E8%B0%88%E2%80%9D%E7%BB%86%E8%8A%82&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 30, - "title": "和平鸽从天津到北京出差参加阅兵", - "desc": "", - "score": "5037077", - "score_desc": "503.71w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/f4558c31275119cfab564cadeddf6f50", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E5%92%8C%E5%B9%B3%E9%B8%BD%E4%BB%8E%E5%A4%A9%E6%B4%A5%E5%88%B0%E5%8C%97%E4%BA%AC%E5%87%BA%E5%B7%AE%E5%8F%82%E5%8A%A0%E9%98%85%E5%85%B5&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 31, - "title": "王毅送中国跑鞋 匈牙利外长爱不释手", - "desc": "", - "score": "4950481", - "score_desc": "495.05w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/95df9511f4c0951f823f387f3286c029", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E7%8E%8B%E6%AF%85%E9%80%81%E4%B8%AD%E5%9B%BD%E8%B7%91%E9%9E%8B+%E5%8C%88%E7%89%99%E5%88%A9%E5%A4%96%E9%95%BF%E7%88%B1%E4%B8%8D%E9%87%8A%E6%89%8B&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 32, - "title": "郑钦文晒东风5C帅照", - "desc": "", - "score": "4841678", - "score_desc": "484.17w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/5e2fec1c090ce966a2dd89071342d3e9", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E9%83%91%E9%92%A6%E6%96%87%E6%99%92%E4%B8%9C%E9%A3%8E5C%E5%B8%85%E7%85%A7&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 33, - "title": "阅兵当天 北京街头成为别样观礼台", - "desc": "", - "score": "4760831", - "score_desc": "476.08w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/a6495a07da318dc9644f77de370b8035", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E9%98%85%E5%85%B5%E5%BD%93%E5%A4%A9+%E5%8C%97%E4%BA%AC%E8%A1%97%E5%A4%B4%E6%88%90%E4%B8%BA%E5%88%AB%E6%A0%B7%E8%A7%82%E7%A4%BC%E5%8F%B0&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 34, - "title": "华春莹与记者互动:我的心情和你一样", - "desc": "", - "score": "4651512", - "score_desc": "465.15w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/4377037f24b931479efc20e2a7b87776", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E5%8D%8E%E6%98%A5%E8%8E%B9%E4%B8%8E%E8%AE%B0%E8%80%85%E4%BA%92%E5%8A%A8%EF%BC%9A%E6%88%91%E7%9A%84%E5%BF%83%E6%83%85%E5%92%8C%E4%BD%A0%E4%B8%80%E6%A0%B7&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 35, - "title": "父亲称女民兵方队领队是全家的骄傲", - "desc": "", - "score": "4566469", - "score_desc": "456.65w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/79b1620e703b1e73fd5db686d6314ea0", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E7%88%B6%E4%BA%B2%E7%A7%B0%E5%A5%B3%E6%B0%91%E5%85%B5%E6%96%B9%E9%98%9F%E9%A2%86%E9%98%9F%E6%98%AF%E5%85%A8%E5%AE%B6%E7%9A%84%E9%AA%84%E5%82%B2&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 36, - "title": "宝宝出生恰逢阅兵 家人取名袁安阅", - "desc": "", - "score": "4470561", - "score_desc": "447.06w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/a5063fd737daf1da7a969e36ab672ed8", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E5%AE%9D%E5%AE%9D%E5%87%BA%E7%94%9F%E6%81%B0%E9%80%A2%E9%98%85%E5%85%B5+%E5%AE%B6%E4%BA%BA%E5%8F%96%E5%90%8D%E8%A2%81%E5%AE%89%E9%98%85&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 37, - "title": "特朗普承认观看中国阅兵", - "desc": "", - "score": "4353451", - "score_desc": "435.35w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/e7c27a7640bc0f9d25dcd7ad79026ce7", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E7%89%B9%E6%9C%97%E6%99%AE%E6%89%BF%E8%AE%A4%E8%A7%82%E7%9C%8B%E4%B8%AD%E5%9B%BD%E9%98%85%E5%85%B5&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 38, - "title": "一地官宣:3孩家庭购房补贴20万元", - "desc": "", - "score": "4290101", - "score_desc": "429.01w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/507444a742944d2ed619b480fdab147e", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E4%B8%80%E5%9C%B0%E5%AE%98%E5%AE%A3%EF%BC%9A3%E5%AD%A9%E5%AE%B6%E5%BA%AD%E8%B4%AD%E6%88%BF%E8%A1%A5%E8%B4%B420%E4%B8%87%E5%85%83&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 39, - "title": "OpenAI启动员工百亿美元售股", - "desc": "", - "score": "4172580", - "score_desc": "417.26w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/fc06e36007c4b957bee693b9abe64693", - "type": "1", - "type_desc": "新", - "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", - "url": "https://www.baidu.com/s?wd=OpenAI%E5%90%AF%E5%8A%A8%E5%91%98%E5%B7%A5%E7%99%BE%E4%BA%BF%E7%BE%8E%E5%85%83%E5%94%AE%E8%82%A1&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 40, - "title": "想入军迷圈的 现在正是好时候", - "desc": "", - "score": "4098627", - "score_desc": "409.86w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/d5bde24cc4eed187d500f3e7a9d73f2d", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E6%83%B3%E5%85%A5%E5%86%9B%E8%BF%B7%E5%9C%88%E7%9A%84+%E7%8E%B0%E5%9C%A8%E6%AD%A3%E6%98%AF%E5%A5%BD%E6%97%B6%E5%80%99&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 41, - "title": "九三阅兵台湾线上播放超500万", - "desc": "", - "score": "3999782", - "score_desc": "399.98w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/ebfee25839294c24ca24af788fbd92bd", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5%E5%8F%B0%E6%B9%BE%E7%BA%BF%E4%B8%8A%E6%92%AD%E6%94%BE%E8%B6%85500%E4%B8%87&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 42, - "title": "信鸽协会回应市民救助落水和平鸽", - "desc": "", - "score": "3886482", - "score_desc": "388.65w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/dc5ce78481f36774922add0eb7076ec7", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E4%BF%A1%E9%B8%BD%E5%8D%8F%E4%BC%9A%E5%9B%9E%E5%BA%94%E5%B8%82%E6%B0%91%E6%95%91%E5%8A%A9%E8%90%BD%E6%B0%B4%E5%92%8C%E5%B9%B3%E9%B8%BD&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 43, - "title": "台退将看阅兵新装备直呼自己是军盲", - "desc": "", - "score": "3794294", - "score_desc": "379.43w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/686bb8c544ec3d0bc9f01f7ccd31195c", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E5%8F%B0%E9%80%80%E5%B0%86%E7%9C%8B%E9%98%85%E5%85%B5%E6%96%B0%E8%A3%85%E5%A4%87%E7%9B%B4%E5%91%BC%E8%87%AA%E5%B7%B1%E6%98%AF%E5%86%9B%E7%9B%B2&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 44, - "title": "多国来华领导人接连发声", - "desc": "", - "score": "3679787", - "score_desc": "367.98w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/a7f9ac9aaeb54422c70870ac9ab36d09", - "type": "3", - "type_desc": "热", - "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", - "url": "https://www.baidu.com/s?wd=%E5%A4%9A%E5%9B%BD%E6%9D%A5%E5%8D%8E%E9%A2%86%E5%AF%BC%E4%BA%BA%E6%8E%A5%E8%BF%9E%E5%8F%91%E5%A3%B0&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 45, - "title": "河南佛教协会:释永信枉费僧众信任", - "desc": "", - "score": "3589427", - "score_desc": "358.94w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/279b2b9632b9d7776a62fccefbc058db", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E6%B2%B3%E5%8D%97%E4%BD%9B%E6%95%99%E5%8D%8F%E4%BC%9A%EF%BC%9A%E9%87%8A%E6%B0%B8%E4%BF%A1%E6%9E%89%E8%B4%B9%E5%83%A7%E4%BC%97%E4%BF%A1%E4%BB%BB&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 46, - "title": "揭秘阅兵地铁专列:143趟车接送2万人", - "desc": "", - "score": "3501916", - "score_desc": "350.19w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/711c2769ad7f6071171e7c11908c9f7a", - "type": "1", - "type_desc": "新", - "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", - "url": "https://www.baidu.com/s?wd=%E6%8F%AD%E7%A7%98%E9%98%85%E5%85%B5%E5%9C%B0%E9%93%81%E4%B8%93%E5%88%97%EF%BC%9A143%E8%B6%9F%E8%BD%A6%E6%8E%A5%E9%80%812%E4%B8%87%E4%BA%BA&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 47, - "title": "苑举正观礼听到《黄河大合唱》落泪", - "desc": "", - "score": "3431345", - "score_desc": "343.13w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/ea02d87734137d71f4a1529a5cb864c7", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E8%8B%91%E4%B8%BE%E6%AD%A3%E8%A7%82%E7%A4%BC%E5%90%AC%E5%88%B0%E3%80%8A%E9%BB%84%E6%B2%B3%E5%A4%A7%E5%90%88%E5%94%B1%E3%80%8B%E8%90%BD%E6%B3%AA&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 48, - "title": "九三阅兵解锁了这些“首次”", - "desc": "", - "score": "3339123", - "score_desc": "333.91w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/35812fb7bcf6ff0d71f52f60fb9055fa", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5%E8%A7%A3%E9%94%81%E4%BA%86%E8%BF%99%E4%BA%9B%E2%80%9C%E9%A6%96%E6%AC%A1%E2%80%9D&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 49, - "title": "中国首起反规避调查", - "desc": "", - "score": "3210675", - "score_desc": "321.07w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/fa9ce1dd50ddb58eab40b7de920a0d79", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD%E9%A6%96%E8%B5%B7%E5%8F%8D%E8%A7%84%E9%81%BF%E8%B0%83%E6%9F%A5&sa=fyb_news&rsv_dl=fyb_news" - }, - { - "rank": 50, - "title": "王楚钦:被祖国的强大深深触动", - "desc": "", - "score": "3147784", - "score_desc": "314.78w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/d8ae151e1eefdec0449a52574f58ee51", - "type": "0", - "type_desc": null, - "type_icon": null, - "url": "https://www.baidu.com/s?wd=%E7%8E%8B%E6%A5%9A%E9%92%A6%EF%BC%9A%E8%A2%AB%E7%A5%96%E5%9B%BD%E7%9A%84%E5%BC%BA%E5%A4%A7%E6%B7%B1%E6%B7%B1%E8%A7%A6%E5%8A%A8&sa=fyb_news&rsv_dl=fyb_news" - } - ] +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": [ + { + "rank": 1, + "title": "102岁老兵ICU看阅兵后安详离世", + "desc": "", + "score": "7807952", + "score_desc": "780.8w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/e190dea8327f8295c8a5883878fe6d14", + "type": "1", + "type_desc": "新", + "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", + "url": "https://www.baidu.com/s?wd=102%E5%B2%81%E8%80%81%E5%85%B5ICU%E7%9C%8B%E9%98%85%E5%85%B5%E5%90%8E%E5%AE%89%E8%AF%A6%E7%A6%BB%E4%B8%96&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 2, + "title": "看阅兵明白了耿爽联合国发言含金量", + "desc": "", + "score": "7714187", + "score_desc": "771.42w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/83340b647c7a2f569c0a03482d5b40f1", + "type": "3", + "type_desc": "热", + "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", + "url": "https://www.baidu.com/s?wd=%E7%9C%8B%E9%98%85%E5%85%B5%E6%98%8E%E7%99%BD%E4%BA%86%E8%80%BF%E7%88%BD%E8%81%94%E5%90%88%E5%9B%BD%E5%8F%91%E8%A8%80%E5%90%AB%E9%87%91%E9%87%8F&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 3, + "title": "80秒带你回顾阅兵“高燃瞬间”", + "desc": "", + "score": "7616477", + "score_desc": "761.65w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/a64eb808789c7bae99eb3e0f98a20621", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=80%E7%A7%92%E5%B8%A6%E4%BD%A0%E5%9B%9E%E9%A1%BE%E9%98%85%E5%85%B5%E2%80%9C%E9%AB%98%E7%87%83%E7%9E%AC%E9%97%B4%E2%80%9D&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 4, + "title": "新华社认证的帅兵哥已婚", + "desc": "", + "score": "7522472", + "score_desc": "752.25w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/493dd01d2abf915809eb1387e5b8a026", + "type": "1", + "type_desc": "新", + "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", + "url": "https://www.baidu.com/s?wd=%E6%96%B0%E5%8D%8E%E7%A4%BE%E8%AE%A4%E8%AF%81%E7%9A%84%E5%B8%85%E5%85%B5%E5%93%A5%E5%B7%B2%E5%A9%9A&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 5, + "title": "普京记者会身后的大红灯笼亮了", + "desc": "", + "score": "7426902", + "score_desc": "742.69w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/1e895a56da47054e111ce225b1efd58f", + "type": "3", + "type_desc": "热", + "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", + "url": "https://www.baidu.com/s?wd=%E6%99%AE%E4%BA%AC%E8%AE%B0%E8%80%85%E4%BC%9A%E8%BA%AB%E5%90%8E%E7%9A%84%E5%A4%A7%E7%BA%A2%E7%81%AF%E7%AC%BC%E4%BA%AE%E4%BA%86&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 6, + "title": "中国网警:烽火烬处 赓续前行", + "desc": "", + "score": "7332067", + "score_desc": "733.21w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/0d872743f2cfabc8fd9ee1da970a5fed", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD%E7%BD%91%E8%AD%A6%EF%BC%9A%E7%83%BD%E7%81%AB%E7%83%AC%E5%A4%84+%E8%B5%93%E7%BB%AD%E5%89%8D%E8%A1%8C&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 7, + "title": "“呼叫81192!” 这一刻含泪量太高", + "desc": "", + "score": "7237296", + "score_desc": "723.73w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/552c202f87db2219d6e150a39976bad7", + "type": "1", + "type_desc": "新", + "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", + "url": "https://www.baidu.com/s?wd=%E2%80%9C%E5%91%BC%E5%8F%AB81192%EF%BC%81%E2%80%9D+%E8%BF%99%E4%B8%80%E5%88%BB%E5%90%AB%E6%B3%AA%E9%87%8F%E5%A4%AA%E9%AB%98&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 8, + "title": "天津和平鸽归巢主人激动吹哨迎接", + "desc": "", + "score": "7139286", + "score_desc": "713.93w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/1c5dfd83c55b6482d1307f310d5642a7", + "type": "3", + "type_desc": "热", + "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", + "url": "https://www.baidu.com/s?wd=%E5%A4%A9%E6%B4%A5%E5%92%8C%E5%B9%B3%E9%B8%BD%E5%BD%92%E5%B7%A2%E4%B8%BB%E4%BA%BA%E6%BF%80%E5%8A%A8%E5%90%B9%E5%93%A8%E8%BF%8E%E6%8E%A5&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 9, + "title": "中国排面给全世界亿点点震撼", + "desc": "", + "score": "7042854", + "score_desc": "704.29w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/986b69bb82a32bbd72f4c90281ece503", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD%E6%8E%92%E9%9D%A2%E7%BB%99%E5%85%A8%E4%B8%96%E7%95%8C%E4%BA%BF%E7%82%B9%E7%82%B9%E9%9C%87%E6%92%BC&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 10, + "title": "8万只气球缘何直径都是26厘米左右", + "desc": "", + "score": "6943236", + "score_desc": "694.32w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/783293899ac972283b13501deb5772fa", + "type": "3", + "type_desc": "热", + "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", + "url": "https://www.baidu.com/s?wd=8%E4%B8%87%E5%8F%AA%E6%B0%94%E7%90%83%E7%BC%98%E4%BD%95%E7%9B%B4%E5%BE%84%E9%83%BD%E6%98%AF26%E5%8E%98%E7%B1%B3%E5%B7%A6%E5%8F%B3&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 11, + "title": "江苏足协辟谣“苏超”要改名", + "desc": "近日,有部分自媒体称“苏超”已改名,对此,江苏省足协回应:“苏超”没有改名,也没有想过要改名。", + "score": "6853163", + "score_desc": "685.32w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/fe16124a5cd018feee2e941d05850e00", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E6%B1%9F%E8%8B%8F%E8%B6%B3%E5%8D%8F%E8%BE%9F%E8%B0%A3%E2%80%9C%E8%8B%8F%E8%B6%85%E2%80%9D%E8%A6%81%E6%94%B9%E5%90%8D&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 12, + "title": "金正恩只回了韩议长一个字", + "desc": "", + "score": "6760236", + "score_desc": "676.02w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/68824cd0db12d3d6b71f6d79dc9cd1e4", + "type": "3", + "type_desc": "热", + "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", + "url": "https://www.baidu.com/s?wd=%E9%87%91%E6%AD%A3%E6%81%A9%E5%8F%AA%E5%9B%9E%E4%BA%86%E9%9F%A9%E8%AE%AE%E9%95%BF%E4%B8%80%E4%B8%AA%E5%AD%97&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 13, + "title": "特朗普称看了九三阅兵:很精彩很震撼", + "desc": "", + "score": "6656922", + "score_desc": "665.69w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/bb902e423148eb1e83e78955f2eb9adb", + "type": "3", + "type_desc": "热", + "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", + "url": "https://www.baidu.com/s?wd=%E7%89%B9%E6%9C%97%E6%99%AE%E7%A7%B0%E7%9C%8B%E4%BA%86%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5%EF%BC%9A%E5%BE%88%E7%B2%BE%E5%BD%A9%E5%BE%88%E9%9C%87%E6%92%BC&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 14, + "title": "韩国高铁站直播九三阅兵", + "desc": "", + "score": "6566970", + "score_desc": "656.7w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/b68cb01b4b20989cea82c78c9fe39c3b", + "type": "3", + "type_desc": "热", + "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", + "url": "https://www.baidu.com/s?wd=%E9%9F%A9%E5%9B%BD%E9%AB%98%E9%93%81%E7%AB%99%E7%9B%B4%E6%92%AD%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 15, + "title": "在中国的加沙人看阅兵时落泪", + "desc": "", + "score": "6476621", + "score_desc": "647.66w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/f16f082786ac14ea20dc709c527dec4b", + "type": "3", + "type_desc": "热", + "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", + "url": "https://www.baidu.com/s?wd=%E5%9C%A8%E4%B8%AD%E5%9B%BD%E7%9A%84%E5%8A%A0%E6%B2%99%E4%BA%BA%E7%9C%8B%E9%98%85%E5%85%B5%E6%97%B6%E8%90%BD%E6%B3%AA&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 16, + "title": "专家:东风-61出现改变命名规则", + "desc": "", + "score": "6376137", + "score_desc": "637.61w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/66c1c659e7b1a37732b2735253716d60", + "type": "3", + "type_desc": "热", + "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", + "url": "https://www.baidu.com/s?wd=%E4%B8%93%E5%AE%B6%EF%BC%9A%E4%B8%9C%E9%A3%8E-61%E5%87%BA%E7%8E%B0%E6%94%B9%E5%8F%98%E5%91%BD%E5%90%8D%E8%A7%84%E5%88%99&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 17, + "title": "军嫂盯着徒步方队找丈夫迷糊了", + "desc": "", + "score": "6274961", + "score_desc": "627.5w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/90ac62b9f3b3365dc7fed40c62259a9f", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E5%86%9B%E5%AB%82%E7%9B%AF%E7%9D%80%E5%BE%92%E6%AD%A5%E6%96%B9%E9%98%9F%E6%89%BE%E4%B8%88%E5%A4%AB%E8%BF%B7%E7%B3%8A%E4%BA%86&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 18, + "title": "普京调侃佩斯科夫:懒虫 不想工作", + "desc": "", + "score": "6180590", + "score_desc": "618.06w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/8e9fae0b3a1b23049cfdb9323d6a1efe", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E6%99%AE%E4%BA%AC%E8%B0%83%E4%BE%83%E4%BD%A9%E6%96%AF%E7%A7%91%E5%A4%AB%EF%BC%9A%E6%87%92%E8%99%AB+%E4%B8%8D%E6%83%B3%E5%B7%A5%E4%BD%9C&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 19, + "title": "原陆军第31集团军军长王昭堃逝世", + "desc": "", + "score": "6089180", + "score_desc": "608.92w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/778f1aa16cdfc4db09926956ae5b5741", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E5%8E%9F%E9%99%86%E5%86%9B%E7%AC%AC31%E9%9B%86%E5%9B%A2%E5%86%9B%E5%86%9B%E9%95%BF%E7%8E%8B%E6%98%AD%E5%A0%83%E9%80%9D%E4%B8%96&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 20, + "title": "“防霸凌”儿童指纹水杯被吐槽费妈", + "desc": "", + "score": "5986581", + "score_desc": "598.66w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/c590f4412c1aa6904b65a94cba7de275", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E2%80%9C%E9%98%B2%E9%9C%B8%E5%87%8C%E2%80%9D%E5%84%BF%E7%AB%A5%E6%8C%87%E7%BA%B9%E6%B0%B4%E6%9D%AF%E8%A2%AB%E5%90%90%E6%A7%BD%E8%B4%B9%E5%A6%88&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 21, + "title": "特朗普下令重振美国军队", + "desc": "", + "score": "5902417", + "score_desc": "590.24w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/de99b4697f6d926890dc31d686c1222c", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E7%89%B9%E6%9C%97%E6%99%AE%E4%B8%8B%E4%BB%A4%E9%87%8D%E6%8C%AF%E7%BE%8E%E5%9B%BD%E5%86%9B%E9%98%9F&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 22, + "title": "间谍张某某死缓:出轨外国女官员生子", + "desc": "", + "score": "5790606", + "score_desc": "579.06w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/f93c1366d41c7cfbb2383dcb17449c28", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E9%97%B4%E8%B0%8D%E5%BC%A0%E6%9F%90%E6%9F%90%E6%AD%BB%E7%BC%93%EF%BC%9A%E5%87%BA%E8%BD%A8%E5%A4%96%E5%9B%BD%E5%A5%B3%E5%AE%98%E5%91%98%E7%94%9F%E5%AD%90&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 23, + "title": "5万余人观礼离场后干干净净", + "desc": "", + "score": "5717616", + "score_desc": "571.76w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/53c6b971cef08daf3104bb5133b4b6ed", + "type": "3", + "type_desc": "热", + "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", + "url": "https://www.baidu.com/s?wd=5%E4%B8%87%E4%BD%99%E4%BA%BA%E8%A7%82%E7%A4%BC%E7%A6%BB%E5%9C%BA%E5%90%8E%E5%B9%B2%E5%B9%B2%E5%87%80%E5%87%80&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 24, + "title": "普京乘机回国 王毅送行", + "desc": "", + "score": "5607811", + "score_desc": "560.78w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/5f7afddd2e0a570573b245b6f31a1338", + "type": "1", + "type_desc": "新", + "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", + "url": "https://www.baidu.com/s?wd=%E6%99%AE%E4%BA%AC%E4%B9%98%E6%9C%BA%E5%9B%9E%E5%9B%BD+%E7%8E%8B%E6%AF%85%E9%80%81%E8%A1%8C&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 25, + "title": "刘老庄连战旗为何多了一个点", + "desc": "", + "score": "5513446", + "score_desc": "551.34w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/7084449234aed77c74438ca263fdcd58", + "type": "1", + "type_desc": "新", + "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", + "url": "https://www.baidu.com/s?wd=%E5%88%98%E8%80%81%E5%BA%84%E8%BF%9E%E6%88%98%E6%97%97%E4%B8%BA%E4%BD%95%E5%A4%9A%E4%BA%86%E4%B8%80%E4%B8%AA%E7%82%B9&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 26, + "title": "迎面感受东风-61东风-5C的视觉冲击", + "desc": "", + "score": "5426660", + "score_desc": "542.67w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/40210a63cf69ddbbedbe59a19730e374", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E8%BF%8E%E9%9D%A2%E6%84%9F%E5%8F%97%E4%B8%9C%E9%A3%8E-61%E4%B8%9C%E9%A3%8E-5C%E7%9A%84%E8%A7%86%E8%A7%89%E5%86%B2%E5%87%BB&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 27, + "title": "阅兵当天的北京处处都有追飞机的人", + "desc": "", + "score": "5336487", + "score_desc": "533.65w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/1513230ae41ba37f680dccbc526b7145", + "type": "3", + "type_desc": "热", + "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", + "url": "https://www.baidu.com/s?wd=%E9%98%85%E5%85%B5%E5%BD%93%E5%A4%A9%E7%9A%84%E5%8C%97%E4%BA%AC%E5%A4%84%E5%A4%84%E9%83%BD%E6%9C%89%E8%BF%BD%E9%A3%9E%E6%9C%BA%E7%9A%84%E4%BA%BA&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 28, + "title": "歼-35大片来了", + "desc": "", + "score": "5240364", + "score_desc": "524.04w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/017c3b52514fb3ae83405da1da5fc350", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E6%AD%BC-35%E5%A4%A7%E7%89%87%E6%9D%A5%E4%BA%86&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 29, + "title": "普京透露与特朗普“车内密谈”细节", + "desc": "", + "score": "5123571", + "score_desc": "512.36w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/5548e90353e4696a1116ffc0e65e086d", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E6%99%AE%E4%BA%AC%E9%80%8F%E9%9C%B2%E4%B8%8E%E7%89%B9%E6%9C%97%E6%99%AE%E2%80%9C%E8%BD%A6%E5%86%85%E5%AF%86%E8%B0%88%E2%80%9D%E7%BB%86%E8%8A%82&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 30, + "title": "和平鸽从天津到北京出差参加阅兵", + "desc": "", + "score": "5037077", + "score_desc": "503.71w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/f4558c31275119cfab564cadeddf6f50", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E5%92%8C%E5%B9%B3%E9%B8%BD%E4%BB%8E%E5%A4%A9%E6%B4%A5%E5%88%B0%E5%8C%97%E4%BA%AC%E5%87%BA%E5%B7%AE%E5%8F%82%E5%8A%A0%E9%98%85%E5%85%B5&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 31, + "title": "王毅送中国跑鞋 匈牙利外长爱不释手", + "desc": "", + "score": "4950481", + "score_desc": "495.05w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/95df9511f4c0951f823f387f3286c029", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E7%8E%8B%E6%AF%85%E9%80%81%E4%B8%AD%E5%9B%BD%E8%B7%91%E9%9E%8B+%E5%8C%88%E7%89%99%E5%88%A9%E5%A4%96%E9%95%BF%E7%88%B1%E4%B8%8D%E9%87%8A%E6%89%8B&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 32, + "title": "郑钦文晒东风5C帅照", + "desc": "", + "score": "4841678", + "score_desc": "484.17w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/5e2fec1c090ce966a2dd89071342d3e9", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E9%83%91%E9%92%A6%E6%96%87%E6%99%92%E4%B8%9C%E9%A3%8E5C%E5%B8%85%E7%85%A7&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 33, + "title": "阅兵当天 北京街头成为别样观礼台", + "desc": "", + "score": "4760831", + "score_desc": "476.08w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/a6495a07da318dc9644f77de370b8035", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E9%98%85%E5%85%B5%E5%BD%93%E5%A4%A9+%E5%8C%97%E4%BA%AC%E8%A1%97%E5%A4%B4%E6%88%90%E4%B8%BA%E5%88%AB%E6%A0%B7%E8%A7%82%E7%A4%BC%E5%8F%B0&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 34, + "title": "华春莹与记者互动:我的心情和你一样", + "desc": "", + "score": "4651512", + "score_desc": "465.15w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/4377037f24b931479efc20e2a7b87776", + "type": "3", + "type_desc": "热", + "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", + "url": "https://www.baidu.com/s?wd=%E5%8D%8E%E6%98%A5%E8%8E%B9%E4%B8%8E%E8%AE%B0%E8%80%85%E4%BA%92%E5%8A%A8%EF%BC%9A%E6%88%91%E7%9A%84%E5%BF%83%E6%83%85%E5%92%8C%E4%BD%A0%E4%B8%80%E6%A0%B7&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 35, + "title": "父亲称女民兵方队领队是全家的骄傲", + "desc": "", + "score": "4566469", + "score_desc": "456.65w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/79b1620e703b1e73fd5db686d6314ea0", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E7%88%B6%E4%BA%B2%E7%A7%B0%E5%A5%B3%E6%B0%91%E5%85%B5%E6%96%B9%E9%98%9F%E9%A2%86%E9%98%9F%E6%98%AF%E5%85%A8%E5%AE%B6%E7%9A%84%E9%AA%84%E5%82%B2&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 36, + "title": "宝宝出生恰逢阅兵 家人取名袁安阅", + "desc": "", + "score": "4470561", + "score_desc": "447.06w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/a5063fd737daf1da7a969e36ab672ed8", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E5%AE%9D%E5%AE%9D%E5%87%BA%E7%94%9F%E6%81%B0%E9%80%A2%E9%98%85%E5%85%B5+%E5%AE%B6%E4%BA%BA%E5%8F%96%E5%90%8D%E8%A2%81%E5%AE%89%E9%98%85&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 37, + "title": "特朗普承认观看中国阅兵", + "desc": "", + "score": "4353451", + "score_desc": "435.35w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/e7c27a7640bc0f9d25dcd7ad79026ce7", + "type": "3", + "type_desc": "热", + "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", + "url": "https://www.baidu.com/s?wd=%E7%89%B9%E6%9C%97%E6%99%AE%E6%89%BF%E8%AE%A4%E8%A7%82%E7%9C%8B%E4%B8%AD%E5%9B%BD%E9%98%85%E5%85%B5&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 38, + "title": "一地官宣:3孩家庭购房补贴20万元", + "desc": "", + "score": "4290101", + "score_desc": "429.01w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/507444a742944d2ed619b480fdab147e", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E4%B8%80%E5%9C%B0%E5%AE%98%E5%AE%A3%EF%BC%9A3%E5%AD%A9%E5%AE%B6%E5%BA%AD%E8%B4%AD%E6%88%BF%E8%A1%A5%E8%B4%B420%E4%B8%87%E5%85%83&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 39, + "title": "OpenAI启动员工百亿美元售股", + "desc": "", + "score": "4172580", + "score_desc": "417.26w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/fc06e36007c4b957bee693b9abe64693", + "type": "1", + "type_desc": "新", + "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", + "url": "https://www.baidu.com/s?wd=OpenAI%E5%90%AF%E5%8A%A8%E5%91%98%E5%B7%A5%E7%99%BE%E4%BA%BF%E7%BE%8E%E5%85%83%E5%94%AE%E8%82%A1&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 40, + "title": "想入军迷圈的 现在正是好时候", + "desc": "", + "score": "4098627", + "score_desc": "409.86w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/d5bde24cc4eed187d500f3e7a9d73f2d", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E6%83%B3%E5%85%A5%E5%86%9B%E8%BF%B7%E5%9C%88%E7%9A%84+%E7%8E%B0%E5%9C%A8%E6%AD%A3%E6%98%AF%E5%A5%BD%E6%97%B6%E5%80%99&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 41, + "title": "九三阅兵台湾线上播放超500万", + "desc": "", + "score": "3999782", + "score_desc": "399.98w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/ebfee25839294c24ca24af788fbd92bd", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5%E5%8F%B0%E6%B9%BE%E7%BA%BF%E4%B8%8A%E6%92%AD%E6%94%BE%E8%B6%85500%E4%B8%87&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 42, + "title": "信鸽协会回应市民救助落水和平鸽", + "desc": "", + "score": "3886482", + "score_desc": "388.65w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/dc5ce78481f36774922add0eb7076ec7", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E4%BF%A1%E9%B8%BD%E5%8D%8F%E4%BC%9A%E5%9B%9E%E5%BA%94%E5%B8%82%E6%B0%91%E6%95%91%E5%8A%A9%E8%90%BD%E6%B0%B4%E5%92%8C%E5%B9%B3%E9%B8%BD&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 43, + "title": "台退将看阅兵新装备直呼自己是军盲", + "desc": "", + "score": "3794294", + "score_desc": "379.43w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/686bb8c544ec3d0bc9f01f7ccd31195c", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E5%8F%B0%E9%80%80%E5%B0%86%E7%9C%8B%E9%98%85%E5%85%B5%E6%96%B0%E8%A3%85%E5%A4%87%E7%9B%B4%E5%91%BC%E8%87%AA%E5%B7%B1%E6%98%AF%E5%86%9B%E7%9B%B2&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 44, + "title": "多国来华领导人接连发声", + "desc": "", + "score": "3679787", + "score_desc": "367.98w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/a7f9ac9aaeb54422c70870ac9ab36d09", + "type": "3", + "type_desc": "热", + "type_icon": "https://search-operate.cdn.bcebos.com/54a1ed72d00cd07334860b0509489d8b.png", + "url": "https://www.baidu.com/s?wd=%E5%A4%9A%E5%9B%BD%E6%9D%A5%E5%8D%8E%E9%A2%86%E5%AF%BC%E4%BA%BA%E6%8E%A5%E8%BF%9E%E5%8F%91%E5%A3%B0&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 45, + "title": "河南佛教协会:释永信枉费僧众信任", + "desc": "", + "score": "3589427", + "score_desc": "358.94w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/279b2b9632b9d7776a62fccefbc058db", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E6%B2%B3%E5%8D%97%E4%BD%9B%E6%95%99%E5%8D%8F%E4%BC%9A%EF%BC%9A%E9%87%8A%E6%B0%B8%E4%BF%A1%E6%9E%89%E8%B4%B9%E5%83%A7%E4%BC%97%E4%BF%A1%E4%BB%BB&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 46, + "title": "揭秘阅兵地铁专列:143趟车接送2万人", + "desc": "", + "score": "3501916", + "score_desc": "350.19w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/711c2769ad7f6071171e7c11908c9f7a", + "type": "1", + "type_desc": "新", + "type_icon": "https://search-operate.cdn.bcebos.com/42e626c5469cc4cd3b91131bcfe53d44.png", + "url": "https://www.baidu.com/s?wd=%E6%8F%AD%E7%A7%98%E9%98%85%E5%85%B5%E5%9C%B0%E9%93%81%E4%B8%93%E5%88%97%EF%BC%9A143%E8%B6%9F%E8%BD%A6%E6%8E%A5%E9%80%812%E4%B8%87%E4%BA%BA&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 47, + "title": "苑举正观礼听到《黄河大合唱》落泪", + "desc": "", + "score": "3431345", + "score_desc": "343.13w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/ea02d87734137d71f4a1529a5cb864c7", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E8%8B%91%E4%B8%BE%E6%AD%A3%E8%A7%82%E7%A4%BC%E5%90%AC%E5%88%B0%E3%80%8A%E9%BB%84%E6%B2%B3%E5%A4%A7%E5%90%88%E5%94%B1%E3%80%8B%E8%90%BD%E6%B3%AA&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 48, + "title": "九三阅兵解锁了这些“首次”", + "desc": "", + "score": "3339123", + "score_desc": "333.91w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/35812fb7bcf6ff0d71f52f60fb9055fa", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5%E8%A7%A3%E9%94%81%E4%BA%86%E8%BF%99%E4%BA%9B%E2%80%9C%E9%A6%96%E6%AC%A1%E2%80%9D&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 49, + "title": "中国首起反规避调查", + "desc": "", + "score": "3210675", + "score_desc": "321.07w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/fa9ce1dd50ddb58eab40b7de920a0d79", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD%E9%A6%96%E8%B5%B7%E5%8F%8D%E8%A7%84%E9%81%BF%E8%B0%83%E6%9F%A5&sa=fyb_news&rsv_dl=fyb_news" + }, + { + "rank": 50, + "title": "王楚钦:被祖国的强大深深触动", + "desc": "", + "score": "3147784", + "score_desc": "314.78w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/d8ae151e1eefdec0449a52574f58ee51", + "type": "0", + "type_desc": null, + "type_icon": null, + "url": "https://www.baidu.com/s?wd=%E7%8E%8B%E6%A5%9A%E9%92%A6%EF%BC%9A%E8%A2%AB%E7%A5%96%E5%9B%BD%E7%9A%84%E5%BC%BA%E5%A4%A7%E6%B7%B1%E6%B7%B1%E8%A7%A6%E5%8A%A8&sa=fyb_news&rsv_dl=fyb_news" + } + ] } \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/background.css b/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/background.css index 06eae404..8e7c4e10 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/background.css +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/background.css @@ -1,242 +1,242 @@ -/* 页面主背景 */ -body { - background: linear-gradient(135deg, #f9fbe7 0%, #f1f8e9 25%, #e8f5e8 50%, #dcedc8 75%, #c5e1a5 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(139, 195, 74, 0.06) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(205, 220, 57, 0.06) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(212, 225, 87, 0.08) 0%, transparent 50%); - pointer-events: none; - z-index: -1; -} - -/* 容器背景 */ -.container { - background: rgba(255, 255, 255, 0.75); - backdrop-filter: blur(10px); - border-radius: 16px; - box-shadow: 0 8px 32px rgba(139, 195, 74, 0.12); - margin-top: 20px; - margin-bottom: 20px; - border: 1px solid rgba(241, 248, 233, 0.5); -} - -/* 头部背景 */ -.header { - background: linear-gradient(135deg, rgba(139, 195, 74, 0.08) 0%, rgba(205, 220, 57, 0.08) 100%); - border-radius: 16px 16px 0 0; - position: relative; - overflow: hidden; -} - -.header::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: - radial-gradient(circle at 30% 20%, rgba(139, 195, 74, 0.12) 0%, transparent 40%), - radial-gradient(circle at 70% 80%, rgba(205, 220, 57, 0.1) 0%, transparent 40%); - pointer-events: none; -} - -/* 电视剧项目背景 */ -.tv-item { - background: rgba(255, 255, 255, 0.92); - backdrop-filter: blur(8px); - position: relative; - overflow: hidden; -} - -.tv-item::after { - content: ''; - position: absolute; - top: 0; - right: 0; - width: 60px; - height: 100%; - background: linear-gradient(90deg, transparent 0%, rgba(139, 195, 74, 0.03) 100%); - pointer-events: none; -} - -/* 前三名特殊背景效果 */ -.tv-item:nth-child(1) { - background: linear-gradient(135deg, rgba(244, 67, 54, 0.06) 0%, rgba(255, 255, 255, 0.96) 100%); -} - -.tv-item:nth-child(2) { - background: linear-gradient(135deg, rgba(255, 152, 0, 0.06) 0%, rgba(255, 255, 255, 0.96) 100%); -} - -.tv-item:nth-child(3) { - background: linear-gradient(135deg, rgba(255, 193, 7, 0.06) 0%, rgba(255, 255, 255, 0.96) 100%); -} - -/* 加载状态背景 */ -.loading { - background: rgba(255, 255, 255, 0.85); - backdrop-filter: blur(8px); - border-radius: 12px; - margin: 20px; - border: 1px solid rgba(241, 248, 233, 0.3); -} - -/* 错误信息背景 */ -.error-message { - background: linear-gradient(135deg, rgba(231, 76, 60, 0.06) 0%, rgba(255, 255, 255, 0.92) 100%); - backdrop-filter: blur(8px); - border-radius: 12px; - border: 1px solid rgba(231, 76, 60, 0.1); - margin: 20px; -} - -/* 底部背景 */ -.footer { - background: linear-gradient(135deg, rgba(139, 195, 74, 0.04) 0%, rgba(205, 220, 57, 0.04) 100%); - border-radius: 0 0 16px 16px; - position: relative; -} - -.footer::before { - content: ''; - position: absolute; - top: 0; - left: 50%; - transform: translateX(-50%); - width: 60px; - height: 1px; - background: linear-gradient(90deg, transparent 0%, rgba(139, 195, 74, 0.4) 50%, transparent 100%); -} - -/* 封面图片背景效果 */ -.item-cover { - position: relative; - overflow: hidden; -} - -.item-cover::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: linear-gradient(45deg, rgba(139, 195, 74, 0.05) 0%, transparent 50%); - pointer-events: none; - opacity: 0; - transition: opacity 0.3s ease; -} - -.tv-item:hover .item-cover::before { - opacity: 1; -} - -/* 响应式背景调整 */ -@media (max-width: 768px) { - .container { - margin-top: 10px; - margin-bottom: 10px; - border-radius: 12px; - } - - .header { - border-radius: 12px 12px 0 0; - } - - .footer { - border-radius: 0 0 12px 12px; - } - - body::before { - background-image: - radial-gradient(circle at 20% 80%, rgba(139, 195, 74, 0.04) 0%, transparent 40%), - radial-gradient(circle at 80% 20%, rgba(205, 220, 57, 0.04) 0%, transparent 40%); - } -} - -@media (min-width: 1025px) { - .container { - margin-top: 40px; - margin-bottom: 40px; - } - - body::before { - background-image: - radial-gradient(circle at 15% 85%, rgba(139, 195, 74, 0.08) 0%, transparent 60%), - radial-gradient(circle at 85% 15%, rgba(205, 220, 57, 0.08) 0%, transparent 60%), - radial-gradient(circle at 50% 50%, rgba(212, 225, 87, 0.06) 0%, transparent 70%); - } -} - -/* 动画效果 */ -@keyframes backgroundShift { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* 悬浮时的背景变化 */ -.tv-item:hover { - background: rgba(255, 255, 255, 0.98); -} - -.tv-item:hover::after { - background: linear-gradient(90deg, transparent 0%, rgba(139, 195, 74, 0.06) 100%); -} - -/* 排名背景渐变 */ -.rank { - position: relative; - overflow: hidden; -} - -.rank::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: linear-gradient(45deg, rgba(255, 255, 255, 0.25) 0%, transparent 100%); - pointer-events: none; -} - -/* 按钮背景效果 */ -.retry-btn { - position: relative; - overflow: hidden; -} - -.retry-btn::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.3) 50%, transparent 100%); - transition: left 0.5s ease; -} - -.retry-btn:hover::before { - left: 100%; +/* 页面主背景 */ +body { + background: linear-gradient(135deg, #f9fbe7 0%, #f1f8e9 25%, #e8f5e8 50%, #dcedc8 75%, #c5e1a5 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(139, 195, 74, 0.06) 0%, transparent 50%), + radial-gradient(circle at 80% 20%, rgba(205, 220, 57, 0.06) 0%, transparent 50%), + radial-gradient(circle at 40% 40%, rgba(212, 225, 87, 0.08) 0%, transparent 50%); + pointer-events: none; + z-index: -1; +} + +/* 容器背景 */ +.container { + background: rgba(255, 255, 255, 0.75); + backdrop-filter: blur(10px); + border-radius: 16px; + box-shadow: 0 8px 32px rgba(139, 195, 74, 0.12); + margin-top: 20px; + margin-bottom: 20px; + border: 1px solid rgba(241, 248, 233, 0.5); +} + +/* 头部背景 */ +.header { + background: linear-gradient(135deg, rgba(139, 195, 74, 0.08) 0%, rgba(205, 220, 57, 0.08) 100%); + border-radius: 16px 16px 0 0; + position: relative; + overflow: hidden; +} + +.header::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: + radial-gradient(circle at 30% 20%, rgba(139, 195, 74, 0.12) 0%, transparent 40%), + radial-gradient(circle at 70% 80%, rgba(205, 220, 57, 0.1) 0%, transparent 40%); + pointer-events: none; +} + +/* 电视剧项目背景 */ +.tv-item { + background: rgba(255, 255, 255, 0.92); + backdrop-filter: blur(8px); + position: relative; + overflow: hidden; +} + +.tv-item::after { + content: ''; + position: absolute; + top: 0; + right: 0; + width: 60px; + height: 100%; + background: linear-gradient(90deg, transparent 0%, rgba(139, 195, 74, 0.03) 100%); + pointer-events: none; +} + +/* 前三名特殊背景效果 */ +.tv-item:nth-child(1) { + background: linear-gradient(135deg, rgba(244, 67, 54, 0.06) 0%, rgba(255, 255, 255, 0.96) 100%); +} + +.tv-item:nth-child(2) { + background: linear-gradient(135deg, rgba(255, 152, 0, 0.06) 0%, rgba(255, 255, 255, 0.96) 100%); +} + +.tv-item:nth-child(3) { + background: linear-gradient(135deg, rgba(255, 193, 7, 0.06) 0%, rgba(255, 255, 255, 0.96) 100%); +} + +/* 加载状态背景 */ +.loading { + background: rgba(255, 255, 255, 0.85); + backdrop-filter: blur(8px); + border-radius: 12px; + margin: 20px; + border: 1px solid rgba(241, 248, 233, 0.3); +} + +/* 错误信息背景 */ +.error-message { + background: linear-gradient(135deg, rgba(231, 76, 60, 0.06) 0%, rgba(255, 255, 255, 0.92) 100%); + backdrop-filter: blur(8px); + border-radius: 12px; + border: 1px solid rgba(231, 76, 60, 0.1); + margin: 20px; +} + +/* 底部背景 */ +.footer { + background: linear-gradient(135deg, rgba(139, 195, 74, 0.04) 0%, rgba(205, 220, 57, 0.04) 100%); + border-radius: 0 0 16px 16px; + position: relative; +} + +.footer::before { + content: ''; + position: absolute; + top: 0; + left: 50%; + transform: translateX(-50%); + width: 60px; + height: 1px; + background: linear-gradient(90deg, transparent 0%, rgba(139, 195, 74, 0.4) 50%, transparent 100%); +} + +/* 封面图片背景效果 */ +.item-cover { + position: relative; + overflow: hidden; +} + +.item-cover::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: linear-gradient(45deg, rgba(139, 195, 74, 0.05) 0%, transparent 50%); + pointer-events: none; + opacity: 0; + transition: opacity 0.3s ease; +} + +.tv-item:hover .item-cover::before { + opacity: 1; +} + +/* 响应式背景调整 */ +@media (max-width: 768px) { + .container { + margin-top: 10px; + margin-bottom: 10px; + border-radius: 12px; + } + + .header { + border-radius: 12px 12px 0 0; + } + + .footer { + border-radius: 0 0 12px 12px; + } + + body::before { + background-image: + radial-gradient(circle at 20% 80%, rgba(139, 195, 74, 0.04) 0%, transparent 40%), + radial-gradient(circle at 80% 20%, rgba(205, 220, 57, 0.04) 0%, transparent 40%); + } +} + +@media (min-width: 1025px) { + .container { + margin-top: 40px; + margin-bottom: 40px; + } + + body::before { + background-image: + radial-gradient(circle at 15% 85%, rgba(139, 195, 74, 0.08) 0%, transparent 60%), + radial-gradient(circle at 85% 15%, rgba(205, 220, 57, 0.08) 0%, transparent 60%), + radial-gradient(circle at 50% 50%, rgba(212, 225, 87, 0.06) 0%, transparent 70%); + } +} + +/* 动画效果 */ +@keyframes backgroundShift { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} + +/* 悬浮时的背景变化 */ +.tv-item:hover { + background: rgba(255, 255, 255, 0.98); +} + +.tv-item:hover::after { + background: linear-gradient(90deg, transparent 0%, rgba(139, 195, 74, 0.06) 100%); +} + +/* 排名背景渐变 */ +.rank { + position: relative; + overflow: hidden; +} + +.rank::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: linear-gradient(45deg, rgba(255, 255, 255, 0.25) 0%, transparent 100%); + pointer-events: none; +} + +/* 按钮背景效果 */ +.retry-btn { + position: relative; + overflow: hidden; +} + +.retry-btn::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.3) 50%, transparent 100%); + transition: left 0.5s ease; +} + +.retry-btn:hover::before { + left: 100%; } \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/index.html index 7c40d9f2..8b802e69 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 b1174db4..179a3369 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/script.js +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/script.js @@ -1,267 +1,267 @@ -// DOM元素获取 -const loadingElement = document.getElementById('loading'); -const errorElement = document.getElementById('error'); -const tvListElement = document.getElementById('tvList'); -const updateTimeElement = document.getElementById('updateTime'); - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', function() { - loadData(); - - // 每5分钟自动刷新数据 - setInterval(loadData, 5 * 60 * 1000); - - // 监听页面可见性变化,页面重新可见时刷新数据 - document.addEventListener('visibilitychange', function() { - if (!document.hidden) { - loadData(); - } - }); - - // 监听网络状态变化 - window.addEventListener('online', loadData); -}); - -// 加载数据函数 -async function loadData() { - try { - showLoading(); - - // 调用百度电视剧榜API - const response = await fetch('https://60s.api.shumengya.top/v2/baidu/teleplay'); - - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - - const data = await response.json(); - - if (data.code === 200 && data.data) { - renderTvList(data.data); - updateTime(); - hideLoading(); - } else { - throw new Error(data.message || '数据格式错误'); - } - - } catch (error) { - console.error('加载数据失败:', error); - showError(); - } -} - -// 渲染电视剧列表 -function renderTvList(tvData) { - if (!tvData || !Array.isArray(tvData)) { - showError(); - return; - } - - const listHTML = tvData.map((item, index) => { - const rank = item.rank || (index + 1); - const rankClass = rank <= 3 ? (rank === 1 ? 'top1' : 'top3') : ''; - - // 处理封面图片 - const coverImg = item.cover ? - `${item.title}` : - ''; - - // 处理描述信息 - const description = item.desc || ''; - - // 处理评分信息 - const score = item.score || ''; - const scoreDesc = item.score_desc || ''; - - // 处理链接 - const linkUrl = item.url || '#'; - - return ` -
      -
      ${rank}
      - ${coverImg} -
      -
      -

      ${item.title || '无标题'}

      -
      - ${description ? `

      ${description}

      ` : ''} - -
      -
      - `; - }).join(''); - - tvListElement.innerHTML = listHTML; - tvListElement.style.display = 'block'; -} - -// 格式化评分 -function formatScore(score) { - if (!score) return ''; - - // 如果是数字,进行格式化 - if (typeof score === 'number') { - if (score >= 10000) { - return (score / 10000).toFixed(1) + '万'; - } - return score.toString(); - } - - // 如果是字符串,直接返回 - return score.toString(); -} - -// 打开链接 -function openLink(url) { - if (url && url !== '#') { - window.open(url, '_blank'); - } -} - -// 显示加载状态 -function showLoading() { - loadingElement.style.display = 'block'; - errorElement.style.display = 'none'; - tvListElement.style.display = 'none'; -} - -// 隐藏加载状态 -function hideLoading() { - loadingElement.style.display = 'none'; -} - -// 显示错误信息 -function showError() { - loadingElement.style.display = 'none'; - errorElement.style.display = 'block'; - tvListElement.style.display = 'none'; -} - -// 更新时间显示 -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' - }); - updateTimeElement.textContent = `最后更新时间: ${timeString}`; -} - -// 重试加载数据 -function retryLoad() { - loadData(); -} - -// 页面滚动优化 -let ticking = false; - -function updateScrollPosition() { - // 可以在这里添加滚动相关的优化逻辑 - ticking = false; -} - -window.addEventListener('scroll', function() { - if (!ticking) { - requestAnimationFrame(updateScrollPosition); - ticking = true; - } -}); - -// 错误处理和日志记录 -window.addEventListener('error', function(e) { - console.error('页面错误:', e.error); -}); - -window.addEventListener('unhandledrejection', function(e) { - console.error('未处理的Promise拒绝:', e.reason); -}); - -// 性能监控 -if ('performance' in window) { - window.addEventListener('load', function() { - setTimeout(function() { - const perfData = performance.timing; - const loadTime = perfData.loadEventEnd - perfData.navigationStart; - console.log('页面加载时间:', loadTime + 'ms'); - }, 0); - }); -} - -// 图片懒加载优化 -function lazyLoadImages() { - const images = document.querySelectorAll('.item-cover'); - const imageObserver = new IntersectionObserver((entries, observer) => { - entries.forEach(entry => { - if (entry.isIntersecting) { - const img = entry.target; - img.src = img.dataset.src; - img.classList.remove('lazy'); - imageObserver.unobserve(img); - } - }); - }); - - images.forEach(img => imageObserver.observe(img)); -} - -// 添加键盘导航支持 -document.addEventListener('keydown', function(e) { - const items = document.querySelectorAll('.tv-item'); - const currentFocus = document.activeElement; - let currentIndex = Array.from(items).indexOf(currentFocus); - - switch(e.key) { - case 'ArrowDown': - e.preventDefault(); - currentIndex = Math.min(currentIndex + 1, items.length - 1); - items[currentIndex]?.focus(); - break; - case 'ArrowUp': - e.preventDefault(); - currentIndex = Math.max(currentIndex - 1, 0); - items[currentIndex]?.focus(); - break; - case 'Enter': - if (currentFocus && currentFocus.classList.contains('tv-item')) { - currentFocus.click(); - } - break; - } -}); - -// 使电视剧项目可聚焦 -document.addEventListener('DOMContentLoaded', function() { - const style = document.createElement('style'); - style.textContent = ` - .tv-item { - outline: none; - transition: all 0.3s ease; - } - .tv-item:focus { - transform: translateY(-2px); - box-shadow: 0 4px 16px rgba(139, 195, 74, 0.25); - border-color: #8bc34a; - } - `; - document.head.appendChild(style); - - // 为所有电视剧项目添加tabindex - setTimeout(() => { - const items = document.querySelectorAll('.tv-item'); - items.forEach((item, index) => { - item.setAttribute('tabindex', '0'); - }); - }, 100); +// DOM元素获取 +const loadingElement = document.getElementById('loading'); +const errorElement = document.getElementById('error'); +const tvListElement = document.getElementById('tvList'); +const updateTimeElement = document.getElementById('updateTime'); + +// 页面加载完成后初始化 +document.addEventListener('DOMContentLoaded', function() { + loadData(); + + // 每5分钟自动刷新数据 + setInterval(loadData, 5 * 60 * 1000); + + // 监听页面可见性变化,页面重新可见时刷新数据 + document.addEventListener('visibilitychange', function() { + if (!document.hidden) { + loadData(); + } + }); + + // 监听网络状态变化 + window.addEventListener('online', loadData); +}); + +// 加载数据函数 +async function loadData() { + try { + showLoading(); + + // 调用百度电视剧榜API + const response = await fetch('https://60s.api.shumengya.top/v2/baidu/teleplay'); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const data = await response.json(); + + if (data.code === 200 && data.data) { + renderTvList(data.data); + updateTime(); + hideLoading(); + } else { + throw new Error(data.message || '数据格式错误'); + } + + } catch (error) { + console.error('加载数据失败:', error); + showError(); + } +} + +// 渲染电视剧列表 +function renderTvList(tvData) { + if (!tvData || !Array.isArray(tvData)) { + showError(); + return; + } + + const listHTML = tvData.map((item, index) => { + const rank = item.rank || (index + 1); + const rankClass = rank <= 3 ? (rank === 1 ? 'top1' : 'top3') : ''; + + // 处理封面图片 + const coverImg = item.cover ? + `${item.title}` : + ''; + + // 处理描述信息 + const description = item.desc || ''; + + // 处理评分信息 + const score = item.score || ''; + const scoreDesc = item.score_desc || ''; + + // 处理链接 + const linkUrl = item.url || '#'; + + return ` +
      +
      ${rank}
      + ${coverImg} +
      +
      +

      ${item.title || '无标题'}

      +
      + ${description ? `

      ${description}

      ` : ''} + +
      +
      + `; + }).join(''); + + tvListElement.innerHTML = listHTML; + tvListElement.style.display = 'block'; +} + +// 格式化评分 +function formatScore(score) { + if (!score) return ''; + + // 如果是数字,进行格式化 + if (typeof score === 'number') { + if (score >= 10000) { + return (score / 10000).toFixed(1) + '万'; + } + return score.toString(); + } + + // 如果是字符串,直接返回 + return score.toString(); +} + +// 打开链接 +function openLink(url) { + if (url && url !== '#') { + window.open(url, '_blank'); + } +} + +// 显示加载状态 +function showLoading() { + loadingElement.style.display = 'block'; + errorElement.style.display = 'none'; + tvListElement.style.display = 'none'; +} + +// 隐藏加载状态 +function hideLoading() { + loadingElement.style.display = 'none'; +} + +// 显示错误信息 +function showError() { + loadingElement.style.display = 'none'; + errorElement.style.display = 'block'; + tvListElement.style.display = 'none'; +} + +// 更新时间显示 +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' + }); + updateTimeElement.textContent = `最后更新时间: ${timeString}`; +} + +// 重试加载数据 +function retryLoad() { + loadData(); +} + +// 页面滚动优化 +let ticking = false; + +function updateScrollPosition() { + // 可以在这里添加滚动相关的优化逻辑 + ticking = false; +} + +window.addEventListener('scroll', function() { + if (!ticking) { + requestAnimationFrame(updateScrollPosition); + ticking = true; + } +}); + +// 错误处理和日志记录 +window.addEventListener('error', function(e) { + console.error('页面错误:', e.error); +}); + +window.addEventListener('unhandledrejection', function(e) { + console.error('未处理的Promise拒绝:', e.reason); +}); + +// 性能监控 +if ('performance' in window) { + window.addEventListener('load', function() { + setTimeout(function() { + const perfData = performance.timing; + const loadTime = perfData.loadEventEnd - perfData.navigationStart; + console.log('页面加载时间:', loadTime + 'ms'); + }, 0); + }); +} + +// 图片懒加载优化 +function lazyLoadImages() { + const images = document.querySelectorAll('.item-cover'); + const imageObserver = new IntersectionObserver((entries, observer) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + const img = entry.target; + img.src = img.dataset.src; + img.classList.remove('lazy'); + imageObserver.unobserve(img); + } + }); + }); + + images.forEach(img => imageObserver.observe(img)); +} + +// 添加键盘导航支持 +document.addEventListener('keydown', function(e) { + const items = document.querySelectorAll('.tv-item'); + const currentFocus = document.activeElement; + let currentIndex = Array.from(items).indexOf(currentFocus); + + switch(e.key) { + case 'ArrowDown': + e.preventDefault(); + currentIndex = Math.min(currentIndex + 1, items.length - 1); + items[currentIndex]?.focus(); + break; + case 'ArrowUp': + e.preventDefault(); + currentIndex = Math.max(currentIndex - 1, 0); + items[currentIndex]?.focus(); + break; + case 'Enter': + if (currentFocus && currentFocus.classList.contains('tv-item')) { + currentFocus.click(); + } + break; + } +}); + +// 使电视剧项目可聚焦 +document.addEventListener('DOMContentLoaded', function() { + const style = document.createElement('style'); + style.textContent = ` + .tv-item { + outline: none; + transition: all 0.3s ease; + } + .tv-item:focus { + transform: translateY(-2px); + box-shadow: 0 4px 16px rgba(139, 195, 74, 0.25); + border-color: #8bc34a; + } + `; + document.head.appendChild(style); + + // 为所有电视剧项目添加tabindex + setTimeout(() => { + const items = document.querySelectorAll('.tv-item'); + items.forEach((item, index) => { + item.setAttribute('tabindex', '0'); + }); + }, 100); }); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/styles.css b/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/styles.css index 7953479d..04bdf8c2 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/styles.css +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/styles.css @@ -1,378 +1,378 @@ -/* 基础样式重置 */ -* { - 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 #d4e157; - margin-bottom: 24px; -} - -.title { - font-size: 28px; - font-weight: 700; - background: linear-gradient(135deg, #8bc34a, #cddc39); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - margin-bottom: 8px; - text-shadow: 0 2px 4px rgba(139, 195, 74, 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: #8bc34a; -} - -.loading-spinner { - width: 40px; - height: 40px; - border: 3px solid #d4e157; - border-top: 3px solid #8bc34a; - 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: linear-gradient(135deg, #8bc34a, #cddc39); - color: white; - border: none; - padding: 10px 20px; - border-radius: 20px; - cursor: pointer; - font-size: 14px; - margin-top: 16px; - transition: all 0.3s ease; - box-shadow: 0 2px 8px rgba(139, 195, 74, 0.3); -} - -.retry-btn:hover { - transform: translateY(-2px); - box-shadow: 0 4px 12px rgba(139, 195, 74, 0.4); -} - -/* 电视剧列表 */ -.tv-list { - display: grid; - gap: 16px; -} - -.tv-item { - background: #ffffff; - border: 1px solid #f1f8e9; - border-radius: 12px; - padding: 16px; - transition: all 0.3s ease; - box-shadow: 0 2px 8px rgba(139, 195, 74, 0.08); - position: relative; - overflow: hidden; - display: flex; - gap: 12px; - cursor: pointer; -} - -.tv-item:hover { - transform: translateY(-2px); - box-shadow: 0 4px 16px rgba(139, 195, 74, 0.15); - border-color: #d4e157; -} - -.tv-item::before { - content: ''; - position: absolute; - left: 0; - top: 0; - width: 4px; - height: 100%; - background: linear-gradient(to bottom, #8bc34a, #cddc39); -} - -/* 排名样式 */ -.rank { - background: linear-gradient(135deg, #8bc34a, #cddc39); - color: white; - width: 32px; - height: 32px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - font-weight: 700; - font-size: 14px; - flex-shrink: 0; - margin-top: 4px; - box-shadow: 0 2px 6px rgba(139, 195, 74, 0.3); -} - -.rank.top3 { - background: linear-gradient(135deg, #ff9800, #ffc107); -} - -.rank.top1 { - background: linear-gradient(135deg, #f44336, #e91e63); -} - -/* 封面图片 */ -.item-cover { - width: 80px; - height: 100px; - border-radius: 8px; - object-fit: cover; - flex-shrink: 0; - border: 1px solid #f1f8e9; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); -} - -/* 内容区域 */ -.item-content { - flex: 1; - display: flex; - flex-direction: column; - justify-content: space-between; - min-height: 100px; -} - -.item-header { - display: flex; - align-items: flex-start; - justify-content: space-between; - margin-bottom: 8px; -} - -.item-title { - font-size: 16px; - font-weight: 600; - color: #2c3e50; - line-height: 1.4; - margin-bottom: 4px; - transition: color 0.3s ease; - flex: 1; -} - -.item-title:hover { - background: linear-gradient(135deg, #8bc34a, #cddc39); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} - -.item-desc { - font-size: 13px; - color: #7f8c8d; - line-height: 1.3; - margin-bottom: 8px; - display: -webkit-box; - -webkit-line-clamp: 3; - -webkit-box-orient: vertical; - overflow: hidden; -} - -.item-footer { - display: flex; - align-items: center; - justify-content: space-between; - gap: 8px; -} - -.item-score { - font-size: 14px; - background: linear-gradient(135deg, #8bc34a, #cddc39); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - font-weight: 600; -} - -.item-score-desc { - font-size: 12px; - color: #95a5a6; - margin-left: 4px; -} - -.item-type { - display: flex; - align-items: center; - gap: 4px; -} - -.type-text { - font-size: 12px; - padding: 2px 8px; - border-radius: 10px; - font-weight: 500; - background: linear-gradient(135deg, #f1f8e9, #e8f5e8); - color: #689f38; - border: 1px solid #d4e157; -} - -/* 底部 */ -.footer { - text-align: center; - padding: 24px 0; - border-top: 1px solid #f1f8e9; - 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; - } - - .tv-item { - padding: 14px; - gap: 10px; - } - - .item-cover { - width: 60px; - height: 80px; - } - - .item-title { - font-size: 15px; - } - - .item-desc { - font-size: 12px; - -webkit-line-clamp: 2; - } - - .rank { - width: 28px; - height: 28px; - font-size: 13px; - } -} - -/* 平板端适配 */ -@media (min-width: 769px) and (max-width: 1024px) { - .container { - padding: 0 24px; - } - - .tv-list { - grid-template-columns: repeat(1, 1fr); - gap: 18px; - } - - .title { - font-size: 32px; - } - - .tv-item { - padding: 18px; - } - - .item-cover { - width: 90px; - height: 110px; - } -} - -/* 电脑端适配 */ -@media (min-width: 1025px) { - .container { - padding: 0 32px; - } - - .tv-list { - grid-template-columns: repeat(1, 1fr); - gap: 20px; - } - - .title { - font-size: 36px; - } - - .tv-item { - padding: 20px; - gap: 16px; - } - - .item-cover { - width: 100px; - height: 130px; - } - - .item-title { - font-size: 17px; - } - - .item-desc { - font-size: 14px; - } -} - -/* 大屏幕优化 */ -@media (min-width: 1400px) { - .tv-list { - grid-template-columns: repeat(2, 1fr); - gap: 24px; - } +/* 基础样式重置 */ +* { + 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 #d4e157; + margin-bottom: 24px; +} + +.title { + font-size: 28px; + font-weight: 700; + background: linear-gradient(135deg, #8bc34a, #cddc39); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + margin-bottom: 8px; + text-shadow: 0 2px 4px rgba(139, 195, 74, 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: #8bc34a; +} + +.loading-spinner { + width: 40px; + height: 40px; + border: 3px solid #d4e157; + border-top: 3px solid #8bc34a; + 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: linear-gradient(135deg, #8bc34a, #cddc39); + color: white; + border: none; + padding: 10px 20px; + border-radius: 20px; + cursor: pointer; + font-size: 14px; + margin-top: 16px; + transition: all 0.3s ease; + box-shadow: 0 2px 8px rgba(139, 195, 74, 0.3); +} + +.retry-btn:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(139, 195, 74, 0.4); +} + +/* 电视剧列表 */ +.tv-list { + display: grid; + gap: 16px; +} + +.tv-item { + background: #ffffff; + border: 1px solid #f1f8e9; + border-radius: 12px; + padding: 16px; + transition: all 0.3s ease; + box-shadow: 0 2px 8px rgba(139, 195, 74, 0.08); + position: relative; + overflow: hidden; + display: flex; + gap: 12px; + cursor: pointer; +} + +.tv-item:hover { + transform: translateY(-2px); + box-shadow: 0 4px 16px rgba(139, 195, 74, 0.15); + border-color: #d4e157; +} + +.tv-item::before { + content: ''; + position: absolute; + left: 0; + top: 0; + width: 4px; + height: 100%; + background: linear-gradient(to bottom, #8bc34a, #cddc39); +} + +/* 排名样式 */ +.rank { + background: linear-gradient(135deg, #8bc34a, #cddc39); + color: white; + width: 32px; + height: 32px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-weight: 700; + font-size: 14px; + flex-shrink: 0; + margin-top: 4px; + box-shadow: 0 2px 6px rgba(139, 195, 74, 0.3); +} + +.rank.top3 { + background: linear-gradient(135deg, #ff9800, #ffc107); +} + +.rank.top1 { + background: linear-gradient(135deg, #f44336, #e91e63); +} + +/* 封面图片 */ +.item-cover { + width: 80px; + height: 100px; + border-radius: 8px; + object-fit: cover; + flex-shrink: 0; + border: 1px solid #f1f8e9; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); +} + +/* 内容区域 */ +.item-content { + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-between; + min-height: 100px; +} + +.item-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + margin-bottom: 8px; +} + +.item-title { + font-size: 16px; + font-weight: 600; + color: #2c3e50; + line-height: 1.4; + margin-bottom: 4px; + transition: color 0.3s ease; + flex: 1; +} + +.item-title:hover { + background: linear-gradient(135deg, #8bc34a, #cddc39); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.item-desc { + font-size: 13px; + color: #7f8c8d; + line-height: 1.3; + margin-bottom: 8px; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.item-footer { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; +} + +.item-score { + font-size: 14px; + background: linear-gradient(135deg, #8bc34a, #cddc39); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + font-weight: 600; +} + +.item-score-desc { + font-size: 12px; + color: #95a5a6; + margin-left: 4px; +} + +.item-type { + display: flex; + align-items: center; + gap: 4px; +} + +.type-text { + font-size: 12px; + padding: 2px 8px; + border-radius: 10px; + font-weight: 500; + background: linear-gradient(135deg, #f1f8e9, #e8f5e8); + color: #689f38; + border: 1px solid #d4e157; +} + +/* 底部 */ +.footer { + text-align: center; + padding: 24px 0; + border-top: 1px solid #f1f8e9; + 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; + } + + .tv-item { + padding: 14px; + gap: 10px; + } + + .item-cover { + width: 60px; + height: 80px; + } + + .item-title { + font-size: 15px; + } + + .item-desc { + font-size: 12px; + -webkit-line-clamp: 2; + } + + .rank { + width: 28px; + height: 28px; + font-size: 13px; + } +} + +/* 平板端适配 */ +@media (min-width: 769px) and (max-width: 1024px) { + .container { + padding: 0 24px; + } + + .tv-list { + grid-template-columns: repeat(1, 1fr); + gap: 18px; + } + + .title { + font-size: 32px; + } + + .tv-item { + padding: 18px; + } + + .item-cover { + width: 90px; + height: 110px; + } +} + +/* 电脑端适配 */ +@media (min-width: 1025px) { + .container { + padding: 0 32px; + } + + .tv-list { + grid-template-columns: repeat(1, 1fr); + gap: 20px; + } + + .title { + font-size: 36px; + } + + .tv-item { + padding: 20px; + gap: 16px; + } + + .item-cover { + width: 100px; + height: 130px; + } + + .item-title { + font-size: 17px; + } + + .item-desc { + font-size: 14px; + } +} + +/* 大屏幕优化 */ +@media (min-width: 1400px) { + .tv-list { + grid-template-columns: repeat(2, 1fr); + gap: 24px; + } } \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/返回接口.json index 8180a103..14bc77ca 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/返回接口.json +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/百度电视剧榜/返回接口.json @@ -1,276 +1,276 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "rank": 1, - "title": "子夜归", - "desc": "改编自扶华的小说《梅夫人宠夫日常》。", - "score": "511898", - "score_desc": "51.19w", - "cover": "https://gips2.baidu.com/it/u=2155452125,2802752464&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f200_266", - "url": "https://www.baidu.com/s?wd=%E5%AD%90%E5%A4%9C%E5%BD%92+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 2, - "title": "献鱼", - "desc": "该剧改编自扶华的小说《向师祖献上咸鱼》,由浙江东阳奔兔影业有限公司备案。主要讲述了多年前,一位高僧曾在庚辰仙府的大魔头师祖司马焦满是血腥杀戮的未来里窥见过一线生机,给他留下一枚佛珠,希望他对生灵有慈心,能将杀心归藏。后来,被“逼上梁山”的廖停雁接受挑战,两手用力直接扯断了红线木珠,依靠咸鱼的本能降服了司马焦,成为改变他的人,也成为了黎民苍生的生机。从此廖停雁开始了引导大魔头向善的任务。", - "score": "334613", - "score_desc": "33.46w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/74230ae3ec03042a352809630060ed6b", - "url": "https://www.baidu.com/s?wd=%E7%8C%AE%E9%B1%BC+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 3, - "title": "锦月如歌", - "desc": "该剧改编自千山茶客的小说《女将星》。", - "score": "261451", - "score_desc": "26.15w", - "cover": "https://gips1.baidu.com/it/u=1353858050,567139191&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f200_266", - "url": "https://www.baidu.com/s?wd=%E9%94%A6%E6%9C%88%E5%A6%82%E6%AD%8C+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 4, - "title": "生万物", - "desc": "天牛庙村首富之女宁绣绣出嫁当天被土匪绑架,父亲宁学祥舍不得卖地赎她,将她的妹妹嫁给她青梅竹马的恋人费文典。绣绣决绝地与父亲断绝了关系,嫁给庄户汉子封大脚,学着干农活并慢慢明白了土地对于农民的意义。受杜春林等人的革命思想的启发,她用所学的知识帮助邻居们,带领村里的妇女一起摆脱封建思想桎梏。她和乡亲们一起除匪患、抗日、拥军,在清苦但又充满传奇的二十年岁月中,绣绣最终和她父亲达成了和解,也实现了自我价值。", - "score": "246220", - "score_desc": "24.62w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/956386852c3948e1539daf2a9e8316c5", - "url": "https://www.baidu.com/s?wd=%E7%94%9F%E4%B8%87%E7%89%A9+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 5, - "title": "归队", - "desc": "故事遵循东北抗联的真实发展轨迹,由小人物视角切入,以小见大的展现了战士们“勇赴国难、自觉担当、顽强苦斗、舍生取义、团结御侮”的东北抗联精神。", - "score": "174373", - "score_desc": "17.44w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/41092aaebdbee0a4a9382c182b913f99", - "url": "https://www.baidu.com/s?wd=%E5%BD%92%E9%98%9F+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 6, - "title": "滤镜", - "desc": "一个新科技产品“滤镜手镯”让普通平凡的苏橙橙(李兰迪 饰)拥有了改变容貌的能力。苏橙橙变成大美女“苏渺”、变成女博士“方谨”、变成撕漫男“全胜唐”,让自己咸鱼翻身爽了一把的同时,帮助弱小伸张正义。与此同时,唐奇(檀健次 饰)对见义勇为的苏渺怦然心动,与志同道合的方谨惺惺相惜,对阳光帅气的全胜唐欣赏称赞。为了保住秘密,苏橙橙不得不一次次撒下弥天大谎,让唐奇一次又一次失去了爱人。唐奇在接连的打击下,眼睛的病情逐渐加重,苏橙橙愧疚心虚。终于,唐奇揭开了苏橙橙变换身份的真相,明白自己爱的只有苏橙橙。真诚炙热的心不会被外在迷惑,心意相通的二人要一起面对滤镜手镯带来的严峻挑战。为了将“千鸟集”培育为独具中国特色的高端美妆品牌,苏橙橙和唐奇携手策划了一系列新的国货美妆产品,号召大家享受“自然自信的真实美”。经历重重考验的苏橙橙最终明白,美不应该被单一固化,要用最真实的自己去面对最现实的生活,依靠努力奋斗去追逐梦想,幸福就在眼前。", - "score": "93122", - "score_desc": "9.31w", - "cover": "https://gips2.baidu.com/it/u=3795500355,4042026657&fm=3028&app=3028&f=JPEG&fmt=auto&q=75&size=f200_266", - "url": "https://www.baidu.com/s?wd=%E6%BB%A4%E9%95%9C+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 7, - "title": "与晋长安", - "desc": "该剧改编自九鹭非香的同名小说。太晋女将军黎霜骁勇善战,她受命在一个月之内找出隐藏的奸细。某日,黎霜偶然间救下身负重伤记忆全失的男子,将其带回军营。男子恳求黎霜收留并跟随她征战。黎霜为其赐名晋安,寓意太晋长治久安。二人合力揪出奸细,却接连遭遇新任监军的蓄意为难和邻国大姚的屡屡犯境,晋安凭借自己过人的智谋与黎霜一起克服困难与险境,二人暗生情愫。晋安逐渐想起自己的真实身份竟是大姚的镇世王,而彼时战事一触即发,二人不得已刀兵相见,本就厌倦战争的二人决定联手化解家国危机,帮助百姓安居乐业。", - "score": "63645", - "score_desc": "6.36w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/f9e7c5bfe847536bca743e3e397b7bff", - "url": "https://www.baidu.com/s?wd=%E4%B8%8E%E6%99%8B%E9%95%BF%E5%AE%89+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 8, - "title": "暗潮缉凶", - "desc": "", - "score": "56675", - "score_desc": "5.67w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/52c73cc7cd55674511becbabd16aca37", - "url": "https://www.baidu.com/s?wd=%E6%9A%97%E6%BD%AE%E7%BC%89%E5%87%B6+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 9, - "title": "深情眼", - "desc": "改编自耳东兔子的同名小说。年过三十的叶蒙遭遇职场不顺,辞职后带着积蓄回到家乡开启惬意的小镇生活,机缘巧合之下,她偶遇了长着一双深情眼的李靳屿,并被他的神秘和冷峻吸引。两个陌生的灵魂不断触碰,叶蒙因李靳屿的艰辛生活而心生怜爱,热情主动地给予帮助;李靳屿也在叶蒙的追求下敞开了心扉,变得自信开朗起来。他们相互温暖、相互治愈,努力经营着这段来之不易的爱情。一枚戒指的到来打破了两人之间的平静,叶蒙母亲多年前患病去世的谜团缓缓浮出水面,叶蒙不得不面对残酷的真相--母亲的离去与李靳屿家有着千丝万缕的联系。此时李靳屿内心的天平早已偏向叶漾,叶蒙给他带来了阳光,现在轮到他来帮助叶蒙解开心结。最终,两人携手揭开上一辈的纠葛,放下过往恩怨,迎接美好的明天。", - "score": "56341", - "score_desc": "5.63w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/f09c4b963cd3cc3062d38e9182be750e", - "url": "https://www.baidu.com/s?wd=%E6%B7%B1%E6%83%85%E7%9C%BC+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 10, - "title": "定风波", - "desc": "《定风波》聚焦宋韵文化传承传播,围绕诗文、书画、美食、旅游、民生等主题,多维度描绘苏东坡的为官之道、志趣审美和精神世界,深入解读苏东坡的当代价值。全片共5集,每集50分钟。第一集“出川记”讲述苏东坡的成长与家风,建构其人生起始动力,探索其后来到杭州的动因;第二集“湖山记”讲述苏东坡首次为官杭州,受到湖山的滋养,实现真正的“胸有丘壑”;第三集“摩羯记”讲述苏东坡应对乌台诗案带来的种种影响,以乐观精神渡过人生的劫难;第四集“悬壶记”讲述苏东坡二度为官杭州,负责防疫,建安乐坊以及重新治理西湖;第五集“筑巢记”讲述苏东坡济苍生、度余生,保持“此心安处是吾乡”的人生态度。", - "score": "51095", - "score_desc": "5.11w", - "cover": "https://gips0.baidu.com/it/u=2177619972,3043234332&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f200_266", - "url": "https://www.baidu.com/s?wd=%E5%AE%9A%E9%A3%8E%E6%B3%A2+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 11, - "title": "白月梵星", - "desc": "本剧改编自星零小说《白烁上神》,讲述将军府嫡女白烁为报恩而立志修仙,寻仙途中意外搭救妖族大神梵樾,二人不打不相识,从相互利用到互生爱意、双向奔赴,纵然隔着千重困难,但爱足以打破一切限制,拥抱最真的彼此的故事。", - "score": "44201", - "score_desc": "4.42w", - "cover": "https://gips3.baidu.com/it/u=1404661215,4211295377&fm=3028&app=3028&f=JPEG&fmt=auto&q=75&size=f200_266", - "url": "https://www.baidu.com/s?wd=%E7%99%BD%E6%9C%88%E6%A2%B5%E6%98%9F+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 12, - "title": "我在顶峰等你", - "desc": "上一世,顾雪茭曾因恋爱脑而高考失利,职场打拼多年,归来仍是底层外包人员,还首当其冲地成为了“黑心老板”蔺之华的裁员目标。顾雪茭找蔺之华理论,意外重生回到高三那年。有机会重新开局,顾雪茭吸取前世教训,痛定思痛,将学习作为人生第一要务,由恋爱脑扭转为事业脑,在爆改人生的同时,还共同成就一段双向奔赴、互为变量的甜美爱情。", - "score": "37003", - "score_desc": "3.7w", - "cover": "https://gips2.baidu.com/it/u=3240531593,2885940403&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f200_266", - "url": "https://www.baidu.com/s?wd=%E6%88%91%E5%9C%A8%E9%A1%B6%E5%B3%B0%E7%AD%89%E4%BD%A0+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 13, - "title": "六姊妹", - "desc": "本剧改编自豆瓣阅读连载小说《六姊妹》,作者伊北。新中国成立后,何常胜为支援社会主义建设,携家带口从扬州江都移居安徽淮南,在淮河边上扎下了根。在接下来的二十年中,何常胜连得六个女儿,却在一场车祸中告别人世。大姐何家丽和奶奶何文氏、妈妈刘美心一起承担起了家庭重担,安顿妹妹们成家立业。时代在变化,何家六姊妹也经历了婚恋、工 作、生活等命运起伏,但她们团结一心,共同面对人生的风雨,在生活的磨砺中,六姊妹们也终于明白父亲生前反复强调的“家”的意义。", - "score": "36574", - "score_desc": "3.66w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/9e517a4f66e7fb7106b6333b85f1a5c1", - "url": "https://www.baidu.com/s?wd=%E5%85%AD%E5%A7%8A%E5%A6%B9+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 14, - "title": "扫毒风暴", - "desc": "1995年,缉毒警林强峰(段奕宏 饰)为了追查毒品的线索调到了西港缉毒支队工作。走私商刘少华(秦昊 饰)因偶然的机会接触到了冰毒,毒品带来的巨大利润让他产生邪念,成为了一名制毒师。在林强峰等缉毒警的全力追查下,西港市的涉案的毒贩们一一落网,只剩刘少华在别处鼠窜,企图躲避警方追捕。 1996年,林强峰再次查没了企图东山再起的刘少华的毒品,走投无路的刘少华只能蛰伏了起来,之后刘少华企图再次制毒,被林强峰发现踪迹。1999年,刘少华终于落网。", - "score": "32911", - "score_desc": "3.29w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/d9e3d21ca332652ffe75d7176bce397f", - "url": "https://www.baidu.com/s?wd=%E6%89%AB%E6%AF%92%E9%A3%8E%E6%9A%B4+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 15, - "title": "目之所及", - "desc": "本剧改编自阅读连载小说《盲目》,作者慕遥而寻。 世纪之交,因为水利工程的蓄水要求,一座江边小城即将被淹没,人们如火如荼地进行着新城的规划建设和人口的迁徙。此时,一桩离奇的杀夫案闯入了警方的视野,嫌疑人中,一个是咬定丈夫杀了女儿的可怜女人曲桐,一个是按摩院身份模糊的盲人薛小伟, 他们相互救赎,甘愿为对方牺牲,疑点重重。警 方锲而不舍的追查,揭秘出一段尘封多年,令人唏嘘的往事。真相可能会被淹没,但终有浮出水面的一天。", - "score": "27439", - "score_desc": "2.74w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/3b731c9a9e809e7c694a8cc5c65d5a15", - "url": "https://www.baidu.com/s?wd=%E7%9B%AE%E4%B9%8B%E6%89%80%E5%8F%8A+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 16, - "title": "书卷一梦", - "desc": "柠萌影业出品,改编自千山茶客的同名小说,尚书府嫡长女蒋阮被当成一枚棋子送入宫中,爱上温文儒雅的八皇子。谁知一朝宫变,爱人登基,府上鸡犬升天,她却成为一枚弃子,被污蔑为祸国妖女。蒋阮不甘,下定决心要报仇,却在回府之时遭遇暗杀,后借助神秘黑衣人之手才逃过一劫。从危机四伏的宅院到步步惊心的朝堂,她面对的敌人越来越多她暗暗布下陷阱,却误打误撞遇到锦英王萧韶。萧韶性情冷清,却屡次出手相助于她,两人暗生情愫,渐渐结盟,萧韶的身世之谜也随之浮出水面。此后,蒋阮千方百计阻挠八皇子的夺嫡大业,却引起了萧韶的怀疑,两人结下误会八皇子开始进行疯狂的反击行动,蒋阮的处境十分危险。复仇途中,蒋阮发现自己的身世竟和萧韶的身世之谜有关,一个大锦朝隐藏多年的秘密浮出水面此时,南疆人蠢蠢欲动,欲与宣离结为同盟。彼时,蒋阮小时候被继母种下的毒发作,萧韶带她四处求医,生死一线的时候,蒋阮得知了一个更大的秘密", - "score": "26702", - "score_desc": "2.67w", - "cover": "https://gips2.baidu.com/it/u=1593831522,852391480&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f200_266", - "url": "https://www.baidu.com/s?wd=%E4%B9%A6%E5%8D%B7%E4%B8%80%E6%A2%A6+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 17, - "title": "樱桃琥珀", - "desc": "《樱桃琥珀》要被影视化了,温柔女主学霸男主,主人公从小城到大都市,直至婚姻殿堂的女孩成长故事,由国内一线知名影视公司出品。", - "score": "26660", - "score_desc": "2.67w", - "cover": "https://gips3.baidu.com/it/u=2643705168,575328711&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f200_266", - "url": "https://www.baidu.com/s?wd=%E6%A8%B1%E6%A1%83%E7%90%A5%E7%8F%80+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 18, - "title": "咒术回战第二季", - "desc": "", - "score": "26617", - "score_desc": "2.66w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/7b3cfcaf3b343d45f5c16f3e47a9f946", - "url": "https://www.baidu.com/s?wd=%E5%92%92%E6%9C%AF%E5%9B%9E%E6%88%98%E7%AC%AC%E4%BA%8C%E5%AD%A3+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 19, - "title": "偷偷藏不住", - "desc": "桑稚高中时期被老师频繁请家长,为了解决麻烦,桑稚决定找哥哥顶包,然而兄妹见面就互怼闹僵,无奈只好求助来家中玩耍的哥哥舍友段嘉许,在桑稚的苦求要挟下,段嘉许帮桑稚去学校见老师,两人因此结缘,段嘉许从此更是把桑稚当成自己的亲妹妹爱护。随着段嘉许大学毕业,两人分隔异地,又因为一些误会,关系疏远。直到成年后的桑稚如愿考到了段嘉许的城市,两人重逢。在日渐亲密的接触下,桑稚渐渐发现了段嘉许一直以来的压力来源,她想要保护这个一直对自己很好的大哥哥,重拾埋藏心底的暗恋。在桑稚的陪伴下,段嘉许慢慢解开心结,他真心喜欢上了长大的桑稚,一段纯真暗恋终于开出美丽的爱情花朵。", - "score": "24655", - "score_desc": "2.47w", - "cover": "https://gips3.baidu.com/it/u=2216037055,3672846777&fm=3028&app=3028&f=JPEG&fmt=auto&q=75&size=f200_266", - "url": "https://www.baidu.com/s?wd=%E5%81%B7%E5%81%B7%E8%97%8F%E4%B8%8D%E4%BD%8F+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 20, - "title": "一路朝阳", - "desc": "北漂女孩李慕嘉毕业后进入北京最知名的律所,靠着自己的勤奋努力从行政助理一路成为独当一面的律师,在职业巅峰切换跑道加入创业公司,大起大落最终创业成功,收获了一个家;闺蜜田蓉毕业求职未果,误打误撞成为房产中介,与北京男孩李万兵仓促结婚,在婚后职业和感情都遭受了巨大考验;表妹陈青斯坦福毕业与男友回国创业,遭遇种种挫折但找到了心之所向。从2007到2019年,三个女孩对人生的追求和希望在现实中身不由己地改变了模样,庆幸的是十年的磨砺最终还是求得了人生的向阳面,得以一路朝阳。", - "score": "24482", - "score_desc": "2.45w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/356088680f3a962380c8d700cf9a2826", - "url": "https://www.baidu.com/s?wd=%E4%B8%80%E8%B7%AF%E6%9C%9D%E9%98%B3+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 21, - "title": "她和她的他们", - "desc": "《她和她的他们》是由徐麒丰担任总导演、王兵导演,由肖顺尧、贾青、何杜娟领衔主演,胡军特邀领衔主演,袁家欢、王大奇、蒋方婷、郑家彬、钟林煜、李琦、秦奋等主演的都市犯罪悬疑剧。该剧讲述了刑警队副队长赵熵与搭档崔山河,抽丝剥茧,一层层揭开七人之间错综复杂的情感秘密,一场场关于人性、伦理的纠葛,一出出谎言交织的虐戏逐步上演。随着真相步步逼近,赵熵也拉开了自我救赎的序幕。", - "score": "24375", - "score_desc": "2.44w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/6b5d1065fb78498ab26d77cd0e0c7c27", - "url": "https://www.baidu.com/s?wd=%E5%A5%B9%E5%92%8C%E5%A5%B9%E7%9A%84%E4%BB%96%E4%BB%AC+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 22, - "title": "卿卿日常", - "desc": "《清穿日常》是多木木多所著网络小说,在晋江文学城、中国移动和阅读等网站连载。吃……吃喝喝那些事。反正清穿已经都穿成筛子了。清穿就是为了遇见阿哥,种种田过过日子!今天,你清穿了吗?", - "score": "22800", - "score_desc": "2.28w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/6caa4eb1bb38d643d7099b060d94acee", - "url": "https://www.baidu.com/s?wd=%E5%8D%BF%E5%8D%BF%E6%97%A5%E5%B8%B8+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 23, - "title": "初恋,稍显粗糙", - "desc": "《初恋,稍显粗糙》是由小野花梨、风间俊介主演的电视剧,于2023年7月7日在东京电视台深夜播出。该剧改编自作者ざくざくろ的同名漫画,讲述一位轻度智力障碍女性的纯爱故事。", - "score": "21904", - "score_desc": "2.19w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/e4c672a71dfa478102360895a77b4108", - "url": "https://www.baidu.com/s?wd=%E5%88%9D%E6%81%8B%EF%BC%8C%E7%A8%8D%E6%98%BE%E7%B2%97%E7%B3%99+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 24, - "title": "九重紫", - "desc": "年少失母的窦昭因为家庭变故和坎坷波折的命运对人间情爱与亲情失望透顶,她斗继母、保家产,避居冷僻田庄,求学晓事以图自保自强。大雨之夜,窦昭与扮作商贾投宿的宋墨在田庄相逢,用自己的智慧帮其保下平寇有功的定国公一脉遗孤,二人命运也因此紧紧缠绕。出身官宦之家的宋墨深陷家变谜团,而窦昭也在继母的破坏下遭遇换亲流言,二人选择成亲以结同盟、共度困局。曾经彼此猜忌的他们在相互帮扶中共渡难关,也由此渐渐相知相惜、互为知己。不料风雨欲来、朝堂骤变,窦昭与宋墨携手面对危局,共同挽救家族命运、解开英国公府换子疑云、成功阻止辽王谋逆,平忠臣冤案、保家国安宁,活出了真正属于自己的幸福生活。", - "score": "21717", - "score_desc": "2.17w", - "cover": "https://gips3.baidu.com/it/u=1237661084,451511578&fm=3028&app=3028&f=JPEG&fmt=auto&q=75&size=f200_266", - "url": "https://www.baidu.com/s?wd=%E4%B9%9D%E9%87%8D%E7%B4%AB+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 25, - "title": "香港人在北京", - "desc": "《香港人在北京》是由陈展鹏、吴若希、戴祖仪主演的TVB电视剧,在拍摄中。", - "score": "21238", - "score_desc": "2.12w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/2e5f4d3fe3b36a7d9f4f782c35979016", - "url": "https://www.baidu.com/s?wd=%E9%A6%99%E6%B8%AF%E4%BA%BA%E5%9C%A8%E5%8C%97%E4%BA%AC+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 26, - "title": "你好,我们是欢喜天团", - "desc": "《你好,我们是欢喜天团》是由刘浩南执导,由王艺瑾、千喆、高卿尘领衔主演,易恒、伍雅露、阿克朱力、曹左、贵尚奇、庄逸涵、曲梦婷主演,陈名豪、代少冬特别出演的古代网络微短剧。2022年10月15日,《你好,我们是欢喜天团》杀青。该剧于2023年9月22日在腾讯视频播出。", - "score": "20966", - "score_desc": "2.1w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/94e45c218022c97e865f68c3a15c9c22", - "url": "https://www.baidu.com/s?wd=%E4%BD%A0%E5%A5%BD%EF%BC%8C%E6%88%91%E4%BB%AC%E6%98%AF%E6%AC%A2%E5%96%9C%E5%A4%A9%E5%9B%A2+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 27, - "title": "诛仙", - "desc": "一夜间惨变孤儿的张小凡被青云门收为弟子,经过五年刻苦修炼,他在师门七脉会武上大放异彩,后被派往空桑山打探魔教行迹,旅程中,他与师姐陆雪琪遭遇危难,并结识救护了魔教女子碧瑶,同时,新的危险也在前方等待着他。", - "score": "20659", - "score_desc": "2.07w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/ab55434dff2e8c4432119fc980f5a51d", - "url": "https://www.baidu.com/s?wd=%E8%AF%9B%E4%BB%99+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 28, - "title": "玫瑰的故事", - "desc": "电视剧改编自亦舒同名小说,由刘亦菲出演该剧女一号。剧中主要讲述了黄玫瑰一生的情感故事。出身于富贵之家的玫瑰经历了几段刻骨铭心的爱情,在浮浮沉沉中明白自己想要的是什么,为爱放手去追寻,成长为更有勇气的自己。", - "score": "20439", - "score_desc": "2.04w", - "cover": "https://gips1.baidu.com/it/u=1227308879,4121027510&fm=3028&app=3028&f=PNG&fmt=auto&q=75&size=f608_864", - "url": "https://www.baidu.com/s?wd=%E7%8E%AB%E7%91%B0%E7%9A%84%E6%95%85%E4%BA%8B+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 29, - "title": "爱你,是我做过最好的事", - "desc": "《爱你,是我做过最好的事》笙离的小说。讲述了一个关于青春、成长、初恋、选择的故事。", - "score": "20196", - "score_desc": "2.02w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/d680ad814edfef5438f7e6175c0456f6", - "url": "https://www.baidu.com/s?wd=%E7%88%B1%E4%BD%A0%EF%BC%8C%E6%98%AF%E6%88%91%E5%81%9A%E8%BF%87%E6%9C%80%E5%A5%BD%E7%9A%84%E4%BA%8B+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - }, - { - "rank": 30, - "title": "唐朝诡事录", - "desc": "暗夜邪仙从天而降,鬼市地宫露出冰山一角,而风靡长安的诡异红茶究竟是养生之药还是害人之物?长安城里新娘失踪案接连发生,似乎与红茶有着千丝万缕的联系案件扑朔迷离,人心玄妙难鉴!金吾卫中郎将卢凌风奉命查案,遭遇平生最强对手狄仁杰关门弟子苏无名,双强携手共破长安奇案!九个不同风格的诡异案件,《长安红茶》《石桥图》《众生堂》《黄梅杀》《甘棠驿怪谈》《鼍神》《人面花》《参天楼》,一一为您揭晓大唐夜色笼罩之下的奇闻异录! 见证唐诗之外,被湮没千年的奇诡想象。千年前的唐朝,万邦来朝,是当之无愧的世界中心。优越的物质生活,多样的文化融合,催生了唐朝人极致的想象力。 除了李白、杜甫、白居易等一代传奇诗人,用唐诗描绘出的华丽的大唐美卷;市井间的贩夫走卒,更用他们更加不羁的想象力,在唐朝的夜幕中 勾勒出神魔鬼怪的憧憧魅影:仙魔精妖、奇闻怪谈、幻术道法、异域传说、珍禽异兽、宫廷轶事", - "score": "17785", - "score_desc": "1.78w", - "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/5bb62453122a1d67e077b70321676175", - "url": "https://www.baidu.com/s?wd=%E5%94%90%E6%9C%9D%E8%AF%A1%E4%BA%8B%E5%BD%95+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" - } - ] +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": [ + { + "rank": 1, + "title": "子夜归", + "desc": "改编自扶华的小说《梅夫人宠夫日常》。", + "score": "511898", + "score_desc": "51.19w", + "cover": "https://gips2.baidu.com/it/u=2155452125,2802752464&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f200_266", + "url": "https://www.baidu.com/s?wd=%E5%AD%90%E5%A4%9C%E5%BD%92+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 2, + "title": "献鱼", + "desc": "该剧改编自扶华的小说《向师祖献上咸鱼》,由浙江东阳奔兔影业有限公司备案。主要讲述了多年前,一位高僧曾在庚辰仙府的大魔头师祖司马焦满是血腥杀戮的未来里窥见过一线生机,给他留下一枚佛珠,希望他对生灵有慈心,能将杀心归藏。后来,被“逼上梁山”的廖停雁接受挑战,两手用力直接扯断了红线木珠,依靠咸鱼的本能降服了司马焦,成为改变他的人,也成为了黎民苍生的生机。从此廖停雁开始了引导大魔头向善的任务。", + "score": "334613", + "score_desc": "33.46w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/74230ae3ec03042a352809630060ed6b", + "url": "https://www.baidu.com/s?wd=%E7%8C%AE%E9%B1%BC+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 3, + "title": "锦月如歌", + "desc": "该剧改编自千山茶客的小说《女将星》。", + "score": "261451", + "score_desc": "26.15w", + "cover": "https://gips1.baidu.com/it/u=1353858050,567139191&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f200_266", + "url": "https://www.baidu.com/s?wd=%E9%94%A6%E6%9C%88%E5%A6%82%E6%AD%8C+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 4, + "title": "生万物", + "desc": "天牛庙村首富之女宁绣绣出嫁当天被土匪绑架,父亲宁学祥舍不得卖地赎她,将她的妹妹嫁给她青梅竹马的恋人费文典。绣绣决绝地与父亲断绝了关系,嫁给庄户汉子封大脚,学着干农活并慢慢明白了土地对于农民的意义。受杜春林等人的革命思想的启发,她用所学的知识帮助邻居们,带领村里的妇女一起摆脱封建思想桎梏。她和乡亲们一起除匪患、抗日、拥军,在清苦但又充满传奇的二十年岁月中,绣绣最终和她父亲达成了和解,也实现了自我价值。", + "score": "246220", + "score_desc": "24.62w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/956386852c3948e1539daf2a9e8316c5", + "url": "https://www.baidu.com/s?wd=%E7%94%9F%E4%B8%87%E7%89%A9+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 5, + "title": "归队", + "desc": "故事遵循东北抗联的真实发展轨迹,由小人物视角切入,以小见大的展现了战士们“勇赴国难、自觉担当、顽强苦斗、舍生取义、团结御侮”的东北抗联精神。", + "score": "174373", + "score_desc": "17.44w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/41092aaebdbee0a4a9382c182b913f99", + "url": "https://www.baidu.com/s?wd=%E5%BD%92%E9%98%9F+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 6, + "title": "滤镜", + "desc": "一个新科技产品“滤镜手镯”让普通平凡的苏橙橙(李兰迪 饰)拥有了改变容貌的能力。苏橙橙变成大美女“苏渺”、变成女博士“方谨”、变成撕漫男“全胜唐”,让自己咸鱼翻身爽了一把的同时,帮助弱小伸张正义。与此同时,唐奇(檀健次 饰)对见义勇为的苏渺怦然心动,与志同道合的方谨惺惺相惜,对阳光帅气的全胜唐欣赏称赞。为了保住秘密,苏橙橙不得不一次次撒下弥天大谎,让唐奇一次又一次失去了爱人。唐奇在接连的打击下,眼睛的病情逐渐加重,苏橙橙愧疚心虚。终于,唐奇揭开了苏橙橙变换身份的真相,明白自己爱的只有苏橙橙。真诚炙热的心不会被外在迷惑,心意相通的二人要一起面对滤镜手镯带来的严峻挑战。为了将“千鸟集”培育为独具中国特色的高端美妆品牌,苏橙橙和唐奇携手策划了一系列新的国货美妆产品,号召大家享受“自然自信的真实美”。经历重重考验的苏橙橙最终明白,美不应该被单一固化,要用最真实的自己去面对最现实的生活,依靠努力奋斗去追逐梦想,幸福就在眼前。", + "score": "93122", + "score_desc": "9.31w", + "cover": "https://gips2.baidu.com/it/u=3795500355,4042026657&fm=3028&app=3028&f=JPEG&fmt=auto&q=75&size=f200_266", + "url": "https://www.baidu.com/s?wd=%E6%BB%A4%E9%95%9C+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 7, + "title": "与晋长安", + "desc": "该剧改编自九鹭非香的同名小说。太晋女将军黎霜骁勇善战,她受命在一个月之内找出隐藏的奸细。某日,黎霜偶然间救下身负重伤记忆全失的男子,将其带回军营。男子恳求黎霜收留并跟随她征战。黎霜为其赐名晋安,寓意太晋长治久安。二人合力揪出奸细,却接连遭遇新任监军的蓄意为难和邻国大姚的屡屡犯境,晋安凭借自己过人的智谋与黎霜一起克服困难与险境,二人暗生情愫。晋安逐渐想起自己的真实身份竟是大姚的镇世王,而彼时战事一触即发,二人不得已刀兵相见,本就厌倦战争的二人决定联手化解家国危机,帮助百姓安居乐业。", + "score": "63645", + "score_desc": "6.36w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/f9e7c5bfe847536bca743e3e397b7bff", + "url": "https://www.baidu.com/s?wd=%E4%B8%8E%E6%99%8B%E9%95%BF%E5%AE%89+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 8, + "title": "暗潮缉凶", + "desc": "", + "score": "56675", + "score_desc": "5.67w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/52c73cc7cd55674511becbabd16aca37", + "url": "https://www.baidu.com/s?wd=%E6%9A%97%E6%BD%AE%E7%BC%89%E5%87%B6+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 9, + "title": "深情眼", + "desc": "改编自耳东兔子的同名小说。年过三十的叶蒙遭遇职场不顺,辞职后带着积蓄回到家乡开启惬意的小镇生活,机缘巧合之下,她偶遇了长着一双深情眼的李靳屿,并被他的神秘和冷峻吸引。两个陌生的灵魂不断触碰,叶蒙因李靳屿的艰辛生活而心生怜爱,热情主动地给予帮助;李靳屿也在叶蒙的追求下敞开了心扉,变得自信开朗起来。他们相互温暖、相互治愈,努力经营着这段来之不易的爱情。一枚戒指的到来打破了两人之间的平静,叶蒙母亲多年前患病去世的谜团缓缓浮出水面,叶蒙不得不面对残酷的真相--母亲的离去与李靳屿家有着千丝万缕的联系。此时李靳屿内心的天平早已偏向叶漾,叶蒙给他带来了阳光,现在轮到他来帮助叶蒙解开心结。最终,两人携手揭开上一辈的纠葛,放下过往恩怨,迎接美好的明天。", + "score": "56341", + "score_desc": "5.63w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/f09c4b963cd3cc3062d38e9182be750e", + "url": "https://www.baidu.com/s?wd=%E6%B7%B1%E6%83%85%E7%9C%BC+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 10, + "title": "定风波", + "desc": "《定风波》聚焦宋韵文化传承传播,围绕诗文、书画、美食、旅游、民生等主题,多维度描绘苏东坡的为官之道、志趣审美和精神世界,深入解读苏东坡的当代价值。全片共5集,每集50分钟。第一集“出川记”讲述苏东坡的成长与家风,建构其人生起始动力,探索其后来到杭州的动因;第二集“湖山记”讲述苏东坡首次为官杭州,受到湖山的滋养,实现真正的“胸有丘壑”;第三集“摩羯记”讲述苏东坡应对乌台诗案带来的种种影响,以乐观精神渡过人生的劫难;第四集“悬壶记”讲述苏东坡二度为官杭州,负责防疫,建安乐坊以及重新治理西湖;第五集“筑巢记”讲述苏东坡济苍生、度余生,保持“此心安处是吾乡”的人生态度。", + "score": "51095", + "score_desc": "5.11w", + "cover": "https://gips0.baidu.com/it/u=2177619972,3043234332&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f200_266", + "url": "https://www.baidu.com/s?wd=%E5%AE%9A%E9%A3%8E%E6%B3%A2+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 11, + "title": "白月梵星", + "desc": "本剧改编自星零小说《白烁上神》,讲述将军府嫡女白烁为报恩而立志修仙,寻仙途中意外搭救妖族大神梵樾,二人不打不相识,从相互利用到互生爱意、双向奔赴,纵然隔着千重困难,但爱足以打破一切限制,拥抱最真的彼此的故事。", + "score": "44201", + "score_desc": "4.42w", + "cover": "https://gips3.baidu.com/it/u=1404661215,4211295377&fm=3028&app=3028&f=JPEG&fmt=auto&q=75&size=f200_266", + "url": "https://www.baidu.com/s?wd=%E7%99%BD%E6%9C%88%E6%A2%B5%E6%98%9F+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 12, + "title": "我在顶峰等你", + "desc": "上一世,顾雪茭曾因恋爱脑而高考失利,职场打拼多年,归来仍是底层外包人员,还首当其冲地成为了“黑心老板”蔺之华的裁员目标。顾雪茭找蔺之华理论,意外重生回到高三那年。有机会重新开局,顾雪茭吸取前世教训,痛定思痛,将学习作为人生第一要务,由恋爱脑扭转为事业脑,在爆改人生的同时,还共同成就一段双向奔赴、互为变量的甜美爱情。", + "score": "37003", + "score_desc": "3.7w", + "cover": "https://gips2.baidu.com/it/u=3240531593,2885940403&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f200_266", + "url": "https://www.baidu.com/s?wd=%E6%88%91%E5%9C%A8%E9%A1%B6%E5%B3%B0%E7%AD%89%E4%BD%A0+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 13, + "title": "六姊妹", + "desc": "本剧改编自豆瓣阅读连载小说《六姊妹》,作者伊北。新中国成立后,何常胜为支援社会主义建设,携家带口从扬州江都移居安徽淮南,在淮河边上扎下了根。在接下来的二十年中,何常胜连得六个女儿,却在一场车祸中告别人世。大姐何家丽和奶奶何文氏、妈妈刘美心一起承担起了家庭重担,安顿妹妹们成家立业。时代在变化,何家六姊妹也经历了婚恋、工 作、生活等命运起伏,但她们团结一心,共同面对人生的风雨,在生活的磨砺中,六姊妹们也终于明白父亲生前反复强调的“家”的意义。", + "score": "36574", + "score_desc": "3.66w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/9e517a4f66e7fb7106b6333b85f1a5c1", + "url": "https://www.baidu.com/s?wd=%E5%85%AD%E5%A7%8A%E5%A6%B9+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 14, + "title": "扫毒风暴", + "desc": "1995年,缉毒警林强峰(段奕宏 饰)为了追查毒品的线索调到了西港缉毒支队工作。走私商刘少华(秦昊 饰)因偶然的机会接触到了冰毒,毒品带来的巨大利润让他产生邪念,成为了一名制毒师。在林强峰等缉毒警的全力追查下,西港市的涉案的毒贩们一一落网,只剩刘少华在别处鼠窜,企图躲避警方追捕。 1996年,林强峰再次查没了企图东山再起的刘少华的毒品,走投无路的刘少华只能蛰伏了起来,之后刘少华企图再次制毒,被林强峰发现踪迹。1999年,刘少华终于落网。", + "score": "32911", + "score_desc": "3.29w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/d9e3d21ca332652ffe75d7176bce397f", + "url": "https://www.baidu.com/s?wd=%E6%89%AB%E6%AF%92%E9%A3%8E%E6%9A%B4+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 15, + "title": "目之所及", + "desc": "本剧改编自阅读连载小说《盲目》,作者慕遥而寻。 世纪之交,因为水利工程的蓄水要求,一座江边小城即将被淹没,人们如火如荼地进行着新城的规划建设和人口的迁徙。此时,一桩离奇的杀夫案闯入了警方的视野,嫌疑人中,一个是咬定丈夫杀了女儿的可怜女人曲桐,一个是按摩院身份模糊的盲人薛小伟, 他们相互救赎,甘愿为对方牺牲,疑点重重。警 方锲而不舍的追查,揭秘出一段尘封多年,令人唏嘘的往事。真相可能会被淹没,但终有浮出水面的一天。", + "score": "27439", + "score_desc": "2.74w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/3b731c9a9e809e7c694a8cc5c65d5a15", + "url": "https://www.baidu.com/s?wd=%E7%9B%AE%E4%B9%8B%E6%89%80%E5%8F%8A+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 16, + "title": "书卷一梦", + "desc": "柠萌影业出品,改编自千山茶客的同名小说,尚书府嫡长女蒋阮被当成一枚棋子送入宫中,爱上温文儒雅的八皇子。谁知一朝宫变,爱人登基,府上鸡犬升天,她却成为一枚弃子,被污蔑为祸国妖女。蒋阮不甘,下定决心要报仇,却在回府之时遭遇暗杀,后借助神秘黑衣人之手才逃过一劫。从危机四伏的宅院到步步惊心的朝堂,她面对的敌人越来越多她暗暗布下陷阱,却误打误撞遇到锦英王萧韶。萧韶性情冷清,却屡次出手相助于她,两人暗生情愫,渐渐结盟,萧韶的身世之谜也随之浮出水面。此后,蒋阮千方百计阻挠八皇子的夺嫡大业,却引起了萧韶的怀疑,两人结下误会八皇子开始进行疯狂的反击行动,蒋阮的处境十分危险。复仇途中,蒋阮发现自己的身世竟和萧韶的身世之谜有关,一个大锦朝隐藏多年的秘密浮出水面此时,南疆人蠢蠢欲动,欲与宣离结为同盟。彼时,蒋阮小时候被继母种下的毒发作,萧韶带她四处求医,生死一线的时候,蒋阮得知了一个更大的秘密", + "score": "26702", + "score_desc": "2.67w", + "cover": "https://gips2.baidu.com/it/u=1593831522,852391480&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f200_266", + "url": "https://www.baidu.com/s?wd=%E4%B9%A6%E5%8D%B7%E4%B8%80%E6%A2%A6+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 17, + "title": "樱桃琥珀", + "desc": "《樱桃琥珀》要被影视化了,温柔女主学霸男主,主人公从小城到大都市,直至婚姻殿堂的女孩成长故事,由国内一线知名影视公司出品。", + "score": "26660", + "score_desc": "2.67w", + "cover": "https://gips3.baidu.com/it/u=2643705168,575328711&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f200_266", + "url": "https://www.baidu.com/s?wd=%E6%A8%B1%E6%A1%83%E7%90%A5%E7%8F%80+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 18, + "title": "咒术回战第二季", + "desc": "", + "score": "26617", + "score_desc": "2.66w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/7b3cfcaf3b343d45f5c16f3e47a9f946", + "url": "https://www.baidu.com/s?wd=%E5%92%92%E6%9C%AF%E5%9B%9E%E6%88%98%E7%AC%AC%E4%BA%8C%E5%AD%A3+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 19, + "title": "偷偷藏不住", + "desc": "桑稚高中时期被老师频繁请家长,为了解决麻烦,桑稚决定找哥哥顶包,然而兄妹见面就互怼闹僵,无奈只好求助来家中玩耍的哥哥舍友段嘉许,在桑稚的苦求要挟下,段嘉许帮桑稚去学校见老师,两人因此结缘,段嘉许从此更是把桑稚当成自己的亲妹妹爱护。随着段嘉许大学毕业,两人分隔异地,又因为一些误会,关系疏远。直到成年后的桑稚如愿考到了段嘉许的城市,两人重逢。在日渐亲密的接触下,桑稚渐渐发现了段嘉许一直以来的压力来源,她想要保护这个一直对自己很好的大哥哥,重拾埋藏心底的暗恋。在桑稚的陪伴下,段嘉许慢慢解开心结,他真心喜欢上了长大的桑稚,一段纯真暗恋终于开出美丽的爱情花朵。", + "score": "24655", + "score_desc": "2.47w", + "cover": "https://gips3.baidu.com/it/u=2216037055,3672846777&fm=3028&app=3028&f=JPEG&fmt=auto&q=75&size=f200_266", + "url": "https://www.baidu.com/s?wd=%E5%81%B7%E5%81%B7%E8%97%8F%E4%B8%8D%E4%BD%8F+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 20, + "title": "一路朝阳", + "desc": "北漂女孩李慕嘉毕业后进入北京最知名的律所,靠着自己的勤奋努力从行政助理一路成为独当一面的律师,在职业巅峰切换跑道加入创业公司,大起大落最终创业成功,收获了一个家;闺蜜田蓉毕业求职未果,误打误撞成为房产中介,与北京男孩李万兵仓促结婚,在婚后职业和感情都遭受了巨大考验;表妹陈青斯坦福毕业与男友回国创业,遭遇种种挫折但找到了心之所向。从2007到2019年,三个女孩对人生的追求和希望在现实中身不由己地改变了模样,庆幸的是十年的磨砺最终还是求得了人生的向阳面,得以一路朝阳。", + "score": "24482", + "score_desc": "2.45w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/356088680f3a962380c8d700cf9a2826", + "url": "https://www.baidu.com/s?wd=%E4%B8%80%E8%B7%AF%E6%9C%9D%E9%98%B3+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 21, + "title": "她和她的他们", + "desc": "《她和她的他们》是由徐麒丰担任总导演、王兵导演,由肖顺尧、贾青、何杜娟领衔主演,胡军特邀领衔主演,袁家欢、王大奇、蒋方婷、郑家彬、钟林煜、李琦、秦奋等主演的都市犯罪悬疑剧。该剧讲述了刑警队副队长赵熵与搭档崔山河,抽丝剥茧,一层层揭开七人之间错综复杂的情感秘密,一场场关于人性、伦理的纠葛,一出出谎言交织的虐戏逐步上演。随着真相步步逼近,赵熵也拉开了自我救赎的序幕。", + "score": "24375", + "score_desc": "2.44w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/6b5d1065fb78498ab26d77cd0e0c7c27", + "url": "https://www.baidu.com/s?wd=%E5%A5%B9%E5%92%8C%E5%A5%B9%E7%9A%84%E4%BB%96%E4%BB%AC+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 22, + "title": "卿卿日常", + "desc": "《清穿日常》是多木木多所著网络小说,在晋江文学城、中国移动和阅读等网站连载。吃……吃喝喝那些事。反正清穿已经都穿成筛子了。清穿就是为了遇见阿哥,种种田过过日子!今天,你清穿了吗?", + "score": "22800", + "score_desc": "2.28w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/6caa4eb1bb38d643d7099b060d94acee", + "url": "https://www.baidu.com/s?wd=%E5%8D%BF%E5%8D%BF%E6%97%A5%E5%B8%B8+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 23, + "title": "初恋,稍显粗糙", + "desc": "《初恋,稍显粗糙》是由小野花梨、风间俊介主演的电视剧,于2023年7月7日在东京电视台深夜播出。该剧改编自作者ざくざくろ的同名漫画,讲述一位轻度智力障碍女性的纯爱故事。", + "score": "21904", + "score_desc": "2.19w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/e4c672a71dfa478102360895a77b4108", + "url": "https://www.baidu.com/s?wd=%E5%88%9D%E6%81%8B%EF%BC%8C%E7%A8%8D%E6%98%BE%E7%B2%97%E7%B3%99+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 24, + "title": "九重紫", + "desc": "年少失母的窦昭因为家庭变故和坎坷波折的命运对人间情爱与亲情失望透顶,她斗继母、保家产,避居冷僻田庄,求学晓事以图自保自强。大雨之夜,窦昭与扮作商贾投宿的宋墨在田庄相逢,用自己的智慧帮其保下平寇有功的定国公一脉遗孤,二人命运也因此紧紧缠绕。出身官宦之家的宋墨深陷家变谜团,而窦昭也在继母的破坏下遭遇换亲流言,二人选择成亲以结同盟、共度困局。曾经彼此猜忌的他们在相互帮扶中共渡难关,也由此渐渐相知相惜、互为知己。不料风雨欲来、朝堂骤变,窦昭与宋墨携手面对危局,共同挽救家族命运、解开英国公府换子疑云、成功阻止辽王谋逆,平忠臣冤案、保家国安宁,活出了真正属于自己的幸福生活。", + "score": "21717", + "score_desc": "2.17w", + "cover": "https://gips3.baidu.com/it/u=1237661084,451511578&fm=3028&app=3028&f=JPEG&fmt=auto&q=75&size=f200_266", + "url": "https://www.baidu.com/s?wd=%E4%B9%9D%E9%87%8D%E7%B4%AB+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 25, + "title": "香港人在北京", + "desc": "《香港人在北京》是由陈展鹏、吴若希、戴祖仪主演的TVB电视剧,在拍摄中。", + "score": "21238", + "score_desc": "2.12w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/2e5f4d3fe3b36a7d9f4f782c35979016", + "url": "https://www.baidu.com/s?wd=%E9%A6%99%E6%B8%AF%E4%BA%BA%E5%9C%A8%E5%8C%97%E4%BA%AC+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 26, + "title": "你好,我们是欢喜天团", + "desc": "《你好,我们是欢喜天团》是由刘浩南执导,由王艺瑾、千喆、高卿尘领衔主演,易恒、伍雅露、阿克朱力、曹左、贵尚奇、庄逸涵、曲梦婷主演,陈名豪、代少冬特别出演的古代网络微短剧。2022年10月15日,《你好,我们是欢喜天团》杀青。该剧于2023年9月22日在腾讯视频播出。", + "score": "20966", + "score_desc": "2.1w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/94e45c218022c97e865f68c3a15c9c22", + "url": "https://www.baidu.com/s?wd=%E4%BD%A0%E5%A5%BD%EF%BC%8C%E6%88%91%E4%BB%AC%E6%98%AF%E6%AC%A2%E5%96%9C%E5%A4%A9%E5%9B%A2+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 27, + "title": "诛仙", + "desc": "一夜间惨变孤儿的张小凡被青云门收为弟子,经过五年刻苦修炼,他在师门七脉会武上大放异彩,后被派往空桑山打探魔教行迹,旅程中,他与师姐陆雪琪遭遇危难,并结识救护了魔教女子碧瑶,同时,新的危险也在前方等待着他。", + "score": "20659", + "score_desc": "2.07w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/ab55434dff2e8c4432119fc980f5a51d", + "url": "https://www.baidu.com/s?wd=%E8%AF%9B%E4%BB%99+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 28, + "title": "玫瑰的故事", + "desc": "电视剧改编自亦舒同名小说,由刘亦菲出演该剧女一号。剧中主要讲述了黄玫瑰一生的情感故事。出身于富贵之家的玫瑰经历了几段刻骨铭心的爱情,在浮浮沉沉中明白自己想要的是什么,为爱放手去追寻,成长为更有勇气的自己。", + "score": "20439", + "score_desc": "2.04w", + "cover": "https://gips1.baidu.com/it/u=1227308879,4121027510&fm=3028&app=3028&f=PNG&fmt=auto&q=75&size=f608_864", + "url": "https://www.baidu.com/s?wd=%E7%8E%AB%E7%91%B0%E7%9A%84%E6%95%85%E4%BA%8B+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 29, + "title": "爱你,是我做过最好的事", + "desc": "《爱你,是我做过最好的事》笙离的小说。讲述了一个关于青春、成长、初恋、选择的故事。", + "score": "20196", + "score_desc": "2.02w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/d680ad814edfef5438f7e6175c0456f6", + "url": "https://www.baidu.com/s?wd=%E7%88%B1%E4%BD%A0%EF%BC%8C%E6%98%AF%E6%88%91%E5%81%9A%E8%BF%87%E6%9C%80%E5%A5%BD%E7%9A%84%E4%BA%8B+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + }, + { + "rank": 30, + "title": "唐朝诡事录", + "desc": "暗夜邪仙从天而降,鬼市地宫露出冰山一角,而风靡长安的诡异红茶究竟是养生之药还是害人之物?长安城里新娘失踪案接连发生,似乎与红茶有着千丝万缕的联系案件扑朔迷离,人心玄妙难鉴!金吾卫中郎将卢凌风奉命查案,遭遇平生最强对手狄仁杰关门弟子苏无名,双强携手共破长安奇案!九个不同风格的诡异案件,《长安红茶》《石桥图》《众生堂》《黄梅杀》《甘棠驿怪谈》《鼍神》《人面花》《参天楼》,一一为您揭晓大唐夜色笼罩之下的奇闻异录! 见证唐诗之外,被湮没千年的奇诡想象。千年前的唐朝,万邦来朝,是当之无愧的世界中心。优越的物质生活,多样的文化融合,催生了唐朝人极致的想象力。 除了李白、杜甫、白居易等一代传奇诗人,用唐诗描绘出的华丽的大唐美卷;市井间的贩夫走卒,更用他们更加不羁的想象力,在唐朝的夜幕中 勾勒出神魔鬼怪的憧憧魅影:仙魔精妖、奇闻怪谈、幻术道法、异域传说、珍禽异兽、宫廷轶事", + "score": "17785", + "score_desc": "1.78w", + "cover": "https://fyb-2.cdn.bcebos.com/hotboard_image/5bb62453122a1d67e077b70321676175", + "url": "https://www.baidu.com/s?wd=%E5%94%90%E6%9C%9D%E8%AF%A1%E4%BA%8B%E5%BD%95+%E7%94%B5%E8%A7%86%E5%89%A7&sa=fyb_teleplay_all_all&rsv_dl=fyb_teleplay_all_all" + } + ] } \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/api.js b/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/api.js index 46def0f0..b6aec5c6 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/api.js +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/api.js @@ -1,146 +1,146 @@ -// API 配置和数据获取模块 -class HotTopicsAPI { - constructor() { - this.apiUrl = 'https://60s.api.shumengya.top/v2/baidu/tieba'; - this.fallbackData = null; - } - - // 获取热搜数据 - async fetchHotTopics() { - try { - const response = await fetch(this.apiUrl, { - method: 'GET', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - // 添加超时控制 - signal: AbortSignal.timeout(10000) // 10秒超时 - }); - - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - - const data = await response.json(); - - // 验证数据格式 - if (!this.validateData(data)) { - throw new Error('Invalid data format'); - } - - // 缓存成功的数据作为备用 - this.fallbackData = data; - - return { - success: true, - data: data, - timestamp: new Date().toISOString() - }; - } catch (error) { - console.error('API请求失败:', error); - - // 如果有缓存数据,返回缓存数据 - if (this.fallbackData) { - return { - success: true, - data: this.fallbackData, - timestamp: new Date().toISOString(), - isCache: true - }; - } - - return { - success: false, - error: error.message, - timestamp: new Date().toISOString() - }; - } - } - - // 验证数据格式 - validateData(data) { - if (!data || typeof data !== 'object') { - return false; - } - - if (data.code !== 200) { - return false; - } - - if (!Array.isArray(data.data)) { - return false; - } - - // 验证数据项格式 - return data.data.every(item => { - return item.rank && - item.title && - item.desc && - item.score_desc; - }); - } - - // 处理图片URL - processImageUrl(url) { - if (!url) return null; - - // 处理百度贴吧图片URL的特殊字符 - try { - return url.replace(/&/g, '&'); - } catch (error) { - console.warn('图片URL处理失败:', error); - return null; - } - } - - // 处理跳转URL - processTopicUrl(url) { - if (!url) return '#'; - - try { - return url.replace(/&/g, '&'); - } catch (error) { - console.warn('链接URL处理失败:', error); - return '#'; - } - } - - // 格式化分数显示 - formatScore(score, scoreDesc) { - if (scoreDesc) { - return scoreDesc; - } - - if (typeof score === 'number') { - if (score >= 10000) { - return (score / 10000).toFixed(1) + 'w'; - } - return score.toString(); - } - - return '0'; - } - - // 截断文本 - truncateText(text, maxLength = 100) { - if (!text) return ''; - - if (text.length <= maxLength) { - return text; - } - - return text.substring(0, maxLength) + '...'; - } - - // 获取排名样式类 - getRankClass(rank) { - if (rank === 1) return 'top-1'; - if (rank === 2) return 'top-2'; - if (rank === 3) return 'top-3'; - return 'normal'; - } -} - -// 导出API实例 +// API 配置和数据获取模块 +class HotTopicsAPI { + constructor() { + this.apiUrl = 'https://60s.api.shumengya.top/v2/baidu/tieba'; + this.fallbackData = null; + } + + // 获取热搜数据 + async fetchHotTopics() { + try { + const response = await fetch(this.apiUrl, { + method: 'GET', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + // 添加超时控制 + signal: AbortSignal.timeout(10000) // 10秒超时 + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const data = await response.json(); + + // 验证数据格式 + if (!this.validateData(data)) { + throw new Error('Invalid data format'); + } + + // 缓存成功的数据作为备用 + this.fallbackData = data; + + return { + success: true, + data: data, + timestamp: new Date().toISOString() + }; + } catch (error) { + console.error('API请求失败:', error); + + // 如果有缓存数据,返回缓存数据 + if (this.fallbackData) { + return { + success: true, + data: this.fallbackData, + timestamp: new Date().toISOString(), + isCache: true + }; + } + + return { + success: false, + error: error.message, + timestamp: new Date().toISOString() + }; + } + } + + // 验证数据格式 + validateData(data) { + if (!data || typeof data !== 'object') { + return false; + } + + if (data.code !== 200) { + return false; + } + + if (!Array.isArray(data.data)) { + return false; + } + + // 验证数据项格式 + return data.data.every(item => { + return item.rank && + item.title && + item.desc && + item.score_desc; + }); + } + + // 处理图片URL + processImageUrl(url) { + if (!url) return null; + + // 处理百度贴吧图片URL的特殊字符 + try { + return url.replace(/&/g, '&'); + } catch (error) { + console.warn('图片URL处理失败:', error); + return null; + } + } + + // 处理跳转URL + processTopicUrl(url) { + if (!url) return '#'; + + try { + return url.replace(/&/g, '&'); + } catch (error) { + console.warn('链接URL处理失败:', error); + return '#'; + } + } + + // 格式化分数显示 + formatScore(score, scoreDesc) { + if (scoreDesc) { + return scoreDesc; + } + + if (typeof score === 'number') { + if (score >= 10000) { + return (score / 10000).toFixed(1) + 'w'; + } + return score.toString(); + } + + return '0'; + } + + // 截断文本 + truncateText(text, maxLength = 100) { + if (!text) return ''; + + if (text.length <= maxLength) { + return text; + } + + return text.substring(0, maxLength) + '...'; + } + + // 获取排名样式类 + getRankClass(rank) { + if (rank === 1) return 'top-1'; + if (rank === 2) return 'top-2'; + if (rank === 3) return 'top-3'; + return 'normal'; + } +} + +// 导出API实例 const hotTopicsAPI = new HotTopicsAPI(); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/app.js b/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/app.js index 7c31b50e..ee1be932 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/app.js +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/app.js @@ -1,201 +1,201 @@ -// 主应用程序文件 -class HotTopicsApp { - constructor() { - this.isInitialized = false; - this.retryCount = 0; - this.maxRetries = 3; - this.retryDelay = 2000; // 2秒 - } - - // 初始化应用 - async init() { - if (this.isInitialized) return; - - try { - console.log('初始化百度贴吧热搜应用...'); - - // 检查必要的元素是否存在 - this.checkRequiredElements(); - - // 加载初始数据 - await this.loadHotTopics(); - - // 设置自动刷新 - this.setupAutoRefresh(); - - // 设置页面可见性监听 - this.setupVisibilityListener(); - - this.isInitialized = true; - console.log('应用初始化完成'); - - } catch (error) { - console.error('应用初始化失败:', error); - uiManager.showError('应用初始化失败,请刷新页面重试'); - } - } - - // 检查必要元素 - checkRequiredElements() { - const requiredElements = ['loading', 'error', 'hotList', 'refreshBtn', 'updateTime']; - const missingElements = requiredElements.filter(id => !document.getElementById(id)); - - if (missingElements.length > 0) { - throw new Error(`缺少必要元素: ${missingElements.join(', ')}`); - } - } - - // 加载热搜数据 - async loadHotTopics() { - try { - console.log('开始获取热搜数据...'); - uiManager.showLoading(); - - const result = await hotTopicsAPI.fetchHotTopics(); - - if (result.success) { - console.log('数据获取成功:', result.data.data?.length || 0, '条记录'); - uiManager.renderHotTopics(result.data); - this.retryCount = 0; // 重置重试计数 - - // 如果是缓存数据,显示提示 - if (result.isCache) { - uiManager.showToast('当前显示缓存数据', 3000); - } - } else { - throw new Error(result.error || '数据获取失败'); - } - - } catch (error) { - console.error('加载热搜数据失败:', error); - - // 重试逻辑 - if (this.retryCount < this.maxRetries) { - this.retryCount++; - console.log(`第 ${this.retryCount} 次重试...`); - - uiManager.showToast(`加载失败,${this.retryDelay / 1000}秒后重试...`, this.retryDelay); - - setTimeout(() => { - this.loadHotTopics(); - }, this.retryDelay); - - // 增加重试延迟 - this.retryDelay = Math.min(this.retryDelay * 1.5, 10000); - } else { - uiManager.showError('数据加载失败,请检查网络连接后重试'); - this.retryCount = 0; - this.retryDelay = 2000; - } - } - } - - // 设置自动刷新 - setupAutoRefresh() { - // 每5分钟自动刷新一次 - setInterval(() => { - if (document.visibilityState === 'visible' && !uiManager.isLoading) { - console.log('自动刷新数据...'); - this.loadHotTopics(); - } - }, 5 * 60 * 1000); // 5分钟 - } - - // 设置页面可见性监听 - setupVisibilityListener() { - document.addEventListener('visibilitychange', () => { - if (document.visibilityState === 'visible') { - // 页面变为可见时,检查是否需要刷新数据 - const lastUpdate = localStorage.getItem('lastUpdateTime'); - const now = Date.now(); - - if (!lastUpdate || (now - parseInt(lastUpdate)) > 10 * 60 * 1000) { - // 超过10分钟没更新,自动刷新 - console.log('页面重新可见,刷新数据...'); - this.loadHotTopics(); - } - } - }); - } - - // 手动刷新 - async refresh() { - if (uiManager.isLoading) { - console.log('正在加载中,忽略刷新请求'); - return; - } - - console.log('手动刷新数据...'); - this.retryCount = 0; - this.retryDelay = 2000; - await this.loadHotTopics(); - } - - // 获取应用状态 - getStatus() { - return { - isInitialized: this.isInitialized, - isLoading: uiManager.isLoading, - retryCount: this.retryCount, - lastUpdate: localStorage.getItem('lastUpdateTime') - }; - } -} - -// 创建应用实例 -const app = new HotTopicsApp(); - -// 全局函数,供HTML调用 -window.loadHotTopics = () => app.loadHotTopics(); -window.refreshData = () => app.refresh(); -window.getAppStatus = () => app.getStatus(); - -// 页面加载完成后初始化 -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', () => { - app.init(); - }); -} else { - // 如果页面已经加载完成 - app.init(); -} - -// 错误处理 -window.addEventListener('error', (event) => { - console.error('全局错误:', event.error); - - // 如果是网络错误,显示友好提示 - if (event.error?.message?.includes('fetch') || - event.error?.message?.includes('network') || - event.error?.message?.includes('Failed to fetch')) { - uiManager.showToast('网络连接异常,请检查网络设置'); - } -}); - -// 未处理的Promise拒绝 -window.addEventListener('unhandledrejection', (event) => { - console.error('未处理的Promise拒绝:', event.reason); - - // 防止默认的错误处理 - event.preventDefault(); - - // 显示用户友好的错误信息 - if (event.reason?.message?.includes('fetch') || - event.reason?.message?.includes('network')) { - uiManager.showToast('网络请求失败,请稍后重试'); - } -}); - -// 导出应用实例(用于调试) -window.hotTopicsApp = app; - -// 开发模式下的调试信息 -if (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1') { - console.log('🚀 百度贴吧热搜应用已启动'); - console.log('📱 响应式设计已启用'); - console.log('🔄 自动刷新已设置(5分钟间隔)'); - console.log('💡 可用调试命令:'); - console.log(' - hotTopicsApp.getStatus() // 获取应用状态'); - console.log(' - hotTopicsApp.refresh() // 手动刷新'); - console.log(' - loadHotTopics() // 重新加载数据'); +// 主应用程序文件 +class HotTopicsApp { + constructor() { + this.isInitialized = false; + this.retryCount = 0; + this.maxRetries = 3; + this.retryDelay = 2000; // 2秒 + } + + // 初始化应用 + async init() { + if (this.isInitialized) return; + + try { + console.log('初始化百度贴吧热搜应用...'); + + // 检查必要的元素是否存在 + this.checkRequiredElements(); + + // 加载初始数据 + await this.loadHotTopics(); + + // 设置自动刷新 + this.setupAutoRefresh(); + + // 设置页面可见性监听 + this.setupVisibilityListener(); + + this.isInitialized = true; + console.log('应用初始化完成'); + + } catch (error) { + console.error('应用初始化失败:', error); + uiManager.showError('应用初始化失败,请刷新页面重试'); + } + } + + // 检查必要元素 + checkRequiredElements() { + const requiredElements = ['loading', 'error', 'hotList', 'refreshBtn', 'updateTime']; + const missingElements = requiredElements.filter(id => !document.getElementById(id)); + + if (missingElements.length > 0) { + throw new Error(`缺少必要元素: ${missingElements.join(', ')}`); + } + } + + // 加载热搜数据 + async loadHotTopics() { + try { + console.log('开始获取热搜数据...'); + uiManager.showLoading(); + + const result = await hotTopicsAPI.fetchHotTopics(); + + if (result.success) { + console.log('数据获取成功:', result.data.data?.length || 0, '条记录'); + uiManager.renderHotTopics(result.data); + this.retryCount = 0; // 重置重试计数 + + // 如果是缓存数据,显示提示 + if (result.isCache) { + uiManager.showToast('当前显示缓存数据', 3000); + } + } else { + throw new Error(result.error || '数据获取失败'); + } + + } catch (error) { + console.error('加载热搜数据失败:', error); + + // 重试逻辑 + if (this.retryCount < this.maxRetries) { + this.retryCount++; + console.log(`第 ${this.retryCount} 次重试...`); + + uiManager.showToast(`加载失败,${this.retryDelay / 1000}秒后重试...`, this.retryDelay); + + setTimeout(() => { + this.loadHotTopics(); + }, this.retryDelay); + + // 增加重试延迟 + this.retryDelay = Math.min(this.retryDelay * 1.5, 10000); + } else { + uiManager.showError('数据加载失败,请检查网络连接后重试'); + this.retryCount = 0; + this.retryDelay = 2000; + } + } + } + + // 设置自动刷新 + setupAutoRefresh() { + // 每5分钟自动刷新一次 + setInterval(() => { + if (document.visibilityState === 'visible' && !uiManager.isLoading) { + console.log('自动刷新数据...'); + this.loadHotTopics(); + } + }, 5 * 60 * 1000); // 5分钟 + } + + // 设置页面可见性监听 + setupVisibilityListener() { + document.addEventListener('visibilitychange', () => { + if (document.visibilityState === 'visible') { + // 页面变为可见时,检查是否需要刷新数据 + const lastUpdate = localStorage.getItem('lastUpdateTime'); + const now = Date.now(); + + if (!lastUpdate || (now - parseInt(lastUpdate)) > 10 * 60 * 1000) { + // 超过10分钟没更新,自动刷新 + console.log('页面重新可见,刷新数据...'); + this.loadHotTopics(); + } + } + }); + } + + // 手动刷新 + async refresh() { + if (uiManager.isLoading) { + console.log('正在加载中,忽略刷新请求'); + return; + } + + console.log('手动刷新数据...'); + this.retryCount = 0; + this.retryDelay = 2000; + await this.loadHotTopics(); + } + + // 获取应用状态 + getStatus() { + return { + isInitialized: this.isInitialized, + isLoading: uiManager.isLoading, + retryCount: this.retryCount, + lastUpdate: localStorage.getItem('lastUpdateTime') + }; + } +} + +// 创建应用实例 +const app = new HotTopicsApp(); + +// 全局函数,供HTML调用 +window.loadHotTopics = () => app.loadHotTopics(); +window.refreshData = () => app.refresh(); +window.getAppStatus = () => app.getStatus(); + +// 页面加载完成后初始化 +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', () => { + app.init(); + }); +} else { + // 如果页面已经加载完成 + app.init(); +} + +// 错误处理 +window.addEventListener('error', (event) => { + console.error('全局错误:', event.error); + + // 如果是网络错误,显示友好提示 + if (event.error?.message?.includes('fetch') || + event.error?.message?.includes('network') || + event.error?.message?.includes('Failed to fetch')) { + uiManager.showToast('网络连接异常,请检查网络设置'); + } +}); + +// 未处理的Promise拒绝 +window.addEventListener('unhandledrejection', (event) => { + console.error('未处理的Promise拒绝:', event.reason); + + // 防止默认的错误处理 + event.preventDefault(); + + // 显示用户友好的错误信息 + if (event.reason?.message?.includes('fetch') || + event.reason?.message?.includes('network')) { + uiManager.showToast('网络请求失败,请稍后重试'); + } +}); + +// 导出应用实例(用于调试) +window.hotTopicsApp = app; + +// 开发模式下的调试信息 +if (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1') { + console.log('🚀 百度贴吧热搜应用已启动'); + console.log('📱 响应式设计已启用'); + console.log('🔄 自动刷新已设置(5分钟间隔)'); + console.log('💡 可用调试命令:'); + console.log(' - hotTopicsApp.getStatus() // 获取应用状态'); + console.log(' - hotTopicsApp.refresh() // 手动刷新'); + console.log(' - loadHotTopics() // 重新加载数据'); } \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/index.html index 3e06b890..9ff2a1e0 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/热搜榜单/百度贴吧话题榜/styles.css b/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/styles.css index 4d7622e6..60dd3a5d 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/styles.css +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/styles.css @@ -1,419 +1,419 @@ -/* 全局样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; - background: linear-gradient(135deg, #e8f5e8 0%, #f9f9e8 50%, #f5f5f5 100%); - min-height: 100vh; - color: #333; - line-height: 1.6; -} - -.container { - max-width: 800px; - margin: 0 auto; - padding: 0 16px; - min-height: 100vh; - display: flex; - flex-direction: column; -} - -/* 头部样式 */ -.header { - padding: 20px 0; - position: sticky; - top: 0; - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(10px); - border-radius: 0 0 20px 20px; - margin-bottom: 20px; - z-index: 100; - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); -} - -.header-content { - display: flex; - justify-content: space-between; - align-items: center; -} - -.logo { - display: flex; - align-items: center; - gap: 12px; -} - -.logo i { - font-size: 28px; - color: #7fb069; -} - -.logo h1 { - font-size: 24px; - font-weight: 700; - color: #2d3748; - margin: 0; -} - -.refresh-btn { - width: 44px; - height: 44px; - border-radius: 50%; - background: linear-gradient(135deg, #7fb069, #a8cc8c); - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - transition: all 0.3s ease; - box-shadow: 0 4px 15px rgba(127, 176, 105, 0.3); -} - -.refresh-btn:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(127, 176, 105, 0.4); -} - -.refresh-btn:active { - transform: translateY(0); -} - -.refresh-btn i { - color: white; - font-size: 18px; -} - -.refresh-btn.loading i { - animation: spin 1s linear infinite; -} - -@keyframes spin { - from { transform: rotate(0deg); } - to { transform: rotate(360deg); } -} - -/* 主内容区域 */ -.main-content { - flex: 1; - margin-bottom: 20px; -} - -/* 加载状态 */ -.loading { - text-align: center; - padding: 60px 20px; - color: white; -} - -.loading-spinner { - width: 40px; - height: 40px; - border: 3px solid rgba(255, 255, 255, 0.3); - border-top: 3px solid white; - border-radius: 50%; - margin: 0 auto 20px; - animation: spin 1s linear infinite; -} - -.loading p { - font-size: 16px; - opacity: 0.9; -} - -/* 错误状态 */ -.error { - text-align: center; - padding: 60px 20px; - color: white; -} - -.error i { - font-size: 48px; - margin-bottom: 20px; - opacity: 0.8; -} - -.error p { - font-size: 16px; - margin-bottom: 20px; - opacity: 0.9; -} - -.retry-btn { - background: rgba(255, 255, 255, 0.2); - border: 2px solid rgba(255, 255, 255, 0.3); - color: white; - padding: 12px 24px; - border-radius: 25px; - cursor: pointer; - font-size: 14px; - transition: all 0.3s ease; -} - -.retry-btn:hover { - background: rgba(255, 255, 255, 0.3); - border-color: rgba(255, 255, 255, 0.5); -} - -/* 热搜列表 */ -.hot-list { - display: grid; - gap: 16px; -} - -.hot-item { - background: rgba(255, 255, 255, 0.95); - border-radius: 16px; - padding: 20px; - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); - transition: all 0.3s ease; - cursor: pointer; - backdrop-filter: blur(10px); - border: 1px solid rgba(255, 255, 255, 0.2); -} - -.hot-item:hover { - transform: translateY(-4px); - box-shadow: 0 8px 30px rgba(0, 0, 0, 0.15); - background: rgba(255, 255, 255, 1); -} - -.hot-item-header { - display: flex; - align-items: flex-start; - gap: 16px; - margin-bottom: 12px; -} - -.rank-badge { - min-width: 32px; - height: 32px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - font-weight: 700; - font-size: 14px; - color: white; - flex-shrink: 0; -} - -.rank-badge.top-1 { - background: linear-gradient(135deg, #ff6b6b, #ee5a24); - box-shadow: 0 4px 15px rgba(255, 107, 107, 0.3); -} - -.rank-badge.top-2 { - background: linear-gradient(135deg, #ffa726, #ff7043); - box-shadow: 0 4px 15px rgba(255, 167, 38, 0.3); -} - -.rank-badge.top-3 { - background: linear-gradient(135deg, #ffca28, #ffa000); - box-shadow: 0 4px 15px rgba(255, 202, 40, 0.3); -} - -.rank-badge.normal { - background: linear-gradient(135deg, #7fb069, #a8cc8c); - box-shadow: 0 4px 15px rgba(127, 176, 105, 0.3); -} - -.hot-item-content { - flex: 1; - min-width: 0; -} - -.hot-title { - font-size: 16px; - font-weight: 600; - color: #2d3748; - margin-bottom: 8px; - line-height: 1.4; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; -} - -.hot-desc { - font-size: 14px; - color: #718096; - line-height: 1.5; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; - margin-bottom: 12px; -} - -.hot-meta { - display: flex; - align-items: center; - justify-content: space-between; - gap: 12px; -} - -.hot-score { - display: flex; - align-items: center; - gap: 6px; - color: #7fb069; - font-weight: 600; - font-size: 14px; -} - -.hot-score i { - font-size: 12px; -} - -.hot-avatar { - width: 24px; - height: 24px; - border-radius: 50%; - object-fit: cover; - border: 2px solid rgba(127, 176, 105, 0.2); -} - -/* 底部 */ -.footer { - text-align: center; - padding: 20px 0; - color: rgba(255, 255, 255, 0.8); - font-size: 12px; - line-height: 1.5; -} - -.update-time { - margin-bottom: 4px; - font-weight: 500; -} - -.data-source { - opacity: 0.7; -} - -/* 响应式设计 */ -@media (max-width: 768px) { - .container { - padding: 0 12px; - } - - .header { - padding: 16px 0; - margin-bottom: 16px; - } - - .logo h1 { - font-size: 20px; - } - - .logo i { - font-size: 24px; - } - - .refresh-btn { - width: 40px; - height: 40px; - } - - .refresh-btn i { - font-size: 16px; - } - - .hot-list { - gap: 12px; - } - - .hot-item { - padding: 16px; - } - - .hot-item-header { - gap: 12px; - margin-bottom: 10px; - } - - .rank-badge { - min-width: 28px; - height: 28px; - font-size: 12px; - } - - .hot-title { - font-size: 15px; - } - - .hot-desc { - font-size: 13px; - } - - .hot-score { - font-size: 13px; - } - - .hot-avatar { - width: 20px; - height: 20px; - border: 2px solid rgba(127, 176, 105, 0.2); - } -} - -@media (max-width: 480px) { - .container { - padding: 0 8px; - } - - .hot-item { - padding: 12px; - } - - .hot-title { - font-size: 14px; - } - - .hot-desc { - font-size: 12px; - } -} - -/* 动画效果 */ -.hot-item { - animation: fadeInUp 0.6s ease forwards; - opacity: 0; - transform: translateY(20px); -} - -.hot-item:nth-child(1) { animation-delay: 0.1s; } -.hot-item:nth-child(2) { animation-delay: 0.2s; } -.hot-item:nth-child(3) { animation-delay: 0.3s; } -.hot-item:nth-child(4) { animation-delay: 0.4s; } -.hot-item:nth-child(5) { animation-delay: 0.5s; } -.hot-item:nth-child(n+6) { animation-delay: 0.6s; } - -@keyframes fadeInUp { - to { - opacity: 1; - transform: translateY(0); - } -} - -/* 滚动条样式 */ -::-webkit-scrollbar { - width: 6px; -} - -::-webkit-scrollbar-track { - background: rgba(255, 255, 255, 0.1); -} - -::-webkit-scrollbar-thumb { - background: rgba(255, 255, 255, 0.3); - border-radius: 3px; -} - -::-webkit-scrollbar-thumb:hover { - background: rgba(255, 255, 255, 0.5); +/* 全局样式重置 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + background: linear-gradient(135deg, #e8f5e8 0%, #f9f9e8 50%, #f5f5f5 100%); + min-height: 100vh; + color: #333; + line-height: 1.6; +} + +.container { + max-width: 800px; + margin: 0 auto; + padding: 0 16px; + min-height: 100vh; + display: flex; + flex-direction: column; +} + +/* 头部样式 */ +.header { + padding: 20px 0; + position: sticky; + top: 0; + background: rgba(255, 255, 255, 0.95); + backdrop-filter: blur(10px); + border-radius: 0 0 20px 20px; + margin-bottom: 20px; + z-index: 100; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); +} + +.header-content { + display: flex; + justify-content: space-between; + align-items: center; +} + +.logo { + display: flex; + align-items: center; + gap: 12px; +} + +.logo i { + font-size: 28px; + color: #7fb069; +} + +.logo h1 { + font-size: 24px; + font-weight: 700; + color: #2d3748; + margin: 0; +} + +.refresh-btn { + width: 44px; + height: 44px; + border-radius: 50%; + background: linear-gradient(135deg, #7fb069, #a8cc8c); + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all 0.3s ease; + box-shadow: 0 4px 15px rgba(127, 176, 105, 0.3); +} + +.refresh-btn:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(127, 176, 105, 0.4); +} + +.refresh-btn:active { + transform: translateY(0); +} + +.refresh-btn i { + color: white; + font-size: 18px; +} + +.refresh-btn.loading i { + animation: spin 1s linear infinite; +} + +@keyframes spin { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } +} + +/* 主内容区域 */ +.main-content { + flex: 1; + margin-bottom: 20px; +} + +/* 加载状态 */ +.loading { + text-align: center; + padding: 60px 20px; + color: white; +} + +.loading-spinner { + width: 40px; + height: 40px; + border: 3px solid rgba(255, 255, 255, 0.3); + border-top: 3px solid white; + border-radius: 50%; + margin: 0 auto 20px; + animation: spin 1s linear infinite; +} + +.loading p { + font-size: 16px; + opacity: 0.9; +} + +/* 错误状态 */ +.error { + text-align: center; + padding: 60px 20px; + color: white; +} + +.error i { + font-size: 48px; + margin-bottom: 20px; + opacity: 0.8; +} + +.error p { + font-size: 16px; + margin-bottom: 20px; + opacity: 0.9; +} + +.retry-btn { + background: rgba(255, 255, 255, 0.2); + border: 2px solid rgba(255, 255, 255, 0.3); + color: white; + padding: 12px 24px; + border-radius: 25px; + cursor: pointer; + font-size: 14px; + transition: all 0.3s ease; +} + +.retry-btn:hover { + background: rgba(255, 255, 255, 0.3); + border-color: rgba(255, 255, 255, 0.5); +} + +/* 热搜列表 */ +.hot-list { + display: grid; + gap: 16px; +} + +.hot-item { + background: rgba(255, 255, 255, 0.95); + border-radius: 16px; + padding: 20px; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); + transition: all 0.3s ease; + cursor: pointer; + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.2); +} + +.hot-item:hover { + transform: translateY(-4px); + box-shadow: 0 8px 30px rgba(0, 0, 0, 0.15); + background: rgba(255, 255, 255, 1); +} + +.hot-item-header { + display: flex; + align-items: flex-start; + gap: 16px; + margin-bottom: 12px; +} + +.rank-badge { + min-width: 32px; + height: 32px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-weight: 700; + font-size: 14px; + color: white; + flex-shrink: 0; +} + +.rank-badge.top-1 { + background: linear-gradient(135deg, #ff6b6b, #ee5a24); + box-shadow: 0 4px 15px rgba(255, 107, 107, 0.3); +} + +.rank-badge.top-2 { + background: linear-gradient(135deg, #ffa726, #ff7043); + box-shadow: 0 4px 15px rgba(255, 167, 38, 0.3); +} + +.rank-badge.top-3 { + background: linear-gradient(135deg, #ffca28, #ffa000); + box-shadow: 0 4px 15px rgba(255, 202, 40, 0.3); +} + +.rank-badge.normal { + background: linear-gradient(135deg, #7fb069, #a8cc8c); + box-shadow: 0 4px 15px rgba(127, 176, 105, 0.3); +} + +.hot-item-content { + flex: 1; + min-width: 0; +} + +.hot-title { + font-size: 16px; + font-weight: 600; + color: #2d3748; + margin-bottom: 8px; + line-height: 1.4; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.hot-desc { + font-size: 14px; + color: #718096; + line-height: 1.5; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + margin-bottom: 12px; +} + +.hot-meta { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +.hot-score { + display: flex; + align-items: center; + gap: 6px; + color: #7fb069; + font-weight: 600; + font-size: 14px; +} + +.hot-score i { + font-size: 12px; +} + +.hot-avatar { + width: 24px; + height: 24px; + border-radius: 50%; + object-fit: cover; + border: 2px solid rgba(127, 176, 105, 0.2); +} + +/* 底部 */ +.footer { + text-align: center; + padding: 20px 0; + color: rgba(255, 255, 255, 0.8); + font-size: 12px; + line-height: 1.5; +} + +.update-time { + margin-bottom: 4px; + font-weight: 500; +} + +.data-source { + opacity: 0.7; +} + +/* 响应式设计 */ +@media (max-width: 768px) { + .container { + padding: 0 12px; + } + + .header { + padding: 16px 0; + margin-bottom: 16px; + } + + .logo h1 { + font-size: 20px; + } + + .logo i { + font-size: 24px; + } + + .refresh-btn { + width: 40px; + height: 40px; + } + + .refresh-btn i { + font-size: 16px; + } + + .hot-list { + gap: 12px; + } + + .hot-item { + padding: 16px; + } + + .hot-item-header { + gap: 12px; + margin-bottom: 10px; + } + + .rank-badge { + min-width: 28px; + height: 28px; + font-size: 12px; + } + + .hot-title { + font-size: 15px; + } + + .hot-desc { + font-size: 13px; + } + + .hot-score { + font-size: 13px; + } + + .hot-avatar { + width: 20px; + height: 20px; + border: 2px solid rgba(127, 176, 105, 0.2); + } +} + +@media (max-width: 480px) { + .container { + padding: 0 8px; + } + + .hot-item { + padding: 12px; + } + + .hot-title { + font-size: 14px; + } + + .hot-desc { + font-size: 12px; + } +} + +/* 动画效果 */ +.hot-item { + animation: fadeInUp 0.6s ease forwards; + opacity: 0; + transform: translateY(20px); +} + +.hot-item:nth-child(1) { animation-delay: 0.1s; } +.hot-item:nth-child(2) { animation-delay: 0.2s; } +.hot-item:nth-child(3) { animation-delay: 0.3s; } +.hot-item:nth-child(4) { animation-delay: 0.4s; } +.hot-item:nth-child(5) { animation-delay: 0.5s; } +.hot-item:nth-child(n+6) { animation-delay: 0.6s; } + +@keyframes fadeInUp { + to { + opacity: 1; + transform: translateY(0); + } +} + +/* 滚动条样式 */ +::-webkit-scrollbar { + width: 6px; +} + +::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.1); +} + +::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.3); + border-radius: 3px; +} + +::-webkit-scrollbar-thumb:hover { + background: rgba(255, 255, 255, 0.5); } \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/ui.js b/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/ui.js index 89f01bb3..e0a17f53 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/ui.js +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/ui.js @@ -1,354 +1,354 @@ -// UI 渲染和交互模块 -class UIManager { - constructor() { - this.elements = { - loading: document.getElementById('loading'), - error: document.getElementById('error'), - hotList: document.getElementById('hotList'), - refreshBtn: document.getElementById('refreshBtn'), - updateTime: document.getElementById('updateTime') - }; - - this.isLoading = false; - this.initEventListeners(); - } - - // 初始化事件监听器 - initEventListeners() { - // 刷新按钮点击事件 - this.elements.refreshBtn.addEventListener('click', () => { - if (!this.isLoading) { - this.refreshData(); - } - }); - - // 键盘快捷键 - document.addEventListener('keydown', (e) => { - if (e.key === 'F5' || (e.ctrlKey && e.key === 'r')) { - e.preventDefault(); - if (!this.isLoading) { - this.refreshData(); - } - } - }); - - // 下拉刷新(移动端) - this.initPullToRefresh(); - } - - // 初始化下拉刷新 - initPullToRefresh() { - let startY = 0; - let currentY = 0; - let isPulling = false; - const threshold = 80; - - document.addEventListener('touchstart', (e) => { - if (window.scrollY === 0) { - startY = e.touches[0].clientY; - isPulling = true; - } - }); - - document.addEventListener('touchmove', (e) => { - if (isPulling && window.scrollY === 0) { - currentY = e.touches[0].clientY; - const pullDistance = currentY - startY; - - if (pullDistance > 0) { - e.preventDefault(); - - // 添加视觉反馈 - if (pullDistance > threshold) { - this.elements.refreshBtn.style.transform = 'scale(1.1)'; - } else { - this.elements.refreshBtn.style.transform = 'scale(1)'; - } - } - } - }); - - document.addEventListener('touchend', () => { - if (isPulling) { - const pullDistance = currentY - startY; - - if (pullDistance > threshold && !this.isLoading) { - this.refreshData(); - } - - this.elements.refreshBtn.style.transform = 'scale(1)'; - isPulling = false; - } - }); - } - - // 显示加载状态 - showLoading() { - this.isLoading = true; - this.elements.loading.style.display = 'block'; - this.elements.error.style.display = 'none'; - this.elements.hotList.style.display = 'none'; - this.elements.refreshBtn.classList.add('loading'); - } - - // 隐藏加载状态 - hideLoading() { - this.isLoading = false; - this.elements.loading.style.display = 'none'; - this.elements.refreshBtn.classList.remove('loading'); - } - - // 显示错误状态 - showError(message = '获取数据失败,请稍后重试') { - this.hideLoading(); - this.elements.error.style.display = 'block'; - this.elements.hotList.style.display = 'none'; - - const errorText = this.elements.error.querySelector('p'); - if (errorText) { - errorText.textContent = message; - } - } - - // 显示热搜列表 - showHotList() { - this.hideLoading(); - this.elements.error.style.display = 'none'; - this.elements.hotList.style.display = 'grid'; - } - - // 渲染热搜数据 - renderHotTopics(data) { - if (!data || !data.data || !Array.isArray(data.data)) { - this.showError('数据格式错误'); - return; - } - - const hotTopics = data.data; - this.elements.hotList.innerHTML = ''; - - hotTopics.forEach((topic, index) => { - const hotItem = this.createHotItem(topic, index); - this.elements.hotList.appendChild(hotItem); - }); - - this.showHotList(); - this.updateTimestamp(data.isCache); - } - - // 创建热搜项目元素 - createHotItem(topic, index) { - const item = document.createElement('div'); - item.className = 'hot-item'; - item.style.animationDelay = `${index * 0.1}s`; - - // 处理数据 - const rank = topic.rank || (index + 1); - const title = hotTopicsAPI.truncateText(topic.title, 80); - const desc = hotTopicsAPI.truncateText(topic.desc, 120); - const score = hotTopicsAPI.formatScore(topic.score, topic.score_desc); - const avatarUrl = hotTopicsAPI.processImageUrl(topic.avatar); - const topicUrl = hotTopicsAPI.processTopicUrl(topic.url); - const rankClass = hotTopicsAPI.getRankClass(rank); - - item.innerHTML = ` -
      -
      - ${rank} -
      -
      -

      ${title}

      -

      ${desc}

      -
      -
      - - ${score} -
      - ${avatarUrl ? `话题图片` : ''} -
      -
      -
      - `; - - // 添加点击事件 - item.addEventListener('click', () => { - this.openTopic(topicUrl, title); - }); - - // 添加长按事件(移动端) - let pressTimer; - item.addEventListener('touchstart', (e) => { - pressTimer = setTimeout(() => { - this.showTopicMenu(topic, e.touches[0].clientX, e.touches[0].clientY); - }, 500); - }); - - item.addEventListener('touchend', () => { - clearTimeout(pressTimer); - }); - - item.addEventListener('touchmove', () => { - clearTimeout(pressTimer); - }); - - return item; - } - - // 打开话题链接 - openTopic(url, title) { - if (url && url !== '#') { - // 在新窗口打开 - window.open(url, '_blank', 'noopener,noreferrer'); - } else { - this.showToast('链接暂不可用'); - } - } - - // 显示话题菜单(长按) - showTopicMenu(topic, x, y) { - const menu = document.createElement('div'); - menu.className = 'topic-menu'; - menu.style.cssText = ` - position: fixed; - left: ${x}px; - top: ${y}px; - background: white; - border-radius: 8px; - box-shadow: 0 4px 20px rgba(0,0,0,0.2); - padding: 8px 0; - z-index: 1000; - min-width: 120px; - `; - - const actions = [ - { text: '打开链接', action: () => this.openTopic(hotTopicsAPI.processTopicUrl(topic.url), topic.title) }, - { text: '复制标题', action: () => this.copyText(topic.title) }, - { text: '分享', action: () => this.shareContent(topic) } - ]; - - actions.forEach(action => { - const item = document.createElement('div'); - item.textContent = action.text; - item.style.cssText = ` - padding: 12px 16px; - cursor: pointer; - font-size: 14px; - color: #333; - border-bottom: 1px solid #f0f0f0; - `; - item.addEventListener('click', () => { - action.action(); - document.body.removeChild(menu); - }); - menu.appendChild(item); - }); - - document.body.appendChild(menu); - - // 点击其他地方关闭菜单 - setTimeout(() => { - document.addEventListener('click', function closeMenu() { - if (document.body.contains(menu)) { - document.body.removeChild(menu); - } - document.removeEventListener('click', closeMenu); - }); - }, 100); - } - - // 复制文本 - async copyText(text) { - try { - await navigator.clipboard.writeText(text); - this.showToast('已复制到剪贴板'); - } catch (error) { - console.error('复制失败:', error); - this.showToast('复制失败'); - } - } - - // 分享内容 - async shareContent(topic) { - const shareData = { - title: topic.title, - text: topic.desc, - url: hotTopicsAPI.processTopicUrl(topic.url) - }; - - try { - if (navigator.share) { - await navigator.share(shareData); - } else { - // 降级到复制链接 - await this.copyText(`${topic.title} - ${shareData.url}`); - } - } catch (error) { - console.error('分享失败:', error); - } - } - - // 显示提示消息 - showToast(message, duration = 2000) { - const toast = document.createElement('div'); - toast.textContent = message; - toast.style.cssText = ` - position: fixed; - bottom: 20px; - left: 50%; - transform: translateX(-50%); - background: rgba(0,0,0,0.8); - color: white; - padding: 12px 20px; - border-radius: 20px; - font-size: 14px; - z-index: 1000; - animation: fadeInUp 0.3s ease; - `; - - document.body.appendChild(toast); - - setTimeout(() => { - toast.style.animation = 'fadeOut 0.3s ease'; - setTimeout(() => { - if (document.body.contains(toast)) { - document.body.removeChild(toast); - } - }, 300); - }, duration); - } - - // 更新时间戳 - updateTimestamp(isCache = false) { - const now = new Date(); - const timeString = now.toLocaleString('zh-CN', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit' - }); - - const cacheText = isCache ? ' (缓存数据)' : ''; - this.elements.updateTime.textContent = `最后更新:${timeString}${cacheText}`; - } - - // 刷新数据 - async refreshData() { - if (window.loadHotTopics) { - await window.loadHotTopics(); - } - } -} - -// 导出UI管理器实例 -const uiManager = new UIManager(); - -// 添加CSS动画 -const style = document.createElement('style'); -style.textContent = ` - @keyframes fadeOut { - from { opacity: 1; transform: translateX(-50%) translateY(0); } - to { opacity: 0; transform: translateX(-50%) translateY(10px); } - } -`; +// UI 渲染和交互模块 +class UIManager { + constructor() { + this.elements = { + loading: document.getElementById('loading'), + error: document.getElementById('error'), + hotList: document.getElementById('hotList'), + refreshBtn: document.getElementById('refreshBtn'), + updateTime: document.getElementById('updateTime') + }; + + this.isLoading = false; + this.initEventListeners(); + } + + // 初始化事件监听器 + initEventListeners() { + // 刷新按钮点击事件 + this.elements.refreshBtn.addEventListener('click', () => { + if (!this.isLoading) { + this.refreshData(); + } + }); + + // 键盘快捷键 + document.addEventListener('keydown', (e) => { + if (e.key === 'F5' || (e.ctrlKey && e.key === 'r')) { + e.preventDefault(); + if (!this.isLoading) { + this.refreshData(); + } + } + }); + + // 下拉刷新(移动端) + this.initPullToRefresh(); + } + + // 初始化下拉刷新 + initPullToRefresh() { + let startY = 0; + let currentY = 0; + let isPulling = false; + const threshold = 80; + + document.addEventListener('touchstart', (e) => { + if (window.scrollY === 0) { + startY = e.touches[0].clientY; + isPulling = true; + } + }); + + document.addEventListener('touchmove', (e) => { + if (isPulling && window.scrollY === 0) { + currentY = e.touches[0].clientY; + const pullDistance = currentY - startY; + + if (pullDistance > 0) { + e.preventDefault(); + + // 添加视觉反馈 + if (pullDistance > threshold) { + this.elements.refreshBtn.style.transform = 'scale(1.1)'; + } else { + this.elements.refreshBtn.style.transform = 'scale(1)'; + } + } + } + }); + + document.addEventListener('touchend', () => { + if (isPulling) { + const pullDistance = currentY - startY; + + if (pullDistance > threshold && !this.isLoading) { + this.refreshData(); + } + + this.elements.refreshBtn.style.transform = 'scale(1)'; + isPulling = false; + } + }); + } + + // 显示加载状态 + showLoading() { + this.isLoading = true; + this.elements.loading.style.display = 'block'; + this.elements.error.style.display = 'none'; + this.elements.hotList.style.display = 'none'; + this.elements.refreshBtn.classList.add('loading'); + } + + // 隐藏加载状态 + hideLoading() { + this.isLoading = false; + this.elements.loading.style.display = 'none'; + this.elements.refreshBtn.classList.remove('loading'); + } + + // 显示错误状态 + showError(message = '获取数据失败,请稍后重试') { + this.hideLoading(); + this.elements.error.style.display = 'block'; + this.elements.hotList.style.display = 'none'; + + const errorText = this.elements.error.querySelector('p'); + if (errorText) { + errorText.textContent = message; + } + } + + // 显示热搜列表 + showHotList() { + this.hideLoading(); + this.elements.error.style.display = 'none'; + this.elements.hotList.style.display = 'grid'; + } + + // 渲染热搜数据 + renderHotTopics(data) { + if (!data || !data.data || !Array.isArray(data.data)) { + this.showError('数据格式错误'); + return; + } + + const hotTopics = data.data; + this.elements.hotList.innerHTML = ''; + + hotTopics.forEach((topic, index) => { + const hotItem = this.createHotItem(topic, index); + this.elements.hotList.appendChild(hotItem); + }); + + this.showHotList(); + this.updateTimestamp(data.isCache); + } + + // 创建热搜项目元素 + createHotItem(topic, index) { + const item = document.createElement('div'); + item.className = 'hot-item'; + item.style.animationDelay = `${index * 0.1}s`; + + // 处理数据 + const rank = topic.rank || (index + 1); + const title = hotTopicsAPI.truncateText(topic.title, 80); + const desc = hotTopicsAPI.truncateText(topic.desc, 120); + const score = hotTopicsAPI.formatScore(topic.score, topic.score_desc); + const avatarUrl = hotTopicsAPI.processImageUrl(topic.avatar); + const topicUrl = hotTopicsAPI.processTopicUrl(topic.url); + const rankClass = hotTopicsAPI.getRankClass(rank); + + item.innerHTML = ` +
      +
      + ${rank} +
      +
      +

      ${title}

      +

      ${desc}

      +
      +
      + + ${score} +
      + ${avatarUrl ? `话题图片` : ''} +
      +
      +
      + `; + + // 添加点击事件 + item.addEventListener('click', () => { + this.openTopic(topicUrl, title); + }); + + // 添加长按事件(移动端) + let pressTimer; + item.addEventListener('touchstart', (e) => { + pressTimer = setTimeout(() => { + this.showTopicMenu(topic, e.touches[0].clientX, e.touches[0].clientY); + }, 500); + }); + + item.addEventListener('touchend', () => { + clearTimeout(pressTimer); + }); + + item.addEventListener('touchmove', () => { + clearTimeout(pressTimer); + }); + + return item; + } + + // 打开话题链接 + openTopic(url, title) { + if (url && url !== '#') { + // 在新窗口打开 + window.open(url, '_blank', 'noopener,noreferrer'); + } else { + this.showToast('链接暂不可用'); + } + } + + // 显示话题菜单(长按) + showTopicMenu(topic, x, y) { + const menu = document.createElement('div'); + menu.className = 'topic-menu'; + menu.style.cssText = ` + position: fixed; + left: ${x}px; + top: ${y}px; + background: white; + border-radius: 8px; + box-shadow: 0 4px 20px rgba(0,0,0,0.2); + padding: 8px 0; + z-index: 1000; + min-width: 120px; + `; + + const actions = [ + { text: '打开链接', action: () => this.openTopic(hotTopicsAPI.processTopicUrl(topic.url), topic.title) }, + { text: '复制标题', action: () => this.copyText(topic.title) }, + { text: '分享', action: () => this.shareContent(topic) } + ]; + + actions.forEach(action => { + const item = document.createElement('div'); + item.textContent = action.text; + item.style.cssText = ` + padding: 12px 16px; + cursor: pointer; + font-size: 14px; + color: #333; + border-bottom: 1px solid #f0f0f0; + `; + item.addEventListener('click', () => { + action.action(); + document.body.removeChild(menu); + }); + menu.appendChild(item); + }); + + document.body.appendChild(menu); + + // 点击其他地方关闭菜单 + setTimeout(() => { + document.addEventListener('click', function closeMenu() { + if (document.body.contains(menu)) { + document.body.removeChild(menu); + } + document.removeEventListener('click', closeMenu); + }); + }, 100); + } + + // 复制文本 + async copyText(text) { + try { + await navigator.clipboard.writeText(text); + this.showToast('已复制到剪贴板'); + } catch (error) { + console.error('复制失败:', error); + this.showToast('复制失败'); + } + } + + // 分享内容 + async shareContent(topic) { + const shareData = { + title: topic.title, + text: topic.desc, + url: hotTopicsAPI.processTopicUrl(topic.url) + }; + + try { + if (navigator.share) { + await navigator.share(shareData); + } else { + // 降级到复制链接 + await this.copyText(`${topic.title} - ${shareData.url}`); + } + } catch (error) { + console.error('分享失败:', error); + } + } + + // 显示提示消息 + showToast(message, duration = 2000) { + const toast = document.createElement('div'); + toast.textContent = message; + toast.style.cssText = ` + position: fixed; + bottom: 20px; + left: 50%; + transform: translateX(-50%); + background: rgba(0,0,0,0.8); + color: white; + padding: 12px 20px; + border-radius: 20px; + font-size: 14px; + z-index: 1000; + animation: fadeInUp 0.3s ease; + `; + + document.body.appendChild(toast); + + setTimeout(() => { + toast.style.animation = 'fadeOut 0.3s ease'; + setTimeout(() => { + if (document.body.contains(toast)) { + document.body.removeChild(toast); + } + }, 300); + }, duration); + } + + // 更新时间戳 + updateTimestamp(isCache = false) { + const now = new Date(); + const timeString = now.toLocaleString('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit' + }); + + const cacheText = isCache ? ' (缓存数据)' : ''; + this.elements.updateTime.textContent = `最后更新:${timeString}${cacheText}`; + } + + // 刷新数据 + async refreshData() { + if (window.loadHotTopics) { + await window.loadHotTopics(); + } + } +} + +// 导出UI管理器实例 +const uiManager = new UIManager(); + +// 添加CSS动画 +const style = document.createElement('style'); +style.textContent = ` + @keyframes fadeOut { + from { opacity: 1; transform: translateX(-50%) translateY(0); } + to { opacity: 0; transform: translateX(-50%) translateY(10px); } + } +`; document.head.appendChild(style); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/返回接口.json index 7226ba5d..2b5ae003 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/返回接口.json +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/百度贴吧话题榜/返回接口.json @@ -1,306 +1,306 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "rank": 1, - "title": "MAGA喉舌被枪杀,川普为其降半旗", - "desc": "美国知名保守派活动人士、特朗普的政治盟友查理·柯克在大学演讲时遭枪击身亡,特朗普下令全美降半旗致哀。", - "abstract": "美国知名保守派活动人士、特朗普的政治盟友查理·柯克在大学演讲时遭枪击身亡,特朗普下令全美降半旗致哀。", - "score": 1594980, - "score_desc": "159.5w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=7fd9bdea3ad98d1076815f714702803a/a9d3fd1f4134970a614a3b39d3cad1c8a7865dee.jpg?tbpicau=2025-09-22-05_85ec313083b76eb31917067b6948c007", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344923&topic_name=MAGA%E5%96%89%E8%88%8C%E8%A2%AB%E6%9E%AA%E6%9D%80%2C%E5%B7%9D%E6%99%AE%E4%B8%BA%E5%85%B6%E9%99%8D%E5%8D%8A%E6%97%97" - }, - { - "rank": 2, - "title": "上膛!南理工打响整肃伪拳第一枪", - "desc": "终于有学校开了个好头,南京理工大学打响了武汉大学事件之后高校反对极端女权的第一枪。国防七子就是不一样,支持南理工!", - "abstract": "终于有学校开了个好头,南京理工大学打响了武汉大学事件之后高校反对极端女权的第一枪。国防七子就是不一样,支持南理工!", - "score": 1585575, - "score_desc": "158.56w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=45147a89e20f4bfb8c85cd14657240c4/8b13632762d0f703569980ca4efa513d2697c5f9.jpg?tbpicau=2025-09-22-05_8d101b01ab9f7032a8943a8ad9ad3591", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344934&topic_name=%E4%B8%8A%E8%86%9B%21%E5%8D%97%E7%90%86%E5%B7%A5%E6%89%93%E5%93%8D%E6%95%B4%E8%82%83%E4%BC%AA%E6%8B%B3%E7%AC%AC%E4%B8%80%E6%9E%AA" - }, - { - "rank": 3, - "title": "武大暗中篡改?杨某论文再次上架", - "desc": "又反转!武汉大学杨某媛“金牌”论文半夜又偷偷重新上架知网,不会是武大偷改好的版本吧,等热度一过就开始岁月史书?", - "abstract": "又反转!武汉大学杨某媛“金牌”论文半夜又偷偷重新上架知网,不会是武大偷改好的版本吧,等热度一过就开始岁月史书?", - "score": 1265376, - "score_desc": "126.54w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=e3f59fed7fdbb6fd250eb6666f19932c/8601a18b87d6277f2c00192e6e381f30e924fc92.jpg?tbpicau=2025-09-22-05_8c33e404e8488061ca9169977a762457", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344925&topic_name=%E6%AD%A6%E5%A4%A7%E6%9A%97%E4%B8%AD%E7%AF%A1%E6%94%B9%3F%E6%9D%A8%E6%9F%90%E8%AE%BA%E6%96%87%E5%86%8D%E6%AC%A1%E4%B8%8A%E6%9E%B6" - }, - { - "rank": 4, - "title": "兽王关键吼,XG大逆风翻盘石头人", - "desc": "落后1W6翻盘,Xxs刷新兽王关键吼,AME巨魔diff水晶。XG1比0石头人,拿下正赛首局,加油!", - "abstract": "落后1W6翻盘,Xxs刷新兽王关键吼,AME巨魔diff水晶。XG1比0石头人,拿下正赛首局,加油!", - "score": 893943, - "score_desc": "89.39w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=882897db1466d0167e4ccd68f116ec33/86d6277f9e2f070899cb3e16af24b899a801f2de.jpg?tbpicau=2025-09-22-05_625c74153fe7c84accea9ea76d88097b", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344941&topic_name=%E5%85%BD%E7%8E%8B%E5%85%B3%E9%94%AE%E5%90%BC%2CXG%E5%A4%A7%E9%80%86%E9%A3%8E%E7%BF%BB%E7%9B%98%E7%9F%B3%E5%A4%B4%E4%BA%BA" - }, - { - "rank": 5, - "title": "户圣开炮,安卓旗舰谁敢买?", - "desc": "户晨风再现逆天言论,苹果17发布,安卓中高端机遭遇灭顶之灾,两千五以上没人买,有能力的一定要给父母换iPhone!", - "abstract": "户晨风再现逆天言论,苹果17发布,安卓中高端机遭遇灭顶之灾,两千五以上没人买,有能力的一定要给父母换iPhone!", - "score": 766532, - "score_desc": "76.65w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=0eb028f7692eb938ec3829b2b35fbd01/c8177f3e6709c93d2a9825e1d93df8dcd10054b9.jpg?tbpicau=2025-09-22-05_a331d216b4e47c0049889f880fe693e3", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344926&topic_name=%E6%88%B7%E5%9C%A3%E5%BC%80%E7%82%AE%2C%E5%AE%89%E5%8D%93%E6%97%97%E8%88%B0%E8%B0%81%E6%95%A2%E4%B9%B0%3F" - }, - { - "rank": 6, - "title": "成都诬告偷拍败诉!小叶还能怎?", - "desc": "成都地铁诬告偷拍案二审维持原判,追风小叶维权失败,吧友锐评温和派的路走到头了。", - "abstract": "成都地铁诬告偷拍案二审维持原判,追风小叶维权失败,吧友锐评温和派的路走到头了。", - "score": 663175, - "score_desc": "66.32w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=9b41180f6bf5e0feee4dda413a5d0c9c/8694a4c27d1ed21b65aa39f3eb6eddc451da3f40.jpg?tbpicau=2025-09-22-05_db6b89b7846083172cde82c7146ebddc", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344942&topic_name=%E6%88%90%E9%83%BD%E8%AF%AC%E5%91%8A%E5%81%B7%E6%8B%8D%E8%B4%A5%E8%AF%89%21%E5%B0%8F%E5%8F%B6%E8%BF%98%E8%83%BD%E6%80%8E%3F" - }, - { - "rank": 7, - "title": "绝密飙至60w,盾奶开始泛滥", - "desc": "三角洲战备猛涨,玩家钱包 “躺平”!那些攥得紧紧、舍不得动的家底,这下不得不掏出来,打工一局倒贴钱,谁顶得住?", - "abstract": "三角洲战备猛涨,玩家钱包 “躺平”!那些攥得紧紧、舍不得动的家底,这下不得不掏出来,打工一局倒贴钱,谁顶得住?", - "score": 590856, - "score_desc": "59.09w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=61af83ea3ad98d1076815f714702803a/a9d3fd1f4134970a7f3c0539d3cad1c8a7865d5c.jpg?tbpicau=2025-09-22-05_82bc9423e1e1b97f3c071ce96e1cf7e4", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344936&topic_name=%E7%BB%9D%E5%AF%86%E9%A3%99%E8%87%B360w%2C%E7%9B%BE%E5%A5%B6%E5%BC%80%E5%A7%8B%E6%B3%9B%E6%BB%A5" - }, - { - "rank": 8, - "title": "邓紫棋被扒抢闺蜜男友博上位", - "desc": "邓紫棋被曝实锤撬闺蜜墙角,硬生生抢走正与闺蜜浓情蜜意的男友魏俊杰。事后为掩人耳目,还接连拉华晨宇、林宥嘉的绯闻来挡枪,一波操作引得舆论炸开了锅,粉丝纷纷 “跑路” 。", - "abstract": "邓紫棋被曝实锤撬闺蜜墙角,硬生生抢走正与闺蜜浓情蜜意的男友魏俊杰。事后为掩人耳目,还接连拉华晨宇、林宥嘉的绯闻来挡枪,一波操作引得舆论炸开了锅,粉丝纷纷 “跑路” 。", - "score": 506184, - "score_desc": "50.62w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=4d464c04094a20a4314b6f87f66fa016/30adcbef76094b36a2ff0ffbe5cc7cd98d109db2.jpg?tbpicau=2025-09-22-05_ed8c8f84187ef131dbb94421e614577b", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344937&topic_name=%E9%82%93%E7%B4%AB%E6%A3%8B%E8%A2%AB%E6%89%92%E6%8A%A2%E9%97%BA%E8%9C%9C%E7%94%B7%E5%8F%8B%E5%8D%9A%E4%B8%8A%E4%BD%8D" - }, - { - "rank": 9, - "title": "小红书被掘,薯民赛博戒网瘾", - "desc": "今天,网信办对小红书平台采取约谈、责令限期改正、警告、从严处理责任人等处置处罚措施。这下薯民们该何去何从?", - "abstract": "今天,网信办对小红书平台采取约谈、责令限期改正、警告、从严处理责任人等处置处罚措施。这下薯民们该何去何从?", - "score": 471548, - "score_desc": "47.15w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=51c0d93fc018367aaddc2c9d484eb3e0/bf096b63f6246b60eda2a662adf81a4c510fa27c.jpg?tbpicau=2025-09-22-05_61c56fced5303058de8e34d5f5c2f858", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344940&topic_name=%E5%B0%8F%E7%BA%A2%E4%B9%A6%E8%A2%AB%E6%8E%98%2C%E8%96%AF%E6%B0%91%E8%B5%9B%E5%8D%9A%E6%88%92%E7%BD%91%E7%98%BE" - }, - { - "rank": 10, - "title": "以军喊话轰全球:导弹是不长眼的", - "desc": "轰炸卡塔尔后以总理喊话全世界,称自己要效仿美国“9·11”事件后的行动,谁敢窝藏恐怖分子,以色列统统揍个遍!", - "abstract": "轰炸卡塔尔后以总理喊话全世界,称自己要效仿美国“9·11”事件后的行动,谁敢窝藏恐怖分子,以色列统统揍个遍!", - "score": 415002, - "score_desc": "41.5w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=6e77f03535f082022dc7c27f2dc6c3d9/562c11dfa9ec8a13a01b43f6b103918fa0ecc0a7.jpg?tbpicau=2025-09-22-05_492a74721d2be35b494d022729ab3727", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344938&topic_name=%E4%BB%A5%E5%86%9B%E5%96%8A%E8%AF%9D%E8%BD%B0%E5%85%A8%E7%90%83%3A%E5%AF%BC%E5%BC%B9%E6%98%AF%E4%B8%8D%E9%95%BF%E7%9C%BC%E7%9A%84" - }, - { - "rank": 11, - "title": "照抄还耗时?紫龙延迟补偿抠到爆", - "desc": "《第七史诗》紫龙又拉了,都25年了居然在白天维护服务器长达11个小时。延长这么久不说,打发玩家2000体力就想当无事发生,最起码补个光暗自选吧?", - "abstract": "《第七史诗》紫龙又拉了,都25年了居然在白天维护服务器长达11个小时。延长这么久不说,打发玩家2000体力就想当无事发生,最起码补个光暗自选吧?", - "score": 316800, - "score_desc": "31.68w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=4c344da7c60a19d8cb56d74555c7babf/7a899e510fb30f24c22cf8158e95d143ad4b0375.jpg?tbpicau=2025-09-22-05_ea3299a237a4be90f638d6f54ddfaee7", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344939&topic_name=%E7%85%A7%E6%8A%84%E8%BF%98%E8%80%97%E6%97%B6%3F%E7%B4%AB%E9%BE%99%E5%BB%B6%E8%BF%9F%E8%A1%A5%E5%81%BF%E6%8A%A0%E5%88%B0%E7%88%86" - }, - { - "rank": 12, - "title": "苹果是懂得维护韩男自尊心的", - "desc": "苹果市场部很懂韩国国情,还特意把新机海报上的敏感手势去掉了。", - "abstract": "苹果市场部很懂韩国国情,还特意把新机海报上的敏感手势去掉了。", - "score": 296609, - "score_desc": "29.66w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=16bc6dd6c4025aafd3672d8b9dd09350/10dfa9ec8a136327a57fe925d78fa0ec08fac712.jpg?tbpicau=2025-09-22-05_6d1258c530ad80062d801a0cdf3878c4", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344930&topic_name=%E8%8B%B9%E6%9E%9C%E6%98%AF%E6%87%82%E5%BE%97%E7%BB%B4%E6%8A%A4%E9%9F%A9%E7%94%B7%E8%87%AA%E5%B0%8A%E5%BF%83%E7%9A%84" - }, - { - "rank": 13, - "title": "米家胜!二游大逃杀,原神未滑档", - "desc": "国内畅销榜上,一众作品竞逐热度之际,《原神》稳居前列,凭独特玩法持续圈粉。网友直言:原神团队定是藏着 “神人”,决策方向始终正确,精准踩中玩家心巴。", - "abstract": "国内畅销榜上,一众作品竞逐热度之际,《原神》稳居前列,凭独特玩法持续圈粉。网友直言:原神团队定是藏着 “神人”,决策方向始终正确,精准踩中玩家心巴。", - "score": 210780, - "score_desc": "21.08w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=606b285c9cb44aed591beda4d521bf35/f7246b600c3387440d8b046a170fd9f9d72aa05e.jpg?tbpicau=2025-09-22-05_ac66e09b0535bcca38158c54002fa3c7", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344927&topic_name=%E7%B1%B3%E5%AE%B6%E8%83%9C%21%E4%BA%8C%E6%B8%B8%E5%A4%A7%E9%80%83%E6%9D%80%2C%E5%8E%9F%E7%A5%9E%E6%9C%AA%E6%BB%91%E6%A1%A3" - }, - { - "rank": 14, - "title": "秽土转生失败,动漫之家GG", - "desc": "动漫之家,终究还是停运了。起初反复刷新,还以为是网络出了问题,没想到它已经走了有一会儿了。这个无数漫迷的 “秘密基地”,如今却在激烈竞争与种种困境中再也回不来了。", - "abstract": "动漫之家,终究还是停运了。起初反复刷新,还以为是网络出了问题,没想到它已经走了有一会儿了。这个无数漫迷的 “秘密基地”,如今却在激烈竞争与种种困境中再也回不来了。", - "score": 207264, - "score_desc": "20.73w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=0db5d97a563853438c9ad461f52e884a/bd315c6034a85edfb52ed4350f540923dd547501.jpg?tbpicau=2025-09-22-05_9adff68227c9f67304fffc1a2731d758", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344932&topic_name=%E7%A7%BD%E5%9C%9F%E8%BD%AC%E7%94%9F%E5%A4%B1%E8%B4%A5%2C%E5%8A%A8%E6%BC%AB%E4%B9%8B%E5%AE%B6GG" - }, - { - "rank": 15, - "title": "张本两连败大飞,日男全军覆没", - "desc": "WTT澳门冠军赛男单1/16决赛,薛飞把张本智和打静音,横扫日乒一哥晋级,至此日本男队全部出局,这下真爆冷了。", - "abstract": "WTT澳门冠军赛男单1/16决赛,薛飞把张本智和打静音,横扫日乒一哥晋级,至此日本男队全部出局,这下真爆冷了。", - "score": 179152, - "score_desc": "17.92w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=1be7d7b39743ad4ba67b1580e43f629b/0bd162d9f2d3572cd30bb6cacc13632762d0c33f.jpg?tbpicau=2025-09-22-05_c5e594913af43484029ee1ccf719ee0a", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344933&topic_name=%E5%BC%A0%E6%9C%AC%E4%B8%A4%E8%BF%9E%E8%B4%A5%E5%A4%A7%E9%A3%9E%2C%E6%97%A5%E7%94%B7%E5%85%A8%E5%86%9B%E8%A6%86%E6%B2%A1" - }, - { - "rank": 16, - "title": "拳愿323:抽象的征西派内战", - "desc": "拳愿奥米迦323话大更:征西派的裂痕与王马的抉择,爱德华回生能力过于劣质,雷庵表现力太逆天,怕不是要成为决赛圈垫脚石?", - "abstract": "拳愿奥米迦323话大更:征西派的裂痕与王马的抉择,爱德华回生能力过于劣质,雷庵表现力太逆天,怕不是要成为决赛圈垫脚石?", - "score": 144915, - "score_desc": "14.49w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=65d67ff6b103918fd7846e8a37001ea3/b17eca8065380cd797d28afbe744ad34588281d3.jpg?tbpicau=2025-09-22-05_d45822c1109107fa7baacd2b01fefb61", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344924&topic_name=%E6%8B%B3%E6%84%BF323%3A%E6%8A%BD%E8%B1%A1%E7%9A%84%E5%BE%81%E8%A5%BF%E6%B4%BE%E5%86%85%E6%88%98" - }, - { - "rank": 17, - "title": "TES 3-1踩头WBG,灯皇薇恩送好局", - "desc": "LPL季后赛,TES对阵WBG。Light薇恩0输出葬送优势局,Kanavi潘森天降弑神,最终TES 3-1 WBG挺进胜决。", - "abstract": "LPL季后赛,TES对阵WBG。Light薇恩0输出葬送优势局,Kanavi潘森天降弑神,最终TES 3-1 WBG挺进胜决。", - "score": 108556, - "score_desc": "10.86w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=75e5576c66a446237e9ff622fe1f4a3a/caef76094b36acaf361abbea3ad98d1001e99c29.jpg?tbpicau=2025-09-22-05_dda77f28de2da58e81fcd3b6ff5aaacc", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344917&topic_name=TES%203-1%E8%B8%A9%E5%A4%B4WBG%2C%E7%81%AF%E7%9A%87%E8%96%87%E6%81%A9%E9%80%81%E5%A5%BD%E5%B1%80" - }, - { - "rank": 18, - "title": "师出有名,黄岩岛建立保护区", - "desc": "字少事大,国务院批复同意新建黄岩岛国家级自然保护区,隔壁菲猴还敢乱来吗?", - "abstract": "字少事大,国务院批复同意新建黄岩岛国家级自然保护区,隔壁菲猴还敢乱来吗?", - "score": 98280, - "score_desc": "9.83w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=31dba91375fa828bd176cea39b227900/43a7d933c895d14320aec93535f082025baf07cf.jpg?tbpicau=2025-09-22-05_b0badf07bc38a792ed54b85bb056f5aa", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344916&topic_name=%E5%B8%88%E5%87%BA%E6%9C%89%E5%90%8D%2C%E9%BB%84%E5%B2%A9%E5%B2%9B%E5%BB%BA%E7%AB%8B%E4%BF%9D%E6%8A%A4%E5%8C%BA" - }, - { - "rank": 19, - "title": "9月10日乐子限定", - "desc": "沪姐大战彩礼女,年轻人为了台苹果机不择手段,来看看昨天都有哪些乐子。", - "abstract": "沪姐大战彩礼女,年轻人为了台苹果机不择手段,来看看昨天都有哪些乐子。", - "score": 75660, - "score_desc": "7.57w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=f4c1e0dce951f3dec3e7ea24f2d3c82b/c9fcc3cec3fdfc03fb92cbae923f8794a4c22639.jpg?tbpicau=2025-09-22-05_04534fa7edbe9fa62b6c5170f11f6d42", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344922&topic_name=9%E6%9C%8810%E6%97%A5%E4%B9%90%E5%AD%90%E9%99%90%E5%AE%9A" - }, - { - "rank": 20, - "title": "每天一个宝藏吧——meme图吧", - "desc": "一个用梗图交流、靠表情包续命的赛博快乐老家,进来一个meme图小白,出去就是万人敬仰的meme图大师!", - "abstract": "一个用梗图交流、靠表情包续命的赛博快乐老家,进来一个meme图小白,出去就是万人敬仰的meme图大师!", - "score": 64691, - "score_desc": "6.47w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=366db542454f78f0805ec9b31f0c3261/908fa0ec08fa513deb1747c87b6d55fbb2fbd963.jpg?tbpicau=2025-09-22-05_0f79439d4fa718dccec3909f1093b1a0", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344928&topic_name=%E6%AF%8F%E5%A4%A9%E4%B8%80%E4%B8%AA%E5%AE%9D%E8%97%8F%E5%90%A7%E2%80%94%E2%80%94meme%E5%9B%BE%E5%90%A7" - }, - { - "rank": 21, - "title": "向鹏不敌德国选手,无缘十六强", - "desc": "在2025年世界乒乓球职业大联盟澳门冠军赛男子单打首轮比赛中,中国选手向鹏2比3不敌德国选手弗朗西斯卡,无缘16强。", - "abstract": "在2025年世界乒乓球职业大联盟澳门冠军赛男子单打首轮比赛中,中国选手向鹏2比3不敌德国选手弗朗西斯卡,无缘16强。", - "score": 51010, - "score_desc": "5.1w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=5110a6270c90f60304e5cf075f2f8b2f/91529822720e0cf30c5864ed4c46f21fbe09aa7d.jpg?tbpicau=2025-09-22-05_6494ac6b728dc643d62ecdfec9ffc10f", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344931&topic_name=%E5%90%91%E9%B9%8F%E4%B8%8D%E6%95%8C%E5%BE%B7%E5%9B%BD%E9%80%89%E6%89%8B%2C%E6%97%A0%E7%BC%98%E5%8D%81%E5%85%AD%E5%BC%BA" - }, - { - "rank": 22, - "title": "Faker虐爆许秀,T1险胜DK", - "desc": "绝境Faker再现!T1 3-2险胜DK,决胜局T1凭借关键团战逆转取胜。", - "abstract": "绝境Faker再现!T1 3-2险胜DK,决胜局T1凭借关键团战逆转取胜。", - "score": 47646, - "score_desc": "4.76w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=9d867145b0246b607b5be1348dc52278/55e736d12f2eb938b8df55e493628535e5dd6f71.jpg?tbpicau=2025-09-22-05_a1bfae75faab275c23b0f53a0a5b06ef", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344913&topic_name=Faker%E8%99%90%E7%88%86%E8%AE%B8%E7%A7%80%2CT1%E9%99%A9%E8%83%9CDK" - }, - { - "rank": 23, - "title": "张雪峰愿捐款打台独,媒体狂吠狠批", - "desc": "张雪峰说打台独自己捐五千万,大象新闻直接来了个大长篇,上来就给一个普通中国人的朴素爱国情怀扣上“鼓吹战争”的帽子,搞媒体的就这种素质?", - "abstract": "张雪峰说打台独自己捐五千万,大象新闻直接来了个大长篇,上来就给一个普通中国人的朴素爱国情怀扣上“鼓吹战争”的帽子,搞媒体的就这种素质?", - "score": 40064, - "score_desc": "4.01w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=2e4fc1ec3dcb0a468577d8790d5ece10/00e93901213fb80e595042c170d12f2eb9389426.jpg?tbpicau=2025-09-22-05_6e078e9f935aa244e26346ab37187ee2", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344910&topic_name=%E5%BC%A0%E9%9B%AA%E5%B3%B0%E6%84%BF%E6%8D%90%E6%AC%BE%E6%89%93%E5%8F%B0%E7%8B%AC%2C%E5%AA%92%E4%BD%93%E7%8B%82%E5%90%A0%E7%8B%A0%E6%89%B9" - }, - { - "rank": 24, - "title": "美军压境,委内瑞拉急盼歼10C", - "desc": "美军F-35A压境加勒比,委内瑞拉方寸大乱,紧急寻求采购歼10C。", - "abstract": "美军F-35A压境加勒比,委内瑞拉方寸大乱,紧急寻求采购歼10C。", - "score": 38052, - "score_desc": "3.81w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=90d8a718f73533faf5e3c06eceeec52b/0e2442a7d933c8955843b66d971373f0820200e2.jpg?tbpicau=2025-09-22-05_f8126e747fe76e25cfd9b3d3a75d1d54", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344921&topic_name=%E7%BE%8E%E5%86%9B%E5%8E%8B%E5%A2%83%2C%E5%A7%94%E5%86%85%E7%91%9E%E6%8B%89%E6%80%A5%E7%9B%BC%E6%AD%BC10C" - }, - { - "rank": 25, - "title": "真男人!海贼王龙哥射杀天龙人", - "desc": "海贼王1160话情报,龙开枪射击天龙人,救下红发双胞胎。昔日流汗王风评反转,龙哥成为海贼最有种的男人。", - "abstract": "海贼王1160话情报,龙开枪射击天龙人,救下红发双胞胎。昔日流汗王风评反转,龙哥成为海贼最有种的男人。", - "score": 26682, - "score_desc": "2.67w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=f8cb34fbe5cc7cd9fa7867995f3c190b/a71ea8d3fd1f4134c36e2a68631f95cad1c85e4e.jpg?tbpicau=2025-09-22-05_6853585b745b7349ad45ef38cf6df62f", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344920&topic_name=%E7%9C%9F%E7%94%B7%E4%BA%BA%21%E6%B5%B7%E8%B4%BC%E7%8E%8B%E9%BE%99%E5%93%A5%E5%B0%84%E6%9D%80%E5%A4%A9%E9%BE%99%E4%BA%BA" - }, - { - "rank": 26, - "title": "三角洲免费送点券,玩家争当洲孝子", - "desc": "三角洲行动周年庆福利拉满,免费送3900三角券。玩家火速倒戈,暂停讨伐制作组,怒赞策划太良心。", - "abstract": "三角洲行动周年庆福利拉满,免费送3900三角券。玩家火速倒戈,暂停讨伐制作组,怒赞策划太良心。", - "score": 25255, - "score_desc": "2.53w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=c4d99672d2eef01f4d414b8586c3a111/9345d688d43f8794d4946738941b0ef41bd53ab8.jpg?tbpicau=2025-09-22-05_a2046d59aca4681d2f9495edce4c3b25", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344919&topic_name=%E4%B8%89%E8%A7%92%E6%B4%B2%E5%85%8D%E8%B4%B9%E9%80%81%E7%82%B9%E5%88%B8%2C%E7%8E%A9%E5%AE%B6%E4%BA%89%E5%BD%93%E6%B4%B2%E5%AD%9D%E5%AD%90" - }, - { - "rank": 27, - "title": "以空袭卡塔尔,暗杀哈马斯未得逞", - "desc": "以色列对身处卡塔尔首都多哈的哈马斯领导层发动所谓精准打击,并证实哈马斯5名成员死于以军空袭,但以方暗杀哈马斯高层的图谋未能得逞。", - "abstract": "以色列对身处卡塔尔首都多哈的哈马斯领导层发动所谓精准打击,并证实哈马斯5名成员死于以军空袭,但以方暗杀哈马斯高层的图谋未能得逞。", - "score": 20900, - "score_desc": "2.09w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=5eb82d27673fb80e0c84329750ec171a/314e251f95cad1c8f8d7dd31393e6709c93d51b3.jpg?tbpicau=2025-09-22-05_cf088fe88563cb500e0581d892800736", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344898&topic_name=%E4%BB%A5%E7%A9%BA%E8%A2%AD%E5%8D%A1%E5%A1%94%E5%B0%94%2C%E6%9A%97%E6%9D%80%E5%93%88%E9%A9%AC%E6%96%AF%E6%9C%AA%E5%BE%97%E9%80%9E" - }, - { - "rank": 28, - "title": "局座出山,战忽局要开工了?", - "desc": "神隐五年之后,被网友戏称“战略忽悠局局长”的军事评论家张召忠重出江湖参加讲座。国际局势风云变幻,战忽局还有市场吗?", - "abstract": "神隐五年之后,被网友戏称“战略忽悠局局长”的军事评论家张召忠重出江湖参加讲座。国际局势风云变幻,战忽局还有市场吗?", - "score": 20166, - "score_desc": "2.02w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=c4150e6a170fd9f9a04206294310ec1e/d4628535e5dde711bf0262e0e1efce1b9c1661d7.jpg?tbpicau=2025-09-22-05_f7db127146ec115d51ff7ede6261253e", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344903&topic_name=%E5%B1%80%E5%BA%A7%E5%87%BA%E5%B1%B1%2C%E6%88%98%E5%BF%BD%E5%B1%80%E8%A6%81%E5%BC%80%E5%B7%A5%E4%BA%86%3F" - }, - { - "rank": 29, - "title": "丝之歌光速滑跪,更新补丁降难度", - "desc": "《空洞骑士:丝之歌》游戏难度逆天差评不断,制作组官宣更新补丁,前期BOSS难度降低、奖励增加。", - "abstract": "《空洞骑士:丝之歌》游戏难度逆天差评不断,制作组官宣更新补丁,前期BOSS难度降低、奖励增加。", - "score": 14526, - "score_desc": "1.45w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=420c2d34f51bb0518f71e0685047e280/7acb0a46f21fbe098018e2022d600c338744ad66.jpg?tbpicau=2025-09-22-05_95664e9657ba0ab59a428fd9a3db30b7", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344899&topic_name=%E4%B8%9D%E4%B9%8B%E6%AD%8C%E5%85%89%E9%80%9F%E6%BB%91%E8%B7%AA%2C%E6%9B%B4%E6%96%B0%E8%A1%A5%E4%B8%81%E9%99%8D%E9%9A%BE%E5%BA%A6" - }, - { - "rank": 30, - "title": "倭殖入脑,武大再现逆天论文", - "desc": "近日,武汉大学又被挖出一篇关于”传统武士道精神下的女性形象“的逆天论文,武汉大学持续发力,吧友吐槽“武大的文科真是奇迹般的存在 ”", - "abstract": "近日,武汉大学又被挖出一篇关于”传统武士道精神下的女性形象“的逆天论文,武汉大学持续发力,吧友吐槽“武大的文科真是奇迹般的存在 ”", - "score": 13717, - "score_desc": "1.37w", - "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=71b4b4adc1d6277fe94761784e052704/d8f9d72a6059252d229f3d12729b033b5bb5b918.jpg?tbpicau=2025-09-22-05_71986e04f0934ae41569ea8d11844675", - "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344905&topic_name=%E5%80%AD%E6%AE%96%E5%85%A5%E8%84%91%2C%E6%AD%A6%E5%A4%A7%E5%86%8D%E7%8E%B0%E9%80%86%E5%A4%A9%E8%AE%BA%E6%96%87" - } - ] +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": [ + { + "rank": 1, + "title": "MAGA喉舌被枪杀,川普为其降半旗", + "desc": "美国知名保守派活动人士、特朗普的政治盟友查理·柯克在大学演讲时遭枪击身亡,特朗普下令全美降半旗致哀。", + "abstract": "美国知名保守派活动人士、特朗普的政治盟友查理·柯克在大学演讲时遭枪击身亡,特朗普下令全美降半旗致哀。", + "score": 1594980, + "score_desc": "159.5w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=7fd9bdea3ad98d1076815f714702803a/a9d3fd1f4134970a614a3b39d3cad1c8a7865dee.jpg?tbpicau=2025-09-22-05_85ec313083b76eb31917067b6948c007", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344923&topic_name=MAGA%E5%96%89%E8%88%8C%E8%A2%AB%E6%9E%AA%E6%9D%80%2C%E5%B7%9D%E6%99%AE%E4%B8%BA%E5%85%B6%E9%99%8D%E5%8D%8A%E6%97%97" + }, + { + "rank": 2, + "title": "上膛!南理工打响整肃伪拳第一枪", + "desc": "终于有学校开了个好头,南京理工大学打响了武汉大学事件之后高校反对极端女权的第一枪。国防七子就是不一样,支持南理工!", + "abstract": "终于有学校开了个好头,南京理工大学打响了武汉大学事件之后高校反对极端女权的第一枪。国防七子就是不一样,支持南理工!", + "score": 1585575, + "score_desc": "158.56w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=45147a89e20f4bfb8c85cd14657240c4/8b13632762d0f703569980ca4efa513d2697c5f9.jpg?tbpicau=2025-09-22-05_8d101b01ab9f7032a8943a8ad9ad3591", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344934&topic_name=%E4%B8%8A%E8%86%9B%21%E5%8D%97%E7%90%86%E5%B7%A5%E6%89%93%E5%93%8D%E6%95%B4%E8%82%83%E4%BC%AA%E6%8B%B3%E7%AC%AC%E4%B8%80%E6%9E%AA" + }, + { + "rank": 3, + "title": "武大暗中篡改?杨某论文再次上架", + "desc": "又反转!武汉大学杨某媛“金牌”论文半夜又偷偷重新上架知网,不会是武大偷改好的版本吧,等热度一过就开始岁月史书?", + "abstract": "又反转!武汉大学杨某媛“金牌”论文半夜又偷偷重新上架知网,不会是武大偷改好的版本吧,等热度一过就开始岁月史书?", + "score": 1265376, + "score_desc": "126.54w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=e3f59fed7fdbb6fd250eb6666f19932c/8601a18b87d6277f2c00192e6e381f30e924fc92.jpg?tbpicau=2025-09-22-05_8c33e404e8488061ca9169977a762457", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344925&topic_name=%E6%AD%A6%E5%A4%A7%E6%9A%97%E4%B8%AD%E7%AF%A1%E6%94%B9%3F%E6%9D%A8%E6%9F%90%E8%AE%BA%E6%96%87%E5%86%8D%E6%AC%A1%E4%B8%8A%E6%9E%B6" + }, + { + "rank": 4, + "title": "兽王关键吼,XG大逆风翻盘石头人", + "desc": "落后1W6翻盘,Xxs刷新兽王关键吼,AME巨魔diff水晶。XG1比0石头人,拿下正赛首局,加油!", + "abstract": "落后1W6翻盘,Xxs刷新兽王关键吼,AME巨魔diff水晶。XG1比0石头人,拿下正赛首局,加油!", + "score": 893943, + "score_desc": "89.39w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=882897db1466d0167e4ccd68f116ec33/86d6277f9e2f070899cb3e16af24b899a801f2de.jpg?tbpicau=2025-09-22-05_625c74153fe7c84accea9ea76d88097b", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344941&topic_name=%E5%85%BD%E7%8E%8B%E5%85%B3%E9%94%AE%E5%90%BC%2CXG%E5%A4%A7%E9%80%86%E9%A3%8E%E7%BF%BB%E7%9B%98%E7%9F%B3%E5%A4%B4%E4%BA%BA" + }, + { + "rank": 5, + "title": "户圣开炮,安卓旗舰谁敢买?", + "desc": "户晨风再现逆天言论,苹果17发布,安卓中高端机遭遇灭顶之灾,两千五以上没人买,有能力的一定要给父母换iPhone!", + "abstract": "户晨风再现逆天言论,苹果17发布,安卓中高端机遭遇灭顶之灾,两千五以上没人买,有能力的一定要给父母换iPhone!", + "score": 766532, + "score_desc": "76.65w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=0eb028f7692eb938ec3829b2b35fbd01/c8177f3e6709c93d2a9825e1d93df8dcd10054b9.jpg?tbpicau=2025-09-22-05_a331d216b4e47c0049889f880fe693e3", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344926&topic_name=%E6%88%B7%E5%9C%A3%E5%BC%80%E7%82%AE%2C%E5%AE%89%E5%8D%93%E6%97%97%E8%88%B0%E8%B0%81%E6%95%A2%E4%B9%B0%3F" + }, + { + "rank": 6, + "title": "成都诬告偷拍败诉!小叶还能怎?", + "desc": "成都地铁诬告偷拍案二审维持原判,追风小叶维权失败,吧友锐评温和派的路走到头了。", + "abstract": "成都地铁诬告偷拍案二审维持原判,追风小叶维权失败,吧友锐评温和派的路走到头了。", + "score": 663175, + "score_desc": "66.32w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=9b41180f6bf5e0feee4dda413a5d0c9c/8694a4c27d1ed21b65aa39f3eb6eddc451da3f40.jpg?tbpicau=2025-09-22-05_db6b89b7846083172cde82c7146ebddc", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344942&topic_name=%E6%88%90%E9%83%BD%E8%AF%AC%E5%91%8A%E5%81%B7%E6%8B%8D%E8%B4%A5%E8%AF%89%21%E5%B0%8F%E5%8F%B6%E8%BF%98%E8%83%BD%E6%80%8E%3F" + }, + { + "rank": 7, + "title": "绝密飙至60w,盾奶开始泛滥", + "desc": "三角洲战备猛涨,玩家钱包 “躺平”!那些攥得紧紧、舍不得动的家底,这下不得不掏出来,打工一局倒贴钱,谁顶得住?", + "abstract": "三角洲战备猛涨,玩家钱包 “躺平”!那些攥得紧紧、舍不得动的家底,这下不得不掏出来,打工一局倒贴钱,谁顶得住?", + "score": 590856, + "score_desc": "59.09w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=61af83ea3ad98d1076815f714702803a/a9d3fd1f4134970a7f3c0539d3cad1c8a7865d5c.jpg?tbpicau=2025-09-22-05_82bc9423e1e1b97f3c071ce96e1cf7e4", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344936&topic_name=%E7%BB%9D%E5%AF%86%E9%A3%99%E8%87%B360w%2C%E7%9B%BE%E5%A5%B6%E5%BC%80%E5%A7%8B%E6%B3%9B%E6%BB%A5" + }, + { + "rank": 8, + "title": "邓紫棋被扒抢闺蜜男友博上位", + "desc": "邓紫棋被曝实锤撬闺蜜墙角,硬生生抢走正与闺蜜浓情蜜意的男友魏俊杰。事后为掩人耳目,还接连拉华晨宇、林宥嘉的绯闻来挡枪,一波操作引得舆论炸开了锅,粉丝纷纷 “跑路” 。", + "abstract": "邓紫棋被曝实锤撬闺蜜墙角,硬生生抢走正与闺蜜浓情蜜意的男友魏俊杰。事后为掩人耳目,还接连拉华晨宇、林宥嘉的绯闻来挡枪,一波操作引得舆论炸开了锅,粉丝纷纷 “跑路” 。", + "score": 506184, + "score_desc": "50.62w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=4d464c04094a20a4314b6f87f66fa016/30adcbef76094b36a2ff0ffbe5cc7cd98d109db2.jpg?tbpicau=2025-09-22-05_ed8c8f84187ef131dbb94421e614577b", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344937&topic_name=%E9%82%93%E7%B4%AB%E6%A3%8B%E8%A2%AB%E6%89%92%E6%8A%A2%E9%97%BA%E8%9C%9C%E7%94%B7%E5%8F%8B%E5%8D%9A%E4%B8%8A%E4%BD%8D" + }, + { + "rank": 9, + "title": "小红书被掘,薯民赛博戒网瘾", + "desc": "今天,网信办对小红书平台采取约谈、责令限期改正、警告、从严处理责任人等处置处罚措施。这下薯民们该何去何从?", + "abstract": "今天,网信办对小红书平台采取约谈、责令限期改正、警告、从严处理责任人等处置处罚措施。这下薯民们该何去何从?", + "score": 471548, + "score_desc": "47.15w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=51c0d93fc018367aaddc2c9d484eb3e0/bf096b63f6246b60eda2a662adf81a4c510fa27c.jpg?tbpicau=2025-09-22-05_61c56fced5303058de8e34d5f5c2f858", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344940&topic_name=%E5%B0%8F%E7%BA%A2%E4%B9%A6%E8%A2%AB%E6%8E%98%2C%E8%96%AF%E6%B0%91%E8%B5%9B%E5%8D%9A%E6%88%92%E7%BD%91%E7%98%BE" + }, + { + "rank": 10, + "title": "以军喊话轰全球:导弹是不长眼的", + "desc": "轰炸卡塔尔后以总理喊话全世界,称自己要效仿美国“9·11”事件后的行动,谁敢窝藏恐怖分子,以色列统统揍个遍!", + "abstract": "轰炸卡塔尔后以总理喊话全世界,称自己要效仿美国“9·11”事件后的行动,谁敢窝藏恐怖分子,以色列统统揍个遍!", + "score": 415002, + "score_desc": "41.5w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=6e77f03535f082022dc7c27f2dc6c3d9/562c11dfa9ec8a13a01b43f6b103918fa0ecc0a7.jpg?tbpicau=2025-09-22-05_492a74721d2be35b494d022729ab3727", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344938&topic_name=%E4%BB%A5%E5%86%9B%E5%96%8A%E8%AF%9D%E8%BD%B0%E5%85%A8%E7%90%83%3A%E5%AF%BC%E5%BC%B9%E6%98%AF%E4%B8%8D%E9%95%BF%E7%9C%BC%E7%9A%84" + }, + { + "rank": 11, + "title": "照抄还耗时?紫龙延迟补偿抠到爆", + "desc": "《第七史诗》紫龙又拉了,都25年了居然在白天维护服务器长达11个小时。延长这么久不说,打发玩家2000体力就想当无事发生,最起码补个光暗自选吧?", + "abstract": "《第七史诗》紫龙又拉了,都25年了居然在白天维护服务器长达11个小时。延长这么久不说,打发玩家2000体力就想当无事发生,最起码补个光暗自选吧?", + "score": 316800, + "score_desc": "31.68w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=4c344da7c60a19d8cb56d74555c7babf/7a899e510fb30f24c22cf8158e95d143ad4b0375.jpg?tbpicau=2025-09-22-05_ea3299a237a4be90f638d6f54ddfaee7", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344939&topic_name=%E7%85%A7%E6%8A%84%E8%BF%98%E8%80%97%E6%97%B6%3F%E7%B4%AB%E9%BE%99%E5%BB%B6%E8%BF%9F%E8%A1%A5%E5%81%BF%E6%8A%A0%E5%88%B0%E7%88%86" + }, + { + "rank": 12, + "title": "苹果是懂得维护韩男自尊心的", + "desc": "苹果市场部很懂韩国国情,还特意把新机海报上的敏感手势去掉了。", + "abstract": "苹果市场部很懂韩国国情,还特意把新机海报上的敏感手势去掉了。", + "score": 296609, + "score_desc": "29.66w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=16bc6dd6c4025aafd3672d8b9dd09350/10dfa9ec8a136327a57fe925d78fa0ec08fac712.jpg?tbpicau=2025-09-22-05_6d1258c530ad80062d801a0cdf3878c4", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344930&topic_name=%E8%8B%B9%E6%9E%9C%E6%98%AF%E6%87%82%E5%BE%97%E7%BB%B4%E6%8A%A4%E9%9F%A9%E7%94%B7%E8%87%AA%E5%B0%8A%E5%BF%83%E7%9A%84" + }, + { + "rank": 13, + "title": "米家胜!二游大逃杀,原神未滑档", + "desc": "国内畅销榜上,一众作品竞逐热度之际,《原神》稳居前列,凭独特玩法持续圈粉。网友直言:原神团队定是藏着 “神人”,决策方向始终正确,精准踩中玩家心巴。", + "abstract": "国内畅销榜上,一众作品竞逐热度之际,《原神》稳居前列,凭独特玩法持续圈粉。网友直言:原神团队定是藏着 “神人”,决策方向始终正确,精准踩中玩家心巴。", + "score": 210780, + "score_desc": "21.08w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=606b285c9cb44aed591beda4d521bf35/f7246b600c3387440d8b046a170fd9f9d72aa05e.jpg?tbpicau=2025-09-22-05_ac66e09b0535bcca38158c54002fa3c7", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344927&topic_name=%E7%B1%B3%E5%AE%B6%E8%83%9C%21%E4%BA%8C%E6%B8%B8%E5%A4%A7%E9%80%83%E6%9D%80%2C%E5%8E%9F%E7%A5%9E%E6%9C%AA%E6%BB%91%E6%A1%A3" + }, + { + "rank": 14, + "title": "秽土转生失败,动漫之家GG", + "desc": "动漫之家,终究还是停运了。起初反复刷新,还以为是网络出了问题,没想到它已经走了有一会儿了。这个无数漫迷的 “秘密基地”,如今却在激烈竞争与种种困境中再也回不来了。", + "abstract": "动漫之家,终究还是停运了。起初反复刷新,还以为是网络出了问题,没想到它已经走了有一会儿了。这个无数漫迷的 “秘密基地”,如今却在激烈竞争与种种困境中再也回不来了。", + "score": 207264, + "score_desc": "20.73w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=0db5d97a563853438c9ad461f52e884a/bd315c6034a85edfb52ed4350f540923dd547501.jpg?tbpicau=2025-09-22-05_9adff68227c9f67304fffc1a2731d758", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344932&topic_name=%E7%A7%BD%E5%9C%9F%E8%BD%AC%E7%94%9F%E5%A4%B1%E8%B4%A5%2C%E5%8A%A8%E6%BC%AB%E4%B9%8B%E5%AE%B6GG" + }, + { + "rank": 15, + "title": "张本两连败大飞,日男全军覆没", + "desc": "WTT澳门冠军赛男单1/16决赛,薛飞把张本智和打静音,横扫日乒一哥晋级,至此日本男队全部出局,这下真爆冷了。", + "abstract": "WTT澳门冠军赛男单1/16决赛,薛飞把张本智和打静音,横扫日乒一哥晋级,至此日本男队全部出局,这下真爆冷了。", + "score": 179152, + "score_desc": "17.92w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=1be7d7b39743ad4ba67b1580e43f629b/0bd162d9f2d3572cd30bb6cacc13632762d0c33f.jpg?tbpicau=2025-09-22-05_c5e594913af43484029ee1ccf719ee0a", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344933&topic_name=%E5%BC%A0%E6%9C%AC%E4%B8%A4%E8%BF%9E%E8%B4%A5%E5%A4%A7%E9%A3%9E%2C%E6%97%A5%E7%94%B7%E5%85%A8%E5%86%9B%E8%A6%86%E6%B2%A1" + }, + { + "rank": 16, + "title": "拳愿323:抽象的征西派内战", + "desc": "拳愿奥米迦323话大更:征西派的裂痕与王马的抉择,爱德华回生能力过于劣质,雷庵表现力太逆天,怕不是要成为决赛圈垫脚石?", + "abstract": "拳愿奥米迦323话大更:征西派的裂痕与王马的抉择,爱德华回生能力过于劣质,雷庵表现力太逆天,怕不是要成为决赛圈垫脚石?", + "score": 144915, + "score_desc": "14.49w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=65d67ff6b103918fd7846e8a37001ea3/b17eca8065380cd797d28afbe744ad34588281d3.jpg?tbpicau=2025-09-22-05_d45822c1109107fa7baacd2b01fefb61", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344924&topic_name=%E6%8B%B3%E6%84%BF323%3A%E6%8A%BD%E8%B1%A1%E7%9A%84%E5%BE%81%E8%A5%BF%E6%B4%BE%E5%86%85%E6%88%98" + }, + { + "rank": 17, + "title": "TES 3-1踩头WBG,灯皇薇恩送好局", + "desc": "LPL季后赛,TES对阵WBG。Light薇恩0输出葬送优势局,Kanavi潘森天降弑神,最终TES 3-1 WBG挺进胜决。", + "abstract": "LPL季后赛,TES对阵WBG。Light薇恩0输出葬送优势局,Kanavi潘森天降弑神,最终TES 3-1 WBG挺进胜决。", + "score": 108556, + "score_desc": "10.86w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=75e5576c66a446237e9ff622fe1f4a3a/caef76094b36acaf361abbea3ad98d1001e99c29.jpg?tbpicau=2025-09-22-05_dda77f28de2da58e81fcd3b6ff5aaacc", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344917&topic_name=TES%203-1%E8%B8%A9%E5%A4%B4WBG%2C%E7%81%AF%E7%9A%87%E8%96%87%E6%81%A9%E9%80%81%E5%A5%BD%E5%B1%80" + }, + { + "rank": 18, + "title": "师出有名,黄岩岛建立保护区", + "desc": "字少事大,国务院批复同意新建黄岩岛国家级自然保护区,隔壁菲猴还敢乱来吗?", + "abstract": "字少事大,国务院批复同意新建黄岩岛国家级自然保护区,隔壁菲猴还敢乱来吗?", + "score": 98280, + "score_desc": "9.83w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=31dba91375fa828bd176cea39b227900/43a7d933c895d14320aec93535f082025baf07cf.jpg?tbpicau=2025-09-22-05_b0badf07bc38a792ed54b85bb056f5aa", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344916&topic_name=%E5%B8%88%E5%87%BA%E6%9C%89%E5%90%8D%2C%E9%BB%84%E5%B2%A9%E5%B2%9B%E5%BB%BA%E7%AB%8B%E4%BF%9D%E6%8A%A4%E5%8C%BA" + }, + { + "rank": 19, + "title": "9月10日乐子限定", + "desc": "沪姐大战彩礼女,年轻人为了台苹果机不择手段,来看看昨天都有哪些乐子。", + "abstract": "沪姐大战彩礼女,年轻人为了台苹果机不择手段,来看看昨天都有哪些乐子。", + "score": 75660, + "score_desc": "7.57w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=f4c1e0dce951f3dec3e7ea24f2d3c82b/c9fcc3cec3fdfc03fb92cbae923f8794a4c22639.jpg?tbpicau=2025-09-22-05_04534fa7edbe9fa62b6c5170f11f6d42", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344922&topic_name=9%E6%9C%8810%E6%97%A5%E4%B9%90%E5%AD%90%E9%99%90%E5%AE%9A" + }, + { + "rank": 20, + "title": "每天一个宝藏吧——meme图吧", + "desc": "一个用梗图交流、靠表情包续命的赛博快乐老家,进来一个meme图小白,出去就是万人敬仰的meme图大师!", + "abstract": "一个用梗图交流、靠表情包续命的赛博快乐老家,进来一个meme图小白,出去就是万人敬仰的meme图大师!", + "score": 64691, + "score_desc": "6.47w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=366db542454f78f0805ec9b31f0c3261/908fa0ec08fa513deb1747c87b6d55fbb2fbd963.jpg?tbpicau=2025-09-22-05_0f79439d4fa718dccec3909f1093b1a0", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344928&topic_name=%E6%AF%8F%E5%A4%A9%E4%B8%80%E4%B8%AA%E5%AE%9D%E8%97%8F%E5%90%A7%E2%80%94%E2%80%94meme%E5%9B%BE%E5%90%A7" + }, + { + "rank": 21, + "title": "向鹏不敌德国选手,无缘十六强", + "desc": "在2025年世界乒乓球职业大联盟澳门冠军赛男子单打首轮比赛中,中国选手向鹏2比3不敌德国选手弗朗西斯卡,无缘16强。", + "abstract": "在2025年世界乒乓球职业大联盟澳门冠军赛男子单打首轮比赛中,中国选手向鹏2比3不敌德国选手弗朗西斯卡,无缘16强。", + "score": 51010, + "score_desc": "5.1w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=5110a6270c90f60304e5cf075f2f8b2f/91529822720e0cf30c5864ed4c46f21fbe09aa7d.jpg?tbpicau=2025-09-22-05_6494ac6b728dc643d62ecdfec9ffc10f", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344931&topic_name=%E5%90%91%E9%B9%8F%E4%B8%8D%E6%95%8C%E5%BE%B7%E5%9B%BD%E9%80%89%E6%89%8B%2C%E6%97%A0%E7%BC%98%E5%8D%81%E5%85%AD%E5%BC%BA" + }, + { + "rank": 22, + "title": "Faker虐爆许秀,T1险胜DK", + "desc": "绝境Faker再现!T1 3-2险胜DK,决胜局T1凭借关键团战逆转取胜。", + "abstract": "绝境Faker再现!T1 3-2险胜DK,决胜局T1凭借关键团战逆转取胜。", + "score": 47646, + "score_desc": "4.76w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=9d867145b0246b607b5be1348dc52278/55e736d12f2eb938b8df55e493628535e5dd6f71.jpg?tbpicau=2025-09-22-05_a1bfae75faab275c23b0f53a0a5b06ef", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344913&topic_name=Faker%E8%99%90%E7%88%86%E8%AE%B8%E7%A7%80%2CT1%E9%99%A9%E8%83%9CDK" + }, + { + "rank": 23, + "title": "张雪峰愿捐款打台独,媒体狂吠狠批", + "desc": "张雪峰说打台独自己捐五千万,大象新闻直接来了个大长篇,上来就给一个普通中国人的朴素爱国情怀扣上“鼓吹战争”的帽子,搞媒体的就这种素质?", + "abstract": "张雪峰说打台独自己捐五千万,大象新闻直接来了个大长篇,上来就给一个普通中国人的朴素爱国情怀扣上“鼓吹战争”的帽子,搞媒体的就这种素质?", + "score": 40064, + "score_desc": "4.01w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=2e4fc1ec3dcb0a468577d8790d5ece10/00e93901213fb80e595042c170d12f2eb9389426.jpg?tbpicau=2025-09-22-05_6e078e9f935aa244e26346ab37187ee2", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344910&topic_name=%E5%BC%A0%E9%9B%AA%E5%B3%B0%E6%84%BF%E6%8D%90%E6%AC%BE%E6%89%93%E5%8F%B0%E7%8B%AC%2C%E5%AA%92%E4%BD%93%E7%8B%82%E5%90%A0%E7%8B%A0%E6%89%B9" + }, + { + "rank": 24, + "title": "美军压境,委内瑞拉急盼歼10C", + "desc": "美军F-35A压境加勒比,委内瑞拉方寸大乱,紧急寻求采购歼10C。", + "abstract": "美军F-35A压境加勒比,委内瑞拉方寸大乱,紧急寻求采购歼10C。", + "score": 38052, + "score_desc": "3.81w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=90d8a718f73533faf5e3c06eceeec52b/0e2442a7d933c8955843b66d971373f0820200e2.jpg?tbpicau=2025-09-22-05_f8126e747fe76e25cfd9b3d3a75d1d54", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344921&topic_name=%E7%BE%8E%E5%86%9B%E5%8E%8B%E5%A2%83%2C%E5%A7%94%E5%86%85%E7%91%9E%E6%8B%89%E6%80%A5%E7%9B%BC%E6%AD%BC10C" + }, + { + "rank": 25, + "title": "真男人!海贼王龙哥射杀天龙人", + "desc": "海贼王1160话情报,龙开枪射击天龙人,救下红发双胞胎。昔日流汗王风评反转,龙哥成为海贼最有种的男人。", + "abstract": "海贼王1160话情报,龙开枪射击天龙人,救下红发双胞胎。昔日流汗王风评反转,龙哥成为海贼最有种的男人。", + "score": 26682, + "score_desc": "2.67w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=f8cb34fbe5cc7cd9fa7867995f3c190b/a71ea8d3fd1f4134c36e2a68631f95cad1c85e4e.jpg?tbpicau=2025-09-22-05_6853585b745b7349ad45ef38cf6df62f", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344920&topic_name=%E7%9C%9F%E7%94%B7%E4%BA%BA%21%E6%B5%B7%E8%B4%BC%E7%8E%8B%E9%BE%99%E5%93%A5%E5%B0%84%E6%9D%80%E5%A4%A9%E9%BE%99%E4%BA%BA" + }, + { + "rank": 26, + "title": "三角洲免费送点券,玩家争当洲孝子", + "desc": "三角洲行动周年庆福利拉满,免费送3900三角券。玩家火速倒戈,暂停讨伐制作组,怒赞策划太良心。", + "abstract": "三角洲行动周年庆福利拉满,免费送3900三角券。玩家火速倒戈,暂停讨伐制作组,怒赞策划太良心。", + "score": 25255, + "score_desc": "2.53w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=c4d99672d2eef01f4d414b8586c3a111/9345d688d43f8794d4946738941b0ef41bd53ab8.jpg?tbpicau=2025-09-22-05_a2046d59aca4681d2f9495edce4c3b25", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344919&topic_name=%E4%B8%89%E8%A7%92%E6%B4%B2%E5%85%8D%E8%B4%B9%E9%80%81%E7%82%B9%E5%88%B8%2C%E7%8E%A9%E5%AE%B6%E4%BA%89%E5%BD%93%E6%B4%B2%E5%AD%9D%E5%AD%90" + }, + { + "rank": 27, + "title": "以空袭卡塔尔,暗杀哈马斯未得逞", + "desc": "以色列对身处卡塔尔首都多哈的哈马斯领导层发动所谓精准打击,并证实哈马斯5名成员死于以军空袭,但以方暗杀哈马斯高层的图谋未能得逞。", + "abstract": "以色列对身处卡塔尔首都多哈的哈马斯领导层发动所谓精准打击,并证实哈马斯5名成员死于以军空袭,但以方暗杀哈马斯高层的图谋未能得逞。", + "score": 20900, + "score_desc": "2.09w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=5eb82d27673fb80e0c84329750ec171a/314e251f95cad1c8f8d7dd31393e6709c93d51b3.jpg?tbpicau=2025-09-22-05_cf088fe88563cb500e0581d892800736", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344898&topic_name=%E4%BB%A5%E7%A9%BA%E8%A2%AD%E5%8D%A1%E5%A1%94%E5%B0%94%2C%E6%9A%97%E6%9D%80%E5%93%88%E9%A9%AC%E6%96%AF%E6%9C%AA%E5%BE%97%E9%80%9E" + }, + { + "rank": 28, + "title": "局座出山,战忽局要开工了?", + "desc": "神隐五年之后,被网友戏称“战略忽悠局局长”的军事评论家张召忠重出江湖参加讲座。国际局势风云变幻,战忽局还有市场吗?", + "abstract": "神隐五年之后,被网友戏称“战略忽悠局局长”的军事评论家张召忠重出江湖参加讲座。国际局势风云变幻,战忽局还有市场吗?", + "score": 20166, + "score_desc": "2.02w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=c4150e6a170fd9f9a04206294310ec1e/d4628535e5dde711bf0262e0e1efce1b9c1661d7.jpg?tbpicau=2025-09-22-05_f7db127146ec115d51ff7ede6261253e", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344903&topic_name=%E5%B1%80%E5%BA%A7%E5%87%BA%E5%B1%B1%2C%E6%88%98%E5%BF%BD%E5%B1%80%E8%A6%81%E5%BC%80%E5%B7%A5%E4%BA%86%3F" + }, + { + "rank": 29, + "title": "丝之歌光速滑跪,更新补丁降难度", + "desc": "《空洞骑士:丝之歌》游戏难度逆天差评不断,制作组官宣更新补丁,前期BOSS难度降低、奖励增加。", + "abstract": "《空洞骑士:丝之歌》游戏难度逆天差评不断,制作组官宣更新补丁,前期BOSS难度降低、奖励增加。", + "score": 14526, + "score_desc": "1.45w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=420c2d34f51bb0518f71e0685047e280/7acb0a46f21fbe098018e2022d600c338744ad66.jpg?tbpicau=2025-09-22-05_95664e9657ba0ab59a428fd9a3db30b7", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344899&topic_name=%E4%B8%9D%E4%B9%8B%E6%AD%8C%E5%85%89%E9%80%9F%E6%BB%91%E8%B7%AA%2C%E6%9B%B4%E6%96%B0%E8%A1%A5%E4%B8%81%E9%99%8D%E9%9A%BE%E5%BA%A6" + }, + { + "rank": 30, + "title": "倭殖入脑,武大再现逆天论文", + "desc": "近日,武汉大学又被挖出一篇关于”传统武士道精神下的女性形象“的逆天论文,武汉大学持续发力,吧友吐槽“武大的文科真是奇迹般的存在 ”", + "abstract": "近日,武汉大学又被挖出一篇关于”传统武士道精神下的女性形象“的逆天论文,武汉大学持续发力,吧友吐槽“武大的文科真是奇迹般的存在 ”", + "score": 13717, + "score_desc": "1.37w", + "avatar": "https://tiebapic.baidu.com/forum/whfpf%3D84%2C88%2C40%3Bq%3D90/sign=71b4b4adc1d6277fe94761784e052704/d8f9d72a6059252d229f3d12729b033b5bb5b918.jpg?tbpicau=2025-09-22-05_71986e04f0934ae41569ea8d11844675", + "url": "https://tieba.baidu.com/hottopic/browse/hottopic?topic_id=28344905&topic_name=%E5%80%AD%E6%AE%96%E5%85%A5%E8%84%91%2C%E6%AD%A6%E5%A4%A7%E5%86%8D%E7%8E%B0%E9%80%86%E5%A4%A9%E8%AE%BA%E6%96%87" + } + ] } \ 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 000933fd..c7e0ed7d 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/css/background.css +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/css/background.css @@ -1,108 +1,108 @@ -.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(0, 132, 255, 0.4) 0%, - rgba(0, 132, 255, 0.3) 25%, - rgba(0, 132, 255, 0.2) 50%, - rgba(0, 132, 255, 0.3) 75%, - rgba(0, 132, 255, 0.4) 100% - ); - animation: gradient-flow 20s ease-in-out infinite; - border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; -} - -.green-gradient::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: radial-gradient( - circle at 30% 70%, - rgba(139, 195, 74, 0.4) 0%, - transparent 50% - ), radial-gradient( - circle at 70% 30%, - rgba(102, 187, 106, 0.3) 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(0, 132, 255, 0.4) 0%, + rgba(0, 132, 255, 0.3) 25%, + rgba(0, 132, 255, 0.2) 50%, + rgba(0, 132, 255, 0.3) 75%, + rgba(0, 132, 255, 0.4) 100% + ); + animation: gradient-flow 20s ease-in-out infinite; + border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; +} + +.green-gradient::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: radial-gradient( + circle at 30% 70%, + rgba(139, 195, 74, 0.4) 0%, + transparent 50% + ), radial-gradient( + circle at 70% 30%, + rgba(102, 187, 106, 0.3) 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 9ff299ee..1b3fbd3c 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/css/style.css +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/css/style.css @@ -1,574 +1,574 @@ -/* 背景样式 */ -.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; - line-height: 1.6; -} - -.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; -} - -/* 新增样式 */ -.topic-header { - display: flex; - flex-wrap: wrap; - align-items: flex-start; - width: 100%; -} - -/* 短内容时的布局 - 图片在右侧 */ -.topic-header.short-content { - flex-direction: row; -} - -/* 长内容时的布局 - 图片在下方 */ -.topic-header.long-content { - flex-direction: column; -} - -.topic-rank { - font-size: 1.2rem; - font-weight: bold; - color: #4096ff; - margin-right: 16px; - min-width: 36px; - text-align: center; - background-color: rgba(64, 169, 255, 0.1); - border-radius: 50%; - width: 36px; - height: 36px; - display: flex; - align-items: center; - justify-content: center; -} - -.topic-rank.top-1 { - background: linear-gradient(135deg, #ff4d4f, #ff7a45); - color: white; -} - -.topic-rank.top-2 { - background: linear-gradient(135deg, #ff7a45, #ffa940); - color: white; -} - -.topic-rank.top-3 { - background: linear-gradient(135deg, #ffa940, #ffec3d); - color: white; -} - -.topic-content { - flex: 1; - padding-right: 16px; -} - -.topic-title { - font-size: 1.15rem; - margin-bottom: 8px; - color: #333; - text-decoration: none; - display: block; - line-height: 1.5; - font-weight: 600; - transition: color 0.2s ease; -} - -.topic-title:hover { - color: #4096ff; -} - -.topic-detail { - color: #666; - font-size: 0.95rem; - line-height: 1.6; - margin-bottom: 10px; - text-align: justify; - text-indent: 2em; -} - -.topic-stats { - display: flex; - flex-wrap: wrap; - gap: 12px; - margin-top: 8px; - font-size: 0.85rem; - color: #666; -} - -.stat-item { - display: flex; - align-items: center; -} - -.hot-value { - color: #ff4d4f; - font-weight: 500; -} - -/* 短内容时的图片样式 - 在右侧 */ -.short-content .topic-cover { - width: 120px; - height: 80px; - object-fit: cover; - border-radius: 8px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); - align-self: center; - margin-left: auto; -} - -/* 长内容时的图片样式 - 在下方 */ -.long-content .topic-cover { - width: 100%; - height: auto; - max-height: none; - object-fit: contain; - border-radius: 8px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); - margin-top: 12px; - margin-left: 0; - margin-bottom: 8px; -} - -.topic-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; - border: 1px solid rgba(0, 0, 0, 0.03); -} - -.topic-item:hover { - transform: translateY(-3px); - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08); - border-color: rgba(64, 169, 255, 0.3); -} - -/* 响应式设计 */ -@media (max-width: 1024px) and (min-width: 768px) { - .container { - max-width: 90%; - padding: 20px; - } - - header h1 { - font-size: 2.2rem; - } - - .topic-item { - padding: 18px; - } - - .topic-title { - font-size: 1.1rem; - } - - .topic-cover { - width: 100px; - height: 70px; - } -} - -@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; - } - - .topic-item { - padding: 16px; - margin-bottom: 12px; - border-radius: 10px; - } - - .topic-rank { - font-size: 1.1rem; - margin-right: 14px; - min-width: 32px; - width: 32px; - height: 32px; - } - - .topic-title { - font-size: 1rem; - line-height: 1.5; - margin-bottom: 6px; - } - - .topic-cover { - width: 90px; - height: 65px; - } - - footer { - margin-top: 24px; - padding-top: 16px; - font-size: 0.85rem; - } -} - -@media (max-width: 480px) { - body { - overflow-x: hidden; - } - - .container { - margin: 8px; - padding: 12px; - max-width: calc(100vw - 16px); - width: calc(100vw - 16px); - } - - header { - margin-bottom: 20px; - padding-bottom: 16px; - } - - header h1 { - font-size: 1.5rem; - margin-bottom: 10px; - } - - .update-time { - font-size: 0.8rem; - padding: 6px 12px; - } - - .topic-item { - padding: 14px; - margin-bottom: 12px; - width: 100%; - min-width: 0; - } - - .topic-header { - width: 100%; - min-width: 0; - } - - .topic-rank { - font-size: 1rem; - margin-right: 12px; - min-width: 30px; - width: 30px; - height: 30px; - flex-shrink: 0; - } - - .topic-content { - flex: 1; - min-width: 0; - padding-right: 12px; - } - - .topic-title { - font-size: 0.95rem; - line-height: 1.4; - word-break: break-all; - overflow: hidden; - text-overflow: ellipsis; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - } - - .topic-detail { - font-size: 0.85rem; - line-height: 1.5; - margin-bottom: 8px; - word-break: break-all; - overflow: hidden; - text-overflow: ellipsis; - display: -webkit-box; - -webkit-line-clamp: 3; - -webkit-box-orient: vertical; - } - - .topic-stats { - gap: 8px; - font-size: 0.75rem; - flex-wrap: wrap; - } - - .short-content .topic-cover { - width: 70px; - height: 50px; - flex-shrink: 0; - } - - .long-content .topic-cover { - width: 100%; - max-width: 100%; - height: auto; - margin-top: 10px; - } - - .loading { - padding: 30px; - font-size: 1rem; - } - - footer { - margin-top: 20px; - padding-top: 16px; - font-size: 0.8rem; - } -} - -/* 减少动画以节省电池 */ -@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; + line-height: 1.6; +} + +.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; +} + +/* 新增样式 */ +.topic-header { + display: flex; + flex-wrap: wrap; + align-items: flex-start; + width: 100%; +} + +/* 短内容时的布局 - 图片在右侧 */ +.topic-header.short-content { + flex-direction: row; +} + +/* 长内容时的布局 - 图片在下方 */ +.topic-header.long-content { + flex-direction: column; +} + +.topic-rank { + font-size: 1.2rem; + font-weight: bold; + color: #4096ff; + margin-right: 16px; + min-width: 36px; + text-align: center; + background-color: rgba(64, 169, 255, 0.1); + border-radius: 50%; + width: 36px; + height: 36px; + display: flex; + align-items: center; + justify-content: center; +} + +.topic-rank.top-1 { + background: linear-gradient(135deg, #ff4d4f, #ff7a45); + color: white; +} + +.topic-rank.top-2 { + background: linear-gradient(135deg, #ff7a45, #ffa940); + color: white; +} + +.topic-rank.top-3 { + background: linear-gradient(135deg, #ffa940, #ffec3d); + color: white; +} + +.topic-content { + flex: 1; + padding-right: 16px; +} + +.topic-title { + font-size: 1.15rem; + margin-bottom: 8px; + color: #333; + text-decoration: none; + display: block; + line-height: 1.5; + font-weight: 600; + transition: color 0.2s ease; +} + +.topic-title:hover { + color: #4096ff; +} + +.topic-detail { + color: #666; + font-size: 0.95rem; + line-height: 1.6; + margin-bottom: 10px; + text-align: justify; + text-indent: 2em; +} + +.topic-stats { + display: flex; + flex-wrap: wrap; + gap: 12px; + margin-top: 8px; + font-size: 0.85rem; + color: #666; +} + +.stat-item { + display: flex; + align-items: center; +} + +.hot-value { + color: #ff4d4f; + font-weight: 500; +} + +/* 短内容时的图片样式 - 在右侧 */ +.short-content .topic-cover { + width: 120px; + height: 80px; + object-fit: cover; + border-radius: 8px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + align-self: center; + margin-left: auto; +} + +/* 长内容时的图片样式 - 在下方 */ +.long-content .topic-cover { + width: 100%; + height: auto; + max-height: none; + object-fit: contain; + border-radius: 8px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + margin-top: 12px; + margin-left: 0; + margin-bottom: 8px; +} + +.topic-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; + border: 1px solid rgba(0, 0, 0, 0.03); +} + +.topic-item:hover { + transform: translateY(-3px); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08); + border-color: rgba(64, 169, 255, 0.3); +} + +/* 响应式设计 */ +@media (max-width: 1024px) and (min-width: 768px) { + .container { + max-width: 90%; + padding: 20px; + } + + header h1 { + font-size: 2.2rem; + } + + .topic-item { + padding: 18px; + } + + .topic-title { + font-size: 1.1rem; + } + + .topic-cover { + width: 100px; + height: 70px; + } +} + +@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; + } + + .topic-item { + padding: 16px; + margin-bottom: 12px; + border-radius: 10px; + } + + .topic-rank { + font-size: 1.1rem; + margin-right: 14px; + min-width: 32px; + width: 32px; + height: 32px; + } + + .topic-title { + font-size: 1rem; + line-height: 1.5; + margin-bottom: 6px; + } + + .topic-cover { + width: 90px; + height: 65px; + } + + footer { + margin-top: 24px; + padding-top: 16px; + font-size: 0.85rem; + } +} + +@media (max-width: 480px) { + body { + overflow-x: hidden; + } + + .container { + margin: 8px; + padding: 12px; + max-width: calc(100vw - 16px); + width: calc(100vw - 16px); + } + + header { + margin-bottom: 20px; + padding-bottom: 16px; + } + + header h1 { + font-size: 1.5rem; + margin-bottom: 10px; + } + + .update-time { + font-size: 0.8rem; + padding: 6px 12px; + } + + .topic-item { + padding: 14px; + margin-bottom: 12px; + width: 100%; + min-width: 0; + } + + .topic-header { + width: 100%; + min-width: 0; + } + + .topic-rank { + font-size: 1rem; + margin-right: 12px; + min-width: 30px; + width: 30px; + height: 30px; + flex-shrink: 0; + } + + .topic-content { + flex: 1; + min-width: 0; + padding-right: 12px; + } + + .topic-title { + font-size: 0.95rem; + line-height: 1.4; + word-break: break-all; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + } + + .topic-detail { + font-size: 0.85rem; + line-height: 1.5; + margin-bottom: 8px; + word-break: break-all; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + } + + .topic-stats { + gap: 8px; + font-size: 0.75rem; + flex-wrap: wrap; + } + + .short-content .topic-cover { + width: 70px; + height: 50px; + flex-shrink: 0; + } + + .long-content .topic-cover { + width: 100%; + max-width: 100%; + height: auto; + margin-top: 10px; + } + + .loading { + padding: 30px; + font-size: 1rem; + } + + footer { + margin-top: 20px; + padding-top: 16px; + font-size: 0.8rem; + } +} + +/* 减少动画以节省电池 */ +@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/zhihu-logo.svg b/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/img/zhihu-logo.svg index 9f66920b..a285cef5 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/img/zhihu-logo.svg +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/img/zhihu-logo.svg @@ -1,6 +1,6 @@ - - - - - + + + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/index.html b/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/index.html index 82c7302d..89d366ab 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 29c3c2d9..a22bf485 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/js/main.js +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/知乎热门话题/js/main.js @@ -1,159 +1,159 @@ -// API接口列表 -const API_ENDPOINTS = [ - "https://60s.api.shumengya.top/v2/zhihu", -]; - -// 当前使用的API索引 -let currentApiIndex = 0; - -// DOM元素 -const topicListElement = document.getElementById('topicList'); -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 renderTopicList(data) { - topicListElement.innerHTML = ''; - - data.forEach((item, index) => { - const topicItem = document.createElement('div'); - topicItem.className = 'topic-item'; - - const rankClass = index < 3 ? `top-${index + 1}` : ''; - - // 处理封面图片 - const coverImg = item.cover ? - `话题封面` : ''; - - // 判断文本内容长度,决定图片位置 - // 如果detail存在且长度较长,或者没有detail但标题较长,则图片放在下方 - const detailLength = item.detail ? item.detail.length : 0; - const titleLength = item.title ? item.title.length : 0; - const isLongContent = detailLength > 100 || (detailLength === 0 && titleLength > 30); - - // 根据内容长度决定布局类名 - const layoutClass = isLongContent ? 'long-content' : 'short-content'; - - topicItem.innerHTML = ` -
      -
      ${index + 1}
      -
      - 🔥 ${item.title} - ${item.detail ? `
      ${item.detail}
      ` : ''} -
      - ${item.hot_value_desc ? `
      🔥 ${item.hot_value_desc}
      ` : ''} - ${item.answer_cnt ? `
      💬 ${formatNumber(item.answer_cnt)} 回答
      ` : ''} - ${item.follower_cnt ? `
      👥 ${formatNumber(item.follower_cnt)} 关注
      ` : ''} -
      -
      - ${coverImg} -
      `; - - topicListElement.appendChild(topicItem); - }); - - // 更新时间 - updateTimeElement.textContent = `更新时间:${formatDate(new Date())}`; -} - -// 显示加载状态 -function showLoading() { - topicListElement.innerHTML = '
      加载中...
      '; -} - -// 显示错误状态 -function showError(message) { - topicListElement.innerHTML = `
      ${message}
      `; -} - -// 获取知乎热门话题数据 -async function fetchZhihuTopics() { - 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) { - renderTopicList(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(fetchZhihuTopics, 2000); - } else { - // 所有API都尝试过了 - currentApiIndex = 0; - showError('所有接口都无法访问,请稍后再试'); - } - } -} - -// 手动刷新数据 -function refreshData() { - currentApiIndex = 0; // 重置API索引 - fetchZhihuTopics(); -} - -// 页面加载完成后获取数据 -document.addEventListener('DOMContentLoaded', () => { - fetchZhihuTopics(); - - // 每隔5分钟刷新一次数据 - setInterval(fetchZhihuTopics, 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/zhihu", +]; + +// 当前使用的API索引 +let currentApiIndex = 0; + +// DOM元素 +const topicListElement = document.getElementById('topicList'); +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 renderTopicList(data) { + topicListElement.innerHTML = ''; + + data.forEach((item, index) => { + const topicItem = document.createElement('div'); + topicItem.className = 'topic-item'; + + const rankClass = index < 3 ? `top-${index + 1}` : ''; + + // 处理封面图片 + const coverImg = item.cover ? + `话题封面` : ''; + + // 判断文本内容长度,决定图片位置 + // 如果detail存在且长度较长,或者没有detail但标题较长,则图片放在下方 + const detailLength = item.detail ? item.detail.length : 0; + const titleLength = item.title ? item.title.length : 0; + const isLongContent = detailLength > 100 || (detailLength === 0 && titleLength > 30); + + // 根据内容长度决定布局类名 + const layoutClass = isLongContent ? 'long-content' : 'short-content'; + + topicItem.innerHTML = ` +
      +
      ${index + 1}
      +
      + 🔥 ${item.title} + ${item.detail ? `
      ${item.detail}
      ` : ''} +
      + ${item.hot_value_desc ? `
      🔥 ${item.hot_value_desc}
      ` : ''} + ${item.answer_cnt ? `
      💬 ${formatNumber(item.answer_cnt)} 回答
      ` : ''} + ${item.follower_cnt ? `
      👥 ${formatNumber(item.follower_cnt)} 关注
      ` : ''} +
      +
      + ${coverImg} +
      `; + + topicListElement.appendChild(topicItem); + }); + + // 更新时间 + updateTimeElement.textContent = `更新时间:${formatDate(new Date())}`; +} + +// 显示加载状态 +function showLoading() { + topicListElement.innerHTML = '
      加载中...
      '; +} + +// 显示错误状态 +function showError(message) { + topicListElement.innerHTML = `
      ${message}
      `; +} + +// 获取知乎热门话题数据 +async function fetchZhihuTopics() { + 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) { + renderTopicList(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(fetchZhihuTopics, 2000); + } else { + // 所有API都尝试过了 + currentApiIndex = 0; + showError('所有接口都无法访问,请稍后再试'); + } + } +} + +// 手动刷新数据 +function refreshData() { + currentApiIndex = 0; // 重置API索引 + fetchZhihuTopics(); +} + +// 页面加载完成后获取数据 +document.addEventListener('DOMContentLoaded', () => { + fetchZhihuTopics(); + + // 每隔5分钟刷新一次数据 + setInterval(fetchZhihuTopics, 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 a9acef11..1c9e1df8 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": "你是什么时候意识到抗日战争很艰难的?", - "detail": "就不像抗日神剧", - "cover": "https://picx.zhimg.com/v2-a07a53b2e23887c7a2440cc3f1984122.png", - "hot_value_desc": "1311 万热度", - "answer_cnt": 739, - "follower_cnt": 1739, - "comment_cnt": 0, - "created_at": 1622774952000, - "created": "2021/06/04 10:49:12", - "link": "https://api.zhihu.com/questions/463076881" - }, - { - "title": "为什么中国在很多领域都要求自主研发?", - "detail": "中国在很多领域都要求自主研发,似乎确认很多东西都有个中国版本,真有这个必要吗?", - "cover": "https://pic3.zhimg.com/80/v2-bb4dfa56f138980078da003df436e661_hd.png", - "hot_value_desc": "816 万热度", - "answer_cnt": 2476, - "follower_cnt": 12545, - "comment_cnt": 0, - "created_at": 1352205751000, - "created": "2012/11/06 20:42:31", - "link": "https://api.zhihu.com/questions/20579464" - } - ] +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": [ + { + "title": "你是什么时候意识到抗日战争很艰难的?", + "detail": "就不像抗日神剧", + "cover": "https://picx.zhimg.com/v2-a07a53b2e23887c7a2440cc3f1984122.png", + "hot_value_desc": "1311 万热度", + "answer_cnt": 739, + "follower_cnt": 1739, + "comment_cnt": 0, + "created_at": 1622774952000, + "created": "2021/06/04 10:49:12", + "link": "https://api.zhihu.com/questions/463076881" + }, + { + "title": "为什么中国在很多领域都要求自主研发?", + "detail": "中国在很多领域都要求自主研发,似乎确认很多东西都有个中国版本,真有这个必要吗?", + "cover": "https://pic3.zhimg.com/80/v2-bb4dfa56f138980078da003df436e661_hd.png", + "hot_value_desc": "816 万热度", + "answer_cnt": 2476, + "follower_cnt": 12545, + "comment_cnt": 0, + "created_at": 1352205751000, + "created": "2012/11/06 20:42:31", + "link": "https://api.zhihu.com/questions/20579464" + } + ] } \ 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 f67a1aeb..410d31b7 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/css/background.css +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/css/background.css @@ -1,128 +1,128 @@ -/* 网易云音乐特色背景样式 */ -body { - background: linear-gradient(135deg, #2b2b2b 0%, #1e1e1e 50%, #2b2b2b 100%); - background-size: 400% 400%; - animation: gradientShift 15s ease infinite; - position: relative; - color: #fff; -} - -/* 背景渐变动画 */ -@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(236, 65, 65, 0.15) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(236, 65, 65, 0.1) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(236, 65, 65, 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(236, 65, 65, 0.4), transparent), - radial-gradient(2px 2px at 40px 70px, rgba(236, 65, 65, 0.3), transparent), - radial-gradient(1px 1px at 90px 40px, rgba(236, 65, 65, 0.4), transparent), - radial-gradient(1px 1px at 130px 80px, rgba(236, 65, 65, 0.3), transparent), - radial-gradient(2px 2px at 160px 30px, rgba(236, 65, 65, 0.4), transparent); - background-repeat: repeat; - background-size: 200px 100px; - animation: particleFloat 20s linear infinite; - pointer-events: none; - z-index: -1; - opacity: 0.6; -} - -/* 音符浮动动画 */ -@keyframes particleFloat { - 0% { - transform: translateY(0px); - } - 100% { - transform: translateY(-100px); - } -} - -/* 音符装饰 */ -.music-note { - position: absolute; - font-size: 24px; - color: rgba(236, 65, 65, 0.3); - animation: floatNote 15s linear infinite; - z-index: -1; -} - -@keyframes floatNote { - 0% { - transform: translateY(0) rotate(0deg); - opacity: 0; - } - 10% { - opacity: 0.8; - } - 90% { - opacity: 0.8; - } - 100% { - transform: translateY(-100vh) rotate(360deg); - opacity: 0; - } -} - -/* 响应式背景调整 */ -@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; - opacity: 0.4; - } -} - -/* 高性能模式 - 减少动画 */ -@media (prefers-reduced-motion: reduce) { - body { - animation: none; - background: linear-gradient(135deg, #2b2b2b 0%, #1e1e1e 50%, #2b2b2b 100%); - } - - body::after { - animation: none; - } - - .music-note { - animation: none; - display: none; - } +/* 网易云音乐特色背景样式 */ +body { + background: linear-gradient(135deg, #2b2b2b 0%, #1e1e1e 50%, #2b2b2b 100%); + background-size: 400% 400%; + animation: gradientShift 15s ease infinite; + position: relative; + color: #fff; +} + +/* 背景渐变动画 */ +@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(236, 65, 65, 0.15) 0%, transparent 50%), + radial-gradient(circle at 80% 20%, rgba(236, 65, 65, 0.1) 0%, transparent 50%), + radial-gradient(circle at 40% 40%, rgba(236, 65, 65, 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(236, 65, 65, 0.4), transparent), + radial-gradient(2px 2px at 40px 70px, rgba(236, 65, 65, 0.3), transparent), + radial-gradient(1px 1px at 90px 40px, rgba(236, 65, 65, 0.4), transparent), + radial-gradient(1px 1px at 130px 80px, rgba(236, 65, 65, 0.3), transparent), + radial-gradient(2px 2px at 160px 30px, rgba(236, 65, 65, 0.4), transparent); + background-repeat: repeat; + background-size: 200px 100px; + animation: particleFloat 20s linear infinite; + pointer-events: none; + z-index: -1; + opacity: 0.6; +} + +/* 音符浮动动画 */ +@keyframes particleFloat { + 0% { + transform: translateY(0px); + } + 100% { + transform: translateY(-100px); + } +} + +/* 音符装饰 */ +.music-note { + position: absolute; + font-size: 24px; + color: rgba(236, 65, 65, 0.3); + animation: floatNote 15s linear infinite; + z-index: -1; +} + +@keyframes floatNote { + 0% { + transform: translateY(0) rotate(0deg); + opacity: 0; + } + 10% { + opacity: 0.8; + } + 90% { + opacity: 0.8; + } + 100% { + transform: translateY(-100vh) rotate(360deg); + opacity: 0; + } +} + +/* 响应式背景调整 */ +@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; + opacity: 0.4; + } +} + +/* 高性能模式 - 减少动画 */ +@media (prefers-reduced-motion: reduce) { + body { + animation: none; + background: linear-gradient(135deg, #2b2b2b 0%, #1e1e1e 50%, #2b2b2b 100%); + } + + body::after { + animation: none; + } + + .music-note { + animation: none; + display: none; + } } \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/css/responsive.css b/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/css/responsive.css index ada3cef4..b98956ef 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/css/responsive.css +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/css/responsive.css @@ -1,194 +1,194 @@ -/* 响应式样式 - 适配不同设备 */ - -/* 基础样式 - 移动设备优先 */ -.container { - width: 95%; - padding: 15px; - margin: 10px auto; -} - -header h1 { - font-size: 1.5rem; -} - -.update-time { - font-size: 0.8rem; - padding: 6px 12px; -} - -.rank-list { - grid-template-columns: 1fr; - gap: 16px; - margin-top: 15px; -} - -.rank-item { - border-radius: 10px; -} - -.rank-cover { - height: 160px; -} - -.rank-info { - padding: 12px; -} - -.rank-name { - font-size: 1rem; - margin-bottom: 6px; -} - -.rank-desc { - font-size: 0.85rem; - margin-bottom: 10px; - -webkit-line-clamp: 2; -} - -.rank-meta { - font-size: 0.75rem; - margin-bottom: 10px; -} - -.rank-link { - padding: 6px 14px; - font-size: 0.85rem; -} - -/* 平板设备 */ -@media screen and (min-width: 768px) { - .container { - width: 90%; - padding: 20px; - margin: 15px auto; - } - - header h1 { - font-size: 1.8rem; - } - - .update-time { - font-size: 0.85rem; - padding: 7px 14px; - } - - .rank-list { - grid-template-columns: repeat(2, 1fr); - gap: 20px; - margin-top: 20px; - } - - .rank-cover { - height: 170px; - } - - .rank-info { - padding: 15px; - } - - .rank-name { - font-size: 1.1rem; - margin-bottom: 8px; - } - - .rank-desc { - font-size: 0.9rem; - margin-bottom: 12px; - -webkit-line-clamp: 3; - } - - .rank-meta { - font-size: 0.8rem; - } - - .rank-link { - padding: 7px 16px; - font-size: 0.9rem; - } - - .loading-spinner { - width: 60px; - height: 60px; - } -} - -/* 桌面设备 */ -@media screen and (min-width: 1024px) { - .container { - width: 85%; - max-width: 1200px; - margin: 20px auto; - } - - header h1 { - font-size: 2.2rem; - } - - .update-time { - font-size: 0.9rem; - padding: 8px 16px; - } - - .rank-list { - grid-template-columns: repeat(3, 1fr); - gap: 24px; - margin-top: 25px; - } - - .rank-cover { - height: 180px; - } - - .rank-info { - padding: 18px; - } - - .rank-name { - font-size: 1.2rem; - margin-bottom: 10px; - } - - .rank-desc { - font-size: 0.95rem; - margin-bottom: 15px; - } - - .rank-meta { - font-size: 0.85rem; - margin-bottom: 15px; - } - - .rank-link { - padding: 8px 18px; - font-size: 0.95rem; - } -} - -/* 大屏幕设备 */ -@media screen and (min-width: 1440px) { - .container { - max-width: 1400px; - } - - .rank-list { - grid-template-columns: repeat(4, 1fr); - gap: 30px; - } - - .rank-cover { - height: 200px; - } - - .rank-name { - font-size: 1.25rem; - } - - .rank-desc { - font-size: 1rem; - } - - .rank-link { - padding: 10px 20px; - font-size: 1rem; - } +/* 响应式样式 - 适配不同设备 */ + +/* 基础样式 - 移动设备优先 */ +.container { + width: 95%; + padding: 15px; + margin: 10px auto; +} + +header h1 { + font-size: 1.5rem; +} + +.update-time { + font-size: 0.8rem; + padding: 6px 12px; +} + +.rank-list { + grid-template-columns: 1fr; + gap: 16px; + margin-top: 15px; +} + +.rank-item { + border-radius: 10px; +} + +.rank-cover { + height: 160px; +} + +.rank-info { + padding: 12px; +} + +.rank-name { + font-size: 1rem; + margin-bottom: 6px; +} + +.rank-desc { + font-size: 0.85rem; + margin-bottom: 10px; + -webkit-line-clamp: 2; +} + +.rank-meta { + font-size: 0.75rem; + margin-bottom: 10px; +} + +.rank-link { + padding: 6px 14px; + font-size: 0.85rem; +} + +/* 平板设备 */ +@media screen and (min-width: 768px) { + .container { + width: 90%; + padding: 20px; + margin: 15px auto; + } + + header h1 { + font-size: 1.8rem; + } + + .update-time { + font-size: 0.85rem; + padding: 7px 14px; + } + + .rank-list { + grid-template-columns: repeat(2, 1fr); + gap: 20px; + margin-top: 20px; + } + + .rank-cover { + height: 170px; + } + + .rank-info { + padding: 15px; + } + + .rank-name { + font-size: 1.1rem; + margin-bottom: 8px; + } + + .rank-desc { + font-size: 0.9rem; + margin-bottom: 12px; + -webkit-line-clamp: 3; + } + + .rank-meta { + font-size: 0.8rem; + } + + .rank-link { + padding: 7px 16px; + font-size: 0.9rem; + } + + .loading-spinner { + width: 60px; + height: 60px; + } +} + +/* 桌面设备 */ +@media screen and (min-width: 1024px) { + .container { + width: 85%; + max-width: 1200px; + margin: 20px auto; + } + + header h1 { + font-size: 2.2rem; + } + + .update-time { + font-size: 0.9rem; + padding: 8px 16px; + } + + .rank-list { + grid-template-columns: repeat(3, 1fr); + gap: 24px; + margin-top: 25px; + } + + .rank-cover { + height: 180px; + } + + .rank-info { + padding: 18px; + } + + .rank-name { + font-size: 1.2rem; + margin-bottom: 10px; + } + + .rank-desc { + font-size: 0.95rem; + margin-bottom: 15px; + } + + .rank-meta { + font-size: 0.85rem; + margin-bottom: 15px; + } + + .rank-link { + padding: 8px 18px; + font-size: 0.95rem; + } +} + +/* 大屏幕设备 */ +@media screen and (min-width: 1440px) { + .container { + max-width: 1400px; + } + + .rank-list { + grid-template-columns: repeat(4, 1fr); + gap: 30px; + } + + .rank-cover { + height: 200px; + } + + .rank-name { + font-size: 1.25rem; + } + + .rank-desc { + font-size: 1rem; + } + + .rank-link { + padding: 10px 20px; + font-size: 1rem; + } } \ 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 72af5361..2aa56ff2 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/css/style.css +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/css/style.css @@ -1,474 +1,474 @@ -/* 背景样式 */ -.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; - overflow-x: hidden; - line-height: 1.6; -} - -.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); - position: relative; -} - -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); -} - -.rank-list { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); - gap: 24px; - margin-top: 20px; -} - -.rank-item { - background-color: white; - border-radius: 12px; - box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08); - overflow: hidden; - transition: all 0.3s ease; - display: flex; - flex-direction: column; - border: 1px solid rgba(0, 0, 0, 0.05); -} - -.rank-item:hover { - transform: translateY(-5px); - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12); - border-color: rgba(236, 65, 65, 0.3); -} - -.rank-cover { - position: relative; - height: 180px; - overflow: hidden; -} - -.rank-cover img { - width: 100%; - height: 100%; - object-fit: cover; - transition: transform 0.5s ease; -} - -.rank-item:hover .rank-cover img { - transform: scale(1.05); -} - -.rank-update { - position: absolute; - bottom: 0; - right: 0; - background: rgba(236, 65, 65, 0.8); - color: white; - padding: 4px 10px; - font-size: 0.8rem; - border-top-left-radius: 8px; -} - -.rank-info { - padding: 16px; - flex: 1; - display: flex; - flex-direction: column; -} - -.rank-name { - font-size: 1.2rem; - font-weight: 600; - margin-bottom: 8px; - color: #333; -} - -.rank-desc { - font-size: 0.9rem; - color: #666; - margin-bottom: 12px; - display: -webkit-box; - -webkit-line-clamp: 3; - -webkit-box-orient: vertical; - overflow: hidden; - flex: 1; -} - -.rank-meta { - font-size: 0.8rem; - color: #999; - margin-bottom: 12px; -} - -.rank-link { - display: inline-block; - background: linear-gradient(135deg, #ec4141, #ff7a45); - color: white; - text-decoration: none; - padding: 8px 16px; - border-radius: 20px; - font-size: 0.9rem; - text-align: center; - transition: all 0.3s ease; - box-shadow: 0 2px 8px rgba(236, 65, 65, 0.3); -} - -.rank-link:hover { - background: linear-gradient(135deg, #d73435, #f06937); - box-shadow: 0 4px 12px rgba(236, 65, 65, 0.4); - transform: translateY(-2px); -} - -.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; -} - -.loading-spinner { - display: inline-block; - width: 50px; - height: 50px; - border: 3px solid rgba(236, 65, 65, 0.3); - border-radius: 50%; - border-top-color: #ec4141; - animation: spin 1s ease-in-out infinite; - margin-bottom: 16px; -} - -@keyframes spin { - to { transform: rotate(360deg); } -} - -.error-message { - text-align: center; - padding: 40px; - color: #ff4d4f; - font-size: 1.1rem; -} - -.retry-button { - background: #ec4141; - color: white; - border: none; - padding: 8px 20px; - border-radius: 20px; - font-size: 0.9rem; - margin-top: 16px; - cursor: pointer; - transition: all 0.3s ease; -} - -.retry-button:hover { - background: #d73435; - box-shadow: 0 2px 8px rgba(236, 65, 65, 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; -} - -/* 音符装饰样式 */ -.music-note { - position: fixed; - font-size: 24px; - color: rgba(236, 65, 65, 0.6); - z-index: 0; - pointer-events: none; - animation: floatNote 20s linear infinite; - text-shadow: 0 0 5px rgba(255, 255, 255, 0.7); -} - -@keyframes floatNote { - 0% { - transform: translateY(0) rotate(0deg); - opacity: 0.7; - } - 50% { - transform: translateY(-100px) rotate(180deg); - opacity: 0.9; - } - 100% { - transform: translateY(-200px) rotate(360deg); - opacity: 0; - } -} - -/* 响应式设计 */ -@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; - } - - .music-note { - font-size: 22px; - } -} - -@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; - } - - .music-note { - font-size: 20px; - } -} - -@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; - } - - .music-note { - font-size: 16px; - } -} - -/* 减少动画以节省电池 */ -@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; + overflow-x: hidden; + line-height: 1.6; +} + +.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); + position: relative; +} + +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); +} + +.rank-list { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 24px; + margin-top: 20px; +} + +.rank-item { + background-color: white; + border-radius: 12px; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08); + overflow: hidden; + transition: all 0.3s ease; + display: flex; + flex-direction: column; + border: 1px solid rgba(0, 0, 0, 0.05); +} + +.rank-item:hover { + transform: translateY(-5px); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12); + border-color: rgba(236, 65, 65, 0.3); +} + +.rank-cover { + position: relative; + height: 180px; + overflow: hidden; +} + +.rank-cover img { + width: 100%; + height: 100%; + object-fit: cover; + transition: transform 0.5s ease; +} + +.rank-item:hover .rank-cover img { + transform: scale(1.05); +} + +.rank-update { + position: absolute; + bottom: 0; + right: 0; + background: rgba(236, 65, 65, 0.8); + color: white; + padding: 4px 10px; + font-size: 0.8rem; + border-top-left-radius: 8px; +} + +.rank-info { + padding: 16px; + flex: 1; + display: flex; + flex-direction: column; +} + +.rank-name { + font-size: 1.2rem; + font-weight: 600; + margin-bottom: 8px; + color: #333; +} + +.rank-desc { + font-size: 0.9rem; + color: #666; + margin-bottom: 12px; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; + flex: 1; +} + +.rank-meta { + font-size: 0.8rem; + color: #999; + margin-bottom: 12px; +} + +.rank-link { + display: inline-block; + background: linear-gradient(135deg, #ec4141, #ff7a45); + color: white; + text-decoration: none; + padding: 8px 16px; + border-radius: 20px; + font-size: 0.9rem; + text-align: center; + transition: all 0.3s ease; + box-shadow: 0 2px 8px rgba(236, 65, 65, 0.3); +} + +.rank-link:hover { + background: linear-gradient(135deg, #d73435, #f06937); + box-shadow: 0 4px 12px rgba(236, 65, 65, 0.4); + transform: translateY(-2px); +} + +.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; +} + +.loading-spinner { + display: inline-block; + width: 50px; + height: 50px; + border: 3px solid rgba(236, 65, 65, 0.3); + border-radius: 50%; + border-top-color: #ec4141; + animation: spin 1s ease-in-out infinite; + margin-bottom: 16px; +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + +.error-message { + text-align: center; + padding: 40px; + color: #ff4d4f; + font-size: 1.1rem; +} + +.retry-button { + background: #ec4141; + color: white; + border: none; + padding: 8px 20px; + border-radius: 20px; + font-size: 0.9rem; + margin-top: 16px; + cursor: pointer; + transition: all 0.3s ease; +} + +.retry-button:hover { + background: #d73435; + box-shadow: 0 2px 8px rgba(236, 65, 65, 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; +} + +/* 音符装饰样式 */ +.music-note { + position: fixed; + font-size: 24px; + color: rgba(236, 65, 65, 0.6); + z-index: 0; + pointer-events: none; + animation: floatNote 20s linear infinite; + text-shadow: 0 0 5px rgba(255, 255, 255, 0.7); +} + +@keyframes floatNote { + 0% { + transform: translateY(0) rotate(0deg); + opacity: 0.7; + } + 50% { + transform: translateY(-100px) rotate(180deg); + opacity: 0.9; + } + 100% { + transform: translateY(-200px) rotate(360deg); + opacity: 0; + } +} + +/* 响应式设计 */ +@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; + } + + .music-note { + font-size: 22px; + } +} + +@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; + } + + .music-note { + font-size: 20px; + } +} + +@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; + } + + .music-note { + font-size: 16px; + } +} + +/* 减少动画以节省电池 */ +@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 7f3d7ae5..de5314fe 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/index.html +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/index.html @@ -1,49 +1,49 @@ - - - - - - 网易云音乐榜单 - InfoGenie - - - - - - - -
      -
      -
      - - -
      - -
      -
      -

      网易云音乐榜单

      -
      加载中...
      -
      - -
      -
      -
      -

      正在加载榜单数据...

      -
      - - - - -
      - -
      -

      数据来源:网易云音乐官方API

      -

      © 2024 InfoGenie - 网易云音乐榜单

      -
      -
      - - - + + + + + + 网易云音乐榜单 - InfoGenie + + + + + + + +
      +
      +
      + + +
      + +
      +
      +

      网易云音乐榜单

      +
      加载中...
      +
      + +
      +
      +
      +

      正在加载榜单数据...

      +
      + + + + +
      + +
      +

      数据来源:网易云音乐官方API

      +

      © 2024 InfoGenie - 网易云音乐榜单

      +
      +
      + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/js/app.js b/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/js/app.js index 739fb559..7ef9c24c 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/js/app.js +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/js/app.js @@ -1,252 +1,252 @@ -/** - * 网易云音乐榜单 - 主应用脚本 - * 功能:获取API数据、渲染榜单、处理错误、自动切换API接口 - */ - -// 全局变量 -const apiUrls = []; -let currentApiIndex = 0; -let rankData = null; - -// DOM元素 -const loadingElement = document.getElementById('loading'); -const errorElement = document.getElementById('error-message'); -const rankListElement = document.getElementById('rank-list'); -const updateTimeElement = document.getElementById('update-time'); -const retryButton = document.getElementById('retry-button'); - -// 初始化函数 -async function init() { - try { - // 获取API接口列表 - await loadApiUrls(); - - // 获取榜单数据 - await fetchRankData(); - - // 添加音符装饰 - createMusicNotes(); - } catch (error) { - console.error('初始化失败:', error); - showError(); - } -} - -// 加载API接口列表 -async function loadApiUrls() { - try { - const response = await fetch('./接口集合.json'); - if (!response.ok) { - throw new Error('无法加载API接口列表'); - } - const data = await response.json(); - if (Array.isArray(data) && data.length > 0) { - apiUrls.push(...data); - console.log('已加载API接口列表:', apiUrls); - } else { - throw new Error('API接口列表为空'); - } - } catch (error) { - console.error('加载API接口列表失败:', error); - // 使用默认API - apiUrls.push('https://60s.api.shumengya.top/v2/ncm-rank'); - } -} - -// 获取榜单数据 -async function fetchRankData() { - showLoading(); - - // 如果没有API接口,显示错误 - if (apiUrls.length === 0) { - throw new Error('没有可用的API接口'); - } - - try { - const apiUrl = apiUrls[currentApiIndex]; - const response = await fetch(apiUrl); - - if (!response.ok) { - throw new Error(`API请求失败: ${response.status}`); - } - - const data = await response.json(); - - if (data.code === 200 && data.data && Array.isArray(data.data)) { - rankData = data; - renderRankList(data.data); - updateLastUpdateTime(data); - hideLoading(); - } else { - throw new Error('API返回数据格式错误'); - } - } catch (error) { - console.error('获取榜单数据失败:', error); - // 尝试切换到下一个API - if (tryNextApi()) { - return fetchRankData(); - } else { - showError(); - } - } -} - -// 尝试切换到下一个API -function tryNextApi() { - if (currentApiIndex < apiUrls.length - 1) { - currentApiIndex++; - console.log(`切换到下一个API: ${apiUrls[currentApiIndex]}`); - return true; - } - return false; -} - -// 渲染榜单列表 -function renderRankList(ranks) { - if (!Array.isArray(ranks) || ranks.length === 0) { - showError('没有榜单数据'); - return; - } - - rankListElement.innerHTML = ''; - - ranks.forEach(rank => { - const rankItem = document.createElement('div'); - rankItem.className = 'rank-item'; - - // 构建榜单项HTML - rankItem.innerHTML = ` -
      - ${rank.name} -
      ${rank.update_frequency || '定期更新'}
      -
      -
      -

      ${rank.name}

      -

      ${rank.description || '暂无描述'}

      -
      - 更新: ${formatDate(rank.updated)} -
      - 查看详情 -
      - `; - - rankListElement.appendChild(rankItem); - }); - - rankListElement.style.display = 'grid'; -} - -// 更新最后更新时间 -function updateLastUpdateTime(data) { - if (data && data.data && data.data.length > 0) { - const latestRank = data.data.reduce((latest, current) => { - const latestDate = latest.updated_at || 0; - const currentDate = current.updated_at || 0; - return currentDate > latestDate ? current : latest; - }, data.data[0]); - - if (latestRank && latestRank.updated) { - updateTimeElement.textContent = `最近更新: ${formatDate(latestRank.updated)}`; - } else { - updateTimeElement.textContent = '数据已更新'; - } - } -} - -// 格式化日期 -function formatDate(dateStr) { - if (!dateStr) return '未知'; - - try { - const date = new Date(dateStr.replace('2025-', '2024-')); - if (isNaN(date.getTime())) return dateStr; - - return date.toLocaleDateString('zh-CN', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit' - }).replace(/\//g, '-'); - } catch (e) { - return dateStr; - } -} - -// 创建音符装饰 -function createMusicNotes() { - const notesContainer = document.getElementById('music-notes-container'); - const notes = ['♪', '♫', '♬', '♩', '♭', '♮']; - const containerWidth = window.innerWidth; - const containerHeight = window.innerHeight; - - // 清空容器 - notesContainer.innerHTML = ''; - - // 创建15个音符 - for (let i = 0; i < 15; i++) { - const note = document.createElement('div'); - note.className = 'music-note'; - note.textContent = notes[Math.floor(Math.random() * notes.length)]; - - // 随机位置 - const left = Math.random() * containerWidth; - const top = Math.random() * containerHeight; - - // 随机动画延迟 - const delay = Math.random() * 20; - const duration = 15 + Math.random() * 15; - - // 设置样式 - note.style.left = `${left}px`; - note.style.top = `${top}px`; - note.style.animationDelay = `${delay}s`; - note.style.animationDuration = `${duration}s`; - - notesContainer.appendChild(note); - } -} - -// 显示加载中 -function showLoading() { - loadingElement.style.display = 'block'; - errorElement.style.display = 'none'; - rankListElement.style.display = 'none'; -} - -// 隐藏加载中 -function hideLoading() { - loadingElement.style.display = 'none'; -} - -// 显示错误信息 -function showError(message = '加载失败,请稍后再试') { - loadingElement.style.display = 'none'; - errorElement.querySelector('p').textContent = message; - errorElement.style.display = 'block'; -} - -// 重试按钮点击事件 -retryButton.addEventListener('click', () => { - // 重置API索引 - currentApiIndex = 0; - // 重新获取数据 - fetchRankData(); -}); - -// 窗口大小改变时重新创建音符 -window.addEventListener('resize', debounce(createMusicNotes, 300)); - -// 防抖函数 -function debounce(func, wait) { - let timeout; - return function() { - const context = this; - const args = arguments; - clearTimeout(timeout); - timeout = setTimeout(() => func.apply(context, args), wait); - }; -} - -// 页面加载完成后初始化 +/** + * 网易云音乐榜单 - 主应用脚本 + * 功能:获取API数据、渲染榜单、处理错误、自动切换API接口 + */ + +// 全局变量 +const apiUrls = []; +let currentApiIndex = 0; +let rankData = null; + +// DOM元素 +const loadingElement = document.getElementById('loading'); +const errorElement = document.getElementById('error-message'); +const rankListElement = document.getElementById('rank-list'); +const updateTimeElement = document.getElementById('update-time'); +const retryButton = document.getElementById('retry-button'); + +// 初始化函数 +async function init() { + try { + // 获取API接口列表 + await loadApiUrls(); + + // 获取榜单数据 + await fetchRankData(); + + // 添加音符装饰 + createMusicNotes(); + } catch (error) { + console.error('初始化失败:', error); + showError(); + } +} + +// 加载API接口列表 +async function loadApiUrls() { + try { + const response = await fetch('./接口集合.json'); + if (!response.ok) { + throw new Error('无法加载API接口列表'); + } + const data = await response.json(); + if (Array.isArray(data) && data.length > 0) { + apiUrls.push(...data); + console.log('已加载API接口列表:', apiUrls); + } else { + throw new Error('API接口列表为空'); + } + } catch (error) { + console.error('加载API接口列表失败:', error); + // 使用默认API + apiUrls.push('https://60s.api.shumengya.top/v2/ncm-rank'); + } +} + +// 获取榜单数据 +async function fetchRankData() { + showLoading(); + + // 如果没有API接口,显示错误 + if (apiUrls.length === 0) { + throw new Error('没有可用的API接口'); + } + + try { + const apiUrl = apiUrls[currentApiIndex]; + const response = await fetch(apiUrl); + + if (!response.ok) { + throw new Error(`API请求失败: ${response.status}`); + } + + const data = await response.json(); + + if (data.code === 200 && data.data && Array.isArray(data.data)) { + rankData = data; + renderRankList(data.data); + updateLastUpdateTime(data); + hideLoading(); + } else { + throw new Error('API返回数据格式错误'); + } + } catch (error) { + console.error('获取榜单数据失败:', error); + // 尝试切换到下一个API + if (tryNextApi()) { + return fetchRankData(); + } else { + showError(); + } + } +} + +// 尝试切换到下一个API +function tryNextApi() { + if (currentApiIndex < apiUrls.length - 1) { + currentApiIndex++; + console.log(`切换到下一个API: ${apiUrls[currentApiIndex]}`); + return true; + } + return false; +} + +// 渲染榜单列表 +function renderRankList(ranks) { + if (!Array.isArray(ranks) || ranks.length === 0) { + showError('没有榜单数据'); + return; + } + + rankListElement.innerHTML = ''; + + ranks.forEach(rank => { + const rankItem = document.createElement('div'); + rankItem.className = 'rank-item'; + + // 构建榜单项HTML + rankItem.innerHTML = ` +
      + ${rank.name} +
      ${rank.update_frequency || '定期更新'}
      +
      +
      +

      ${rank.name}

      +

      ${rank.description || '暂无描述'}

      +
      + 更新: ${formatDate(rank.updated)} +
      + 查看详情 +
      + `; + + rankListElement.appendChild(rankItem); + }); + + rankListElement.style.display = 'grid'; +} + +// 更新最后更新时间 +function updateLastUpdateTime(data) { + if (data && data.data && data.data.length > 0) { + const latestRank = data.data.reduce((latest, current) => { + const latestDate = latest.updated_at || 0; + const currentDate = current.updated_at || 0; + return currentDate > latestDate ? current : latest; + }, data.data[0]); + + if (latestRank && latestRank.updated) { + updateTimeElement.textContent = `最近更新: ${formatDate(latestRank.updated)}`; + } else { + updateTimeElement.textContent = '数据已更新'; + } + } +} + +// 格式化日期 +function formatDate(dateStr) { + if (!dateStr) return '未知'; + + try { + const date = new Date(dateStr.replace('2025-', '2024-')); + if (isNaN(date.getTime())) return dateStr; + + return date.toLocaleDateString('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit' + }).replace(/\//g, '-'); + } catch (e) { + return dateStr; + } +} + +// 创建音符装饰 +function createMusicNotes() { + const notesContainer = document.getElementById('music-notes-container'); + const notes = ['♪', '♫', '♬', '♩', '♭', '♮']; + const containerWidth = window.innerWidth; + const containerHeight = window.innerHeight; + + // 清空容器 + notesContainer.innerHTML = ''; + + // 创建15个音符 + for (let i = 0; i < 15; i++) { + const note = document.createElement('div'); + note.className = 'music-note'; + note.textContent = notes[Math.floor(Math.random() * notes.length)]; + + // 随机位置 + const left = Math.random() * containerWidth; + const top = Math.random() * containerHeight; + + // 随机动画延迟 + const delay = Math.random() * 20; + const duration = 15 + Math.random() * 15; + + // 设置样式 + note.style.left = `${left}px`; + note.style.top = `${top}px`; + note.style.animationDelay = `${delay}s`; + note.style.animationDuration = `${duration}s`; + + notesContainer.appendChild(note); + } +} + +// 显示加载中 +function showLoading() { + loadingElement.style.display = 'block'; + errorElement.style.display = 'none'; + rankListElement.style.display = 'none'; +} + +// 隐藏加载中 +function hideLoading() { + loadingElement.style.display = 'none'; +} + +// 显示错误信息 +function showError(message = '加载失败,请稍后再试') { + loadingElement.style.display = 'none'; + errorElement.querySelector('p').textContent = message; + errorElement.style.display = 'block'; +} + +// 重试按钮点击事件 +retryButton.addEventListener('click', () => { + // 重置API索引 + currentApiIndex = 0; + // 重新获取数据 + fetchRankData(); +}); + +// 窗口大小改变时重新创建音符 +window.addEventListener('resize', debounce(createMusicNotes, 300)); + +// 防抖函数 +function debounce(func, wait) { + let timeout; + return function() { + const context = this; + const args = arguments; + clearTimeout(timeout); + timeout = setTimeout(() => func.apply(context, args), wait); + }; +} + +// 页面加载完成后初始化 document.addEventListener('DOMContentLoaded', init); \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/接口集合.json b/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/接口集合.json index 1d87168c..11b7262a 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/接口集合.json +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/接口集合.json @@ -1,3 +1,3 @@ -[ - "https://60s.api.shumengya.top/v2/ncm-rank" -] +[ + "https://60s.api.shumengya.top/v2/ncm-rank" +] diff --git a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/返回接口.json b/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/返回接口.json index a4cd0831..3eccd9d0 100755 --- a/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/返回接口.json +++ b/InfoGenie-frontend/public/60sapi/热搜榜单/网易云榜单/返回接口.json @@ -1,750 +1,750 @@ -{ - "code": 200, - "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", - "data": [ - { - "id": 19723756, - "name": "飙升榜", - "description": "云音乐中每天热度上升最快的100首单曲,每日更新。", - "cover": "https://p2.music.126.net/rIi7Qzy2i2Y_1QD7cd0MYA==/109951170048506929.jpg", - "update_frequency": "更新78首", - "updated": "2025-09-05 08:24:41", - "updated_at": 1757031881385, - "created": "2014-06-30 15:58:56", - "created_at": 1404115136883, - "link": "https://music.163.com/#/discover/toplist?id=19723756" - }, - { - "id": 3779629, - "name": "新歌榜", - "description": "云音乐新歌榜:云音乐用户一周内收听所有新歌(一月内最新发行) 官方TOP排行榜,每天更新。", - "cover": "https://p2.music.126.net/5guhqPBTcIrrhLBotgaT6w==/109951170048511751.jpg", - "update_frequency": "刚刚更新", - "updated": "2025-09-05 08:24:50", - "updated_at": 1757031890587, - "created": "2013-09-09 18:09:58", - "created_at": 1378721398225, - "link": "https://music.163.com/#/discover/toplist?id=3779629" - }, - { - "id": 2884035, - "name": "原创榜", - "description": "云音乐独立原创音乐人作品官方榜单,以推荐优秀原创作品为目的。每周四网易云音乐首发。申请网易音乐人:http://music.163.com/nmusician/", - "cover": "https://p2.music.126.net/BaP9nrocNTL3gGThysv4eQ==/109951170091896587.jpg", - "update_frequency": "每周四更新", - "updated": "2025-09-04 10:54:42", - "updated_at": 1756954482653, - "created": "2013-07-25 14:05:25", - "created_at": 1374732325894, - "link": "https://music.163.com/#/discover/toplist?id=2884035" - }, - { - "id": 3778678, - "name": "热歌榜", - "description": "云音乐热歌榜:云音乐用户一周内收听所有线上歌曲官方TOP排行榜,每日更新。", - "cover": "https://p2.music.126.net/0SUEG8yDACfx0Bw2MYFv4Q==/109951170048519512.jpg", - "update_frequency": "更新14首", - "updated": "2025-09-05 08:25:03", - "updated_at": 1757031903733, - "created": "2013-09-09 18:10:06", - "created_at": 1378721406014, - "link": "https://music.163.com/#/discover/toplist?id=3778678" - }, - { - "id": 991319590, - "name": "网易云中文说唱榜", - "description": "网易云原创说唱音乐人作品官方榜单,每周五更新。以网易云用户一周播放热度为主,收录2个月内发行的原创说唱作品,按照综合数据排名取前50名。申请网易音乐人:http://music.163.com/nmusician", - "cover": "https://p2.music.126.net/GgHbgDfGXHpE2YTchU7IvA==/109951171510498108.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 10:19:58", - "updated_at": 1756433998618, - "created": "2017-11-10 13:06:29", - "created_at": 1510290389440, - "link": "https://music.163.com/#/discover/toplist?id=991319590" - }, - { - "id": 71384707, - "name": "网易云古典榜", - "description": "网易云用户一周内收听所有古典音乐官方TOP排行榜,每周四更新。", - "cover": "https://p2.music.126.net/urByD_AmfBDBrs7fA9-O8A==/109951167976973225.jpg", - "update_frequency": "每周四更新", - "updated": "2025-09-04 10:52:54", - "updated_at": 1756954374913, - "created": "2015-05-07 11:22:00", - "created_at": 1430968920537, - "link": "https://music.163.com/#/discover/toplist?id=71384707" - }, - { - "id": 1978921795, - "name": "网易云电音榜", - "description": "网易云用户一周内收听电子音乐官方TOP排行榜,每周五更新。喜力星电音,用先锋电音带你解锁全新维度和体验!", - "cover": "https://p2.music.126.net/hXGObvXfsGtFjFvRhOYAkA==/109951170091888741.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 12:00:01", - "updated_at": 1756440001367, - "created": "2017-11-16 17:47:12", - "created_at": 1510825632233, - "link": "https://music.163.com/#/discover/toplist?id=1978921795" - }, - { - "id": 14028249541, - "name": "网易云全球说唱榜", - "description": "想聆听世界的说唱节奏?全球说唱榜每周五更新,聚焦华语地区以外的优秀说唱作品。根据云音乐用户每周播放热度数据,按照综合数据排名取前 50 名。", - "cover": "https://p2.music.126.net/0hhFjP6WyIjHYDXKW5E7BA==/109951171535150782.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 11:51:16", - "updated_at": 1756439476712, - "created": "2025-07-24 14:09:26", - "created_at": 1753337366883, - "link": "https://music.163.com/#/discover/toplist?id=14028249541" - }, - { - "id": 13372522766, - "name": "潮流风向榜", - "description": "精心挑选云音乐极具声量的音乐作品,呈现歌曲真实热度趋势,榜单每日更新。", - "cover": "https://p2.music.126.net/dIKA5e7jCncz2Br1Toxgaw==/109951170621574552.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:58", - "updated_at": 1756958758114, - "created": "2025-02-26 14:01:33", - "created_at": 1740549693794, - "link": "https://music.163.com/#/discover/toplist?id=13372522766" - }, - { - "id": 12911403728, - "name": "音乐合伙人推荐榜", - "description": "音乐合伙人近一个月内推荐过的歌曲官方TOP排行榜,每周一更新。 跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", - "cover": "https://p2.music.126.net/s6ITpmGjKbyDpi7DPkqd2w==/109951170187827373.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 12:06:04", - "updated_at": 1756699564013, - "created": "2024-11-25 15:14:30", - "created_at": 1732518870190, - "link": "https://music.163.com/#/discover/toplist?id=12911403728" - }, - { - "id": 12911589513, - "name": "音乐合伙人热歌榜", - "description": "音乐合伙人近一周评定过的高分热歌官方TOP排行榜,每周一更新。 跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", - "cover": "https://p2.music.126.net/RgYxQmB-ZUjkMRo2N1jWnQ==/109951170187823494.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 12:06:01", - "updated_at": 1756699561725, - "created": "2024-11-25 15:13:46", - "created_at": 1732518826543, - "link": "https://music.163.com/#/discover/toplist?id=12911589513" - }, - { - "id": 12911619970, - "name": "音乐合伙人留名榜", - "description": "音乐合伙人近一个月内留名过的所有歌曲官方TOP排行榜,每周一更新。 跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", - "cover": "https://p2.music.126.net/aJJzGIxhkVaD7dX0XBNUnw==/109951170187831145.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 12:05:49", - "updated_at": 1756699549550, - "created": "2024-11-25 15:12:50", - "created_at": 1732518770868, - "link": "https://music.163.com/#/discover/toplist?id=12911619970" - }, - { - "id": 12911379734, - "name": "音乐合伙人高分新歌榜", - "description": "音乐合伙人近期评定过的所有新歌(一个月内最新发行)官方TOP排行榜,每周一更新。 跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", - "cover": "https://p2.music.126.net/bfk15bvanhdPFU7yjPFgWA==/109951170187832038.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 12:05:54", - "updated_at": 1756699554077, - "created": "2024-11-25 15:11:53", - "created_at": 1732518713161, - "link": "https://music.163.com/#/discover/toplist?id=12911379734" - }, - { - "id": 12768855486, - "name": "音乐合伙人高分榜", - "description": "音乐合伙人的高分歌曲官方榜单,收录近半年来获得音乐合伙人高分推荐的TOP100首歌曲,每日更新。跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", - "cover": "https://p2.music.126.net/fPP5T0Z8Ac15qNvRTcHa6g==/109951170074028970.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:49", - "updated_at": 1756958749724, - "created": "2024-10-25 11:51:10", - "created_at": 1729828270342, - "link": "https://music.163.com/#/discover/toplist?id=12768855486" - }, - { - "id": 5453912201, - "name": "黑胶VIP爱听榜", - "description": "云音乐站内会员播放热度TOP100的歌曲,每周四更新。\n黑胶们都爱听什么歌曲?\n热门好歌一站式收听,让你念念不忘~\n做尊贵黑胶,畅听品味好歌~", - "cover": "https://p2.music.126.net/qo6-o9n5AhMjNyejev38-A==/109951169743111905.jpg", - "update_frequency": "每周四更新", - "updated": "2025-09-04 18:05:01", - "updated_at": 1756980301317, - "created": "2021-01-08 14:30:24", - "created_at": 1610087424470, - "link": "https://music.163.com/#/discover/toplist?id=5453912201" - }, - { - "id": 71385702, - "name": "网易云ACG榜", - "description": "网易云用户一周内收听所有ACG音乐官方TOP排行榜,每周四更新。", - "cover": "https://p2.music.126.net/na1kEeCS1iZEkzOrs9r_9g==/109951167976973667.jpg", - "update_frequency": "每周四更新", - "updated": "2025-09-04 10:19:13", - "updated_at": 1756952353409, - "created": "2015-05-07 11:22:15", - "created_at": 1430968935040, - "link": "https://music.163.com/#/discover/toplist?id=71385702" - }, - { - "id": 745956260, - "name": "网易云韩语榜", - "description": "网易云用户一周内收听所有韩语歌曲官方TOP排行榜,每周四更新。", - "cover": "https://p2.music.126.net/5oN9YaFznwNGXkmi8i2Ytw==/109951167430864741.jpg", - "update_frequency": "每周四更新", - "updated": "2025-09-04 10:30:40", - "updated_at": 1756953040555, - "created": "2017-05-31 11:34:51", - "created_at": 1496201691281, - "link": "https://music.163.com/#/discover/toplist?id=745956260" - }, - { - "id": 180106, - "name": "UK排行榜周榜", - "description": "UK排行榜", - "cover": "https://p2.music.126.net/fhAqiflLy3eU-ldmBQByrg==/109951165613082765.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-01 10:26:53", - "updated_at": 1756693613998, - "created": "2013-02-19 10:09:26", - "created_at": 1361239766844, - "link": "https://music.163.com/#/discover/toplist?id=180106" - }, - { - "id": 60198, - "name": "美国Billboard榜", - "description": "美国Billboard排行榜", - "cover": "https://p2.music.126.net/rwRsVIJHQ68gglhA6TNEYA==/109951165611413732.jpg", - "update_frequency": "每周三更新", - "updated": "2025-09-03 10:40:27", - "updated_at": 1756867227129, - "created": "2013-01-22 10:51:16", - "created_at": 1358823076818, - "link": "https://music.163.com/#/discover/toplist?id=60198" - }, - { - "id": 3812895, - "name": "Beatport全球电子舞曲榜", - "description": "Beatport全球电子舞曲排行榜TOP100(本榜每周三更新)", - "cover": "https://p2.music.126.net/oT-RHuPBJiD7WMoU7WG5Rw==/109951166093489621.jpg", - "update_frequency": "每周三更新", - "updated": "2025-09-03 10:51:47", - "updated_at": 1756867907849, - "created": "2013-09-11 16:03:09", - "created_at": 1378886589466, - "link": "https://music.163.com/#/discover/toplist?id=3812895" - }, - { - "id": 21845217, - "name": "KTV唛榜", - "description": "KTV唛榜是目前国内首个以全国超过200家KTV点歌平台真实数据的当红歌曲榜单。所涉及的KTV店铺覆盖全国近100多个城市,囊括一、二、三线各级城市及地区。在综合全国各地KTV点唱数据的前提下进行汇总与统计。为了保证信息的及时性,唛榜每周五更新。提供给K迷们最新和最准确的数据。", - "cover": "https://p2.music.126.net/5wDP78s43ydVTKt62C8OjQ==/109951165613100063.jpg", - "update_frequency": "每周五更新", - "updated": "2021-11-26 17:56:43", - "updated_at": 1637920603975, - "created": "2014-07-18 11:11:33", - "created_at": 1405653093230, - "link": "https://music.163.com/#/discover/toplist?id=21845217" - }, - { - "id": 60131, - "name": "日本Oricon榜", - "description": "日本Oricon数字单曲周榜,每周三更新,欢迎关注。", - "cover": "https://p2.music.126.net/aXUPgImt8hhf4cMUZEjP4g==/109951165611417794.jpg", - "update_frequency": "每天更新", - "updated": "2025-08-29 10:20:10", - "updated_at": 1756434010126, - "created": "2013-01-08 16:51:24", - "created_at": 1357635084874, - "link": "https://music.163.com/#/discover/toplist?id=60131" - }, - { - "id": 2809513713, - "name": "网易云欧美热歌榜", - "description": "网易云用户一周内收听所有欧美歌曲官方TOP排行榜,每周四更新。\nWestern Hit Chart (updated every Thursday)", - "cover": "https://p2.music.126.net/70_EO_Dc7NT_hhfvsapzcQ==/109951167430862162.jpg", - "update_frequency": "每周四更新", - "updated": "2025-09-04 09:44:52", - "updated_at": 1756950292193, - "created": "2019-05-22 10:49:33", - "created_at": 1558493373769, - "link": "https://music.163.com/#/discover/toplist?id=2809513713" - }, - { - "id": 2809577409, - "name": "网易云欧美新歌榜", - "description": "网易云用户一周内收听所有欧美新歌(一月内最新发行)官方TOP排行榜,每天更新。\nWestern New Release Chart (new songs released in last 30 days, updated daily)\n", - "cover": "https://p2.music.126.net/0lPWpI9Ejn1OiW2LSbg-qw==/109951167430863224.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 09:44:27", - "updated_at": 1756950267625, - "created": "2019-05-22 10:46:54", - "created_at": 1558493214795, - "link": "https://music.163.com/#/discover/toplist?id=2809577409" - }, - { - "id": 27135204, - "name": "法国 NRJ Vos Hits 周榜", - "description": "法国NRJ电台(national Radio de Jeunes)成立于1981年,总部位于法国巴黎。是法国最受欢迎的音乐电台和听众最多的广播电台之一。NRJ音乐奖素有法国的“格莱美”之称。此榜单针对NRJ电台法国本土热门歌曲排行。【每周五更新】", - "cover": "https://p2.music.126.net/-fyzrPWd06FfWl_0JDAxMQ==/109951165613108584.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 10:20:26", - "updated_at": 1756434026143, - "created": "2014-09-04 18:03:33", - "created_at": 1409825013948, - "link": "https://music.163.com/#/discover/toplist?id=27135204" - }, - { - "id": 3001835560, - "name": "网易云ACG动画榜", - "description": "网易云中每天热度上升最快的100首ACG动画单曲,每日更新。", - "cover": "https://p2.music.126.net/SkGlKQ6acixthb77VlD9eQ==/109951164432300406.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:09", - "updated_at": 1756958709531, - "created": "2019-09-27 10:03:58", - "created_at": 1569549838610, - "link": "https://music.163.com/#/discover/toplist?id=3001835560" - }, - { - "id": 3001795926, - "name": "网易云ACG游戏榜", - "description": "网易云中每天热度上升最快的100首ACG游戏单曲,每日更新。", - "cover": "https://p2.music.126.net/hivOOHMwEmnn9s_6rgZwEQ==/109951164432303700.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:17", - "updated_at": 1756958717981, - "created": "2019-09-27 10:04:56", - "created_at": 1569549896656, - "link": "https://music.163.com/#/discover/toplist?id=3001795926" - }, - { - "id": 3001890046, - "name": "网易云ACG VOCALOID榜", - "description": "", - "cover": "https://p2.music.126.net/Ag7RyRCYiINcd9EtRXf6xA==/109951164432303690.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:25", - "updated_at": 1756958725790, - "created": "2019-09-27 10:05:25", - "created_at": 1569549925472, - "link": "https://music.163.com/#/discover/toplist?id=3001890046" - }, - { - "id": 5059644681, - "name": "网易云日语榜", - "description": "网易云用户一周内收听所有日语歌曲官方TOP排行榜,每周二更新。", - "cover": "https://p2.music.126.net/YFBFNI2F-4BveUpv6FKFuw==/109951167430864069.jpg", - "update_frequency": "每周二更新", - "updated": "2025-09-02 10:57:27", - "updated_at": 1756781847266, - "created": "2020-06-11 16:10:00", - "created_at": 1591863000459, - "link": "https://music.163.com/#/discover/toplist?id=5059644681" - }, - { - "id": 5059633707, - "name": "网易云摇滚榜", - "description": "网易云用户一周内收听所有摇滚歌曲官方TOP排行榜,每周五更新。", - "cover": "https://p2.music.126.net/LjkX2hktgFD1NXc3W6w0sA==/109951170048522513.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 17:02:04", - "updated_at": 1756458124397, - "created": "2020-06-11 16:13:33", - "created_at": 1591863213389, - "link": "https://music.163.com/#/discover/toplist?id=5059633707" - }, - { - "id": 5059642708, - "name": "网易云国风榜", - "description": "网易云用户一周内收听所有国风歌曲官方TOP排行榜,每周五更新。", - "cover": "https://p2.music.126.net/kTJC5OBhg8I477X_ZmXyDQ==/109951168539740982.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 09:58:05", - "updated_at": 1756432685431, - "created": "2020-06-11 16:14:18", - "created_at": 1591863258438, - "link": "https://music.163.com/#/discover/toplist?id=5059642708" - }, - { - "id": 5338990334, - "name": "潜力爆款榜", - "description": "全民一起PICK潜力好歌,每周二更新", - "cover": "https://p2.music.126.net/Mi4QPklg1mtbWAfq74tEqQ==/109951165498334721.jpg", - "update_frequency": "每周二更新", - "updated": "2025-09-02 12:05:33", - "updated_at": 1756785933871, - "created": "2020-11-17 14:24:34", - "created_at": 1605594274077, - "link": "https://music.163.com/#/discover/toplist?id=5338990334" - }, - { - "id": 5059661515, - "name": "网易云民谣榜", - "description": "网易云用户一周内收听所有民谣歌曲官方TOP排行榜,每周五更新。", - "cover": "https://p2.music.126.net/Xe9qLTAqtBAWX_hPgFHMyw==/109951170048510929.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 17:00:41", - "updated_at": 1756458041706, - "created": "2020-06-11 16:10:52", - "created_at": 1591863052757, - "link": "https://music.163.com/#/discover/toplist?id=5059661515" - }, - { - "id": 6688069460, - "name": "听歌识曲榜", - "description": "网易云音乐站内歌曲按用户“听歌识曲”次数排列,每周四更新", - "cover": "https://p2.music.126.net/wJVUAiUuykKk7yGbQxDBug==/109951167430857712.jpg", - "update_frequency": "更新24首", - "updated": "2025-09-04 23:35:03", - "updated_at": 1757000103145, - "created": "2021-03-31 16:45:54", - "created_at": 1617180354803, - "link": "https://music.163.com/#/discover/toplist?id=6688069460" - }, - { - "id": 6723173524, - "name": "网络热歌榜", - "description": "网罗一周热门网络歌曲,反映云音乐用户近一周网络热歌收听趋势。每周五更新。", - "cover": "https://p2.music.126.net/_kSxOPqQ5J5etC5DKTFwNA==/109951170048519530.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 11:03:41", - "updated_at": 1756436621202, - "created": "2021-04-22 10:41:46", - "created_at": 1619059306654, - "link": "https://music.163.com/#/discover/toplist?id=6723173524" - }, - { - "id": 6732051320, - "name": "俄语榜", - "description": "网易云音乐用户一周内收听所有俄罗斯语歌曲官方TOP排行榜,每周四更新。", - "cover": "https://p2.music.126.net/HbJ0BK5doY4I4pEMY6-FQw==/109951167430852698.jpg", - "update_frequency": "每周四更新", - "updated": "2025-09-04 10:21:42", - "updated_at": 1756952502045, - "created": "2021-04-28 12:05:12", - "created_at": 1619582712108, - "link": "https://music.163.com/#/discover/toplist?id=6732051320" - }, - { - "id": 6732014811, - "name": "越南语榜", - "description": "网易云音乐用户一周内收听所有越南语歌曲官方TOP排行榜,每周四更新。", - "cover": "https://p2.music.126.net/N-Y5maLGWgrowt3TE6RtSg==/109951167430857045.jpg", - "update_frequency": "每周四更新", - "updated": "2025-09-04 10:28:52", - "updated_at": 1756952932171, - "created": "2021-04-28 12:05:49", - "created_at": 1619582749349, - "link": "https://music.163.com/#/discover/toplist?id=6732014811" - }, - { - "id": 6886768100, - "name": "中文慢摇DJ榜", - "description": "搜索“DJ”,进入慢摇DJ专区,探索更多网络热歌!", - "cover": "https://p2.music.126.net/w_01BfDU012ojxnzLO6tYw==/109951167977358686.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:00:00", - "updated_at": 1756958400638, - "created": "2021-07-28 18:09:59", - "created_at": 1627466999260, - "link": "https://music.163.com/#/discover/toplist?id=6886768100" - }, - { - "id": 6939992364, - "name": "俄罗斯top hit流行音乐榜", - "description": "top hit榜根据俄罗斯及全球400多个无线广播的音乐播放量和YouTube播放量计算得来,每周一更新。", - "cover": "https://p2.music.126.net/KLVO8PxVZzOoLdWQQNyprA==/109951166327316568.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 17:03:04", - "updated_at": 1756458184216, - "created": "2021-08-27 11:30:02", - "created_at": 1630035002268, - "link": "https://music.163.com/#/discover/toplist?id=6939992364" - }, - { - "id": 7095271308, - "name": "泰语榜", - "description": "网易云音乐用户一周内收听所有泰语歌曲官方TOP排行榜,每周四更新。", - "cover": "https://p2.music.126.net/4W0WBHBgwYlYfRniuyL47A==/109951167430843284.jpg", - "update_frequency": "每周四更新", - "updated": "2025-09-04 10:41:26", - "updated_at": 1756953686280, - "created": "2021-11-29 14:22:17", - "created_at": 1638166937809, - "link": "https://music.163.com/#/discover/toplist?id=7095271308" - }, - { - "id": 7356827205, - "name": "BEAT排行榜", - "description": "嘿~朋友,欢迎来到本周的Beat排行榜\n我们挑选了近一周内热门的Beat作品,一起来感受下大家近期的“口味”吧!\n每周都会更新哦,记得按下收藏,我每天都会在这里等你来与我交流!~\n\n关于Beat的必备小知识\nQ1.什么是Beat?\nBeat即节拍,特指嘻哈音乐中的伴奏,现在也可指所有流行音乐的伴奏\nQ2.Beat有什么用?\n在Beat的帮助下,你只需要填词演唱即可完成一首歌曲的创作,而且Beat也可以作为各种流媒体的背景音乐或是多场景现场演出的得力助手,不同风格的Beat还能为你的音乐创作提供灵感哦~\n搜索关注“BEATSOUL激灵”网易云官号,探索更多炸裂音乐内容~", - "cover": "https://p2.music.126.net/yhzlQJCJ9NcT4MvJBG_HgQ==/109951167977014958.jpg", - "update_frequency": "每周四更新", - "updated": "2025-09-04 20:05:00", - "updated_at": 1756987500926, - "created": "2022-03-29 19:39:58", - "created_at": 1648553998273, - "link": "https://music.163.com/#/discover/toplist?id=7356827205" - }, - { - "id": 7325478166, - "name": "星云榜VOL.29 Addison Rae新专来袭,寻找最真实的自己", - "description": "精心评审,专业推荐。每周五更新,为你呈现宝藏新歌。\n1、《Aquamarinee》歌手:Addison Rae\n2、《羽毛剑》歌手:秦凡淇\n3、《Take me back》歌手:HAIM\n4、《妈妈的眼睛》歌手:张震岳\n5、《25岁永不停下》歌手:张醒婵\n6、《雨季症候》歌手:SHARK卫彬月\n7、《山东王FREESTYLE》歌手:华云龙KLE\n8、《LOVE I NEED》歌手:陈瑜Estelle\n9、《FFFFF》歌手:刘柏辛Lexie\n10、《Vipaśyanā》歌手:Namunong\n本期封面:Addison Rae,Aquamarine", - "cover": "https://p2.music.126.net/u440jFG0N5i06C9ejOeMCQ==/109951171381091309.jpg", - "update_frequency": "每周五更新", - "updated": "2025-06-30 16:17:26", - "updated_at": 1751271446032, - "created": "2022-03-09 11:24:46", - "created_at": 1646796286440, - "link": "https://music.163.com/#/discover/toplist?id=7325478166" - }, - { - "id": 7603212484, - "name": "LOOK直播歌曲榜", - "description": "LOOK直播好歌共赏,专属你的声音聊愈场。榜单选取符合条件且近7日热度最高的前50首歌曲,每周二更新。", - "cover": "https://p1.music.126.net/u-RQC-LyY0aoeseRumJ14A==/109951167977730469.jpg", - "update_frequency": "每周二更新", - "updated": "2024-05-07 21:23:03", - "updated_at": 1715088183913, - "created": "2022-08-23 09:54:56", - "created_at": 1661219696017, - "link": "https://music.163.com/#/discover/toplist?id=7603212484" - }, - { - "id": 7775163417, - "name": "赏音榜", - "description": "云音乐歌曲赏音榜,以让用户鉴赏到更多潜力好歌为目的,以用户对歌曲互动热度为核心,按照综合数据排名取前100名,每日更新", - "cover": "https://p1.music.126.net/m9hQzC-d5wefBipedNPaHg==/109951168178601971.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:36", - "updated_at": 1756958736108, - "created": "2022-11-28 14:46:19", - "created_at": 1669617979380, - "link": "https://music.163.com/#/discover/toplist?id=7775163417" - }, - { - "id": 7785123708, - "name": "黑胶VIP新歌榜", - "description": "云音乐站内播放热度TOP50的7日内新晋会员歌曲,每日更新。\n更适合黑胶体质的新歌榜单来啦!\n耳机分你一只,新曲一起来听~\n成为尊贵黑胶,不错过每一首VIP新歌!", - "cover": "https://p1.music.126.net/vjitpkT9nXBCth6tvdDMWg==/109951169743115266.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:37", - "updated_at": 1756958737548, - "created": "2022-12-02 18:51:16", - "created_at": 1669978276103, - "link": "https://music.163.com/#/discover/toplist?id=7785123708" - }, - { - "id": 7785066739, - "name": "黑胶VIP热歌榜", - "description": "云音乐站内播放和付费热度TOP50的会员歌曲,每日更新。\n更适合黑胶体质的热歌榜单来啦!\n哪首是你的单曲循环?\n成为尊贵黑胶,随心畅听热门好歌!", - "cover": "https://p1.music.126.net/Ay3mLgQ9weG_c8JjYrD-Bw==/109951169743106495.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:36", - "updated_at": 1756958736684, - "created": "2022-12-02 18:51:31", - "created_at": 1669978291024, - "link": "https://music.163.com/#/discover/toplist?id=7785066739" - }, - { - "id": 7785091694, - "name": "黑胶VIP爱搜榜", - "description": "云音乐站内会员搜索播放热度TOP50的歌曲,每日更新。\n更适合黑胶体质的搜歌榜单来啦!\n热搜好歌一网打尽,只为有品位的你~\n成为尊贵黑胶,你搜我听畅听不停!", - "cover": "https://p1.music.126.net/R7DtZqNraesnsiaIKvzTHA==/109951169743112799.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:41", - "updated_at": 1756958741914, - "created": "2022-12-02 18:51:43", - "created_at": 1669978303210, - "link": "https://music.163.com/#/discover/toplist?id=7785091694" - }, - { - "id": 8246775932, - "name": "实时热度榜", - "description": "每天9-23点为你精选当下歌曲热度最高的歌曲", - "cover": "https://p1.music.126.net/U7ZbdpWzRdmZVr6Khn_4ag==/109951168673982478.jpg", - "update_frequency": "更新65首", - "updated": "2025-09-05 09:30:07", - "updated_at": 1757035807371, - "created": "2023-03-20 10:39:59", - "created_at": 1679279999154, - "link": "https://music.163.com/#/discover/toplist?id=8246775932" - }, - { - "id": 8537588450, - "name": "喜力®星电音派对潮音榜", - "description": "乐无界,越未来!《星电音联盟》歌曲官方榜单,每周一更新,让云村村民们随时随地躁起高燃派对氛围!喜力®星电音构建狂欢永不停歇的新奇电音宇宙,激活潮流基因,释放先锋灵感,跨维开启奇妙电音之旅!", - "cover": "https://p1.music.126.net/HVu2hGYvzN5XBuvFc_4Bgg==/109951168730309120.jpg", - "update_frequency": "每周五更新", - "updated": "2024-09-16 12:05:30", - "updated_at": 1726459530378, - "created": "2023-07-07 10:48:39", - "created_at": 1688698119437, - "link": "https://music.163.com/#/discover/toplist?id=8537588450" - }, - { - "id": 8661209031, - "name": "乐夏榜", - "description": "听乐夏,上网易云,一头扎进爱音乐的人群! 综艺《乐队的夏天3》官方榜单,每周一更新。和三星折叠屏手机一起畅听《乐队的夏天3》官方榜单,折叠看三星,五代更来劲。", - "cover": "https://p1.music.126.net/RlStCmE97y0xYFk7rS3Zww==/109951168864907822.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 12:05:41", - "updated_at": 1756699541864, - "created": "2023-08-16 17:47:27", - "created_at": 1692179247425, - "link": "https://music.163.com/#/discover/toplist?id=8661209031" - }, - { - "id": 8703179781, - "name": "特斯拉车友爱听榜", - "description": null, - "cover": "https://p1.music.126.net/UL8dhobSa3TR6Wd1JmWe_g==/109951168924385363.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 16:05:08", - "updated_at": 1756713908385, - "created": "2023-08-31 12:29:59", - "created_at": 1693456199735, - "link": "https://music.163.com/#/discover/toplist?id=8703179781" - }, - { - "id": 8703052295, - "name": "理想车友爱听榜", - "description": null, - "cover": "https://p1.music.126.net/U--PWdWupY1ER5cVSjr1jQ==/109951168928365496.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 16:05:09", - "updated_at": 1756713909830, - "created": "2023-08-31 12:38:29", - "created_at": 1693456709598, - "link": "https://music.163.com/#/discover/toplist?id=8703052295" - }, - { - "id": 8702582160, - "name": "比亚迪车友爱听榜", - "description": null, - "cover": "https://p1.music.126.net/S1OG-OLTaofa3HfrHW48kA==/109951168924393585.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 16:05:07", - "updated_at": 1756713907323, - "created": "2023-08-31 12:38:42", - "created_at": 1693456722262, - "link": "https://music.163.com/#/discover/toplist?id=8702582160" - }, - { - "id": 8703220480, - "name": "蔚来车友爱听榜", - "description": null, - "cover": "https://p1.music.126.net/r9kBQNsOro1EAB82Ol51WQ==/109951168924380971.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 16:05:04", - "updated_at": 1756713904286, - "created": "2023-08-31 12:38:56", - "created_at": 1693456736086, - "link": "https://music.163.com/#/discover/toplist?id=8703220480" - }, - { - "id": 8702982391, - "name": "极氪车友爱听榜", - "description": null, - "cover": "https://p1.music.126.net/Cu0RXoKewSPM9Gyc7Cp8jw==/109951168924391596.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 16:05:06", - "updated_at": 1756713906978, - "created": "2023-08-31 12:39:19", - "created_at": 1693456759762, - "link": "https://music.163.com/#/discover/toplist?id=8702982391" - }, - { - "id": 8532443277, - "name": "蛋仔派对听歌榜", - "description": "来自蛋仔岛的热播歌曲速递,网易《蛋仔派对》官方榜单,每周五更新。云村村民们,和蛋仔们一起随歌摇摆吧!", - "cover": "https://p1.music.126.net/TMb0be5QLMZKOFeuOKT4tg==/109951168717283910.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 12:05:43", - "updated_at": 1756440343562, - "created": "2023-07-05 10:32:04", - "created_at": 1688524324879, - "link": "https://music.163.com/#/discover/toplist?id=8532443277" - }, - { - "id": 9651277674, - "name": "AI歌曲榜", - "description": "精心挑选每日最新最热AI生成歌曲,榜单每日更新,一起感受AI的独特魅力吧!", - "cover": "https://p1.music.126.net/M0m6GeZ1Y8Osz9jqxaW8Wg==/109951169462048035.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:43", - "updated_at": 1756958743415, - "created": "2024-04-02 18:25:12", - "created_at": 1712053512213, - "link": "https://music.163.com/#/discover/toplist?id=9651277674" - }, - { - "id": 10131772880, - "name": "昊铂车友爱听榜", - "description": null, - "cover": "https://p1.music.126.net/EL7H4rkKejZY7Uv54EFNXg==/109951169655010112.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 16:05:03", - "updated_at": 1756713903085, - "created": "2024-06-04 16:50:00", - "created_at": 1717491000945, - "link": "https://music.163.com/#/discover/toplist?id=10131772880" - }, - { - "id": 10162841534, - "name": "埃安车友爱听榜", - "description": "埃安车友平时都在听什么??", - "cover": "https://p1.music.126.net/FcP1U6Bck0wPKqd0XgBwSQ==/109951169679731241.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 16:05:05", - "updated_at": 1756713905568, - "created": "2024-06-12 13:31:44", - "created_at": 1718170304691, - "link": "https://music.163.com/#/discover/toplist?id=10162841534" - }, - { - "id": 12225155968, - "name": "欧美R&B榜", - "description": "云音乐用户一周内收听节奏布鲁斯(R&B)官方TOP排行榜,每周五更新。", - "cover": "https://p1.music.126.net/0E6MzYzyA5uvQ4CSoIG2mw==/109951169739660034.jpg", - "update_frequency": "每周五更新", - "updated": "2025-08-29 12:05:45", - "updated_at": 1756440345198, - "created": "2024-06-25 18:14:05", - "created_at": 1719310445382, - "link": "https://music.163.com/#/discover/toplist?id=12225155968" - }, - { - "id": 12344472377, - "name": "黑胶VIP限免榜", - "description": "云音乐站内热度最高的限免播放歌曲TOP50,每日更新。\n人气旋律一听就会爱上!现在马上进入免费模式(点击云音乐首页左上角侧边栏,选择“免费听歌”)畅听全榜吧!", - "cover": "https://p1.music.126.net/WXCSf4ZNcDCdOTY5ixm3Bg==/109951169809318325.jpg", - "update_frequency": "每天更新", - "updated": "2025-09-04 12:05:45", - "updated_at": 1756958745487, - "created": "2024-07-23 16:08:37", - "created_at": 1721722117311, - "link": "https://music.163.com/#/discover/toplist?id=12344472377" - }, - { - "id": 12717025277, - "name": "吉利车友爱听榜", - "description": null, - "cover": "https://p1.music.126.net/XVmZb3JSyrwMgqu9WVz61A==/109951170037568570.jpg", - "update_frequency": "每周一更新", - "updated": "2025-09-01 16:05:01", - "updated_at": 1756713901625, - "created": "2024-10-12 13:44:04", - "created_at": 1728711844151, - "link": "https://music.163.com/#/discover/toplist?id=12717025277" - } - ] +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": [ + { + "id": 19723756, + "name": "飙升榜", + "description": "云音乐中每天热度上升最快的100首单曲,每日更新。", + "cover": "https://p2.music.126.net/rIi7Qzy2i2Y_1QD7cd0MYA==/109951170048506929.jpg", + "update_frequency": "更新78首", + "updated": "2025-09-05 08:24:41", + "updated_at": 1757031881385, + "created": "2014-06-30 15:58:56", + "created_at": 1404115136883, + "link": "https://music.163.com/#/discover/toplist?id=19723756" + }, + { + "id": 3779629, + "name": "新歌榜", + "description": "云音乐新歌榜:云音乐用户一周内收听所有新歌(一月内最新发行) 官方TOP排行榜,每天更新。", + "cover": "https://p2.music.126.net/5guhqPBTcIrrhLBotgaT6w==/109951170048511751.jpg", + "update_frequency": "刚刚更新", + "updated": "2025-09-05 08:24:50", + "updated_at": 1757031890587, + "created": "2013-09-09 18:09:58", + "created_at": 1378721398225, + "link": "https://music.163.com/#/discover/toplist?id=3779629" + }, + { + "id": 2884035, + "name": "原创榜", + "description": "云音乐独立原创音乐人作品官方榜单,以推荐优秀原创作品为目的。每周四网易云音乐首发。申请网易音乐人:http://music.163.com/nmusician/", + "cover": "https://p2.music.126.net/BaP9nrocNTL3gGThysv4eQ==/109951170091896587.jpg", + "update_frequency": "每周四更新", + "updated": "2025-09-04 10:54:42", + "updated_at": 1756954482653, + "created": "2013-07-25 14:05:25", + "created_at": 1374732325894, + "link": "https://music.163.com/#/discover/toplist?id=2884035" + }, + { + "id": 3778678, + "name": "热歌榜", + "description": "云音乐热歌榜:云音乐用户一周内收听所有线上歌曲官方TOP排行榜,每日更新。", + "cover": "https://p2.music.126.net/0SUEG8yDACfx0Bw2MYFv4Q==/109951170048519512.jpg", + "update_frequency": "更新14首", + "updated": "2025-09-05 08:25:03", + "updated_at": 1757031903733, + "created": "2013-09-09 18:10:06", + "created_at": 1378721406014, + "link": "https://music.163.com/#/discover/toplist?id=3778678" + }, + { + "id": 991319590, + "name": "网易云中文说唱榜", + "description": "网易云原创说唱音乐人作品官方榜单,每周五更新。以网易云用户一周播放热度为主,收录2个月内发行的原创说唱作品,按照综合数据排名取前50名。申请网易音乐人:http://music.163.com/nmusician", + "cover": "https://p2.music.126.net/GgHbgDfGXHpE2YTchU7IvA==/109951171510498108.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-29 10:19:58", + "updated_at": 1756433998618, + "created": "2017-11-10 13:06:29", + "created_at": 1510290389440, + "link": "https://music.163.com/#/discover/toplist?id=991319590" + }, + { + "id": 71384707, + "name": "网易云古典榜", + "description": "网易云用户一周内收听所有古典音乐官方TOP排行榜,每周四更新。", + "cover": "https://p2.music.126.net/urByD_AmfBDBrs7fA9-O8A==/109951167976973225.jpg", + "update_frequency": "每周四更新", + "updated": "2025-09-04 10:52:54", + "updated_at": 1756954374913, + "created": "2015-05-07 11:22:00", + "created_at": 1430968920537, + "link": "https://music.163.com/#/discover/toplist?id=71384707" + }, + { + "id": 1978921795, + "name": "网易云电音榜", + "description": "网易云用户一周内收听电子音乐官方TOP排行榜,每周五更新。喜力星电音,用先锋电音带你解锁全新维度和体验!", + "cover": "https://p2.music.126.net/hXGObvXfsGtFjFvRhOYAkA==/109951170091888741.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-29 12:00:01", + "updated_at": 1756440001367, + "created": "2017-11-16 17:47:12", + "created_at": 1510825632233, + "link": "https://music.163.com/#/discover/toplist?id=1978921795" + }, + { + "id": 14028249541, + "name": "网易云全球说唱榜", + "description": "想聆听世界的说唱节奏?全球说唱榜每周五更新,聚焦华语地区以外的优秀说唱作品。根据云音乐用户每周播放热度数据,按照综合数据排名取前 50 名。", + "cover": "https://p2.music.126.net/0hhFjP6WyIjHYDXKW5E7BA==/109951171535150782.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-29 11:51:16", + "updated_at": 1756439476712, + "created": "2025-07-24 14:09:26", + "created_at": 1753337366883, + "link": "https://music.163.com/#/discover/toplist?id=14028249541" + }, + { + "id": 13372522766, + "name": "潮流风向榜", + "description": "精心挑选云音乐极具声量的音乐作品,呈现歌曲真实热度趋势,榜单每日更新。", + "cover": "https://p2.music.126.net/dIKA5e7jCncz2Br1Toxgaw==/109951170621574552.jpg", + "update_frequency": "每天更新", + "updated": "2025-09-04 12:05:58", + "updated_at": 1756958758114, + "created": "2025-02-26 14:01:33", + "created_at": 1740549693794, + "link": "https://music.163.com/#/discover/toplist?id=13372522766" + }, + { + "id": 12911403728, + "name": "音乐合伙人推荐榜", + "description": "音乐合伙人近一个月内推荐过的歌曲官方TOP排行榜,每周一更新。 跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", + "cover": "https://p2.music.126.net/s6ITpmGjKbyDpi7DPkqd2w==/109951170187827373.jpg", + "update_frequency": "每周一更新", + "updated": "2025-09-01 12:06:04", + "updated_at": 1756699564013, + "created": "2024-11-25 15:14:30", + "created_at": 1732518870190, + "link": "https://music.163.com/#/discover/toplist?id=12911403728" + }, + { + "id": 12911589513, + "name": "音乐合伙人热歌榜", + "description": "音乐合伙人近一周评定过的高分热歌官方TOP排行榜,每周一更新。 跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", + "cover": "https://p2.music.126.net/RgYxQmB-ZUjkMRo2N1jWnQ==/109951170187823494.jpg", + "update_frequency": "每周一更新", + "updated": "2025-09-01 12:06:01", + "updated_at": 1756699561725, + "created": "2024-11-25 15:13:46", + "created_at": 1732518826543, + "link": "https://music.163.com/#/discover/toplist?id=12911589513" + }, + { + "id": 12911619970, + "name": "音乐合伙人留名榜", + "description": "音乐合伙人近一个月内留名过的所有歌曲官方TOP排行榜,每周一更新。 跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", + "cover": "https://p2.music.126.net/aJJzGIxhkVaD7dX0XBNUnw==/109951170187831145.jpg", + "update_frequency": "每周一更新", + "updated": "2025-09-01 12:05:49", + "updated_at": 1756699549550, + "created": "2024-11-25 15:12:50", + "created_at": 1732518770868, + "link": "https://music.163.com/#/discover/toplist?id=12911619970" + }, + { + "id": 12911379734, + "name": "音乐合伙人高分新歌榜", + "description": "音乐合伙人近期评定过的所有新歌(一个月内最新发行)官方TOP排行榜,每周一更新。 跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", + "cover": "https://p2.music.126.net/bfk15bvanhdPFU7yjPFgWA==/109951170187832038.jpg", + "update_frequency": "每周一更新", + "updated": "2025-09-01 12:05:54", + "updated_at": 1756699554077, + "created": "2024-11-25 15:11:53", + "created_at": 1732518713161, + "link": "https://music.163.com/#/discover/toplist?id=12911379734" + }, + { + "id": 12768855486, + "name": "音乐合伙人高分榜", + "description": "音乐合伙人的高分歌曲官方榜单,收录近半年来获得音乐合伙人高分推荐的TOP100首歌曲,每日更新。跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", + "cover": "https://p2.music.126.net/fPP5T0Z8Ac15qNvRTcHa6g==/109951170074028970.jpg", + "update_frequency": "每天更新", + "updated": "2025-09-04 12:05:49", + "updated_at": 1756958749724, + "created": "2024-10-25 11:51:10", + "created_at": 1729828270342, + "link": "https://music.163.com/#/discover/toplist?id=12768855486" + }, + { + "id": 5453912201, + "name": "黑胶VIP爱听榜", + "description": "云音乐站内会员播放热度TOP100的歌曲,每周四更新。\n黑胶们都爱听什么歌曲?\n热门好歌一站式收听,让你念念不忘~\n做尊贵黑胶,畅听品味好歌~", + "cover": "https://p2.music.126.net/qo6-o9n5AhMjNyejev38-A==/109951169743111905.jpg", + "update_frequency": "每周四更新", + "updated": "2025-09-04 18:05:01", + "updated_at": 1756980301317, + "created": "2021-01-08 14:30:24", + "created_at": 1610087424470, + "link": "https://music.163.com/#/discover/toplist?id=5453912201" + }, + { + "id": 71385702, + "name": "网易云ACG榜", + "description": "网易云用户一周内收听所有ACG音乐官方TOP排行榜,每周四更新。", + "cover": "https://p2.music.126.net/na1kEeCS1iZEkzOrs9r_9g==/109951167976973667.jpg", + "update_frequency": "每周四更新", + "updated": "2025-09-04 10:19:13", + "updated_at": 1756952353409, + "created": "2015-05-07 11:22:15", + "created_at": 1430968935040, + "link": "https://music.163.com/#/discover/toplist?id=71385702" + }, + { + "id": 745956260, + "name": "网易云韩语榜", + "description": "网易云用户一周内收听所有韩语歌曲官方TOP排行榜,每周四更新。", + "cover": "https://p2.music.126.net/5oN9YaFznwNGXkmi8i2Ytw==/109951167430864741.jpg", + "update_frequency": "每周四更新", + "updated": "2025-09-04 10:30:40", + "updated_at": 1756953040555, + "created": "2017-05-31 11:34:51", + "created_at": 1496201691281, + "link": "https://music.163.com/#/discover/toplist?id=745956260" + }, + { + "id": 180106, + "name": "UK排行榜周榜", + "description": "UK排行榜", + "cover": "https://p2.music.126.net/fhAqiflLy3eU-ldmBQByrg==/109951165613082765.jpg", + "update_frequency": "每天更新", + "updated": "2025-09-01 10:26:53", + "updated_at": 1756693613998, + "created": "2013-02-19 10:09:26", + "created_at": 1361239766844, + "link": "https://music.163.com/#/discover/toplist?id=180106" + }, + { + "id": 60198, + "name": "美国Billboard榜", + "description": "美国Billboard排行榜", + "cover": "https://p2.music.126.net/rwRsVIJHQ68gglhA6TNEYA==/109951165611413732.jpg", + "update_frequency": "每周三更新", + "updated": "2025-09-03 10:40:27", + "updated_at": 1756867227129, + "created": "2013-01-22 10:51:16", + "created_at": 1358823076818, + "link": "https://music.163.com/#/discover/toplist?id=60198" + }, + { + "id": 3812895, + "name": "Beatport全球电子舞曲榜", + "description": "Beatport全球电子舞曲排行榜TOP100(本榜每周三更新)", + "cover": "https://p2.music.126.net/oT-RHuPBJiD7WMoU7WG5Rw==/109951166093489621.jpg", + "update_frequency": "每周三更新", + "updated": "2025-09-03 10:51:47", + "updated_at": 1756867907849, + "created": "2013-09-11 16:03:09", + "created_at": 1378886589466, + "link": "https://music.163.com/#/discover/toplist?id=3812895" + }, + { + "id": 21845217, + "name": "KTV唛榜", + "description": "KTV唛榜是目前国内首个以全国超过200家KTV点歌平台真实数据的当红歌曲榜单。所涉及的KTV店铺覆盖全国近100多个城市,囊括一、二、三线各级城市及地区。在综合全国各地KTV点唱数据的前提下进行汇总与统计。为了保证信息的及时性,唛榜每周五更新。提供给K迷们最新和最准确的数据。", + "cover": "https://p2.music.126.net/5wDP78s43ydVTKt62C8OjQ==/109951165613100063.jpg", + "update_frequency": "每周五更新", + "updated": "2021-11-26 17:56:43", + "updated_at": 1637920603975, + "created": "2014-07-18 11:11:33", + "created_at": 1405653093230, + "link": "https://music.163.com/#/discover/toplist?id=21845217" + }, + { + "id": 60131, + "name": "日本Oricon榜", + "description": "日本Oricon数字单曲周榜,每周三更新,欢迎关注。", + "cover": "https://p2.music.126.net/aXUPgImt8hhf4cMUZEjP4g==/109951165611417794.jpg", + "update_frequency": "每天更新", + "updated": "2025-08-29 10:20:10", + "updated_at": 1756434010126, + "created": "2013-01-08 16:51:24", + "created_at": 1357635084874, + "link": "https://music.163.com/#/discover/toplist?id=60131" + }, + { + "id": 2809513713, + "name": "网易云欧美热歌榜", + "description": "网易云用户一周内收听所有欧美歌曲官方TOP排行榜,每周四更新。\nWestern Hit Chart (updated every Thursday)", + "cover": "https://p2.music.126.net/70_EO_Dc7NT_hhfvsapzcQ==/109951167430862162.jpg", + "update_frequency": "每周四更新", + "updated": "2025-09-04 09:44:52", + "updated_at": 1756950292193, + "created": "2019-05-22 10:49:33", + "created_at": 1558493373769, + "link": "https://music.163.com/#/discover/toplist?id=2809513713" + }, + { + "id": 2809577409, + "name": "网易云欧美新歌榜", + "description": "网易云用户一周内收听所有欧美新歌(一月内最新发行)官方TOP排行榜,每天更新。\nWestern New Release Chart (new songs released in last 30 days, updated daily)\n", + "cover": "https://p2.music.126.net/0lPWpI9Ejn1OiW2LSbg-qw==/109951167430863224.jpg", + "update_frequency": "每天更新", + "updated": "2025-09-04 09:44:27", + "updated_at": 1756950267625, + "created": "2019-05-22 10:46:54", + "created_at": 1558493214795, + "link": "https://music.163.com/#/discover/toplist?id=2809577409" + }, + { + "id": 27135204, + "name": "法国 NRJ Vos Hits 周榜", + "description": "法国NRJ电台(national Radio de Jeunes)成立于1981年,总部位于法国巴黎。是法国最受欢迎的音乐电台和听众最多的广播电台之一。NRJ音乐奖素有法国的“格莱美”之称。此榜单针对NRJ电台法国本土热门歌曲排行。【每周五更新】", + "cover": "https://p2.music.126.net/-fyzrPWd06FfWl_0JDAxMQ==/109951165613108584.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-29 10:20:26", + "updated_at": 1756434026143, + "created": "2014-09-04 18:03:33", + "created_at": 1409825013948, + "link": "https://music.163.com/#/discover/toplist?id=27135204" + }, + { + "id": 3001835560, + "name": "网易云ACG动画榜", + "description": "网易云中每天热度上升最快的100首ACG动画单曲,每日更新。", + "cover": "https://p2.music.126.net/SkGlKQ6acixthb77VlD9eQ==/109951164432300406.jpg", + "update_frequency": "每天更新", + "updated": "2025-09-04 12:05:09", + "updated_at": 1756958709531, + "created": "2019-09-27 10:03:58", + "created_at": 1569549838610, + "link": "https://music.163.com/#/discover/toplist?id=3001835560" + }, + { + "id": 3001795926, + "name": "网易云ACG游戏榜", + "description": "网易云中每天热度上升最快的100首ACG游戏单曲,每日更新。", + "cover": "https://p2.music.126.net/hivOOHMwEmnn9s_6rgZwEQ==/109951164432303700.jpg", + "update_frequency": "每天更新", + "updated": "2025-09-04 12:05:17", + "updated_at": 1756958717981, + "created": "2019-09-27 10:04:56", + "created_at": 1569549896656, + "link": "https://music.163.com/#/discover/toplist?id=3001795926" + }, + { + "id": 3001890046, + "name": "网易云ACG VOCALOID榜", + "description": "", + "cover": "https://p2.music.126.net/Ag7RyRCYiINcd9EtRXf6xA==/109951164432303690.jpg", + "update_frequency": "每天更新", + "updated": "2025-09-04 12:05:25", + "updated_at": 1756958725790, + "created": "2019-09-27 10:05:25", + "created_at": 1569549925472, + "link": "https://music.163.com/#/discover/toplist?id=3001890046" + }, + { + "id": 5059644681, + "name": "网易云日语榜", + "description": "网易云用户一周内收听所有日语歌曲官方TOP排行榜,每周二更新。", + "cover": "https://p2.music.126.net/YFBFNI2F-4BveUpv6FKFuw==/109951167430864069.jpg", + "update_frequency": "每周二更新", + "updated": "2025-09-02 10:57:27", + "updated_at": 1756781847266, + "created": "2020-06-11 16:10:00", + "created_at": 1591863000459, + "link": "https://music.163.com/#/discover/toplist?id=5059644681" + }, + { + "id": 5059633707, + "name": "网易云摇滚榜", + "description": "网易云用户一周内收听所有摇滚歌曲官方TOP排行榜,每周五更新。", + "cover": "https://p2.music.126.net/LjkX2hktgFD1NXc3W6w0sA==/109951170048522513.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-29 17:02:04", + "updated_at": 1756458124397, + "created": "2020-06-11 16:13:33", + "created_at": 1591863213389, + "link": "https://music.163.com/#/discover/toplist?id=5059633707" + }, + { + "id": 5059642708, + "name": "网易云国风榜", + "description": "网易云用户一周内收听所有国风歌曲官方TOP排行榜,每周五更新。", + "cover": "https://p2.music.126.net/kTJC5OBhg8I477X_ZmXyDQ==/109951168539740982.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-29 09:58:05", + "updated_at": 1756432685431, + "created": "2020-06-11 16:14:18", + "created_at": 1591863258438, + "link": "https://music.163.com/#/discover/toplist?id=5059642708" + }, + { + "id": 5338990334, + "name": "潜力爆款榜", + "description": "全民一起PICK潜力好歌,每周二更新", + "cover": "https://p2.music.126.net/Mi4QPklg1mtbWAfq74tEqQ==/109951165498334721.jpg", + "update_frequency": "每周二更新", + "updated": "2025-09-02 12:05:33", + "updated_at": 1756785933871, + "created": "2020-11-17 14:24:34", + "created_at": 1605594274077, + "link": "https://music.163.com/#/discover/toplist?id=5338990334" + }, + { + "id": 5059661515, + "name": "网易云民谣榜", + "description": "网易云用户一周内收听所有民谣歌曲官方TOP排行榜,每周五更新。", + "cover": "https://p2.music.126.net/Xe9qLTAqtBAWX_hPgFHMyw==/109951170048510929.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-29 17:00:41", + "updated_at": 1756458041706, + "created": "2020-06-11 16:10:52", + "created_at": 1591863052757, + "link": "https://music.163.com/#/discover/toplist?id=5059661515" + }, + { + "id": 6688069460, + "name": "听歌识曲榜", + "description": "网易云音乐站内歌曲按用户“听歌识曲”次数排列,每周四更新", + "cover": "https://p2.music.126.net/wJVUAiUuykKk7yGbQxDBug==/109951167430857712.jpg", + "update_frequency": "更新24首", + "updated": "2025-09-04 23:35:03", + "updated_at": 1757000103145, + "created": "2021-03-31 16:45:54", + "created_at": 1617180354803, + "link": "https://music.163.com/#/discover/toplist?id=6688069460" + }, + { + "id": 6723173524, + "name": "网络热歌榜", + "description": "网罗一周热门网络歌曲,反映云音乐用户近一周网络热歌收听趋势。每周五更新。", + "cover": "https://p2.music.126.net/_kSxOPqQ5J5etC5DKTFwNA==/109951170048519530.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-29 11:03:41", + "updated_at": 1756436621202, + "created": "2021-04-22 10:41:46", + "created_at": 1619059306654, + "link": "https://music.163.com/#/discover/toplist?id=6723173524" + }, + { + "id": 6732051320, + "name": "俄语榜", + "description": "网易云音乐用户一周内收听所有俄罗斯语歌曲官方TOP排行榜,每周四更新。", + "cover": "https://p2.music.126.net/HbJ0BK5doY4I4pEMY6-FQw==/109951167430852698.jpg", + "update_frequency": "每周四更新", + "updated": "2025-09-04 10:21:42", + "updated_at": 1756952502045, + "created": "2021-04-28 12:05:12", + "created_at": 1619582712108, + "link": "https://music.163.com/#/discover/toplist?id=6732051320" + }, + { + "id": 6732014811, + "name": "越南语榜", + "description": "网易云音乐用户一周内收听所有越南语歌曲官方TOP排行榜,每周四更新。", + "cover": "https://p2.music.126.net/N-Y5maLGWgrowt3TE6RtSg==/109951167430857045.jpg", + "update_frequency": "每周四更新", + "updated": "2025-09-04 10:28:52", + "updated_at": 1756952932171, + "created": "2021-04-28 12:05:49", + "created_at": 1619582749349, + "link": "https://music.163.com/#/discover/toplist?id=6732014811" + }, + { + "id": 6886768100, + "name": "中文慢摇DJ榜", + "description": "搜索“DJ”,进入慢摇DJ专区,探索更多网络热歌!", + "cover": "https://p2.music.126.net/w_01BfDU012ojxnzLO6tYw==/109951167977358686.jpg", + "update_frequency": "每天更新", + "updated": "2025-09-04 12:00:00", + "updated_at": 1756958400638, + "created": "2021-07-28 18:09:59", + "created_at": 1627466999260, + "link": "https://music.163.com/#/discover/toplist?id=6886768100" + }, + { + "id": 6939992364, + "name": "俄罗斯top hit流行音乐榜", + "description": "top hit榜根据俄罗斯及全球400多个无线广播的音乐播放量和YouTube播放量计算得来,每周一更新。", + "cover": "https://p2.music.126.net/KLVO8PxVZzOoLdWQQNyprA==/109951166327316568.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-29 17:03:04", + "updated_at": 1756458184216, + "created": "2021-08-27 11:30:02", + "created_at": 1630035002268, + "link": "https://music.163.com/#/discover/toplist?id=6939992364" + }, + { + "id": 7095271308, + "name": "泰语榜", + "description": "网易云音乐用户一周内收听所有泰语歌曲官方TOP排行榜,每周四更新。", + "cover": "https://p2.music.126.net/4W0WBHBgwYlYfRniuyL47A==/109951167430843284.jpg", + "update_frequency": "每周四更新", + "updated": "2025-09-04 10:41:26", + "updated_at": 1756953686280, + "created": "2021-11-29 14:22:17", + "created_at": 1638166937809, + "link": "https://music.163.com/#/discover/toplist?id=7095271308" + }, + { + "id": 7356827205, + "name": "BEAT排行榜", + "description": "嘿~朋友,欢迎来到本周的Beat排行榜\n我们挑选了近一周内热门的Beat作品,一起来感受下大家近期的“口味”吧!\n每周都会更新哦,记得按下收藏,我每天都会在这里等你来与我交流!~\n\n关于Beat的必备小知识\nQ1.什么是Beat?\nBeat即节拍,特指嘻哈音乐中的伴奏,现在也可指所有流行音乐的伴奏\nQ2.Beat有什么用?\n在Beat的帮助下,你只需要填词演唱即可完成一首歌曲的创作,而且Beat也可以作为各种流媒体的背景音乐或是多场景现场演出的得力助手,不同风格的Beat还能为你的音乐创作提供灵感哦~\n搜索关注“BEATSOUL激灵”网易云官号,探索更多炸裂音乐内容~", + "cover": "https://p2.music.126.net/yhzlQJCJ9NcT4MvJBG_HgQ==/109951167977014958.jpg", + "update_frequency": "每周四更新", + "updated": "2025-09-04 20:05:00", + "updated_at": 1756987500926, + "created": "2022-03-29 19:39:58", + "created_at": 1648553998273, + "link": "https://music.163.com/#/discover/toplist?id=7356827205" + }, + { + "id": 7325478166, + "name": "星云榜VOL.29 Addison Rae新专来袭,寻找最真实的自己", + "description": "精心评审,专业推荐。每周五更新,为你呈现宝藏新歌。\n1、《Aquamarinee》歌手:Addison Rae\n2、《羽毛剑》歌手:秦凡淇\n3、《Take me back》歌手:HAIM\n4、《妈妈的眼睛》歌手:张震岳\n5、《25岁永不停下》歌手:张醒婵\n6、《雨季症候》歌手:SHARK卫彬月\n7、《山东王FREESTYLE》歌手:华云龙KLE\n8、《LOVE I NEED》歌手:陈瑜Estelle\n9、《FFFFF》歌手:刘柏辛Lexie\n10、《Vipaśyanā》歌手:Namunong\n本期封面:Addison Rae,Aquamarine", + "cover": "https://p2.music.126.net/u440jFG0N5i06C9ejOeMCQ==/109951171381091309.jpg", + "update_frequency": "每周五更新", + "updated": "2025-06-30 16:17:26", + "updated_at": 1751271446032, + "created": "2022-03-09 11:24:46", + "created_at": 1646796286440, + "link": "https://music.163.com/#/discover/toplist?id=7325478166" + }, + { + "id": 7603212484, + "name": "LOOK直播歌曲榜", + "description": "LOOK直播好歌共赏,专属你的声音聊愈场。榜单选取符合条件且近7日热度最高的前50首歌曲,每周二更新。", + "cover": "https://p1.music.126.net/u-RQC-LyY0aoeseRumJ14A==/109951167977730469.jpg", + "update_frequency": "每周二更新", + "updated": "2024-05-07 21:23:03", + "updated_at": 1715088183913, + "created": "2022-08-23 09:54:56", + "created_at": 1661219696017, + "link": "https://music.163.com/#/discover/toplist?id=7603212484" + }, + { + "id": 7775163417, + "name": "赏音榜", + "description": "云音乐歌曲赏音榜,以让用户鉴赏到更多潜力好歌为目的,以用户对歌曲互动热度为核心,按照综合数据排名取前100名,每日更新", + "cover": "https://p1.music.126.net/m9hQzC-d5wefBipedNPaHg==/109951168178601971.jpg", + "update_frequency": "每天更新", + "updated": "2025-09-04 12:05:36", + "updated_at": 1756958736108, + "created": "2022-11-28 14:46:19", + "created_at": 1669617979380, + "link": "https://music.163.com/#/discover/toplist?id=7775163417" + }, + { + "id": 7785123708, + "name": "黑胶VIP新歌榜", + "description": "云音乐站内播放热度TOP50的7日内新晋会员歌曲,每日更新。\n更适合黑胶体质的新歌榜单来啦!\n耳机分你一只,新曲一起来听~\n成为尊贵黑胶,不错过每一首VIP新歌!", + "cover": "https://p1.music.126.net/vjitpkT9nXBCth6tvdDMWg==/109951169743115266.jpg", + "update_frequency": "每天更新", + "updated": "2025-09-04 12:05:37", + "updated_at": 1756958737548, + "created": "2022-12-02 18:51:16", + "created_at": 1669978276103, + "link": "https://music.163.com/#/discover/toplist?id=7785123708" + }, + { + "id": 7785066739, + "name": "黑胶VIP热歌榜", + "description": "云音乐站内播放和付费热度TOP50的会员歌曲,每日更新。\n更适合黑胶体质的热歌榜单来啦!\n哪首是你的单曲循环?\n成为尊贵黑胶,随心畅听热门好歌!", + "cover": "https://p1.music.126.net/Ay3mLgQ9weG_c8JjYrD-Bw==/109951169743106495.jpg", + "update_frequency": "每天更新", + "updated": "2025-09-04 12:05:36", + "updated_at": 1756958736684, + "created": "2022-12-02 18:51:31", + "created_at": 1669978291024, + "link": "https://music.163.com/#/discover/toplist?id=7785066739" + }, + { + "id": 7785091694, + "name": "黑胶VIP爱搜榜", + "description": "云音乐站内会员搜索播放热度TOP50的歌曲,每日更新。\n更适合黑胶体质的搜歌榜单来啦!\n热搜好歌一网打尽,只为有品位的你~\n成为尊贵黑胶,你搜我听畅听不停!", + "cover": "https://p1.music.126.net/R7DtZqNraesnsiaIKvzTHA==/109951169743112799.jpg", + "update_frequency": "每天更新", + "updated": "2025-09-04 12:05:41", + "updated_at": 1756958741914, + "created": "2022-12-02 18:51:43", + "created_at": 1669978303210, + "link": "https://music.163.com/#/discover/toplist?id=7785091694" + }, + { + "id": 8246775932, + "name": "实时热度榜", + "description": "每天9-23点为你精选当下歌曲热度最高的歌曲", + "cover": "https://p1.music.126.net/U7ZbdpWzRdmZVr6Khn_4ag==/109951168673982478.jpg", + "update_frequency": "更新65首", + "updated": "2025-09-05 09:30:07", + "updated_at": 1757035807371, + "created": "2023-03-20 10:39:59", + "created_at": 1679279999154, + "link": "https://music.163.com/#/discover/toplist?id=8246775932" + }, + { + "id": 8537588450, + "name": "喜力®星电音派对潮音榜", + "description": "乐无界,越未来!《星电音联盟》歌曲官方榜单,每周一更新,让云村村民们随时随地躁起高燃派对氛围!喜力®星电音构建狂欢永不停歇的新奇电音宇宙,激活潮流基因,释放先锋灵感,跨维开启奇妙电音之旅!", + "cover": "https://p1.music.126.net/HVu2hGYvzN5XBuvFc_4Bgg==/109951168730309120.jpg", + "update_frequency": "每周五更新", + "updated": "2024-09-16 12:05:30", + "updated_at": 1726459530378, + "created": "2023-07-07 10:48:39", + "created_at": 1688698119437, + "link": "https://music.163.com/#/discover/toplist?id=8537588450" + }, + { + "id": 8661209031, + "name": "乐夏榜", + "description": "听乐夏,上网易云,一头扎进爱音乐的人群! 综艺《乐队的夏天3》官方榜单,每周一更新。和三星折叠屏手机一起畅听《乐队的夏天3》官方榜单,折叠看三星,五代更来劲。", + "cover": "https://p1.music.126.net/RlStCmE97y0xYFk7rS3Zww==/109951168864907822.jpg", + "update_frequency": "每周一更新", + "updated": "2025-09-01 12:05:41", + "updated_at": 1756699541864, + "created": "2023-08-16 17:47:27", + "created_at": 1692179247425, + "link": "https://music.163.com/#/discover/toplist?id=8661209031" + }, + { + "id": 8703179781, + "name": "特斯拉车友爱听榜", + "description": null, + "cover": "https://p1.music.126.net/UL8dhobSa3TR6Wd1JmWe_g==/109951168924385363.jpg", + "update_frequency": "每周一更新", + "updated": "2025-09-01 16:05:08", + "updated_at": 1756713908385, + "created": "2023-08-31 12:29:59", + "created_at": 1693456199735, + "link": "https://music.163.com/#/discover/toplist?id=8703179781" + }, + { + "id": 8703052295, + "name": "理想车友爱听榜", + "description": null, + "cover": "https://p1.music.126.net/U--PWdWupY1ER5cVSjr1jQ==/109951168928365496.jpg", + "update_frequency": "每周一更新", + "updated": "2025-09-01 16:05:09", + "updated_at": 1756713909830, + "created": "2023-08-31 12:38:29", + "created_at": 1693456709598, + "link": "https://music.163.com/#/discover/toplist?id=8703052295" + }, + { + "id": 8702582160, + "name": "比亚迪车友爱听榜", + "description": null, + "cover": "https://p1.music.126.net/S1OG-OLTaofa3HfrHW48kA==/109951168924393585.jpg", + "update_frequency": "每周一更新", + "updated": "2025-09-01 16:05:07", + "updated_at": 1756713907323, + "created": "2023-08-31 12:38:42", + "created_at": 1693456722262, + "link": "https://music.163.com/#/discover/toplist?id=8702582160" + }, + { + "id": 8703220480, + "name": "蔚来车友爱听榜", + "description": null, + "cover": "https://p1.music.126.net/r9kBQNsOro1EAB82Ol51WQ==/109951168924380971.jpg", + "update_frequency": "每周一更新", + "updated": "2025-09-01 16:05:04", + "updated_at": 1756713904286, + "created": "2023-08-31 12:38:56", + "created_at": 1693456736086, + "link": "https://music.163.com/#/discover/toplist?id=8703220480" + }, + { + "id": 8702982391, + "name": "极氪车友爱听榜", + "description": null, + "cover": "https://p1.music.126.net/Cu0RXoKewSPM9Gyc7Cp8jw==/109951168924391596.jpg", + "update_frequency": "每周一更新", + "updated": "2025-09-01 16:05:06", + "updated_at": 1756713906978, + "created": "2023-08-31 12:39:19", + "created_at": 1693456759762, + "link": "https://music.163.com/#/discover/toplist?id=8702982391" + }, + { + "id": 8532443277, + "name": "蛋仔派对听歌榜", + "description": "来自蛋仔岛的热播歌曲速递,网易《蛋仔派对》官方榜单,每周五更新。云村村民们,和蛋仔们一起随歌摇摆吧!", + "cover": "https://p1.music.126.net/TMb0be5QLMZKOFeuOKT4tg==/109951168717283910.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-29 12:05:43", + "updated_at": 1756440343562, + "created": "2023-07-05 10:32:04", + "created_at": 1688524324879, + "link": "https://music.163.com/#/discover/toplist?id=8532443277" + }, + { + "id": 9651277674, + "name": "AI歌曲榜", + "description": "精心挑选每日最新最热AI生成歌曲,榜单每日更新,一起感受AI的独特魅力吧!", + "cover": "https://p1.music.126.net/M0m6GeZ1Y8Osz9jqxaW8Wg==/109951169462048035.jpg", + "update_frequency": "每天更新", + "updated": "2025-09-04 12:05:43", + "updated_at": 1756958743415, + "created": "2024-04-02 18:25:12", + "created_at": 1712053512213, + "link": "https://music.163.com/#/discover/toplist?id=9651277674" + }, + { + "id": 10131772880, + "name": "昊铂车友爱听榜", + "description": null, + "cover": "https://p1.music.126.net/EL7H4rkKejZY7Uv54EFNXg==/109951169655010112.jpg", + "update_frequency": "每周一更新", + "updated": "2025-09-01 16:05:03", + "updated_at": 1756713903085, + "created": "2024-06-04 16:50:00", + "created_at": 1717491000945, + "link": "https://music.163.com/#/discover/toplist?id=10131772880" + }, + { + "id": 10162841534, + "name": "埃安车友爱听榜", + "description": "埃安车友平时都在听什么??", + "cover": "https://p1.music.126.net/FcP1U6Bck0wPKqd0XgBwSQ==/109951169679731241.jpg", + "update_frequency": "每周一更新", + "updated": "2025-09-01 16:05:05", + "updated_at": 1756713905568, + "created": "2024-06-12 13:31:44", + "created_at": 1718170304691, + "link": "https://music.163.com/#/discover/toplist?id=10162841534" + }, + { + "id": 12225155968, + "name": "欧美R&B榜", + "description": "云音乐用户一周内收听节奏布鲁斯(R&B)官方TOP排行榜,每周五更新。", + "cover": "https://p1.music.126.net/0E6MzYzyA5uvQ4CSoIG2mw==/109951169739660034.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-29 12:05:45", + "updated_at": 1756440345198, + "created": "2024-06-25 18:14:05", + "created_at": 1719310445382, + "link": "https://music.163.com/#/discover/toplist?id=12225155968" + }, + { + "id": 12344472377, + "name": "黑胶VIP限免榜", + "description": "云音乐站内热度最高的限免播放歌曲TOP50,每日更新。\n人气旋律一听就会爱上!现在马上进入免费模式(点击云音乐首页左上角侧边栏,选择“免费听歌”)畅听全榜吧!", + "cover": "https://p1.music.126.net/WXCSf4ZNcDCdOTY5ixm3Bg==/109951169809318325.jpg", + "update_frequency": "每天更新", + "updated": "2025-09-04 12:05:45", + "updated_at": 1756958745487, + "created": "2024-07-23 16:08:37", + "created_at": 1721722117311, + "link": "https://music.163.com/#/discover/toplist?id=12344472377" + }, + { + "id": 12717025277, + "name": "吉利车友爱听榜", + "description": null, + "cover": "https://p1.music.126.net/XVmZb3JSyrwMgqu9WVz61A==/109951170037568570.jpg", + "update_frequency": "每周一更新", + "updated": "2025-09-01 16:05:01", + "updated_at": 1756713901625, + "created": "2024-10-12 13:44:04", + "created_at": 1728711844151, + "link": "https://music.163.com/#/discover/toplist?id=12717025277" + } + ] } \ No newline at end of file diff --git a/InfoGenie-frontend/public/60sapi/生成要求模板.txt b/InfoGenie-frontend/public/60sapi/生成要求模板.txt index 975a3074..73163bf4 100755 --- a/InfoGenie-frontend/public/60sapi/生成要求模板.txt +++ b/InfoGenie-frontend/public/60sapi/生成要求模板.txt @@ -1,7 +1,7 @@ -1.生成为静态网页,js,css,html分离出来,不要混合在一起放入html里,难以阅读 -2.网页要适配手机端,电脑端和平板端三个设备分别做不同的css格式,优先优化手机端用户体验 -3.网页默认风格以淡绿色清新风格为主,除非用户要求 -4.尽量不要引用外部css,js,实在要引用就使用中国国内的cdn,否则用户可能加载不出来 -5.返回接口.json储存了网页api返回的数据格式 -6.严格按照用户要求执行,不得随意添加什么注解,如“以下数据来自...” +1.生成为静态网页,js,css,html分离出来,不要混合在一起放入html里,难以阅读 +2.网页要适配手机端,电脑端和平板端三个设备分别做不同的css格式,优先优化手机端用户体验 +3.网页默认风格以淡绿色清新风格为主,除非用户要求 +4.尽量不要引用外部css,js,实在要引用就使用中国国内的cdn,否则用户可能加载不出来 +5.返回接口.json储存了网页api返回的数据格式 +6.严格按照用户要求执行,不得随意添加什么注解,如“以下数据来自...” 8.在css中有关背景的css单独一个css文件,方便我直接迁移 \ No newline at end of file diff --git a/InfoGenie-frontend/public/aimodelapp/AI写诗小助手/index.html b/InfoGenie-frontend/public/aimodelapp/AI写诗小助手/index.html index fe5fb5da..e03736d3 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI写诗小助手/index.html +++ b/InfoGenie-frontend/public/aimodelapp/AI写诗小助手/index.html @@ -1,246 +1,246 @@ - - - - - - AI古诗生成器 - - - -
      -
      -

      AI古诗生成器

      -

      让人工智能为您创作优美的中国古诗

      -
      - - - -
      - - -
      - - - -
      -

      生成的古诗

      -
      正在创作中,请稍候...
      -
      点击"生成古诗"按钮,AI将为您创作优美的古诗
      -
      -
      - - - - + + + + + + AI古诗生成器 + + + +
      +
      +

      AI古诗生成器

      +

      让人工智能为您创作优美的中国古诗

      +
      + + + +
      + + +
      + + + +
      +

      生成的古诗

      +
      正在创作中,请稍候...
      +
      点击"生成古诗"按钮,AI将为您创作优美的古诗
      +
      +
      + + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/aimodelapp/AI写诗小助手/script.js b/InfoGenie-frontend/public/aimodelapp/AI写诗小助手/script.js index d7062ac6..b47f327b 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI写诗小助手/script.js +++ b/InfoGenie-frontend/public/aimodelapp/AI写诗小助手/script.js @@ -1,120 +1,120 @@ -// 从配置文件导入设置 -// 配置在 env.js 文件中定义 - -// DOM 元素 -const generateBtn = document.getElementById('generateBtn'); -const loading = document.getElementById('loading'); -const poemOutput = document.getElementById('poemOutput'); -const themeInput = document.getElementById('theme'); - -// 调用后端API -async function callBackendAPI(theme) { - try { - // 获取JWT token - const token = localStorage.getItem('token'); - - if (!token) { - throw new Error('未登录,请先登录后使用AI功能'); - } - - const response = await fetch(`${window.API_CONFIG.baseUrl}/api/aimodelapp/poetry`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - }, - body: JSON.stringify({ - theme: theme - }) - }); - - if (!response.ok) { - if (response.status === 402) { - throw new Error('您的萌芽币余额不足,无法使用此功能'); - } - const errorData = await response.json(); - throw new Error(errorData.error || `API请求失败: ${response.status} ${response.statusText}`); - } - - const data = await response.json(); - if (data.success) { - return data.poem; - } else { - throw new Error(data.error || 'API响应格式异常'); - } - } catch (error) { - console.error('API调用错误:', error); - throw error; - } -} - -// 显示错误信息 -function showErrorMessage(message) { - // 清除之前的错误信息 - const existingError = document.querySelector('.error'); - if (existingError) { - existingError.remove(); - } - - const errorDiv = document.createElement('div'); - errorDiv.className = 'error'; - errorDiv.textContent = `生成失败:${message}。请检查网络连接。`; - poemOutput.parentNode.appendChild(errorDiv); -} - -// 显示加载状态 -function showLoading(show) { - loading.style.display = show ? 'block' : 'none'; - generateBtn.disabled = show; - generateBtn.textContent = show ? '创作中...' : '生成古诗'; -} - -// 生成古诗 -async function generatePoem() { - const theme = themeInput.value.trim(); - - if (!theme) { - alert('请输入作诗主题'); - return; - } - - showLoading(true); - poemOutput.textContent = ''; - - // 清除之前的错误信息 - const existingError = document.querySelector('.error'); - if (existingError) { - existingError.remove(); - } - - try { - const poem = await callBackendAPI(theme); - poemOutput.textContent = poem.trim(); - } catch (error) { - console.error('生成古诗失败:', error); - showErrorMessage(error.message); - poemOutput.textContent = '生成失败,请重试'; - } finally { - showLoading(false); - } -} - -// 事件监听器 -generateBtn.addEventListener('click', generatePoem); - -// 回车键生成 -themeInput.addEventListener('keypress', (e) => { - if (e.key === 'Enter' && !e.shiftKey) { - e.preventDefault(); - generatePoem(); - } -}); - -// 页面加载完成后的初始化 -document.addEventListener('DOMContentLoaded', () => { - // 设置默认占位符 - poemOutput.textContent = '点击"生成古诗"按钮,AI将为您创作优美的古诗'; -}); - -// 导出函数供HTML调用 +// 从配置文件导入设置 +// 配置在 env.js 文件中定义 + +// DOM 元素 +const generateBtn = document.getElementById('generateBtn'); +const loading = document.getElementById('loading'); +const poemOutput = document.getElementById('poemOutput'); +const themeInput = document.getElementById('theme'); + +// 调用后端API +async function callBackendAPI(theme) { + try { + // 获取JWT token + const token = localStorage.getItem('token'); + + if (!token) { + throw new Error('未登录,请先登录后使用AI功能'); + } + + const response = await fetch(`${window.API_CONFIG.baseUrl}/api/aimodelapp/poetry`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }, + body: JSON.stringify({ + theme: theme + }) + }); + + if (!response.ok) { + if (response.status === 402) { + throw new Error('您的萌芽币余额不足,无法使用此功能'); + } + const errorData = await response.json(); + throw new Error(errorData.error || `API请求失败: ${response.status} ${response.statusText}`); + } + + const data = await response.json(); + if (data.success) { + return data.poem; + } else { + throw new Error(data.error || 'API响应格式异常'); + } + } catch (error) { + console.error('API调用错误:', error); + throw error; + } +} + +// 显示错误信息 +function showErrorMessage(message) { + // 清除之前的错误信息 + const existingError = document.querySelector('.error'); + if (existingError) { + existingError.remove(); + } + + const errorDiv = document.createElement('div'); + errorDiv.className = 'error'; + errorDiv.textContent = `生成失败:${message}。请检查网络连接。`; + poemOutput.parentNode.appendChild(errorDiv); +} + +// 显示加载状态 +function showLoading(show) { + loading.style.display = show ? 'block' : 'none'; + generateBtn.disabled = show; + generateBtn.textContent = show ? '创作中...' : '生成古诗'; +} + +// 生成古诗 +async function generatePoem() { + const theme = themeInput.value.trim(); + + if (!theme) { + alert('请输入作诗主题'); + return; + } + + showLoading(true); + poemOutput.textContent = ''; + + // 清除之前的错误信息 + const existingError = document.querySelector('.error'); + if (existingError) { + existingError.remove(); + } + + try { + const poem = await callBackendAPI(theme); + poemOutput.textContent = poem.trim(); + } catch (error) { + console.error('生成古诗失败:', error); + showErrorMessage(error.message); + poemOutput.textContent = '生成失败,请重试'; + } finally { + showLoading(false); + } +} + +// 事件监听器 +generateBtn.addEventListener('click', generatePoem); + +// 回车键生成 +themeInput.addEventListener('keypress', (e) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + generatePoem(); + } +}); + +// 页面加载完成后的初始化 +document.addEventListener('DOMContentLoaded', () => { + // 设置默认占位符 + poemOutput.textContent = '点击"生成古诗"按钮,AI将为您创作优美的古诗'; +}); + +// 导出函数供HTML调用 window.generatePoem = generatePoem; \ No newline at end of file diff --git a/InfoGenie-frontend/public/aimodelapp/AI变量命名助手/index.html b/InfoGenie-frontend/public/aimodelapp/AI变量命名助手/index.html index 6e76ba22..ae8365cc 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI变量命名助手/index.html +++ b/InfoGenie-frontend/public/aimodelapp/AI变量命名助手/index.html @@ -1,43 +1,43 @@ - - - - - - AI变量命名助手 - - - -
      -
      -

      AI变量命名助手

      -

      让AI帮您生成规范的变量名

      -
      - -
      -
      - - -
      - - - - -
      - -
      -

      推荐的变量名

      -
      正在生成中,请稍候...
      -
      -
      点击"生成变量名"按钮,AI将为您推荐合适的变量名
      -
      -
      -
      - - - - + + + + + + AI变量命名助手 + + + +
      +
      +

      AI变量命名助手

      +

      让AI帮您生成规范的变量名

      +
      + +
      +
      + + +
      + + + + +
      + +
      +

      推荐的变量名

      +
      正在生成中,请稍候...
      +
      +
      点击"生成变量名"按钮,AI将为您推荐合适的变量名
      +
      +
      +
      + + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/aimodelapp/AI变量命名助手/script.js b/InfoGenie-frontend/public/aimodelapp/AI变量命名助手/script.js index f375d41b..1a829756 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI变量命名助手/script.js +++ b/InfoGenie-frontend/public/aimodelapp/AI变量命名助手/script.js @@ -1,260 +1,260 @@ -// 从配置文件导入设置 -// 配置在 env.js 文件中定义 - -// DOM 元素 -const descriptionInput = document.getElementById('description'); -const generateBtn = document.getElementById('generateBtn'); -const loadingDiv = document.getElementById('loading'); -const suggestionsContainer = document.getElementById('suggestions'); - -// 命名规范转换函数 -const namingConventions = { - camelCase: (words) => { - if (words.length === 0) return ''; - return words[0].toLowerCase() + words.slice(1).map(word => - word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() - ).join(''); - }, - - PascalCase: (words) => { - return words.map(word => - word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() - ).join(''); - }, - - snake_case: (words) => { - return words.map(word => word.toLowerCase()).join('_'); - }, - - 'kebab-case': (words) => { - return words.map(word => word.toLowerCase()).join('-'); - }, - - CONSTANT_CASE: (words) => { - return words.map(word => word.toUpperCase()).join('_'); - } -}; - - - -// 调用后端API -async function callBackendAPI(description) { - try { - // 获取JWT token - const token = localStorage.getItem('token'); - - if (!token) { - throw new Error('未登录,请先登录后使用AI功能'); - } - - const response = await fetch(`${window.API_CONFIG.baseUrl}/api/aimodelapp/variable-naming`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - }, - body: JSON.stringify({ - description: description - }) - }); - - if (!response.ok) { - if (response.status === 402) { - throw new Error('您的萌芽币余额不足,无法使用此功能'); - } - const errorData = await response.json(); - throw new Error(errorData.error || `API请求失败: ${response.status} ${response.statusText}`); - } - - const data = await response.json(); - if (data.success) { - return data.suggestions; - } else { - throw new Error(data.error || 'API响应格式异常'); - } - } catch (error) { - console.error('API调用错误:', error); - throw error; - } -} - -// 解析AI响应 -function parseAIResponse(response) { - try { - // 尝试直接解析JSON - const parsed = JSON.parse(response); - return parsed.suggestions || {}; - } catch (error) { - // 如果直接解析失败,尝试提取JSON部分 - const jsonMatch = response.match(/\{[\s\S]*\}/); - if (jsonMatch) { - try { - const parsed = JSON.parse(jsonMatch[0]); - return parsed.suggestions || {}; - } catch (e) { - console.error('JSON解析失败:', e); - } - } - - // 如果JSON解析失败,返回空对象 - console.error('无法解析AI响应:', response); - return {}; - } -} - - - -// 显示建议 -function displaySuggestions(suggestions) { - suggestionsContainer.innerHTML = ''; - - if (!suggestions || Object.keys(suggestions).length === 0) { - suggestionsContainer.innerHTML = '
      暂无建议,请尝试重新生成
      '; - return; - } - - // 命名规范的显示名称 - const conventionNames = { - 'camelCase': 'camelCase (驼峰命名法)', - 'PascalCase': 'PascalCase (帕斯卡命名法)', - 'snake_case': 'snake_case (下划线命名法)', - 'kebab-case': 'kebab-case (短横线命名法)', - 'CONSTANT_CASE': 'CONSTANT_CASE (常量命名法)' - }; - - // 按命名规范分组显示 - Object.keys(suggestions).forEach(convention => { - if (suggestions[convention] && suggestions[convention].length > 0) { - // 创建分组标题 - const groupTitle = document.createElement('div'); - groupTitle.className = 'convention-group-title'; - groupTitle.textContent = conventionNames[convention] || convention; - suggestionsContainer.appendChild(groupTitle); - - // 显示该规范下的建议 - suggestions[convention].forEach(suggestion => { - const suggestionElement = document.createElement('div'); - suggestionElement.className = 'suggestion-item'; - suggestionElement.innerHTML = ` -
      ${suggestion.name}
      -
      ${suggestion.description}
      - - `; - suggestionsContainer.appendChild(suggestionElement); - }); - } - }); -} - -// 复制到剪贴板 -function copyToClipboard(text, button) { - navigator.clipboard.writeText(text).then(() => { - showSuccessToast('已复制到剪贴板'); - button.textContent = '已复制'; - setTimeout(() => { - button.textContent = '复制'; - }, 2000); - }).catch(err => { - console.error('复制失败:', err); - // 备用复制方法 - const textArea = document.createElement('textarea'); - textArea.value = text; - document.body.appendChild(textArea); - textArea.select(); - try { - document.execCommand('copy'); - showSuccessToast('已复制到剪贴板'); - button.textContent = '已复制'; - setTimeout(() => { - button.textContent = '复制'; - }, 2000); - } catch (e) { - showErrorMessage('复制失败,请手动复制'); - } - document.body.removeChild(textArea); - }); -} - -// 显示成功提示 -function showSuccessToast(message) { - const toast = document.createElement('div'); - toast.className = 'success-toast'; - toast.textContent = message; - document.body.appendChild(toast); - - setTimeout(() => { - toast.classList.add('show'); - }, 100); - - setTimeout(() => { - toast.classList.remove('show'); - setTimeout(() => { - document.body.removeChild(toast); - }, 300); - }, 2000); -} - -// 显示错误信息 -function showErrorMessage(message) { - const errorDiv = document.createElement('div'); - errorDiv.className = 'error'; - errorDiv.textContent = message; - suggestionsContainer.innerHTML = ''; - suggestionsContainer.appendChild(errorDiv); -} - -// 显示加载状态 -function showLoading(show) { - loadingDiv.style.display = show ? 'block' : 'none'; - generateBtn.disabled = show; - generateBtn.textContent = show ? '生成中...' : '生成变量名'; -} - -// 生成变量名建议 -async function generateSuggestions() { - const description = descriptionInput.value.trim(); - - if (!description) { - showErrorMessage('请输入变量描述'); - return; - } - - showLoading(true); - suggestionsContainer.innerHTML = ''; - - try { - const suggestions = await callBackendAPI(description); - displaySuggestions(suggestions); - } catch (error) { - console.error('生成建议失败:', error); - // 检查是否是萌芽币不足导致的错误 - if (error.message && error.message.includes('萌芽币余额不足')) { - showErrorMessage(`萌芽币不足: 每次使用AI功能需要消耗100萌芽币,请通过每日签到获取更多萌芽币`); - } else { - showErrorMessage(`生成失败: ${error.message}`); - } - } finally { - showLoading(false); - } -} - -// 事件监听器 -generateBtn.addEventListener('click', generateSuggestions); - -// 回车键生成 -descriptionInput.addEventListener('keypress', (e) => { - if (e.key === 'Enter' && !e.shiftKey) { - e.preventDefault(); - generateSuggestions(); - } -}); - -// 页面加载完成后的初始化 -document.addEventListener('DOMContentLoaded', () => { - // 设置默认占位符 - suggestionsContainer.innerHTML = '
      请输入变量描述,然后点击生成按钮获取所有命名规范的建议
      '; -}); - -// 导出函数供HTML调用 -window.copyToClipboard = copyToClipboard; +// 从配置文件导入设置 +// 配置在 env.js 文件中定义 + +// DOM 元素 +const descriptionInput = document.getElementById('description'); +const generateBtn = document.getElementById('generateBtn'); +const loadingDiv = document.getElementById('loading'); +const suggestionsContainer = document.getElementById('suggestions'); + +// 命名规范转换函数 +const namingConventions = { + camelCase: (words) => { + if (words.length === 0) return ''; + return words[0].toLowerCase() + words.slice(1).map(word => + word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() + ).join(''); + }, + + PascalCase: (words) => { + return words.map(word => + word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() + ).join(''); + }, + + snake_case: (words) => { + return words.map(word => word.toLowerCase()).join('_'); + }, + + 'kebab-case': (words) => { + return words.map(word => word.toLowerCase()).join('-'); + }, + + CONSTANT_CASE: (words) => { + return words.map(word => word.toUpperCase()).join('_'); + } +}; + + + +// 调用后端API +async function callBackendAPI(description) { + try { + // 获取JWT token + const token = localStorage.getItem('token'); + + if (!token) { + throw new Error('未登录,请先登录后使用AI功能'); + } + + const response = await fetch(`${window.API_CONFIG.baseUrl}/api/aimodelapp/variable-naming`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }, + body: JSON.stringify({ + description: description + }) + }); + + if (!response.ok) { + if (response.status === 402) { + throw new Error('您的萌芽币余额不足,无法使用此功能'); + } + const errorData = await response.json(); + throw new Error(errorData.error || `API请求失败: ${response.status} ${response.statusText}`); + } + + const data = await response.json(); + if (data.success) { + return data.suggestions; + } else { + throw new Error(data.error || 'API响应格式异常'); + } + } catch (error) { + console.error('API调用错误:', error); + throw error; + } +} + +// 解析AI响应 +function parseAIResponse(response) { + try { + // 尝试直接解析JSON + const parsed = JSON.parse(response); + return parsed.suggestions || {}; + } catch (error) { + // 如果直接解析失败,尝试提取JSON部分 + const jsonMatch = response.match(/\{[\s\S]*\}/); + if (jsonMatch) { + try { + const parsed = JSON.parse(jsonMatch[0]); + return parsed.suggestions || {}; + } catch (e) { + console.error('JSON解析失败:', e); + } + } + + // 如果JSON解析失败,返回空对象 + console.error('无法解析AI响应:', response); + return {}; + } +} + + + +// 显示建议 +function displaySuggestions(suggestions) { + suggestionsContainer.innerHTML = ''; + + if (!suggestions || Object.keys(suggestions).length === 0) { + suggestionsContainer.innerHTML = '
      暂无建议,请尝试重新生成
      '; + return; + } + + // 命名规范的显示名称 + const conventionNames = { + 'camelCase': 'camelCase (驼峰命名法)', + 'PascalCase': 'PascalCase (帕斯卡命名法)', + 'snake_case': 'snake_case (下划线命名法)', + 'kebab-case': 'kebab-case (短横线命名法)', + 'CONSTANT_CASE': 'CONSTANT_CASE (常量命名法)' + }; + + // 按命名规范分组显示 + Object.keys(suggestions).forEach(convention => { + if (suggestions[convention] && suggestions[convention].length > 0) { + // 创建分组标题 + const groupTitle = document.createElement('div'); + groupTitle.className = 'convention-group-title'; + groupTitle.textContent = conventionNames[convention] || convention; + suggestionsContainer.appendChild(groupTitle); + + // 显示该规范下的建议 + suggestions[convention].forEach(suggestion => { + const suggestionElement = document.createElement('div'); + suggestionElement.className = 'suggestion-item'; + suggestionElement.innerHTML = ` +
      ${suggestion.name}
      +
      ${suggestion.description}
      + + `; + suggestionsContainer.appendChild(suggestionElement); + }); + } + }); +} + +// 复制到剪贴板 +function copyToClipboard(text, button) { + navigator.clipboard.writeText(text).then(() => { + showSuccessToast('已复制到剪贴板'); + button.textContent = '已复制'; + setTimeout(() => { + button.textContent = '复制'; + }, 2000); + }).catch(err => { + console.error('复制失败:', err); + // 备用复制方法 + const textArea = document.createElement('textarea'); + textArea.value = text; + document.body.appendChild(textArea); + textArea.select(); + try { + document.execCommand('copy'); + showSuccessToast('已复制到剪贴板'); + button.textContent = '已复制'; + setTimeout(() => { + button.textContent = '复制'; + }, 2000); + } catch (e) { + showErrorMessage('复制失败,请手动复制'); + } + document.body.removeChild(textArea); + }); +} + +// 显示成功提示 +function showSuccessToast(message) { + const toast = document.createElement('div'); + toast.className = 'success-toast'; + toast.textContent = message; + document.body.appendChild(toast); + + setTimeout(() => { + toast.classList.add('show'); + }, 100); + + setTimeout(() => { + toast.classList.remove('show'); + setTimeout(() => { + document.body.removeChild(toast); + }, 300); + }, 2000); +} + +// 显示错误信息 +function showErrorMessage(message) { + const errorDiv = document.createElement('div'); + errorDiv.className = 'error'; + errorDiv.textContent = message; + suggestionsContainer.innerHTML = ''; + suggestionsContainer.appendChild(errorDiv); +} + +// 显示加载状态 +function showLoading(show) { + loadingDiv.style.display = show ? 'block' : 'none'; + generateBtn.disabled = show; + generateBtn.textContent = show ? '生成中...' : '生成变量名'; +} + +// 生成变量名建议 +async function generateSuggestions() { + const description = descriptionInput.value.trim(); + + if (!description) { + showErrorMessage('请输入变量描述'); + return; + } + + showLoading(true); + suggestionsContainer.innerHTML = ''; + + try { + const suggestions = await callBackendAPI(description); + displaySuggestions(suggestions); + } catch (error) { + console.error('生成建议失败:', error); + // 检查是否是萌芽币不足导致的错误 + if (error.message && error.message.includes('萌芽币余额不足')) { + showErrorMessage(`萌芽币不足: 每次使用AI功能需要消耗100萌芽币,请通过每日签到获取更多萌芽币`); + } else { + showErrorMessage(`生成失败: ${error.message}`); + } + } finally { + showLoading(false); + } +} + +// 事件监听器 +generateBtn.addEventListener('click', generateSuggestions); + +// 回车键生成 +descriptionInput.addEventListener('keypress', (e) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + generateSuggestions(); + } +}); + +// 页面加载完成后的初始化 +document.addEventListener('DOMContentLoaded', () => { + // 设置默认占位符 + suggestionsContainer.innerHTML = '
      请输入变量描述,然后点击生成按钮获取所有命名规范的建议
      '; +}); + +// 导出函数供HTML调用 +window.copyToClipboard = copyToClipboard; window.generateSuggestions = generateSuggestions; \ No newline at end of file diff --git a/InfoGenie-frontend/public/aimodelapp/AI变量命名助手/styles.css b/InfoGenie-frontend/public/aimodelapp/AI变量命名助手/styles.css index ce1673ca..a217bc4d 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI变量命名助手/styles.css +++ b/InfoGenie-frontend/public/aimodelapp/AI变量命名助手/styles.css @@ -1,441 +1,441 @@ -/* 全局样式重置 */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -/* 主体样式 - iOS风格 */ -body { - font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Helvetica Neue', Arial, sans-serif; - background: linear-gradient(135deg, #F0FFF0 0%, #98FB98 50%, #90EE90 100%); - min-height: 100vh; - padding: 20px; - color: #1D1D1F; - line-height: 1.47; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - /* 隐藏滚动条但保留滚动功能 */ - scrollbar-width: none; /* Firefox */ - -ms-overflow-style: none; /* IE/Edge */ -} - -/* 隐藏Webkit浏览器的滚动条 */ -body::-webkit-scrollbar { - display: none; -} - -/* 全局滚动条隐藏 */ -* { - scrollbar-width: none; /* Firefox */ - -ms-overflow-style: none; /* IE/Edge */ -} - -*::-webkit-scrollbar { - display: none; /* Chrome, Safari, Opera */ -} - -/* 容器样式 - iOS毛玻璃效果 */ -.container { - max-width: 700px; - margin: 0 auto; - background: rgba(255, 255, 255, 0.85); - border-radius: 24px; - padding: 32px; - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08); - backdrop-filter: blur(20px) saturate(180%); - border: 1px solid rgba(255, 255, 255, 0.2); -} - -/* 头部样式 - iOS风格 */ -.header { - text-align: center; - margin-bottom: 32px; -} - -.title { - font-size: 2.25rem; - color: #1D1D1F; - margin-bottom: 8px; - font-weight: 600; - letter-spacing: -0.02em; -} - -.subtitle { - color: #86868B; - font-size: 1.0625rem; - margin-bottom: 24px; - font-weight: 400; -} - -/* 表单样式 - iOS风格 */ -.form-section { - margin-bottom: 32px; -} - -.form-group { - margin-bottom: 24px; -} - -.form-label { - display: block; - margin-bottom: 8px; - font-weight: 600; - color: #1D1D1F; - font-size: 1rem; -} - -.form-input { - width: 100%; - padding: 16px; - border: 1px solid rgba(0, 0, 0, 0.1); - border-radius: 12px; - font-size: 1rem; - transition: all 0.2s ease; - background: rgba(255, 255, 255, 0.8); - font-family: inherit; - backdrop-filter: blur(10px); -} - -.form-input:focus { - outline: none; - border-color: #32CD32; - background: rgba(255, 255, 255, 0.95); - box-shadow: 0 0 0 4px rgba(50, 205, 50, 0.1); -} - -.textarea { - resize: vertical; - min-height: 120px; -} - -.select { - cursor: pointer; - appearance: none; - background-image: url('data:image/svg+xml;charset=US-ASCII,'); - background-repeat: no-repeat; - background-position: right 15px center; - background-size: 12px; - padding-right: 40px; -} - -/* 按钮样式 - iOS风格 */ -.btn { - width: 100%; - padding: 16px; - background: #32CD32; - color: white; - border: none; - border-radius: 12px; - font-size: 1.0625rem; - font-weight: 600; - cursor: pointer; - transition: all 0.2s ease; - margin-bottom: 24px; - box-shadow: 0 2px 8px rgba(50, 205, 50, 0.25); -} - -.btn:hover { - background: #228B22; - transform: translateY(-1px); - box-shadow: 0 4px 16px rgba(50, 205, 50, 0.35); -} - -.btn:active { - transform: translateY(0); - background: #006400; -} - -.btn:disabled { - opacity: 0.5; - cursor: not-allowed; - transform: none; - background: #86868B; -} - -/* 结果区域样式 - iOS风格 */ -.result-section { - margin-top: 32px; -} - -.result-title { - font-size: 1.25rem; - color: #1D1D1F; - margin-bottom: 16px; - text-align: center; - font-weight: 600; -} - -.loading { - display: none; - text-align: center; - color: #32CD32; - font-style: normal; - padding: 24px; - font-weight: 500; -} - -.suggestions-container { - background: rgba(255, 255, 255, 0.6); - border: 1px solid rgba(0, 0, 0, 0.08); - border-radius: 16px; - padding: 20px; - min-height: 150px; - backdrop-filter: blur(10px); - display: grid; - gap: 16px; - grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); -} - -.placeholder { - text-align: center; - color: #86868B; - font-style: normal; - padding: 40px 20px; - font-weight: 400; -} - -/* 分组标题样式 - iOS风格 */ -.convention-group-title { - font-size: 1rem; - font-weight: 600; - color: white; - margin: 16px 0 12px 0; - padding: 10px 16px; - background: #32CD32; - border-radius: 12px; - text-align: center; - box-shadow: 0 2px 8px rgba(50, 205, 50, 0.25); - grid-column: 1 / -1; -} - -.convention-group-title:first-child { - margin-top: 0; -} - -/* 建议项样式 - iOS风格 */ -.suggestion-item { - background: rgba(255, 255, 255, 0.9); - border: 1px solid rgba(0, 0, 0, 0.06); - border-radius: 12px; - padding: 12px; - margin-bottom: 0; - transition: all 0.2s ease; - cursor: pointer; - position: relative; - backdrop-filter: blur(10px); - min-height: 80px; - display: flex; - flex-direction: column; - justify-content: space-between; -} - -.suggestion-item:hover { - border-color: rgba(50, 205, 50, 0.3); - box-shadow: 0 4px 16px rgba(50, 205, 50, 0.1); - background: rgba(255, 255, 255, 0.95); -} - -.suggestion-item:last-child { - margin-bottom: 0; -} - -.variable-name { - font-family: 'SF Mono', 'Monaco', 'Consolas', 'Courier New', monospace; - font-size: 1rem; - font-weight: 600; - color: #1D1D1F; - margin-bottom: 4px; - word-break: break-all; -} - -.variable-description { - font-size: 0.875rem; - color: #86868B; - line-height: 1.4; - flex-grow: 1; -} - -.copy-btn { - position: absolute; - top: 8px; - right: 8px; - background: #32CD32; - color: white; - border: none; - border-radius: 6px; - padding: 4px 8px; - font-size: 0.75rem; - font-weight: 600; - cursor: pointer; - opacity: 0; - transition: all 0.2s ease; - box-shadow: 0 1px 3px rgba(50, 205, 50, 0.25); -} - -.suggestion-item:hover .copy-btn { - opacity: 1; -} - -.copy-btn:hover { - background: #228B22; - transform: translateY(-1px); -} - -/* 错误样式 - iOS风格 */ -.error { - color: #FF3B30; - background: rgba(255, 59, 48, 0.1); - border: 1px solid rgba(255, 59, 48, 0.2); - padding: 16px; - border-radius: 12px; - margin-top: 16px; - font-weight: 500; - backdrop-filter: blur(10px); -} - -/* 成功提示 - iOS风格 */ -.success-toast { - position: fixed; - top: 20px; - right: 20px; - background: #34C759; - color: white; - padding: 12px 20px; - border-radius: 12px; - box-shadow: 0 8px 24px rgba(52, 199, 89, 0.3); - z-index: 1000; - opacity: 0; - transform: translateX(100%); - transition: all 0.3s ease; - font-weight: 600; - backdrop-filter: blur(20px); -} - -.success-toast.show { - opacity: 1; - transform: translateX(0); -} - -/* 响应式设计 */ -@media (max-width: 768px) { - body { - padding: 10px; - } - - .container { - padding: 20px; - margin: 10px; - } - - .title { - font-size: 2rem; - } - - .form-input { - padding: 12px; - } - - .btn { - padding: 12px; - } - - .suggestions-container { - padding: 15px; - grid-template-columns: 1fr; - gap: 12px; - } - - .suggestion-item { - padding: 10px; - min-height: 70px; - } - - .copy-btn { - position: static; - opacity: 1; - margin-top: 6px; - width: 100%; - padding: 6px 8px; - font-size: 0.75rem; - } - - .variable-name { - font-size: 0.9rem; - } - - .variable-description { - font-size: 0.8rem; - } -} - -@media (max-width: 480px) { - .title { - font-size: 1.8rem; - letter-spacing: 1px; - } - - .container { - padding: 15px; - } - - .form-input { - padding: 10px; - } - - .suggestions-container { - padding: 12px; - gap: 10px; - } - - .suggestion-item { - padding: 8px; - min-height: 60px; - } - - .variable-name { - font-size: 0.85rem; - margin-bottom: 3px; - } - - .variable-description { - font-size: 0.75rem; - line-height: 1.3; - } - - .convention-group-title { - font-size: 0.9rem; - padding: 8px 12px; - margin: 12px 0 8px 0; - } -} - -/* 动画效果 */ -@keyframes fadeIn { - from { - opacity: 0; - transform: translateY(10px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.suggestion-item { - animation: fadeIn 0.3s ease; -} - -/* 加载动画 */ -@keyframes pulse { - 0%, 100% { - opacity: 1; - } - 50% { - opacity: 0.5; - } -} - -.loading { - animation: pulse 1.5s ease-in-out infinite; +/* 全局样式重置 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +/* 主体样式 - iOS风格 */ +body { + font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Helvetica Neue', Arial, sans-serif; + background: linear-gradient(135deg, #F0FFF0 0%, #98FB98 50%, #90EE90 100%); + min-height: 100vh; + padding: 20px; + color: #1D1D1F; + line-height: 1.47; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + /* 隐藏滚动条但保留滚动功能 */ + scrollbar-width: none; /* Firefox */ + -ms-overflow-style: none; /* IE/Edge */ +} + +/* 隐藏Webkit浏览器的滚动条 */ +body::-webkit-scrollbar { + display: none; +} + +/* 全局滚动条隐藏 */ +* { + scrollbar-width: none; /* Firefox */ + -ms-overflow-style: none; /* IE/Edge */ +} + +*::-webkit-scrollbar { + display: none; /* Chrome, Safari, Opera */ +} + +/* 容器样式 - iOS毛玻璃效果 */ +.container { + max-width: 700px; + margin: 0 auto; + background: rgba(255, 255, 255, 0.85); + border-radius: 24px; + padding: 32px; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08); + backdrop-filter: blur(20px) saturate(180%); + border: 1px solid rgba(255, 255, 255, 0.2); +} + +/* 头部样式 - iOS风格 */ +.header { + text-align: center; + margin-bottom: 32px; +} + +.title { + font-size: 2.25rem; + color: #1D1D1F; + margin-bottom: 8px; + font-weight: 600; + letter-spacing: -0.02em; +} + +.subtitle { + color: #86868B; + font-size: 1.0625rem; + margin-bottom: 24px; + font-weight: 400; +} + +/* 表单样式 - iOS风格 */ +.form-section { + margin-bottom: 32px; +} + +.form-group { + margin-bottom: 24px; +} + +.form-label { + display: block; + margin-bottom: 8px; + font-weight: 600; + color: #1D1D1F; + font-size: 1rem; +} + +.form-input { + width: 100%; + padding: 16px; + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 12px; + font-size: 1rem; + transition: all 0.2s ease; + background: rgba(255, 255, 255, 0.8); + font-family: inherit; + backdrop-filter: blur(10px); +} + +.form-input:focus { + outline: none; + border-color: #32CD32; + background: rgba(255, 255, 255, 0.95); + box-shadow: 0 0 0 4px rgba(50, 205, 50, 0.1); +} + +.textarea { + resize: vertical; + min-height: 120px; +} + +.select { + cursor: pointer; + appearance: none; + background-image: url('data:image/svg+xml;charset=US-ASCII,'); + background-repeat: no-repeat; + background-position: right 15px center; + background-size: 12px; + padding-right: 40px; +} + +/* 按钮样式 - iOS风格 */ +.btn { + width: 100%; + padding: 16px; + background: #32CD32; + color: white; + border: none; + border-radius: 12px; + font-size: 1.0625rem; + font-weight: 600; + cursor: pointer; + transition: all 0.2s ease; + margin-bottom: 24px; + box-shadow: 0 2px 8px rgba(50, 205, 50, 0.25); +} + +.btn:hover { + background: #228B22; + transform: translateY(-1px); + box-shadow: 0 4px 16px rgba(50, 205, 50, 0.35); +} + +.btn:active { + transform: translateY(0); + background: #006400; +} + +.btn:disabled { + opacity: 0.5; + cursor: not-allowed; + transform: none; + background: #86868B; +} + +/* 结果区域样式 - iOS风格 */ +.result-section { + margin-top: 32px; +} + +.result-title { + font-size: 1.25rem; + color: #1D1D1F; + margin-bottom: 16px; + text-align: center; + font-weight: 600; +} + +.loading { + display: none; + text-align: center; + color: #32CD32; + font-style: normal; + padding: 24px; + font-weight: 500; +} + +.suggestions-container { + background: rgba(255, 255, 255, 0.6); + border: 1px solid rgba(0, 0, 0, 0.08); + border-radius: 16px; + padding: 20px; + min-height: 150px; + backdrop-filter: blur(10px); + display: grid; + gap: 16px; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); +} + +.placeholder { + text-align: center; + color: #86868B; + font-style: normal; + padding: 40px 20px; + font-weight: 400; +} + +/* 分组标题样式 - iOS风格 */ +.convention-group-title { + font-size: 1rem; + font-weight: 600; + color: white; + margin: 16px 0 12px 0; + padding: 10px 16px; + background: #32CD32; + border-radius: 12px; + text-align: center; + box-shadow: 0 2px 8px rgba(50, 205, 50, 0.25); + grid-column: 1 / -1; +} + +.convention-group-title:first-child { + margin-top: 0; +} + +/* 建议项样式 - iOS风格 */ +.suggestion-item { + background: rgba(255, 255, 255, 0.9); + border: 1px solid rgba(0, 0, 0, 0.06); + border-radius: 12px; + padding: 12px; + margin-bottom: 0; + transition: all 0.2s ease; + cursor: pointer; + position: relative; + backdrop-filter: blur(10px); + min-height: 80px; + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.suggestion-item:hover { + border-color: rgba(50, 205, 50, 0.3); + box-shadow: 0 4px 16px rgba(50, 205, 50, 0.1); + background: rgba(255, 255, 255, 0.95); +} + +.suggestion-item:last-child { + margin-bottom: 0; +} + +.variable-name { + font-family: 'SF Mono', 'Monaco', 'Consolas', 'Courier New', monospace; + font-size: 1rem; + font-weight: 600; + color: #1D1D1F; + margin-bottom: 4px; + word-break: break-all; +} + +.variable-description { + font-size: 0.875rem; + color: #86868B; + line-height: 1.4; + flex-grow: 1; +} + +.copy-btn { + position: absolute; + top: 8px; + right: 8px; + background: #32CD32; + color: white; + border: none; + border-radius: 6px; + padding: 4px 8px; + font-size: 0.75rem; + font-weight: 600; + cursor: pointer; + opacity: 0; + transition: all 0.2s ease; + box-shadow: 0 1px 3px rgba(50, 205, 50, 0.25); +} + +.suggestion-item:hover .copy-btn { + opacity: 1; +} + +.copy-btn:hover { + background: #228B22; + transform: translateY(-1px); +} + +/* 错误样式 - iOS风格 */ +.error { + color: #FF3B30; + background: rgba(255, 59, 48, 0.1); + border: 1px solid rgba(255, 59, 48, 0.2); + padding: 16px; + border-radius: 12px; + margin-top: 16px; + font-weight: 500; + backdrop-filter: blur(10px); +} + +/* 成功提示 - iOS风格 */ +.success-toast { + position: fixed; + top: 20px; + right: 20px; + background: #34C759; + color: white; + padding: 12px 20px; + border-radius: 12px; + box-shadow: 0 8px 24px rgba(52, 199, 89, 0.3); + z-index: 1000; + opacity: 0; + transform: translateX(100%); + transition: all 0.3s ease; + font-weight: 600; + backdrop-filter: blur(20px); +} + +.success-toast.show { + opacity: 1; + transform: translateX(0); +} + +/* 响应式设计 */ +@media (max-width: 768px) { + body { + padding: 10px; + } + + .container { + padding: 20px; + margin: 10px; + } + + .title { + font-size: 2rem; + } + + .form-input { + padding: 12px; + } + + .btn { + padding: 12px; + } + + .suggestions-container { + padding: 15px; + grid-template-columns: 1fr; + gap: 12px; + } + + .suggestion-item { + padding: 10px; + min-height: 70px; + } + + .copy-btn { + position: static; + opacity: 1; + margin-top: 6px; + width: 100%; + padding: 6px 8px; + font-size: 0.75rem; + } + + .variable-name { + font-size: 0.9rem; + } + + .variable-description { + font-size: 0.8rem; + } +} + +@media (max-width: 480px) { + .title { + font-size: 1.8rem; + letter-spacing: 1px; + } + + .container { + padding: 15px; + } + + .form-input { + padding: 10px; + } + + .suggestions-container { + padding: 12px; + gap: 10px; + } + + .suggestion-item { + padding: 8px; + min-height: 60px; + } + + .variable-name { + font-size: 0.85rem; + margin-bottom: 3px; + } + + .variable-description { + font-size: 0.75rem; + line-height: 1.3; + } + + .convention-group-title { + font-size: 0.9rem; + padding: 8px 12px; + margin: 12px 0 8px 0; + } +} + +/* 动画效果 */ +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.suggestion-item { + animation: fadeIn 0.3s ease; +} + +/* 加载动画 */ +@keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } +} + +.loading { + animation: pulse 1.5s ease-in-out infinite; } \ No newline at end of file diff --git a/InfoGenie-frontend/public/aimodelapp/AI姓名评测/index.html b/InfoGenie-frontend/public/aimodelapp/AI姓名评测/index.html index 42618b7e..582ea4fa 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI姓名评测/index.html +++ b/InfoGenie-frontend/public/aimodelapp/AI姓名评测/index.html @@ -1,57 +1,57 @@ - - - - - - AI姓名评测 - - - -
      -
      -

      AI姓名评测

      -

      智能分析姓名的稀有度、音韵美感与寓意内涵

      -
      - -
      - - -
      - - - -
      -

      分析结果

      -
      正在分析中,请稍候...
      - -
      -
      -

      稀有度评分

      -
      --%
      -
      点击"开始分析"查看结果
      -
      - -
      -

      音韵评价

      -
      --%
      -
      点击"开始分析"查看结果
      -
      - -
      -

      含义解读

      -
      点击"开始分析"查看姓名的深层寓意
      -
      -
      -
      -
      - - - - + + + + + + AI姓名评测 + + + +
      +
      +

      AI姓名评测

      +

      智能分析姓名的稀有度、音韵美感与寓意内涵

      +
      + +
      + + +
      + + + +
      +

      分析结果

      +
      正在分析中,请稍候...
      + +
      +
      +

      稀有度评分

      +
      --%
      +
      点击"开始分析"查看结果
      +
      + +
      +

      音韵评价

      +
      --%
      +
      点击"开始分析"查看结果
      +
      + +
      +

      含义解读

      +
      点击"开始分析"查看姓名的深层寓意
      +
      +
      +
      +
      + + + + \ No newline at end of file diff --git a/InfoGenie-frontend/public/aimodelapp/AI姓名评测/script.js b/InfoGenie-frontend/public/aimodelapp/AI姓名评测/script.js index 8e570ee9..7a4bbb59 100755 --- a/InfoGenie-frontend/public/aimodelapp/AI姓名评测/script.js +++ b/InfoGenie-frontend/public/aimodelapp/AI姓名评测/script.js @@ -1,262 +1,262 @@ -// 从配置文件导入设置 -// 配置在 env.js 文件中定义 - -// DOM 元素 -const nameInput = document.getElementById('nameInput'); -const analyzeBtn = document.getElementById('analyzeBtn'); -const loading = document.getElementById('loading'); -const rarityScore = document.getElementById('rarityScore'); -const rarityDesc = document.getElementById('rarityDesc'); -const phoneticScore = document.getElementById('phoneticScore'); -const phoneticDesc = document.getElementById('phoneticDesc'); -const meaningAnalysis = document.getElementById('meaningAnalysis'); - - - -// 解析AI返回的分析结果 -function parseAnalysisResult(content) { - const result = { - rarityScore: '--%', - rarityDesc: '解析失败', - phoneticScore: '--%', - phoneticDesc: '解析失败', - meaningAnalysis: '解析失败' - }; - - try { - // 过滤掉DeepSeek的思考标签内容 - let cleanContent = content.replace(/[\s\S]*?<\/think>/gi, ''); - cleanContent = cleanContent.replace(/[\s\S]*$/gi, ''); // 处理未闭合的think标签 - cleanContent = cleanContent.trim(); - - console.log('清理后的内容:', cleanContent); - - // 提取稀有度评分(百分比格式) - const rarityMatch = cleanContent.match(/【稀有度评分】[\s\S]*?评分:(\d+)%[\s\S]*?评价:([\s\S]*?)(?=【|$)/); - if (rarityMatch) { - result.rarityScore = rarityMatch[1] + '%'; - result.rarityDesc = rarityMatch[2].trim(); - } - - // 提取音韵评价(百分比格式) - const phoneticMatch = cleanContent.match(/【音韵评价】[\s\S]*?评分:(\d+)%[\s\S]*?评价:([\s\S]*?)(?=【|$)/); - if (phoneticMatch) { - result.phoneticScore = phoneticMatch[1] + '%'; - result.phoneticDesc = phoneticMatch[2].trim(); - } - - // 提取含义解读 - const meaningMatch = cleanContent.match(/【含义解读】[\s\S]*?\n([\s\S]+)$/); - if (meaningMatch) { - result.meaningAnalysis = meaningMatch[1].trim(); - } - } catch (error) { - console.error('解析结果时出错:', error); - } - - return result; -} - -// 简单的markdown解析函数 -function parseMarkdown(text) { - if (!text || typeof text !== 'string') return text; - - // 处理加粗 **text** 或 __text__ - let parsed = text.replace(/\*\*(.*?)\*\*/g, '$1'); - parsed = parsed.replace(/__(.*?)__/g, '$1'); - - // 处理斜体 *text* 或 _text_ - parsed = parsed.replace(/\*(.*?)\*/g, '$1'); - parsed = parsed.replace(/_(.*?)_/g, '$1'); - - // 处理无序列表 - const lines = parsed.split('\n'); - let inList = false; - let result = []; - - for (let i = 0; i < lines.length; i++) { - const line = lines[i].trim(); - - // 检查是否是列表项(以 - 开头,后面跟空格) - if (line.match(/^-\s+/)) { - if (!inList) { - result.push('
        '); - inList = true; - } - // 移除开头的 "- " 并包装为
      • - const listContent = line.replace(/^-\s+/, ''); - result.push(`
      • ${listContent}
      • `); - } else { - if (inList) { - result.push('
      '); - inList = false; - } - if (line) { - result.push(line); - } - } - } - - // 如果最后还在列表中,需要关闭列表 - if (inList) { - result.push(''); - } - - // 重新组合,用
      连接非列表行 - parsed = result.join('
      '); - - // 清理多余的
      标签(在列表前后) - parsed = parsed.replace(/
        /g, '
          '); - parsed = parsed.replace(/<\/ul>
          /g, '
        '); - parsed = parsed.replace(/
      • /g, '
      • '); - parsed = parsed.replace(/<\/li>
        /g, '
      • '); - - return parsed; -} - -// 更新显示结果 -function updateResults(result) { - rarityScore.textContent = result.rarityScore; - rarityDesc.innerHTML = parseMarkdown(result.rarityDesc); - phoneticScore.textContent = result.phoneticScore; - phoneticDesc.innerHTML = parseMarkdown(result.phoneticDesc); - meaningAnalysis.innerHTML = parseMarkdown(result.meaningAnalysis); -} - -// 重置结果显示 -function resetResults() { - rarityScore.textContent = '--%'; - rarityDesc.innerHTML = '点击"开始分析"查看结果'; - phoneticScore.textContent = '--%'; - phoneticDesc.innerHTML = '点击"开始分析"查看结果'; - meaningAnalysis.innerHTML = '点击"开始分析"查看姓名的深层寓意'; -} - -// 显示错误信息 -function showError(message) { - // 清除之前的错误信息 - const existingError = document.querySelector('.error'); - if (existingError) { - existingError.remove(); - } - - // 创建新的错误信息 - const errorDiv = document.createElement('div'); - errorDiv.className = 'error'; - errorDiv.textContent = `分析失败:${message}。`; - document.querySelector('.result-section').appendChild(errorDiv); -} - -// 姓名验证 -function validateName(name) { - if (!name) { - return '请输入姓名'; - } - if (name.length < 2) { - return '姓名至少需要2个字符'; - } - if (name.length > 10) { - return '姓名不能超过10个字符'; - } - if (!/^[\u4e00-\u9fa5a-zA-Z]+$/.test(name)) { - return '姓名只能包含中文或英文字符'; - } - return null; -} - -// 主要分析函数 -async function analyzeName() { - const name = nameInput.value.trim(); - - // 验证输入 - const validationError = validateName(name); - if (validationError) { - alert(validationError); - return; - } - - // 显示加载状态 - analyzeBtn.disabled = true; - analyzeBtn.textContent = '分析中...'; - loading.style.display = 'block'; - resetResults(); - - // 清除之前的错误信息 - const existingError = document.querySelector('.error'); - if (existingError) { - existingError.remove(); - } - - const requestBody = { - name: name - }; - - try { - // 调用后端API - // 获取JWT token - const token = localStorage.getItem('token'); - - if (!token) { - throw new Error('未登录,请先登录后使用AI功能'); - } - - const response = await fetch(`${window.API_CONFIG.baseUrl}/api/aimodelapp/name-analysis`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - }, - body: JSON.stringify(requestBody) - }); - - // 检查HTTP状态码 - if (response.status === 429) { - throw new Error('短时间内请求次数过多,请休息一下!'); - } - - if (!response.ok) { - if (response.status === 402) { - throw new Error('您的萌芽币余额不足,无法使用此功能'); - } - const errorData = await response.json(); - throw new Error(errorData.error || `请求失败: ${response.status} ${response.statusText}`); - } - - const data = await response.json(); - - if (data.success && data.analysis) { - const analysisResult = parseAnalysisResult(data.analysis.trim()); - updateResults(analysisResult); - } else { - throw new Error(data.error || 'AI响应格式异常'); - } - } catch (error) { - console.error('分析姓名时出错:', error); - showError(error.message); - resetResults(); - } finally { - // 恢复按钮状态 - analyzeBtn.disabled = false; - analyzeBtn.textContent = '开始分析'; - loading.style.display = 'none'; - } -} - -// 事件监听器 -analyzeBtn.addEventListener('click', analyzeName); - -// 回车键快捷分析 -nameInput.addEventListener('keypress', (e) => { - if (e.key === 'Enter') { - e.preventDefault(); - analyzeName(); - } -}); - -// 输入框内容变化时清除错误信息 -nameInput.addEventListener('input', () => { - const existingError = document.querySelector('.error'); - if (existingError) { - existingError.remove(); - } +// 从配置文件导入设置 +// 配置在 env.js 文件中定义 + +// DOM 元素 +const nameInput = document.getElementById('nameInput'); +const analyzeBtn = document.getElementById('analyzeBtn'); +const loading = document.getElementById('loading'); +const rarityScore = document.getElementById('rarityScore'); +const rarityDesc = document.getElementById('rarityDesc'); +const phoneticScore = document.getElementById('phoneticScore'); +const phoneticDesc = document.getElementById('phoneticDesc'); +const meaningAnalysis = document.getElementById('meaningAnalysis'); + + + +// 解析AI返回的分析结果 +function parseAnalysisResult(content) { + const result = { + rarityScore: '--%', + rarityDesc: '解析失败', + phoneticScore: '--%', + phoneticDesc: '解析失败', + meaningAnalysis: '解析失败' + }; + + try { + // 过滤掉DeepSeek的思考标签内容 + let cleanContent = content.replace(/[\s\S]*?<\/think>/gi, ''); + cleanContent = cleanContent.replace(/[\s\S]*$/gi, ''); // 处理未闭合的think标签 + cleanContent = cleanContent.trim(); + + console.log('清理后的内容:', cleanContent); + + // 提取稀有度评分(百分比格式) + const rarityMatch = cleanContent.match(/【稀有度评分】[\s\S]*?评分:(\d+)%[\s\S]*?评价:([\s\S]*?)(?=【|$)/); + if (rarityMatch) { + result.rarityScore = rarityMatch[1] + '%'; + result.rarityDesc = rarityMatch[2].trim(); + } + + // 提取音韵评价(百分比格式) + const phoneticMatch = cleanContent.match(/【音韵评价】[\s\S]*?评分:(\d+)%[\s\S]*?评价:([\s\S]*?)(?=【|$)/); + if (phoneticMatch) { + result.phoneticScore = phoneticMatch[1] + '%'; + result.phoneticDesc = phoneticMatch[2].trim(); + } + + // 提取含义解读 + const meaningMatch = cleanContent.match(/【含义解读】[\s\S]*?\n([\s\S]+)$/); + if (meaningMatch) { + result.meaningAnalysis = meaningMatch[1].trim(); + } + } catch (error) { + console.error('解析结果时出错:', error); + } + + return result; +} + +// 简单的markdown解析函数 +function parseMarkdown(text) { + if (!text || typeof text !== 'string') return text; + + // 处理加粗 **text** 或 __text__ + let parsed = text.replace(/\*\*(.*?)\*\*/g, '$1'); + parsed = parsed.replace(/__(.*?)__/g, '$1'); + + // 处理斜体 *text* 或 _text_ + parsed = parsed.replace(/\*(.*?)\*/g, '$1'); + parsed = parsed.replace(/_(.*?)_/g, '$1'); + + // 处理无序列表 + const lines = parsed.split('\n'); + let inList = false; + let result = []; + + for (let i = 0; i < lines.length; i++) { + const line = lines[i].trim(); + + // 检查是否是列表项(以 - 开头,后面跟空格) + if (line.match(/^-\s+/)) { + if (!inList) { + result.push('
          '); + inList = true; + } + // 移除开头的 "- " 并包装为
        • + const listContent = line.replace(/^-\s+/, ''); + result.push(`
        • ${listContent}
        • `); + } else { + if (inList) { + result.push('
        '); + inList = false; + } + if (line) { + result.push(line); + } + } + } + + // 如果最后还在列表中,需要关闭列表 + if (inList) { + result.push('
      '); + } + + // 重新组合,用
      连接非列表行 + parsed = result.join('
      '); + + // 清理多余的
      标签(在列表前后) + parsed = parsed.replace(/