🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

盘古开屏动画 panan3562-svg/pangu-desktop-theme

DeepSeek Harness
panan3562-svg11 天前有提交已提供中文文档扫描:含敏感能力

为桌面应用添加华为风格启动动画并可随时开关

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/25 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add panan3562-svg/pangu-desktop-theme
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 11 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 104 处,展示前 90 条)
  • 读取本地文件
    build/build.mjs:9
    const read = (p) => readFileSync(join(root, p), 'utf8');
  • 写入本地文件
    build/build.mjs:52
    mkdirSync(join(root, 'dsh', 'lib'), { recursive: true });
  • 写入本地文件
    build/build.mjs:53
    mkdirSync(join(root, 'codex', 'dist'), { recursive: true });
  • 写入本地文件
    build/build.mjs:54
    writeFileSync(join(root, 'dsh', 'lib', 'client.js'), dsh, 'utf8');
  • 写入本地文件
    build/build.mjs:55
    writeFileSync(join(root, 'codex', 'dist', 'inject.js'), codex, 'utf8');
  • 读取本地文件
    build/gen-art.mjs:10
    const art = JSON.parse(readFileSync(src, 'utf8'));
  • 写入本地文件
    build/gen-art.mjs:31
    writeFileSync(join(root, 'shared', 'art.data.js'), file, 'utf8');
  • 删除本地文件递归
    build/make-packages.mjs:14
    rmSync(stage, { recursive: true, force: true });
  • 写入本地文件
    build/make-packages.mjs:15
    mkdirSync(SRC_DSH, { recursive: true });
  • 写入本地文件
    build/make-packages.mjs:16
    mkdirSync(SRC_CODEX, { recursive: true });
  • 写入本地文件
    build/make-packages.mjs:18
    const writeUtf8Bom = (file, text) => writeFileSync(file, `\uFEFF${text}`, 'utf8');
  • 写入本地文件
    build/make-packages.mjs:19
    const writeUtf16 = (file, text) => writeFileSync(file, `\uFEFF${text}`, 'utf16le');
  • 写入本地文件
    build/make-packages.mjs:164
    writeFileSync(join(SRC_DSH, '安装.cmd'), '@echo off\r\nchcp 65001 >nul\r\npowershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0install.ps1"\r\necho
  • 写入本地文件
    build/make-packages.mjs:165
    writeFileSync(join(SRC_DSH, '卸载.cmd'), '@echo off\r\nchcp 65001 >nul\r\npowershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0install.ps1" -Uninst
  • 读取本地文件
    build/make-packages.mjs:172
    if (existsSync(NODE_EXE)) {
  • 读取本地文件
    build/make-packages.mjs:174
    console.log('bundled node:', Math.round(statSync(NODE_EXE).size / 1048576), 'MB');
  • 读取本地文件
    build/publish-packages.mjs:15
    if (!existsSync(from)) { console.error('missing', from); process.exit(1); }
  • 写入本地文件
    build/publish-packages.mjs:17
    copyFileSync(from, to);
  • 读取本地文件
    build/publish-packages.mjs:18
    console.log(`${dst} ${Math.round(statSync(to).size / 1048576 * 10) / 10} MB -> ${to}`);
  • 读取本地文件
    build/rename-desktop-packages.mjs:14
    if (!existsSync(src)) { console.log('skip (missing):', from); continue; }
  • 写入本地文件
    build/rename-desktop-packages.mjs:16
    renameSync(src, dst);
  • 读取本地文件
    build/test-node-half.mjs:48
    console.log('file exists =', existsSync(file));
  • 读取本地文件
    build/test-node-half.mjs:49
    if (existsSync(file)) console.log('file =', readFileSync(file, 'utf8').trim());
  • 读取本地文件
    build/test-node-half.mjs:49
    if (existsSync(file)) console.log('file =', readFileSync(file, 'utf8').trim());
  • 删除本地文件递归
    build/test-package-dsh.mjs:9
    rmSync(HOME, { recursive: true, force: true });
  • 写入本地文件
    build/test-package-dsh.mjs:12
    mkdirSync(join(prof, 'node_modules'), { recursive: true });
  • 写入本地文件
    build/test-package-dsh.mjs:13
    writeFileSync(join(prof, 'package.json'), JSON.stringify({
  • 写入本地文件
    build/test-package-dsh.mjs:20
    writeFileSync(join(prof, 'cordis.patch.yml'), '# 用户自己的补丁\n- id: some-plugin\n config:\n foo: bar\n', 'utf8');
  • 写入本地文件
    build/test-package-dsh.mjs:24
    mkdirSync(backup, { recursive: true });
  • 写入本地文件
    build/test-package-dsh.mjs:25
    writeFileSync(join(backup, 'package.json'), JSON.stringify({ dsh: { profile: { bundles: ['@deepseek-ai/dsh-web-app'] } } }));
  • 执行外部命令固定命令
    build/test-package-dsh.mjs:28
    return execFileSync('powershell.exe', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', join(PKG, 'install.ps1'), '-DshHome', HOME, ...extra], {
  • 读取本地文件
    build/test-package-dsh.mjs:37
    const st = lstatSync(link);
  • 读取本地文件
    build/test-package-dsh.mjs:39
    const patch = readFileSync(join(prof, 'cordis.patch.yml'), 'utf8');
  • 读取本地文件
    build/test-package-dsh.mjs:42
    console.log('backup exists:', existsSync(join(prof, 'cordis.patch.yml.pangu-bak')));
  • 读取本地文件
    build/test-package-dsh.mjs:43
    console.log('backup profile untouched:', existsSync(join(backup, 'cordis.patch.yml')) === false);
  • 读取本地文件
    build/test-package-dsh.mjs:47
    const patch2 = readFileSync(join(prof, 'cordis.patch.yml'), 'utf8');
  • 读取本地文件
    build/test-package-dsh.mjs:53
    const entries = readdirSync(join(prof, 'node_modules'));
  • 写入本地文件
    build/verify-web.mjs:12
    mkdirSync(OUT, { recursive: true });
  • 执行外部命令来自配置/变量
    build/verify-web.mjs:15
    const chrome = spawn(CHROME, [
  • 发起网络请求
    build/verify-web.mjs:24
    const r = await fetch(`http://127.0.0.1:${PORT}/json/list`, { signal: AbortSignal.timeout(1000) });
  • 写入本地文件
    build/verify-web.mjs:52
    writeFileSync(join(OUT, name), Buffer.from(res.data, 'base64'));
  • 读取本地文件
    check-dsh.mjs:17
    return readdirSync(profilesDir).filter((n) => {
  • 读取本地文件
    check-dsh.mjs:20
    const pkg = JSON.parse(readFileSync(join(profilesDir, n, 'package.json'), 'utf8'));
  • 读取本地文件
    check-dsh.mjs:28
    return p && existsSync(p) ? p : 'dsh';
  • 执行外部命令来自配置/变量
    check-dsh.mjs:33
    return { text: execFileSync(process.env.ComSpec || 'cmd.exe', ['/d', '/c', `${dshBin()} --profile ${profile} --dump-config`], { encoding: 'utf8', wind
  • 读取本地文件
    check-dsh.mjs:49
    const patchText = existsSync(patchFile) ? readFileSync(patchFile, 'utf8') : '';
  • 读取本地文件
    check-dsh.mjs:49
    const patchText = existsSync(patchFile) ? readFileSync(patchFile, 'utf8') : '';
  • 读取本地文件
    check-dsh.mjs:50
    const mounted = existsSync(join(pkgDir, 'package.json')) && patchText.includes('pangu-theme');
  • 执行外部命令固定命令
    codex/find-app.mjs:12
    return execFileSync('reg', args, { encoding: 'utf8', windowsHide: true }).split(/ ? /);
  • 读取本地文件
    codex/find-app.mjs:36
    if (process.env.PANGU_CODEX_EXE && existsSync(process.env.PANGU_CODEX_EXE)) return process.env.PANGU_CODEX_EXE;
  • 读取本地文件
    codex/find-app.mjs:40
    if (existsSync(p)) return p;
  • 写入本地文件
    codex/launcher.mjs:25
    mkdirSync(LOG_DIR, { recursive: true });
  • 写入本地文件
    codex/launcher.mjs:28
    try { writeFileSync(LOG_FILE, `${line}\n`, { flag: 'a' }); } catch { }
  • 执行外部命令固定命令
    codex/launcher.mjs:42
    const child = spawn('tasklist', ['/FI', 'IMAGENAME eq ChatGPT.exe', '/FO', 'CSV', '/NH'], { windowsHide: true });
  • 发起网络请求
    codex/launcher.mjs:59
    const res = await fetch(url, { signal: ctrl.signal });
  • 读取本地文件
    codex/launcher.mjs:144
    if (!existsSync(INJECT)) {
  • 读取本地文件
    codex/launcher.mjs:148
    const source = readFileSync(INJECT, 'utf8');
  • 执行外部命令来自配置/变量
    codex/launcher.mjs:179
    const child = spawn(exe, args, {
  • 发起网络请求
    dsh/lib/client.js:1020
    const res = await fetch(PANGU_CONFIG_URL, { cache: 'no-store' });
  • 发起网络请求
    dsh/lib/client.js:1025
    const res = await fetch(PANGU_CONFIG_URL, {
  • 写入本地文件
    dsh/lib/index.mjs:23
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    dsh/lib/index.mjs:24
    writeFileSync(join(dir, 'load.log'), `${new Date().toISOString()} ${JSON.stringify(entry)}\n`, { flag: 'a' });
  • 读取本地文件
    dsh/lib/index.mjs:41
    const raw = JSON.parse(readFileSync(CONFIG_FILE, 'utf8'));
  • 写入本地文件
    dsh/lib/index.mjs:54
    mkdirSync(dirname(CONFIG_FILE), { recursive: true });
  • 写入本地文件
    dsh/lib/index.mjs:56
    writeFileSync(tmp, `${JSON.stringify(out, null, 2)}\n`, 'utf8');
  • 写入本地文件
    dsh/lib/index.mjs:57
    renameSync(tmp, CONFIG_FILE);
  • 执行外部命令固定命令
    install-codex.mjs:22
    const out = execFileSync('where', ['node'], { encoding: 'utf8', windowsHide: true });
  • 读取本地文件
    install-codex.mjs:24
    if (first && existsSync(first)) return first;
  • 读取本地文件
    install-codex.mjs:31
    if (existsSync(lnk)) { rmSync(lnk, { force: true }); log('已删除', lnk); }
  • 删除本地文件
    install-codex.mjs:31
    if (existsSync(lnk)) { rmSync(lnk, { force: true }); log('已删除', lnk); }
  • 读取本地文件
    install-codex.mjs:33
    if (existsSync(vbsPath)) { rmSync(vbsPath, { force: true }); log('已删除', vbsPath); }
  • 删除本地文件
    install-codex.mjs:33
    if (existsSync(vbsPath)) { rmSync(vbsPath, { force: true }); log('已删除', vbsPath); }
  • 写入本地文件
    install-codex.mjs:57
    writeFileSync(vbsPath, `\uFEFF${vbs}`, 'utf16le');
  • 执行外部命令固定命令
    install-codex.mjs:72
    execFileSync('powershell.exe', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-Command', ps], {
  • 写入本地文件
    install-codex.mjs:93
    mkdirSync(dirname(lnk), { recursive: true });
  • 读取本地文件
    install-dsh.mjs:41
    const pkg = JSON.parse(readFileSync(join(profilesDir, name, 'package.json'), 'utf8'));
  • 读取本地文件
    install-dsh.mjs:53
    names = readdirSync(profilesDir).filter((n) => existsSync(join(profilesDir, n, 'package.json')));
  • 读取本地文件
    install-dsh.mjs:53
    names = readdirSync(profilesDir).filter((n) => existsSync(join(profilesDir, n, 'package.json')));
  • 读取本地文件
    install-dsh.mjs:62
    if (!existsSync(profileDir)) {
  • 读取本地文件
    install-dsh.mjs:70
    try { if (existsSync(linkPath)) unlinkSync(linkPath); } catch (e) { log(`移除 junction 失败(${profile}):`, e.message); }
  • 删除本地文件
    install-dsh.mjs:70
    try { if (existsSync(linkPath)) unlinkSync(linkPath); } catch (e) { log(`移除 junction 失败(${profile}):`, e.message); }
  • 写入本地文件
    install-dsh.mjs:72
    mkdirSync(dirname(linkPath), { recursive: true });
  • 读取本地文件
    install-dsh.mjs:73
    if (!existsSync(linkPath)) {
  • 写入本地文件
    install-dsh.mjs:85
    if (!uninstall) { writeFileSync(patchFile, BLOCK, 'utf8'); log(`${profile}:已新建 cordis.patch.yml`); }
  • 写入本地文件
    install-dsh.mjs:91
    copyFileSync(patchFile, `${patchFile}.pangu-bak`);
  • 写入本地文件
    install-dsh.mjs:92
    writeFileSync(patchFile, cleaned, 'utf8');
  • 写入本地文件
    install-dsh.mjs:95
    copyFileSync(patchFile, `${patchFile}.pangu-bak`);
  • 写入本地文件
    install-dsh.mjs:96
    writeFileSync(patchFile, `${cleaned.replace(/ *$/, '')}\n\n${BLOCK}`, 'utf8');
  • 发起网络请求
    shared/entry-dsh.js:14
    const res = await fetch(PANGU_CONFIG_URL, { cache: 'no-store' });
  • 发起网络请求
    shared/entry-dsh.js:19
    const res = await fetch(PANGU_CONFIG_URL, {
扫描于 2026/11/4(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

盘古 · 华为风格开屏动画的桌面端移植:DeepSeek Harness 插件 + Codex/ChatGPT 桌面版启动器注入(动画来自 pangu-cli-theme)

README

由 DeepSeek 最新模型翻译生成
盘古 · 桌面开屏动画(DeepSeek Harness / Codex) 把 pangu-cli-theme 的华为风格开屏动画,移植到两个独立桌面应用上,并在应用里提供开关。 这是移植项目,不是原创。 动画设计、华为花瓣与 HUAWEI 字标的几何数据、渐变参数、像素标语位图都来自上游 pangu-cli-theme(MIT,Copyright © 2026 Lightly20110815)。上游只支持终端里的 Codex CLI / Claude Code;本项目把同一套视觉搬到桌面 App,重写了渲染与接入层。复用了哪些、新写了哪些,逐条列在 NOTICE.md。 | 目标 | 接入方式 | 是否改动应用文件 | | DeepSeek Harness 桌面版 | 客户端插件(dsh.client 模块),挂到 profile | 否,应用升级不丢 | | Codex / ChatGPT 桌面版(Windows 商店包) | 启动器 + Chromium 调试端口(CDP)注入 | 否,安装目录零改动 | 效果 启动应用 → 红色光标闪两下 → 代码字符收拢 → 八片花瓣由内到外展开(边缘闪着代码字符)→ HUAWEI 字标从左到右「解码」→ 一道光扫过 → 标语、副标语、平台行淡入 → 整层淡出,交还界面。约 3.3 秒。
展开完整文档(README 剩余 1 节)
盘古 · 桌面开屏动画(DeepSeek Harness / Codex)

把 pangu-cli-theme 的华为风格开屏动画,移植到两个独立桌面应用上,并在应用里提供开关。

这是移植项目,不是原创。 动画设计、华为花瓣与 HUAWEI 字标的几何数据、渐变参数、像素标语位图都来自上游 pangu-cli-theme(MIT,Copyright © 2026 Lightly20110815)。上游只支持终端里的 Codex CLI / Claude Code;本项目把同一套视觉搬到桌面 App,重写了渲染与接入层。复用了哪些、新写了哪些,逐条列在 NOTICE.md。

| 目标 | 接入方式 | 是否改动应用文件 |
| DeepSeek Harness 桌面版 | 客户端插件(dsh.client 模块),挂到 profile | 否,应用升级不丢 |
| Codex / ChatGPT 桌面版(Windows 商店包) | 启动器 + Chromium 调试端口(CDP)注入 | 否,安装目录零改动 |

效果

启动应用 → 红色光标闪两下 → 代码字符收拢 → 八片花瓣由内到外展开(边缘闪着代码字符)→ HUAWEI 字标从左到右「解码」→ 一道光扫过 → 标语、副标语、平台行淡入 → 整层淡出,交还界面。约 3.3 秒。

开屏动画

- Esc / 空格 / 双击 可跳过;右下角有「跳过」「不再自动播放」。
- 动画结束后左下角留一个半透明小花(可拖动、位置记忆),点开就是总开关。

安装

需要 Node 18+(仅安装脚本用到;应用侧不需要)。

不想装 Node? 直接下 Releases 里的打包版: pangu-dsh-v0.1.0.zip 解压后双击 安装.cmd(PowerShell 安装,不需要 Node); pangu-codex-v0.1.0.zip 解压后双击 启动.vbs(自带 Node 运行时)。
两个包都带 使用说明.txt,可以直接转给朋友。

DeepSeek Harness

node install-dsh.mjs

它会:给所有 app 型 profile(dsh.profile.bundles 里含 @deepseek-ai/dsh-web-app)在 node_modules 下建一个指向 dsh/ 的目录联接,并在各 profile 的 cordis.patch.yml 追加一段带标记的挂载段(原文件备份为 .pangu-bak)。

然后完全退出 DeepSeek Harness(托盘图标也要退),再启动。

node install-dsh.mjs --profile desktop # 只装指定 profile
node install-dsh.mjs --uninstall # 卸载
node check-dsh.mjs # 自检:挂载 / 组合树 / 真实加载记录

Codex / ChatGPT 桌面版

node install-codex.mjs

会在桌面和开始菜单创建「盘古 · Codex」快捷方式(无控制台窗口)。

⚠️ 必须从这个快捷方式打开应用才有动画:注入依赖 Chromium 的调试端口,而它是启动参数。从原图标启动 = 原版。

打开前需完全退出 ChatGPT(含托盘图标);应用已在运行时启动器会提示先退出。

卸载:node install-codex.mjs --uninstall

开关

| 位置 | 作用 |
| 开屏右下角「跳过」 | 本次立即结束 |
| 开屏右下角「不再自动播放」 | 立刻关闭总开关 |
| 常驻小花(DSH 默认左下、Codex 默认右下) | 总开关 /「每次启动都播放」/「立即播放一次」 |

小花可拖动,位置记在 localStorage;开屏播放期间自动隐藏。

配置落点:

- DSH:~/.dsh/data/pangu-theme/config.json(enabled、everyLaunch)
- Codex:应用 localStorage 的 pangu-theme.config

原理

DSH:插件分两半。Node 端只提供 /pangu-theme/config 读写路由;浏览器端是一个 __ModuleLoader__ 模块,DOM 就绪后创建全屏 canvas 播放动画并挂载小花入口。

Codex:商店包在 C:\Program Files\WindowsApps,只读且有签名,不能改。启动器以 --remote-debugging-port 启动 ChatGPT.exe,连上 CDP 后:

1. Page.addScriptToEvaluateOnNewDocument —— 之后每次页面加载都在文档开始前注入;
2. Runtime.evaluate —— 当前文档立刻注入一次。

注入脚本自渲染一个 position:fixed 的全屏 canvas,与 DSH 共用同一套引擎。

共用渲染核心:

- shared/art.data.js:从上游 art.json 提取的花瓣/字标多边形、包围盒、径向渐变、像素标语位图(build/gen-art.mjs 生成)
- shared/engine.js:时间轴 + Canvas 绘制(光标、粒子、花瓣开合、字标解码、光扫、字幕、跳过/淡出)
- shared/ui.js:常驻小花入口、开关面板、深浅色跟随、拖动与位置记忆、30 秒冷静期(刷新不重播)

目录

shared/ 两端共用的渲染与 UI dsh/ DSH 插件包(package.json + cordis.patch.yml + lib/) codex/ Codex 启动器与注入产物(launcher.mjs / dist/inject.js) build/ 构建、几何提取、预览页、自测页 install-dsh.mjs 安装到 DSH 配置档 install-codex.mjs 创建 Codex 快捷方式 check-dsh.mjs DSH 侧自检

改完 shared/ 里的源码后重新生成两份产物:

node build/build.mjs

开发与自测

node build/gen-art.mjs # 从上游 art.json 重新提取几何(需要 ../pangu 仓库)
node build/build.mjs # 生成 dsh/lib/client.js 与 codex/dist/inject.js
node build/test-node-half.mjs # DSH Node 端路由单测(假宿主)
node check-dsh.mjs # DSH 安装状态自检

预览某一帧(浏览器打开 build/preview.html):

build/preview.html?t=760&brand=codex
build/preview.html?t=2860&brand=dsh
build/selftest-dsh.html?ui=1 # 验证 DSH bundle 的入口与面板 build/selftest-codex.html?ui=1 # 验证 Codex 入口与面板

已知限制

- Codex 必须走「盘古 · Codex」快捷方式;用原图标启动没有动画,也看不到开关。
- Codex 的界面是本地 app:// 壳 + 内嵌 webview;注入目标必须选主窗口 app://-/index.html(detached-window、沙箱 webview 会被排除),否则动画会打在一个看不见的窗口里。
- 注入发生在页面加载完成之后,Codex 的动画起始比 DSH 晚约 1 秒(第一帧光标可能看不到)。
- 窗口在后台时 Chromium 会把 requestAnimationFrame 节流到 ~1fps,动画看起来像卡住;切到前台恢复。
- DSH 的 Node 端必须声明 inject: ['webServer']:否则插件会在 webServer 注册前加载,路由静默注册失败。
- DSH 装错配置档完全无感(补丁段在、组合树里也有,但应用不启动那个配置档);desktop 配置档由 Electron 独占,命令行无法 --dump-config 校验。
- 商店包升级后安装目录会变成新版本号;启动器从注册表 PackageRootFolder 读路径,无需改配置。
- 在 Windows 11 + DeepSeek Harness 0.2.1-rc.2 / ChatGPT 桌面版 26.1007 上验证;其他版本未测。

许可

代码以 MIT 发布(Copyright © 2026 panan),包含上游 MIT 许可,见 LICENSE。

HUAWEI、华为花瓣标志与 HUAWEI 字标是华为技术有限公司的商标,不在 MIT 许可范围内。本项目是非官方爱好者作品,与华为、OpenAI、DeepSeek 均无关系。
预览分享卡片长什么样 ↓panan3562-svg/pangu-desktop-theme
分享 · DeepSeek Harness Hub
panan3562-svg/pangu-desktop-theme

为桌面应用添加华为风格启动动画并可随时开关

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部