This commit is contained in:
2026-05-05 07:13:54 +08:00
Unverified
parent 759e1fad0d
commit 82210681c0
20 changed files with 4145 additions and 0 deletions
+136
View File
@@ -0,0 +1,136 @@
.notice-banner {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 9999;
display: none;
justify-content: center;
padding: 10px 14px;
color: #102033;
font-family: "Noto Sans SC", "Microsoft YaHei", Arial, sans-serif;
background: linear-gradient(90deg, #fff7d6, #dff7ff);
border-bottom: 1px solid rgba(16, 32, 51, 0.14);
box-shadow: 0 10px 28px rgba(0, 0, 0, 0.18);
}
.notice-banner.is-visible {
display: flex;
}
.notice-banner__inner {
width: min(100%, 1120px);
display: grid;
grid-template-columns: auto 1fr auto auto;
align-items: center;
gap: 10px;
}
.notice-banner__badge {
min-width: 40px;
padding: 4px 9px;
border-radius: 999px;
color: #ffffff;
background: #2563eb;
font-size: 12px;
font-weight: 700;
text-align: center;
line-height: 1.2;
}
.notice-banner[data-level="warning"] .notice-banner__badge {
background: #b45309;
}
.notice-banner[data-level="error"] .notice-banner__badge {
background: #be123c;
}
.notice-banner[data-level="success"] .notice-banner__badge {
background: #047857;
}
.notice-banner__content {
min-width: 0;
font-size: 14px;
line-height: 1.45;
}
.notice-banner__title {
margin-right: 6px;
font-weight: 700;
}
.notice-banner__message {
color: rgba(16, 32, 51, 0.84);
}
.notice-banner__link {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 30px;
padding: 0 12px;
border-radius: 999px;
color: #ffffff;
background: #075985;
font-size: 14px;
font-weight: 700;
text-decoration: none;
white-space: nowrap;
}
.notice-banner__link:hover {
background: #0369a1;
text-decoration: none;
}
.notice-banner__close {
width: 30px;
height: 30px;
border: 0;
border-radius: 50%;
color: #102033;
background: rgba(16, 32, 51, 0.08);
font-size: 20px;
line-height: 1;
cursor: pointer;
}
.notice-banner__close:hover {
background: rgba(16, 32, 51, 0.14);
}
body.has-notice-banner {
padding-top: calc(var(--notice-body-pad-top, 0px) + var(--notice-banner-height, 0px) + 12px) !important;
}
@media (max-width: 640px) {
.notice-banner {
padding: 9px 10px;
}
.notice-banner__inner {
grid-template-columns: auto 1fr auto;
gap: 8px;
}
.notice-banner__link {
grid-column: 2 / 3;
justify-self: start;
}
.notice-banner__content {
font-size: 13px;
}
}
@media print {
.notice-banner {
display: none !important;
}
body.has-notice-banner {
padding-top: var(--notice-body-pad-top, 0px) !important;
}
}
+536
View File
@@ -0,0 +1,536 @@
:root {
--bg: #07111f;
--panel: rgba(9, 20, 40, 0.78);
--panel-strong: rgba(10, 24, 46, 0.94);
--line: rgba(103, 213, 255, 0.22);
--line-strong: rgba(103, 213, 255, 0.48);
--text: #edf7ff;
--muted: #96b2d1;
--accent: #67d5ff;
--accent-strong: #2de2a6;
--warning: #ffcc66;
--font-display: "Orbitron", "Segoe UI", sans-serif;
--font-body: "Noto Sans SC", "Microsoft YaHei", sans-serif;
}
* {
box-sizing: border-box;
}
html {
color-scheme: dark;
}
body {
margin: 0;
min-height: 100vh;
color: var(--text);
font-family: var(--font-body);
background:
linear-gradient(135deg, rgba(7, 17, 31, 0.96), rgba(10, 28, 54, 0.96)),
repeating-linear-gradient(90deg, rgba(103, 213, 255, 0.055) 0 1px, transparent 1px 72px),
repeating-linear-gradient(0deg, rgba(103, 213, 255, 0.045) 0 1px, transparent 1px 72px);
}
a {
color: inherit;
}
.notice-page {
width: min(calc(100% - 32px), 1120px);
margin: 0 auto;
padding: 28px 0 56px;
}
.topbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
margin-bottom: 34px;
}
.brand,
.back-link,
.primary-action {
display: inline-flex;
align-items: center;
min-height: 40px;
border-radius: 999px;
text-decoration: none;
}
.brand {
gap: 10px;
color: var(--text);
font-weight: 700;
}
.brand-mark {
display: inline-grid;
place-items: center;
width: 40px;
height: 40px;
border: 1px solid var(--line-strong);
border-radius: 12px;
color: var(--accent);
font-family: var(--font-display);
background: rgba(103, 213, 255, 0.08);
}
.back-link {
padding: 0 16px;
border: 1px solid var(--line);
color: var(--muted);
background: rgba(255, 255, 255, 0.04);
}
.back-link:hover,
.primary-action:hover {
border-color: var(--line-strong);
color: var(--text);
}
.notice-hero {
display: grid;
grid-template-columns: minmax(0, 1fr) 280px;
gap: 22px;
align-items: stretch;
margin-bottom: 22px;
}
.hero-copy,
.status-panel,
.notice-card,
.side-card {
border: 1px solid var(--line);
background: var(--panel);
box-shadow: 0 28px 60px rgba(0, 0, 0, 0.32);
backdrop-filter: blur(18px);
}
.hero-copy {
padding: clamp(28px, 5vw, 54px);
border-radius: 24px;
}
.eyebrow {
display: inline-block;
margin-bottom: 14px;
color: var(--accent);
font-family: var(--font-display);
font-size: 12px;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
}
h1,
h2,
p {
margin-top: 0;
}
h1 {
margin-bottom: 16px;
font-size: clamp(34px, 6vw, 64px);
line-height: 1.05;
}
.hero-copy p {
max-width: 760px;
margin-bottom: 0;
color: var(--muted);
font-size: 17px;
line-height: 1.8;
}
.status-panel {
display: flex;
min-height: 240px;
flex-direction: column;
justify-content: space-between;
padding: 24px;
border-radius: 24px;
}
.status-badge {
width: max-content;
padding: 7px 12px;
border-radius: 999px;
color: #06111f;
background: var(--warning);
font-size: 13px;
font-weight: 800;
}
.status-code {
color: var(--accent);
font-family: var(--font-display);
font-size: 44px;
font-weight: 700;
}
.status-panel p {
margin-bottom: 0;
color: var(--muted);
}
.notice-layout {
display: grid;
grid-template-columns: minmax(0, 1fr) 320px;
gap: 22px;
align-items: start;
}
.notice-card,
.side-card {
border-radius: 20px;
}
.notice-card {
padding: clamp(24px, 4vw, 40px);
}
.notice-meta {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-bottom: 22px;
}
.notice-meta span,
.info-label {
color: var(--muted);
font-size: 13px;
}
.notice-meta span {
padding: 6px 10px;
border: 1px solid var(--line);
border-radius: 999px;
background: rgba(255, 255, 255, 0.04);
}
.notice-card h2,
.side-card h2 {
margin-bottom: 12px;
font-size: 24px;
}
.notice-card p,
.side-card p {
color: var(--muted);
line-height: 1.8;
}
.info-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 12px;
margin-top: 30px;
}
.info-grid div {
min-height: 92px;
padding: 16px;
border: 1px solid var(--line);
border-radius: 16px;
background: rgba(255, 255, 255, 0.04);
}
.info-grid strong {
display: block;
margin-top: 8px;
font-size: 16px;
}
.side-card {
padding: 24px;
}
code {
color: var(--accent);
font-family: Consolas, "Courier New", monospace;
}
.primary-action {
justify-content: center;
width: 100%;
margin-top: 14px;
padding: 0 18px;
border: 1px solid rgba(45, 226, 166, 0.5);
color: #06111f;
background: linear-gradient(135deg, var(--accent), var(--accent-strong));
font-weight: 800;
}
@media (max-width: 840px) {
.notice-hero,
.notice-layout {
grid-template-columns: 1fr;
}
.status-panel {
min-height: 180px;
}
.info-grid {
grid-template-columns: 1fr;
}
}
/* Light visual refresh for notice detail */
html {
color-scheme: light;
}
body {
color: #172033;
background:
linear-gradient(135deg, rgba(236, 248, 255, 0.92), rgba(255, 255, 255, 0.96) 48%, rgba(245, 250, 255, 0.94)),
linear-gradient(90deg, rgba(37, 99, 235, 0.045) 1px, transparent 1px),
linear-gradient(0deg, rgba(20, 184, 166, 0.035) 1px, transparent 1px);
background-size: auto, 52px 52px, 52px 52px;
}
.brand {
color: #172033;
}
.brand-mark {
color: #2563eb;
background: rgba(37, 99, 235, 0.07);
border-color: rgba(37, 99, 235, 0.2);
}
.back-link {
color: #66758a;
background: #ffffff;
border-color: rgba(120, 144, 176, 0.24);
}
.back-link:hover,
.primary-action:hover {
color: #172033;
border-color: rgba(37, 99, 235, 0.36);
}
.hero-copy,
.status-panel,
.notice-card,
.side-card {
background: rgba(255, 255, 255, 0.84);
border-color: rgba(120, 144, 176, 0.24);
box-shadow: 0 18px 44px rgba(47, 74, 112, 0.12);
backdrop-filter: blur(16px);
}
.eyebrow,
.status-code,
code {
color: #2563eb;
}
h1,
h2,
.info-grid strong {
color: #172033;
}
.hero-copy p,
.status-panel p,
.notice-card p,
.side-card p,
.notice-meta span,
.info-label {
color: #66758a;
}
.status-badge {
color: #854d0e;
background: #fef3c7;
}
.notice-meta span,
.info-grid div {
background: rgba(248, 251, 255, 0.86);
border-color: rgba(120, 144, 176, 0.2);
}
.primary-action {
color: #ffffff;
background: linear-gradient(135deg, #2563eb, #0891b2);
border-color: rgba(37, 99, 235, 0.16);
box-shadow: 0 12px 24px rgba(37, 99, 235, 0.16);
}
/* Youthful unified layout refresh */
:root {
--joy-blue: #2563eb;
--joy-cyan: #06b6d4;
--joy-mint: #10b981;
--joy-coral: #fb7185;
--joy-yellow: #facc15;
--joy-ink: #172033;
--joy-muted: #627187;
--joy-line: rgba(96, 116, 148, 0.18);
--joy-card: rgba(255, 255, 255, 0.9);
}
body {
background:
linear-gradient(128deg, rgba(255, 255, 255, 0.96) 0 34%, rgba(232, 249, 255, 0.9) 34% 58%, rgba(255, 246, 249, 0.92) 58% 100%),
linear-gradient(90deg, rgba(37, 99, 235, 0.04) 1px, transparent 1px),
linear-gradient(0deg, rgba(16, 185, 129, 0.035) 1px, transparent 1px);
background-size: auto, 44px 44px, 44px 44px;
}
.notice-page {
padding-top: 24px;
}
.topbar {
margin-bottom: 22px;
}
.brand-mark {
border-radius: 10px;
color: #ffffff;
background: linear-gradient(135deg, var(--joy-blue), var(--joy-coral));
border-color: transparent;
}
.back-link {
min-height: 38px;
border-radius: 12px;
}
.notice-hero {
grid-template-columns: minmax(0, 1fr) minmax(220px, 0.28fr);
gap: 16px;
margin-bottom: 16px;
}
.notice-layout {
grid-template-columns: minmax(0, 1fr) minmax(260px, 0.34fr);
gap: 16px;
}
.hero-copy,
.status-panel,
.notice-card,
.side-card {
border-radius: 18px;
border-color: var(--joy-line);
background: var(--joy-card);
box-shadow: 0 16px 34px rgba(37, 63, 101, 0.1);
}
.hero-copy {
min-height: 250px;
display: grid;
align-content: center;
padding: clamp(26px, 5vw, 48px);
}
.hero-copy,
.notice-card,
.side-card,
.status-panel {
position: relative;
overflow: hidden;
}
.hero-copy::after,
.notice-card::after,
.side-card::after,
.status-panel::after {
content: "";
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 4px;
background: linear-gradient(90deg, var(--joy-blue), var(--joy-cyan), var(--joy-mint), var(--joy-coral));
pointer-events: none;
}
.eyebrow {
width: max-content;
padding: 8px 14px;
border-radius: 999px;
background: linear-gradient(135deg, rgba(37, 99, 235, 0.11), rgba(6, 182, 212, 0.11));
color: var(--joy-blue);
letter-spacing: 0.12em;
}
h1 {
letter-spacing: 0;
}
.status-panel {
position: relative;
min-height: 250px;
justify-content: center;
gap: 22px;
border-top: 5px solid var(--joy-coral);
}
.status-code {
color: var(--joy-coral);
font-size: clamp(34px, 4vw, 44px);
}
.status-badge,
.notice-meta span {
border: 0;
}
.status-badge {
color: #8a4b05;
background: #fff2bf;
}
.notice-meta span,
.info-grid div {
border-radius: 14px;
background: #f8fbff;
border-color: rgba(96, 116, 148, 0.12);
}
.notice-card,
.side-card {
padding: clamp(22px, 4vw, 34px);
}
.info-grid {
gap: 10px;
margin-top: 24px;
}
.primary-action {
min-height: 46px;
border-radius: 12px;
background: linear-gradient(135deg, var(--joy-blue), var(--joy-cyan));
}
@media (max-width: 520px) {
.notice-page {
width: min(calc(100% - 20px), 1120px);
padding-top: 16px;
}
.topbar {
align-items: flex-start;
flex-direction: column;
margin-bottom: 22px;
}
.hero-copy,
.status-panel,
.notice-card,
.side-card {
border-radius: 16px;
}
}
+186
View File
@@ -0,0 +1,186 @@
/* ===========================================
1. 通用响应式底座 (所有样式均需依赖)
=========================================== */
:root {
--text-color: #333;
--paper-bg: #fff;
--wish-color: #333;
--border-color: #ddd;
--font-family-base: "Noto Serif SC", serif;
--font-family-sig: "Noto Serif SC", serif; /* 默认署名字体 */
}
body {
margin: 0;
padding: 20px;
background-color: #f6f6f6; /* 默认外背景 */
font-family: var(--font-family-base);
color: var(--text-color);
display: flex;
justify-content: center;
transition: background 0.3s;
}
/* 自适应容器 */
.letter-container {
width: 100%;
max-width: 800px;
min-height: 85vh;
padding: 5% 7%;
box-sizing: border-box;
position: relative;
box-shadow: 0 4px 15px rgba(0,0,0,0.05);
background-color: var(--paper-bg);
border: 1px solid var(--border-color);
transition: all 0.3s ease;
}
/* 手机端适配 */
@media (max-width: 600px) {
body { padding: 10px; }
.letter-container { padding: 35px 20px; }
}
/* 传统书信格式公共逻辑 */
.salutation {
font-size: 1.2rem;
margin-top: 0;
margin-bottom: 1.5rem;
font-weight: bold;
}
.content p {
text-indent: 2em; /* 首行缩进 */
line-height: 1.8;
text-align: justify;
margin-bottom: 1rem;
}
.closing { margin-top: 2.5rem; }
.wish-prefix { text-indent: 2em; margin: 0; color: var(--wish-color); }
.wish-suffix { font-weight: bold; margin-top: 5px; color: var(--wish-color); }
.footer {
text-align: right;
margin-top: 4rem;
line-height: 1.6;
}
.signature {
font-size: 1.1em;
font-family: var(--font-family-sig);
}
.text-right {
text-align: right;
}
/* ===========================================
2. 原始场景皮肤 (Modern, Traditional, Vintage)
=========================================== */
/* ... (保留你之前的定义,此处略以节省空间,直接写新的) ... */
.theme-modern { --paper-bg: #fff; border-top: 4px solid #333; }
.theme-traditional { --paper-bg: #fdfaf2; writing-mode: vertical-rl; height: 650px; }
@media (max-width: 600px) { .theme-traditional { writing-mode: horizontal-tb; height: auto; } }
.theme-vintage { --paper-bg: #fff; border: 2px solid #b71c1c; background-image: repeating-linear-gradient(transparent, transparent 31px, rgba(183, 28, 28, 0.1) 31px, rgba(183, 28, 28, 0.1) 32px); line-height: 32px; --text-color: #b71c1c; --wish-color: #b71c1c; }
/* ===========================================
3. [新增] 青春与多样场景皮肤
=========================================== */
/* --- A. 青春派对 (Youthful) --- */
/* 特点:明亮多彩、活力、柔和 */
.theme-youth {
--paper-bg: #fff;
--text-color: #4a4a4a;
--wish-color: #ff6b6b; /* 鲜艳的颜色 */
--border-color: #ffe0e0;
font-family: "PingFang SC", "Microsoft YaHei", sans-serif; /* 使用现代无衬线字体 */
border-radius: 15px; /* 圆角增加亲和力 */
border: 3px solid #ffe0e0;
}
/* 装饰:顶部和底部加点彩色条纹 */
.theme-youth::before {
content: "";
position: absolute;
top: 0; left: 0; right: 0; height: 8px;
background: linear-gradient(90deg, #ff6b6b, #feca57, #48dbfb, #ff9f43);
border-radius: 15px 15px 0 0;
}
.theme-youth .salutation { color: #222; }
.theme-youth .content p { text-indent: 0; text-align: left; background-color: #fcfcfc; padding: 10px; border-radius: 8px; margin-bottom: 1.2rem; } /* 类似气泡感 */
.theme-youth .wish-prefix { text-indent: 0; padding-left: 1rem; } /* 青春风不一定强制缩进 */
.theme-youth .wish-suffix { font-weight: 800; font-size: 1.1rem; }
.theme-youth .footer { color: #888; }
.theme-youth .signature { color: #333; font-weight: bold; }
/* --- B. 青葱校园 (Campus) --- */
/* 特点:数学格子纸、怀旧、清爽蓝调 */
.theme-campus {
--paper-bg: #fdfdfd;
--text-color: #3e3e3e;
--wish-color: #2980b9; /* 校园蓝 */
--border-color: #87ceeb;
font-family: "SimSun", serif; /* 怀旧宋体 */
/* 模拟蓝格子纸 */
background-image:
linear-gradient(rgba(135, 206, 235, 0.3) 1px, transparent 1px),
linear-gradient(90deg, rgba(135, 206, 235, 0.3) 1px, transparent 1px);
background-size: 25px 25px; /* 格子大小 */
}
/* 顶部加一个类似书签或校徽的圆 */
.theme-campus::after {
content: "CAMPUS";
position: absolute;
top: -15px; right: 30px;
background-color: #2980b9;
color: white;
padding: 5px 15px;
border-radius: 20px;
font-size: 0.8rem;
font-family: sans-serif;
}
.theme-campus .content p { line-height: 1.6; text-indent: 2em; }
.theme-campus .closing { border-top: 1px dashed rgba(135, 206, 235, 0.5); padding-top: 1rem; }
.theme-campus .footer .date { color: #888; }
/* --- C. 极简和风 (Wabi-Sabi / Minimalist) --- */
/* 特点:淡雅、素净、极低对比度、高端商务或长辈 */
.theme-wabi {
--paper-bg: #fafafa;
--text-color: #555;
--wish-color: #777;
--border-color: transparent; /* 无边框 */
font-family: "Source Han Serif SC", serif; /* 高质量宋体 */
background-color: #fff;
padding: 8% 10%; /* 更宽松的内边距 */
border-radius: 0;
box-shadow: none; /* 去掉阴影,极度扁平 */
}
/* 手机端去掉过于宽松的内边距 */
@media (max-width: 600px) {
.theme-wabi { padding: 40px 20px; }
}
/* 装饰:只在底部加一条极淡的灰线 */
.theme-wabi .footer {
text-align: right;
border-top: 1px solid #f0f0f0;
padding-top: 1.5rem;
}
.theme-wabi .salutation { font-weight: normal; font-size: 1.2rem; color: #333; }
.theme-wabi .content p { text-indent: 2em; line-height: 2; color: #666; font-size: 0.95rem; }
.theme-wabi .wish-suffix { font-weight: normal; color: #777; }
.theme-wabi .signature { font-family: "Zhi Mang Xing", cursive; font-size: 1.8rem; color: #333; } /* 使用Google Font书法字体 */
File diff suppressed because it is too large Load Diff
+95
View File
@@ -0,0 +1,95 @@
body {
font-family: Arial, "Microsoft YaHei";
margin: 0;
color: #172033;
background:
linear-gradient(128deg, rgba(255, 255, 255, 0.96) 0 34%, rgba(232, 249, 255, 0.9) 34% 58%, rgba(255, 246, 249, 0.92) 58% 100%);
}
/* ===== A4 容器 ===== */
.page {
width: 210mm;
min-height: 297mm;
margin: 18px auto;
padding: 20mm;
position: relative;
background: white;
box-shadow: 0 18px 44px rgba(47, 74, 112, 0.12);
border-top: 5px solid #2563eb;
}
/* ===== 水印 ===== */
.watermark {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) rotate(-30deg);
font-size: 50px;
color: rgba(0, 0, 0, 0.08);
white-space: nowrap;
pointer-events: none;
z-index: 0;
text-align: center;
}
/* ===== 标题 ===== */
.title {
text-align: center;
font-size: 22px;
font-weight: bold;
margin-bottom: 20px;
color: #172033;
letter-spacing: 0.04em;
}
/* ===== 信息表格 ===== */
.table {
width: 100%;
border-collapse: collapse;
margin-top: 10px;
position: relative;
z-index: 1;
}
.table td {
border: 1px solid #dbe4ef;
padding: 11px 12px;
font-size: 14px;
}
.label {
width: 25%;
color: #66758a;
background: linear-gradient(135deg, #f3f8ff, #f8fbff);
font-weight: 700;
}
/* ===== 页脚 ===== */
.footer {
position: absolute;
bottom: 20mm;
left: 20mm;
right: 20mm;
font-size: 12px;
color: #666;
display: flex;
justify-content: space-between;
}
/* ===== 打印优化 ===== */
@media print {
.no-print {
display: none;
}
body {
margin: 0;
background: #ffffff;
}
.page {
margin: auto;
box-shadow: none;
border-top: 0;
}
}