diff --git a/src/pages/AboutPage.tsx b/src/pages/AboutPage.tsx
index 9d54ded..24f517c 100644
--- a/src/pages/AboutPage.tsx
+++ b/src/pages/AboutPage.tsx
@@ -7,7 +7,7 @@ export default function AboutPage() {
const t = getTranslation(locale);
return (
<>
-
+
>
);
diff --git a/src/pages/BusinessPage.tsx b/src/pages/BusinessPage.tsx
index ee18814..e0b1c37 100644
--- a/src/pages/BusinessPage.tsx
+++ b/src/pages/BusinessPage.tsx
@@ -7,7 +7,7 @@ export default function BusinessPage() {
const t = getTranslation(locale);
return (
<>
-
+
>
);
diff --git a/src/pages/ContactPage.tsx b/src/pages/ContactPage.tsx
index 7d08623..42dc8d5 100644
--- a/src/pages/ContactPage.tsx
+++ b/src/pages/ContactPage.tsx
@@ -7,7 +7,7 @@ export default function ContactPage() {
const t = getTranslation(locale);
return (
<>
-
+
>
);
diff --git a/src/pages/InvestorsPage.tsx b/src/pages/InvestorsPage.tsx
index 3b36107..247501f 100644
--- a/src/pages/InvestorsPage.tsx
+++ b/src/pages/InvestorsPage.tsx
@@ -7,7 +7,7 @@ export default function InvestorsPage() {
const t = getTranslation(locale);
return (
<>
-
+
>
);
diff --git a/src/pages/NewsPage.tsx b/src/pages/NewsPage.tsx
index fbdb88c..588327e 100644
--- a/src/pages/NewsPage.tsx
+++ b/src/pages/NewsPage.tsx
@@ -7,7 +7,7 @@ export default function NewsPage() {
const t = getTranslation(locale);
return (
<>
-
+
>
);
diff --git a/src/pages/SustainabilityPage.tsx b/src/pages/SustainabilityPage.tsx
index 36ac122..8787bf2 100644
--- a/src/pages/SustainabilityPage.tsx
+++ b/src/pages/SustainabilityPage.tsx
@@ -7,7 +7,7 @@ export default function SustainabilityPage() {
const t = getTranslation(locale);
return (
<>
-
+
>
);
diff --git a/src/placeholder.ts b/src/placeholder.ts
deleted file mode 100644
index 3f6d9bc..0000000
--- a/src/placeholder.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-// 统一占位图:全站内容图(办公/团队/业务/新闻/横幅等)共用此图。
-// 图片统一托管于 OSS:https://oss.baskbuddy.com/baskbuddy/
-// 若要替换占位图,把对应文件上传到 OSS 后改本常量一处即可全局生效。
-export const PLACEHOLDER_IMG =
- 'https://oss.baskbuddy.com/baskbuddy/placeholder.jpg';
diff --git a/src/seo/Seo.tsx b/src/seo/Seo.tsx
index 55a99bb..f6a8f4c 100644
--- a/src/seo/Seo.tsx
+++ b/src/seo/Seo.tsx
@@ -6,23 +6,32 @@ interface SeoProps {
description?: string;
keywords?: string;
locale: Locale;
- /** Per-page og:image override (default: OSS og-default.png) */
- ogImageOverride?: string;
}
const DEFAULT_DESC_ZH =
'BaskBuddy 巴适伙伴(上海)科技有限公司 — 以温暖科技连接美好生活,五大赛道覆盖内容社交、职场服务、数字支付、人工智能、生活服务';
const DEFAULT_DESC_EN =
- 'BaskBuddy (Bashi Partners Shanghai) — Connecting beautiful life with warm technology. Five tracks: Content & Social, Career Services, Digital Payment, Artificial Intelligence, Life Services';
+ 'BaskBuddy (Shanghai) Technology Co., Ltd. — Connecting beautiful life with warm technology. Five tracks: Content & Social, Career Services, Digital Payment, Artificial Intelligence, Life Services';
const DEFAULT_DESC_HK =
'BaskBuddy 巴適夥伴(上海)科技有限公司 — 以溫暖科技連接美好生活,五大賽道覆蓋內容社交、職場服務、數字支付、人工智能、生活服務';
const DEFAULT_KW_ZH =
'巴适伙伴,BaskBuddy,数字生活服务,内容社交,职场服务,数字支付,人工智能,ICIDP,企业官网,上海科技公司';
const DEFAULT_KW_EN =
- 'BaskBuddy,Bashi Partners,Digital Life Services,Content Social,Career Services,Digital Payment,Artificial Intelligence,ICIDP,Shanghai Tech Company';
+ 'BaskBuddy,BaskBuddy Shanghai,Digital Life Services,Content Social,Career Services,Digital Payment,Artificial Intelligence,ICIDP,Shanghai Tech Company';
const DEFAULT_KW_HK =
'巴適夥伴,BaskBuddy,數字生活服務,內容社交,職場服務,數字支付,人工智能,ICIDP,企業官網,上海科技公司';
+// ===== Canonical origin =====
+// 线上只有 www.baskbuddy.com 有 DNS 解析(裸域 baskbuddy.com 在 Google / AliDNS /
+// Cloudflare 上均无 A 记录),故 canonical / og:url / hreflang 一律锚定 www。
+// 这里刻意不用 window.location.origin:否则从裸域、IP 或测试域名访问时会把非规范
+// 地址写进 canonical,反而误导搜索引擎。
+const SITE_ORIGIN = 'https://www.baskbuddy.com';
+
+// 全站图片/视频托管于 OSS(国内直连快),OG 分享图同源。
+const OSS_BASE = 'https://oss.baskbuddy.com/baskbuddy';
+const OG_IMAGE = `${OSS_BASE}/hero-bg.jpg`;
+
function setMeta(uniqueAttr: string, attrs: Record
, content: string) {
const selector = `meta[${uniqueAttr}]`;
let el = document.head.querySelector(selector) as HTMLMetaElement | null;
@@ -47,16 +56,16 @@ function setLink(uniqueAttr: string, attrs: Record, href: string
// Recreates the per-page metadata that BaseLayout.astro used to emit.
// Runs on every route change so the document title / meta stay in sync in the SPA.
-export default function Seo({ title, description, keywords, locale, ogImageOverride }: SeoProps) {
+export default function Seo({ title, description, keywords, locale }: SeoProps) {
useEffect(() => {
const t = getTranslation(locale);
const brandName = t.brand || 'BaskBuddy';
const finalDescription = description ?? (locale === 'en' ? DEFAULT_DESC_EN : locale === 'hk' ? DEFAULT_DESC_HK : DEFAULT_DESC_ZH);
const finalKeywords = keywords ?? (locale === 'en' ? DEFAULT_KW_EN : locale === 'hk' ? DEFAULT_KW_HK : DEFAULT_KW_ZH);
const orgName =
- locale === 'en' ? 'Bashi Partners (Shanghai) Technology Co., Ltd.' : locale === 'hk' ? '巴適夥伴(上海)科技有限公司' : '巴适伙伴(上海)科技有限公司';
+ locale === 'en' ? 'BaskBuddy (Shanghai) Technology Co., Ltd.' : locale === 'hk' ? '巴適夥伴(上海)科技有限公司' : '巴适伙伴(上海)科技有限公司';
- const origin = window.location.origin;
+ const origin = SITE_ORIGIN;
const pathname = window.location.pathname;
const canonicalUrl = origin + pathname;
const segs = pathname.split('/');
@@ -66,9 +75,7 @@ export default function Seo({ title, description, keywords, locale, ogImageOverr
const enAlternate = origin + (base === '/' ? '/en' : `/en${base}`);
const hkAlternate = origin + (base === '/' ? '/hk' : `/hk${base}`);
- const logoPath = 'https://oss.baskbuddy.com/baskbuddy/baskbuddy-logo.png';
- const ogImagePath = ogImageOverride || 'https://oss.baskbuddy.com/baskbuddy/og-default.png';
- const ogImage = ogImagePath.startsWith('http') ? ogImagePath : origin + ogImagePath;
+ const logoPath = `${OSS_BASE}/baskbuddy-logo.png`;
// Document level
document.documentElement.lang = locale === 'en' ? 'en' : locale === 'hk' ? 'zh-HK' : 'zh-CN';
@@ -91,13 +98,9 @@ export default function Seo({ title, description, keywords, locale, ogImageOverr
setMeta('property="og:title"', { property: 'og:title' }, `${title} | ${brandName}`);
setMeta('property="og:description"', { property: 'og:description' }, finalDescription);
setMeta('property="og:url"', { property: 'og:url' }, canonicalUrl);
- setMeta('property="og:image"', { property: 'og:image' }, ogImage);
- setMeta(
- 'property="og:image:alt"',
- { property: 'og:image:alt' },
- `${brandName} — ${locale === 'en' ? 'Together for Life' : locale === 'hk' ? '巴適夥伴,一生相伴' : '巴适伙伴,一生相伴'}`,
- );
const ogLocale = locale === 'en' ? 'en_US' : locale === 'hk' ? 'zh_HK' : 'zh_CN';
+ setMeta('property="og:image"', { property: 'og:image' }, OG_IMAGE);
+ setMeta('property="og:image:alt"', { property: 'og:image:alt' }, `${brandName} ${t.brandSub || '巴适伙伴'}`);
setMeta('property="og:locale"', { property: 'og:locale' }, ogLocale);
setMeta(
'property="og:locale:alt"',
@@ -108,11 +111,10 @@ export default function Seo({ title, description, keywords, locale, ogImageOverr
// Twitter Card
setMeta('name="twitter:card"', { name: 'twitter:card' }, 'summary_large_image');
+ setMeta('name="twitter:image"', { name: 'twitter:image' }, OG_IMAGE);
setMeta('name="twitter:site"', { name: 'twitter:site' }, '@baskbuddy');
setMeta('name="twitter:title"', { name: 'twitter:title' }, `${title} | ${brandName}`);
setMeta('name="twitter:description"', { name: 'twitter:description' }, finalDescription);
- setMeta('name="twitter:image"', { name: 'twitter:image' }, ogImage);
- setMeta('name="twitter:image:alt"', { name: 'twitter:image:alt' }, `${brandName} Logo`);
// Organization JSON-LD
const jsonLdOrg = {
@@ -140,7 +142,7 @@ export default function Seo({ title, description, keywords, locale, ogImageOverr
document.head.appendChild(script);
}
script.textContent = JSON.stringify(jsonLdOrg);
- }, [title, description, keywords, locale, ogImageOverride]);
+ }, [title, description, keywords, locale]);
return null;
}
diff --git a/src/styles/global.css b/src/styles/global.css
index a55c754..9eb6834 100644
--- a/src/styles/global.css
+++ b/src/styles/global.css
@@ -11,18 +11,18 @@
Key: Clarity over decoration, warmth through subtlety */
:root {
- /* Core Brand Colors — 主题色 #EBEAF6(浅薰衣草),作为全站冷调基调 */
+ /* Core Brand Colors — 主题色 #E8EAF6(浅薰衣草),作为全站冷调基调 */
--brand-white: #FFFFFF;
--brand-black: #1A1A1A;
- --brand: #EBEAF6; /* 主题色(浅薰衣草)—— 背景/色块/图标底/浅描边 */
- --brand-cream: #EBEAF6; /* 沿用名 = 主题色 */
- --brand-cream-light: #EBEAF6; /* 主题色更浅一档(hover 底)—— 统一为 #EBEAF6 */
- --brand-cream-deep: #EBEAF6; /* 主题色更深一档(描边/边框)—— 统一为 #EBEAF6 */
+ --brand: #E8EAF6; /* 主题色(浅薰衣草)—— 背景/色块/图标底/浅描边 */
+ --brand-cream: #E8EAF6; /* 沿用名 = 主题色 */
+ --brand-cream-light: #E8EAF6; /* 主题色更浅一档(hover 底)—— 统一为 #E8EAF6 */
+ --brand-cream-deep: #E8EAF6; /* 主题色更深一档(描边/边框)—— 统一为 #E8EAF6 */
/* ===== 赛道 Identity — 统一为深色强调(#1A1A1A 深暖黑,与底部黑呼应)=====
原四赛道色(红/蓝/绿/紫)已统一到 --accent(深黑),全站单一强调锚点。
强色用于:图标、卡片顶条、产品标签描边、强调点缀;浅色由 color-mix 派生。
- 主题色 #EBEAF6(浅薰衣草)承担全站冷调基调:底色、图标底、大色块、导航底。 */
+ 主题色 #E8EAF6(浅薰衣草)承担全站冷调基调:底色、图标底、大色块、导航底。 */
--track-social: var(--accent); /* 社交赛道 — 统一深色强调 */
--track-career: var(--accent); /* 职场赛道 — 统一深色强调 */
--track-payment: var(--accent); /* 支付赛道 — 统一深色强调 */
@@ -41,9 +41,9 @@
· --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-soft #E8EAF6 浅洗 hover / 选中高亮底 / 点缀底 */
--brand-accent: #3d5afe;
- --brand-accent-soft: #EBEAF6;
+ --brand-accent-soft: #E8EAF6;
--brand-accent-deep: #2E40D8;
--brand-accent-darker: #1B2A9E;
--brand-accent-ink: #1B2A9E;
@@ -80,8 +80,8 @@
/* Semantic Colors */
--bg-primary: #FAFAFE; /* 冷调近白底:与浅薰衣草主题色呼应 */
- --bg-secondary: var(--brand-cream-light); /* 现为 #EBEAF6 */
- --bg-subtle: #EBEAF6; /* 浅薰衣草交替底 */
+ --bg-secondary: var(--brand-cream-light); /* 现为 #E8EAF6 */
+ --bg-subtle: #E8EAF6; /* 浅薰衣草交替底 */
--bg-dark: var(--brand-black);
--text-primary: var(--brand-black);
--text-secondary: #4A4A4A;
@@ -134,20 +134,15 @@
/* 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-sm: 0 2px 8px rgba(26,26,26,0.06), 0 1px 2px rgba(232,234,246,0.06);
+ --shadow-md: 0 6px 20px rgba(26,26,26,0.07), 0 2px 6px rgba(232,234,246,0.08);
+ --shadow-lg: 0 12px 40px rgba(26,26,26,0.08), 0 4px 12px rgba(232,234,246,0.10);
+ --shadow-xl: 0 20px 60px rgba(26,26,26,0.10), 0 8px 24px rgba(232,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 {
@@ -156,6 +151,14 @@ html {
scroll-padding-top: 80px;
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: transparent;
+ /* 全站默认字体 = 思源黑体(--font-body)。必须在这里落一条真实的
+ font-family:Tailwind v4 的 preflight 把 html 的 font-family 绑到
+ --default-font-family → --font-sans(系统字体栈),而我们自己的
+ --font-* 是定义在 :root 里、没进 @theme,所以 Tailwind 不认识它们。
+ 另注意:Tailwind v4 会把裸的 font-[...] 任意值推断成 font-weight,所以
+ 组件里必须写成 font-[family-name:var(--font-display)] 才会编译成 font-family。
+ 全站兜底的字体声明就是这一条。 */
+ font-family: var(--font-body);
}
body {
background-color: var(--bg-primary);
@@ -179,7 +182,7 @@ body {
}
::selection {
- background: rgba(235,234,246,0.35);
+ background: rgba(232,234,246,0.35);
color: var(--brand-black);
}
@@ -194,9 +197,9 @@ body {
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%);
+ radial-gradient(ellipse 60% 40% at 15% 20%, rgba(232,234,246,0.34), transparent 60%),
+ radial-gradient(ellipse 40% 30% at 85% 75%, rgba(232,234,246,0.20), transparent 50%),
+ radial-gradient(ellipse 35% 25% at 60% 10%, rgba(232,234,246,0.16), transparent 50%);
animation: meshDrift 40s ease-in-out infinite; /* 25s→40s 降低动画强度 */
pointer-events: none;
z-index: 0;
@@ -208,80 +211,10 @@ body {
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 类,
@@ -293,21 +226,6 @@ a, button {
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 {
@@ -384,129 +302,6 @@ a, button {
}
}
-/* ===== 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] 导致长内容截断的问题
@@ -661,266 +456,6 @@ footer a {
}
}
-/* ===== 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 {
@@ -993,7 +528,7 @@ footer a {
/* 细线分隔的版式(已并入 .section-eyebrow 统一引导线,保留兼容) */
-/* ===== Stat band — "翱捷速度" 风格的数据滚动 ===== */
+/* ===== Stat band — 细线分隔的数据格 ===== */
.stat-band {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -1006,6 +541,22 @@ footer a {
@media (min-width: 768px) {
.stat-band { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
+/* 两项版(首页愿景带「全球 / 长期」):桌面端维持 2 列,否则四列栅格里空两格。
+ 收窄到 720px 居中,使两格宽度接近 Investors 四格版的观感。
+ 双类名提高优先级,避免与被复用的 .stat-band 桌面四列规则打架。 */
+.stat-band.stat-band--pair {
+ max-width: 720px;
+ margin-inline: auto;
+}
+@media (min-width: 768px) {
+ .stat-band.stat-band--pair { grid-template-columns: repeat(2, minmax(0, 1fr)); }
+}
+/* 两项版的值是词不是数字。中文「全球 / 长期」两字,沿用 .stat-num 原字号即可;
+ 英文最长词 "Long-term"(约 4.77em 宽)在原 38px 下限下会在 390px 屏折成
+ "Long-" / "term" 两行,故只对英文收一档:26px→124px < 移动端内容宽 138px,
+ 54px→258px < 桌面 319px,两端都单行放得下。中英文分开取值,避免为迁就英文
+ 而把中文那格也缩小。Investors 的四格版不受影响,仍是原字号。 */
+html:lang(en) .stat-band--pair .stat-num { font-size: clamp(26px, 5.2vw, 54px); }
.stat-cell {
background: var(--bg-primary);
padding: 32px 20px;
@@ -1022,7 +573,6 @@ footer a {
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);
@@ -1036,18 +586,7 @@ footer a {
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(首页 / 各页首屏大标题)===== */
.hero-slogan {
font-family: var(--font-display);
font-weight: 700;
@@ -1058,56 +597,6 @@ footer a {
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;
@@ -1129,15 +618,15 @@ footer a {
background: color-mix(in oklch, var(--track-color, var(--track-career)) 4%, var(--bg-primary));
}
-/* ===== 统一图标块(品牌双色体系:#3d5afe ↔ #EBEAF6)=====
- 全站图标 tile 共用一套配方:#EBEAF6 浅薰衣草底 + #3d5afe 品牌蓝图标。
+/* ===== 统一图标块(品牌双色体系:#3d5afe ↔ #E8EAF6)=====
+ 全站图标 tile 共用一套配方:#E8EAF6 浅薰衣草底 + #3d5afe 品牌蓝图标。
不再依赖 --track-color,统一为品牌双色,保证全站图标视觉一致。 */
.icon-tile {
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: var(--radius-md);
- background: var(--brand); /* #EBEAF6 浅薰衣草底 */
+ background: var(--brand); /* #E8EAF6 浅薰衣草底 */
border: none;
color: var(--brand-accent); /* #3d5afe 品牌蓝图标(lucide 用 currentColor) */
flex-shrink: 0;
@@ -1151,16 +640,17 @@ footer a {
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%);
+ /* 中段提亮由 brand-black + brand-accent 派生:冷调深靛,替代早期暖棕 #2a2118 */
+ background: linear-gradient(135deg,
+ var(--brand-black) 0%,
+ color-mix(in oklch, var(--brand-black) 76%, var(--brand-accent)) 55%,
+ var(--brand-black) 100%);
color: var(--brand-white);
}
.cta-band::before {
@@ -1168,7 +658,7 @@ footer a {
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 20% 20%, rgba(232,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;
}
@@ -1255,9 +745,9 @@ footer a {
.btn-outline-light {
background: transparent;
color: var(--brand-cream);
- border-color: rgba(235,234,246,0.35);
+ border-color: rgba(232,234,246,0.35);
}
-.btn-outline-light:hover { background: rgba(235,234,246,0.10); }
+.btn-outline-light:hover { background: rgba(232,234,246,0.10); }
.btn-lg { padding: 15px 32px; font-size: var(--fs-body); }
.btn-sm { padding: 10px 18px; font-size: var(--fs-micro); }
@@ -1284,137 +774,6 @@ footer a {
}
.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); }
@@ -1437,10 +796,13 @@ footer a {
flex-direction: column;
align-items: flex-end;
gap: 12px;
- /* 主题色:主体用浅薰衣草;点缀用品牌蓝;车灯与星星用暖琥珀黄(光感闪耀) */
+ /* 主题色:主体用浅薰衣草;点缀/车灯/星星一律品牌蓝(原暖琥珀 #F5A623 已废弃) */
--mascot-body: var(--brand);
--mascot-accent: var(--brand-accent);
- --mascot-star: #F5A623;
+ --mascot-star: var(--brand-accent);
+ /* 车窗玻璃:浅色(原为 #1A1A1A 实心黑,横在眼睛上像"黑眼罩")。
+ 由主题色掺一点品牌蓝得来,比车身略深一档,才看得出是"窗"而不是个洞。 */
+ --mascot-glass: color-mix(in srgb, var(--brand-accent) 16%, var(--brand));
transition: transform 0.88s cubic-bezier(0.16, 1, 0.3, 1),
opacity 0.45s ease;
transform: translate3d(180px, 60px, 0) rotate(-10deg);
@@ -1466,6 +828,7 @@ footer a {
.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-glass { fill: var(--mascot-glass); }
.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; }
@@ -1561,7 +924,7 @@ footer a {
pointer-events: auto;
}
.back-to-top:hover {
- background: var(--brand-accent-deep, #2a3fd6);
+ background: var(--brand-accent-deep);
transform: translateY(-2px);
box-shadow: 0 12px 26px rgba(61, 90, 254, 0.45);
}
@@ -1693,319 +1056,6 @@ footer a {
}
}
-/* ================================================================
- 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,
@@ -2022,10 +1072,6 @@ footer a {
border-bottom-color: rgba(255, 255, 255, 0.85);
}
-@media (max-width: 640px) {
- .hero-glow-orb { filter: blur(18px); opacity: 0.7; }
-}
-
/* ================================================================
公司概览:中心节点辐射网络图(深色科技感)
- 中心「巴适伙伴」+ 6 个可点击子节点,SVG 发光线连接
@@ -2125,20 +1171,9 @@ footer a {
}
/* ===== 无障碍工具类(WCAG 2.4.1 Bypass Blocks + 2.5.8 Target Size)=====
- sr-only:视觉隐藏但屏幕阅读器可读。
+ sr-only:曾在此自建,现已删除——Tailwind 自带同名工具类,用到时按需生成即可。
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;
@@ -2260,7 +1295,7 @@ footer a {
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%),
+ radial-gradient(ellipse 70% 60% at 50% 50%, rgba(232,234,246,0.55), transparent 70%),
var(--bg-primary);
border: 1px solid var(--border-light);
box-shadow: var(--shadow-sm);
@@ -2329,7 +1364,7 @@ footer a {
position: absolute;
inset: -10px;
border-radius: inherit;
- background: radial-gradient(circle, rgba(235,234,246,0.55) 0%, transparent 70%);
+ background: radial-gradient(circle, rgba(232,234,246,0.55) 0%, transparent 70%);
z-index: -1;
animation: ecoPulse 3.6s ease-in-out infinite;
}
@@ -2563,3 +1598,100 @@ footer a {
transform: none !important;
}
}
+
+/* ================================================================
+ 管理团队 · 成员详情弹窗(.member-modal)
+ 用原生