Browse Source

提交搜索栏图标、footer布局、团队成员以及互译修改

master
doublex001 3 months ago
parent
commit
4a2d82d16f
  1. 8
      index.html
  2. 16
      src/components/Contact.tsx
  3. 10
      src/components/EcosystemMap.tsx
  4. 141
      src/components/Footer.tsx
  5. 123
      src/components/Investors.tsx
  6. 2
      src/components/Mascot.tsx
  7. 4
      src/components/Sustainability.tsx
  8. 56
      src/i18n/en.ts
  9. 96
      src/i18n/hk.ts
  10. 60
      src/i18n/zh.ts
  11. 14
      src/seo/Seo.tsx
  12. 95
      src/styles/global.css

8
index.html

@ -17,7 +17,7 @@
content="BaskBuddy 巴适伙伴(上海)科技有限公司 — 以温暖科技连接美好生活,四大赛道覆盖内容社交、职场服务、数字支付、人工智能。"
/>
<meta property="og:url" content="https://baskbuddy.com/" />
<meta property="og:image" content="https://baskbuddy.com/og-default.png" />
<meta property="og:image" content="https://oss.baskbuddy.com/baskbuddy/og-default.png" />
<meta property="og:image:alt" content="BaskBuddy 巴适伙伴 — 一生相伴 · 舒适相伴 · 一生信赖" />
<meta property="og:locale" content="zh_CN" />
<meta name="twitter:card" content="summary_large_image" />
@ -26,10 +26,10 @@
name="twitter:description"
content="BaskBuddy 巴适伙伴(上海)科技有限公司 — 以温暖科技连接美好生活,四大赛道覆盖内容社交、职场服务、数字支付、人工智能。"
/>
<meta name="twitter:image" content="https://baskbuddy.com/og-default.png" />
<meta name="twitter:image" content="https://oss.baskbuddy.com/baskbuddy/og-default.png" />
<link rel="canonical" href="https://baskbuddy.com/" />
<link rel="icon" type="image/png" href="/baskbuddy-logo.png" />
<link rel="apple-touch-icon" href="/baskbuddy-logo.png" />
<link rel="icon" type="image/png" href="https://oss.baskbuddy.com/baskbuddy/baskbuddy-logo.png" />
<link rel="apple-touch-icon" href="https://oss.baskbuddy.com/baskbuddy/baskbuddy-logo.png" />
<!--
思源黑体(Source Han Sans / Noto Sans SC 简体 + Noto Sans TC 繁体,hk 繁体页面走 TC)。
经 jsDelivr CDN 加载 @fontsource,带 unicode-range 分包,浏览器只下载用到的字形切片。

16
src/components/Contact.tsx

@ -59,12 +59,12 @@ export default function Contact({ locale }: { locale: Locale }) {
{/* ===== 成长宣言 · 主体卡(完整全文 + 独立标题)===== */}
<section className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 pb-[var(--space-6)]">
<div className="scroll-reveal mx-auto rounded-2xl card-surface p-7 md:p-10 text-left overflow-hidden" style={cssVars({ boxShadow: 'var(--shadow-lg)' })}>
<div className="scroll-reveal mx-auto rounded-2xl card-surface p-7 md:p-10 text-center overflow-hidden" style={cssVars({ boxShadow: 'var(--shadow-lg)' })}>
<h2 className="text-h1 font-[var(--font-display)] font-bold text-[var(--brand-black)] tracking-tight text-center">
{j.manifestoTitle}
</h2>
<div className="mt-4 mx-auto w-16 h-[2px] rounded-full" style={{ background: 'linear-gradient(90deg, var(--brand-accent-deep), var(--brand-accent))' }} />
<div className="mt-7 text-body md:text-body leading-[2] font-light whitespace-pre-line text-[var(--brand-black)]" style={{ fontFamily: 'var(--font-body)' }}>
<div className="mt-7 text-body md:text-body leading-[2] font-light whitespace-pre-line text-[var(--brand-black)] max-w-2xl mx-auto" style={{ fontFamily: 'var(--font-body)' }}>
{j.manifesto}
</div>
</div>
@ -139,8 +139,8 @@ export default function Contact({ locale }: { locale: Locale }) {
{j.growthIncentive.items.map((item: string, index: number) => {
const color = 'var(--brand-accent)';
return (
<div key={index} className="scroll-reveal flex items-start gap-3 rounded-2xl card-surface p-5 hover:border-[color-mix(in_oklch,var(--brand)_25%,transparent)] hover:shadow-sm transition-all duration-300">
<span className="icon-tile w-9 h-9" style={cssVars({ '--track-color': color })}>
<div key={index} className="scroll-reveal flex items-center gap-3 rounded-2xl card-surface p-5 hover:border-[color-mix(in_oklch,var(--brand)_25%,transparent)] hover:shadow-sm transition-all duration-300">
<span className="icon-tile w-9 h-9 shrink-0" style={cssVars({ '--track-color': color })}>
<Icon name={growthIncentiveIcons[index]} className="w-5 h-5" />
</span>
<p className="text-body leading-relaxed text-[var(--text-secondary)]">{item}</p>
@ -160,10 +160,10 @@ export default function Contact({ locale }: { locale: Locale }) {
{j.longTermIncentive.items.map((item: string, index: number) => {
const color = 'var(--brand-accent)';
return (
<div key={index} className="scroll-reveal rounded-2xl card-surface p-6 hover:-translate-y-1 hover:shadow-md transition-all duration-300">
<div className="icon-tile w-10 h-10 mb-4" style={cssVars({ '--track-color': color })}>
<div key={index} className="scroll-reveal flex items-center gap-3 rounded-2xl card-surface p-5 hover:-translate-y-1 hover:shadow-md transition-all duration-300">
<span className="icon-tile w-9 h-9 shrink-0" style={cssVars({ '--track-color': color })}>
<Icon name={longTermIncentiveIcons[index]} className="w-5 h-5" />
</div>
</span>
<p className="text-body leading-relaxed text-[var(--text-secondary)]">{item}</p>
</div>
);
@ -180,7 +180,7 @@ export default function Contact({ locale }: { locale: Locale }) {
<div className="grid sm:grid-cols-2 lg:grid-cols-3 gap-4">
{j.benefits.items.map((item: string, index: number) => {
return (
<div key={index} className="scroll-reveal flex items-start gap-3 rounded-2xl card-surface p-5 hover:shadow-sm transition-all duration-300">
<div key={index} className="scroll-reveal flex items-center gap-3 rounded-2xl card-surface p-5 hover:shadow-sm transition-all duration-300">
<span className="icon-tile w-9 h-9 shrink-0">
<Icon name={benefitIcons[index]} className="w-5 h-5" />
</span>

10
src/components/EcosystemMap.tsx

@ -15,7 +15,7 @@ type Aud = { c: boolean; b: boolean; f: boolean };
const MATRIX: Aud[][] = [
// 内容社交:青核 / 音酷 / 蜜恋
[{ c: true, b: false, f: false }, { c: true, b: false, f: false }, { c: true, b: false, f: false }],
// 职场服务:职来 / 看见高山
// 职场服务:职来 / 看山
[{ c: true, b: true, f: false }, { c: true, b: true, f: false }],
// 数字支付:妥哒
[{ c: true, b: true, f: false }],
@ -51,7 +51,7 @@ export default function EcosystemMap({ locale }: { locale: Locale }) {
const [sel, setSel] = useState<Sel>({ kind: 'track', i: 0 });
const audienceMeta: { key: 'c' | 'b' | 'f'; name: string; icon: string; def: string; angle: number }[] = [
{ key: 'c', name: tr('消费者', '消費者', 'Consumers'), icon: 'users', def: tr('个体的数字生活', '個體的數位生活', "Individuals' digital life"), angle: AUD_ANGLES[0] },
{ key: 'c', name: tr('消费者', '消費者', 'Consumers'), icon: 'users', def: tr('个体的数字生活', '個體的數字生活', "Individuals' digital life"), angle: AUD_ANGLES[0] },
{ key: 'b', name: tr('企业', '企業', 'Enterprises'), icon: 'briefcase', def: tr('组织的效率与增长', '組織的效率與增長', 'Organizational efficiency & growth'), angle: AUD_ANGLES[1] },
{ key: 'f', name: tr('未来', '未來', 'Future'), icon: 'rocket', def: tr('前沿与平台层', '前沿與平台層', 'Frontier & platform layer'), angle: AUD_ANGLES[2] },
];
@ -75,11 +75,11 @@ export default function EcosystemMap({ locale }: { locale: Locale }) {
let products: PItem[];
if (sel.kind === 'center') {
panelEyebrow = tr('数字生活生态', '數位生活生態', 'Digital Life Ecosystem');
panelEyebrow = tr('数字生活生态', '數字生活生態', 'Digital Life Ecosystem');
panelTitle = tr('巴适伙伴', '巴適夥伴', 'BaskBuddy');
panelNote = tr(
`以"温暖科技"连接人、机会、价值与智能——${tracks.length} 大赛道 · ${totalProducts} 个自研产品,共建数字生活生态。`,
`以「溫暖科技」連接人、機會、價值與智能——${tracks.length} 大賽道 · ${totalProducts} 個自研產品,共建數位生活生態。`,
`以「溫暖科技」連接人、機會、價值與智能——${tracks.length} 大賽道 · ${totalProducts} 個自研產品,共建數字生活生態。`,
`Connecting people, opportunities, value & intelligence with "warm tech" — ${tracks.length} tracks · ${totalProducts} self-built products.`,
);
products = tracks.flatMap((tk, ti) =>
@ -162,7 +162,7 @@ export default function EcosystemMap({ locale }: { locale: Locale }) {
>
<span className="eco-hub-glow" aria-hidden="true" />
<span className="eco-hub-title">{tr('巴适伙伴', '巴適夥伴', 'BaskBuddy')}</span>
<span className="eco-hub-sub">{tr('数字生活生态', '數位生活生態', 'Digital Life')}</span>
<span className="eco-hub-sub">{tr('数字生活生态', '數字生活生態', 'Digital Life')}</span>
</button>
{/* 赛道节点 */}

141
src/components/Footer.tsx

@ -1,6 +1,6 @@
import { getLocalizedPath, type Locale } from '../i18n/utils';
import { getTranslation } from '../i18n/utils';
import { Icon, trackIcons } from '../icons';
import { Icon } from '../icons';
import { useState, useEffect } from 'react';
export default function Footer({ locale }: { locale: Locale }) {
@ -50,7 +50,7 @@ export default function Footer({ locale }: { locale: Locale }) {
<footer className="bg-[var(--brand-black)] border-t border-[color-mix(in_oklch,var(--brand-white)_10%,transparent)]">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-14 md:py-20">
{/* ========== Main Footer: 4-Column Grid ========== */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-12 gap-10 lg:gap-8 mb-12 lg:mb-16">
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-12 gap-6 lg:gap-5 mb-10 lg:mb-12">
{/* ===== Column 1: Brand (4 cols on desktop) ===== */}
<div className="lg:col-span-4">
{/* Logo + Brand */}
@ -90,28 +90,25 @@ export default function Footer({ locale }: { locale: Locale }) {
</div>
</div>
{/* ===== Column 2: Business Tracks (3 cols) ===== */}
<div className="lg:col-span-3">
{/* ===== Column 2: Business Tracks (2 cols) ===== */}
<div className="lg:col-span-2">
<h4 className="text-micro font-bold tracking-[0.1em] uppercase mb-5 text-[color-mix(in_oklch,var(--brand-white)_45%,transparent)]" style={{ fontFamily: 'var(--font-body)' }}>
{f.columns.tracks}
</h4>
<div className="grid grid-cols-2 gap-x-3 gap-y-3">
<ul className="flex flex-col gap-3">
{Object.entries(t.home.tracks).map(([key, track]) => (
<li key={key}>
<a
key={key}
href={getLocalizedPath('/business', locale)}
className="group flex items-center gap-2.5 px-3 py-2.5 rounded-xl transition-all duration-200 hover:bg-[color-mix(in_oklch,var(--brand)_10%,transparent)] border border-transparent hover:border-[color-mix(in_oklch,var(--brand)_20%,transparent)]"
className="group inline-flex items-center text-body transition-colors duration-200 text-[color-mix(in_oklch,var(--brand-white)_70%,transparent)] hover:text-[var(--brand)] hover:pl-1"
style={{ fontFamily: 'var(--font-body)' }}
title={track.desc}
>
<span className="flex items-center justify-center w-8 h-8 rounded-lg bg-[color-mix(in_oklch,var(--brand)_12%,transparent)] text-[var(--brand)] group-hover:bg-[var(--brand-accent)] group-hover:text-white transition-colors duration-200 shrink-0">
<Icon name={trackIcons[key]} className="w-4 h-4" />
</span>
<span className="text-body font-medium text-[color-mix(in_oklch,var(--brand-white)_75%,transparent)] group-hover:text-[var(--brand-white)] transition-colors duration-200" style={{ fontFamily: 'var(--font-body)' }}>
{track.name}
</span>
<span>{track.name}</span>
</a>
</li>
))}
</div>
</ul>
</div>
{/* ===== Column 3: Quick Navigate (2 cols) ===== */}
@ -139,112 +136,87 @@ export default function Footer({ locale }: { locale: Locale }) {
<h4 className="text-micro font-bold tracking-[0.1em] uppercase mb-5 text-[color-mix(in_oklch,var(--brand-white)_45%,transparent)]" style={{ fontFamily: 'var(--font-body)' }}>
{f.columns.contact}
</h4>
<div className="flex flex-col gap-4">
<ul className="flex flex-col gap-3">
{/* Careers */}
<a href={getLocalizedPath('/contact', locale)} className="group block p-4 rounded-xl bg-[color-mix(in_oklch,var(--brand-white)_4%,transparent)] border border-[color-mix(in_oklch,var(--brand-white)_8%,transparent)] hover:border-[color-mix(in_oklch,var(--brand)_30%,transparent)] transition-all duration-200">
<div className="flex items-center justify-between mb-1">
<span className="text-body font-semibold text-[var(--brand-white)] group-hover:text-[var(--brand)] transition-colors duration-200" style={{ fontFamily: 'var(--font-body)' }}>
{f.contact.jobs.label}
</span>
<Icon name="arrowUpRight" className="w-4 h-4 text-[color-mix(in_oklch,var(--brand-white)_40%,transparent)] group-hover:text-[var(--brand)] transition-colors duration-200" />
</div>
<p className="text-micro text-[color-mix(in_oklch,var(--brand-white)_50%,transparent)]" style={{ fontFamily: 'var(--font-body)' }}>
<li>
<a
href={getLocalizedPath('/contact', locale)}
className="group inline-flex items-center text-body transition-colors duration-200 text-[color-mix(in_oklch,var(--brand-white)_70%,transparent)] hover:text-[var(--brand)] hover:pl-1"
style={{ fontFamily: 'var(--font-body)' }}
>
<span>{f.contact.jobs.label}</span>
</a>
<p className="text-micro text-[color-mix(in_oklch,var(--brand-white)_45%,transparent)]" style={{ fontFamily: 'var(--font-body)' }}>
{f.contact.jobs.hint}
</p>
</a>
</li>
{/* Business */}
<a href={getLocalizedPath('/contact', locale)} className="group block p-4 rounded-xl bg-[color-mix(in_oklch,var(--brand-white)_4%,transparent)] border border-[color-mix(in_oklch,var(--brand-white)_8%,transparent)] hover:border-[color-mix(in_oklch,var(--brand)_30%,transparent)] transition-all duration-200">
<div className="flex items-center justify-between mb-1">
<span className="text-body font-semibold text-[var(--brand-white)] group-hover:text-[var(--brand)] transition-colors duration-200" style={{ fontFamily: 'var(--font-body)' }}>
{f.contact.biz.label}
</span>
<Icon name="arrowUpRight" className="w-4 h-4 text-[color-mix(in_oklch,var(--brand-white)_40%,transparent)] group-hover:text-[var(--brand)] transition-colors duration-200" />
</div>
<p className="text-micro text-[color-mix(in_oklch,var(--brand-white)_50%,transparent)]" style={{ fontFamily: 'var(--font-body)' }}>
<li>
<a
href={getLocalizedPath('/contact', locale)}
className="group inline-flex items-center text-body transition-colors duration-200 text-[color-mix(in_oklch,var(--brand-white)_70%,transparent)] hover:text-[var(--brand)] hover:pl-1"
style={{ fontFamily: 'var(--font-body)' }}
>
<span>{f.contact.biz.label}</span>
</a>
<p className="text-micro text-[color-mix(in_oklch,var(--brand-white)_45%,transparent)]" style={{ fontFamily: 'var(--font-body)' }}>
{f.contact.biz.hint}
</p>
</a>
</li>
{/* Email: Click to mail, text selectable, 1-click copy with feedback */}
<div className="pt-1">
<p className="text-micro text-[color-mix(in_oklch,var(--brand-white)_45%,transparent)] mb-2" style={{ fontFamily: 'var(--font-body)' }}>
{zhText('统一联系邮箱(求职 / 商务)', '統一聯繫郵箱(求職 / 商務)', 'Unified Contact Email')}
</p>
<div className="group inline-flex items-center gap-1 px-3 py-2 rounded-xl bg-[color-mix(in_oklch,var(--brand-white)_4%,transparent)] border border-[color-mix(in_oklch,var(--brand-white)_8%,transparent)] hover:border-[color-mix(in_oklch,var(--brand)_30%,transparent)] transition-all duration-200 w-full">
<Icon name="mail" className="w-4 h-4 shrink-0 text-[var(--brand)]" />
{/* Email */}
<li>
<div className="flex items-center gap-2">
<a
href={`mailto:${f.contact.email}`}
className="text-body font-medium text-[var(--brand-white)] hover:text-[var(--brand)] transition-colors duration-200 select-all outline-none"
className="text-body text-[color-mix(in_oklch,var(--brand-white)_70%,transparent)] hover:text-[var(--brand)] transition-colors duration-200 select-all outline-none"
style={{ fontFamily: 'var(--font-body)', userSelect: 'all' }}
onClick={(e) => e.stopPropagation()}
title={zhText('点击发邮件 · 文本可直接选中复制', '點擊發郵件 · 文本可直接選中複製', 'Click to email · Text is selectable')}
>
{f.contact.email}
</a>
<div className="ml-auto relative">
<button
type="button"
onClick={handleCopyEmail}
className="flex items-center justify-center w-8 h-8 rounded-lg transition-all duration-200 text-[color-mix(in_oklch,var(--brand-white)_55%,transparent)] hover:bg-[var(--brand-accent)] hover:text-white focus:outline-none focus:ring-2 focus:ring-[var(--brand-accent)]/50"
className="flex items-center justify-center w-6 h-6 rounded transition-colors duration-200 text-[color-mix(in_oklch,var(--brand-white)_45%,transparent)] hover:text-[var(--brand)]"
title={copied
? zhText('已复制!', '已複製!', 'Copied!')
: zhText('一键复制邮箱', '一鍵複製郵箱', 'Copy email')}
: zhText('复制邮箱', '複製郵箱', 'Copy email')}
aria-label={zhText('复制邮箱地址', '複製郵箱地址', 'Copy email address')}
>
<Icon
name={copied ? 'check' : 'copy'}
className={`w-[18px] h-[18px] transition-all duration-200 ${copied ? 'text-[var(--sus-green)] scale-110' : ''}`}
className={`w-3.5 h-3.5 transition-all duration-200 ${copied ? 'text-[var(--sus-green)]' : ''}`}
/>
</button>
{/* Tooltip */}
<span
className={`absolute -top-10 left-1/2 -translate-x-1/2 px-2.5 py-1 rounded-lg text-micro whitespace-nowrap transition-all duration-200 pointer-events-none ${
copied
? 'opacity-100 -translate-y-1 bg-[var(--sus-green)] text-white shadow-lg'
: 'opacity-0 translate-y-1 bg-[color-mix(in_oklch,var(--brand-white)_92%,var(--brand-black))] text-[var(--brand-black)] group-hover:opacity-100 group-hover:-translate-y-1'
}`}
style={{ fontFamily: 'var(--font-body)' }}
>
{copied
? zhText('✓ 已复制', '✓ 已複製', '✓ Copied')
: zhText('点击复制', '點擊複製', 'Click to copy')}
</span>
</div>
</div>
</div>
</li>
{/* Address */}
<p className="flex items-start gap-2 text-body pt-1 text-[color-mix(in_oklch,var(--brand-white)_55%,transparent)]" style={{ fontFamily: 'var(--font-body)' }}>
<Icon name="mapPin" className="w-4 h-4 shrink-0 mt-0.5" />
<li className="text-body text-[color-mix(in_oklch,var(--brand-white)_50%,transparent)]" style={{ fontFamily: 'var(--font-body)' }}>
<span className="leading-relaxed">{f.contact.address}</span>
</p>
</div>
</li>
</ul>
</div>
</div>
{/* ========== Bottom Bar ========== */}
<div className="border-t border-[color-mix(in_oklch,var(--brand-white)_10%,transparent)] pt-6 md:pt-7">
<div className="flex flex-col md:flex-row md:items-center md:justify-between gap-6">
<div className="border-t border-[color-mix(in_oklch,var(--brand-white)_10%,transparent)] pt-5 md:pt-6">
<div className="flex flex-col md:flex-row md:items-center md:justify-between gap-4 md:gap-0">
{/* Left: Copyright */}
<div className="flex flex-col md:flex-row md:items-center gap-3 md:gap-4">
<p className="text-micro text-[color-mix(in_oklch,var(--brand-white)_55%,transparent)]" style={{ fontFamily: 'var(--font-body)' }}>
<p className="text-micro text-[color-mix(in_oklch,var(--brand-white)_55%,transparent)] leading-relaxed" style={{ fontFamily: 'var(--font-body)' }}>
{f.copyright}
</p>
<span className="hidden md:inline w-px h-4 bg-[color-mix(in_oklch,var(--brand-white)_15%,transparent)]" aria-hidden="true" />
<p className="text-micro font-semibold tracking-[0.08em] uppercase text-[color-mix(in_oklch,var(--brand-white)_35%,transparent)] md:hidden" style={{ fontFamily: 'var(--font-body)' }} aria-hidden="true">
{f.icidpFull}
</p>
</div>
{/* Center: Legal Links */}
<div className="flex flex-wrap items-center justify-start md:justify-center gap-x-3 gap-y-2">
{/* Right: Legal Links */}
<div className="flex flex-wrap items-center gap-x-4 gap-y-2 md:justify-end">
{/* ICP */}
<a
href="https://beian.miit.gov.cn/"
target="_blank"
rel="noopener noreferrer"
className="group inline-flex items-center text-micro transition-all duration-200 text-[color-mix(in_oklch,var(--brand-white)_50%,transparent)] hover:text-[var(--brand)]"
className="group inline-flex items-center text-micro transition-colors duration-200 text-[color-mix(in_oklch,var(--brand-white)_50%,transparent)] hover:text-[var(--brand)]"
title={zhText('工信部ICP/IP地址/域名信息备案管理系统', '工信部ICP/IP地址/域名信息備案管理系統', 'MIIT ICP Filing Query (China)')}
style={{ fontFamily: 'var(--font-body)' }}
>
@ -252,14 +224,14 @@ export default function Footer({ locale }: { locale: Locale }) {
{icpNumber}
</a>
<span className="text-[color-mix(in_oklch,var(--brand-white)_18%,transparent)]" aria-hidden="true">·</span>
<span className="w-px h-3 bg-[color-mix(in_oklch,var(--brand-white)_15%,transparent)]" aria-hidden="true" />
{/* PSB */}
<a
href="https://beian.mps.gov.cn/"
target="_blank"
rel="noopener noreferrer"
className="group inline-flex items-center text-micro transition-all duration-200 text-[color-mix(in_oklch,var(--brand-white)_50%,transparent)] hover:text-[var(--brand)]"
className="group inline-flex items-center text-micro transition-colors duration-200 text-[color-mix(in_oklch,var(--brand-white)_50%,transparent)] hover:text-[var(--brand)]"
title={zhText('全国互联网安全管理服务平台 — 公安备案', '全國互聯網安全管理服務平台 — 公安備案', 'MPS Public Security Internet Filing (China)')}
style={{ fontFamily: 'var(--font-body)' }}
>
@ -271,25 +243,18 @@ export default function Footer({ locale }: { locale: Locale }) {
)}
</a>
<span className="text-[color-mix(in_oklch,var(--brand-white)_18%,transparent)]" aria-hidden="true">·</span>
<span className="w-px h-3 bg-[color-mix(in_oklch,var(--brand-white)_15%,transparent)]" aria-hidden="true" />
{/* Privacy */}
<a
href={getLocalizedPath('/privacy', locale)}
className="text-micro transition-all duration-200 text-[color-mix(in_oklch,var(--brand-white)_50%,transparent)] hover:text-[var(--brand)]"
className="text-micro transition-colors duration-200 text-[color-mix(in_oklch,var(--brand-white)_50%,transparent)] hover:text-[var(--brand)]"
style={{ fontFamily: 'var(--font-body)' }}
>
{f.legal.privacy}
</a>
</div>
</div>
{/* Desktop-only ICIDP tagline */}
<div className="hidden md:flex mt-5 pt-5 border-t border-[color-mix(in_oklch,var(--brand-white)_6%,transparent)] justify-center">
<p className="text-micro font-semibold tracking-[0.2em] uppercase text-[color-mix(in_oklch,var(--brand-white)_30%,transparent)]" style={{ fontFamily: 'var(--font-body)' }} aria-hidden="true">
{f.icidpFull}
</p>
</div>
</div>
</div>
</footer>

123
src/components/Investors.tsx

@ -5,28 +5,31 @@ import { cssVars } from './css';
export default function Investors({ locale }: { locale: Locale }) {
const t = getTranslation(locale);
const ir = t.investors;
const isEn = locale === 'en';
const tr = (zh: string, hk: string, en: string) => (isEn ? en : locale === 'hk' ? hk : zh);
const statsIcons = ['layoutGrid', 'package', 'telescope', 'heart'] as const;
const hlPalettes = ['--track-career', '--track-social', '--brand-accent', '--sus-green'] as const;
const partnerPalettes = ['--icidp-devotion', '--icidp-innovation', '--brand-accent-deep'] as const;
const statsIcons = ['layoutGrid', 'package', 'sparkles', 'flame'] as const;
const hlPalettes = ['--brand-accent', '--track-social', '--brand-accent-deep'] as const;
return (
<>
{/* ===== HERO ===== */}
<section className="relative overflow-hidden bg-[var(--bg-subtle)]">
<div className="pointer-events-none absolute -top-24 -right-24 w-[420px] h-[420px] rounded-full bg-[color-mix(in_oklch,var(--brand-accent)_10%,transparent)] blur-3xl" />
<div className="pointer-events-none absolute -bottom-32 -left-24 w-[360px] h-[360px] rounded-full bg-[color-mix(in_oklch,var(--brand-accent)_8%,transparent)] blur-3xl" />
<div className="relative z-10 max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20 md:py-28 text-center">
<span className="section-eyebrow">{ir.stats.eyebrow.replace('BY THE NUMBERS', 'INVESTORS')}</span>
<h1 className="hero-slogan">{ir.title}</h1>
<p className="mt-5 text-body font-medium text-[var(--brand-accent-deep)] max-w-2xl mx-auto leading-relaxed">{ir.subtitle}</p>
<p className="mt-4 text-body text-[var(--text-secondary)] max-w-3xl mx-auto leading-relaxed">{ir.intro}</p>
{/* Floating gradient orbs */}
<div className="pointer-events-none absolute -top-32 -right-24 w-[480px] h-[480px] rounded-full ir-orb ir-orb-1" />
<div className="pointer-events-none absolute -bottom-40 -left-20 w-[360px] h-[360px] rounded-full ir-orb ir-orb-2" />
<div className="pointer-events-none absolute top-1/3 left-1/2 w-[240px] h-[240px] rounded-full ir-orb ir-orb-3" />
<div className="relative z-10 max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-20 md:py-28 text-center">
<span className="section-eyebrow scroll-reveal">{ir.stats.eyebrow.replace('BY THE NUMBERS', 'INVESTORS')}</span>
<h1 className="hero-slogan scroll-reveal" style={{ animationDelay: '0.1s' }}>{ir.title}</h1>
<p className="mt-4 text-body font-medium text-[var(--brand-accent-deep)] max-w-xl mx-auto leading-relaxed scroll-reveal" style={{ animationDelay: '0.2s' }}>{ir.subtitle}</p>
<p className="mt-3 text-body text-[var(--text-secondary)] max-w-2xl mx-auto leading-relaxed scroll-reveal" style={{ animationDelay: '0.3s' }}>{ir.intro}</p>
{/* DATA BAND */}
<div className="stat-band scroll-reveal mt-10 max-w-5xl mx-auto">
<div className="stat-band scroll-reveal mt-10 max-w-4xl mx-auto" style={{ animationDelay: '0.4s' }}>
{ir.stats.items.map((sItem, idx) => (
<div className="stat-cell" key={sItem.label} style={cssVars({ '--track-color': 'var(--accent)' })}>
<Icon name={statsIcons[idx]} className="w-8 h-8 mx-auto mb-3" style={{ color: 'var(--brand-accent)' }} />
<div className="stat-cell" key={sItem.label} style={cssVars({ '--track-color': 'var(--brand-accent)' })}>
<span className="inline-flex items-center justify-center w-11 h-11 rounded-xl mb-3 ir-icon-float" style={{ background: 'color-mix(in oklch, var(--brand-accent) 12%, transparent)', animationDelay: `${idx * 0.3}s` }}>
<Icon name={statsIcons[idx]} className="w-6 h-6" strokeWidth={2} style={{ color: 'var(--brand-accent)' }} />
</span>
<div className="stat-num">
<span className="stat-value">{sItem.value}</span>
{sItem.suffix && <span className="stat-suffix">{sItem.suffix}</span>}
@ -39,7 +42,7 @@ export default function Investors({ locale }: { locale: Locale }) {
</div>
</section>
{/* ===== WHY US 四卡 ===== */}
{/* ===== WHY US ===== */}
<section className="band scroll-mt-24">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-[var(--space-8)]">
<div className="section-head text-center scroll-reveal">
@ -47,26 +50,26 @@ export default function Investors({ locale }: { locale: Locale }) {
<h2 className="section-title mt-3">{ir.highlights.title}</h2>
<p className="section-lead max-w-2xl mx-auto">{ir.highlights.subtitle}</p>
</div>
<div className="grid sm:grid-cols-2 gap-4 mt-8">
<div className="grid sm:grid-cols-3 gap-4 mt-8">
{ir.highlights.items.map((h, i) => {
const token = hlPalettes[i % hlPalettes.length];
return (
<article
key={h.title}
className="scroll-reveal rounded-2xl card-surface p-7 md:p-8 hover:-translate-y-1 hover:shadow-md transition-all duration-300"
style={cssVars({
className="scroll-reveal rounded-2xl card-surface p-7 group ir-card-hover"
style={{ animationDelay: `${i * 0.1}s`, ...cssVars({
background: `linear-gradient(135deg, color-mix(in oklch, var(${token}) 10%, var(--bg-primary)) 0%, color-mix(in oklch, var(${token}) 4%, var(--bg-primary)) 100%)`,
borderColor: `color-mix(in oklch, var(${token}) 22%, transparent)`,
border: '1px solid',
})}
}) }}
>
<span
className="icon-tile w-12 h-12"
className="icon-tile w-12 h-12 transition-transform duration-300 group-hover:scale-110"
style={cssVars({ background: `color-mix(in oklch, var(${token}) 18%, transparent)` })}
>
<Icon name={h.icon as any} className="w-6 h-6" style={cssVars({ color: `var(${token})` })} />
</span>
<h3 className="mt-5 text-h1 font-semibold text-[var(--brand-black)] leading-tight" style={{ fontSize: 'calc(22px + 0.4vw)' }}>{h.title}</h3>
<h3 className="mt-5 text-h1 font-semibold text-[var(--brand-black)] leading-tight" style={{ fontSize: 'calc(20px + 0.3vw)' }}>{h.title}</h3>
<p className="mt-3 text-body text-[var(--text-secondary)] leading-relaxed">{h.desc}</p>
</article>
);
@ -75,29 +78,7 @@ export default function Investors({ locale }: { locale: Locale }) {
</div>
</section>
{/* ===== 愿景呼应 BAND ===== */}
<section className="band">
<div className="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-[var(--space-9)] text-center scroll-reveal">
<span className="section-eyebrow">LONG-TERM VALUE</span>
<h2 className="section-title mt-3">{tr('与数字生活生态共成长', '與數位生活生態共成長', 'Growing with the digital life ecosystem')}</h2>
<p className="section-lead max-w-2xl mx-auto">
{tr(
'巴适伙伴以长期主义经营企业。5 大赛道 · 8+ 自研产品构成数字生活生态——我们相信,连接人、机会、价值与智能的温暖科技,终将转化为可持续的社会与股东价值。',
'巴適夥伴以長期主義經營企業。5 大賽道 · 8+ 自研產品構成數位生活生態——我們相信,連接人、機會、價值與智能的溫暖科技,終將轉化為可持續的社會與股東價值。',
'BaskBuddy is built on long-termism. Five tracks and eight self-built products form our digital life ecosystem — warm tech that connects people, opportunities, value and intelligence will translate into sustainable social and shareholder value.',
)}
</p>
<a
href={getLocalizedPath('/business', locale)}
className="mt-7 inline-flex items-center gap-2 text-body font-semibold text-[var(--brand-accent)] hover:gap-3 transition-all duration-300"
>
{tr('查看业务版图', '查看業務版圖', 'View business map')}
<span aria-hidden="true">→</span>
</a>
</div>
</section>
{/* ===== ROADMAP 三阶段时间轴 ===== */}
{/* ===== ROADMAP ===== */}
<section id="ir-roadmap" className="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-[var(--space-9)] pb-[var(--space-10)] scroll-mt-24">
<div className="section-head text-center scroll-reveal">
<span className="section-eyebrow">{ir.roadmap.eyebrow}</span>
@ -113,15 +94,16 @@ export default function Investors({ locale }: { locale: Locale }) {
aria-hidden="true"
/>
{ir.roadmap.items.map((r, i) => (
<li key={r.title} className="scroll-reveal relative pl-[4.5rem] mb-10 last:mb-0" style={{ '--dly': `${i * 0.1}s` } as any}>
<li key={r.title} className="scroll-reveal relative pl-[4.5rem] mb-10 last:mb-0" style={{ '--dly': `${i * 0.12}s` } as any}>
<span
className="absolute left-0 top-1 w-[3.25rem] h-[3.25rem] rounded-2xl flex items-center justify-center shrink-0"
style={cssVars({
className="absolute left-0 top-1 w-[3.25rem] h-[3.25rem] rounded-2xl flex items-center justify-center shrink-0 ir-roadmap-node"
style={{
background: r.accent
? 'linear-gradient(135deg, var(--brand-accent) 0%, var(--brand-accent-deep) 100%)'
: 'color-mix(in oklch, var(--brand-accent) 14%, var(--bg-primary))',
boxShadow: r.accent ? '0 10px 24px -8px color-mix(in oklch, var(--brand-accent) 45%, transparent)' : 'none',
})}
animationDelay: `${i * 0.4}s`,
}}
>
<span
className="font-mono font-semibold text-micro tracking-wider"
@ -130,7 +112,7 @@ export default function Investors({ locale }: { locale: Locale }) {
0{i + 1}
</span>
</span>
<div className="rounded-2xl card-surface p-6 md:p-7">
<div className="rounded-2xl card-surface p-6 md:p-7 ir-card-hover">
<p className="text-micro font-mono uppercase tracking-[0.18em] text-[var(--brand-accent-deep)]">{r.period}</p>
<h3 className="mt-2 font-semibold text-[var(--brand-black)] leading-tight" style={{ fontSize: 'calc(18px + 0.3vw)' }}>{r.title}</h3>
<p className="mt-3 text-body text-[var(--text-secondary)] leading-relaxed">{r.desc}</p>
@ -140,48 +122,15 @@ export default function Investors({ locale }: { locale: Locale }) {
</ol>
</section>
{/* ===== PARTNERSHIP 伙伴画像 三卡 ===== */}
<section className="band">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-[var(--space-8)] pb-[var(--space-10)]">
<div className="section-head text-center scroll-reveal">
<span className="section-eyebrow">{ir.partnership.eyebrow}</span>
<h2 className="section-title mt-3">{ir.partnership.title}</h2>
<p className="section-lead max-w-2xl mx-auto">{ir.partnership.subtitle}</p>
</div>
<div className="grid sm:grid-cols-2 lg:grid-cols-3 gap-4 mt-8">
{ir.partnership.items.map((p, i) => {
const token = partnerPalettes[i % partnerPalettes.length];
return (
<div
key={p.title}
className="scroll-reveal rounded-2xl card-surface p-7 flex flex-col hover:-translate-y-1 hover:shadow-md transition-all duration-300"
style={cssVars({
background: `linear-gradient(160deg, color-mix(in oklch, var(${token}) 12%, var(--bg-primary)) 0%, color-mix(in oklch, var(${token}) 5%, var(--bg-primary)) 100%)`,
})}
>
<span
className="icon-tile w-11 h-11 shrink-0"
style={cssVars({ background: `color-mix(in oklch, var(${token}) 18%, transparent)` })}
>
<Icon name={p.icon as any} className="w-[22px] h-[22px]" style={cssVars({ color: `var(${token})` })} />
</span>
<h3 className="mt-5 font-semibold text-[var(--brand-black)] leading-tight" style={{ fontSize: 'calc(17px + 0.3vw)' }}>{p.title}</h3>
<p className="mt-3 text-body text-[var(--text-secondary)] leading-relaxed flex-1">{p.desc}</p>
</div>
);
})}
</div>
</div>
</section>
{/* ===== IR 垂询 CTA ===== */}
{/* ===== IR CTA ===== */}
<section className="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 pb-[var(--space-11)]">
<div className="cta-band px-8 py-12 md:py-14 text-center">
<div className="cta-band px-8 py-12 md:py-14 text-center scroll-reveal">
<div className="ir-cta-shimmer" aria-hidden="true" />
<span className="relative z-10 inline-block text-micro font-semibold tracking-[0.15em] uppercase text-[color-mix(in_oklch,var(--brand)_70%,transparent)]" style={{ fontFamily: 'var(--font-body)' }}>
{ir.contact.eyebrow}
</span>
<h2 className="relative z-10 mt-3 text-h1 font-bold font-[var(--font-display)] text-white leading-tight">{ir.contact.title}</h2>
<p className="relative z-10 mt-4 text-body text-[color-mix(in_oklch,var(--brand-white)_85%,transparent)] max-w-2xl mx-auto leading-relaxed">{ir.contact.desc}</p>
<p className="relative z-10 mt-4 text-body text-[color-mix(in_oklch,var(--brand-white)_85%,transparent)] max-w-xl mx-auto leading-relaxed">{ir.contact.desc}</p>
<div className="relative z-10 mt-7 flex flex-col sm:flex-row items-center justify-center gap-3.5">
<a href={'mailto:' + ir.contact.email} className="btn btn-light btn-lg">
<Icon name="mail" className="w-4 h-4 -ml-0.5 mr-2" />

2
src/components/Mascot.tsx

@ -86,7 +86,7 @@ const MASCOT: Record<string, PageTriggers> = {
enter: {
mood: 'think',
msgs: [
{ zh: '这里不是抽象的 ESG——三件能落地的责任事:绿色低碳、数字普惠、可信运营。', hk: '這裡不是抽象的 ESG——三件能落地的責任事:綠色低碳、數位普惠、可信運營。', en: "No abstract ESG here — three things we actually deliver: green, inclusive, trustworthy." },
{ zh: '这里不是抽象的 ESG——三件能落地的责任事:绿色低碳、数字普惠、可信运营。', hk: '這裡不是抽象的 ESG——三件能落地的責任事:綠色低碳、數字普惠、可信運營。', en: "No abstract ESG here — three things we actually deliver: green, inclusive, trustworthy." },
{ zh: '往下翻,每条承诺都被我们写成了会被兑现的清单~', hk: '往下翻,每條承諾都被我們寫成了會被兌現的清單~', en: 'Scroll down — every commitment is a checklist we will deliver.' },
],
},

4
src/components/Sustainability.tsx

@ -17,11 +17,11 @@ export default function Sustainability({ locale }: { locale: Locale }) {
// 责任 × 产品挂钩:三方向对应 5 赛道 8 产品中的具体落点
// ti/pi = track/product 索引,与 i18n business.tracks 顺序一致
// 0 内容社交(青核/音酷/蜜恋) · 1 职场服务(职来/看见高山) · 2 数字支付(妥哒) · 3 人工智能(阿布AI) · 4 生活服务(听愿)
// 0 内容社交(青核/音酷/蜜恋) · 1 职场服务(职来/看山) · 2 数字支付(妥哒) · 3 人工智能(阿布AI) · 4 生活服务(听愿)
const links = [
// 绿色低碳:阿布 AI 的算力能效
[{ ti: 3, pi: 0, role: tr('算力能效', '算力能效', 'Compute efficiency') }],
// 数字普惠:妥哒支付普惠 · 看见高山知识普惠 · 职来职业流动 · 听愿心愿互助
// 数字普惠:妥哒支付普惠 · 看山知识普惠 · 职来职业流动 · 听愿心愿互助
[
{ ti: 2, pi: 0, role: tr('支付普惠', '支付普惠', 'Payment inclusion') },
{ ti: 1, pi: 1, role: tr('知识普惠', '知識普惠', 'Knowledge inclusion') },

56
src/i18n/en.ts

@ -118,7 +118,8 @@ export const en = {
members: [
{ name: 'Zhang Shun', role: 'Software Engineer', gender: 'male' },
{ name: 'Zhang Buyun', role: 'Software Engineer', gender: 'female' },
{ name: 'Zhang Yuheng', role: 'Software Engineer', gender: 'male' },
{ name: 'Chen Xueni', role: 'Software Engineer', gender: 'female' },
{ name: 'Chen Manli', role: 'Finance Specialist', gender: 'female' },
{ name: 'Yang Xingxing', role: 'Software Engineer', gender: 'female' },
],
},
@ -144,7 +145,7 @@ export const en = {
nodes: [
{ id: 'position', title: 'Positioning', desc: 'BaskBuddy (Shanghai) Technology Co., Ltd. is a high-tech enterprise focused on digital lifestyle services, delivering quality products and services to diverse user groups through a multi-brand, multi-vertical product portfolio.' },
{ id: 'tracks', title: 'Five Core Tracks', desc: 'Built on five pillars — Content & Social, Career Services, Digital Payment, AI, and Life Services — with 8 self-developed products covering every scenario of users digital life.', link: '/business' },
{ id: 'team', title: 'Management', desc: 'A core team of four partners — Zhang Shun, Zhang Buyun, Zhang Yuheng, and Yang Xingxing — focused on software R&D and product innovation.', link: '#about-team' },
{ id: 'team', title: 'Management', desc: 'A core team of five partners — Zhang Shun, Zhang Buyun, Chen Xueni, Chen Manli, and Yang Xingxing — focused on software R&D and product innovation.', link: '#about-team' },
{ id: 'vision', title: 'Vision & Mission', desc: 'Vision: build the world-leading digital lifestyle service ecosystem. Mission: connect people and services through innovative technology, creating convenient, efficient, and valuable lives for diverse users.' },
{ id: 'data', title: 'Key Facts', desc: '5 core tracks · 8 products · global ecosystem · founded in 2026.' },
{ id: 'life', title: 'Connecting Life', desc: 'Treating every ordinary day with care — technology fades into the background, warmth remains.' },
@ -345,56 +346,45 @@ Let's go — let's journey toward a beautiful future together with BaskBuddy!`,
},
investors: {
title: 'Investor Relations',
subtitle: 'Long-term partners who share our values',
intro: 'BaskBuddy was born out of a group of young people\'s obsession with "warm tech". We build our digital life ecosystem from zero — not by chasing short-term valuations with stories, but by walking alongside long-term capital that truly understands us. If you buy into "long-termism · value co-creation", let\'s talk.',
subtitle: 'A warm team · Looking forward to meeting you',
intro: 'BaskBuddy is a small team that believes tech can be warm. Currently independent, crafting 5 tracks and 8 products at our own pace. No rush, no chasing trends — just doing what feels right. The team is also growing slowly, in its own rhythm. If you share this "let\'s slow down" mindset, let\'s talk.',
stats: {
eyebrow: 'BY THE NUMBERS',
items: [
{ value: '5', suffix: '', label: 'Core Tracks', sub: 'Social · Career · Payment · AI · Life Service' },
{ value: '8', suffix: '+', label: 'Self-built Products', sub: 'Covering the full digital life spectrum' },
{ value: '100', suffix: '%', label: 'Long-term Mindset', sub: 'No quick wins — we do the hard, right things' },
{ value: '∞', suffix: '', label: 'User-first DNA', sub: 'Every product decision starts with users' },
{ value: '5', suffix: '', label: 'Tracks', sub: 'Each with a heartbeat' },
{ value: '8', suffix: '', label: 'Self-built Products', sub: 'From the heart, for life' },
{ value: '100', suffix: '%', label: 'Self-developed', sub: 'Independent, self-determined' },
{ value: '∞', suffix: '', label: 'Patience', sub: 'No rush, take our time' },
],
},
highlights: {
eyebrow: 'WHY US',
title: 'Why BaskBuddy',
subtitle: 'Four signals that help you quickly understand our value anchors',
eyebrow: 'OUR PRINCIPLES',
title: 'What We Believe',
subtitle: 'Three small beliefs that guide every decision we make',
items: [
{ icon: 'users', title: 'Young users, mindshare entry', desc: '8 products enter from college students and youth communities — mindshare first, then boundary expansion. Our users grow; our product matrix grows with them.' },
{ icon: 'package', title: 'Self-built products = ecosystem', desc: 'Unlike single-point tools, 5 tracks × 8+ self-built products are designed as a synergistic ecosystem from day one — cross-acquisition CAC is naturally lower.' },
{ icon: 'sparkles', title: 'Warm-tech differentiation', desc: 'We don\'t make cold efficiency tools. "Warmth" is our brand memory: from Abu AI\'s "companion touch" to HearWish\'s "wish mutual-aid", emotional connection IS the moat.' },
{ icon: 'sprout', title: 'Responsibility = long-term value', desc: 'Green & low-carbon · Digital inclusion · Trusted operations are written into our product R&D process. ESG is not a retroactively-written report — it\'s the default design parameter.' },
{ icon: 'heartHandshake', title: 'Users are friends', desc: 'Every product iteration starts from a real friend\'s needs. Not metrics — human hearts.' },
{ icon: 'network', title: 'Ecosystem is home', desc: '5 tracks, 8 products — like siblings supporting each other, growing together.' },
{ icon: 'sparkles', title: 'Tech needs warmth', desc: 'The best tech feels human. If it feels cold, it\'s not what we\'re building. Warmth is our foundation.' },
],
},
roadmap: {
eyebrow: 'ROADMAP',
title: 'The road we\'re walking',
subtitle: 'No salesy stories — we just write down every step honestly',
subtitle: 'No sprint, no rush — every step on solid ground',
items: [
{ period: 'PHASE 01 · 2024—2025', title: 'Ecosystem skeleton', desc: 'Shipped MVP prototypes of 5 tracks × 8+ products, forming the complete skeleton of Social/Career/Payment/AI/Life-Service.', accent: true },
{ period: 'PHASE 02 · 2026', title: 'Seed-user validation', desc: 'Running first-round real-user validation with universities and youth communities. Core KPIs = retention + organic referral rate, NOT fund-raising cadence.', accent: false },
{ period: 'PHASE 03 · 2027+', title: 'Scaled growth', desc: 'When cross-product recommendation hit-rate & per-user multi-product penetration cross our thresholds, we trigger city-by-city scaled expansion.', accent: false },
],
},
partnership: {
eyebrow: 'PARTNERSHIP',
title: 'Who we\'re looking for',
subtitle: 'We care more about shared values than the headline number',
items: [
{ icon: 'compass', title: 'Long-termism believers', desc: 'Your thesis is NOT "flip it in the next round". You\'re willing to wait 5—10 years for ecosystem value to compound and mature.' },
{ icon: 'network', title: 'Bring more than capital', desc: 'Industry connections, enterprise clients, university channels, policy resources… if your portfolio has chemistry with our 5 tracks, come in earlier than typical angels.' },
{ icon: 'handshake', title: 'No "packaging stories" pressure', desc: 'We share real retention, NPS, and cross-product penetration data every quarter. But we won\'t fake a story, or take "raise at any cost" advice.' },
{ period: '2024 — 2025', title: 'Laying the foundation', desc: '5 tracks, 8 product prototypes built — like a house with a solid foundation.', accent: true },
{ period: '2026', title: 'Polishing with care', desc: 'Working with real users to make every product better, more thoughtful, more human.', accent: false },
{ period: '2027+', title: 'Growing slowly', desc: 'If people truly love what we build, then we\'ll grow — one step at a time.', accent: false },
],
},
contact: {
eyebrow: 'GET IN TOUCH',
title: 'Let\'s grab a coffee',
desc: 'Even if you\'re not investing now, reach out with ideas, resources or a shared vision. IR lead replies to every email personally every Wednesday.',
title: 'Let\'s talk',
desc: 'Investor or not, we\'d love to hear from you. A cup of coffee might be the start of something meaningful.',
email: 'ir@baskbuddy.com',
cta: 'Email the IR team',
cta: 'Say hello via email',
or: 'Or',
contactPage: 'Visit Contact page →',
contactPage: 'Our story →',
},
},
footer: {

96
src/i18n/hk.ts

@ -13,7 +13,7 @@ export const hk = {
home: {
slogan: '巴適夥伴,一生相伴',
sloganSub: 'BaskBuddy · Warm Tech, Better Life',
sloganIntro: '覆蓋內容社交 · 職場服務 · 數位支付 · AI · 生活服務的數位生活服務商',
sloganIntro: '覆蓋內容社交 · 職場服務 · 數字支付 · AI · 生活服務的數字生活服務商',
heroTitle: '以智能創新開創數字未來',
heroCta: '了解我們',
trackOverview: '五大核心賽道',
@ -23,7 +23,7 @@ export const hk = {
tracks: {
social: { name: '內容社交', desc: '連接志同道合的人,打造真誠溫暖的社交體驗', color: '#1A1A1A' },
career: { name: '職場服務', desc: '智能匹配機會,知識賦能成長,讓每一步都清晰可見', color: '#1A1A1A' },
payment: { name: '數位支付', desc: '安全便捷的場景化支付,讓每筆交易都有溫度', color: '#1A1A1A' },
payment: { name: '數字支付', desc: '安全便捷的場景化支付,讓每筆交易都有溫度', color: '#1A1A1A' },
ai: { name: '人工智能', desc: '多模態感知理解,讓 AI 成為溫暖的生活夥伴', color: '#1A1A1A' },
lifeService: { name: '生活服務', desc: '以真實心願為核心,搭建暖心橋樑,讓每一份期待都不落空', color: '#1A1A1A' },
},
@ -32,8 +32,8 @@ export const hk = {
title: '巴適速度',
subtitle: '以溫暖科技,連接美好生活的堅實底座',
items: [
{ value: '5', suffix: '大', label: '核心賽道', sub: '內容社交 · 職場服務 · 數位支付 · AI · 生活服務' },
{ value: '8', suffix: '+', label: '自研產品', sub: '覆蓋數位生活全場景' },
{ value: '5', suffix: '大', label: '核心賽道', sub: '內容社交 · 職場服務 · 數字支付 · AI · 生活服務' },
{ value: '8', suffix: '+', label: '自研產品', sub: '覆蓋數字生活全場景' },
{ value: '全球', suffix: '', label: '服務願景', sub: '讓優質產品觸達全球用戶' },
{ value: '長期', suffix: '', label: '價值主義', sub: '與用戶、夥伴、社會共贏' },
],
@ -41,7 +41,7 @@ export const hk = {
about: {
eyebrow: 'ABOUT BASKBUDDY',
title: '走進巴適夥伴',
text: '巴適夥伴(上海)科技有限公司是一家聚焦數位生活服務領域的高科技企業,依託多品牌、多垂直賽道的產品佈局,覆蓋內容社交、職場服務、數位支付、人工智能與生活服務,以溫暖科技連接每一個人的美好生活。',
text: '巴適夥伴(上海)科技有限公司是一家聚焦數字生活服務領域的高科技企業,依託多品牌、多垂直賽道的產品佈局,覆蓋內容社交、職場服務、數字支付、人工智能與生活服務,以溫暖科技連接每一個人的美好生活。',
cta: '進一步了解',
},
pillars: {
@ -49,8 +49,8 @@ export const hk = {
title: '三大支柱',
subtitle: '以科技連接消費的日常、企業的增長與未來的想像',
items: [
{ name: '面向消費者', desc: '連接用戶日常,讓數位生活更溫暖、更便捷', icon: 'users', img: 'https://oss.baskbuddy.com/baskbuddy/pillar-consumer.jpg' },
{ name: '面向企業', desc: '連接商業戰略與數位交付,助力企業高效增長', icon: 'briefcase', img: 'https://oss.baskbuddy.com/baskbuddy/pillar-enterprise.jpg' },
{ name: '面向消費者', desc: '連接用戶日常,讓數字生活更溫暖、更便捷', icon: 'users', img: 'https://oss.baskbuddy.com/baskbuddy/pillar-consumer.jpg' },
{ name: '面向企業', desc: '連接商業戰略與數字交付,助力企業高效增長', icon: 'briefcase', img: 'https://oss.baskbuddy.com/baskbuddy/pillar-enterprise.jpg' },
{ name: '面向未來', desc: '研發真正重要的技術,探索科技向善的可能', icon: 'bot', img: 'https://oss.baskbuddy.com/baskbuddy/pillar-future.jpg' },
],
},
@ -92,9 +92,9 @@ export const hk = {
about: {
title: '關於我們',
subtitle: '巴適夥伴,一生相伴',
intro: `巴適夥伴(上海)科技有限公司是一家聚焦數位生活服務領域,依託多品牌、多垂直賽道的產品佈局,面向不同用戶群體提供優質產品與服務的高科技企業,透過旗下多家獨立運營的子公司,分別深耕內容社交(青核、音酷、蜜戀)、職場服務(職來、看見高山)、數位支付(妥噠)、人工智能(阿布 AI)、生活服務(聽願)等多個領域,始終堅持以用戶需求為核心,堅持品質第一與技術創新,為員工創造成長空間,為用戶創造美好生活,為社會創造長期價值。`,
intro: `巴適夥伴(上海)科技有限公司是一家聚焦數字生活服務領域,依託多品牌、多垂直賽道的產品佈局,面向不同用戶群體提供優質產品與服務的高科技企業,透過旗下多家獨立運營的子公司,分別深耕內容社交(青核、音酷、蜜戀)、職場服務(職來、看山)、數字支付(妥噠)、人工智能(阿布 AI)、生活服務(聽願)等多個領域,始終堅持以用戶需求為核心,堅持品質第一與技術創新,為員工創造成長空間,為用戶創造美好生活,為社會創造長期價值。`,
visionMission: {
vision: '打造全球領先的數位生活服務生態,讓不同需求的用戶都能獲得優質適配的產品體驗',
vision: '打造全球領先的數字生活服務生態,讓不同需求的用戶都能獲得優質適配的產品體驗',
mission: '以創新技術連接人與服務,依託多元垂直領域產品,為不同用戶群體打造便捷高效、富有價值的美好生活',
purpose: '一心為員工成長 · 一心為公司發展 · 一心為社會進步 · 一心為改變世界',
culture: '讓敢創新敢挑戰的人突破邊界,讓距離用戶最近的人定義價值,讓聽得見砲火聲的人指揮戰鬥!',
@ -118,7 +118,8 @@ export const hk = {
members: [
{ name: '張順', role: '軟件開發工程師', gender: 'male' },
{ name: '張卜允', role: '軟件開發工程師', gender: 'female' },
{ name: '張宇恆', role: '軟件開發工程師', gender: 'male' },
{ name: '陳雪妮', role: '軟件開發工程師', gender: 'female' },
{ name: '陳曼麗', role: '財務專員', gender: 'female' },
{ name: '楊幸幸', role: '軟件開發工程師', gender: 'female' },
],
},
@ -143,8 +144,8 @@ export const hk = {
},
nodes: [
{ id: 'position', title: '公司定位', desc: '巴適夥伴(上海)科技有限公司是一家聚焦數字生活服務領域的高新技術企業,依託多品牌、多垂直賽道的產品佈局,面向不同用戶群體提供優質產品與服務。' },
{ id: 'tracks', title: '五大核心賽道', desc: '以內容社交、職場服務、數位支付、人工智能、生活服務五大核心賽道為支柱,孵化 8 自研產品,覆蓋用戶數字生活全場景。', link: '/business' },
{ id: 'team', title: '管理團隊', desc: '由張順、張卜允、張宇恆、楊幸幸四位夥伴組成的核心團隊,專注軟件研發與產品創新。', link: '#about-team' },
{ id: 'tracks', title: '五大核心賽道', desc: '以內容社交、職場服務、數字支付、人工智能、生活服務五大核心賽道為支柱,孵化 8 自研產品,覆蓋用戶數字生活全場景。', link: '/business' },
{ id: 'team', title: '管理團隊', desc: '由張順、張卜允、陳雪妮、陳曼麗、楊幸幸五位夥伴組成的核心團隊,專注軟件研發與產品創新。', link: '#about-team' },
{ id: 'vision', title: '願景使命', desc: '願景:打造全球領先的數字生活服務生態。使命:以創新技術連接人與服務,為不同用戶群體打造便捷高效、富有價值的美好生活。' },
{ id: 'data', title: '關鍵數據', desc: '5 大核心賽道 · 8 自研產品 · 全球生態佈局 · 2026 啟航之年。' },
{ id: 'life', title: '連接用戶與生活', desc: '讓每一個平凡的日常,都被用心對待——技術終將隱於無形,溫暖始終相伴。' },
@ -154,11 +155,11 @@ export const hk = {
},
business: {
title: '我們的創新',
subtitle: '五大核心賽道,數位生活全覆蓋',
subtitle: '五大核心賽道,數字生活全覆蓋',
subnav: {
social: { title: '內容社交', desc: '連接志同道合的人,讓每一次相遇都真誠而溫暖', icon: 'users', href: '#biz-tracks' },
career: { title: '職場服務', desc: '智能匹配機會,讓每一步成長都清晰可見', icon: 'briefcase', href: '#biz-tracks' },
payment: { title: '數位支付', desc: '安全便捷的場景化支付,讓每筆交易都有溫度', icon: 'creditCard', href: '#biz-tracks' },
payment: { title: '數字支付', desc: '安全便捷的場景化支付,讓每筆交易都有溫度', icon: 'creditCard', href: '#biz-tracks' },
ai: { title: '人工智能', desc: '多模態感知理解,讓 AI 成為溫暖的生活夥伴', icon: 'bot', href: '#biz-tracks' },
lifeService: { title: '生活服務', desc: '以真實心願為核心,搭建暖心橋樑,助力夢想落地', icon: 'heartHandshake', href: '#biz-tracks' },
},
@ -183,11 +184,11 @@ export const hk = {
],
},
{
name: '數位支付',
name: '數字支付',
color: '#1A1A1A',
icon: 'creditCard',
products: [
{ name: '妥噠', enName: 'Trustdeal', desc: '智能數位支付——安全便捷,讓支付更有溫度', slogan: '妥噠,說妥就妥,每一筆都靠譜', role: '智能數位支付', audience: '個人消費者與商戶企業', ecosystem: '交易生態 · 雙邊市場樞紐', icon: 'shieldCheck' },
{ name: '妥噠', enName: 'Trustdeal', desc: '智能數字支付——安全便捷,讓支付更有溫度', slogan: '妥噠,說妥就妥,每一筆都靠譜', role: '智能數字支付', audience: '個人消費者與商戶企業', ecosystem: '交易生態 · 雙邊市場樞紐', icon: 'shieldCheck' },
],
},
{
@ -289,9 +290,9 @@ export const hk = {
sustainability: {
title: '責任與價值',
subtitle: '用溫暖科技,擔起每一份責任',
intro: '我們把「責任」拆解成三件可執行的事:讓運營更綠、讓數位服務更普惠、讓每一次交易更可信。比起抽象的 ESG 框架,我們更在意每一項承諾能否落到產品裡、被用戶感知到。',
intro: '我們把「責任」拆解成三件可執行的事:讓運營更綠、讓數字服務更普惠、讓每一次交易更可信。比起抽象的 ESG 框架,我們更在意每一項承諾能否落到產品裡、被用戶感知到。',
subnav: {
pillars: { title: '三大方向', desc: '綠色低碳 · 數位普惠 · 可信運營', icon: 'sprout', href: '#sus-pillars' },
pillars: { title: '三大方向', desc: '綠色低碳 · 數字普惠 · 可信運營', icon: 'sprout', href: '#sus-pillars' },
actions: { title: '產品掛鉤', desc: '把責任落到每一款產品', icon: 'rocket', href: '#sus-actions' },
commitment: { title: '我們的承諾', desc: '可量化、可追蹤、可被監督', icon: 'shieldCheck', href: '#sus-commitment' },
},
@ -299,15 +300,15 @@ export const hk = {
greenLowCarbon: {
title: '綠色低碳',
enName: 'Green & Low-Carbon',
desc: '從雲端算力到辦公能耗,持續降低數位服務的碳足跡,讓每一次連接都更輕。',
desc: '從雲端算力到辦公能耗,持續降低數字服務的碳足跡,讓每一次連接都更輕。',
metric: '100%',
metricLabel: '綠色電力目標',
color: '#10B981',
},
digitalInclusion: {
title: '數位普惠',
title: '數字普惠',
enName: 'Digital Inclusion',
desc: '讓更多人在職場、支付、知識、心願中獲得公平的數位化機會——技術不該是門檻。',
desc: '讓更多人在職場、支付、知識、心願中獲得公平的數字化機會——技術不該是門檻。',
metric: '8',
metricLabel: '普惠產品覆蓋',
color: '#3d5afe',
@ -345,56 +346,45 @@ export const hk = {
},
investors: {
title: '投資者關係',
subtitle: '長期主義,與理念一致的夥伴共成長',
intro: '巴適夥伴誕生於一群年輕人對「溫暖科技」的執著。我們從零搭建數位生活生態,不靠講故事衝刺短期估值,而希望與真正理解我們的長期資本同行。如果您認同「長期主義·價值共創」的理念,歡迎成為我們的夥伴。',
subtitle: '一個有溫度的團隊 · 期待與您相遇',
intro: '巴適夥伴是一個相信科技可以很溫暖的小團隊。目前獨立營運,認真打磨著 5 大賽道、8 款產品。不著急,不跟風,做自己覺得對的事。團隊也在按自己的節奏慢慢長大——如果您也認同這份"慢下來"的心情,歡迎聊聊。',
stats: {
eyebrow: 'BY THE NUMBERS',
items: [
{ value: '5', suffix: '大', label: '核心賽道', sub: '內容社交-職場服務-數位支付-AI-生活服務' },
{ value: '8', suffix: '+', label: '自研產品', sub: '覆蓋數位生活全場景' },
{ value: '100', suffix: '%', label: '長期導向', sub: '不賺快錢,做難而正確的事' },
{ value: '∞', suffix: '', label: '用戶導向', sub: '一切產品設計從用戶出發' },
{ value: '5', suffix: '大', label: '業務賽道', sub: '每條賽道都有溫度' },
{ value: '8', suffix: '款', label: '自研產品', sub: '從心出發,為生活服務' },
{ value: '100', suffix: '%', label: '自主研發', sub: '獨立營運,自主決策' },
{ value: '∞', suffix: '', label: '耐心', sub: '不著急,慢慢做' },
],
},
highlights: {
eyebrow: 'WHY US',
title: '為什麼是巴適夥伴',
subtitle: '四條判斷標準,幫您快速了解我們的價值錨點',
eyebrow: 'OUR PRINCIPLES',
title: '我們相信的事',
subtitle: '三個小小的信念,指引我們每天做的每一個決定',
items: [
{ icon: 'users', title: '年輕用戶心智入口', desc: '8 款產品從大學生、青年人群切入,先佔心智再擴邊界——用戶在成長,產品矩陣也在同步成長。' },
{ icon: 'package', title: '自研產品矩陣=生態', desc: '不同於單點工具型產品,5 大賽道 × 8+ 自研產品從第一天就按「生態協同」設計——交叉獲客成本天然更低。' },
{ icon: 'sparkles', title: '溫暖科技差異化', desc: '我們不做冷漠的效率工具。「溫暖」是品牌記憶點:從阿布 AI 的「情趣感」到聽願的「心願互助」,情感連接就是護城河。' },
{ icon: 'sprout', title: '責任=長期價值', desc: '綠色低碳·數位普惠·可信營運三條方向已寫入產品研發流程,ESG 不是事後補寫的報告,而是設計時的預設參數。' },
{ icon: 'heartHandshake', title: '把用戶當朋友', desc: '產品的每一次迭代,都是因為身邊朋友的真實需求。不是數據,是人心。' },
{ icon: 'network', title: '生態就是家', desc: '5 大賽道、8 款產品,像兄弟姐妹一樣互相扶持,一起成長。' },
{ icon: 'sparkles', title: '科技要有溫度', desc: '再好的技術,如果讓人感到冰冷,就不是我們想做的。溫暖,是底色。' },
],
},
roadmap: {
eyebrow: 'ROADMAP',
title: '我們正在走的路',
subtitle: '不講故事,但我們會把每一步踏踏實實寫出來',
title: '我們在慢慢走的路',
subtitle: '不衝刺,不趕路,每一步都踩踏實',
items: [
{ period: 'PHASE 01 · 2024—2025', title: '生態骨架搭建', desc: '完成 5 大賽道 × 8+ 款產品的原型打磨,形成內容社交/職場服務/數位支付/人工智慧/生活服務的完整骨架。', accent: true },
{ period: 'PHASE 02 · 2026', title: '種子用戶驗證', desc: '面向高校與青年社群做首輪真實用戶驗證,核心 KPI 是用戶留存與口碑推薦率,而不是融資節奏。', accent: false },
{ period: 'PHASE 03 · 2027+', title: '規模化擴張', desc: '當 8 款產品的交叉推薦命中率、單用戶多產品滲透率超過閾值,我們將啟動跨城市、跨人群的規模化增長。', accent: false },
],
},
partnership: {
eyebrow: 'PARTNERSHIP',
title: '我們期待怎樣的夥伴',
subtitle: '相比估值,我們更在意理念上的長期契合',
items: [
{ icon: 'compass', title: '認同長期主義', desc: '不以「下一輪能否轉手」為出發點,願意和我們一起等 5—10 年,讓生態價值慢慢落地。' },
{ icon: 'network', title: '能帶資源,而不止是錢', desc: '產業資源、企業客戶、高校管道、政策資源……如果您的佈局和我們 5 大賽道有化學反應,歡迎比一般天使更早加入。' },
{ icon: 'handshake', title: '不催「講故事」', desc: '我們會按季度給您真實的留存、推薦率、交叉滲透率數據,但不做「包裝故事」、不接「為了融資而融資」的建議。' },
{ period: '2024 — 2025', title: '搭好骨架', desc: '5 大賽道、8 款產品的原型都做出來了,像蓋房子打好了地基。', accent: true },
{ period: '2026', title: '用心打磨', desc: '和真實用戶一起,把每一款產品磨得更好用、更貼心。', accent: false },
{ period: '2027+', title: '慢慢長大', desc: '如果用戶真的喜歡我們,再一步一步走到更多人的身邊。', accent: false },
],
},
contact: {
eyebrow: 'GET IN TOUCH',
title: '和我們聊聊?',
desc: '即使您暫時不投,也歡迎帶著理念和資源來喝杯咖啡。郵箱每週三由 IR 負責人親自回覆。',
title: '來聊聊吧',
desc: '不管您是不是投資者,都歡迎來找我們聊聊。一杯咖啡的時間,也許就是一段緣分的開始。',
email: 'ir@baskbuddy.com',
cta: '發郵件給 IR 團隊',
cta: '發郵件打聲招呼',
or: '或者',
contactPage: '先看聯繫我們 →',
contactPage: '看看我們的故事 →',
},
},
footer: {

60
src/i18n/zh.ts

@ -92,7 +92,7 @@ export const zh = {
about: {
title: '关于我们',
subtitle: '巴适伙伴,一生相伴',
intro: `巴适伙伴(上海)科技有限公司是一家聚焦数字生活服务领域,依托多品牌、多垂直赛道的产品布局,面向不同用户群体提供优质产品与服务的高科技企业,通过旗下多家独立运营的子公司,分别深耕内容社交(青核、音酷、蜜恋)、职场服务(职来、看见高山)、数字支付(妥哒)、人工智能(阿布 AI)、生活服务(听愿)等多个领域,始终坚持以用户需求为核心,坚持品质第一与技术创新,为员工创造成长空间,为用户创造美好生活,为社会创造长期价值。`,
intro: `巴适伙伴(上海)科技有限公司是一家聚焦数字生活服务领域,依托多品牌、多垂直赛道的产品布局,面向不同用户群体提供优质产品与服务的高科技企业,通过旗下多家独立运营的子公司,分别深耕内容社交(青核、音酷、蜜恋)、职场服务(职来、看山)、数字支付(妥哒)、人工智能(阿布 AI)、生活服务(听愿)等多个领域,始终坚持以用户需求为核心,坚持品质第一与技术创新,为员工创造成长空间,为用户创造美好生活,为社会创造长期价值。`,
visionMission: {
vision: '打造全球领先的数字生活服务生态,让不同需求的用户都能获得优质适配的产品体验',
mission: '以创新技术连接人与服务,依托多元垂直领域产品,为不同用户群体打造便捷高效、富有价值的美好生活',
@ -118,7 +118,8 @@ export const zh = {
members: [
{ name: '张顺', role: '软件开发工程师', gender: 'male' },
{ name: '张卜允', role: '软件开发工程师', gender: 'female' },
{ name: '张宇恒', role: '软件开发工程师', gender: 'male' },
{ name: '陈雪妮', role: '软件开发工程师', gender: 'female' },
{ name: '陈曼丽', role: '财务专员', gender: 'female' },
{ name: '杨幸幸', role: '软件开发工程师', gender: 'female' },
],
},
@ -144,7 +145,7 @@ export const zh = {
nodes: [
{ id: 'position', title: '公司定位', desc: '巴适伙伴(上海)科技有限公司是一家聚焦数字生活服务领域的高科技企业,依托多品牌、多垂直赛道的产品布局,面向不同用户群体提供优质产品与服务。' },
{ id: 'tracks', title: '五大核心赛道', desc: '以内容社交、职场服务、数字支付、人工智能、生活服务五大核心赛道为支柱,孵化 8 自研产品,覆盖用户数字生活全场景。', link: '/business' },
{ id: 'team', title: '管理团队', desc: '由张顺、张卜允、张宇恒、杨幸幸四位伙伴组成的核心团队,专注软件研发与产品创新。', link: '#about-team' },
{ id: 'team', title: '管理团队', desc: '由张顺、张卜允、陈雪妮、陈曼丽、杨幸幸五位伙伴组成的核心团队,专注软件研发与产品创新。', link: '#about-team' },
{ id: 'vision', title: '愿景使命', desc: '愿景:打造全球领先的数字生活服务生态。使命:以创新技术连接人与服务,为不同用户群体打造便捷高效、富有价值的美好生活。' },
{ id: 'data', title: '关键数据', desc: '5 大核心赛道 · 8 自研产品 · 全球生态布局 · 2026 起航之年。' },
{ id: 'life', title: '连接用户与生活', desc: '让每一个平凡的日常,都被用心对待——技术终将隐于无形,温暖始终相伴。' },
@ -345,56 +346,45 @@ export const zh = {
},
investors: {
title: '投资者关系',
subtitle: '长期主义,与理念一致的伙伴共成长',
intro: '巴适伙伴诞生于一群年轻人对"温暖科技"的执着。我们从零搭建数字生活生态,不靠讲故事冲刺短期估值,而希望与真正理解我们的长期资本同行。如果您认同"长期主义·价值共创"的理念,欢迎成为我们的伙伴。',
subtitle: '一个有温度的团队 · 期待与您相遇',
intro: '巴适伙伴是一个相信科技可以很温暖的小团队。目前独立运营,认真打磨着 5 大赛道、8 款产品。不着急,不跟风,做自己觉得对的事。团队也在按自己的节奏慢慢长大——如果您也认同这份"慢慢来"的心情,欢迎聊聊。',
stats: {
eyebrow: 'BY THE NUMBERS',
items: [
{ value: '5', suffix: '大', label: '核心赛道', sub: '内容社交-职场服务-数字支付-AI-生活服务' },
{ value: '8', suffix: '+', label: '自研产品', sub: '覆盖数字生活全场景' },
{ value: '100', suffix: '%', label: '长期导向', sub: '不赚快钱,做难而正确的事' },
{ value: '∞', suffix: '', label: '用户导向', sub: '一切产品设计从用户出发' },
{ value: '5', suffix: '大', label: '业务赛道', sub: '每条赛道都有温度' },
{ value: '8', suffix: '款', label: '自研产品', sub: '从心出发,为生活服务' },
{ value: '100', suffix: '%', label: '自主研发', sub: '独立运营,自主决策' },
{ value: '∞', suffix: '', label: '耐心', sub: '不着急,慢慢做' },
],
},
highlights: {
eyebrow: 'WHY US',
title: '为什么是巴适伙伴',
subtitle: '四条判断标准,帮您快速了解我们的价值锚点',
eyebrow: 'OUR PRINCIPLES',
title: '我们相信的事',
subtitle: '三个小小的信念,指引我们每天做的每一个决定',
items: [
{ icon: 'users', title: '年轻用户心智入口', desc: '8 款产品从大学生、青年人群切入,先占心智再扩边界——用户在成长,产品矩阵也在同步成长。' },
{ icon: 'package', title: '自研产品矩阵=生态', desc: '不同于单点工具型产品,5 大赛道 × 8+ 自研产品从第一天就按"生态协同"设计——交叉获客成本天然更低。' },
{ icon: 'sparkles', title: '温暖科技差异化', desc: '我们不做冷漠的效率工具。"温暖"是品牌记忆点:从阿布 AI 的"情趣感"到听愿的"心愿互助",情感连接就是护城河。' },
{ icon: 'sprout', title: '责任=长期价值', desc: '绿色低碳·数字普惠·可信运营三条方向已写入产品研发流程,ESG 不是事后补写的报告,而是设计时的默认参数。' },
{ icon: 'heartHandshake', title: '把用户当朋友', desc: '产品的每一次迭代,都是因为身边朋友的真实需求。不是数据,是人心。' },
{ icon: 'network', title: '生态就是家', desc: '5 大赛道、8 款产品,像兄弟姐妹一样互相扶持,一起成长。' },
{ icon: 'sparkles', title: '科技要有温度', desc: '再好的技术,如果让人感到冰冷,就不是我们想做的。温暖,是底色。' },
],
},
roadmap: {
eyebrow: 'ROADMAP',
title: '我们正在走的路',
subtitle: '不讲故事,但我们会把每一步踏踏实实写出来',
items: [
{ period: 'PHASE 01 · 2024—2025', title: '生态骨架搭建', desc: '完成 5 大赛道 × 8+ 款产品的原型打磨,形成内容社交/职场服务/数字支付/人工智能/生活服务的完整骨架。', accent: true },
{ period: 'PHASE 02 · 2026', title: '种子用户验证', desc: '面向高校与青年社群做首轮真实用户验证,核心 KPI 是用户留存与口碑推荐率,而不是融资节奏。', accent: false },
{ period: 'PHASE 03 · 2027+', title: '规模化扩张', desc: '当 8 款产品的交叉推荐命中率、单用户多产品渗透率超过阈值,我们将启动跨城市、跨人群的规模化增长。', accent: false },
],
},
partnership: {
eyebrow: 'PARTNERSHIP',
title: '我们期待怎样的伙伴',
subtitle: '相比估值,我们更在意理念上的长期契合',
title: '我们在慢慢走的路',
subtitle: '不冲刺,不赶路,每一步都踩踏实',
items: [
{ icon: 'compass', title: '认同长期主义', desc: '不以"下一轮能否转手"为出发点,愿意和我们一起等 5—10 年,让生态价值慢慢落地。' },
{ icon: 'network', title: '能带资源,而不止是钱', desc: '产业资源、企业客户、高校渠道、政策资源……如果您的布局和我们 5 大赛道有化学反应,欢迎比一般天使更早加入。' },
{ icon: 'handshake', title: '不催"讲故事"', desc: '我们会按季度给您真实的留存、推荐率、交叉渗透率数据,但不做"包装故事"、不接"为了融资而融资"的建议。' },
{ period: '2024 — 2025', title: '搭好骨架', desc: '5 大赛道、8 款产品的原型都做出来了,像盖房子打好了地基。', accent: true },
{ period: '2026', title: '用心打磨', desc: '和真实用户一起,把每一款产品磨得更好用、更贴心。', accent: false },
{ period: '2027+', title: '慢慢长大', desc: '如果用户真的喜欢我们,再一步一步走到更多人的身边。', accent: false },
],
},
contact: {
eyebrow: 'GET IN TOUCH',
title: '和我们聊聊?',
desc: '即使您暂时不投,也欢迎带着理念和资源来喝杯咖啡。邮箱每周三由 IR 负责人亲自回复。',
title: '来聊聊吧',
desc: '不管您是不是投资者,都欢迎来找我们聊聊。一杯咖啡的时间,也许就是一段缘分的开始。',
email: 'ir@baskbuddy.com',
cta: '发邮件给 IR 团队',
cta: '发邮件打声招呼',
or: '或者',
contactPage: '先看联系我们 →',
contactPage: '看看我们的故事 →',
},
},
footer: {

14
src/seo/Seo.tsx

@ -11,17 +11,17 @@ interface SeoProps {
}
const DEFAULT_DESC_ZH =
'BaskBuddy 巴适伙伴(上海)科技有限公司 — 以温暖科技连接美好生活,四大赛道覆盖内容社交、职场服务、数字支付、人工智能';
'BaskBuddy 巴适伙伴(上海)科技有限公司 — 以温暖科技连接美好生活,五大赛道覆盖内容社交、职场服务、数字支付、人工智能、生活服务';
const DEFAULT_DESC_EN =
'BaskBuddy (Bashi Partners Shanghai) — Connecting beautiful life with warm technology. Four tracks: Content & Social, Career Services, Digital Payment, Artificial Intelligence';
'BaskBuddy (Bashi Partners Shanghai) — Connecting beautiful life with warm technology. Five tracks: Content & Social, Career Services, Digital Payment, Artificial Intelligence, Life Services';
const DEFAULT_DESC_HK =
'BaskBuddy 巴適夥伴(上海)科技有限公司 — 以溫暖科技連接美好生活,四大賽道覆蓋內容社交、職場服務、數位支付、人工智能';
'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';
const DEFAULT_KW_HK =
'巴適夥伴,BaskBuddy,數位生活服務,內容社交,職場服務,數位支付,人工智能,ICIDP,企業官網,上海科技公司';
'巴適夥伴,BaskBuddy,數字生活服務,內容社交,職場服務,數字支付,人工智能,ICIDP,企業官網,上海科技公司';
function setMeta(uniqueAttr: string, attrs: Record<string, string>, content: string) {
const selector = `meta[${uniqueAttr}]`;
@ -125,9 +125,9 @@ export default function Seo({ title, description, keywords, locale, ogImageOverr
email: 'baskbuddy@163.com',
address: {
'@type': 'PostalAddress',
streetAddress: '康宁路288弄2号410室',
addressLocality: '上海市',
addressRegion: '静安区',
streetAddress: locale === 'en' ? 'Room 410, No.2, Ln.288, Kangning Rd' : '康宁路288弄2号410室',
addressLocality: locale === 'en' ? 'Jing\'an, Shanghai' : '上海市静安区',
addressRegion: locale === 'en' ? 'Shanghai' : '静安区',
addressCountry: 'CN',
},
sameAs: [],

95
src/styles/global.css

@ -2468,3 +2468,98 @@ footer a {
.eco-node-count { min-width: 18px; height: 18px; font-size: var(--fs-micro); }
.eco-lens-btn { padding: 0.4rem 0.85rem; }
}
/* ================================================================
投资者页面专属动画
================================================================ */
/* Hero 区浮动渐变球 */
.ir-orb {
filter: blur(60px);
opacity: 0.45;
will-change: transform;
}
.ir-orb-1 {
background: color-mix(in oklch, var(--brand-accent) 35%, transparent);
animation: ir-orb-float-1 22s ease-in-out infinite;
}
.ir-orb-2 {
background: color-mix(in oklch, var(--brand-accent-deep) 25%, transparent);
animation: ir-orb-float-2 28s ease-in-out infinite;
}
.ir-orb-3 {
background: color-mix(in oklch, var(--brand-accent) 20%, transparent);
animation: ir-orb-float-1 34s ease-in-out infinite reverse;
}
@keyframes ir-orb-float-1 {
0%, 100% { transform: translate(0, 0) scale(1); }
50% { transform: translate(30px, -20px) scale(1.12); }
}
@keyframes ir-orb-float-2 {
0%, 100% { transform: translate(0, 0) scale(1); }
50% { transform: translate(-25px, 30px) scale(0.92); }
}
/* 统计图标微浮动 */
.ir-icon-float {
animation: ir-icon-bob 3s ease-in-out infinite;
}
@keyframes ir-icon-bob {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-4px); }
}
/* 卡片悬停提升 */
.ir-card-hover {
transition: transform 0.35s cubic-bezier(0.22, 1, 0.36, 1),
box-shadow 0.35s cubic-bezier(0.22, 1, 0.36, 1),
border-color 0.35s ease;
}
.ir-card-hover:hover {
transform: translateY(-6px);
box-shadow: 0 20px 40px -16px color-mix(in oklch, var(--brand-accent) 20%, transparent);
}
/* 路线图节点脉冲 */
.ir-roadmap-node {
animation: ir-node-pulse 2.8s ease-in-out infinite;
}
@keyframes ir-node-pulse {
0%, 100% { box-shadow: 0 10px 24px -8px color-mix(in oklch, var(--brand-accent) 45%, transparent); }
50% { box-shadow: 0 14px 32px -6px color-mix(in oklch, var(--brand-accent) 60%, transparent); }
}
/* CTA 区微光扫过 */
.ir-cta-shimmer {
position: absolute;
inset: 0;
background: linear-gradient(
115deg,
transparent 30%,
color-mix(in oklch, var(--brand-accent) 12%, transparent) 50%,
transparent 70%
);
transform: translateX(-100%);
animation: ir-shimmer 6s ease-in-out infinite;
pointer-events: none;
}
@keyframes ir-shimmer {
0%, 60% { transform: translateX(-100%); }
80% { transform: translateX(100%); }
100% { transform: translateX(100%); }
}
/* 尊重减少动效偏好 */
@media (prefers-reduced-motion: reduce) {
.ir-orb,
.ir-icon-float,
.ir-roadmap-node,
.ir-cta-shimmer {
animation: none !important;
}
.ir-card-hover {
transition: none !important;
transform: none !important;
}
}

Loading…
Cancel
Save