meteor_detection_system/docs/meteor_homepage_design.html
grabbit 95353ae2d7 chore: clean up project structure
- Remove .bmad-core/ and web-bundles/ (AI tool configs)
- Remove tmp-home/ directories and cache files
- Move test scripts to scripts/ directory
- Move design file to docs/ directory
- Remove duplicate AGENTS.md (content in CLAUDE.md)
- Remove duplicate sample-app-config.toml
- Update .gitignore with missing entries
- Fix hardcoded credentials in check-migrations.js
- Update IMPLEMENTATION_SUMMARY.md date

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-20 00:08:01 +08:00

434 lines
14 KiB
HTML
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.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>分布式流星监测网络</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: linear-gradient(135deg, #0a0a23 0%, #1a1a3a 50%, #2a2a4a 100%);
color: white;
overflow-x: hidden;
}
.starfield {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
}
.star {
position: absolute;
background: white;
border-radius: 50%;
animation: twinkle 2s infinite alternate;
}
@keyframes twinkle {
0% { opacity: 0.3; transform: scale(1); }
100% { opacity: 1; transform: scale(1.2); }
}
.meteor {
position: absolute;
width: 2px;
height: 100px;
background: linear-gradient(to bottom, #ff6b35, transparent);
animation: meteor-fall 3s linear infinite;
}
@keyframes meteor-fall {
0% {
transform: translateY(-100px) translateX(0);
opacity: 1;
}
100% {
transform: translateY(100vh) translateX(-200px);
opacity: 0;
}
}
.hero {
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
padding: 2rem;
position: relative;
}
.hero-title {
font-size: 4rem;
font-weight: 700;
margin-bottom: 1rem;
background: linear-gradient(45deg, #ffffff, #ff6b35);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
animation: glow 2s ease-in-out infinite alternate;
}
@keyframes glow {
0% { text-shadow: 0 0 20px rgba(255, 107, 53, 0.5); }
100% { text-shadow: 0 0 40px rgba(255, 107, 53, 0.8); }
}
.hero-subtitle {
font-size: 1.5rem;
color: #cccccc;
margin-bottom: 3rem;
max-width: 600px;
}
.split-section {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 4rem;
max-width: 1200px;
margin: 4rem auto;
padding: 0 2rem;
}
.science-visual {
background: rgba(255, 255, 255, 0.05);
border-radius: 20px;
padding: 2rem;
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.constellation {
width: 100%;
height: 300px;
position: relative;
background: radial-gradient(circle at center, rgba(255, 107, 53, 0.1), transparent);
}
.constellation-dot {
position: absolute;
width: 6px;
height: 6px;
background: #ff6b35;
border-radius: 50%;
box-shadow: 0 0 15px #ff6b35;
}
.constellation-line {
position: absolute;
height: 1px;
background: linear-gradient(to right, #ff6b35, transparent);
transform-origin: left;
}
.value-prop {
display: flex;
flex-direction: column;
justify-content: center;
}
.value-prop h2 {
font-size: 2.5rem;
margin-bottom: 1.5rem;
color: #ff6b35;
}
.value-prop p {
font-size: 1.2rem;
line-height: 1.6;
color: #cccccc;
margin-bottom: 2rem;
}
.feature-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
max-width: 1200px;
margin: 4rem auto;
padding: 0 2rem;
}
.feature-card {
background: rgba(255, 255, 255, 0.05);
border-radius: 20px;
padding: 2rem;
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.1);
transition: all 0.3s ease;
cursor: pointer;
}
.feature-card:hover {
transform: translateY(-10px);
box-shadow: 0 20px 40px rgba(255, 107, 53, 0.2);
border-color: #ff6b35;
}
.feature-icon {
width: 60px;
height: 60px;
background: linear-gradient(45deg, #ff6b35, #ff8c42);
border-radius: 15px;
margin-bottom: 1.5rem;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.5rem;
}
.feature-card h3 {
font-size: 1.5rem;
margin-bottom: 1rem;
color: #ffffff;
}
.feature-card p {
color: #cccccc;
line-height: 1.6;
}
.cta-section {
text-align: center;
padding: 4rem 2rem;
max-width: 800px;
margin: 0 auto;
}
.cta-buttons {
display: flex;
gap: 1rem;
justify-content: center;
flex-wrap: wrap;
}
.btn {
padding: 1rem 2rem;
border-radius: 50px;
font-size: 1.1rem;
font-weight: 600;
text-decoration: none;
transition: all 0.3s ease;
border: none;
cursor: pointer;
}
.btn-primary {
background: linear-gradient(45deg, #ff6b35, #ff8c42);
color: white;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 10px 30px rgba(255, 107, 53, 0.4);
}
.btn-secondary {
background: transparent;
color: #ff6b35;
border: 2px solid #ff6b35;
}
.btn-secondary:hover {
background: #ff6b35;
color: white;
}
@media (max-width: 768px) {
.hero-title {
font-size: 2.5rem;
}
.split-section {
grid-template-columns: 1fr;
gap: 2rem;
}
.cta-buttons {
flex-direction: column;
align-items: center;
}
}
</style>
</head>
<body>
<div class="starfield" id="starfield"></div>
<main>
<section class="hero">
<h1 class="hero-title">分布式流星监测网络</h1>
<p class="hero-subtitle">
连接全球观测者,记录天空中每一道流星的轨迹,为科学研究提供珍贵数据
</p>
</section>
<section class="split-section">
<div class="science-visual">
<div class="constellation" id="constellation">
<!-- 星座连线将通过JavaScript生成 -->
</div>
<h3 style="text-align: center; margin-top: 1rem; color: #ff6b35;">实时监测网络</h3>
</div>
<div class="value-prop">
<h2>科学价值</h2>
<p>
通过分布式监测网络,我们能够精确追踪流星轨迹,分析其起源、速度和成分。
每一次观测都为天体物理学研究贡献宝贵数据。
</p>
<p>
加入我们的网络,成为公民科学家,让您的观测为人类对宇宙的理解做出贡献。
</p>
</div>
</section>
<section class="feature-cards">
<div class="feature-card">
<div class="feature-icon">🛰️</div>
<h3>设备网络</h3>
<p>分布在全球的高精度监测设备24小时不间断捕捉流星事件构建完整的观测网络。</p>
</div>
<div class="feature-card">
<div class="feature-icon">📸</div>
<h3>事件画廊</h3>
<p>精彩的流星照片和视频集合,每一帧都记录着宇宙的壮丽瞬间,见证天空的奇迹。</p>
</div>
<div class="feature-card">
<div class="feature-icon">📊</div>
<h3>研究数据</h3>
<p>开放的科学数据平台,为天文学家和研究人员提供准确、详细的流星观测数据。</p>
</div>
</section>
<section class="cta-section">
<h2 style="font-size: 2.5rem; margin-bottom: 1.5rem; color: #ff6b35;">
开始您的星空探索之旅
</h2>
<p style="font-size: 1.2rem; color: #cccccc; margin-bottom: 2rem;">
注册账户,访问实时数据,加入全球观测者社区
</p>
<div class="cta-buttons">
<a href="#" class="btn btn-primary">立即注册</a>
<a href="#" class="btn btn-secondary">了解更多</a>
</div>
</section>
</main>
<script>
// 生成星空背景
function createStarfield() {
const starfield = document.getElementById('starfield');
const numStars = 100;
for (let i = 0; i < numStars; i++) {
const star = document.createElement('div');
star.className = 'star';
star.style.left = Math.random() * 100 + '%';
star.style.top = Math.random() * 100 + '%';
star.style.width = Math.random() * 3 + 1 + 'px';
star.style.height = star.style.width;
star.style.animationDelay = Math.random() * 2 + 's';
starfield.appendChild(star);
}
// 添加流星
setInterval(() => {
const meteor = document.createElement('div');
meteor.className = 'meteor';
meteor.style.left = Math.random() * 100 + '%';
meteor.style.animationDuration = (Math.random() * 2 + 2) + 's';
starfield.appendChild(meteor);
setTimeout(() => {
meteor.remove();
}, 5000);
}, 3000);
}
// 生成星座图案
function createConstellation() {
const constellation = document.getElementById('constellation');
const dots = [
{x: 20, y: 30}, {x: 40, y: 20}, {x: 60, y: 40},
{x: 30, y: 60}, {x: 70, y: 50}, {x: 50, y: 80},
{x: 80, y: 70}, {x: 15, y: 75}, {x: 85, y: 25}
];
// 创建星点
dots.forEach((dot, index) => {
const dotEl = document.createElement('div');
dotEl.className = 'constellation-dot';
dotEl.style.left = dot.x + '%';
dotEl.style.top = dot.y + '%';
dotEl.style.animationDelay = index * 0.2 + 's';
constellation.appendChild(dotEl);
});
// 创建连线
const connections = [
[0, 1], [1, 2], [2, 4], [4, 6], [3, 5], [5, 7], [0, 3]
];
connections.forEach(([start, end]) => {
const line = document.createElement('div');
line.className = 'constellation-line';
const startDot = dots[start];
const endDot = dots[end];
const dx = endDot.x - startDot.x;
const dy = endDot.y - startDot.y;
const length = Math.sqrt(dx * dx + dy * dy);
const angle = Math.atan2(dy, dx) * 180 / Math.PI;
line.style.left = startDot.x + '%';
line.style.top = startDot.y + '%';
line.style.width = length + '%';
line.style.transform = `rotate(${angle}deg)`;
constellation.appendChild(line);
});
}
// 平滑滚动动画
function handleScrollAnimations() {
const cards = document.querySelectorAll('.feature-card');
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.opacity = '1';
entry.target.style.transform = 'translateY(0)';
}
});
}, { threshold: 0.1 });
cards.forEach(card => {
card.style.opacity = '0';
card.style.transform = 'translateY(50px)';
card.style.transition = 'all 0.6s ease';
observer.observe(card);
});
}
// 初始化
document.addEventListener('DOMContentLoaded', () => {
createStarfield();
createConstellation();
handleScrollAnimations();
});
</script>
</body>
</html>