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); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
transition: all 0.3s ease; transition: all 0.3s ease;
backdrop-filter: blur(10px); 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 { .pain-point:hover {
@@ -496,56 +515,121 @@
background: rgba(255, 255, 255, 0.05); 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 { .pain-point h3 {
font-size: 24px; font-size: 24px;
font-weight: 600; font-weight: 600;
margin-bottom: 16px; margin-bottom: 16px;
color: var(--primary); color: var(--primary);
position: relative;
z-index: 1;
} }
.pain-point p { .pain-point p {
font-size: 16px; font-size: 16px;
line-height: 1.8; line-height: 1.8;
color: rgba(245, 245, 245, 0.78); color: rgba(245, 245, 245, 0.78);
position: relative;
z-index: 1;
} }
/* 功能卡片网格 */ /* 功能列表 */
.features-grid { .features-list {
display: grid; display: flex;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); flex-direction: column;
gap: 32px; gap: 0;
margin-top: 48px; margin-top: 64px;
max-width: 900px;
margin-left: auto;
margin-right: auto;
border-top: 1px solid rgba(250, 227, 7, 0.2);
} }
.feature-card { .feature-item {
padding: 40px 32px; display: flex;
background: rgba(255, 255, 255, 0.03); align-items: flex-start;
border: 1px solid rgba(255, 255, 255, 0.1); gap: 40px;
border-radius: 16px; padding: 48px 0;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); border-bottom: 1px solid rgba(250, 227, 7, 0.2);
transition: all 0.3s ease; transition: all 0.3s ease;
border-top: 4px solid var(--primary); opacity: 0;
backdrop-filter: blur(10px); transform: translateX(-30px);
animation: featureItemFadeIn 0.6s ease-out forwards;
} }
.feature-card:hover { .feature-item:nth-child(1) {
transform: translateY(-4px); animation-delay: 0.1s;
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-card h3 { .feature-item:nth-child(2) {
font-size: 22px; 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; font-weight: 600;
margin-bottom: 16px; margin-bottom: 16px;
color: #fdfdfd; color: #ffffff;
transition: color 0.3s ease;
} }
.feature-card p { .feature-item:hover h3 {
font-size: 16px; color: var(--primary);
line-height: 1.8; }
color: rgba(245, 245, 245, 0.78);
.feature-item p {
font-size: 18px;
line-height: 1.9;
color: rgba(245, 245, 245, 0.85);
} }
/* 场景卡片 */ /* 场景卡片 */
@@ -554,91 +638,213 @@
flex-direction: column; flex-direction: column;
gap: 48px; gap: 48px;
margin-top: 64px; margin-top: 64px;
align-items: stretch;
} }
.scenario-card { .scenario-card {
padding: 48px; padding: 48px;
background: rgba(255, 255, 255, 0.03); background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.1); 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); 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; max-width: 900px;
margin: 0 auto; margin: 0 auto;
backdrop-filter: blur(10px); 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 { .scenario-card:hover {
transform: translateY(-6px); transform: translateY(-12px) scale(1.02);
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.4); 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.3); border-color: rgba(250, 227, 7, 0.5);
background: rgba(255, 255, 255, 0.05); 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 { .scenario-card h3 {
font-size: 28px; font-size: 28px;
font-weight: 600; font-weight: 600;
margin-bottom: 12px; margin-bottom: 16px;
color: #fdfdfd; color: #ffffff;
position: relative;
z-index: 1;
transition: color 0.3s ease;
} }
.scenario-label { .scenario-label {
display: inline-block; display: inline-block;
padding: 6px 16px; padding: 8px 20px;
background: var(--primary); background: linear-gradient(135deg, var(--primary) 0%, rgba(250, 227, 7, 0.9) 100%);
color: #ffffff; color: #000000;
border-radius: 20px; border-radius: 24px;
font-size: 14px; font-size: 14px;
font-weight: 500; font-weight: 600;
margin-bottom: 24px; 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 { .scenario-desc {
font-size: 18px; font-size: 18px;
line-height: 1.8; line-height: 1.9;
color: rgba(245, 245, 245, 0.78); color: rgba(245, 245, 245, 0.85);
position: relative;
z-index: 1;
} }
/* 功能列表 */ /* 功能列表 */
.functions-list { .functions-list {
display: flex; display: grid;
flex-direction: column; grid-template-columns: repeat(2, 1fr);
gap: 24px; gap: 32px;
margin-top: 48px; margin-top: 64px;
max-width: 900px; max-width: 1100px;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
} }
.function-item { .function-item {
padding: 32px; padding: 48px 40px;
background: rgba(255, 255, 255, 0.03); background: linear-gradient(
border: 1px solid rgba(255, 255, 255, 0.1); 135deg,
border-radius: 16px; rgba(0, 0, 0, 0.6) 0%,
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); 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; transition: all 0.3s ease;
border-left: 4px solid var(--primary);
backdrop-filter: blur(10px); 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 { .function-item:hover {
transform: translateX(8px); transform: translateY(-4px);
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.4); border-color: rgba(250, 227, 7, 0.5);
border-color: rgba(250, 227, 7, 0.3); box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4), 0 0 30px rgba(250, 227, 7, 0.1);
background: rgba(255, 255, 255, 0.05);
} }
.function-item h3 { .function-item h3 {
font-size: 22px; font-size: 24px;
font-weight: 600; font-weight: 600;
margin-bottom: 12px; margin-bottom: 16px;
color: #fdfdfd; color: #ffffff;
position: relative;
z-index: 1;
} }
.function-item p { .function-item p {
font-size: 16px; font-size: 17px;
line-height: 1.8; line-height: 1.9;
color: rgba(245, 245, 245, 0.78); color: rgba(245, 245, 245, 0.85);
position: relative;
z-index: 1;
} }
/* 愿景列表 */ /* 愿景列表 */
@@ -688,25 +894,83 @@
} }
.faq-item { .faq-item {
padding: 32px; padding: 0;
background: rgba(255, 255, 255, 0.03); background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.1); border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 16px; border-radius: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px); 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 { .faq-item h3 {
font-size: 20px; font-size: 20px;
font-weight: 600; font-weight: 600;
margin-bottom: 16px; margin: 0;
color: #fdfdfd; 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 { .faq-item p {
font-size: 16px; font-size: 16px;
line-height: 1.8; line-height: 1.8;
color: rgba(245, 245, 245, 0.78); color: rgba(245, 245, 245, 0.85);
margin: 0;
} }
/* CTA 区块 */ /* CTA 区块 */
@@ -715,12 +979,94 @@
color: #ffffff; color: #ffffff;
} }
.cta-section .section-title { .cta-card {
color: #ffffff; 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 { .cta-card::before {
color: rgba(255, 255, 255, 0.9); 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; font-size: 36px;
} }
.cta-card {
padding: 60px 40px;
}
.cta-card-title {
font-size: 36px;
}
.cta-card-subtitle {
font-size: 18px;
}
.hero-subtitle { .hero-subtitle {
font-size: 18px; font-size: 18px;
} }
@@ -779,17 +1137,50 @@
} }
.pain-points, .pain-points,
.features-grid { .feature-item {
grid-template-columns: 1fr; 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 { .scenario-card {
padding: 32px 24px; padding: 32px 24px;
} }
.function-item, .functions-list {
grid-template-columns: 1fr;
gap: 24px;
}
.function-item {
padding: 40px 32px;
}
.faq-item { .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; 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 { @keyframes soft-float {
0% { 0% {
transform: translateY(0); transform: translateY(0);

View File

@@ -1,6 +1,8 @@
import { useState } from 'react'
import './App.css' import './App.css'
function App() { function App() {
const [openFaq, setOpenFaq] = useState<number | null>(0)
return ( return (
<div className="app"> <div className="app">
{/* Hero 区 */} {/* Hero 区 */}
@@ -11,7 +13,7 @@ function App() {
</p> </p>
<p className="hero-desc"> <p className="hero-desc">
/ /
</p> </p>
<div className="hero-features"> <div className="hero-features">
<span className="feature-tag"></span> <span className="feature-tag"></span>
@@ -61,21 +63,30 @@ function App() {
<br /> <br />
"感觉" "感觉"
</p> </p>
<div className="features-grid"> <div className="features-list">
<div className="feature-card"> <div className="feature-item">
<div className="feature-number">01</div>
<div className="feature-content">
<h3></h3> <h3></h3>
<p></p> <p></p>
</div> </div>
<div className="feature-card"> </div>
<div className="feature-item">
<div className="feature-number">02</div>
<div className="feature-content">
<h3></h3> <h3></h3>
<p></p> <p></p>
</div> </div>
<div className="feature-card"> </div>
<div className="feature-item">
<div className="feature-number">03</div>
<div className="feature-content">
<h3></h3> <h3></h3>
<p>/</p> <p>/</p>
</div> </div>
</div> </div>
</div> </div>
</div>
</section> </section>
{/* 区块三:核心场景示例 */} {/* 区块三:核心场景示例 */}
@@ -127,6 +138,10 @@ function App() {
<h3></h3> <h3></h3>
<p>//</p> <p>//</p>
</div> </div>
<div className="function-item">
<h3></h3>
<p>便</p>
</div>
<div className="function-item"> <div className="function-item">
<h3></h3> <h3></h3>
<p></p> <p></p>
@@ -160,22 +175,104 @@ function App() {
<div className="container"> <div className="container">
<h2 className="section-title"></h2> <h2 className="section-title"></h2>
<div className="faq-list"> <div className="faq-list">
<div className="faq-item"> <div
className={`faq-item ${openFaq === 0 ? 'open' : ''}`}
onClick={() => setOpenFaq(openFaq === 0 ? null : 0)}
>
<div className="faq-question">
<h3></h3> <h3></h3>
<span className="faq-icon">{openFaq === 0 ? '^' : 'v'}</span>
</div>
{openFaq === 0 && (
<div className="faq-answer">
<p>/</p> <p>/</p>
</div> </div>
<div className="faq-item"> )}
</div>
<div
className={`faq-item ${openFaq === 1 ? 'open' : ''}`}
onClick={() => setOpenFaq(openFaq === 1 ? null : 1)}
>
<div className="faq-question">
<h3></h3> <h3></h3>
<span className="faq-icon">{openFaq === 1 ? '^' : 'v'}</span>
</div>
{openFaq === 1 && (
<div className="faq-answer">
<p> duooomi </p> <p> duooomi </p>
</div> </div>
<div className="faq-item"> )}
</div>
<div
className={`faq-item ${openFaq === 2 ? 'open' : ''}`}
onClick={() => setOpenFaq(openFaq === 2 ? null : 2)}
>
<div className="faq-question">
<h3> duooomi </h3> <h3> duooomi </h3>
<span className="faq-icon">{openFaq === 2 ? '^' : 'v'}</span>
</div>
{openFaq === 2 && (
<div className="faq-answer">
<p>"情绪日记本"</p> <p>"情绪日记本"</p>
</div> </div>
<div className="faq-item"> )}
</div>
<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> <h3></h3>
<span className="faq-icon">{openFaq === 3 ? '^' : 'v'}</span>
</div>
{openFaq === 3 && (
<div className="faq-answer">
<p></p> <p></p>
</div> </div>
)}
</div>
</div> </div>
</div> </div>
</section> </section>
@@ -183,13 +280,13 @@ function App() {
{/* 底部 CTA 区 */} {/* 底部 CTA 区 */}
<section className="section cta-section"> <section className="section cta-section">
<div className="container"> <div className="container">
<h2 className="section-title"></h2> <div className="cta-card">
<p className="section-subtitle"> <h2 className="cta-card-title"></h2>
<p className="cta-card-subtitle">AI never sleep</p>
</p> <button className="cta-card-button">
<div className="hero-cta"> duooomi
<button className="btn-primary"> duooomi</button> <span className="cta-arrow"></span>
<button className="btn-secondary"></button> </button>
</div> </div>
</div> </div>
</section> </section>