feat: 分享传播与经文纸水墨背景

- 分享按钮:系统分享 + 二维码卡片(qr.png),移动端移入播放行不再遮挡标题
- og 分享卡片元数据 + og.png 封面;beforeinstallprompt 安装提示
- robots.txt / sitemap.xml / poster.png 传播物料
- .sutra-paper 宣纸底纹:桌面 bg.jpg,移动端竖版 bg-m.jpg,夜间模式罩层适配
- 移动端设置区重排为双列标签网格

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
selfrelease
2026-10-05 14:30:43 +08:00
co-authored by Devin
parent 490f032d60
commit 6329f3f6b4
13 changed files with 215 additions and 6 deletions
+127 -1
View File
@@ -558,7 +558,18 @@ body.night .jump-now { background: rgba(43, 36, 27, 0.92); }
.size-btn { width: 34px; height: 30px; font-size: 0.8rem; }
.layout-btn, .sutra-btn, .pager-btn { padding: 5px 8px; font-size: 0.78rem; min-height: 30px; }
.sutra-paper { padding: 18px 16px; }
.sutra-paper {
padding: 18px 16px;
/* 手机端竖版水墨底纹:底部山寺剪影,上部留白供文字 */
background:
linear-gradient(rgba(253, 250, 242, 0.85), rgba(253, 250, 242, 0.85)),
url("bg-m.jpg") center bottom / cover no-repeat;
}
body.night .page .sutra-paper {
background:
linear-gradient(rgba(41, 34, 25, 0.88), rgba(41, 34, 25, 0.88)),
url("bg-m.jpg") center bottom / cover no-repeat;
}
.sutra-paper::before { inset: 6px; }
.sutra-paper::after { inset: 9px; }
.sutra { column-width: auto; }
@@ -775,3 +786,118 @@ body.night .seg.playing { background: rgba(201, 106, 92, 0.16); color: #f0c9c2;
}
.admin-btn:hover { border-color: var(--gold); color: var(--ink); }
body.night .admin-card { background: #241d15; }
/* ===== 分享按钮(固定右上,与左上 logo 呼应) ===== */
.share-btn {
position: fixed;
top: 18px;
right: 26px;
z-index: 30;
padding: 6px 14px;
font-family: inherit;
font-size: 0.78rem;
letter-spacing: 0.2em;
color: var(--cinnabar);
background: var(--paper);
border: 1px solid var(--gold);
border-radius: 6px;
cursor: pointer;
box-shadow: 0 3px 10px rgba(30, 22, 14, 0.12);
transition: color 0.15s ease, border-color 0.15s ease;
}
.share-btn:hover { color: var(--ink); }
.share-btn:focus-visible { outline: 3px solid var(--gold-soft); outline-offset: 1px; }
body.night .share-btn { background: #241d15; }
/* ===== 分享弹层(二维码 + 复制链接 + 安装) ===== */
.share-card .share-qr { display: block; width: 200px; margin: 8px auto; border: 1px solid var(--hairline); border-radius: 8px; }
.share-card .share-link {
display: block;
text-align: center;
font-size: 0.78rem;
color: var(--ink-soft);
word-break: break-all;
margin-bottom: 4px;
}
.share-card .admin-actions { flex-wrap: wrap; }
.share-card .admin-btn { flex: 1 1 45%; }
@media (max-width: 720px) {
/* 手机端分享按钮不再固定悬浮,进入播放行(收起态夹在"设置"前) */
.share-btn {
position: static;
order: 3;
flex: none;
height: 34px;
padding: 0 11px;
font-size: 0.72rem;
letter-spacing: 0.1em;
color: var(--ink-soft);
background: transparent;
border-color: var(--hairline);
box-shadow: none;
}
/* 展开态:与循环/夜间同行三等分 */
.player-card.expanded .share-btn { order: 9; flex: 1 1 28%; height: 30px; padding: 5px 8px; font-size: 0.78rem; }
.player-card.expanded .tool-group[aria-label="模式"] .layout-btn { flex: 1 1 28%; }
/* 分享卡片贴底升起 */
.admin-mask.share { align-items: flex-end; padding: 0; }
.admin-mask.share .share-card {
width: 100%;
border-radius: 12px 12px 0 0;
border-left: none;
border-right: none;
border-bottom: none;
max-height: 70vh;
padding-bottom: calc(16px + env(safe-area-inset-bottom));
}
}
/* ===== 桌面端经文纸底纹:山寺水墨淡化垫底,仅宽屏启用 ===== */
@media (min-width: 721px) {
/* 水墨底纹衬在经文纸(.sutra-paper)区域,不铺出纸外 */
.sutra-paper {
background:
linear-gradient(rgba(253, 250, 242, 0.84), rgba(253, 250, 242, 0.84)),
url("bg.jpg") center / cover no-repeat;
}
body.night .sutra-paper {
background:
linear-gradient(rgba(41, 34, 25, 0.87), rgba(41, 34, 25, 0.87)),
url("bg.jpg") center / cover no-repeat;
}
}
/* ===== 手机端展开态设置区重排:统一"小标签 + 控件"双列网格 ===== */
@media (max-width: 720px) {
.player-card.expanded .btn-play { order: 1; flex: 1 1 100%; }
.player-card.expanded .sleep-remaining.show { order: 2; flex: 1 1 100%; justify-content: center; }
/* 第一行:经典 | 音色 */
.player-card.expanded .player-row > .field-pair { order: 3; flex: 1 1 46%; }
.player-card.expanded .player-meta { order: 4; flex: 1 1 46%; gap: 8px; }
/* 第二行:字号 | 语速 */
.player-card.expanded .tool-group[aria-label="字号"] { order: 5; flex: 1 1 46%; justify-content: flex-start; gap: 8px; }
.player-card.expanded .size-btn { flex: 1; }
.player-card.expanded .tool-group[aria-label="模式"] { display: contents; }
.player-card.expanded .tool-group[aria-label="模式"] .field-pair { flex: 1 1 46%; }
.player-card.expanded .tool-group[aria-label="模式"] .field-pair:has(#rate-select) { order: 6; }
/* 第三行:配乐 | 定时 */
.player-card.expanded .tool-group[aria-label="模式"] .field-pair:has(#bgm-select) { order: 7; }
.player-card.expanded .tool-group[aria-label="模式"] .field-pair:has(#timer-select) { order: 8; }
/* 第四行:循环 | 夜间 */
.player-card.expanded .tool-group[aria-label="模式"] .layout-btn { flex: 1 1 46%; order: 9; }
.player-card.expanded .flex-break { display: none; }
.player-card.expanded .expand-btn { order: 11; flex: 1 1 100%; }
/* 每个单元格统一:金色小标签 + 控件 */
.player-card.expanded .tool-name,
.player-card.expanded .voice-label {
display: flex;
align-items: center;
font-size: 0.68rem;
color: var(--gold);
letter-spacing: 0.06em;
white-space: nowrap;
}
.player-card.expanded .field-pair .sheet-btn,
.player-card.expanded .player-meta .sheet-btn { flex: 1; min-width: 0; }
}