Step2.tsx 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. import './step2.css';
  2. import SharedHeader from '../components/SharedHeader';
  3. import StepProgress from '../components/StepProgress';
  4. import { useTranslation } from 'react-i18next';
  5. import { useNavigate } from 'react-router-dom';
  6. import { useState, useEffect } from 'react';
  7. const Step2 = () => {
  8. const { t, i18n } = useTranslation();
  9. const navigate = useNavigate();
  10. // Theme state - Default to DARK if not specified, because Step 2's soul is cyber-dark
  11. const savedTheme = localStorage.getItem('theme');
  12. const [isDark, setIsDark] = useState(savedTheme ? savedTheme === 'dark' : true);
  13. useEffect(() => {
  14. localStorage.setItem('theme', isDark ? 'dark' : 'light');
  15. }, [isDark]);
  16. const toggleTheme = () => setIsDark(!isDark);
  17. const toggleLang = () => i18n.changeLanguage(i18n.language === 'zh' ? 'en' : 'zh');
  18. const currentLang = i18n.language === 'zh' ? 'zh' : 'en';
  19. // CSS Variables for Theming
  20. const themeStyles = {
  21. '--bg-color': isDark ? '#050505' : '#ffffff',
  22. '--text-primary': isDark ? '#ffffff' : '#000000',
  23. '--text-secondary': isDark ? '#888888' : '#666666',
  24. '--accent-color': isDark ? '#ccff00' : '#000000', // Black accent in light mode for brutalist look
  25. '--grid-line': isDark ? '#222222' : '#e5e5e5',
  26. '--card-bg': isDark ? '#050505' : '#f5f5f5',
  27. '--card-border': isDark ? '#333333' : '#e5e5e5',
  28. } as React.CSSProperties;
  29. // Helper for scrolling
  30. const scrollToId = (id: string) => {
  31. const element = document.getElementById(id);
  32. if (element) {
  33. element.scrollIntoView({ behavior: 'smooth' });
  34. }
  35. };
  36. return (
  37. <div style={themeStyles} className="step2-page min-h-screen flex flex-col selection:bg-[var(--accent-color)] selection:text-[var(--bg-color)] transition-colors duration-500">
  38. {/* 顶部导航 */}
  39. <SharedHeader
  40. theme={isDark ? 'dark' : 'light'}
  41. onThemeToggle={toggleTheme}
  42. onLangToggle={toggleLang}
  43. currentLang={currentLang}
  44. />
  45. <div className="bg-[var(--bg-color)] pt-24 pb-4">
  46. <StepProgress currentStep={2} theme={isDark ? 'dark' : 'light'} />
  47. </div>
  48. {/* 跑马灯 */}
  49. <div className="mt-20 marquee-container mono">
  50. <div className="marquee-content">
  51. AI GENERATED CONTENT /// DIGITAL ART /// INTERACTIVE INSTALLATIONS /// DATA ASSETS /// VIRTUAL HUMANS /// IMMERSIVE EXPERIENCE /// MAKE IT FUN ///
  52. AI GENERATED CONTENT /// DIGITAL ART /// INTERACTIVE INSTALLATIONS /// DATA ASSETS /// VIRTUAL HUMANS /// IMMERSIVE EXPERIENCE /// MAKE IT FUN ///
  53. </div>
  54. </div>
  55. {/* Hero Section */}
  56. <header className="relative min-h-[80vh] flex items-center justify-center bg-grid border-b border-[var(--grid-line)]">
  57. <div className="text-center px-4 max-w-5xl mx-auto z-10">
  58. <div className="mono text-[var(--accent-color)] mb-4 text-sm md:text-base tracking-widest">
  59. {t('step2.label')}
  60. </div>
  61. <h1 className="text-5xl md:text-8xl font-black mb-6 leading-tight glitch-wrapper">
  62. <span className="glitch" data-text={t('step2.hero_title')}>{t('step2.hero_title')}</span>
  63. </h1>
  64. <p className="text-[var(--text-secondary)] text-lg md:text-2xl max-w-3xl mx-auto font-light leading-relaxed">
  65. {t('step2.hero_desc')}<span className="text-[var(--text-primary)] font-bold border-b-2 border-[var(--accent-color)]">{t('step2.hero_desc_highlight')}</span>{t('step2.hero_desc_2')}
  66. </p>
  67. <div className="mt-12 flex flex-col md:flex-row gap-6 justify-center">
  68. <button onClick={() => scrollToId('services')} className="px-8 py-4 bg-[var(--text-primary)] text-[var(--bg-color)] font-bold hover:bg-[var(--accent-color)] hover:text-[var(--bg-color)] transition-colors mono border border-[var(--text-primary)] hover:border-[var(--accent-color)]">
  69. {t('step2.btn_explore')}
  70. </button>
  71. <button onClick={() => scrollToId('contact')} className="px-8 py-4 border border-[var(--text-primary)] text-[var(--text-primary)] hover:border-[var(--accent-color)] hover:text-[var(--accent-color)] transition-colors mono">
  72. {t('step2.btn_contact')}
  73. </button>
  74. </div>
  75. </div>
  76. {/* 装饰性背景元素 */}
  77. <div className="absolute top-1/4 left-10 w-24 h-24 border border-[var(--grid-line)] rounded-full flex items-center justify-center animate-spin-slow opacity-50">
  78. <div className="w-2 h-2 bg-[var(--accent-color)] rounded-full"></div>
  79. </div>
  80. </header>
  81. {/* 核心理念 */}
  82. <section className="py-20 px-6 border-b border-[var(--grid-line)]">
  83. <div className="max-w-7xl mx-auto grid grid-cols-1 md:grid-cols-2 gap-12 items-center">
  84. <div>
  85. <h2 className="text-3xl md:text-4xl font-bold mb-6">{t('step2.philosophy_title')}<span className="text-[var(--accent-color)]">{t('step2.philosophy_highlight')}</span></h2>
  86. <div className="space-y-6 text-[var(--text-secondary)]">
  87. <p>
  88. {t('step2.philosophy_desc')}<strong>{t('step2.philosophy_bold')}</strong>。
  89. </p>
  90. <ul className="space-y-4 mono text-sm">
  91. {(t('step2.philosophy_list', { returnObjects: true }) as string[]).map((item, i) => (
  92. <li key={i} className="flex items-center">
  93. <span className="w-2 h-2 bg-[var(--accent-color)] mr-3"></span>
  94. {item}
  95. </li>
  96. ))}
  97. </ul>
  98. </div>
  99. </div>
  100. <div className="relative h-64 md:h-96 bg-[var(--card-bg)] border border-[var(--card-border)] p-4 font-mono text-xs text-[var(--accent-color)] overflow-hidden">
  101. <div className="absolute inset-0 opacity-20 bg-[url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0IiBoZWlnaHQ9IjQiPgo8cmVjdCB3aWR0aD0iNCIgaGVpZ2h0PSI0IiBmaWxsPSIjODg4Ii8+Cjwvc3ZnPg==')]"></div>
  102. <p>{t('step2.terminal.init')}</p>
  103. <p>{t('step2.terminal.load')}</p>
  104. <p>{t('step2.terminal.gen')}</p>
  105. <p>{t('step2.terminal.opt')}</p>
  106. <p className="mt-4 text-[var(--text-primary)]">
  107. {t('step2.terminal.status')}<span className="text-[var(--accent-color)]">{t('step2.terminal.online')}</span>
  108. </p>
  109. {/* 模拟代码滚动效果 */}
  110. <div className="absolute bottom-4 right-4 w-4 h-4 bg-[var(--accent-color)] cursor-blink"></div>
  111. </div>
  112. </div>
  113. </section>
  114. {/* 服务清单 */}
  115. <section id="services" className="py-20 px-6 bg-[var(--bg-color)]">
  116. <div className="max-w-7xl mx-auto">
  117. <div className="mb-16">
  118. <span className="mono text-[var(--accent-color)] text-sm">{t('step2.services_menu')}</span>
  119. <h2 className="text-4xl md:text-5xl font-bold mt-2">{t('step2.services_title')}</h2>
  120. </div>
  121. <div className="grid grid-cols-1 md:grid-cols-3 gap-6">
  122. {/* Service 01 */}
  123. <div className="service-card p-8 bg-[var(--card-bg)] border border-[var(--card-border)] flex flex-col justify-between h-full">
  124. <div>
  125. <div className="text-4xl mb-6 opacity-30 font-black">01</div>
  126. <h3 className="text-xl font-bold mb-4 text-[var(--text-primary)]">{t('step2.services.s1.title')}</h3>
  127. <p className="text-[var(--text-secondary)] text-sm leading-relaxed mb-6">
  128. {t('step2.services.s1.desc')}
  129. </p>
  130. <ul className="text-sm text-[var(--text-secondary)] space-y-2 mono border-t border-[var(--card-border)] pt-4">
  131. {(t('step2.services.s1.list', { returnObjects: true }) as string[]).map((item, i) => (
  132. <li key={i}>{item}</li>
  133. ))}
  134. </ul>
  135. </div>
  136. </div>
  137. {/* Service 02 */}
  138. <div className="service-card p-8 bg-[var(--card-bg)] border border-[var(--card-border)] flex flex-col justify-between h-full">
  139. <div>
  140. <div className="text-4xl mb-6 opacity-30 font-black">02</div>
  141. <h3 className="text-xl font-bold mb-4 text-[var(--text-primary)]">{t('step2.services.s2.title')}</h3>
  142. <p className="text-[var(--text-secondary)] text-sm leading-relaxed mb-6">
  143. {t('step2.services.s2.desc')}
  144. </p>
  145. <ul className="text-sm text-[var(--text-secondary)] space-y-2 mono border-t border-[var(--card-border)] pt-4">
  146. {(t('step2.services.s2.list', { returnObjects: true }) as string[]).map((item, i) => (
  147. <li key={i}>{item}</li>
  148. ))}
  149. </ul>
  150. </div>
  151. </div>
  152. {/* Service 03 */}
  153. <div className="service-card p-8 bg-[var(--card-bg)] border border-[var(--card-border)] flex flex-col justify-between h-full">
  154. <div>
  155. <div className="text-4xl mb-6 opacity-30 font-black">03</div>
  156. <h3 className="text-xl font-bold mb-4 text-[var(--text-primary)]">{t('step2.services.s3.title')}</h3>
  157. <p className="text-[var(--text-secondary)] text-sm leading-relaxed mb-6">
  158. {t('step2.services.s3.desc')}
  159. </p>
  160. <ul className="text-sm text-[var(--text-secondary)] space-y-2 mono border-t border-[var(--card-border)] pt-4">
  161. {(t('step2.services.s3.list', { returnObjects: true }) as string[]).map((item, i) => (
  162. <li key={i}>{item}</li>
  163. ))}
  164. </ul>
  165. </div>
  166. </div>
  167. </div>
  168. </div>
  169. </section>
  170. {/* 案例展示 (Abstract) */}
  171. <section className="py-20 px-6 border-t border-[var(--grid-line)]">
  172. <div className="max-w-7xl mx-auto">
  173. <div className="flex flex-col md:flex-row justify-between items-end mb-12">
  174. <h2 className="text-4xl font-bold">{t('step2.lab_title')}</h2>
  175. <span className="mono text-[var(--text-secondary)]">{t('step2.lab_subtitle')}</span>
  176. </div>
  177. <div className="grid grid-cols-1 md:grid-cols-2 gap-8">
  178. {/* Case 1 */}
  179. <div className="group cursor-pointer">
  180. <div className="h-64 bg-[var(--card-bg)] border border-[var(--card-border)] overflow-hidden relative">
  181. <div className="absolute inset-0 flex items-center justify-center text-[var(--text-primary)] text-6xl font-black opacity-10 group-hover:scale-110 transition-transform duration-500">
  182. {t('step2.cases.c1.bg_text')}
  183. </div>
  184. <div className="absolute bottom-0 left-0 p-4 w-full bg-gradient-to-t from-[var(--bg-color)] to-transparent">
  185. <div className="text-[var(--accent-color)] mono text-xs mb-1">{t('step2.cases.c1.date')}</div>
  186. <h3 className="text-xl font-bold">{t('step2.cases.c1.title')}</h3>
  187. </div>
  188. </div>
  189. <p className="mt-4 text-[var(--text-secondary)] text-sm">
  190. {t('step2.cases.c1.desc')}
  191. </p>
  192. </div>
  193. {/* Case 2 */}
  194. <div className="group cursor-pointer">
  195. <div className="h-64 bg-[var(--card-bg)] border border-[var(--card-border)] overflow-hidden relative">
  196. <div className="absolute inset-0 flex items-center justify-center text-[var(--text-primary)] text-6xl font-black opacity-10 group-hover:scale-110 transition-transform duration-500">
  197. {t('step2.cases.c2.bg_text')}
  198. </div>
  199. <div className="absolute bottom-0 left-0 p-4 w-full bg-gradient-to-t from-[var(--bg-color)] to-transparent">
  200. <div className="text-[var(--accent-color)] mono text-xs mb-1">{t('step2.cases.c2.date')}</div>
  201. <h3 className="text-xl font-bold">{t('step2.cases.c2.title')}</h3>
  202. </div>
  203. </div>
  204. <p className="mt-4 text-[var(--text-secondary)] text-sm">
  205. {t('step2.cases.c2.desc')}
  206. </p>
  207. </div>
  208. </div>
  209. </div>
  210. </section>
  211. {/* Footer / Contact */}
  212. <footer id="contact" className="py-20 px-6 bg-[var(--accent-color)] text-[var(--bg-color)]">
  213. <div className="max-w-7xl mx-auto flex flex-col md:flex-row justify-between items-start">
  214. <div>
  215. <h2 className="text-5xl md:text-7xl font-black mb-6 tracking-tighter whitespace-pre-line">{t('step2.footer_title')}</h2>
  216. <p className="text-lg font-medium max-w-md whitespace-pre-line">
  217. {t('step2.footer_desc')}
  218. </p>
  219. </div>
  220. <div className="mt-12 md:mt-0 flex flex-col space-y-4 text-right">
  221. <div className="flex justify-end gap-3 mb-8">
  222. <button
  223. onClick={() => navigate('/step1')}
  224. className="px-6 py-3 border border-[var(--bg-color)] text-[var(--bg-color)] hover:bg-[var(--bg-color)] hover:text-[var(--accent-color)] font-bold transition-colors"
  225. >
  226. ← PREV: STEP 1
  227. </button>
  228. <button
  229. onClick={() => navigate('/step3')}
  230. className="px-6 py-3 bg-[var(--bg-color)] text-[var(--accent-color)] hover:opacity-90 font-bold transition-colors"
  231. >
  232. NEXT: STEP 3 →
  233. </button>
  234. </div>
  235. <a href={`mailto:${t('step2.footer_contact')}`} className="text-2xl font-bold underline hover:opacity-70">{t('step2.footer_contact')}</a>
  236. <div className="mono text-sm font-bold">{t('step2.footer_loc')}</div>
  237. <div className="mt-8 pt-8 border-t border-[var(--bg-color)]/20">
  238. <p className="text-sm">© 2026 杭州纯粹的玩品牌科技有限公司.</p>
  239. <p className="text-sm">All Rights Reserved.</p>
  240. </div>
  241. </div>
  242. </div>
  243. </footer>
  244. </div>
  245. );
  246. };
  247. export default Step2;