diff --git a/docs/assets/site.css b/docs/assets/site.css index 9871d49..0ec84d1 100644 --- a/docs/assets/site.css +++ b/docs/assets/site.css @@ -1,9 +1,11 @@ /*! - * OSGKeyboard 主页设计系统(2026-10 动效版) - * 方向:Apple 式产品页 —— 深色产品舞台 + 实机画面优先 + 滚动叙事。 - * 动效母题:「声音变成文字」—— 声波、涟漪、逐字浮现、流式转写。 - * 主题跟随系统(site.js 可手动覆盖);Hero / 隐私 / 下载区块在两种 - * 主题下都使用固定的深色「舞台」调色板,与新应用图标同一语言。 + * OSGKeyboard 主页设计系统(2026-10 亚克力版) + * 方向:整页是一套「亚克力键帽」—— 与应用图标同一种材质:乳白、半透、顶边高光、底边厚度、柔和弥散投影。 + * · 材质只有一种,分三档厚度:底板(页面)→ 面板(.acrylic 卡片)→ 键帽(.keycap 按钮 / .chip 标签)。 + * · 形状只有四档圆角:标签 10 / 按钮 14 / 卡片 24 / 大面板 32;嵌套时内圆角 = 外圆角 − 内边距。 + * · 品牌绿取自图标(#0B9019),只用于状态与指示,其余全部中性色。 + * 动效母题:「声音变成文字」—— 声波、逐字浮现、流式转写;另加一道跟随指针的亚克力反光。 + * 主题跟随系统(site.js 可手动覆盖),首屏与整页一起切换深浅。 * * 渐进增强约定:所有「先隐藏、再显现」的初始态都挂在 html.js 之下; * 无 JavaScript 或开启「减弱动态效果」时,页面以完整静态形态呈现。 @@ -14,37 +16,83 @@ * -------------------------------------------------------------------------- */ :root { color-scheme: light dark; - --canvas: #f3f5f7; - --surface: #ffffff; - --surface-soft: #eceff3; - --surface-strong: #e4e9ee; - --ink: #0f1214; - --ink-2: #55606a; - --ink-3: #8a939c; - --line: rgba(15, 18, 20, 0.09); - --line-strong: rgba(15, 18, 20, 0.16); - --accent: #2c8a52; - --accent-strong: #217142; - --accent-soft: rgba(44, 138, 82, 0.12); - /* 深色舞台:Hero / 隐私 / 下载共用,两种主题下保持一致 */ - --stage-1: #272d35; - --stage-2: #14171c; - --stage-3: #0c0e12; - --stage-ink: #f4f6f7; - --stage-ink-2: #a7b0b9; - --stage-line: rgba(255, 255, 255, 0.1); - --stage-accent: #6fc491; + + /* 底板:图标乳白(#F0F2F1)略提亮 */ + --canvas: #eff1f0; + --ink: #15181a; + --ink-2: #596067; + --ink-3: #8b9298; + --line: rgba(21, 24, 26, 0.08); + --line-strong: rgba(21, 24, 26, 0.14); + + /* 品牌绿:图标三个圆点的颜色;--accent-ink 用于小字,保证对比度 */ + --accent: #0f9124; + --accent-ink: #0c7a1f; + --accent-soft: rgba(15, 145, 36, 0.1); + + /* 底板背后的环境光:亚克力需要背后有东西才能透出质感 */ + --glow-1: rgba(255, 255, 255, 0.95); + --glow-2: rgba(178, 222, 192, 0.5); + --glow-3: rgba(196, 214, 232, 0.55); + + /* 面板:半透乳白 + 背景模糊;阴影四层 = 顶边高光 / 底边厚度 / 发丝描边 / 弥散投影 */ + --acrylic-fill: linear-gradient(180deg, rgba(255, 255, 255, 0.84), rgba(255, 255, 255, 0.6)); + --acrylic-edge: rgba(21, 24, 26, 0.07); + --acrylic-shadow: + inset 0 1px 0 rgba(255, 255, 255, 1), + inset 0 -1px 0 rgba(21, 24, 26, 0.04), + 0 0 0 1px var(--acrylic-edge), + 0 1px 2px rgba(21, 24, 26, 0.04), + 0 24px 48px -24px rgba(21, 24, 26, 0.18); + --acrylic-blur: blur(28px) saturate(1.6); + + /* 键帽:比面板更实;按下时内阴影加深、整体下沉 1px */ + --key-fill: linear-gradient(180deg, #ffffff, #eef0ef); + --key-shadow: + inset 0 1px 0 #fff, + inset 0 -2px 0 rgba(21, 24, 26, 0.06), + 0 0 0 1px rgba(21, 24, 26, 0.09), + 0 2px 3px rgba(21, 24, 26, 0.05), + 0 8px 18px -8px rgba(21, 24, 26, 0.22); + --key-shadow-hover: + inset 0 1px 0 #fff, + inset 0 -2px 0 rgba(21, 24, 26, 0.06), + 0 0 0 1px rgba(21, 24, 26, 0.11), + 0 3px 5px rgba(21, 24, 26, 0.06), + 0 14px 26px -10px rgba(21, 24, 26, 0.26); + --key-shadow-pressed: + inset 0 1px 2px rgba(21, 24, 26, 0.14), + 0 0 0 1px rgba(21, 24, 26, 0.1), + 0 1px 1px rgba(21, 24, 26, 0.05); + + /* 指针反光:亚克力表面跟随光标的一块高光 */ + --sheen: rgba(255, 255, 255, 0.75); + --sheen-edge: rgba(255, 255, 255, 0.95); + + /* 烟熏亚克力:整页唯一的深色时刻(隐私面板) */ + --smoke-fill: linear-gradient(165deg, rgba(34, 38, 41, 0.95), rgba(17, 19, 21, 0.97)); + --smoke-ink: #f2f4f3; + --smoke-ink-2: #a5adb3; + --smoke-line: rgba(255, 255, 255, 0.09); + --smoke-accent: #4fcb68; + + /* 磨砂颗粒:约 5% 的灰噪点,叠在面板最上层 */ + --grain: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 .05'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E"); + + --shadow-device: rgba(21, 24, 26, 0.24); + + /* 四档圆角 */ + --r-chip: 10px; + --r-btn: 14px; + --r-card: 24px; + --r-panel: 32px; + --content: min(1120px, calc(100vw - 48px)); - --radius-xl: 28px; - --radius-lg: 22px; - --radius-md: 14px; - --shadow-card: 0 28px 56px -28px rgba(16, 20, 24, 0.25); - --shadow-media: 0 32px 64px -32px rgba(16, 20, 24, 0.35); /* 动效令牌:统一的缓动曲线与时长,所有组件只引用这里 */ --ease-out: cubic-bezier(0.16, 1, 0.3, 1); --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1); - /* 物理弹簧(linear() 采样),用于需要「落定感」的元素:气泡、芯片、胶囊 */ + /* 物理弹簧(linear() 采样),用于需要「落定感」的元素:键帽、标签、胶囊 */ --ease-spring: linear( 0, 0.009, 0.035 2.1%, 0.141, 0.281 6.7%, 0.723 12.9%, 0.938 16.7%, 1.017, 1.077, 1.121, 1.149 24.3%, 1.159, 1.163, 1.161, 1.154 29.9%, 1.129 32.8%, @@ -55,30 +103,81 @@ --dur-base: 0.5s; --dur-slow: 0.95s; - /* 嵌入式手机演示的配色(随主题切换) */ - - /* 键盘复刻色:取自 App 源码 ColorLibrary(brandAccent / aiTeal / recordRed)与原生键面色 */ + /* 键盘复刻色:取自 App 源码 ColorLibrary(brandAccent / aiTeal / recordRed),只用于首屏语音胶囊 */ --kb-accent: #3aa05a; --kb-teal: #2bafa4; --kb-red: #ff3b30; } html[data-theme="dark"] { - --canvas: #0e1013; - --surface: #16191d; - --surface-soft: #12151a; - --surface-strong: #20252b; - --ink: #f2f4f5; - --ink-2: #a4adb5; - --ink-3: #7c858d; - --line: rgba(255, 255, 255, 0.09); - --line-strong: rgba(255, 255, 255, 0.16); - --accent: #68bf8d; - --accent-strong: #7dcd9e; - --accent-soft: rgba(104, 191, 141, 0.14); - --shadow-card: 0 28px 56px -28px rgba(0, 0, 0, 0.6); - --shadow-media: 0 32px 64px -32px rgba(0, 0, 0, 0.65); + --canvas: #0e1011; + --ink: #eef1f0; + --ink-2: #a3abb1; + --ink-3: #79828a; + --line: rgba(255, 255, 255, 0.08); + --line-strong: rgba(255, 255, 255, 0.14); + --accent: #3ec45a; + --accent-ink: #5fd178; + --accent-soft: rgba(62, 196, 90, 0.14); + + --glow-1: rgba(255, 255, 255, 0.05); + --glow-2: rgba(62, 196, 90, 0.1); + --glow-3: rgba(90, 130, 170, 0.13); + + --acrylic-fill: linear-gradient(180deg, rgba(46, 50, 54, 0.64), rgba(28, 31, 34, 0.52)); + --acrylic-edge: rgba(255, 255, 255, 0.07); + --acrylic-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.09), + inset 0 -1px 0 rgba(0, 0, 0, 0.3), + 0 0 0 1px var(--acrylic-edge), + 0 24px 48px -24px rgba(0, 0, 0, 0.6); + + --key-fill: linear-gradient(180deg, #2d3135, #222528); + --key-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.1), + inset 0 -2px 0 rgba(0, 0, 0, 0.35), + 0 0 0 1px rgba(255, 255, 255, 0.07), + 0 8px 18px -8px rgba(0, 0, 0, 0.7); + --key-shadow-hover: + inset 0 1px 0 rgba(255, 255, 255, 0.12), + inset 0 -2px 0 rgba(0, 0, 0, 0.35), + 0 0 0 1px rgba(255, 255, 255, 0.1), + 0 14px 26px -10px rgba(0, 0, 0, 0.8); + --key-shadow-pressed: + inset 0 1px 3px rgba(0, 0, 0, 0.5), + 0 0 0 1px rgba(255, 255, 255, 0.06); + + --sheen: rgba(255, 255, 255, 0.07); + --sheen-edge: rgba(255, 255, 255, 0.28); + + /* 深色主题下底板已经是深色,烟熏面板略微提亮、带一点绿光,仍是整页最「重」的一块 */ + --smoke-fill: linear-gradient(165deg, rgba(40, 45, 48, 0.86), rgba(20, 23, 25, 0.9)); + + --shadow-device: rgba(0, 0, 0, 0.6); +} + +/* 支持连续曲率圆角的浏览器:换成与图标一致的「方圆」,半径相应放大以保持视觉大小 */ +@supports (corner-shape: squircle) { + :root { + --r-chip: 15px; + --r-btn: 21px; + --r-card: 38px; + --r-panel: 50px; + } + + .acrylic, + .acrylic-smoke, + .keycap, + .chip, + .language-button, + .nav-shell, + .nav-indicator, + .mobile-nav, + .media-inset, + .story-act { + corner-shape: squircle; + } } /* -------------------------------------------------------------------------- @@ -88,9 +187,10 @@ html[data-theme="dark"] { box-sizing: border-box; } +/* 底色挂在 html 上,body 保持透明,固定的环境光层(body::before)才能透出来 */ html { scroll-behavior: smooth; - scroll-padding-top: 84px; + scroll-padding-top: 96px; background: var(--canvas); } @@ -99,7 +199,6 @@ body { /* clip 不会生成滚动容器,滚动叙事的 position: sticky 才能正常工作 */ overflow-x: hidden; overflow-x: clip; - background: var(--canvas); color: var(--ink); font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", "Hiragino Sans GB", "Helvetica Neue", Arial, sans-serif; @@ -172,7 +271,7 @@ html[data-lang="zh"] h3 { top: 12px; left: 12px; padding: 9px 14px; - border-radius: 999px; + border-radius: var(--r-btn); background: var(--ink); color: var(--canvas); transform: translateY(-160%); @@ -216,52 +315,155 @@ html[data-lang="zh"] h3 { vertical-align: -0.28em; } -/* 页面滚动进度条:由 site.js 直接写 transform,避免每帧触发全局样式重算 */ -.scroll-progress { +/* -------------------------------------------------------------------------- + * 3. 底板:固定的环境光,滚动时面板「滑过」柔光,模糊才有东西可透 + * -------------------------------------------------------------------------- */ +body::before { position: fixed; - z-index: 60; - top: 0; - right: 0; - left: 0; - height: 2px; - background: linear-gradient(90deg, var(--stage-accent), #b5ecc9 60%, var(--stage-accent)); - box-shadow: 0 0 12px rgba(111, 196, 145, 0.6); + z-index: -1; + inset: 0; + background: + radial-gradient(55% 45% at 12% 6%, var(--glow-1), transparent 70%), + radial-gradient(45% 40% at 92% 30%, var(--glow-2), transparent 72%), + radial-gradient(55% 45% at 30% 100%, var(--glow-3), transparent 72%); + content: ""; + pointer-events: none; +} + +/* -------------------------------------------------------------------------- + * 4. 材质:面板 / 烟熏面板 / 键帽 / 标签 + * -------------------------------------------------------------------------- */ +.acrylic { + border-radius: var(--r-card); + background: var(--grain), var(--acrylic-fill); + box-shadow: var(--acrylic-shadow); + -webkit-backdrop-filter: var(--acrylic-blur); + backdrop-filter: var(--acrylic-blur); +} + +.acrylic-smoke { + --sheen: rgba(255, 255, 255, 0.06); + --sheen-edge: rgba(255, 255, 255, 0.3); + border-radius: var(--r-panel); + background: var(--grain), var(--smoke-fill); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.12), + inset 0 -1px 0 rgba(0, 0, 0, 0.4), + 0 0 0 1px rgba(0, 0, 0, 0.08), + 0 40px 80px -36px rgba(10, 14, 16, 0.55); + color: var(--smoke-ink); +} + +/* 键帽:所有按钮统一为圆角长方形(App Store 官方徽章除外) */ +.keycap { + display: inline-flex; + min-height: 48px; + align-items: center; + justify-content: center; + gap: 9px; + padding: 0 20px; + border: 0; + border-radius: var(--r-btn); + background: var(--key-fill); + box-shadow: var(--key-shadow); + color: var(--ink); + cursor: pointer; + font-size: 0.95rem; + font-weight: 600; + letter-spacing: -0.005em; + white-space: nowrap; + transition: box-shadow 0.25s ease, translate 0.25s var(--ease-out), transform 0.5s var(--ease-spring); +} + +.keycap:hover { + box-shadow: var(--key-shadow-hover); + translate: 0 -1px; +} + +.keycap:active { + box-shadow: var(--key-shadow-pressed); + translate: 0 1px; +} + +.keycap .i { + width: 17px; + height: 17px; + color: var(--ink-2); + transition: transform 0.5s var(--ease-spring); +} + +.keycap:hover .i { + transform: translate(2px, -2px); +} + +/* 标签:小一号的键帽,不可按,只有一层高光和发丝描边 */ +.chip { + display: inline-flex; + align-items: center; + gap: 7px; + padding: 7px 13px; + border-radius: var(--r-chip); + background: var(--key-fill); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.9), + 0 0 0 1px var(--line), + 0 4px 10px -6px rgba(21, 24, 26, 0.18); + color: var(--ink-2); + font-size: 0.86rem; + font-weight: 560; +} + +html[data-theme="dark"] .chip { + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.08), + 0 0 0 1px var(--line), + 0 4px 10px -6px rgba(0, 0, 0, 0.6); +} + +/* -------------------------------------------------------------------------- + * 5. 导航:悬浮的亚克力条 + * -------------------------------------------------------------------------- */ +/* 页面滚动进度:导航条底边的一根细线,由 site.js 直接写 transform */ +.scroll-progress { + position: absolute; + right: 18px; + bottom: 0; + left: 18px; + height: 1.5px; + border-radius: 2px; + background: var(--accent); + opacity: 0.7; pointer-events: none; transform: scaleX(0); transform-origin: 0 50%; } -/* -------------------------------------------------------------------------- - * 3. 导航 - * -------------------------------------------------------------------------- */ -/* Hero 是深色舞台:导航在页面顶部时按深色舞台配色,滚动后切换为主题色 */ .site-nav { position: fixed; z-index: 50; - top: 0; + top: 12px; right: 0; left: 0; - border-bottom: 1px solid transparent; - color: var(--stage-ink); - transition: background 0.35s ease, border-color 0.35s ease, color 0.35s ease; -} - -.site-nav.is-scrolled { - border-bottom-color: var(--line); - background: color-mix(in srgb, var(--canvas) 78%, transparent); - color: var(--ink); - -webkit-backdrop-filter: blur(20px) saturate(1.6); - backdrop-filter: blur(20px) saturate(1.6); + pointer-events: none; } .nav-shell { + position: relative; display: flex; width: var(--content); - height: 64px; + height: 58px; align-items: center; justify-content: space-between; - margin: 0 auto; gap: 24px; + margin: 0 auto; + padding: 0 10px 0 14px; + overflow: hidden; + border-radius: 18px; + background: var(--grain), var(--acrylic-fill); + box-shadow: var(--acrylic-shadow); + pointer-events: auto; + -webkit-backdrop-filter: var(--acrylic-blur); + backdrop-filter: var(--acrylic-blur); } .brand { @@ -274,9 +476,9 @@ html[data-lang="zh"] h3 { } .brand img { - width: 30px; - height: 30px; - border-radius: 8px; + width: 32px; + height: 32px; + filter: drop-shadow(0 3px 5px rgba(21, 24, 26, 0.16)); transition: transform var(--dur-base) var(--ease-spring); } @@ -295,26 +497,26 @@ html[data-lang="zh"] h3 { position: relative; z-index: 1; padding: 8px 14px; - border-radius: 999px; + color: var(--ink-2); font-size: 0.92rem; - opacity: 0.72; - transition: opacity 0.2s ease; + transition: color 0.2s ease; } .nav-links a:hover, .nav-links a.is-active { - opacity: 1; + color: var(--ink); } -/* 导航滑块:位置与宽度由 site.js 写入,弹簧曲线让它「跟手」 */ +/* 导航滑块:一颗小键帽,位置与宽度由 site.js 写入,弹簧曲线让它「跟手」 */ .nav-indicator { position: absolute; top: 50%; left: 0; width: var(--iw, 0px); - height: 34px; - border-radius: 999px; - background: color-mix(in srgb, currentColor 11%, transparent); + height: 36px; + border-radius: var(--r-chip); + background: var(--key-fill); + box-shadow: var(--key-shadow); opacity: 0; pointer-events: none; transform: translate3d(var(--ix, 0px), -50%, 0); @@ -329,9 +531,10 @@ html[data-lang="zh"] h3 { .nav-actions { display: flex; align-items: center; - gap: 8px; + gap: 6px; } +/* 图标按钮保持圆形;语言按钮是文字按钮,与其他按钮一样用圆角长方形 */ .icon-button, .language-button { display: inline-grid; @@ -341,14 +544,20 @@ html[data-lang="zh"] h3 { justify-content: center; padding: 0; border: 0; - border-radius: 999px; background: transparent; + color: var(--ink-2); cursor: pointer; - opacity: 0.78; - transition: opacity 0.2s ease, background 0.2s ease, transform 0.4s var(--ease-spring); + transition: color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease, + transform 0.4s var(--ease-spring); +} + +.icon-button { + border-radius: 50%; } .language-button { + padding: 0 10px; + border-radius: var(--r-chip); font-size: 0.82rem; font-weight: 650; letter-spacing: 0.02em; @@ -356,13 +565,14 @@ html[data-lang="zh"] h3 { .icon-button:hover, .language-button:hover { - background: color-mix(in srgb, currentColor 9%, transparent); - opacity: 1; + background: var(--key-fill); + box-shadow: var(--key-shadow); + color: var(--ink); } .icon-button:active, .language-button:active { - transform: scale(0.9); + transform: scale(0.92); } .icon-button .i { @@ -384,7 +594,7 @@ html[data-lang="zh"] h3 { } /* -------------------------------------------------------------------------- - * 4. Hero —— 深色产品舞台 + * 6. Hero:乳白(或烟熏)底板上的一颗亚克力键帽 * -------------------------------------------------------------------------- */ .hero { position: relative; @@ -392,17 +602,13 @@ html[data-lang="zh"] h3 { min-height: 100svh; flex-direction: column; align-items: center; - padding: 136px 0 0; + padding: 128px 0 0; overflow: hidden; isolation: isolate; - background: - radial-gradient(120% 90% at 50% 110%, rgba(111, 196, 145, 0.14), transparent 55%), - linear-gradient(180deg, var(--stage-1) 0%, var(--stage-2) 52%, var(--stage-3) 100%); - color: var(--stage-ink); text-align: center; } -/* 背景层:极光 + 声波涟漪 + 点阵 + 指针光斑 */ +/* 背景层:柔光 + 声波涟漪 + 指针光斑 */ .hero-backdrop { position: absolute; z-index: -1; @@ -414,38 +620,37 @@ html[data-lang="zh"] h3 { .aurora { position: absolute; border-radius: 50%; - filter: blur(70px); - mix-blend-mode: screen; - opacity: 0.6; + filter: blur(80px); + opacity: 0.9; will-change: transform; } .aurora-a { - top: -220px; - left: calc(50% - 640px); + top: -240px; + left: calc(50% - 680px); width: 640px; height: 640px; - background: radial-gradient(circle, rgba(111, 196, 145, 0.5), transparent 66%); - animation: aurora-a 24s ease-in-out infinite alternate; + background: radial-gradient(circle, var(--glow-2), transparent 66%); + animation: aurora-a 26s ease-in-out infinite alternate; } .aurora-b { - top: 40px; - right: calc(50% - 660px); - width: 560px; - height: 560px; - background: radial-gradient(circle, rgba(70, 150, 190, 0.42), transparent 66%); - animation: aurora-b 28s ease-in-out infinite alternate; + top: 60px; + right: calc(50% - 700px); + width: 580px; + height: 580px; + background: radial-gradient(circle, var(--glow-3), transparent 66%); + animation: aurora-b 30s ease-in-out infinite alternate; } .aurora-c { - bottom: -220px; + top: 26%; left: 50%; - width: 900px; - height: 460px; - margin-left: -450px; - background: radial-gradient(closest-side, rgba(111, 196, 145, 0.32), transparent); - animation: aurora-c 19s ease-in-out infinite alternate; + width: 760px; + height: 420px; + margin-left: -380px; + background: radial-gradient(closest-side, var(--glow-1), transparent); + animation: aurora-c 21s ease-in-out infinite alternate; } @keyframes aurora-a { @@ -461,51 +666,43 @@ html[data-lang="zh"] h3 { } @keyframes aurora-c { - 0% { transform: translate3d(-80px, 0, 0) scale(1); } - 100% { transform: translate3d(80px, -40px, 0) scale(1.12); } + 0% { transform: translate3d(-60px, 0, 0) scale(1); } + 100% { transform: translate3d(60px, -30px, 0) scale(1.1); } } -/* 声波涟漪:三圈错相扩散,像一次持续的「开口」 */ +/* 声波涟漪:三圈错相扩散,像一次持续的「开口」;中性色,只做气氛 */ .hero-rings i { position: absolute; - top: 36%; + top: 24%; left: 50%; - width: 560px; - height: 560px; - margin: -280px 0 0 -280px; - border: 1px solid rgba(111, 196, 145, 0.28); + width: 520px; + height: 520px; + margin: -260px 0 0 -260px; + border: 1px solid var(--line-strong); border-radius: 50%; opacity: 0; - animation: ring-pulse 7.5s cubic-bezier(0.2, 0.6, 0.3, 1) infinite; + animation: ring-pulse 8s cubic-bezier(0.2, 0.6, 0.3, 1) infinite; } -.hero-rings i:nth-child(2) { animation-delay: 2.5s; } -.hero-rings i:nth-child(3) { animation-delay: 5s; } +.hero-rings i:nth-child(2) { animation-delay: 2.66s; } +.hero-rings i:nth-child(3) { animation-delay: 5.33s; } @keyframes ring-pulse { - 0% { opacity: 0; transform: scale(0.3); } + 0% { opacity: 0; transform: scale(0.25); } 14% { opacity: 0.9; } 100% { opacity: 0; transform: scale(2); } } -.hero-grid { - position: absolute; - inset: 0; - background-image: radial-gradient(rgba(255, 255, 255, 0.09) 1px, transparent 1px); - background-size: 28px 28px; - -webkit-mask-image: radial-gradient(ellipse 70% 55% at 50% 28%, #000 25%, transparent 75%); - mask-image: radial-gradient(ellipse 70% 55% at 50% 28%, #000 25%, transparent 75%); -} - -/* 指针光斑:--hx / --hy 由 site.js 以插值方式写入,移动有「拖尾」 */ +/* 指针光斑:--hx / --hy 由 site.js 以插值方式写入,像一盏灯照在亚克力上 */ .hero-spot { position: absolute; inset: 0; background: radial-gradient( - 560px circle at var(--hx, 50%) var(--hy, 30%), - rgba(111, 196, 145, 0.13), + 520px circle at var(--hx, 50%) var(--hy, 26%), + var(--sheen), transparent 62% ); + opacity: 0.8; } /* 文字层随滚动轻微上移淡出(--hp 为 Hero 滚动进度 0 → 1) */ @@ -516,66 +713,96 @@ html[data-lang="zh"] h3 { transform: translate3d(0, calc(var(--hp, 0) * -70px), 0); } -.launch-pill { - display: inline-flex; - align-items: center; - gap: 9px; - margin-bottom: 26px; - padding: 8px 16px; - border: 1px solid var(--stage-line); - border-radius: 999px; - background: rgba(255, 255, 255, 0.06); - -webkit-backdrop-filter: blur(12px); - backdrop-filter: blur(12px); - color: var(--stage-ink-2); - font-size: 0.82rem; - font-weight: 550; - letter-spacing: 0.01em; +/* 主视觉的第一眼:放大的应用图标,本身就是一颗亚克力键帽;缓慢悬浮,一道反光定期扫过 */ +.hero-mark { + position: relative; + width: 96px; + height: 96px; + margin: 0 auto 26px; } +.hero-mark img { + width: 100%; + height: 100%; + filter: drop-shadow(0 18px 22px rgba(21, 24, 26, 0.16)) drop-shadow(0 4px 6px rgba(21, 24, 26, 0.1)); + animation: mark-float 7s ease-in-out infinite; +} + +/* 反光只落在图标自身的形状里(用图标本身做遮罩) */ +.hero-mark::after { + position: absolute; + inset: 0; + background: linear-gradient(115deg, transparent 38%, rgba(255, 255, 255, 0.85) 50%, transparent 62%); + background-size: 300% 100%; + content: ""; + -webkit-mask: url("app-icon.png?v=20260927b") center / contain no-repeat; + mask: url("app-icon.png?v=20260927b") center / contain no-repeat; + mix-blend-mode: soft-light; + animation: mark-float 7s ease-in-out infinite, mark-sheen 7s ease-in-out infinite; +} + +@keyframes mark-float { + 0%, 100% { translate: 0 0; rotate: 0deg; } + 50% { translate: 0 -7px; rotate: -2deg; } +} + +@keyframes mark-sheen { + 0%, 55% { background-position: 100% 0; } + 80%, 100% { background-position: 0 0; } +} + +html[data-theme="dark"] .hero-mark img { + filter: drop-shadow(0 18px 26px rgba(0, 0, 0, 0.55)) drop-shadow(0 0 30px rgba(255, 255, 255, 0.06)); +} + +.launch-pill { + margin-bottom: 20px; + font-size: 0.8rem; +} + +/* 版本标签上的绿点:整屏唯一的绿色,表示「已上线」 */ .launch-dot { position: relative; width: 7px; height: 7px; border-radius: 50%; - background: var(--stage-accent); - box-shadow: 0 0 12px rgba(111, 196, 145, 0.9); + background: var(--accent); } .launch-dot::after { position: absolute; inset: 0; border-radius: 50%; - background: var(--stage-accent); + background: var(--accent); content: ""; animation: ping 2.4s cubic-bezier(0, 0, 0.2, 1) infinite; } @keyframes ping { - 0% { opacity: 0.8; transform: scale(1); } + 0% { opacity: 0.7; transform: scale(1); } 80%, 100% { opacity: 0; transform: scale(3); } } -/* H1 承载品类关键词;视觉上是一行流光小标,主口号在其下方 */ +/* H1 承载品类关键词;视觉上是一行小标,一道银色反光缓慢扫过 */ .hero-kicker { - margin: 0 auto 18px; + margin: 0 auto 16px; background: linear-gradient( 100deg, - var(--stage-accent) 0%, - var(--stage-accent) 38%, - #e2f7ea 50%, - var(--stage-accent) 62%, - var(--stage-accent) 100% + var(--ink-2) 0%, + var(--ink-2) 40%, + var(--ink-3) 50%, + var(--ink-2) 60%, + var(--ink-2) 100% ); background-size: 250% 100%; -webkit-background-clip: text; background-clip: text; color: transparent; - font-size: clamp(0.92rem, 1.4vw, 1.06rem); - font-weight: 650; - letter-spacing: 0.04em; + font-size: clamp(0.9rem, 1.3vw, 1.02rem); + font-weight: 600; + letter-spacing: 0.03em; line-height: 1.5; - animation: shimmer 6.5s linear infinite; + animation: shimmer 7s linear infinite; } @keyframes shimmer { @@ -584,33 +811,32 @@ html[data-lang="zh"] h3 { } .hero-slogan { - margin: 0 0 24px; + margin: 0 0 22px; } .slogan-main { display: block; - font-size: clamp(3rem, 7.6vw, 5.7rem); - font-weight: 700; + font-size: clamp(2.9rem, 7.2vw, 5.4rem); + font-weight: 680; letter-spacing: -0.045em; - line-height: 1.02; - text-shadow: 0 0 60px rgba(111, 196, 145, 0.18); + line-height: 1.04; } .slogan-sub { display: block; - margin-top: 14px; - color: var(--stage-ink-2); - font-size: clamp(1.35rem, 2.8vw, 2.1rem); - font-weight: 600; + margin-top: 12px; + color: var(--ink-2); + font-size: clamp(1.3rem, 2.6vw, 1.95rem); + font-weight: 560; letter-spacing: -0.02em; line-height: 1.25; } .hero-copy { - max-width: 640px; - margin: 0 auto 34px; - color: var(--stage-ink-2); - font-size: 1.08rem; + max-width: 620px; + margin: 0 auto 32px; + color: var(--ink-2); + font-size: 1.06rem; line-height: 1.7; } @@ -619,18 +845,19 @@ html[data-lang="zh"] h3 { align-items: center; justify-content: center; flex-wrap: wrap; - gap: 18px; - margin-bottom: 28px; + gap: 14px; + margin-bottom: 26px; } +/* App Store / Mac 官方徽章:按 Apple 营销规范原样使用,只加一层悬停浮起 */ .store-badge { display: inline-flex; - border-radius: 12px; + border-radius: 10px; transition: transform 0.5s var(--ease-spring), filter 0.3s ease; } .store-badge:hover { - filter: drop-shadow(0 10px 24px rgba(111, 196, 145, 0.25)); + filter: drop-shadow(0 10px 18px rgba(21, 24, 26, 0.22)); } .store-badge img { @@ -638,59 +865,15 @@ html[data-lang="zh"] h3 { height: 48px; } -.ghost-action { - display: inline-flex; - align-items: center; - gap: 8px; - padding: 12px 22px; - border: 1px solid var(--stage-line); - border-radius: 999px; - background: rgba(255, 255, 255, 0.06); - color: var(--stage-ink); - font-size: 0.95rem; - font-weight: 600; - transition: background 0.25s ease, border-color 0.25s ease, transform 0.5s var(--ease-spring); -} - -.ghost-action:hover { - border-color: rgba(111, 196, 145, 0.45); - background: rgba(111, 196, 145, 0.12); -} - -.ghost-action .i { - width: 17px; - height: 17px; - transition: transform 0.5s var(--ease-spring); -} - -.ghost-action:hover .i { - transform: translate(3px, -3px) rotate(-8deg); -} - -.text-action { - color: var(--stage-ink-2); - font-size: 0.95rem; - font-weight: 550; - text-decoration: underline; - text-decoration-color: var(--stage-line); - text-underline-offset: 5px; - transition: color 0.2s ease, text-decoration-color 0.2s ease; -} - -.text-action:hover { - color: var(--stage-ink); - text-decoration-color: var(--stage-accent); -} - .hero-trust { display: flex; align-items: center; justify-content: center; flex-wrap: wrap; - gap: 10px 28px; - margin: 0 0 44px; + gap: 10px 26px; + margin: 0 0 40px; padding: 0; - color: var(--stage-ink-2); + color: var(--ink-3); font-size: 0.86rem; list-style: none; } @@ -704,7 +887,6 @@ html[data-lang="zh"] h3 { .hero-trust .i { width: 16px; height: 16px; - color: var(--stage-accent); } /* 主视觉舞台:透视容器,内部设备图随滚动从后仰 14° 立到正视 */ @@ -724,10 +906,14 @@ html[data-lang="zh"] h3 { .hero-devices img { width: 100%; height: auto; - filter: drop-shadow(0 48px 80px rgba(0, 0, 0, 0.5)); + filter: drop-shadow(0 40px 60px var(--shadow-device)); } -/* 语音胶囊:毛玻璃深色药丸,悬浮在 Mac 屏幕下沿 */ +/* + * 语音胶囊:一块悬浮的亚克力面板(圆角长方形),里面的麦克风胶囊与键盘真实组件同色同形。 + * 待机 = 品牌绿 + 麦克风;录音 = 红色 + 7 条声波;长按问 AI = 青色 + 声波; + * 处理中 = 半透明红 + 转圈;插入成功 = 品牌绿 + 对勾。状态类由 site.js 切换。 + */ .voice-capsule { position: absolute; z-index: 2; @@ -737,22 +923,11 @@ html[data-lang="zh"] h3 { max-width: 92%; align-items: center; gap: 14px; - padding: 9px 22px 9px 10px; - border: 1px solid rgba(255, 255, 255, 0.12); - border-radius: 999px; - background: rgba(14, 16, 19, 0.74); - -webkit-backdrop-filter: blur(18px) saturate(1.6); - backdrop-filter: blur(18px) saturate(1.6); - box-shadow: 0 28px 60px -18px rgba(0, 0, 0, 0.75), inset 0 1px 0 rgba(255, 255, 255, 0.08); - color: var(--stage-ink); + padding: 9px 20px 9px 9px; + border-radius: 18px; translate: -50% 0; } -/* - * 麦克风胶囊:与键盘真实组件同色同形(156×60pt 的胶囊按比例缩小)。 - * 待机 = 品牌绿 + 麦克风;录音 = 红色 + 7 条声波;长按问 AI = 青色 + 声波; - * 处理中 = 半透明红 + 转圈;插入成功 = 品牌绿 + 对勾。状态类由 site.js 切换。 - */ .capsule-mic { position: relative; display: grid; @@ -819,14 +994,10 @@ html[data-lang="zh"] h3 { } /* 声波条:site.js 每帧写 scaleY,只动 transform,不触发布局 */ -.capsule-wave, -.mic-wave { - display: flex; - align-items: center; -} - .capsule-wave { + display: flex; height: 16px; + align-items: center; gap: 2.5px; } @@ -834,7 +1005,7 @@ html[data-lang="zh"] h3 { width: 2.5px; height: 100%; border-radius: 2px; - background: #ffc7c7; + background: #ffd6d6; transform: scaleY(0.14); } @@ -843,8 +1014,7 @@ html[data-lang="zh"] h3 { } /* 系统风格的转圈:处理中状态 */ -.capsule-spin, -.mic-spin { +.capsule-spin { width: 15px; height: 15px; border: 2px solid rgba(255, 255, 255, 0.35); @@ -869,20 +1039,20 @@ html[data-lang="zh"] h3 { .capsule-tag { flex: none; - padding: 3px 10px; - border-radius: 999px; - background: rgba(111, 196, 145, 0.16); - color: var(--stage-accent); + padding: 3px 9px; + border-radius: 7px; + background: var(--line); + color: var(--ink-2); font-size: 0.74rem; - font-weight: 700; - letter-spacing: 0.04em; + font-weight: 650; + letter-spacing: 0.03em; transition: background 0.3s ease, color 0.3s ease; } /* 标签颜色跟随胶囊状态:问 AI 用青色,与麦克风胶囊呼应 */ .voice-capsule:is(.is-ai, .is-ai-busy) .capsule-tag { - background: color-mix(in srgb, var(--kb-teal) 22%, transparent); - color: #7fded4; + background: color-mix(in srgb, var(--kb-teal) 16%, transparent); + color: color-mix(in srgb, var(--kb-teal) 70%, var(--ink)); } .capsule-line { @@ -898,7 +1068,7 @@ html[data-lang="zh"] h3 { flex: none; margin-left: 1px; border-radius: 1px; - background: var(--stage-accent); + background: var(--ink-2); vertical-align: -0.18em; animation: caret-blink 1.05s steps(1) infinite; } @@ -907,6 +1077,7 @@ html[data-lang="zh"] h3 { 50% { opacity: 0; } } +/* 向下滚动提示:圆角长方形的「鼠标」轮廓 */ .scroll-cue { position: absolute; z-index: 3; @@ -917,8 +1088,8 @@ html[data-lang="zh"] h3 { height: 38px; justify-items: center; padding-top: 7px; - border: 1.5px solid rgba(255, 255, 255, 0.28); - border-radius: 999px; + border: 1.5px solid var(--line-strong); + border-radius: 12px; opacity: calc(1 - var(--hp, 0) * 4); } @@ -926,7 +1097,7 @@ html[data-lang="zh"] h3 { width: 3px; height: 8px; border-radius: 3px; - background: var(--stage-ink); + background: var(--ink-3); animation: cue 2s var(--ease-in-out) infinite; } @@ -956,7 +1127,7 @@ html.js .voice-capsule { } /* -------------------------------------------------------------------------- - * 5. 逐字动效(data-split) + * 7. 逐字动效(data-split) * site.js 把文字拆成 .w(词,防止英文断词)与 .ch(字符), * 每个字符带 --ci 序号,延迟 = 基础延迟 + 序号 × 步长。 * -------------------------------------------------------------------------- */ @@ -980,8 +1151,8 @@ html.js .hero-slogan .ch { animation-delay: calc(var(--base, 0.2s) + var(--ci) * var(--step, 45ms)); } -.slogan-main { --base: 0.22s; --step: 52ms; } -.slogan-sub { --base: 0.52s; --step: 24ms; } +.slogan-main { --base: 0.3s; --step: 52ms; } +.slogan-sub { --base: 0.6s; --step: 24ms; } @keyframes char-in { from { opacity: 0; filter: blur(10px); transform: translateY(0.55em) rotate(3deg); } @@ -1004,21 +1175,19 @@ html.js .reveal.is-visible [data-split] .ch { } /* -------------------------------------------------------------------------- - * 6. 能力跑马灯 + * 8. 能力跑马灯:一行安静的中性色小字 * -------------------------------------------------------------------------- */ .marquee { overflow: hidden; - padding: 12px 0; - border-bottom: 1px solid var(--line); - background: var(--canvas); - -webkit-mask-image: linear-gradient(90deg, transparent, #000 9%, #000 91%, transparent); - mask-image: linear-gradient(90deg, transparent, #000 9%, #000 91%, transparent); + padding: 14px 0; + -webkit-mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent); + mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent); } .marquee-track { display: flex; width: max-content; - animation: marquee 52s linear infinite; + animation: marquee 56s linear infinite; } .marquee:hover .marquee-track { @@ -1039,22 +1208,21 @@ html.js .reveal.is-visible [data-split] .ch { padding-right: 16px; color: var(--ink-3); font-size: clamp(0.6rem, 0.9vw, 0.72rem); - font-weight: 650; - letter-spacing: -0.01em; + font-weight: 600; + letter-spacing: 0.01em; white-space: nowrap; } .marquee li:nth-child(-n + 3) { - color: var(--ink); + color: var(--ink-2); } .marquee li::after { width: 4px; height: 4px; border-radius: 50%; - background: var(--accent); + background: var(--line-strong); content: ""; - opacity: 0.55; } @keyframes marquee { @@ -1062,14 +1230,10 @@ html.js .reveal.is-visible [data-split] .ch { } /* -------------------------------------------------------------------------- - * 7. 通用区块节奏 + * 9. 区块节奏:所有区块共用同一块底板,靠留白而不是色带分隔 * -------------------------------------------------------------------------- */ .section { - padding: clamp(88px, 11vw, 136px) 0; -} - -.section-alt { - background: var(--surface-soft); + padding: clamp(80px, 10vw, 128px) 0; } .section-inner { @@ -1079,29 +1243,29 @@ html.js .reveal.is-visible [data-split] .ch { .eyebrow { margin-bottom: 14px; - color: var(--accent); - font-size: 0.82rem; + color: var(--ink-3); + font-size: 0.8rem; font-weight: 650; - letter-spacing: 0.06em; + letter-spacing: 0.08em; } h2 { margin-bottom: 18px; - font-size: clamp(1.9rem, 3.8vw, 2.8rem); - font-weight: 700; - letter-spacing: -0.024em; + font-size: clamp(1.9rem, 3.7vw, 2.75rem); + font-weight: 680; + letter-spacing: -0.026em; line-height: 1.14; } h3 { - font-size: 1.12rem; - font-weight: 650; + font-size: 1.1rem; + font-weight: 640; letter-spacing: -0.01em; } .center-heading { max-width: 700px; - margin: 0 auto clamp(48px, 6vw, 72px); + margin: 0 auto clamp(44px, 6vw, 68px); text-align: center; } @@ -1110,24 +1274,18 @@ h3 { font-size: 1.05rem; } -/* 分栏布局:文案 + 媒体 */ +/* 分栏布局:文案 + 真机 */ .split-layout { display: grid; align-items: center; gap: clamp(40px, 6vw, 88px); - grid-template-columns: 1.02fr 1fr; -} - -/* 账号段落只保留文字,限制行宽保证可读性 */ -.account-layout .feature-copy { - max-width: 760px; + grid-template-columns: 1.05fr 1fr; } .split-layout.reverse .feature-copy { order: 2; } -.split-layout.reverse .media-frame, .split-layout.reverse .device-stage { order: 1; } @@ -1145,124 +1303,18 @@ h3 { font-size: 0.92rem; } -/* 实机媒体框:边框 + 定向长投影,呼应 iOS 端 2.1 的卡片层次 */ -.media-frame { +/* 嵌在面板里的小画面(截图 / 录屏):同心圆角 = 卡片圆角 − 内边距 */ +.media-inset { overflow: hidden; - border: 1px solid var(--line); - border-radius: var(--radius-lg); - background: var(--surface-strong); - box-shadow: var(--shadow-media); -} - -.media-frame video, -.media-frame img { - width: 100%; - height: auto; + border-radius: calc(var(--r-card) - 12px); + background: var(--canvas); + box-shadow: 0 0 0 1px var(--line); } /* -------------------------------------------------------------------------- - * 8. 四种输入方式速览 - * -------------------------------------------------------------------------- */ -.ways-section { - padding: clamp(64px, 8vw, 96px) 0; -} - -.ways-grid { - display: grid; - gap: 16px; - grid-template-columns: repeat(4, 1fr); -} - -.way-card { - display: block; - padding: 26px 24px 24px; - border: 1px solid var(--line); - border-radius: var(--radius-lg); - background: var(--surface); - transition: transform 0.5s var(--ease-out), box-shadow 0.35s ease, border-color 0.35s ease; -} - -.way-card:hover { - border-color: var(--line-strong); - box-shadow: var(--shadow-card); -} - -.way-icon { - position: relative; - display: inline-grid; - width: 46px; - height: 46px; - margin-bottom: 18px; - place-items: center; - border-radius: 14px; - background: var(--accent-soft); - color: var(--accent); -} - -.way-icon .i { - width: 23px; - height: 23px; -} - -/* 图标微动效:每张卡片一个与功能对应的小动作 */ -.way-icon-mic::after { - position: absolute; - inset: 0; - border: 1.5px solid var(--accent); - border-radius: inherit; - content: ""; - opacity: 0; -} - -.way-card:hover .way-icon-mic::after { - animation: orb-ripple 1.4s cubic-bezier(0.2, 0.6, 0.3, 1) infinite; -} - -.way-card:hover .way-icon-sparkle .i { - animation: twinkle 0.9s var(--ease-spring); -} - -.way-card:hover .way-icon-bubble .i { - animation: bob 0.9s var(--ease-spring); -} - -.way-card:hover .way-icon-paste .i { - animation: drop 0.9s var(--ease-spring); -} - -@keyframes twinkle { - 0% { transform: scale(1) rotate(0); } - 40% { transform: scale(0.7) rotate(-40deg); } - 100% { transform: scale(1) rotate(0); } -} - -@keyframes bob { - 0% { transform: translateY(0); } - 35% { transform: translateY(-5px) rotate(-6deg); } - 100% { transform: translateY(0); } -} - -@keyframes drop { - 0% { transform: translateY(0); } - 35% { transform: translateY(4px) scale(0.92); } - 100% { transform: translateY(0); } -} - -.way-card h3 { - margin-bottom: 6px; -} - -.way-card p { - margin: 0; - color: var(--ink-2); - font-size: 0.92rem; - line-height: 1.55; -} - -/* -------------------------------------------------------------------------- - * 9. 滚动叙事(三幕剧) + * 10. 滚动叙事(四幕) * 滚动进度决定当前幕;手机里播放这一幕的真机录屏,幕内进度条跟随播放进度(--ap)。 - * 无 JavaScript 时三幕文案平铺,手机停在第一幕的首帧。 + * 无 JavaScript 时四幕文案平铺,手机停在第一幕的首帧。 * -------------------------------------------------------------------------- */ .story-section { padding-bottom: 0; @@ -1274,7 +1326,7 @@ h3 { .story { position: relative; - height: 430vh; + height: 520vh; } .story-sticky { @@ -1284,7 +1336,7 @@ h3 { height: 100vh; height: 100svh; align-items: center; - padding-top: 64px; + padding-top: 70px; } .story-layout { @@ -1299,36 +1351,44 @@ h3 { .story-acts { display: grid; max-width: 540px; - gap: 12px; + gap: 8px; margin: 0; padding: 0; list-style: none; } +/* 未激活的幕只是文字;激活的幕浮起成一块亚克力面板 */ .story-act { display: flex; - gap: 22px; - padding: 22px 24px; - border-radius: var(--radius-lg); - opacity: 0.36; + gap: 20px; + padding: 18px 22px; + border-radius: var(--r-card); + opacity: 0.42; transition: opacity 0.5s ease, background 0.5s ease, box-shadow 0.5s ease, transform 0.7s var(--ease-out); } .story-act.is-active { - background: var(--surface); - box-shadow: var(--shadow-card), inset 0 0 0 1px var(--line); + background: var(--grain), var(--acrylic-fill); + box-shadow: var(--acrylic-shadow); opacity: 1; transform: translateX(6px); + -webkit-backdrop-filter: var(--acrylic-blur); + backdrop-filter: var(--acrylic-blur); } .act-index { - padding-top: 3px; - color: var(--accent); - font-size: 0.82rem; + padding-top: 2px; + color: var(--ink-3); + font-size: 0.8rem; font-variant-numeric: tabular-nums; font-weight: 700; letter-spacing: 0.04em; + transition: color 0.4s ease; +} + +.story-act.is-active .act-index { + color: var(--accent-ink); } .act-body { @@ -1336,31 +1396,37 @@ h3 { } .act-kicker { - margin: 0 0 6px; - color: var(--accent); - font-size: 0.8rem; - font-weight: 700; + margin: 0 0 4px; + color: var(--ink-3); + font-size: 0.78rem; + font-weight: 650; letter-spacing: 0.06em; } .act-body h3 { - margin-bottom: 8px; - font-size: clamp(1.22rem, 2vw, 1.55rem); + margin-bottom: 6px; + font-size: clamp(1.16rem, 1.8vw, 1.42rem); letter-spacing: -0.02em; } .act-body > p:not(.act-kicker) { margin: 0; color: var(--ink-2); - font-size: 0.97rem; + font-size: 0.95rem; } -/* 幕内进度条:--ap 由 site.js 写入(0 → 1) */ +/* 未激活的幕收起正文,只留标题,四幕才放得进一屏 */ +html.js .story-act:not(.is-active) .act-body > p:not(.act-kicker), +html.js .story-act:not(.is-active) .act-bar { + display: none; +} + +/* 幕内进度条:--ap 由 site.js 写入(0 → 1);绿色只用在这根指示线上 */ .act-bar { display: block; overflow: hidden; height: 2px; - margin-top: 16px; + margin-top: 14px; border-radius: 2px; background: var(--line); } @@ -1374,27 +1440,28 @@ h3 { transition: transform 0.3s linear; } -/* 舞台:真机 + 背后呼吸光晕 */ +/* 舞台:真机 + 背后一团呼吸的白光 */ .story-device { position: relative; display: grid; place-items: center; } -.story-device::before { +.story-device::before, +.device-stage::before { position: absolute; - width: 140%; - height: 80%; + width: 130%; + height: 76%; border-radius: 50%; - background: radial-gradient(closest-side, color-mix(in srgb, var(--accent) 26%, transparent), transparent); + background: radial-gradient(closest-side, var(--glow-1), transparent); content: ""; filter: blur(30px); animation: device-glow 6s ease-in-out infinite; } @keyframes device-glow { - 0%, 100% { opacity: 0.45; transform: scale(1); } - 50% { opacity: 0.85; transform: scale(1.08); } + 0%, 100% { opacity: 0.6; transform: scale(1); } + 50% { opacity: 1; transform: scale(1.06); } } /* -------------------------------------------------------------------------- @@ -1407,7 +1474,7 @@ h3 { position: relative; width: var(--w); aspect-ratio: 1350 / 2760; - filter: drop-shadow(0 40px 48px rgba(8, 12, 16, 0.26)) drop-shadow(0 12px 16px rgba(8, 12, 16, 0.14)); + filter: drop-shadow(0 40px 48px var(--shadow-device)) drop-shadow(0 12px 16px rgba(8, 12, 16, 0.12)); } .iphone-screen { @@ -1449,6 +1516,7 @@ h3 { /* 分栏区块里的真机:与文案并排居中 */ .device-stage { + position: relative; display: grid; margin: 0; place-items: center; @@ -1459,97 +1527,67 @@ h3 { } /* -------------------------------------------------------------------------- - * 10. 数字带 + * 11. 嘴替输入法:三块面板 * -------------------------------------------------------------------------- */ -.numbers-section { - padding: clamp(64px, 8vw, 104px) 0; -} - -.numbers-grid { +.personal-grid { display: grid; - gap: 28px; - grid-template-columns: repeat(4, 1fr); + gap: 20px; + grid-template-columns: repeat(3, 1fr); } -.number { - position: relative; - padding-top: 24px; +.personal-card { + display: flex; + flex-direction: column; + padding: 12px; } -/* 顶部细线随进场从左向右「画」出 */ -.number::before { - position: absolute; - top: 0; - right: 0; - left: 0; - height: 1px; - background: linear-gradient(90deg, var(--accent), var(--line-strong) 40%); - content: ""; - transform-origin: 0 50%; - transition: transform 1.3s var(--ease-out) var(--d, 0s); +/* 截图本身就是一张带底色的卡片:完整显示(contain),像一张小卡片浮在面板里 */ +.personal-media { + display: grid; + aspect-ratio: 4 / 3; + place-items: center; + padding: 14px; } -html.js .number:not(.is-visible)::before { - transform: scaleX(0); +.personal-media img { + width: 100%; + height: 100%; + object-fit: contain; + filter: drop-shadow(0 8px 14px rgba(21, 24, 26, 0.1)); + transition: transform 1.2s var(--ease-out); } -.number strong { - display: block; - margin-bottom: 12px; - background: linear-gradient(180deg, var(--ink) 30%, color-mix(in srgb, var(--ink) 50%, var(--accent))); - -webkit-background-clip: text; - background-clip: text; - color: transparent; - font-size: clamp(2.4rem, 4.8vw, 3.7rem); - font-variant-numeric: tabular-nums; - font-weight: 700; - letter-spacing: -0.045em; - line-height: 1; +.personal-media.is-video { + padding: 0; } -.number span { - display: block; - max-width: 24ch; +.personal-media video { + width: 100%; + height: 100%; + object-fit: cover; + object-position: top center; + transition: transform 1.2s var(--ease-out); +} + +.personal-card:hover .personal-media img, +.personal-card:hover .personal-media video { + transform: scale(1.03); +} + +.personal-card h3 { + margin: 20px 12px 8px; +} + +.personal-card p { + margin: 0; + padding: 0 12px 14px; color: var(--ink-2); font-size: 0.94rem; } /* -------------------------------------------------------------------------- - * 11. 功能区块细节 + * 12. 功能区块:技能 / 打字 * -------------------------------------------------------------------------- */ -.step-list { - display: grid; - gap: 20px; - margin: 30px 0 0; - padding: 0; - list-style: none; -} - -.step-list li { - display: flex; - align-items: flex-start; - gap: 18px; -} - -.step-index { - padding-top: 2px; - color: var(--accent); - font-size: 0.82rem; - font-variant-numeric: tabular-nums; - font-weight: 700; - letter-spacing: 0.04em; -} - -.step-list h3 { - margin-bottom: 4px; -} - -.step-list p { - margin: 0; - color: var(--ink-2); - font-size: 0.95rem; -} - .mini-feature { margin-top: 24px; } @@ -1564,7 +1602,7 @@ html.js .number:not(.is-visible)::before { .mini-feature h3 .i { width: 19px; height: 19px; - color: var(--accent); + color: var(--ink-3); } .mini-feature p { @@ -1580,37 +1618,27 @@ html.js .number:not(.is-visible)::before { margin: 26px 0 4px; } -.skill-chips > span { - display: inline-flex; - align-items: center; - gap: 7px; - padding: 8px 15px; - border: 1px solid var(--line); - border-radius: 999px; - background: var(--surface); - font-size: 0.88rem; - font-weight: 550; - transition: transform 0.5s var(--ease-spring), border-color 0.25s ease, color 0.25s ease; +.skill-chips .chip { + color: var(--ink); + transition: transform 0.5s var(--ease-spring), box-shadow 0.25s ease; } -.skill-chips > span:hover { - border-color: color-mix(in srgb, var(--accent) 50%, transparent); - color: var(--accent); +.skill-chips .chip:hover { transform: translateY(-3px); } .skill-chips .i { width: 15px; height: 15px; - color: var(--accent); + color: var(--ink-3); } /* 进场用 animation 而非 transition,避免进场延迟拖慢之后的悬停反馈 */ -html.js .reveal:not(.is-visible) .skill-chips > span { +html.js .reveal:not(.is-visible) .skill-chips .chip { opacity: 0; } -html.js .reveal.is-visible .skill-chips > span { +html.js .reveal.is-visible .skill-chips .chip { animation: chip-in 0.8s var(--ease-spring) both; animation-delay: calc(0.3s + var(--ci, 0) * 60ms); } @@ -1637,11 +1665,11 @@ html.js .reveal.is-visible .skill-chips > span { .quiet-list li::before { position: absolute; - top: 2px; + top: 3px; left: 0; width: 16px; height: 16px; - color: var(--accent); + color: var(--ink-3); /* 内联 check 图标,避免外部字体依赖 */ content: ""; -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7.5'/%3E%3C/svg%3E") center / contain no-repeat; @@ -1649,89 +1677,80 @@ html.js .reveal.is-visible .skill-chips > span { background: currentColor; } -/* -------------------------------------------------------------------------- - * 12. 嘴替输入法(2.1 卖点) - * -------------------------------------------------------------------------- */ -.personal-grid { +/* 数字:进入视口时滚动计数(无 JS 时直接显示最终数值) */ +.stat-row { display: grid; - gap: 20px; - grid-template-columns: repeat(3, 1fr); + gap: 12px; + margin-top: 28px; + grid-template-columns: 1fr 1fr; } -.personal-card { - overflow: hidden; - border: 1px solid var(--line); - border-radius: var(--radius-xl); - background: var(--surface); - transition: transform 0.5s var(--ease-out), box-shadow 0.35s ease; +.stat { + padding: 18px 20px; } -.personal-card:hover { - box-shadow: var(--shadow-card); - transform: translateY(-6px); +.stat strong { + display: block; + margin-bottom: 4px; + font-size: clamp(1.9rem, 3.4vw, 2.5rem); + font-variant-numeric: tabular-nums; + font-weight: 680; + letter-spacing: -0.04em; + line-height: 1.05; } -.personal-media { - overflow: hidden; - aspect-ratio: 4 / 3; - background: var(--surface-strong); -} - -.personal-media img, -.personal-media video { - width: 100%; - height: 100%; - object-fit: cover; - object-position: top center; - transition: transform 1.2s var(--ease-out); -} - -.personal-card:hover .personal-media img, -.personal-card:hover .personal-media video { - transform: scale(1.04); -} - -.personal-card h3 { - margin: 22px 24px 8px; -} - -.personal-card p { - margin: 0; - padding: 0 24px 26px; +.stat span { + display: block; color: var(--ink-2); - font-size: 0.94rem; + font-size: 0.88rem; + line-height: 1.5; } /* -------------------------------------------------------------------------- - * 13. 隐私:三种服务路径(深色舞台) + * 13. 隐私:整页唯一的烟熏亚克力面板(含可选账号) * -------------------------------------------------------------------------- */ -.privacy-section { - --spot-color: var(--stage-accent); - background: linear-gradient(180deg, var(--stage-2), var(--stage-3)); - color: var(--stage-ink); +.privacy-panel { + position: relative; + padding: clamp(36px, 6vw, 72px) clamp(20px, 5vw, 56px) clamp(24px, 4vw, 40px); + overflow: hidden; + isolation: isolate; } -.center-heading.inverse p:not(.eyebrow) { - color: var(--stage-ink-2); +/* 面板顶部一团极淡的光,像灯从上方照进烟熏亚克力 */ +.privacy-panel::before { + position: absolute; + z-index: -1; + top: -40%; + left: 50%; + width: 760px; + height: 520px; + margin-left: -380px; + border-radius: 50%; + background: radial-gradient(closest-side, rgba(255, 255, 255, 0.08), transparent); + content: ""; } -.privacy-section .eyebrow { - color: var(--stage-accent); +.privacy-panel .center-heading p:not(.eyebrow) { + color: var(--smoke-ink-2); +} + +.privacy-panel .eyebrow { + color: var(--smoke-ink-2); } /* 端侧徽记:声波在设备轮廓内跳动,轨道粒子绕行但从不越界 */ .device-emblem { position: relative; - width: 124px; - height: 124px; - margin: 0 auto 26px; + width: 112px; + height: 112px; + margin: 0 auto 24px; } .device-emblem::before { position: absolute; inset: -20%; border-radius: 50%; - background: radial-gradient(closest-side, rgba(111, 196, 145, 0.28), transparent); + background: radial-gradient(closest-side, rgba(79, 203, 104, 0.2), transparent); content: ""; animation: breathe 4s ease-in-out infinite; } @@ -1749,15 +1768,15 @@ html.js .reveal.is-visible .skill-chips > span { .emblem-orbit { fill: none; - stroke: rgba(111, 196, 145, 0.4); + stroke: rgba(255, 255, 255, 0.22); stroke-dasharray: 2 6; stroke-width: 1; } .emblem-spin { - fill: var(--stage-accent); + fill: var(--smoke-ink-2); transform-origin: 80px 80px; - animation: spin 10s linear infinite; + animation: orbit 10s linear infinite; } .emblem-spin-rev { @@ -1766,18 +1785,18 @@ html.js .reveal.is-visible .skill-chips > span { animation-duration: 15s; } -@keyframes spin { +@keyframes orbit { to { transform: rotate(360deg); } } .emblem-device { - fill: rgba(255, 255, 255, 0.04); - stroke: rgba(255, 255, 255, 0.42); + fill: rgba(255, 255, 255, 0.05); + stroke: rgba(255, 255, 255, 0.4); stroke-width: 1.5; } .emblem-wave rect { - fill: var(--stage-accent); + fill: var(--smoke-accent); transform-box: fill-box; transform-origin: center; animation: eq 1.3s ease-in-out infinite; @@ -1793,128 +1812,156 @@ html.js .reveal.is-visible .skill-chips > span { 50% { transform: scaleY(1); } } +/* 烟熏面板里的子卡片:同一种材质再叠一层,靠高光和更亮的底区分 */ .service-paths { display: grid; align-items: stretch; - gap: 18px; - grid-template-columns: 1.25fr 1fr 1fr; + gap: 14px; + grid-template-columns: 1.2fr 1fr 1fr; } -.service-paths article { +.smoke-card { position: relative; - padding: 30px 28px 26px; - border: 1px solid var(--stage-line); - border-radius: var(--radius-xl); + padding: 26px 24px 22px; + border-radius: calc(var(--r-panel) - 12px); background: rgba(255, 255, 255, 0.045); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08), 0 0 0 1px var(--smoke-line); } -.service-paths .path-primary { - border-color: rgba(111, 196, 145, 0.35); - background: rgba(111, 196, 145, 0.08); +.smoke-card.is-primary { + background: rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.14), 0 0 0 1px rgba(255, 255, 255, 0.14); } +/* 「默认」标签:烟熏面板里唯一的绿色 */ .path-badge { position: absolute; - top: 22px; - right: 24px; - padding: 4px 11px; - border-radius: 999px; - background: var(--stage-accent); - color: #0c0e12; + top: 20px; + right: 20px; + padding: 4px 10px; + border-radius: 8px; + background: color-mix(in srgb, var(--smoke-accent) 18%, transparent); + color: var(--smoke-accent); font-size: 0.72rem; font-weight: 700; letter-spacing: 0.05em; } .path-icon { - width: 26px; - height: 26px; - margin-bottom: 18px; - color: var(--stage-accent); + width: 24px; + height: 24px; + margin-bottom: 16px; + color: var(--smoke-ink-2); } -.service-paths h3 { - margin-bottom: 10px; - font-size: 1.25rem; +.smoke-card h3 { + margin-bottom: 8px; + font-size: 1.18rem; } -.service-paths p { - color: var(--stage-ink-2); - font-size: 0.95rem; +.smoke-card p { + color: var(--smoke-ink-2); + font-size: 0.94rem; } .path-note { display: block; - margin-top: 18px; + margin-top: 16px; padding-top: 14px; - border-top: 1px solid var(--stage-line); - color: var(--stage-ink-2); + border-top: 1px solid var(--smoke-line); + color: var(--smoke-ink-2); font-size: 0.82rem; letter-spacing: 0.01em; } +/* 可选账号:并入隐私面板,标题 + 两列要点 */ +.account-row { + display: grid; + align-items: start; + gap: 18px 40px; + margin-top: 14px; + padding: 26px 28px; + grid-template-columns: minmax(200px, 0.8fr) 2fr; +} + +.account-row h3 { + margin: 0 0 6px; + font-size: 1.12rem; +} + +.account-row > div > p { + margin: 0; + color: var(--smoke-ink-2); + font-size: 0.9rem; +} + +.account-row .quiet-list { + margin: 0; + color: var(--smoke-ink-2); + font-size: 0.92rem; + grid-template-columns: 1fr 1fr; + gap: 12px 28px; +} + +.account-row .quiet-list li::before { + color: rgba(255, 255, 255, 0.4); +} + .privacy-proof { display: flex; align-items: center; justify-content: space-between; - gap: 32px; - margin-top: 22px; - padding: 26px 30px; - border: 1px solid var(--stage-line); - border-radius: var(--radius-xl); - background: rgba(255, 255, 255, 0.045); + gap: 28px; + margin-top: 14px; + padding: 22px 28px; } .privacy-proof > div { display: flex; align-items: center; - gap: 16px; + gap: 20px; } -.privacy-proof .i { - width: 26px; - height: 26px; +/* 「0」:0 个第三方追踪 SDK,从 99 倒数到 0 */ +.privacy-proof strong { flex: none; - color: var(--stage-accent); + font-size: 2.6rem; + font-variant-numeric: tabular-nums; + font-weight: 680; + letter-spacing: -0.04em; + line-height: 1; } .privacy-proof h3 { margin: 0; - font-size: 1.02rem; - font-weight: 600; + color: var(--smoke-ink); + font-size: 1rem; + font-weight: 560; letter-spacing: 0; } -.inverse-link { - display: inline-flex; +/* 烟熏面板里的键帽:深色版 */ +.acrylic-smoke .keycap { flex: none; - align-items: center; - gap: 7px; - color: var(--stage-ink); - font-size: 0.92rem; - font-weight: 600; - text-decoration: underline; - text-decoration-color: var(--stage-line); - text-underline-offset: 5px; - transition: text-decoration-color 0.2s ease; + background: linear-gradient(180deg, rgba(255, 255, 255, 0.12), rgba(255, 255, 255, 0.06)); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.16), + inset 0 -2px 0 rgba(0, 0, 0, 0.3), + 0 0 0 1px rgba(255, 255, 255, 0.1), + 0 8px 18px -8px rgba(0, 0, 0, 0.6); + color: var(--smoke-ink); } -.inverse-link:hover { - text-decoration-color: var(--stage-ink); +.acrylic-smoke .keycap:active { + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255, 255, 255, 0.08); } -.inverse-link .i { - width: 15px; - height: 15px; - transition: transform 0.5s var(--ease-spring); -} - -.inverse-link:hover .i { - transform: translate(3px, -3px); +.acrylic-smoke .keycap .i { + color: var(--smoke-ink-2); } /* -------------------------------------------------------------------------- - * 14. 平台 + * 14. 平台 + 稳定性 * -------------------------------------------------------------------------- */ .platform-grid { display: grid; @@ -1923,25 +1970,14 @@ html.js .reveal.is-visible .skill-chips > span { } .platform-card { - overflow: hidden; - border: 1px solid var(--line); - border-radius: var(--radius-xl); - background: var(--surface); - transition: box-shadow 0.35s ease; + padding: 12px; } -.platform-card:hover { - box-shadow: var(--shadow-card); -} - -.platform-card .media-frame { - margin: 14px 14px 0; +.platform-card .media-inset { aspect-ratio: 4 / 3; - border-radius: var(--radius-md); - box-shadow: none; } -.platform-card .media-frame img { +.platform-card .media-inset img { width: 100%; height: 100%; object-fit: cover; @@ -1949,26 +1985,26 @@ html.js .reveal.is-visible .skill-chips > span { transition: transform 1.4s var(--ease-out); } -.platform-card:hover .media-frame img { - transform: scale(1.035); +.platform-card:hover .media-inset img { + transform: scale(1.03); } .platform-label { display: block; - margin: 24px 28px 8px; - color: var(--accent); + margin: 22px 16px 8px; + color: var(--ink-3); font-size: 0.78rem; font-weight: 700; letter-spacing: 0.07em; } .platform-card h3 { - margin: 0 28px 10px; + margin: 0 16px 10px; } .platform-card > p { margin: 0; - padding: 0 28px 30px; + padding: 0 16px 18px; color: var(--ink-2); font-size: 0.95rem; } @@ -1981,68 +2017,34 @@ html.js .reveal.is-visible .skill-chips > span { text-align: center; } -/* -------------------------------------------------------------------------- - * 15. 稳定性信任条 - * -------------------------------------------------------------------------- */ -.reliability-section { - padding: clamp(48px, 6vw, 72px) 0; -} - -.reliability-strip { +/* 稳定性:一行标签,挂在平台区末尾 */ +.reliability { display: flex; align-items: center; - justify-content: space-between; - gap: 20px 40px; - padding: 26px 32px; - border: 1px solid var(--line); - border-radius: var(--radius-xl); - background: var(--surface); + justify-content: center; + flex-wrap: wrap; + gap: 10px; + margin-top: 22px; } -.strip-title { - flex: none; - font-size: 0.95rem; +.reliability-title { + margin-right: 6px; + color: var(--ink-2); + font-size: 0.9rem; font-weight: 650; } -.reliability-strip ul { - display: flex; - flex-wrap: wrap; - gap: 8px 26px; - margin: 0; - padding: 0; - color: var(--ink-2); - font-size: 0.88rem; - list-style: none; -} - -.reliability-strip li { - display: inline-flex; - align-items: center; - gap: 8px; -} - -.reliability-strip li::before { - width: 5px; - height: 5px; - border-radius: 50%; - background: var(--accent); - content: ""; +.reliability .chip { + font-size: 0.82rem; } /* -------------------------------------------------------------------------- - * 16. FAQ(展开高度由 site.js 用 Web Animations 过渡) + * 15. FAQ:居中单栏(展开高度由 site.js 用 Web Animations 过渡) * -------------------------------------------------------------------------- */ -.faq-layout { - display: grid; - align-items: start; - gap: clamp(40px, 6vw, 80px); - grid-template-columns: 1fr 1.4fr; -} - -.faq-heading { - position: sticky; - top: 100px; +.faq-list { + max-width: 780px; + margin: 0 auto; + padding: 8px 28px; } .faq-item { @@ -2050,8 +2052,8 @@ html.js .reveal.is-visible .skill-chips > span { border-top: 1px solid var(--line); } -.faq-item:last-child { - border-bottom: 1px solid var(--line); +.faq-item:first-child { + border-top: 0; } .faq-item summary { @@ -2088,7 +2090,7 @@ html.js .reveal.is-visible .skill-chips > span { } .faq-item summary:hover { - color: var(--accent); + color: var(--ink-2); } .faq-item p { @@ -2108,16 +2110,12 @@ html.js .reveal.is-visible .skill-chips > span { } /* -------------------------------------------------------------------------- - * 17. 下载 CTA(深色舞台,与 Hero 呼应) + * 16. 下载:一块大亚克力面板,与首屏的图标键帽首尾呼应 * -------------------------------------------------------------------------- */ .download-section { padding-top: 0; } -.faq-section + .download-section { - padding-top: clamp(72px, 9vw, 120px); -} - .download-panel { position: relative; display: flex; @@ -2125,13 +2123,9 @@ html.js .reveal.is-visible .skill-chips > span { align-items: center; justify-content: space-between; gap: 40px; - padding: clamp(40px, 6vw, 80px); - border-radius: calc(var(--radius-xl) + 4px); + padding: clamp(36px, 6vw, 72px); + border-radius: var(--r-panel); isolation: isolate; - background: - radial-gradient(110% 130% at 90% 120%, rgba(111, 196, 145, 0.16), transparent 55%), - linear-gradient(160deg, var(--stage-1), var(--stage-3)); - color: var(--stage-ink); } .download-backdrop { @@ -2142,21 +2136,21 @@ html.js .reveal.is-visible .skill-chips > span { } .download-backdrop .aurora-a { - top: -60%; - left: -12%; + top: -70%; + left: -14%; width: 520px; height: 520px; } .download-backdrop .aurora-b { top: auto; - right: -14%; - bottom: -70%; + right: -16%; + bottom: -80%; width: 520px; height: 520px; } -/* 声波路径:虚线沿曲线流动,两条反向错速 */ +/* 声波路径:虚线沿曲线流动,两条反向错速;中性色 */ .download-wave { position: absolute; right: 0; @@ -2164,12 +2158,12 @@ html.js .reveal.is-visible .skill-chips > span { left: 0; width: 100%; height: 55%; - opacity: 0.45; + opacity: 0.5; } .download-wave path { fill: none; - stroke: var(--stage-accent); + stroke: var(--line-strong); stroke-dasharray: 6 12; stroke-width: 1.5; vector-effect: non-scaling-stroke; @@ -2177,7 +2171,7 @@ html.js .reveal.is-visible .skill-chips > span { } .download-wave path:nth-child(2) { - opacity: 0.5; + opacity: 0.6; animation-direction: reverse; animation-duration: 8s; } @@ -2186,19 +2180,22 @@ html.js .reveal.is-visible .skill-chips > span { to { stroke-dashoffset: -180; } } +.download-mark { + width: 64px; + height: 64px; + margin-bottom: 22px; + filter: drop-shadow(0 10px 14px rgba(21, 24, 26, 0.16)); +} + .download-copy h2 { margin-bottom: 12px; - font-size: clamp(2rem, 4.2vw, 3.1rem); + font-size: clamp(1.9rem, 4vw, 2.9rem); } .download-copy p { max-width: 460px; margin: 0; - color: var(--stage-ink-2); -} - -.download-panel .eyebrow { - color: var(--stage-accent); + color: var(--ink-2); } .download-actions { @@ -2206,38 +2203,14 @@ html.js .reveal.is-visible .skill-chips > span { flex: none; flex-direction: column; align-items: stretch; - gap: 14px; -} - -.outline-action { - display: inline-flex; - align-items: center; - justify-content: center; - gap: 9px; - padding: 13px 22px; - border: 1px solid var(--stage-line); - border-radius: 999px; - color: var(--stage-ink); - font-size: 0.92rem; - font-weight: 600; - transition: background 0.25s ease, border-color 0.25s ease, transform 0.5s var(--ease-spring); -} - -.outline-action:hover { - border-color: rgba(111, 196, 145, 0.45); - background: rgba(255, 255, 255, 0.08); -} - -.outline-action .i { - width: 16px; - height: 16px; + gap: 12px; } /* -------------------------------------------------------------------------- - * 18. 页脚 + * 17. 页脚 * -------------------------------------------------------------------------- */ .site-footer { - padding: 44px 0 52px; + padding: 40px 0 52px; } .footer-inner { @@ -2265,19 +2238,19 @@ html.js .reveal.is-visible .skill-chips > span { } /* -------------------------------------------------------------------------- - * 19. 动效系统:滚动显现 / 遮罩揭示 / 光斑 / 倾斜 / 磁吸 / 主题过渡 + * 18. 动效系统:滚动显现 / 遮罩揭示 / 亚克力反光 / 磁吸 / 主题过渡 * -------------------------------------------------------------------------- */ /* - * 进场只动 opacity + translate(独立属性),把 transform 留给悬停倾斜与视差, + * 进场只动 opacity + translate(独立属性),把 transform 留给悬停与视差, * 两套动效互不覆盖。进场延迟只作用在进场属性上,悬停反馈始终即时。 */ html.js .reveal { opacity: 0; translate: 0 30px; - transition-delay: var(--d, 0s), var(--d, 0s), 0s, 0s, 0s, var(--d, 0s); - transition-duration: 0.9s, 1.05s, 0.5s, 0.35s, 0.35s, 1.25s; - transition-property: opacity, translate, transform, box-shadow, border-color, clip-path; - transition-timing-function: ease-out, var(--ease-out), var(--ease-out), ease, ease, var(--ease-out); + transition-delay: var(--d, 0s), var(--d, 0s), 0s, 0s, var(--d, 0s); + transition-duration: 0.9s, 1.05s, 0.5s, 0.35s, 1.25s; + transition-property: opacity, translate, transform, box-shadow, clip-path; + transition-timing-function: ease-out, var(--ease-out), var(--ease-out), ease, var(--ease-out); } html.js .reveal.is-visible { @@ -2287,30 +2260,22 @@ html.js .reveal.is-visible { /* 视差元素的 transform 每帧由脚本写入,不再叠加过渡 */ html.js .reveal[data-parallax] { - transition-duration: 0.9s, 1.05s, 0s, 0.35s, 0.35s, 1.25s; + transition-duration: 0.9s, 1.05s, 0s, 0.35s, 1.25s; } -/* 遮罩揭示:媒体框从内缩的圆角矩形展开,内部画面同时从 112% 回落 */ +/* 遮罩揭示:画面从内缩的圆角矩形展开,内部画面同时从 112% 回落 */ html.js .unmask.reveal { - clip-path: inset(9% 7% 9% 7% round var(--radius-lg)); + clip-path: inset(9% 7% 9% 7% round var(--r-card)); } html.js .unmask.reveal.is-visible { - clip-path: inset(0 0 0 0 round var(--radius-lg)); + clip-path: inset(0 0 0 0 round var(--r-card)); } -html.js .unmask > video, -html.js .unmask > img { - transform: scale(1.12); - transition: transform 1.6s var(--ease-out) var(--d, 0s); -} - -html.js .unmask.is-visible > video, -html.js .unmask.is-visible > img { - transform: none; -} - -/* 指针光斑:卡片内部高光 + 边框描光,--mx / --my 由脚本写入 */ +/* + * 亚克力反光:指针所在处一块柔和高光 + 边缘描光,像灯光照在亚克力上。 + * --mx / --my 由脚本写入;反光颜色由 --sheen / --sheen-edge 决定,随主题与材质变化。 + */ .spot { position: relative; isolation: isolate; @@ -2330,9 +2295,9 @@ html.js .unmask.is-visible > img { .spot::before { z-index: -1; background: radial-gradient( - 420px circle at var(--mx, 50%) var(--my, 50%), - color-mix(in srgb, var(--spot-color, var(--accent)) 13%, transparent), - transparent 46% + 380px circle at var(--mx, 50%) var(--my, 50%), + var(--sheen), + transparent 55% ); } @@ -2340,8 +2305,8 @@ html.js .unmask.is-visible > img { z-index: 2; padding: 1px; background: radial-gradient( - 260px circle at var(--mx, 50%) var(--my, 50%), - color-mix(in srgb, var(--spot-color, var(--accent)) 70%, transparent), + 240px circle at var(--mx, 50%) var(--my, 50%), + var(--sheen-edge), transparent 62% ); -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0); @@ -2354,15 +2319,13 @@ html.js .unmask.is-visible > img { opacity: 1; } -/* 3D 倾斜:--rx / --ry 由脚本根据指针位置写入 */ -.tilt { - transform: perspective(900px) rotateX(var(--rx, 0deg)) rotateY(var(--ry, 0deg)) - translateY(var(--lift, 0px)); - transform-style: preserve-3d; +/* 可悬停的面板:轻微浮起 */ +.lift { + transition: transform 0.5s var(--ease-out), box-shadow 0.35s ease; } -.tilt:hover { - --lift: -5px; +.lift:hover { + transform: translateY(-4px); } /* 主题切换:View Transitions 以按钮为圆心扩散(site.js 驱动 clip-path) */ @@ -2377,7 +2340,7 @@ html.vt-theme::view-transition-new(root) { } /* -------------------------------------------------------------------------- - * 20. 减弱动态效果:所有持续动画停止,内容以最终态直接呈现 + * 19. 减弱动态效果:所有持续动画停止,内容以最终态直接呈现 * -------------------------------------------------------------------------- */ @media (prefers-reduced-motion: reduce) { html { @@ -2405,11 +2368,6 @@ html.vt-theme::view-transition-new(root) { clip-path: none; } - html.js .unmask > video, - html.js .unmask > img { - transform: none; - } - html.js .reveal [data-split] .ch { opacity: 1; filter: none; @@ -2437,13 +2395,13 @@ html.vt-theme::view-transition-new(root) { justify-content: center; } - .tilt { + .lift:hover { transform: none; } } /* -------------------------------------------------------------------------- - * 21. 响应式 + * 20. 响应式 * -------------------------------------------------------------------------- */ @media (max-width: 960px) { .nav-links { @@ -2454,14 +2412,18 @@ html.vt-theme::view-transition-new(root) { display: inline-grid; } + /* 移动端菜单:导航条下方再悬浮一块亚克力面板 */ .mobile-nav { display: block; - padding: 8px 24px 18px; - border-bottom: 1px solid var(--line); - background: color-mix(in srgb, var(--canvas) 88%, transparent); - -webkit-backdrop-filter: blur(20px) saturate(1.6); - backdrop-filter: blur(20px) saturate(1.6); - color: var(--ink); + width: var(--content); + margin: 8px auto 0; + padding: 8px; + border-radius: 18px; + background: var(--grain), var(--acrylic-fill); + box-shadow: var(--acrylic-shadow); + pointer-events: auto; + -webkit-backdrop-filter: var(--acrylic-blur); + backdrop-filter: var(--acrylic-blur); } .mobile-nav[hidden] { @@ -2470,46 +2432,37 @@ html.vt-theme::view-transition-new(root) { .mobile-nav a { display: block; - padding: 12px 8px; - border-radius: 10px; + padding: 12px 14px; + border-radius: var(--r-chip); font-size: 1rem; } - .split-layout, - .faq-layout { - grid-template-columns: 1fr; + .mobile-nav a:active { + background: var(--line); } - .faq-heading { - position: static; + .split-layout { + grid-template-columns: 1fr; } .split-layout.reverse .feature-copy { order: 1; } - .split-layout.reverse .media-frame, .split-layout.reverse .device-stage { order: 2; } - .ways-grid, - .numbers-grid { - grid-template-columns: 1fr 1fr; - } - - .personal-grid { - grid-template-columns: 1fr; - } - - .service-paths { - grid-template-columns: 1fr; - } - + .personal-grid, + .service-paths, .platform-grid { grid-template-columns: 1fr; } + .account-row { + grid-template-columns: 1fr; + } + .download-panel { flex-direction: column; align-items: flex-start; @@ -2519,14 +2472,9 @@ html.vt-theme::view-transition-new(root) { align-items: flex-start; } - .reliability-strip { - flex-direction: column; - align-items: flex-start; - } - /* 滚动叙事:手机在上,当前一幕的文案在下方叠放切换 */ .story { - height: 400vh; + height: 480vh; } .story-layout { @@ -2578,25 +2526,39 @@ html.vt-theme::view-transition-new(root) { @media (max-width: 600px) { :root { - --content: calc(100vw - 40px); + --content: calc(100vw - 32px); } .hero { - padding-top: 116px; + padding-top: 112px; } - .ways-grid { - grid-template-columns: 1fr; + .hero-mark { + width: 80px; + height: 80px; } + /* 窄屏:商店徽章独占一行,两枚键帽平分下一行,避免二加一的参差 */ .hero-actions { - gap: 14px; + display: grid; + grid-template-columns: 1fr 1fr; + gap: 12px; + } + + .hero-actions .store-badge { + grid-column: 1 / -1; + justify-self: center; + } + + .hero-actions .keycap { + padding-inline: 12px; } .voice-capsule { bottom: 12%; gap: 10px; padding: 6px 14px 6px 6px; + border-radius: 14px; } .capsule-mic { @@ -2609,18 +2571,26 @@ html.vt-theme::view-transition-new(root) { font-size: 0.84rem; } + .account-row .quiet-list { + grid-template-columns: 1fr; + } + .privacy-proof { flex-direction: column; align-items: flex-start; } + .faq-list { + padding: 4px 20px; + } + .footer-inner { flex-direction: column; align-items: flex-start; } } -/* 无 JavaScript:滚动叙事退化为静态展示,不保留 430vh 的空白滚动距离 */ +/* 无 JavaScript:滚动叙事退化为静态展示,不保留 520vh 的空白滚动距离 */ html.no-js .story { height: auto; } diff --git a/docs/assets/site.js b/docs/assets/site.js index 1352508..657a311 100644 --- a/docs/assets/site.js +++ b/docs/assets/site.js @@ -5,16 +5,15 @@ * 2. 深浅色主题(默认跟随系统,手动选择后持久化;支持时以圆形扩散过渡) * 3. 移动端导航开合、导航滑块与当前区块高亮 * 4. 逐字拆分标题(data-split) - * 5. 滚动引擎:进度条、Hero 设备「立起」、媒体视差、三幕滚动叙事(真机录屏随幕切换) + * 5. 滚动引擎:进度条、Hero 设备「立起」、媒体视差、四幕滚动叙事(真机录屏随幕切换) * 6. 声波渲染、Hero 语音胶囊打字机、数字计数 - * 7. 指针光斑 / 3D 倾斜 / 磁吸按钮、FAQ 高度过渡、离屏视频暂停 + * 7. 亚克力反光 / 磁吸按钮、FAQ 高度过渡、离屏视频暂停 * 开启「减弱动态效果」时,持续动画与指针动效全部停用,内容直接呈现最终态。 */ (function () { "use strict"; const root = document.documentElement; - const siteNav = document.getElementById("siteNav"); const languageButton = document.getElementById("languageToggle"); const themeButton = document.getElementById("themeToggle"); const themeIconUse = document.getElementById("themeIconUse"); @@ -211,8 +210,8 @@ themeButton.setAttribute("aria-label", label); } - // 深色舞台在各主题下配色一致,theme-color 跟随舞台色 - themeColor?.setAttribute("content", "#0e1013"); + // 浏览器顶栏颜色与底板一致(与 site.css 的 --canvas 保持同步) + themeColor?.setAttribute("content", resolved === "dark" ? "#0e1011" : "#eff1f0"); document.querySelectorAll("[data-shot]").forEach((image) => { const lang = root.dataset.lang || "zh"; @@ -541,10 +540,9 @@ languageHooks.push(queueClipRefresh); themeHooks.push(queueClipRefresh); - /* ---------------- 三幕滚动叙事 ---------------- */ + /* ---------------- 四幕滚动叙事 ---------------- */ // 滚动只决定「当前是哪一幕」;画面是这一幕的真机片段,从头播放,播完停留片刻再重播 - const ACT_RANGES = [[0, 0.34], [0.34, 0.67], [0.67, 1]]; const STORY_REPLAY_DELAY = 2200; const story = document.getElementById("storyStage"); @@ -576,8 +574,8 @@ const inView = rect.bottom > 0 && rect.top < viewport; const p = clamp(-rect.top / Math.max(1, story.offsetHeight - viewport)); - let act = 0; - ACT_RANGES.forEach(([start], i) => { if (p >= start) act = i; }); + // 滚动距离按幕数均分 + const act = Math.min(storyActs.length - 1, Math.floor(p * storyActs.length)); // 离开视口暂停,回来接着播 if (inView !== storyInView) { @@ -625,17 +623,11 @@ let scrollTicking = false; let lastHeroProgress = -1; - function updateNavState() { - siteNav?.classList.toggle("is-scrolled", window.scrollY > 24); - } - function updateScroll() { scrollTicking = false; const y = window.scrollY; const viewport = innerHeight; - updateNavState(); - if (progressBar) { const max = Math.max(1, root.scrollHeight - viewport); progressBar.style.transform = `scaleX(${clamp(y / max).toFixed(4)})`; @@ -822,9 +814,10 @@ if (!document.hidden) wakeWaves(); }); - /* ---------------- 指针动效:光斑 / 倾斜 / 磁吸 / Hero 光斑 ---------------- */ + /* ---------------- 指针动效:亚克力反光 / 磁吸 / Hero 光斑 ---------------- */ if (finePointer && !reduceMotion) { + // 亚克力反光:高光跟随指针在面板表面移动 document.querySelectorAll(".spot").forEach((element) => { element.addEventListener("pointermove", (event) => { const rect = element.getBoundingClientRect(); @@ -833,20 +826,6 @@ }); }); - document.querySelectorAll(".tilt").forEach((element) => { - element.addEventListener("pointermove", (event) => { - const rect = element.getBoundingClientRect(); - const x = (event.clientX - rect.left) / rect.width; - const y = (event.clientY - rect.top) / rect.height; - element.style.setProperty("--rx", `${((0.5 - y) * 9).toFixed(2)}deg`); - element.style.setProperty("--ry", `${((x - 0.5) * 11).toFixed(2)}deg`); - }); - element.addEventListener("pointerleave", () => { - element.style.setProperty("--rx", "0deg"); - element.style.setProperty("--ry", "0deg"); - }); - }); - // 磁吸按钮:指针靠近时按钮被「吸」向指针,离开时弹簧回位 document.querySelectorAll(".magnetic").forEach((element) => { element.addEventListener("pointermove", (event) => { diff --git a/docs/assets/story/ask-en-dark-key.jpg b/docs/assets/story/ask-en-dark-key.jpg new file mode 100644 index 0000000..a66c520 Binary files /dev/null and b/docs/assets/story/ask-en-dark-key.jpg differ diff --git a/docs/assets/story/ask-en-dark.jpg b/docs/assets/story/ask-en-dark.jpg new file mode 100644 index 0000000..d958e06 Binary files /dev/null and b/docs/assets/story/ask-en-dark.jpg differ diff --git a/docs/assets/story/ask-en-dark.mp4 b/docs/assets/story/ask-en-dark.mp4 new file mode 100644 index 0000000..35d89d2 Binary files /dev/null and b/docs/assets/story/ask-en-dark.mp4 differ diff --git a/docs/assets/story/ask-en-light-key.jpg b/docs/assets/story/ask-en-light-key.jpg new file mode 100644 index 0000000..822d6db Binary files /dev/null and b/docs/assets/story/ask-en-light-key.jpg differ diff --git a/docs/assets/story/ask-en-light.jpg b/docs/assets/story/ask-en-light.jpg new file mode 100644 index 0000000..1bc1b8a Binary files /dev/null and b/docs/assets/story/ask-en-light.jpg differ diff --git a/docs/assets/story/ask-en-light.mp4 b/docs/assets/story/ask-en-light.mp4 new file mode 100644 index 0000000..a71aa63 Binary files /dev/null and b/docs/assets/story/ask-en-light.mp4 differ diff --git a/docs/assets/story/ask-zh-dark-key.jpg b/docs/assets/story/ask-zh-dark-key.jpg new file mode 100644 index 0000000..d29eae0 Binary files /dev/null and b/docs/assets/story/ask-zh-dark-key.jpg differ diff --git a/docs/assets/story/ask-zh-dark.jpg b/docs/assets/story/ask-zh-dark.jpg new file mode 100644 index 0000000..e62a12d Binary files /dev/null and b/docs/assets/story/ask-zh-dark.jpg differ diff --git a/docs/assets/story/ask-zh-dark.mp4 b/docs/assets/story/ask-zh-dark.mp4 new file mode 100644 index 0000000..5fb0bbf Binary files /dev/null and b/docs/assets/story/ask-zh-dark.mp4 differ diff --git a/docs/assets/story/ask-zh-light-key.jpg b/docs/assets/story/ask-zh-light-key.jpg new file mode 100644 index 0000000..27061d4 Binary files /dev/null and b/docs/assets/story/ask-zh-light-key.jpg differ diff --git a/docs/assets/story/ask-zh-light.jpg b/docs/assets/story/ask-zh-light.jpg new file mode 100644 index 0000000..850bea5 Binary files /dev/null and b/docs/assets/story/ask-zh-light.jpg differ diff --git a/docs/assets/story/ask-zh-light.mp4 b/docs/assets/story/ask-zh-light.mp4 new file mode 100644 index 0000000..7bf42b3 Binary files /dev/null and b/docs/assets/story/ask-zh-light.mp4 differ diff --git a/docs/index.html b/docs/index.html index 38ae0e9..eb278a0 100644 --- a/docs/index.html +++ b/docs/index.html @@ -15,7 +15,7 @@ content="语音输入法,嘴替输入法,AI 输入法,AI 语音键盘,Agentic keyboard,agentic 键盘,iPhone 语音输入法,Mac 语音输入,端侧语音识别,OSGKeyboard" > - + @@ -50,7 +50,7 @@ - + +