mirror of
https://github.com/Nezumi-2711/astrbot_plugin_qq_group_daily_analysis.git
synced 2026-09-22 20:01:04 +00:00
feat(scrapbook): 更新 scrapbook 模板
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user