diff --git a/README.md b/README.md index 7318a7d..e444f07 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,8 @@ npm run desktop:test # 构建后执行桌面集成测试 正式对外发布 macOS 应用还需要配置开发者签名和 Apple 公证;仓库默认可生成本机测试包。Windows 签名同样需要自行提供证书。 +图标源文件为 `apps/desktop/assets/icon.svg`。修改后运行 `npm run icons:generate`,生成桌面 PNG 和网页 favicon,并一起提交派生资源。`npm run icons:check` 检查资源是否同步,根构建和桌面构建也会执行此检查。 + ## AI 提交信息与设置中心 “设置”打开独立页面,统一管理 AI 服务商、提交生成、布局和版本更新;“返回工作区”恢复原仓库、面板和提交草稿。桌面窗口支持缩小到 320 px,窄窗口通过分类选择和服务商列表逐级进入详情。 diff --git a/apps/desktop/assets/icon.png b/apps/desktop/assets/icon.png index 5376bc0..7189d0f 100644 Binary files a/apps/desktop/assets/icon.png and b/apps/desktop/assets/icon.png differ diff --git a/apps/desktop/assets/icon.svg b/apps/desktop/assets/icon.svg index 6de30f1..5f2bdc7 100644 --- a/apps/desktop/assets/icon.svg +++ b/apps/desktop/assets/icon.svg @@ -1,24 +1,22 @@ - + - - - - + + + - - - - - - + + - - - - - - - + + + + + + + + + + diff --git a/apps/desktop/electron-builder.cjs b/apps/desktop/electron-builder.cjs index c9f2e3c..ad0e270 100644 --- a/apps/desktop/electron-builder.cjs +++ b/apps/desktop/electron-builder.cjs @@ -4,7 +4,7 @@ module.exports = { artifactName: 'RemoteGit-${version}-${os}-${arch}.${ext}', publish: { provider: 'github', owner: 'ShaoClean', repo: 'remote-git', private: false, releaseType: 'release' }, directories: { output: '../../release' }, - files: ['*.cjs', 'server/**/*', 'web/**/*', 'packages/**/*', 'package.json'], + files: ['*.cjs', 'server/**/*', 'web/**/*', 'assets/icon.png', 'packages/**/*', 'package.json'], asar: true, asarUnpack: ['**/*.node'], npmRebuild: false, diff --git a/apps/desktop/scripts/stage.mjs b/apps/desktop/scripts/stage.mjs index c343609..f0e6892 100644 --- a/apps/desktop/scripts/stage.mjs +++ b/apps/desktop/scripts/stage.mjs @@ -14,6 +14,7 @@ await mkdir(target, { recursive: true }); for (const [source, destination] of [ ['apps/server/dist', 'server'], ['apps/web/dist', 'web'], + ['apps/desktop/assets', 'assets'], ['packages/shared/dist', 'packages/shared/dist'], ['packages/ssh-client/dist', 'packages/ssh-client/dist'], ]) { diff --git a/apps/desktop/src/main.cjs b/apps/desktop/src/main.cjs index db744c9..d96ee14 100644 --- a/apps/desktop/src/main.cjs +++ b/apps/desktop/src/main.cjs @@ -23,12 +23,14 @@ let updates; let closingBackend; const token = randomBytes(32).toString('hex'); const windowStatePath = path.join(app.getPath('userData'), 'window.json'); +const iconPath = path.join(__dirname, 'assets', 'icon.png'); function createWindow() { let state = {}; try { state = JSON.parse(readFileSync(windowStatePath, 'utf8')); } catch {} window = new BrowserWindow({ title: 'RemoteGit', + icon: iconPath, width: Number.isFinite(state.width) ? Math.max(320, Math.min(state.width, 3840)) : 1440, height: Number.isFinite(state.height) ? Math.max(680, Math.min(state.height, 2160)) : 900, minWidth: 320, @@ -67,6 +69,7 @@ function createWindow() { } async function start() { + if (process.platform === 'darwin') app.dock.setIcon(iconPath); const dataDir = app.getPath('userData'); mkdirSync(dataDir, { recursive: true, mode: 0o700 }); process.env.REMOTE_GIT_DATA_DIR = dataDir; diff --git a/apps/web/public/favicon.svg b/apps/web/public/favicon.svg index 6893eb1..52edc48 100644 --- a/apps/web/public/favicon.svg +++ b/apps/web/public/favicon.svg @@ -1 +1,20 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/src/components/BrandIcon.tsx b/apps/web/src/components/BrandIcon.tsx new file mode 100644 index 0000000..3b2e538 --- /dev/null +++ b/apps/web/src/components/BrandIcon.tsx @@ -0,0 +1,14 @@ +/** The favicon and every in-app brand mark share the generated compact artwork. */ +export function BrandIcon({ className = 'app-brand__mark' }: { className?: string }) { + return ( + + ); +} diff --git a/apps/web/src/components/Layout.tsx b/apps/web/src/components/Layout.tsx index b0c2cbb..39d449d 100644 --- a/apps/web/src/components/Layout.tsx +++ b/apps/web/src/components/Layout.tsx @@ -5,7 +5,6 @@ import { Button, Dropdown, Tooltip, message, notification } from 'antd'; import { ApartmentOutlined, CloudSyncOutlined, - CodeOutlined, FolderOpenOutlined, MenuFoldOutlined, MenuUnfoldOutlined, @@ -22,6 +21,7 @@ import { useWorkspaceStorageStatus } from '../stores/workspaceStorage'; import { useWorkspaceLayout } from '../hooks/useWorkspaceLayout'; import { PanelResizeHandle } from './PanelResizeHandle'; import { SettingsCenter } from './settings/SettingsCenter'; +import { BrandIcon } from './BrandIcon'; import { SIDEBAR_MIN } from '../stores/workspaceLayout'; const navItems = [ @@ -227,9 +227,7 @@ export function Layout() { aria-label="RemoteGit 首页" onClick={() => navigate('/')} > - - - + RemoteGit