这是一个巴适伙伴企业官网项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

2470 lines
76 KiB

@import "tailwindcss";
/* 排除历史构建备份目录:safe-delete 禁止 rm,这些 dist_bak_* 会残留在项目根,
Tailwind v4 自动扫描会重新吸入其中的旧色 arbitrary class(如 .text-[#FEEAC9])。
用 @source not 显式排除,确保新构建不再被污染。 */
@source not "../../dist_bak-*/**";
/* ===== BaskBuddy Design System — Professional Warm Futurism ===== */
/* Design Philosophy: 简单明了 + 温暖未来主义
Reference: AxureShop Tech Corp Template + 2025 Tech Website Trends
Key: Clarity over decoration, warmth through subtlety */
:root {
/* Core Brand Colors — 主题色 #EBEAF6(浅薰衣草),作为全站冷调基调 */
--brand-white: #FFFFFF;
--brand-black: #1A1A1A;
--brand: #EBEAF6; /* 主题色(浅薰衣草)—— 背景/色块/图标底/浅描边 */
--brand-cream: #EBEAF6; /* 沿用名 = 主题色 */
--brand-cream-light: #EBEAF6; /* 主题色更浅一档(hover 底)—— 统一为 #EBEAF6 */
--brand-cream-deep: #EBEAF6; /* 主题色更深一档(描边/边框)—— 统一为 #EBEAF6 */
/* ===== 赛道 Identity — 统一为深色强调(#1A1A1A 深暖黑,与底部黑呼应)=====
原四赛道色(红/蓝/绿/紫)已统一到 --accent(深黑),全站单一强调锚点。
强色用于:图标、卡片顶条、产品标签描边、强调点缀;浅色由 color-mix 派生。
主题色 #EBEAF6(浅薰衣草)承担全站冷调基调:底色、图标底、大色块、导航底。 */
--track-social: var(--accent); /* 社交赛道 — 统一深色强调 */
--track-career: var(--accent); /* 职场赛道 — 统一深色强调 */
--track-payment: var(--accent); /* 支付赛道 — 统一深色强调 */
--track-ai: var(--accent); /* AI 赛道 — 统一深色强调 */
/* ===== 规范 / 语义 token(设计系统约束,杜绝游离硬编码)=====
· accent: 默认强调色,用于 eyebrow 引导线、统一强调锚点
· focus-ring: 焦点环颜色——高对比(替代近白 cream,白底上曾不可见)
· radius-*: 圆角尺度,全站唯一来源(sm8/md10/lg14/xl18,克制圆角:大块面锐利、小元素圆润)
· status-*: 状态色独立于赛道色,自成中性家族,避免「状态=赛道」混淆
· 赛道色只此一处定义,浅色一律由 color-mix(强色 N%) 派生 */
--accent: #1A1A1A; /* 结构性强调色:深暖黑(字/描边/按钮底/引导线/焦点环),与底部黑呼应 */
/* ===== 品牌蓝 — 对比度分级体系(高级配色铁律:强调色按「显示角色」分档,各档过各自 WCAG 阈值)=====
品牌蓝 #3d5afe 在纯白底上 5.07:1 已过 AA;导航 / CTA 走 deep 档 #2E40D8(白字 7.4:1)更稳:
· --brand-accent #3d5afe 大字号展示 / 图标 / 装饰线 / eyebrow(≥18px 或图形,3:1 即可)
· --brand-accent-deep #2E40D8 小字正文 / 按钮底色(白字 7.4:1,过 AA)★ 导航/CTA 用此档
· --brand-accent-darker #1B2A9E hover/press 更深一档(白字 11:1,高对比反馈)
· --brand-accent-ink #1B2A9E 浅底上的蓝字(超高对比,文字选中 / 浅色块内文字)
· --brand-accent-soft #EBEAF6 浅洗 hover / 选中高亮底 / 点缀底 */
--brand-accent: #3d5afe;
--brand-accent-soft: #EBEAF6;
--brand-accent-deep: #2E40D8;
--brand-accent-darker: #1B2A9E;
--brand-accent-ink: #1B2A9E;
--focus-ring: var(--brand-accent-deep);
/* 圆角尺度:克制但有圆角(学 asrmicro 锐利公司级版面,但按钮/图标块/标签/胶囊等「该圆角」处恢复圆角)。
大卡/图带保持相对锐利,小元素明显圆角,形成层次。 */
--radius-sm: 8px;
--radius-md: 10px;
--radius-lg: 14px;
--radius-xl: 18px;
--status-done: #0E8F6E; /* 已完成 — 青绿 */
--status-progress: #4F6BED; /* 推进中 — 靛蓝 */
/* ICIDP价值观专属色 */
--icidp-integrity: #667EEA;
--icidp-courage: #EF4444;
--icidp-innovation: #8B5CF6;
--icidp-devotion: #10B981;
--icidp-passion: #3d5afe; /* 激情 — 品牌蓝(与主题色统一) */
/* ===== 责任与价值 · 三方向专属色(2026-08 重构 ESG → 责任与价值)=====
参考 腾讯「可持续社会价值」/淡马锡 ESG 框架,把抽象 ESG 拆解为三个可感知的方向,
各方向有独立视觉锚点,避免「状态=赛道」混淆,也避免 ESG 一团灰。
· --sus-green : 绿色低碳 — 主色绿(用户要求环境用绿色)
· --sus-blue : 数字普惠 — 品牌蓝(连接普惠入口)
· --sus-dark : 可信运营 — 深暖黑(与全站 accent 呼应,体现「可信」的稳重)
浅色档由 color-mix(in oklch, X N%, transparent) 派生。 */
--sus-green: #10B981;
--sus-green-soft: color-mix(in oklch, var(--sus-green) 12%, transparent);
--sus-blue: #3d5afe;
--sus-blue-soft: color-mix(in oklch, var(--sus-blue) 12%, transparent);
--sus-dark: var(--accent);
--sus-dark-soft: color-mix(in oklch, var(--accent) 10%, transparent);
/* Semantic Colors */
--bg-primary: #FAFAFE; /* 冷调近白底:与浅薰衣草主题色呼应 */
--bg-secondary: var(--brand-cream-light); /* 现为 #EBEAF6 */
--bg-subtle: #EBEAF6; /* 浅薰衣草交替底 */
--bg-dark: var(--brand-black);
--text-primary: var(--brand-black);
--text-secondary: #4A4A4A;
--text-muted: #6A6A6A;
--text-muted-on-dark: rgba(255,255,255,0.65);
--text-on-dark: var(--brand-white);
--border-light: rgba(26,26,26,0.06);
--border-medium: rgba(26,26,26,0.10);
/* Typography — Professional hierarchy */
--font-display: 'Noto Sans SC', 'Noto Sans TC', system-ui, sans-serif;
--font-body: 'Noto Sans SC', 'Noto Sans TC', system-ui, sans-serif;
--font-mono: 'Noto Sans SC', 'Noto Sans TC', system-ui, sans-serif;
/* ===== Typography Scale — 统一字号阶梯(asrmicro 式干净公司级层级)=====
全站字号的「单一真相源」。组件内字号必须落到这一阶梯,杜绝 12/13/14/15 散落与
卡片标题 15~18 不统一。层级:display > h1 > h2 > h3 > body-lg > body > body-sm > micro。
规则:主阅读文本一律 15(body),次级描述/图注 14(body-sm),卡片标题一律 18(h3),
区块大标题一律 h2(clamp 20~26),小节标签/徽章/eyebrow 一律 11(micro)。 */
--fs-display: clamp(42px, 6.5vw, 78px); /* 首页 Hero slogan */
--fs-h1: clamp(34px, 4.6vw, 56px); /* 页面/区块大标题(section-title) */
--fs-h2: clamp(22px, 2.8vw, 30px); /* 区块内主标题(赛道名/CTA/投递) */
--fs-h3: 20px; /* 卡片标题(一律统一) */
--fs-body-lg: clamp(17px, 1.2vw, 20px); /* 引导段落 / 宣言 */
--fs-body: 16px; /* 主阅读正文 */
--fs-body-sm: 15px; /* 次级描述 / 图注 */
--fs-micro: 12px; /* 小节标签 / 徽章 / eyebrow */
/* Spacing Scale — 8px grid + 流体间距(C. 2026 趋势)
clamp(min, preferred, max): 小屏紧凑(min ~85%), 中屏接近原值, 大屏松弛(max ~115%)
preferred = 原值 + vw 调整, 让间距随视口宽度平滑变化 */
--space-1: clamp(0.4rem, 0.5rem + 0.1vw, 0.6rem);
--space-2: clamp(0.85rem, 1rem + 0.2vw, 1.15rem);
--space-3: clamp(1.25rem, 1.5rem + 0.3vw, 1.75rem);
--space-4: clamp(1.7rem, 2rem + 0.4vw, 2.3rem);
--space-5: clamp(2.1rem, 2.5rem + 0.5vw, 2.9rem);
--space-6: clamp(2.5rem, 3rem + 0.6vw, 3.5rem);
--space-7: clamp(2.9rem, 3.5rem + 0.7vw, 4.1rem);
--space-8: clamp(3.3rem, 4rem + 0.8vw, 4.7rem);
--space-9: clamp(4.1rem, 5rem + 1vw, 5.9rem);
--space-10: clamp(4.9rem, 6rem + 1.2vw, 7.1rem);
--space-11: clamp(6.5rem, 8rem + 1.6vw, 9.5rem);
/* Animation — Professional easing */
--ease-out: cubic-bezier(0.25, 1, 0.5, 1);
--ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
--duration-fast: 180ms;
--duration-normal: 350ms;
--duration-slow: 600ms;
/* Shadows — Warm but subtle */
--shadow-xs: 0 1px 3px rgba(26,26,26,0.04);
--shadow-sm: 0 2px 8px rgba(26,26,26,0.06), 0 1px 2px rgba(235,234,246,0.06);
--shadow-md: 0 6px 20px rgba(26,26,26,0.07), 0 2px 6px rgba(235,234,246,0.08);
--shadow-lg: 0 12px 40px rgba(26,26,26,0.08), 0 4px 12px rgba(235,234,246,0.10);
--shadow-xl: 0 20px 60px rgba(26,26,26,0.10), 0 8px 24px rgba(235,234,246,0.12);
--shadow-dark-sm: 0 2px 8px color-mix(in oklch, var(--track-ai) 10%, transparent);
--shadow-dark-md: 0 6px 24px color-mix(in oklch, var(--track-ai) 12%, transparent);
--shadow-dark-lg: 0 12px 40px color-mix(in oklch, var(--track-ai) 14%, transparent);
}
/* 文字选中高亮:品牌暖橙淡调(premium 细节,替代默认蓝) */
::selection {
background: var(--brand-accent-soft);
color: var(--brand-black);
}
/* ===== Smooth Scroll + Mobile Safe-Area ===== */
html {
scroll-behavior: smooth;
/* WCAG 2.4.12 Focus Not Obscured: 锚点跳转/获焦不被 sticky header 遮挡(header ~64px + 余量)*/
scroll-padding-top: 80px;
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: transparent;
}
body {
background-color: var(--bg-primary);
color: var(--text-primary);
overflow-x: hidden;
/* 移动端安全边距,防止按钮贴边缘 */
padding-bottom: env(safe-area-inset-bottom, 0);
padding-left: env(safe-area-inset-left, 0);
padding-right: env(safe-area-inset-right, 0);
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
html { scroll-behavior: auto; }
}
::selection {
background: rgba(235,234,246,0.35);
color: var(--brand-black);
}
/* ===== Clean Gradient Mesh Background ===== */
.gradient-mesh {
position: relative;
background: var(--bg-primary);
}
.gradient-mesh::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(ellipse 60% 40% at 15% 20%, rgba(235,234,246,0.34), transparent 60%),
radial-gradient(ellipse 40% 30% at 85% 75%, rgba(235,234,246,0.20), transparent 50%),
radial-gradient(ellipse 35% 25% at 60% 10%, rgba(235,234,246,0.16), transparent 50%);
animation: meshDrift 40s ease-in-out infinite; /* 25s→40s 降低动画强度 */
pointer-events: none;
z-index: 0;
}
@keyframes meshDrift {
0%, 100% { opacity: 0.5; transform: translate(0, 0) scale(1); }
33% { opacity: 0.6; transform: translate(-0.8%, 0.5%) scale(1.006); } /* 位移减半,缩放大幅降低 */
66% { opacity: 0.55; transform: translate(0.6%, -0.4%) scale(1.003); }
}
/* ===== Dark Gradient Mesh (Innovation Lab) ===== */
.gradient-mesh-dark {
position: relative;
background: var(--brand-black);
}
.gradient-mesh-dark::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(ellipse 50% 40% at 20% 30%, color-mix(in oklch, var(--track-ai) 10%, transparent), transparent 50%),
radial-gradient(ellipse 35% 25% at 80% 70%, color-mix(in oklch, var(--track-career) 6%, transparent), transparent 40%);
animation: meshDriftDark 50s ease-in-out infinite; /* 30s→50s 降低动画强度 */
pointer-events: none;
z-index: 0;
}
@keyframes meshDriftDark {
0%, 100% { opacity: 0.45; transform: translate(0, 0); }
50% { opacity: 0.55; transform: translate(-1%, 0.6%); } /* 位移大幅降低 */
}
/* ===== Gradient Text — Elegant & Subtle ===== */
.text-gradient-animated {
background: linear-gradient(
90deg,
var(--brand-black) 0%,
var(--brand-black) 30%,
var(--brand-cream-deep) 55%,
var(--track-social) 75%,
var(--brand-black) 100%
);
background-size: 200% auto;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
animation: textGradientSlide 14s ease-in-out infinite; /* 8s→14s 降低动画强度,避免视觉疲劳 */
}
@keyframes textGradientSlide {
0% { background-position: 0% center; }
50% { background-position: 100% center; }
100% { background-position: 0% center; }
}
/* ===== 统一按钮/卡片交互层 ===== */
a, button {
touch-action: manipulation;
}
/* 卡片悬浮微交互 */
.card-hover {
transition: transform 400ms cubic-bezier(0.16, 1, 0.3, 1), box-shadow 400ms cubic-bezier(0.16, 1, 0.3, 1), border-color 200ms ease;
}
.card-hover:hover {
transform: translateY(-3px);
box-shadow: var(--shadow-xl);
}
/* ===== Professional Glassmorphism ===== */
.glass-premium {
background: rgba(255,255,255,0.80);
backdrop-filter: blur(16px) saturate(120%);
border: 1px solid var(--border-light);
box-shadow: var(--shadow-sm);
}
.glass-premium-dark {
background: rgba(26,26,26,0.85);
backdrop-filter: blur(16px) saturate(120%);
border: 1px solid rgba(235,234,246,0.06);
box-shadow: var(--shadow-dark-sm);
}
/* ===== 暖科技玻璃卡 — 全站卡片统一套用(核心升级) =====
玻璃底色 + 细边 + 柔影;hover 微浮交给元素自带的 Tailwind hover 类,
避免 transform 冲突,保持单一真相源。 */
.card-surface {
background: rgba(255,255,255,0.70);
-webkit-backdrop-filter: blur(14px) saturate(125%);
backdrop-filter: blur(14px) saturate(125%);
border: 1px solid var(--border-light);
box-shadow: var(--shadow-sm);
}
.card-surface-soft {
background: rgba(255,255,255,0.55);
-webkit-backdrop-filter: blur(10px) saturate(120%);
backdrop-filter: blur(10px) saturate(120%);
border: 1px solid var(--border-light);
}
/* 科技感网格底纹(极淡,premium 纹理不抢戏) */
.tech-grid-bg {
background-image:
linear-gradient(rgba(26,26,26,0.035) 1px, transparent 1px),
linear-gradient(90deg, rgba(26,26,26,0.035) 1px, transparent 1px);
background-size: 48px 48px;
background-position: center;
}
/* ===== Scroll Reveal — Smooth & Professional ===== */
.scroll-reveal {
opacity: 0;
transform: translateY(24px);
transition: opacity var(--duration-slow) var(--ease-out-expo),
transform var(--duration-slow) var(--ease-out-expo);
}
.scroll-reveal.visible {
opacity: 1;
transform: translateY(0);
}
.scroll-reveal-left {
opacity: 0;
transform: translateX(-30px);
transition: opacity var(--duration-slow) var(--ease-out-expo),
transform var(--duration-slow) var(--ease-out-expo);
}
.scroll-reveal-left.visible {
opacity: 1;
transform: translateX(0);
}
.scroll-reveal-right {
opacity: 0;
transform: translateX(30px);
transition: opacity var(--duration-slow) var(--ease-out-expo),
transform var(--duration-slow) var(--ease-out-expo);
}
.scroll-reveal-right.visible {
opacity: 1;
transform: translateX(0);
}
/* ===== Scroll-driven Animations(2026 规范 · 渐进增强)=====
浏览器支持 animation-timeline: view() 时,用纯 CSS 替代 JS IntersectionObserver
揭示。fill-mode: both 保证进入视口前保持 from(隐藏)、滚过后保持 to(可见),
不依赖 .visible 类即完成揭示;JS 仍作 fallback,互不冲突。
animation-range: entry 0% cover 30% —— 进入视口 0% 开始,覆盖 30% 时完成,
比默认 cover 0%-100% 更早完成,更贴合「宁静界面」。
不做 stagger:scroll-driven 的错峰需平移 animation-range,复杂且违背宁静原则;
JS 路径仍保留 stagger 作为不支持本特性时的体验 fallback。 */
@supports (animation-timeline: view()) {
.scroll-reveal {
animation: scroll-reveal-up linear both;
animation-timeline: view();
animation-range: entry 0% cover 30%;
}
.scroll-reveal-left {
animation: scroll-reveal-left linear both;
animation-timeline: view();
animation-range: entry 0% cover 30%;
}
.scroll-reveal-right {
animation: scroll-reveal-right linear both;
animation-timeline: view();
animation-range: entry 0% cover 30%;
}
@keyframes scroll-reveal-up {
from { opacity: 0; transform: translateY(24px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes scroll-reveal-left {
from { opacity: 0; transform: translateX(-30px); }
to { opacity: 1; transform: translateX(0); }
}
@keyframes scroll-reveal-right {
from { opacity: 0; transform: translateX(30px); }
to { opacity: 1; transform: translateX(0); }
}
}
/* ===== Hover Effects — Subtle & Elegant ===== */
.hover-lift {
transition: transform var(--duration-normal) var(--ease-out),
box-shadow var(--duration-normal) var(--ease-out);
}
.hover-lift:hover {
transform: translateY(-4px);
box-shadow: var(--shadow-lg);
}
.hover-lift-dark:hover {
box-shadow: var(--shadow-dark-lg);
}
/* ===== Section Divider — Clean ===== */
.section-divider {
height: 1px;
max-width: 80%;
margin: var(--space-8) auto;
background: linear-gradient(90deg, transparent, var(--border-medium), transparent);
}
.dark-divider {
background: linear-gradient(90deg, transparent, rgba(235,234,246,0.10), transparent);
}
/* ===== Timeline Style — 响应式移动端单列布局 ===== */
.timeline-line {
position: relative;
padding-left: 48px;
}
@media (max-width: 640px) {
.timeline-line {
padding-left: 36px;
}
}
.timeline-line::before {
content: '';
position: absolute;
left: 20px;
top: 0;
bottom: 0;
width: 2px;
background: linear-gradient(180deg, transparent, rgba(235,234,246,0.4), color-mix(in oklch, var(--track-ai) 22%, transparent), transparent);
}
@media (max-width: 640px) {
.timeline-line::before {
left: 14px;
}
}
.timeline-dot {
width: 10px;
height: 10px;
border-radius: 50%;
position: absolute;
left: 15px;
border: 2px solid;
display: flex;
align-items: center;
justify-content: center;
}
@media (max-width: 640px) {
.timeline-dot {
left: 9px;
width: 8px;
height: 8px;
}
}
/* ===== Star Field (Innovation Lab) — 降低密度和亮度,保持科技克制感 ===== */
.star-field {
position: absolute;
inset: 0;
overflow: hidden;
pointer-events: none;
}
.star {
position: absolute;
width: 1px;
height: 1px;
background: var(--brand-cream);
border-radius: 50%;
animation: starTwinkle var(--twinkle-duration) ease-in-out infinite;
opacity: 0;
}
@keyframes starTwinkle {
0%, 100% { opacity: 0; }
50% { opacity: 0.35; }
}
/* ===== Neon Elements — Dark pages only ===== */
.neon-dot {
width: 6px;
height: 6px;
border-radius: 50%;
animation: neonDotPulse 3s ease-in-out infinite;
}
@keyframes neonDotPulse {
0%, 100% { opacity: 0.5; box-shadow: 0 0 3px currentColor; }
50% { opacity: 1; box-shadow: 0 0 6px currentColor, 0 0 12px currentColor; }
}
.neon-line {
height: 1px;
background: linear-gradient(90deg, transparent, var(--brand-cream), var(--track-ai), transparent);
animation: neonPulse 4s ease-in-out infinite;
}
@keyframes neonPulse {
0%, 100% { opacity: 0.3; }
50% { opacity: 0.8; }
}
/* ===== Flip Card (WCAG 2.1 AA 无障碍:支持键盘/触摸/点击) ===== */
/* ===== Flip Card (WCAG 2.1 AA 无障碍:支持键盘/触摸/点击) ===== */
/* Grid Stack 方案:两面叠在同一 grid-cell → 容器高度 = max(正面高, 背面高)
—— 彻底解决原 absolute inset-0 + 固定 h-[200px] 导致长内容截断的问题
翻转时使用 3D rotateY(180) + backface-visibility:hidden 隐藏背面,
不再额外设 visibility:hidden,避免与 3D 逻辑冲突。*/
.flip-card {
perspective: 1000px;
cursor: pointer;
display: grid;
container-type: inline-size;
}
.flip-card-inner {
display: grid;
grid-template-areas: 'stack';
transition: transform 0.6s cubic-bezier(0.85, 0, 0.15, 1);
transform-style: preserve-3d;
}
.flip-card-inner > * { grid-area: stack; }
.flip-card-front h3 {
font-size: var(--fs-body);
}
.flip-card:focus-visible {
outline: 2px solid var(--focus-ring);
outline-offset: 3px;
border-radius: var(--radius-sm);
}
/* 桌面:hover 或 .flipped 类翻转 */
@media (hover: hover) and (pointer: fine) {
.flip-card:hover .flip-card-inner {
transform: rotateY(180deg);
}
}
/* 键盘点击/触摸点击:.flipped 类控制翻转 (优先级最高) */
.flip-card.flipped .flip-card-inner {
transform: rotateY(180deg) !important;
}
.flip-card-front, .flip-card-back {
backface-visibility: hidden;
transform-style: preserve-3d;
/* Grid Stack:每面是独立 grid cell,按内容自然高度撑开 */
position: relative;
top: auto; left: auto; right: auto; bottom: auto;
inset: auto;
}
.flip-card-back {
/* 初始背面:与正面成 180°,backface-visibility 会隐藏它 */
transform: rotateY(180deg);
}
/* ===== Page Enter ===== */
.page-enter {
animation: pageEnter 0.6s var(--ease-out-expo) forwards;
}
@keyframes pageEnter {
from { opacity: 0; transform: translateY(12px); }
to { opacity: 1; transform: translateY(0); }
}
/* ===== Route Lazy Loading Fallback(2026 规范 · 宁静界面)=====
React.lazy chunk 加载时的极简 fallback:居中品牌蓝旋转环,
不抢戏、不闪烁。aria-live="polite" 供屏读。 */
.page-loading {
min-height: 60vh;
display: flex;
align-items: center;
justify-content: center;
}
.page-loading::after {
content: "";
width: 28px;
height: 28px;
border: 2px solid var(--border-medium);
border-top-color: var(--brand-accent);
border-radius: 50%;
animation: pageLoadingSpin 0.8s linear infinite;
}
@keyframes pageLoadingSpin {
to { transform: rotate(360deg); }
}
@media (prefers-reduced-motion: reduce) {
.page-loading::after {
animation: none;
border-top-color: var(--brand-accent-deep);
}
}
/* ===== Cross-Document View Transitions(2026 规范 · 路由交叉淡化)=====
本站导航用 <a href> 全页重载(非 SPA Link),故采用 Cross-Document VT
(Chrome 134+ / Safari 18.2+),同源导航自动交叉淡化 0.25s。
不支持时无副作用(@view-transition 与 ::view-transition-* 被忽略,回退到 .page-enter)。
支持时抑制 .page-enter 避免双重动画(VT 已涵盖进场过渡)。 */
@view-transition {
navigation: auto;
}
@supports (view-transition-name: root) {
/* VT 支持:抑制旧 .page-enter,让 VT 接管进场过渡(避免 translateY 与 cross-fade 叠加) */
.page-enter {
animation: none;
}
::view-transition-old(root) {
animation: vt-fade-out 0.25s var(--ease-out) both;
}
::view-transition-new(root) {
animation: vt-fade-in 0.25s var(--ease-out) both;
}
@keyframes vt-fade-out {
to { opacity: 0; }
}
@keyframes vt-fade-in {
from { opacity: 0; }
to { opacity: 1; }
}
}
@media (prefers-reduced-motion: reduce) {
@supports (view-transition-name: root) {
::view-transition-old(root),
::view-transition-new(root) {
animation: none;
}
}
}
/* ===== Custom Focus Ring ===== */
:focus-visible {
outline: 2px solid var(--focus-ring);
outline-offset: 2px;
border-radius: 4px;
}
/* WCAG 2.5.8 Target Size Minimum: footer 链接触控目标 ≥24×24 CSS px */
footer a {
display: inline-flex;
align-items: center;
min-height: 24px;
}
/* WCAG 1.4.6 + 2026 趋势 prefers-contrast: 高对比度偏好增强 */
@media (prefers-contrast: more) {
:root {
--text-muted: #4a4a4a;
--text-secondary: #2a2a2a;
}
:focus-visible {
outline-width: 3px;
}
}
/* ===== Innovation Lab — 科技感样式系统 ===== */
.innovation-lab-container {
background: linear-gradient(180deg, #0a0a0f 0%, #12121a 30%, #0e0e16 70%, #0a0a0f 100%);
position: relative;
overflow: hidden;
}
/* 动态背景网格 */
.grid-background {
position: fixed;
inset: 0;
background-image:
linear-gradient(rgba(201,177,255,0.03) 1px, transparent 1px),
linear-gradient(90deg, rgba(201,177,255,0.03) 1px, transparent 1px);
background-size: 60px 60px;
opacity: 0;
animation: gridFadeIn 2s ease-out 0.5s forwards;
pointer-events: none;
z-index: 0;
}
@keyframes gridFadeIn {
to { opacity: 1; }
}
/* 光晕装饰层 */
.glow-orbs {
position: fixed;
inset: 0;
pointer-events: none;
z-index: 0;
}
.glow-orbs::before,
.glow-orbs::after {
content: '';
position: absolute;
border-radius: 50%;
filter: blur(100px);
opacity: 0.3;
}
.glow-orbs::before {
width: 600px;
height: 600px;
background: radial-gradient(circle, var(--track-ai)40 0%, transparent 70%);
top: -200px;
right: -100px;
animation: orbFloat1 20s ease-in-out infinite;
}
.glow-orbs::after {
width: 500px;
height: 500px;
background: radial-gradient(circle, var(--track-career)30 0%, transparent 70%);
bottom: -150px;
left: -80px;
animation: orbFloat2 25s ease-in-out infinite;
}
@keyframes orbFloat1 {
0%, 100% { transform: translate(0, 0) scale(1); }
33% { transform: translate(-30px, 20px) scale(1.1); }
66% { transform: translate(20px, -15px) scale(0.95); }
}
@keyframes orbFloat2 {
0%, 100% { transform: translate(0, 0) scale(1); }
50% { transform: translate(40px, 30px) scale(1.15); }
}
/* 扫描线 */
.scan-line {
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
width: 100%;
height: 2px;
background: linear-gradient(90deg, transparent, var(--track-ai), transparent);
animation: scanLineMove 3s ease-in-out infinite;
}
@keyframes scanLineMove {
0% { top: 0; opacity: 0; }
20% { opacity: 1; }
80% { opacity: 1; }
100% { top: 100%; opacity: 0; }
}
/* 动态进度条 */
.progress-bar {
width: 0%;
height: 100%;
background: linear-gradient(90deg, var(--track-ai), var(--track-career));
border-radius: inherit;
animation: progressFill 1.5s ease-out 0.5s forwards;
box-shadow: 0 0 10px var(--track-ai);
}
@keyframes progressFill {
to { width: 100%; }
}
/* 发光圆点 */
.neon-dot-glow {
width: 8px;
height: 8px;
border-radius: 50%;
animation: neonGlow 2s ease-in-out infinite;
}
.neon-dot-glow-lg {
width: 12px;
height: 12px;
border-radius: 50%;
animation: neonGlow 2s ease-in-out infinite;
}
@keyframes neonGlow {
0%, 100% { opacity: 0.6; box-shadow: 0 0 5px currentColor, 0 0 10px currentColor; }
50% { opacity: 1; box-shadow: 0 0 10px currentColor, 0 0 20px currentColor, 0 0 30px currentColor; }
}
/* 科技感时间线 */
.timeline-tech {
position: relative;
padding-left: 52px;
}
@media (max-width: 640px) {
.timeline-tech {
padding-left: 40px;
}
}
.timeline-item {
position: relative;
}
.timeline-connector {
position: absolute;
left: 9px;
top: 16px;
width: 2px;
height: calc(100% - 16px);
}
@media (max-width: 640px) {
.timeline-connector {
left: 5px;
}
}
.timeline-node {
width: 16px;
height: 16px;
border-radius: 50%;
position: absolute;
left: -44px;
border: 2px solid var(--node-color);
background: #0a0a0f;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.5s ease;
}
@media (max-width: 640px) {
.timeline-node {
left: -32px;
width: 12px;
height: 12px;
}
}
.timeline-node.active {
background: var(--node-color);
}
.timeline-node.upcoming {
opacity: 0.5;
border-color: rgba(255,255,255,0.3);
}
.timeline-node.upcoming .node-inner {
opacity: 0.3;
}
.timeline-node.upcoming .node-glow {
opacity: 0;
}
.timeline-node:hover {
transform: scale(1.3);
}
.node-inner {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--node-color);
opacity: 0;
transition: opacity 0.3s ease;
}
.timeline-node.active .node-inner {
opacity: 1;
box-shadow: 0 0 10px var(--node-color);
}
.node-glow {
position: absolute;
inset: -4px;
border-radius: 50%;
border: 1px solid var(--node-color);
opacity: 0;
animation: nodePulse 2s ease-in-out infinite;
}
.timeline-node.active .node-glow {
opacity: 0.5;
}
@keyframes nodePulse {
0%, 100% { transform: scale(1); opacity: 0.5; }
50% { transform: scale(1.5); opacity: 0; }
}
.node-check {
color: #0a0a0f;
font-size: 8px;
font-weight: bold;
opacity: 0;
transition: opacity 0.3s ease;
}
.timeline-node.active .node-check {
opacity: 1;
}
.timeline-card {
position: relative;
}
.timeline-card::before {
content: '';
position: absolute;
inset: 0;
border-radius: inherit;
background: linear-gradient(135deg, rgba(255,255,255,0.03) 0%, transparent 50%);
opacity: 0;
transition: opacity 0.3s ease;
}
.timeline-card:hover::before {
opacity: 1;
}
/* ===== Responsive ===== */
@media (max-width: 768px) {
:root {
--space-8: 3rem;
--space-9: 3.5rem;
--space-10: 4rem;
--space-11: 5rem;
}
}
@media (max-width: 480px) {
:root {
--space-7: 2.5rem;
--space-8: 2.5rem;
--space-9: 3rem;
--space-10: 3.5rem;
--space-11: 4rem;
}
}
/* ============================================================
asrmicro-style section system — 学结构保品牌(温暖未来主义)
Clean corporate structure, warm brand palette
============================================================ */
/* Section eyebrow + title (形如 asrmicro 的 "ABOUT ASR / 走进翱捷") */
.section-eyebrow {
display: inline-flex;
align-items: center;
gap: 10px;
font-family: var(--font-mono);
font-size: var(--fs-micro);
font-weight: 500;
letter-spacing: 0.20em;
text-transform: uppercase;
color: var(--text-secondary);
margin-bottom: 14px;
}
.section-eyebrow::before {
content: '';
width: 28px;
height: 2px;
border-radius: 2px;
background: var(--brand-accent);
flex-shrink: 0;
}
.section-title {
font-family: var(--font-display);
font-weight: 700;
font-size: var(--fs-h1);
line-height: 1.10;
letter-spacing: -0.02em;
color: var(--text-primary);
text-wrap: balance;
}
.section-lead {
margin-top: 14px;
font-size: var(--fs-body);
line-height: 1.8;
color: var(--text-secondary);
max-width: 660px;
margin-left: auto;
margin-right: auto;
}
.section-head { margin-bottom: var(--space-7); }
/* 板块标题降一档:h2 应小于页面 h1,否则与 Hero 标题视觉权重冲突。
.section-title 默认按 h1 渲染,仅页面级 Hero 使用;板块内统一降为 h2 尺寸。 */
.section-head .section-title { font-size: var(--fs-h1); }
/* 细线分隔的版式(已并入 .section-eyebrow 统一引导线,保留兼容) */
/* ===== Stat band — "翱捷速度" 风格的数据滚动 ===== */
.stat-band {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 1px;
background: var(--border-light);
border: 1px solid var(--border-light);
border-radius: var(--radius-lg);
overflow: hidden;
}
@media (min-width: 768px) {
.stat-band { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
.stat-cell {
background: var(--bg-primary);
padding: 32px 20px;
text-align: center;
transition: background var(--duration-normal) var(--ease-out);
}
.stat-cell:hover { background: var(--bg-secondary); }
.stat-num {
font-family: var(--font-display);
font-weight: 700;
font-size: clamp(38px, 5.8vw, 60px);
line-height: 1;
letter-spacing: -0.01em;
color: var(--brand-black);
}
.stat-suffix { font-size: 0.52em; font-weight: 600; color: var(--track-color, var(--brand-accent-deep)); }
.stat-value--text { /* 兼容保留:统一字号后无需差异化,空实现避免引用报错 */ }
.stat-label {
margin-top: 10px;
font-size: var(--fs-micro);
color: var(--text-muted);
letter-spacing: 0.02em;
}
.stat-sub {
margin-top: 2px;
font-size: var(--fs-micro);
color: var(--text-muted);
opacity: 0.7;
}
/* ===== Hero video wrap (首页) ===== */
.hero-video {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
object-position: center 65%;
/* 不要任何底垫色,只保留视频本身(视频未加载时透出底层页面背景) */
background: transparent;
z-index: 0;
}
.hero-slogan {
font-family: var(--font-display);
font-weight: 700;
font-size: var(--fs-h1);
line-height: 1.12;
letter-spacing: -0.02em;
color: var(--brand-black);
white-space: pre-line;
}
/* ===== News / 动态 card (asrmicro 新闻中心风格) ===== */
.news-card {
display: flex;
flex-direction: column;
background: var(--bg-primary);
border: 1px solid var(--border-light);
border-radius: var(--radius-md);
padding: 22px 22px 24px;
transition: transform var(--duration-normal) var(--ease-out),
box-shadow var(--duration-normal) var(--ease-out),
border-color var(--duration-normal) var(--ease-out);
}
.news-card:hover {
transform: translateY(-4px);
box-shadow: var(--shadow-md);
border-color: var(--brand-cream-deep);
}
.news-tag {
align-self: flex-start;
font-family: var(--font-mono);
font-size: var(--fs-micro);
letter-spacing: 0.10em;
text-transform: uppercase;
padding: 3px 9px;
border-radius: 999px;
background: rgba(235,234,246,0.22);
color: var(--text-muted);
border: 1px solid rgba(235,234,246,0.30);
}
.news-year {
font-family: var(--font-mono);
font-size: var(--fs-micro);
color: var(--track-career);
margin-top: 14px;
}
.news-title {
margin-top: 6px;
font-size: var(--fs-body);
font-weight: 600;
line-height: 1.6;
color: var(--text-primary);
}
.news-desc {
margin-top: 8px;
font-size: var(--fs-body);
line-height: 1.7;
color: var(--text-secondary);
flex: 1;
}
/* ===== Track / product matrix cards (主营业务风格) ===== */
.track-card {
position: relative;
border: 1px solid var(--border-light);
border-radius: var(--radius-lg);
padding: 28px 26px 30px;
/* 静态白底,不靠整卡泛彩抢戏;赛道识别交给顶部 4px 满色条 + icon-tile */
background: var(--bg-primary);
overflow: hidden;
transition: transform var(--duration-normal) var(--ease-out),
box-shadow var(--duration-normal) var(--ease-out),
border-color var(--duration-normal) var(--ease-out),
background-color var(--duration-normal) var(--ease-out);
}
.track-card:hover {
transform: translateY(-5px);
box-shadow: var(--shadow-lg);
border-color: color-mix(in oklch, var(--track-color, var(--track-career)) 45%, transparent);
background: color-mix(in oklch, var(--track-color, var(--track-career)) 4%, var(--bg-primary));
}
/* ===== 统一图标块(品牌双色体系:#3d5afe ↔ #EBEAF6)=====
全站图标 tile 共用一套配方:#EBEAF6 浅薰衣草底 + #3d5afe 品牌蓝图标。
不再依赖 --track-color,统一为品牌双色,保证全站图标视觉一致。 */
.icon-tile {
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: var(--radius-md);
background: var(--brand); /* #EBEAF6 浅薰衣草底 */
border: none;
color: var(--brand-accent); /* #3d5afe 品牌蓝图标(lucide 用 currentColor) */
flex-shrink: 0;
box-shadow: 0 2px 10px rgba(61, 90, 254, 0.10);
transition: transform var(--duration-normal) var(--ease-out),
box-shadow var(--duration-normal) var(--ease-out),
background-color var(--duration-normal) var(--ease-out);
}
.icon-tile:hover {
transform: translateY(-2px);
background: color-mix(in oklch, var(--brand-accent) 8%, var(--brand));
box-shadow: 0 6px 18px rgba(61, 90, 254, 0.18);
}
.icon-tile--lg { width: 48px; height: 48px; }
.icon-tile--md { width: 40px; height: 40px; }
.icon-tile--sm { width: 36px; height: 36px; }
/* ===== CTA band ===== */
.cta-band {
position: relative;
border-radius: var(--radius-xl);
overflow: hidden;
background: linear-gradient(135deg, #1A1A1A 0%, #2a2118 55%, #1A1A1A 100%);
color: var(--brand-white);
}
.cta-band::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(ellipse 40% 60% at 20% 20%, rgba(235,234,246,0.16), transparent 60%),
radial-gradient(ellipse 40% 60% at 85% 80%, color-mix(in oklch, var(--track-career) 12%, transparent), transparent 55%);
pointer-events: none;
}
/* ===== Full-bleed subtle band (中性交替底色,asrmicro 式克制节奏) ===== */
.band {
background: var(--bg-subtle);
background-image:
linear-gradient(rgba(26,26,26,0.022) 1px, transparent 1px),
linear-gradient(90deg, rgba(26,26,26,0.022) 1px, transparent 1px);
background-size: 48px 48px;
background-position: center;
border-top: 1px solid var(--border-light);
border-bottom: 1px solid var(--border-light);
}
/* 空状态专用:news.items 为空时去掉薰衣草色和网格,整片纯白 */
.band--empty {
background: #fff;
background-image: none;
border-top: none;
border-bottom: none;
}
/* ===== Unified Button System — 单一强调色,全局一致 ===== */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
font-family: var(--font-body);
font-weight: 600;
font-size: 14px;
line-height: 1;
/* asrmicro「进一步了解」式圆润胶囊按钮(该圆角处恢复圆角) */
border-radius: 999px;
padding: 13px 26px;
cursor: pointer;
white-space: nowrap;
border: 1px solid transparent;
text-decoration: none;
transition: transform var(--duration-fast) var(--ease-out),
box-shadow var(--duration-fast) var(--ease-out),
background-color var(--duration-fast) var(--ease-out),
border-color var(--duration-fast) var(--ease-out),
color var(--duration-fast) var(--ease-out);
}
.btn:active { transform: translateY(0); }
.btn:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.btn-primary {
background: var(--brand-accent-deep);
color: #fff;
box-shadow: 0 6px 18px color-mix(in oklch, var(--brand-accent-deep) 28%, transparent);
}
.btn-primary:hover {
transform: translateY(-2px);
background: var(--brand-accent-darker);
box-shadow: 0 10px 26px color-mix(in oklch, var(--brand-accent-deep) 36%, transparent);
}
.btn-primary:active {
transform: translateY(0);
background: var(--brand-accent-darker);
}
.btn-ghost {
background: transparent;
color: var(--text-primary);
border-color: var(--border-medium);
}
.btn-ghost:hover {
border-color: var(--accent);
color: var(--accent);
background: color-mix(in oklch, var(--accent) 6%, transparent);
}
/* 深色背景上的按钮 */
.btn-light {
background: var(--brand-cream);
color: var(--brand-black);
box-shadow: var(--shadow-md);
}
.btn-light:hover { transform: translateY(-2px); filter: brightness(1.04); }
.btn-outline-light {
background: transparent;
color: var(--brand-cream);
border-color: rgba(235,234,246,0.35);
}
.btn-outline-light:hover { background: rgba(235,234,246,0.10); }
.btn-lg { padding: 15px 32px; font-size: var(--fs-body); }
.btn-sm { padding: 10px 18px; font-size: var(--fs-micro); }
/* ===== Light feature row (图文交错) ===== */
.feature-media {
border-radius: var(--radius-lg);
overflow: hidden;
border: 1px solid var(--border-light);
box-shadow: var(--shadow-md);
transition: transform var(--duration-normal) var(--ease-out),
box-shadow var(--duration-normal) var(--ease-out);
}
.feature-media:hover {
transform: translateY(-4px);
box-shadow: var(--shadow-lg);
}
.feature-media img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
transition: transform var(--duration-slow) var(--ease-out);
}
.feature-media:hover img { transform: scale(1.05); }
/* ===== 图文卡(asrmicro 式:相关图进卡,图在上、文在下)=====
用于 Home 四大赛道、Innovation 技术路径:每张卡带一张与赛道强相关的图,
顶部 4px 赛道色条保留识别度,hover 轻微上浮 + 图片缓放。 */
.track-media {
position: relative;
display: flex;
flex-direction: column;
background: var(--bg-primary);
border: 1px solid var(--border-light);
border-radius: var(--radius-lg);
overflow: hidden;
transition: transform var(--duration-normal) var(--ease-out),
box-shadow var(--duration-normal) var(--ease-out),
border-color var(--duration-normal) var(--ease-out),
background-color var(--duration-normal) var(--ease-out);
}
.track-media:hover {
transform: translateY(-5px);
box-shadow: var(--shadow-lg);
border-color: color-mix(in oklch, var(--track-color, var(--track-career)) 45%, transparent);
background: color-mix(in oklch, var(--track-color, var(--track-career)) 4%, var(--bg-primary));
}
.track-media__media {
position: relative;
aspect-ratio: 16 / 10;
overflow: hidden;
}
.track-media__media img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
transition: transform var(--duration-slow) var(--ease-out);
}
.track-media:hover .track-media__media img { transform: scale(1.06); }
.track-media__body {
display: flex;
flex-direction: column;
flex: 1;
padding: 18px 20px 22px;
}
/* ===== 图文并排卡(图在侧、内容在另一侧;赛道大段用)=====
用于 Business 四大赛道:左侧相关图、右侧标题+产品矩阵;奇偶交替左右。 */
.track-split {
position: relative;
display: grid;
grid-template-columns: 1fr;
background: var(--bg-primary);
border: 1px solid var(--border-light);
border-radius: 0;
overflow: hidden;
transition: box-shadow var(--duration-normal) var(--ease-out),
border-color var(--duration-normal) var(--ease-out);
}
.track-split:hover {
box-shadow: var(--shadow-lg);
border-color: color-mix(in oklch, var(--track-color, var(--track-career)) 35%, transparent);
}
.track-split__media {
position: relative;
min-height: 240px;
overflow: hidden;
}
.track-split__media img {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
transition: transform var(--duration-slow) var(--ease-out);
}
.track-split:hover .track-split__media img { transform: scale(1.04); }
.track-split__body { padding: 24px 26px 28px; }
@media (min-width: 768px) {
.track-split { grid-template-columns: 0.95fr 1.05fr; }
.track-split__media { min-height: 100%; }
.track-split--rev .track-split__media { order: 2; }
}
/* ===== Tech Hero — asrmicro「科技公司」暗色脉搏段(暖米/琥珀点缀,不返红)=====
用于 Innovation 页首屏:近黑底 + 细网格 + 暖米光晕,给全站中段注入能量与对比。
网格/光晕用 absolute 限定在本区块内(避免旧 .grid-background 的 fixed 溢出问题)。 */
.tech-hero {
position: relative;
background: linear-gradient(180deg, #0c0c12 0%, #15151f 42%, #0e0e16 100%);
overflow: hidden;
isolation: isolate;
}
.tech-hero-grid {
position: absolute;
inset: 0;
z-index: 0;
pointer-events: none;
background-image:
linear-gradient(rgba(235,234,246,0.05) 1px, transparent 1px),
linear-gradient(90deg, rgba(235,234,246,0.05) 1px, transparent 1px);
background-size: 56px 56px;
-webkit-mask-image: radial-gradient(ellipse 85% 70% at 50% 38%, #000 25%, transparent 82%);
mask-image: radial-gradient(ellipse 85% 70% at 50% 38%, #000 25%, transparent 82%);
animation: gridFadeIn 1.6s ease-out forwards;
}
.tech-hero-glow { position: absolute; inset: 0; z-index: 0; pointer-events: none; }
.tech-hero-glow::before,
.tech-hero-glow::after {
content: '';
position: absolute;
border-radius: 50%;
filter: blur(110px);
opacity: 0.35;
}
.tech-hero-glow::before {
width: 520px; height: 520px;
background: radial-gradient(circle, rgba(235,234,246,0.18) 0%, transparent 70%);
top: -160px; right: -80px;
animation: orbFloat1 22s ease-in-out infinite;
}
.tech-hero-glow::after {
width: 460px; height: 460px;
background: radial-gradient(circle, rgba(200,132,26,0.22) 0%, transparent 70%);
bottom: -140px; left: -60px;
animation: orbFloat2 26s ease-in-out infinite;
}
.tech-hero .section-eyebrow { color: rgba(235,234,246,0.78); }
.tech-hero .section-eyebrow::before { background: var(--brand-accent); }
.tech-hero .section-title { color: #fff; }
.tech-hero .section-lead { color: rgba(255,255,255,0.72); }
/* 图片悬停轻微放大(已在 .feature-media 内),此处补一处暗场图片呼吸感 */
@keyframes gridFadeIn { from { opacity: 0; } to { opacity: 1; } }
/* ===== Typography Utilities — 全站字号统一走 CSS 变量阶梯 ===== */
@utility text-display { font-size: var(--fs-display); }
@utility text-h1 { font-size: var(--fs-h1); }
@utility text-h2 { font-size: var(--fs-h2); }
@utility text-h3 { font-size: var(--fs-h3); }
@utility text-body-lg { font-size: var(--fs-body-lg); }
@utility text-body { font-size: var(--fs-body); }
@utility text-body-sm { font-size: var(--fs-body-sm); }
@utility text-micro { font-size: var(--fs-micro); }
/* ===== 小巴适 · 动态陪伴助手 ===== */
/* 进场默认态:藏在屏外右下;.has-entered 后滑入+轻弹跳(时长 ~880ms,JS 端留 1050ms 再开口)。
基础位置/布局/令牌保留原来语义。 */
.mascot-root {
position: fixed;
right: 20px;
bottom: 20px;
z-index: 60;
display: flex;
flex-direction: column;
align-items: flex-end;
gap: 12px;
/* 主题色:主体用浅薰衣草;点缀用品牌蓝;车灯与星星用暖琥珀黄(光感闪耀) */
--mascot-body: var(--brand);
--mascot-accent: var(--brand-accent);
--mascot-star: #F5A623;
transition: transform 0.88s cubic-bezier(0.16, 1, 0.3, 1),
opacity 0.45s ease;
transform: translate3d(180px, 60px, 0) rotate(-10deg);
opacity: 0;
will-change: transform, opacity;
}
.mascot-root.has-entered {
transform: translate3d(0, 0, 0) rotate(0deg);
opacity: 1;
animation: mascotRunInBounce 0.88s cubic-bezier(0.16, 1.25, 0.3, 1);
}
.mascot-float {
border: none;
background: transparent;
cursor: pointer;
padding: 0;
line-height: 0;
border-radius: 50%;
transition: transform 0.2s ease;
user-select: none;
}
/* 配色统一主题色:覆盖 SVG 内硬编码填充 */
.mascot-svg .mascot-body { fill: var(--mascot-body); }
.mascot-svg .mascot-accent { fill: var(--mascot-accent); }
.mascot-svg .mascot-light { fill: var(--mascot-star); }
.mascot-svg .mascot-star { fill: var(--mascot-star); }
.mascot-float:hover { transform: scale(1.06); }
.mascot-float:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
.mascot-svg {
display: block;
filter: drop-shadow(0 6px 14px rgba(26, 26, 26, 0.18));
}
.mascot-bubble {
width: min(300px, calc(100vw - 40px));
background: var(--brand-white);
border: 1px solid var(--border-light);
border-radius: var(--radius-lg);
padding: 14px 16px;
box-shadow: 0 12px 30px rgba(26, 26, 26, 0.16);
position: relative;
animation: bubbleIn 0.22s ease-out;
}
.mascot-bubble::after {
content: "";
position: absolute;
right: 28px;
bottom: -8px;
width: 16px;
height: 16px;
background: var(--brand-white);
border-right: 1px solid var(--border-light);
border-bottom: 1px solid var(--border-light);
transform: rotate(45deg);
}
.mascot-bubble-name {
font-size: var(--fs-body); /* 16px 与正文同级,作为气泡标题"小巴适"视觉平衡;原 12px 太小,比正文还小 4px */
line-height: 1.35;
font-weight: 700;
/* 品牌蓝(主题强调色),与全站 CTA/导航/链接统一,白底对比 5.07:1 过 AA */
color: var(--brand-accent);
margin-bottom: 8px;
letter-spacing: 0.01em;
}
.mascot-bubble-text {
font-size: var(--fs-body);
line-height: 1.6;
color: var(--brand-black);
margin: 0;
}
.mascot-bubble-actions {
display: flex;
gap: 8px;
margin-top: 10px;
justify-content: flex-end;
}
.mascot-bubble-btn {
font-size: 12px;
padding: 5px 10px;
border-radius: 8px;
border: 1px solid var(--brand-accent-deep);
background: var(--brand-accent-deep);
color: #fff;
cursor: pointer;
transition: opacity 0.2s ease;
}
/* ================================================================
全站「返回顶部」浮动按钮
- 固定在右下角、小巴适(Mascot)正上方,避免与可拖动陪伴角色重叠
- 滚动超过 480px 后淡入上浮;点击平滑回到页首
- 主题强调色(品牌蓝),hover 微抬升 + 加深阴影
================================================================ */
.back-to-top {
position: fixed;
right: 24px;
bottom: 120px;
z-index: 58;
width: 46px;
height: 46px;
border-radius: 50%;
border: none;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
background: var(--brand-accent);
box-shadow: 0 8px 20px rgba(61, 90, 254, 0.35);
opacity: 0;
transform: translateY(12px);
pointer-events: none;
transition: opacity 0.28s ease, transform 0.28s ease, background 0.2s ease;
}
.back-to-top.is-visible {
opacity: 1;
transform: translateY(0);
pointer-events: auto;
}
.back-to-top:hover {
background: var(--brand-accent-deep, #2a3fd6);
transform: translateY(-2px);
box-shadow: 0 12px 26px rgba(61, 90, 254, 0.45);
}
.back-to-top:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 3px;
}
@media (max-width: 640px) {
.back-to-top {
right: 16px;
bottom: 104px;
width: 42px;
height: 42px;
}
}
@media (prefers-reduced-motion: reduce) {
.back-to-top {
transition: opacity 0.2s ease;
transform: none;
}
.back-to-top:hover {
transform: none;
}
}
.mascot-bubble-btn.ghost {
background: transparent;
color: var(--brand-accent-deep);
}
.mascot-bubble-btn:hover { opacity: 0.9; }
/* ===== 小巴适戳戳动效(老板"有趣"交付物) =====
进场动画和 keyframes(mascotRunInBounce)已前移到文件顶部 .mascot-root 定义处。 */
.mascot-float[data-mood="squeeze"] {
animation: mascotSqueeze 0.62s cubic-bezier(0.16, 1.35, 0.3, 1);
}
.mascot-float[data-mood="squeeze"] .mascot-arm {
transform-box: fill-box;
transform-origin: 0% 100%;
animation: mascotWave 0.38s ease-in-out 3;
}
.mascot-float[data-mood="squeeze"] .mascot-dots circle,
.mascot-float[data-mood="squeeze"] .mascot-sparks path {
animation-duration: 0.5s;
}
@keyframes mascotRunInBounce {
0% { transform: translate3d(180px, 60px, 0) rotate(-10deg); }
60% { transform: translate3d(-10px, -10px, 0) rotate(4deg); }
78% { transform: translate3d(6px, 4px, 0) rotate(-2deg); }
100% { transform: translate3d(0, 0, 0) rotate(0deg); }
}
@keyframes mascotSqueeze {
0% { transform: translateY(0) scale(1); }
28% { transform: translateY(6px) scale(0.92, 1.04); }
55% { transform: translateY(-16px) scale(1.08, 0.94); }
80% { transform: translateY(2px) scale(0.98, 1.02); }
100% { transform: translateY(0) scale(1); }
}
/* 动效仅在用户未要求减少动效时启用 */
@media (prefers-reduced-motion: no-preference) {
.mascot-float { animation: mascotBob 2.8s ease-in-out infinite; }
.mascot-float[data-mood="wave"] .mascot-arm {
transform-box: fill-box;
transform-origin: 0% 100%;
animation: mascotWave 1s ease-in-out infinite;
}
.mascot-float[data-mood="think"] .mascot-dots circle {
transform-box: fill-box;
transform-origin: center;
animation: dotPulse 1.4s ease-in-out infinite;
}
.mascot-float[data-mood="think"] .mascot-dots circle:nth-child(2) { animation-delay: 0.2s; }
.mascot-float[data-mood="think"] .mascot-dots circle:nth-child(3) { animation-delay: 0.4s; }
.mascot-float[data-mood="cheer"] { animation: mascotCheer 0.7s ease-in-out infinite; }
.mascot-float[data-mood="cheer"] .mascot-sparks path {
transform-box: fill-box;
transform-origin: center;
animation: sparkle 1.2s ease-in-out infinite;
}
.mascot-float[data-mood="cheer"] .mascot-sparks path:nth-child(2) { animation-delay: 0.3s; }
}
@keyframes mascotBob {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-5px); }
}
@keyframes mascotWave {
0%, 100% { transform: rotate(-12deg); }
50% { transform: rotate(16deg); }
}
@keyframes mascotCheer {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-9px); }
}
@keyframes dotPulse {
0%, 100% { opacity: 0.35; transform: scale(0.8); }
50% { opacity: 1; transform: scale(1); }
}
@keyframes sparkle {
0%, 100% { opacity: 0; transform: scale(0.4); }
50% { opacity: 1; transform: scale(1); }
}
@keyframes bubbleIn {
from { opacity: 0; transform: translateY(8px) scale(0.96); }
to { opacity: 1; transform: translateY(0) scale(1); }
}
/* 吉祥物进场/戳戳动效的降级(尊重 prefers-reduced-motion) */
@media (prefers-reduced-motion: reduce) {
.mascot-root {
transition: opacity 0.2s ease;
transform: none !important;
opacity: 1 !important;
}
.mascot-root.has-entered {
animation: none !important;
}
.mascot-float,
.mascot-float[data-mood="squeeze"],
.mascot-float[data-mood="wave"] .mascot-arm,
.mascot-float[data-mood="think"] .mascot-dots circle,
.mascot-float[data-mood="cheer"],
.mascot-float[data-mood="cheer"] .mascot-sparks path,
.mascot-float[data-mood="squeeze"] .mascot-arm,
.mascot-float[data-mood="squeeze"] .mascot-dots circle,
.mascot-float[data-mood="squeeze"] .mascot-sparks path {
animation: none !important;
}
}
/* ================================================================
Hero 背景:环绕中央玻璃球的精致轨道粒子动画
- 7 圈轨道(半径 110~275px),明确围绕玻璃球外侧公转
- 16 颗精致小点(3~6px),白核 + 淡蓝边缘,光晕柔和不抢戏
- 每点带轻微脉冲(3s,stagger),整体节奏从容
- 锚点对齐 hero-bg.jpg 中央玻璃球(约 70% / 38%)
- 仅动 transform / opacity(GPU 友好)
================================================================ */
.hero-orbit {
position: absolute;
left: 70%;
top: 46%;
width: 0;
height: 0;
pointer-events: none;
}
@media (max-width: 640px) {
/* 窄屏下图片横向裁切更多,球偏右;轨道中心随之下移以贴近主体 */
.hero-orbit { left: 77%; top: 48%; }
}
.hero-ring {
position: absolute;
top: 0;
left: 0;
width: 0;
height: 0;
transform-origin: 0 0;
animation: heroOrbitSpin 12s linear infinite;
}
.hero-orbit-slot {
position: absolute;
top: 0;
left: 0;
width: 0;
height: 0;
transform-origin: 0 0;
/* 预旋转到角度 a,再向外推 r —— 父级 .hero-ring 旋转时整圈绕中心公转 */
transform: rotate(var(--a, 0deg)) translateY(calc(-1 * var(--r, 50px)));
}
.hero-orbit-dot {
position: absolute;
top: 0;
left: 0;
border-radius: 50%;
/* 柔和径向渐变:白核 → 淡蓝雾化 → 透明,告别"硬光球"观感 */
background: radial-gradient(
circle,
rgba(255, 255, 255, 0.95) 0%,
rgba(255, 255, 255, 0.55) 30%,
rgba(186, 204, 255, 0.32) 60%,
rgba(186, 204, 255, 0) 80%
);
box-shadow:
0 0 6px rgba(255, 255, 255, 0.55),
0 0 14px rgba(186, 204, 255, 0.32);
transform: translate(-50%, -50%);
will-change: transform, opacity;
animation: heroOrbitPulse 3.2s ease-in-out infinite;
}
/* 彗星拖尾:沿轨道切线方向(slot 局部 ±X 轴),公转时自然拖在运动后方
- normal 公转(顺时针)→ 拖尾在 -X(dot 左侧)
- reverse 公转(逆时针)→ 拖尾镜像到 +X(dot 右侧),见 .is-rev 覆盖
- 跟随 dot 的 pulse 一起呼吸/缩放,无需单独动画 */
.hero-orbit-dot::before {
content: "";
position: absolute;
top: 50%;
right: 50%;
transform: translateY(-50%);
width: 22px;
height: 100%;
border-radius: 999px;
background: linear-gradient(
to left,
rgba(255, 255, 255, 0.9) 0%,
rgba(186, 204, 255, 0.55) 35%,
rgba(186, 204, 255, 0) 100%
);
pointer-events: none;
}
.hero-ring.is-rev .hero-orbit-dot::before {
right: auto;
left: 50%;
background: linear-gradient(
to right,
rgba(255, 255, 255, 0.9) 0%,
rgba(186, 204, 255, 0.55) 35%,
rgba(186, 204, 255, 0) 100%
);
}
@keyframes heroOrbitSpin {
to { transform: rotate(360deg); }
}
/* 轻微呼吸:相位由 inline animationDelay 注入(每颗错开 0.35s),避免齐刷刷 */
@keyframes heroOrbitPulse {
0%, 100% { opacity: 0.6; transform: translate(-50%, -50%) scale(0.85); }
50% { opacity: 1; transform: translate(-50%, -50%) scale(1.25); }
}
/* ===== 轨道粒子 4 色变体(白/蓝/紫/粉)+ 加长彗星拖尾 ===== */
.hero-orbit-dot.dot-white {
background: radial-gradient(
circle,
rgba(255, 255, 255, 0.98) 0%,
rgba(255, 255, 255, 0.6) 30%,
rgba(220, 230, 255, 0.35) 60%,
rgba(220, 230, 255, 0) 82%
);
box-shadow: 0 0 8px rgba(255, 255, 255, 0.55), 0 0 18px rgba(210, 220, 255, 0.28);
}
.hero-orbit-dot.dot-white::before {
width: 32px;
background: linear-gradient(
to left,
rgba(255, 255, 255, 0.88) 0%,
rgba(200, 215, 255, 0.45) 40%,
rgba(200, 215, 255, 0) 100%
);
}
.hero-ring.is-rev .hero-orbit-dot.dot-white::before {
background: linear-gradient(
to right,
rgba(255, 255, 255, 0.88) 0%,
rgba(200, 215, 255, 0.45) 40%,
rgba(200, 215, 255, 0) 100%
);
}
.hero-orbit-dot.dot-blue {
background: radial-gradient(
circle,
rgba(210, 225, 255, 0.98) 0%,
rgba(120, 160, 255, 0.62) 32%,
rgba(70, 110, 255, 0.30) 62%,
rgba(70, 110, 255, 0) 84%
);
box-shadow: 0 0 8px rgba(120, 160, 255, 0.55), 0 0 20px rgba(61, 90, 254, 0.32);
}
.hero-orbit-dot.dot-blue::before {
width: 36px;
background: linear-gradient(
to left,
rgba(170, 198, 255, 0.9) 0%,
rgba(85, 125, 255, 0.45) 42%,
rgba(85, 125, 255, 0) 100%
);
}
.hero-ring.is-rev .hero-orbit-dot.dot-blue::before {
background: linear-gradient(
to right,
rgba(170, 198, 255, 0.9) 0%,
rgba(85, 125, 255, 0.45) 42%,
rgba(85, 125, 255, 0) 100%
);
}
.hero-orbit-dot.dot-violet {
background: radial-gradient(
circle,
rgba(232, 220, 255, 0.98) 0%,
rgba(185, 155, 255, 0.60) 32%,
rgba(150, 110, 255, 0.28) 62%,
rgba(150, 110, 255, 0) 84%
);
box-shadow: 0 0 8px rgba(185, 155, 255, 0.55), 0 0 20px rgba(150, 110, 255, 0.30);
}
.hero-orbit-dot.dot-violet::before {
width: 34px;
background: linear-gradient(
to left,
rgba(220, 205, 255, 0.9) 0%,
rgba(160, 130, 255, 0.44) 42%,
rgba(160, 130, 255, 0) 100%
);
}
.hero-ring.is-rev .hero-orbit-dot.dot-violet::before {
background: linear-gradient(
to right,
rgba(220, 205, 255, 0.9) 0%,
rgba(160, 130, 255, 0.44) 42%,
rgba(160, 130, 255, 0) 100%
);
}
.hero-orbit-dot.dot-pink {
background: radial-gradient(
circle,
rgba(255, 230, 240, 0.98) 0%,
rgba(255, 170, 205, 0.58) 32%,
rgba(255, 125, 180, 0.26) 62%,
rgba(255, 125, 180, 0) 84%
);
box-shadow: 0 0 8px rgba(255, 170, 205, 0.52), 0 0 20px rgba(255, 125, 180, 0.28);
}
.hero-orbit-dot.dot-pink::before {
width: 32px;
background: linear-gradient(
to left,
rgba(255, 215, 230, 0.9) 0%,
rgba(255, 145, 193, 0.42) 42%,
rgba(255, 145, 193, 0) 100%
);
}
.hero-ring.is-rev .hero-orbit-dot.dot-pink::before {
background: linear-gradient(
to right,
rgba(255, 215, 230, 0.9) 0%,
rgba(255, 145, 193, 0.42) 42%,
rgba(255, 145, 193, 0) 100%
);
}
/* ===== 雾化光晕 orb:超大 blur 圆,静止不漂(浅底可见版:透明度×2.2) ===== */
.hero-glow-orb {
position: absolute;
left: var(--orb-x);
top: var(--orb-y);
width: calc(var(--orb-sz) * 1.15); /* 尺寸 ×1.15,浅底上更有存在感 */
height: calc(var(--orb-sz) * 1.15);
border-radius: 9999px;
background: radial-gradient(circle, var(--orb-color) 0%, transparent 80%);
filter: blur(32px); /* 原 28px → 略增大,扩散感更强 */
opacity: 1.0; /* 原 0.85 → ×1.18,完全可见 */
mix-blend-mode: multiply;/* 浅底叠加更柔和,不突兀 */
animation-duration: 18s;
animation-timing-function: ease-in-out;
animation-iteration-count: infinite;
will-change: transform;
pointer-events: none;
transform: translate(-50%, -50%);
}
@keyframes hero-orb-float-1 {
0%, 100% { transform: translate(-50%, -50%) translate(0, 0) scale(1); }
33% { transform: translate(-50%, -50%) translate(40px, -30px) scale(1.08); }
66% { transform: translate(-50%, -50%) translate(-30px, 25px) scale(0.94); }
}
@keyframes hero-orb-float-2 {
0%, 100% { transform: translate(-50%, -50%) translate(0, 0) scale(1); }
40% { transform: translate(-50%, -50%) translate(-36px, 30px) scale(1.05); }
75% { transform: translate(-50%, -50%) translate(28px, -28px) scale(0.97); }
}
@media (prefers-reduced-motion: reduce) {
.hero-ring { animation: none; }
.hero-orbit-dot { animation: none; opacity: 0.82; }
.hero-glow-orb { animation: none; }
}
/* ===== 方案B:用户不喜欢"游来游去" → 全部停移动,保留呼吸闪烁 ===== */
.hero-ring {
animation: none !important;
}
.hero-glow-orb {
animation: none !important;
}
/* 轨道粒子:去掉彗星游动拖尾 → 改成静态"星芒放射"(4 向渐变光线) */
.hero-orbit-dot::before,
.hero-ring.is-rev .hero-orbit-dot::before {
content: "";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 220%;
height: 220%;
border-radius: 9999px;
background:
radial-gradient(
ellipse at 50% 50%,
rgba(255, 255, 255, 0.0) 0%,
rgba(255, 255, 255, 0.0) 28%,
rgba(255, 255, 255, 0.0) 100%
);
pointer-events: none;
}
.hero-orbit-dot.dot-white::before {
background:
radial-gradient(circle at 50% 50%, rgba(255,255,255,0.0) 30%, rgba(255,255,255,0.60) 42%, rgba(255,255,255,0.0) 54%),
linear-gradient(to right, transparent 48%, rgba(255,255,255,0.48) 50%, transparent 52%),
linear-gradient(to bottom, transparent 48%, rgba(255,255,255,0.48) 50%, transparent 52%),
linear-gradient(45deg, transparent 48%, rgba(255,255,255,0.30) 50%, transparent 52%),
linear-gradient(-45deg, transparent 48%, rgba(255,255,255,0.30) 50%, transparent 52%);
}
.hero-orbit-dot.dot-blue::before {
background:
radial-gradient(circle at 50% 50%, rgba(80,125,255,0.0) 30%, rgba(80,125,255,0.60) 42%, rgba(80,125,255,0.0) 54%),
linear-gradient(to right, transparent 48%, rgba(80,125,255,0.48) 50%, transparent 52%),
linear-gradient(to bottom, transparent 48%, rgba(80,125,255,0.48) 50%, transparent 52%),
linear-gradient(45deg, transparent 48%, rgba(80,125,255,0.30) 50%, transparent 52%),
linear-gradient(-45deg, transparent 48%, rgba(80,125,255,0.30) 50%, transparent 52%);
}
.hero-orbit-dot.dot-violet::before {
background:
radial-gradient(circle at 50% 50%, rgba(135,100,255,0.0) 30%, rgba(135,100,255,0.60) 42%, rgba(135,100,255,0.0) 54%),
linear-gradient(to right, transparent 48%, rgba(135,100,255,0.48) 50%, transparent 52%),
linear-gradient(to bottom, transparent 48%, rgba(135,100,255,0.48) 50%, transparent 52%),
linear-gradient(45deg, transparent 48%, rgba(135,100,255,0.30) 50%, transparent 52%),
linear-gradient(-45deg, transparent 48%, rgba(135,100,255,0.30) 50%, transparent 52%);
}
.hero-orbit-dot.dot-pink::before {
background:
radial-gradient(circle at 50% 50%, rgba(255,105,175,0.0) 30%, rgba(255,105,175,0.60) 42%, rgba(255,105,175,0.0) 54%),
linear-gradient(to right, transparent 48%, rgba(255,105,175,0.48) 50%, transparent 52%),
linear-gradient(to bottom, transparent 48%, rgba(255,105,175,0.48) 50%, transparent 52%),
linear-gradient(45deg, transparent 48%, rgba(255,105,175,0.30) 50%, transparent 52%),
linear-gradient(-45deg, transparent 48%, rgba(255,105,175,0.30) 50%, transparent 52%);
}
/* HERO 左下文字(h1 / p / a)在浅底 hero-bg.jpg 上的可读阴影,保证不蒙层时也清晰 */
.hero-text-visible h1.text-white,
.hero-text-visible p.text-white,
.hero-text-visible p.text-white\/90,
.hero-text-visible a.text-white {
text-shadow:
0 2px 14px rgba(10, 14, 42, 0.58),
0 0 36px rgba(10, 14, 42, 0.28);
-webkit-font-smoothing: antialiased;
}
.hero-text-visible a.text-white {
text-shadow:
0 1px 10px rgba(10, 14, 42, 0.65);
border-bottom-color: rgba(255, 255, 255, 0.85);
}
@media (max-width: 640px) {
.hero-glow-orb { filter: blur(18px); opacity: 0.7; }
}
/* ================================================================
公司概览:中心节点辐射网络图(深色科技感)
- 中心「巴适伙伴」+ 6 个可点击子节点,SVG 发光线连接
- 点击节点 → 下方详情面板展开(交互在 OrgNetwork.tsx)
================================================================ */
.org-shell {
position: relative;
max-width: 720px;
margin: 28px auto 0;
padding: 24px;
border-radius: 32px;
background:
radial-gradient(circle at 50% 30%, rgba(61, 90, 254, 0.14), transparent 65%),
linear-gradient(160deg, #0a0e2a 0%, #14182f 55%, #1d2150 100%);
box-shadow:
inset 0 0 80px rgba(61, 90, 254, 0.10),
0 24px 60px -28px rgba(10, 14, 42, 0.45);
border: 1px solid rgba(255, 255, 255, 0.06);
}
.org-net {
position: relative;
width: 100%;
aspect-ratio: 1 / 1;
border-radius: 24px;
overflow: hidden;
background:
radial-gradient(circle at 50% 50%, rgba(61, 90, 254, 0.18), transparent 62%),
linear-gradient(135deg, #0a0e2a 0%, #14182f 50%, #1d2150 100%);
box-shadow: inset 0 0 60px rgba(61, 90, 254, 0.12);
}
.org-lines {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
pointer-events: none;
}
.org-line {
stroke: rgba(120, 140, 255, 0.32);
stroke-width: 1.5;
vector-effect: non-scaling-stroke;
transition: stroke 0.3s ease, opacity 0.3s ease;
}
.org-line.is-active {
stroke: var(--brand-accent);
stroke-width: 2.5;
filter: drop-shadow(0 0 4px rgba(61, 90, 254, 0.9));
}
.org-node {
position: absolute;
transform: translate(-50%, -50%);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 2px;
padding: 10px 14px;
border-radius: 999px;
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.18);
color: #fff;
-webkit-backdrop-filter: blur(6px);
backdrop-filter: blur(6px);
cursor: pointer;
transition: border-color 0.25s ease, background 0.25s ease, box-shadow 0.25s ease;
font-size: var(--fs-micro);
white-space: nowrap;
}
.org-node:hover {
border-color: var(--brand-accent);
background: rgba(61, 90, 254, 0.18);
box-shadow: 0 0 18px rgba(61, 90, 254, 0.5);
}
.org-node.is-active {
border-color: var(--brand-accent);
background: rgba(61, 90, 254, 0.28);
box-shadow: 0 0 22px rgba(61, 90, 254, 0.7);
}
.org-node-center {
padding: 16px 22px;
font-size: var(--fs-body);
background: rgba(61, 90, 254, 0.25);
border-color: var(--brand-accent);
}
.org-node-title {
font-weight: 600;
line-height: 1.2;
}
.org-node-sub {
font-size: var(--fs-micro);
opacity: 0.7;
}
/* ===== 无障碍工具类(WCAG 2.4.1 Bypass Blocks + 2.5.8 Target Size)=====
sr-only:视觉隐藏但屏幕阅读器可读。
skip-link:默认隐藏,键盘 Tab 聚焦时显现,跳到主内容(绕过重复导航)。
触控目标:桌面端导航 ≈24px(达 AA 24px 最小值),移动端导航 py-2.5≈44px(达 AAA)。 */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
.skip-link {
position: absolute;
left: 1rem;
top: 1rem;
z-index: 100;
padding: 0.6rem 1rem;
border-radius: var(--radius-md);
background: var(--brand-white);
color: var(--brand-black);
border: 2px solid var(--focus-ring);
box-shadow: var(--shadow-md);
font-weight: 600;
transform: translateY(-150%);
transition: transform var(--duration-fast) var(--ease-out);
}
.skip-link:focus {
transform: translateY(0);
}
.org-panel {
max-width: 720px;
margin: 20px auto 0;
min-height: 96px;
padding: 20px 24px;
border-radius: 18px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.12);
color: #e9ecff;
}
.org-panel-title {
font-size: var(--fs-body);
font-weight: 700;
color: #fff;
}
.org-panel-desc {
margin-top: 8px;
line-height: 1.8;
color: rgba(233, 236, 255, 0.85);
font-size: var(--fs-body);
}
.org-panel-link {
display: inline-flex;
align-items: center;
gap: 6px;
margin-top: 12px;
color: var(--brand-accent);
font-weight: 600;
font-size: var(--fs-body);
transition: gap 0.2s ease;
}
.org-panel-link:hover {
gap: 10px;
}
@media (max-width: 640px) {
.org-net { aspect-ratio: 1 / 1; }
.org-node {
font-size: var(--fs-micro);
padding: 7px 10px;
}
.org-node-center {
font-size: var(--fs-micro);
padding: 12px 16px;
}
}
/* ===== 数字生活生态全景图(EcosystemMap · 首页3受众×业务页4赛道 的桥)=====
依据 business-architecture.md §4 已确认矩阵。同一组 10 产品,赛道/受众双视角。
动效:中心心跳 + 连接线能量流 + 节点轻浮;prefers-reduced-motion 由全局守卫降级。 */
.eco-shell {
max-width: 1120px;
margin: 0 auto;
}
.eco-lens {
display: inline-flex;
padding: 4px;
gap: 4px;
border-radius: var(--radius-xl);
background: var(--bg-primary);
border: 1px solid var(--border-light);
box-shadow: var(--shadow-xs);
}
.eco-lens-btn {
appearance: none;
border: none;
cursor: pointer;
padding: 0.5rem 1.1rem;
border-radius: var(--radius-lg);
font-size: var(--fs-body-sm);
font-weight: 600;
color: var(--text-muted);
background: transparent;
transition: color var(--duration-fast) var(--ease-out), background var(--duration-fast) var(--ease-out), box-shadow var(--duration-fast) var(--ease-out);
}
.eco-lens-btn:hover { color: var(--brand-black); }
.eco-lens-btn.is-active {
color: #fff;
background: var(--brand-accent-deep);
box-shadow: var(--shadow-sm);
}
.eco-lens-btn:focus-visible {
outline: 2px solid var(--focus-ring);
outline-offset: 2px;
}
.eco-body {
margin-top: var(--space-5);
display: grid;
grid-template-columns: 1fr;
gap: var(--space-5);
}
@media (min-width: 880px) {
.eco-body { grid-template-columns: 1.05fr 0.95fr; align-items: start; }
}
.eco-stage {
position: relative;
aspect-ratio: 1 / 1;
max-height: 560px;
border-radius: var(--radius-xl);
background:
radial-gradient(ellipse 70% 60% at 50% 50%, rgba(235,234,246,0.55), transparent 70%),
var(--bg-primary);
border: 1px solid var(--border-light);
box-shadow: var(--shadow-sm);
overflow: hidden;
}
/* 极淡网格底纹,premium 纹理不抢戏 */
.eco-stage::before {
content: '';
position: absolute;
inset: 0;
background-image:
linear-gradient(rgba(26,26,26,0.03) 1px, transparent 1px),
linear-gradient(90deg, rgba(26,26,26,0.03) 1px, transparent 1px);
background-size: 40px 40px;
background-position: center;
pointer-events: none;
}
.eco-lines {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
}
.eco-line {
stroke: var(--brand-accent);
stroke-width: 1.5;
stroke-dasharray: 3 4;
vector-effect: non-scaling-stroke;
opacity: 0.35;
animation: ecoDash 3.2s linear infinite;
transition: opacity var(--duration-normal) var(--ease-out), stroke var(--duration-normal) var(--ease-out);
}
.eco-line.is-active {
opacity: 0.9;
stroke: var(--brand-accent-deep);
stroke-width: 2;
animation-duration: 1.6s;
}
@keyframes ecoDash {
to { stroke-dashoffset: -7; }
}
/* 中心枢纽 */
.eco-hub {
position: absolute;
transform: translate(-50%, -50%);
z-index: 3;
display: flex;
flex-direction: column;
align-items: center;
gap: 1px;
padding: 1.1rem 1.4rem;
border-radius: var(--radius-xl);
background: var(--brand-black);
color: #fff;
border: none;
cursor: pointer;
box-shadow: var(--shadow-lg);
transition: transform var(--duration-normal) var(--ease-out), box-shadow var(--duration-normal) var(--ease-out);
}
.eco-hub:hover { transform: translate(-50%, -50%) scale(1.04); }
.eco-hub:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 3px; }
.eco-hub.is-active { box-shadow: 0 0 0 3px var(--brand-accent), var(--shadow-lg); }
.eco-hub-glow {
position: absolute;
inset: -10px;
border-radius: inherit;
background: radial-gradient(circle, rgba(235,234,246,0.55) 0%, transparent 70%);
z-index: -1;
animation: ecoPulse 3.6s ease-in-out infinite;
}
@keyframes ecoPulse {
0%, 100% { opacity: 0.5; transform: scale(1); }
50% { opacity: 0.9; transform: scale(1.12); }
}
.eco-hub-title { font-size: var(--fs-body); font-weight: 800; letter-spacing: 0.01em; }
.eco-hub-sub { font-size: var(--fs-micro); opacity: 0.7; letter-spacing: 0.08em; }
/* 赛道 / 受众 节点 */
.eco-node {
position: absolute;
transform: translate(-50%, -50%);
z-index: 2;
display: flex;
flex-direction: column;
align-items: center;
gap: 3px;
padding: 0.6rem 0.85rem;
border-radius: var(--radius-lg);
background: rgba(255,255,255,0.85);
backdrop-filter: blur(10px);
border: 1px solid var(--border-light);
box-shadow: var(--shadow-xs);
cursor: pointer;
transition: box-shadow var(--duration-normal) var(--ease-out), border-color var(--duration-normal) var(--ease-out);
animation: ecoFloat 6s ease-in-out infinite;
animation-delay: var(--dly, 0s);
}
.eco-node:hover { box-shadow: var(--shadow-md); border-color: var(--brand-accent); }
.eco-node:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.eco-node.is-active {
border-color: var(--brand-accent-deep);
box-shadow: 0 0 0 2px var(--brand-accent), var(--shadow-md);
}
/* float 不破坏 translate(-50%,-50%) 居中:完整保留居中分量 */
@keyframes ecoFloat {
0%, 100% { transform: translate(-50%, -50%); }
50% { transform: translate(-50%, calc(-50% - 4px)); }
}
.eco-node-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 34px;
height: 34px;
border-radius: var(--radius-md);
background: color-mix(in oklch, var(--brand-accent) 10%, transparent);
color: var(--brand-accent-deep);
}
.eco-node-name { font-size: var(--fs-body); font-weight: 700; color: var(--brand-black); white-space: nowrap; }
.eco-node-action { font-size: var(--fs-micro); color: var(--brand-accent); font-weight: 600; letter-spacing: 0.06em; }
.eco-node-count {
position: absolute;
top: -8px;
right: -8px;
min-width: 20px;
height: 20px;
padding: 0 5px;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 999px;
background: var(--brand-accent-deep);
color: #fff;
font-size: var(--fs-micro);
font-weight: 700;
box-shadow: var(--shadow-xs);
}
/* 详情面板 */
.eco-panel {
padding: var(--space-4);
border-radius: var(--radius-xl);
background: rgba(255,255,255,0.7);
backdrop-filter: blur(10px);
border: 1px solid var(--border-light);
box-shadow: var(--shadow-sm);
}
.eco-panel-title { margin-top: 0.5rem; font-size: var(--fs-body); font-weight: 800; color: var(--brand-black); }
.eco-panel-note { margin-top: 0.35rem; font-size: var(--fs-body); color: var(--text-secondary); line-height: 1.6; }
.eco-products { margin-top: var(--space-3); display: flex; flex-direction: column; gap: 0.5rem; list-style: none; padding: 0; }
.eco-product {
display: flex;
gap: 0.6rem;
padding: 0.6rem 0.75rem;
border-radius: var(--radius-md);
background: var(--bg-primary);
border: 1px solid var(--border-light);
transition: border-color var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
}
.eco-product:hover { border-color: var(--brand-accent); transform: translateX(2px); }
.eco-product-icon { color: var(--brand-accent-deep); padding-top: 1px; flex-shrink: 0; }
.eco-product-main { min-width: 0; flex: 1; }
.eco-product-head { display: flex; align-items: center; gap: 0.4rem; flex-wrap: wrap; }
.eco-product-name { font-size: var(--fs-body); font-weight: 700; color: var(--brand-black); }
.eco-product-desc { margin-top: 0.15rem; font-size: var(--fs-micro); color: var(--text-muted); line-height: 1.5; }
/* 受众标记:C=蓝 B=绿 F=紫(与品牌蓝/状态青绿/创新紫呼应) */
.eco-aud-dots { display: inline-flex; gap: 3px; margin-left: auto; }
.eco-dot {
display: inline-flex;
align-items: center;
justify-content: center;
width: 16px;
height: 16px;
border-radius: 999px;
font-size: var(--fs-micro);
font-weight: 800;
color: #fff;
letter-spacing: 0;
}
.eco-dot-c { background: var(--brand-accent); }
.eco-dot-b { background: var(--status-done); }
.eco-dot-f { background: var(--icidp-innovation); }
.eco-legend {
margin-top: var(--space-4);
text-align: center;
font-size: var(--fs-micro);
color: var(--text-muted);
line-height: 1.7;
}
/* 移动端:舞台缩小、节点紧凑、面板下移 */
@media (max-width: 879px) {
.eco-stage { aspect-ratio: 1 / 1; max-height: 440px; }
.eco-node { padding: 0.45rem 0.6rem; }
.eco-node-icon { width: 28px; height: 28px; }
.eco-node-name { font-size: var(--fs-micro); }
.eco-node-action { font-size: var(--fs-micro); }
.eco-hub { padding: 0.75rem 1rem; }
}
@media (max-width: 480px) {
.eco-node-count { min-width: 18px; height: 18px; font-size: var(--fs-micro); }
.eco-lens-btn { padding: 0.4rem 0.85rem; }
}