项目文件夹

文件
2026-07-13 13:05:52 +08:00

255 行
6.8 KiB
HTML

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
<!DOCTYPE html>
<!-- ==================================================================
CHANGELOG TEMPLATE · parchment design system
1-2 页 A4 版本更新日志 / Release Notes
结构:版本标题 -> Breaking -> Features -> Fixes -> 致谢
遵循 tw93/Mole release note 格式
================================================================== -->
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>{{项目名}} · {{版本号}} 更新日志</title>
<meta name="author" content="{{作者}}">
<meta name="description" content="{{摘要}}">
<meta name="keywords" content="{{关键词}}">
<meta name="generator" content="Kami">
<style>
/* Regular weight */
@font-face {
font-family: "TsangerJinKai02";
src: url("../fonts/TsangerJinKai02-W04.ttf") format("truetype"),
url("https://cdn.jsdelivr.net/gh/tw93/Kami@main/assets/fonts/TsangerJinKai02-W04.ttf") format("truetype");
font-weight: 400;
font-style: normal;
}
/* Bold weight - W05 for all bold variants */
@font-face {
font-family: "TsangerJinKai02";
src: url("../fonts/TsangerJinKai02-W05.ttf") format("truetype"),
url("https://cdn.jsdelivr.net/gh/tw93/Kami@main/assets/fonts/TsangerJinKai02-W05.ttf") format("truetype");
font-weight: 500;
font-style: normal;
}
@page {
size: A4;
margin: 20mm 22mm 22mm 22mm;
background: #f5f4ed;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--parchment: #f5f4ed;
--ivory: #faf9f5;
--near-black:#141413;
--dark-warm: #3d3d3a;
--olive: #504e49;
--stone: #6b6a64;
--brand: #1B365D;
--border: #e8e6dc;
--border-soft:#e5e3d8;
--tag-bg: #E4ECF5;
--breaking-bg:#f0e0d8;
--breaking-fg:#8b4513;
--serif: "TsangerJinKai02", "Source Han Serif SC", "Noto Serif CJK SC", "Songti SC", "STSong", Georgia, serif;
--sans: var(--serif);
--mono: "JetBrains Mono", "SF Mono", "Fira Code", Consolas, Monaco, "TsangerJinKai02", "Source Han Serif SC", monospace;
}
html, body { background: var(--parchment); }
@media screen {
body { max-width: 210mm; margin: 0 auto; padding: 20mm 22mm; }
}
body {
color: var(--near-black);
font-family: var(--serif);
font-size: 10.5pt;
line-height: 1.55;
letter-spacing: 0.3pt;
widows: 3;
orphans: 3;
}
strong { font-weight: 500; }
.hl { color: var(--brand); font-weight: 500; }
/* ========== HEADER (left-aligned editorial, matches one-pager) ========== */
.header {
margin-bottom: 20pt;
padding-bottom: 13pt;
border-bottom: 0.5pt solid var(--border);
display: flex;
align-items: flex-end;
justify-content: space-between;
gap: 20pt;
}
.title-block { flex: 1; }
.eyebrow {
display: inline-flex;
align-items: center;
gap: 7pt;
font-family: var(--sans);
font-size: 9pt;
color: var(--brand);
letter-spacing: 1.5pt;
font-weight: 500;
margin-bottom: 8pt;
}
.eyebrow::before {
content: "";
width: 8pt;
height: 1.5pt;
border-radius: 0.75pt;
background: var(--brand);
flex-shrink: 0;
}
h1 {
font-family: var(--serif);
font-size: 26pt;
font-weight: 500;
color: var(--near-black);
line-height: 1.15;
margin-bottom: 7pt;
}
.subtitle {
font-size: 11.5pt;
color: var(--olive);
line-height: 1.5;
max-width: 150mm;
}
.meta {
font-size: 10pt;
color: var(--stone);
white-space: nowrap;
font-variant-numeric: tabular-nums;
}
/* ========== SECTION HEAD - brand left bar ========== */
h2 {
font-family: var(--serif);
font-size: 14pt;
font-weight: 500;
color: var(--near-black);
margin: 20pt 0 10pt 0;
border-left: 2.5pt solid var(--brand);
border-radius: 1.5pt;
padding-left: 9pt;
break-after: avoid;
}
h2:first-of-type { margin-top: 0; }
p { margin: 0 0 8pt 0; line-height: 1.55; widows: 2; orphans: 2; }
code { font-family: var(--mono); font-size: 0.92em; }
/* ========== CHANGE LIST - numbered, brand markers, bold lead-in ========== */
ol.changes { margin: 0; padding-left: 18pt; }
ol.changes li {
margin-bottom: 7pt;
padding-left: 3pt;
line-height: 1.55;
break-inside: avoid;
}
ol.changes li:last-child { margin-bottom: 0; }
ol.changes li::marker { color: var(--brand); font-weight: 500; }
ol.changes li strong { font-weight: 500; color: var(--near-black); }
ol.changes li .hl { color: var(--brand); font-weight: 500; }
/* ========== TAG ========== */
.tag {
display: inline-block;
background: var(--tag-bg);
color: var(--brand);
font-size: 9pt;
font-weight: 500;
padding: 1pt 6pt;
border-radius: 3pt;
margin-right: 3pt;
}
.tag.breaking {
background: var(--breaking-bg);
color: var(--breaking-fg);
}
/* ========== ACKNOWLEDGEMENTS - quiet labelled note, not a filled card ========== */
.thanks {
margin-top: 18pt;
font-size: 9.5pt;
line-height: 1.55;
color: var(--olive);
break-inside: avoid;
}
.thanks .hl { color: var(--brand); font-weight: 500; }
.thanks-label {
font-size: 9pt;
color: var(--brand);
letter-spacing: 0.5pt;
text-transform: uppercase;
margin-bottom: 4pt;
}
/* ========== FOOTER ========== */
.changelog-footer {
margin-top: 20pt;
padding-top: 8pt;
border-top: 0.3pt dotted var(--border);
font-size: 9pt;
color: var(--stone);
line-height: 1.5;
display: flex;
justify-content: space-between;
font-variant-numeric: tabular-nums;
letter-spacing: 0.3pt;
}
</style>
</head>
<body>
<!-- HEADER -->
<div class="header">
<div class="title-block">
<div class="eyebrow">更新日志</div>
<h1>{{项目名}} {{版本号}}</h1>
<div class="subtitle">{{一句话版本亮点}}</div>
</div>
<div class="meta">{{发布日期}}</div>
</div>
<!-- 每条:加粗引导词 + 全角冒号 + 描述。编号承担顺序,每节从 1 重新计数;不适用的节直接删掉。 -->
<h2>破坏性变更</h2>
<ol class="changes">
<li><span class="tag breaking">Breaking</span> <strong>{{变更点}}</strong>{{读者需要做的处理}}</li>
</ol>
<h2>新功能</h2>
<ol class="changes">
<li><strong>{{功能}}</strong>{{一句话描述}}</li>
<li><strong>{{功能}}</strong>{{一句话描述}}</li>
<li><strong>{{功能}}</strong>{{一句话描述}}</li>
</ol>
<h2>修复</h2>
<ol class="changes">
<li><strong>{{范围}}</strong>{{修复了什么}}</li>
<li><strong>{{范围}}</strong>{{修复了什么}}</li>
<li><strong>{{范围}}</strong>{{修复了什么}}</li>
</ol>
<!-- 致谢(可选) -->
<div class="thanks">
<div class="thanks-label">致谢</div>
{{感谢贡献者,如 "感谢 @user1、@user2 的贡献。"}}
</div>
<!-- FOOTER -->
<div class="changelog-footer">
<span>{{项目一句话描述}}</span>
<span>{{项目 URL}}</span>
</div>
</body>
</html>