This commit is contained in:
2025-12-22 18:54:46 +08:00
parent c7033b6995
commit c6b052bffd
2 changed files with 611 additions and 106 deletions

View File

@@ -487,6 +487,25 @@
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
transition: all 0.3s ease;
backdrop-filter: blur(10px);
position: relative;
overflow: hidden;
}
.pain-point::before {
content: "";
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 60%;
background: radial-gradient(
ellipse at center bottom,
rgba(250, 227, 7, 0.15) 0%,
rgba(250, 227, 7, 0.08) 40%,
transparent 70%
);
pointer-events: none;
border-radius: 0 0 16px 16px;
}
.pain-point:hover {
@@ -496,56 +515,121 @@
background: rgba(255, 255, 255, 0.05);
}
.pain-point:hover::before {
background: radial-gradient(
ellipse at center bottom,
rgba(250, 227, 7, 0.25) 0%,
rgba(250, 227, 7, 0.12) 40%,
transparent 70%
);
}
.pain-point h3 {
font-size: 24px;
font-weight: 600;
margin-bottom: 16px;
color: var(--primary);
position: relative;
z-index: 1;
}
.pain-point p {
font-size: 16px;
line-height: 1.8;
color: rgba(245, 245, 245, 0.78);
position: relative;
z-index: 1;
}
/* 功能卡片网格 */
.features-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 32px;
margin-top: 48px;
/* 功能列表 */
.features-list {
display: flex;
flex-direction: column;
gap: 0;
margin-top: 64px;
max-width: 900px;
margin-left: auto;
margin-right: auto;
border-top: 1px solid rgba(250, 227, 7, 0.2);
}
.feature-card {
padding: 40px 32px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
.feature-item {
display: flex;
align-items: flex-start;
gap: 40px;
padding: 48px 0;
border-bottom: 1px solid rgba(250, 227, 7, 0.2);
transition: all 0.3s ease;
border-top: 4px solid var(--primary);
backdrop-filter: blur(10px);
opacity: 0;
transform: translateX(-30px);
animation: featureItemFadeIn 0.6s ease-out forwards;
}
.feature-card:hover {
transform: translateY(-4px);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
border-color: rgba(250, 227, 7, 0.3);
background: rgba(255, 255, 255, 0.05);
.feature-item:nth-child(1) {
animation-delay: 0.1s;
}
.feature-card h3 {
font-size: 22px;
.feature-item:nth-child(2) {
animation-delay: 0.2s;
}
.feature-item:nth-child(3) {
animation-delay: 0.3s;
border-bottom: none;
}
@keyframes featureItemFadeIn {
from {
opacity: 0;
transform: translateX(-30px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
.feature-item:hover {
padding-left: 20px;
}
.feature-number {
font-size: 48px;
font-weight: 700;
color: var(--primary);
line-height: 1;
flex-shrink: 0;
width: 80px;
text-align: center;
opacity: 0.8;
transition: all 0.3s ease;
}
.feature-item:hover .feature-number {
opacity: 1;
transform: scale(1.1);
}
.feature-content {
flex: 1;
}
.feature-item h3 {
font-size: 28px;
font-weight: 600;
margin-bottom: 16px;
color: #fdfdfd;
color: #ffffff;
transition: color 0.3s ease;
}
.feature-card p {
font-size: 16px;
line-height: 1.8;
color: rgba(245, 245, 245, 0.78);
.feature-item:hover h3 {
color: var(--primary);
}
.feature-item p {
font-size: 18px;
line-height: 1.9;
color: rgba(245, 245, 245, 0.85);
}
/* 场景卡片 */
@@ -554,91 +638,213 @@
flex-direction: column;
gap: 48px;
margin-top: 64px;
align-items: stretch;
}
.scenario-card {
padding: 48px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 20px;
border-radius: 24px;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
transition: all 0.3s ease;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
width: 100%;
max-width: 900px;
margin: 0 auto;
margin: 0 auto;
backdrop-filter: blur(10px);
position: relative;
overflow: hidden;
box-sizing: border-box;
opacity: 0;
transform: translateY(40px);
}
@keyframes scenarioCardFadeIn {
from {
opacity: 0;
transform: translateY(40px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes scenarioFloat {
0%, 100% {
transform: translateY(0);
}
50% {
transform: translateY(-4px);
}
}
.scenario-card:nth-child(1) {
animation: scenarioCardFadeIn 0.8s ease-out 0.1s forwards,
scenarioFloat 6s ease-in-out 1.2s infinite;
}
.scenario-card:nth-child(2) {
animation: scenarioCardFadeIn 0.8s ease-out 0.3s forwards,
scenarioFloat 6s ease-in-out 1.6s infinite;
}
.scenario-card:nth-child(3) {
animation: scenarioCardFadeIn 0.8s ease-out 0.5s forwards,
scenarioFloat 6s ease-in-out 2s infinite;
}
.scenario-card::before {
content: "";
position: absolute;
top: 0;
right: 0;
width: 200px;
height: 200px;
background: radial-gradient(
circle,
rgba(250, 227, 7, 0.15) 0%,
transparent 70%
);
filter: blur(40px);
pointer-events: none;
opacity: 0;
transition: opacity 0.3s ease;
}
.scenario-card:hover::before {
opacity: 1;
}
.scenario-card:hover {
transform: translateY(-6px);
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.4);
border-color: rgba(250, 227, 7, 0.3);
background: rgba(255, 255, 255, 0.05);
transform: translateY(-12px) scale(1.02);
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5), 0 0 60px rgba(250, 227, 7, 0.2);
border-color: rgba(250, 227, 7, 0.5);
background: linear-gradient(
135deg,
rgba(250, 227, 7, 0.12) 0%,
rgba(255, 255, 255, 0.06) 50%,
rgba(255, 255, 255, 0.04) 100%
);
}
.scenario-card:hover .scenario-label {
transform: scale(1.05);
box-shadow: 0 6px 20px rgba(250, 227, 7, 0.4);
}
.scenario-card:hover h3 {
color: var(--primary);
transition: color 0.3s ease;
}
.scenario-card h3 {
font-size: 28px;
font-weight: 600;
margin-bottom: 12px;
color: #fdfdfd;
margin-bottom: 16px;
color: #ffffff;
position: relative;
z-index: 1;
transition: color 0.3s ease;
}
.scenario-label {
display: inline-block;
padding: 6px 16px;
background: var(--primary);
color: #ffffff;
border-radius: 20px;
padding: 8px 20px;
background: linear-gradient(135deg, var(--primary) 0%, rgba(250, 227, 7, 0.9) 100%);
color: #000000;
border-radius: 24px;
font-size: 14px;
font-weight: 500;
margin-bottom: 24px;
font-weight: 600;
margin-bottom: 28px;
box-shadow: 0 4px 12px rgba(250, 227, 7, 0.3);
position: relative;
z-index: 1;
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.scenario-desc {
font-size: 18px;
line-height: 1.8;
color: rgba(245, 245, 245, 0.78);
line-height: 1.9;
color: rgba(245, 245, 245, 0.85);
position: relative;
z-index: 1;
}
/* 功能列表 */
.functions-list {
display: flex;
flex-direction: column;
gap: 24px;
margin-top: 48px;
max-width: 900px;
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 32px;
margin-top: 64px;
max-width: 1100px;
margin-left: auto;
margin-right: auto;
}
.function-item {
padding: 32px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
padding: 48px 40px;
background: linear-gradient(
135deg,
rgba(0, 0, 0, 0.6) 0%,
rgba(0, 0, 0, 0.8) 50%,
rgba(250, 227, 7, 0.08) 100%
);
border: 1px solid rgba(250, 227, 7, 0.3);
border-radius: 20px;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
transition: all 0.3s ease;
border-left: 4px solid var(--primary);
backdrop-filter: blur(10px);
position: relative;
overflow: hidden;
height: 100%;
display: flex;
flex-direction: column;
box-sizing: border-box;
}
.function-item::before {
content: "";
position: absolute;
bottom: 0;
right: 0;
width: 60%;
height: 60%;
background: radial-gradient(
ellipse at bottom right,
rgba(250, 227, 7, 0.15) 0%,
rgba(250, 227, 7, 0.05) 40%,
transparent 70%
);
pointer-events: none;
transition: opacity 0.3s ease;
}
.function-item:hover::before {
opacity: 0.8;
}
.function-item:hover {
transform: translateX(8px);
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.4);
border-color: rgba(250, 227, 7, 0.3);
background: rgba(255, 255, 255, 0.05);
transform: translateY(-4px);
border-color: rgba(250, 227, 7, 0.5);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4), 0 0 30px rgba(250, 227, 7, 0.1);
}
.function-item h3 {
font-size: 22px;
font-size: 24px;
font-weight: 600;
margin-bottom: 12px;
color: #fdfdfd;
margin-bottom: 16px;
color: #ffffff;
position: relative;
z-index: 1;
}
.function-item p {
font-size: 16px;
line-height: 1.8;
color: rgba(245, 245, 245, 0.78);
font-size: 17px;
line-height: 1.9;
color: rgba(245, 245, 245, 0.85);
position: relative;
z-index: 1;
}
/* 愿景列表 */
@@ -688,25 +894,83 @@
}
.faq-item {
padding: 32px;
padding: 0;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px);
cursor: pointer;
transition: all 0.3s ease;
overflow: hidden;
}
.faq-item:hover {
border-color: rgba(250, 227, 7, 0.3);
background: rgba(255, 255, 255, 0.05);
}
.faq-item.open {
border-color: rgba(250, 227, 7, 0.4);
background: rgba(255, 255, 255, 0.05);
}
.faq-question {
display: flex;
justify-content: space-between;
align-items: center;
padding: 24px 32px;
gap: 16px;
}
.faq-item h3 {
font-size: 20px;
font-weight: 600;
margin-bottom: 16px;
color: #fdfdfd;
margin: 0;
color: #ffffff;
flex: 1;
}
.faq-icon {
font-size: 24px;
font-weight: 300;
color: rgba(250, 227, 7, 0.8);
transition: transform 0.3s ease, color 0.3s ease;
flex-shrink: 0;
width: 24px;
text-align: center;
}
.faq-item:hover .faq-icon {
color: var(--primary);
}
.faq-item.open .faq-icon {
color: var(--primary);
transform: rotate(180deg);
}
.faq-answer {
padding: 0 32px 24px 32px;
animation: slideDown 0.3s ease-out;
}
@keyframes slideDown {
from {
opacity: 0;
max-height: 0;
}
to {
opacity: 1;
max-height: 500px;
}
}
.faq-item p {
font-size: 16px;
line-height: 1.8;
color: rgba(245, 245, 245, 0.78);
color: rgba(245, 245, 245, 0.85);
margin: 0;
}
/* CTA 区块 */
@@ -715,12 +979,94 @@
color: #ffffff;
}
.cta-section .section-title {
color: #ffffff;
.cta-card {
max-width: 900px;
margin: 0 auto;
padding: 80px 64px;
background: linear-gradient(
150deg,
rgba(250, 227, 7,0.12) 0%,
rgba(250, 227, 7,0.05) 25%,
rgba(0, 0, 0,0.2) 50%,
rgba(250, 227, 7,0.05) 75%,
rgba(250, 227, 7, 0.12) 100%
);
border-radius: 24px;
text-align: center;
position: relative;
overflow: hidden;
backdrop-filter: blur(10px);
}
.cta-section .section-subtitle {
color: rgba(255, 255, 255, 0.9);
.cta-card::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: radial-gradient(
ellipse at center,
rgba(250, 227, 7, 0.1) 0%,
transparent 70%
);
pointer-events: none;
}
.cta-card-title {
font-size: 48px;
font-weight: 700;
line-height: 1.2;
margin-bottom: 24px;
color: #ffffff;
position: relative;
z-index: 1;
}
.cta-card-subtitle {
font-size: 20px;
font-weight: 400;
margin-bottom: 48px;
color: rgba(255, 255, 255, 0.8);
position: relative;
z-index: 1;
}
.cta-card-button {
padding: 18px 48px;
font-size: 18px;
font-weight: 600;
background: var(--primary);
color: #000000;
border: none;
border-radius: 12px;
cursor: pointer;
transition: all 0.3s ease;
display: inline-flex;
align-items: center;
gap: 12px;
position: relative;
z-index: 1;
box-shadow: 0 4px 16px rgba(250, 227, 7, 0.3);
}
.cta-card-button:hover {
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(250, 227, 7, 0.5);
filter: brightness(1.1);
}
.cta-card-button:active {
transform: translateY(0);
}
.cta-arrow {
font-size: 20px;
transition: transform 0.3s ease;
}
.cta-card-button:hover .cta-arrow {
transform: translate(4px, -4px);
}
@@ -751,6 +1097,18 @@
font-size: 36px;
}
.cta-card {
padding: 60px 40px;
}
.cta-card-title {
font-size: 36px;
}
.cta-card-subtitle {
font-size: 18px;
}
.hero-subtitle {
font-size: 18px;
}
@@ -779,17 +1137,50 @@
}
.pain-points,
.features-grid {
grid-template-columns: 1fr;
.feature-item {
flex-direction: column;
gap: 24px;
padding: 40px 0;
}
.feature-number {
font-size: 40px;
width: auto;
text-align: left;
}
.feature-item:hover {
padding-left: 0;
padding-top: 20px;
}
.scenario-card {
padding: 32px 24px;
}
.function-item,
.functions-list {
grid-template-columns: 1fr;
gap: 24px;
}
.function-item {
padding: 40px 32px;
}
.faq-item {
padding: 24px;
padding: 0;
}
.faq-question {
padding: 20px 24px;
}
.faq-answer {
padding: 0 24px 20px 24px;
}
.faq-item h3 {
font-size: 18px;
}
}
@@ -814,6 +1205,23 @@
font-size: 28px;
}
.cta-card {
padding: 48px 32px;
}
.cta-card-title {
font-size: 28px;
}
.cta-card-subtitle {
font-size: 16px;
}
.cta-card-button {
padding: 16px 36px;
font-size: 16px;
}
@keyframes soft-float {
0% {
transform: translateY(0);

View File

@@ -1,6 +1,8 @@
import { useState } from 'react'
import './App.css'
function App() {
const [openFaq, setOpenFaq] = useState<number | null>(0)
return (
<div className="app">
{/* Hero 区 */}
@@ -11,7 +13,7 @@ function App() {
</p>
<p className="hero-desc">
/
/
</p>
<div className="hero-features">
<span className="feature-tag"></span>
@@ -61,18 +63,27 @@ function App() {
<br />
"感觉"
</p>
<div className="features-grid">
<div className="feature-card">
<h3></h3>
<p></p>
<div className="features-list">
<div className="feature-item">
<div className="feature-number">01</div>
<div className="feature-content">
<h3></h3>
<p></p>
</div>
</div>
<div className="feature-card">
<h3></h3>
<p></p>
<div className="feature-item">
<div className="feature-number">02</div>
<div className="feature-content">
<h3></h3>
<p></p>
</div>
</div>
<div className="feature-card">
<h3></h3>
<p>/</p>
<div className="feature-item">
<div className="feature-number">03</div>
<div className="feature-content">
<h3></h3>
<p>/</p>
</div>
</div>
</div>
</div>
@@ -127,6 +138,10 @@ function App() {
<h3></h3>
<p>//</p>
</div>
<div className="function-item">
<h3></h3>
<p>便</p>
</div>
<div className="function-item">
<h3></h3>
<p></p>
@@ -160,21 +175,103 @@ function App() {
<div className="container">
<h2 className="section-title"></h2>
<div className="faq-list">
<div className="faq-item">
<h3></h3>
<p>/</p>
<div
className={`faq-item ${openFaq === 0 ? 'open' : ''}`}
onClick={() => setOpenFaq(openFaq === 0 ? null : 0)}
>
<div className="faq-question">
<h3></h3>
<span className="faq-icon">{openFaq === 0 ? '^' : 'v'}</span>
</div>
{openFaq === 0 && (
<div className="faq-answer">
<p>/</p>
</div>
)}
</div>
<div className="faq-item">
<h3></h3>
<p> duooomi </p>
<div
className={`faq-item ${openFaq === 1 ? 'open' : ''}`}
onClick={() => setOpenFaq(openFaq === 1 ? null : 1)}
>
<div className="faq-question">
<h3></h3>
<span className="faq-icon">{openFaq === 1 ? '^' : 'v'}</span>
</div>
{openFaq === 1 && (
<div className="faq-answer">
<p> duooomi </p>
</div>
)}
</div>
<div className="faq-item">
<h3> duooomi </h3>
<p>"情绪日记本"</p>
<div
className={`faq-item ${openFaq === 2 ? 'open' : ''}`}
onClick={() => setOpenFaq(openFaq === 2 ? null : 2)}
>
<div className="faq-question">
<h3> duooomi </h3>
<span className="faq-icon">{openFaq === 2 ? '^' : 'v'}</span>
</div>
{openFaq === 2 && (
<div className="faq-answer">
<p>"情绪日记本"</p>
</div>
)}
</div>
<div className="faq-item">
<h3></h3>
<p></p>
<div
className={`faq-item ${openFaq === 4 ? 'open' : ''}`}
onClick={() => setOpenFaq(openFaq === 4 ? null : 4)}
>
<div className="faq-question">
<h3></h3>
<span className="faq-icon">{openFaq === 4 ? '^' : 'v'}</span>
</div>
{openFaq === 4 && (
<div className="faq-answer">
<p> duooomi"创建吧唧"</p>
</div>
)}
</div>
<div
className={`faq-item ${openFaq === 6 ? 'open' : ''}`}
onClick={() => setOpenFaq(openFaq === 6 ? null : 6)}
>
<div className="faq-question">
<h3></h3>
<span className="faq-icon">{openFaq === 6 ? '^' : 'v'}</span>
</div>
{openFaq === 6 && (
<div className="faq-answer">
<p></p>
</div>
)}
</div>
{/* <div
className={`faq-item ${openFaq === 7 ? 'open' : ''}`}
onClick={() => setOpenFaq(openFaq === 7 ? null : 7)}
>
<div className="faq-question">
<h3>duooomi 是免费的吗?</h3>
<span className="faq-icon">{openFaq === 7 ? '^' : 'v'}</span>
</div>
{openFaq === 7 && (
<div className="faq-answer">
<p>duooomi 提供免费版本,包含核心功能。未来我们可能会推出高级功能,但基础的情绪记录和互动功能将始终保持免费,让每个人都能记录和分享自己的情绪瞬间。</p>
</div>
)}
</div> */}
<div
className={`faq-item ${openFaq === 3 ? 'open' : ''}`}
onClick={() => setOpenFaq(openFaq === 3 ? null : 3)}
>
<div className="faq-question">
<h3></h3>
<span className="faq-icon">{openFaq === 3 ? '^' : 'v'}</span>
</div>
{openFaq === 3 && (
<div className="faq-answer">
<p></p>
</div>
)}
</div>
</div>
</div>
@@ -183,13 +280,13 @@ function App() {
{/* 底部 CTA 区 */}
<section className="section cta-section">
<div className="container">
<h2 className="section-title"></h2>
<p className="section-subtitle">
</p>
<div className="hero-cta">
<button className="btn-primary"> duooomi</button>
<button className="btn-secondary"></button>
<div className="cta-card">
<h2 className="cta-card-title"></h2>
<p className="cta-card-subtitle">AI never sleep</p>
<button className="cta-card-button">
duooomi
<span className="cta-arrow"></span>
</button>
</div>
</div>
</section>