Initial commit

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
谢宇宁
2026-11-05 20:30:26 +07:00
co-authored by Claude Opus 5.5
commit 6bd5cc665a
335 changed files with 44261 additions and 0 deletions
+23
View File
@@ -0,0 +1,23 @@
.git
.cursor
.idea
.node_modules
node_modules
.next
.next-dev
.next-test
.next*
dist
dist.zip
dist.zip.sha256
web_hddj_h5.tar.gz
web_hddj_h5.md5
config/*.local.env
test-results
playwright-report
*.log
*.tsbuildinfo
.env*
!.env.example
README.md
AGENTS.md
+18
View File
@@ -0,0 +1,18 @@
# 推荐使用 config/{development|test|production}.env(由 pnpm dev/build 加载)
# 本文件仅作本地覆盖参考;也可用 config/*.local.env(勿提交)
# 直连后端(不走 Next 代理)
# NEXT_PUBLIC_API_BASE_URL=https://example.com
# API_PROXY_TARGET=
# 本地代理调试(推荐):BASE 留空 + 设置代理目标
NEXT_PUBLIC_API_BASE_URL=
API_PROXY_TARGET=http://127.0.0.1:8080
# HTTPS_PROXY=http://127.0.0.1:7890
# HTTP_PROXY=http://127.0.0.1:7890
NEXT_PUBLIC_TRACKER_APP_ID=JHA-3108
NEXT_PUBLIC_GTAG_ID=G-ERJ0ETSK74
# NEXT_PUBLIC_TRACKER_ENCRYPTED_CONFIG=
# NEXT_PUBLIC_YANDEX_METRIKA_ID=
+9
View File
@@ -0,0 +1,9 @@
node_modules/
.next/
out/
.tmp/
.env
.env.local
.env*.local
.DS_Store
*.log
+9
View File
@@ -0,0 +1,9 @@
<!-- BEGIN:nextjs-agent-rules -->
## This is NOT the Next.js you know
This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.
This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.
<!-- END:nextjs-agent-rules -->
+18
View File
@@ -0,0 +1,18 @@
FROM node:22-alpine AS build
WORKDIR /app
RUN corepack enable && corepack prepare pnpm@10.32.1 --activate
COPY package.json pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile
COPY . .
ARG APP_ENV=production
RUN pnpm exec tsx scripts/next-env.ts "$APP_ENV" build \
&& pnpm exec tsx scripts/package-standalone.ts "$APP_ENV" \
&& mv "dist/$APP_ENV" /release
FROM node:22-alpine AS runtime
WORKDIR /app
ENV NODE_ENV=production PORT=3000 HOSTNAME=0.0.0.0
COPY --from=build --chown=node:node /release ./
USER node
EXPOSE 3000
CMD ["node", "start.mjs"]
+63
View File
@@ -0,0 +1,63 @@
# jha-1048-hddj-web
黄豆短剧 H5 / Web(Next.js 16 · React 19 · pnpm)。工程骨架对齐 jha-1046,当前只有空首页。
## 环境要求
- Node.js `>= 20.9`(打包 Linux sharp 推荐 **22**,npm `>= 10.9.2`)
- pnpm `10+`
## 本地开发
```bash
pnpm install
pnpm dev # development.env
pnpm dev:test # test.env
```
浏览器打开 [http://localhost:26124](http://localhost:26124)。
常用命令:
| 命令 | 说明 |
|------|------|
| `pnpm lint` | ESLint |
| `pnpm build` | 正式环境构建 |
| `pnpm build:test` | 测试环境构建 |
## 环境配置
配置文件在 `config/`(可另加 `*.local.env`,勿提交密钥):
| 文件 | 用途 |
|------|------|
| `config/development.env` | 本地开发 |
| `config/test.env` | 测试构建 / 测试服 |
| `config/production.env` | 正式构建 / 正式服 |
测试服默认 `root@172.104.181.99:22889`,目录 `/server/web_91dj/h5`,包名 `web_91dj_h5.tar.gz`,监听端口 `21021`。正式服推送前设置 `DEPLOY_JUMP_HOST`。
## 打包与部署
测试部署直接使用 `jha-1047-91dj-web` 的脚本:`deploy_test.sh` 构建后打 **`web_91dj_h5.tar.gz`** 和 **`web_91dj_h5.tar.gz.sha256`**(另写 **`web_91dj_h5.md5`**)。包内保留 `.next-test`,并带 `package-lock.json`、`scripts/next-env.mjs`、`scripts/check-health.mjs`,不含本机 `node_modules`。上传后在服务器执行 `run.sh`,由它 `npm ci --omit=dev` 再用 pm2 启动 `node start.mjs`。
正式包仍是带 Linux 依赖的 **`web_91dj_h5.tar.gz`** 和 **`web_91dj_h5.md5`**。测试包和正式包共用这个文件名,根目录里留下的是最后一次的产物。
```bash
pnpm pack:gz:test:only # 测试包,不上传
pnpm pack:gz:only # 正式包,不上传
```
测试服直接上传:
```bash
pnpm pack:gz:test
```
默认目标是 `root@172.104.181.99:22889` 的 `/server/web_91dj/h5`,上传后执行服务器上现有的 `bash run.sh`,覆盖 91 短剧测试服务。换机器时设置 `DEPLOY_HOST`、`DEPLOY_DIR`。正式服仍需指定主机:
```bash
DEPLOY_JUMP_HOST=user@host DEPLOY_JUMP_DIR=/home/server/web_91dj/h5 pnpm pack:gz
```
Standalone 用包内入口启动:`node start.mjs`。
+10
View File
@@ -0,0 +1,10 @@
APP_ENV=development
# 浏览器走同源 /api/*(配合 next.config rewrites)
NEXT_PUBLIC_API_BASE_URL=
# 调试上游:https://91dj-h5.80sygtm.com/swagger/index.html
API_PROXY_TARGET=https://91dj-h5.80sygtm.com
PORT=26124
NEXT_PUBLIC_TRACKER_APP_ID=JHA-3108
NEXT_PUBLIC_GTAG_ID=
NEXT_PUBLIC_SITE_URL=http://localhost:26124
NEXT_PUBLIC_APP_VERSION=1.0.0
+9
View File
@@ -0,0 +1,9 @@
APP_ENV=production
NEXT_PUBLIC_API_BASE_URL=
# 应用接口在 21033。不要写成 H5 的 21035,也不要写 127.0.0.1(H5 进程里不一定能连到本机 Go)。
API_PROXY_TARGET=http://139.162.49.252:21033
PORT=21035
NEXT_PUBLIC_TRACKER_APP_ID=JHA-3108
NEXT_PUBLIC_GTAG_ID=G-ERJ0ETSK74
NEXT_PUBLIC_SITE_URL=
NEXT_PUBLIC_APP_VERSION=1.0.0
+8
View File
@@ -0,0 +1,8 @@
APP_ENV=test
NEXT_PUBLIC_API_BASE_URL=
API_PROXY_TARGET=http://172.104.181.99:21022
PORT=21021
NEXT_PUBLIC_TRACKER_APP_ID=JHA-3108
NEXT_PUBLIC_GTAG_ID=
NEXT_PUBLIC_SITE_URL=https://91dj-h5.80sygtm.com
NEXT_PUBLIC_APP_VERSION=1.0.0
Executable
+73
View File
@@ -0,0 +1,73 @@
#!/usr/bin/env bash
set -Eeuo pipefail
APP_DIR=/server/web_91dj/h5
APP_NAME=web_91dj_h5
ARCHIVE="$APP_DIR/web_91dj_h5.tar.gz"
CURRENT="$APP_DIR/next"
RELEASES="$APP_DIR/releases"
NODE=/root/.nvm/versions/node/v22.22.3/bin/node
PM2=/root/.nvm/versions/node/v22.22.3/bin/pm2
NPM=/usr/bin/npm
PORT=21021
export PATH=/root/.nvm/versions/node/v22.22.3/bin:$PATH
STAGING=''
PREVIOUS=''
ACTIVATED=0
WAS_RUNNING=0
fail() { echo "发布失败:$*" >&2; exit 1; }
cleanup() {
result=$?
trap - EXIT INT TERM
if [ "$result" -ne 0 ] && [ "$ACTIVATED" -eq 1 ]; then
echo '发布失败,正在恢复上一版本…' >&2
"$PM2" delete "$APP_NAME" >/dev/null 2>&1 || true
[ -d "$CURRENT" ] && mv "$CURRENT" "$RELEASES/failed.$(date +%Y%m%d%H%M%S)" || true
if [ -n "$PREVIOUS" ] && [ -d "$PREVIOUS" ]; then
mv "$PREVIOUS" "$CURRENT"
[ "$WAS_RUNNING" -eq 1 ] && "$PM2" start "$CURRENT/start.mjs" --name "$APP_NAME" --interpreter "$NODE" >/dev/null 2>&1 || true
fi
fi
[ -n "$STAGING" ] && [ -d "$STAGING" ] && rm -rf "$STAGING"
exit "$result"
}
trap cleanup EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
[ -s "$ARCHIVE" ] || fail "未找到运行包:$ARCHIVE"
for tool in tar "$NODE" "$NPM" "$PM2"; do command -v "$tool" >/dev/null 2>&1 || fail "缺少命令:$tool"; done
"$NODE" -e 'const [a,b]=process.versions.node.split(".").map(Number);process.exit(a>20||a===20&&b>=9?0:1)' || fail '需要 Node.js >=20.9'
mkdir -p "$RELEASES"
while IFS= read -r entry; do
case "$entry" in
/*|../*|*/../*|*/..|*\\*) fail "运行包含非法路径:$entry" ;;
esac
done < <(/bin/tar -tzf "$ARCHIVE")
STAGING=$(mktemp -d "$APP_DIR/.release.XXXXXX")
/bin/tar -xzf "$ARCHIVE" -C "$STAGING" --no-same-owner
for file in start.mjs server.js package.json package-lock.json scripts/next-env.mjs scripts/check-health.mjs .next-test/BUILD_ID config/test.env; do
[ -s "$STAGING/$file" ] || fail "运行包缺少:$file"
done
[ -d "$STAGING/.next-test/static" ] && [ -d "$STAGING/public" ] || fail '运行包缺少 Next 静态资源'
(cd "$STAGING" && "$NPM" ci --omit=dev --no-audit --no-fund)
(cd "$STAGING" && "$NODE" -e 'for (const n of ["next","react","react-dom"]) require.resolve(n)') >/dev/null 2>&1 || fail '运行依赖校验失败'
if [ -f "$CURRENT/config/test.local.env" ] && [ ! -L "$CURRENT/config/test.local.env" ]; then
mkdir -p "$STAGING/config"
cp "$CURRENT/config/test.local.env" "$STAGING/config/test.local.env"
chmod 600 "$STAGING/config/test.local.env"
fi
if "$PM2" jlist 2>/dev/null | grep -q "\"name\":\"$APP_NAME\""; then WAS_RUNNING=1; fi
"$PM2" delete "$APP_NAME" >/dev/null 2>&1 || true
if [ -d "$CURRENT" ]; then
PREVIOUS="$RELEASES/next.$(date +%Y%m%d%H%M%S)"
mv "$CURRENT" "$PREVIOUS"
fi
mv "$STAGING" "$CURRENT"; STAGING=''; ACTIVATED=1
"$PM2" start "$CURRENT/start.mjs" --name "$APP_NAME" --interpreter "$NODE"
"$NODE" "$CURRENT/scripts/check-health.mjs" "http://127.0.0.1:$PORT" test
"$PM2" save
timestamp=$(date +%Y%m%d%H%M%S)
mv "$ARCHIVE" "$RELEASES/web_91dj_h5.$timestamp.tar.gz"
echo "发布完成:$APP_NAME;上一版本:${PREVIOUS:-无}"
+93
View File
@@ -0,0 +1,93 @@
#!/bin/bash
# Linux 测试服 tar.gz 更新入口;需预先配置 Supervisor 程序并手动调用。
set -Eeuo pipefail
DIR=$(cd "$(dirname "$0")" && pwd)
PROGRAM="${DEPLOY_PROGRAM:-91dj_next_h5}"
PACKAGE_NAME="${DEPLOY_PACKAGE_NAME:-web_91dj_h5.tar.gz}"
CHECKSUM_NAME="$PACKAGE_NAME.sha256"
[[ "$PROGRAM" =~ ^[a-zA-Z0-9_][a-zA-Z0-9_-]*$ ]] || { echo 'DEPLOY_PROGRAM 格式无效' >&2; exit 1; }
[[ "$PACKAGE_NAME" =~ ^[a-zA-Z0-9_][a-zA-Z0-9_.-]*\.tar\.gz$ ]] || { echo 'DEPLOY_PACKAGE_NAME 必须是 .tar.gz 文件名' >&2; exit 1; }
CURRENT="$DIR/next"
LOCK="$DIR/.$PROGRAM.lock"
STAGING=''; UPLOAD=''; PREVIOUS=''; FAILED=''
MOVED_OLD=0; INSTALLED=0; STOPPED=0; WAS_RUNNING=0
fail() { printf '错误:%s\n' "$*" >&2; exit 1; }
for tool in node npm sha256sum tar supervisorctl mktemp; do command -v "$tool" >/dev/null || fail "缺少命令 $tool"; done
node -e 'const [a,b]=process.versions.node.split(".").map(Number);if(a<20||a===20&&b<9)process.exit(1)' || fail '需要 Node.js >=20.9'
mkdir "$LOCK" 2>/dev/null || fail "已有更新进程或残留锁:$LOCK"
finish() {
local result=$?
trap - EXIT INT TERM
if [ "$result" != 0 ] && { [ "$STOPPED" = 1 ] || [ "$INSTALLED" = 1 ] || [ "$MOVED_OLD" = 1 ]; }; then
printf '更新失败,恢复上一版本。\n' >&2
supervisorctl stop "$PROGRAM" >/dev/null 2>&1 || true
if [ "$INSTALLED" = 1 ]; then
FAILED="$DIR/next.failed.$(date +%Y%m%d%H%M%S).$$"
mv "$CURRENT" "$FAILED" || { echo "无法保存失败版本:$CURRENT" >&2; result=1; }
fi
if [ "$MOVED_OLD" = 1 ]; then
mv "$PREVIOUS" "$CURRENT" || { echo "需要手动恢复:$PREVIOUS → $CURRENT" >&2; result=1; }
fi
if [ "$WAS_RUNNING" = 1 ]; then supervisorctl start "$PROGRAM" || result=1; fi
fi
if [ -n "$STAGING" ] && [ -d "$STAGING" ]; then rm -rf "$STAGING"; fi
if [ -n "$UPLOAD" ] && [ -d "$UPLOAD" ]; then rm -rf "$UPLOAD"; fi
rmdir "$LOCK" 2>/dev/null || true
exit "$result"
}
trap finish EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
[ ! -L "$CURRENT" ] && { [ ! -e "$CURRENT" ] || [ -d "$CURRENT" ]; } || fail 'next 必须是普通目录'
STATUS=$(supervisorctl status "$PROGRAM" 2>/dev/null || true)
[[ "$STATUS" == "$PROGRAM "* ]] && [[ "$STATUS" != *'ERROR'* ]] || fail "请先配置 Supervisor 程序 $PROGRAM,command 指向 node $CURRENT/start.mjs"
if [[ "$STATUS" == *'RUNNING'* ]]; then WAS_RUNNING=1; fi
[ -s "$DIR/$PACKAGE_NAME" ] && [ -s "$DIR/$CHECKSUM_NAME" ] || fail "缺少 $PACKAGE_NAME 或 SHA-256"
# Freeze the uploaded pair before validation/extraction; concurrent uploads cannot replace this copy.
UPLOAD=$(mktemp -d "$DIR/.91dj-upload.XXXXXX")
cp "$DIR/$PACKAGE_NAME" "$DIR/$CHECKSUM_NAME" "$UPLOAD/"
(cd "$UPLOAD" && sha256sum -c "$CHECKSUM_NAME") || fail 'SHA-256 校验失败'
LC_ALL=C tar -tzf "$UPLOAD/$PACKAGE_NAME" > "$UPLOAD/members" || fail 'tar.gz 压缩包损坏'
while IFS= read -r entry; do
entry="${entry#./}"
case "$entry" in
/*|../*|*/../*|*/..|node_modules|node_modules/*|*/node_modules/*|*\\*) fail "非法 tar.gz 路径:$entry" ;;
esac
done < "$UPLOAD/members"
# Reject links and special entries before extraction, including hard links to outside paths.
LC_ALL=C tar -tvzf "$UPLOAD/$PACKAGE_NAME" > "$UPLOAD/types" || fail '无法检查 tar.gz 文件类型'
while IFS= read -r entry; do
case "$entry" in
-?*|d?*) ;;
*) fail '测试包只允许普通文件和目录,不允许链接或特殊文件' ;;
esac
done < "$UPLOAD/types"
STAGING=$(mktemp -d "$DIR/.91dj-release.XXXXXX")
tar -xzf "$UPLOAD/$PACKAGE_NAME" -C "$STAGING" --no-same-owner --no-same-permissions
[ -z "$(find "$STAGING" -type l -print -quit)" ] || fail '测试包不允许符号链接'
for file in start.mjs server.js .next-test/BUILD_ID config/test.env package.json package-lock.json scripts/next-env.mjs scripts/check-health.mjs; do
[ -s "$STAGING/$file" ] || fail "包内缺少 $file"
done
[ -d "$STAGING/.next-test/static" ] && [ -d "$STAGING/public" ] || fail '包内缺少静态资源'
# Install for the server's real OS/CPU, rather than shipping this Mac's node_modules.
(cd "$STAGING" && npm ci --omit=dev --no-audit --no-fund)
if [ -f "$CURRENT/config/test.local.env" ] && [ ! -L "$CURRENT/config/test.local.env" ]; then
cp "$CURRENT/config/test.local.env" "$STAGING/config/test.local.env"
chmod 600 "$STAGING/config/test.local.env"
fi
if [ -d "$CURRENT/.next-test/cache/seo" ] && [ ! -L "$CURRENT/.next-test/cache/seo" ]; then
mkdir -p "$STAGING/.next-test/cache"
cp -R "$CURRENT/.next-test/cache/seo" "$STAGING/.next-test/cache/seo"
fi
APP_PORT=$(cd "$STAGING" && node --input-type=module -e 'import{nextCommand}from"./scripts/next-env.mjs";console.log(nextCommand("test","start",[],{root:process.cwd()}).env.PORT)')
# Stop only after checksum, installation and configuration validation have succeeded.
if [ "$WAS_RUNNING" = 1 ]; then supervisorctl stop "$PROGRAM"; STOPPED=1; fi
if [ -d "$CURRENT" ]; then
PREVIOUS="$DIR/next.prev.$(date +%Y%m%d%H%M%S).$$"
mv "$CURRENT" "$PREVIOUS"; MOVED_OLD=1
fi
mv "$STAGING" "$CURRENT"; STAGING=''; INSTALLED=1
supervisorctl start "$PROGRAM"
node "$CURRENT/scripts/check-health.mjs" "http://127.0.0.1:$APP_PORT" test
supervisorctl status "$PROGRAM"
printf '测试服更新完成:%s;上一版本:%s\n' "$CURRENT" "${PREVIOUS:-无}"
Executable
+94
View File
@@ -0,0 +1,94 @@
#!/bin/bash
# 黄豆短剧正式服:构建 → Linux standalone + MD5 → 可选触发 rsupdate.sh。
set -euo pipefail
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
cd "$SCRIPT_DIR"
source "$SCRIPT_DIR/scripts/deploy-common.sh"
JUMP_HOST="${DEPLOY_JUMP_HOST:-server@34.92.204.175}"
# 压缩包上传完成后,在同一目录执行服务器现有的 rsupdate.sh。
JUMP_DIR="${DEPLOY_JUMP_DIR:-/home/server/web_hddj/h5}"
# valid_path 限制目录为安全字符;命令文本与手动执行一致,兼容 SSH 命令白名单。
REMOTE_UPDATE_COMMAND="cd ${JUMP_DIR%/} && bash rsupdate.sh"
SCP_PORT="${DEPLOY_SCP_PORT:-22889}"
SSH_PORT="${DEPLOY_SSH_PORT:-22889}"
TARGET_ARCH="${DEPLOY_TARGET_ARCH:-x64}"
TARGET_LIBC="${DEPLOY_TARGET_LIBC:-glibc}"
PACKAGE_NAME="${DEPLOY_PACKAGE_NAME:-web_hddj_h5.tar.gz}"
MD5_NAME="${PACKAGE_NAME%.tar.gz}.md5"
RELEASE="$SCRIPT_DIR/dist/production-linux-$TARGET_ARCH-$TARGET_LIBC"
PACKAGE_ONLY=0
for argument in "$@"; do
case "$argument" in
--dry-run) DEPLOY_DRY_RUN=1 ;;
--package-only) PACKAGE_ONLY=1 ;;
-h|--help)
printf '用法:%s [--dry-run] [--package-only]\n' "$0"
printf '仅打包:--package-only。仅预览:--dry-run(不构建、不联网)。\n'
printf '上传目标:%s:%s/;上传成功后在该目录执行 bash rsupdate.sh。\n' "$JUMP_HOST" "${JUMP_DIR%/}"
printf '可覆盖 DEPLOY_JUMP_HOST、DEPLOY_JUMP_DIR、DEPLOY_SCP_PORT(%s)、DEPLOY_SSH_PORT(%s)、DEPLOY_PACKAGE_NAME(%s)、DEPLOY_TARGET_ARCH(x64/arm64)、DEPLOY_TARGET_LIBC(glibc/musl)。\n' "$SCP_PORT" "$SSH_PORT" "$PACKAGE_NAME"
exit 0 ;;
*) fail "不支持的参数 $argument" ;;
esac
done
case "$TARGET_ARCH" in x64|arm64) ;; *) fail 'DEPLOY_TARGET_ARCH 仅支持 x64 或 arm64' ;; esac
case "$TARGET_LIBC" in glibc|musl) ;; *) fail 'DEPLOY_TARGET_LIBC 仅支持 glibc 或 musl' ;; esac
[[ "$PACKAGE_NAME" =~ ^[a-zA-Z0-9_][a-zA-Z0-9_.-]*\.tar\.gz$ ]] || fail 'DEPLOY_PACKAGE_NAME 必须是 .tar.gz 文件名'
if [ "$PACKAGE_ONLY" = 0 ] && [ "${DEPLOY_DRY_RUN:-0}" != 1 ]; then
valid_host "$JUMP_HOST" DEPLOY_JUMP_HOST; valid_path "$JUMP_DIR" DEPLOY_JUMP_DIR
valid_port "$SCP_PORT" DEPLOY_SCP_PORT; valid_port "$SSH_PORT" DEPLOY_SSH_PORT
need ssh; need scp; need tee
fi
need node; need pnpm
node -e 'const [a,b]=process.versions.node.split(".").map(Number);if(a<20||a===20&&b<9)process.exit(1)' || fail '需要 Node.js >=20.9,推荐 22'
[ -d node_modules/next ] && [ -d node_modules/dotenv ] || fail '请先执行 pnpm install'
[ -s config/production.env ] && [ -s pnpm-lock.yaml ] || fail '缺少 config/production.env 或 pnpm-lock.yaml'
if [ "${DEPLOY_DRY_RUN:-0}" = 1 ]; then
printf 'DRY RUN:正式环境;Linux %s/%s;不构建、不连接服务器。\n' "$TARGET_ARCH" "$TARGET_LIBC"; public_profile production
printf ' pnpm run build → pnpm run bundle → pnpm run bundle:linux -- %s %s\n' "$TARGET_ARCH" "$TARGET_LIBC"
printf ' 保留 standalone 裁剪依赖,仅安装 lockfile 中目标 Linux 的 Sharp/libvips。\n'
printf ' 生成 %s + %s(纯 MD5 hash)。\n' "$PACKAGE_NAME" "$MD5_NAME"
if [ "$PACKAGE_ONLY" = 1 ]; then printf ' 仅生成本地包。\n'
else
printf ' scp -P %s %s %s %s:%s/\n' "$SCP_PORT" "$PACKAGE_NAME" "$MD5_NAME" "$JUMP_HOST" "${JUMP_DIR%/}"
printf ' ssh -p %s %s "%s"\n' "$SSH_PORT" "$JUMP_HOST" "$REMOTE_UPDATE_COMMAND"
fi
exit 0
fi
need tar
command -v md5sum >/dev/null || command -v md5 >/dev/null || fail '缺少 md5sum 或 macOS md5'
lock_build
step '构建正式环境 standalone'
pnpm run build
step '整理正式环境 standalone 和目标 Linux 原生依赖'
pnpm run bundle
pnpm run bundle:linux -- "$TARGET_ARCH" "$TARGET_LIBC"
for file in start.mjs server.js .next/BUILD_ID config/production.env runtime-target.json ecosystem.config.cjs; do
[ -s "$RELEASE/$file" ] || fail "正式包缺少 $file"
done
for directory in node_modules .next/static public; do [ -d "$RELEASE/$directory" ] || fail "正式包缺少 $directory"; done
step "生成 $PACKAGE_NAME"
TEMP_PACKAGE=$(mktemp "$SCRIPT_DIR/dist/.production-archive.XXXXXX")
if ! COPYFILE_DISABLE=1 COPY_EXTENDED_ATTRIBUTES_DISABLE=1 tar --no-xattrs \
--exclude='._*' --exclude='.DS_Store' --exclude='.env*' --exclude='*.local.env' --exclude='*.log' \
-czf "$TEMP_PACKAGE" -C "$RELEASE" .; then
rm -f "$TEMP_PACKAGE"; fail '压缩失败'
fi
tar -tzf "$TEMP_PACKAGE" >/dev/null
mv -f "$TEMP_PACKAGE" "$PACKAGE_NAME"
chmod 600 "$PACKAGE_NAME"
if command -v md5sum >/dev/null; then md5sum "$PACKAGE_NAME" | awk '{print $1}' > "$MD5_NAME"
else md5 -q "$PACKAGE_NAME" > "$MD5_NAME"; fi
printf '正式包:%s/%s;校验:%s/%s\n' "$SCRIPT_DIR" "$PACKAGE_NAME" "$SCRIPT_DIR" "$MD5_NAME"
if [ "$PACKAGE_ONLY" = 1 ]; then exit 0; fi
step "上传到 $JUMP_HOST:$JUMP_DIR/"
scp -P "$SCP_PORT" "$PACKAGE_NAME" "$MD5_NAME" "$JUMP_HOST:${JUMP_DIR%/}/"
step '执行正式服 rsupdate.sh'
printf '远端命令:%s\n' "$REMOTE_UPDATE_COMMAND"
RUN_LOG=$(mktemp "$SCRIPT_DIR/dist/production-rsupdate.XXXXXX")
if ! ssh -p "$SSH_PORT" "$JUMP_HOST" "$REMOTE_UPDATE_COMMAND" 2>&1 | tee "$RUN_LOG"; then fail "rsupdate.sh 执行失败,日志:$RUN_LOG"; fi
if ! node - "$RUN_LOG" <<'NODE'
const output=require('node:fs').readFileSync(process.argv[2],'utf8').replace(/\x1b\[[0-?]*[ -/]*[@-~]/g,'');
if(/\b(?:BACKOFF|FATAL|ERROR)\b|\bspawn\s+error\b/i.test(output))process.exit(1);
NODE
then fail "远端输出包含失败状态,日志:$RUN_LOG"; fi
printf '正式服 rsupdate.sh 执行完成;请核对远端服务状态。日志:%s\n' "$RUN_LOG"
Executable
+94
View File
@@ -0,0 +1,94 @@
#!/bin/bash
# 黄豆短剧测试服:构建 → 测试 → tar.gz + SHA-256 → 可选上传并执行 run.sh。
set -euo pipefail
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
cd "$SCRIPT_DIR"
source "$SCRIPT_DIR/scripts/deploy-common.sh"
HOST="${DEPLOY_HOST:-root@172.104.181.99}"
SSH_PORT="${DEPLOY_SSH_PORT:-22889}"
# 直接覆盖 91 短剧测试服的上传位置和包名。
REMOTE_DIR="${DEPLOY_DIR:-/server/web_91dj/h5}"
# 远端启动脚本目录独立于上传目录,按服务器约定执行。
RUN_DIR="${DEPLOY_RUN_DIR:-/server/web_91dj/h5}"
CHECK_URL="${DEPLOY_CHECK_URL:-}"
PACKAGE_NAME="${DEPLOY_PACKAGE_NAME:-web_91dj_h5.tar.gz}"
CHECKSUM_NAME="$PACKAGE_NAME.sha256"
PACKAGE_ONLY=0
for argument in "$@"; do
case "$argument" in
--dry-run) DEPLOY_DRY_RUN=1 ;;
--package-only) PACKAGE_ONLY=1 ;;
-h|--help)
printf '用法:%s [--dry-run] [--package-only]\n' "$0"
printf '仅打包:--package-only。仅预览:--dry-run(不构建、不联网)。\n'
printf '上传目标:%s:%s %s/。\n' "$HOST" "$SSH_PORT" "${REMOTE_DIR%/}"
printf '上传成功后:ssh -p %s %s "cd %s && bash run.sh"\n' "$SSH_PORT" "$HOST" "$RUN_DIR"
printf '可覆盖 DEPLOY_HOST、DEPLOY_DIR、DEPLOY_RUN_DIR(%s)、DEPLOY_SSH_PORT、DEPLOY_PACKAGE_NAME(%s)、DEPLOY_CHECK_URL。\n' "$RUN_DIR" "$PACKAGE_NAME"
exit 0 ;;
*) fail "不支持的参数 $argument" ;;
esac
done
[[ "$PACKAGE_NAME" =~ ^[a-zA-Z0-9_][a-zA-Z0-9_.-]*\.tar\.gz$ ]] || fail 'DEPLOY_PACKAGE_NAME 必须是 .tar.gz 文件名'
if [ "$PACKAGE_ONLY" = 0 ] && [ "${DEPLOY_DRY_RUN:-0}" != 1 ]; then
valid_host "$HOST" DEPLOY_HOST; valid_path "$REMOTE_DIR" DEPLOY_DIR; valid_path "$RUN_DIR" DEPLOY_RUN_DIR; valid_port "$SSH_PORT" DEPLOY_SSH_PORT
need ssh; need scp
fi
check_local test
if [ -n "$CHECK_URL" ]; then
node --input-type=module -e 'const u=new URL(process.argv[1]);if(!["http:","https:"].includes(u.protocol)||u.username||u.password||u.search||u.hash||u.pathname!=="/")process.exit(1)' "$CHECK_URL" || fail 'DEPLOY_CHECK_URL 必须是 HTTP(S) 站点根地址'
fi
if [ "${DEPLOY_DRY_RUN:-0}" = 1 ]; then
printf 'DRY RUN:测试环境;不构建、不连接服务器。\n'; public_profile test
printf ' npm run build:test → npm test → npm run bundle:test → %s + %s\n' "$PACKAGE_NAME" "$CHECKSUM_NAME"
printf ' 包内不含 node_modules、本地环境覆盖和缓存;服务端 npm ci --omit=dev 后 node start.mjs。\n'
if [ "$PACKAGE_ONLY" = 1 ]; then printf ' 仅生成本地包。\n'
else
printf ' 发布目标:%s:%s(SSH %s)。\n' "$HOST" "$REMOTE_DIR" "$SSH_PORT"
printf ' 上传 %s、%s 和 up_next_h5.sh。\n' "$PACKAGE_NAME" "$CHECKSUM_NAME"
printf ' 上传成功后:ssh -p %s %s "cd %s && bash run.sh"\n' "$SSH_PORT" "$HOST" "$RUN_DIR"
fi
exit 0
fi
need tar
[ -s deploy/up_next_h5.sh ] || fail '缺少 deploy/up_next_h5.sh'
bash -n deploy/up_next_h5.sh
lock_build
step '构建测试环境并运行回归测试'
npm run build:test
TEST_APP_ENV=test npm test
step '整理 standalone 测试包'
npm run bundle:test
for file in start.mjs server.js .next-test/BUILD_ID config/test.env; do
[ -s "dist/test/$file" ] || fail "测试包缺少 $file"
done
[ -d dist/test/.next-test/static ] && [ -d dist/test/public ] || fail '测试包缺少静态资源'
step "生成 $PACKAGE_NAME 和 SHA-256"
TEMP_PACKAGE=$(mktemp "$SCRIPT_DIR/dist/.test-archive.XXXXXX")
if ! COPYFILE_DISABLE=1 COPY_EXTENDED_ATTRIBUTES_DISABLE=1 tar --no-xattrs \
--exclude='node_modules' --exclude='*/node_modules' --exclude='._*' --exclude='.DS_Store' \
--exclude='*.local.env' --exclude='.env*' --exclude='*.log' \
-czf "$TEMP_PACKAGE" -C dist/test .; then
rm -f "$TEMP_PACKAGE"; fail '压缩失败'
fi
tar -tzf "$TEMP_PACKAGE" >/dev/null
mv -f "$TEMP_PACKAGE" "$PACKAGE_NAME"
chmod 600 "$PACKAGE_NAME"
node --input-type=module - "$PACKAGE_NAME" "$CHECKSUM_NAME" <<'NODE'
import {createHash} from 'node:crypto';
import {readFileSync,writeFileSync} from 'node:fs';
const [archive,checksum]=process.argv.slice(2);
const bytes=readFileSync(archive);
writeFileSync(checksum,createHash('sha256').update(bytes).digest('hex')+' '+archive+'\n');
// The test and production commands share a package name; refresh its companion checksum too.
writeFileSync(archive.replace(/\.tar\.gz$/,'.md5'),createHash('md5').update(bytes).digest('hex')+'\n');
NODE
printf '测试包:%s/%s;校验:%s/%s\n' "$SCRIPT_DIR" "$PACKAGE_NAME" "$SCRIPT_DIR" "$CHECKSUM_NAME"
if [ "$PACKAGE_ONLY" = 1 ]; then exit 0; fi
step "上传到 $HOST:$REMOTE_DIR/"
ssh -p "$SSH_PORT" "$HOST" "mkdir -p '$REMOTE_DIR'"
scp -P "$SSH_PORT" "$PACKAGE_NAME" "$CHECKSUM_NAME" deploy/up_next_h5.sh "$HOST:$REMOTE_DIR/"
printf '测试包上传完成:%s:%s/%s\n' "$HOST" "${REMOTE_DIR%/}" "$PACKAGE_NAME"
step "执行测试服 $RUN_DIR/run.sh"
ssh -p "$SSH_PORT" "$HOST" "cd '$RUN_DIR' && bash run.sh"
if [ -n "$CHECK_URL" ]; then node scripts/check-health.mjs "$CHECK_URL" test; fi
printf '测试服 run.sh 执行完成:%s:%s/run.sh\n' "$HOST" "${RUN_DIR%/}"
+28
View File
@@ -0,0 +1,28 @@
import { defineConfig, globalIgnores } from "eslint/config";
import nextVitals from "eslint-config-next/core-web-vitals";
import nextTs from "eslint-config-next/typescript";
const eslintConfig = defineConfig([
...nextVitals,
...nextTs,
// Override default ignores of eslint-config-next.
globalIgnores([
// Default ignores of eslint-config-next:
".next/**",
".next-test/**",
".next-dev/**",
"dist/**",
"out/**",
"build/**",
"public/js/**",
"next-env.d.ts",
]),
{
rules: {
// 接口图需 XOR 解密,统一走 DecryptedImage / 原生 <img>,不能用 next/image
"@next/next/no-img-element": "off",
},
},
]);
export default eslintConfig;
+29
View File
@@ -0,0 +1,29 @@
import type { NextConfig } from "next";
/** 本地调试代理目标,见 config/*.env / .env.local 的 API_PROXY_TARGET */
const apiProxyTarget = (process.env.API_PROXY_TARGET || "").replace(/\/$/, "");
const appEnv = process.env.APP_ENV;
const nextConfig: NextConfig = {
output: "standalone",
// 仅在显式 APP_ENV=test|development 时分目录;未设置 / production 仍用 .next
distDir:
appEnv === "test" ? ".next-test" : appEnv === "development" ? ".next-dev" : ".next",
poweredByHeader: false,
cacheComponents: true,
partialPrefetching: true,
// 用 127.0.0.1 打开本地 dev 时允许 HMR(默认只放行 localhost)
allowedDevOrigins: ["127.0.0.1"],
async rewrites() {
if (!apiProxyTarget) return [];
return [
{
source: "/api/:path*",
destination: `${apiProxyTarget}/api/:path*`,
},
// /h5/m3u8、/enkey、/newenkey 由 route handler 代理,密钥地址不带尾斜杠
];
},
};
export default nextConfig;
+8172
View File
File diff suppressed because it is too large Load Diff
+68
View File
@@ -0,0 +1,68 @@
{
"name": "jha-1048-hddj-web",
"version": "1.0.0",
"private": true,
"scripts": {
"dev": "tsx scripts/next-env.ts development dev",
"dev:test": "tsx scripts/next-env.ts test dev",
"build": "tsx scripts/next-env.ts production build",
"build:dev": "tsx scripts/next-env.ts development build",
"build:test": "tsx scripts/next-env.ts test build",
"start": "tsx scripts/next-env.ts production start",
"start:dev": "tsx scripts/next-env.ts development start",
"start:test": "tsx scripts/next-env.ts test start",
"lint": "eslint",
"test": "node --test tests/*.test.mjs",
"bundle": "tsx scripts/package-standalone.ts production",
"bundle:test": "tsx scripts/package-standalone.ts test",
"bundle:linux": "tsx scripts/prepare-production-runtime.ts",
"package:prod": "bash scripts/package-prod.sh --package-only",
"pack:gz": "bash scripts/package-prod.sh",
"pack:gz:only": "bash scripts/package-prod.sh --package-only",
"pack:gz:test": "bash scripts/package-test.sh",
"pack:gz:test:only": "bash scripts/package-test.sh --package-only",
"deploy:test": "bash deploy_test.sh",
"deploy:prod": "bash deploy_prod.sh"
},
"dependencies": {
"@heroui/react": "^3.2.6",
"@heroui/styles": "^3.2.6",
"@internationalized/date": "^3.12.4",
"@react-aria/ssr": "^3.10.1",
"@react-aria/utils": "^3.34.1",
"dotenv": "^17.4.2",
"next": "16.4.1",
"qrcode.react": "^4.2.0",
"react": "19.3.0",
"react-aria": "^3.53.1",
"react-aria-components": "^1.22.1",
"react-dom": "19.3.0",
"swiper": "^14.3.0",
"web-streams-polyfill": "^4.3.0",
"xgplayer": "^3.0.26",
"xgplayer-hls": "^3.0.26"
},
"devDependencies": {
"@tailwindcss/turbopack": "^4",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"eslint": "^9",
"eslint-config-next": "16.4.1",
"tailwindcss": "^4",
"tsx": "^4.20.0",
"typescript": "^5"
},
"packageManager": "pnpm@10.32.1",
"engines": {
"node": ">=20.9.0"
},
"type": "module",
"browserslist": [
"chrome >= 80",
"android >= 5",
"ios >= 13",
"safari >= 13",
"not dead"
]
}
+5251
View File
File diff suppressed because it is too large Load Diff
View File
@@ -0,0 +1 @@
6d41643810d540ce924edb982c3d3171
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 340 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

+1
View File
@@ -0,0 +1 @@
google-site-verification: google5ce6ca462e54c213.html
Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 493 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 538 B

+5
View File
@@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="ic_js">
<path id="Vector" d="M9.99883 34.0138C8.90965 36.1763 8.08688 39.9081 8.08688 39.9081C8.08688 39.9081 11.8202 39.0866 13.9848 37.9976L15.9714 39.9832C15.7319 40.3943 15.4481 40.7891 15.0954 41.1426C12.8655 43.3713 2.00002 45.9907 2.00002 45.9907C2.00002 45.9907 4.62246 35.1335 6.85331 32.9047C7.20586 32.5515 7.59831 32.2659 8.01227 32.0284L9.99883 34.0138ZM29.5866 40.2725L30.9337 31.1604L39.4984 22.6L39.4537 22.5555C41.5337 20.2934 49.0528 10.7301 44.6297 3.37559C37.2728 -1.04319 27.7045 6.47094 25.4396 8.5498L25.418 8.52733L16.8534 17.0874L7.7373 18.4348L6.30882 19.8615L11.0752 24.6263L7.81342 26.1235C6.76324 27.1723 6.77956 28.8941 7.85226 29.9668L18.0501 40.1591C19.1219 41.2295 20.8453 41.2468 21.8955 40.1979L23.3927 36.9372L28.1582 41.7001L29.5866 40.2725ZM34.1989 21.1082C33.1478 22.1586 31.4244 22.1399 30.3526 21.0683L26.9533 17.671C25.8796 16.5979 25.8624 14.8766 26.9135 13.8266L30.2439 10.498C31.2952 9.44734 33.0167 9.46472 34.0905 10.5375L37.4898 13.935C38.5616 15.0063 38.5806 16.7289 37.5294 17.7795L34.1989 21.1082ZM17.963 31.5096L16.5056 30.0541L22.4529 24.1099C22.8462 23.7173 23.4927 23.723 23.8944 24.1245C24.2963 24.5262 24.3029 25.1734 23.9101 25.5655L17.963 31.5096Z" fill="#2ECC71"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Frame">
<path id="Vector" d="M25.3 21L30.5 18.8C31.9 18.2 32.6 16.6 32 15.2C31.4 13.8 29.7 13.2 28.3 13.8L23 15.9C21.6 16.5 20.9 18.1 21.5 19.5C22.2 20.9 23.9 21.6 25.3 21ZM42.8 17L38 6.10001C37.6 5.20001 36.5 4.70001 35.5 5.10001L23.4 10.2C22.4 10.6 22 11.7 22.4 12.6L22.9 13.8L27.4 11.9C29.8 10.9 32.6 12 33.6 14.3C34.6 16.6 33.5 19.3 31.2 20.4L26.7 22.3L27.2 23.5C27.6 24.4 28.7 24.9 29.7 24.5L41.8 19.4C42.8 19 43.3 17.9 42.8 17ZM15.6 32C17 32.7 18.7 32.2 19.4 30.8L22 25.9C22.7 24.5 22.2 22.9 20.8 22.2C19.4 21.5 17.7 22 17 23.4L14.4 28.3C13.7 29.7 14.3 31.4 15.6 32ZM24.5 28L23.3 27.4L21.1 31.6C19.9 33.9 17.1 34.8 14.8 33.6C12.5 32.4 11.6 29.7 12.8 27.4L15 23.2L13.8 22.6C12.9 22.1 11.7 22.5 11.3 23.4L5.3 34.9C4.8 35.8 5.2 36.9 6.1 37.4L16.9 42.8C17.8 43.3 19 42.9 19.4 42L25.4 30.5C25.8 29.6 25.5 28.5 24.5 28Z" fill="#FF951C"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1023 B

+6
View File
@@ -0,0 +1,6 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="ic_yj">
<path id="Vector" d="M38 8.8C33.7 7.7 29.8 6.7 26.4 3.9C25.7 3.3 24.9 3 24 3C23.1 3 22.3 3.3 21.6 3.9C18.7 6.3 15.3 7.2 11.6 8.4C11.1 8.6 10.5 8.7 9.99999 8.8C8.29999 9.2 7.09999 10.8 6.99999 12.6V13.1L10.2 35.7C10.2 35.9 10.2 36.1 10.3 36.2C10.3 36 10.2 35.9 10.2 35.7C10.3 37 11 38.1 12.1 38.7L22 44.4C22.2 44.5 22.3 44.6 22.5 44.6C23 44.8 23.5 44.9 24 44.9C24.7 44.9 25.4 44.7 26 44.3L35.9 38.6C37 38 37.6 36.8 37.8 35.6C37.8 35.8 37.8 36 37.7 36.1C37.7 35.9 37.8 35.8 37.8 35.6L41 13.1C41.2 11.1 39.9 9.3 38 8.8ZM34.8 35.2V35.3C34.8 35.6 34.6 35.9 34.3 36.1H34.1L24.3 41.8C24.3 42 24.1 42 24 42C23.9 42 23.7 42 23.6 41.9L13.8 36.2H13.6C13.3 36 13.2 35.8 13.1 35.4V35.2L9.99999 12.8C9.99999 12.3 10.3 11.9 10.7 11.8C15.3 10.6 19.8 9.4 23.5 6.3C23.7 6 23.9 6 24 6C24.1 6 24.3 6 24.5 6.2C28.2 9.3 32.6 10.6 37.3 11.7C37.7 11.8 38.1 12.3 38 12.7L34.8 35.2Z" fill="#00D9FF"/>
<path id="Vector_2" d="M34.0004 13.9C30.7004 12.8 27.5004 12.1 24.6004 10.1C24.3004 9.8 23.8004 9.8 23.4004 10.1C20.5004 12.2 17.3004 12.8 14.0004 13.9C13.5004 14.1 13.2004 14.5 13.3004 15L16.0004 33.7C16.0004 34 16.2004 34.2 16.4004 34.4L23.4004 38.2C23.7004 38.4 24.2004 38.4 24.5004 38.2L31.5004 34.4C31.7004 34.2 31.9004 34 31.9004 33.7L34.6004 15C34.7004 14.5 34.4004 14 34.0004 13.9ZM28.9004 22.5L24.0004 27.4C23.4004 28 22.5004 28 21.9004 27.4L19.1004 24.6C18.5004 24 18.5004 23.1 19.1004 22.5C19.7004 21.9 20.6004 21.9 21.2004 22.5L23.0004 24.3L26.9004 20.4C27.5004 19.8 28.4004 19.8 29.0004 20.4C29.5004 21 29.5004 21.9 28.9004 22.5Z" fill="#00D9FF"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Frame">
<path id="Vector" d="M28.8609 25.6594C28.3969 25.4391 27.9281 25.2281 27.4406 25.0453C30.5859 22.8938 32.6531 19.2797 32.6531 15.1922C32.6531 8.61094 27.3 3.25781 20.7188 3.25781C14.1375 3.25781 8.78437 8.61094 8.78437 15.1922C8.78437 19.2797 10.8516 22.8938 13.9969 25.0453C7.55156 27.4781 3 33.2859 3 40.0594C3 41.1281 3.83906 41.9953 4.88906 42.0609H4.90781C4.94062 42.0609 4.97813 42.0703 5.01094 42.0703C5.04844 42.0703 5.08125 42.0609 5.11406 42.0609H25.9688C24.6141 40.1484 23.8125 37.8188 23.8125 35.2969C23.8125 31.2984 25.8141 27.7781 28.8609 25.6594ZM12.3563 15.2531C12.3563 10.65 16.0875 6.92344 20.6859 6.92344C25.2844 6.92344 29.0156 10.6547 29.0156 15.2531C29.0156 19.8563 25.2844 23.5828 20.6859 23.5828C16.0875 23.5828 12.3563 19.8563 12.3563 15.2531ZM35.55 25.8469C30.3328 25.8469 26.1 30.075 26.1 35.2969C26.1 40.5188 30.3281 44.7469 35.55 44.7469C40.7719 44.7469 45 40.5141 45 35.2969C45 30.0797 40.7719 25.8469 35.55 25.8469ZM30.8484 29.8641C31.1578 29.7047 31.5328 29.8266 31.6922 30.1313L32.7469 32.1609C32.9062 32.4656 32.7844 32.8453 32.4797 33.0047C32.4094 33.0375 32.3391 33.0609 32.2688 33.0703C32.0156 33.1031 31.7625 32.9766 31.6359 32.7375L30.5813 30.7078C30.4219 30.4031 30.5391 30.0234 30.8484 29.8641ZM28.5563 34.1484C28.2188 34.0688 28.0125 33.7313 28.0922 33.3984C28.1719 33.0609 28.5094 32.8547 28.8422 32.9344L31.0687 33.4594C31.3312 33.5203 31.5141 33.7359 31.5469 33.9891C31.5563 34.0594 31.5516 34.1344 31.5328 34.2094C31.4531 34.5469 31.1156 34.7531 30.7828 34.6734L28.5563 34.1484ZM40.8844 35.7094L35.7891 40.8047C35.3578 41.2359 34.8141 41.5359 34.2141 41.6719C33.9797 41.7234 33.7359 41.7516 33.5016 41.7516C32.6438 41.7516 31.8375 41.4141 31.2281 40.8047C30.6188 40.1953 30.2859 39.3891 30.2859 38.5266C30.2859 37.6641 30.6188 36.8531 31.2281 36.2438C31.3969 36.075 31.6219 35.9813 31.8562 35.9813C32.0953 35.9813 32.3156 36.075 32.4891 36.2438C32.6578 36.4125 32.7516 36.6375 32.7516 36.8719C32.7516 37.1063 32.6578 37.3313 32.4891 37.5C31.9266 38.0625 31.9266 38.9813 32.4891 39.5438C32.7609 39.8156 33.1219 39.9656 33.5062 39.9656C33.6141 39.9656 33.7219 39.9516 33.8297 39.9281C34.0969 39.8719 34.3406 39.7359 34.5328 39.5391L39.6328 34.4438C39.9047 34.1672 40.0547 33.8063 40.0547 33.4219C40.0547 33.0328 39.9047 32.6672 39.6281 32.4C39.3609 32.1281 39 31.9781 38.6156 31.9781C38.5078 31.9781 38.4 31.9922 38.2875 32.0156C38.0203 32.0766 37.7766 32.2078 37.5844 32.4047L35.3016 34.6875C35.1328 34.8563 34.9078 34.95 34.6734 34.95C34.4391 34.95 34.2141 34.8563 34.0453 34.6875C33.8766 34.5188 33.7875 34.2938 33.7875 34.0594C33.7875 33.825 33.8813 33.6 34.05 33.4313L36.3375 31.1484C36.7688 30.7172 37.3172 30.4172 37.9125 30.2859C38.1469 30.2344 38.3906 30.2063 38.6297 30.2063C39.4828 30.2063 40.2891 30.5438 40.8984 31.1531C41.5078 31.7625 41.8406 32.5734 41.8406 33.4313C41.8312 34.2938 41.4938 35.1 40.8844 35.7094Z" fill="#F4184C"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Frame">
<path id="Vector" d="M35 3.99996C38.0375 3.99996 40.5 6.46246 40.5 9.49996V38.5C40.5 41.5375 38.0375 44 35 44H13C9.9625 44 7.5 41.5375 7.5 38.5V9.49996C7.5 6.46246 9.9625 3.99996 13 3.99996H35ZM28 36.5H20C19.6022 36.5 19.2206 36.658 18.9393 36.9393C18.658 37.2206 18.5 37.6021 18.5 38C18.5 38.3978 18.658 38.7793 18.9393 39.0606C19.2206 39.3419 19.6022 39.5 20 39.5H28C28.3978 39.5 28.7794 39.3419 29.0607 39.0606C29.342 38.7793 29.5 38.3978 29.5 38C29.5 37.6021 29.342 37.2206 29.0607 36.9393C28.7794 36.658 28.3978 36.5 28 36.5ZM35 6.99996H13C12.6717 6.99996 12.3466 7.06463 12.0433 7.19026C11.74 7.3159 11.4644 7.50005 11.2322 7.73219C11.0001 7.96434 10.8159 8.23994 10.6903 8.54325C10.5647 8.84657 10.5 9.17166 10.5 9.49996V32H37.5V9.49996C37.5 9.17166 37.4353 8.84657 37.3097 8.54325C37.1841 8.23994 36.9999 7.96434 36.7678 7.73219C36.5356 7.50005 36.26 7.3159 35.9567 7.19026C35.6534 7.06463 35.3283 6.99996 35 6.99996Z" fill="#EEEEEE"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Frame">
<path id="Vector" d="M36.678 11.4126C37.5538 11.913 37.858 13.0286 37.3576 13.9044L34.5611 18.7984C39.6747 22.0041 43.2591 27.4537 43.8913 33.8211C43.998 34.8958 43.1539 35.8279 42.0739 35.8279H5.72691C4.64691 35.8279 3.80282 34.8958 3.9095 33.8211C4.51392 27.7332 7.8171 22.4842 12.5753 19.2333L9.53021 13.9044C9.02976 13.0286 9.33402 11.913 10.2098 11.4126C11.0856 10.9121 12.2012 11.2164 12.7017 12.0922L15.7661 17.4549C18.2582 16.35 21.0123 15.7379 23.9004 15.7379C26.5069 15.7379 29.0042 16.2365 31.2983 17.1459L34.1861 12.0922C34.6866 11.2164 35.8022 10.9121 36.678 11.4126ZM15.6818 25.7829C14.6732 25.7829 13.8555 26.6005 13.8555 27.6092C13.8555 28.6179 14.6732 29.4356 15.6818 29.4356C16.6906 29.4356 17.5082 28.6179 17.5082 27.6092C17.5082 26.6005 16.6906 25.7829 15.6818 25.7829ZM32.1191 25.7829C31.1105 25.7829 30.2928 26.6005 30.2928 27.6092C30.2928 28.6179 31.1105 29.4356 32.1191 29.4356C33.1279 29.4356 33.9455 28.6179 33.9455 27.6092C33.9455 26.6005 33.1279 25.7829 32.1191 25.7829Z" fill="#EEEEEE"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="ic_gf">
<path id="Vector" d="M11.6304 16.2755L11.6268 16.2883L11.6322 16.2928L11.6304 16.2755ZM27.1194 10.7593C26.095 10.1861 24.6487 7.80189 24.6651 7.08054C24.7351 4.03674 22.6893 3.59109 21.6658 3.67464C19.3962 3.85929 17.9716 3.17889 16.8937 2.03994C15.8158 0.900085 14.8489 0.949285 14.8489 0.949285C14.0793 0.949285 13.4626 1.23219 12.6675 2.17554C11.4213 3.65379 9.44815 3.70659 8.8495 3.67374C8.2519 3.64194 6.8455 3.51729 5.98675 4.21959C5.128 4.92189 5.10625 6.13899 4.8961 7.48989C4.68595 8.83989 3.2833 10.1725 2.5783 10.7593C1.8733 11.3459 1.46035 11.8045 1.35115 12.394C1.24195 12.9842 1.04905 13.1917 2.16985 15.1192C3.4234 17.2751 2.7748 18.8051 2.5792 20.2961C2.3836 21.788 3.27415 22.7741 5.17 23.2934C7.06585 23.8129 8.29015 25.7669 8.4421 26.1544C8.59405 26.542 9.5719 28.0348 10.4871 28.1984C11.6751 28.4104 12.4429 27.5816 13.2142 27.3806C13.9848 27.1796 15.6777 27.0031 16.6228 27.5171C19.5348 29.0999 20.7637 27.4798 21.1221 26.4274C21.5077 25.294 22.9605 23.6837 24.5307 23.2936C28.0239 22.4267 26.9331 19.3666 26.8485 19.07C26.7639 18.7735 26.5092 16.2455 27.3943 15.2549C29.2491 13.1762 28.1437 11.3323 27.1194 10.7593ZM17.758 16.2791L17.7534 16.2628V16.2829L17.7589 16.2793C18.5085 18.7745 18.6741 20.9132 18.6741 20.9132L14.7006 18.4981C14.6985 18.4991 14.6964 18.5 14.6943 18.5008L14.6806 18.4963C12.7402 19.838 10.7145 20.9132 10.7145 20.9132C10.7145 20.9132 10.8792 18.7801 11.6269 16.2884C9.7948 14.914 8.3266 12.9536 8.3266 12.9536L12.7039 12.5561L14.6943 8.17794L16.6846 12.5552L21.0619 12.9536C21.0619 12.9533 19.5919 14.9027 17.758 16.2791Z" fill="#EEEEEE"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Frame">
<path id="Vector" d="M42.0004 13.0039V33.3979C42.0048 33.7924 41.9292 34.1836 41.7783 34.548C41.6273 34.9125 41.404 35.2425 41.122 35.5183C40.8476 35.8023 40.5178 36.0267 40.153 36.1779C39.7883 36.329 39.3963 36.4035 39.0016 36.3967H28.7956C28.8034 36.8916 28.9061 37.3804 29.098 37.8367C29.2742 38.2906 29.4737 38.7352 29.6956 39.1687C29.8516 39.4161 29.9545 39.6931 29.998 39.9823C29.9951 40.3003 29.8676 40.6045 29.6427 40.8294C29.4178 41.0543 29.1136 41.1819 28.7956 41.1847H19.2016C18.8835 41.1819 18.5793 41.0543 18.3544 40.8294C18.1296 40.6045 18.002 40.3003 17.9992 39.9823C18.0395 39.6884 18.1439 39.407 18.3052 39.1579C18.528 38.7311 18.7275 38.2924 18.9028 37.8439C19.0975 37.381 19.2002 36.8845 19.2052 36.3823H9.00276C8.60816 36.3878 8.2166 36.3127 7.85201 36.1617C7.48743 36.0106 7.15748 35.7868 6.88236 35.5039C6.59954 35.2315 6.37542 34.9042 6.22374 34.542C6.07206 34.1799 5.99605 33.7905 6.00036 33.3979V13.0039C5.99488 12.6093 6.06996 12.2178 6.22099 11.8532C6.37203 11.4886 6.59584 11.1586 6.87876 10.8835C7.15207 10.5987 7.48101 10.3731 7.84515 10.2208C8.20929 10.0684 8.60086 9.99258 8.99556 9.99791H38.9944C39.7913 9.99886 40.5553 10.3159 41.1189 10.8794C41.6824 11.4429 41.9994 12.207 42.0004 13.0039ZM39.5956 28.6063V13.0039C39.5956 12.9255 39.58 12.8479 39.5497 12.7756C39.5194 12.7032 39.4751 12.6377 39.4192 12.5827C39.3641 12.5259 39.2981 12.4809 39.225 12.4506C39.1519 12.4202 39.0735 12.4052 38.9944 12.4063H9.00276C8.92435 12.4063 8.84673 12.4219 8.77441 12.4521C8.70209 12.4824 8.63653 12.5268 8.58156 12.5827C8.52516 12.6373 8.48045 12.7028 8.45013 12.7752C8.4198 12.8476 8.4045 12.9254 8.40516 13.0039V28.6027C8.40464 28.6817 8.41998 28.76 8.45028 28.833C8.48059 28.906 8.52522 28.9721 8.58156 29.0275C8.63616 29.0839 8.70165 29.1286 8.77405 29.1589C8.84645 29.1893 8.92426 29.2046 9.00276 29.2039H38.998C39.077 29.2044 39.1553 29.1891 39.2282 29.1588C39.3012 29.1285 39.3674 29.0838 39.4228 29.0275C39.479 28.9736 39.5237 28.9087 39.5541 28.8369C39.5844 28.7651 39.5997 28.6879 39.5992 28.6099L39.5956 28.6063Z" fill="#EEEEEE"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Frame">
<path id="Vector" d="M35 3.99996C38.0375 3.99996 40.5 6.46246 40.5 9.49996V38.5C40.5 41.5375 38.0375 44 35 44H13C9.9625 44 7.5 41.5375 7.5 38.5V9.49996C7.5 6.46246 9.9625 3.99996 13 3.99996H35ZM28 36.5H20C19.6022 36.5 19.2206 36.658 18.9393 36.9393C18.658 37.2206 18.5 37.6021 18.5 38C18.5 38.3978 18.658 38.7793 18.9393 39.0606C19.2206 39.3419 19.6022 39.5 20 39.5H28C28.3978 39.5 28.7794 39.3419 29.0607 39.0606C29.342 38.7793 29.5 38.3978 29.5 38C29.5 37.6021 29.342 37.2206 29.0607 36.9393C28.7794 36.658 28.3978 36.5 28 36.5ZM35 6.99996H13C12.6717 6.99996 12.3466 7.06463 12.0433 7.19026C11.74 7.3159 11.4644 7.50005 11.2322 7.73219C11.0001 7.96434 10.8159 8.23994 10.6903 8.54325C10.5647 8.84657 10.5 9.17166 10.5 9.49996V32H37.5V9.49996C37.5 9.17166 37.4353 8.84657 37.3097 8.54325C37.1841 8.23994 36.9999 7.96434 36.7678 7.73219C36.5356 7.50005 36.26 7.3159 35.9567 7.19026C35.6534 7.06463 35.3283 6.99996 35 6.99996Z" fill="#EEEEEE"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

+4
View File
@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 30 30" fill="none">
<!-- Figma Subtract 复合路径:Safari 必须 evenodd,否则 nonzero 会把外形抵消成空白 -->
<path fill="#EEEEEE" fill-rule="evenodd" clip-rule="evenodd" d="M24.6006 4.80005C25.0733 4.80005 25.5417 4.89355 25.9785 5.07446C26.4152 5.25538 26.8122 5.5205 27.1465 5.85474C27.4807 6.18899 27.7459 6.58602 27.9268 7.02271C28.1076 7.45928 28.2011 7.92713 28.2012 8.39966V21.5999C28.2012 22.5546 27.8216 23.4706 27.1465 24.1458C26.4714 24.8209 25.5554 25.2004 24.6006 25.2004H5.40039C4.44584 25.2003 3.53049 24.8207 2.85547 24.1458C2.18034 23.4706 1.80078 22.5546 1.80078 21.5999V8.39966C1.80088 7.44502 2.18043 6.52978 2.85547 5.85474C3.53051 5.1797 4.44575 4.80015 5.40039 4.80005H24.6006ZM4.7998 6.90747C3.86035 6.90759 3.54966 8.16535 4.37988 8.60278L14.6133 13.9963C14.743 14.0647 14.8876 14.1001 15.0342 14.0999C15.1808 14.0996 15.3255 14.0641 15.4551 13.9954L25.6221 8.59497C26.4501 8.15517 26.1376 6.90003 25.1992 6.90063L4.7998 6.90747Z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Frame">
<path id="Vector" d="M39.0816 32.0192C39.0366 32.1542 38.3324 34.5908 36.6023 37.0971C35.1039 39.2592 33.5537 41.4394 31.1081 41.4776C28.7008 41.5204 27.9313 40.0534 25.1842 40.0534C22.4417 40.0534 21.58 41.4394 19.3054 41.5204C16.9543 41.6148 15.1431 39.158 13.6425 37.0071C10.5669 32.5997 8.2023 24.5182 11.3746 19.1028C12.9383 16.3917 15.7438 14.6705 18.7991 14.621C21.103 14.5783 23.2944 16.1689 24.6938 16.1689C26.1314 16.1689 28.7818 14.2453 31.5783 14.5333C32.7483 14.5828 36.0241 15.017 38.1344 18.0521C37.9702 18.1646 34.2152 20.3604 34.2579 24.8331C34.3142 30.2306 39.0321 32.0012 39.0816 32.0192ZM29.7492 11.64C31.0091 10.1146 31.8393 8.0177 31.6211 5.93433C29.8212 6.00407 27.6253 7.12 26.3227 8.63866C25.1685 9.96157 24.1538 12.0922 24.4373 14.1508C26.4374 14.2701 28.4938 13.1114 29.747 11.64" fill="#EEEEEE"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1018 B

+5
View File
@@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Frame">
<path id="Vector" d="M25.3 21L30.5 18.8C31.9 18.2 32.6 16.6 32 15.2C31.4 13.8 29.7 13.2 28.3 13.8L23 15.9C21.6 16.5 20.9 18.1 21.5 19.5C22.2 20.9 23.9 21.6 25.3 21ZM42.8 17L38 6.10001C37.6 5.20001 36.5 4.70001 35.5 5.10001L23.4 10.2C22.4 10.6 22 11.7 22.4 12.6L22.9 13.8L27.4 11.9C29.8 10.9 32.6 12 33.6 14.3C34.6 16.6 33.5 19.3 31.2 20.4L26.7 22.3L27.2 23.5C27.6 24.4 28.7 24.9 29.7 24.5L41.8 19.4C42.8 19 43.3 17.9 42.8 17ZM15.6 32C17 32.7 18.7 32.2 19.4 30.8L22 25.9C22.7 24.5 22.2 22.9 20.8 22.2C19.4 21.5 17.7 22 17 23.4L14.4 28.3C13.7 29.7 14.3 31.4 15.6 32ZM24.5 28L23.3 27.4L21.1 31.6C19.9 33.9 17.1 34.8 14.8 33.6C12.5 32.4 11.6 29.7 12.8 27.4L15 23.2L13.8 22.6C12.9 22.1 11.7 22.5 11.3 23.4L5.3 34.9C4.8 35.8 5.2 36.9 6.1 37.4L16.9 42.8C17.8 43.3 19 42.9 19.4 42L25.4 30.5C25.8 29.6 25.5 28.5 24.5 28Z" fill="#FF951C"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1023 B

+5
View File
@@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="ic_js">
<path id="Vector" d="M9.99883 34.0138C8.90965 36.1763 8.08688 39.9081 8.08688 39.9081C8.08688 39.9081 11.8202 39.0866 13.9848 37.9976L15.9714 39.9832C15.7319 40.3943 15.4481 40.7891 15.0954 41.1426C12.8655 43.3713 2.00002 45.9907 2.00002 45.9907C2.00002 45.9907 4.62246 35.1335 6.85331 32.9047C7.20586 32.5515 7.59831 32.2659 8.01227 32.0284L9.99883 34.0138ZM29.5866 40.2725L30.9337 31.1604L39.4984 22.6L39.4537 22.5555C41.5337 20.2934 49.0528 10.7301 44.6297 3.37559C37.2728 -1.04319 27.7045 6.47094 25.4396 8.5498L25.418 8.52733L16.8534 17.0874L7.7373 18.4348L6.30882 19.8615L11.0752 24.6263L7.81342 26.1235C6.76324 27.1723 6.77956 28.8941 7.85226 29.9668L18.0501 40.1591C19.1219 41.2295 20.8453 41.2468 21.8955 40.1979L23.3927 36.9372L28.1582 41.7001L29.5866 40.2725ZM34.1989 21.1082C33.1478 22.1586 31.4244 22.1399 30.3526 21.0683L26.9533 17.671C25.8796 16.5979 25.8624 14.8766 26.9135 13.8266L30.2439 10.498C31.2952 9.44734 33.0167 9.46472 34.0905 10.5375L37.4898 13.935C38.5616 15.0063 38.5806 16.7289 37.5294 17.7795L34.1989 21.1082ZM17.963 31.5096L16.5056 30.0541L22.4529 24.1099C22.8462 23.7173 23.4927 23.723 23.8944 24.1245C24.2963 24.5262 24.3029 25.1734 23.9101 25.5655L17.963 31.5096Z" fill="#2ECC71"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

+6
View File
@@ -0,0 +1,6 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="ic_yj">
<path id="Vector" d="M38 8.8C33.7 7.7 29.8 6.7 26.4 3.9C25.7 3.3 24.9 3 24 3C23.1 3 22.3 3.3 21.6 3.9C18.7 6.3 15.3 7.2 11.6 8.4C11.1 8.6 10.5 8.7 9.99999 8.8C8.29999 9.2 7.09999 10.8 6.99999 12.6V13.1L10.2 35.7C10.2 35.9 10.2 36.1 10.3 36.2C10.3 36 10.2 35.9 10.2 35.7C10.3 37 11 38.1 12.1 38.7L22 44.4C22.2 44.5 22.3 44.6 22.5 44.6C23 44.8 23.5 44.9 24 44.9C24.7 44.9 25.4 44.7 26 44.3L35.9 38.6C37 38 37.6 36.8 37.8 35.6C37.8 35.8 37.8 36 37.7 36.1C37.7 35.9 37.8 35.8 37.8 35.6L41 13.1C41.2 11.1 39.9 9.3 38 8.8ZM34.8 35.2V35.3C34.8 35.6 34.6 35.9 34.3 36.1H34.1L24.3 41.8C24.3 42 24.1 42 24 42C23.9 42 23.7 42 23.6 41.9L13.8 36.2H13.6C13.3 36 13.2 35.8 13.1 35.4V35.2L9.99999 12.8C9.99999 12.3 10.3 11.9 10.7 11.8C15.3 10.6 19.8 9.4 23.5 6.3C23.7 6 23.9 6 24 6C24.1 6 24.3 6 24.5 6.2C28.2 9.3 32.6 10.6 37.3 11.7C37.7 11.8 38.1 12.3 38 12.7L34.8 35.2Z" fill="#00D9FF"/>
<path id="Vector_2" d="M34.0004 13.9C30.7004 12.8 27.5004 12.1 24.6004 10.1C24.3004 9.8 23.8004 9.8 23.4004 10.1C20.5004 12.2 17.3004 12.8 14.0004 13.9C13.5004 14.1 13.2004 14.5 13.3004 15L16.0004 33.7C16.0004 34 16.2004 34.2 16.4004 34.4L23.4004 38.2C23.7004 38.4 24.2004 38.4 24.5004 38.2L31.5004 34.4C31.7004 34.2 31.9004 34 31.9004 33.7L34.6004 15C34.7004 14.5 34.4004 14 34.0004 13.9ZM28.9004 22.5L24.0004 27.4C23.4004 28 22.5004 28 21.9004 27.4L19.1004 24.6C18.5004 24 18.5004 23.1 19.1004 22.5C19.7004 21.9 20.6004 21.9 21.2004 22.5L23.0004 24.3L26.9004 20.4C27.5004 19.8 28.4004 19.8 29.0004 20.4C29.5004 21 29.5004 21.9 28.9004 22.5Z" fill="#00D9FF"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

+10
View File
@@ -0,0 +1,10 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="ic_tg" clip-path="url(#clip0_0_121)">
<path id="Vector" d="M25.6055 4.39219C22.7953 1.58203 18.9773 0 15 0C11.0227 0 7.20469 1.58203 4.39453 4.39219C1.58203 7.20469 0 11.0227 0 15C0 18.9773 1.58203 22.7953 4.39453 25.6078C7.20469 28.4203 11.0227 30 15 30C18.9773 30 22.7953 28.418 25.6055 25.6078C28.418 22.7953 30 18.9773 30 15C30 11.0227 28.418 7.20469 25.6055 4.39219ZM21.9516 10.2C21.7266 12.5719 20.7492 18.3281 20.2523 20.9836C20.0438 22.1086 19.6289 22.4836 19.2281 22.5211C18.3563 22.6008 17.6953 21.9445 16.8516 21.3914C15.532 20.5266 14.7867 19.9875 13.5047 19.1438C12.0234 18.1688 12.9844 17.632 13.8281 16.7555C14.0484 16.5258 17.8875 13.0359 17.9602 12.7195C17.9695 12.6797 17.9789 12.532 17.8898 12.4547C17.8031 12.3773 17.6742 12.4031 17.5805 12.4242C17.4469 12.4547 15.3398 13.8492 11.2523 16.6055C10.6547 17.0156 10.1133 17.2172 9.62578 17.2055C9.09141 17.1938 8.06016 16.9031 7.29375 16.6547C6.35625 16.35 5.60859 16.1883 5.67422 15.668C5.70703 15.3984 6.07969 15.1219 6.78984 14.8383C11.1633 12.9328 14.0789 11.6766 15.5367 11.0695C19.7039 9.3375 20.5687 9.03516 21.1336 9.02578C21.2578 9.02578 21.5344 9.05391 21.7148 9.19922C21.8648 9.32344 21.907 9.48984 21.9281 9.60469C21.9469 9.72187 21.9727 9.98672 21.9516 10.1953V10.2Z" fill="#EEEEEE"/>
</g>
<defs>
<clipPath id="clip0_0_121">
<rect width="30" height="30" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Frame">
<path id="Vector" d="M28.8609 25.6594C28.3969 25.4391 27.9281 25.2281 27.4406 25.0453C30.5859 22.8938 32.6531 19.2797 32.6531 15.1922C32.6531 8.61094 27.3 3.25781 20.7188 3.25781C14.1375 3.25781 8.78437 8.61094 8.78437 15.1922C8.78437 19.2797 10.8516 22.8938 13.9969 25.0453C7.55156 27.4781 3 33.2859 3 40.0594C3 41.1281 3.83906 41.9953 4.88906 42.0609H4.90781C4.94062 42.0609 4.97813 42.0703 5.01094 42.0703C5.04844 42.0703 5.08125 42.0609 5.11406 42.0609H25.9688C24.6141 40.1484 23.8125 37.8188 23.8125 35.2969C23.8125 31.2984 25.8141 27.7781 28.8609 25.6594ZM12.3563 15.2531C12.3563 10.65 16.0875 6.92344 20.6859 6.92344C25.2844 6.92344 29.0156 10.6547 29.0156 15.2531C29.0156 19.8563 25.2844 23.5828 20.6859 23.5828C16.0875 23.5828 12.3563 19.8563 12.3563 15.2531ZM35.55 25.8469C30.3328 25.8469 26.1 30.075 26.1 35.2969C26.1 40.5188 30.3281 44.7469 35.55 44.7469C40.7719 44.7469 45 40.5141 45 35.2969C45 30.0797 40.7719 25.8469 35.55 25.8469ZM30.8484 29.8641C31.1578 29.7047 31.5328 29.8266 31.6922 30.1313L32.7469 32.1609C32.9062 32.4656 32.7844 32.8453 32.4797 33.0047C32.4094 33.0375 32.3391 33.0609 32.2688 33.0703C32.0156 33.1031 31.7625 32.9766 31.6359 32.7375L30.5813 30.7078C30.4219 30.4031 30.5391 30.0234 30.8484 29.8641ZM28.5563 34.1484C28.2188 34.0688 28.0125 33.7313 28.0922 33.3984C28.1719 33.0609 28.5094 32.8547 28.8422 32.9344L31.0687 33.4594C31.3312 33.5203 31.5141 33.7359 31.5469 33.9891C31.5563 34.0594 31.5516 34.1344 31.5328 34.2094C31.4531 34.5469 31.1156 34.7531 30.7828 34.6734L28.5563 34.1484ZM40.8844 35.7094L35.7891 40.8047C35.3578 41.2359 34.8141 41.5359 34.2141 41.6719C33.9797 41.7234 33.7359 41.7516 33.5016 41.7516C32.6438 41.7516 31.8375 41.4141 31.2281 40.8047C30.6188 40.1953 30.2859 39.3891 30.2859 38.5266C30.2859 37.6641 30.6188 36.8531 31.2281 36.2438C31.3969 36.075 31.6219 35.9813 31.8562 35.9813C32.0953 35.9813 32.3156 36.075 32.4891 36.2438C32.6578 36.4125 32.7516 36.6375 32.7516 36.8719C32.7516 37.1063 32.6578 37.3313 32.4891 37.5C31.9266 38.0625 31.9266 38.9813 32.4891 39.5438C32.7609 39.8156 33.1219 39.9656 33.5062 39.9656C33.6141 39.9656 33.7219 39.9516 33.8297 39.9281C34.0969 39.8719 34.3406 39.7359 34.5328 39.5391L39.6328 34.4438C39.9047 34.1672 40.0547 33.8063 40.0547 33.4219C40.0547 33.0328 39.9047 32.6672 39.6281 32.4C39.3609 32.1281 39 31.9781 38.6156 31.9781C38.5078 31.9781 38.4 31.9922 38.2875 32.0156C38.0203 32.0766 37.7766 32.2078 37.5844 32.4047L35.3016 34.6875C35.1328 34.8563 34.9078 34.95 34.6734 34.95C34.4391 34.95 34.2141 34.8563 34.0453 34.6875C33.8766 34.5188 33.7875 34.2938 33.7875 34.0594C33.7875 33.825 33.8813 33.6 34.05 33.4313L36.3375 31.1484C36.7688 30.7172 37.3172 30.4172 37.9125 30.2859C38.1469 30.2344 38.3906 30.2063 38.6297 30.2063C39.4828 30.2063 40.2891 30.5438 40.8984 31.1531C41.5078 31.7625 41.8406 32.5734 41.8406 33.4313C41.8312 34.2938 41.4938 35.1 40.8844 35.7094Z" fill="#F4184C"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="ic_tt">
<path id="Vector" d="M22.3164 3.57422H26.193L17.7238 13.2539L27.6871 26.4258H19.8859L13.7758 18.4371L6.78436 26.4258H2.90547L11.9641 16.0723L2.40625 3.57422H10.4055L15.9285 10.8762L22.3164 3.57422ZM20.9559 24.1055H23.1039L9.23826 5.77267H6.93317L20.9559 24.1055Z" fill="#EEEEEE"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 474 B

+5
View File
@@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="16.6666" height="16.6663" viewBox="0 0 16.6666 16.6663" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Search">
<path id="Search_2" d="M13.0176 13.0449C13.3396 12.7254 13.8557 12.7253 14.1777 13.0449L16.3066 14.7637H16.3438C16.7743 15.1989 16.7742 15.9045 16.3438 16.3398C15.913 16.7752 15.2149 16.7752 14.7842 16.3398L13.0176 14.3154C12.8506 14.1473 12.7569 13.9189 12.7568 13.6807C12.7568 13.4423 12.8506 13.2132 13.0176 13.0449ZM7.14844 0C9.04401 0.000108317 10.8617 0.761441 12.2021 2.11621C13.5426 3.47107 14.2958 5.30856 14.2959 7.22461C14.2959 11.2147 11.096 14.45 7.14844 14.4502C3.20069 14.4502 0 11.2148 0 7.22461C0.000175657 3.23454 3.2008 0 7.14844 0Z" fill="white"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 782 B

+9
View File
@@ -0,0 +1,9 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.48029 2.00043C7.48029 2.00043 8.00445 2.31874 7.76439 3.14756C6.9601 5.92079 3.24343 7.03384 4.69874 9.46404C4.69874 9.46404 4.00632 8.84445 3.81384 7.76763C3.81384 7.76763 2.38364 11.2508 5.62945 13.3925C6.31041 13.8421 7.0548 13.9742 7.79347 13.9976C9.52627 14.0534 11.2313 13.13 12.0316 11.5555C12.9165 9.81474 12.4941 7.61678 11.2133 6.31752C11.2133 6.31752 11.7357 7.09946 10.2433 8.02586C10.2433 8.02586 11.0851 3.24131 7.48029 2V2.00043Z" fill="url(#paint0_linear_25005_2496)"/>
<defs>
<linearGradient id="paint0_linear_25005_2496" x1="8.11941" y1="1.52444" x2="7.94461" y2="14.086" gradientUnits="userSpaceOnUse">
<stop stop-color="#EA5749"/>
<stop offset="1" stop-color="#FFFBFB"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 832 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 581 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

+10
View File
@@ -0,0 +1,10 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_19678_42028)">
<path d="M14.1084 13.8319C14.1085 13.3255 14.6571 13.0083 15.0967 13.2615L21.6709 17.0584C22.1096 17.3116 22.1096 17.9458 21.6709 18.199V18.1981L15.0967 21.994C14.658 22.2472 14.1084 21.9301 14.1084 21.4237V13.8319ZM6.23926 4.86897C6.59761 6.17902 7.637 7.26495 9.05469 7.60822C9.12389 7.62496 9.19375 7.63852 9.2627 7.65119C9.76177 8.59246 10.6467 9.32674 11.7666 9.59748C12.9033 9.87204 14.0117 9.61711 14.8809 9.00959C16.2509 9.28628 17.6066 8.79565 18.4922 7.82697C19.3124 9.17344 19.7861 10.7551 19.7861 12.4471C19.7861 13.2961 19.6636 14.1167 19.4414 14.8944L15.4766 12.6053L15.4756 12.6043L15.2959 12.5164C14.3873 12.1467 13.3488 12.8098 13.3486 13.8328V20.992C12.5684 21.2158 11.7447 21.3397 10.8926 21.3397C5.98166 21.3394 2.0004 17.358 2 12.4471C2 9.24221 3.69646 6.43402 6.23926 4.86897ZM12.5498 2.66291C12.6574 2.19932 13.1206 1.91034 13.584 2.0174C14.0477 2.12488 14.337 2.58859 14.2295 3.05256L13.9834 4.10725C15.6557 4.72463 17.0517 5.80913 18.0547 7.17365C17.3249 8.07643 16.1161 8.53304 14.9131 8.24201C14.8435 8.2251 14.7756 8.20527 14.709 8.1844C13.9763 8.81914 12.9769 9.10837 11.9453 8.8592C10.9138 8.60988 10.1293 7.87192 9.77637 6.951C9.59606 6.94002 9.41471 6.91377 9.2334 6.86994C8.03055 6.57866 7.16409 5.62134 6.92676 4.48518C8.54625 3.67637 10.4204 3.3576 12.3164 3.66682L12.5498 2.66291Z" fill="#d68b13"/>
</g>
<defs>
<clipPath id="clip0_19678_42028">
<rect width="24" height="24" rx="12" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

+4
View File
@@ -0,0 +1,4 @@
<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 18C0 8.05888 8.05888 0 18 0C27.9411 0 36 8.05888 36 18C36 27.9411 27.9411 36 18 36C8.05888 36 0 27.9411 0 18Z" fill="#335AE8"/>
<path d="M21.6004 20.5992C23.3828 17.45 24.0303 14.4566 24.0303 14.4566H18.0355V12.2516H25.1652V11.3074H18.0355V8H14.7957V11.3074H8.31341V12.2516H14.7957V14.4566H9.28587V15.4008H20.4679C20.4679 15.559 20.4679 15.559 20.3054 15.7147C20.3054 16.8172 19.4955 18.3918 18.848 19.6524C10.5833 16.5033 8.15345 18.3918 7.50345 18.7082C1.99366 22.4877 7.17845 27.2115 7.98841 27.0557C13.8232 28.3164 17.548 25.9533 20.1429 22.9598C20.3054 23.118 20.4679 23.118 20.6279 23.118C22.4103 24.0623 31 28 31 28V23.2762C29.7025 23.2762 25.0053 21.7017 21.6004 20.5992ZM17.388 22.0156C13.3357 27.0557 8.47591 25.4812 7.66595 25.1647C5.72102 24.6926 5.07356 21.2295 7.50345 20.1271C11.5558 18.8664 15.1207 20.2853 17.713 21.5434C17.5505 21.8574 17.388 22.0156 17.388 22.0156Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1016 B

+10
View File
@@ -0,0 +1,10 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_19678_42028)">
<path d="M14.1084 13.8319C14.1085 13.3255 14.6571 13.0083 15.0967 13.2615L21.6709 17.0584C22.1096 17.3116 22.1096 17.9458 21.6709 18.199V18.1981L15.0967 21.994C14.658 22.2472 14.1084 21.9301 14.1084 21.4237V13.8319ZM6.23926 4.86897C6.59761 6.17902 7.637 7.26495 9.05469 7.60822C9.12389 7.62496 9.19375 7.63852 9.2627 7.65119C9.76177 8.59246 10.6467 9.32674 11.7666 9.59748C12.9033 9.87204 14.0117 9.61711 14.8809 9.00959C16.2509 9.28628 17.6066 8.79565 18.4922 7.82697C19.3124 9.17344 19.7861 10.7551 19.7861 12.4471C19.7861 13.2961 19.6636 14.1167 19.4414 14.8944L15.4766 12.6053L15.4756 12.6043L15.2959 12.5164C14.3873 12.1467 13.3488 12.8098 13.3486 13.8328V20.992C12.5684 21.2158 11.7447 21.3397 10.8926 21.3397C5.98166 21.3394 2.0004 17.358 2 12.4471C2 9.24221 3.69646 6.43402 6.23926 4.86897ZM12.5498 2.66291C12.6574 2.19932 13.1206 1.91034 13.584 2.0174C14.0477 2.12488 14.337 2.58859 14.2295 3.05256L13.9834 4.10725C15.6557 4.72463 17.0517 5.80913 18.0547 7.17365C17.3249 8.07643 16.1161 8.53304 14.9131 8.24201C14.8435 8.2251 14.7756 8.20527 14.709 8.1844C13.9763 8.81914 12.9769 9.10837 11.9453 8.8592C10.9138 8.60988 10.1293 7.87192 9.77637 6.951C9.59606 6.94002 9.41471 6.91377 9.2334 6.86994C8.03055 6.57866 7.16409 5.62134 6.92676 4.48518C8.54625 3.67637 10.4204 3.3576 12.3164 3.66682L12.5498 2.66291Z" fill="#d68b13"/>
</g>
<defs>
<clipPath id="clip0_19678_42028">
<rect width="24" height="24" rx="12" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

+3
View File
@@ -0,0 +1,3 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="37.0911" height="37.0911" viewBox="0 0 37.0911 37.0911" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Star 7" d="M16.3279 0.979548C17.5179 -0.326515 19.5732 -0.326516 20.7632 0.979547L21.3914 1.66906C22.1808 2.53547 23.4024 2.86281 24.5193 2.50717L25.4081 2.22414C27.0916 1.68803 28.8716 2.71569 29.2491 4.44175L29.4483 5.35299C29.6988 6.49801 30.5931 7.39234 31.7381 7.64276L32.6494 7.84205C34.3754 8.21954 35.4031 9.99949 34.867 11.6831L34.5839 12.5719C34.2283 13.6887 34.5556 14.9104 35.422 15.6997L36.1116 16.3279C37.4176 17.5179 37.4176 19.5732 36.1116 20.7632L35.422 21.3914C34.5556 22.1807 34.2283 23.4024 34.5839 24.5193L34.867 25.408C35.4031 27.0916 34.3754 28.8716 32.6494 29.2491L31.7381 29.4483C30.5931 29.6988 29.6988 30.5931 29.4483 31.7381L29.2491 32.6494C28.8716 34.3754 27.0916 35.4031 25.4081 34.867L24.5193 34.5839C23.4024 34.2283 22.1808 34.5556 21.3914 35.422L20.7632 36.1116C19.5732 37.4176 17.5179 37.4176 16.3279 36.1116L15.6997 35.422C14.9104 34.5556 13.6887 34.2283 12.5719 34.5839L11.6831 34.867C9.9995 35.4031 8.21954 34.3754 7.84205 32.6494L7.64276 31.7381C7.39234 30.5931 6.49801 29.6988 5.35299 29.4483L4.44175 29.2491C2.71569 28.8716 1.68803 27.0916 2.22414 25.4081L2.50717 24.5193C2.86281 23.4024 2.53547 22.1808 1.66906 21.3914L0.979548 20.7632C-0.326515 19.5732 -0.326517 17.5179 0.979547 16.3279L1.66906 15.6997C2.53547 14.9104 2.86281 13.6887 2.50717 12.5719L2.22414 11.6831C1.68803 9.9995 2.71569 8.21954 4.44175 7.84205L5.35299 7.64276C6.49801 7.39234 7.39234 6.49801 7.64276 5.35299L7.84205 4.44175C8.21954 2.71569 9.99949 1.68803 11.6831 2.22414L12.5719 2.50717C13.6887 2.86281 14.9104 2.53547 15.6997 1.66906L16.3279 0.979548Z" fill="#FF0095"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Frame 2147231187">
<g clip-path="url(#clip0_0_4)">
<circle id="Ellipse 14975" cx="12" cy="12" r="12" fill="url(#paint0_linear_0_4)"/>
<g id="Ellipse 14976" opacity="0.3" filter="url(#filter0_f_0_4)">
<circle cx="12" cy="22" r="9" fill="white"/>
</g>
<path id="Vector 5628" d="M8.14286 11L6 13L11.1429 18L18 7.5L16.2857 6L10.2857 12.5L8.14286 11Z" fill="#2D251E"/>
</g>
<rect x="1" y="1" width="22" height="22" rx="11" stroke="#2D251E" stroke-width="2"/>
</g>
<defs>
<filter id="filter0_f_0_4" x="-1" y="9" width="26" height="26" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="2" result="effect1_foregroundBlur_0_4"/>
</filter>
<linearGradient id="paint0_linear_0_4" x1="12" y1="0" x2="12" y2="24" gradientUnits="userSpaceOnUse">
<stop stop-color="#FEBF8B"/>
<stop offset="1" stop-color="#FFB27D"/>
</linearGradient>
<clipPath id="clip0_0_4">
<rect width="24" height="24" rx="12" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

+4
View File
@@ -0,0 +1,4 @@
<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 18C0 8.05888 8.05888 0 18 0C27.9411 0 36 8.05888 36 18C36 27.9411 27.9411 36 18 36C8.05888 36 0 27.9411 0 18Z" fill="#27A17C"/>
<path d="M25.8726 12.3877V8.55078H10.1631V12.3877H15.9547V14.8944C11.2468 15.1061 7.70166 16.0342 7.70166 17.1476C7.70166 18.2611 11.2468 19.1891 15.9547 19.4009V27.4457H20.081V19.399C24.7708 19.1841 28.2979 18.2577 28.2979 17.1476C28.2979 16.0374 24.7708 15.1107 20.081 14.8961V12.3876H25.8726V12.3877ZM26.5242 16.9209C26.5242 17.6533 23.783 18.2675 20.081 18.4381L19.8418 18.4482H19.8154L19.591 18.4565H19.5667C19.3999 18.4622 19.231 18.4671 19.06 18.471H19.0494L18.82 18.4757H18.7552L18.5742 18.4781H17.4278L17.2487 18.4757H17.1864L16.9724 18.4712H16.9489C16.6952 18.4656 16.4454 18.4577 16.1993 18.4482H16.196L15.951 18.4376C12.2306 18.2697 9.47165 17.6533 9.47165 16.9174C9.47165 16.1815 12.231 15.5669 15.951 15.3971V17.7242C16.5967 17.7579 17.2837 17.7763 17.9962 17.7763C18.72 17.7763 19.4208 17.7576 20.0775 17.7224V15.404C23.7827 15.5741 26.5242 16.1887 26.5242 16.9209Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

+11
View File
@@ -0,0 +1,11 @@
<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 18C0 8.05888 8.05888 0 18 0C27.9411 0 36 8.05888 36 18C36 27.9411 27.9411 36 18 36C8.05888 36 0 27.9411 0 18Z" fill="#15BA11"/>
<g clip-path="url(#clip0_40635_137444)">
<path d="M16.3758 22.4796C16.2358 22.4811 16.0979 22.4391 15.9755 22.3577C15.8531 22.2763 15.7504 22.1583 15.6773 22.0152L15.6243 21.8844L11.4385 15.252C11.4133 15.1928 11.3997 15.1276 11.3985 15.0612C11.4017 14.9375 11.4455 14.8203 11.5205 14.7353C11.5956 14.6503 11.6956 14.6044 11.7988 14.6076C11.8888 14.6076 11.9719 14.6412 12.0389 14.6976L16.6199 17.9772C16.7781 18.093 16.9556 18.1656 17.1398 18.1896C17.324 18.2137 17.5104 18.1887 17.6856 18.1164L27.8162 10.8C25.6408 7.896 22.0605 6 18.0078 6C11.3755 6 6 11.076 6 17.3352C6 20.7504 7.61705 23.8248 10.1487 25.902C10.2509 25.9826 10.3349 26.092 10.3936 26.2207C10.4522 26.3494 10.4836 26.4934 10.4849 26.64C10.4824 26.7387 10.4683 26.8365 10.4429 26.9304L9.90154 29.2152C9.87552 29.3232 9.8365 29.4348 9.8365 29.5464C9.8365 29.7984 10.0166 30 10.2368 30C10.3228 30 10.3939 29.964 10.4669 29.916L13.0966 28.1976C13.2947 28.068 13.5029 27.9876 13.734 27.9876C13.8571 27.9876 13.9742 28.0092 14.0873 28.0464C15.3131 28.446 16.6369 28.6692 18.0068 28.6692C24.6391 28.668 30.0156 23.592 30.0156 17.3352C30.0156 15.438 29.5183 13.6524 28.6467 12.0828L16.823 22.3248L16.736 22.3812C16.6237 22.4463 16.5005 22.4799 16.3758 22.4796Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_40635_137444">
<rect width="24" height="24" fill="white" transform="translate(6 6)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Some files were not shown because too many files have changed in this diff Show More