diff --git a/src/App.css b/src/App.css index 0633e18..b24e94a 100644 --- a/src/App.css +++ b/src/App.css @@ -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); diff --git a/src/App.tsx b/src/App.tsx index e56eec2..0e68ed8 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,6 +1,8 @@ +import { useState } from 'react' import './App.css' function App() { + const [openFaq, setOpenFaq] = useState(0) return (
{/* Hero 区 */} @@ -11,7 +13,7 @@ function App() { 用数字吧唧记录每一次心动、每一段关系,把情绪变成可以收藏、分享和互动的「小宇宙」。

- 不再只是聊天记录,而是可以捏、可以赚、可以展示的电子吧唧,专属于你和他/她。 + 不再只是聊天记录,而是可以捏、可以展示的电子吧唧,专属于你和他/她。

情绪上链:用电子吧唧记录每个瞬间 @@ -61,18 +63,27 @@ function App() {
你可以把它送给自己,也可以送给在意的人,让"感觉"变成一个可以看见、可以点亮的小物件。

-
-
-

自定义吧唧

-

名字、图标、颜色、含义,都由你来设定。

+
+
+
01
+
+

自定义吧唧

+

名字、图标、颜色、含义,都由你来设定。

+
-
-

互动点亮

-

对方可以收下、点亮、回复,形成一条完整的情绪互动链路。

+
+
02
+
+

互动点亮

+

对方可以收下、点亮、回复,形成一条完整的情绪互动链路。

+
-
-

情绪档案

-

所有送出/收到的吧唧,都会沉淀为「情绪档案」,成为你的小小人生博物馆。

+
+
03
+
+

情绪档案

+

所有送出/收到的吧唧,都会沉淀为「情绪档案」,成为你的小小人生博物馆。

+
@@ -127,6 +138,10 @@ function App() {

情绪统计与回顾

以日/周/月为单位,看看你最近都在为什么事情「吧唧」,重新认识自己的情绪习惯。

+
+

一键生成专属吧唧图

+

快速生成精美的吧唧图片,方便分享到社交平台。

+

多端同步

手机多设备同步,换机不丢记忆。

@@ -160,21 +175,103 @@ function App() {

常见问题

-
-

电子吧唧是虚拟货币吗?

-

不是。电子吧唧是一种情绪/关系的数字徽章,用于表达、记录和互动,而不是金融产品或代币。

+
setOpenFaq(openFaq === 0 ? null : 0)} + > +
+

电子吧唧是虚拟货币吗?

+ {openFaq === 0 ? '^' : 'v'} +
+ {openFaq === 0 && ( +
+

不是。电子吧唧是一种情绪/关系的数字徽章,用于表达、记录和互动,而不是金融产品或代币。

+
+ )}
-
-

我的数据会安全吗?

-

你在 duooomi 的情绪记录和关系数据,会严格加密存储。你可以为敏感吧唧设置仅自己可见,任何第三方(包括我们)都无法查看你的私密内容。

+
setOpenFaq(openFaq === 1 ? null : 1)} + > +
+

我的数据会安全吗?

+ {openFaq === 1 ? '^' : 'v'} +
+ {openFaq === 1 && ( +
+

你在 duooomi 的情绪记录和关系数据,会严格加密存储。你可以为敏感吧唧设置仅自己可见,任何第三方(包括我们)都无法查看你的私密内容。

+
+ )}
-
-

一个人也可以用 duooomi 吗?

-

当然可以。你可以给自己送吧唧,把它当成一个"情绪日记本",记录成长和心境变化。

+
setOpenFaq(openFaq === 2 ? null : 2)} + > +
+

一个人也可以用 duooomi 吗?

+ {openFaq === 2 ? '^' : 'v'} +
+ {openFaq === 2 && ( +
+

当然可以。你可以给自己送吧唧,把它当成一个"情绪日记本",记录成长和心境变化。

+
+ )}
-
-

未来会有更多玩法吗?

-

我们会逐步增加更多互动玩法,比如吧唧主题活动、关系等级、特殊时期限定吧唧等,让你的情绪宇宙持续长出新星球。

+
setOpenFaq(openFaq === 4 ? null : 4)} + > +
+

如何创建一个电子吧唧?

+ {openFaq === 4 ? '^' : 'v'} +
+ {openFaq === 4 && ( +
+

创建电子吧唧非常简单:打开 duooomi,点击"创建吧唧",选择图标、颜色,输入名称和含义,一分钟就能完成。你可以为不同的情绪和场景创建专属的吧唧。

+
+ )} +
+
setOpenFaq(openFaq === 6 ? null : 6)} + > +
+

电子吧唧可以删除或修改吗?

+ {openFaq === 6 ? '^' : 'v'} +
+ {openFaq === 6 && ( +
+

可以。你可以随时编辑或删除自己创建的电子吧唧。但已经送出的吧唧会保留在对方的情绪档案中,这是你们共同记忆的一部分。

+
+ )} +
+ {/*
setOpenFaq(openFaq === 7 ? null : 7)} + > +
+

duooomi 是免费的吗?

+ {openFaq === 7 ? '^' : 'v'} +
+ {openFaq === 7 && ( +
+

duooomi 提供免费版本,包含核心功能。未来我们可能会推出高级功能,但基础的情绪记录和互动功能将始终保持免费,让每个人都能记录和分享自己的情绪瞬间。

+
+ )} +
*/} +
setOpenFaq(openFaq === 3 ? null : 3)} + > +
+

未来会有更多玩法吗?

+ {openFaq === 3 ? '^' : 'v'} +
+ {openFaq === 3 && ( +
+

我们会逐步增加更多互动玩法,比如吧唧主题活动、关系等级、特殊时期限定吧唧等,让你的情绪宇宙持续长出新星球。

+
+ )}
@@ -183,13 +280,13 @@ function App() { {/* 底部 CTA 区 */}
-

开始收集你的第一枚电子吧唧

-

- 也许是一句「谢谢」、一句「辛苦了」,或者一句从没说出口的「我在乎你」。 -

-
- - +
+

开始收集你的第一枚电子吧唧

+

AI never sleep,情绪永远被看见

+