BrandView.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. <script setup lang="ts">
  2. // P 品牌信息 —— 文案来源 docs/品牌信息.md
  3. import { computed } from 'vue'
  4. import { useI18n } from 'vue-i18n'
  5. const { t } = useI18n()
  6. const heroStats = computed(() => [
  7. { value: '2023', label: t('brand.statFounded') },
  8. { value: t('brand.statRegisteredValue'), label: t('brand.statRegistered') },
  9. { value: t('brand.statOperationValue'), label: t('brand.statOperation') },
  10. { value: t('brand.statLicenseValue'), label: t('brand.statLicense') },
  11. ])
  12. const teamCores = computed(() => [
  13. {
  14. title: t('brand.teamTechTitle'),
  15. desc: t('brand.teamTechDesc'),
  16. icon: '⚙️',
  17. },
  18. {
  19. title: t('brand.teamTradingTitle'),
  20. desc: t('brand.teamTradingDesc'),
  21. icon: '📈',
  22. },
  23. ])
  24. const flagshipProducts = computed(() => [
  25. {
  26. tag: t('brand.product1Tag'),
  27. title: t('brand.product1Title'),
  28. desc: t('brand.product1Desc'),
  29. highlights: [t('brand.product1Highlight1'), t('brand.product1Highlight2'), t('brand.product1Highlight3')],
  30. },
  31. {
  32. tag: t('brand.product2Tag'),
  33. title: t('brand.product2Title'),
  34. desc: t('brand.product2Desc'),
  35. highlights: [t('brand.product2Highlight1'), t('brand.product2Highlight2'), t('brand.product2Highlight3')],
  36. },
  37. {
  38. tag: t('brand.product3Tag'),
  39. title: t('brand.product3Title'),
  40. desc: t('brand.product3Desc'),
  41. highlights: [t('brand.product3Highlight1'), t('brand.product3Highlight2'), t('brand.product3Highlight3')],
  42. },
  43. ])
  44. const metrics = computed(() => [
  45. { value: '10,000+', label: t('brand.metric1Label'), note: t('brand.metric1Note') },
  46. { value: '$10M+', label: t('brand.metric2Label'), note: t('brand.metric2Note') },
  47. { value: '50+', label: t('brand.metric3Label'), note: t('brand.metric3Note') },
  48. { value: '24/7', label: t('brand.metric4Label'), note: t('brand.metric4Note') },
  49. ])
  50. const roadmap = computed(() => [
  51. { year: t('brand.rmPhase1'), title: t('brand.rm1Title'), desc: t('brand.rm1Desc') },
  52. { year: t('brand.rmPhase2'), title: t('brand.rm2Title'), desc: t('brand.rm2Desc') },
  53. { year: t('brand.rmPhase3'), title: t('brand.rm3Title'), desc: t('brand.rm3Desc') },
  54. { year: t('brand.rmPhase4'), title: t('brand.rm4Title'), desc: t('brand.rm4Desc') },
  55. ])
  56. const securityPillars = computed(() => [
  57. { title: t('brand.security1Title'), desc: t('brand.security1Desc') },
  58. { title: t('brand.security2Title'), desc: t('brand.security2Desc') },
  59. { title: t('brand.security3Title'), desc: t('brand.security3Desc') },
  60. { title: t('brand.security4Title'), desc: t('brand.security4Desc') },
  61. ])
  62. </script>
  63. <template>
  64. <main class="page-main">
  65. <!-- ── Hero ────────────────────────────────────────── -->
  66. <section class="brand-hero">
  67. <div class="hero-glow" aria-hidden="true" />
  68. <div class="page-container hero-inner">
  69. <p class="hero-eyebrow">{{ t('brand.heroEyebrow') }}</p>
  70. <h1 class="hero-title">
  71. iBit<br>
  72. <span class="hero-title-sub">{{ t('brand.heroTitleSub') }}</span>
  73. </h1>
  74. <p class="hero-desc">{{ t('brand.heroDesc') }}</p>
  75. <ul class="hero-stats">
  76. <li v-for="s in heroStats" :key="s.label">
  77. <span class="stat-value">{{ s.value }}</span>
  78. <span class="stat-label">{{ s.label }}</span>
  79. </li>
  80. </ul>
  81. </div>
  82. </section>
  83. <!-- ── 起源与初心 ──────────────────────────────────── -->
  84. <section class="brand-section">
  85. <div class="page-container content">
  86. <h2 class="section-heading">
  87. <span class="bracket">[</span> {{ t('brand.originTitle') }} <span class="bracket">]</span>
  88. </h2>
  89. <p class="section-p">{{ t('brand.originPara1') }}</p>
  90. <p class="section-p">{{ t('brand.originPara2') }}</p>
  91. <p class="section-p">{{ t('brand.originPara3') }}</p>
  92. </div>
  93. </section>
  94. <!-- ── 双核团队 ────────────────────────────────────── -->
  95. <section class="brand-section brand-section--alt">
  96. <div class="page-container content">
  97. <h2 class="section-heading">
  98. <span class="bracket">[</span> {{ t('brand.teamTitle') }} <span class="bracket">]</span>
  99. </h2>
  100. <div class="team-grid">
  101. <div v-for="t in teamCores" :key="t.title" class="team-card">
  102. <div class="team-icon">{{ t.icon }}</div>
  103. <h3 class="team-title">{{ t.title }}</h3>
  104. <p class="team-desc">{{ t.desc }}</p>
  105. </div>
  106. </div>
  107. <p class="section-p team-quote">{{ t('brand.teamQuote') }}</p>
  108. </div>
  109. </section>
  110. <!-- ── 王牌产品 ────────────────────────────────────── -->
  111. <section class="brand-section">
  112. <div class="page-container content">
  113. <h2 class="section-heading">
  114. <span class="bracket">[</span> {{ t('brand.productsTitle') }} <span class="bracket">]</span>
  115. </h2>
  116. <div class="product-list">
  117. <article v-for="p in flagshipProducts" :key="p.title" class="product-item">
  118. <div class="product-tag">{{ p.tag }}</div>
  119. <h3 class="product-title">{{ p.title }}</h3>
  120. <p class="product-desc">{{ p.desc }}</p>
  121. <ul class="product-highlights">
  122. <li v-for="h in p.highlights" :key="h">
  123. <span class="dot">·</span>{{ h }}
  124. </li>
  125. </ul>
  126. </article>
  127. </div>
  128. </div>
  129. </section>
  130. <!-- ── 数据表现 ────────────────────────────────────── -->
  131. <section class="brand-section brand-section--alt">
  132. <div class="page-container content">
  133. <h2 class="section-heading">
  134. <span class="bracket">[</span> {{ t('brand.metricsTitle') }} <span class="bracket">]</span>
  135. </h2>
  136. <p class="section-p">{{ t('brand.metricsDesc') }}</p>
  137. <div class="metric-grid">
  138. <div v-for="m in metrics" :key="m.label" class="metric-card">
  139. <div class="metric-value">{{ m.value }}</div>
  140. <div class="metric-label">{{ m.label }}</div>
  141. <div class="metric-note">{{ m.note }}</div>
  142. </div>
  143. </div>
  144. </div>
  145. </section>
  146. <!-- ── 愿景与 Roadmap ──────────────────────────────── -->
  147. <section class="brand-section">
  148. <div class="page-container content">
  149. <h2 class="section-heading">
  150. <span class="bracket">[</span> {{ t('brand.visionTitle') }} <span class="bracket">]</span>
  151. </h2>
  152. <p class="section-p">{{ t('brand.visionDesc') }}</p>
  153. <h3 class="sub-heading">{{ t('brand.roadmapTitle') }}</h3>
  154. <ol class="roadmap">
  155. <li v-for="(r, i) in roadmap" :key="r.title">
  156. <div class="rm-index">{{ String(i + 1).padStart(2, '0') }}</div>
  157. <div class="rm-content">
  158. <p class="rm-phase">{{ r.year }}</p>
  159. <p class="rm-title">{{ r.title }}</p>
  160. <p class="rm-desc">{{ r.desc }}</p>
  161. </div>
  162. </li>
  163. </ol>
  164. </div>
  165. </section>
  166. <!-- ── 安全合规 ────────────────────────────────────── -->
  167. <section class="brand-section brand-section--alt">
  168. <div class="page-container content">
  169. <h2 class="section-heading">
  170. <span class="bracket">[</span> {{ t('brand.securityTitle') }} <span class="bracket">]</span>
  171. </h2>
  172. <p class="section-p">{{ t('brand.securityDesc') }}</p>
  173. <div class="security-grid">
  174. <div v-for="s in securityPillars" :key="s.title" class="security-card">
  175. <h4 class="security-title">{{ s.title }}</h4>
  176. <p class="security-desc">{{ s.desc }}</p>
  177. </div>
  178. </div>
  179. </div>
  180. </section>
  181. <!-- ── CTA ─────────────────────────────────────────── -->
  182. <section class="brand-cta">
  183. <div class="page-container cta-inner">
  184. <h2 class="cta-title">{{ t('brand.ctaTitle') }}</h2>
  185. <p class="cta-desc">{{ t('brand.ctaDesc') }}</p>
  186. <div class="cta-row">
  187. <RouterLink to="/download" class="cta-btn cta-btn--primary">
  188. <span class="bracket">[</span> {{ t('brand.ctaBtn1') }} <span class="bracket">]</span>
  189. </RouterLink>
  190. <RouterLink to="/about" class="cta-btn">
  191. <span class="bracket">[</span> {{ t('brand.ctaBtn2') }} <span class="bracket">]</span>
  192. </RouterLink>
  193. </div>
  194. </div>
  195. </section>
  196. </main>
  197. </template>
  198. <style scoped>
  199. /* ── Hero ── */
  200. .brand-hero {
  201. position: relative;
  202. padding: var(--space-16) 0 var(--space-12);
  203. background: var(--color-bg-primary);
  204. border-bottom: 1px solid var(--color-border);
  205. overflow: hidden;
  206. }
  207. .hero-glow {
  208. position: absolute;
  209. left: 50%;
  210. top: -20%;
  211. width: 900px;
  212. height: 600px;
  213. transform: translateX(-50%);
  214. background: radial-gradient(ellipse at center, rgba(240,185,11,0.2) 0%, transparent 60%);
  215. pointer-events: none;
  216. }
  217. .hero-inner { position: relative; z-index: 1; max-width: 1000px; }
  218. .hero-eyebrow {
  219. font-size: var(--text-caption);
  220. letter-spacing: 4px;
  221. color: var(--color-primary);
  222. font-weight: var(--fw-semibold);
  223. margin-bottom: var(--space-4);
  224. }
  225. .hero-title {
  226. font-size: 56px;
  227. font-weight: var(--fw-bold);
  228. color: var(--color-text-primary);
  229. line-height: 1.2;
  230. margin-bottom: var(--space-5);
  231. }
  232. .hero-title-sub {
  233. display: block;
  234. font-size: 24px;
  235. font-weight: var(--fw-semibold);
  236. color: var(--color-text-secondary);
  237. margin-top: var(--space-2);
  238. }
  239. .hero-desc {
  240. font-size: var(--text-body);
  241. color: var(--color-text-secondary);
  242. line-height: 1.85;
  243. margin-bottom: var(--space-10);
  244. max-width: 820px;
  245. }
  246. .hero-stats {
  247. display: grid;
  248. grid-template-columns: repeat(4, minmax(0, 1fr));
  249. gap: var(--space-4);
  250. list-style: none;
  251. padding: 0;
  252. }
  253. .hero-stats li {
  254. display: flex;
  255. flex-direction: column;
  256. gap: var(--space-1);
  257. padding: var(--space-5) var(--space-4);
  258. background: var(--color-bg-card);
  259. border: 1px solid var(--color-border);
  260. border-left: 2px solid var(--color-primary);
  261. border-radius: var(--radius-md);
  262. }
  263. .stat-value {
  264. font-size: 20px;
  265. font-weight: var(--fw-bold);
  266. color: var(--color-text-primary);
  267. }
  268. .stat-label {
  269. font-size: var(--text-caption);
  270. color: var(--color-text-muted);
  271. }
  272. /* ── Section 通用 ── */
  273. .brand-section {
  274. padding: var(--space-16) 0;
  275. background: var(--color-bg-primary);
  276. }
  277. .brand-section--alt { background: var(--color-bg-secondary); }
  278. .content { max-width: 1080px; }
  279. .section-heading {
  280. display: inline-flex;
  281. align-items: center;
  282. gap: var(--space-2);
  283. font-size: var(--text-h2);
  284. font-weight: var(--fw-bold);
  285. color: var(--color-text-primary);
  286. margin-bottom: var(--space-8);
  287. }
  288. .bracket { color: var(--color-primary); font-weight: var(--fw-bold); }
  289. .section-p {
  290. font-size: var(--text-body);
  291. color: var(--color-text-secondary);
  292. line-height: 1.9;
  293. margin-bottom: var(--space-4);
  294. max-width: 960px;
  295. }
  296. .sub-heading {
  297. font-size: var(--text-body);
  298. font-weight: var(--fw-semibold);
  299. color: var(--color-text-primary);
  300. margin-top: var(--space-8);
  301. margin-bottom: var(--space-5);
  302. }
  303. /* ── 团队双核 ── */
  304. .team-grid {
  305. display: grid;
  306. grid-template-columns: 1fr 1fr;
  307. gap: var(--space-6);
  308. margin-bottom: var(--space-6);
  309. }
  310. .team-card {
  311. padding: var(--space-6);
  312. background: var(--color-bg-card);
  313. border: 1px solid var(--color-border);
  314. border-radius: var(--radius-lg);
  315. transition: border-color 0.2s;
  316. }
  317. .team-card:hover { border-color: var(--color-primary); }
  318. .team-icon {
  319. font-size: 28px;
  320. width: 56px;
  321. height: 56px;
  322. display: flex;
  323. align-items: center;
  324. justify-content: center;
  325. background: rgba(240, 185, 11, 0.1);
  326. border-radius: var(--radius-md);
  327. margin-bottom: var(--space-4);
  328. }
  329. .team-title {
  330. font-size: 20px;
  331. font-weight: var(--fw-bold);
  332. color: var(--color-text-primary);
  333. margin-bottom: var(--space-3);
  334. }
  335. .team-desc {
  336. font-size: var(--text-small);
  337. color: var(--color-text-secondary);
  338. line-height: 1.8;
  339. }
  340. .team-quote {
  341. margin-top: var(--space-4);
  342. font-style: italic;
  343. color: var(--color-text-secondary);
  344. padding-left: var(--space-4);
  345. border-left: 2px solid var(--color-primary);
  346. }
  347. /* ── 王牌产品 ── */
  348. .product-list {
  349. display: flex;
  350. flex-direction: column;
  351. gap: var(--space-6);
  352. }
  353. .product-item {
  354. padding: var(--space-6);
  355. background: var(--color-bg-card);
  356. border: 1px solid var(--color-border);
  357. border-radius: var(--radius-lg);
  358. transition: border-color 0.2s, transform 0.2s;
  359. }
  360. .product-item:hover {
  361. border-color: var(--color-primary);
  362. transform: translateY(-2px);
  363. }
  364. .product-tag {
  365. display: inline-block;
  366. padding: 2px var(--space-3);
  367. background: rgba(240, 185, 11, 0.12);
  368. color: var(--color-primary);
  369. font-size: var(--text-caption);
  370. font-weight: var(--fw-semibold);
  371. border-radius: var(--radius-sm);
  372. margin-bottom: var(--space-3);
  373. }
  374. .product-title {
  375. font-size: 22px;
  376. font-weight: var(--fw-bold);
  377. color: var(--color-text-primary);
  378. margin-bottom: var(--space-3);
  379. }
  380. .product-desc {
  381. font-size: var(--text-body);
  382. color: var(--color-text-secondary);
  383. line-height: 1.85;
  384. margin-bottom: var(--space-4);
  385. }
  386. .product-highlights {
  387. display: flex;
  388. flex-wrap: wrap;
  389. gap: var(--space-2) var(--space-4);
  390. list-style: none;
  391. padding: 0;
  392. }
  393. .product-highlights li {
  394. font-size: var(--text-small);
  395. color: var(--color-text-primary);
  396. display: inline-flex;
  397. align-items: center;
  398. }
  399. .product-highlights .dot {
  400. color: var(--color-primary);
  401. margin-right: var(--space-1);
  402. font-weight: var(--fw-bold);
  403. }
  404. /* ── 数据 ── */
  405. .metric-grid {
  406. display: grid;
  407. grid-template-columns: repeat(4, minmax(0, 1fr));
  408. gap: var(--space-4);
  409. margin-top: var(--space-6);
  410. }
  411. .metric-card {
  412. padding: var(--space-6);
  413. background: var(--color-bg-card);
  414. border: 1px solid var(--color-border);
  415. border-radius: var(--radius-lg);
  416. text-align: center;
  417. }
  418. .metric-value {
  419. font-size: 32px;
  420. font-weight: var(--fw-bold);
  421. color: var(--color-primary);
  422. font-variant-numeric: tabular-nums;
  423. line-height: 1.1;
  424. }
  425. .metric-label {
  426. font-size: var(--text-body);
  427. font-weight: var(--fw-semibold);
  428. color: var(--color-text-primary);
  429. margin-top: var(--space-2);
  430. }
  431. .metric-note {
  432. font-size: var(--text-caption);
  433. color: var(--color-text-muted);
  434. margin-top: var(--space-1);
  435. }
  436. /* ── Roadmap ── */
  437. .roadmap {
  438. display: grid;
  439. grid-template-columns: 1fr 1fr;
  440. gap: var(--space-5);
  441. list-style: none;
  442. padding: 0;
  443. }
  444. .roadmap li {
  445. display: flex;
  446. gap: var(--space-4);
  447. padding: var(--space-5);
  448. background: var(--color-bg-card);
  449. border: 1px solid var(--color-border);
  450. border-radius: var(--radius-lg);
  451. }
  452. .rm-index {
  453. font-size: 28px;
  454. font-weight: var(--fw-bold);
  455. color: var(--color-primary);
  456. font-variant-numeric: tabular-nums;
  457. line-height: 1;
  458. flex-shrink: 0;
  459. }
  460. .rm-phase {
  461. font-size: var(--text-caption);
  462. color: var(--color-primary);
  463. font-weight: var(--fw-semibold);
  464. letter-spacing: 1px;
  465. }
  466. .rm-title {
  467. font-size: var(--text-body);
  468. font-weight: var(--fw-semibold);
  469. color: var(--color-text-primary);
  470. margin-top: var(--space-1);
  471. margin-bottom: var(--space-2);
  472. }
  473. .rm-desc {
  474. font-size: var(--text-small);
  475. color: var(--color-text-secondary);
  476. line-height: 1.75;
  477. }
  478. /* ── 安全支柱 ── */
  479. .security-grid {
  480. display: grid;
  481. grid-template-columns: repeat(2, minmax(0, 1fr));
  482. gap: var(--space-4);
  483. margin-top: var(--space-6);
  484. }
  485. .security-card {
  486. padding: var(--space-5);
  487. background: var(--color-bg-card);
  488. border: 1px solid var(--color-border);
  489. border-radius: var(--radius-md);
  490. }
  491. .security-title {
  492. font-size: var(--text-body);
  493. font-weight: var(--fw-semibold);
  494. color: var(--color-text-primary);
  495. margin-bottom: var(--space-2);
  496. }
  497. .security-desc {
  498. font-size: var(--text-small);
  499. color: var(--color-text-secondary);
  500. line-height: 1.75;
  501. }
  502. /* ── CTA ── */
  503. .brand-cta {
  504. padding: var(--space-16) 0;
  505. background: radial-gradient(ellipse at center, rgba(240,185,11,0.08) 0%, transparent 70%),
  506. var(--color-bg-primary);
  507. border-top: 1px solid var(--color-border);
  508. }
  509. .cta-inner { text-align: center; max-width: 760px; }
  510. .cta-title {
  511. font-size: 32px;
  512. font-weight: var(--fw-bold);
  513. color: var(--color-text-primary);
  514. margin-bottom: var(--space-4);
  515. }
  516. .cta-desc {
  517. font-size: var(--text-body);
  518. color: var(--color-text-secondary);
  519. line-height: 1.85;
  520. margin-bottom: var(--space-8);
  521. }
  522. .cta-row {
  523. display: flex;
  524. justify-content: center;
  525. gap: var(--space-4);
  526. flex-wrap: wrap;
  527. }
  528. .cta-btn {
  529. display: inline-flex;
  530. align-items: center;
  531. gap: var(--space-2);
  532. padding: var(--space-3) var(--space-6);
  533. border: 1px solid var(--color-primary);
  534. border-radius: var(--radius-md);
  535. color: var(--color-primary);
  536. font-size: var(--text-body);
  537. font-weight: var(--fw-medium);
  538. text-decoration: none;
  539. transition: background 0.2s;
  540. }
  541. .cta-btn:hover { background: rgba(240,185,11,0.1); }
  542. .cta-btn--primary {
  543. background: var(--color-primary);
  544. color: #000;
  545. }
  546. .cta-btn--primary:hover { opacity: 0.92; background: var(--color-primary); }
  547. /* ── 移动端 ── */
  548. @media (max-width: 960px) {
  549. .hero-title { font-size: 40px; }
  550. .hero-title-sub { font-size: 18px; }
  551. .metric-grid { grid-template-columns: 1fr 1fr; }
  552. .roadmap { grid-template-columns: 1fr; }
  553. .team-grid { grid-template-columns: 1fr; }
  554. .security-grid { grid-template-columns: 1fr; }
  555. }
  556. @media (max-width: 768px) {
  557. .brand-hero { padding: var(--space-10) 0; }
  558. .hero-title { font-size: 32px; }
  559. .hero-stats { grid-template-columns: 1fr 1fr; }
  560. .brand-section { padding: var(--space-10) 0; }
  561. .brand-cta { padding: var(--space-10) 0; }
  562. .cta-title { font-size: 24px; }
  563. }
  564. </style>