This repository has been archived on 2026-06-21. You can view files and clone it, but cannot push or open issues or pull requests.
Files
MetaLab/templates/MetaLab-2026/static/css/home.css
Victor_Jay 39d13993ba fix: 设计原则审查修复 — DIP/ISP, LoD, DRY, OCP, URL, 301缓存
- P0 DIP+ISP: 全链路注入接口,消除零接口紧耦合
- P0 URL: auth 301→302,修复登出后浏览器缓存陷阱
- P1 DRY: JWT 认证逻辑收敛至 TokenService+中间件
- P2 DRY: 前后端角色/状态映射统一为 model 常量
- P2 LoD: 新增 SettingsController,router 不再跨层调 repo
- P2 URL: settings ?tab= → /settings/:tab 伪静态
- P3 OCP: 角色权限 map 化,告别硬编码 switch
2026-05-26 21:12:19 +08:00

436 lines
8.3 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* ============================================================
MetaLab Home Styles — 首页专属样式Hero / Plans / Features / Timeline
仅在首页加载,通过 ExtraCSS 注入
============================================================ */
/* ---------- Two-column layout ---------- */
.home-layout {
display: flex;
min-height: 100vh;
align-items: stretch;
}
/* ---------- Hero ---------- */
.hero {
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
padding: 4rem 0;
text-align: center;
background: linear-gradient(180deg, #fff 0%, #f0f4f8 100%);
min-width: 0;
}
.hero h1 {
font-size: 4rem;
font-weight: 800;
color: var(--color-primary);
margin-bottom: .6rem;
line-height: 1.1;
letter-spacing: -1px;
}
.hero h1 span {
color: var(--color-accent);
}
.hero-tagline {
font-size: 1.5rem;
color: var(--color-secondary);
margin-bottom: 1.5rem;
font-weight: 400;
}
.hero-desc {
font-size: 1.15rem;
color: var(--color-text-light);
max-width: 500px;
margin: 0 auto 2.2rem;
line-height: 1.8;
}
.hero-actions {
display: flex;
justify-content: center;
gap: 1rem;
flex-wrap: wrap;
}
.cta-button,
.secondary-button {
display: inline-block;
padding: .9rem 2.2rem;
border-radius: var(--radius);
font-weight: 600;
font-size: 1.1rem;
transition: var(--transition);
}
.cta-button {
background: var(--color-accent);
color: #fff;
border: 2px solid var(--color-accent);
}
.cta-button:hover {
background: transparent;
color: var(--color-accent);
}
.secondary-button {
background: transparent;
color: var(--color-accent);
border: 2px solid var(--color-accent);
}
.secondary-button:hover {
background: var(--color-accent);
color: #fff;
}
/* ---------- Shared section headings ---------- */
.section-title {
text-align: center;
font-size: 2.2rem;
color: var(--color-primary);
margin-bottom: .8rem;
}
.section-subtitle {
text-align: center;
color: var(--color-secondary);
font-size: 1.1rem;
max-width: 600px;
margin: 0 auto 3.5rem;
}
/* ---------- Plans ---------- */
.plans {
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
padding: 1.5rem 0;
}
.plans .section-title {
font-size: 2rem;
margin-bottom: .4rem;
}
.plans .section-subtitle {
margin-bottom: 1.2rem;
}
.plans-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1.25rem;
}
.plan-card {
background: var(--color-surface);
border-radius: var(--radius);
padding: 1.5rem;
box-shadow: var(--shadow);
transition: var(--transition);
border: 1px solid var(--color-border);
display: flex;
flex-direction: column;
position: relative;
}
.plan-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 20px rgba(0,0,0,.12);
}
.plan-icon {
width: 50px;
height: 50px;
background: rgba(52,152,219,.1);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 1rem;
color: var(--color-accent);
font-size: 1.6rem;
}
.plan-card h3 {
font-size: 1.25rem;
font-weight: 600;
color: var(--color-primary);
margin-bottom: .5rem;
}
.plan-card p {
color: var(--color-text-light);
margin-bottom: 1rem;
flex-grow: 1;
font-size: .95rem;
}
.plan-status {
display: inline-block;
background: #e8f4fc;
color: var(--color-accent);
padding: .3rem .9rem;
border-radius: 20px;
font-size: .85rem;
font-weight: 500;
}
/* ---------- Features ---------- */
.features {
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
padding: 4rem 0;
background: var(--color-surface);
}
.features-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 2.5rem;
margin-top: 3rem;
}
.feature {
text-align: center;
}
.feature .icon {
font-size: 2.5rem;
color: var(--color-accent);
margin-bottom: 1.5rem;
}
.feature h3 {
font-size: 1.3rem;
margin-bottom: .8rem;
color: var(--color-primary);
}
.feature p {
color: var(--color-text-light);
}
/* ---------- Timeline ---------- */
.section-group {
height: 100vh;
display: flex;
flex-direction: column;
}
.timeline-vision {
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
padding: 1.5rem 0 1rem;
overflow: hidden;
}
.timeline-vision .section-title {
margin-bottom: .3rem;
}
.timeline-vision .section-subtitle {
margin-bottom: 1.5rem;
}
.timeline {
max-width: 1100px;
margin: 0 auto;
position: relative;
display: flex;
justify-content: center;
gap: 2rem;
padding: 2rem 0 1rem;
overflow-x: auto;
overflow-y: visible;
-webkit-overflow-scrolling: touch;
overscroll-behavior-y: contain;
}
.timeline::before {
content: '';
position: absolute;
left: 4%;
top: 1.9rem;
width: 92%;
height: 3px;
background: var(--color-accent);
border-radius: 2px;
}
.timeline-item {
display: flex;
flex-direction: column;
align-items: center;
position: relative;
flex-shrink: 0;
min-width: 200px;
max-width: 240px;
padding: 0 .5rem;
}
.timeline-marker {
width: 24px;
height: 24px;
background: var(--color-accent);
border-radius: 50%;
border: 4px solid var(--color-surface);
box-shadow: var(--shadow);
margin-bottom: 1.5rem;
z-index: 1;
flex-shrink: 0;
}
.timeline-content {
background: var(--color-surface);
border-radius: var(--radius);
padding: 1.5rem 1.2rem;
box-shadow: var(--shadow);
border: 1px solid var(--color-border);
text-align: center;
width: 100%;
transition: var(--transition);
}
.timeline-item:hover .timeline-content {
transform: translateY(-4px);
box-shadow: 0 10px 20px rgba(0,0,0,.12);
}
.timeline-title {
font-size: 1.15rem;
font-weight: 600;
color: var(--color-primary);
margin-bottom: .5rem;
}
.timeline-desc {
color: var(--color-text-light);
font-size: .95rem;
}
/* ---------- Sidebar ---------- */
.sidebar {
width: 300px;
flex-shrink: 0;
padding: 4rem 20px 4rem 0;
display: flex;
flex-direction: column;
gap: 1rem;
}
.sidebar-card {
background: var(--color-surface);
border-radius: var(--radius);
box-shadow: var(--shadow);
border: 1px solid var(--color-border);
padding: 1.5rem;
}
/* --- User Card --- */
.user-card {
text-align: center;
}
.user-card-avatar {
width: 56px;
height: 56px;
border-radius: 50%;
background: var(--color-accent);
color: #fff;
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto .8rem;
font-size: 1.5rem;
font-weight: 700;
text-transform: uppercase;
}
.user-card-name {
font-size: 1.1rem;
font-weight: 600;
color: var(--color-primary);
margin-bottom: .3rem;
}
.user-card-desc {
font-size: .85rem;
color: var(--color-text-light);
margin-bottom: 1rem;
}
.user-card-link {
display: inline-block;
font-size: .85rem;
color: var(--color-accent);
font-weight: 500;
transition: var(--transition);
}
.user-card-link:hover {
opacity: .8;
}
.user-card-btn {
display: inline-block;
padding: .5rem 1.8rem;
background: var(--color-accent);
color: #fff;
border-radius: var(--radius);
font-size: .9rem;
font-weight: 500;
transition: var(--transition);
}
.user-card-btn:hover {
opacity: .85;
}
/* ---------- Responsive (首页专属) ---------- */
@media (max-width: 768px) {
.hero h1 {
font-size: 3rem;
}
.hero-tagline {
font-size: 1.25rem;
}
.hero-desc {
font-size: 1.05rem;
}
.timeline {
justify-content: flex-start;
gap: 1.5rem;
padding: 2rem 20px 1.5rem;
}
.timeline-item {
min-width: 240px;
max-width: 280px;
}
.timeline::before {
left: 20px;
width: calc(240px * 4 + 1.5rem * 3 + 20px);
}
.cta-button,
.secondary-button {
display: block;
width: 100%;
margin: .5rem 0;
}
.secondary-button {
margin-left: 0;
}
}