From 518410edd009f1cde099b68e28fbe6d1fc865aae Mon Sep 17 00:00:00 2001 From: eric Date: Sun, 27 Sep 2026 12:15:00 -0500 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B8=B8=E6=B0=91=E5=AF=BC=E8=88=AA=20?= =?UTF-8?q?H5=E3=80=81=E5=BE=AE=E4=BF=A1=E5=B0=8F=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E4=B8=8E=E5=B0=8F=E7=BA=A2=E4=B9=A6=E5=B0=8F=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- .gitignore | 36 + .oxlintrc.json | 8 + README.md | 58 + index.html | 21 + package-lock.json | 2188 ++++++++++++++++++++++++++ package.json | 32 + public/favicon.svg | 1 + public/icons.svg | 24 + public/icons/1psim.webp | Bin 0 -> 3872 bytes public/icons/3x-ui.webp | Bin 0 -> 1458 bytes public/icons/9esim.webp | Bin 0 -> 1254 bytes public/icons/_brand.webp | Bin 0 -> 2850 bytes public/icons/aapanel.webp | Bin 0 -> 1970 bytes public/icons/action-cam.webp | Bin 0 -> 794 bytes public/icons/adsense.webp | Bin 0 -> 3068 bytes public/icons/ai-glasses.webp | Bin 0 -> 682 bytes public/icons/aliyun.webp | Bin 0 -> 934 bytes public/icons/bmc.webp | Bin 0 -> 1586 bytes public/icons/bwh.webp | Bin 0 -> 1354 bytes public/icons/chatgpt.webp | Bin 0 -> 1378 bytes public/icons/cloud-phone.webp | Bin 0 -> 724 bytes public/icons/cloudflare.webp | Bin 0 -> 1302 bytes public/icons/colocrossing.webp | Bin 0 -> 2270 bytes public/icons/creem.webp | Bin 0 -> 1242 bytes public/icons/drone.webp | Bin 0 -> 772 bytes public/icons/dsx.webp | Bin 0 -> 2212 bytes public/icons/ffmpeg.webp | Bin 0 -> 1200 bytes public/icons/frp.webp | Bin 0 -> 910 bytes public/icons/ga.webp | Bin 0 -> 1876 bytes public/icons/gpu.webp | Bin 0 -> 1070 bytes public/icons/grok.webp | Bin 0 -> 2824 bytes public/icons/iproyal.webp | Bin 0 -> 522 bytes public/icons/jms.webp | Bin 0 -> 1750 bytes public/icons/lineageos.webp | Bin 0 -> 798 bytes public/icons/lisa.webp | Bin 0 -> 1252 bytes public/icons/mihomo.webp | Bin 0 -> 2858 bytes public/icons/mini-pc.webp | Bin 0 -> 370 bytes public/icons/namesilo.webp | Bin 0 -> 942 bytes public/icons/nomad-book.webp | Bin 0 -> 832 bytes public/icons/nomadcna.webp | Bin 0 -> 1520 bytes public/icons/nomadlist.webp | Bin 0 -> 600 bytes public/icons/nomadro.webp | Bin 0 -> 3394 bytes public/icons/nowpayments.webp | Bin 0 -> 236 bytes public/icons/obs.webp | Bin 0 -> 1212 bytes public/icons/okx.webp | Bin 0 -> 926 bytes public/icons/paypal.webp | Bin 0 -> 616 bytes public/icons/proxy-cheap.webp | Bin 0 -> 1000 bytes public/icons/qcloud.webp | Bin 0 -> 1486 bytes public/icons/racknerd.webp | Bin 0 -> 776 bytes public/icons/rpi.webp | Bin 0 -> 1302 bytes public/icons/safepal.webp | Bin 0 -> 1062 bytes public/icons/smartproxy.webp | Bin 0 -> 396 bytes public/icons/smmfollows.webp | Bin 0 -> 1652 bytes public/icons/srs.webp | Bin 0 -> 2452 bytes public/icons/stripe.webp | Bin 0 -> 750 bytes public/icons/tello.webp | Bin 0 -> 1490 bytes public/icons/tiktok.webp | Bin 0 -> 1244 bytes public/icons/vcam.webp | Bin 0 -> 928 bytes public/icons/voyracloud.webp | Bin 0 -> 1342 bytes public/icons/vultr.webp | Bin 0 -> 944 bytes public/icons/wireguard.webp | Bin 0 -> 1028 bytes public/icons/wise.webp | Bin 0 -> 726 bytes public/icons/xorpay.webp | Bin 0 -> 546 bytes public/icons/yesim.webp | Bin 0 -> 968 bytes public/icons/yidu.webp | Bin 0 -> 1662 bytes public/icons/ykk.webp | Bin 0 -> 2778 bytes public/icons/youtube.webp | Bin 0 -> 1718 bytes public/icons/yt-auto-dismiss.webp | Bin 0 -> 3226 bytes public/icons/zpay.webp | Bin 0 -> 4018 bytes scripts/fetch-icons.mjs | 166 ++ src/App.tsx | 247 +++ src/assets/hero.png | Bin 0 -> 13057 bytes src/assets/react.svg | 1 + src/assets/vite.svg | 1 + src/components/CategoryPanel.tsx | 48 + src/components/LinkCard.tsx | 57 + src/components/SideDrawer.tsx | 101 ++ src/data/links.json | 585 +++++++ src/hooks/usePrefersReducedMotion.ts | 15 + src/hooks/useReveal.ts | 37 + src/main.tsx | 10 + src/styles/global.css | 951 +++++++++++ src/types.ts | 30 + tsconfig.app.json | 27 + tsconfig.json | 7 + tsconfig.node.json | 23 + vite.config.ts | 7 + weapp/README.md | 47 + weapp/app.js | 15 + weapp/app.json | 13 + weapp/app.wxss | 80 + weapp/data/links.json | 586 +++++++ weapp/icons/1psim.webp | Bin 0 -> 3872 bytes weapp/icons/3x-ui.webp | Bin 0 -> 1458 bytes weapp/icons/9esim.webp | Bin 0 -> 1254 bytes weapp/icons/_brand.webp | Bin 0 -> 2850 bytes weapp/icons/aapanel.webp | Bin 0 -> 1970 bytes weapp/icons/action-cam.webp | Bin 0 -> 794 bytes weapp/icons/adsense.webp | Bin 0 -> 3068 bytes weapp/icons/ai-glasses.webp | Bin 0 -> 682 bytes weapp/icons/aliyun.webp | Bin 0 -> 934 bytes weapp/icons/bmc.webp | Bin 0 -> 1586 bytes weapp/icons/bwh.webp | Bin 0 -> 1354 bytes weapp/icons/chatgpt.webp | Bin 0 -> 1378 bytes weapp/icons/cloud-phone.webp | Bin 0 -> 724 bytes weapp/icons/cloudflare.webp | Bin 0 -> 1302 bytes weapp/icons/colocrossing.webp | Bin 0 -> 2270 bytes weapp/icons/creem.webp | Bin 0 -> 1242 bytes weapp/icons/drone.webp | Bin 0 -> 772 bytes weapp/icons/dsx.webp | Bin 0 -> 2212 bytes weapp/icons/ffmpeg.webp | Bin 0 -> 1200 bytes weapp/icons/frp.webp | Bin 0 -> 910 bytes weapp/icons/ga.webp | Bin 0 -> 1876 bytes weapp/icons/gpu.webp | Bin 0 -> 1070 bytes weapp/icons/grok.webp | Bin 0 -> 2824 bytes weapp/icons/iproyal.webp | Bin 0 -> 522 bytes weapp/icons/jms.webp | Bin 0 -> 1750 bytes weapp/icons/lineageos.webp | Bin 0 -> 798 bytes weapp/icons/lisa.webp | Bin 0 -> 1252 bytes weapp/icons/mihomo.webp | Bin 0 -> 2858 bytes weapp/icons/mini-pc.webp | Bin 0 -> 370 bytes weapp/icons/namesilo.webp | Bin 0 -> 942 bytes weapp/icons/nomad-book.webp | Bin 0 -> 832 bytes weapp/icons/nomadcna.webp | Bin 0 -> 1520 bytes weapp/icons/nomadlist.webp | Bin 0 -> 600 bytes weapp/icons/nomadro.webp | Bin 0 -> 3394 bytes weapp/icons/nowpayments.webp | Bin 0 -> 236 bytes weapp/icons/obs.webp | Bin 0 -> 1212 bytes weapp/icons/okx.webp | Bin 0 -> 926 bytes weapp/icons/paypal.webp | Bin 0 -> 616 bytes weapp/icons/proxy-cheap.webp | Bin 0 -> 1000 bytes weapp/icons/qcloud.webp | Bin 0 -> 1486 bytes weapp/icons/racknerd.webp | Bin 0 -> 776 bytes weapp/icons/rpi.webp | Bin 0 -> 1302 bytes weapp/icons/safepal.webp | Bin 0 -> 1062 bytes weapp/icons/smartproxy.webp | Bin 0 -> 396 bytes weapp/icons/smmfollows.webp | Bin 0 -> 1652 bytes weapp/icons/srs.webp | Bin 0 -> 2452 bytes weapp/icons/stripe.webp | Bin 0 -> 750 bytes weapp/icons/tello.webp | Bin 0 -> 1490 bytes weapp/icons/tiktok.webp | Bin 0 -> 1244 bytes weapp/icons/vcam.webp | Bin 0 -> 928 bytes weapp/icons/voyracloud.webp | Bin 0 -> 1342 bytes weapp/icons/vultr.webp | Bin 0 -> 944 bytes weapp/icons/wireguard.webp | Bin 0 -> 1028 bytes weapp/icons/wise.webp | Bin 0 -> 726 bytes weapp/icons/xorpay.webp | Bin 0 -> 546 bytes weapp/icons/yesim.webp | Bin 0 -> 968 bytes weapp/icons/yidu.webp | Bin 0 -> 1662 bytes weapp/icons/ykk.webp | Bin 0 -> 2778 bytes weapp/icons/youtube.webp | Bin 0 -> 1718 bytes weapp/icons/yt-auto-dismiss.webp | Bin 0 -> 3226 bytes weapp/icons/zpay.webp | Bin 0 -> 4018 bytes weapp/pages/index/index.js | 214 +++ weapp/pages/index/index.json | 4 + weapp/pages/index/index.wxml | 143 ++ weapp/pages/index/index.wxss | 539 +++++++ weapp/project.config.json | 39 + weapp/project.private.config.json | 14 + weapp/scripts/sync_data.py | 65 + weapp/sitemap.json | 9 + xhs/README.md | 56 + xhs/scripts/assemble.py | 52 + xhs/scripts/pack.py | 34 + xhs/scripts/sync_data.py | 68 + xhs/tool/app.js | 470 ++++++ xhs/tool/icons/1psim.webp | Bin 0 -> 3872 bytes xhs/tool/icons/3x-ui.webp | Bin 0 -> 1458 bytes xhs/tool/icons/9esim.webp | Bin 0 -> 1254 bytes xhs/tool/icons/_brand.webp | Bin 0 -> 2850 bytes xhs/tool/icons/aapanel.webp | Bin 0 -> 1970 bytes xhs/tool/icons/action-cam.webp | Bin 0 -> 794 bytes xhs/tool/icons/adsense.webp | Bin 0 -> 3068 bytes xhs/tool/icons/ai-glasses.webp | Bin 0 -> 682 bytes xhs/tool/icons/aliyun.webp | Bin 0 -> 934 bytes xhs/tool/icons/bmc.webp | Bin 0 -> 1586 bytes xhs/tool/icons/bwh.webp | Bin 0 -> 1354 bytes xhs/tool/icons/chatgpt.webp | Bin 0 -> 1378 bytes xhs/tool/icons/cloud-phone.webp | Bin 0 -> 724 bytes xhs/tool/icons/cloudflare.webp | Bin 0 -> 1302 bytes xhs/tool/icons/colocrossing.webp | Bin 0 -> 2270 bytes xhs/tool/icons/creem.webp | Bin 0 -> 1242 bytes xhs/tool/icons/drone.webp | Bin 0 -> 772 bytes xhs/tool/icons/dsx.webp | Bin 0 -> 2212 bytes xhs/tool/icons/ffmpeg.webp | Bin 0 -> 1200 bytes xhs/tool/icons/frp.webp | Bin 0 -> 910 bytes xhs/tool/icons/ga.webp | Bin 0 -> 1876 bytes xhs/tool/icons/gpu.webp | Bin 0 -> 1070 bytes xhs/tool/icons/grok.webp | Bin 0 -> 2824 bytes xhs/tool/icons/iproyal.webp | Bin 0 -> 522 bytes xhs/tool/icons/jms.webp | Bin 0 -> 1750 bytes xhs/tool/icons/lineageos.webp | Bin 0 -> 798 bytes xhs/tool/icons/lisa.webp | Bin 0 -> 1252 bytes xhs/tool/icons/mihomo.webp | Bin 0 -> 2858 bytes xhs/tool/icons/mini-pc.webp | Bin 0 -> 370 bytes xhs/tool/icons/namesilo.webp | Bin 0 -> 942 bytes xhs/tool/icons/nomad-book.webp | Bin 0 -> 832 bytes xhs/tool/icons/nomadcna.webp | Bin 0 -> 1520 bytes xhs/tool/icons/nomadlist.webp | Bin 0 -> 600 bytes xhs/tool/icons/nomadro.webp | Bin 0 -> 3394 bytes xhs/tool/icons/nowpayments.webp | Bin 0 -> 236 bytes xhs/tool/icons/obs.webp | Bin 0 -> 1212 bytes xhs/tool/icons/okx.webp | Bin 0 -> 926 bytes xhs/tool/icons/paypal.webp | Bin 0 -> 616 bytes xhs/tool/icons/proxy-cheap.webp | Bin 0 -> 1000 bytes xhs/tool/icons/qcloud.webp | Bin 0 -> 1486 bytes xhs/tool/icons/racknerd.webp | Bin 0 -> 776 bytes xhs/tool/icons/rpi.webp | Bin 0 -> 1302 bytes xhs/tool/icons/safepal.webp | Bin 0 -> 1062 bytes xhs/tool/icons/smartproxy.webp | Bin 0 -> 396 bytes xhs/tool/icons/smmfollows.webp | Bin 0 -> 1652 bytes xhs/tool/icons/srs.webp | Bin 0 -> 2452 bytes xhs/tool/icons/stripe.webp | Bin 0 -> 750 bytes xhs/tool/icons/tello.webp | Bin 0 -> 1490 bytes xhs/tool/icons/tiktok.webp | Bin 0 -> 1244 bytes xhs/tool/icons/vcam.webp | Bin 0 -> 928 bytes xhs/tool/icons/voyracloud.webp | Bin 0 -> 1342 bytes xhs/tool/icons/vultr.webp | Bin 0 -> 944 bytes xhs/tool/icons/wireguard.webp | Bin 0 -> 1028 bytes xhs/tool/icons/wise.webp | Bin 0 -> 726 bytes xhs/tool/icons/xorpay.webp | Bin 0 -> 546 bytes xhs/tool/icons/yesim.webp | Bin 0 -> 968 bytes xhs/tool/icons/yidu.webp | Bin 0 -> 1662 bytes xhs/tool/icons/ykk.webp | Bin 0 -> 2778 bytes xhs/tool/icons/youtube.webp | Bin 0 -> 1718 bytes xhs/tool/icons/yt-auto-dismiss.webp | Bin 0 -> 3226 bytes xhs/tool/icons/zpay.webp | Bin 0 -> 4018 bytes xhs/tool/index.html | 129 ++ xhs/tool/nav-data.js | 587 +++++++ xhs/tool/styles.css | 944 +++++++++++ 230 files changed, 8789 insertions(+) create mode 100644 .gitignore create mode 100644 .oxlintrc.json create mode 100644 README.md create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/favicon.svg create mode 100644 public/icons.svg create mode 100644 public/icons/1psim.webp create mode 100644 public/icons/3x-ui.webp create mode 100644 public/icons/9esim.webp create mode 100644 public/icons/_brand.webp create mode 100644 public/icons/aapanel.webp create mode 100644 public/icons/action-cam.webp create mode 100644 public/icons/adsense.webp create mode 100644 public/icons/ai-glasses.webp create mode 100644 public/icons/aliyun.webp create mode 100644 public/icons/bmc.webp create mode 100644 public/icons/bwh.webp create mode 100644 public/icons/chatgpt.webp create mode 100644 public/icons/cloud-phone.webp create mode 100644 public/icons/cloudflare.webp create mode 100644 public/icons/colocrossing.webp create mode 100644 public/icons/creem.webp create mode 100644 public/icons/drone.webp create mode 100644 public/icons/dsx.webp create mode 100644 public/icons/ffmpeg.webp create mode 100644 public/icons/frp.webp create mode 100644 public/icons/ga.webp create mode 100644 public/icons/gpu.webp create mode 100644 public/icons/grok.webp create mode 100644 public/icons/iproyal.webp create mode 100644 public/icons/jms.webp create mode 100644 public/icons/lineageos.webp create mode 100644 public/icons/lisa.webp create mode 100644 public/icons/mihomo.webp create mode 100644 public/icons/mini-pc.webp create mode 100644 public/icons/namesilo.webp create mode 100644 public/icons/nomad-book.webp create mode 100644 public/icons/nomadcna.webp create mode 100644 public/icons/nomadlist.webp create mode 100644 public/icons/nomadro.webp create mode 100644 public/icons/nowpayments.webp create mode 100644 public/icons/obs.webp create mode 100644 public/icons/okx.webp create mode 100644 public/icons/paypal.webp create mode 100644 public/icons/proxy-cheap.webp create mode 100644 public/icons/qcloud.webp create mode 100644 public/icons/racknerd.webp create mode 100644 public/icons/rpi.webp create mode 100644 public/icons/safepal.webp create mode 100644 public/icons/smartproxy.webp create mode 100644 public/icons/smmfollows.webp create mode 100644 public/icons/srs.webp create mode 100644 public/icons/stripe.webp create mode 100644 public/icons/tello.webp create mode 100644 public/icons/tiktok.webp create mode 100644 public/icons/vcam.webp create mode 100644 public/icons/voyracloud.webp create mode 100644 public/icons/vultr.webp create mode 100644 public/icons/wireguard.webp create mode 100644 public/icons/wise.webp create mode 100644 public/icons/xorpay.webp create mode 100644 public/icons/yesim.webp create mode 100644 public/icons/yidu.webp create mode 100644 public/icons/ykk.webp create mode 100644 public/icons/youtube.webp create mode 100644 public/icons/yt-auto-dismiss.webp create mode 100644 public/icons/zpay.webp create mode 100644 scripts/fetch-icons.mjs create mode 100644 src/App.tsx create mode 100644 src/assets/hero.png create mode 100644 src/assets/react.svg create mode 100644 src/assets/vite.svg create mode 100644 src/components/CategoryPanel.tsx create mode 100644 src/components/LinkCard.tsx create mode 100644 src/components/SideDrawer.tsx create mode 100644 src/data/links.json create mode 100644 src/hooks/usePrefersReducedMotion.ts create mode 100644 src/hooks/useReveal.ts create mode 100644 src/main.tsx create mode 100644 src/styles/global.css create mode 100644 src/types.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts create mode 100644 weapp/README.md create mode 100644 weapp/app.js create mode 100644 weapp/app.json create mode 100644 weapp/app.wxss create mode 100644 weapp/data/links.json create mode 100644 weapp/icons/1psim.webp create mode 100644 weapp/icons/3x-ui.webp create mode 100644 weapp/icons/9esim.webp create mode 100644 weapp/icons/_brand.webp create mode 100644 weapp/icons/aapanel.webp create mode 100644 weapp/icons/action-cam.webp create mode 100644 weapp/icons/adsense.webp create mode 100644 weapp/icons/ai-glasses.webp create mode 100644 weapp/icons/aliyun.webp create mode 100644 weapp/icons/bmc.webp create mode 100644 weapp/icons/bwh.webp create mode 100644 weapp/icons/chatgpt.webp create mode 100644 weapp/icons/cloud-phone.webp create mode 100644 weapp/icons/cloudflare.webp create mode 100644 weapp/icons/colocrossing.webp create mode 100644 weapp/icons/creem.webp create mode 100644 weapp/icons/drone.webp create mode 100644 weapp/icons/dsx.webp create mode 100644 weapp/icons/ffmpeg.webp create mode 100644 weapp/icons/frp.webp create mode 100644 weapp/icons/ga.webp create mode 100644 weapp/icons/gpu.webp create mode 100644 weapp/icons/grok.webp create mode 100644 weapp/icons/iproyal.webp create mode 100644 weapp/icons/jms.webp create mode 100644 weapp/icons/lineageos.webp create mode 100644 weapp/icons/lisa.webp create mode 100644 weapp/icons/mihomo.webp create mode 100644 weapp/icons/mini-pc.webp create mode 100644 weapp/icons/namesilo.webp create mode 100644 weapp/icons/nomad-book.webp create mode 100644 weapp/icons/nomadcna.webp create mode 100644 weapp/icons/nomadlist.webp create mode 100644 weapp/icons/nomadro.webp create mode 100644 weapp/icons/nowpayments.webp create mode 100644 weapp/icons/obs.webp create mode 100644 weapp/icons/okx.webp create mode 100644 weapp/icons/paypal.webp create mode 100644 weapp/icons/proxy-cheap.webp create mode 100644 weapp/icons/qcloud.webp create mode 100644 weapp/icons/racknerd.webp create mode 100644 weapp/icons/rpi.webp create mode 100644 weapp/icons/safepal.webp create mode 100644 weapp/icons/smartproxy.webp create mode 100644 weapp/icons/smmfollows.webp create mode 100644 weapp/icons/srs.webp create mode 100644 weapp/icons/stripe.webp create mode 100644 weapp/icons/tello.webp create mode 100644 weapp/icons/tiktok.webp create mode 100644 weapp/icons/vcam.webp create mode 100644 weapp/icons/voyracloud.webp create mode 100644 weapp/icons/vultr.webp create mode 100644 weapp/icons/wireguard.webp create mode 100644 weapp/icons/wise.webp create mode 100644 weapp/icons/xorpay.webp create mode 100644 weapp/icons/yesim.webp create mode 100644 weapp/icons/yidu.webp create mode 100644 weapp/icons/ykk.webp create mode 100644 weapp/icons/youtube.webp create mode 100644 weapp/icons/yt-auto-dismiss.webp create mode 100644 weapp/icons/zpay.webp create mode 100644 weapp/pages/index/index.js create mode 100644 weapp/pages/index/index.json create mode 100644 weapp/pages/index/index.wxml create mode 100644 weapp/pages/index/index.wxss create mode 100644 weapp/project.config.json create mode 100644 weapp/project.private.config.json create mode 100644 weapp/scripts/sync_data.py create mode 100644 weapp/sitemap.json create mode 100644 xhs/README.md create mode 100644 xhs/scripts/assemble.py create mode 100644 xhs/scripts/pack.py create mode 100644 xhs/scripts/sync_data.py create mode 100644 xhs/tool/app.js create mode 100644 xhs/tool/icons/1psim.webp create mode 100644 xhs/tool/icons/3x-ui.webp create mode 100644 xhs/tool/icons/9esim.webp create mode 100644 xhs/tool/icons/_brand.webp create mode 100644 xhs/tool/icons/aapanel.webp create mode 100644 xhs/tool/icons/action-cam.webp create mode 100644 xhs/tool/icons/adsense.webp create mode 100644 xhs/tool/icons/ai-glasses.webp create mode 100644 xhs/tool/icons/aliyun.webp create mode 100644 xhs/tool/icons/bmc.webp create mode 100644 xhs/tool/icons/bwh.webp create mode 100644 xhs/tool/icons/chatgpt.webp create mode 100644 xhs/tool/icons/cloud-phone.webp create mode 100644 xhs/tool/icons/cloudflare.webp create mode 100644 xhs/tool/icons/colocrossing.webp create mode 100644 xhs/tool/icons/creem.webp create mode 100644 xhs/tool/icons/drone.webp create mode 100644 xhs/tool/icons/dsx.webp create mode 100644 xhs/tool/icons/ffmpeg.webp create mode 100644 xhs/tool/icons/frp.webp create mode 100644 xhs/tool/icons/ga.webp create mode 100644 xhs/tool/icons/gpu.webp create mode 100644 xhs/tool/icons/grok.webp create mode 100644 xhs/tool/icons/iproyal.webp create mode 100644 xhs/tool/icons/jms.webp create mode 100644 xhs/tool/icons/lineageos.webp create mode 100644 xhs/tool/icons/lisa.webp create mode 100644 xhs/tool/icons/mihomo.webp create mode 100644 xhs/tool/icons/mini-pc.webp create mode 100644 xhs/tool/icons/namesilo.webp create mode 100644 xhs/tool/icons/nomad-book.webp create mode 100644 xhs/tool/icons/nomadcna.webp create mode 100644 xhs/tool/icons/nomadlist.webp create mode 100644 xhs/tool/icons/nomadro.webp create mode 100644 xhs/tool/icons/nowpayments.webp create mode 100644 xhs/tool/icons/obs.webp create mode 100644 xhs/tool/icons/okx.webp create mode 100644 xhs/tool/icons/paypal.webp create mode 100644 xhs/tool/icons/proxy-cheap.webp create mode 100644 xhs/tool/icons/qcloud.webp create mode 100644 xhs/tool/icons/racknerd.webp create mode 100644 xhs/tool/icons/rpi.webp create mode 100644 xhs/tool/icons/safepal.webp create mode 100644 xhs/tool/icons/smartproxy.webp create mode 100644 xhs/tool/icons/smmfollows.webp create mode 100644 xhs/tool/icons/srs.webp create mode 100644 xhs/tool/icons/stripe.webp create mode 100644 xhs/tool/icons/tello.webp create mode 100644 xhs/tool/icons/tiktok.webp create mode 100644 xhs/tool/icons/vcam.webp create mode 100644 xhs/tool/icons/voyracloud.webp create mode 100644 xhs/tool/icons/vultr.webp create mode 100644 xhs/tool/icons/wireguard.webp create mode 100644 xhs/tool/icons/wise.webp create mode 100644 xhs/tool/icons/xorpay.webp create mode 100644 xhs/tool/icons/yesim.webp create mode 100644 xhs/tool/icons/yidu.webp create mode 100644 xhs/tool/icons/ykk.webp create mode 100644 xhs/tool/icons/youtube.webp create mode 100644 xhs/tool/icons/yt-auto-dismiss.webp create mode 100644 xhs/tool/icons/zpay.webp create mode 100644 xhs/tool/index.html create mode 100644 xhs/tool/nav-data.js create mode 100644 xhs/tool/styles.css diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fcf5f38 --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Build / pack outputs +xhs/release/ +xhs/dist/ +*.zip + +# Local secrets / one-off assets +.env +.env.* +nomadro.png +scripts/_*.py + diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000..6fa991d --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,8 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["react", "typescript", "oxc"], + "rules": { + "react/rules-of-hooks": "error", + "react/only-export-components": ["warn", { "allowConstantExport": true }] + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..1b26efe --- /dev/null +++ b/README.md @@ -0,0 +1,58 @@ +# Navmini · 游民导航 + +移动端优先的 **Link 导航** H5,内容对齐 [nav.hackrobot.cn](https://nav.hackrobot.cn/)。效果认可后再做微信 / 抖音 / 小红书小程序。 + +## 本地预览 + +```bash +npm install +npm run dev +``` + +手机或浏览器窄屏预览最佳。 + +```bash +npm run build +npm run preview +``` + +## 能力 + +- 整页长滚动浏览全部入口(图标 + 标题 + 简介) +- 左侧抽屉可快速跳到某一分类 +- 顶栏随滚动显示当前分类 +- 浅色 / 深色主题记忆 +- 回到顶部 + +## 图标 + +图标已离线压缩到 [`public/icons/`](public/icons/)(96×96 WebP)。`links.json` 引用 `/icons/{id}.webp`。 + +重新拉取并压缩: + +```bash +npm run icons +``` + + +编辑 [`src/data/links.json`](src/data/links.json): + +``` +categories[] → groups[] → links[] + id / title / subtitle / href / icon / action? +``` + +`action` 默认 `open`;设为 `copy` 时写入剪贴板。 + +## 小程序 + +- [`xhs/`](xhs/) 小红书小工具(离线导航,手动选中复制网址) +- [`weapp/`](weapp/) 微信小程序(抽屉 + 长列表,一键复制网址) + +```bash +npm run weapp:sync +``` + +微信开发者工具打开 `weapp/` 目录。详见 [`weapp/README.md`](weapp/README.md)。 + +- `tt/` 抖音小程序(待做) diff --git a/index.html b/index.html new file mode 100644 index 0000000..7c038d2 --- /dev/null +++ b/index.html @@ -0,0 +1,21 @@ + + + + + + + + + + + + 游民导航 + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..9154b6e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2188 @@ +{ + "name": "navmini", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "navmini", + "version": "0.0.0", + "dependencies": { + "react": "^19.2.8", + "react-dom": "^19.2.8" + }, + "devDependencies": { + "@types/node": "^24.13.3", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.7", + "@vitejs/plugin-react": "^6.1.1", + "icojs": "^1.0.1", + "oxlint": "^1.81.0", + "sharp": "^0.35.5", + "typescript": "~6.0.2", + "vite": "^8.3.0" + } + }, + "node_modules/@borewit/text-codec": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.2.tgz", + "integrity": "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@canvas/image-data": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@canvas/image-data/-/image-data-1.1.0.tgz", + "integrity": "sha512-QdObRRjRbcXGmM1tmJ+MrHcaz1MftF2+W7YI+MsphnsCrmtyfS0d5qJbk0MeSbUeyM/jCb0hmnkXPsy026L7dA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.5.tgz", + "integrity": "sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.3.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.5.tgz", + "integrity": "sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.3.4" + } + }, + "node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.5.tgz", + "integrity": "sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "dependencies": { + "@img/sharp-wasm32": "0.35.5" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.4.tgz", + "integrity": "sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.4.tgz", + "integrity": "sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.4.tgz", + "integrity": "sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.4.tgz", + "integrity": "sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.4.tgz", + "integrity": "sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.4.tgz", + "integrity": "sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.4.tgz", + "integrity": "sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.4.tgz", + "integrity": "sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.4.tgz", + "integrity": "sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.4.tgz", + "integrity": "sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.5.tgz", + "integrity": "sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.5.tgz", + "integrity": "sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.5.tgz", + "integrity": "sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.5.tgz", + "integrity": "sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.5.tgz", + "integrity": "sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.5.tgz", + "integrity": "sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.3.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.5.tgz", + "integrity": "sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.3.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.5.tgz", + "integrity": "sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.3.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.5.tgz", + "integrity": "sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==", + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.11.3" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.5.tgz", + "integrity": "sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/sharp-wasm32": "0.35.5" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.5.tgz", + "integrity": "sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.5.tgz", + "integrity": "sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.5.tgz", + "integrity": "sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.151.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/oxc-project" + } + }, + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.85.0.tgz", + "integrity": "sha512-q2KO/Zso9UT+OMn0NF9ywn4E4t0MI3yxiDhNyhsQ7DyQJrC4FhFE4TXOi4bktFnOWXTMds8qZSbpv2XwRaNOBg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.85.0.tgz", + "integrity": "sha512-SxLN3ALjoT9NNdvpjEevGeHvfzTAFrF0NBYB5tzK7/GtCKMze3j1e/m/X2ozqGj2U9hfGG/dg/OG8vpVK4PiDA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.85.0.tgz", + "integrity": "sha512-Y/Sup/J4f0f9UGsSd/xyCNTeWL+gepO63GBdEDAfue9nBsnk9zMmnIXx1O6b1V8C90vB5nucYNZ0pbMXAp8zJA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.85.0.tgz", + "integrity": "sha512-ApOSNC04ynpDTwvBD+//0wyfODRSbEzvRoKpX8teffmc27z8AockwSNeMXGJXn5KP85eahDgR/2llICWLkzcnw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.85.0.tgz", + "integrity": "sha512-bNrVrCOA/kHky3Tu79IXWXe5bhIgLXfUuUEDHlAGOHUk96MkvDZ1ecaQF19rwstrnaqfP1o9nBTqzIr9+ZHkUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.85.0.tgz", + "integrity": "sha512-NUrzOJ1s/EqsVvfn2L/1D8Wro2LPIZUbihL8kOJLh5fEdGEN3rdOGUYq3HwnUIL8sjpoP+4N6RaGrgmMJnaMPw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.85.0.tgz", + "integrity": "sha512-UJXrAT3E/RWkEqXLIs2ehETja1qfgkPb+5gwLIIS+o/6cf+grHvoOXTa5997a/YNQfcJS0DRBTOfZt95cvOI1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.85.0.tgz", + "integrity": "sha512-lK40QLjI0HxigO7CjDDshEtfYIeiYS0020v5BHFPqN4uuQBQxd2K9LNom2dW15o9F1937quSCRVp4ZsVhdbYdg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.85.0.tgz", + "integrity": "sha512-c2zbdBwGKreHXwRx3gWBuFGJxLhxgsg6YlZ+3H+RgRusU/UEV9jNwJ3HGYK+nRo0LvBa7mt6Kj86xoVotUo8cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.85.0.tgz", + "integrity": "sha512-tlt/Hy8lZ97/lCPmCgw/B3k/mwh+BzaIPbPkldZEly7TwLmx0xe2CQcaW2g/rR0dOgS9JNGCZsMEqLhUNMGvaw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.85.0.tgz", + "integrity": "sha512-3tNR9Xey82X0zKuY1d8hJ6Rc9gwRDurmqGLnQZa5xqOXy8/YyiqFXjAtugkKLY82obOlpK1eSiDRlgcNPuxtIg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.85.0.tgz", + "integrity": "sha512-wbGRd5PqCcjkJFHhZuZ2OBSUQY9czlQsoA/cQQB9JK/L9mC5MQgGoKAh+xd8QjA5V+0D3j+Qd1lAWn1I8zlelA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.85.0.tgz", + "integrity": "sha512-3Sn0kSrE4DPZCWV/8o+n4x3aFZxI9ulMnkYlwCbJ8eUVkwRK2IerohE/A/z3SNbCwoPFOCJmGE5Avrq0rrvdvQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.85.0.tgz", + "integrity": "sha512-JY2pxxYfB62bAGfejljVCqc44etItehPuAyaeSAdMuEMtwNA00ggMnS66lC1oIhos6oOXUkuU6mZ9bpFh3BqWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.85.0.tgz", + "integrity": "sha512-5k74vZ6qJBjBHEOlBk9B/iv68Yu0F1Afw/vvT2ar6OGCqEeXLaSjXz2n/IPCbhLG22UoKoYEJTzpYraRdcp6PA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.85.0.tgz", + "integrity": "sha512-GbAl5qt5TCkPLXTaIISZJnugrcBhra6rodcXc9jYt620UtdsTt71NlNmJmm0frxzFpd54x/G+MkitEJA8I/BoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.85.0.tgz", + "integrity": "sha512-kjmws5MK0et2swk4ND85D7NVQyDHw162i6whtZDLUA/lo6FQyBZDcmMRCMcVZcNrAhIaftVb00x9ChGDOjjNJA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.85.0.tgz", + "integrity": "sha512-eSsIJx9n4yxvOqYTZyPEMyEXRmE60XH7xGAU7i0Qbsn1lf6Za3CWJ9aRd82oSFKXaxhp+sA6/yMJVRIpLpna6A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.85.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.11.tgz", + "integrity": "sha512-A5kXfGKvKWWZE0TtPrfsvT+q4Y5d1QG8gGUzpYjGydM+fARM9MuX90PrXYXe0XbsDVgyxxNzHo6giCj90bsFNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.11.tgz", + "integrity": "sha512-z6cTycz+iJ4PVkuL4HHW4DfTfoeU/2nqYYuSOrTmH7yHK5Y0LCOnA03V4ZNxavyVaU1oOqUgIg2klN/s+USGOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.11.tgz", + "integrity": "sha512-jShvqNtP6vDC6/A5JOAzbVV+DkgHqhl/ScVCJEbt+TUY6QYz7YnXcrg3sLtFBniro0f/Ld50ZwCWA6f7KYD1nQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.11.tgz", + "integrity": "sha512-f2i2xiNWq1Z1l2++q2fuhZRdLAT3aqxD6vRNm1RAxpUoBcdqNB3C0s1Bt+K+PbEx2F5F4gQp6hqKkphCY/xF9w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.11.tgz", + "integrity": "sha512-4Ir5FSOKIAMr4r0kExpt1s3bMgzJU3rA45AYOHtQpls0oNeqcYBKrWMlckrYH4KCfGLfkfn1tN1dmZPMVsdXow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.11.tgz", + "integrity": "sha512-/gnRDM+39BROzAN/k1OZjDPnDMcZxB/0EUxKjONO5yVkNEvlsoMDrxGNKgZi/ttFriS2gwlDNzB65pvNbFOXIQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.11.tgz", + "integrity": "sha512-PFaK8HwvAHbaKbBcDNQihjMKYvFnA5hiENx/l5tphTDz1E0WFp32l0A7aq7lyUwGsRw/xSrNIy/gIK4thrSCrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.11.tgz", + "integrity": "sha512-AskzJUIKRLPxkruR1wLKewGbOw+EYfU/9lOrBFj4AFrEA8hPpKFnODWNu2WLaNs0QNkEb9QIJufmVZZIL/bJlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.11.tgz", + "integrity": "sha512-qlUGAheh2yh8afH7QBgx0PrRHN85hKnNd78x8MeMhXivuevgd8vgf6/CstOzmNKY/lLTHvNTrPy98cLnAugzJw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.11.tgz", + "integrity": "sha512-secpEad+0vCbSfn8upFySkDskv+bGPk3THSDS9Y89yc4rb4kzqHp8Dmyd9BkQW4SnhNXBZCl/6CrO//hZahNJQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.11.tgz", + "integrity": "sha512-mOVBT3dPpkWm8XBWPmU4bf+U6dYDLeMo/9ojUmis4N0L5uu10qra5vOyngZ7/PSdoE4G9KvRt4bloRxNjLas7A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.11.tgz", + "integrity": "sha512-Is78i9A8Ui4SqcxUwFJ9uMmjDn58IbVTjFWYdQestFEgeuEmHMLGNriXnVJKkwG2YiZjw8cP0zCTyDMdDGtOOg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.11.tgz", + "integrity": "sha512-dUCXneZ87INUMyQ0D+C0HrEBNUPNXHaPmU5GTjyKTJEiussw9Kaj5Ln8UztPe4epV/ffvgNBEadksdYhmW6xJA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.11.tgz", + "integrity": "sha512-jByxb6qfd+bH1xUd0qnfFnb17i9sWBPY2tOavJ0l3tdr3OTu+Kvtm8cd/JV5nFt657b1VqGltxg9olOEfofXWw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.11", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@tokenizer/inflate": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", + "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "token-types": "^6.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.19.0", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/react": { + "version": "19.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.3.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.3.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "oxc-transform-react": "^0.145.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "oxc-transform-react": { + "optional": true + } + } + }, + "node_modules/bmp-ts": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bmp-ts/-/bmp-ts-1.0.9.tgz", + "integrity": "sha512-cTEHk2jLrPyi+12M3dhpEbnnPOsaZuq7C45ylbbQIiWgDFZq4UVYPEY5mlqjvsj/6gJv9qX5sa+ebDzLXT28Vw==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-bmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/decode-bmp/-/decode-bmp-0.2.1.tgz", + "integrity": "sha512-NiOaGe+GN0KJqi2STf24hfMkFitDUaIoUU3eKvP/wAbLe8o6FuW5n/x7MHPR0HKvBokp6MQY/j7w8lewEeVCIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@canvas/image-data": "^1.0.0", + "to-data-view": "^1.1.0" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/decode-ico": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/decode-ico/-/decode-ico-0.4.1.tgz", + "integrity": "sha512-69NZfbKIzux1vBOd31al3XnMnH+2mqDhEgLdpygErm4d60N+UwA5Sq5WFjmEDQzumgB9fElojGwWG0vybVfFmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@canvas/image-data": "^1.0.0", + "decode-bmp": "^0.2.0", + "to-data-view": "^1.1.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-type": { + "version": "22.1.1", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-22.1.1.tgz", + "integrity": "sha512-sEB0oStmeLGtpmSAD88RDNuLsvhv4iC3u0lE25CUvfCULvj49xoQ3l3K525Vn+ZzsZ6DOLajQCV6RmhwwhqiJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tokenizer/inflate": "^0.4.1", + "strtok3": "^10.3.5", + "token-types": "^6.1.2", + "uint8array-extras": "^1.5.0" + }, + "engines": { + "node": ">=22" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/icojs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/icojs/-/icojs-1.0.1.tgz", + "integrity": "sha512-6WG7MNK0kPsiX1zqilHX3plEVtGKEqojox5Of69YtIZH+0cPns+Cxab2MLrJSJabpfleQrQ9KqWLcs62P1pDfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bmp-ts": "^1.0.9", + "decode-ico": "^0.4.1", + "file-type": "^22.0.2", + "jpeg-js": "^0.4.4", + "pngjs": "^7.0.0" + }, + "engines": { + "node": ">=22.22.2" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "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": "BSD-3-Clause" + }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.19", + "dev": true, + "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/oxlint": { + "version": "1.85.0", + "dev": true, + "license": "MIT", + "bin": { + "oxlint": "bin/oxlint" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/oxc-project" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.85.0", + "@oxlint/binding-android-arm64": "1.85.0", + "@oxlint/binding-darwin-arm64": "1.85.0", + "@oxlint/binding-darwin-x64": "1.85.0", + "@oxlint/binding-freebsd-x64": "1.85.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.85.0", + "@oxlint/binding-linux-arm-musleabihf": "1.85.0", + "@oxlint/binding-linux-arm64-gnu": "1.85.0", + "@oxlint/binding-linux-arm64-musl": "1.85.0", + "@oxlint/binding-linux-ppc64-gnu": "1.85.0", + "@oxlint/binding-linux-riscv64-gnu": "1.85.0", + "@oxlint/binding-linux-riscv64-musl": "1.85.0", + "@oxlint/binding-linux-s390x-gnu": "1.85.0", + "@oxlint/binding-linux-x64-gnu": "1.85.0", + "@oxlint/binding-linux-x64-musl": "1.85.0", + "@oxlint/binding-openharmony-arm64": "1.85.0", + "@oxlint/binding-win32-arm64-msvc": "1.85.0", + "@oxlint/binding-win32-ia32-msvc": "1.85.0", + "@oxlint/binding-win32-x64-msvc": "1.85.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=7.0.2001", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + }, + "node_modules/postcss": { + "version": "8.5.28", + "dev": true, + "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.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "19.3.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.3.0", + "license": "MIT", + "dependencies": { + "scheduler": "^0.28.0" + }, + "peerDependencies": { + "react": "^19.3.0" + } + }, + "node_modules/rolldown": { + "version": "1.2.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.151.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.11", + "@rolldown/binding-android-arm64": "1.2.11", + "@rolldown/binding-darwin-arm64": "1.2.11", + "@rolldown/binding-darwin-x64": "1.2.11", + "@rolldown/binding-freebsd-x64": "1.2.11", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.11", + "@rolldown/binding-linux-arm64-gnu": "1.2.11", + "@rolldown/binding-linux-arm64-musl": "1.2.11", + "@rolldown/binding-linux-ppc64-gnu": "1.2.11", + "@rolldown/binding-linux-s390x-gnu": "1.2.11", + "@rolldown/binding-linux-x64-gnu": "1.2.11", + "@rolldown/binding-linux-x64-musl": "1.2.11", + "@rolldown/binding-openharmony-arm64": "1.2.11", + "@rolldown/binding-win32-arm64-msvc": "1.2.11", + "@rolldown/binding-win32-x64-msvc": "1.2.11" + } + }, + "node_modules/scheduler": { + "version": "0.28.0", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.5.tgz", + "integrity": "sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.1.0", + "detect-libc": "^2.1.2", + "semver": "^7.8.5" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.35.5", + "@img/sharp-darwin-x64": "0.35.5", + "@img/sharp-freebsd-wasm32": "0.35.5", + "@img/sharp-libvips-darwin-arm64": "1.3.4", + "@img/sharp-libvips-darwin-x64": "1.3.4", + "@img/sharp-libvips-linux-arm": "1.3.4", + "@img/sharp-libvips-linux-arm64": "1.3.4", + "@img/sharp-libvips-linux-ppc64": "1.3.4", + "@img/sharp-libvips-linux-riscv64": "1.3.4", + "@img/sharp-libvips-linux-s390x": "1.3.4", + "@img/sharp-libvips-linux-x64": "1.3.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.4", + "@img/sharp-libvips-linuxmusl-x64": "1.3.4", + "@img/sharp-linux-arm": "0.35.5", + "@img/sharp-linux-arm64": "0.35.5", + "@img/sharp-linux-ppc64": "0.35.5", + "@img/sharp-linux-riscv64": "0.35.5", + "@img/sharp-linux-s390x": "0.35.5", + "@img/sharp-linux-x64": "0.35.5", + "@img/sharp-linuxmusl-arm64": "0.35.5", + "@img/sharp-linuxmusl-x64": "0.35.5", + "@img/sharp-webcontainers-wasm32": "0.35.5", + "@img/sharp-win32-arm64": "0.35.5", + "@img/sharp-win32-ia32": "0.35.5", + "@img/sharp-win32-x64": "0.35.5" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strtok3": { + "version": "10.3.5", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.5.tgz", + "integrity": "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-data-view": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz", + "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/token-types": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz", + "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@borewit/text-codec": "^0.2.1", + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/typescript": { + "version": "6.0.3", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uint8array-extras": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.6.0.tgz", + "integrity": "sha512-8iAasVS4wUx0gPLjH8Xtz2PeDzTSiy8QiLGu2DT3X5GU+egFEQhpnbtkehbAwjvDcxIERmCYcysiODFmE3Ud0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "8.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.7", + "postcss": "^8.5.28", + "rolldown": "~1.2.9", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.7.1", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..81b3427 --- /dev/null +++ b/package.json @@ -0,0 +1,32 @@ +{ + "name": "navmini", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "oxlint", + "preview": "vite preview", + "icons": "node scripts/fetch-icons.mjs", + "xhs:assemble": "python xhs/scripts/assemble.py", + "xhs:pack": "python xhs/scripts/pack.py", + "xhs:build": "python xhs/scripts/assemble.py && python xhs/scripts/pack.py", + "weapp:sync": "python weapp/scripts/sync_data.py" + }, + "dependencies": { + "react": "^19.2.8", + "react-dom": "^19.2.8" + }, + "devDependencies": { + "@types/node": "^24.13.3", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.7", + "@vitejs/plugin-react": "^6.1.1", + "icojs": "^1.0.1", + "oxlint": "^1.81.0", + "sharp": "^0.35.5", + "typescript": "~6.0.2", + "vite": "^8.3.0" + } +} diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons.svg b/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/icons/1psim.webp b/public/icons/1psim.webp new file mode 100644 index 0000000000000000000000000000000000000000..a64841a19818f8ead26f500917662e3726997305 GIT binary patch literal 3872 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 literal 0 HcmV?d00001 diff --git a/public/icons/3x-ui.webp b/public/icons/3x-ui.webp new file mode 100644 index 0000000000000000000000000000000000000000..6ef85adf470884040df4309c59712843f96a0977 GIT binary patch literal 1458 zcmV;j1x@-=Nk&Gh1pok7MM6+kP&go-1pokW9{`;JDqsL$06vvKnnJis~G{>u7*{gU;r^dsm2`vKNv=mF)u?6>{G)?$Yi_ND3B zl%x12U|4d088_k1PV<}Q7JgB6N_48woGRBg`|V~K+Ju7wm!juYDVctiEB=`WYvEC2 z+7)>UaXq-#C0PZAqXzQr`Rd-UzD&k#jAGXx3bzspip6Yxt@h;A^vm zxW76{K&VPqC&()85IukoVY?z;o>-TepNof)S&fiM4Cr*b^>3Q=Ye#3B-fhuHmp_Vv z*ttPM|FrR~lhi*dzfBZYY_eGQm;YuS@GE()fW#aorR{~F3OS@Gc|0?e`j-JX$g@8w za*v=6w<8N{p31?~RGF`;0W22rK6GtmStx54R{2*dxY%|HZFuNn+s(0t#1A(se_D1d zLS?&6Pg&^?`NOMZTq7Ltjpxo(CPu(E2vo~LU6oNBLL~?0^>vi0iKvf$mC##q{_iCJ zEkf;6(F80}qDRdP4pBXT@Y;tlv1)8@a;#r z7|bL_gJh{G^!yM!HR85P%ZvAhWxmlsr8F@`Hv1U3j3iu=B8|&9j*cPm6N2s{9qn`; z;Dru>q*K!;evLatMeB%#EZ+jrnRShr^Q*47_{0bq56>*_+DfO&{}P~5X(nq)wQ2zvBbK|11-AVmv6Adopg zGq*OXRPS|nkSF9oBS9)zy#g+T_pjo7O=PEAz93ImPhD0q`S%A={PEXK5k#k$h!9qX zZvm*W*;4!tp`%H98iHSQU_e#z1dn7!P4~=sCTIU!xGVyH{#;l8Axtwo$;DlT6HffE zF+gQW{-Q`K+VGt7^&1u!SQAMW)Od|>ZE0(4XK;@9^{E_4tmtl-+RU>^+MfZnC_1;0 z;4(f%&+0W+cnjsf~OLH@Il+zw^-9Rm@O{{O~5waDcaTS|VtcPPThQd4XUk*yp@$fUthbYVv7 zSz#?$T>Yn|3dJ{!3Be~IqdJqu>fQpfO=H=@X5LcPhd@P=ePP7}6F-WTG5p$lH9uSTVW0K`k0$9ajS zUX~v8nL~%+Rfs*k*!4o3^&$F8`J3#w9v2LI&g(Ec>ZKFfE4?@1n^5mWg!K8-)LnP1 zu57XwU9AbP!CLVWu!P=VNq_uXax=&sIuL+)P)(sF$q5Rai~@d9w<~L!Sn`si8@L=* M+Z}8o9{>OV0OM`LhyVZp literal 0 HcmV?d00001 diff --git a/public/icons/9esim.webp b/public/icons/9esim.webp new file mode 100644 index 0000000000000000000000000000000000000000..e26050680cd9c270da0df759b114fff2c4346c25 GIT binary patch literal 1254 zcmVbQsU*fmd{RetmJgF}GKOtS0hTZ<{WxGAfcuCSzGT$TL zPa3ykLzC#+#Q)mxFS})zc+z`|a!=w*UL6^eC3-shfGf8d5MTgghx{!`J05oew$KK? zT}q82#8!TW{rD_X@{aN+kgMWQUjSk2QeO7QPkW6pB4Q*#bJX{V7tfHH|*;y&1&lj;QDMT}c6bH6hir!A00 zy&>(Ji|w4|ct+jd9ybqPUQ97M#V}UYx^!T+1N0W5S`rn@H8P;xhA&;D7i=L`>|>#e zGgTG&&sK_E1G2+>W+8d{S#?YZEQI1N%>>8yxf8yZZ`sK(k7TQm?O@dyCNkMhYOSbn zC`-XZ?ai=VgJw1i#SL(m>=nkC_B7=2yJn5}qbfIM$>&Zl%Y634=SJ-A|Cbd?T?Ro6 z9(L_};j#a@{=3waH&~8#jfE-j-fI)Fjr#|tr(hSx?nWlVQiRqb zB?Mo;GMTPo`Va~{#+f1W>7d{c`=1sl(+7_i-kmBC4q8Y@22>AfX(+=47Dd@ z?)I?d968;O?%IKoRa!y(91>#UC(l^8$RrZFRc+(|gq+w!|5yBHhQ3}imnR>IE`u!% z88O+vb=!>y@1@Z%nHiPSPzHR!nfxH&#XyyP?ThIRd{b~h?~p{1XJHa}FzSwQA4_nW zTe~J?M&%G;76C7Z2Lwtm1V%v|!&6VoC2tMz#jmGHsITjJXesAz9*V30N5B6;NoXrp z4*7qo7O?Uzmck#RnW5O^5IaRXGT!uE<`@SKD7m=rE$-lnjPeamU}&m@DnHE036FdFCU&{N% zZc4SC9nyRiU-~S?mj-yA-0?I#c!~$M-gSoEWaPIK0*6QX+)SfseJz~FKea$FwIe3g QDJ1~5>W~xY^peOx0K5!mng9R* literal 0 HcmV?d00001 diff --git a/public/icons/_brand.webp b/public/icons/_brand.webp new file mode 100644 index 0000000000000000000000000000000000000000..9cf906b5d2e09b9f2cf2fc37783b7f61fd438c96 GIT binary patch literal 2850 zcmV+-3*GcmNk&E*3jhFDMM6+kP&il$0000G0001A003VA06|PpNI(Pt00E#Z*|urh z>T{0uY}>Z2YuiTYp=#TAL8BB08l5CH29yyUG0W6jp|)eJKdq-#oQ z?xed}O6sI@+T#;80HRbwBIL+>X3}X%%~`X%CZ}`y9fu2|lusg781|u)nw)jCWTd}0 zv_O<{ML`_;72VZYcUO0QJ}^RJi6r8n_voh1Qo5S+jeQZNEJ3jLwacl>6036A)oVdQ zDWag)?=)q})%Z&nNGyS1#Y>IqEWIn!IRdGhVAD6L#!8y<`Sl=mDzN|GOwNjW;?KLH zs7rw!bEvFv;`Ad?)S*$AqEE@xsk6E8$jgJ2Nd^WpCOARP)= z|92WQYW!_IgpLSqrZTI_8zCJKbTRk5xLa39dyx03%&hT)0__SWQkh-lWJntUD}P7J zkMX;e5n2f*(3oN6BnW_j_(`rljtGFD58ZR*#(oeW;z262tb7O&5nIfn=gB#HD@4K3 zRAyRv93?MAnev&BX*n}~_)G4-|Bs$C=RYmEYi!P4)4#dY!Tp1hJMZ}ZTTqz$z6imw51W3R}&GbAun>Ip#;C5=Bl(#|vK^MB` z$el+bqV+q}94TK%006;gT8@lEAguz5&uRHlei#v2K`=T;#=#J@9q0a?giz*%1(QTyQ2+J`zucpw@_| zm~xT$5F%<0SpR!!9+aQ0iBKCNc5SBSK>6=>i0Dkg;qz$KGtS%}g3c|_Yay*_#`)b) zptB3~noF&ga!wBv===hQHZxTzvEd*TsHb4Z@0q+Rp7{0l5Y$(&&J$FthAAIe6M}k6 z2&X0{FP|%yorox?e-s@415L}O#_tY=M3gZIR=;#9P0OUpr5CS;BA}!avG*Ba+P;4iEIdn&QyYnID+36d3 zBhUk++xz|42L`=l_hYbD^S2%Tjrxt>N$4(=-_yU`bQ9-$>Q7*Q=6~Bi>ToT7#v^@Z z(fuP;bTyy-VoZ|o`H>)(vpt`Oo3@fXiBt^R4}097XBP<^ZQ(SjU^2#d($$KA4+ly? zz#EUs3~rH0X{0-o+61#8bFe<%U!KwwZWY4j>FbBXT>BLLLVXX8{Y{Rf?!jZO7e0wD zdvw@+2_0@lR?1erl(-nh)65;8pocNs#0+dM8*k?YgaDWT0RHOdLH*30TI@mZ=v7af zsTQ?d7wtGHDE>?u`VJYNo0f}q)Cc747zt*nw!BwYxU1EF1C;Dfm9D@`=`HT+8U36W z%X2!^zL!A7E515^Nx@`H<&x}mbpnG zMFhZ_r`#MXtkuh@yajB%8ikouP-nHP!;it!?)tu;XPCG8+MhtsF%aaW74vV-@ir>{ zC$Edj4xFVsv6MNUn|z>>x}iqvZT3HTmXy}FZ!eR61F(x0&1R`#9{tQ%Hl zj~}Dh_mo~HvEaw9NxY@fabG)1MHDhCgghg=US;+P+$94A!9)J6h-;|WdwylZ;bx=m zqYLw5EAq0I!^BWm zg--s0C#}7m@1^szCV8)!Vb(aX4EU5}lWvy!nGyV6O_P-eD>*zT3 zs^78a*ebne$MQ@!6_Ykd{G7s``H5cS!l=Cg(Cbd^m(D=$qRUo9BNT*vVmA4+$J+eL zCbPBI&De{Fb~`=vPtq1nn)AX4%rztr(Za4!)-WqV!%tYiWV6nrU5qmnEa$f_Ba)cU zl*Nv?^2sOp7B9MAm?PCOLL-RBdEKLqXQ_}Gtih~Qtn^dULl^;yyAUiU2v-D#CrtTK z)z0*4&ZhAUV4iv92pPc*$rW58xceKE-Lr4{tUce;k1sv?g-?DqBGzZTZYC?rP_X>6 z_BJ%H7H~_{hk-CCVSC90Mf6v{TNyZ~%8*dfjptQ2Q*lWN^TsRF1f`BoDtaW@9|e9c z^piHES&-N-YXGCbx#gGnO3Xx*OfTG#_CGsN_hC;|9y{;ns`wZX3Ef`D3jQkXf&*BpX< z5%9$c-{odVK}f@BN-+UQV3G|4!k_4$UPDe;~~bwbpTB_R)1 zo^bVB0pc$y95d+LIEI1gX;K@}HiWoMn`wPRA1gchL`nJZpHEUdk#~Ims8oeQxYM|v z@@m~U0v#IroA^{9uNiiryDv?V|MltY7cm|O4(QN8i|+iOq?>%c{@#6({X0{B4`9br zc~@Ht_|99gf$&K!Q1XL~PtBF-;th7+yY4zSm~v_y>MkU;vSOy?*r>~$5FISz%L?gASAl10c}=d9tgdZAXn8Acl;E|XJTtmiI4ZN5o1g0Z)Kw0@ z^gQ-HeCraT;}tuRi?fjN{{Tpjk`uA3|M#Tx73myz{_Of^Zii-%@S(L1we}If0EDTC A#Q*>R literal 0 HcmV?d00001 diff --git a/public/icons/aapanel.webp b/public/icons/aapanel.webp new file mode 100644 index 0000000000000000000000000000000000000000..75eabea951d2d14ce0189d66af59eb3398a5db95 GIT binary patch literal 1970 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 YXR4yCLWJh%6GE0ZSITf_fB*mh0BX~9wEzGB literal 0 HcmV?d00001 diff --git a/public/icons/adsense.webp b/public/icons/adsense.webp new file mode 100644 index 0000000000000000000000000000000000000000..d6dcd29840489b7b879e32e0a81c2fb0a7127717 GIT binary patch literal 3068 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 KjXZw{2mk<_59l8N literal 0 HcmV?d00001 diff --git a/public/icons/ai-glasses.webp b/public/icons/ai-glasses.webp new file mode 100644 index 0000000000000000000000000000000000000000..63c57a12c1f41f3072141d81c7c489dc07198694 GIT binary patch literal 682 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 M<1id3000000H_F|5C8xG literal 0 HcmV?d00001 diff --git a/public/icons/chatgpt.webp b/public/icons/chatgpt.webp new file mode 100644 index 0000000000000000000000000000000000000000..4d86031239b0e670f3925eca522858e3297585c1 GIT binary patch literal 1378 zcmV-o1)cg*Nk&Fm1pok7MM6+kP&gn?1pokW833IDDqsL$06vvOnMtLjA|WcatWdBL ziD>{8z#XOkknq>X_qe4Daev2u0REGN{ilD$ep+xgfDfvj?D~gwEv{1_9;<)Qc-i`M z*e~^~txu&YEbNQay|2%vX9R*MZ~SA{t69x2f(c38T{HXcJBmk<6=_-%wgHQ@lIQT# zuT6IN-1KmV1NG0(?h|t+CqOa*uLPr1B~Te~gcL`Q%YL;S4*{;GT(G6i2Hq?UJJc0G zDMXiT!yL1*3Gc`W=m|n6$1*p>Nm)cML;!kY_LTqt{`>X_oOZ?UrtoT7w|d0c2ot;c zd|19hl7}W(9(^V}1p8?Q%Rbk$8bE{GojDIw!w8&|C+M32GQ)=LH@mF~9Jk9^lV zfm(!X)NkzYcdGjLO^Y(n%tQUdT%qOj{C}VidIq1U&+K`O_flzz>$A{J zn!ijec0pHgn|+GQE_F?7qGLWDgarSw zIRmP@Cw205REetpqMqAu^NB1#0BFXgQ_3rob3NX^oIk^VEO;B>8rI5+RidE9Gp$gm zZHr*xU-kIskVlo*ukQuYb(5`KW{d^7lSMPnEkVE&0OC9=EMvx@Id;p;X8oBjiYo%V z3O_xJXTqKo2!B0sKY4d35&Sz%b@<}vZOADR=fipzcH2#&35zTp9#u~OEjxkjx}7## zKzJgA{w>uAC9f*7fMHy&)v|m{EfO0B6>U>Fu_*d+7+;R|@c4N?<{vE24cBVfLfOPh ziKbL&<~y;_Ceze8ZyctT-droiXG|M%2%L7N(2YHnWvL)k>kgdA2ujpY$LcxRi)jjO zQqG&YsAFAMy!d8HmSIno&6Y>ug<_BY(;Y>>^cCG|CQEcM4cpD z?Mok0F^ysn3q^-Zj5_AhSx`EyQ}%-N8`lKLu?@A}el1!>=}vz5laz7+e9HaIl3Amn ztWjdOG)a_`C=OeegUE>U;g0f|q5x)%b}(qC+}~ZfO!$dIJr?ty1aH-*$$XgHwJQVb zWc9okPwD1?w?<8&?bx|VMuII=l8c}gA9MqE7Q|7}iqxdJwL^cx*B1E@QuFb%bz+g6 z?Xnru4lYkAkJx+c6+C;axw6h`u${F^#s=}an42W;PBd#FFzKqVAmUw|_7hHuvN-Gd zzg<3X$zgE*b$&F{rs_|`l*R)Zo4UM=^l$p;=kN*^?8Z%K*EH7UO9No@2bP)C+*f5G kr;u7Z$&}Og6z$nDtALJ*(NSyT>@1gySNl;c`gH&R0Ho%&tpET3 literal 0 HcmV?d00001 diff --git a/public/icons/cloud-phone.webp b/public/icons/cloud-phone.webp new file mode 100644 index 0000000000000000000000000000000000000000..34036ed163710ad5d5ee953993d49de017641883 GIT binary patch literal 724 zcmV;_0xSJeNk&G@0ssJ4MM6+kP&il$0000G0001A003VA06|PpNcjK&00DrSZQHWt ze%|-Pr4eaPa}uoZk3nPs*8zxRm+UUl-Pyulc``Td5itRH?S=9gnZ$rm5-ZO`EORL5v;8cy;LQPh>iitbasUFLJ#k#$0}um zUJ+DV-s3y`P7Xyrm*>63Z%G9QqeX!L z0RH@4GHpQEr7&{bS1{5v1QU0B<84%W9sh^cR}2z+86qgetLLWxBhVt`OaOO)0^@8R z1S@K_`7FpTSf<sO$C2=3X%iKO+8Z)s1{eh9jxw0MYHs& zeLQr^F}5KJfbkF>)Ge&(lGM6JbU@@S1f$*un7!cp*sr&5%OLp34gylMpq#$NP(}h% zKbHsKCUR?odI0@Ye^h)8bZ!UO{o@7B$&rN)+6jJzgg$rcl+GdkthFC5z7dF@LwWSjEs=GyKR3=$q5yrvsoIHO7FOm>i-6!E{<)<}+ppysTLzk$Vn zSLZYkqM)g}Cju<{k2X{zVCelMIg2fbz8)jvoMqHK24eYms)b{Q!H*!uzxoPqp5DEqSANSAQ5TOKMvyM-Ty4&%ekfZzE z$24lLHkMMNYIh5``DUh?l1g_oI1)Okqoc%}C~!3M$LjIp#trY?s-iwNJ)fj<1t2TI z@BjV$(#k&Njq(`GP6rM%Sy>sWiBZ?v9j%3|$u|Lt&Z~2(vm_|I9|wTwj%rF)gvAbF z0f~27$k`y4y=Xw%)lU382$ZG*Wt*PI1K?COaqbHC-FfeqGXay}Nn36T4BC0;KLY>^ zBJiiLAqPRpaUTKUeSWHL=DKIVsSl{lWB!mq7n1R;U zReB;QumkXpoU;;TzdMM*g95~~<1c2P3Xy{MvM~Emgp~OSn13&-t@jVL&xH%LaH96K zfTOt^v&1VlX{`um?#)JGowt1h+FPbIl@Y=him?`n`6M5#09H^qAhZGi01y%YodGIf z0AK(ad)FnW3CVTpe7(*C#CN3!m=CZIdoMxzz#Gb+ zxtJ-vsmPiidAvC?H^|=$aT#PQH0n{NT@1`E&X-K1h=KnI)39QG3tf%H$hp5%lvLDT0!L6z|p4GXTpyX7~X9`<%c43UAaU zPvqrAj--CP{fV})14>j^?@+l6(L(V>eYS;?QkIC@pGrb*65LNIL`Z+XY=k(ljm@h6 zpTNcK-$(mPU|LMm0m*LPfO8TPm?)7|gZ7)XN#EZf3>;QIIQ@b+o_~U8VbJl-H&EUo zF>3txzZ!5g;R`iVIlYbVx5m~NQQ^@u?gr}N^tQG3=OExS#z8My2D$P%;xnl|cTT!= zR1-OOBx44wv{?#}#m+bkm)~p-FsiuEtaKR^Dm(WXiprE=KVKw_9IM>^n&Cc(!+`b6 zRoq|DN>zlQQew!S((FnDAA~5zMJWXP^Id*xVLx(aO73MRI*z(`l>289zScJyVp&hr z!0~R!OGfUierE8>lgGi0@^0lz&VZNxRO*L9ity`tq=l?$<9Uk{#X7e~7$tZx!7ryv zt^Ss7@F-nk+ayGDqlBJ#LgO2=%eOpnAcdW~QIJ{-fhcOv$@Dn|!nf4;~H6rgUFkNMD{wIm;tic`ET)FHTJ#uU6Ad&n|I~u6wNA~q% zC3TFjqfp}?$8%8@Dv*jM@)zqh$wNH+E6!xuaeqB3^}5*Yt5O6Nx6W`$X8-y;mcXCb M6S3Qv5C8xG0INuR_5c6? literal 0 HcmV?d00001 diff --git a/public/icons/colocrossing.webp b/public/icons/colocrossing.webp new file mode 100644 index 0000000000000000000000000000000000000000..06dd41c529e2c28287e90ff546844db4b9b30ca0 GIT binary patch literal 2270 zcmV<42qE`UNk&H22mk1QPgpbfZ)?u1&%UWrouwAud*!U&JhCjyQdk|2u-?p5mStIT zt7XPH!zx;;F7rZ9FNZ-ySVcJ9!@Bh~jII{e%~uQ1VJ+(Ca{gbxa=)mh9Qd`YE@s7JSSj(C8kXm}}3rB6S+2NmhK`p&72Z!LR zYU=YOqiz@-ujw|N4`_jYHWdSi;|EI(u8H?%qyaUHkF0=!vD9^~mL6Chb0)kly)h1> zezyT{S=Pz&`5g5E0{&X1*km<5%V zv5yMvMD$`T^P==oGN;lqu94mvOX5RnYw!LIFlAKQhM;@!2kG;8FTo+w8)I?0I?FvR zox-C0Od6h!_v>a3k?vjut97XKXd-$@d_npeiJFOzOWz>lR%vh|)~^9>l)gw%(^);& z;7Yw1{82iAs1qD24VcrA1}F9F4ZXn!rR&J*O&`?!RY|=pa+h>SJ!k8x@2ki+!Ta;3 z3O+1-lBhRhSR<2(UTi=*tX{B-)Nto~E!3H$e&t*y{oSY=Y%aaLXfFiclWri@Nn9rV zio_<$b%$AhUe_~hBh8JA5$@U2nJv*_Y*aB zJVD3csyNlohVx53uqp;%tp1RS_9i$uQ(jh6qnE9M(HX0M=uPe1#e%KptKI(bR?8cU zOg-y4E!0%wBVk9HX4n_z^%WVfCXolDz)&DM&r?@O68{zR0gZw zt+H9DYr8G&Kw_0w^)L|3{7tFqQZF8X8y)v3S7oW8xj4agkE&E3?FyF2f??{AYZ2o^u^JI@Y}jt)KX zt-Ujxn(nM{>~|g?S+HQi=!?I-YI6sS75@CxPdji2UwQWINf{7ywc1p=fsdavXPkjK zwJiW&dG^dXV*?-zz|1NjoJvc^zc!po4|=xbR9g!AY36RmzoEIi8~rtNcjy0%1y)cv zAOHja0I(APodGIf0AK(iQbi{3jveY5}o{`_3f0DJC+@zjC7GV&kieh^p7`ah`Le4z9&HpU=CHvFIG zA$AAjMGHfe;R7{qlp7Sn4YPLshsk2`D28=+M9e37F^-!vtsN0ODt=hrh;BCq^Y!C6 zXPW;)Zk?`taMB}ugG&|aaftA*VRjLl#`n)L7zWlG%zl&RSr3M1X5qB+}oZms_ z(g9!yMzh3OKY0qO%*|)6#`4!9SP+&@-;nrw<75S(d)Ma&6$>Cb4py*B zjp;dBH+1@auu?ztZoMFcr0ubb2UXH3 zoRT7C)`9qJ+wXiP^Obq`$irYk*J+RJ8$$!2FQbo*Ivf~V4<|o8CBG>|nf-+*U_1-k zpXHp%y~0ydw~XGdAud>dkk$v{-VV1QeBZ}oL4LV;ldGavIQ$8^vlTKQldu4~U?BOv z`M$zXvrPV#csh!4@%Nb&eU@0g%k&NZFKL%M|iEV%@UQ&Dr(I8hQfTGKRp7*#Cd|KJP-?FCSX}gD& zRG|%VG!JG6$^l3PDy0|fEG4ot{P^$H5ORa!xG%C**^uzjxf9_`G=|NEN`k^VV7_3s z@~DW7)HcH?KM)IVEG{=KH?ooqUu$zq5Bp^`t>JjmBn`RQsy=YCH4Ez6PC}$4|M6=L z4g%|(RJJDvJJ=|0=eZqBLD1K{C-oO+?qE7BK<}!NtWSwlam1r0gi5W(KRBn8A<_qD zHGKoHF$raj8gs?v%S^ulXm1UV$5|CP7BNnYC?D&d4Br0J09gOMjXqf?d^ipEW_vrg zV_rjs7;Sjm6Vtq*P!{=g=`>F@l_Dy{cU6Qzg+&tLFL#q!{gJHXd;awI#nOR~y0G(89v sF*D;-M}>)6naJ7(;f!)CkEtQYa>xEgNhzsG;svFGS{1_swMYN}0Q^O4vH$=8 literal 0 HcmV?d00001 diff --git a/public/icons/creem.webp b/public/icons/creem.webp new file mode 100644 index 0000000000000000000000000000000000000000..f8b751ecf8a21e654e78c5726542bad5b55c169c GIT binary patch literal 1242 zcmV<01SR`YNk&G}1ONb6MM6+kP&il$0000G0001A003VA06|PpNZbPe00E#xYkQ$V z`YP47?e4K{8#~*!ZQJ&&?3tx)+h*ISAQmbA?1Vl-a>NX%{oZ94~7rUVR z0WD4Hg(>T91jkcqcOz|O;T?c6vEw2AZe$+}bzfz}4K~lyV_J$j%_6?UW zsSxcueC-%uR4=bUCZy6a|1v|hvweMKGI5o5?r6>9!qjC0$7SerIB0jqf6GL-g6Kmm z;bvcqr~PJV(p*?p?~CzJv>94;iAR7Pw)LK-E_4W%02%OiA1Y$sua7{3#cNb}?MPHv z+Kd6QR?vVyLJbakHBr(g;0(>;4HEpwC8&b!^B(?*zX+S79a@jp7)H+k2aoKe=8+lN zIKvl*&w5fJz!k8;L;GWJ^Uz9qL?0Fh)@BpOm}wDQ>|>RMU~PWYU1S_x=*pnXm_3P1 z^LTDRrOiWXuascy)ClhMG5&wBvhGnJUlu{NmXGsLWuZu(9>J5%R?vW-6}(S4q@+az z?o`s@u@VRBtWKtZ+MV>PB)FfAB9adY%PrLKrKbBaW=jtP!TxNn*oT%r)=&5ijtGp<+-A{vu)y#!))4&RPw2Hp_wV;aPG#*037U~%S zR5R^!*tgbPD_fDPQ7MeMycqi*I7tsw$y-EW%w?8mfVEe7xdK!rF7vvdW?be8&V+p&( z-ejefI1J2;`J0lVc6LMCy)x~eC)e=yc8b)m5BYmLMbr6Iw)}th1ubRk1XfTuAkY8+ z0I&)GodGIf0AK(2HM&+YudO~?|#iMn|1(n$5=qamugVip+vanz;`qhn%@7>{52HGntJHWdC!=CVEUUDz$Tu|wcng5WVs=a{7MI%7tiMKQE*$u@!clP~>0sH6| zyng}&VBskRJ-bDZ6I>yAwOSE<6IyoEaV|;avtE{urQc>c`qSx%h52INyfdJGTYgC6AdpAAYJlsg#`-l&*aR6Yp(<}BHb;Ok z-7ouO1#RNNQTwn&cQ-q!3cjFZlwp*lg04lySiMvNiKfCUY=gaK8DPhT$>2374On8K z$fIYS_E{|T^^YPGV8a?(TEV^eI#Hadj@h$qlI-`kz|3-w#~A8MGVi=KEJ6fvNkuto zPj7T6h1TDC6eJQhA9;p)$z}Qs$18TJ`;Qb6PUeYteBZGHbZ`LUi9xP2Io^J%IW&KJ zXA{tjW0b1}*mdM7v%Tm3U;$7m&$7{c2Dha<)(k0J`m@P=imwzXV^@jw?LvC5Ksi{~ z>#mzt0$Z(8^{@fiwjx!mhP*DbPAboWXjyj0z9fLA3O!FwYi-yp?_FY*8NaYdZ7rlr zq2tHIYFu7vi^dNbpO$I=sObDfo0JS!RM!jP`9Me8&j>>bCRt1VS6ZmDGXMYp0002y CN_EWu literal 0 HcmV?d00001 diff --git a/public/icons/dsx.webp b/public/icons/dsx.webp new file mode 100644 index 0000000000000000000000000000000000000000..de1e117cabcf7c8c50034c8eeeb6a7470bdd5f73 GIT binary patch literal 2212 zcmV;V2wV43Nk>2mk-_I zzu>KJNdxq3(AU;}!T+!waoZFnv6#E?@v$26EsUK8?uo7s#&Fu7TZ7@5MZV&I^v&u; zKH$#32_KRR1xP&$DQXPc1$`BJ%tS6;UHnC;o|4>7R~9fqK5hK(p&8b-1|BDH?@3>V z)^_8kvdijg5IN{Q9O9c$iUV`RcepQEgRKcjByukh+}hFt%fVvW6i!8`UvD1#Y}vQO z_mZahy{vgBKvtKe`I9pJu)erg-M>pTt6?j#q z&0;!;JH)U6{_k$)?!f=WKfi9L@S(u8$R$6Rr0Abqd;=w_0PL{IHT><&;@P2AvLBRB*xfp`puWDb~G*P%?uHcPrZ-I~G?6u(?36w&%B+Y$g z%Y$X%pW}) z8K7kc&5z%))>oLNd>=|KopWxj_*l>vxu?%2bEsO>s@*_yEy36sVI)uO`t|j->mBq? z#j&t4*C;_n(PI9c4>g?#321hwH25@V&iA^!OWMG3j{y!3)jxMQnfUQ-(IFA#?t#-u zZhE5!iJ|D%y!GI$&(HzErZ|)MZa9Yd@5ziUZ0$m%*0fpk9;_gC#IP>Os|O%D&PVou&WEQlFljisXs!t^>bqU&7j|Q14LcuNuE#KNc{gBf9gb zw$MrOb+4-8`$Io@4SmsLa06B-vIkY7q{#A0u&^D_efY_$>G{Z)UoFT;u4+W>n?0Vo zT@B9%qWI%^?{hJVY{T8>A5q5j1*yngp7VBYj$?2qu@OAF7(r{C6hbtec|ZHtRE)TO zMJXnmw<&Y=SsK+J|9so8`;>_CNckAn%4dq?4mZ2d7X0GdF3N3oT_{%*7zlTA%j+|C z0TmemV`Ow5*;R-gOFoSVl)92zc!Y-zaj7vnP58~W%=wCE6!uBpDsPX$>spYp9)N

1fWNt+unp2;7E{CG3Tu68ZTpgjQ4)&1rIj zU$=tHz0#C3PjUNRRCFd%L(o*uZs170n%eJdz4SwlzW$O>E0VoWHH^I}>zTHV^>l}^ zk@l-u6C-Q-(@zu-=Jg)pRPsxlrdy}b!O;2Ejtx0)(cQRXjsPoZ2m3?0NNm8al5>Zn>P|A~8 zwe&s;T4fUP2ypzYI*zN>3EFA*FA>k9KRR^}Go?@`v;3q4rwL0MW9pP>Mmu z&4=9o1GJ|n3}OHJ+j0gd5WegKBrcLL^Kzeg)bwHk1evuwBERcff1gnO;}nLS2h?Lj zvL{6`9ji`rY@CNbs>G@98ScAc>*%(VInfMR%M;IM6EJ?3nd*i91%=>AArJj@f%Bv*gzWA&hHg{|G?h-b^^mk-w3qx_!f91{#uf62NCU%`Q zT1R2Gay#m5847K+DWuuU0RIyw`>2hzxUGHBDaw+KrbRH z8LM!3U6c8c3$Q;XmU4-Dnp6tpt(!q5JPv_gKB~#JwF&D{qpH=EQd!Z(b;!^cZw8EQ zrz2tu{3gz8gbdh%paLY|L?5Dx8B}cGWNJ3X#a%nhaUY@F4xj&E(KQahDzou?=V36U zeH)No|+gF3a6 zL2j>1e}LMr)u2GlSY#pcrZucji_s)aeXfE%FE93GUy+HC>z&uOpli@pwT?=&*uXs4 zLE68zalj|T+NLX47Dy4qguSn}7tKlFz{Mq%m3@SA_nYy8ufG!!Nz->Lwh*nZ%;gGr zd;mb|@=^L+h8B8Dsxb#Xt+8D1(ui(aaY%R==e84DaolW}V#C$X^!EG^iT=7B zhEUMKaH;lolfCDW9l)@(3^a2}@@@*tQTkh7RDbBBuyGr3hrO{wdXKAt7k- zHu~uUDlL_@1cUBGWg!<37AGW2}Z@RQ0gqys!Y mfcqLK9_w}p%-+o~|K=>o&@MuBZ1nPkt{05?z)#l3xBvho-ewE{ literal 0 HcmV?d00001 diff --git a/public/icons/ffmpeg.webp b/public/icons/ffmpeg.webp new file mode 100644 index 0000000000000000000000000000000000000000..8599db3886c7290bcf2adab963ac170ff6142745 GIT binary patch literal 1200 zcmV;h1W)@?Nk&Gf1ONb6MM6+kP&go*1ONcA766?ADqsL$06vvMnMkFiA|WcdT==jO ziDm%M5V=xPS>T@mUAlf_KVUs?wB$FX@DwyNWiL4nCS~}+Eh)1)@&TwXNyKTXh+6*e zu4y&%5V5e992$cYN_ZP9=JK}**yC{vGRA4N@aRFksn&hVoDMVTZ(}oi)PUJwR2#!y z#x3-X7z6gbND`|x04Ve%Jq_5hT*}`8H>aW45CHMr5`zTTIJ8Eg^vluO$(h_=y>h+$Z`sp;t{V8jJYsB4n)^2WzwuFT`(;K7!h%6BA7g9fQ@<(cM!Gl5Rv! zkcLN1DO+-V`8-e4MOw5hEhjHOe;7jsW{ah(DZexvpIgL;sLbHB zI!xeSys>vUK32p)#Rn$m)W9oUsMnr|eFc{kCIo7=_ADyMWh#3xxx8s+IVT&TDtIjw zRvOYA>P%MZ>4ZIZW+9q$+8HFa2dHabM`l?`JK;tahqhU}m%?A3-Epw(1Cj*{HfSTp z(dbK&ewB<2*+}22Gu=SPfTJS+Zga%YP4%;;A#*44zgcBhML%6fgCT2$k%0 zNObx}65-TBxQ{n(N&=%vpqy%yg6F+8y+7KbhmQ+J;qhzx18DG*N|4zlio zkr}k8hGQpbGIu?6PBC5c-N2m#5_mV-sXJ-6jl_7&US&4OKr1QzIVZ?L%&T@(fSy?$ zG{Es58a8ocR2Gz63yk)nHzxku7y+&&MagmMrt@=u!(7ZRg1N=x<(tC{xKf;cIRpNXkI$2ed@#6_w?ceP@0Y>;G44DY{87f9T8RZadTNen%X}_KURH zpWmY)Sn49lL4RBd`xwy9zCr{SXyl>&!_;25?ADaO8(;iYcC7VCFv#Sb&zz(Ykq28Y OAcGwATbrN-{r~_#B1|&? literal 0 HcmV?d00001 diff --git a/public/icons/frp.webp b/public/icons/frp.webp new file mode 100644 index 0000000000000000000000000000000000000000..c6547fe433248c3b777a6a63b6b6185229559da7 GIT binary patch literal 910 zcmV;919ALPNk&G70{{S5MM6+kP&il$0000G0001A003VA06|PpNZ$Ye00DqwZF^$n zO9pp$uiR}5v{X*V9$13bv@C#{EwBPQI(LV$do%g^KdI1&m;iiBSF&Bukgeq@RCNk& zE`gS&vHlQ+k=VDh4Fs|j>K|z-dL0F#G97EW){rK1(=h210F5nLx@oxw1(6dgOHMAXOhKrE zyGjTGckvw^09H^qAbVn?METO<1*$0xVn4zLWJ%?Dm!{T+abGjZ8+Vcw;Xbh(iPLOj7W(g0 z#b0~t6nW16UtA+A{&VX^m3wt$^&-CVjL2|MA2r1&s&7bD^)DhK$JA4KwsNZ^E&j z($tKYSLFJT%+C%jw|Ay(k>8w;BB7hhx_^kPFoOp~zQ!B3GPa!Qu--nfsk8+7W*Qr2 z#Fu+aw>4Iom(3C$=jLJoE4qf~4G{q~Eq2IIYIknwwG(=X&n=(*>%aQL0w7=W=-XH(~0Du^{!vFvP literal 0 HcmV?d00001 diff --git a/public/icons/ga.webp b/public/icons/ga.webp new file mode 100644 index 0000000000000000000000000000000000000000..4bc3288e8dc2efa051798c5b31644878c00517b5 GIT binary patch literal 1876 zcmV-a2dnr}Nk&FY2LJ$9MM6+kP&il$0000G0001A003VA06|PpNQMLe01fbMZQI+n z*|r_$Re%eHRW)_}*Gs*#fdH;{PLKlN_)6|N5fKxBe;*PFB4!ThA@B(+t%-wk>G`(Q zS`mBSb;)6nHq}B)FhC(5cCC%+ATWUIn{|~--?Nl}-#$FrbT9yztDAYL$yydt2;M(G zZPRfoZ%U&g00mH0NkqHd+L#PIyD)Gq<6FI`S2OqYXp@m$uC+Zf2Ih;K3;+DkrenR7 zt;OKQqN4qFmyXpETa3&XlKr7eg$l=>y>D>-<`dzwQmmxFa*FqU3Rs?W;22=3k18h%mPe5 zovv%qv?GAE5}`drCeY6(iky2pN|gp(B`OnBp%^N+9@A zq%}F`ohPNl1Ww2knuY)#LjsXUK?pEAXG!NYK_?XeA~A&kftd#(GKgqYWC-HcA~RxK z@0G?W(*yvRFg$t>tudBuk32)uAur^Z7>>wt0MYt-0_THJYFOwyGQ}vdJH*<+ZctQW z47#543_v(`W;V{YJqsGqv?xk7fC+%#9Z@TwIcB*T6OJvJ5`a52T+h@9-dT^ae%HjJ zE(Z_*eqrcL0N5Vwd?AK4yN2e=ldlctOEbtH-(yjYvYSn;7qbBXj*m94Gn{tMZ{pWq zhHc+B;<5nHzkJ4v>tfj5Bj47e{MRmIML8S7PoJS);H-Um#?|lHkbSdlloluNAF*Dq zXvp^QUEF4)A|Lk0p3Axrd?Nj8@Abl*^PgWG)Nh#wF(|f&BXohYq1ksfh-H=$101N? zMHnSU0odL>ba`E9DFxf+7jyI##gyG2Vi&q(B`vD0toid<-e8y zPZ50k;v(ZLLm3QYgyUv!A#j!ihTCR)h+rlFU@`(f@N?I>z>$E-*-%ToV6?;6h}^)WNyP zn3$apj7b4jP&go<0ssKe5dfV5DqsL$06vvKnn|UmqMy<%+W;@t#`M$W< zsjixA2DG2o7r!l#Q2BGdBZ6W-YZ}n-r|s(ODD%VD>lOV z^}W!(cs*Qp;IW^=s+Wl^Z>5QTMU;jYX-&x;@OptHb2vnO9U@6-6}?Wx=A-jSKIe$6 z>tea&uN^#52zdT?I1`fmec9G?D6m$WzZ?L60$>4?zM8OC>`fY=yYJE8#JwU5|KNWQ zfnZG%FXR42kRu#1N3ymj_{_dw!$c8Bck>HwR!);_LKM_aIeFy!s1BjJs2?>$hsM7D zZ~x;)$Xn0M@00$vl?~xj_=V0b+dv+-%T=XSq`u2v7NWq|L%}-^Q<)fu`Nc0N+J$APR>^t860a0!=C zO@OH?kLK4~686>1U6VeXgME4oSMs)PO9~F{_w#7LFr40Ovx{&=jUa9LA^M(UCb0Jn zibLg*jUz!n1%Qj#^F#>zaKAct3B+DxCak;pDBFbg%6ZD==WZeN_COppM;WyO-Ru@n OZUU?^H(q~_7ytk}D|~za literal 0 HcmV?d00001 diff --git a/public/icons/gpu.webp b/public/icons/gpu.webp new file mode 100644 index 0000000000000000000000000000000000000000..4e0757ecc0a6bef81cc13fa6c543a78508b1833d GIT binary patch literal 1070 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 a+K~jR{83*OOn>;O^U@*omA!mQ00012a%fHf literal 0 HcmV?d00001 diff --git a/public/icons/iproyal.webp b/public/icons/iproyal.webp new file mode 100644 index 0000000000000000000000000000000000000000..22747a153904c606cf0c86befc43e56be5e841e8 GIT binary patch literal 522 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 c2@^y3P`XL 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�a2ygwD57TVc3&Rsy6M z?XA0&9&w=XEU3M zT-=_ctI#;tM5f1H=PvDL0)pbQN|wIcR7;2_&X{oBptt$yW?iM9~2 zC#FDk*^AS{DUDQo=q)=R@<}W#HXUUUGzF1;fkb%{N@X?6LLXF2 zarIP0V<}X61-{OXs4Ypw3*RbD=LO3h#&}kyaf}0a_DFoG@js%-YA($|wcJh7Gg1{V zH7S62Q#3QtGf8Xhjx)6L5dpI)2MUJPX%u#;G5A{CskUa#)`jrp_r%p`@94g7-CwU~&yQ?S&Y6z`f2Ph`G38GF^cd<+i$@CQJ-oOt48lUt5Jo+S%( z2F;*CGKa!_kWBE)U5k^3>S;!OOFY>X@|PjN!S}$Q3r0^H4Xn9}Wa~b6yMlmN2ls1y zEEC~-WK*_J`$K25z?vocYqhQ(|L~OvW0y3-M`NI7wjXEw$eLeXjoiiozp|^k;h&Q9 z-$3hsJ`}OYzu9@M(d>(;54u`TnOm-D+OdrI%NxFXve9ep!@e3O0jEb@A;l@?I=!LV z?>#gFI%KThZ}*S=0rJ6*l{LDg7q!)EyJ;SY$K3$|gEyCIK`>z*QsD+M+W(xp`tcJU(bQAevV&|a?;Xxmvz$j# zLQbgzus*AWFI00^e21#ixeIErH6%gzk|Rw<*(Y%7s^8oR$)D$M|>B8V;#E+d=}ynGttcxI0B3@ zev~zM)egV911vziEh!12Dq$X#0E33)#q zgYOfFUmWdmFxy)zwGcB62C9>yrrI@isNq+9b!rRYKC}4FioZYa9=mZyjphQpAkKK> ze6*1Byl3)IK2)RF|1WWFt#saJ9U2hqI-3gI}G_qFXZ(4>4JKqpmiQOUv3bM~LDS zGC23A2AVvCdiPLLcCJtJcO7Sh$*&0qj+Ii7SVN4qp_uuf?8-i~naQKSM_&L7zw%{0 zZ*J6YHuctGnLvR%8jT?Cy&aS4O{~~0SAF%n4ooCbC zHRy=FZu+VBGNRr4I_3+j{Yr)u58f?yHCU3xbUfHVXi;3iT5<(QgR2ia435YgB|L{h zGQ4MVcw`-jg~kWsO>4M|RYlESD|G}6FrOH70ciuIla7}QjIo~T%x?9c=v+de<~Um0 Ih*8J@04)Qmq5uE@ literal 0 HcmV?d00001 diff --git a/public/icons/mini-pc.webp b/public/icons/mini-pc.webp new file mode 100644 index 0000000000000000000000000000000000000000..f3038b050768bff58bc2d05f1bb55a5d3370f435 GIT binary patch literal 370 zcmV-&0ge7rNk&F$0RRA3MM6+kP&go70RRB-3jmz~DqsL$06vvMnn`>=OHdK+C*quP35ilS?Fxj0hk~n(Hkwo#?_<}yGDZOB!KChTVTTvQ5o z_Bh~?oaCdUvqgQQ!xB1F0BPHpf)H+xQV*a2{`R+7%T72`IHYJ*zL$aLPo)ciBYOfv z&g}RM3Hg%YiS}by##bS@R8{$dty!lWEh8H|xr9HbeO`kch*z7I=&xA&eD5bs8384m z@7t?bCH8lR!A^BJNV}gZDAQQMYKi9uY6O7L#6r4Z&u*hQVtY<{^bH*+PmQdOA#Ycl z_HZ^bvZORp4E0jr(QpNVK6!s)j!YxZT*ZO$mw}wil#BZ)<+iq1u8V{}lgEGLsMr4P zcJ=dnl9n$1q$$5=9i!QO3X=Pg1 QCv%^2rIa7X7a#xt0Qp9#`Tzg` literal 0 HcmV?d00001 diff --git a/public/icons/namesilo.webp b/public/icons/namesilo.webp new file mode 100644 index 0000000000000000000000000000000000000000..f29a994e2fa0f5601d58f4bc28a83c5f8ef812c1 GIT binary patch literal 942 zcmV;f15x}^Nk&Gd0{{S5MM6+kP&go(0{{RJ6abw8DqsL$06vvImq;a}q9HK#?69yB ziDLlG^s~Q2@Onhsqt6`rPwCI-2XEizItRQ0fSf?Pr^w#%S0Vn7#D0>=lKCO}JN4ux zv%j8ko930nusbB}c5N>u%FYrmq;Kb4UXY-A#3Tk+pq-GZ`b|3PgEm3vtH`a*@3t(w0p~4~zvFHAyN5w@pBXj41p-|)~Io7D7>6`5@k}WHzZlMoA^-)H> z`L5@@-4$w-10P=_PgO<+x>xUzT@H&KjVMFwk1aXhLxGZz6!Ww^ku=1)GvxzG0Y*TX zl6FL0P5fPh4ZR{@J-y|#j-I`e+{Bg;bgNsw*uV{Vho7oG#p`Yb_a&gc3+vAzno>9V zf@sSN$<%jl9IYVIR*lE*PCKa8tl%knuqS1_dwC#^p@dSgtg`aBvHMyLHCfTG)7Cv{ zZ)DC9w+S}H#~FDt{cUIXB%4L6>MH-F`W{Ey+A5TUzyjm1;tM@ZLl=p~T+$$;Vm}W~ zyuby2@Ejlh{z1fD0u0r}57q$VfnQ-}mbAr3TO^!Zox89(>17N#zpAk&l`U9e|=d z`YvEo_NU2U>Oau$>iJyT=`YpsgmgoDHhJ(r|I7UpexSX>6Wy4$G?T@mL2>KhvU+b_ z+O3GZffr1@oQS{p6vq~S0-rPt=xB?i`_khH^QgEH!7}*S7;Xm_T0%c;Z)@1VqflO~48gF(eR^ljAC3z>uD QH4-ire}1@3t6%^C08Yo+;Q#;t literal 0 HcmV?d00001 diff --git a/public/icons/nomad-book.webp b/public/icons/nomad-book.webp new file mode 100644 index 0000000000000000000000000000000000000000..b4959884d8bbcdfc81e67f56837e220120927032 GIT binary patch literal 832 zcmV-G1Hb%INk&FE0{{S5MM6+kP&il$0000G0001A003VA06|PpNE!hE00DqpZQC*D z`L=^1SW0ZGkZi{@1q2<~W(#&|7~A=RpXYyeQAA7t^g6oZ`!DIbv}8T~ycg?oz)aD# zR+W~otab{+#_lA^n_**o7n10i*MO0%q?(`BBm9zXTxb%DlJJ7i5|fle8YU#^85LiF zRnDVyA!(l}j7s7|0K^@$8v%4l>K(v3w`Dl1+{(6YNxnVKF1pWd=at=aid~|{t}6fi z|NXbdu9{+(cwzUn&u%BiF4D!W%~9c2vSF3m641%59T1nyt_6T$X8rhj#OoA_-aM^(;;J7;i;m^8^~y`_0%qFU zqdQNjnl);vr=3Wf4SE4qP&gp?0RRB74gj42DqsL$06uLplSU*XA)zoB2mpW$i9i}v zKqw{lXUZCLwgi0DdH{LgbSM9g>m~F6^1${k{l@){_JC-Cq`jH)o9G(eK^*^6PTdH($_~v}5$1b!wS;1x7Kd z;j9JNU=!tZ<`KGleaD6S2hW9`80YQTKEFnrA`DO_$_>Vt@iYI5zsdpsS7r`ADIFXL z?39mk*PiAWPd4pz*>?7_FM-($TM%h%Wf10#39`60ZjJP4dCZ#qmoeVn96X&~u^Xnb zllK^B5_%g-B`l*pD)dK#L5jmW z^mgI`7fz?|gCSQ-$a`dd2xgJ)01s58N{*3pyK?xDuP>w*F;{Pqj(lf*nXp~mxo@ZO zU%7HmI*|qR9N+V)m~Y25=THk0Mexa@w=chrif!@iazB{s!>leY49pg_X|!&V9iW*# z{0vtP&T3!yFZCdKvh;-K=JHnwil82;>O8IuX2-8hFG4HuD^SDMkExWlZ%%yid2sll K0uccvfB*pWEs^H{ literal 0 HcmV?d00001 diff --git a/public/icons/nomadcna.webp b/public/icons/nomadcna.webp new file mode 100644 index 0000000000000000000000000000000000000000..285782ef69e2785798fd6a1451fe5b79d20fe2dd GIT binary patch literal 1520 zcmV{8;2*#{K>s=6UxXhodv~Bu&-d5)CEjnr%|O2t{zd)+^80`&0DeFHAO1gp4y8Tm z^1b5*@y}on%D?n|mVcf7n)93VPq07pFYBFby&HdMPv7WNYitxpPcc^L29F~5@m1TC zb7J(#yE%^M^|jxK8=wto#@z^&N{xt z8|40}U2OT841t1>pmhegvU$f>`8qd)Rjy1dH&@!P}QSP{XW&G-R(po!of zj485?ZN`u z|Ch)`tV7rzAE%a@pXZ9FPto( zftD)n6|?qx_6Rq-J`?03W#NKg1s_d!#9iYy@mwvTz*GEOcwq%7QF^8 z&D9vP{J?2T)S653j3cywbuQ(7N<>cQTQUVa@MM;p|5uAmv^*#+*c^(qedRVAkU;&u z8mMxSM~ImkV@JMK%prdU`G_i7f*Z52#S=V9c|{Vx8h=lxuWOLGh1)*t^!h%tHLDrpq9oR#(bf2O;*FaJsZHWB7qdj8jB-Y$zGIo1FPz*BP zBjq|`F7bNL{54NcWBX0@21KpS^~MkNZ8*Iz2q=7#Yule!0lX;k7?OP_7W{G zkMh&0{xITzMwT85n0<=7b+C+DT7%1n7f3W4Su0_aRiJ!{gSnOwRryG=aR6(*18vcs zuI9$&5dKnDSy!1qpQ&*WiefD@b#xt#B_f2fI$;JI9X5YEp?uUkBRFB7tx$gn2XHbW WudTveFTLOb4oAD@gA&+a0002rPx3hc literal 0 HcmV?d00001 diff --git a/public/icons/nomadlist.webp b/public/icons/nomadlist.webp new file mode 100644 index 0000000000000000000000000000000000000000..640d92f459940397df3274c2214d9b922e56cbc4 GIT binary patch literal 600 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 m_hUjTs@xfQAa6rd8}!e`(dY%x}`%) zn;OM`1L!+c4V;;JoI=83iJDyYScU#gR@=?uV5jf+)QRIo5|=?;+zX2K8>k@bQVFo3 z>B**;ItR~C61(*Dn{oru$2ljg1#zGW$Ahc}!dMm>AFX^U|2n?JZjpo7gldrXkh7iC z0092`=UXmPX|}s4J*>p_XtU^-529ZerO_zIoSJfM2#frDl=<6+h~HW#N6E(8=Hbxy z54|8t5Cx!AKF15VC^MJvmJb;y7BY3aXzKt2p52frGhYQC{CILOfwV zcSD?UobY8Um8>6dTm;lXhkIy?Q1F5|<)bKVsFmf>Iy+@f>nOoQJHt_MvVY#tcPBkp4v6I(*V6Hz#-s zFLH6h0W*9Hu7O)_$n?WzNM0-bvCP7N-GO zyRQA7(=_=g#oN5TNBmUCXER!Q%xOX5>Nv%pr2)L$i=lV=Jr{H)rf@zrR%yL6FbUdH zokaqB(~(VBqVC&I>0A!3OI*cww&{*7?Q%4mL%}sPH#f z?=xS=@tQ4MVdo8MK4a7KJM@|>*{b()2kyOjM*n(f_9n8@&6dbK>BriW8v_zHxtis4R-<wXRSnX%zx0^?a}Q zuXc0ePwk6*djEMr|Ef+4IgwpeX+|sYJs2qAWImlv`R()y^|x2sKzy0r?;z8PsWX~4 z7(t&0eL%Hm>0sf6!!jSL+3%*cLuQIVNdQEW0C||yZv>_Cb|5pRM0G~H_@$}iKlLZj zz>328``kFu-cF#2&m!<^?o=yp$$4ZdwBb2|H}wa<{S@fW4@({Y)8zDYLt>#^4L#r4 zM{hMTKqwK=R0kx;3=%?)L9J{ZPBEK1QGDI(gg9@?7a|SpNEq3KG0M|Q)YT6ul8M8! zD=<2!sVz?rPR_aA( z1~03~lI0~AWp|3f;3mZR?Pq_FLJTh(`CmlUXAO+@F{Xkim%Rs#WnhT9u%NJZshp{- af+Zu15`FqpjZ~c3Z9U*PW7H6_0000l=2Ef% literal 0 HcmV?d00001 diff --git a/public/icons/okx.webp b/public/icons/okx.webp new file mode 100644 index 0000000000000000000000000000000000000000..85aa2e3d0cb8bcd3d344248c06534fe7694b1b8e GIT binary patch literal 926 zcmV;P17ZA9Nk&GN0{{S5MM6+kP&gop0{{S!7yz9CDqsL$06vvQno6akq9La$NU#!# zX#f_={$KwA+n@Gd$lDjc&;C>Btp5wW$%}u!ajDxG_5sjY7v6iHKY9=Pi`XyuKlQKo z{Qg7Shs+h_7r$6M)D2$s;ti)z3ssT*`+UcA89vWBmy^b=p zwu-4nLgq8`?IGp>{`upAncYtsX>ihQIAHycOd~^l&|lz@Y;w_=g(@(dg*I8^Z*gDZ zsMZ-g<|1?GCB%gO;dd*pxaz}X%i`x{n=QnzjPtzLRWKh6jtR_NrV^i;gVs;=k zBr>-GL^k;V$T@J7G*HaHCPjT`#j^$pbTsRG07FQHxjW}(#eOU(P#4M-<|GzwQ#6hu zN2U4~_SvL5^Wwe6P!L_;6|zn5gD%y1rfVIKbX1|xw&-+8jC@dSxk*GI143DyBmU!2 z?>SXb@x>PPb-B(t1u&!(ZWvkb-G7gnFf_h~K=)6K5(e!e-qORBVmXvdo+dzor9m29 zM@tFFY6u%+nYU}w#NH$c06gq+5B^6P)y_^>bkZ9%lcnPlk<9y`wBtO`E`R_400HFD A3IG5A literal 0 HcmV?d00001 diff --git a/public/icons/paypal.webp b/public/icons/paypal.webp new file mode 100644 index 0000000000000000000000000000000000000000..3cc416e6def56828fbad268bcecfed2bada0a8d7 GIT binary patch literal 616 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 literal 0 HcmV?d00001 diff --git a/public/icons/racknerd.webp b/public/icons/racknerd.webp new file mode 100644 index 0000000000000000000000000000000000000000..2262856f58adf2dc12bbee62ea22624b2a900dd4 GIT binary patch literal 776 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 literal 0 HcmV?d00001 diff --git a/public/icons/smartproxy.webp b/public/icons/smartproxy.webp new file mode 100644 index 0000000000000000000000000000000000000000..96ba0cfaf30b3639238d914cef04716a228f4894 GIT binary patch literal 396 zcmV;70dxLRNk&G50RRA3MM6+kP&goX0RR9n4FH`1DqsL$06vvSph~5rBcZ4WNU#!# zV*u7^K|Agq-Rqmr*L0Ne0O?nuLDZZ2XY2v`f!3${I9dQa(14l|I9S5GTmsY~zfRL; zpuFnKkd4A=JLoz_$8$2q)bk0Vf>OPa_rMy?{l7@bheNBw0092?Grf-h>$=DQlF51v z+R7~}MAS;vG}q8Lo#<))P)RV!7v|n=-M`4%{wwPsbhfOy^=p_j*(}&!(w=I4SP0l2 zgJ5#pIrxNq~^5jKBvO|v4)hv3_!N8lUrMeAmc zXtD1*z<%9)(vkzZU{U-t6f@r1y#AUY97~k+Im>g$Wd8=|ZwAnSPj&OgLJDO1@nNVB zw(b;e1HyuKj4eu3r(h!w&1wK~Q2i!3YYZ$?BjF707x7%Vf0`-|d?R42C|n$TEW q)9_v|u-dnY%F>t6#LefB6Th8NA(f}ka@LI6 literal 0 HcmV?d00001 diff --git a/public/icons/smmfollows.webp b/public/icons/smmfollows.webp new file mode 100644 index 0000000000000000000000000000000000000000..7e39e92fd0d70d83953f994b7164ca79863ab4d3 GIT binary patch literal 1652 zcmV-)28;PpNk&F&1^@t8MM6+kP&il$0000G0001A003VA06|PpNDc-700FRu|DPdA z((fOUSvB@dV{PwvZQJJAwr$_7ZQJ&a*0$~OOjSn2|M#LIqO$v5-#rmA0r=niVv9zz z*=#lnD+3|6D4We@vr!agaM=d38@4Xf5agCcj<+N`fzLvn6)WC`e_POfCk6Vl`|MDu`z5+FzFgP)~ftuFW3^_&SH+m z>a*yX)Xjv}*yh6w!T76LF{(by{l@w|J?npSUho=W#Vf``0Q+Y;#vPyk z^^BgL)sDJxc?dDjC)S5W++vFygPmDvjP1X#1_1=Co#YwUiaWyq{R;x)ffr8)0KvGQ z&S!|w^M@#F5!gSlV)9B94P%UH6u2hAihr;Gj%GsnO8ahl#)kR{+eV)R^a1u!!2i-kS(~b2}7u7)+~Q zcMK$k5#n|Q#>jA#TDm6TBRI1{a zf$dUlZVpMI#Ip>Mil&(_=XS6$Ym0dd z>D3sNdSTo-+X$xr=~*K1`urU(4SFA#-=YV?5@-9{Ac=*;w4j8+5T$B=O)9X00=h! z&O(NSa@GzjO+S7aKRytJ#OfCV^F8{IimKy1t3t92u+IX9SlaWYZDBHusRb~w-}l}p zf~#CmR=j2;Bm)q^zVp>3f~%ZYIzGN0Y^r`i^RsWT3Xyc1CpOTfV7G_qd?elGt$i>9 z1}U-Q^K@0nah~^%=mrJWxQng|Ilkg68w>_Wfpt$?%+Ri!55c>(Q-9eQNH-`j{F@H&-IKD$s?%8+Wd+UxfzA&{3gF!1+fYCkcPoA<~&k(>G)GJni z5fj&$JY}Q);efFi%wh#eV^P0YgQT&7!7e6>fff@L{QuonP&gns000261OS}@DqsL$ y06vvUqfMoxBO)N^0I(8?X#fBRc2#`6#-8$Tr%s(Zbm`N40092@c>n+a0001&ARK`J literal 0 HcmV?d00001 diff --git a/public/icons/srs.webp b/public/icons/srs.webp new file mode 100644 index 0000000000000000000000000000000000000000..ee1c4a86877f4138b8a4b15b9f2e7ad9dae37d61 GIT binary patch literal 2452 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 literal 0 HcmV?d00001 diff --git a/public/icons/stripe.webp b/public/icons/stripe.webp new file mode 100644 index 0000000000000000000000000000000000000000..829ef266ce2548aecafda7ca9f76b89c6330c370 GIT binary patch literal 750 zcmVlIAtzPyBQU>9+mhIf!0DA7%xk9UZUSHqWLIZ5w_p3lKv*cP3wq934vu&%7$T(Ms zW-hI7URLOiiro(i!;Hfm%3CZR(hw^t&c&G<#1sGh|L?~Grfqh1SJv@iKw5uWN~_~O zmQ>c?w_%5{`QQ^Ci>?>ZM~nz+8nvyhVUAH!Q+-%E(3($MDCkwKCjrdSpKUgPl+o+6 zJ-B5WfH`Z$gwutf*Z0J50#;BsAfy2R0I&=IodGIf0AK(Y+&SbzWk{@DDciQ7x9TCP9-m6&ATzjOV5 zsz3ZqpZJ?M-X%^7BxY=*Ny@FsUU5JWpW7Y z5;0F_|E>g$iMyqa)<<;ZVrJJ1YD{g<|42546_rf<%-wj`d?u{?$TjDNj#Ny3EWoI~frwl!}bVI?W635d4y(Gqgb zJbaQ02i%Ly+L61>BgqTRY0FBUaS(HezqASodSB$s4yo#)Aulq4{1qoE<@{S~P<^My g$)!SWEywrs*|B;7XaK*xy&oMJ=z=DFXYBw00INf32LJ#7 literal 0 HcmV?d00001 diff --git a/public/icons/tello.webp b/public/icons/tello.webp new file mode 100644 index 0000000000000000000000000000000000000000..9ec43f3eb891ad5fdf6fa0573d7ecd56ddd3d5fe GIT binary patch literal 1490 zcmV;@1ugngNk&G>1pok7MM6+kP&gpI1polB8~~jGDqsL$06vvKn@A<3BB3mGytuFu ziEIGRm?6Wjv3!~QuU7xDc%bRus64}YkMj?;&+xvaJitG<^Z@e#`s@2+?zjHO_IKUK z`fpGV=pJ`|!9UzT>w6D$xL_xLQ0_>VDkrp+tMomr_=Lc$y6U^24qenxbp zQXlXmz|-_kfwq4cK4;N0(vW8k02mjAv9>GE1oXYxMM@aEJeJ2@q76-8I;>N?tV*mI zcJwS87xgQyEP|<(ELVCmGkGDYjpf0n%C0$sP-{T&O}%-=2@9p-nbGpYn&=fQKsu>l z<##J60092!X&?VU%Fo()awz})mySny9qxR)gfI!Qi_M}q`yDRcpy8l;-USa!tR7M= zJXyrKOStH)FhZ+>#<9UoUS|+n^3*T0I+VZFH?3hj(=i^VG<}+0Sio2cPYMi>U4PstjfVt6RqAofAyez^cE_Ql+GM zSLGiy6)?(H_X5MM#V7Zv<6U7HD z3o5)B5NpogD_JR%ZS@jUwI{P_&gFV7FbK3@3nRkE2y&r{j`%Vgm^@aiw~QT8+R94I zVx;IOP{+N?7fS{rc(-mI95=ot4E1 z_9s(diBu!%_mrXGoF`?8EM>BQ5Kr3ygB6{n32kLHMs83D3ZUm8dE%$>#c18^Vb0)1 zjB3fdnUR9H^Ure5MSkCetOm)^!ajX+wSqQ1$#k;9M(4hB!T!;%LfL{YNa79firO-o|?Ug**xdGG%`1Cf$ZXEv%JU-r#!{M91XGENnBmn=3e*%w`ZG^Z@ zm9bc49TdkrkOE-Uk0uLlg^d~yHnIF2ueN>rr$`K?phg!ia4skF?8oRwi99; z@bn`!8mmugGv4&AdV9|mEG1VOuS+k02~Z7ccerrMYi}a)U(PM4gbsX=p)W&f!W3FI zrW4nP=*cDwvIQM`!s$QiK{BOE0x;<|^%BLbKX-+e7@Fo+`>ux{;n!YS)Vz7UWR$0A z3buhNKvpVB=a0j3t(}dp!EyIP&16A8q~8?w{xx*oSF|Vt_hDb7KT!SU=zT7F&f!>H#~X1R>SGAvpH-@BCld}BYw<^6KI%-2KAkk(KD0L-J>d;kCd literal 0 HcmV?d00001 diff --git a/public/icons/tiktok.webp b/public/icons/tiktok.webp new file mode 100644 index 0000000000000000000000000000000000000000..d66705ec65d542d23e7a8fa58b29226f0e7e04e8 GIT binary patch literal 1244 zcmV<21S9)WNk&H01ONb6MM6+kP&gpS1ONa~8vvaFDqsL$06vvInMoz1A|WXB-oUUD zi9j0623eSh)GGW)x=VS0{eb;|>;dQj{onitT92RymIv*R!dLC5?Z31(YnS(a(*M5M z7yF|TOImKqWlkh`5IiPKNuO7zy@Nko`q6qKC{=K0Ie%a2=uJacBw(2byddvNJE&tf z8{oe|HjXgkqk%I`7Hc$v(I~U^GY9j`gF?&%Kx=um0A9bmIBQ(q@pVFEf6+|L#IT2E zP$ktC^i=k7(GYUqzi|{onCp{D(WFTd9+z1cV!Zy?Aqw#z|B>rdG{R%K9>4(p`}P%9 zZ|N<~<1LQ5mf6Kc^d831>T>mK4Fj)iolpHoWeC`C`wk$2?Gor*LCjwiG<4)ku2@ySb@LQ-xV-y^IeRBD&Y4KP;A)(MONBXNj^8J-(W1l&5t z?|=DE+W0l`QMle8qD9nV-L^em@;H&Zy=GJ_kAj&xTUD84k zoAyN7=TU=P`fa7_;45E?rPnt3hdH2H)pAV5{Jxz0>;1}UZ0jm})%)rkR$+N%{GHU^ zXKiQ9URz}wh`nOyPLi0M^xcxBq80i{9(+}elXl6B6zxE_$#BJvo}>i*JPZZ8^;*~< zOC_`4qmz$nc^$OD?d4ohQQkN%F2?|Kp9&_STsX3~Gyeu&VUiQ1Iy(Hei24Qp^Z5mt zf+24zu8)ISHsy!ecMBhliuVjG?3`T1ACkA9S`D$L$CgJbY*fhIUMdXj`~l8l&oQ_A_; z)20NVijmxYYSCjR|Deh%o19PjTy!me@{F2Wk}J>rBz?yIPUOx$Nf~o|Ub`zrTxv0E zrk_vnaf~bFGv5z(yM+(_t*GpXED()+O8fT()}OHacMnGe!-e;IjBP12!p2=pg93c{ zHey)jYZWK_qv6CW(xM@#Y)V53(D>eC zLf*4^t>xs?uL=3Fyx}G=`Bx?>T&O{T3w9`yM&I0%UU=L>J%oWB&vP(I27Ec2ZaBWA zP{>2FdtB1rE#~>0>T`ex!P+EgQF&;S5P50y{(+eHRR?^P$Vw$fVw2{_Gsgy+cLKH4Myx6I4^q_n|VTkXO! zsQP~=(RtDxa4eVeQLmw#E)U7SJ6iDwNyKqzmdNehZt`Ru65(;aSe(!1b3Mt?3@%6j G0002L=x~bw literal 0 HcmV?d00001 diff --git a/public/icons/vcam.webp b/public/icons/vcam.webp new file mode 100644 index 0000000000000000000000000000000000000000..66c100318f53dbafeaf96563da01ae22af2a7b9b GIT binary patch literal 928 zcmV;R17G}7Nk&GP0{{S5MM6+kP&gor0{{S!5dfV5DqsL$06vvMn@J_4BB3mJ3W%^0 zi9pX&djP7kW64w%k7*|yuDVTl5n$YOgPP;yl>cff#qKt^?tMAsk2GtBfRxlbi*8xM z^VnKGk(m&MkG<3nKo;47Q^RF6I=s{q8riSGXOlohR~%h^4VofA8KBuIDlMzJkKRW* z*nP<>PvVo3lZ2yJJL|7}d4AUD0RHdpWB-lg`7Zst-Y4Sih{h)AA={0pe4GVe=ezn*BtLUlY|F#&KX_IIe5(shd`nR`xORte_JN|hLh}Jk1w*|dxrH3{}R|SnU zsiD)PSGuwOs3{z^RC#njB+f`9rYI?|n0_r%rZR0iBYz^6@C$Yk;aI%q8S%dx_M`W@ zy@;%g5U{tbEzQ$eSIIM%^)cY=VKYmM+65R#sJ}%4GfD?#!Td8jWsSx^oB{IH&*$nU~@QC9w`2>|G91*o+;LHM-1cFKNogs;-Xq0GU@UN$ET zrbk!G;%c6%BafnVK-Xo&x5M@s`!|pm&qst*cZhaPqWT$s*+P2=6xMFbGplOOI*bCt z!z-aveC0Y;oSV{~?A7SW{RFxaRkh7xCaX`(`7p8^8NJ$@yPWFJiOG)_hUFc?qyPXA CLd$Xh literal 0 HcmV?d00001 diff --git a/public/icons/voyracloud.webp b/public/icons/voyracloud.webp new file mode 100644 index 0000000000000000000000000000000000000000..077e0b5a9bae9f89a32132f0740559de7010231f GIT binary patch literal 1342 zcmV-E1;P4KNk&FC1pok7MM6+kP&gne1pok08~~jGDqsL$06vL2mq;Zeq9HVN?TDZe z32Xqx3}1#%x%rsZAGUba>kF2=@ww}qFPI1E-$?H;AMm|4{VV^C^#J~t)G^P~?FHn) zn(5i}icP`9wUU~)TlU-axM-H`5c_Lk^our-0#xUGxc@>P$b#Si-M{^-b2d^)KBNN3 z@65iUop*rxrWgxxK_ab9u{P~z&aY7Bh=b?A$FH<%71ih&pI6V z2%G4dH-J8F6FUe5C=pm{7R?<=wWI9)EClB6A~Z|=XN`UG)SDHJkaHLX58$)wUS3jF zk^lhy{7L~t&_MWwX+T%Otml#DP*xkRJAVw+cik96^d3bOP}8x;Agfgv=nhmCPkB`8 zGb-}sit$_Zkx?X#b^{DsZuQYjKsH_86kk(&N}7S??Q!v81ulSo4Su0vm3yLJ#E7YE z3ZKg{4B|phRUI%TjgQ3?{_xk+$>IF-c( zPbnF)O8Q-w=_YX~W*f}$YDAb6ySH}2gfF)5%BXfp2(OFY(SUY_NijR2k+b=1w%9@@ zRccaD+<3QX?frRj1&r=iU<&yKIp0<*?=)-eH;rH)0@?BDQ4frBQ1eC;F8X(D(WKCM z+OqHIrBSOH07_!&!N)ZX-mdgAzQLLBtJT z_6)Vmj%wBgsowQHJ1<1_$1b3o$o_Q{fNIz754fJgO!_Y}KKYyfSHS@v+8}{{he&KB zoETutZuU_zY>^CEtdujyC2z`lL+PiJ?|tz;IIm%vmBkS-Qi{4jCXBOF4pz14t|TFw za}r?_--2v-o&X1ias7U1bVEZUx2@?VxXq5h6LDMg!b|5h7@Q~L_ zm@b;n9;08{t9x4AJ7dtH_4nN?^|6U^2bM75%%ewXbZd}F&^tXWZm(`Pw&)qLa#BB~ z1v;uL0;k`zl{iPz(^=rbl_{$8!_{$?K31B610JvOG&LqSN?rItf7@WaBT=rYO8Va8 zqS@!Dwr^*4!ooR4PcQ})lv+HF2D?M_@BGWr9lD-QMJO>L)xt_ z3IQwYTiQ__ZN{Gq<`0ouLia_9f$Qo$8T-;v+fYDf*|DApSx38{Nap&ctIH=$(D_B8 z>@Xo8Bg?fl84LPVkpgRpobul_;zuVG2~Uo28PbJu2M0HsfEk5fusc$KKsLGVjR___ zYe|>f=f-|s1E3#&Bt-CG+03I!;$ttgbb06SjVPP} zx7mA_Sd7{_DhmRBKo!L|?Y3A;2SZs`A)@XXem}il3ht%s7GCKe*10vmETDEShzyDN6@SBGD+tiIzl|A5wZ~7&TXBra{Aao@=eZ zzckM}@hi9v$^=ljaw?wN_m$nB%WIECcpXL2fG7MDo+xseB~A_;$x&pPvJY}OiR&uC zfq?UB?NeztKmh*yH7fe70b305BZO=#8nD^ZPzog)V{2-?Y4G4|$xhA?PzTfki7_Ik zNPtv>3}g}Z?_Kzphk~nc0a>r;b>8lohOj&2htB2;p3eASrxy8V$Z@0pFF4&9CP00|S|#?&D#I;F=Sl@w@3H zr%v}qYWlZRs6J};VQMh$U(66BJYl(>g!aO^RW*r}6qxaJCssq7J%R}sep_Gu%L)0u zHXla6=Qi$3a(0}$-#MR9QgQE=bnoYXnY%?^VlRht$sihP4xEi}i&WWX-EdDXZ>DJ_ z;PJVCZ%9$aMEp9;`<8_GZVD4w0fkfg*=}s80$T*erp_HAC>LxQnnoBTF^&%f;qPOQ ztv*WrxA=~TI>`s-nX1^dkxw%65V=?@0^~XhCi%`fHQ&ainCmcYzI@ySII5hYCA>pOu*!_Bn1xqXmx;(oG z%dHlCM-;dK3n>Nl2}HF4JFO6~gk+9KKs+dBpoO`#k77^~gO(4%12L literal 0 HcmV?d00001 diff --git a/public/icons/wireguard.webp b/public/icons/wireguard.webp new file mode 100644 index 0000000000000000000000000000000000000000..df6acdd70631ba5bda43908d8076636123d196aa GIT binary patch literal 1028 zcmV+f1pE6^Nk&He0{{S5MM6+kP&gp)0{{Tf69An7DqsL$06vvQok}I7BB7@_`)IHd ziDUrNnespmKiz@`8+g3HbSBhUP5ThTfzdumt5e}{WUHYO`Hb#CdS+R`T+=k5tXjmaEe2K=eu|&W; z3y!D<4+A2U2d~WAL>Qn?hID`Q{W9y*GrgT<*#>o=$GQ!1-9hOEaw^RR#xtBLpQ(^P zHGXkbyyHqbM}xy*8r#>OJ9vk)jb>6wN@IS|0sk&=k{^Wqie(#o;EBsc+pg@R? z7=*>rxo3%TN0kGx{bltBHHdl|L#-DWlJzK$5JNygIeJn5rv1@o?~yFs$C(AUx<2v4 zca&B=ZAUESn@;`6?#?x&Q3V}l{Tf{@#>H$0N<;4}K;`-2f3V7)+ znF9@&Ulod&?!JuiYb=jo@~`{6jBj!)jdwfiNnAa7W1w~a(P2W{$U2=YZq<|1+Xxck zaD}3lT&&Lh^&>Eo`WO=OMU-Gtxy$*9WP_&odop_JhTG6{s9#vTW;f_XrmI|zmD$&z zb`~rZ940P$(chDeAE?Gwm{9RP_T~Ys1HN~^slBWG#{>gtXpvhxXD67X3dQi_$$mdC zH}BvmWlGAhK(0sXh(B)+qCM*oj&F?}Y{_Wo$A=4$lYb7AbCnkp{A zEtq^2?rVFZ00~Sg{`C>F*FOn;?wc|ubE_mwHz zeZFP^3J=b|Lag>?f=sHafpD4=CRa^ yoj#zQYh#evcsyt!StI#4YbvFpzvjvkV21twraHpaFk7G5FGxL&!}SJXAAkT7BnPwr literal 0 HcmV?d00001 diff --git a/public/icons/wise.webp b/public/icons/wise.webp new file mode 100644 index 0000000000000000000000000000000000000000..429ae7cedcd5c3eba31882ee3c48f76f83adebe8 GIT binary patch literal 726 zcmV;{0xA7cNk&G_0ssJ4MM6+kP&gpM0ssII5&)e6DqsL$06vvOoJ*ynqM@i0nRu`g zi9i{9!{{l2J;AOc>tk+bJ#L$|J5Q6C#NPu-Yd;5aFQ`-rM`Bd6K9_YIQi>z5UY)V@ zg>A(MP7z+ur|3Aw`o{T}lwO&ua5PS-FH%dk7{bdJNYFldu(UVP9S;5a)#vcE)=2n` z1ta1Pe2VakeGTy74HWCfz}5a=QJ-c20RH&&onls)5{!`NdrVx1q+p(k>}1zlaqA?% zD0#=m-X$>2xd%daPD|MPcAA+xce<^;&()7iLO1|x8~8YUbDG*Fp&5w)=)bDpAgQww zL{L8{QR^Q1xEWhRoRw;h#$ksTcOKHe|D^)N>EF%Fhe@H6cUO=t4g6uN!g9x_|SY(q~lmBS3iG5>x|{IzP*!HbjVVmC)cVGfR| ztwICcL$Bw|h?ZGCsC4+iUbXcW+#f*=9I~_EIhki3_z9^n0)y$|^wEif1QMai(=z<2 z4+P~r`&lQ32%cYnDTJg&Y%DkGa{E73YvOcPz^B>6g|4NO)xdlJ-SA2-`By2gEJuqI z8Yxe!2%l;*F&aC?%OGS2?9P~>KdQbdC69yvz&7&dvYt4Q%ZI_qUDajdHKJf@m_1)FVBz$;bSxCqoa(V zXWlFBs(eI@YP}25XN53sF>DglKkhi-iy?D?SIr*~6I8Rtnd#k<$|W&Nr~VjcT}JYE zS_%D~FuX(vl`Z_EU8Dc`+C5+bix)^iu|4z91~M_G$LRuO2M;18(*cmWk7mcqHgzWt zP8*Cp#a8f%R-Wz^IdJLl5;b4`pgjK*;-p=HXg?Mh=4Hxa7GFs{TzK;;{-Dq(GI8k= z-cpTJ1Ez#n@w)HOB#*}Vnl?AQg1|bTFD=I2cKDWmxHny#!q*Kh?vZ^ssGHa%oq=~9 zzeew9UqW!A^|R7CN?Q7$5G*hLO@|S5q{1<@Yh?UApEhtJI(A{G6ZQQZ}pwQ*`(b7Ywv)L{s+GJ?BsuD#x;Q1qM*~LeRK1(m{^<*PQ)(`@i9yYV+CJ#OMDs`vU%;eya7F^AXW&{AT-B^Y`u$L8JoI z+mO5Po2O&^xy&EhIuVHk;{_c7a_6hyB+jMX>=G=aF-_HN8`uCeb7g{?BX6B0QVq(- zXbnv6I0>^any9_ zo5Idy|1E=br4wt@Kqy8|m%so3{`}NDs}YN05}a1)PQ1!7eMxBzKyU>qR_JsR36ZGp z(z$C9_^~4>102nC$r02H0%T+CtX?caPZlxW!S01B5V8j-wgd8s$UxZj)FPkAB44-a zqf-gRqs#thKj?4LkpCZ$-Cu(CmW^x3I{n%q|5%23^~lKyDjPlXjC_Zj^|(lqfdY1W zTk9vjm?AIJb#Hr+w$&77ckSbT&X%HWy6ks=ME3BW)d+P&UnOGu__r=FPow@bo+^ilVdH;qc=( zFn380sVJnwC0A4|Bs{{jtI5P6_;-psgHZ5E#nA|$_$#RO$(xRmwWObfu3N$XGbTd0 zc3UmhrjZdG@A|hFaBf=Xen|9>l2&6IQv(}z9i{{vP>P&D1|Eo@6}5yJJzy3K1lXx( zsyl2foL)P^*&^`Z!g_pyvWz2e`Pa|yJnMyc-w>i@f$KV^w@#lh;7dSTAZo^|k2{2b z{ct0YGLkHzx2OLR^aOB6%LDxQO8;s`7&!AXio82H5!FHuFc7qLUDVfd1xXNT-3*nS z#1flObvDk$`OvWg&)zvAVro$qHjI_hm%6rhY8a_D!sb0v*sCVn%{ ze10F551gDt6J6JYkay40f`iQr_R=JF87AVT^a3Juh9#G} zuH;8|)KY7{ev+7w587_Qgj)wr-zU$6Ogr1+t5ek6dk;fNKFkpd*Pqull)sfF5`#a^ zxy`Y;beO0{@k}Maa)u^mtRJy-4)3WNot}=>K)M>bH$0euiE{l^>)vs^JS9rI#W)bK q{3OxNV^u(fk(P1cbW3KkZpf^I2JeyO(N%hK4uxjoX)zJ8fB*nuFWvzF literal 0 HcmV?d00001 diff --git a/public/icons/yidu.webp b/public/icons/yidu.webp new file mode 100644 index 0000000000000000000000000000000000000000..4de6f0dd0db3705e21d29262988701921d3f48ec GIT binary patch literal 1662 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 gZGzN zF*m(HYh_fYqB?9=NB@>XS06w5n9+~+`0Al8{T;K0l{~Ce>0*_J#a%nke?ve827I%f zU5gvU#hMx-Cr)N;I``Z|HE$LQgcjYBnL*V*KeuUyIB`)bDi&>6bK+Hi<}&#rT~S&l z2Mw=ItZ5L9lNaV>c>g^Fgq#nkn!#H@z`g$A;^Ktg??_q)?-x|*ky;KEgblVz zvg|rSUXc)kDXuRQr%8!OW#YlV$mcXcT3-JioG6hdbDNQLzeV94O_aer-gZkAC!uBJ zUZ__jPOnfKDK$$M%e>3*0jV%}TsDbat)JJ5^9k=P+AR zg+(�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 bestArea) { + bestArea = area + best = img + } + } + return Buffer.from(best.buffer) + } + return buf +} + +async function toWebp(buf) { + const input = await normalizeInput(buf) + return sharp(input, { animated: false, failOn: 'none' }) + .rotate() + .resize(SIZE, SIZE, { + fit: 'cover', + withoutEnlargement: false, + background: { r: 255, g: 255, b: 255, alpha: 0 }, + }) + .webp({ quality: WEBP_QUALITY, effort: 6 }) + .toBuffer() +} + +async function main() { + await mkdir(outDir, { recursive: true }) + const data = JSON.parse(await readFile(linksPath, 'utf8')) + + const ids = new Set(['_brand']) + for (const cat of data.categories) { + for (const group of cat.groups) { + for (const link of group.links) ids.add(link.id) + } + } + + let ok = 0 + let fail = 0 + let bytes = 0 + + for (const id of ids) { + const url = SOURCE[id] + if (!url) { + console.error(`✗ ${id}: missing source URL`) + fail += 1 + continue + } + try { + const raw = await fetchBuffer(url) + const webp = await toWebp(raw) + await writeFile(path.join(outDir, `${id}.webp`), webp) + bytes += webp.length + ok += 1 + console.log(`✓ ${id}.webp ${(webp.length / 1024).toFixed(1)}KB`) + } catch (err) { + fail += 1 + console.error(`✗ ${id}: ${err.message}`) + } + } + + for (const cat of data.categories) { + for (const group of cat.groups) { + for (const link of group.links) { + link.icon = `/icons/${link.id}.webp` + } + } + } + await writeFile(linksPath, `${JSON.stringify(data, null, 2)}\n`, 'utf8') + + console.log( + `\nDone: ${ok} ok, ${fail} fail, total ${(bytes / 1024).toFixed(1)}KB → public/icons/`, + ) +} + +main().catch((err) => { + console.error(err) + process.exit(1) +}) diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..81449b3 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,247 @@ +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { CategoryPanel } from './components/CategoryPanel' +import { SideDrawer } from './components/SideDrawer' +import config from './data/links.json' +import type { NavConfig, NavLink } from './types' + +const nav = config as NavConfig + +type Theme = 'light' | 'dark' + +function readTheme(): Theme { + const saved = localStorage.getItem('navmini-theme') + if (saved === 'light' || saved === 'dark') return saved + return window.matchMedia('(prefers-color-scheme: dark)').matches + ? 'dark' + : 'light' +} + +function IconMenu({ open }: { open: boolean }) { + return ( + + + + + + ) +} + +function IconSun() { + return ( + + + + + ) +} + +function IconMoon() { + return ( + + + + ) +} + +function IconUp() { + return ( + + + + ) +} + +export default function App() { + const [theme, setTheme] = useState('light') + const [activeId, setActiveId] = useState(nav.categories[0]?.id ?? '') + const [drawerOpen, setDrawerOpen] = useState(false) + const [toast, setToast] = useState('') + const [showTop, setShowTop] = useState(false) + const [pillKey, setPillKey] = useState(0) + const jumpingRef = useRef(false) + const themeBtnRef = useRef(null) + + useEffect(() => { + setTheme(readTheme()) + }, []) + + useEffect(() => { + document.documentElement.dataset.theme = theme + localStorage.setItem('navmini-theme', theme) + const meta = document.querySelector('meta[name="theme-color"]') + if (meta) meta.setAttribute('content', theme === 'dark' ? '#0a0f14' : '#e9eef4') + }, [theme]) + + useEffect(() => { + if (!toast) return + const id = window.setTimeout(() => setToast(''), 1600) + return () => window.clearTimeout(id) + }, [toast]) + + useEffect(() => { + const sections = nav.categories + .map((c) => document.getElementById(`cat-${c.id}`)) + .filter((el): el is HTMLElement => !!el) + + const onScroll = () => { + setShowTop(window.scrollY > 480) + if (jumpingRef.current || sections.length === 0) return + + const marker = 88 + let current = sections[0].id.replace(/^cat-/, '') + for (const el of sections) { + const top = el.getBoundingClientRect().top + if (top <= marker) current = el.id.replace(/^cat-/, '') + else break + } + setActiveId((prev) => { + if (prev === current) return prev + setPillKey((k) => k + 1) + return current + }) + } + + onScroll() + window.addEventListener('scroll', onScroll, { passive: true }) + return () => window.removeEventListener('scroll', onScroll) + }, []) + + const activeCategory = useMemo( + () => nav.categories.find((c) => c.id === activeId) ?? nav.categories[0], + [activeId], + ) + + const onOpen = useCallback((link: NavLink) => { + const action = link.action ?? 'open' + if (action === 'copy') { + navigator.clipboard + ?.writeText(link.href) + .then(() => setToast('已复制')) + .catch(() => setToast('复制失败')) + return + } + window.open(link.href, '_blank', 'noopener,noreferrer') + }, []) + + const onSelectCategory = useCallback((id: string) => { + setActiveId(id) + setPillKey((k) => k + 1) + setDrawerOpen(false) + jumpingRef.current = true + const el = document.getElementById(`cat-${id}`) + if (el) { + el.scrollIntoView({ behavior: 'smooth', block: 'start' }) + } + window.setTimeout(() => { + jumpingRef.current = false + }, 700) + }, []) + + function toggleTheme() { + themeBtnRef.current?.classList.remove('spin') + void themeBtnRef.current?.offsetWidth + themeBtnRef.current?.classList.add('spin') + setTheme((t) => (t === 'dark' ? 'light' : 'dark')) + } + + return ( +

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

{nav.brand}

+

+ {activeCategory.title} +

+
+
+ + +
+
+ + setDrawerOpen(false)} + onSelect={onSelectCategory} + /> + +
+ {nav.categories.map((cat) => ( + + ))} +
{nav.footer}
+
+ + + +
+ {toast} +
+
+ ) +} diff --git a/src/assets/hero.png b/src/assets/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..02251f4b956c55af2d76fd0788124d7eee2b45eb GIT binary patch literal 13057 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 P00000NkvXXu0mjft=yBf literal 0 HcmV?d00001 diff --git a/src/assets/react.svg b/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/vite.svg b/src/assets/vite.svg new file mode 100644 index 0000000..5101b67 --- /dev/null +++ b/src/assets/vite.svg @@ -0,0 +1 @@ +Vite diff --git a/src/components/CategoryPanel.tsx b/src/components/CategoryPanel.tsx new file mode 100644 index 0000000..6e7bc55 --- /dev/null +++ b/src/components/CategoryPanel.tsx @@ -0,0 +1,48 @@ +import { useReveal } from '../hooks/useReveal' +import { LinkCard } from './LinkCard' +import type { NavCategory, NavLink } from '../types' + +interface CategoryPanelProps { + category: NavCategory + onOpen: (link: NavLink) => void +} + +export function CategoryPanel({ category, onOpen }: CategoryPanelProps) { + const ref = useReveal() + let flatIndex = 0 + const count = category.groups.reduce((s, g) => s + g.links.length, 0) + + if (count === 0) { + return ( +
+
+

{category.title}

+
+

暂无入口

+
+ ) + } + + return ( +
+
+

{category.title}

+ {count} +
+ + {category.groups.map((group) => ( +
+

{group.title}

+
+ {group.links.map((link) => { + const i = flatIndex++ + return ( + + ) + })} +
+
+ ))} +
+ ) +} diff --git a/src/components/LinkCard.tsx b/src/components/LinkCard.tsx new file mode 100644 index 0000000..830af31 --- /dev/null +++ b/src/components/LinkCard.tsx @@ -0,0 +1,57 @@ +import { useRef, type MouseEvent } from 'react' +import type { NavLink } from '../types' + +interface LinkCardProps { + link: NavLink + index: number + onOpen: (link: NavLink) => void +} + +export function LinkCard({ link, index, onOpen }: LinkCardProps) { + const btnRef = useRef(null) + + function handleClick(e: MouseEvent) { + const btn = btnRef.current + if (btn && !window.matchMedia('(prefers-reduced-motion: reduce)').matches) { + const rect = btn.getBoundingClientRect() + const x = e.clientX - rect.left + const y = e.clientY - rect.top + const ripple = document.createElement('span') + ripple.className = 'ripple' + ripple.style.left = `${x}px` + ripple.style.top = `${y}px` + btn.appendChild(ripple) + ripple.addEventListener('animationend', () => ripple.remove()) + } + onOpen(link) + } + + return ( + + ) +} diff --git a/src/components/SideDrawer.tsx b/src/components/SideDrawer.tsx new file mode 100644 index 0000000..a95c9aa --- /dev/null +++ b/src/components/SideDrawer.tsx @@ -0,0 +1,101 @@ +import { useEffect } from 'react' +import type { NavCategory } from '../types' + +interface SideDrawerProps { + open: boolean + brand: string + tagline: string + categories: NavCategory[] + activeId: string + onClose: () => void + onSelect: (id: string) => void +} + +export function SideDrawer({ + open, + brand, + tagline, + categories, + activeId, + onClose, + onSelect, +}: SideDrawerProps) { + useEffect(() => { + if (!open) return + const prev = document.body.style.overflow + document.body.style.overflow = 'hidden' + const onKey = (e: KeyboardEvent) => { + if (e.key === 'Escape') onClose() + } + window.addEventListener('keydown', onKey) + return () => { + document.body.style.overflow = prev + window.removeEventListener('keydown', onKey) + } + }, [open, onClose]) + + return ( +
+ +
+ + + + ) +} diff --git a/src/data/links.json b/src/data/links.json new file mode 100644 index 0000000..8075e86 --- /dev/null +++ b/src/data/links.json @@ -0,0 +1,585 @@ +{ + "brand": "游民导航", + "tagline": "数字游民工具与出海资源合集", + "footer": "2026 游民导航", + "categories": [ + { + "id": "nomad", + "title": "数字游民", + "emoji": "✦", + "groups": [ + { + "id": "community", + "title": "游民社区", + "links": [ + { + "id": "nomadro", + "title": "nomadro", + "subtitle": "出海导航", + "href": "https://nomadro.com", + "icon": "/icons/nomadro.webp" + }, + { + "id": "nomadlist", + "title": "nomadlist", + "subtitle": "海外最大的数字游民社区", + "href": "https://nomads.com?ref=https://nomadro.com", + "icon": "/icons/nomadlist.webp" + }, + { + "id": "nomadcna", + "title": "nomadcna", + "subtitle": "国内数字游民社区", + "href": "https://meetup.hackrobot.cn", + "icon": "/icons/nomadcna.webp" + } + ] + }, + { + "id": "toolbox", + "title": "工具箱", + "links": [ + { + "id": "chatgpt", + "title": "ChatGPT", + "subtitle": "OpenAI 开发的人工智能聊天机器人", + "href": "https://chat.openai.com/", + "icon": "/icons/chatgpt.webp" + }, + { + "id": "grok", + "title": "Grok", + "subtitle": "xAI 免费 AI 助手,追求真实与客观", + "href": "https://grok.com/", + "icon": "/icons/grok.webp" + } + ] + }, + { + "id": "us-phone", + "title": "美国手机号", + "links": [ + { + "id": "1psim", + "title": "1psim", + "subtitle": "低成本 2.5$/m,支持 eSIM 和实体卡(邮寄中国)", + "href": "https://1psim.com/7GARRL", + "icon": "/icons/1psim.webp" + }, + { + "id": "yesim", + "title": "yesim", + "subtitle": "美国手机号,3$/m", + "href": "https://yesim.app/?partner_id=1948", + "icon": "/icons/yesim.webp" + }, + { + "id": "tello", + "title": "tello", + "subtitle": "最低 5$/m,支持 eSIM", + "href": "https://tello.com/", + "icon": "/icons/tello.webp" + }, + { + "id": "9esim", + "title": "9esim", + "subtitle": "让任何手机支持 eSIM,可写数据的 SIM 实体卡", + "href": "https://www.9esim.com/?coupon=XIAOSHUANGERIC2", + "icon": "/icons/9esim.webp" + } + ] + }, + { + "id": "finance", + "title": "金融收款", + "links": [ + { + "id": "wise", + "title": "wise", + "subtitle": "线上开通境外银行账户(身份证即可)", + "href": "https://wise.com/invite/amc/xiaoshuangh", + "icon": "/icons/wise.webp" + }, + { + "id": "okx", + "title": "OKX 交易所", + "subtitle": "加密货币交易所", + "href": "https://okx.com/join/84999861", + "icon": "/icons/okx.webp" + }, + { + "id": "safepal", + "title": "safepal (U卡)", + "subtitle": "邀请码 104809,出海神卡,加密货币与法币转换", + "href": "https://www.safepal.com/zh-cn/", + "icon": "/icons/safepal.webp" + }, + { + "id": "paypal", + "title": "paypal", + "subtitle": "出海收款必备,TikTok 提现、佣金提现", + "href": "https://py.pl/1tyAwY", + "icon": "/icons/paypal.webp" + }, + { + "id": "bmc", + "title": "buy me coffee", + "subtitle": "赞助收款平台", + "href": "https://www.buymeacoffee.com/invite/xiaoshuangi", + "icon": "/icons/bmc.webp" + } + ] + } + ] + }, + { + "id": "studio", + "title": "工作室", + "emoji": "☕", + "groups": [ + { + "id": "proxy", + "title": "科学上网", + "links": [ + { + "id": "jms", + "title": "just my socks", + "subtitle": "老牌网络代理服务", + "href": "https://justmysocks.net/members/aff.php?aff=12475", + "icon": "/icons/jms.webp" + }, + { + "id": "ykk", + "title": "Ykk Cloud", + "subtitle": "性价比高的网络加速服务", + "href": "https://panel.ykkk.best/#/register?code=xYQebIgT", + "icon": "/icons/ykk.webp" + } + ] + }, + { + "id": "vps", + "title": "VPS 服务器", + "links": [ + { + "id": "vultr", + "title": "vultr", + "subtitle": "可按分钟计费的服务器(可支付宝)", + "href": "https://www.vultr.com/?ref=8985003", + "icon": "/icons/vultr.webp" + }, + { + "id": "bwh", + "title": "bandwagonhost", + "subtitle": "针对中国线路优化的高质量 VPS", + "href": "https://bandwagonhost.com/aff.php?aff=25463", + "icon": "/icons/bwh.webp" + }, + { + "id": "racknerd", + "title": "RackNerd", + "subtitle": "最便宜的美国 VPS 服务器", + "href": "https://my.racknerd.com/aff.php?aff=15630", + "icon": "/icons/racknerd.webp" + }, + { + "id": "qcloud", + "title": "腾讯云", + "subtitle": "腾讯服务器,国内速度快", + "href": "https://curl.qcloud.com/BZZ2MBTN", + "icon": "/icons/qcloud.webp" + }, + { + "id": "aliyun", + "title": "阿里云", + "subtitle": "阿里巴巴旗下 VPS 服务器", + "href": "https://www.aliyun.com/minisite/goods?userCode=dii0ofzg", + "icon": "/icons/aliyun.webp" + }, + { + "id": "colocrossing", + "title": "colocrossing", + "subtitle": "美国 VPS 服务商", + "href": "https://cloud.colocrossing.com/aff.php?aff=1846", + "icon": "/icons/colocrossing.webp" + } + ] + }, + { + "id": "resi-ip", + "title": "静态住宅 IP", + "links": [ + { + "id": "iproyal", + "title": "iproyal", + "subtitle": "静态住宅 IP,出海必备", + "href": "https://iproyal.cn/?r=nomadro", + "icon": "/icons/iproyal.webp" + }, + { + "id": "proxy-cheap", + "title": "proxy-cheap", + "subtitle": "便宜的住宅 IP", + "href": "https://app.proxy-cheap.com/r/bmcMoY", + "icon": "/icons/proxy-cheap.webp" + }, + { + "id": "smartproxy", + "title": "smartproxy", + "subtitle": "静态住宅 IP 服务商", + "href": "https://www.smartproxy.org/register/?invitation_code=7RXPLM", + "icon": "/icons/smartproxy.webp" + } + ] + }, + { + "id": "resi-vps", + "title": "住宅 VPS 服务器", + "links": [ + { + "id": "lisa", + "title": "lisa", + "subtitle": "住宅 IP 服务器,TikTok 必备", + "href": "https://lisahost.com/aff.php?aff=7566", + "icon": "/icons/lisa.webp" + }, + { + "id": "voyracloud", + "title": "voyracloud", + "subtitle": "静态住宅 IP 服务器", + "href": "https://www.voyracloud.com/?ref_code=2LJPRTE5", + "icon": "/icons/voyracloud.webp" + } + ] + }, + { + "id": "hardware", + "title": "硬件", + "links": [ + { + "id": "rpi", + "title": "树莓派", + "subtitle": "无与伦比的 ARM 开发板", + "href": "https://uland.taobao.com/coupon/edetail?e=5hkWkiThOmClhHvvyUNXZfh8CuWt5YH5OVuOuRD5gLJMmdsrkidbOWBzzpT26idJPSbzO0ArF68ertbZl9wqRUbeJevxT02sHgNIxyFsmaMOsi2OxhyQb%2BhYUTTNN7GRRSHvQe2jOLZ9pbNCYX0I%2BPP%2BWUTgK%2F%2B0I%2BtaUgbudUxA%2B536asYsLWVfKa%2BhVnND4NyB1fwjO3bJLf667Yy8Q5jB6TX2HR3Qrq8LCw4Dujjqyaqc1rGLUwdQHHM8iY%2BUDMxLRSiIntldeBz90au3REAmOgZ0RtdnfeSBK3KXa0%2FA9snq37kKL6zL4bZ3EAS%2F2oYsLHTsIOxroXBFP6oz%2BA%3D%3D&traceId=213e032e17650447230113327e0c4f&union_lens=lensId%3APUB%401765044691%400b521400_0da4_19af4dca231_da77%400290EZjuZ2xbgOlH3NTYAyI%40eyJmbG9vcklkIjoyMDg3MTcxMDEwLCJzcG1CIjoiiX3BvcnRhbF92Ml90b29sX3NlbGVjdGlvbmxpc3RfZGV0YWlsX2luZGV4X2h0bSIsInNyY0Zsb29ySWQiiOiiI4MDY2NCJ9", + "icon": "/icons/rpi.webp" + }, + { + "id": "mini-pc", + "title": "迷你主机", + "subtitle": "具有性价比的 X86 小主机", + "href": "https://s.click.taobao.com/t?e=m%3D2%26s%3DCb1Quo%2F0Wb5w4vFB6t2Z2ueEDrYVVa64YUrQeSeIhnK53hKxp7mNFuhCZFSw9yq2woqx0EHqItb0JlhLk0Jl4eVWmNyHytKdTKJ80yOOA0Mtd0e5Ku7CIDk5ffgV5fRI1qrpxiwMoCNxc1AtbZGVS936JshS%2F%2FIdwgQgG5hIzyLNEPXytV9ALtCLThlbPuuZLb93Df8fOziGg7JVKZos%2BjLJJgRsfWlWtajntMnDLEHhuApO%2F8klJ62RdK%2B6%2FP7Z6k6s3rDgsC6jO9AJYjY8CXJ%2BwEVkOqHFPSJJXArlDuzso5nyPLY4NPiLqets6lIJ", + "icon": "/icons/mini-pc.webp" + }, + { + "id": "gpu", + "title": "GPU 显卡", + "subtitle": "AI 时代的算力基础设施", + "href": "https://union-click.jd.com/jdc?e=618%7Cpc%7C&p=JF8BATUJK1olXwEDUFZVCkkRC18IGloWWwALV19aAUonRzBQRQQlBENHFRxWFlVPRjtUBABAQlRcCEBdCUoUBWkBGFoSVAcdDRsBVXsQB29pbiZRKGMHKlclCEgVWghcGV91UQoyVW5dCUoWAmYPHl4RbTYCU24fZp-esLulkIK0yd6n5V1eOEonA2kPH1oQWQUFV19VCnsQA2Y4El0dWQ4LU1hBC00SCmcJK2slXjYFVFdJDjlWUXsOaWslXTYBZF5cCEoQAGoLH1kRQQYHV1lbAFcXBWgMGl4RXgUKUllYOEkWAmsBK2vL05J3IB9Uajl8UStqSz4dFQ9jitDJGTlnA2sPH0olImF5ECFaSU0VVAdNQDxuW09KFiw8SyljbW1jcih3JWNxNlwaS0hqWBhoX2sQbQEEVW4", + "icon": "/icons/gpu.webp" + } + ] + }, + { + "id": "software", + "title": "软件", + "links": [ + { + "id": "3x-ui", + "title": "3X-UI", + "subtitle": "科学上网仪表盘", + "href": "https://github.com/MHSanaei/3x-ui", + "icon": "/icons/3x-ui.webp" + }, + { + "id": "mihomo", + "title": "虚空终端 mihomo", + "subtitle": "代理软件以及配置 wiki", + "href": "https://wiki.metacubex.one/config/", + "icon": "/icons/mihomo.webp" + }, + { + "id": "frp", + "title": "frp", + "subtitle": "高性能内网穿透", + "href": "https://gofrp.org/zh-cn/docs/", + "icon": "/icons/frp.webp" + }, + { + "id": "wireguard", + "title": "wireguard", + "subtitle": "P2P 打洞组网", + "href": "https://github.com/WireGuard/wireguard-go", + "icon": "/icons/wireguard.webp" + }, + { + "id": "lineageos", + "title": "lineageos (pi5)", + "subtitle": "树莓派的安卓 LineageOS", + "href": "https://konstakang.com/devices/rpi5/", + "icon": "/icons/lineageos.webp" + } + ] + }, + { + "id": "gear", + "title": "数码装备", + "links": [ + { + "id": "ai-glasses", + "title": "AI 眼镜", + "subtitle": "第一视角拍摄", + "href": "https://union-click.jd.com/jdc?e=618%7Cpc%7C&p=JF8BATkJK1olXw8AXVxfCU8UA18IGloVWwcKXFlZDUgnRzBQRQQlBENHFRxWFlVPRjtUBABAQlRcCEBdCUoXBW4AE1wRWAUdDRsBVXtwXw1pZzNKAmZgFFwlYUh8UzVBZyZlUQoyVW5dCUoWAmYPHl4RbTYCU24fZpO9hbeBtYKjxt-jwInikZ-fjV8JK1sTWgIDUVtVAEkVA2w4HFscbQ8EXFpVAUwRH2wOHlIdXDYyZF1tD0seF2l6WgkBW3QyZF5tC3sXAm8AGFsVXAEBXEJdDUMVB24UG10SWQcHUVZbAE8fCl8KGloRVDYyitPtY0JrQAYIYj0dXGZKMVc5T5Was35jYlMVXQUTZAQOch9SZTMNbC9gIGdQJi5VCzkRSCpfWDUXVAJlDQoCbw1gcG9qRwYdHnYyUW5aDEgn", + "icon": "/icons/ai-glasses.webp" + }, + { + "id": "action-cam", + "title": "运动相机", + "subtitle": "骑行记录仪", + "href": "https://union-click.jd.com/jdc?e=618%7Cpc%7C&p=JF8BASgJK1olXDYCVV9eCE0UB28ME1slGVlaCgFtUQ5SQi0DBUVNGFJeSwUIFxlJX3EIGloWXQABUF5ZAEsIWipURmt3CFhXIQkpbChuRy8JGDpRJUJQDwkbBEcnAl8IGloUXA8FUVtZOHsXBF9edVsUXAcDVV1fDEonAl8IHVwRXAMGVVpaDEsUM2gIEmscWw4GXFdaDlcUBWoBE1olbTYBZFldAV8RcS5aD11nbTYCZF1tCEoXAmsNHl8UXQQeVF1ZDE0UH28OHF8UWAIDUVddCkgnAW4JH1IlbdiMwDxcaAJfBTlNTRpCBHpHLhyDht8GcR8BHFIUTDZ6NSMpYRJweWtBfAUXC2JyXBkpfTNRWi1mGV4UAlgENFpeDA13cRRcTAJLbQMyU1peOA", + "icon": "/icons/action-cam.webp" + }, + { + "id": "drone", + "title": "无人机", + "subtitle": "天空视角", + "href": "https://union-click.jd.com/jdc?e=618%7Cpc%7C&p=JF8BASgJK1olXDYCVV9eAUIeB2YMH14lGVlaCgFtUQ5SQi0DBUVNGFJeSwUIFxlJX3EIGloWVA8LUFdZDE4IWipURmtCHHVEABsFVChPYRJAbVhlGRhbFRgLBEcnAl8IGloUXA8FUVtZOHsXBF9edVsUXAcDVV1fDEonAl8IHVwRXAMGVVdbC04VM2gIEmscWw4GXFdaDlcUBWoBE1olbTYBZFldAV8RcS5aD11nbTYCZF1tCEoXAmgLHlgRXgIeVFpfDU0UH28OHF8UWAIDUlteAUwnAW4JH1IlbdiMwCQvcipMBxJhfV9HGgF3FVaDht8GfxgBGVkRTDZUCjsVbzBTYRJbeRkWGG9WAx02D0JcUy5mGRNRFEJiUwgldStzfx1wTj1GbQMyU1peOA", + "icon": "/icons/drone.webp" + } + ] + } + ] + }, + { + "id": "overseas", + "title": "出海掘金", + "emoji": "◎", + "groups": [ + { + "id": "tiktok", + "title": "TikTok", + "links": [ + { + "id": "tiktok", + "title": "TikTok", + "subtitle": "全球直播平台", + "href": "https://www.tiktok.com/", + "icon": "/icons/tiktok.webp" + }, + { + "id": "cloud-phone", + "title": "云手机", + "subtitle": "用开源硬件打造云手机", + "href": "https://www.hackrobot.cn/", + "icon": "/icons/cloud-phone.webp" + }, + { + "id": "vcam", + "title": "vcam 虚拟摄像头", + "subtitle": "Xposed 模块,替换摄像头视频流", + "href": "https://pan.baidu.com/s/1NW4GMGA3cxfUQNWZPD9vOg?pwd=live", + "icon": "/icons/vcam.webp" + } + ] + }, + { + "id": "youtube", + "title": "YouTube", + "links": [ + { + "id": "youtube", + "title": "YouTube", + "subtitle": "全球最大的视频网站", + "href": "https://www.youtube.com/", + "icon": "/icons/youtube.webp" + }, + { + "id": "smmfollows", + "title": "smmfollows", + "subtitle": "刷粉刷量平台", + "href": "https://smmfollows.com/ref/dfugq", + "icon": "/icons/smmfollows.webp" + }, + { + "id": "yt-auto-dismiss", + "title": "YouTube Studio Auto Dismiss", + "subtitle": "油猴脚本,无人直播辅助", + "href": "https://greasyfork.org/zh-CN/scripts/557378-youtube-studio-auto-dismiss", + "icon": "/icons/yt-auto-dismiss.webp" + } + ] + }, + { + "id": "web", + "title": "Web 网站", + "links": [ + { + "id": "namesilo", + "title": "namesilo", + "subtitle": "注册域名", + "href": "https://www.namesilo.com/?rid=3bd4047mc", + "icon": "/icons/namesilo.webp" + }, + { + "id": "aapanel", + "title": "aapanel", + "subtitle": "宝塔面板", + "href": "https://www.aapanel.com?referral_code=wcn04vez", + "icon": "/icons/aapanel.webp" + }, + { + "id": "cloudflare", + "title": "Cloudflare", + "subtitle": "互联网基础节点", + "href": "https://www.cloudflare.com/", + "icon": "/icons/cloudflare.webp" + }, + { + "id": "ga", + "title": "Google Analytics", + "subtitle": "网站流量统计服务", + "href": "https://analytics.google.com/", + "icon": "/icons/ga.webp" + }, + { + "id": "adsense", + "title": "Google AdSense", + "subtitle": "Google 广告服务", + "href": "https://www.google.com/adsense/", + "icon": "/icons/adsense.webp" + } + ] + } + ] + }, + { + "id": "live", + "title": "无人直播", + "emoji": "▷", + "groups": [ + { + "id": "live-soft", + "title": "软件", + "links": [ + { + "id": "obs", + "title": "OBS", + "subtitle": "免费开源:录屏 / 推流直播", + "href": "https://pan.quark.cn/s/03e89f1bbc9b", + "icon": "/icons/obs.webp" + }, + { + "id": "ffmpeg", + "title": "ffmpeg", + "subtitle": "命令行视频处理 / 推流,Python 自动化", + "href": "https://www.ffmpeg.org/download.html", + "icon": "/icons/ffmpeg.webp" + }, + { + "id": "srs", + "title": "SRS", + "subtitle": "开源直播服务器,拉流推流中转", + "href": "https://ossrs.io/", + "icon": "/icons/srs.webp" + } + ] + } + ] + }, + { + "id": "pay", + "title": "支付网关", + "emoji": "◇", + "groups": [ + { + "id": "merchant", + "title": "小微商户", + "links": [ + { + "id": "nowpayments", + "title": "NOWPayments", + "subtitle": "加密货币收款", + "href": "https://account.nowpayments.io/create-account?link_id=3680795921", + "icon": "/icons/nowpayments.webp" + }, + { + "id": "creem", + "title": "Creem", + "subtitle": "软件出海收款,税务合规", + "href": "https://www.creem.io/", + "icon": "/icons/creem.webp" + }, + { + "id": "stripe", + "title": "Stripe", + "subtitle": "全球在线支付", + "href": "https://stripe.com/", + "icon": "/icons/stripe.webp" + }, + { + "id": "zpay", + "title": "z-pay", + "subtitle": "支持独角数卡 · 易支付", + "href": "https://z-pay.cn/?uid=22119", + "icon": "/icons/zpay.webp" + }, + { + "id": "xorpay", + "title": "xorpay", + "subtitle": "支持收银台支付", + "href": "https://xorpay.com?r=nomadro", + "icon": "/icons/xorpay.webp" + } + ] + } + ] + }, + { + "id": "books", + "title": "书籍", + "emoji": "◈", + "groups": [ + { + "id": "handbook", + "title": "手册", + "links": [ + { + "id": "nomad-book", + "title": "数字游民手册", + "subtitle": "复制链接后在小红书打开", + "href": "https://www.xiaohongshu.com/s/poster?bgimg=https%3A%2F%2Fsns-redskillhub-s1.xhscdn.com%2Fred_app_image%2F1040g4m8325ke1q36l0404a4druqrlvd5valvb80%3Fsign%3Dbc0c41c2e219f6ca904f52176bd17f54%26t%3D6c9a7a85&xhsshare=&appuid=5acc75ba4eacab15c751fda5&apptime=1790527237&deeplink=xhsdiscover%3A%2F%2FminiTool%2F6ab8984da1e3af0015584e92%3Fsource%3Dh5%26page_key%3D28%26xhsMpScreenMode%3Dfull%26share_id%3D5e90e5979b054c8baf8b3db4c8993d79%26share_channel%3Dcopy_link", + "icon": "/icons/nomad-book.webp", + "action": "copy" + } + ] + } + ] + }, + { + "id": "forum", + "title": "论坛社区", + "emoji": "◉", + "groups": [ + { + "id": "blog", + "title": "博客", + "links": [ + { + "id": "yidu", + "title": "异度世界", + "subtitle": "独立博客,Hugo 搭建", + "href": "https://blog.hackrobot.cn", + "icon": "/icons/yidu.webp" + }, + { + "id": "dsx", + "title": "大师兄", + "subtitle": "AI 实践", + "href": "https://dsx2016.com", + "icon": "/icons/dsx.webp" + } + ] + } + ] + } + ] +} diff --git a/src/hooks/usePrefersReducedMotion.ts b/src/hooks/usePrefersReducedMotion.ts new file mode 100644 index 0000000..8591ae6 --- /dev/null +++ b/src/hooks/usePrefersReducedMotion.ts @@ -0,0 +1,15 @@ +import { useEffect, useState } from 'react' + +export function usePrefersReducedMotion() { + const [reduced, setReduced] = useState(false) + + useEffect(() => { + const mq = window.matchMedia('(prefers-reduced-motion: reduce)') + const update = () => setReduced(mq.matches) + update() + mq.addEventListener('change', update) + return () => mq.removeEventListener('change', update) + }, []) + + return reduced +} diff --git a/src/hooks/useReveal.ts b/src/hooks/useReveal.ts new file mode 100644 index 0000000..a003190 --- /dev/null +++ b/src/hooks/useReveal.ts @@ -0,0 +1,37 @@ +import { useEffect, useRef } from 'react' +import { usePrefersReducedMotion } from './usePrefersReducedMotion' + +/** Reveal children with `.reveal` when the root enters the viewport. */ +export function useReveal() { + const ref = useRef(null) + const reduced = usePrefersReducedMotion() + + useEffect(() => { + const root = ref.current + if (!root) return + + if (reduced) { + root.classList.add('is-visible') + root.querySelectorAll('.reveal').forEach((el) => el.classList.add('is-visible')) + return + } + + const targets = [root, ...root.querySelectorAll('.reveal')] + + const io = new IntersectionObserver( + (entries) => { + for (const entry of entries) { + if (!entry.isIntersecting) continue + entry.target.classList.add('is-visible') + io.unobserve(entry.target) + } + }, + { threshold: 0.12, rootMargin: '0px 0px -6% 0px' }, + ) + + for (const el of targets) io.observe(el) + return () => io.disconnect() + }, [reduced]) + + return ref +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..33f95d7 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import App from './App.tsx' +import './styles/global.css' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/src/styles/global.css b/src/styles/global.css new file mode 100644 index 0000000..91c2bf8 --- /dev/null +++ b/src/styles/global.css @@ -0,0 +1,951 @@ +:root, +[data-theme='light'] { + --bg: #e9eef4; + --bg-elevated: #f7fafc; + --ink: #15202b; + --ink-muted: #5b6b7c; + --ink-faint: #8a98a8; + --line: rgba(21, 32, 43, 0.08); + --surface: rgba(255, 255, 255, 0.78); + --surface-solid: #ffffff; + --surface-hover: #ffffff; + --accent: #0d8f7b; + --accent-deep: #0a6e5f; + --accent-soft: rgba(13, 143, 123, 0.12); + --glow-a: rgba(13, 143, 123, 0.2); + --glow-b: rgba(56, 120, 180, 0.14); + --shadow: 0 8px 24px rgba(21, 32, 43, 0.06); + --shadow-card: 0 1px 2px rgba(21, 32, 43, 0.04), 0 6px 16px rgba(21, 32, 43, 0.04); + --toast-bg: #15202b; + --toast-ink: #f4f7fa; + --chip: rgba(21, 32, 43, 0.045); + --chip-active: #15202b; + --chip-active-ink: #f7fafc; + --topbar-bg: rgba(233, 238, 244, 0.78); + --rail: #0d8f7b; + --font-display: 'Sora', system-ui, sans-serif; + --font-body: 'Manrope', 'PingFang SC', 'Noto Sans SC', system-ui, sans-serif; + --radius: 14px; + --max-w: 560px; +} + +[data-theme='dark'] { + --bg: #0a0f14; + --bg-elevated: #121820; + --ink: #e8eef4; + --ink-muted: #8b99a8; + --ink-faint: #5d6c7c; + --line: rgba(232, 238, 244, 0.1); + --surface: rgba(18, 24, 32, 0.88); + --surface-solid: #121820; + --surface-hover: #18212c; + --accent: #3dceb8; + --accent-deep: #2aa892; + --accent-soft: rgba(61, 206, 184, 0.14); + --glow-a: rgba(61, 206, 184, 0.14); + --glow-b: rgba(70, 130, 200, 0.12); + --shadow: 0 10px 28px rgba(0, 0, 0, 0.35); + --shadow-card: 0 1px 0 rgba(255, 255, 255, 0.03), 0 8px 20px rgba(0, 0, 0, 0.28); + --toast-bg: #e8eef4; + --toast-ink: #0a0f14; + --chip: rgba(232, 238, 244, 0.06); + --chip-active: #e8eef4; + --chip-active-ink: #0a0f14; + --topbar-bg: rgba(10, 15, 20, 0.82); + --rail: #3dceb8; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html, +body, +#root { + margin: 0; + min-height: 100%; +} + +body { + font-family: var(--font-body); + color: var(--ink); + background: var(--bg); + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; +} + +button, +input { + font: inherit; + color: inherit; +} + +button { + border: none; + background: none; + cursor: pointer; + padding: 0; +} + +.app-shell { + position: relative; + min-height: 100dvh; + isolation: isolate; +} + +.bg-glow { + position: fixed; + inset: 0; + pointer-events: none; + z-index: 0; + overflow: hidden; + background: + radial-gradient(680px 380px at 8% -12%, var(--glow-a), transparent 58%), + radial-gradient(560px 320px at 100% 4%, var(--glow-b), transparent 55%), + radial-gradient(420px 280px at 50% 100%, rgba(13, 143, 123, 0.06), transparent 60%), + var(--bg); +} + +.bg-glow::after { + content: ''; + position: absolute; + inset: 0; + opacity: 0.35; + background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.55'/%3E%3C/svg%3E"); + background-size: 180px 180px; + mix-blend-mode: soft-light; + animation: grain 8s steps(6) infinite; +} + +.orb { + position: absolute; + border-radius: 50%; + filter: blur(2px); + opacity: 0.55; + will-change: transform; +} + +.orb-a { + width: 220px; + height: 220px; + left: -70px; + top: 12%; + background: radial-gradient(circle, var(--glow-a), transparent 70%); + animation: drift-a 16s ease-in-out infinite; +} + +.orb-b { + width: 260px; + height: 260px; + right: -90px; + top: 38%; + background: radial-gradient(circle, var(--glow-b), transparent 70%); + animation: drift-b 19s ease-in-out infinite; +} + +.orb-c { + width: 180px; + height: 180px; + left: 35%; + bottom: 8%; + background: radial-gradient(circle, rgba(13, 143, 123, 0.18), transparent 70%); + animation: drift-c 14s ease-in-out infinite; +} + +.topbar { + padding: 10px 14px; +} + +.brand-row { + display: flex; + align-items: center; + gap: 10px; +} + +.icon-btn { + width: 36px; + height: 36px; + border-radius: 11px; + background: var(--surface); + border: 1px solid var(--line); + box-shadow: var(--shadow-card); + display: grid; + place-items: center; + flex-shrink: 0; + color: var(--ink); + transition: + transform 0.15s ease, + background 0.2s ease, + border-color 0.2s ease; +} + +.icon-btn:hover { + border-color: color-mix(in srgb, var(--accent) 35%, var(--line)); +} + +.icon-btn:active { + transform: scale(0.94); +} + +.icon-btn svg { + width: 18px; + height: 18px; + display: block; +} + +.brand-mark { + display: flex; + align-items: center; + gap: 10px; + min-width: 0; + flex: 1; +} + +.brand-mark img { + width: 28px; + height: 28px; + border-radius: 9px; + object-fit: cover; + flex-shrink: 0; + box-shadow: var(--shadow-card); + border: 1px solid var(--line); +} + +.brand-text { + min-width: 0; + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: center; + gap: 2px; +} + +.brand-name { + margin: 0; + font-family: var(--font-display); + font-size: 1.02rem; + font-weight: 700; + letter-spacing: -0.02em; + line-height: 1.2; +} + +.brand-current { + margin: 0; + max-width: 100%; + font-size: 0.72rem; + font-weight: 600; + letter-spacing: -0.01em; + line-height: 1.25; + color: var(--accent-deep); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + animation: pill-in 0.35s cubic-bezier(0.22, 1, 0.36, 1) both; +} + +.brand-logo { + animation: logo-float 5.5s ease-in-out infinite; +} + +.menu-icon .menu-line { + stroke: currentColor; + stroke-width: 1.8; + stroke-linecap: round; + transition: transform 0.28s cubic-bezier(0.22, 1, 0.36, 1), opacity 0.2s ease; + transform-origin: center; +} + +.menu-trigger.open .menu-line.top { + transform: translateY(5px) rotate(45deg); +} + +.menu-trigger.open .menu-line.mid { + opacity: 0; + transform: scaleX(0.2); +} + +.menu-trigger.open .menu-line.bot { + transform: translateY(-5px) translateX(2px) rotate(-45deg); + /* bot path is shorter; stretch feel via rotate only */ +} + +.theme-trigger.spin svg { + animation: theme-spin 0.45s cubic-bezier(0.22, 1, 0.36, 1); +} + +html { + transition: background-color 0.35s ease, color 0.35s ease; +} + +[data-theme='dark'] .brand-current { + color: var(--accent); +} + +.sticky-stack { + position: sticky; + top: 0; + z-index: 30; + width: min(100%, var(--max-w)); + margin: 0 auto; + background: var(--topbar-bg); + backdrop-filter: blur(18px) saturate(1.2); + -webkit-backdrop-filter: blur(18px) saturate(1.2); + border-bottom: 1px solid var(--line); +} + +.drawer-root { + position: fixed; + inset: 0; + z-index: 60; + pointer-events: none; +} + +.drawer-root.open { + pointer-events: auto; +} + +.drawer-mask { + position: absolute; + inset: 0; + border: none; + padding: 0; + margin: 0; + background: rgba(8, 12, 18, 0.46); + opacity: 0; + transition: opacity 0.24s ease; + cursor: pointer; + backdrop-filter: blur(2px); +} + +.drawer-root.open .drawer-mask { + opacity: 1; +} + +.drawer-panel { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: min(80vw, 310px); + background: + linear-gradient(180deg, color-mix(in srgb, var(--accent) 8%, var(--bg-elevated)), var(--bg-elevated) 28%), + var(--bg-elevated); + border-right: 1px solid var(--line); + box-shadow: var(--shadow); + transform: translateX(-104%); + transition: transform 0.28s cubic-bezier(0.22, 1, 0.36, 1); + display: flex; + flex-direction: column; + padding: calc(12px + env(safe-area-inset-top, 0px)) 0 + calc(18px + env(safe-area-inset-bottom, 0px)); +} + +.drawer-root.open .drawer-panel { + transform: translateX(0); +} + +.drawer-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 6px 16px 14px; + border-bottom: 1px solid var(--line); +} + +.drawer-brand-wrap { + display: flex; + align-items: center; + gap: 10px; + min-width: 0; +} + +.drawer-brand-wrap img { + width: 28px; + height: 28px; + border-radius: 8px; + object-fit: cover; + border: 1px solid var(--line); +} + +.drawer-brand { + font-family: var(--font-display); + font-weight: 700; + font-size: 1.05rem; + letter-spacing: -0.03em; +} + +.drawer-sub { + display: block; + margin-top: 2px; + font-size: 0.68rem; + color: var(--ink-muted); +} + +.drawer-nav { + display: flex; + flex-direction: column; + gap: 4px; + padding: 14px 10px; + overflow-y: auto; + -webkit-overflow-scrolling: touch; +} + +.drawer-item { + position: relative; + display: flex; + align-items: center; + gap: 10px; + width: 100%; + text-align: left; + padding: 12px 12px 12px 14px; + border-radius: 14px; + color: var(--ink-muted); + opacity: 0; + transform: translateX(-12px); + transition: + background 0.18s ease, + color 0.18s ease, + transform 0.12s ease; +} + +.drawer-root.open .drawer-item { + animation: drawer-item-in 0.4s cubic-bezier(0.22, 1, 0.36, 1) both; + animation-delay: calc(0.05s + var(--i, 0) * 0.045s); +} + +.drawer-item:active { + transform: scale(0.985); +} + +.drawer-item.active { + background: var(--accent-soft); + color: var(--accent); +} + +.drawer-item.active::before { + content: ''; + position: absolute; + left: 4px; + top: 10px; + bottom: 10px; + width: 3px; + border-radius: 99px; + background: var(--rail); +} + +.drawer-emoji { + width: 1.25rem; + text-align: center; + font-size: 0.9rem; + flex-shrink: 0; +} + +.drawer-item-title { + flex: 1; + min-width: 0; + font-size: 0.94rem; + font-weight: 600; + color: inherit; +} + +.drawer-item.active .drawer-item-title { + color: var(--ink); +} + +.drawer-item-count { + font-size: 0.68rem; + font-weight: 650; + color: var(--ink-faint); + background: var(--chip); + padding: 2px 7px; + border-radius: 999px; +} + +.drawer-item.active .drawer-item-count { + background: color-mix(in srgb, var(--accent) 18%, transparent); + color: var(--accent-deep); +} + +[data-theme='dark'] .drawer-item.active .drawer-item-count { + color: var(--accent); +} + +.page { + position: relative; + z-index: 1; + width: min(100%, var(--max-w)); + margin: 0 auto; + padding: 14px 12px 80px; +} + +.cat-panel + .cat-panel { + margin-top: 26px; +} + +.cat-panel { + scroll-margin-top: 62px; +} + +.cat-heading { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 10px; + padding-left: 10px; + position: relative; +} + +.cat-heading::before { + content: ''; + position: absolute; + left: 0; + top: 0.2em; + bottom: 0.2em; + width: 3px; + border-radius: 99px; + background: linear-gradient(180deg, var(--accent), color-mix(in srgb, var(--accent) 20%, transparent)); +} + +.cat-heading h2 { + margin: 0; + font-family: var(--font-display); + font-size: 1.08rem; + font-weight: 700; + letter-spacing: -0.03em; +} + +.cat-count { + font-size: 0.66rem; + background: var(--accent-soft); + color: var(--accent-deep); + padding: 2px 7px; + border-radius: 999px; + font-weight: 700; +} + +[data-theme='dark'] .cat-count { + color: var(--accent); +} + +.group-block + .group-block { + margin-top: 14px; +} + +.group-title { + margin: 0 0 7px; + font-size: 0.7rem; + font-weight: 700; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var(--ink-faint); +} + +.link-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 7px; +} + +@media (min-width: 560px) { + .link-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} + +.link-card { + position: relative; + display: flex; + align-items: center; + gap: 8px; + width: 100%; + min-width: 0; + text-align: left; + padding: 9px; + border-radius: var(--radius); + background: var(--surface); + border: 1px solid var(--line); + box-shadow: var(--shadow-card); + overflow: hidden; + transition: + transform 0.16s ease, + background 0.2s ease, + border-color 0.2s ease, + box-shadow 0.2s ease; +} + +.link-card:hover { + background: var(--surface-hover); + border-color: color-mix(in srgb, var(--accent) 32%, var(--line)); + box-shadow: 0 8px 22px rgba(13, 143, 123, 0.1); +} + +.link-card:hover .link-icon-wrap { + transform: scale(1.06) rotate(-2deg); +} + +.link-card:active { + transform: scale(0.978); +} + +.link-icon-wrap { + width: 34px; + height: 34px; + border-radius: 10px; + background: linear-gradient(160deg, var(--chip), transparent); + border: 1px solid var(--line); + display: grid; + place-items: center; + overflow: hidden; + flex-shrink: 0; + transition: transform 0.25s cubic-bezier(0.22, 1, 0.36, 1); +} + +.ripple { + position: absolute; + width: 8px; + height: 8px; + margin: -4px 0 0 -4px; + border-radius: 50%; + background: color-mix(in srgb, var(--accent) 35%, transparent); + pointer-events: none; + animation: ripple 0.55s ease-out forwards; +} + +.link-icon { + width: 100%; + height: 100%; + object-fit: cover; +} + +.link-meta { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + gap: 2px; +} + +.link-title { + font-size: 0.82rem; + font-weight: 700; + letter-spacing: -0.01em; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.link-desc { + font-size: 0.65rem; + color: var(--ink-muted); + line-height: 1.3; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.link-arrow { + display: none; +} + +.empty-hint { + margin: 16px 0; + text-align: center; + color: var(--ink-muted); + font-size: 0.84rem; +} + +.footer { + margin-top: 28px; + padding-top: 16px; + border-top: 1px solid var(--line); + text-align: center; + font-size: 0.7rem; + color: var(--ink-faint); + letter-spacing: 0.02em; +} + +.back-top { + position: fixed; + right: max(14px, calc((100vw - var(--max-w)) / 2 + 14px)); + bottom: 20px; + width: 40px; + height: 40px; + border-radius: 14px; + background: var(--chip-active); + color: var(--chip-active-ink); + box-shadow: var(--shadow); + opacity: 0; + pointer-events: none; + transform: translateY(10px) scale(0.96); + transition: + opacity 0.22s ease, + transform 0.22s ease; + z-index: 40; + display: grid; + place-items: center; +} + +.back-top svg { + width: 18px; + height: 18px; +} + +.back-top.show { + opacity: 1; + pointer-events: auto; + transform: translateY(0) scale(1); + animation: back-top-in 0.35s cubic-bezier(0.22, 1, 0.36, 1); +} + +.back-top:hover svg { + animation: nudge-up 0.7s ease-in-out infinite; +} + +.toast { + position: fixed; + left: 50%; + bottom: 24px; + transform: translateX(-50%) translateY(10px); + padding: 9px 16px; + border-radius: 999px; + background: var(--toast-bg); + color: var(--toast-ink); + font-size: 0.8rem; + font-weight: 600; + opacity: 0; + pointer-events: none; + transition: + opacity 0.2s ease, + transform 0.2s ease; + z-index: 50; + box-shadow: var(--shadow); +} + +.toast.show { + opacity: 1; + transform: translateX(-50%) translateY(0); + animation: toast-pop 0.35s cubic-bezier(0.22, 1, 0.36, 1); +} + +/* Scroll reveal */ +.reveal { + opacity: 0; + transform: translateY(14px); + transition: + opacity 0.45s cubic-bezier(0.22, 1, 0.36, 1), + transform 0.45s cubic-bezier(0.22, 1, 0.36, 1); + transition-delay: var(--reveal-delay, 0ms); +} + +.reveal.is-visible { + opacity: 1; + transform: translateY(0); +} + +.cat-heading.reveal.is-visible::before { + animation: rail-grow 0.45s cubic-bezier(0.22, 1, 0.36, 1) both; +} + +@keyframes rise { + from { + opacity: 0; + transform: translateY(12px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes intro-card { + from { + opacity: 0; + transform: translateY(16px) scale(0.98); + } + to { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +@keyframes intro-glow { + 0%, + 100% { + transform: scale(1); + opacity: 0.9; + } + 50% { + transform: scale(1.15); + opacity: 1; + } +} + +@keyframes pill-in { + from { + opacity: 0; + transform: translateY(4px) scale(0.92); + } + to { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +@keyframes logo-float { + 0%, + 100% { + transform: translateY(0); + } + 50% { + transform: translateY(-2px); + } +} + +@keyframes theme-spin { + from { + transform: rotate(-90deg) scale(0.7); + opacity: 0.4; + } + to { + transform: rotate(0) scale(1); + opacity: 1; + } +} + +@keyframes drawer-item-in { + from { + opacity: 0; + transform: translateX(-14px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +@keyframes ripple { + to { + transform: scale(28); + opacity: 0; + } +} + +@keyframes rail-grow { + from { + transform: scaleY(0); + transform-origin: top; + } + to { + transform: scaleY(1); + transform-origin: top; + } +} + +@keyframes drift-a { + 0%, + 100% { + transform: translate(0, 0) scale(1); + } + 50% { + transform: translate(24px, -18px) scale(1.08); + } +} + +@keyframes drift-b { + 0%, + 100% { + transform: translate(0, 0) scale(1); + } + 50% { + transform: translate(-20px, 22px) scale(1.05); + } +} + +@keyframes drift-c { + 0%, + 100% { + transform: translate(0, 0); + } + 50% { + transform: translate(16px, -12px); + } +} + +@keyframes back-top-in { + from { + opacity: 0; + transform: translateY(12px) scale(0.9); + } + to { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +@keyframes nudge-up { + 0%, + 100% { + transform: translateY(0); + } + 50% { + transform: translateY(-2px); + } +} + +@keyframes toast-pop { + from { + opacity: 0; + transform: translateX(-50%) translateY(12px) scale(0.94); + } + to { + opacity: 1; + transform: translateX(-50%) translateY(0) scale(1); + } +} + +@keyframes grain { + 0%, + 100% { + transform: translate(0, 0); + } + 20% { + transform: translate(-1%, 1%); + } + 40% { + transform: translate(1%, -1%); + } + 60% { + transform: translate(-1%, -1%); + } + 80% { + transform: translate(1%, 1%); + } +} + +@media (prefers-reduced-motion: reduce) { + .bg-glow::after, + .orb, + .brand-logo, + .brand-current, + .drawer-root.open .drawer-item, + .theme-trigger.spin svg, + .back-top.show, + .toast.show, + .cat-heading.reveal.is-visible::before { + animation: none !important; + } + + .reveal, + .drawer-item { + opacity: 1 !important; + transform: none !important; + transition: none !important; + } + + .menu-icon .menu-line { + transition: none; + } +} diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..8db6890 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,30 @@ +export type LinkAction = 'open' | 'copy' + +export interface NavLink { + id: string + title: string + subtitle: string + href: string + icon: string + action?: LinkAction +} + +export interface NavGroup { + id: string + title: string + links: NavLink[] +} + +export interface NavCategory { + id: string + title: string + emoji: string + groups: NavGroup[] +} + +export interface NavConfig { + brand: string + tagline: string + footer: string + categories: NavCategory[] +} diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..345ba12 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023", "DOM"], + "module": "esnext", + "types": ["vite/client"], + "allowArbitraryExtensions": true, + "resolveJsonModule": true, + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..8455dcb --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023"], + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "module": "nodenext", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..9982072 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,7 @@ +import react from '@vitejs/plugin-react' +import { defineConfig } from 'vite' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/weapp/README.md b/weapp/README.md new file mode 100644 index 0000000..aabbb3f --- /dev/null +++ b/weapp/README.md @@ -0,0 +1,47 @@ +# 游民导航 · 微信小程序 + +原生微信小程序,数据与图标同步自仓库 H5:`src/data/links.json`、`public/icons/`。 + +交互对齐 H5:左侧抽屉跳转分类、整页长列表、浅/深色主题、回到顶部。因小程序无法直接打开任意外链,点击入口会弹出底部面板,**一键复制网址**后到浏览器粘贴打开(微信允许 `wx.setClipboardData`)。 + +结构参考 [nomadmini/miniapp](../../nomadmini/miniapp) 的 DevTools 接入方式(`project.config.json` + 开发者工具打开目录);实现上用原生小程序而非 Taro,更适合静态导航包。 + +## 本地预览 + +1. 同步数据与图标: + +```bash +npm run weapp:sync +``` + +或在 `weapp/` 下: + +```powershell +python scripts/sync_data.py +``` + +2. 打开 **微信开发者工具** → 导入项目 → 目录选本仓库的 **`weapp/`**(不要选上级)。 + +3. AppID:可用测试号,或把 `project.config.json` 里的 `touristappid` 换成你的小程序 AppID。 + +4. 详情 → 本地设置 → **不校验合法域名**(开发期)。 + +## 目录 + +``` +weapp/ +├── app.js / app.json / app.wxss +├── project.config.json +├── data/links.json # sync 生成,勿手改 +├── icons/ # sync 生成 +├── pages/index/ # 唯一页面 +└── scripts/sync_data.py +``` + +## 与 H5 / 小红书差异 + +| | H5 | 微信 weapp | 小红书 xhs | +|--|----|-----------|------------| +| 打开链接 | `window.open` | 复制到剪贴板 | 手动长按复制 | +| 数据 | `src/data/links.json` | sync → `data/` + `icons/` | sync → zip | +| 运行 | Vite | 微信开发者工具 | 创作平台上传 zip | diff --git a/weapp/app.js b/weapp/app.js new file mode 100644 index 0000000..370f7e4 --- /dev/null +++ b/weapp/app.js @@ -0,0 +1,15 @@ +App({ + globalData: { + theme: "light", + }, + onLaunch() { + try { + const saved = wx.getStorageSync("navmini-theme"); + if (saved === "light" || saved === "dark") { + this.globalData.theme = saved; + } + } catch (e) { + /* ignore */ + } + }, +}); diff --git a/weapp/app.json b/weapp/app.json new file mode 100644 index 0000000..30d28b6 --- /dev/null +++ b/weapp/app.json @@ -0,0 +1,13 @@ +{ + "pages": ["pages/index/index"], + "window": { + "navigationBarTitleText": "游民导航", + "navigationBarBackgroundColor": "#e9eef4", + "navigationBarTextStyle": "black", + "backgroundColor": "#e9eef4", + "backgroundTextStyle": "dark" + }, + "style": "v2", + "sitemapLocation": "sitemap.json", + "lazyCodeLoading": "requiredComponents" +} diff --git a/weapp/app.wxss b/weapp/app.wxss new file mode 100644 index 0000000..1d88009 --- /dev/null +++ b/weapp/app.wxss @@ -0,0 +1,80 @@ +page { + background: #e9eef4; + color: #15202b; + font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Noto Sans SC", + "Helvetica Neue", sans-serif; + font-size: 28rpx; + line-height: 1.45; + box-sizing: border-box; +} + +view, +text, +button, +image, +scroll-view { + box-sizing: border-box; +} + +button { + margin: 0; + padding: 0; + background: transparent; + border: none; + line-height: inherit; + font: inherit; + color: inherit; +} + +button::after { + border: none; +} + +.app-shell { + --bg: #e9eef4; + --bg-elevated: #f7fafc; + --ink: #15202b; + --ink-muted: #5b6b7c; + --ink-faint: #8a98a8; + --line: rgba(21, 32, 43, 0.08); + --surface: rgba(255, 255, 255, 0.92); + --surface-solid: #ffffff; + --accent: #0d8f7b; + --accent-deep: #0a6e5f; + --accent-soft: rgba(13, 143, 123, 0.12); + --shadow: 0 8px 24px rgba(21, 32, 43, 0.06); + --shadow-card: 0 1px 2px rgba(21, 32, 43, 0.04), 0 6px 16px rgba(21, 32, 43, 0.04); + --toast-bg: #15202b; + --toast-ink: #f4f7fa; + --chip: rgba(21, 32, 43, 0.045); + --chip-active: #15202b; + --chip-active-ink: #f7fafc; + --topbar-bg: rgba(233, 238, 244, 0.92); + --rail: #0d8f7b; + min-height: 100vh; + background: var(--bg); + color: var(--ink); +} + +.app-shell.theme-dark { + --bg: #0a0f14; + --bg-elevated: #121820; + --ink: #e8eef4; + --ink-muted: #8b99a8; + --ink-faint: #5d6c7c; + --line: rgba(232, 238, 244, 0.1); + --surface: rgba(18, 24, 32, 0.92); + --surface-solid: #121820; + --accent: #3dceb8; + --accent-deep: #2aa892; + --accent-soft: rgba(61, 206, 184, 0.14); + --shadow: 0 10px 28px rgba(0, 0, 0, 0.35); + --shadow-card: 0 1px 0 rgba(255, 255, 255, 0.03), 0 8px 20px rgba(0, 0, 0, 0.28); + --toast-bg: #e8eef4; + --toast-ink: #0a0f14; + --chip: rgba(232, 238, 244, 0.06); + --chip-active: #e8eef4; + --chip-active-ink: #0a0f14; + --topbar-bg: rgba(10, 15, 20, 0.9); + --rail: #3dceb8; +} diff --git a/weapp/data/links.json b/weapp/data/links.json new file mode 100644 index 0000000..1eb03c6 --- /dev/null +++ b/weapp/data/links.json @@ -0,0 +1,586 @@ +{ + "brand": "游民导航", + "tagline": "数字游民工具与出海资源合集", + "footer": "2026 游民导航", + "categories": [ + { + "id": "nomad", + "title": "数字游民", + "emoji": "✦", + "groups": [ + { + "id": "community", + "title": "游民社区", + "links": [ + { + "id": "nomadro", + "title": "nomadro", + "subtitle": "出海导航", + "href": "https://nomadro.com", + "icon": "/icons/nomadro.webp" + }, + { + "id": "nomadlist", + "title": "nomadlist", + "subtitle": "海外最大的数字游民社区", + "href": "https://nomads.com?ref=https://nomadro.com", + "icon": "/icons/nomadlist.webp" + }, + { + "id": "nomadcna", + "title": "nomadcna", + "subtitle": "国内数字游民社区", + "href": "https://meetup.hackrobot.cn", + "icon": "/icons/nomadcna.webp" + } + ] + }, + { + "id": "toolbox", + "title": "工具箱", + "links": [ + { + "id": "chatgpt", + "title": "ChatGPT", + "subtitle": "OpenAI 开发的人工智能聊天机器人", + "href": "https://chat.openai.com/", + "icon": "/icons/chatgpt.webp" + }, + { + "id": "grok", + "title": "Grok", + "subtitle": "xAI 免费 AI 助手,追求真实与客观", + "href": "https://grok.com/", + "icon": "/icons/grok.webp" + } + ] + }, + { + "id": "us-phone", + "title": "美国手机号", + "links": [ + { + "id": "1psim", + "title": "1psim", + "subtitle": "低成本 2.5$/m,支持 eSIM 和实体卡(邮寄中国)", + "href": "https://1psim.com/7GARRL", + "icon": "/icons/1psim.webp" + }, + { + "id": "yesim", + "title": "yesim", + "subtitle": "美国手机号,3$/m", + "href": "https://yesim.app/?partner_id=1948", + "icon": "/icons/yesim.webp" + }, + { + "id": "tello", + "title": "tello", + "subtitle": "最低 5$/m,支持 eSIM", + "href": "https://tello.com/", + "icon": "/icons/tello.webp" + }, + { + "id": "9esim", + "title": "9esim", + "subtitle": "让任何手机支持 eSIM,可写数据的 SIM 实体卡", + "href": "https://www.9esim.com/?coupon=XIAOSHUANGERIC2", + "icon": "/icons/9esim.webp" + } + ] + }, + { + "id": "finance", + "title": "金融收款", + "links": [ + { + "id": "wise", + "title": "wise", + "subtitle": "线上开通境外银行账户(身份证即可)", + "href": "https://wise.com/invite/amc/xiaoshuangh", + "icon": "/icons/wise.webp" + }, + { + "id": "okx", + "title": "OKX 交易所", + "subtitle": "加密货币交易所", + "href": "https://okx.com/join/84999861", + "icon": "/icons/okx.webp" + }, + { + "id": "safepal", + "title": "safepal (U卡)", + "subtitle": "邀请码 104809,出海神卡,加密货币与法币转换", + "href": "https://www.safepal.com/zh-cn/", + "icon": "/icons/safepal.webp" + }, + { + "id": "paypal", + "title": "paypal", + "subtitle": "出海收款必备,TikTok 提现、佣金提现", + "href": "https://py.pl/1tyAwY", + "icon": "/icons/paypal.webp" + }, + { + "id": "bmc", + "title": "buy me coffee", + "subtitle": "赞助收款平台", + "href": "https://www.buymeacoffee.com/invite/xiaoshuangi", + "icon": "/icons/bmc.webp" + } + ] + } + ] + }, + { + "id": "studio", + "title": "工作室", + "emoji": "☕", + "groups": [ + { + "id": "proxy", + "title": "科学上网", + "links": [ + { + "id": "jms", + "title": "just my socks", + "subtitle": "老牌网络代理服务", + "href": "https://justmysocks.net/members/aff.php?aff=12475", + "icon": "/icons/jms.webp" + }, + { + "id": "ykk", + "title": "Ykk Cloud", + "subtitle": "性价比高的网络加速服务", + "href": "https://panel.ykkk.best/#/register?code=xYQebIgT", + "icon": "/icons/ykk.webp" + } + ] + }, + { + "id": "vps", + "title": "VPS 服务器", + "links": [ + { + "id": "vultr", + "title": "vultr", + "subtitle": "可按分钟计费的服务器(可支付宝)", + "href": "https://www.vultr.com/?ref=8985003", + "icon": "/icons/vultr.webp" + }, + { + "id": "bwh", + "title": "bandwagonhost", + "subtitle": "针对中国线路优化的高质量 VPS", + "href": "https://bandwagonhost.com/aff.php?aff=25463", + "icon": "/icons/bwh.webp" + }, + { + "id": "racknerd", + "title": "RackNerd", + "subtitle": "最便宜的美国 VPS 服务器", + "href": "https://my.racknerd.com/aff.php?aff=15630", + "icon": "/icons/racknerd.webp" + }, + { + "id": "qcloud", + "title": "腾讯云", + "subtitle": "腾讯服务器,国内速度快", + "href": "https://curl.qcloud.com/BZZ2MBTN", + "icon": "/icons/qcloud.webp" + }, + { + "id": "aliyun", + "title": "阿里云", + "subtitle": "阿里巴巴旗下 VPS 服务器", + "href": "https://www.aliyun.com/minisite/goods?userCode=dii0ofzg", + "icon": "/icons/aliyun.webp" + }, + { + "id": "colocrossing", + "title": "colocrossing", + "subtitle": "美国 VPS 服务商", + "href": "https://cloud.colocrossing.com/aff.php?aff=1846", + "icon": "/icons/colocrossing.webp" + } + ] + }, + { + "id": "resi-ip", + "title": "静态住宅 IP", + "links": [ + { + "id": "iproyal", + "title": "iproyal", + "subtitle": "静态住宅 IP,出海必备", + "href": "https://iproyal.cn/?r=nomadro", + "icon": "/icons/iproyal.webp" + }, + { + "id": "proxy-cheap", + "title": "proxy-cheap", + "subtitle": "便宜的住宅 IP", + "href": "https://app.proxy-cheap.com/r/bmcMoY", + "icon": "/icons/proxy-cheap.webp" + }, + { + "id": "smartproxy", + "title": "smartproxy", + "subtitle": "静态住宅 IP 服务商", + "href": "https://www.smartproxy.org/register/?invitation_code=7RXPLM", + "icon": "/icons/smartproxy.webp" + } + ] + }, + { + "id": "resi-vps", + "title": "住宅 VPS 服务器", + "links": [ + { + "id": "lisa", + "title": "lisa", + "subtitle": "住宅 IP 服务器,TikTok 必备", + "href": "https://lisahost.com/aff.php?aff=7566", + "icon": "/icons/lisa.webp" + }, + { + "id": "voyracloud", + "title": "voyracloud", + "subtitle": "静态住宅 IP 服务器", + "href": "https://www.voyracloud.com/?ref_code=2LJPRTE5", + "icon": "/icons/voyracloud.webp" + } + ] + }, + { + "id": "hardware", + "title": "硬件", + "links": [ + { + "id": "rpi", + "title": "树莓派", + "subtitle": "无与伦比的 ARM 开发板", + "href": "https://uland.taobao.com/coupon/edetail?e=5hkWkiThOmClhHvvyUNXZfh8CuWt5YH5OVuOuRD5gLJMmdsrkidbOWBzzpT26idJPSbzO0ArF68ertbZl9wqRUbeJevxT02sHgNIxyFsmaMOsi2OxhyQb%2BhYUTTNN7GRRSHvQe2jOLZ9pbNCYX0I%2BPP%2BWUTgK%2F%2B0I%2BtaUgbudUxA%2B536asYsLWVfKa%2BhVnND4NyB1fwjO3bJLf667Yy8Q5jB6TX2HR3Qrq8LCw4Dujjqyaqc1rGLUwdQHHM8iY%2BUDMxLRSiIntldeBz90au3REAmOgZ0RtdnfeSBK3KXa0%2FA9snq37kKL6zL4bZ3EAS%2F2oYsLHTsIOxroXBFP6oz%2BA%3D%3D&traceId=213e032e17650447230113327e0c4f&union_lens=lensId%3APUB%401765044691%400b521400_0da4_19af4dca231_da77%400290EZjuZ2xbgOlH3NTYAyI%40eyJmbG9vcklkIjoyMDg3MTcxMDEwLCJzcG1CIjoiiX3BvcnRhbF92Ml90b29sX3NlbGVjdGlvbmxpc3RfZGV0YWlsX2luZGV4X2h0bSIsInNyY0Zsb29ySWQiiOiiI4MDY2NCJ9", + "icon": "/icons/rpi.webp" + }, + { + "id": "mini-pc", + "title": "迷你主机", + "subtitle": "具有性价比的 X86 小主机", + "href": "https://s.click.taobao.com/t?e=m%3D2%26s%3DCb1Quo%2F0Wb5w4vFB6t2Z2ueEDrYVVa64YUrQeSeIhnK53hKxp7mNFuhCZFSw9yq2woqx0EHqItb0JlhLk0Jl4eVWmNyHytKdTKJ80yOOA0Mtd0e5Ku7CIDk5ffgV5fRI1qrpxiwMoCNxc1AtbZGVS936JshS%2F%2FIdwgQgG5hIzyLNEPXytV9ALtCLThlbPuuZLb93Df8fOziGg7JVKZos%2BjLJJgRsfWlWtajntMnDLEHhuApO%2F8klJ62RdK%2B6%2FP7Z6k6s3rDgsC6jO9AJYjY8CXJ%2BwEVkOqHFPSJJXArlDuzso5nyPLY4NPiLqets6lIJ", + "icon": "/icons/mini-pc.webp" + }, + { + "id": "gpu", + "title": "GPU 显卡", + "subtitle": "AI 时代的算力基础设施", + "href": "https://union-click.jd.com/jdc?e=618%7Cpc%7C&p=JF8BATUJK1olXwEDUFZVCkkRC18IGloWWwALV19aAUonRzBQRQQlBENHFRxWFlVPRjtUBABAQlRcCEBdCUoUBWkBGFoSVAcdDRsBVXsQB29pbiZRKGMHKlclCEgVWghcGV91UQoyVW5dCUoWAmYPHl4RbTYCU24fZp-esLulkIK0yd6n5V1eOEonA2kPH1oQWQUFV19VCnsQA2Y4El0dWQ4LU1hBC00SCmcJK2slXjYFVFdJDjlWUXsOaWslXTYBZF5cCEoQAGoLH1kRQQYHV1lbAFcXBWgMGl4RXgUKUllYOEkWAmsBK2vL05J3IB9Uajl8UStqSz4dFQ9jitDJGTlnA2sPH0olImF5ECFaSU0VVAdNQDxuW09KFiw8SyljbW1jcih3JWNxNlwaS0hqWBhoX2sQbQEEVW4", + "icon": "/icons/gpu.webp" + } + ] + }, + { + "id": "software", + "title": "软件", + "links": [ + { + "id": "3x-ui", + "title": "3X-UI", + "subtitle": "科学上网仪表盘", + "href": "https://github.com/MHSanaei/3x-ui", + "icon": "/icons/3x-ui.webp" + }, + { + "id": "mihomo", + "title": "虚空终端 mihomo", + "subtitle": "代理软件以及配置 wiki", + "href": "https://wiki.metacubex.one/config/", + "icon": "/icons/mihomo.webp" + }, + { + "id": "frp", + "title": "frp", + "subtitle": "高性能内网穿透", + "href": "https://gofrp.org/zh-cn/docs/", + "icon": "/icons/frp.webp" + }, + { + "id": "wireguard", + "title": "wireguard", + "subtitle": "P2P 打洞组网", + "href": "https://github.com/WireGuard/wireguard-go", + "icon": "/icons/wireguard.webp" + }, + { + "id": "lineageos", + "title": "lineageos (pi5)", + "subtitle": "树莓派的安卓 LineageOS", + "href": "https://konstakang.com/devices/rpi5/", + "icon": "/icons/lineageos.webp" + } + ] + }, + { + "id": "gear", + "title": "数码装备", + "links": [ + { + "id": "ai-glasses", + "title": "AI 眼镜", + "subtitle": "第一视角拍摄", + "href": "https://union-click.jd.com/jdc?e=618%7Cpc%7C&p=JF8BATkJK1olXw8AXVxfCU8UA18IGloVWwcKXFlZDUgnRzBQRQQlBENHFRxWFlVPRjtUBABAQlRcCEBdCUoXBW4AE1wRWAUdDRsBVXtwXw1pZzNKAmZgFFwlYUh8UzVBZyZlUQoyVW5dCUoWAmYPHl4RbTYCU24fZpO9hbeBtYKjxt-jwInikZ-fjV8JK1sTWgIDUVtVAEkVA2w4HFscbQ8EXFpVAUwRH2wOHlIdXDYyZF1tD0seF2l6WgkBW3QyZF5tC3sXAm8AGFsVXAEBXEJdDUMVB24UG10SWQcHUVZbAE8fCl8KGloRVDYyitPtY0JrQAYIYj0dXGZKMVc5T5Was35jYlMVXQUTZAQOch9SZTMNbC9gIGdQJi5VCzkRSCpfWDUXVAJlDQoCbw1gcG9qRwYdHnYyUW5aDEgn", + "icon": "/icons/ai-glasses.webp" + }, + { + "id": "action-cam", + "title": "运动相机", + "subtitle": "骑行记录仪", + "href": "https://union-click.jd.com/jdc?e=618%7Cpc%7C&p=JF8BASgJK1olXDYCVV9eCE0UB28ME1slGVlaCgFtUQ5SQi0DBUVNGFJeSwUIFxlJX3EIGloWXQABUF5ZAEsIWipURmt3CFhXIQkpbChuRy8JGDpRJUJQDwkbBEcnAl8IGloUXA8FUVtZOHsXBF9edVsUXAcDVV1fDEonAl8IHVwRXAMGVVpaDEsUM2gIEmscWw4GXFdaDlcUBWoBE1olbTYBZFldAV8RcS5aD11nbTYCZF1tCEoXAmsNHl8UXQQeVF1ZDE0UH28OHF8UWAIDUVddCkgnAW4JH1IlbdiMwDxcaAJfBTlNTRpCBHpHLhyDht8GcR8BHFIUTDZ6NSMpYRJweWtBfAUXC2JyXBkpfTNRWi1mGV4UAlgENFpeDA13cRRcTAJLbQMyU1peOA", + "icon": "/icons/action-cam.webp" + }, + { + "id": "drone", + "title": "无人机", + "subtitle": "天空视角", + "href": "https://union-click.jd.com/jdc?e=618%7Cpc%7C&p=JF8BASgJK1olXDYCVV9eAUIeB2YMH14lGVlaCgFtUQ5SQi0DBUVNGFJeSwUIFxlJX3EIGloWVA8LUFdZDE4IWipURmtCHHVEABsFVChPYRJAbVhlGRhbFRgLBEcnAl8IGloUXA8FUVtZOHsXBF9edVsUXAcDVV1fDEonAl8IHVwRXAMGVVdbC04VM2gIEmscWw4GXFdaDlcUBWoBE1olbTYBZFldAV8RcS5aD11nbTYCZF1tCEoXAmgLHlgRXgIeVFpfDU0UH28OHF8UWAIDUlteAUwnAW4JH1IlbdiMwCQvcipMBxJhfV9HGgF3FVaDht8GfxgBGVkRTDZUCjsVbzBTYRJbeRkWGG9WAx02D0JcUy5mGRNRFEJiUwgldStzfx1wTj1GbQMyU1peOA", + "icon": "/icons/drone.webp" + } + ] + } + ] + }, + { + "id": "overseas", + "title": "出海掘金", + "emoji": "◎", + "groups": [ + { + "id": "tiktok", + "title": "TikTok", + "links": [ + { + "id": "tiktok", + "title": "TikTok", + "subtitle": "全球直播平台", + "href": "https://www.tiktok.com/", + "icon": "/icons/tiktok.webp" + }, + { + "id": "cloud-phone", + "title": "云手机", + "subtitle": "用开源硬件打造云手机", + "href": "https://www.hackrobot.cn/", + "icon": "/icons/cloud-phone.webp" + }, + { + "id": "vcam", + "title": "vcam 虚拟摄像头", + "subtitle": "Xposed 模块,替换摄像头视频流", + "href": "https://pan.baidu.com/s/1NW4GMGA3cxfUQNWZPD9vOg?pwd=live", + "icon": "/icons/vcam.webp" + } + ] + }, + { + "id": "youtube", + "title": "YouTube", + "links": [ + { + "id": "youtube", + "title": "YouTube", + "subtitle": "全球最大的视频网站", + "href": "https://www.youtube.com/", + "icon": "/icons/youtube.webp" + }, + { + "id": "smmfollows", + "title": "smmfollows", + "subtitle": "刷粉刷量平台", + "href": "https://smmfollows.com/ref/dfugq", + "icon": "/icons/smmfollows.webp" + }, + { + "id": "yt-auto-dismiss", + "title": "YouTube Studio Auto Dismiss", + "subtitle": "油猴脚本,无人直播辅助", + "href": "https://greasyfork.org/zh-CN/scripts/557378-youtube-studio-auto-dismiss", + "icon": "/icons/yt-auto-dismiss.webp" + } + ] + }, + { + "id": "web", + "title": "Web 网站", + "links": [ + { + "id": "namesilo", + "title": "namesilo", + "subtitle": "注册域名", + "href": "https://www.namesilo.com/?rid=3bd4047mc", + "icon": "/icons/namesilo.webp" + }, + { + "id": "aapanel", + "title": "aapanel", + "subtitle": "宝塔面板", + "href": "https://www.aapanel.com?referral_code=wcn04vez", + "icon": "/icons/aapanel.webp" + }, + { + "id": "cloudflare", + "title": "Cloudflare", + "subtitle": "互联网基础节点", + "href": "https://www.cloudflare.com/", + "icon": "/icons/cloudflare.webp" + }, + { + "id": "ga", + "title": "Google Analytics", + "subtitle": "网站流量统计服务", + "href": "https://analytics.google.com/", + "icon": "/icons/ga.webp" + }, + { + "id": "adsense", + "title": "Google AdSense", + "subtitle": "Google 广告服务", + "href": "https://www.google.com/adsense/", + "icon": "/icons/adsense.webp" + } + ] + } + ] + }, + { + "id": "live", + "title": "无人直播", + "emoji": "▷", + "groups": [ + { + "id": "live-soft", + "title": "软件", + "links": [ + { + "id": "obs", + "title": "OBS", + "subtitle": "免费开源:录屏 / 推流直播", + "href": "https://pan.quark.cn/s/03e89f1bbc9b", + "icon": "/icons/obs.webp" + }, + { + "id": "ffmpeg", + "title": "ffmpeg", + "subtitle": "命令行视频处理 / 推流,Python 自动化", + "href": "https://www.ffmpeg.org/download.html", + "icon": "/icons/ffmpeg.webp" + }, + { + "id": "srs", + "title": "SRS", + "subtitle": "开源直播服务器,拉流推流中转", + "href": "https://ossrs.io/", + "icon": "/icons/srs.webp" + } + ] + } + ] + }, + { + "id": "pay", + "title": "支付网关", + "emoji": "◇", + "groups": [ + { + "id": "merchant", + "title": "小微商户", + "links": [ + { + "id": "nowpayments", + "title": "NOWPayments", + "subtitle": "加密货币收款", + "href": "https://account.nowpayments.io/create-account?link_id=3680795921", + "icon": "/icons/nowpayments.webp" + }, + { + "id": "creem", + "title": "Creem", + "subtitle": "软件出海收款,税务合规", + "href": "https://www.creem.io/", + "icon": "/icons/creem.webp" + }, + { + "id": "stripe", + "title": "Stripe", + "subtitle": "全球在线支付", + "href": "https://stripe.com/", + "icon": "/icons/stripe.webp" + }, + { + "id": "zpay", + "title": "z-pay", + "subtitle": "支持独角数卡 · 易支付", + "href": "https://z-pay.cn/?uid=22119", + "icon": "/icons/zpay.webp" + }, + { + "id": "xorpay", + "title": "xorpay", + "subtitle": "支持收银台支付", + "href": "https://xorpay.com?r=nomadro", + "icon": "/icons/xorpay.webp" + } + ] + } + ] + }, + { + "id": "books", + "title": "书籍", + "emoji": "◈", + "groups": [ + { + "id": "handbook", + "title": "手册", + "links": [ + { + "id": "nomad-book", + "title": "数字游民手册", + "subtitle": "复制链接后在小红书打开", + "href": "https://www.xiaohongshu.com/s/poster?bgimg=https%3A%2F%2Fsns-redskillhub-s1.xhscdn.com%2Fred_app_image%2F1040g4m8325ke1q36l0404a4druqrlvd5valvb80%3Fsign%3Dbc0c41c2e219f6ca904f52176bd17f54%26t%3D6c9a7a85&xhsshare=&appuid=5acc75ba4eacab15c751fda5&apptime=1790527237&deeplink=xhsdiscover%3A%2F%2FminiTool%2F6ab8984da1e3af0015584e92%3Fsource%3Dh5%26page_key%3D28%26xhsMpScreenMode%3Dfull%26share_id%3D5e90e5979b054c8baf8b3db4c8993d79%26share_channel%3Dcopy_link", + "icon": "/icons/nomad-book.webp", + "action": "copy" + } + ] + } + ] + }, + { + "id": "forum", + "title": "论坛社区", + "emoji": "◉", + "groups": [ + { + "id": "blog", + "title": "博客", + "links": [ + { + "id": "yidu", + "title": "异度世界", + "subtitle": "独立博客,Hugo 搭建", + "href": "https://blog.hackrobot.cn", + "icon": "/icons/yidu.webp" + }, + { + "id": "dsx", + "title": "大师兄", + "subtitle": "AI 实践", + "href": "https://dsx2016.com", + "icon": "/icons/dsx.webp" + } + ] + } + ] + } + ], + "brandIcon": "/icons/_brand.webp" +} diff --git a/weapp/icons/1psim.webp b/weapp/icons/1psim.webp new file mode 100644 index 0000000000000000000000000000000000000000..a64841a19818f8ead26f500917662e3726997305 GIT binary patch literal 3872 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 literal 0 HcmV?d00001 diff --git a/weapp/icons/3x-ui.webp b/weapp/icons/3x-ui.webp new file mode 100644 index 0000000000000000000000000000000000000000..6ef85adf470884040df4309c59712843f96a0977 GIT binary patch literal 1458 zcmV;j1x@-=Nk&Gh1pok7MM6+kP&go-1pokW9{`;JDqsL$06vvKnnJis~G{>u7*{gU;r^dsm2`vKNv=mF)u?6>{G)?$Yi_ND3B zl%x12U|4d088_k1PV<}Q7JgB6N_48woGRBg`|V~K+Ju7wm!juYDVctiEB=`WYvEC2 z+7)>UaXq-#C0PZAqXzQr`Rd-UzD&k#jAGXx3bzspip6Yxt@h;A^vm zxW76{K&VPqC&()85IukoVY?z;o>-TepNof)S&fiM4Cr*b^>3Q=Ye#3B-fhuHmp_Vv z*ttPM|FrR~lhi*dzfBZYY_eGQm;YuS@GE()fW#aorR{~F3OS@Gc|0?e`j-JX$g@8w za*v=6w<8N{p31?~RGF`;0W22rK6GtmStx54R{2*dxY%|HZFuNn+s(0t#1A(se_D1d zLS?&6Pg&^?`NOMZTq7Ltjpxo(CPu(E2vo~LU6oNBLL~?0^>vi0iKvf$mC##q{_iCJ zEkf;6(F80}qDRdP4pBXT@Y;tlv1)8@a;#r z7|bL_gJh{G^!yM!HR85P%ZvAhWxmlsr8F@`Hv1U3j3iu=B8|&9j*cPm6N2s{9qn`; z;Dru>q*K!;evLatMeB%#EZ+jrnRShr^Q*47_{0bq56>*_+DfO&{}P~5X(nq)wQ2zvBbK|11-AVmv6Adopg zGq*OXRPS|nkSF9oBS9)zy#g+T_pjo7O=PEAz93ImPhD0q`S%A={PEXK5k#k$h!9qX zZvm*W*;4!tp`%H98iHSQU_e#z1dn7!P4~=sCTIU!xGVyH{#;l8Axtwo$;DlT6HffE zF+gQW{-Q`K+VGt7^&1u!SQAMW)Od|>ZE0(4XK;@9^{E_4tmtl-+RU>^+MfZnC_1;0 z;4(f%&+0W+cnjsf~OLH@Il+zw^-9Rm@O{{O~5waDcaTS|VtcPPThQd4XUk*yp@$fUthbYVv7 zSz#?$T>Yn|3dJ{!3Be~IqdJqu>fQpfO=H=@X5LcPhd@P=ePP7}6F-WTG5p$lH9uSTVW0K`k0$9ajS zUX~v8nL~%+Rfs*k*!4o3^&$F8`J3#w9v2LI&g(Ec>ZKFfE4?@1n^5mWg!K8-)LnP1 zu57XwU9AbP!CLVWu!P=VNq_uXax=&sIuL+)P)(sF$q5Rai~@d9w<~L!Sn`si8@L=* M+Z}8o9{>OV0OM`LhyVZp literal 0 HcmV?d00001 diff --git a/weapp/icons/9esim.webp b/weapp/icons/9esim.webp new file mode 100644 index 0000000000000000000000000000000000000000..e26050680cd9c270da0df759b114fff2c4346c25 GIT binary patch literal 1254 zcmVbQsU*fmd{RetmJgF}GKOtS0hTZ<{WxGAfcuCSzGT$TL zPa3ykLzC#+#Q)mxFS})zc+z`|a!=w*UL6^eC3-shfGf8d5MTgghx{!`J05oew$KK? zT}q82#8!TW{rD_X@{aN+kgMWQUjSk2QeO7QPkW6pB4Q*#bJX{V7tfHH|*;y&1&lj;QDMT}c6bH6hir!A00 zy&>(Ji|w4|ct+jd9ybqPUQ97M#V}UYx^!T+1N0W5S`rn@H8P;xhA&;D7i=L`>|>#e zGgTG&&sK_E1G2+>W+8d{S#?YZEQI1N%>>8yxf8yZZ`sK(k7TQm?O@dyCNkMhYOSbn zC`-XZ?ai=VgJw1i#SL(m>=nkC_B7=2yJn5}qbfIM$>&Zl%Y634=SJ-A|Cbd?T?Ro6 z9(L_};j#a@{=3waH&~8#jfE-j-fI)Fjr#|tr(hSx?nWlVQiRqb zB?Mo;GMTPo`Va~{#+f1W>7d{c`=1sl(+7_i-kmBC4q8Y@22>AfX(+=47Dd@ z?)I?d968;O?%IKoRa!y(91>#UC(l^8$RrZFRc+(|gq+w!|5yBHhQ3}imnR>IE`u!% z88O+vb=!>y@1@Z%nHiPSPzHR!nfxH&#XyyP?ThIRd{b~h?~p{1XJHa}FzSwQA4_nW zTe~J?M&%G;76C7Z2Lwtm1V%v|!&6VoC2tMz#jmGHsITjJXesAz9*V30N5B6;NoXrp z4*7qo7O?Uzmck#RnW5O^5IaRXGT!uE<`@SKD7m=rE$-lnjPeamU}&m@DnHE036FdFCU&{N% zZc4SC9nyRiU-~S?mj-yA-0?I#c!~$M-gSoEWaPIK0*6QX+)SfseJz~FKea$FwIe3g QDJ1~5>W~xY^peOx0K5!mng9R* literal 0 HcmV?d00001 diff --git a/weapp/icons/_brand.webp b/weapp/icons/_brand.webp new file mode 100644 index 0000000000000000000000000000000000000000..9cf906b5d2e09b9f2cf2fc37783b7f61fd438c96 GIT binary patch literal 2850 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 A#Q*>R literal 0 HcmV?d00001 diff --git a/weapp/icons/aapanel.webp b/weapp/icons/aapanel.webp new file mode 100644 index 0000000000000000000000000000000000000000..75eabea951d2d14ce0189d66af59eb3398a5db95 GIT binary patch literal 1970 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 YXR4yCLWJh%6GE0ZSITf_fB*mh0BX~9wEzGB literal 0 HcmV?d00001 diff --git a/weapp/icons/adsense.webp b/weapp/icons/adsense.webp new file mode 100644 index 0000000000000000000000000000000000000000..d6dcd29840489b7b879e32e0a81c2fb0a7127717 GIT binary patch literal 3068 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 KjXZw{2mk<_59l8N literal 0 HcmV?d00001 diff --git a/weapp/icons/ai-glasses.webp b/weapp/icons/ai-glasses.webp new file mode 100644 index 0000000000000000000000000000000000000000..63c57a12c1f41f3072141d81c7c489dc07198694 GIT binary patch literal 682 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 M<1id3000000H_F|5C8xG literal 0 HcmV?d00001 diff --git a/weapp/icons/chatgpt.webp b/weapp/icons/chatgpt.webp new file mode 100644 index 0000000000000000000000000000000000000000..4d86031239b0e670f3925eca522858e3297585c1 GIT binary patch literal 1378 zcmV-o1)cg*Nk&Fm1pok7MM6+kP&gn?1pokW833IDDqsL$06vvOnMtLjA|WcatWdBL ziD>{8z#XOkknq>X_qe4Daev2u0REGN{ilD$ep+xgfDfvj?D~gwEv{1_9;<)Qc-i`M z*e~^~txu&YEbNQay|2%vX9R*MZ~SA{t69x2f(c38T{HXcJBmk<6=_-%wgHQ@lIQT# zuT6IN-1KmV1NG0(?h|t+CqOa*uLPr1B~Te~gcL`Q%YL;S4*{;GT(G6i2Hq?UJJc0G zDMXiT!yL1*3Gc`W=m|n6$1*p>Nm)cML;!kY_LTqt{`>X_oOZ?UrtoT7w|d0c2ot;c zd|19hl7}W(9(^V}1p8?Q%Rbk$8bE{GojDIw!w8&|C+M32GQ)=LH@mF~9Jk9^lV zfm(!X)NkzYcdGjLO^Y(n%tQUdT%qOj{C}VidIq1U&+K`O_flzz>$A{J zn!ijec0pHgn|+GQE_F?7qGLWDgarSw zIRmP@Cw205REetpqMqAu^NB1#0BFXgQ_3rob3NX^oIk^VEO;B>8rI5+RidE9Gp$gm zZHr*xU-kIskVlo*ukQuYb(5`KW{d^7lSMPnEkVE&0OC9=EMvx@Id;p;X8oBjiYo%V z3O_xJXTqKo2!B0sKY4d35&Sz%b@<}vZOADR=fipzcH2#&35zTp9#u~OEjxkjx}7## zKzJgA{w>uAC9f*7fMHy&)v|m{EfO0B6>U>Fu_*d+7+;R|@c4N?<{vE24cBVfLfOPh ziKbL&<~y;_Ceze8ZyctT-droiXG|M%2%L7N(2YHnWvL)k>kgdA2ujpY$LcxRi)jjO zQqG&YsAFAMy!d8HmSIno&6Y>ug<_BY(;Y>>^cCG|CQEcM4cpD z?Mok0F^ysn3q^-Zj5_AhSx`EyQ}%-N8`lKLu?@A}el1!>=}vz5laz7+e9HaIl3Amn ztWjdOG)a_`C=OeegUE>U;g0f|q5x)%b}(qC+}~ZfO!$dIJr?ty1aH-*$$XgHwJQVb zWc9okPwD1?w?<8&?bx|VMuII=l8c}gA9MqE7Q|7}iqxdJwL^cx*B1E@QuFb%bz+g6 z?Xnru4lYkAkJx+c6+C;axw6h`u${F^#s=}an42W;PBd#FFzKqVAmUw|_7hHuvN-Gd zzg<3X$zgE*b$&F{rs_|`l*R)Zo4UM=^l$p;=kN*^?8Z%K*EH7UO9No@2bP)C+*f5G kr;u7Z$&}Og6z$nDtALJ*(NSyT>@1gySNl;c`gH&R0Ho%&tpET3 literal 0 HcmV?d00001 diff --git a/weapp/icons/cloud-phone.webp b/weapp/icons/cloud-phone.webp new file mode 100644 index 0000000000000000000000000000000000000000..34036ed163710ad5d5ee953993d49de017641883 GIT binary patch literal 724 zcmV;_0xSJeNk&G@0ssJ4MM6+kP&il$0000G0001A003VA06|PpNcjK&00DrSZQHWt ze%|-Pr4eaPa}uoZk3nPs*8zxRm+UUl-Pyulc``Td5itRH?S=9gnZ$rm5-ZO`EORL5v;8cy;LQPh>iitbasUFLJ#k#$0}um zUJ+DV-s3y`P7Xyrm*>63Z%G9QqeX!L z0RH@4GHpQEr7&{bS1{5v1QU0B<84%W9sh^cR}2z+86qgetLLWxBhVt`OaOO)0^@8R z1S@K_`7FpTSf<sO$C2=3X%iKO+8Z)s1{eh9jxw0MYHs& zeLQr^F}5KJfbkF>)Ge&(lGM6JbU@@S1f$*un7!cp*sr&5%OLp34gylMpq#$NP(}h% zKbHsKCUR?odI0@Ye^h)8bZ!UO{o@7B$&rN)+6jJzgg$rcl+GdkthFC5z7dF@LwWSjEs=GyKR3=$q5yrvsoIHO7FOm>i-6!E{<)<}+ppysTLzk$Vn zSLZYkqM)g}Cju<{k2X{zVCelMIg2fbz8)jvoMqHK24eYms)b{Q!H*!uzxoPqp5DEqSANSAQ5TOKMvyM-Ty4&%ekfZzE z$24lLHkMMNYIh5``DUh?l1g_oI1)Okqoc%}C~!3M$LjIp#trY?s-iwNJ)fj<1t2TI z@BjV$(#k&Njq(`GP6rM%Sy>sWiBZ?v9j%3|$u|Lt&Z~2(vm_|I9|wTwj%rF)gvAbF z0f~27$k`y4y=Xw%)lU382$ZG*Wt*PI1K?COaqbHC-FfeqGXay}Nn36T4BC0;KLY>^ zBJiiLAqPRpaUTKUeSWHL=DKIVsSl{lWB!mq7n1R;U zReB;QumkXpoU;;TzdMM*g95~~<1c2P3Xy{MvM~Emgp~OSn13&-t@jVL&xH%LaH96K zfTOt^v&1VlX{`um?#)JGowt1h+FPbIl@Y=him?`n`6M5#09H^qAhZGi01y%YodGIf z0AK(ad)FnW3CVTpe7(*C#CN3!m=CZIdoMxzz#Gb+ zxtJ-vsmPiidAvC?H^|=$aT#PQH0n{NT@1`E&X-K1h=KnI)39QG3tf%H$hp5%lvLDT0!L6z|p4GXTpyX7~X9`<%c43UAaU zPvqrAj--CP{fV})14>j^?@+l6(L(V>eYS;?QkIC@pGrb*65LNIL`Z+XY=k(ljm@h6 zpTNcK-$(mPU|LMm0m*LPfO8TPm?)7|gZ7)XN#EZf3>;QIIQ@b+o_~U8VbJl-H&EUo zF>3txzZ!5g;R`iVIlYbVx5m~NQQ^@u?gr}N^tQG3=OExS#z8My2D$P%;xnl|cTT!= zR1-OOBx44wv{?#}#m+bkm)~p-FsiuEtaKR^Dm(WXiprE=KVKw_9IM>^n&Cc(!+`b6 zRoq|DN>zlQQew!S((FnDAA~5zMJWXP^Id*xVLx(aO73MRI*z(`l>289zScJyVp&hr z!0~R!OGfUierE8>lgGi0@^0lz&VZNxRO*L9ity`tq=l?$<9Uk{#X7e~7$tZx!7ryv zt^Ss7@F-nk+ayGDqlBJ#LgO2=%eOpnAcdW~QIJ{-fhcOv$@Dn|!nf4;~H6rgUFkNMD{wIm;tic`ET)FHTJ#uU6Ad&n|I~u6wNA~q% zC3TFjqfp}?$8%8@Dv*jM@)zqh$wNH+E6!xuaeqB3^}5*Yt5O6Nx6W`$X8-y;mcXCb M6S3Qv5C8xG0INuR_5c6? literal 0 HcmV?d00001 diff --git a/weapp/icons/colocrossing.webp b/weapp/icons/colocrossing.webp new file mode 100644 index 0000000000000000000000000000000000000000..06dd41c529e2c28287e90ff546844db4b9b30ca0 GIT binary patch literal 2270 zcmV<42qE`UNk&H22mk1QPgpbfZ)?u1&%UWrouwAud*!U&JhCjyQdk|2u-?p5mStIT zt7XPH!zx;;F7rZ9FNZ-ySVcJ9!@Bh~jII{e%~uQ1VJ+(Ca{gbxa=)mh9Qd`YE@s7JSSj(C8kXm}}3rB6S+2NmhK`p&72Z!LR zYU=YOqiz@-ujw|N4`_jYHWdSi;|EI(u8H?%qyaUHkF0=!vD9^~mL6Chb0)kly)h1> zezyT{S=Pz&`5g5E0{&X1*km<5%V zv5yMvMD$`T^P==oGN;lqu94mvOX5RnYw!LIFlAKQhM;@!2kG;8FTo+w8)I?0I?FvR zox-C0Od6h!_v>a3k?vjut97XKXd-$@d_npeiJFOzOWz>lR%vh|)~^9>l)gw%(^);& z;7Yw1{82iAs1qD24VcrA1}F9F4ZXn!rR&J*O&`?!RY|=pa+h>SJ!k8x@2ki+!Ta;3 z3O+1-lBhRhSR<2(UTi=*tX{B-)Nto~E!3H$e&t*y{oSY=Y%aaLXfFiclWri@Nn9rV zio_<$b%$AhUe_~hBh8JA5$@U2nJv*_Y*aB zJVD3csyNlohVx53uqp;%tp1RS_9i$uQ(jh6qnE9M(HX0M=uPe1#e%KptKI(bR?8cU zOg-y4E!0%wBVk9HX4n_z^%WVfCXolDz)&DM&r?@O68{zR0gZw zt+H9DYr8G&Kw_0w^)L|3{7tFqQZF8X8y)v3S7oW8xj4agkE&E3?FyF2f??{AYZ2o^u^JI@Y}jt)KX zt-Ujxn(nM{>~|g?S+HQi=!?I-YI6sS75@CxPdji2UwQWINf{7ywc1p=fsdavXPkjK zwJiW&dG^dXV*?-zz|1NjoJvc^zc!po4|=xbR9g!AY36RmzoEIi8~rtNcjy0%1y)cv zAOHja0I(APodGIf0AK(iQbi{3jveY5}o{`_3f0DJC+@zjC7GV&kieh^p7`ah`Le4z9&HpU=CHvFIG zA$AAjMGHfe;R7{qlp7Sn4YPLshsk2`D28=+M9e37F^-!vtsN0ODt=hrh;BCq^Y!C6 zXPW;)Zk?`taMB}ugG&|aaftA*VRjLl#`n)L7zWlG%zl&RSr3M1X5qB+}oZms_ z(g9!yMzh3OKY0qO%*|)6#`4!9SP+&@-;nrw<75S(d)Ma&6$>Cb4py*B zjp;dBH+1@auu?ztZoMFcr0ubb2UXH3 zoRT7C)`9qJ+wXiP^Obq`$irYk*J+RJ8$$!2FQbo*Ivf~V4<|o8CBG>|nf-+*U_1-k zpXHp%y~0ydw~XGdAud>dkk$v{-VV1QeBZ}oL4LV;ldGavIQ$8^vlTKQldu4~U?BOv z`M$zXvrPV#csh!4@%Nb&eU@0g%k&NZFKL%M|iEV%@UQ&Dr(I8hQfTGKRp7*#Cd|KJP-?FCSX}gD& zRG|%VG!JG6$^l3PDy0|fEG4ot{P^$H5ORa!xG%C**^uzjxf9_`G=|NEN`k^VV7_3s z@~DW7)HcH?KM)IVEG{=KH?ooqUu$zq5Bp^`t>JjmBn`RQsy=YCH4Ez6PC}$4|M6=L z4g%|(RJJDvJJ=|0=eZqBLD1K{C-oO+?qE7BK<}!NtWSwlam1r0gi5W(KRBn8A<_qD zHGKoHF$raj8gs?v%S^ulXm1UV$5|CP7BNnYC?D&d4Br0J09gOMjXqf?d^ipEW_vrg zV_rjs7;Sjm6Vtq*P!{=g=`>F@l_Dy{cU6Qzg+&tLFL#q!{gJHXd;awI#nOR~y0G(89v sF*D;-M}>)6naJ7(;f!)CkEtQYa>xEgNhzsG;svFGS{1_swMYN}0Q^O4vH$=8 literal 0 HcmV?d00001 diff --git a/weapp/icons/creem.webp b/weapp/icons/creem.webp new file mode 100644 index 0000000000000000000000000000000000000000..f8b751ecf8a21e654e78c5726542bad5b55c169c GIT binary patch literal 1242 zcmV<01SR`YNk&G}1ONb6MM6+kP&il$0000G0001A003VA06|PpNZbPe00E#xYkQ$V z`YP47?e4K{8#~*!ZQJ&&?3tx)+h*ISAQmbA?1Vl-a>NX%{oZ94~7rUVR z0WD4Hg(>T91jkcqcOz|O;T?c6vEw2AZe$+}bzfz}4K~lyV_J$j%_6?UW zsSxcueC-%uR4=bUCZy6a|1v|hvweMKGI5o5?r6>9!qjC0$7SerIB0jqf6GL-g6Kmm z;bvcqr~PJV(p*?p?~CzJv>94;iAR7Pw)LK-E_4W%02%OiA1Y$sua7{3#cNb}?MPHv z+Kd6QR?vVyLJbakHBr(g;0(>;4HEpwC8&b!^B(?*zX+S79a@jp7)H+k2aoKe=8+lN zIKvl*&w5fJz!k8;L;GWJ^Uz9qL?0Fh)@BpOm}wDQ>|>RMU~PWYU1S_x=*pnXm_3P1 z^LTDRrOiWXuascy)ClhMG5&wBvhGnJUlu{NmXGsLWuZu(9>J5%R?vW-6}(S4q@+az z?o`s@u@VRBtWKtZ+MV>PB)FfAB9adY%PrLKrKbBaW=jtP!TxNn*oT%r)=&5ijtGp<+-A{vu)y#!))4&RPw2Hp_wV;aPG#*037U~%S zR5R^!*tgbPD_fDPQ7MeMycqi*I7tsw$y-EW%w?8mfVEe7xdK!rF7vvdW?be8&V+p&( z-ejefI1J2;`J0lVc6LMCy)x~eC)e=yc8b)m5BYmLMbr6Iw)}th1ubRk1XfTuAkY8+ z0I&)GodGIf0AK(2HM&+YudO~?|#iMn|1(n$5=qamugVip+vanz;`qhn%@7>{52HGntJHWdC!=CVEUUDz$Tu|wcng5WVs=a{7MI%7tiMKQE*$u@!clP~>0sH6| zyng}&VBskRJ-bDZ6I>yAwOSE<6IyoEaV|;avtE{urQc>c`qSx%h52INyfdJGTYgC6AdpAAYJlsg#`-l&*aR6Yp(<}BHb;Ok z-7ouO1#RNNQTwn&cQ-q!3cjFZlwp*lg04lySiMvNiKfCUY=gaK8DPhT$>2374On8K z$fIYS_E{|T^^YPGV8a?(TEV^eI#Hadj@h$qlI-`kz|3-w#~A8MGVi=KEJ6fvNkuto zPj7T6h1TDC6eJQhA9;p)$z}Qs$18TJ`;Qb6PUeYteBZGHbZ`LUi9xP2Io^J%IW&KJ zXA{tjW0b1}*mdM7v%Tm3U;$7m&$7{c2Dha<)(k0J`m@P=imwzXV^@jw?LvC5Ksi{~ z>#mzt0$Z(8^{@fiwjx!mhP*DbPAboWXjyj0z9fLA3O!FwYi-yp?_FY*8NaYdZ7rlr zq2tHIYFu7vi^dNbpO$I=sObDfo0JS!RM!jP`9Me8&j>>bCRt1VS6ZmDGXMYp0002y CN_EWu literal 0 HcmV?d00001 diff --git a/weapp/icons/dsx.webp b/weapp/icons/dsx.webp new file mode 100644 index 0000000000000000000000000000000000000000..de1e117cabcf7c8c50034c8eeeb6a7470bdd5f73 GIT binary patch literal 2212 zcmV;V2wV43Nk>2mk-_I zzu>KJNdxq3(AU;}!T+!waoZFnv6#E?@v$26EsUK8?uo7s#&Fu7TZ7@5MZV&I^v&u; zKH$#32_KRR1xP&$DQXPc1$`BJ%tS6;UHnC;o|4>7R~9fqK5hK(p&8b-1|BDH?@3>V z)^_8kvdijg5IN{Q9O9c$iUV`RcepQEgRKcjByukh+}hFt%fVvW6i!8`UvD1#Y}vQO z_mZahy{vgBKvtKe`I9pJu)erg-M>pTt6?j#q z&0;!;JH)U6{_k$)?!f=WKfi9L@S(u8$R$6Rr0Abqd;=w_0PL{IHT><&;@P2AvLBRB*xfp`puWDb~G*P%?uHcPrZ-I~G?6u(?36w&%B+Y$g z%Y$X%pW}) z8K7kc&5z%))>oLNd>=|KopWxj_*l>vxu?%2bEsO>s@*_yEy36sVI)uO`t|j->mBq? z#j&t4*C;_n(PI9c4>g?#321hwH25@V&iA^!OWMG3j{y!3)jxMQnfUQ-(IFA#?t#-u zZhE5!iJ|D%y!GI$&(HzErZ|)MZa9Yd@5ziUZ0$m%*0fpk9;_gC#IP>Os|O%D&PVou&WEQlFljisXs!t^>bqU&7j|Q14LcuNuE#KNc{gBf9gb zw$MrOb+4-8`$Io@4SmsLa06B-vIkY7q{#A0u&^D_efY_$>G{Z)UoFT;u4+W>n?0Vo zT@B9%qWI%^?{hJVY{T8>A5q5j1*yngp7VBYj$?2qu@OAF7(r{C6hbtec|ZHtRE)TO zMJXnmw<&Y=SsK+J|9so8`;>_CNckAn%4dq?4mZ2d7X0GdF3N3oT_{%*7zlTA%j+|C z0TmemV`Ow5*;R-gOFoSVl)92zc!Y-zaj7vnP58~W%=wCE6!uBpDsPX$>spYp9)N

1fWNt+unp2;7E{CG3Tu68ZTpgjQ4)&1rIj zU$=tHz0#C3PjUNRRCFd%L(o*uZs170n%eJdz4SwlzW$O>E0VoWHH^I}>zTHV^>l}^ zk@l-u6C-Q-(@zu-=Jg)pRPsxlrdy}b!O;2Ejtx0)(cQRXjsPoZ2m3?0NNm8al5>Zn>P|A~8 zwe&s;T4fUP2ypzYI*zN>3EFA*FA>k9KRR^}Go?@`v;3q4rwL0MW9pP>Mmu z&4=9o1GJ|n3}OHJ+j0gd5WegKBrcLL^Kzeg)bwHk1evuwBERcff1gnO;}nLS2h?Lj zvL{6`9ji`rY@CNbs>G@98ScAc>*%(VInfMR%M;IM6EJ?3nd*i91%=>AArJj@f%Bv*gzWA&hHg{|G?h-b^^mk-w3qx_!f91{#uf62NCU%`Q zT1R2Gay#m5847K+DWuuU0RIyw`>2hzxUGHBDaw+KrbRH z8LM!3U6c8c3$Q;XmU4-Dnp6tpt(!q5JPv_gKB~#JwF&D{qpH=EQd!Z(b;!^cZw8EQ zrz2tu{3gz8gbdh%paLY|L?5Dx8B}cGWNJ3X#a%nhaUY@F4xj&E(KQahDzou?=V36U zeH)No|+gF3a6 zL2j>1e}LMr)u2GlSY#pcrZucji_s)aeXfE%FE93GUy+HC>z&uOpli@pwT?=&*uXs4 zLE68zalj|T+NLX47Dy4qguSn}7tKlFz{Mq%m3@SA_nYy8ufG!!Nz->Lwh*nZ%;gGr zd;mb|@=^L+h8B8Dsxb#Xt+8D1(ui(aaY%R==e84DaolW}V#C$X^!EG^iT=7B zhEUMKaH;lolfCDW9l)@(3^a2}@@@*tQTkh7RDbBBuyGr3hrO{wdXKAt7k- zHu~uUDlL_@1cUBGWg!<37AGW2}Z@RQ0gqys!Y mfcqLK9_w}p%-+o~|K=>o&@MuBZ1nPkt{05?z)#l3xBvho-ewE{ literal 0 HcmV?d00001 diff --git a/weapp/icons/ffmpeg.webp b/weapp/icons/ffmpeg.webp new file mode 100644 index 0000000000000000000000000000000000000000..8599db3886c7290bcf2adab963ac170ff6142745 GIT binary patch literal 1200 zcmV;h1W)@?Nk&Gf1ONb6MM6+kP&go*1ONcA766?ADqsL$06vvMnMkFiA|WcdT==jO ziDm%M5V=xPS>T@mUAlf_KVUs?wB$FX@DwyNWiL4nCS~}+Eh)1)@&TwXNyKTXh+6*e zu4y&%5V5e992$cYN_ZP9=JK}**yC{vGRA4N@aRFksn&hVoDMVTZ(}oi)PUJwR2#!y z#x3-X7z6gbND`|x04Ve%Jq_5hT*}`8H>aW45CHMr5`zTTIJ8Eg^vluO$(h_=y>h+$Z`sp;t{V8jJYsB4n)^2WzwuFT`(;K7!h%6BA7g9fQ@<(cM!Gl5Rv! zkcLN1DO+-V`8-e4MOw5hEhjHOe;7jsW{ah(DZexvpIgL;sLbHB zI!xeSys>vUK32p)#Rn$m)W9oUsMnr|eFc{kCIo7=_ADyMWh#3xxx8s+IVT&TDtIjw zRvOYA>P%MZ>4ZIZW+9q$+8HFa2dHabM`l?`JK;tahqhU}m%?A3-Epw(1Cj*{HfSTp z(dbK&ewB<2*+}22Gu=SPfTJS+Zga%YP4%;;A#*44zgcBhML%6fgCT2$k%0 zNObx}65-TBxQ{n(N&=%vpqy%yg6F+8y+7KbhmQ+J;qhzx18DG*N|4zlio zkr}k8hGQpbGIu?6PBC5c-N2m#5_mV-sXJ-6jl_7&US&4OKr1QzIVZ?L%&T@(fSy?$ zG{Es58a8ocR2Gz63yk)nHzxku7y+&&MagmMrt@=u!(7ZRg1N=x<(tC{xKf;cIRpNXkI$2ed@#6_w?ceP@0Y>;G44DY{87f9T8RZadTNen%X}_KURH zpWmY)Sn49lL4RBd`xwy9zCr{SXyl>&!_;25?ADaO8(;iYcC7VCFv#Sb&zz(Ykq28Y OAcGwATbrN-{r~_#B1|&? literal 0 HcmV?d00001 diff --git a/weapp/icons/frp.webp b/weapp/icons/frp.webp new file mode 100644 index 0000000000000000000000000000000000000000..c6547fe433248c3b777a6a63b6b6185229559da7 GIT binary patch literal 910 zcmV;919ALPNk&G70{{S5MM6+kP&il$0000G0001A003VA06|PpNZ$Ye00DqwZF^$n zO9pp$uiR}5v{X*V9$13bv@C#{EwBPQI(LV$do%g^KdI1&m;iiBSF&Bukgeq@RCNk& zE`gS&vHlQ+k=VDh4Fs|j>K|z-dL0F#G97EW){rK1(=h210F5nLx@oxw1(6dgOHMAXOhKrE zyGjTGckvw^09H^qAbVn?METO<1*$0xVn4zLWJ%?Dm!{T+abGjZ8+Vcw;Xbh(iPLOj7W(g0 z#b0~t6nW16UtA+A{&VX^m3wt$^&-CVjL2|MA2r1&s&7bD^)DhK$JA4KwsNZ^E&j z($tKYSLFJT%+C%jw|Ay(k>8w;BB7hhx_^kPFoOp~zQ!B3GPa!Qu--nfsk8+7W*Qr2 z#Fu+aw>4Iom(3C$=jLJoE4qf~4G{q~Eq2IIYIknwwG(=X&n=(*>%aQL0w7=W=-XH(~0Du^{!vFvP literal 0 HcmV?d00001 diff --git a/weapp/icons/ga.webp b/weapp/icons/ga.webp new file mode 100644 index 0000000000000000000000000000000000000000..4bc3288e8dc2efa051798c5b31644878c00517b5 GIT binary patch literal 1876 zcmV-a2dnr}Nk&FY2LJ$9MM6+kP&il$0000G0001A003VA06|PpNQMLe01fbMZQI+n z*|r_$Re%eHRW)_}*Gs*#fdH;{PLKlN_)6|N5fKxBe;*PFB4!ThA@B(+t%-wk>G`(Q zS`mBSb;)6nHq}B)FhC(5cCC%+ATWUIn{|~--?Nl}-#$FrbT9yztDAYL$yydt2;M(G zZPRfoZ%U&g00mH0NkqHd+L#PIyD)Gq<6FI`S2OqYXp@m$uC+Zf2Ih;K3;+DkrenR7 zt;OKQqN4qFmyXpETa3&XlKr7eg$l=>y>D>-<`dzwQmmxFa*FqU3Rs?W;22=3k18h%mPe5 zovv%qv?GAE5}`drCeY6(iky2pN|gp(B`OnBp%^N+9@A zq%}F`ohPNl1Ww2knuY)#LjsXUK?pEAXG!NYK_?XeA~A&kftd#(GKgqYWC-HcA~RxK z@0G?W(*yvRFg$t>tudBuk32)uAur^Z7>>wt0MYt-0_THJYFOwyGQ}vdJH*<+ZctQW z47#543_v(`W;V{YJqsGqv?xk7fC+%#9Z@TwIcB*T6OJvJ5`a52T+h@9-dT^ae%HjJ zE(Z_*eqrcL0N5Vwd?AK4yN2e=ldlctOEbtH-(yjYvYSn;7qbBXj*m94Gn{tMZ{pWq zhHc+B;<5nHzkJ4v>tfj5Bj47e{MRmIML8S7PoJS);H-Um#?|lHkbSdlloluNAF*Dq zXvp^QUEF4)A|Lk0p3Axrd?Nj8@Abl*^PgWG)Nh#wF(|f&BXohYq1ksfh-H=$101N? zMHnSU0odL>ba`E9DFxf+7jyI##gyG2Vi&q(B`vD0toid<-e8y zPZ50k;v(ZLLm3QYgyUv!A#j!ihTCR)h+rlFU@`(f@N?I>z>$E-*-%ToV6?;6h}^)WNyP zn3$apj7b4jP&go<0ssKe5dfV5DqsL$06vvKnn|UmqMy<%+W;@t#`M$W< zsjixA2DG2o7r!l#Q2BGdBZ6W-YZ}n-r|s(ODD%VD>lOV z^}W!(cs*Qp;IW^=s+Wl^Z>5QTMU;jYX-&x;@OptHb2vnO9U@6-6}?Wx=A-jSKIe$6 z>tea&uN^#52zdT?I1`fmec9G?D6m$WzZ?L60$>4?zM8OC>`fY=yYJE8#JwU5|KNWQ zfnZG%FXR42kRu#1N3ymj_{_dw!$c8Bck>HwR!);_LKM_aIeFy!s1BjJs2?>$hsM7D zZ~x;)$Xn0M@00$vl?~xj_=V0b+dv+-%T=XSq`u2v7NWq|L%}-^Q<)fu`Nc0N+J$APR>^t860a0!=C zO@OH?kLK4~686>1U6VeXgME4oSMs)PO9~F{_w#7LFr40Ovx{&=jUa9LA^M(UCb0Jn zibLg*jUz!n1%Qj#^F#>zaKAct3B+DxCak;pDBFbg%6ZD==WZeN_COppM;WyO-Ru@n OZUU?^H(q~_7ytk}D|~za literal 0 HcmV?d00001 diff --git a/weapp/icons/gpu.webp b/weapp/icons/gpu.webp new file mode 100644 index 0000000000000000000000000000000000000000..4e0757ecc0a6bef81cc13fa6c543a78508b1833d GIT binary patch literal 1070 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 a+K~jR{83*OOn>;O^U@*omA!mQ00012a%fHf literal 0 HcmV?d00001 diff --git a/weapp/icons/iproyal.webp b/weapp/icons/iproyal.webp new file mode 100644 index 0000000000000000000000000000000000000000..22747a153904c606cf0c86befc43e56be5e841e8 GIT binary patch literal 522 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 c2@^y3P`XL ziDCfOUqGkZF$NkC8*aagdI0lv^dJ5|d{@u|%YWGm`+acQ^>@MA*LYhaaWkZjX+BIf z3{;TEh=d|GS9`u}kB((TUFJCSJIzfFDB-tWJpd=xz}Dj4f)>TW7w z-*c7CH~8Sr^=p)$l2_!!1iFv0&#XRsxu3x{jbLyKtNE5|_6P=B&2J%H|H!+HbA-<1 z!cA$(=z-<+ahYD9W}n=>aUS&a%h`b;9r`xOE@ge!ha-?C;WgVk_J!ihJ6Q}qb3epG z{)K{ILvp_1eSOTf0^#nR%r_A+aA5@kaQty8_nj0OOEgelbS-I4j5MN?9<;H)Nd8AQ8ZDfitos=hP#*aAja4It;q!$qot;hFNdp?-OH%^$M?H3tW z^PodbAo4eAGH>{Q8MNxB;ppBJS~i|B8 z(tG)aNG2V2#%ri)9HnI7r61>Q^&BrW(3Xp*wwxvDG^z+8ZbJvqtFBDj$i4gyz#hVY z1efP>|Eds4lIV4Ed>OtSxj`IiFH2S%BqNWcJ|~6LPtG34__Xjz>L~A_l0KN{d{JW; zIsHn!MyuCT0VHA%>|yYxsbkHf;>#A}0r|h5DJ0w+nYdXcSAMWPQa%ab4hgSukOVzw zMa&Bi3u6zPGB6)tdHdJ+czFk{h}y(L4%9(TdYxn{Y4&11&ZlO~^}K2yMsEUbN8FTD zX=X>fe@Kf(;@V=;EwWk->)^Um^LsY>j5a$|hX-PH9(f*k`@0|-tIK$cdrQ;v=&8Oi z<>hRU-qYsIZjm@i{u$47Y6c!3PK`;^rWap()LtA4gr;gk_OKs`&BtSS5O-aF&wNEBdj@9LF_n%;K^BS}VJQ$d! zxTwB#AnRodCZIV)_~_=s7;6SY|4m)$kd@BHspR$v8iq zbb5`8<0<|}nK*w93vKfT+q!~Q8Baj?(tx>&3=HxWuIRmRa7Y`saAcoC4vde-115Fs zjfJ={tnRL{LHEEb-HwWwIDZs2^nU2mhc-_OlBO48&qqIjUu<#&j}^C3Lf6%I)QeNk&E@3jhFDMM6+kP&gnK3jhG{DFB@TDqsL$06vvGm`Ej~BB3$Z3xKc^ zi9i?afD$wdciWHhsdt5cknpd`f2-va-F~9~E&K8NpEiHocmwhmP>*4Mu<Lq5NMt@i-^TK|XTDd89QpY@)=U(Wxz|Jwfd>-+T=pRcJuXnq3!pZ{^| zedzD|E@j|L*fH08LoF07LGq`fEB_Xg`n`{wb5jBTc>yojA8j@5O_st!=in8vkIa2{ zN!c9t)XWP^(0i;qjrF3XjHR(j*y<|Y^&760Tj0<5UngpQCk(&LlR{V>E>epT?^j$l z=bu4Xu7rhAaF%&k%BYTv+zc7pR(_Z^{x0KWQkEz1FIZ+XEjh8~D`7|NkY3cllup#i z#24FkSmW!So4QiC>KX5*?r4*3WLD>7N5_PH`if-#8q*UCoOM!eqad-^DyYJ!N7;@c zczQQfAY7~f{^nxUzan_BgpDB!J5itgR_g7()}9v2_?hWNXYEUzC9rueOc_1Yqq;|c zmN6yJh9kc?m!a)F>9YppH9Q(&3SgJn>A$SdQ|gR={A<&i$kR7wDHWt6N|7(43*}Yh z`>gu38PLEX|Bol>{gtX);eb|E`(*e5HuW94NbgSIK`7h9d|K4BO!Ui%d@8??kn$^L zFh?H+UYtmL^=3X}|64o@snZKZo4qEo+LrlZAhT)zs+?Dv?Vd0Rgl}~MqRoEa$2F&H zuXHC2o#ATklzj2T^Db_cwQ~^F$o()6VwY}>yA;Ba;j8OueaW3KQzW90;V2*!&B+rx z;AOgvtE)hEcsC^C9cBPU5c^Fgo$g1RkCa~fa<~!|F z5W3nhoXVadd%(!^Jo!D3wh8!&DCTd`Y3Y)yE}d;QeDIWd-7#Gu5OqBi7UH`&vJbKV zm6E@>J(FE{teB2=n2D1KgDqA-J|`dP?XO#fTI7M=B9`xV?fo?}i92TsW7v0I+eO9# zwBx2eWvmOR5%^66tVBmI?=AGg;w>8jV!`E?=UP#8Tn*&rmn~h27p!!Ie3I&?9=PGW z?s5;*A9PURe1PMcr;ceG#3yvAQJcM>O%|7nOV7r4-lgEW^vNwiY*id7i-v%Om4US6 zK6Eb9Ak&Hbu0cHZ?fk7Nr69yw7;VB8&PVdF`cq%ELgAIX_oe!?zwX`*UkEP zlm7`l$7S>)ub7%ZELdjsvblMw#17Ya78vG3jIxzSrtMA&E)boghW>7$J$*-K(oCrS zEq7!+sYrU9($i+D?I_3vb5WoZpT0S(+XpUMb~W%HCg<&ZJ|sY}zQfo>-puyShAl@| zxxJ^Juq00F86_v;cYJ8GZ)-uiE^3JqzaA94_gt=-H_@G�a2ygwD57TVc3&Rsy6M z?XA0&9&w=XEU3M zT-=_ctI#;tM5f1H=PvDL0)pbQN|wIcR7;2_&X{oBptt$yW?iM9~2 zC#FDk*^AS{DUDQo=q)=R@<}W#HXUUUGzF1;fkb%{N@X?6LLXF2 zarIP0V<}X61-{OXs4Ypw3*RbD=LO3h#&}kyaf}0a_DFoG@js%-YA($|wcJh7Gg1{V zH7S62Q#3QtGf8Xhjx)6L5dpI)2MUJPX%u#;G5A{CskUa#)`jrp_r%p`@94g7-CwU~&yQ?S&Y6z`f2Ph`G38GF^cd<+i$@CQJ-oOt48lUt5Jo+S%( z2F;*CGKa!_kWBE)U5k^3>S;!OOFY>X@|PjN!S}$Q3r0^H4Xn9}Wa~b6yMlmN2ls1y zEEC~-WK*_J`$K25z?vocYqhQ(|L~OvW0y3-M`NI7wjXEw$eLeXjoiiozp|^k;h&Q9 z-$3hsJ`}OYzu9@M(d>(;54u`TnOm-D+OdrI%NxFXve9ep!@e3O0jEb@A;l@?I=!LV z?>#gFI%KThZ}*S=0rJ6*l{LDg7q!)EyJ;SY$K3$|gEyCIK`>z*QsD+M+W(xp`tcJU(bQAevV&|a?;Xxmvz$j# zLQbgzus*AWFI00^e21#ixeIErH6%gzk|Rw<*(Y%7s^8oR$)D$M|>B8V;#E+d=}ynGttcxI0B3@ zev~zM)egV911vziEh!12Dq$X#0E33)#q zgYOfFUmWdmFxy)zwGcB62C9>yrrI@isNq+9b!rRYKC}4FioZYa9=mZyjphQpAkKK> ze6*1Byl3)IK2)RF|1WWFt#saJ9U2hqI-3gI}G_qFXZ(4>4JKqpmiQOUv3bM~LDS zGC23A2AVvCdiPLLcCJtJcO7Sh$*&0qj+Ii7SVN4qp_uuf?8-i~naQKSM_&L7zw%{0 zZ*J6YHuctGnLvR%8jT?Cy&aS4O{~~0SAF%n4ooCbC zHRy=FZu+VBGNRr4I_3+j{Yr)u58f?yHCU3xbUfHVXi;3iT5<(QgR2ia435YgB|L{h zGQ4MVcw`-jg~kWsO>4M|RYlESD|G}6FrOH70ciuIla7}QjIo~T%x?9c=v+de<~Um0 Ih*8J@04)Qmq5uE@ literal 0 HcmV?d00001 diff --git a/weapp/icons/mini-pc.webp b/weapp/icons/mini-pc.webp new file mode 100644 index 0000000000000000000000000000000000000000..f3038b050768bff58bc2d05f1bb55a5d3370f435 GIT binary patch literal 370 zcmV-&0ge7rNk&F$0RRA3MM6+kP&go70RRB-3jmz~DqsL$06vvMnn`>=OHdK+C*quP35ilS?Fxj0hk~n(Hkwo#?_<}yGDZOB!KChTVTTvQ5o z_Bh~?oaCdUvqgQQ!xB1F0BPHpf)H+xQV*a2{`R+7%T72`IHYJ*zL$aLPo)ciBYOfv z&g}RM3Hg%YiS}by##bS@R8{$dty!lWEh8H|xr9HbeO`kch*z7I=&xA&eD5bs8384m z@7t?bCH8lR!A^BJNV}gZDAQQMYKi9uY6O7L#6r4Z&u*hQVtY<{^bH*+PmQdOA#Ycl z_HZ^bvZORp4E0jr(QpNVK6!s)j!YxZT*ZO$mw}wil#BZ)<+iq1u8V{}lgEGLsMr4P zcJ=dnl9n$1q$$5=9i!QO3X=Pg1 QCv%^2rIa7X7a#xt0Qp9#`Tzg` literal 0 HcmV?d00001 diff --git a/weapp/icons/namesilo.webp b/weapp/icons/namesilo.webp new file mode 100644 index 0000000000000000000000000000000000000000..f29a994e2fa0f5601d58f4bc28a83c5f8ef812c1 GIT binary patch literal 942 zcmV;f15x}^Nk&Gd0{{S5MM6+kP&go(0{{RJ6abw8DqsL$06vvImq;a}q9HK#?69yB ziDLlG^s~Q2@Onhsqt6`rPwCI-2XEizItRQ0fSf?Pr^w#%S0Vn7#D0>=lKCO}JN4ux zv%j8ko930nusbB}c5N>u%FYrmq;Kb4UXY-A#3Tk+pq-GZ`b|3PgEm3vtH`a*@3t(w0p~4~zvFHAyN5w@pBXj41p-|)~Io7D7>6`5@k}WHzZlMoA^-)H> z`L5@@-4$w-10P=_PgO<+x>xUzT@H&KjVMFwk1aXhLxGZz6!Ww^ku=1)GvxzG0Y*TX zl6FL0P5fPh4ZR{@J-y|#j-I`e+{Bg;bgNsw*uV{Vho7oG#p`Yb_a&gc3+vAzno>9V zf@sSN$<%jl9IYVIR*lE*PCKa8tl%knuqS1_dwC#^p@dSgtg`aBvHMyLHCfTG)7Cv{ zZ)DC9w+S}H#~FDt{cUIXB%4L6>MH-F`W{Ey+A5TUzyjm1;tM@ZLl=p~T+$$;Vm}W~ zyuby2@Ejlh{z1fD0u0r}57q$VfnQ-}mbAr3TO^!Zox89(>17N#zpAk&l`U9e|=d z`YvEo_NU2U>Oau$>iJyT=`YpsgmgoDHhJ(r|I7UpexSX>6Wy4$G?T@mL2>KhvU+b_ z+O3GZffr1@oQS{p6vq~S0-rPt=xB?i`_khH^QgEH!7}*S7;Xm_T0%c;Z)@1VqflO~48gF(eR^ljAC3z>uD QH4-ire}1@3t6%^C08Yo+;Q#;t literal 0 HcmV?d00001 diff --git a/weapp/icons/nomad-book.webp b/weapp/icons/nomad-book.webp new file mode 100644 index 0000000000000000000000000000000000000000..b4959884d8bbcdfc81e67f56837e220120927032 GIT binary patch literal 832 zcmV-G1Hb%INk&FE0{{S5MM6+kP&il$0000G0001A003VA06|PpNE!hE00DqpZQC*D z`L=^1SW0ZGkZi{@1q2<~W(#&|7~A=RpXYyeQAA7t^g6oZ`!DIbv}8T~ycg?oz)aD# zR+W~otab{+#_lA^n_**o7n10i*MO0%q?(`BBm9zXTxb%DlJJ7i5|fle8YU#^85LiF zRnDVyA!(l}j7s7|0K^@$8v%4l>K(v3w`Dl1+{(6YNxnVKF1pWd=at=aid~|{t}6fi z|NXbdu9{+(cwzUn&u%BiF4D!W%~9c2vSF3m641%59T1nyt_6T$X8rhj#OoA_-aM^(;;J7;i;m^8^~y`_0%qFU zqdQNjnl);vr=3Wf4SE4qP&gp?0RRB74gj42DqsL$06uLplSU*XA)zoB2mpW$i9i}v zKqw{lXUZCLwgi0DdH{LgbSM9g>m~F6^1${k{l@){_JC-Cq`jH)o9G(eK^*^6PTdH($_~v}5$1b!wS;1x7Kd z;j9JNU=!tZ<`KGleaD6S2hW9`80YQTKEFnrA`DO_$_>Vt@iYI5zsdpsS7r`ADIFXL z?39mk*PiAWPd4pz*>?7_FM-($TM%h%Wf10#39`60ZjJP4dCZ#qmoeVn96X&~u^Xnb zllK^B5_%g-B`l*pD)dK#L5jmW z^mgI`7fz?|gCSQ-$a`dd2xgJ)01s58N{*3pyK?xDuP>w*F;{Pqj(lf*nXp~mxo@ZO zU%7HmI*|qR9N+V)m~Y25=THk0Mexa@w=chrif!@iazB{s!>leY49pg_X|!&V9iW*# z{0vtP&T3!yFZCdKvh;-K=JHnwil82;>O8IuX2-8hFG4HuD^SDMkExWlZ%%yid2sll K0uccvfB*pWEs^H{ literal 0 HcmV?d00001 diff --git a/weapp/icons/nomadcna.webp b/weapp/icons/nomadcna.webp new file mode 100644 index 0000000000000000000000000000000000000000..285782ef69e2785798fd6a1451fe5b79d20fe2dd GIT binary patch literal 1520 zcmV{8;2*#{K>s=6UxXhodv~Bu&-d5)CEjnr%|O2t{zd)+^80`&0DeFHAO1gp4y8Tm z^1b5*@y}on%D?n|mVcf7n)93VPq07pFYBFby&HdMPv7WNYitxpPcc^L29F~5@m1TC zb7J(#yE%^M^|jxK8=wto#@z^&N{xt z8|40}U2OT841t1>pmhegvU$f>`8qd)Rjy1dH&@!P}QSP{XW&G-R(po!of zj485?ZN`u z|Ch)`tV7rzAE%a@pXZ9FPto( zftD)n6|?qx_6Rq-J`?03W#NKg1s_d!#9iYy@mwvTz*GEOcwq%7QF^8 z&D9vP{J?2T)S653j3cywbuQ(7N<>cQTQUVa@MM;p|5uAmv^*#+*c^(qedRVAkU;&u z8mMxSM~ImkV@JMK%prdU`G_i7f*Z52#S=V9c|{Vx8h=lxuWOLGh1)*t^!h%tHLDrpq9oR#(bf2O;*FaJsZHWB7qdj8jB-Y$zGIo1FPz*BP zBjq|`F7bNL{54NcWBX0@21KpS^~MkNZ8*Iz2q=7#Yule!0lX;k7?OP_7W{G zkMh&0{xITzMwT85n0<=7b+C+DT7%1n7f3W4Su0_aRiJ!{gSnOwRryG=aR6(*18vcs zuI9$&5dKnDSy!1qpQ&*WiefD@b#xt#B_f2fI$;JI9X5YEp?uUkBRFB7tx$gn2XHbW WudTveFTLOb4oAD@gA&+a0002rPx3hc literal 0 HcmV?d00001 diff --git a/weapp/icons/nomadlist.webp b/weapp/icons/nomadlist.webp new file mode 100644 index 0000000000000000000000000000000000000000..640d92f459940397df3274c2214d9b922e56cbc4 GIT binary patch literal 600 zcmV-e0;l~_Nk&Fc0ssJ4MM6+kP&gn&0ssK84gj42DqsL$06vvMpGu{pqamml8W6A& ziDUrEroes>bF*)kfGUpoigbYU0p}0V0n~xKcl$8I1!yQGHvPJ)IN8NpR*!)V^zfsB zAGh!8-v;vrqWHznk$he7_y7`0V&X*7zO)3_fI|4}QSrYram8<4#{-~j&1 zxBv1C7|R|{|KC79^aJleEZ5v~d@4@Q{kFEHtY!S9Rk8SFIb8=OUHcZQfO#@pgJE#S z+?$s@>VcR6xckw691HxG6~~U*BVwD)fgzD@kE27(W-?HN*~|zNAix@Pg7kscQoj)A zx$l7bt+rVkt@gLA6VLFW1{d3%i(I8`T!;P*SPR_O+fLKXwc01zp0bGLHc58AK|6_h%Mm8z?$pU03$KyN-(=Ax)WW2(ll4LSts46)63I;&NmL4t&{tm?0v2| zOvUm~`OD;1_u0Al((&9xgd)c+c`OtLvxr*dYC!PSyp`tAUBpc^}?utQK+Dxvu~=UIoRr^0oQRwQbwBZQHhO+qP}nwryKu#vlK8)tOnD|J~k1!~~%CAq4;klh3!}#yjk~+YXzo zw7^sm0744rzQhP%;#H5m@3ViEeU|=TJ#xzWQwtzTx+N(9Q}6c3KQxlmK1tFz_@$%g z7a)cX#elTxor7pBS=EevS}B?fjr#hYlR#qVNQ@Y5t9NNsHDiNjn$7t4c{4(ybU>nD zy^m;`jXg9~U{2F8p9g#L%XMDIcdQ zTU(TRVwBjPgr$FCHnzDapPdS+C6ci12r64{nLjRu)Cx&Bm_^xs<&gD|S|AC>P>o$w z%UdG#F5yUKV>e6D&5?SQushY*)ncR8Lh4PzTE&drE$qJlVlM*b_=|;IR(>`yq&dOp zuTa_T%sUa9i#VN`U03df)KtK7YSuYp|2Ytv5sdZ*3%jqpzp03Qsr0aLL&PQoll;Wu z#5a;^I%$RLAl4D!O%^YxybqyH#IiJV!#HFn zgj(k_(@*7oh}8sRe8J+%(~xQbi<0JualkYPl@bnRrl-mc5i14UPjw~ptZITWzGHDk z`5Z!(fZ0dTTq*ovTu6n8)v0vVs52u}+QS{=iii~wPGfdPxpj?eykX{nNEIUPap;6f z0gq7KIjfT3Nr%p>6!5r1=hk@0q0=fw+{WzAQI!%db4R&*jibD=!u1g=L~KKKhFlP# z(h@Xp`cDC=Aei!Bnk&i=q!NI4SX{}x4G~o%u3&a%U!)q_P|Xn|7eS~LFyl~qQuxz2 zkV+6dOLc^WyC7DJ*pJzlU#Ean3YcL4%@JlEk5~x-w^2PQ{Blf4rHGYip3t~FVkHQk zqk5t|0;yWWx-8~M=8bhAc!KJP@==5u0ZU~wPo9L-K*UANeq`Q*SVu6?mn@E)hg1g< zYqFRZ%B>M=A>m|ZCyYa8MyMwu4>J3pd=!EP119=_#f8H45t~53%s;X?pnMX7X8U0$ z=I#{^oDZR)gsmJXgB5i*uXylm zV*w$+DI@1cOcA~9+QNwFb=MX|_#ec^)b5O$y9EJ@7_BqEPXy_iV6;zJI--040lkkn zkfXX`%GD8DAn5lDN0kngQM?QRZ4^xMB1_ShXEWZAAgzF4^h1AS+s!`R20_r$5HR+# zJM7l#-M3zJG(fVi`A)J6eUS;X@#Ee0|90iVUP%4> zSP7WW-K2q>s8hE$W4;-E8g;|tViyXh$tG14uT_mw#%jfD%R8awCkNk5xZOdhouR%U zVrJ08nI;#X4eqWJm6^xzDzg{v@X~{0gZP9*2#uJF$wk?|c$2sH{wn4-$N${gqd!Du z&SK0#%K2t|&P2UAvx_4E9smIT{u(B`CnpTyZ5oHA9i}Xq*>T10ejU0Q6P`xR6C{nD zyU%sMh%e1(_t3T{aZnk+%`>xcZ*QOg zmUU^My-9fSVOMj$fCl7ctLk`-JQ6)_Y46|&v-Vy=jXE;_%WaTt4zvCFu^IJ2N^(4-TS6M}TOq@&@}+8xNM_dZ1f()=dIi<`K=d zo7h)$&~-y}dAyV1acRG}PyhAMfAi4){<=p}8j$5}6eCXLoN$*WNxm4mySMayLyvmQ z{PdRXZmSpKkSDM)0b?DL*O#uqcPlKVJc|JSu4qVRQr)hW zm-u?L7B+{yrTVgIMRmFw<~79F1(8=#2Zd^K zyh2ZXo#7td)fuNTsY$1ER9&7OUWAPb++)VHXu&bl@D)^?*HM)TUbw`wIBE16sgKc# z3Y}m%#MtIjk#&+g{wXj|<((tMZCgQ6!xMT+#(Py}y@7eYM!oJ>E66=*R&2MaE8u9H zl7sC|EJ2k@6$eT-O#}qdxhT6=vbykIQcahxeX3+mt zGd{AZg+^jG1L!>?4OSUdRBO1ZMUelz><&}A36d0 zT~wUJKykns?lrfc=yH>?5FxqTr8R@rKZLBO^*Y}mTYE~pnvs@&koj=e;73#*8(l73 zx6&YBSWgrt6(=Qzl6S7C2>4o4)jONn@@E(Dram3tK?el@-iA5UfAT8xIX?Kt@WJr` z18SJ)xzIZ}fl2>QZ{Mye1j75i>Bx>z(C~228;1pa(FMSR+f=n1LwMrHNhd5{Rjk>U z1$-J^MTIjeMzGah0#N7VoQJrXY#H1n>n>|Sm47Hd%zBej;LIW&d(pIY+_xIEzlc63 zyjH+IH?TNd2v^u}F?4=^JU2Fy^3$Zr?yzm&sk?KqA-7knro@cK0}5UUyrK#%#cXz3 zZ&gwagI*CW!hNm%nM?9fPSBGT;wU%2!=m;*(>m$!ADb7KI(n*so1KG_8D#uT4Y;E- zT~PV9+o=>ORN3%~qX6DJ74POg_-|Tg80(BqKsWIu?szt-I}xD|tia6r^I@Mb2Bmn- z*9y5KoMgnX-6c~*@3Gq9TW74J8t?+RHb(0|a?20e+hCpFe{5Z*wJ|B>09L&qjB{(7 zXa&3+7S_Vf z!MxSX2hd%vdF72}yqc6%eRVmMRXjM2e2KWOnq+P7&nEUDoMPrw))0{;c;T{~+?6*7 z3k+gj)!m;`3n&KapDR2{K+9AZtg(dl)K)wcEL=UCI zIO6eyIZF2Ch^M6GWxpgyNddn$#_h*6M1Tz=No(Kl6U%T2YSL6)xW zCS3?G@!K4-rU!e=3GS=DvyZ_1c?f$v$8B}^E+Ed{GI%wo_n2_|yWX+@T9FW?{ z>-dHZdF|&P=b)4VKXw!?cs~->Y*R@9xtIdr0V!7V?IqpY%z@ZM38QRL+`^uI;%X*d#ckNy~SnER@MQE zeU`Vx_>{krTMx@hM8Ict z!QME=&R8z`AG}c#JmC2hP-#-?`8IG&jX2`)@!(A!dbTlZyubKqeqcX*5#5Qf{&W^y zwaETF>qzawpU0l|~dS^#Y< z6(9{o1o$i&!?t-pNLCq+#WVI(tJytgV&Tq)!vcE1=^&cMHp&Nmz;5Yna1%v^&b&Y) m_hUjTs@xfQAa6rd8}!e`(dY%x}`%) zn;OM`1L!+c4V;;JoI=83iJDyYScU#gR@=?uV5jf+)QRIo5|=?;+zX2K8>k@bQVFo3 z>B**;ItR~C61(*Dn{oru$2ljg1#zGW$Ahc}!dMm>AFX^U|2n?JZjpo7gldrXkh7iC z0092`=UXmPX|}s4J*>p_XtU^-529ZerO_zIoSJfM2#frDl=<6+h~HW#N6E(8=Hbxy z54|8t5Cx!AKF15VC^MJvmJb;y7BY3aXzKt2p52frGhYQC{CILOfwV zcSD?UobY8Um8>6dTm;lXhkIy?Q1F5|<)bKVsFmf>Iy+@f>nOoQJHt_MvVY#tcPBkp4v6I(*V6Hz#-s zFLH6h0W*9Hu7O)_$n?WzNM0-bvCP7N-GO zyRQA7(=_=g#oN5TNBmUCXER!Q%xOX5>Nv%pr2)L$i=lV=Jr{H)rf@zrR%yL6FbUdH zokaqB(~(VBqVC&I>0A!3OI*cww&{*7?Q%4mL%}sPH#f z?=xS=@tQ4MVdo8MK4a7KJM@|>*{b()2kyOjM*n(f_9n8@&6dbK>BriW8v_zHxtis4R-<wXRSnX%zx0^?a}Q zuXc0ePwk6*djEMr|Ef+4IgwpeX+|sYJs2qAWImlv`R()y^|x2sKzy0r?;z8PsWX~4 z7(t&0eL%Hm>0sf6!!jSL+3%*cLuQIVNdQEW0C||yZv>_Cb|5pRM0G~H_@$}iKlLZj zz>328``kFu-cF#2&m!<^?o=yp$$4ZdwBb2|H}wa<{S@fW4@({Y)8zDYLt>#^4L#r4 zM{hMTKqwK=R0kx;3=%?)L9J{ZPBEK1QGDI(gg9@?7a|SpNEq3KG0M|Q)YT6ul8M8! zD=<2!sVz?rPR_aA( z1~03~lI0~AWp|3f;3mZR?Pq_FLJTh(`CmlUXAO+@F{Xkim%Rs#WnhT9u%NJZshp{- af+Zu15`FqpjZ~c3Z9U*PW7H6_0000l=2Ef% literal 0 HcmV?d00001 diff --git a/weapp/icons/okx.webp b/weapp/icons/okx.webp new file mode 100644 index 0000000000000000000000000000000000000000..85aa2e3d0cb8bcd3d344248c06534fe7694b1b8e GIT binary patch literal 926 zcmV;P17ZA9Nk&GN0{{S5MM6+kP&gop0{{S!7yz9CDqsL$06vvQno6akq9La$NU#!# zX#f_={$KwA+n@Gd$lDjc&;C>Btp5wW$%}u!ajDxG_5sjY7v6iHKY9=Pi`XyuKlQKo z{Qg7Shs+h_7r$6M)D2$s;ti)z3ssT*`+UcA89vWBmy^b=p zwu-4nLgq8`?IGp>{`upAncYtsX>ihQIAHycOd~^l&|lz@Y;w_=g(@(dg*I8^Z*gDZ zsMZ-g<|1?GCB%gO;dd*pxaz}X%i`x{n=QnzjPtzLRWKh6jtR_NrV^i;gVs;=k zBr>-GL^k;V$T@J7G*HaHCPjT`#j^$pbTsRG07FQHxjW}(#eOU(P#4M-<|GzwQ#6hu zN2U4~_SvL5^Wwe6P!L_;6|zn5gD%y1rfVIKbX1|xw&-+8jC@dSxk*GI143DyBmU!2 z?>SXb@x>PPb-B(t1u&!(ZWvkb-G7gnFf_h~K=)6K5(e!e-qORBVmXvdo+dzor9m29 zM@tFFY6u%+nYU}w#NH$c06gq+5B^6P)y_^>bkZ9%lcnPlk<9y`wBtO`E`R_400HFD A3IG5A literal 0 HcmV?d00001 diff --git a/weapp/icons/paypal.webp b/weapp/icons/paypal.webp new file mode 100644 index 0000000000000000000000000000000000000000..3cc416e6def56828fbad268bcecfed2bada0a8d7 GIT binary patch literal 616 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 literal 0 HcmV?d00001 diff --git a/weapp/icons/racknerd.webp b/weapp/icons/racknerd.webp new file mode 100644 index 0000000000000000000000000000000000000000..2262856f58adf2dc12bbee62ea22624b2a900dd4 GIT binary patch literal 776 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 literal 0 HcmV?d00001 diff --git a/weapp/icons/smartproxy.webp b/weapp/icons/smartproxy.webp new file mode 100644 index 0000000000000000000000000000000000000000..96ba0cfaf30b3639238d914cef04716a228f4894 GIT binary patch literal 396 zcmV;70dxLRNk&G50RRA3MM6+kP&goX0RR9n4FH`1DqsL$06vvSph~5rBcZ4WNU#!# zV*u7^K|Agq-Rqmr*L0Ne0O?nuLDZZ2XY2v`f!3${I9dQa(14l|I9S5GTmsY~zfRL; zpuFnKkd4A=JLoz_$8$2q)bk0Vf>OPa_rMy?{l7@bheNBw0092?Grf-h>$=DQlF51v z+R7~}MAS;vG}q8Lo#<))P)RV!7v|n=-M`4%{wwPsbhfOy^=p_j*(}&!(w=I4SP0l2 zgJ5#pIrxNq~^5jKBvO|v4)hv3_!N8lUrMeAmc zXtD1*z<%9)(vkzZU{U-t6f@r1y#AUY97~k+Im>g$Wd8=|ZwAnSPj&OgLJDO1@nNVB zw(b;e1HyuKj4eu3r(h!w&1wK~Q2i!3YYZ$?BjF707x7%Vf0`-|d?R42C|n$TEW q)9_v|u-dnY%F>t6#LefB6Th8NA(f}ka@LI6 literal 0 HcmV?d00001 diff --git a/weapp/icons/smmfollows.webp b/weapp/icons/smmfollows.webp new file mode 100644 index 0000000000000000000000000000000000000000..7e39e92fd0d70d83953f994b7164ca79863ab4d3 GIT binary patch literal 1652 zcmV-)28;PpNk&F&1^@t8MM6+kP&il$0000G0001A003VA06|PpNDc-700FRu|DPdA z((fOUSvB@dV{PwvZQJJAwr$_7ZQJ&a*0$~OOjSn2|M#LIqO$v5-#rmA0r=niVv9zz z*=#lnD+3|6D4We@vr!agaM=d38@4Xf5agCcj<+N`fzLvn6)WC`e_POfCk6Vl`|MDu`z5+FzFgP)~ftuFW3^_&SH+m z>a*yX)Xjv}*yh6w!T76LF{(by{l@w|J?npSUho=W#Vf``0Q+Y;#vPyk z^^BgL)sDJxc?dDjC)S5W++vFygPmDvjP1X#1_1=Co#YwUiaWyq{R;x)ffr8)0KvGQ z&S!|w^M@#F5!gSlV)9B94P%UH6u2hAihr;Gj%GsnO8ahl#)kR{+eV)R^a1u!!2i-kS(~b2}7u7)+~Q zcMK$k5#n|Q#>jA#TDm6TBRI1{a zf$dUlZVpMI#Ip>Mil&(_=XS6$Ym0dd z>D3sNdSTo-+X$xr=~*K1`urU(4SFA#-=YV?5@-9{Ac=*;w4j8+5T$B=O)9X00=h! z&O(NSa@GzjO+S7aKRytJ#OfCV^F8{IimKy1t3t92u+IX9SlaWYZDBHusRb~w-}l}p zf~#CmR=j2;Bm)q^zVp>3f~%ZYIzGN0Y^r`i^RsWT3Xyc1CpOTfV7G_qd?elGt$i>9 z1}U-Q^K@0nah~^%=mrJWxQng|Ilkg68w>_Wfpt$?%+Ri!55c>(Q-9eQNH-`j{F@H&-IKD$s?%8+Wd+UxfzA&{3gF!1+fYCkcPoA<~&k(>G)GJni z5fj&$JY}Q);efFi%wh#eV^P0YgQT&7!7e6>fff@L{QuonP&gns000261OS}@DqsL$ y06vvUqfMoxBO)N^0I(8?X#fBRc2#`6#-8$Tr%s(Zbm`N40092@c>n+a0001&ARK`J literal 0 HcmV?d00001 diff --git a/weapp/icons/srs.webp b/weapp/icons/srs.webp new file mode 100644 index 0000000000000000000000000000000000000000..ee1c4a86877f4138b8a4b15b9f2e7ad9dae37d61 GIT binary patch literal 2452 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 literal 0 HcmV?d00001 diff --git a/weapp/icons/stripe.webp b/weapp/icons/stripe.webp new file mode 100644 index 0000000000000000000000000000000000000000..829ef266ce2548aecafda7ca9f76b89c6330c370 GIT binary patch literal 750 zcmVlIAtzPyBQU>9+mhIf!0DA7%xk9UZUSHqWLIZ5w_p3lKv*cP3wq934vu&%7$T(Ms zW-hI7URLOiiro(i!;Hfm%3CZR(hw^t&c&G<#1sGh|L?~Grfqh1SJv@iKw5uWN~_~O zmQ>c?w_%5{`QQ^Ci>?>ZM~nz+8nvyhVUAH!Q+-%E(3($MDCkwKCjrdSpKUgPl+o+6 zJ-B5WfH`Z$gwutf*Z0J50#;BsAfy2R0I&=IodGIf0AK(Y+&SbzWk{@DDciQ7x9TCP9-m6&ATzjOV5 zsz3ZqpZJ?M-X%^7BxY=*Ny@FsUU5JWpW7Y z5;0F_|E>g$iMyqa)<<;ZVrJJ1YD{g<|42546_rf<%-wj`d?u{?$TjDNj#Ny3EWoI~frwl!}bVI?W635d4y(Gqgb zJbaQ02i%Ly+L61>BgqTRY0FBUaS(HezqASodSB$s4yo#)Aulq4{1qoE<@{S~P<^My g$)!SWEywrs*|B;7XaK*xy&oMJ=z=DFXYBw00INf32LJ#7 literal 0 HcmV?d00001 diff --git a/weapp/icons/tello.webp b/weapp/icons/tello.webp new file mode 100644 index 0000000000000000000000000000000000000000..9ec43f3eb891ad5fdf6fa0573d7ecd56ddd3d5fe GIT binary patch literal 1490 zcmV;@1ugngNk&G>1pok7MM6+kP&gpI1polB8~~jGDqsL$06vvKn@A<3BB3mGytuFu ziEIGRm?6Wjv3!~QuU7xDc%bRus64}YkMj?;&+xvaJitG<^Z@e#`s@2+?zjHO_IKUK z`fpGV=pJ`|!9UzT>w6D$xL_xLQ0_>VDkrp+tMomr_=Lc$y6U^24qenxbp zQXlXmz|-_kfwq4cK4;N0(vW8k02mjAv9>GE1oXYxMM@aEJeJ2@q76-8I;>N?tV*mI zcJwS87xgQyEP|<(ELVCmGkGDYjpf0n%C0$sP-{T&O}%-=2@9p-nbGpYn&=fQKsu>l z<##J60092!X&?VU%Fo()awz})mySny9qxR)gfI!Qi_M}q`yDRcpy8l;-USa!tR7M= zJXyrKOStH)FhZ+>#<9UoUS|+n^3*T0I+VZFH?3hj(=i^VG<}+0Sio2cPYMi>U4PstjfVt6RqAofAyez^cE_Ql+GM zSLGiy6)?(H_X5MM#V7Zv<6U7HD z3o5)B5NpogD_JR%ZS@jUwI{P_&gFV7FbK3@3nRkE2y&r{j`%Vgm^@aiw~QT8+R94I zVx;IOP{+N?7fS{rc(-mI95=ot4E1 z_9s(diBu!%_mrXGoF`?8EM>BQ5Kr3ygB6{n32kLHMs83D3ZUm8dE%$>#c18^Vb0)1 zjB3fdnUR9H^Ure5MSkCetOm)^!ajX+wSqQ1$#k;9M(4hB!T!;%LfL{YNa79firO-o|?Ug**xdGG%`1Cf$ZXEv%JU-r#!{M91XGENnBmn=3e*%w`ZG^Z@ zm9bc49TdkrkOE-Uk0uLlg^d~yHnIF2ueN>rr$`K?phg!ia4skF?8oRwi99; z@bn`!8mmugGv4&AdV9|mEG1VOuS+k02~Z7ccerrMYi}a)U(PM4gbsX=p)W&f!W3FI zrW4nP=*cDwvIQM`!s$QiK{BOE0x;<|^%BLbKX-+e7@Fo+`>ux{;n!YS)Vz7UWR$0A z3buhNKvpVB=a0j3t(}dp!EyIP&16A8q~8?w{xx*oSF|Vt_hDb7KT!SU=zT7F&f!>H#~X1R>SGAvpH-@BCld}BYw<^6KI%-2KAkk(KD0L-J>d;kCd literal 0 HcmV?d00001 diff --git a/weapp/icons/tiktok.webp b/weapp/icons/tiktok.webp new file mode 100644 index 0000000000000000000000000000000000000000..d66705ec65d542d23e7a8fa58b29226f0e7e04e8 GIT binary patch literal 1244 zcmV<21S9)WNk&H01ONb6MM6+kP&gpS1ONa~8vvaFDqsL$06vvInMoz1A|WXB-oUUD zi9j0623eSh)GGW)x=VS0{eb;|>;dQj{onitT92RymIv*R!dLC5?Z31(YnS(a(*M5M z7yF|TOImKqWlkh`5IiPKNuO7zy@Nko`q6qKC{=K0Ie%a2=uJacBw(2byddvNJE&tf z8{oe|HjXgkqk%I`7Hc$v(I~U^GY9j`gF?&%Kx=um0A9bmIBQ(q@pVFEf6+|L#IT2E zP$ktC^i=k7(GYUqzi|{onCp{D(WFTd9+z1cV!Zy?Aqw#z|B>rdG{R%K9>4(p`}P%9 zZ|N<~<1LQ5mf6Kc^d831>T>mK4Fj)iolpHoWeC`C`wk$2?Gor*LCjwiG<4)ku2@ySb@LQ-xV-y^IeRBD&Y4KP;A)(MONBXNj^8J-(W1l&5t z?|=DE+W0l`QMle8qD9nV-L^em@;H&Zy=GJ_kAj&xTUD84k zoAyN7=TU=P`fa7_;45E?rPnt3hdH2H)pAV5{Jxz0>;1}UZ0jm})%)rkR$+N%{GHU^ zXKiQ9URz}wh`nOyPLi0M^xcxBq80i{9(+}elXl6B6zxE_$#BJvo}>i*JPZZ8^;*~< zOC_`4qmz$nc^$OD?d4ohQQkN%F2?|Kp9&_STsX3~Gyeu&VUiQ1Iy(Hei24Qp^Z5mt zf+24zu8)ISHsy!ecMBhliuVjG?3`T1ACkA9S`D$L$CgJbY*fhIUMdXj`~l8l&oQ_A_; z)20NVijmxYYSCjR|Deh%o19PjTy!me@{F2Wk}J>rBz?yIPUOx$Nf~o|Ub`zrTxv0E zrk_vnaf~bFGv5z(yM+(_t*GpXED()+O8fT()}OHacMnGe!-e;IjBP12!p2=pg93c{ zHey)jYZWK_qv6CW(xM@#Y)V53(D>eC zLf*4^t>xs?uL=3Fyx}G=`Bx?>T&O{T3w9`yM&I0%UU=L>J%oWB&vP(I27Ec2ZaBWA zP{>2FdtB1rE#~>0>T`ex!P+EgQF&;S5P50y{(+eHRR?^P$Vw$fVw2{_Gsgy+cLKH4Myx6I4^q_n|VTkXO! zsQP~=(RtDxa4eVeQLmw#E)U7SJ6iDwNyKqzmdNehZt`Ru65(;aSe(!1b3Mt?3@%6j G0002L=x~bw literal 0 HcmV?d00001 diff --git a/weapp/icons/vcam.webp b/weapp/icons/vcam.webp new file mode 100644 index 0000000000000000000000000000000000000000..66c100318f53dbafeaf96563da01ae22af2a7b9b GIT binary patch literal 928 zcmV;R17G}7Nk&GP0{{S5MM6+kP&gor0{{S!5dfV5DqsL$06vvMn@J_4BB3mJ3W%^0 zi9pX&djP7kW64w%k7*|yuDVTl5n$YOgPP;yl>cff#qKt^?tMAsk2GtBfRxlbi*8xM z^VnKGk(m&MkG<3nKo;47Q^RF6I=s{q8riSGXOlohR~%h^4VofA8KBuIDlMzJkKRW* z*nP<>PvVo3lZ2yJJL|7}d4AUD0RHdpWB-lg`7Zst-Y4Sih{h)AA={0pe4GVe=ezn*BtLUlY|F#&KX_IIe5(shd`nR`xORte_JN|hLh}Jk1w*|dxrH3{}R|SnU zsiD)PSGuwOs3{z^RC#njB+f`9rYI?|n0_r%rZR0iBYz^6@C$Yk;aI%q8S%dx_M`W@ zy@;%g5U{tbEzQ$eSIIM%^)cY=VKYmM+65R#sJ}%4GfD?#!Td8jWsSx^oB{IH&*$nU~@QC9w`2>|G91*o+;LHM-1cFKNogs;-Xq0GU@UN$ET zrbk!G;%c6%BafnVK-Xo&x5M@s`!|pm&qst*cZhaPqWT$s*+P2=6xMFbGplOOI*bCt z!z-aveC0Y;oSV{~?A7SW{RFxaRkh7xCaX`(`7p8^8NJ$@yPWFJiOG)_hUFc?qyPXA CLd$Xh literal 0 HcmV?d00001 diff --git a/weapp/icons/voyracloud.webp b/weapp/icons/voyracloud.webp new file mode 100644 index 0000000000000000000000000000000000000000..077e0b5a9bae9f89a32132f0740559de7010231f GIT binary patch literal 1342 zcmV-E1;P4KNk&FC1pok7MM6+kP&gne1pok08~~jGDqsL$06vL2mq;Zeq9HVN?TDZe z32Xqx3}1#%x%rsZAGUba>kF2=@ww}qFPI1E-$?H;AMm|4{VV^C^#J~t)G^P~?FHn) zn(5i}icP`9wUU~)TlU-axM-H`5c_Lk^our-0#xUGxc@>P$b#Si-M{^-b2d^)KBNN3 z@65iUop*rxrWgxxK_ab9u{P~z&aY7Bh=b?A$FH<%71ih&pI6V z2%G4dH-J8F6FUe5C=pm{7R?<=wWI9)EClB6A~Z|=XN`UG)SDHJkaHLX58$)wUS3jF zk^lhy{7L~t&_MWwX+T%Otml#DP*xkRJAVw+cik96^d3bOP}8x;Agfgv=nhmCPkB`8 zGb-}sit$_Zkx?X#b^{DsZuQYjKsH_86kk(&N}7S??Q!v81ulSo4Su0vm3yLJ#E7YE z3ZKg{4B|phRUI%TjgQ3?{_xk+$>IF-c( zPbnF)O8Q-w=_YX~W*f}$YDAb6ySH}2gfF)5%BXfp2(OFY(SUY_NijR2k+b=1w%9@@ zRccaD+<3QX?frRj1&r=iU<&yKIp0<*?=)-eH;rH)0@?BDQ4frBQ1eC;F8X(D(WKCM z+OqHIrBSOH07_!&!N)ZX-mdgAzQLLBtJT z_6)Vmj%wBgsowQHJ1<1_$1b3o$o_Q{fNIz754fJgO!_Y}KKYyfSHS@v+8}{{he&KB zoETutZuU_zY>^CEtdujyC2z`lL+PiJ?|tz;IIm%vmBkS-Qi{4jCXBOF4pz14t|TFw za}r?_--2v-o&X1ias7U1bVEZUx2@?VxXq5h6LDMg!b|5h7@Q~L_ zm@b;n9;08{t9x4AJ7dtH_4nN?^|6U^2bM75%%ewXbZd}F&^tXWZm(`Pw&)qLa#BB~ z1v;uL0;k`zl{iPz(^=rbl_{$8!_{$?K31B610JvOG&LqSN?rItf7@WaBT=rYO8Va8 zqS@!Dwr^*4!ooR4PcQ})lv+HF2D?M_@BGWr9lD-QMJO>L)xt_ z3IQwYTiQ__ZN{Gq<`0ouLia_9f$Qo$8T-;v+fYDf*|DApSx38{Nap&ctIH=$(D_B8 z>@Xo8Bg?fl84LPVkpgRpobul_;zuVG2~Uo28PbJu2M0HsfEk5fusc$KKsLGVjR___ zYe|>f=f-|s1E3#&Bt-CG+03I!;$ttgbb06SjVPP} zx7mA_Sd7{_DhmRBKo!L|?Y3A;2SZs`A)@XXem}il3ht%s7GCKe*10vmETDEShzyDN6@SBGD+tiIzl|A5wZ~7&TXBra{Aao@=eZ zzckM}@hi9v$^=ljaw?wN_m$nB%WIECcpXL2fG7MDo+xseB~A_;$x&pPvJY}OiR&uC zfq?UB?NeztKmh*yH7fe70b305BZO=#8nD^ZPzog)V{2-?Y4G4|$xhA?PzTfki7_Ik zNPtv>3}g}Z?_Kzphk~nc0a>r;b>8lohOj&2htB2;p3eASrxy8V$Z@0pFF4&9CP00|S|#?&D#I;F=Sl@w@3H zr%v}qYWlZRs6J};VQMh$U(66BJYl(>g!aO^RW*r}6qxaJCssq7J%R}sep_Gu%L)0u zHXla6=Qi$3a(0}$-#MR9QgQE=bnoYXnY%?^VlRht$sihP4xEi}i&WWX-EdDXZ>DJ_ z;PJVCZ%9$aMEp9;`<8_GZVD4w0fkfg*=}s80$T*erp_HAC>LxQnnoBTF^&%f;qPOQ ztv*WrxA=~TI>`s-nX1^dkxw%65V=?@0^~XhCi%`fHQ&ainCmcYzI@ySII5hYCA>pOu*!_Bn1xqXmx;(oG z%dHlCM-;dK3n>Nl2}HF4JFO6~gk+9KKs+dBpoO`#k77^~gO(4%12L literal 0 HcmV?d00001 diff --git a/weapp/icons/wireguard.webp b/weapp/icons/wireguard.webp new file mode 100644 index 0000000000000000000000000000000000000000..df6acdd70631ba5bda43908d8076636123d196aa GIT binary patch literal 1028 zcmV+f1pE6^Nk&He0{{S5MM6+kP&gp)0{{Tf69An7DqsL$06vvQok}I7BB7@_`)IHd ziDUrNnespmKiz@`8+g3HbSBhUP5ThTfzdumt5e}{WUHYO`Hb#CdS+R`T+=k5tXjmaEe2K=eu|&W; z3y!D<4+A2U2d~WAL>Qn?hID`Q{W9y*GrgT<*#>o=$GQ!1-9hOEaw^RR#xtBLpQ(^P zHGXkbyyHqbM}xy*8r#>OJ9vk)jb>6wN@IS|0sk&=k{^Wqie(#o;EBsc+pg@R? z7=*>rxo3%TN0kGx{bltBHHdl|L#-DWlJzK$5JNygIeJn5rv1@o?~yFs$C(AUx<2v4 zca&B=ZAUESn@;`6?#?x&Q3V}l{Tf{@#>H$0N<;4}K;`-2f3V7)+ znF9@&Ulod&?!JuiYb=jo@~`{6jBj!)jdwfiNnAa7W1w~a(P2W{$U2=YZq<|1+Xxck zaD}3lT&&Lh^&>Eo`WO=OMU-Gtxy$*9WP_&odop_JhTG6{s9#vTW;f_XrmI|zmD$&z zb`~rZ940P$(chDeAE?Gwm{9RP_T~Ys1HN~^slBWG#{>gtXpvhxXD67X3dQi_$$mdC zH}BvmWlGAhK(0sXh(B)+qCM*oj&F?}Y{_Wo$A=4$lYb7AbCnkp{A zEtq^2?rVFZ00~Sg{`C>F*FOn;?wc|ubE_mwHz zeZFP^3J=b|Lag>?f=sHafpD4=CRa^ yoj#zQYh#evcsyt!StI#4YbvFpzvjvkV21twraHpaFk7G5FGxL&!}SJXAAkT7BnPwr literal 0 HcmV?d00001 diff --git a/weapp/icons/wise.webp b/weapp/icons/wise.webp new file mode 100644 index 0000000000000000000000000000000000000000..429ae7cedcd5c3eba31882ee3c48f76f83adebe8 GIT binary patch literal 726 zcmV;{0xA7cNk&G_0ssJ4MM6+kP&gpM0ssII5&)e6DqsL$06vvOoJ*ynqM@i0nRu`g zi9i{9!{{l2J;AOc>tk+bJ#L$|J5Q6C#NPu-Yd;5aFQ`-rM`Bd6K9_YIQi>z5UY)V@ zg>A(MP7z+ur|3Aw`o{T}lwO&ua5PS-FH%dk7{bdJNYFldu(UVP9S;5a)#vcE)=2n` z1ta1Pe2VakeGTy74HWCfz}5a=QJ-c20RH&&onls)5{!`NdrVx1q+p(k>}1zlaqA?% zD0#=m-X$>2xd%daPD|MPcAA+xce<^;&()7iLO1|x8~8YUbDG*Fp&5w)=)bDpAgQww zL{L8{QR^Q1xEWhRoRw;h#$ksTcOKHe|D^)N>EF%Fhe@H6cUO=t4g6uN!g9x_|SY(q~lmBS3iG5>x|{IzP*!HbjVVmC)cVGfR| ztwICcL$Bw|h?ZGCsC4+iUbXcW+#f*=9I~_EIhki3_z9^n0)y$|^wEif1QMai(=z<2 z4+P~r`&lQ32%cYnDTJg&Y%DkGa{E73YvOcPz^B>6g|4NO)xdlJ-SA2-`By2gEJuqI z8Yxe!2%l;*F&aC?%OGS2?9P~>KdQbdC69yvz&7&dvYt4Q%ZI_qUDajdHKJf@m_1)FVBz$;bSxCqoa(V zXWlFBs(eI@YP}25XN53sF>DglKkhi-iy?D?SIr*~6I8Rtnd#k<$|W&Nr~VjcT}JYE zS_%D~FuX(vl`Z_EU8Dc`+C5+bix)^iu|4z91~M_G$LRuO2M;18(*cmWk7mcqHgzWt zP8*Cp#a8f%R-Wz^IdJLl5;b4`pgjK*;-p=HXg?Mh=4Hxa7GFs{TzK;;{-Dq(GI8k= z-cpTJ1Ez#n@w)HOB#*}Vnl?AQg1|bTFD=I2cKDWmxHny#!q*Kh?vZ^ssGHa%oq=~9 zzeew9UqW!A^|R7CN?Q7$5G*hLO@|S5q{1<@Yh?UApEhtJI(A{G6ZQQZ}pwQ*`(b7Ywv)L{s+GJ?BsuD#x;Q1qM*~LeRK1(m{^<*PQ)(`@i9yYV+CJ#OMDs`vU%;eya7F^AXW&{AT-B^Y`u$L8JoI z+mO5Po2O&^xy&EhIuVHk;{_c7a_6hyB+jMX>=G=aF-_HN8`uCeb7g{?BX6B0QVq(- zXbnv6I0>^any9_ zo5Idy|1E=br4wt@Kqy8|m%so3{`}NDs}YN05}a1)PQ1!7eMxBzKyU>qR_JsR36ZGp z(z$C9_^~4>102nC$r02H0%T+CtX?caPZlxW!S01B5V8j-wgd8s$UxZj)FPkAB44-a zqf-gRqs#thKj?4LkpCZ$-Cu(CmW^x3I{n%q|5%23^~lKyDjPlXjC_Zj^|(lqfdY1W zTk9vjm?AIJb#Hr+w$&77ckSbT&X%HWy6ks=ME3BW)d+P&UnOGu__r=FPow@bo+^ilVdH;qc=( zFn380sVJnwC0A4|Bs{{jtI5P6_;-psgHZ5E#nA|$_$#RO$(xRmwWObfu3N$XGbTd0 zc3UmhrjZdG@A|hFaBf=Xen|9>l2&6IQv(}z9i{{vP>P&D1|Eo@6}5yJJzy3K1lXx( zsyl2foL)P^*&^`Z!g_pyvWz2e`Pa|yJnMyc-w>i@f$KV^w@#lh;7dSTAZo^|k2{2b z{ct0YGLkHzx2OLR^aOB6%LDxQO8;s`7&!AXio82H5!FHuFc7qLUDVfd1xXNT-3*nS z#1flObvDk$`OvWg&)zvAVro$qHjI_hm%6rhY8a_D!sb0v*sCVn%{ ze10F551gDt6J6JYkay40f`iQr_R=JF87AVT^a3Juh9#G} zuH;8|)KY7{ev+7w587_Qgj)wr-zU$6Ogr1+t5ek6dk;fNKFkpd*Pqull)sfF5`#a^ zxy`Y;beO0{@k}Maa)u^mtRJy-4)3WNot}=>K)M>bH$0euiE{l^>)vs^JS9rI#W)bK q{3OxNV^u(fk(P1cbW3KkZpf^I2JeyO(N%hK4uxjoX)zJ8fB*nuFWvzF literal 0 HcmV?d00001 diff --git a/weapp/icons/yidu.webp b/weapp/icons/yidu.webp new file mode 100644 index 0000000000000000000000000000000000000000..4de6f0dd0db3705e21d29262988701921d3f48ec GIT binary patch literal 1662 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 gZGzN zF*m(HYh_fYqB?9=NB@>XS06w5n9+~+`0Al8{T;K0l{~Ce>0*_J#a%nke?ve827I%f zU5gvU#hMx-Cr)N;I``Z|HE$LQgcjYBnL*V*KeuUyIB`)bDi&>6bK+Hi<}&#rT~S&l z2Mw=ItZ5L9lNaV>c>g^Fgq#nkn!#H@z`g$A;^Ktg??_q)?-x|*ky;KEgblVz zvg|rSUXc)kDXuRQr%8!OW#YlV$mcXcT3-JioG6hdbDNQLzeV94O_aer-gZkAC!uBJ zUZ__jPOnfKDK$$M%e>3*0jV%}TsDbat)JJ5^9k=P+AR zg+(�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 + Object.assign({}, c, { linkCount: countLinks(c) }) + ); +} + +Page({ + data: { + brand: nav.brand || "游民导航", + tagline: nav.tagline || "", + footer: nav.footer || "", + brandIcon: nav.brandIcon || "/icons/_brand.webp", + categories: withCounts(nav.categories), + activeId: (nav.categories && nav.categories[0] && nav.categories[0].id) || "", + activeTitle: + (nav.categories && nav.categories[0] && nav.categories[0].title) || "", + theme: "light", + drawerOpen: false, + showTop: false, + toast: "", + statusBarHeight: 20, + navBarHeight: 44, + sheetOpen: false, + sheetLink: null, + }, + + _jumping: false, + _sectionTops: [], + _toastTimer: null, + + onLoad() { + const sys = wx.getWindowInfo ? wx.getWindowInfo() : wx.getSystemInfoSync(); + const statusBarHeight = sys.statusBarHeight || 20; + const menu = wx.getMenuButtonBoundingClientRect + ? wx.getMenuButtonBoundingClientRect() + : null; + let navBarHeight = 44; + if (menu && menu.height) { + navBarHeight = (menu.top - statusBarHeight) * 2 + menu.height; + } + + const app = getApp(); + const theme = (app && app.globalData && app.globalData.theme) || "light"; + + this.setData({ + statusBarHeight, + navBarHeight, + theme, + }); + this._applyTheme(theme); + }, + + onReady() { + wx.nextTick(() => this._measureSections()); + }, + + onShow() { + this._applyTheme(this.data.theme); + }, + + onPageScroll(e) { + const scrollTop = e.scrollTop || 0; + const showTop = scrollTop > 480; + if (showTop !== this.data.showTop) { + this.setData({ showTop }); + } + if (this._jumping || !this._sectionTops.length) return; + + const marker = scrollTop + this.data.statusBarHeight + this.data.navBarHeight + 24; + let current = this._sectionTops[0].id; + for (let i = 0; i < this._sectionTops.length; i++) { + if (this._sectionTops[i].top <= marker) current = this._sectionTops[i].id; + else break; + } + if (current !== this.data.activeId) { + const cat = this.data.categories.find((c) => c.id === current); + this.setData({ + activeId: current, + activeTitle: (cat && cat.title) || "", + }); + } + }, + + _measureSections() { + const query = wx.createSelectorQuery(); + query.selectAll(".cat-panel").boundingClientRect(); + query.selectViewport().scrollOffset(); + query.exec((res) => { + const rects = (res && res[0]) || []; + const scroll = (res && res[1]) || { scrollTop: 0 }; + this._sectionTops = rects.map((r) => ({ + id: (r.id || "").replace(/^cat-/, ""), + top: (r.top || 0) + (scroll.scrollTop || 0), + })); + }); + }, + + _applyTheme(theme) { + const dark = theme === "dark"; + wx.setNavigationBarColor({ + frontColor: dark ? "#ffffff" : "#000000", + backgroundColor: dark ? "#0a0f14" : "#e9eef4", + animation: { duration: 200, timingFunc: "easeIn" }, + }); + wx.setBackgroundColor({ + backgroundColor: dark ? "#0a0f14" : "#e9eef4", + backgroundColorTop: dark ? "#0a0f14" : "#e9eef4", + backgroundColorBottom: dark ? "#0a0f14" : "#e9eef4", + }); + }, + + openDrawer() { + this.setData({ drawerOpen: true }); + }, + + closeDrawer() { + this.setData({ drawerOpen: false }); + }, + + noop() {}, + + toggleTheme() { + const theme = this.data.theme === "dark" ? "light" : "dark"; + this.setData({ theme }); + try { + wx.setStorageSync("navmini-theme", theme); + } catch (e) { + /* ignore */ + } + const app = getApp(); + if (app && app.globalData) app.globalData.theme = theme; + this._applyTheme(theme); + }, + + onSelectCategory(e) { + const id = e.currentTarget.dataset.id; + if (!id) return; + const cat = this.data.categories.find((c) => c.id === id); + this.setData({ + drawerOpen: false, + activeId: id, + activeTitle: (cat && cat.title) || "", + }); + this._jumping = true; + wx.pageScrollTo({ + selector: `#cat-${id}`, + duration: 320, + offsetTop: -(this.data.statusBarHeight + this.data.navBarHeight + 8), + complete: () => { + setTimeout(() => { + this._jumping = false; + this._measureSections(); + }, 360); + }, + }); + }, + + onTapLink(e) { + const { id, catid, groupid } = e.currentTarget.dataset; + let link = null; + const cat = this.data.categories.find((c) => c.id === catid); + if (cat) { + const group = (cat.groups || []).find((g) => g.id === groupid); + if (group) link = (group.links || []).find((l) => l.id === id); + } + if (!link || !link.href) { + this._showToast("无效链接"); + return; + } + this.setData({ sheetOpen: true, sheetLink: link }); + }, + + closeSheet() { + this.setData({ sheetOpen: false, sheetLink: null }); + }, + + copySheetUrl() { + const link = this.data.sheetLink; + if (!link || !link.href) return; + wx.setClipboardData({ + data: link.href, + success: () => { + this._showToast("已复制,请到浏览器打开"); + }, + fail: () => { + this._showToast("复制失败"); + }, + }); + }, + + backTop() { + wx.pageScrollTo({ scrollTop: 0, duration: 300 }); + }, + + _showToast(msg) { + if (this._toastTimer) clearTimeout(this._toastTimer); + this.setData({ toast: msg }); + this._toastTimer = setTimeout(() => { + this.setData({ toast: "" }); + this._toastTimer = null; + }, 1800); + }, +}); diff --git a/weapp/pages/index/index.json b/weapp/pages/index/index.json new file mode 100644 index 0000000..b16ef3e --- /dev/null +++ b/weapp/pages/index/index.json @@ -0,0 +1,4 @@ +{ + "navigationStyle": "custom", + "usingComponents": {} +} diff --git a/weapp/pages/index/index.wxml b/weapp/pages/index/index.wxml new file mode 100644 index 0000000..e2a3ab5 --- /dev/null +++ b/weapp/pages/index/index.wxml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + {{brand}} + {{activeTitle}} + + + + + {{theme === 'dark' ? '☀' : '☾'}} + + + + + + + + + {{item.title}} + {{item.linkCount}} + + + + + {{group.title}} + + + + + + + {{link.title}} + {{link.subtitle}} + + + + + + + + + {{footer}} + + + + + + + + + + + {{brand}} + {{tagline}} + + + + × + + + + + {{item.emoji}} + + {{item.title}} + {{item.linkCount}} 个入口 + + + + + + + + + + + + + + {{sheetLink.title}} + {{sheetLink.subtitle}} + + + 网址 + {{sheetLink.href}} + + + + + 小程序无法直接打开外链,复制后到浏览器粘贴打开 + + + + + ↑ + + + {{toast}} + diff --git a/weapp/pages/index/index.wxss b/weapp/pages/index/index.wxss new file mode 100644 index 0000000..07c55dc --- /dev/null +++ b/weapp/pages/index/index.wxss @@ -0,0 +1,539 @@ +.topbar { + position: fixed; + left: 0; + right: 0; + top: 0; + z-index: 40; + background: var(--topbar-bg); + backdrop-filter: blur(16px); + border-bottom: 1rpx solid var(--line); +} + +.topbar-inner { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 20rpx 0 12rpx; + gap: 12rpx; +} + +.icon-btn { + width: 72rpx; + height: 72rpx; + display: flex; + align-items: center; + justify-content: center; + border-radius: 20rpx; + flex-shrink: 0; +} + +.icon-btn-hover { + background: var(--chip); +} + +.menu-bars { + width: 36rpx; + display: flex; + flex-direction: column; + gap: 8rpx; +} + +.menu-bars .bar { + height: 4rpx; + border-radius: 4rpx; + background: var(--ink); +} + +.menu-bars .bar.short { + width: 70%; +} + +.theme-ico, +.close-ico { + font-size: 36rpx; + line-height: 1; + color: var(--ink); +} + +.close-ico { + font-size: 48rpx; + font-weight: 300; +} + +.brand-mark { + flex: 1; + display: flex; + align-items: center; + gap: 14rpx; + min-width: 0; +} + +.brand-logo { + width: 56rpx; + height: 56rpx; + border-radius: 14rpx; + flex-shrink: 0; + background: var(--surface-solid); +} + +.brand-text { + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: center; + gap: 4rpx; + min-width: 0; +} + +.brand-name { + font-size: 30rpx; + font-weight: 700; + color: var(--ink); + line-height: 1.2; + letter-spacing: -0.02em; +} + +.brand-current { + font-size: 22rpx; + font-weight: 600; + color: var(--accent); + line-height: 1.25; + letter-spacing: -0.01em; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 100%; +} + +.page { + padding: 16rpx 28rpx 120rpx; + max-width: 1120rpx; + margin: 0 auto; +} + +.cat-panel { + margin-top: 8rpx; + padding-top: 20rpx; +} + +.cat-heading { + display: flex; + align-items: baseline; + justify-content: space-between; + gap: 16rpx; + margin-bottom: 18rpx; + padding: 0 4rpx; +} + +.cat-title { + font-size: 34rpx; + font-weight: 800; + color: var(--ink); +} + +.cat-count { + font-size: 22rpx; + font-weight: 700; + color: var(--ink-faint); + background: var(--chip); + padding: 4rpx 14rpx; + border-radius: 999rpx; +} + +.group-block { + margin-bottom: 22rpx; +} + +.group-title { + display: block; + font-size: 24rpx; + font-weight: 700; + color: var(--ink-muted); + margin: 0 4rpx 14rpx; +} + +.link-grid { + display: flex; + flex-wrap: wrap; + gap: 12rpx; +} + +.link-card { + width: calc((100% - 24rpx) / 3); + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 12rpx; + padding: 18rpx 14rpx; + border-radius: 22rpx; + background: var(--surface-solid); + box-shadow: var(--shadow-card); + border: 1rpx solid var(--line); +} + +.link-card-hover { + opacity: 0.88; + transform: scale(0.98); +} + +.link-icon-wrap { + width: 56rpx; + height: 56rpx; + border-radius: 16rpx; + background: var(--chip); + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; +} + +.link-icon { + width: 40rpx; + height: 40rpx; +} + +.link-meta { + display: flex; + flex-direction: column; + gap: 4rpx; + min-width: 0; + width: 100%; +} + +.link-title { + font-size: 24rpx; + font-weight: 700; + color: var(--ink); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.link-desc { + font-size: 20rpx; + color: var(--ink-faint); + line-height: 1.35; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; +} + +.footer { + margin-top: 48rpx; + text-align: center; + font-size: 22rpx; + color: var(--ink-faint); + padding-bottom: env(safe-area-inset-bottom); +} + +/* Drawer */ +.drawer-root { + position: fixed; + inset: 0; + z-index: 60; + pointer-events: none; + visibility: hidden; +} + +.drawer-root.open { + pointer-events: auto; + visibility: visible; +} + +.drawer-mask { + position: absolute; + inset: 0; + background: rgba(10, 15, 20, 0.45); + opacity: 0; + transition: opacity 0.25s ease; +} + +.drawer-root.open .drawer-mask { + opacity: 1; +} + +.drawer-panel { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: min(78vw, 560rpx); + background: var(--bg-elevated); + box-shadow: var(--shadow); + transform: translateX(-105%); + transition: transform 0.28s cubic-bezier(0.22, 1, 0.36, 1); + display: flex; + flex-direction: column; +} + +.drawer-root.open .drawer-panel { + transform: translateX(0); +} + +.drawer-head { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 12rpx; + padding: 16rpx 20rpx 20rpx; + border-bottom: 1rpx solid var(--line); +} + +.drawer-brand-wrap { + display: flex; + align-items: center; + gap: 14rpx; + min-width: 0; + padding-top: 8rpx; +} + +.drawer-logo { + width: 56rpx; + height: 56rpx; + border-radius: 14rpx; + background: var(--surface-solid); + flex-shrink: 0; +} + +.drawer-brand { + display: block; + font-size: 30rpx; + font-weight: 800; + color: var(--ink); +} + +.drawer-sub { + display: block; + margin-top: 4rpx; + font-size: 22rpx; + color: var(--ink-muted); + line-height: 1.35; +} + +.drawer-nav { + flex: 1; + height: 0; + padding: 16rpx 14rpx 40rpx; +} + +.drawer-item { + display: flex; + align-items: center; + gap: 16rpx; + padding: 20rpx 18rpx; + border-radius: 18rpx; + margin-bottom: 8rpx; +} + +.drawer-item-hover { + background: var(--chip); +} + +.drawer-item.active { + background: var(--chip-active); +} + +.drawer-item.active .drawer-item-title, +.drawer-item.active .drawer-item-count, +.drawer-item.active .drawer-emoji { + color: var(--chip-active-ink); +} + +.drawer-emoji { + font-size: 28rpx; + width: 40rpx; + text-align: center; + flex-shrink: 0; +} + +.drawer-item-text { + min-width: 0; + display: flex; + flex-direction: column; + gap: 4rpx; +} + +.drawer-item-title { + font-size: 28rpx; + font-weight: 700; + color: var(--ink); +} + +.drawer-item-count { + font-size: 22rpx; + color: var(--ink-faint); +} + +/* Sheet */ +.sheet-root { + position: fixed; + inset: 0; + z-index: 70; + display: flex; + align-items: flex-end; + justify-content: center; +} + +.sheet-mask { + position: absolute; + inset: 0; + background: rgba(10, 15, 20, 0.5); +} + +.sheet-panel { + position: relative; + width: 100%; + max-width: 1120rpx; + background: var(--surface-solid); + border-radius: 28rpx 28rpx 0 0; + padding: 32rpx 28rpx calc(28rpx + env(safe-area-inset-bottom)); + box-shadow: var(--shadow); +} + +.sheet-head { + display: flex; + align-items: center; + gap: 18rpx; + margin-bottom: 24rpx; +} + +.sheet-icon { + width: 72rpx; + height: 72rpx; + border-radius: 18rpx; + background: var(--chip); + flex-shrink: 0; +} + +.sheet-titles { + min-width: 0; + display: flex; + flex-direction: column; + gap: 6rpx; +} + +.sheet-title { + font-size: 32rpx; + font-weight: 800; + color: var(--ink); +} + +.sheet-sub { + font-size: 24rpx; + color: var(--ink-muted); + line-height: 1.4; +} + +.sheet-label { + font-size: 22rpx; + font-weight: 700; + color: var(--ink-faint); + letter-spacing: 0.04em; + text-transform: uppercase; + margin-bottom: 10rpx; +} + +.sheet-url { + padding: 20rpx 18rpx; + border-radius: 18rpx; + background: var(--accent-soft); + border: 2rpx solid rgba(13, 143, 123, 0.35); + font-size: 24rpx; + color: var(--ink); + word-break: break-all; + line-height: 1.5; + user-select: text; +} + +.sheet-actions { + display: flex; + gap: 14rpx; + margin-top: 24rpx; +} + +.sheet-btn { + flex: 1; + min-height: 88rpx; + border-radius: 18rpx; + border: 1rpx solid var(--line) !important; + background: var(--chip) !important; + font-size: 28rpx !important; + font-weight: 700; + color: var(--ink) !important; + display: flex; + align-items: center; + justify-content: center; +} + +.sheet-btn.primary { + flex: 1.6; + background: linear-gradient(180deg, #12a08a, var(--accent-deep)) !important; + color: #fff !important; + border-color: transparent !important; +} + +.sheet-hint { + margin-top: 18rpx; + font-size: 22rpx; + color: var(--ink-faint); + text-align: center; + line-height: 1.4; +} + +.back-top { + position: fixed; + right: 28rpx; + bottom: calc(48rpx + env(safe-area-inset-bottom)); + width: 80rpx; + height: 80rpx; + border-radius: 50%; + background: var(--surface-solid); + box-shadow: var(--shadow); + border: 1rpx solid var(--line); + display: flex; + align-items: center; + justify-content: center; + opacity: 0; + pointer-events: none; + transform: translateY(12rpx); + transition: opacity 0.2s ease, transform 0.2s ease; + z-index: 35; + font-size: 32rpx; + font-weight: 700; + color: var(--ink); +} + +.back-top.show { + opacity: 1; + pointer-events: auto; + transform: translateY(0); +} + +.back-top-hover { + opacity: 0.85; +} + +.toast { + position: fixed; + left: 50%; + bottom: calc(56rpx + env(safe-area-inset-bottom)); + transform: translateX(-50%) translateY(16rpx); + padding: 14rpx 28rpx; + border-radius: 999rpx; + background: var(--toast-bg); + color: var(--toast-ink); + font-size: 24rpx; + font-weight: 600; + opacity: 0; + pointer-events: none; + transition: opacity 0.2s ease, transform 0.2s ease; + z-index: 80; + max-width: 80vw; + text-align: center; +} + +.toast.show { + opacity: 1; + transform: translateX(-50%) translateY(0); +} diff --git a/weapp/project.config.json b/weapp/project.config.json new file mode 100644 index 0000000..65b0504 --- /dev/null +++ b/weapp/project.config.json @@ -0,0 +1,39 @@ +{ + "description": "游民导航 · 微信小程序", + "packOptions": { + "ignore": ["scripts/**", "README.md", "**/*.md"], + "include": [] + }, + "setting": { + "urlCheck": false, + "es6": true, + "enhance": true, + "postcss": true, + "minified": true, + "minifyWXSS": true, + "minifyWXML": true, + "compileWorklet": false, + "uglifyFileName": false, + "uploadWithSourceMap": true, + "packNpmManually": false, + "packNpmRelationList": [], + "localPlugins": false, + "disableUseStrict": false, + "useCompilerPlugins": false, + "condition": false, + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + } + }, + "compileType": "miniprogram", + "libVersion": "3.7.12", + "appid": "touristappid", + "projectname": "youmin-nav", + "condition": {}, + "editorSetting": { + "tabIndent": "insertSpaces", + "tabSize": 2 + } +} diff --git a/weapp/project.private.config.json b/weapp/project.private.config.json new file mode 100644 index 0000000..c242b09 --- /dev/null +++ b/weapp/project.private.config.json @@ -0,0 +1,14 @@ +{ + "description": "本地私有配置,勿提交敏感信息", + "projectname": "youmin-nav", + "setting": { + "urlCheck": false, + "coverView": true, + "lazyloadPlaceholderEnable": false, + "skylineRenderEnable": false, + "preloadBackgroundData": false, + "autoAudits": false, + "showShadowRootInWxmlPanel": true, + "compileHotReLoad": true + } +} diff --git a/weapp/scripts/sync_data.py b/weapp/scripts/sync_data.py new file mode 100644 index 0000000..401cb82 --- /dev/null +++ b/weapp/scripts/sync_data.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 +"""Sync H5 links.json + icons into weapp/ for WeChat DevTools.""" +from __future__ import annotations + +import json +import shutil +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] # weapp/ +PROJ = ROOT.parent # navmini/ +SRC_JSON = PROJ / "src" / "data" / "links.json" +SRC_ICONS = PROJ / "public" / "icons" +OUT_JSON = ROOT / "data" / "links.json" +OUT_ICONS = ROOT / "icons" + + +def main() -> int: + if not SRC_JSON.is_file(): + print(f"missing {SRC_JSON}", file=sys.stderr) + return 1 + + data = json.loads(SRC_JSON.read_text(encoding="utf-8")) + OUT_ICONS.mkdir(parents=True, exist_ok=True) + OUT_JSON.parent.mkdir(parents=True, exist_ok=True) + + for old in OUT_ICONS.glob("*"): + if old.is_file(): + old.unlink() + + needed: list[str] = ["_brand"] + for cat in data.get("categories", []): + for group in cat.get("groups", []): + for link in group.get("links", []): + lid = link["id"] + needed.append(lid) + # 小程序本地路径(相对小程序根目录) + link["icon"] = f"/icons/{lid}.webp" + + missing = [] + for lid in needed: + src = SRC_ICONS / f"{lid}.webp" + dst = OUT_ICONS / f"{lid}.webp" + if not src.is_file(): + missing.append(lid) + continue + shutil.copy2(src, dst) + + if missing: + print("warn missing icons:", ", ".join(missing), file=sys.stderr) + + data["brandIcon"] = "/icons/_brand.webp" + + OUT_JSON.write_text( + json.dumps(data, ensure_ascii=False, indent=2) + "\n", + encoding="utf-8", + ) + + icon_count = len(list(OUT_ICONS.glob("*.webp"))) + print(f"synced data/links.json + {icon_count} icons -> {ROOT}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/weapp/sitemap.json b/weapp/sitemap.json new file mode 100644 index 0000000..fd4f201 --- /dev/null +++ b/weapp/sitemap.json @@ -0,0 +1,9 @@ +{ + "desc": "游民导航", + "rules": [ + { + "action": "allow", + "page": "*" + } + ] +} diff --git a/xhs/README.md b/xhs/README.md new file mode 100644 index 0000000..37415b1 --- /dev/null +++ b/xhs/README.md @@ -0,0 +1,56 @@ +# 游民导航 · 小红书小工具 + +纯离线小红书小工具(对齐 [redmini](../../redmini) 打包规范)。**不能联网、不能打开外链、也不能程序写入剪贴板**(官方禁用 `navigator.clipboard` / `execCommand('copy')`)。 + +点击入口会: + +1. **底部弹窗**展示标题 / 简介 / **完整网址** +2. **自动选中网址**(或点「选中网址」),引导用户**手动复制** + +数据与图标同步自仓库 H5:`src/data/links.json`、`public/icons/`。 + +## 约束(官方) + +| 项 | 说明 | +|----|------| +| 网络 | 禁止 `fetch` / CDN / 外链资源 | +| 脚本 | 仅经典 ` + + diff --git a/xhs/tool/nav-data.js b/xhs/tool/nav-data.js new file mode 100644 index 0000000..f85b05c --- /dev/null +++ b/xhs/tool/nav-data.js @@ -0,0 +1,587 @@ +/* generated by scripts/sync_data.py — do not edit */ +var NAV_DATA = { + "brand": "游民导航", + "tagline": "数字游民工具与出海资源合集", + "footer": "2026 游民导航", + "categories": [ + { + "id": "nomad", + "title": "数字游民", + "emoji": "✦", + "groups": [ + { + "id": "community", + "title": "游民社区", + "links": [ + { + "id": "nomadro", + "title": "nomadro", + "subtitle": "出海导航", + "href": "https://nomadro.com", + "icon": "./icons/nomadro.webp" + }, + { + "id": "nomadlist", + "title": "nomadlist", + "subtitle": "海外最大的数字游民社区", + "href": "https://nomads.com?ref=https://nomadro.com", + "icon": "./icons/nomadlist.webp" + }, + { + "id": "nomadcna", + "title": "nomadcna", + "subtitle": "国内数字游民社区", + "href": "https://meetup.hackrobot.cn", + "icon": "./icons/nomadcna.webp" + } + ] + }, + { + "id": "toolbox", + "title": "工具箱", + "links": [ + { + "id": "chatgpt", + "title": "ChatGPT", + "subtitle": "OpenAI 开发的人工智能聊天机器人", + "href": "https://chat.openai.com/", + "icon": "./icons/chatgpt.webp" + }, + { + "id": "grok", + "title": "Grok", + "subtitle": "xAI 免费 AI 助手,追求真实与客观", + "href": "https://grok.com/", + "icon": "./icons/grok.webp" + } + ] + }, + { + "id": "us-phone", + "title": "美国手机号", + "links": [ + { + "id": "1psim", + "title": "1psim", + "subtitle": "低成本 2.5$/m,支持 eSIM 和实体卡(邮寄中国)", + "href": "https://1psim.com/7GARRL", + "icon": "./icons/1psim.webp" + }, + { + "id": "yesim", + "title": "yesim", + "subtitle": "美国手机号,3$/m", + "href": "https://yesim.app/?partner_id=1948", + "icon": "./icons/yesim.webp" + }, + { + "id": "tello", + "title": "tello", + "subtitle": "最低 5$/m,支持 eSIM", + "href": "https://tello.com/", + "icon": "./icons/tello.webp" + }, + { + "id": "9esim", + "title": "9esim", + "subtitle": "让任何手机支持 eSIM,可写数据的 SIM 实体卡", + "href": "https://www.9esim.com/?coupon=XIAOSHUANGERIC2", + "icon": "./icons/9esim.webp" + } + ] + }, + { + "id": "finance", + "title": "金融收款", + "links": [ + { + "id": "wise", + "title": "wise", + "subtitle": "线上开通境外银行账户(身份证即可)", + "href": "https://wise.com/invite/amc/xiaoshuangh", + "icon": "./icons/wise.webp" + }, + { + "id": "okx", + "title": "OKX 交易所", + "subtitle": "加密货币交易所", + "href": "https://okx.com/join/84999861", + "icon": "./icons/okx.webp" + }, + { + "id": "safepal", + "title": "safepal (U卡)", + "subtitle": "邀请码 104809,出海神卡,加密货币与法币转换", + "href": "https://www.safepal.com/zh-cn/", + "icon": "./icons/safepal.webp" + }, + { + "id": "paypal", + "title": "paypal", + "subtitle": "出海收款必备,TikTok 提现、佣金提现", + "href": "https://py.pl/1tyAwY", + "icon": "./icons/paypal.webp" + }, + { + "id": "bmc", + "title": "buy me coffee", + "subtitle": "赞助收款平台", + "href": "https://www.buymeacoffee.com/invite/xiaoshuangi", + "icon": "./icons/bmc.webp" + } + ] + } + ] + }, + { + "id": "studio", + "title": "工作室", + "emoji": "☕", + "groups": [ + { + "id": "proxy", + "title": "科学上网", + "links": [ + { + "id": "jms", + "title": "just my socks", + "subtitle": "老牌网络代理服务", + "href": "https://justmysocks.net/members/aff.php?aff=12475", + "icon": "./icons/jms.webp" + }, + { + "id": "ykk", + "title": "Ykk Cloud", + "subtitle": "性价比高的网络加速服务", + "href": "https://panel.ykkk.best/#/register?code=xYQebIgT", + "icon": "./icons/ykk.webp" + } + ] + }, + { + "id": "vps", + "title": "VPS 服务器", + "links": [ + { + "id": "vultr", + "title": "vultr", + "subtitle": "可按分钟计费的服务器(可支付宝)", + "href": "https://www.vultr.com/?ref=8985003", + "icon": "./icons/vultr.webp" + }, + { + "id": "bwh", + "title": "bandwagonhost", + "subtitle": "针对中国线路优化的高质量 VPS", + "href": "https://bandwagonhost.com/aff.php?aff=25463", + "icon": "./icons/bwh.webp" + }, + { + "id": "racknerd", + "title": "RackNerd", + "subtitle": "最便宜的美国 VPS 服务器", + "href": "https://my.racknerd.com/aff.php?aff=15630", + "icon": "./icons/racknerd.webp" + }, + { + "id": "qcloud", + "title": "腾讯云", + "subtitle": "腾讯服务器,国内速度快", + "href": "https://curl.qcloud.com/BZZ2MBTN", + "icon": "./icons/qcloud.webp" + }, + { + "id": "aliyun", + "title": "阿里云", + "subtitle": "阿里巴巴旗下 VPS 服务器", + "href": "https://www.aliyun.com/minisite/goods?userCode=dii0ofzg", + "icon": "./icons/aliyun.webp" + }, + { + "id": "colocrossing", + "title": "colocrossing", + "subtitle": "美国 VPS 服务商", + "href": "https://cloud.colocrossing.com/aff.php?aff=1846", + "icon": "./icons/colocrossing.webp" + } + ] + }, + { + "id": "resi-ip", + "title": "静态住宅 IP", + "links": [ + { + "id": "iproyal", + "title": "iproyal", + "subtitle": "静态住宅 IP,出海必备", + "href": "https://iproyal.cn/?r=nomadro", + "icon": "./icons/iproyal.webp" + }, + { + "id": "proxy-cheap", + "title": "proxy-cheap", + "subtitle": "便宜的住宅 IP", + "href": "https://app.proxy-cheap.com/r/bmcMoY", + "icon": "./icons/proxy-cheap.webp" + }, + { + "id": "smartproxy", + "title": "smartproxy", + "subtitle": "静态住宅 IP 服务商", + "href": "https://www.smartproxy.org/register/?invitation_code=7RXPLM", + "icon": "./icons/smartproxy.webp" + } + ] + }, + { + "id": "resi-vps", + "title": "住宅 VPS 服务器", + "links": [ + { + "id": "lisa", + "title": "lisa", + "subtitle": "住宅 IP 服务器,TikTok 必备", + "href": "https://lisahost.com/aff.php?aff=7566", + "icon": "./icons/lisa.webp" + }, + { + "id": "voyracloud", + "title": "voyracloud", + "subtitle": "静态住宅 IP 服务器", + "href": "https://www.voyracloud.com/?ref_code=2LJPRTE5", + "icon": "./icons/voyracloud.webp" + } + ] + }, + { + "id": "hardware", + "title": "硬件", + "links": [ + { + "id": "rpi", + "title": "树莓派", + "subtitle": "无与伦比的 ARM 开发板", + "href": "https://uland.taobao.com/coupon/edetail?e=5hkWkiThOmClhHvvyUNXZfh8CuWt5YH5OVuOuRD5gLJMmdsrkidbOWBzzpT26idJPSbzO0ArF68ertbZl9wqRUbeJevxT02sHgNIxyFsmaMOsi2OxhyQb%2BhYUTTNN7GRRSHvQe2jOLZ9pbNCYX0I%2BPP%2BWUTgK%2F%2B0I%2BtaUgbudUxA%2B536asYsLWVfKa%2BhVnND4NyB1fwjO3bJLf667Yy8Q5jB6TX2HR3Qrq8LCw4Dujjqyaqc1rGLUwdQHHM8iY%2BUDMxLRSiIntldeBz90au3REAmOgZ0RtdnfeSBK3KXa0%2FA9snq37kKL6zL4bZ3EAS%2F2oYsLHTsIOxroXBFP6oz%2BA%3D%3D&traceId=213e032e17650447230113327e0c4f&union_lens=lensId%3APUB%401765044691%400b521400_0da4_19af4dca231_da77%400290EZjuZ2xbgOlH3NTYAyI%40eyJmbG9vcklkIjoyMDg3MTcxMDEwLCJzcG1CIjoiiX3BvcnRhbF92Ml90b29sX3NlbGVjdGlvbmxpc3RfZGV0YWlsX2luZGV4X2h0bSIsInNyY0Zsb29ySWQiiOiiI4MDY2NCJ9", + "icon": "./icons/rpi.webp" + }, + { + "id": "mini-pc", + "title": "迷你主机", + "subtitle": "具有性价比的 X86 小主机", + "href": "https://s.click.taobao.com/t?e=m%3D2%26s%3DCb1Quo%2F0Wb5w4vFB6t2Z2ueEDrYVVa64YUrQeSeIhnK53hKxp7mNFuhCZFSw9yq2woqx0EHqItb0JlhLk0Jl4eVWmNyHytKdTKJ80yOOA0Mtd0e5Ku7CIDk5ffgV5fRI1qrpxiwMoCNxc1AtbZGVS936JshS%2F%2FIdwgQgG5hIzyLNEPXytV9ALtCLThlbPuuZLb93Df8fOziGg7JVKZos%2BjLJJgRsfWlWtajntMnDLEHhuApO%2F8klJ62RdK%2B6%2FP7Z6k6s3rDgsC6jO9AJYjY8CXJ%2BwEVkOqHFPSJJXArlDuzso5nyPLY4NPiLqets6lIJ", + "icon": "./icons/mini-pc.webp" + }, + { + "id": "gpu", + "title": "GPU 显卡", + "subtitle": "AI 时代的算力基础设施", + "href": "https://union-click.jd.com/jdc?e=618%7Cpc%7C&p=JF8BATUJK1olXwEDUFZVCkkRC18IGloWWwALV19aAUonRzBQRQQlBENHFRxWFlVPRjtUBABAQlRcCEBdCUoUBWkBGFoSVAcdDRsBVXsQB29pbiZRKGMHKlclCEgVWghcGV91UQoyVW5dCUoWAmYPHl4RbTYCU24fZp-esLulkIK0yd6n5V1eOEonA2kPH1oQWQUFV19VCnsQA2Y4El0dWQ4LU1hBC00SCmcJK2slXjYFVFdJDjlWUXsOaWslXTYBZF5cCEoQAGoLH1kRQQYHV1lbAFcXBWgMGl4RXgUKUllYOEkWAmsBK2vL05J3IB9Uajl8UStqSz4dFQ9jitDJGTlnA2sPH0olImF5ECFaSU0VVAdNQDxuW09KFiw8SyljbW1jcih3JWNxNlwaS0hqWBhoX2sQbQEEVW4", + "icon": "./icons/gpu.webp" + } + ] + }, + { + "id": "software", + "title": "软件", + "links": [ + { + "id": "3x-ui", + "title": "3X-UI", + "subtitle": "科学上网仪表盘", + "href": "https://github.com/MHSanaei/3x-ui", + "icon": "./icons/3x-ui.webp" + }, + { + "id": "mihomo", + "title": "虚空终端 mihomo", + "subtitle": "代理软件以及配置 wiki", + "href": "https://wiki.metacubex.one/config/", + "icon": "./icons/mihomo.webp" + }, + { + "id": "frp", + "title": "frp", + "subtitle": "高性能内网穿透", + "href": "https://gofrp.org/zh-cn/docs/", + "icon": "./icons/frp.webp" + }, + { + "id": "wireguard", + "title": "wireguard", + "subtitle": "P2P 打洞组网", + "href": "https://github.com/WireGuard/wireguard-go", + "icon": "./icons/wireguard.webp" + }, + { + "id": "lineageos", + "title": "lineageos (pi5)", + "subtitle": "树莓派的安卓 LineageOS", + "href": "https://konstakang.com/devices/rpi5/", + "icon": "./icons/lineageos.webp" + } + ] + }, + { + "id": "gear", + "title": "数码装备", + "links": [ + { + "id": "ai-glasses", + "title": "AI 眼镜", + "subtitle": "第一视角拍摄", + "href": "https://union-click.jd.com/jdc?e=618%7Cpc%7C&p=JF8BATkJK1olXw8AXVxfCU8UA18IGloVWwcKXFlZDUgnRzBQRQQlBENHFRxWFlVPRjtUBABAQlRcCEBdCUoXBW4AE1wRWAUdDRsBVXtwXw1pZzNKAmZgFFwlYUh8UzVBZyZlUQoyVW5dCUoWAmYPHl4RbTYCU24fZpO9hbeBtYKjxt-jwInikZ-fjV8JK1sTWgIDUVtVAEkVA2w4HFscbQ8EXFpVAUwRH2wOHlIdXDYyZF1tD0seF2l6WgkBW3QyZF5tC3sXAm8AGFsVXAEBXEJdDUMVB24UG10SWQcHUVZbAE8fCl8KGloRVDYyitPtY0JrQAYIYj0dXGZKMVc5T5Was35jYlMVXQUTZAQOch9SZTMNbC9gIGdQJi5VCzkRSCpfWDUXVAJlDQoCbw1gcG9qRwYdHnYyUW5aDEgn", + "icon": "./icons/ai-glasses.webp" + }, + { + "id": "action-cam", + "title": "运动相机", + "subtitle": "骑行记录仪", + "href": "https://union-click.jd.com/jdc?e=618%7Cpc%7C&p=JF8BASgJK1olXDYCVV9eCE0UB28ME1slGVlaCgFtUQ5SQi0DBUVNGFJeSwUIFxlJX3EIGloWXQABUF5ZAEsIWipURmt3CFhXIQkpbChuRy8JGDpRJUJQDwkbBEcnAl8IGloUXA8FUVtZOHsXBF9edVsUXAcDVV1fDEonAl8IHVwRXAMGVVpaDEsUM2gIEmscWw4GXFdaDlcUBWoBE1olbTYBZFldAV8RcS5aD11nbTYCZF1tCEoXAmsNHl8UXQQeVF1ZDE0UH28OHF8UWAIDUVddCkgnAW4JH1IlbdiMwDxcaAJfBTlNTRpCBHpHLhyDht8GcR8BHFIUTDZ6NSMpYRJweWtBfAUXC2JyXBkpfTNRWi1mGV4UAlgENFpeDA13cRRcTAJLbQMyU1peOA", + "icon": "./icons/action-cam.webp" + }, + { + "id": "drone", + "title": "无人机", + "subtitle": "天空视角", + "href": "https://union-click.jd.com/jdc?e=618%7Cpc%7C&p=JF8BASgJK1olXDYCVV9eAUIeB2YMH14lGVlaCgFtUQ5SQi0DBUVNGFJeSwUIFxlJX3EIGloWVA8LUFdZDE4IWipURmtCHHVEABsFVChPYRJAbVhlGRhbFRgLBEcnAl8IGloUXA8FUVtZOHsXBF9edVsUXAcDVV1fDEonAl8IHVwRXAMGVVdbC04VM2gIEmscWw4GXFdaDlcUBWoBE1olbTYBZFldAV8RcS5aD11nbTYCZF1tCEoXAmgLHlgRXgIeVFpfDU0UH28OHF8UWAIDUlteAUwnAW4JH1IlbdiMwCQvcipMBxJhfV9HGgF3FVaDht8GfxgBGVkRTDZUCjsVbzBTYRJbeRkWGG9WAx02D0JcUy5mGRNRFEJiUwgldStzfx1wTj1GbQMyU1peOA", + "icon": "./icons/drone.webp" + } + ] + } + ] + }, + { + "id": "overseas", + "title": "出海掘金", + "emoji": "◎", + "groups": [ + { + "id": "tiktok", + "title": "TikTok", + "links": [ + { + "id": "tiktok", + "title": "TikTok", + "subtitle": "全球直播平台", + "href": "https://www.tiktok.com/", + "icon": "./icons/tiktok.webp" + }, + { + "id": "cloud-phone", + "title": "云手机", + "subtitle": "用开源硬件打造云手机", + "href": "https://www.hackrobot.cn/", + "icon": "./icons/cloud-phone.webp" + }, + { + "id": "vcam", + "title": "vcam 虚拟摄像头", + "subtitle": "Xposed 模块,替换摄像头视频流", + "href": "https://pan.baidu.com/s/1NW4GMGA3cxfUQNWZPD9vOg?pwd=live", + "icon": "./icons/vcam.webp" + } + ] + }, + { + "id": "youtube", + "title": "YouTube", + "links": [ + { + "id": "youtube", + "title": "YouTube", + "subtitle": "全球最大的视频网站", + "href": "https://www.youtube.com/", + "icon": "./icons/youtube.webp" + }, + { + "id": "smmfollows", + "title": "smmfollows", + "subtitle": "刷粉刷量平台", + "href": "https://smmfollows.com/ref/dfugq", + "icon": "./icons/smmfollows.webp" + }, + { + "id": "yt-auto-dismiss", + "title": "YouTube Studio Auto Dismiss", + "subtitle": "油猴脚本,无人直播辅助", + "href": "https://greasyfork.org/zh-CN/scripts/557378-youtube-studio-auto-dismiss", + "icon": "./icons/yt-auto-dismiss.webp" + } + ] + }, + { + "id": "web", + "title": "Web 网站", + "links": [ + { + "id": "namesilo", + "title": "namesilo", + "subtitle": "注册域名", + "href": "https://www.namesilo.com/?rid=3bd4047mc", + "icon": "./icons/namesilo.webp" + }, + { + "id": "aapanel", + "title": "aapanel", + "subtitle": "宝塔面板", + "href": "https://www.aapanel.com?referral_code=wcn04vez", + "icon": "./icons/aapanel.webp" + }, + { + "id": "cloudflare", + "title": "Cloudflare", + "subtitle": "互联网基础节点", + "href": "https://www.cloudflare.com/", + "icon": "./icons/cloudflare.webp" + }, + { + "id": "ga", + "title": "Google Analytics", + "subtitle": "网站流量统计服务", + "href": "https://analytics.google.com/", + "icon": "./icons/ga.webp" + }, + { + "id": "adsense", + "title": "Google AdSense", + "subtitle": "Google 广告服务", + "href": "https://www.google.com/adsense/", + "icon": "./icons/adsense.webp" + } + ] + } + ] + }, + { + "id": "live", + "title": "无人直播", + "emoji": "▷", + "groups": [ + { + "id": "live-soft", + "title": "软件", + "links": [ + { + "id": "obs", + "title": "OBS", + "subtitle": "免费开源:录屏 / 推流直播", + "href": "https://pan.quark.cn/s/03e89f1bbc9b", + "icon": "./icons/obs.webp" + }, + { + "id": "ffmpeg", + "title": "ffmpeg", + "subtitle": "命令行视频处理 / 推流,Python 自动化", + "href": "https://www.ffmpeg.org/download.html", + "icon": "./icons/ffmpeg.webp" + }, + { + "id": "srs", + "title": "SRS", + "subtitle": "开源直播服务器,拉流推流中转", + "href": "https://ossrs.io/", + "icon": "./icons/srs.webp" + } + ] + } + ] + }, + { + "id": "pay", + "title": "支付网关", + "emoji": "◇", + "groups": [ + { + "id": "merchant", + "title": "小微商户", + "links": [ + { + "id": "nowpayments", + "title": "NOWPayments", + "subtitle": "加密货币收款", + "href": "https://account.nowpayments.io/create-account?link_id=3680795921", + "icon": "./icons/nowpayments.webp" + }, + { + "id": "creem", + "title": "Creem", + "subtitle": "软件出海收款,税务合规", + "href": "https://www.creem.io/", + "icon": "./icons/creem.webp" + }, + { + "id": "stripe", + "title": "Stripe", + "subtitle": "全球在线支付", + "href": "https://stripe.com/", + "icon": "./icons/stripe.webp" + }, + { + "id": "zpay", + "title": "z-pay", + "subtitle": "支持独角数卡 · 易支付", + "href": "https://z-pay.cn/?uid=22119", + "icon": "./icons/zpay.webp" + }, + { + "id": "xorpay", + "title": "xorpay", + "subtitle": "支持收银台支付", + "href": "https://xorpay.com?r=nomadro", + "icon": "./icons/xorpay.webp" + } + ] + } + ] + }, + { + "id": "books", + "title": "书籍", + "emoji": "◈", + "groups": [ + { + "id": "handbook", + "title": "手册", + "links": [ + { + "id": "nomad-book", + "title": "数字游民手册", + "subtitle": "复制链接后在小红书打开", + "href": "https://www.xiaohongshu.com/s/poster?bgimg=https%3A%2F%2Fsns-redskillhub-s1.xhscdn.com%2Fred_app_image%2F1040g4m8325ke1q36l0404a4druqrlvd5valvb80%3Fsign%3Dbc0c41c2e219f6ca904f52176bd17f54%26t%3D6c9a7a85&xhsshare=&appuid=5acc75ba4eacab15c751fda5&apptime=1790527237&deeplink=xhsdiscover%3A%2F%2FminiTool%2F6ab8984da1e3af0015584e92%3Fsource%3Dh5%26page_key%3D28%26xhsMpScreenMode%3Dfull%26share_id%3D5e90e5979b054c8baf8b3db4c8993d79%26share_channel%3Dcopy_link", + "icon": "./icons/nomad-book.webp", + "action": "copy" + } + ] + } + ] + }, + { + "id": "forum", + "title": "论坛社区", + "emoji": "◉", + "groups": [ + { + "id": "blog", + "title": "博客", + "links": [ + { + "id": "yidu", + "title": "异度世界", + "subtitle": "独立博客,Hugo 搭建", + "href": "https://blog.hackrobot.cn", + "icon": "./icons/yidu.webp" + }, + { + "id": "dsx", + "title": "大师兄", + "subtitle": "AI 实践", + "href": "https://dsx2016.com", + "icon": "./icons/dsx.webp" + } + ] + } + ] + } + ], + "brandIcon": "./icons/_brand.webp" +}; diff --git a/xhs/tool/styles.css b/xhs/tool/styles.css new file mode 100644 index 0000000..ced7909 --- /dev/null +++ b/xhs/tool/styles.css @@ -0,0 +1,944 @@ +:root, +[data-theme="light"] { + --bg: #e9eef4; + --bg-elevated: #f7fafc; + --ink: #15202b; + --ink-muted: #5b6b7c; + --ink-faint: #8a98a8; + --line: rgba(21, 32, 43, 0.08); + --surface: rgba(255, 255, 255, 0.88); + --surface-solid: #ffffff; + --accent: #0d8f7b; + --accent-deep: #0a6e5f; + --accent-soft: rgba(13, 143, 123, 0.12); + --glow-a: rgba(13, 143, 123, 0.2); + --glow-b: rgba(56, 120, 180, 0.14); + --shadow: 0 8px 24px rgba(21, 32, 43, 0.08); + --shadow-card: 0 1px 2px rgba(21, 32, 43, 0.04), 0 6px 16px rgba(21, 32, 43, 0.04); + --toast-bg: #15202b; + --toast-ink: #f4f7fa; + --chip: rgba(21, 32, 43, 0.045); + --chip-active: #15202b; + --chip-active-ink: #f7fafc; + --topbar-bg: rgba(233, 238, 244, 0.9); + --font: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", + "Microsoft YaHei", "Noto Sans SC", sans-serif; + --radius: 14px; + --app-pad-top: 80px; + --safe-bottom: env(safe-area-inset-bottom, 0px); +} + +[data-theme="dark"] { + --bg: #0a0f14; + --bg-elevated: #121820; + --ink: #e8eef4; + --ink-muted: #8b99a8; + --ink-faint: #5d6c7c; + --line: rgba(232, 238, 244, 0.1); + --surface: rgba(18, 24, 32, 0.92); + --surface-solid: #121820; + --accent: #3dceb8; + --accent-deep: #2aa892; + --accent-soft: rgba(61, 206, 184, 0.14); + --glow-a: rgba(61, 206, 184, 0.14); + --glow-b: rgba(70, 130, 200, 0.12); + --shadow: 0 10px 28px rgba(0, 0, 0, 0.35); + --shadow-card: 0 1px 0 rgba(255, 255, 255, 0.03), 0 8px 20px rgba(0, 0, 0, 0.28); + --toast-bg: #e8eef4; + --toast-ink: #0a0f14; + --chip: rgba(232, 238, 244, 0.06); + --chip-active: #e8eef4; + --chip-active-ink: #0a0f14; + --topbar-bg: rgba(10, 15, 20, 0.9); +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html, +body { + margin: 0; + min-height: 100%; + background: var(--bg); + color: var(--ink); + font-family: var(--font); + -webkit-font-smoothing: antialiased; + -webkit-tap-highlight-color: transparent; +} + +button { + font: inherit; + color: inherit; + border: none; + background: none; + padding: 0; + cursor: pointer; +} + +img { + display: block; +} + +.app-shell { + position: relative; + min-height: 100vh; + isolation: isolate; +} + +.bg-glow { + position: fixed; + inset: 0; + pointer-events: none; + z-index: 0; + overflow: hidden; + background: + radial-gradient(680px 380px at 8% -12%, var(--glow-a), transparent 58%), + radial-gradient(560px 320px at 100% 4%, var(--glow-b), transparent 55%), + var(--bg); +} + +.orb { + position: absolute; + border-radius: 50%; + opacity: 0.5; +} + +.orb-a { + width: 200px; + height: 200px; + left: -60px; + top: 18%; + background: radial-gradient(circle, var(--glow-a), transparent 70%); +} + +.orb-b { + width: 240px; + height: 240px; + right: -80px; + top: 42%; + background: radial-gradient(circle, var(--glow-b), transparent 70%); +} + +.topbar { + position: sticky; + top: 0; + z-index: 30; + display: flex; + align-items: center; + gap: 10px; + padding: calc(var(--app-pad-top) + 8px) 12px 10px; + background: var(--topbar-bg); + backdrop-filter: blur(14px); + -webkit-backdrop-filter: blur(14px); + border-bottom: 1px solid var(--line); +} + +.icon-btn { + width: 36px; + height: 36px; + border-radius: 11px; + background: var(--surface); + border: 1px solid var(--line); + box-shadow: var(--shadow-card); + display: grid; + place-items: center; + flex-shrink: 0; + font-size: 1rem; +} + +.icon-btn:active { + transform: scale(0.94); +} + +.menu-bars { + display: flex; + flex-direction: column; + gap: 3.5px; + width: 14px; +} + +.menu-bars i { + display: block; + height: 1.5px; + border-radius: 1px; + background: var(--ink); +} + +.brand-mark { + display: flex; + align-items: center; + gap: 8px; + min-width: 0; + flex: 1; +} + +.brand-logo { + width: 28px; + height: 28px; + border-radius: 8px; + object-fit: cover; + border: 1px solid var(--line); +} + +.brand-text { + min-width: 0; + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: center; + gap: 2px; +} + +.brand-name { + margin: 0; + font-size: 1rem; + font-weight: 700; + letter-spacing: -0.02em; + line-height: 1.2; +} + +.brand-current { + margin: 0; + max-width: 100%; + font-size: 0.72rem; + font-weight: 600; + letter-spacing: -0.01em; + line-height: 1.25; + color: var(--accent-deep); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +[data-theme="dark"] .brand-current { + color: var(--accent); +} + +.page { + position: relative; + z-index: 1; + padding: 12px 12px calc(72px + var(--safe-bottom)); +} + +.cat-panel + .cat-panel { + margin-top: 22px; +} + +.cat-panel { + scroll-margin-top: calc(var(--app-pad-top) + 52px); +} + +.cat-heading { + display: flex; + align-items: center; + gap: 8px; + margin: 0 0 10px; + padding-left: 10px; + position: relative; +} + +.cat-heading::before { + content: ""; + position: absolute; + left: 0; + top: 0.25em; + bottom: 0.25em; + width: 3px; + border-radius: 99px; + background: var(--accent); +} + +.cat-heading h2 { + margin: 0; + font-size: 1.05rem; + font-weight: 700; +} + +.cat-count { + font-size: 0.66rem; + font-weight: 700; + color: var(--accent-deep); + background: var(--accent-soft); + padding: 2px 7px; + border-radius: 999px; +} + +[data-theme="dark"] .cat-count { + color: var(--accent); +} + +.group-block + .group-block { + margin-top: 12px; +} + +.group-title { + margin: 0 0 7px; + font-size: 0.7rem; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; + color: var(--ink-faint); +} + +.link-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 7px; +} + +.link-card { + display: flex; + align-items: center; + gap: 8px; + width: 100%; + min-width: 0; + text-align: left; + padding: 9px; + border-radius: var(--radius); + background: var(--surface); + border: 1px solid var(--line); + box-shadow: var(--shadow-card); +} + +.link-card:active { + transform: scale(0.978); +} + +.link-icon-wrap { + width: 34px; + height: 34px; + border-radius: 10px; + overflow: hidden; + border: 1px solid var(--line); + background: var(--chip); + flex-shrink: 0; +} + +.link-icon { + width: 100%; + height: 100%; + object-fit: cover; +} + +.link-meta { + min-width: 0; + flex: 1; +} + +.link-title { + display: block; + font-size: 0.82rem; + font-weight: 700; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.link-desc { + display: block; + margin-top: 2px; + font-size: 0.65rem; + color: var(--ink-muted); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.footer { + margin-top: 28px; + padding-top: 14px; + border-top: 1px solid var(--line); + text-align: center; + font-size: 0.7rem; + color: var(--ink-faint); +} + +.drawer-root { + position: fixed; + inset: 0; + z-index: 60; + pointer-events: none; +} + +.drawer-root.open { + pointer-events: auto; +} + +.drawer-mask { + position: absolute; + inset: 0; + background: rgba(8, 12, 18, 0.46); + opacity: 0; + transition: opacity 0.22s ease; +} + +.drawer-root.open .drawer-mask { + opacity: 1; +} + +.drawer-panel { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: min(80vw, 300px); + background: var(--bg-elevated); + border-right: 1px solid var(--line); + box-shadow: var(--shadow); + transform: translateX(-104%); + transition: transform 0.26s cubic-bezier(0.22, 1, 0.36, 1); + display: flex; + flex-direction: column; + padding: calc(var(--app-pad-top) + 4px) 0 calc(16px + var(--safe-bottom)); +} + +.drawer-root.open .drawer-panel { + transform: translateX(0); +} + +.drawer-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + padding: 4px 12px 12px; + border-bottom: 1px solid var(--line); +} + +.drawer-brand-wrap { + display: flex; + align-items: center; + gap: 8px; + min-width: 0; +} + +.drawer-brand-wrap img { + width: 28px; + height: 28px; + border-radius: 8px; + object-fit: cover; + border: 1px solid var(--line); +} + +.drawer-brand { + display: block; + font-weight: 700; + font-size: 1rem; +} + +.drawer-sub { + display: block; + margin-top: 2px; + font-size: 0.68rem; + color: var(--ink-muted); +} + +.drawer-nav { + padding: 12px 10px; + overflow-y: auto; + -webkit-overflow-scrolling: touch; +} + +.drawer-item { + display: flex; + align-items: center; + gap: 10px; + width: 100%; + text-align: left; + padding: 12px; + border-radius: 12px; + color: var(--ink-muted); + margin-bottom: 4px; +} + +.drawer-item.active { + background: var(--accent-soft); + color: var(--accent); +} + +.drawer-item-title { + flex: 1; + font-size: 0.92rem; + font-weight: 600; + color: inherit; +} + +.drawer-item.active .drawer-item-title { + color: var(--ink); +} + +.drawer-item-count { + font-size: 0.68rem; + font-weight: 650; + background: var(--chip); + color: var(--ink-faint); + padding: 2px 7px; + border-radius: 999px; +} + +.back-top { + position: fixed; + right: 14px; + bottom: calc(18px + var(--safe-bottom)); + width: 40px; + height: 40px; + border-radius: 14px; + background: var(--chip-active); + color: var(--chip-active-ink); + box-shadow: var(--shadow); + opacity: 0; + pointer-events: none; + transform: translateY(8px); + transition: opacity 0.2s ease, transform 0.2s ease; + z-index: 40; + font-size: 1rem; +} + +.back-top.show { + opacity: 1; + pointer-events: auto; + transform: translateY(0); +} + +/* Link detail sheet */ +.sheet-root { + position: fixed; + inset: 0; + z-index: 70; + pointer-events: none; +} + +.sheet-root.open { + pointer-events: auto; +} + +.sheet-mask { + position: absolute; + inset: 0; + background: rgba(8, 12, 18, 0.48); + opacity: 0; + transition: opacity 0.22s ease; +} + +.sheet-root.open .sheet-mask { + opacity: 1; +} + +.sheet-panel { + position: absolute; + left: 0; + right: 0; + bottom: 0; + max-height: min(86vh, 640px); + overflow-y: auto; + -webkit-overflow-scrolling: touch; + background: var(--bg-elevated); + border-radius: 20px 20px 0 0; + border: 1px solid var(--line); + border-bottom: none; + box-shadow: var(--shadow); + padding: 10px 16px calc(16px + var(--safe-bottom)); + transform: translateY(108%); + transition: transform 0.28s cubic-bezier(0.22, 1, 0.36, 1); + display: flex; + flex-direction: column; + gap: 12px; +} + +.sheet-root.open .sheet-panel { + transform: translateY(0); +} + +.sheet-handle { + width: 36px; + height: 4px; + border-radius: 99px; + background: var(--chip); + margin: 0 auto 4px; +} + +.sheet-head { + display: flex; + align-items: center; + gap: 12px; +} + +.sheet-icon { + width: 44px; + height: 44px; + border-radius: 12px; + object-fit: cover; + border: 1px solid var(--line); + background: var(--chip); + flex-shrink: 0; +} + +.sheet-head-text { + min-width: 0; + flex: 1; +} + +.sheet-title { + margin: 0; + font-size: 1.05rem; + font-weight: 700; + letter-spacing: -0.02em; +} + +.sheet-sub { + margin: 4px 0 0; + font-size: 0.78rem; + color: var(--ink-muted); + line-height: 1.35; +} + +/* Visual guide steps */ +.guide-steps { + list-style: none; + margin: 0; + padding: 10px; + border-radius: 14px; + background: var(--chip); + border: 1px solid var(--line); + display: flex; + flex-direction: column; + gap: 8px; +} + +.guide-step { + display: flex; + align-items: flex-start; + gap: 10px; + opacity: 0.42; + transition: opacity 0.25s ease, transform 0.25s ease; + transform: translateX(0); +} + +.guide-step.is-active { + opacity: 1; + transform: translateX(2px); +} + +.guide-step.is-done { + opacity: 0.78; +} + +.guide-step.is-done .guide-num { + background: var(--accent); + color: #fff; +} + +.guide-num { + width: 24px; + height: 24px; + border-radius: 50%; + flex-shrink: 0; + display: grid; + place-items: center; + font-size: 0.75rem; + font-weight: 800; + background: var(--surface-solid); + border: 1px solid var(--line); + color: var(--ink-muted); +} + +.guide-step.is-active .guide-num { + background: var(--chip-active); + color: var(--chip-active-ink); + border-color: transparent; + box-shadow: 0 0 0 4px var(--accent-soft); + animation: num-pop 0.35s ease; +} + +.guide-text { + display: flex; + flex-direction: column; + gap: 2px; + min-width: 0; + padding-top: 1px; +} + +.guide-text strong { + font-size: 0.84rem; + font-weight: 750; + color: var(--ink); +} + +.guide-text em { + font-style: normal; + font-size: 0.72rem; + color: var(--ink-muted); +} + +.sheet-label { + margin: 0 0 8px; + font-size: 0.7rem; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; + color: var(--ink-faint); +} + +.url-stage { + position: relative; +} + +.sheet-url-wrap { + position: relative; +} + +.sheet-url-box { + padding: 14px 12px; + border-radius: 14px; + background: color-mix(in srgb, var(--accent) 8%, var(--surface-solid)); + border: 2px solid color-mix(in srgb, var(--accent) 45%, var(--line)); + font-size: 0.86rem; + line-height: 1.5; + word-break: break-all; + user-select: text; + -webkit-user-select: text; + color: var(--ink); + transition: box-shadow 0.25s ease, border-color 0.25s ease, background 0.25s ease; + position: relative; + z-index: 1; +} + +.sheet-url-box.is-pulse { + animation: url-pulse 1.4s ease-in-out infinite; +} + +.sheet-url-box.is-selected { + border-color: var(--accent); + background: color-mix(in srgb, var(--accent) 16%, var(--surface-solid)); + box-shadow: 0 0 0 4px var(--accent-soft); + animation: none; +} + +.finger-ico { + font-size: 1.75rem; + line-height: 1; + filter: drop-shadow(0 3px 6px rgba(0, 0, 0, 0.2)); +} + +.finger-btn.is-hidden, +.finger-url.is-hidden { + display: none !important; +} + +/* 第一步:仅小手,悬浮在绿色按钮上方,朝下指 */ +.sheet-actions-wrap { + position: relative; + padding-top: 36px; +} + +.finger-btn { + position: absolute; + left: 22%; + top: 0; + z-index: 3; + pointer-events: none; + display: flex; + align-items: center; + justify-content: center; + animation: finger-bounce-down 1.1s ease-in-out infinite; +} + +.finger-btn .finger-ico { + display: block; +} + +/* 第二步:小手紧贴网址区下沿朝上指,文案在右边 */ +.sheet-url-wrap.is-pointing { + padding-bottom: 34px; +} + +.finger-url { + position: absolute; + left: 6px; + top: auto; + bottom: 0; + z-index: 3; + pointer-events: none; + display: flex; + flex-direction: row; + align-items: center; + gap: 8px; + max-width: calc(100% - 12px); + animation: finger-nudge-up 1.05s ease-in-out infinite; +} + +.finger-url .finger-ico { + flex-shrink: 0; +} + +.finger-url .finger-bubble { + max-width: 150px; + padding: 6px 9px; + border-radius: 10px; + background: var(--chip-active); + color: var(--chip-active-ink); + font-size: 0.68rem; + font-weight: 700; + line-height: 1.3; + text-align: left; + box-shadow: var(--shadow); + position: relative; +} + +.finger-url .finger-bubble::before { + content: ""; + position: absolute; + left: -4px; + top: 50%; + width: 8px; + height: 8px; + background: var(--chip-active); + transform: translateY(-50%) rotate(45deg); +} + +.sheet-status { + margin: 10px 0 0; + min-height: 1.2em; + font-size: 0.78rem; + font-weight: 650; + color: var(--accent-deep); + line-height: 1.4; +} + +[data-theme="dark"] .sheet-status { + color: var(--accent); +} + +.sheet-status.is-error { + color: #c44; +} + +.sheet-actions { + display: grid; + grid-template-columns: 1.7fr 0.9fr; + gap: 8px; +} + +.sheet-btn { + min-height: 48px; + border-radius: 14px; + border: 1px solid var(--line); + background: var(--surface); + font-size: 0.9rem; + font-weight: 650; + padding: 8px 10px; +} + +.sheet-btn.primary { + background: linear-gradient(180deg, color-mix(in srgb, var(--accent) 88%, #fff), var(--accent-deep)); + color: #fff; + border-color: transparent; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 2px; +} + +.sheet-btn.primary.pulse { + animation: cta-pulse 1.5s ease-in-out infinite; +} + +.sheet-btn.primary.is-done { + animation: none; + background: var(--chip); + color: var(--ink); + border: 1px solid var(--line); +} + +.sheet-btn-main { + font-size: 0.92rem; + font-weight: 800; +} + +.sheet-btn-sub { + font-size: 0.66rem; + font-weight: 600; + opacity: 0.88; +} + +.sheet-btn:active { + transform: scale(0.98); +} + +@keyframes url-pulse { + 0%, + 100% { + box-shadow: 0 0 0 0 var(--accent-soft); + } + 50% { + box-shadow: 0 0 0 6px var(--accent-soft); + } +} + +@keyframes cta-pulse { + 0%, + 100% { + transform: scale(1); + box-shadow: 0 0 0 0 rgba(13, 143, 123, 0.35); + } + 50% { + transform: scale(1.015); + box-shadow: 0 0 0 8px rgba(13, 143, 123, 0); + } +} + +@keyframes finger-bounce-down { + 0%, + 100% { + transform: translateY(0); + } + 50% { + transform: translateY(6px); + } +} + +@keyframes finger-nudge-up { + 0%, + 100% { + transform: translateY(0); + } + 50% { + transform: translateY(-6px); + } +} + +@keyframes num-pop { + from { + transform: scale(0.7); + } + to { + transform: scale(1); + } +} + +.toast { + position: fixed; + left: 50%; + bottom: calc(28px + var(--safe-bottom)); + transform: translateX(-50%) translateY(10px); + padding: 9px 16px; + border-radius: 999px; + background: var(--toast-bg); + color: var(--toast-ink); + font-size: 0.8rem; + font-weight: 600; + opacity: 0; + pointer-events: none; + transition: opacity 0.2s ease, transform 0.2s ease; + z-index: 80; + box-shadow: var(--shadow); +} + +.toast.show { + opacity: 1; + transform: translateX(-50%) translateY(0); +}