tw93--kami
255 行
6.8 KiB
HTML
255 行
6.8 KiB
HTML
<!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>
|