commit 4983f342020517b874022fa1903572ec5203ac3d Author: Nelson <1475262689@qq.com> Date: Sun Apr 26 13:47:21 2026 +0800 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3f331a8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +# OS +.DS_Store +Thumbs.db + +# IDE +.vscode/ +.idea/ + +# Superpowers (internal tooling) +.superpowers/ + +# Dependencies +node_modules/ + +# Environment +.env +.env.local diff --git a/assets/course-card.jpg b/assets/course-card.jpg new file mode 100644 index 0000000..317cd2a Binary files /dev/null and b/assets/course-card.jpg differ diff --git a/assets/icons/awakener.png b/assets/icons/awakener.png new file mode 100644 index 0000000..63f4487 Binary files /dev/null and b/assets/icons/awakener.png differ diff --git a/assets/icons/awakener.svg b/assets/icons/awakener.svg new file mode 100644 index 0000000..a9623b5 --- /dev/null +++ b/assets/icons/awakener.svg @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/assets/icons/guardian.png b/assets/icons/guardian.png new file mode 100644 index 0000000..8d573bf Binary files /dev/null and b/assets/icons/guardian.png differ diff --git a/assets/icons/guardian.svg b/assets/icons/guardian.svg new file mode 100644 index 0000000..e5c27f0 --- /dev/null +++ b/assets/icons/guardian.svg @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/assets/icons/habitual.png b/assets/icons/habitual.png new file mode 100644 index 0000000..9a266ec Binary files /dev/null and b/assets/icons/habitual.png differ diff --git a/assets/icons/habitual.svg b/assets/icons/habitual.svg new file mode 100644 index 0000000..8679bba --- /dev/null +++ b/assets/icons/habitual.svg @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/assets/icons/icebreaker.png b/assets/icons/icebreaker.png new file mode 100644 index 0000000..e4188aa Binary files /dev/null and b/assets/icons/icebreaker.png differ diff --git a/assets/icons/icebreaker.svg b/assets/icons/icebreaker.svg new file mode 100644 index 0000000..c433134 --- /dev/null +++ b/assets/icons/icebreaker.svg @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/assets/icons/pauser.png b/assets/icons/pauser.png new file mode 100644 index 0000000..f82a716 Binary files /dev/null and b/assets/icons/pauser.png differ diff --git a/assets/icons/pauser.svg b/assets/icons/pauser.svg new file mode 100644 index 0000000..6b12549 --- /dev/null +++ b/assets/icons/pauser.svg @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/assets/icons/relational.png b/assets/icons/relational.png new file mode 100644 index 0000000..1924d96 Binary files /dev/null and b/assets/icons/relational.png differ diff --git a/assets/icons/relational.svg b/assets/icons/relational.svg new file mode 100644 index 0000000..a41da42 --- /dev/null +++ b/assets/icons/relational.svg @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/assets/icons/seeker.png b/assets/icons/seeker.png new file mode 100644 index 0000000..7022e19 Binary files /dev/null and b/assets/icons/seeker.png differ diff --git a/assets/icons/seeker.svg b/assets/icons/seeker.svg new file mode 100644 index 0000000..5bdc345 --- /dev/null +++ b/assets/icons/seeker.svg @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/assets/icons/sleeper.png b/assets/icons/sleeper.png new file mode 100644 index 0000000..a12c002 Binary files /dev/null and b/assets/icons/sleeper.png differ diff --git a/assets/icons/sleeper.svg b/assets/icons/sleeper.svg new file mode 100644 index 0000000..4d19ac6 --- /dev/null +++ b/assets/icons/sleeper.svg @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/assets/placeholder-qrcode.svg b/assets/placeholder-qrcode.svg new file mode 100644 index 0000000..97e088c --- /dev/null +++ b/assets/placeholder-qrcode.svg @@ -0,0 +1,64 @@ + \ No newline at end of file diff --git a/assets/qrcode-site.png b/assets/qrcode-site.png new file mode 100644 index 0000000..f2efb2c Binary files /dev/null and b/assets/qrcode-site.png differ diff --git a/css/style.css b/css/style.css new file mode 100644 index 0000000..b7efd82 --- /dev/null +++ b/css/style.css @@ -0,0 +1,1120 @@ +/* ======================================== + 传承基因测试 - 样式表 V2 + 设计方向:深邃、精致、有仪式感 + ======================================== */ + +/* ---------- CSS 变量 ---------- */ +:root { + --bg-deep: #0f0a1e; + --bg-mid: #1a1232; + --purple-1: #7c5cbf; + --purple-2: #a78bda; + --purple-3: #c4b5fd; + --gold: #f0c27a; + --gold-light: #fceabb; + --white: #ffffff; + --white-80: rgba(255,255,255,0.8); + --white-60: rgba(255,255,255,0.6); + --white-40: rgba(255,255,255,0.4); + --white-20: rgba(255,255,255,0.2); + --white-10: rgba(255,255,255,0.1); + --white-06: rgba(255,255,255,0.06); + --glass: rgba(255,255,255,0.07); + --glass-border: rgba(255,255,255,0.12); + --serif: 'Noto Serif SC', 'Songti SC', 'SimSun', serif; + --sans: 'Noto Sans SC', -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Microsoft YaHei', sans-serif; + --radius-sm: 10px; + --radius-md: 16px; + --radius-lg: 24px; + --radius-xl: 32px; +} + +/* ---------- 基础重置 ---------- */ +*, *::before, *::after { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html { + font-size: 16px; + -webkit-text-size-adjust: 100%; +} + +body { + font-family: var(--sans); + color: var(--white); + min-height: 100vh; + min-height: 100dvh; + overflow-x: hidden; + background: var(--bg-deep); +} + +/* ---------- 噪点纹理叠加 ---------- */ +.bg-noise { + position: fixed; + inset: 0; + pointer-events: none; + z-index: 0; + opacity: 0.03; + background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E"); + background-size: 256px 256px; +} + +/* ---------- 页面切换 ---------- */ +.page { + display: none; + min-height: 100vh; + min-height: 100dvh; + position: relative; + z-index: 1; +} + +.page.active { + display: flex; + flex-direction: column; + animation: pageIn 0.5s cubic-bezier(0.22, 1, 0.36, 1); +} + +@keyframes pageIn { + from { opacity: 0; transform: translateY(20px); } + to { opacity: 1; transform: translateY(0); } +} + +/* ---------- 按钮通用 ---------- */ +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 14px 32px; + border: none; + border-radius: var(--radius-lg); + font-family: var(--sans); + font-size: 1rem; + font-weight: 600; + cursor: pointer; + transition: all 0.3s cubic-bezier(0.22, 1, 0.36, 1); + text-decoration: none; + text-align: center; + -webkit-tap-highlight-color: transparent; + position: relative; + overflow: hidden; +} + +.btn:active { + transform: scale(0.97); +} + +/* ======================================== + 首页 + ======================================== */ +#home { + justify-content: center; + align-items: center; + text-align: center; + padding: 24px; + overflow: hidden; + background: radial-gradient(ellipse at 50% 30%, rgba(124,92,191,0.25) 0%, transparent 60%), + radial-gradient(ellipse at 80% 80%, rgba(167,139,218,0.1) 0%, transparent 50%), + var(--bg-deep); +} + +/* 装饰 */ +.deco-circle { + position: absolute; + border-radius: 50%; + pointer-events: none; +} + +.deco-1 { + width: 400px; + height: 400px; + top: -150px; + right: -100px; + background: radial-gradient(circle, rgba(124,92,191,0.15) 0%, transparent 70%); +} + +.deco-2 { + width: 300px; + height: 300px; + bottom: -50px; + left: -100px; + background: radial-gradient(circle, rgba(240,194,122,0.08) 0%, transparent 70%); +} + +.deco-3 { + width: 200px; + height: 200px; + top: 50%; + left: 60%; + background: radial-gradient(circle, rgba(167,139,218,0.1) 0%, transparent 70%); +} + +.deco-glow { + position: absolute; + width: 500px; + height: 500px; + top: 50%; + left: 50%; + transform: translate(-50%, -60%); + background: radial-gradient(circle, rgba(124,92,191,0.12) 0%, transparent 60%); + pointer-events: none; + animation: glowPulse 6s ease-in-out infinite; +} + +@keyframes glowPulse { + 0%, 100% { opacity: 0.6; transform: translate(-50%, -60%) scale(1); } + 50% { opacity: 1; transform: translate(-50%, -60%) scale(1.1); } +} + +.home-content { + position: relative; + z-index: 1; +} + +.home-badge { + font-family: var(--sans); + font-size: 0.7rem; + font-weight: 600; + letter-spacing: 4px; + color: var(--gold); + opacity: 0.7; + margin-bottom: 24px; + text-transform: uppercase; +} + +.home-title { + font-family: var(--serif); + font-size: 2.4rem; + font-weight: 900; + line-height: 1.35; + margin-bottom: 16px; + letter-spacing: 2px; + background: linear-gradient(135deg, var(--white) 0%, var(--purple-3) 50%, var(--gold-light) 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.home-subtitle { + font-size: 1rem; + color: var(--white-60); + margin-bottom: 48px; + line-height: 1.6; + font-weight: 300; +} + +.btn-start { + background: linear-gradient(135deg, var(--purple-1) 0%, #9b6dd7 100%); + color: var(--white); + padding: 18px 48px; + font-size: 1.1rem; + border-radius: 60px; + box-shadow: 0 8px 32px rgba(124,92,191,0.4), 0 0 0 1px rgba(255,255,255,0.1) inset; + letter-spacing: 1px; +} + +.btn-start:hover { + box-shadow: 0 12px 40px rgba(124,92,191,0.5), 0 0 0 1px rgba(255,255,255,0.15) inset; + transform: translateY(-2px); +} + +.home-footer { + position: absolute; + bottom: 24px; + left: 0; + right: 0; + text-align: center; + z-index: 1; +} + +.privacy-link { + color: var(--white-40); + text-decoration: none; + font-size: 0.8rem; + cursor: pointer; + transition: color 0.2s; + border-bottom: 1px solid transparent; +} + +.privacy-link:hover { + color: var(--white-60); + border-bottom-color: var(--white-40); +} + +.disclaimer { + font-size: 0.7rem; + color: var(--white-20); + margin-top: 8px; + line-height: 1.6; + padding: 0 20px; +} + +/* ======================================== + 答题页 + ======================================== */ +#quiz { + padding: 0; + background: radial-gradient(ellipse at 50% 0%, rgba(124,92,191,0.15) 0%, transparent 50%), + var(--bg-deep); +} + +/* 顶部栏 */ +.quiz-topbar { + display: flex; + align-items: center; + gap: 12px; + padding: 16px 20px; + position: sticky; + top: 0; + z-index: 10; + background: rgba(15,10,30,0.8); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + border-bottom: 1px solid var(--glass-border); +} + +.btn-back { + width: 40px; + height: 40px; + border-radius: 50%; + border: 1px solid var(--glass-border); + background: var(--glass); + color: var(--white-80); + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all 0.2s; + flex-shrink: 0; + padding: 0; + font-size: 0; +} + +.btn-back:hover { + background: var(--white-10); + border-color: var(--white-20); +} + +.btn-back:active { + transform: scale(0.92); +} + +/* 进度条 - 高对比度设计 */ +.progress-area { + flex: 1; + display: flex; + align-items: center; + gap: 12px; +} + +.progress-track { + flex: 1; + height: 6px; + background: rgba(255,255,255,0.12); + border-radius: 3px; + overflow: hidden; + position: relative; +} + +.progress-fill { + height: 100%; + width: 0%; + border-radius: 3px; + background: linear-gradient(90deg, var(--purple-1), var(--gold)); + transition: width 0.5s cubic-bezier(0.22, 1, 0.36, 1); + position: relative; + box-shadow: 0 0 12px rgba(240,194,122,0.4); +} + +.progress-fill::after { + content: ''; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); + width: 12px; + height: 12px; + border-radius: 50%; + background: var(--gold); + box-shadow: 0 0 8px rgba(240,194,122,0.6), 0 0 20px rgba(240,194,122,0.3); + opacity: 0; + transition: opacity 0.3s; +} + +.progress-fill[style*="width: 0"]::after { + opacity: 0; +} + +.progress-fill:not([style*="width: 0"])::after { + opacity: 1; +} + +.progress-label { + font-size: 0.8rem; + font-weight: 600; + color: var(--white-60); + min-width: 42px; + text-align: right; + font-variant-numeric: tabular-nums; +} + +/* 题目区域 */ +.quiz-body { + flex: 1; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding: 32px 24px 40px; + overflow: hidden; +} + +/* 题目切换动画容器 */ +.question-wrapper { + width: 100%; + max-width: 560px; + overflow: hidden; + margin-bottom: 40px; +} + +.question-inner { + transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1), + opacity 0.4s cubic-bezier(0.22, 1, 0.36, 1); +} + +.question-inner.slide-out-left { + transform: translateX(-60px); + opacity: 0; +} + +.question-inner.slide-in-right { + transform: translateX(60px); + opacity: 0; +} + +.question-inner.slide-out-right { + transform: translateX(60px); + opacity: 0; +} + +.question-inner.slide-in-left { + transform: translateX(-60px); + opacity: 0; +} + +.question-number { + display: inline-block; + font-family: var(--sans); + font-size: 0.75rem; + font-weight: 700; + letter-spacing: 2px; + color: var(--gold); + background: rgba(240,194,122,0.1); + border: 1px solid rgba(240,194,122,0.2); + padding: 4px 14px; + border-radius: 20px; + margin-bottom: 20px; +} + +.quiz-question { + font-family: var(--serif); + font-size: 1.25rem; + line-height: 1.8; + text-align: center; + color: var(--white); + font-weight: 600; + min-height: 60px; + display: flex; + align-items: center; + justify-content: center; +} + +/* 量表按钮 - 全新设计 */ +.scale-buttons { + display: flex; + flex-direction: column; + gap: 10px; + width: 100%; + max-width: 400px; +} + +.btn-scale { + display: flex; + align-items: center; + gap: 14px; + width: 100%; + padding: 16px 20px; + border: 1.5px solid var(--glass-border); + border-radius: var(--radius-md); + background: var(--glass); + color: var(--white-80); + font-family: var(--sans); + font-size: 0.95rem; + font-weight: 500; + cursor: pointer; + transition: all 0.25s cubic-bezier(0.22, 1, 0.36, 1); + text-align: left; + -webkit-tap-highlight-color: transparent; + min-height: 56px; + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); + /* 选项弹入动画 */ + opacity: 0; + transform: translateY(16px); + animation: scaleIn 0.4s cubic-bezier(0.22, 1, 0.36, 1) forwards; +} + +.btn-scale:nth-child(1) { animation-delay: 0.05s; } +.btn-scale:nth-child(2) { animation-delay: 0.1s; } +.btn-scale:nth-child(3) { animation-delay: 0.15s; } +.btn-scale:nth-child(4) { animation-delay: 0.2s; } +.btn-scale:nth-child(5) { animation-delay: 0.25s; } + +@keyframes scaleIn { + from { opacity: 0; transform: translateY(16px); } + to { opacity: 1; transform: translateY(0); } +} + +.btn-scale:hover { + background: rgba(255,255,255,0.12); + border-color: var(--white-20); + transform: translateY(-1px); +} + +.btn-scale:active { + transform: scale(0.98); +} + +.btn-scale.selected { + background: linear-gradient(135deg, rgba(124,92,191,0.4) 0%, rgba(167,139,218,0.3) 100%); + border-color: var(--purple-2); + box-shadow: 0 4px 20px rgba(124,92,191,0.3), inset 0 0 0 1px rgba(255,255,255,0.1); + color: var(--white); + font-weight: 600; +} + +.scale-emoji { + font-size: 1.3rem; + flex-shrink: 0; + width: 28px; + text-align: center; +} + +.scale-text { + flex: 1; +} + +.quiz-disclaimer { + font-size: 0.7rem; + color: var(--white-20); + margin-top: 32px; + text-align: center; + line-height: 1.5; + padding: 0 20px; +} + +/* ======================================== + 计算页 + ======================================== */ +#loading { + justify-content: center; + align-items: center; + background: var(--bg-deep); +} + +.loading-content { + display: flex; + flex-direction: column; + align-items: center; + gap: 40px; +} + +/* DNA 动画 */ +.loading-dna { + position: relative; + width: 60px; + height: 120px; +} + +.dna-strand { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + justify-content: space-around; + align-items: center; + animation: dnaRotate 3s ease-in-out infinite; +} + +.dna-strand span { + width: 10px; + height: 10px; + border-radius: 50%; + background: var(--purple-2); + box-shadow: 0 0 12px rgba(167,139,218,0.6); +} + +.dna-strand-2 { + animation-delay: -1.5s; +} + +.dna-strand-2 span { + background: var(--gold); + box-shadow: 0 0 12px rgba(240,194,122,0.6); +} + +@keyframes dnaRotate { + 0%, 100% { transform: translateX(0); } + 25% { transform: translateX(20px); } + 75% { transform: translateX(-20px); } +} + +.loading-text { + font-family: var(--serif); + font-size: 1.1rem; + color: var(--white-60); + font-weight: 400; +} + +.loading-dots::after { + content: ''; + animation: dots 1.5s steps(4, end) infinite; +} + +@keyframes dots { + 0% { content: ''; } + 25% { content: '.'; } + 50% { content: '..'; } + 75% { content: '...'; } +} + +/* ======================================== + 结果页 + ======================================== */ +#result { + padding: 0; + background: radial-gradient(ellipse at 50% 0%, rgba(124,92,191,0.2) 0%, transparent 50%), + radial-gradient(ellipse at 50% 100%, rgba(240,194,122,0.08) 0%, transparent 40%), + var(--bg-deep); +} + +.result-scroll { + flex: 1; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + padding: 0 20px 60px; + max-width: 560px; + margin: 0 auto; + width: 100%; +} + +.result-scroll::-webkit-scrollbar { display: none; } +.result-scroll { -ms-overflow-style: none; scrollbar-width: none; } + +/* 类型展示区 - Hero设计 */ +.result-hero { + text-align: center; + padding: 48px 0 32px; + position: relative; +} + +.result-icon-ring { + width: 140px; + height: 140px; + margin: 0 auto 24px; + border-radius: 50%; + background: linear-gradient(135deg, rgba(124,92,191,0.3) 0%, rgba(240,194,122,0.2) 100%); + border: 2px solid var(--glass-border); + display: flex; + align-items: center; + justify-content: center; + position: relative; + overflow: hidden; + animation: iconFloat 4s ease-in-out infinite; + box-shadow: 0 0 40px rgba(124,92,191,0.2), 0 0 80px rgba(124,92,191,0.1); +} + +.result-icon-ring::before { + content: ''; + position: absolute; + inset: -6px; + border-radius: 50%; + border: 1px solid rgba(240,194,122,0.2); + animation: ringPulse 3s ease-in-out infinite; +} + +@keyframes iconFloat { + 0%, 100% { transform: translateY(0); } + 50% { transform: translateY(-8px); } +} + +@keyframes ringPulse { + 0%, 100% { opacity: 0.3; transform: scale(1); } + 50% { opacity: 0.8; transform: scale(1.05); } +} + +.result-icon { + width: 210px; + height: 210px; + filter: drop-shadow(0 2px 8px rgba(0,0,0,0.3)); +} + +.result-label { + font-size: 0.8rem; + color: var(--white-40); + letter-spacing: 3px; + text-transform: uppercase; + margin-bottom: 8px; + font-weight: 500; +} + +.result-name { + font-family: var(--serif); + font-size: 2.6rem; + font-weight: 900; + margin-bottom: 12px; + background: linear-gradient(135deg, var(--white) 20%, var(--gold-light) 80%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + letter-spacing: 4px; +} + +.result-desc { + font-size: 0.95rem; + color: var(--white-60); + line-height: 1.6; + font-weight: 300; +} + +/* 结果卡片 */ +.result-card { + background: var(--glass); + border: 1px solid var(--glass-border); + border-radius: var(--radius-lg); + padding: 24px 20px; + margin-bottom: 16px; + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); +} + +.card-title { + font-size: 0.9rem; + font-weight: 600; + color: var(--white-80); + margin-bottom: 20px; + display: flex; + align-items: center; + gap: 8px; + letter-spacing: 1px; +} + +.card-title svg { + color: var(--gold); + flex-shrink: 0; +} + +/* 雷达图 */ +#radar-canvas { + display: block; + margin: 0 auto; + max-width: 100%; +} + +/* 分析文字 */ +.result-analysis { + font-size: 0.92rem; + line-height: 2; + color: var(--white-80); + text-align: justify; +} + +/* 课程推荐 */ +.recommend-card { + text-align: center; + border-color: rgba(240,194,122,0.15); + background: linear-gradient(135deg, rgba(240,194,122,0.05) 0%, var(--glass) 100%); +} + +.result-recommend { + font-size: 0.92rem; + line-height: 1.8; + color: var(--white-80); + margin-bottom: 24px; +} + +.course-card-wrapper { + display: flex; + flex-direction: column; + align-items: center; +} + +.course-card-img { + width: 100%; + max-width: 320px; + height: auto; + display: block; + border-radius: var(--radius-md); + box-shadow: 0 8px 32px rgba(0,0,0,0.3), 0 0 0 1px rgba(255,255,255,0.08); + cursor: pointer; + transition: transform 0.3s cubic-bezier(0.22, 1, 0.36, 1), box-shadow 0.3s ease; + -webkit-user-select: none; + user-select: none; + -webkit-touch-callout: none; +} + +.course-card-img:active { + transform: scale(0.98); +} + +.course-card-hint { + font-size: 0.8rem; + color: var(--white-40); + margin-top: 16px; + letter-spacing: 1px; +} + +/* 课程大图弹窗 */ +.course-modal-img { + max-width: 92vw; + max-height: 85vh; + object-fit: contain; + border-radius: var(--radius-md); + box-shadow: 0 16px 64px rgba(0,0,0,0.6); + -webkit-user-select: none; + user-select: none; + -webkit-touch-callout: default; +} + +/* 操作按钮 */ +.result-actions { + display: flex; + flex-direction: column; + gap: 12px; + margin: 32px 0 20px; +} + +.btn-share { + background: linear-gradient(135deg, var(--purple-1) 0%, #9b6dd7 100%); + color: var(--white); + padding: 16px 32px; + font-size: 1rem; + border-radius: 60px; + box-shadow: 0 8px 24px rgba(124,92,191,0.3); +} + +.btn-share:hover { + box-shadow: 0 12px 32px rgba(124,92,191,0.4); + transform: translateY(-2px); +} + +.btn-retry { + background: transparent; + color: var(--white-40); + border: 1.5px solid var(--glass-border); + padding: 14px 32px; + font-size: 0.9rem; + border-radius: 60px; +} + +.btn-retry:hover { + color: var(--white-60); + border-color: var(--white-20); + background: var(--glass); +} + +.result-disclaimer { + text-align: center; +} + +/* ======================================== + 海报 + ======================================== */ +.poster-container { + display: none; + position: fixed; + inset: 0; + z-index: 1000; + background: rgba(0,0,0,0.92); + overflow: hidden; +} + +.poster-container.active { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.poster-content { + width: 750px; + height: 1334px; + background: linear-gradient(160deg, #1a1232 0%, #0f0a1e 40%, #1a1232 100%); + position: fixed; + left: -9999px; + top: 0; + overflow: hidden; + border-radius: var(--radius-md); +} + +.poster-header { + text-align: center; + padding: 60px 40px 30px; +} + +.poster-brand { + font-family: var(--sans); + font-size: 16px; + font-weight: 600; + letter-spacing: 6px; + color: var(--gold); + opacity: 0.6; + margin-bottom: 30px; + text-transform: uppercase; +} + +.poster-icon { + width: 180px; + height: 180px; + margin-bottom: 24px; +} + +.poster-name { + font-family: var(--serif); + font-size: 52px; + font-weight: 900; + margin-bottom: 16px; + color: var(--white); + letter-spacing: 6px; +} + +.poster-desc { + font-size: 24px; + color: var(--white-60); + line-height: 1.6; + margin-bottom: 24px; +} + +.poster-quote { + font-family: var(--serif); + font-size: 22px; + color: var(--gold); + line-height: 1.6; + letter-spacing: 2px; + opacity: 0.8; +} + +.poster-radar-wrap { + display: flex; + justify-content: center; + padding: 20px 0; +} + +#poster-radar-canvas { + display: block; +} + +.poster-footer { + position: absolute; + bottom: 0; + left: 0; + right: 0; + text-align: center; + padding: 40px 40px 80px; + background: linear-gradient(to top, rgba(15,10,30,0.95), transparent); +} + +.poster-slogan { + font-family: var(--serif); + font-size: 28px; + color: var(--white-80); + margin-bottom: 8px; + font-weight: 600; + letter-spacing: 2px; +} + +.poster-cta { + font-family: var(--serif); + font-size: 32px; + color: var(--white); + font-weight: 700; + letter-spacing: 3px; + margin-bottom: 24px; +} + +.poster-qrcode { + width: 160px; + height: 160px; + background: var(--white); + border-radius: var(--radius-sm); + padding: 10px; + margin: 0 auto; +} + +.poster-preview { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 90%; + max-width: 400px; +} + +.poster-preview-title { + color: var(--white-80); + font-size: 1rem; + margin-bottom: 16px; + font-weight: 500; +} + +.poster-image { + max-width: 100%; + max-height: 70vh; + border-radius: var(--radius-md); + box-shadow: 0 12px 40px rgba(0,0,0,0.5); + object-fit: contain; +} + +.poster-preview .btn { + margin-top: 24px; + margin-bottom: max(20px, env(safe-area-inset-bottom)); +} + +/* ======================================== + 隐私弹窗 + ======================================== */ +.modal-overlay { + position: fixed; + inset: 0; + background: rgba(0,0,0,0.7); + backdrop-filter: blur(8px); + -webkit-backdrop-filter: blur(8px); + z-index: 2000; + display: flex; + justify-content: center; + align-items: center; + padding: 24px; + animation: modalIn 0.3s cubic-bezier(0.22, 1, 0.36, 1); +} + +@keyframes modalIn { + from { opacity: 0; } + to { opacity: 1; } +} + +.modal-card { + background: linear-gradient(135deg, #1e1638 0%, #15102a 100%); + color: var(--white); + border: 1px solid var(--glass-border); + border-radius: var(--radius-xl); + padding: 36px 28px; + max-width: 420px; + width: 100%; + max-height: 80vh; + overflow-y: auto; + animation: cardSlideUp 0.4s cubic-bezier(0.22, 1, 0.36, 1); +} + +@keyframes cardSlideUp { + from { transform: translateY(30px); opacity: 0; } + to { transform: translateY(0); opacity: 1; } +} + +.modal-title { + font-family: var(--serif); + font-size: 1.3rem; + font-weight: 700; + color: var(--gold); + margin-bottom: 24px; + text-align: center; + letter-spacing: 2px; +} + +.modal-body p { + font-size: 0.88rem; + line-height: 1.8; + margin-bottom: 14px; + color: var(--white-60); +} + +.modal-body strong { + color: var(--purple-2); +} + +.btn-modal-confirm { + margin-top: 24px; + background: linear-gradient(135deg, var(--purple-1), #9b6dd7); + color: var(--white); + width: 100%; + padding: 14px; + border-radius: 60px; + box-shadow: 0 4px 16px rgba(124,92,191,0.3); +} + +/* ======================================== + 响应式 + ======================================== */ + +@media (min-width: 360px) { + .home-title { font-size: 2.6rem; } + .quiz-question { font-size: 1.3rem; } +} + +@media (min-width: 480px) { + .home-title { font-size: 3rem; } + .home-subtitle { font-size: 1.1rem; } + .quiz-question { font-size: 1.4rem; } + .result-name { font-size: 3rem; } + .result-icon-ring { width: 160px; height: 160px; } + .result-icon { width: 240px; height: 240px; } +} + +@media (min-width: 768px) { + .home-title { font-size: 3.6rem; } + + .scale-buttons { + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + gap: 10px; + } + + .btn-scale { + width: auto; + min-width: 160px; + flex-direction: column; + align-items: center; + gap: 6px; + padding: 14px 18px; + } + + .scale-emoji { + font-size: 1.5rem; + } + + .result-scroll { padding: 0 40px 80px; } + .result-card { padding: 28px 28px; } + + .result-actions { + flex-direction: row; + justify-content: center; + max-width: 400px; + margin: 32px auto 20px; + } + + .result-actions .btn { margin: 0; } +} + +@media (min-width: 1024px) { + .home-title { font-size: 4rem; } + .quiz-question { font-size: 1.5rem; } + .result-name { font-size: 3.4rem; } + .result-icon-ring { width: 180px; height: 180px; } + .result-icon { width: 270px; height: 270px; } + .result-scroll { padding: 0 60px 100px; } +} \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..6dc8005 --- /dev/null +++ b/index.html @@ -0,0 +1,218 @@ + + +
+ + + +3 分钟测试,发现你的家族传承类型
+ +本测试仅供自我探索参考,不构成专业心理评估或诊断
+正在解码你的传承基因
+你的传承类型是
+ + +
+ 👆 点击查看大图 · 长按识别二维码
+本测试仅供自我探索参考,不构成专业心理评估或诊断
+传承基因测试
+