index-light.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>提案标题 · 客户名</title>
  7. <link rel="stylesheet" href="../shared/design-system-light.css">
  8. <style>
  9. /* 本文件中的样式是对 design-system-light.css token 的组合,不新增色值 */
  10. body { margin:0; font-family: var(--font-body); background: var(--bg-0); color: var(--text-1); overflow: hidden; }
  11. .deck { width:100%; height:100vh; }
  12. .chapter-bar { position:fixed; top:0; left:0; right:0; height:44px; background:var(--bg-0); border-bottom:1px solid var(--border); display:flex; align-items:center; gap:12px; padding:0 24px; z-index:100; font-size:0.8rem; }
  13. .ch-item { cursor:pointer; color:var(--text-3); padding:4px 8px; border-radius:var(--radius-sm); }
  14. .ch-item.active,.ch-item:hover { color:var(--primary-dark); background:var(--primary-subtle); }
  15. .ch-sep { color:var(--border-strong); }
  16. main.deck { padding-top:44px; height:calc(100vh - 44px); overflow-y: scroll; scroll-snap-type: y proximity; }
  17. section.report-section, section.cover-slide, section.chapter-divider { min-height: calc(100vh - 44px); scroll-snap-align: start; }
  18. /* Cover */
  19. .cover-slide { background: linear-gradient(135deg, var(--bg-1) 0%, var(--bg-0) 100%); display:flex; flex-direction:column; align-items:center; justify-content:center; padding:60px 40px; text-align:center; }
  20. .cover-slide .eyebrow { font-size:0.8rem; font-weight:600; letter-spacing:0.1em; color:var(--primary-dark); text-transform:uppercase; margin-bottom:16px; }
  21. .cover-slide .hero-title { font-size:clamp(2.5rem,5vw,4.5rem); font-weight:900; line-height:1.1; margin:0 0 24px; color:var(--text-1); }
  22. .cover-slide .subtitle { font-size:clamp(1rem,1.5vw,1.2rem); color:var(--text-2); max-width:600px; margin:0 auto 40px; line-height:1.6; }
  23. .cover-stats { display:flex; gap:40px; justify-content:center; flex-wrap:wrap; margin-top:24px; }
  24. .cover-stat { text-align:center; }
  25. .cover-stat .num { font-size:clamp(1.8rem,3vw,2.8rem); font-weight:900; color:var(--primary-dark); }
  26. .cover-stat .lbl { font-size:0.8rem; color:var(--text-3); margin-top:4px; }
  27. /* Report section */
  28. .report-section { padding:80px 40px; background:var(--bg-0); }
  29. .section-inner { max-width:1100px; margin:0 auto; }
  30. .section-eyebrow { font-size:0.75rem; font-weight:700; letter-spacing:0.12em; color:var(--primary-dark); text-transform:uppercase; margin-bottom:12px; }
  31. .section-title { font-size:clamp(1.8rem,3vw,2.6rem); font-weight:800; margin:0 0 16px; }
  32. .section-sub { font-size:clamp(0.9rem,1.2vw,1rem); color:var(--text-2); max-width:700px; line-height:1.75; margin-bottom:40px; }
  33. .cards-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(240px,1fr)); gap:20px; margin-top:32px; }
  34. .card { background:var(--bg-1); border-radius:var(--radius-md); padding:24px; border:1px solid var(--border); }
  35. .card .k { font-weight:700; font-size:1rem; margin-bottom:8px; color:var(--text-1); }
  36. .card .v { font-size:0.9rem; color:var(--text-2); line-height:1.6; }
  37. /* Chapter divider */
  38. .chapter-divider { background:var(--text-1); color:white; display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center; padding:60px 40px; }
  39. .chapter-divider .ch-num { font-size:0.75rem; font-weight:700; letter-spacing:0.2em; color:var(--primary); text-transform:uppercase; margin-bottom:16px; }
  40. .chapter-divider h2 { font-size:clamp(2rem,4vw,3.5rem); font-weight:900; margin:0; }
  41. /* Bottom nav */
  42. .bottom-nav { position:fixed; bottom:0; left:0; right:0; height:48px; background:var(--bg-0); border-top:1px solid var(--border); display:flex; align-items:center; justify-content:space-between; padding:0 24px; z-index:100; }
  43. .bottom-nav button { background:none; border:none; cursor:pointer; color:var(--text-2); font-size:0.85rem; padding:6px 12px; border-radius:var(--radius-sm); }
  44. .bottom-nav button:hover { background:var(--bg-1); color:var(--text-1); }
  45. #progress-line { position:fixed; bottom:48px; left:0; height:2px; background:var(--primary); transition:width 0.3s; z-index:101; }
  46. </style>
  47. </head>
  48. <body>
  49. <div class="chapter-bar" id="chapterBar">
  50. <span class="ch-item active" data-ch="0">封面</span>
  51. <span class="ch-sep">|</span>
  52. <span class="ch-item" data-ch="1">现状诊断</span>
  53. <span class="ch-sep">|</span>
  54. <span class="ch-item" data-ch="2">价值路径</span>
  55. <span class="ch-sep">|</span>
  56. <span class="ch-item" data-ch="3">行动建议</span>
  57. </div>
  58. <main class="deck" id="deck">
  59. <!-- 封面 -->
  60. <section class="cover-slide" id="ch0">
  61. <div class="eyebrow">AI 落地咨询 · Fmode 团队</div>
  62. <h1 class="hero-title">客户名称<br>AI 就绪度评估与<br>价值路径规划</h1>
  63. <p class="subtitle">基于深度访谈与数据分析,识别 AI 落地的最高价值入口</p>
  64. <div class="cover-stats">
  65. <div class="cover-stat">
  66. <div class="num" data-count="5" data-suffix="+">0+</div>
  67. <div class="lbl">深度访谈</div>
  68. </div>
  69. <div class="cover-stat">
  70. <div class="num" data-count="3" data-suffix="个">0个</div>
  71. <div class="lbl">P0 优先场景</div>
  72. </div>
  73. <div class="cover-stat">
  74. <div class="num" data-count="90" data-suffix="天">0天</div>
  75. <div class="lbl">陪跑计划</div>
  76. </div>
  77. </div>
  78. </section>
  79. <!-- 章节分隔 -->
  80. <section class="chapter-divider" id="ch1-div">
  81. <div class="ch-num">01</div>
  82. <h2>现状诊断</h2>
  83. </section>
  84. <!-- 诊断内容 -->
  85. <section class="report-section" id="ch1">
  86. <div class="section-inner">
  87. <div class="section-eyebrow">Diagnosis</div>
  88. <h2 class="section-title">核心挑战与机会</h2>
  89. <p class="section-sub">基于访谈洞察,识别三个核心卡点与对应机会。每个建议均有访谈原话支撑。</p>
  90. <div class="cards-grid">
  91. <div class="card">
  92. <div class="k" style="color:var(--qw1-rose)">卡点 01</div>
  93. <div class="v">「这里填写客户原话」——受访者角色,访谈日期<br><br>核心问题:...</div>
  94. </div>
  95. <div class="card">
  96. <div class="k" style="color:var(--qw1-rose)">卡点 02</div>
  97. <div class="v">「这里填写客户原话」——受访者角色,访谈日期<br><br>核心问题:...</div>
  98. </div>
  99. <div class="card">
  100. <div class="k" style="color:var(--df-blue)">机会 01</div>
  101. <div class="v">核心机会描述...<br><br>价值潜力:高 / 实施难度:低</div>
  102. </div>
  103. </div>
  104. </div>
  105. </section>
  106. <!-- 价值路径 -->
  107. <section class="chapter-divider" id="ch2-div">
  108. <div class="ch-num">02</div>
  109. <h2>价值路径</h2>
  110. </section>
  111. <section class="report-section" id="ch2">
  112. <div class="section-inner">
  113. <div class="section-eyebrow">Value Path</div>
  114. <h2 class="section-title">90 天价值路径</h2>
  115. <p class="section-sub">M1 打底 → M2 规模化 → M3 系统化。每个里程碑有明确 OKR 与成功标准。</p>
  116. <div class="cards-grid">
  117. <div class="card">
  118. <div class="k" style="color:var(--qw2-teal)">M1 · 打底期</div>
  119. <div class="v">目标:1 个 AI 工作流在生产运行<br>关键任务:...<br>成功标准:...</div>
  120. </div>
  121. <div class="card">
  122. <div class="k" style="color:var(--df-blue)">M2 · 规模化期</div>
  123. <div class="v">目标:3 个场景稳定运行<br>关键任务:...<br>成功标准:...</div>
  124. </div>
  125. <div class="card">
  126. <div class="k" style="color:var(--qw3-green)">M3 · 系统化期</div>
  127. <div class="v">目标:交付评估报告 + 下步规划<br>关键任务:...<br>成功标准:...</div>
  128. </div>
  129. </div>
  130. </div>
  131. </section>
  132. <!-- 行动建议 -->
  133. <section class="chapter-divider" id="ch3-div">
  134. <div class="ch-num">03</div>
  135. <h2>行动建议</h2>
  136. </section>
  137. <section class="report-section" id="ch3">
  138. <div class="section-inner">
  139. <div class="section-eyebrow">Next Steps</div>
  140. <h2 class="section-title">本周就能启动的三件事</h2>
  141. <p class="section-sub">Quick Win 路径:最小成本验证 AI 价值,建立团队信心,然后推动规模化。</p>
  142. <div class="cards-grid">
  143. <div class="card">
  144. <div class="k">第一步</div>
  145. <div class="v">具体行动描述...<br>负责人:<br>完成时间:</div>
  146. </div>
  147. <div class="card">
  148. <div class="k">第二步</div>
  149. <div class="v">具体行动描述...<br>负责人:<br>完成时间:</div>
  150. </div>
  151. <div class="card">
  152. <div class="k">第三步</div>
  153. <div class="v">具体行动描述...<br>负责人:<br>完成时间:</div>
  154. </div>
  155. </div>
  156. </div>
  157. </section>
  158. </main>
  159. <div class="bottom-nav">
  160. <button onclick="navPrev()">← 上一章</button>
  161. <div style="font-size:0.8rem;color:var(--text-3)" id="bn-info">封面 · 1/8</div>
  162. <button onclick="navNext()">下一章 →</button>
  163. </div>
  164. <div id="progress-line" style="width:0%"></div>
  165. <script src="../shared/canvas-scale.js"></script>
  166. <script>
  167. // Sections and chapter navigation
  168. const sections = Array.from(document.querySelectorAll('section'));
  169. const chItems = document.querySelectorAll('.ch-item');
  170. const deck = document.getElementById('deck');
  171. const progressLine = document.getElementById('progress-line');
  172. const bnInfo = document.getElementById('bn-info');
  173. function updateNav() {
  174. const scrollTop = deck.scrollTop;
  175. const total = deck.scrollHeight - deck.clientHeight;
  176. const pct = total > 0 ? (scrollTop / total * 100).toFixed(1) : 0;
  177. progressLine.style.width = pct + '%';
  178. // Find active section
  179. let active = 0;
  180. sections.forEach((s, i) => {
  181. if (s.offsetTop - deck.scrollTop <= deck.clientHeight / 2) active = i;
  182. });
  183. bnInfo.textContent = (sections[active] ? sections[active].querySelector('h1,h2')?.textContent?.slice(0,12) || '' : '') + ' · ' + (active+1) + '/' + sections.length;
  184. }
  185. deck.addEventListener('scroll', updateNav);
  186. // Counter animation
  187. document.querySelectorAll('[data-count]').forEach(el => {
  188. const target = parseInt(el.dataset.count);
  189. const suffix = el.dataset.suffix || '';
  190. let start = null;
  191. const obs = new IntersectionObserver(entries => {
  192. if (entries[0].isIntersecting) {
  193. const animate = (ts) => {
  194. if (!start) start = ts;
  195. const prog = Math.min((ts - start) / 1000, 1);
  196. el.textContent = Math.floor(prog * target) + suffix;
  197. if (prog < 1) requestAnimationFrame(animate);
  198. };
  199. requestAnimationFrame(animate);
  200. obs.disconnect();
  201. }
  202. });
  203. obs.observe(el);
  204. });
  205. // Chapter navigation via bar
  206. chItems.forEach(item => {
  207. item.addEventListener('click', () => {
  208. const ch = item.dataset.ch;
  209. const target = document.getElementById(`ch${ch}`);
  210. if (target) target.scrollIntoView({ behavior: 'smooth' });
  211. });
  212. });
  213. function navNext() {
  214. const scrollTop = deck.scrollTop;
  215. for (const s of sections) {
  216. if (s.offsetTop > scrollTop + 10) { s.scrollIntoView({ behavior: 'smooth' }); break; }
  217. }
  218. }
  219. function navPrev() {
  220. const scrollTop = deck.scrollTop;
  221. for (let i = sections.length - 1; i >= 0; i--) {
  222. if (sections[i].offsetTop < scrollTop - 10) { sections[i].scrollIntoView({ behavior: 'smooth' }); break; }
  223. }
  224. }
  225. updateNav();
  226. </script>
  227. </body>
  228. </html>