feat(scrapbook): 更新 scrapbook 模板

This commit is contained in:
SXP-Simon
2026-01-07 16:50:29 +08:00
parent 251eb2ca0d
commit 4b4f4545db
3 changed files with 334 additions and 204 deletions
+8
View File
@@ -5,3 +5,11 @@
src/analysis/ARCHITECTURE.md src/analysis/ARCHITECTURE.md
.serena/.gitignore .serena/.gitignore
.serena/project.yml .serena/project.yml
debug_output.html
src/models/__pycache__/__init__.cpython-312.pyc
src/models/__pycache__/data_models.cpython-312.pyc
src/reports/__pycache__/__init__.cpython-312.pyc
src/reports/__pycache__/generators.cpython-312.pyc
src/reports/__pycache__/templates.cpython-312.pyc
src/visualization/__pycache__/__init__.cpython-312.pyc
src/visualization/__pycache__/activity_charts.cpython-312.pyc
@@ -77,6 +77,29 @@
max-width: 1000px; max-width: 1000px;
margin: 0 auto; margin: 0 auto;
position: relative; position: relative;
background: #fff;
border: 2px solid var(--ink-primary);
border-radius: 20px;
padding: 40px;
/* Stacked "Paper" Effect: Blue Shadow -> Pink Shadow -> Soft Drop Shadow */
box-shadow:
8px 8px 0 var(--color-blue),
16px 16px 0 var(--color-pink),
0 20px 40px rgba(0, 0, 0, 0.1);
}
/* Stitching Effect */
.container::before {
content: "";
position: absolute;
top: 12px;
bottom: 12px;
left: 12px;
right: 12px;
border: 2px dashed var(--ink-secondary);
border-radius: 15px;
pointer-events: none;
opacity: 0.5;
} }
/* ==================== 1. 头部设计 ==================== */ /* ==================== 1. 头部设计 ==================== */
@@ -134,43 +157,57 @@
} }
/* ==================== 2. 统计邮票 ==================== */ /* ==================== 2. 统计邮票 ==================== */
.stats-row { /* ==================== 2. 统计区域 (新版) ==================== */
.stats-wrapper {
display: flex; display: flex;
justify-content: center; gap: 25px;
gap: 30px;
margin-bottom: 40px; margin-bottom: 40px;
flex-wrap: wrap; align-items: stretch;
}
.stats-grid {
flex: 2;
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 20px;
} }
.stamp { .stamp {
width: 150px; width: 100%;
height: 100%;
background: #fff; background: #fff;
padding: 10px; padding: 15px;
box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.05); box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.1);
/* 邮票齿孔背景 */ border: 2px solid var(--ink-primary);
background-image: radial-gradient(transparent 50%, #fff 51%); border-radius: 12px;
background-size: 10px 10px; position: relative;
background-position: -5px -5px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
transition: transform 0.3s; justify-content: center;
border: 1px solid #eee; transition: transform 0.2s;
}
/* 装饰性背景纹理 */
.stamp::after {
content: "";
position: absolute;
top: 5px;
bottom: 5px;
left: 5px;
right: 5px;
border: 1px dotted #e0e0e0;
border-radius: 8px;
pointer-events: none;
} }
.stamp:hover { .stamp:hover {
transform: scale(1.1) rotate(0deg) !important; transform: translateY(-2px);
z-index: 10;
} }
.stamp-inner { .stamp-inner {
border: 1px solid var(--ink-secondary); text-align: center;
width: 100%; z-index: 1;
padding: 15px 0;
display: flex;
flex-direction: column;
align-items: center;
background: radial-gradient(circle, #fff 50%, #fafafa 100%);
} }
.stamp-num { .stamp-num {
@@ -255,18 +292,21 @@
} }
/* ==================== 4. 活跃时段 ==================== */ /* ==================== 4. 活跃时段 ==================== */
/* ==================== 4. 活跃时段 (新版) ==================== */
.highlight-section { .highlight-section {
grid-column: span 5; flex: 1;
background: var(--color-yellow); background: var(--color-yellow);
padding: 30px; padding: 20px;
transform: rotate(2deg); border: 2px solid var(--ink-primary);
box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.1); border-radius: 20px;
box-shadow: 6px 6px 0 var(--color-pink);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
text-align: center; text-align: center;
position: relative; position: relative;
background-image: repeating-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 0, rgba(255, 255, 255, 0.2) 10px, transparent 10px, transparent 20px);
} }
.tape-top { .tape-top {
@@ -386,42 +426,59 @@
.user-card { .user-card {
break-inside: avoid; break-inside: avoid;
background: #fff; background: #fff;
border: 2px solid #e0e0e0; border: 2px solid var(--ink-primary);
border-radius: 12px; border-radius: 16px;
padding: 20px; padding: 24px;
margin-bottom: 25px; margin-bottom: 30px;
box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.05); /* Muted Blue-Grey Shadow */
box-shadow: 6px 6px 0 rgba(70, 80, 100, 0.15), 6px 6px 0 1px var(--ink-primary);
position: relative; position: relative;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
transition: transform 0.2s; transition: transform 0.2s;
/* Very subtle grain */
background-color: #fff;
background-image: url("data:image/svg+xml,%3Csvg width='100' height='100' viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)' opacity='0.03'/%3E%3C/svg%3E");
} }
.user-card:hover { .user-card:hover {
transform: translateY(-3px); transform: translateY(-4px) rotate(1deg);
z-index: 5; z-index: 5;
border-color: var(--ink-primary); box-shadow: 8px 8px 0 rgba(0, 0, 0, 0.15), 8px 8px 0 2px var(--ink-primary);
} }
.card-tape { .card-tape {
position: absolute; position: absolute;
top: -10px; top: -12px;
left: 50%; left: 50%;
transform: translateX(-50%); transform: translateX(-50%) rotate(-2deg);
width: 60px; width: 80px;
height: 18px; height: 24px;
background: var(--color-blue); background: rgba(255, 255, 255, 0.4);
opacity: 0.9; /* Fallback */
background-color: var(--color-blue);
opacity: 0.8;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
/* Jagged edges for tape look */
mask-image: linear-gradient(135deg, transparent 5px, black 0) top left, linear-gradient(-135deg, transparent 5px, black 0) top right, linear-gradient(45deg, transparent 5px, black 0) bottom left, linear-gradient(-45deg, transparent 5px, black 0) bottom right;
mask-size: 51% 51%;
mask-repeat: no-repeat;
-webkit-mask-image: radial-gradient(circle at 2px 2px, transparent 2px, black 2.5px);
-webkit-mask-size: 100% 100%;
/* Simplify mask for compatibility */
/* Simpler tape look since masks can be tricky across renderers */
border-left: 2px dashed rgba(255, 255, 255, 0.3);
border-right: 2px dashed rgba(255, 255, 255, 0.3);
} }
.user-card:nth-child(2n) .card-tape { .user-card:nth-child(2n) .card-tape {
background: var(--color-pink); background-color: var(--color-pink);
transform: rotate(2deg); transform: translateX(-50%) rotate(3deg);
} }
.user-card:nth-child(3n) .card-tape { .user-card:nth-child(3n) .card-tape {
background: var(--color-green); background-color: var(--color-green);
transform: rotate(-2deg); transform: translateX(-50%) rotate(-1deg);
} }
.user-header { .user-header {
@@ -494,16 +551,24 @@
.u-reason { .u-reason {
font-family: var(--font-hand); font-family: var(--font-hand);
font-size: 0.95rem; font-size: 1.05rem;
color: #555; color: #444;
line-height: 1.6; line-height: 1.6;
text-align: justify;
background: #fafafa; /* Quote Block Style */
padding: 12px; background: #f8fbff;
border-radius: 8px; border-left: 4px solid var(--color-blue);
padding: 12px 15px;
margin-top: 15px;
border-radius: 4px;
position: relative; position: relative;
} }
.u-reason::before {
content: "";
/* Removed big quote mark to clean up */
}
/* ==================== 7. 每日回响 ==================== */ /* ==================== 7. 每日回响 ==================== */
.quotes-section { .quotes-section {
grid-column: span 12; grid-column: span 12;
@@ -704,66 +769,62 @@
</div> </div>
<!-- 2. 统计邮票和活跃时段 --> <!-- 2. 统计邮票和活跃时段 -->
<div class="grid-layout" style="margin-bottom: 40px;"> <div class="stats-wrapper">
<!-- 统计邮票 --> <!-- Left: Stats Grid (2x2) -->
<div class="stats-section" style="grid-column: span 8;"> <div class="stats-grid">
<div class="stats-row"> <!-- Chat Icon -->
<div class="stamp" style="transform: rotate(-2deg);"> <div class="stamp">
<div class="stamp-inner"> <div class="stamp-inner">
<!-- Chat Icon --> <svg class="doodle" style="font-size: 2.2rem; color: var(--accent-orange);" viewBox="0 0 24 24">
<svg class="doodle" style="font-size: 2.5rem; color: var(--accent-orange);" <path
viewBox="0 0 24 24"> d="M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z" />
<path </svg>
d="M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z" /> <div class="stamp-num">{{message_count}}</div>
</svg> <div class="stamp-label">消息总数</div>
<div class="stamp-num">{{message_count}}</div>
<div class="stamp-label">消息总数</div>
</div>
</div> </div>
<div class="stamp" style="transform: rotate(2deg); margin-top: 10px;"> </div>
<div class="stamp-inner"> <!-- Users Icon -->
<!-- Users Icon --> <div class="stamp">
<svg class="doodle" style="font-size: 2.5rem; color: var(--color-green);" <div class="stamp-inner">
viewBox="0 0 24 24"> <svg class="doodle" style="font-size: 2.2rem; color: var(--color-green);" viewBox="0 0 24 24">
<path <path
d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z" /> d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z" />
</svg> </svg>
<div class="stamp-num">{{participant_count}}</div> <div class="stamp-num">{{participant_count}}</div>
<div class="stamp-label">参与人数</div> <div class="stamp-label">参与人数</div>
</div>
</div> </div>
<div class="stamp" style="transform: rotate(-1deg);"> </div>
<div class="stamp-inner"> <!-- Emoji Icon -->
<!-- Image Icon --> <div class="stamp">
<svg class="doodle" style="font-size: 2.5rem; color: var(--color-blue);" <div class="stamp-inner">
viewBox="0 0 24 24"> <svg class="doodle" style="font-size: 2.2rem; color: var(--color-blue);" viewBox="0 0 24 24">
<path <path
d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z" /> d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z" />
</svg> </svg>
<div class="stamp-num">{{emoji_count}}</div> <div class="stamp-num">{{emoji_count}}</div>
<div class="stamp-label">表情统计</div> <div class="stamp-label">表情统计</div>
</div>
</div> </div>
<div class="stamp" style="transform: rotate(3deg); margin-top: 5px;"> </div>
<div class="stamp-inner"> <!-- Text Icon -->
<!-- Text Icon --> <div class="stamp">
<svg class="doodle" style="font-size: 2.5rem; color: var(--color-purple);" <div class="stamp-inner">
viewBox="0 0 24 24"> <svg class="doodle" style="font-size: 2.2rem; color: var(--color-purple);" viewBox="0 0 24 24">
<path <path
d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z" /> d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z" />
</svg> </svg>
<div class="stamp-num">{{total_characters}}</div> <div class="stamp-num">{{total_characters}}</div>
<div class="stamp-label">总字符数</div> <div class="stamp-label">总字符数</div>
</div>
</div> </div>
</div> </div>
</div> </div>
<!-- 活跃时段 --> <!-- Highlight Time -->
<div class="highlight-section" style="grid-column: span 4;"> <div class="highlight-section">
<div class="tape-top"></div> <div class="tape-top" style="background: rgba(255,255,255,0.6);"></div>
<div style="font-family: var(--font-hand); font-size: 1.6rem; color: var(--ink-secondary);">✨ Highlight <div
Time</div> style="font-family: var(--font-hand); font-size: 1.5rem; color: var(--ink-secondary); margin-bottom: 5px;">
✨ Highlight Time
</div>
<div class="time-big">{{most_active_period}}</div> <div class="time-big">{{most_active_period}}</div>
<div class="time-desc">(此刻,世界色彩斑斓)</div> <div class="time-desc">(此刻,世界色彩斑斓)</div>
</div> </div>
+163 -102
View File
@@ -77,6 +77,29 @@
max-width: 1000px; max-width: 1000px;
margin: 0 auto; margin: 0 auto;
position: relative; position: relative;
background: #fff;
border: 2px solid var(--ink-primary);
border-radius: 20px;
padding: 40px;
/* Stacked "Paper" Effect: Blue Shadow -> Pink Shadow -> Soft Drop Shadow */
box-shadow:
8px 8px 0 var(--color-blue),
16px 16px 0 var(--color-pink),
0 20px 40px rgba(0, 0, 0, 0.1);
}
/* Stitching Effect */
.container::before {
content: "";
position: absolute;
top: 12px;
bottom: 12px;
left: 12px;
right: 12px;
border: 2px dashed var(--ink-secondary);
border-radius: 15px;
pointer-events: none;
opacity: 0.5;
} }
/* ==================== 1. 头部设计 ==================== */ /* ==================== 1. 头部设计 ==================== */
@@ -134,43 +157,57 @@
} }
/* ==================== 2. 统计邮票 ==================== */ /* ==================== 2. 统计邮票 ==================== */
.stats-row { /* ==================== 2. 统计区域 (新版) ==================== */
.stats-wrapper {
display: flex; display: flex;
justify-content: center; gap: 25px;
gap: 30px;
margin-bottom: 40px; margin-bottom: 40px;
flex-wrap: wrap; align-items: stretch;
}
.stats-grid {
flex: 2;
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 20px;
} }
.stamp { .stamp {
width: 150px; width: 100%;
height: 100%;
background: #fff; background: #fff;
padding: 10px; padding: 15px;
box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.05); box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.1);
/* 邮票齿孔背景 */ border: 2px solid var(--ink-primary);
background-image: radial-gradient(transparent 50%, #fff 51%); border-radius: 12px;
background-size: 10px 10px; position: relative;
background-position: -5px -5px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
transition: transform 0.3s; justify-content: center;
border: 1px solid #eee; transition: transform 0.2s;
}
/* 装饰性背景纹理 */
.stamp::after {
content: "";
position: absolute;
top: 5px;
bottom: 5px;
left: 5px;
right: 5px;
border: 1px dotted #e0e0e0;
border-radius: 8px;
pointer-events: none;
} }
.stamp:hover { .stamp:hover {
transform: scale(1.1) rotate(0deg) !important; transform: translateY(-2px);
z-index: 10;
} }
.stamp-inner { .stamp-inner {
border: 1px solid var(--ink-secondary); text-align: center;
width: 100%; z-index: 1;
padding: 15px 0;
display: flex;
flex-direction: column;
align-items: center;
background: radial-gradient(circle, #fff 50%, #fafafa 100%);
} }
.stamp-num { .stamp-num {
@@ -255,18 +292,21 @@
} }
/* ==================== 4. 活跃时段 ==================== */ /* ==================== 4. 活跃时段 ==================== */
/* ==================== 4. 活跃时段 (新版) ==================== */
.highlight-section { .highlight-section {
grid-column: span 5; flex: 1;
background: var(--color-yellow); background: var(--color-yellow);
padding: 30px; padding: 20px;
transform: rotate(2deg); border: 2px solid var(--ink-primary);
box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.1); border-radius: 20px;
box-shadow: 6px 6px 0 var(--color-pink);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
text-align: center; text-align: center;
position: relative; position: relative;
background-image: repeating-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 0, rgba(255, 255, 255, 0.2) 10px, transparent 10px, transparent 20px);
} }
.tape-top { .tape-top {
@@ -386,42 +426,59 @@
.user-card { .user-card {
break-inside: avoid; break-inside: avoid;
background: #fff; background: #fff;
border: 2px solid #e0e0e0; border: 2px solid var(--ink-primary);
border-radius: 12px; border-radius: 16px;
padding: 20px; padding: 24px;
margin-bottom: 25px; margin-bottom: 30px;
box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.05); /* Muted Blue-Grey Shadow */
box-shadow: 6px 6px 0 rgba(70, 80, 100, 0.15), 6px 6px 0 1px var(--ink-primary);
position: relative; position: relative;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
transition: transform 0.2s; transition: transform 0.2s;
/* Very subtle grain */
background-color: #fff;
background-image: url("data:image/svg+xml,%3Csvg width='100' height='100' viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)' opacity='0.03'/%3E%3C/svg%3E");
} }
.user-card:hover { .user-card:hover {
transform: translateY(-3px); transform: translateY(-4px) rotate(1deg);
z-index: 5; z-index: 5;
border-color: var(--ink-primary); box-shadow: 8px 8px 0 rgba(0, 0, 0, 0.15), 8px 8px 0 2px var(--ink-primary);
} }
.card-tape { .card-tape {
position: absolute; position: absolute;
top: -10px; top: -12px;
left: 50%; left: 50%;
transform: translateX(-50%); transform: translateX(-50%) rotate(-2deg);
width: 60px; width: 80px;
height: 18px; height: 24px;
background: var(--color-blue); background: rgba(255, 255, 255, 0.4);
opacity: 0.9; /* Fallback */
background-color: var(--color-blue);
opacity: 0.8;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
/* Jagged edges for tape look */
mask-image: linear-gradient(135deg, transparent 5px, black 0) top left, linear-gradient(-135deg, transparent 5px, black 0) top right, linear-gradient(45deg, transparent 5px, black 0) bottom left, linear-gradient(-45deg, transparent 5px, black 0) bottom right;
mask-size: 51% 51%;
mask-repeat: no-repeat;
-webkit-mask-image: radial-gradient(circle at 2px 2px, transparent 2px, black 2.5px);
-webkit-mask-size: 100% 100%;
/* Simplify mask for compatibility */
/* Simpler tape look since masks can be tricky across renderers */
border-left: 2px dashed rgba(255, 255, 255, 0.3);
border-right: 2px dashed rgba(255, 255, 255, 0.3);
} }
.user-card:nth-child(2n) .card-tape { .user-card:nth-child(2n) .card-tape {
background: var(--color-pink); background-color: var(--color-pink);
transform: rotate(2deg); transform: translateX(-50%) rotate(3deg);
} }
.user-card:nth-child(3n) .card-tape { .user-card:nth-child(3n) .card-tape {
background: var(--color-green); background-color: var(--color-green);
transform: rotate(-2deg); transform: translateX(-50%) rotate(-1deg);
} }
.user-header { .user-header {
@@ -494,16 +551,24 @@
.u-reason { .u-reason {
font-family: var(--font-hand); font-family: var(--font-hand);
font-size: 0.95rem; font-size: 1.05rem;
color: #555; color: #444;
line-height: 1.6; line-height: 1.6;
text-align: justify;
background: #fafafa; /* Quote Block Style */
padding: 12px; background: #f8fbff;
border-radius: 8px; border-left: 4px solid var(--color-blue);
padding: 12px 15px;
margin-top: 15px;
border-radius: 4px;
position: relative; position: relative;
} }
.u-reason::before {
content: "";
/* Removed big quote mark to clean up */
}
/* ==================== 7. 每日回响 ==================== */ /* ==================== 7. 每日回响 ==================== */
.quotes-section { .quotes-section {
grid-column: span 12; grid-column: span 12;
@@ -704,66 +769,62 @@
</div> </div>
<!-- 2. 统计邮票和活跃时段 --> <!-- 2. 统计邮票和活跃时段 -->
<div class="grid-layout" style="margin-bottom: 40px;"> <div class="stats-wrapper">
<!-- 统计邮票 --> <!-- Left: Stats Grid (2x2) -->
<div class="stats-section" style="grid-column: span 8;"> <div class="stats-grid">
<div class="stats-row"> <!-- Chat Icon -->
<div class="stamp" style="transform: rotate(-2deg);"> <div class="stamp">
<div class="stamp-inner"> <div class="stamp-inner">
<!-- Chat Icon --> <svg class="doodle" style="font-size: 2.2rem; color: var(--accent-orange);" viewBox="0 0 24 24">
<svg class="doodle" style="font-size: 2.5rem; color: var(--accent-orange);" <path
viewBox="0 0 24 24"> d="M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z" />
<path </svg>
d="M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z" /> <div class="stamp-num">{{message_count}}</div>
</svg> <div class="stamp-label">消息总数</div>
<div class="stamp-num">{{message_count}}</div>
<div class="stamp-label">消息总数</div>
</div>
</div> </div>
<div class="stamp" style="transform: rotate(2deg); margin-top: 10px;"> </div>
<div class="stamp-inner"> <!-- Users Icon -->
<!-- Users Icon --> <div class="stamp">
<svg class="doodle" style="font-size: 2.5rem; color: var(--color-green);" <div class="stamp-inner">
viewBox="0 0 24 24"> <svg class="doodle" style="font-size: 2.2rem; color: var(--color-green);" viewBox="0 0 24 24">
<path <path
d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z" /> d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z" />
</svg> </svg>
<div class="stamp-num">{{participant_count}}</div> <div class="stamp-num">{{participant_count}}</div>
<div class="stamp-label">参与人数</div> <div class="stamp-label">参与人数</div>
</div>
</div> </div>
<div class="stamp" style="transform: rotate(-1deg);"> </div>
<div class="stamp-inner"> <!-- Emoji Icon -->
<!-- Image Icon --> <div class="stamp">
<svg class="doodle" style="font-size: 2.5rem; color: var(--color-blue);" <div class="stamp-inner">
viewBox="0 0 24 24"> <svg class="doodle" style="font-size: 2.2rem; color: var(--color-blue);" viewBox="0 0 24 24">
<path <path
d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z" /> d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z" />
</svg> </svg>
<div class="stamp-num">{{emoji_count}}</div> <div class="stamp-num">{{emoji_count}}</div>
<div class="stamp-label">表情统计</div> <div class="stamp-label">表情统计</div>
</div>
</div> </div>
<div class="stamp" style="transform: rotate(3deg); margin-top: 5px;"> </div>
<div class="stamp-inner"> <!-- Text Icon -->
<!-- Text Icon --> <div class="stamp">
<svg class="doodle" style="font-size: 2.5rem; color: var(--color-purple);" <div class="stamp-inner">
viewBox="0 0 24 24"> <svg class="doodle" style="font-size: 2.2rem; color: var(--color-purple);" viewBox="0 0 24 24">
<path <path
d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z" /> d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z" />
</svg> </svg>
<div class="stamp-num">{{total_characters}}</div> <div class="stamp-num">{{total_characters}}</div>
<div class="stamp-label">总字符数</div> <div class="stamp-label">总字符数</div>
</div>
</div> </div>
</div> </div>
</div> </div>
<!-- 活跃时段 --> <!-- Highlight Time -->
<div class="highlight-section" style="grid-column: span 4;"> <div class="highlight-section">
<div class="tape-top"></div> <div class="tape-top" style="background: rgba(255,255,255,0.6);"></div>
<div style="font-family: var(--font-hand); font-size: 1.6rem; color: var(--ink-secondary);">✨ Highlight <div
Time</div> style="font-family: var(--font-hand); font-size: 1.5rem; color: var(--ink-secondary); margin-bottom: 5px;">
✨ Highlight Time
</div>
<div class="time-big">{{most_active_period}}</div> <div class="time-big">{{most_active_period}}</div>
<div class="time-desc">(此刻,世界色彩斑斓)</div> <div class="time-desc">(此刻,世界色彩斑斓)</div>
</div> </div>