Compare commits
2 Commits
ba5dee151e
...
eb65b0d63d
| Author | SHA1 | Date |
|---|---|---|
|
|
eb65b0d63d | |
|
|
d5cbd1e55c |
|
|
@ -40,7 +40,7 @@ jobs:
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v5
|
uses: actions/setup-node@v5
|
||||||
with:
|
with:
|
||||||
node-version: lts/*
|
node-version: 24
|
||||||
cache: "pnpm"
|
cache: "pnpm"
|
||||||
|
|
||||||
# 4. 安装 Rust
|
# 4. 安装 Rust
|
||||||
|
|
@ -93,7 +93,9 @@ jobs:
|
||||||
{
|
{
|
||||||
echo "body<<CHANGELOG_BODY_EOF"
|
echo "body<<CHANGELOG_BODY_EOF"
|
||||||
cat release_body.md
|
cat release_body.md
|
||||||
echo "CHANGELOG_BODY_EOF"
|
# release_body.md is deliberately trimmed and may not end in a newline.
|
||||||
|
# Ensure the closing delimiter occupies its own line in GITHUB_OUTPUT.
|
||||||
|
printf '\nCHANGELOG_BODY_EOF\n'
|
||||||
} >> "$GITHUB_OUTPUT"
|
} >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
# 8. 构建并发布(核心步骤)
|
# 8. 构建并发布(核心步骤)
|
||||||
|
|
|
||||||
115
app-icon.svg
115
app-icon.svg
|
|
@ -1,115 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024" viewBox="0 0 1024 1024">
|
|
||||||
<defs>
|
|
||||||
<!-- Soft ambient glow behind the book -->
|
|
||||||
<radialGradient id="ambient" cx="50%" cy="50%" r="50%">
|
|
||||||
<stop offset="0%" stop-color="#FFFFFF" stop-opacity="0.08"/>
|
|
||||||
<stop offset="70%" stop-color="#FFFFFF" stop-opacity="0.03"/>
|
|
||||||
<stop offset="100%" stop-color="#FFFFFF" stop-opacity="0"/>
|
|
||||||
</radialGradient>
|
|
||||||
|
|
||||||
<!-- Matte paper sheen for the open pages -->
|
|
||||||
<linearGradient id="pageL" x1="0%" y1="0%" x2="100%" y2="0%">
|
|
||||||
<stop offset="0%" stop-color="#FDFDFD"/>
|
|
||||||
<stop offset="55%" stop-color="#FFFFFF"/>
|
|
||||||
<stop offset="100%" stop-color="#ECEDF0"/>
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient id="pageR" x1="100%" y1="0%" x2="0%" y2="0%">
|
|
||||||
<stop offset="0%" stop-color="#FDFDFD"/>
|
|
||||||
<stop offset="55%" stop-color="#FFFFFF"/>
|
|
||||||
<stop offset="100%" stop-color="#ECEDF0"/>
|
|
||||||
</linearGradient>
|
|
||||||
|
|
||||||
<!-- Purple ghost mark -->
|
|
||||||
<linearGradient id="ghost" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
||||||
<stop offset="0%" stop-color="#667EEA" stop-opacity="0.55"/>
|
|
||||||
<stop offset="100%" stop-color="#667EEA" stop-opacity="0.35"/>
|
|
||||||
</linearGradient>
|
|
||||||
|
|
||||||
<!-- Soft edge light around the book -->
|
|
||||||
<filter id="softglow" x="-40%" y="-40%" width="180%" height="180%">
|
|
||||||
<feGaussianBlur stdDeviation="14" result="blur"/>
|
|
||||||
</filter>
|
|
||||||
<filter id="shadow" x="-50%" y="-50%" width="200%" height="200%">
|
|
||||||
<feGaussianBlur stdDeviation="26" result="blur"/>
|
|
||||||
</filter>
|
|
||||||
|
|
||||||
<!-- Clip to rounded square -->
|
|
||||||
<clipPath id="tile">
|
|
||||||
<rect x="0" y="0" width="1024" height="1024" rx="224"/>
|
|
||||||
</clipPath>
|
|
||||||
</defs>
|
|
||||||
|
|
||||||
<!-- Pure black tile -->
|
|
||||||
<g clip-path="url(#tile)">
|
|
||||||
<rect x="0" y="0" width="1024" height="1024" fill="#000000"/>
|
|
||||||
<rect x="0" y="0" width="1024" height="1024" fill="url(#ambient)"/>
|
|
||||||
|
|
||||||
<!-- Floor shadow -->
|
|
||||||
<ellipse cx="512" cy="760" rx="300" ry="56" fill="#000000" opacity="0.9" filter="url(#shadow)"/>
|
|
||||||
|
|
||||||
<!-- ==== OPEN BOOK (centered ~70%) ==== -->
|
|
||||||
<g>
|
|
||||||
<!-- Book spine shadow -->
|
|
||||||
<rect x="500" y="330" width="24" height="330" fill="#000000" opacity="0.06" filter="url(#softglow)"/>
|
|
||||||
|
|
||||||
<!-- Left cover / back board -->
|
|
||||||
<path d="M512 340 C 400 312, 292 320, 232 348 L 232 672 C 292 644, 400 636, 512 664 Z"
|
|
||||||
fill="#EFEFF2" filter="url(#softglow)"/>
|
|
||||||
|
|
||||||
<!-- Right cover / back board -->
|
|
||||||
<path d="M512 340 C 624 312, 732 320, 792 348 L 792 672 C 732 644, 624 636, 512 664 Z"
|
|
||||||
fill="#EFEFF2" filter="url(#softglow)"/>
|
|
||||||
|
|
||||||
<!-- Left page (curled up, reading posture) -->
|
|
||||||
<path d="M512 322 C 408 298, 304 306, 246 334
|
|
||||||
L 246 654 C 304 626, 408 618, 512 650 Z"
|
|
||||||
fill="url(#pageL)"/>
|
|
||||||
<!-- Left page top edge curl highlight -->
|
|
||||||
<path d="M512 322 C 408 298, 304 306, 246 334"
|
|
||||||
fill="none" stroke="#FFFFFF" stroke-width="6" stroke-linecap="round" opacity="0.9"/>
|
|
||||||
|
|
||||||
<!-- Right page (curled up, reading posture) -->
|
|
||||||
<path d="M512 322 C 616 298, 720 306, 778 334
|
|
||||||
L 778 654 C 720 626, 616 618, 512 650 Z"
|
|
||||||
fill="url(#pageR)"/>
|
|
||||||
<!-- Right page top edge curl highlight -->
|
|
||||||
<path d="M512 322 C 616 298, 720 306, 778 334"
|
|
||||||
fill="none" stroke="#FFFFFF" stroke-width="6" stroke-linecap="round" opacity="0.9"/>
|
|
||||||
|
|
||||||
<!-- Center crease -->
|
|
||||||
<path d="M512 322 L 512 650"
|
|
||||||
fill="none" stroke="#DCDDE0" stroke-width="4" opacity="0.7"/>
|
|
||||||
|
|
||||||
<!-- Page rim light (soft glow at edges) -->
|
|
||||||
<path d="M246 334 L 246 654" stroke="#FFFFFF" stroke-width="2" opacity="0.8"/>
|
|
||||||
<path d="M778 334 L 778 654" stroke="#FFFFFF" stroke-width="2" opacity="0.8"/>
|
|
||||||
</g>
|
|
||||||
|
|
||||||
<!-- ==== GHOST MARK (translucent purple) ==== -->
|
|
||||||
<g opacity="0.92">
|
|
||||||
<!-- Ghost body -->
|
|
||||||
<path d="M512 400
|
|
||||||
C 552 400, 580 428, 580 468
|
|
||||||
L 580 540
|
|
||||||
C 580 548, 574 554, 566 554
|
|
||||||
C 558 554, 552 548, 552 540
|
|
||||||
L 552 546
|
|
||||||
C 552 554, 546 560, 538 560
|
|
||||||
C 530 560, 524 554, 524 546
|
|
||||||
L 524 554
|
|
||||||
C 524 562, 518 568, 510 568
|
|
||||||
C 502 568, 496 562, 496 554
|
|
||||||
L 496 540
|
|
||||||
C 444 540, 444 462, 466 426
|
|
||||||
C 484 402, 500 400, 512 400 Z"
|
|
||||||
fill="url(#ghost)" filter="url(#softglow)"/>
|
|
||||||
<!-- Ghost eyes -->
|
|
||||||
<ellipse cx="486" cy="452" rx="9" ry="12" fill="#667EEA" opacity="0.6"/>
|
|
||||||
<ellipse cx="538" cy="452" rx="9" ry="12" fill="#667EEA" opacity="0.6"/>
|
|
||||||
</g>
|
|
||||||
|
|
||||||
<!-- Edge light wrap (elegant rim) -->
|
|
||||||
<path d="M512 322 C 408 298, 304 306, 246 334"
|
|
||||||
fill="none" stroke="#FFFFFF" stroke-width="1.5" opacity="0.35" filter="url(#softglow)"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 4.7 KiB |
BIN
app-icon1.png
BIN
app-icon1.png
Binary file not shown.
|
Before Width: | Height: | Size: 3.2 MiB |
|
|
@ -1,31 +1,29 @@
|
||||||
<template>
|
<template>
|
||||||
<n-modal :show="showUpdateModal" preset="card" :title="modalTitle" :bordered="false" :closable="!busy"
|
<n-modal :show="showUpdateModal" preset="card" :title="modalTitle" :bordered="false" :closable="!busy"
|
||||||
:mask-closable="false" :close-on-esc="false" style="width: 430px" @close="cancelUpdate">
|
:mask-closable="false" :close-on-esc="false" content-scrollable :segmented="{ content: true, footer: true }"
|
||||||
|
:style="{ width: '60vw', height: '50vh' }" @close="cancelUpdate">
|
||||||
<template #header-extra>
|
<template #header-extra>
|
||||||
<span v-if="updateInfo" class="update-current">当前 v{{ updateInfo.currentVersion }}</span>
|
<span v-if="updateInfo" class="update-current">当前 v{{ updateInfo.currentVersion }}</span>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<div class="update-body">
|
<div v-if="renderedBody" class="markdown-body" v-html="renderedBody" />
|
||||||
<n-scrollbar class="update-scroll">
|
<n-empty v-else description="暂无更新说明" />
|
||||||
<div v-if="renderedBody" class="markdown-body" v-html="renderedBody" />
|
|
||||||
<n-empty v-else description="暂无更新说明" />
|
|
||||||
</n-scrollbar>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-if="downloading || installing" class="update-progress">
|
|
||||||
<n-progress type="line" :percentage="progress" :processing="downloading" indicator-placement="inside"
|
|
||||||
:height="18" />
|
|
||||||
<div class="progress-hint">{{ progressHint }}</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<div class="update-footer">
|
<div class="update-footer">
|
||||||
<n-button quaternary :disabled="busy" @click="skipVersion">跳过此版本</n-button>
|
<div v-if="downloading || installing" class="update-progress">
|
||||||
<div class="update-footer-right">
|
<n-progress type="line" :percentage="progress" :processing="downloading" indicator-placement="inside"
|
||||||
<n-button v-if="!busy" @click="cancelUpdate">取消</n-button>
|
:height="18" />
|
||||||
<n-button type="primary" :loading="downloading" @click="startUpdate">
|
<div class="progress-hint">{{ progressHint }}</div>
|
||||||
{{ installing ? "安装中..." : downloading ? "下载中..." : "立即更新" }}
|
</div>
|
||||||
</n-button>
|
<div class="update-footer-actions">
|
||||||
|
<n-button quaternary size="small" :disabled="busy" @click="skipVersion">跳过此版本</n-button>
|
||||||
|
<div class="update-footer-right">
|
||||||
|
<n-button size="small" v-if="!busy" @click="cancelUpdate">取消</n-button>
|
||||||
|
<n-button size="small" type="primary" :loading="downloading" @click="startUpdate">
|
||||||
|
{{ installing ? "安装中..." : downloading ? "下载中..." : "立即更新" }}
|
||||||
|
</n-button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -77,12 +75,6 @@ const progressHint = computed(() => {
|
||||||
color: var(--color-text-secondary);
|
color: var(--color-text-secondary);
|
||||||
}
|
}
|
||||||
|
|
||||||
.update-body {
|
|
||||||
.update-scroll {
|
|
||||||
height: 340px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.markdown-body {
|
.markdown-body {
|
||||||
padding-right: 8px;
|
padding-right: 8px;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
|
|
@ -198,7 +190,7 @@ const progressHint = computed(() => {
|
||||||
}
|
}
|
||||||
|
|
||||||
.update-progress {
|
.update-progress {
|
||||||
margin-top: 12px;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.progress-hint {
|
.progress-hint {
|
||||||
|
|
@ -209,6 +201,13 @@ const progressHint = computed(() => {
|
||||||
}
|
}
|
||||||
|
|
||||||
.update-footer {
|
.update-footer {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 12px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.update-footer-actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ import {
|
||||||
SyncOutlined,
|
SyncOutlined,
|
||||||
ThunderboltOutlined,
|
ThunderboltOutlined,
|
||||||
} from "@vicons/antd"
|
} from "@vicons/antd"
|
||||||
import appIcon from "../../../app-icon.svg"
|
import appIcon from "../../../app-icon.png"
|
||||||
import { checkAndPrompt } from "@/utils/updater"
|
import { checkAndPrompt } from "@/utils/updater"
|
||||||
|
|
||||||
const message = useMessage()
|
const message = useMessage()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue