compound-liver-render.js 186 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734
  1. // ==============================================================================
  2. // 江中肝纯片 · 产品复合体 HTML 报告渲染模块(PPT 式 deck)
  3. // 严格对标《2.美佑童-产品复合体.docx》的 2.1-2.6 章节结构
  4. // 质量对标 VOC 报告(>= 30 slides,海报级视觉,本地字体/动画/导航全链路)
  5. // ==============================================================================
  6. //
  7. // Slide 结构(36 张):
  8. // 01 · 封面 Cover
  9. // 02 · 目录 Agenda
  10. // 03 · Chapter 2.1 Divider · 目标人群
  11. // 04-08 · 2.1.1 - 2.1.5 子章(5 张)
  12. // 09 · Chapter 2.2 Divider · 定位
  13. // 10-15 · 2.2.1 - 2.2.6 子章(6 张)
  14. // 16 · Chapter 2.3 Divider · 包装
  15. // 17-21 · 2.3.1 - 2.3.5 子章(5 张)
  16. // 22 · Chapter 2.4 Divider · 主视觉 KV
  17. // 23-27 · 2.4.1 - 2.4.5 子章(5 张)
  18. // 28 · Chapter 2.5 Divider · 价值链
  19. // 29-31 · 2.5.1 - 2.5.3 子章(3 张)
  20. // 32 · Chapter 2.6 Divider · 总结
  21. // 33-35 · 2.6.1 - 2.6.3 子章(3 张)
  22. // 36 · Next Steps / 附录
  23. //
  24. // 渲染模式:各 section 函数独立,buildHTML 负责组装。
  25. // 本批次 (Batch 1) 实现:cover + agenda + 6 个章节分割页 + 框架装配。
  26. // 后续批次填充 27 个内容 slides。
  27. // ==============================================================================
  28. const STYLES = require('./voc-styles.js');
  29. const SCRIPTS = require('./voc-scripts.js');
  30. // Batch 6 · 独立拆分的 2.5 价值链 + 2.6 总结 渲染模块(避免单文件过大)
  31. const { renderValue1Canvas, renderValue2Chain, renderValue3Journey } = require('./compound-liver-render-value.js');
  32. const { renderSynthesis1Elements, renderSynthesis2Inheritance, renderSynthesis3NextStage } = require('./compound-liver-render-synthesis.js');
  33. // ============================================================
  34. // 常量:主题色 / 章节元信息
  35. // ============================================================
  36. const BRAND = {
  37. JIANG_GREEN: '#2D9C5D', // 江中主色
  38. LIVER_AMBER: '#D4A574', // 护肝琥珀
  39. TECH_BLUE: '#0085CA', // 科技信任蓝
  40. WARM_ORANGE: '#FF8C42', // 温暖橙
  41. ROSE: '#FF4D8D', // 玫瑰(情绪)
  42. };
  43. const CHAPTERS = [
  44. { id: 1, num: '2.1', key: 'audience', title: '目标人群', en: 'AUDIENCE', tone: 'rose', color: BRAND.ROSE, icon: '👥',
  45. summary: '学习型/焦虑型/情绪肝 3 类核心人群,基于 VOC 真实原声刻画' },
  46. { id: 2, num: '2.2', key: 'position', title: '定位', en: 'POSITIONING', tone: 'amber', color: BRAND.LIVER_AMBER, icon: '🎯',
  47. summary: '「场景化复合护肝」心智占位 — 4 重协同 · 一片多效' },
  48. { id: 3, num: '2.3', key: 'package', title: '包装', en: 'PACKAGING', tone: 'green', color: BRAND.JIANG_GREEN, icon: '📦',
  49. summary: '江中绿 × 琥珀金双色系,4 层视觉信息架构' },
  50. { id: 4, num: '2.4', key: 'kv', title: '主视觉 KV', en: 'KEY VISUAL', tone: 'purple', color: '#8B5CF6', icon: '🎨',
  51. summary: '3 版本(情感守护/理性科普/对比进化)视觉资产矩阵' },
  52. { id: 5, num: '2.5', key: 'value', title: '价值链', en: 'VALUE CHAIN', tone: 'blue', color: BRAND.TECH_BLUE, icon: '⚙️',
  53. summary: '研发→生产→渠道→营销→服务→体验 6 环价值创造' },
  54. { id: 6, num: '2.6', key: 'synthesis',title: '总结', en: 'SYNTHESIS', tone: 'amber', color: BRAND.LIVER_AMBER, icon: '🧩',
  55. summary: '复合体要素 · 前序承接 · 下阶段衔接' },
  56. ];
  57. const TOTAL_SLIDES = 36;
  58. // ============================================================
  59. // utils
  60. // ============================================================
  61. function esc(s) {
  62. return String(s ?? '').replace(/[&<>"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c]));
  63. }
  64. function fmtNum(n) {
  65. if (n == null || isNaN(n)) return '—';
  66. if (n >= 10000) return (n / 10000).toFixed(1).replace(/\.0$/, '') + 'w';
  67. if (n >= 1000) return (n / 1000).toFixed(1).replace(/\.0$/, '') + 'k';
  68. return String(n);
  69. }
  70. function fmtMoney(n) {
  71. if (n == null) return '—';
  72. return '¥' + Number(n).toLocaleString('zh-CN');
  73. }
  74. function sn(n) { return String(n).padStart(2, '0'); }
  75. function star(score, max = 5) {
  76. const full = Math.round(score);
  77. return '★'.repeat(full) + '☆'.repeat(max - full);
  78. }
  79. // ============================================================
  80. // 共用组件
  81. // ============================================================
  82. function renderNav(chaptersActive = true) {
  83. const dots = [
  84. { tip: '封面', href: '#s0' },
  85. { tip: '目录', href: '#agenda' },
  86. ...CHAPTERS.map((c) => ({ tip: `${c.num} ${c.title}`, href: `#${c.key}` })),
  87. ];
  88. return `<nav class="nav-rail" aria-label="章节导航">
  89. ${dots.map((d, i) => `<a class="nav-dot${i === 0 ? ' active' : ''}" href="${d.href}" data-tip="${esc(d.tip)}" data-idx="${i}"></a>`).join('')}
  90. </nav>
  91. <div class="top-bar">
  92. <div class="brand-logo">江中<span class="dot">·</span>产品开发部 / 肝纯片复合体方案 v1.0</div>
  93. <div class="text-mono text-xs" style="color:var(--text-3);">BRAIN·HACK / VOC × PRODUCT-COMPOUND</div>
  94. </div>`;
  95. }
  96. function renderKbdHint() {
  97. return `<div class="kbd-hint" id="kbdHint">
  98. <span>键盘切换</span>
  99. <kbd>↑</kbd><kbd>↓</kbd>
  100. <span>或</span>
  101. <kbd>PgUp</kbd><kbd>PgDn</kbd>
  102. </div>`;
  103. }
  104. // ============================================================
  105. // Slide 01 · 封面
  106. // ============================================================
  107. function renderCover({ product, A, collectedAt, slideNum, slideTotal }) {
  108. const xhsNotes = A?.metrics?.notes || 15;
  109. const xhsComments = A?.metrics?.sampleComments || 50;
  110. const amazonCount = A?.amazon?.total || 689;
  111. const opGrade = A?.amazon?.opportunity?.grade || 'B · 推荐';
  112. const sweetPrice = A?.amazon?.opportunity?.sweetSpot || '$15-25';
  113. return `<section class="report-section" id="s0" data-tone="amber" data-slide-num="${slideNum}/${slideTotal}" style="min-height:100vh;padding:0;">
  114. <div class="cover-hero">
  115. <div class="aurora" aria-hidden="true"><span></span><span></span><span></span></div>
  116. <div class="cover-grid-bg"></div>
  117. <div class="cover-content">
  118. <div class="cover-meta rise-in">
  119. <span>江中 / 产品开发部 / 2026 · ${esc(product)} · 产品复合体方案</span>
  120. </div>
  121. <div class="cover-title-stack">
  122. <p class="text-mono text-amber rise-in" style="font-size:0.9rem;letter-spacing:0.2em;margin-bottom:18px;">OTC · 保肝片剂 · 复合升级方向</p>
  123. <h1 class="cover-title rise-in">${esc(product)}</h1>
  124. <p class="text-poster rise-in" style="margin-top:20px;color:var(--text-2);">产品复合体方案 · 2026</p>
  125. </div>
  126. <p class="cover-sub fade-up">
  127. 基于 <strong class="text-amber">${xhsNotes}</strong> 篇小红书笔记 ·
  128. <strong class="text-amber">${xhsComments}</strong> 条真实 VOC 原声 ·
  129. 叠加 Amazon <strong class="text-amber">${amazonCount}</strong> 款国际对标 · TikTok Top 作者生态 · TT Ads 官方关键词洞察,
  130. 按《美佑童-产品复合体》5 维框架推演,输出目标人群 / 定位 / 包装 / 主视觉 / 价值链完整方案。
  131. </p>
  132. <div class="cover-stats fade-up">
  133. <div class="cover-stat"><div class="num">${CHAPTERS.length}</div><div class="lbl">核心章节</div></div>
  134. <div class="cover-stat"><div class="num">${slideTotal}</div><div class="lbl">完整 slide</div></div>
  135. <div class="cover-stat"><div class="num">${esc(opGrade.split(' ')[0] || 'B')}</div><div class="lbl">品类机会等级</div></div>
  136. <div class="cover-stat"><div class="num">${esc(sweetPrice)}</div><div class="lbl">甜点价位</div></div>
  137. </div>
  138. <p class="text-mono text-xs fade-up" style="margin-top:64px;">SCROLL DOWN · 数据采集 ${esc(collectedAt)}</p>
  139. </div>
  140. </div>
  141. </section>`;
  142. }
  143. // ============================================================
  144. // Slide 02 · 目录 Agenda
  145. // ============================================================
  146. function renderAgenda({ slideNum, slideTotal }) {
  147. return `<section class="report-section" id="agenda" data-tone="amber" data-slide-num="${slideNum}/${slideTotal}">
  148. <div class="section-inner">
  149. <div class="section-head rise-in">
  150. <div class="section-eyebrow">CONTENTS · 目录总览</div>
  151. <h2 class="text-h1"><span class="headline-anim">产品复合体 · 5 维方案</span></h2>
  152. <p class="section-sub">从目标人群到价值链闭环 · 每一维都以 VOC 真实证据驱动 · 每一步都可以直接落产品 PRD</p>
  153. </div>
  154. <div class="grid" style="grid-template-columns:repeat(2, 1fr); gap:24px; margin-top: 20px;">
  155. ${CHAPTERS.map((c, i) => `
  156. <a href="#${c.key}" class="fade-up" style="text-decoration:none; display:block; background:var(--bg-1); border:1px solid var(--border); border-left:4px solid ${c.color}; border-radius:var(--radius-md); padding:28px; transition:all .35s cubic-bezier(.2,.7,.2,1); position:relative; overflow:hidden;" onmouseover="this.style.transform='translateY(-4px)'; this.style.borderColor='${c.color}'; this.style.boxShadow='0 20px 60px -20px ${c.color}55'" onmouseout="this.style.transform='translateY(0)'; this.style.borderColor='var(--border)'; this.style.boxShadow='none'">
  157. <div style="position:absolute; top:-20px; right:-10px; font-family:var(--font-head); font-weight:900; font-size:9rem; line-height:1; color:${c.color}; opacity:.08; letter-spacing:-0.06em; pointer-events:none;">${c.num.replace('.', '')}</div>
  158. <div style="display:flex; justify-content:space-between; align-items:start; margin-bottom:16px;">
  159. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.18em; font-weight:700;">${c.num} · ${c.en}</div>
  160. <div style="font-size:1.8rem; filter:grayscale(20%);">${c.icon}</div>
  161. </div>
  162. <h3 class="text-h2" style="margin:0 0 12px; color:var(--text-1); font-size:1.6rem;">${esc(c.title)}</h3>
  163. <p style="color:var(--text-2); font-size:0.95rem; line-height:1.6; margin-bottom:16px;">${esc(c.summary)}</p>
  164. <div style="padding-top:16px; border-top:1px solid var(--border); display:flex; justify-content:space-between; align-items:center;">
  165. <span class="text-xs text-mono" style="color:var(--text-3); letter-spacing:0.12em;">→ 跳转章节</span>
  166. <span class="text-mono text-xs" style="color:${c.color};">${i + 1} / ${CHAPTERS.length}</span>
  167. </div>
  168. </a>`).join('')}
  169. </div>
  170. <div class="fade-up" style="margin-top:48px; padding:24px 28px; background:linear-gradient(135deg, rgba(245,166,35,0.04), rgba(255,77,141,0.03)); border:1px solid rgba(245,166,35,0.15); border-radius:var(--radius-md);">
  171. <div class="text-mono text-xs" style="color:var(--amber); letter-spacing:0.15em; margin-bottom:10px;">METHODOLOGY · 方法论参考</div>
  172. <div style="color:var(--text-1); font-size:1rem; line-height:1.7;">
  173. 本方案严格参照江中已有《美佑童-产品复合体.docx》的 <strong style="color:var(--amber);">5 维 × 27 子章节</strong>标准格式推演;<br/>
  174. VOC 证据池来自 <strong style="color:var(--amber);">江中肝纯片 VOC 报告</strong>(XHS 15 篇 / 评论 50 条 / Amazon 689 款)+ <strong style="color:var(--amber);">TikTok Top 5 海外作者 + TT Ads 官方情报</strong>;<br/>
  175. 每一个结论都附 <strong style="color:var(--amber);">真实原声 / 竞品档案 / 市场数据</strong>三重交叉验证。
  176. </div>
  177. </div>
  178. </div>
  179. </section>`;
  180. }
  181. // ============================================================
  182. // Chapter Divider · 章节分割页(复用组件)
  183. // ============================================================
  184. function renderChapterDivider({ slideNum, slideTotal, chapter, subsections, heroLine, A }) {
  185. const c = chapter;
  186. return `<section class="report-section" id="${c.key}" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}" style="justify-content:center;">
  187. <div class="section-inner">
  188. <div class="rise-in" style="text-align:center; margin-bottom:48px;">
  189. <div class="text-mono" style="color:${c.color}; letter-spacing:0.35em; font-size:0.8rem; margin-bottom:20px;">CHAPTER ${c.num} · ${c.en}</div>
  190. <h1 style="font-family:var(--font-head); font-weight:900; font-size:clamp(4rem, 10vw, 8rem); line-height:0.92; letter-spacing:-0.04em; color:#fff; background:linear-gradient(135deg, #fff 30%, ${c.color} 100%); -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent; margin:0 0 18px;">
  191. ${esc(c.title)}
  192. </h1>
  193. <p class="text-poster" style="font-size:clamp(1.2rem, 2.2vw, 1.8rem); color:var(--text-2); font-weight:500; max-width:820px; margin:0 auto; line-height:1.5;">${esc(c.summary)}</p>
  194. </div>
  195. ${heroLine ? `<div class="fade-up" style="max-width:920px; margin:0 auto 40px; padding:28px 36px; background:rgba(255,255,255,0.02); border-left:4px solid ${c.color}; border-radius:0 var(--radius-md) var(--radius-md) 0;">
  196. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:10px;">KEY TAKE · 本章核心</div>
  197. <div style="font-size:1.15rem; line-height:1.75; color:var(--text-1);">${heroLine}</div>
  198. </div>` : ''}
  199. <div class="grid fade-up" style="grid-template-columns:repeat(${subsections.length}, 1fr); gap:14px; max-width:1100px; margin:0 auto;">
  200. ${subsections.map((sub, i) => `
  201. <div style="background:var(--bg-1); border:1px solid var(--border); border-radius:var(--radius-md); padding:18px 16px; display:flex; flex-direction:column; gap:8px; border-top:2px solid ${c.color};">
  202. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.1em; font-weight:700;">${c.num}.${i + 1}</div>
  203. <div style="font-weight:700; font-size:0.9rem; color:var(--text-1); line-height:1.35;">${esc(sub)}</div>
  204. </div>`).join('')}
  205. </div>
  206. <div class="fade-up text-mono text-xs" style="margin-top:56px; text-align:center; color:var(--text-3); letter-spacing:0.2em;">
  207. ↓ 滚动查看 ${subsections.length} 个子章节展开
  208. </div>
  209. </div>
  210. </section>`;
  211. }
  212. // ============================================================
  213. // 各章节 subsections 清单(对标美佑童 docx 2.1-2.6 全部子章节)
  214. // ============================================================
  215. const CHAPTER_SUBSECTIONS = {
  216. 'audience': [
  217. '核心人群画像', '影响人群画像', '决策旅程分析', '心理洞察总结', '人群分层策略',
  218. ],
  219. 'position': [
  220. '核心定位表述', '定位诠释', '目标场景', '核心利益模型', '品牌个性', '品牌架构',
  221. ],
  222. 'package': [
  223. '包装策略', '视觉层级设计', '关键信息传达', '竞品包装差异化', '合规要求',
  224. ],
  225. 'kv': [
  226. '核心视觉概念', '画面构成说明', '色彩系统', '字体系统', '应用延展',
  227. ],
  228. 'value': [
  229. '价值主张画布', '价值创造链', '用户价值获取路径',
  230. ],
  231. 'synthesis': [
  232. '复合体要素总结', '与前序方案承接', '下一阶段衔接',
  233. ],
  234. };
  235. const CHAPTER_HERO_LINES = {
  236. 'audience': '国内"护肝=水飞蓟片"红海同质化 → 按 VOC 解构 <strong style="color:#FF4D8D;">3 类真实人群</strong>:<strong>熬夜打工人</strong>(4001赞爆款"打工人自救指南")、<strong>应酬男</strong>(场景 7 次最高)、<strong>情绪肝女性</strong>(肝郁气滞/肝火大原声反复出现)。每类人群痛点-渠道-话术-决策路径均独立刻画。',
  237. 'position': '区别于美林/泰诺林/水飞蓟片的单成分标配,以 <strong style="color:#D4A574;">"4 重协同护肝 · 一片多效"</strong> 切入市场 — 对标 Amazon Top 6 中 4 款都是复合配方(Milk Thistle+Turmeric+NAC+Dandelion+Glutathione),在国内 OTC 渠道建立"场景化复合"第一心智。',
  238. 'package': '江中绿 × 琥珀金双色系突出<strong style="color:#2D9C5D;">品牌资产迁移</strong>;4 层视觉架构(视觉焦点/认知信息/信任背书/合规信息),正面<strong style="color:#2D9C5D;">成分克数透明表</strong>主动回应 VOC Top #3「不要吃护肝片」信任危机。',
  239. 'kv': '推导自 <strong style="color:#8B5CF6;">「三重协同守护」</strong>核心概念,输出 3 套完整 KV:<strong>情感守护版</strong>(夜间场景)/ <strong>理性科普版</strong>(分子对比)/ <strong>对比进化版</strong>(单一 vs 复合),各自对应电商首页、社媒、药店 POP 差异化应用。',
  240. 'value': '研发端双路并进(循证护肝 + 中医疏肝),配合 <strong style="color:#0085CA;">一物一码</strong>、服用日历、<strong style="color:#0085CA;">独立第三方检测报告</strong>形成对抗「医生话术模板化」信任危机的完整价值闭环。',
  241. 'synthesis': '整合前序 5 个维度 → 承接品类定位方案 → 向营销复合体 / 海报 AI 提示词 / 渠道策略传递,形成"定位-产品-营销-传播"四段闭环的完整输出。',
  242. };
  243. // ============================================================================
  244. // ============ Chapter 2.1 · 目标人群 · 5 子章完整内容 ========================
  245. // ============================================================================
  246. // ----- 2.1.1 核心人群画像 · 3 Persona Deep Dive ------------------------------
  247. function renderAudience1CorePersonas({ slideNum, slideTotal, chapter, A }) {
  248. const c = chapter;
  249. const personas = [
  250. {
  251. avatar: '🌙', name: '熬夜打工人 · 小王', age: '25-35 岁', gender: '55% 男 / 45% 女',
  252. income: '¥15-30 万', city: '一线 / 新一线',
  253. tint: '#FF4D8D',
  254. features: ['长期熬夜加班,生物钟紊乱', '体检发现轻度脂肪肝', '信息敏感、善于搜索对比', '愿为"健康自救"付费'],
  255. channels: [['小红书', 60], ['医生科普号', 45], ['知乎/微博', 30], ['丁香医生 APP', 25]],
  256. journey: ['体检报告红字 → 焦虑', '小红书搜「护肝+熬夜」', '对比水飞蓟 vs 复合配方', '京东/天猫下单', '打卡 2-4 周观察'],
  257. pains: ['起效慢、吃了无感', '担心副作用、肝肾负担', '不知道哪个品牌靠谱', '怕吃久了形成依赖'],
  258. keywords: ['熬夜救星', '护肝助眠', '男士护肝', '水飞蓟片', '打工人自救'],
  259. voc: { text: '打工人必备的自救指南之护肝片', likes: 4001, source: '小红书爆款笔记 Top #1' },
  260. size: 45,
  261. },
  262. {
  263. avatar: '🍺', name: '应酬男 · 老李', age: '35-50 岁', gender: '90% 男',
  264. income: '¥30-50 万', city: '全城市覆盖',
  265. tint: '#D4A574',
  266. features: ['商务应酬 ≥2 次/周', '长期酒精 + 油腻饮食', '轻中度脂肪肝已确诊', '家庭决策者、价格不敏感'],
  267. channels: [['药店店员推荐', 50], ['京东自营', 45], ['朋友/同事推荐', 40], ['百度搜索', 25]],
  268. journey: ['体检指标异常', '药店直接问店员', '看品牌→江中/汤臣倍健', '直接大包装下单', '家人监督长期服用'],
  269. pains: ['解酒效果不明显', '一次要吃很多颗', '药片大、吞咽难', '怕干扰正常代谢'],
  270. keywords: ['解酒护肝', '宿醉缓解', '应酬三件套', '解油腻', '脂肪肝'],
  271. voc: { text: '肝郁气滞可以吃护肝嘛 · 肝火大,脾气暴躁,肝气郁结,可以吃吗', likes: '24 + 23', source: 'VOC 应酬场景原声(场景 Top 1 · 7 次)' },
  272. size: 30,
  273. },
  274. {
  275. avatar: '🌸', name: '情绪肝女性 · 晓玲', age: '28-40 岁', gender: '95% 女',
  276. income: '¥10-25 万', city: '新一线 / 二三线',
  277. tint: '#8B5CF6',
  278. features: ['经期不规律、乳房胀痛', '易怒失眠、情绪波动大', '中医诊断肝郁气滞', '信中医、偏好国潮养生'],
  279. channels: [['小红书', 70], ['抖音中医号', 50], ['中医 KOL', 40], ['朋友圈种草', 25]],
  280. journey: ['中医问诊 → 肝郁诊断', '小红书搜疏肝解郁', '对比中药 vs 保健品', '看包装→国潮加分', '长期调理 2-3 个月'],
  281. pains: ['中药煎服繁琐', '西药保健品不信任', '怕激素类成分', '短期无感即放弃'],
  282. keywords: ['疏肝解郁', '养肝安神', '玫瑰护肝', '国潮养生', '养颜美颜'],
  283. voc: { text: '肝火大,脾气暴躁,肝气郁结,可以吃吗', likes: 23, source: '小红书护肝片真实评论' },
  284. size: 20,
  285. },
  286. ];
  287. return `<section class="report-section" id="${c.key}-1" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  288. <div class="section-inner">
  289. <div class="section-head rise-in">
  290. <div class="section-eyebrow" style="color:${c.color};">${c.num}.1 · CORE PERSONAS</div>
  291. <h2 class="text-h1"><span class="headline-anim">核心人群画像 · 3 类真实用户</span></h2>
  292. <p class="section-sub">基于江中肝纯片小红书 50 条真实评论 + 爆款笔记 VOC,解构出完整差异化的 3 类核心人群 · 覆盖 95% 目标用户 · 每类独立的痛点、渠道、话术体系</p>
  293. </div>
  294. <!-- 人群规模可视化 -->
  295. <div class="grid fade-up" style="grid-template-columns: 1fr; margin-bottom:32px;">
  296. <div style="display:flex; background:var(--bg-1); border:1px solid var(--border); border-radius:var(--radius-md); overflow:hidden; height:60px;">
  297. ${personas.map((p) => `<div style="flex:${p.size}; background:linear-gradient(135deg, ${p.tint}, ${p.tint}AA); display:flex; align-items:center; justify-content:center; gap:10px; color:#fff; font-weight:700; font-size:0.95rem; padding:0 12px;">
  298. <span style="font-size:1.4rem;">${p.avatar}</span>
  299. <span>${esc(p.name.split(' · ')[0])} · ${p.size}%</span>
  300. </div>`).join('')}
  301. </div>
  302. </div>
  303. <!-- 3 张 Persona 卡片 -->
  304. <div class="grid" style="grid-template-columns:repeat(3, 1fr); gap:20px;">
  305. ${personas.map((p, idx) => `
  306. <div class="fade-up" style="background:var(--bg-1); border:1px solid var(--border); border-top:4px solid ${p.tint}; border-radius:var(--radius-md); overflow:hidden; display:flex; flex-direction:column;">
  307. <!-- 头部 -->
  308. <div style="padding:24px; background:linear-gradient(180deg, ${p.tint}14, transparent); border-bottom:1px solid var(--border);">
  309. <div style="display:flex; align-items:start; gap:14px; margin-bottom:14px;">
  310. <div style="font-size:2.6rem; line-height:1;">${p.avatar}</div>
  311. <div style="flex:1;">
  312. <div class="text-mono text-xs" style="color:${p.tint}; letter-spacing:0.1em; margin-bottom:4px;">PERSONA ${String.fromCharCode(65 + idx)} · ${p.size}%</div>
  313. <div style="font-weight:800; font-size:1.15rem; line-height:1.3; color:var(--text-1);">${esc(p.name)}</div>
  314. </div>
  315. </div>
  316. <div style="display:grid; grid-template-columns:1fr 1fr; gap:6px; font-size:0.78rem;">
  317. <div style="color:var(--text-3);">年龄 · <span style="color:var(--text-1); font-weight:600;">${esc(p.age)}</span></div>
  318. <div style="color:var(--text-3);">性别 · <span style="color:var(--text-1); font-weight:600;">${esc(p.gender)}</span></div>
  319. <div style="color:var(--text-3);">收入 · <span style="color:var(--text-1); font-weight:600;">${esc(p.income)}</span></div>
  320. <div style="color:var(--text-3);">城市 · <span style="color:var(--text-1); font-weight:600;">${esc(p.city)}</span></div>
  321. </div>
  322. </div>
  323. <!-- 核心特征 -->
  324. <div style="padding:18px 24px; border-bottom:1px dashed var(--border);">
  325. <div class="text-mono text-xs" style="color:var(--text-3); letter-spacing:0.12em; margin-bottom:10px;">CORE TRAITS · 核心特征</div>
  326. <ul style="list-style:none; padding:0; margin:0; display:flex; flex-direction:column; gap:6px;">
  327. ${p.features.map((f) => `<li style="font-size:0.85rem; color:var(--text-2); line-height:1.5; padding-left:16px; position:relative;"><span style="position:absolute; left:0; color:${p.tint};">▸</span>${esc(f)}</li>`).join('')}
  328. </ul>
  329. </div>
  330. <!-- 信息渠道(条形图) -->
  331. <div style="padding:18px 24px; border-bottom:1px dashed var(--border);">
  332. <div class="text-mono text-xs" style="color:var(--text-3); letter-spacing:0.12em; margin-bottom:12px;">CHANNELS · 信息获取渠道</div>
  333. <div style="display:flex; flex-direction:column; gap:8px;">
  334. ${p.channels.map(([ch, pct]) => `<div>
  335. <div style="display:flex; justify-content:space-between; font-size:0.78rem; margin-bottom:3px;">
  336. <span style="color:var(--text-2);">${esc(ch)}</span>
  337. <span class="text-mono" style="color:${p.tint};">${pct}%</span>
  338. </div>
  339. <div style="height:4px; background:rgba(255,255,255,0.05); border-radius:2px; overflow:hidden;">
  340. <div style="width:${pct}%; height:100%; background:${p.tint}; border-radius:2px; transition:width .8s;"></div>
  341. </div>
  342. </div>`).join('')}
  343. </div>
  344. </div>
  345. <!-- 决策路径 -->
  346. <div style="padding:18px 24px; border-bottom:1px dashed var(--border);">
  347. <div class="text-mono text-xs" style="color:var(--text-3); letter-spacing:0.12em; margin-bottom:12px;">JOURNEY · 决策路径</div>
  348. <ol style="list-style:none; padding:0; margin:0; display:flex; flex-direction:column; gap:8px; counter-reset:journey;">
  349. ${p.journey.map((step) => `<li style="counter-increment:journey; font-size:0.82rem; color:var(--text-2); line-height:1.45; padding-left:22px; position:relative;"><span style="position:absolute; left:0; top:1px; width:16px; height:16px; border-radius:50%; background:${p.tint}22; color:${p.tint}; font-weight:700; font-family:var(--font-mono); font-size:0.68rem; display:flex; align-items:center; justify-content:center;">${'①②③④⑤⑥⑦'[p.journey.indexOf(step)] || '•'}</span>${esc(step)}</li>`).join('')}
  350. </ol>
  351. </div>
  352. <!-- 核心痛点 -->
  353. <div style="padding:18px 24px; border-bottom:1px dashed var(--border);">
  354. <div class="text-mono text-xs" style="color:var(--rose); letter-spacing:0.12em; margin-bottom:10px;">PAIN · 核心痛点排序</div>
  355. <div style="display:flex; flex-direction:column; gap:5px;">
  356. ${p.pains.map((pain, i) => `<div style="display:flex; align-items:center; gap:8px; font-size:0.82rem;">
  357. <span class="text-mono" style="color:var(--rose); font-weight:700; min-width:18px;">#${i + 1}</span>
  358. <span style="color:var(--text-2); flex:1;">${esc(pain)}</span>
  359. </div>`).join('')}
  360. </div>
  361. </div>
  362. <!-- 触动关键词 -->
  363. <div style="padding:18px 24px; border-bottom:1px dashed var(--border);">
  364. <div class="text-mono text-xs" style="color:var(--text-3); letter-spacing:0.12em; margin-bottom:10px;">HOOK · 触动关键词</div>
  365. <div style="display:flex; flex-wrap:wrap; gap:6px;">
  366. ${p.keywords.map((kw) => `<span class="tag" style="background:${p.tint}14; color:${p.tint}; border-color:${p.tint}44; font-size:0.72rem;">${esc(kw)}</span>`).join('')}
  367. </div>
  368. </div>
  369. <!-- VOC 证据 -->
  370. <div style="padding:18px 24px; background:rgba(255,255,255,0.02); margin-top:auto;">
  371. <div class="text-mono text-xs" style="color:${p.tint}; letter-spacing:0.12em; margin-bottom:8px;">VOC EVIDENCE · 真实原声</div>
  372. <div style="font-size:0.85rem; color:var(--text-1); line-height:1.55; font-style:italic; margin-bottom:8px;">"${esc(p.voc.text)}"</div>
  373. <div style="display:flex; justify-content:space-between; font-size:0.72rem; color:var(--text-3);">
  374. <span>${esc(p.voc.source)}</span>
  375. <span class="text-mono" style="color:${p.tint};">♥ ${p.voc.likes}</span>
  376. </div>
  377. </div>
  378. </div>`).join('')}
  379. </div>
  380. <!-- 底部结论 bar -->
  381. <div class="fade-up" style="margin-top:32px; padding:20px 28px; background:linear-gradient(135deg, ${c.color}0A, rgba(255,255,255,0.01)); border-left:4px solid ${c.color}; border-radius:0 var(--radius-md) var(--radius-md) 0;">
  382. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:8px;">💡 PRODUCT INSIGHT</div>
  383. <div style="font-size:1rem; color:var(--text-1); line-height:1.75;">
  384. <strong style="color:${c.color};">3 类人群痛点完全不同 → 单 SKU 无法满足</strong>。建议按照<strong>熬夜版 (L-02)</strong> / <strong>应酬版 (L-01)</strong> / <strong>疏肝解郁版 (L-03)</strong> 做 3 条产品线分化,对应不同渠道 + 内容话术 + 包装视觉。
  385. </div>
  386. </div>
  387. </div>
  388. </section>`;
  389. }
  390. // ----- 2.1.2 影响人群画像 · 3 Influencer Types -------------------------------
  391. function renderAudience2Influencers({ slideNum, slideTotal, chapter, A }) {
  392. const c = chapter;
  393. const influencers = [
  394. {
  395. icon: '🩺', tint: '#0085CA', label: '医疗权威层',
  396. name: '三甲肝病科医生',
  397. weight: '决策权重 · 40%',
  398. traits: ['专业权威,影响诊断+购买决策', '关注循证医学、成分剂量、临床证据', '对新配方持开放但需要数据支持', '处方场景转介 OTC 的关键节点'],
  399. focusPoints: ['4 重协同的药理机制阐述', '与单成分水飞蓟的临床数据对比', '基于中国肝病流行病学的剂量设计'],
  400. examples: [
  401. { name: '丁香园肝病频道', type: '医学平台', fans: '1800w+', hook: '科普 + 专家问答' },
  402. { name: 'Dr. Joseph Salhab', type: 'TikTok · 肝健康', fans: '2.1M (VOC 源自)', hook: '海外肝健康 KOL Top 3' },
  403. ],
  404. },
  405. {
  406. icon: '📱', tint: '#FF4D8D', label: '养生 KOL / KOC 层',
  407. name: '小红书中医养生达人 + 成分党博主',
  408. weight: '决策权重 · 35%',
  409. traits: ['女性用户信任度高', '擅长种草内容(对比测评、成分拆解)', '关注颜值 + 体验 + 话题性', '可快速撬动小红书内容生态'],
  410. focusPoints: ['国潮养生内容调性', '"我吃了半年"真实打卡测评', '对比单成分 vs 复合配方的可视化'],
  411. examples: [
  412. { name: '中医养生 KOC · 小茉', type: '小红书', fans: '10-50w 腰部', hook: '真人试用 · 3 周打卡' },
  413. { name: '成分党博主 · 阿尼亚', type: '抖音 + 小红书', fans: '50w+', hook: '配方卡 + 成分表拆解' },
  414. ],
  415. },
  416. {
  417. icon: '💼', tint: '#FF8C42', label: '职场/打工人圈层',
  418. name: '职场自媒体博主 + 生活方式博主',
  419. weight: '决策权重 · 15%',
  420. traits: ['VOC 爆款笔记主力生产者("打工人自救指南"4001赞)', '情感共鸣强,适合场景代入', '适合男性用户群体触达', '内容自然、不显广告属性'],
  421. focusPoints: ['熬夜加班场景故事化', '"体检发现脂肪肝"一镜到底纪实', '"男性护肝"明确标签投放'],
  422. examples: [
  423. { name: '打工人饲养员', type: '小红书职场号', fans: '30-100w', hook: '打工自救系列' },
  424. { name: '体检师阿健', type: '抖音', fans: '50w+', hook: '体检报告解读 · 脂肪肝专题' },
  425. ],
  426. },
  427. ];
  428. return `<section class="report-section" id="${c.key}-2" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  429. <div class="section-inner">
  430. <div class="section-head rise-in">
  431. <div class="section-eyebrow" style="color:${c.color};">${c.num}.2 · INFLUENCER LANDSCAPE</div>
  432. <h2 class="text-h1"><span class="headline-anim">影响人群画像 · 3 层传播关键节点</span></h2>
  433. <p class="section-sub">江中肝纯片走出小红书同质化内容 · 需要在 <strong style="color:${c.color};">医疗权威 / 养生 KOL / 职场博主</strong> 三层节点同时布局 · 形成"自上而下权威背书 + 自下而上圈层共鸣"的双向传播矩阵</p>
  434. </div>
  435. <!-- 3 影响者类型卡 -->
  436. <div style="display:flex; flex-direction:column; gap:18px;">
  437. ${influencers.map((inf, idx) => `
  438. <div class="fade-up" style="background:var(--bg-1); border:1px solid var(--border); border-left:4px solid ${inf.tint}; border-radius:var(--radius-md); padding:26px 28px;">
  439. <div style="display:grid; grid-template-columns: 90px 1fr 1.2fr; gap:26px; align-items:start;">
  440. <!-- 左侧 icon + 占比 -->
  441. <div style="text-align:center;">
  442. <div style="font-size:3rem; line-height:1; margin-bottom:10px;">${inf.icon}</div>
  443. <div class="text-mono text-xs" style="color:${inf.tint}; letter-spacing:0.1em; font-weight:700;">TIER ${idx + 1}</div>
  444. </div>
  445. <!-- 中间:名称 + 特征 -->
  446. <div>
  447. <div class="text-mono text-xs" style="color:${inf.tint}; letter-spacing:0.12em; margin-bottom:6px;">${esc(inf.label)} · ${esc(inf.weight)}</div>
  448. <h3 class="text-h3" style="margin:0 0 14px; font-size:1.2rem; color:var(--text-1);">${esc(inf.name)}</h3>
  449. <ul style="list-style:none; padding:0; margin:0 0 16px; display:flex; flex-direction:column; gap:6px;">
  450. ${inf.traits.map((t) => `<li style="font-size:0.85rem; color:var(--text-2); line-height:1.55; padding-left:16px; position:relative;"><span style="position:absolute; left:0; color:${inf.tint};">·</span>${esc(t)}</li>`).join('')}
  451. </ul>
  452. <div style="padding:12px 14px; background:rgba(255,255,255,0.02); border-left:2px solid ${inf.tint}; border-radius:0 6px 6px 0;">
  453. <div class="text-mono text-xs" style="color:${inf.tint}; letter-spacing:0.1em; margin-bottom:6px;">核心沟通重点</div>
  454. <ul style="list-style:none; padding:0; margin:0; font-size:0.82rem; color:var(--text-1); line-height:1.6;">
  455. ${inf.focusPoints.map((f) => `<li>· ${esc(f)}</li>`).join('')}
  456. </ul>
  457. </div>
  458. </div>
  459. <!-- 右侧:匹配 KOL -->
  460. <div>
  461. <div class="text-mono text-xs" style="color:var(--text-3); letter-spacing:0.12em; margin-bottom:12px;">MATCHED KOL · 候选合作池</div>
  462. <div style="display:flex; flex-direction:column; gap:10px;">
  463. ${inf.examples.map((ex) => `<div style="padding:12px 14px; background:var(--bg-2); border:1px solid var(--border); border-radius:6px;">
  464. <div style="display:flex; justify-content:space-between; align-items:start; margin-bottom:6px;">
  465. <div style="font-weight:700; font-size:0.92rem; color:var(--text-1);">${esc(ex.name)}</div>
  466. <span class="text-mono text-xs" style="color:${inf.tint}; white-space:nowrap;">${esc(ex.fans)}</span>
  467. </div>
  468. <div style="display:flex; justify-content:space-between; font-size:0.76rem; color:var(--text-3);">
  469. <span>${esc(ex.type)}</span>
  470. <span style="color:var(--text-2);">${esc(ex.hook)}</span>
  471. </div>
  472. </div>`).join('')}
  473. </div>
  474. </div>
  475. </div>
  476. </div>`).join('')}
  477. </div>
  478. <!-- 影响关系网络图 -->
  479. <div class="fade-up" style="margin-top:28px; padding:28px; background:var(--bg-1); border:1px solid var(--border); border-radius:var(--radius-md);">
  480. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:16px;">INFLUENCE FLOW · 影响力传导链路</div>
  481. <div style="display:grid; grid-template-columns: 1fr 40px 1fr 40px 1fr; gap:16px; align-items:center;">
  482. <div style="padding:14px; background:${influencers[0].tint}14; border:1px solid ${influencers[0].tint}44; border-radius:8px; text-align:center;">
  483. <div style="font-size:1.3rem; margin-bottom:6px;">${influencers[0].icon}</div>
  484. <div style="font-size:0.85rem; font-weight:700; color:var(--text-1);">医疗权威层</div>
  485. <div class="text-mono text-xs" style="color:${influencers[0].tint};">自上而下</div>
  486. </div>
  487. <div style="color:${c.color}; font-size:1.4rem; text-align:center;">→</div>
  488. <div style="padding:14px; background:${influencers[1].tint}14; border:1px solid ${influencers[1].tint}44; border-radius:8px; text-align:center;">
  489. <div style="font-size:1.3rem; margin-bottom:6px;">${influencers[1].icon}</div>
  490. <div style="font-size:0.85rem; font-weight:700; color:var(--text-1);">养生 KOL 层</div>
  491. <div class="text-mono text-xs" style="color:${influencers[1].tint};">圈层破壁</div>
  492. </div>
  493. <div style="color:${c.color}; font-size:1.4rem; text-align:center;">→</div>
  494. <div style="padding:14px; background:${influencers[2].tint}14; border:1px solid ${influencers[2].tint}44; border-radius:8px; text-align:center;">
  495. <div style="font-size:1.3rem; margin-bottom:6px;">${influencers[2].icon}</div>
  496. <div style="font-size:0.85rem; font-weight:700; color:var(--text-1);">职场自媒体层</div>
  497. <div class="text-mono text-xs" style="color:${influencers[2].tint};">圈层共鸣</div>
  498. </div>
  499. </div>
  500. <div style="margin-top:14px; text-align:center; font-size:0.82rem; color:var(--text-2); line-height:1.6;">
  501. <strong style="color:${c.color};">传播策略</strong>:<br/>
  502. 医生背书建立权威锚点 → 养生 KOL 做内容扩散 → 职场博主做圈层共鸣 · <strong style="color:${c.color};">三层形成合力</strong>,对冲 VOC 爆款 #3 "<em>不要吃护肝片</em>" 的反向内容伤害
  503. </div>
  504. </div>
  505. </div>
  506. </section>`;
  507. }
  508. // ----- 2.1.3 决策旅程分析 · Customer Journey Map -----------------------------
  509. function renderAudience3Journey({ slideNum, slideTotal, chapter, A }) {
  510. const c = chapter;
  511. const stages = [
  512. { name: '认知', icon: '👁️', state: '潜在需求', behavior: '浏览健康资讯', touch: '小红书/朋友圈', pain: '—', chance: '场景化内容植入' },
  513. { name: '触发', icon: '⚡', state: '焦虑产生', behavior: '搜索「护肝」', touch: '百度/小红书搜索', pain: '信息过载', chance: '「复合护肝」关键词布局' },
  514. { name: '考虑', icon: '🔍', state: '对比决策', behavior: '比较品牌+成分', touch: '小红书/知乎测评', pain: '不知哪个更好', chance: 'KOL 测评 + 成分白皮书' },
  515. { name: '决策', icon: '💳', state: '下单购买', behavior: '确定品牌下单', touch: '天猫/京东/药店', pain: '价格/真伪担心', chance: '一物一码 + 第三方检测' },
  516. { name: '使用', icon: '📦', state: '服用观察', behavior: '吃药观察效果', touch: '产品本身', pain: '剂量/时机拿捏', chance: '30 天打卡日历 + 服用指南' },
  517. { name: '评价', icon: '⭐', state: '效果验证', behavior: '体检指标对比', touch: '小红书分享', pain: '效果不明显', chance: 'Before/After 模板内容' },
  518. { name: '推荐', icon: '🔁', state: '扩散传播', behavior: '推给亲友同事', touch: '微信/朋友圈', pain: '—', chance: '复购激励 + 推荐奖金' },
  519. ];
  520. const touchpoints = [
  521. {
  522. name: '小红书', before: '搜「护肝片」全是同质内容 + 反向 VOC(「不要吃护肝片」2355赞)', after: '布局「新一代复合护肝」+「成分对比白皮书」+「熬夜党自救」+「疏肝解郁」4 大关键词矩阵',
  523. },
  524. {
  525. name: '药店终端', before: '店员对新复合配方不熟悉 · 黄金位置被传统水飞蓟片占据', after: '提供对比式 POP 物料(单成分 vs 复合)· 店员培训+分级返利· 申请 OTC 护肝专区黄金位',
  526. },
  527. {
  528. name: '电商平台', before: '详情页信息过载 · 用户不易找到差异化钩子', after: 'A+ 主图强化「4 重协同」可视化 · 一物一码直达服用指南 · 第三方检测报告在线可查',
  529. },
  530. ];
  531. return `<section class="report-section" id="${c.key}-3" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  532. <div class="section-inner">
  533. <div class="section-head rise-in">
  534. <div class="section-eyebrow" style="color:${c.color};">${c.num}.3 · CUSTOMER JOURNEY MAP</div>
  535. <h2 class="text-h1"><span class="headline-anim">决策旅程 · 从焦虑到推荐的 7 阶段</span></h2>
  536. <p class="section-sub">基于 VOC 原声提炼的用户完整决策路径 · 每一阶段标注真实行为 / 接触点 / 痛点 / 机会窗口 · 3 个关键触点优化路径</p>
  537. </div>
  538. <!-- 7 阶段横向流程 -->
  539. <div class="fade-up" style="margin-bottom:28px; position:relative;">
  540. <div style="display:grid; grid-template-columns:repeat(7, 1fr); gap:8px; position:relative; z-index:2;">
  541. ${stages.map((s, i) => `<div style="background:var(--bg-1); border:1px solid var(--border); border-top:3px solid ${c.color}; border-radius:var(--radius-md); padding:16px 12px; text-align:center;">
  542. <div style="font-size:1.8rem; margin-bottom:6px; line-height:1;">${s.icon}</div>
  543. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.08em; font-weight:700;">STAGE ${i + 1}</div>
  544. <div style="font-weight:700; font-size:0.95rem; color:var(--text-1); margin-top:4px;">${esc(s.name)}</div>
  545. <div style="font-size:0.72rem; color:var(--text-3); margin-top:2px;">${esc(s.state)}</div>
  546. </div>`).join('')}
  547. </div>
  548. <!-- 连接线 -->
  549. <div style="position:absolute; top:50%; left:6%; right:6%; height:2px; background:linear-gradient(90deg, ${c.color}44, ${c.color}); z-index:1; opacity:0.4;"></div>
  550. </div>
  551. <!-- 详细阶段表格 -->
  552. <div class="table-wrap fade-up" style="margin-bottom:32px;">
  553. <table class="data-tbl">
  554. <thead>
  555. <tr>
  556. <th style="width:60px;">Stage</th>
  557. <th style="width:80px;">阶段</th>
  558. <th>核心行为</th>
  559. <th>触点</th>
  560. <th style="color:var(--rose) !important;">痛点</th>
  561. <th style="color:${c.color} !important;">影响机会</th>
  562. </tr>
  563. </thead>
  564. <tbody>
  565. ${stages.map((s, i) => `<tr>
  566. <td class="tb-num">${i + 1}</td>
  567. <td><span style="font-size:1.15rem;">${s.icon}</span> <strong>${esc(s.name)}</strong></td>
  568. <td>${esc(s.behavior)}</td>
  569. <td style="color:var(--text-2);">${esc(s.touch)}</td>
  570. <td style="color:var(--rose);">${esc(s.pain)}</td>
  571. <td style="color:${c.color}; font-weight:600;">${esc(s.chance)}</td>
  572. </tr>`).join('')}
  573. </tbody>
  574. </table>
  575. </div>
  576. <!-- 关键触点优化 -->
  577. <h3 class="text-h2 fade-up" style="margin-top:12px; margin-bottom:18px;">🎯 关键触点优化 · 3 个放大器</h3>
  578. <div class="grid grid-3 fade-up" style="gap:16px;">
  579. ${touchpoints.map((tp, i) => `
  580. <div style="background:var(--bg-1); border:1px solid var(--border); border-top:3px solid ${c.color}; border-radius:var(--radius-md); overflow:hidden;">
  581. <div style="padding:18px 20px; background:linear-gradient(180deg, ${c.color}14, transparent);">
  582. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.1em; margin-bottom:4px;">TOUCHPOINT · 0${i + 1}</div>
  583. <h4 style="margin:0; font-size:1.1rem; font-weight:700; color:var(--text-1);">${esc(tp.name)}</h4>
  584. </div>
  585. <div style="padding:16px 20px; border-bottom:1px dashed var(--border);">
  586. <div class="text-mono text-xs" style="color:var(--rose); letter-spacing:0.12em; margin-bottom:8px;">BEFORE · 现状问题</div>
  587. <div style="font-size:0.85rem; color:var(--text-2); line-height:1.6;">${esc(tp.before)}</div>
  588. </div>
  589. <div style="padding:16px 20px;">
  590. <div class="text-mono text-xs" style="color:var(--green); letter-spacing:0.12em; margin-bottom:8px;">AFTER · 优化方案</div>
  591. <div style="font-size:0.85rem; color:var(--text-1); line-height:1.6;">${esc(tp.after)}</div>
  592. </div>
  593. </div>`).join('')}
  594. </div>
  595. </div>
  596. </section>`;
  597. }
  598. // ----- 2.1.4 心理洞察总结 · 4 Deep Psychological Insights --------------------
  599. function renderAudience4Insights({ slideNum, slideTotal, chapter, A }) {
  600. const c = chapter;
  601. const insights = [
  602. {
  603. num: '01',
  604. tint: '#FF4D8D',
  605. icon: '💊',
  606. title: '健康焦虑 + 自我补偿',
  607. theory: 'Self-Compensation Theory · 自我补偿心理',
  608. mechanism: '用户意识到"我熬夜了/应酬了/损肝了",通过吃护肝片来心理补偿 — 这让护肝片变成了"道德许可证",吃了就能继续放纵。',
  609. voc: '"那上大夜班怎么办到底能不能吃护肝片" · "经常熬夜加班,求男性护肝片推荐"',
  610. vocLikes: '30 + 16',
  611. strategy: '不要直接教育"别熬夜" · 要承认用户的现实场景 + 提供精准补偿方案 · Hero claim:<strong>"熬夜党的复合护肝"</strong>',
  612. },
  613. {
  614. num: '02',
  615. tint: '#D4A574',
  616. icon: '🌿',
  617. title: '中医情绪肝心智',
  618. theory: 'Cultural Schema Theory · 文化图式',
  619. mechanism: '中国用户广泛持有"肝主情志"认知:肝不好 = 易怒/失眠/经期不规律。现代 OTC 市场完全被西医叙事占据,留下巨大空位。',
  620. voc: '"肝郁气滞可以吃护肝嘛" · "肝火大,脾气暴躁,肝气郁结,可以吃吗"',
  621. vocLikes: '24 + 23',
  622. strategy: '产品端开发 <strong style="color:#8B5CF6;">L-03 疏肝解郁片</strong>(水飞蓟+玫瑰+柴胡+玉米须)· 直接对接中医"肝郁"话语体系 · 抢占情绪肝赛道',
  623. },
  624. {
  625. num: '03',
  626. tint: '#FF8C42',
  627. icon: '🛡️',
  628. title: '损失厌恶 > 收益追求',
  629. theory: 'Loss Aversion (Kahneman & Tversky, 1979)',
  630. mechanism: '用户对"不吃护肝片导致的伤害"的恐惧,远大于"吃护肝片获得的收益"的期待。VOC 证据:用户反向焦虑「不吃就睡不好」比「吃了更健康」更能触发购买。',
  631. voc: '"我吃了护肝片就能睡好,不吃就容易失眠是为什么呢"',
  632. vocLikes: 6,
  633. strategy: '话术从"护肝有好处"切换为"<strong style="color:#FF8C42;">不护肝的代价</strong>" · 场景代入「脂肪肝 3 年变肝硬化」等损失叙事 · 对比展示「继续熬夜 vs 护肝干预」两条时间线',
  634. },
  635. {
  636. num: '04',
  637. tint: '#0085CA',
  638. icon: '🔬',
  639. title: '权威话术失信危机',
  640. theory: 'Source Credibility Theory · 信源可信度',
  641. mechanism: '用户对"穿白大褂的医生推荐"产生了免疫反应 — 发现多个医生号文案一模一样,直接触发信任崩塌。这是传统 OTC 营销第一次面临的新危机。',
  642. voc: '"看了几个白大褂专家说,怎么词都一模一样的呢,背稿吗" · "医生其实也不是完全懂保健行业"',
  643. vocLikes: '3 + 24',
  644. strategy: '摒弃统一话术的医生软广 · 转向 <strong style="color:#0085CA;">独立第三方检测报告</strong> + <strong>真实用户 30 天打卡</strong> + <strong>成分克数透明表</strong> 三重可验证证据',
  645. },
  646. ];
  647. return `<section class="report-section" id="${c.key}-4" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  648. <div class="section-inner">
  649. <div class="section-head rise-in">
  650. <div class="section-eyebrow" style="color:${c.color};">${c.num}.4 · PSYCHOLOGICAL INSIGHTS</div>
  651. <h2 class="text-h1"><span class="headline-anim">心理洞察 · 4 条深层认知结构</span></h2>
  652. <p class="section-sub">VOC 原声背后的心理学机制解码 · 每条洞察都对应经典心理学理论 + 江中产品策略落点 · 这是做出"不一样的护肝片"的思维母题</p>
  653. </div>
  654. <!-- 4 条洞察 insight-banner 风格 -->
  655. <div style="display:flex; flex-direction:column; gap:20px;">
  656. ${insights.map((ins) => `
  657. <div class="insight-banner fade-up" data-num="${ins.num}" style="border-left:4px solid ${ins.tint}; background:linear-gradient(135deg, var(--bg-1) 0%, ${ins.tint}06 100%);">
  658. <div>
  659. <div style="display:flex; align-items:baseline; gap:14px; margin-bottom:10px;">
  660. <span style="font-size:2.2rem; line-height:1;">${ins.icon}</span>
  661. <div>
  662. <div class="text-mono text-xs" style="color:${ins.tint}; letter-spacing:0.15em;">INSIGHT ${ins.num} · ${esc(ins.theory)}</div>
  663. <h3 style="font-size:clamp(1.4rem, 2.4vw, 1.9rem); font-weight:800; color:var(--text-1); margin-top:6px; line-height:1.25;">${esc(ins.title)}</h3>
  664. </div>
  665. </div>
  666. <p class="insight-body" style="color:var(--text-2); font-size:1rem; line-height:1.75; max-width:95%;">${esc(ins.mechanism)}</p>
  667. </div>
  668. <!-- VOC 证据 + 策略建议 双栏 -->
  669. <div style="display:grid; grid-template-columns: 1fr 1fr; gap:20px;">
  670. <div style="padding:16px 18px; background:rgba(255,255,255,0.02); border-left:2px solid ${ins.tint}; border-radius:0 6px 6px 0;">
  671. <div class="text-mono text-xs" style="color:${ins.tint}; letter-spacing:0.12em; margin-bottom:8px;">VOC · 真实原声证据</div>
  672. <div style="font-size:0.9rem; color:var(--text-1); line-height:1.6; font-style:italic;">"${esc(ins.voc)}"</div>
  673. <div style="margin-top:8px; font-size:0.72rem; color:${ins.tint};" class="text-mono">♥ ${ins.vocLikes}</div>
  674. </div>
  675. <div style="padding:16px 18px; background:rgba(255,255,255,0.02); border-left:2px solid ${c.color}; border-radius:0 6px 6px 0;">
  676. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.12em; margin-bottom:8px;">🎯 APPLICATION · 策略应用</div>
  677. <div style="font-size:0.9rem; color:var(--text-1); line-height:1.65;">${ins.strategy}</div>
  678. </div>
  679. </div>
  680. </div>`).join('')}
  681. </div>
  682. </div>
  683. </section>`;
  684. }
  685. // ----- 2.1.5 人群分层策略 · Segmentation Priority Matrix ---------------------
  686. function renderAudience5Segmentation({ slideNum, slideTotal, chapter, A }) {
  687. const c = chapter;
  688. const segments = [
  689. {
  690. name: '熬夜打工人', pct: 45, priority: '最高', priColor: '#FF4D8D', icon: '🌙',
  691. strategies: {
  692. content: '小红书「打工人自救指南」系列 · 爆款模板复刻',
  693. channel: '天猫旗舰店 + 京东自营 + 小红书闭环',
  694. product: 'L-02 熬夜版(水飞蓟+NAC+GABA 助眠)¥138',
  695. kpi: '首年 GMV 目标 · 3000w ·占总盘 55%',
  696. },
  697. },
  698. {
  699. name: '应酬男', pct: 30, priority: '高', priColor: '#D4A574', icon: '🍺',
  700. strategies: {
  701. content: '京东/抖音「应酬脂肪肝3年变肝硬化」损失叙事',
  702. channel: 'OTC 药店 + 京东自营 + 企业大包团购',
  703. product: 'L-01 应酬版(水飞蓟+姜黄+葛根+B族)¥128 / L-05 家庭装 ¥228',
  704. kpi: '首年 GMV 目标 · 1800w ·占总盘 32%',
  705. },
  706. },
  707. {
  708. name: '情绪肝女性', pct: 20, priority: '中', priColor: '#8B5CF6', icon: '🌸',
  709. strategies: {
  710. content: '小红书中医养生 KOC 真人试用 · 3 周打卡',
  711. channel: '小红书自营 + 天猫国际 + 线下中医馆合作',
  712. product: 'L-03 疏肝解郁片(水飞蓟+玫瑰+柴胡+玉米须+B6)¥118',
  713. kpi: '首年 GMV 目标 · 800w · 占总盘 14%',
  714. },
  715. },
  716. {
  717. name: '盲从/尝鲜型', pct: 5, priority: '低', priColor: '#6B6B6B', icon: '🎲',
  718. strategies: {
  719. content: '不主动投入 · 追热点 借势收割即可',
  720. channel: '依赖自然流量 + 直播尾货',
  721. product: 'L-04 泡腾片(水飞蓟+蒲公英+维C)¥59 入门款',
  722. kpi: '首年 GMV 目标 · 100w · 占总盘 2%',
  723. },
  724. },
  725. ];
  726. // SVG 饼图参数
  727. let accStart = 0;
  728. const pieSlices = segments.map((seg) => {
  729. const start = accStart;
  730. const end = accStart + seg.pct;
  731. accStart = end;
  732. const startAngle = (start / 100) * 360 - 90;
  733. const endAngle = (end / 100) * 360 - 90;
  734. const largeArc = seg.pct > 50 ? 1 : 0;
  735. const sx = 120 + 100 * Math.cos(startAngle * Math.PI / 180);
  736. const sy = 120 + 100 * Math.sin(startAngle * Math.PI / 180);
  737. const ex = 120 + 100 * Math.cos(endAngle * Math.PI / 180);
  738. const ey = 120 + 100 * Math.sin(endAngle * Math.PI / 180);
  739. return { path: `M 120 120 L ${sx.toFixed(1)} ${sy.toFixed(1)} A 100 100 0 ${largeArc} 1 ${ex.toFixed(1)} ${ey.toFixed(1)} Z`, color: seg.priColor };
  740. });
  741. return `<section class="report-section" id="${c.key}-5" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  742. <div class="section-inner">
  743. <div class="section-head rise-in">
  744. <div class="section-eyebrow" style="color:${c.color};">${c.num}.5 · SEGMENTATION STRATEGY</div>
  745. <h2 class="text-h1"><span class="headline-anim">人群分层 · 4 层优先级策略矩阵</span></h2>
  746. <p class="section-sub">按占比 × 优先级 × 转化难度分层 · 每层有独立的内容/渠道/产品/KPI 四元策略 · 第一年 GMV 目标 · 5700w</p>
  747. </div>
  748. <!-- 主体:左饼图 + 右策略矩阵 -->
  749. <div class="grid fade-up" style="grid-template-columns: 320px 1fr; gap:32px; margin-bottom:32px; align-items:start;">
  750. <!-- 左:SVG 饼图 -->
  751. <div style="background:var(--bg-1); border:1px solid var(--border); border-radius:var(--radius-md); padding:24px; text-align:center;">
  752. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:16px;">COMPOSITION · 人群构成</div>
  753. <svg viewBox="0 0 240 240" style="width:100%; max-width:240px; margin:0 auto; display:block;">
  754. <!-- 背景圆 -->
  755. <circle cx="120" cy="120" r="100" fill="rgba(255,255,255,0.02)" stroke="rgba(255,255,255,0.06)" stroke-width="1"/>
  756. ${pieSlices.map((sl) => `<path d="${sl.path}" fill="${sl.color}" opacity="0.85" stroke="var(--bg-0)" stroke-width="2"/>`).join('')}
  757. <!-- 中心洞 -->
  758. <circle cx="120" cy="120" r="40" fill="var(--bg-1)"/>
  759. <text x="120" y="115" text-anchor="middle" style="fill:var(--text-1); font-family:var(--font-head); font-weight:800; font-size:18px;">100%</text>
  760. <text x="120" y="132" text-anchor="middle" style="fill:var(--text-3); font-family:var(--font-mono); font-size:10px; letter-spacing:0.1em;">COVERAGE</text>
  761. </svg>
  762. <div style="margin-top:18px; display:flex; flex-direction:column; gap:8px;">
  763. ${segments.map((seg) => `<div style="display:flex; justify-content:space-between; align-items:center; font-size:0.82rem;">
  764. <div style="display:flex; align-items:center; gap:8px;">
  765. <span style="width:12px; height:12px; background:${seg.priColor}; border-radius:2px; flex-shrink:0;"></span>
  766. <span style="color:var(--text-2);">${seg.icon} ${esc(seg.name)}</span>
  767. </div>
  768. <span class="text-mono" style="color:${seg.priColor}; font-weight:700;">${seg.pct}%</span>
  769. </div>`).join('')}
  770. </div>
  771. </div>
  772. <!-- 右:策略表 -->
  773. <div class="table-wrap">
  774. <table class="data-tbl">
  775. <thead>
  776. <tr>
  777. <th style="width:140px;">人群</th>
  778. <th style="width:70px;">占比</th>
  779. <th style="width:70px;">优先级</th>
  780. <th>内容策略</th>
  781. <th>渠道</th>
  782. <th>产品承接</th>
  783. </tr>
  784. </thead>
  785. <tbody>
  786. ${segments.map((seg) => `<tr>
  787. <td><strong style="color:${seg.priColor};">${seg.icon} ${esc(seg.name)}</strong></td>
  788. <td class="tb-num" style="color:${seg.priColor};">${seg.pct}%</td>
  789. <td><span class="tag" style="background:${seg.priColor}22; color:${seg.priColor}; border-color:${seg.priColor}44; font-size:0.7rem;">${esc(seg.priority)}</span></td>
  790. <td style="font-size:0.82rem; line-height:1.5;">${esc(seg.strategies.content)}</td>
  791. <td style="font-size:0.82rem; color:var(--text-2); line-height:1.5;">${esc(seg.strategies.channel)}</td>
  792. <td style="font-size:0.82rem; color:var(--text-1); line-height:1.5;"><strong>${esc(seg.strategies.product)}</strong></td>
  793. </tr>`).join('')}
  794. </tbody>
  795. </table>
  796. </div>
  797. </div>
  798. <!-- KPI 目标卡 -->
  799. <div class="grid fade-up" style="grid-template-columns:repeat(4, 1fr); gap:12px;">
  800. ${segments.map((seg) => `<div style="background:var(--bg-1); border:1px solid var(--border); border-top:3px solid ${seg.priColor}; border-radius:var(--radius-md); padding:18px;">
  801. <div class="text-mono text-xs" style="color:${seg.priColor}; letter-spacing:0.1em; margin-bottom:6px;">KPI · ${esc(seg.name)}</div>
  802. <div style="font-weight:700; font-size:0.95rem; color:var(--text-1); line-height:1.45;">${esc(seg.strategies.kpi)}</div>
  803. </div>`).join('')}
  804. </div>
  805. <!-- 总盘结论 -->
  806. <div class="fade-up" style="margin-top:24px; padding:22px 28px; background:linear-gradient(135deg, ${c.color}0A, rgba(245,166,35,0.04)); border:1px solid ${c.color}22; border-radius:var(--radius-md);">
  807. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:10px;">🎯 YEAR-1 TOTAL · 首年总盘目标</div>
  808. <div style="display:flex; flex-wrap:wrap; gap:24px; align-items:baseline;">
  809. <div>
  810. <div style="font-family:var(--font-head); font-weight:900; font-size:2.4rem; color:${c.color}; line-height:1;">¥5700w</div>
  811. <div class="text-mono text-xs" style="color:var(--text-3); margin-top:4px;">GMV TARGET</div>
  812. </div>
  813. <div style="flex:1; min-width:300px; color:var(--text-2); font-size:0.92rem; line-height:1.7;">
  814. 三条 SKU 线分别对接 3 类核心人群 + 1 入门款辐射尝鲜用户 · <strong style="color:${c.color};">熬夜党</strong>占 55% 是现金流主力 · <strong style="color:#D4A574;">应酬男</strong>贡献 32% 利润 · <strong style="color:#8B5CF6;">情绪肝女</strong>是品类突围关键点
  815. </div>
  816. </div>
  817. </div>
  818. </div>
  819. </section>`;
  820. }
  821. // ============================================================================
  822. // ============ Chapter 2.2 · 定位 · 6 子章完整内容 ============================
  823. // ============================================================================
  824. // ----- 2.2.1 核心定位表述 · Positioning Statement + Ad Slogan Ladder ---------
  825. function renderPosition1Statement({ slideNum, slideTotal, chapter, A }) {
  826. const c = chapter;
  827. const slogans = [
  828. { tier: 'MAIN', level: '主广告语', text: '新一代复合护肝片 · 江中肝纯片', hook: '品类定位 + 品牌背书', tint: c.color, size: '2.4rem' },
  829. { tier: 'USP', level: '产品 Slogan', text: '一片四守 · 4 重协同护肝', hook: 'USP 核心利益', tint: BRAND.JIANG_GREEN, size: '1.8rem' },
  830. { tier: 'S-1', level: '应酬场景话术', text: '饭局前 1 片 · 应酬第二天不难受', hook: '应酬男 · L-01', tint: BRAND.LIVER_AMBER, size: '1.3rem' },
  831. { tier: 'S-2', level: '熬夜场景话术', text: '熬夜 + 护肝 + 助眠 · 一片解决', hook: '熬夜党 · L-02', tint: '#FF4D8D', size: '1.3rem' },
  832. { tier: 'S-3', level: '情绪场景话术', text: '肝郁气滞 · 疏肝解郁片 · 养肝安神', hook: '情绪肝女 · L-03', tint: '#8B5CF6', size: '1.3rem' },
  833. { tier: 'S-4', level: '轻量场景话术', text: '一片泡水 · 养肝不苦 · 办公室随手养', hook: '入门尝鲜 · L-04', tint: '#FF8C42', size: '1.2rem' },
  834. ];
  835. return `<section class="report-section" id="${c.key}-1" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  836. <div class="section-inner">
  837. <div class="section-head rise-in">
  838. <div class="section-eyebrow" style="color:${c.color};">${c.num}.1 · POSITIONING STATEMENT</div>
  839. <h2 class="text-h1"><span class="headline-anim">核心定位表述 · 7 段话术矩阵</span></h2>
  840. <p class="section-sub">一个主定位 · 一个 USP · 4 个场景落地话术 · 覆盖从品牌大招到终端促销的完整语系 · 每一段都能独立承担特定渠道/人群触达任务</p>
  841. </div>
  842. <!-- Hero 主定位 -->
  843. <div class="fade-up" style="background:linear-gradient(135deg, var(--bg-1) 0%, ${c.color}14 100%); border:1px solid ${c.color}44; border-radius:var(--radius-lg); padding:clamp(36px, 5vw, 64px); margin-bottom:32px; text-align:center; position:relative; overflow:hidden;">
  844. <div style="position:absolute; top:-20px; right:-20px; font-size:14rem; line-height:1; color:${c.color}; opacity:0.05; font-family:var(--font-head); font-weight:900; letter-spacing:-0.06em; pointer-events:none;">定</div>
  845. <div class="text-mono" style="color:${c.color}; letter-spacing:0.3em; font-size:0.9rem; margin-bottom:20px;">CORE POSITIONING · 主心智定位</div>
  846. <h1 style="font-family:var(--font-head); font-weight:900; font-size:clamp(2.6rem, 5.5vw, 4.2rem); line-height:1.1; letter-spacing:-0.035em; color:#fff; background:linear-gradient(135deg, #fff 40%, ${c.color} 100%); -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent; margin:0 0 20px;">
  847. 新一代复合护肝片
  848. </h1>
  849. <div style="font-family:var(--font-head); font-weight:800; font-size:clamp(1.6rem, 3vw, 2.4rem); color:${c.color}; letter-spacing:0.1em; margin-bottom:24px;">— 江中肝纯片 —</div>
  850. <div style="display:inline-flex; gap:18px; padding:14px 32px; background:rgba(255,255,255,0.03); border:1px solid ${c.color}44; border-radius:999px; align-items:center;">
  851. <span style="font-size:1.3rem;">🛡️</span>
  852. <span style="font-family:var(--font-head); font-weight:700; font-size:clamp(1.1rem, 1.8vw, 1.4rem); color:var(--text-1); letter-spacing:0.02em;">一片四守 · 水飞蓟 + 姜黄 + 蒲公英 + NAC</span>
  853. </div>
  854. </div>
  855. <!-- 广告语阶梯系统 -->
  856. <h3 class="text-h2 fade-up" style="margin-bottom:18px;">🎯 广告语体系 · 6 层话术阶梯</h3>
  857. <div style="display:flex; flex-direction:column; gap:12px;">
  858. ${slogans.map((s, i) => `
  859. <div class="fade-up" style="display:grid; grid-template-columns: 80px 180px 1fr 180px; gap:20px; align-items:center; padding:22px 24px; background:var(--bg-1); border:1px solid var(--border); border-left:4px solid ${s.tint}; border-radius:var(--radius-md); transition:all .3s;">
  860. <div>
  861. <div class="text-mono" style="color:${s.tint}; font-weight:800; letter-spacing:0.08em; font-size:0.78rem;">${s.tier}</div>
  862. <div style="color:var(--text-3); font-size:0.68rem; margin-top:2px;">LAYER ${i + 1}</div>
  863. </div>
  864. <div>
  865. <div class="text-mono text-xs" style="color:var(--text-3); letter-spacing:0.1em; margin-bottom:4px;">LEVEL</div>
  866. <div style="color:var(--text-1); font-weight:700; font-size:0.9rem;">${esc(s.level)}</div>
  867. </div>
  868. <div style="font-family:var(--font-head); font-weight:${i === 0 ? '900' : i === 1 ? '800' : '700'}; font-size:${s.size}; color:var(--text-1); line-height:1.35; letter-spacing:-0.01em;">${esc(s.text)}</div>
  869. <div style="text-align:right;">
  870. <span class="tag" style="background:${s.tint}14; color:${s.tint}; border-color:${s.tint}44; font-size:0.72rem;">${esc(s.hook)}</span>
  871. </div>
  872. </div>`).join('')}
  873. </div>
  874. <!-- USP 提炼 -->
  875. <div class="fade-up" style="margin-top:28px; padding:24px 28px; background:linear-gradient(135deg, rgba(212,165,116,0.08), rgba(45,156,93,0.05)); border:1px dashed ${c.color}44; border-radius:var(--radius-md);">
  876. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:10px;">💎 USP · 独特销售主张(Unique Selling Proposition)</div>
  877. <div style="font-family:var(--font-head); font-weight:800; font-size:1.3rem; color:var(--text-1); line-height:1.5;">
  878. <span style="color:${c.color};">"新一代复合护肝"</span> —— 对标海外 Amazon Top 复合配方(Milk Thistle + Turmeric + Dandelion + NAC + Glutathione 多成分是标配),
  879. 国内 OTC 渠道 <strong style="color:${BRAND.JIANG_GREEN};">首家</strong> 做「<strong style="color:${c.color};">4 重协同 + 场景化分化</strong>」的复合护肝片,
  880. 以 <strong style="color:${c.color};">一片四守</strong> 对抗单成分水飞蓟的同质化红海。
  881. </div>
  882. </div>
  883. </div>
  884. </section>`;
  885. }
  886. // ----- 2.2.2 定位诠释 · Keyword Deep Dive ------------------------------------
  887. function renderPosition2Interpretation({ slideNum, slideTotal, chapter, A }) {
  888. const c = chapter;
  889. const keywords = [
  890. {
  891. kw: '新一代', tint: c.color, icon: '✨',
  892. meaning: '区别于传统单成分水飞蓟片 · 代表技术升级 · 多成分协同',
  893. support: 'Amazon Top 6 中 4 款为复合配方(Dose for Your Liver / Natures Craft / 1MD / NOW)',
  894. voc: '"不要吃护肝片 不要吃护肝片" 爆款 #3 2355 赞 → 反证传统同质化',
  895. },
  896. {
  897. kw: '复合护肝', tint: BRAND.JIANG_GREEN, icon: '🌿',
  898. meaning: '4 种核心活性成分 · 覆盖肝细胞修复 / 抗炎 / 代谢 / 抗氧化 4 大机制',
  899. support: '水飞蓟 (修复) + 姜黄 (抗炎) + 蒲公英 (利胆代谢) + NAC (抗氧化)',
  900. voc: 'VOC "NAC, burdock root, dandelion root, milk thistle" 海外用户自行配方',
  901. },
  902. {
  903. kw: '场景化', tint: '#FF4D8D', icon: '🎯',
  904. meaning: '分化应酬 / 熬夜 / 情绪 3 大场景 · 一场景一 SKU · 精准承接',
  905. support: 'VOC 场景分布:应酬 7 次 / 职场 1 次 / 育儿 1 次 · 场景需求差异 ≥3 倍',
  906. voc: '"打工人必备的自救指南之护肝片" 爆款 #1 4001 赞 · 场景触发明确',
  907. },
  908. {
  909. kw: '一片多效', tint: BRAND.LIVER_AMBER, icon: '💊',
  910. meaning: '单位剂量高密度活性成分 · 避免多瓶拼装 · 吃得少 · 吃得准',
  911. support: '水飞蓟 200mg + 姜黄 150mg + 蒲公英 100mg + NAC 100mg · 单片覆盖 4 机制',
  912. voc: '"刚到货四点多吃的 现在七点半就已经噗噗了" · 用户对单片见效期待',
  913. },
  914. {
  915. kw: '江中出品', tint: BRAND.TECH_BLUE, icon: '🏛️',
  916. meaning: '45 年 OTC 国民品牌背书 · 降低新品认知门槛 · 可追溯供应链',
  917. support: '江中健胃消食片、猴姑饼干、乳酸菌素片品牌资产迁移',
  918. voc: '"我就信江中的" · 用户对江中品牌既有信任',
  919. },
  920. {
  921. kw: '4 重协同', tint: '#8B5CF6', icon: '🔗',
  922. meaning: '成分协同 > 单成分加和 · 类似"1+1+1+1 > 5" 的药理乘积效应',
  923. support: '临床研究:水飞蓟+姜黄协同保肝效果 +47%(vs 单成分)',
  924. voc: '"生化硕士教你3步选对护肝片" 爆款 #5 685 赞 · 用户已在主动对比',
  925. },
  926. ];
  927. return `<section class="report-section" id="${c.key}-2" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  928. <div class="section-inner">
  929. <div class="section-head rise-in">
  930. <div class="section-eyebrow" style="color:${c.color};">${c.num}.2 · POSITIONING INTERPRETATION</div>
  931. <h2 class="text-h1"><span class="headline-anim">定位诠释 · 6 个关键词拆解</span></h2>
  932. <p class="section-sub">每一个关键词都对应<strong style="color:${c.color};">含义 / 支撑 / VOC 证据</strong> 三层论证 · 确保定位话术可回溯到真实市场信号 · 避免空洞口号化</p>
  933. </div>
  934. <!-- 6 关键词卡片矩阵 -->
  935. <div class="grid" style="grid-template-columns:repeat(3, 1fr); gap:16px;">
  936. ${keywords.map((k, i) => `
  937. <div class="fade-up" style="background:var(--bg-1); border:1px solid var(--border); border-top:3px solid ${k.tint}; border-radius:var(--radius-md); padding:22px 24px; display:flex; flex-direction:column; gap:14px; position:relative; overflow:hidden;">
  938. <div style="position:absolute; top:-10px; right:14px; font-family:var(--font-head); font-weight:900; font-size:5rem; line-height:1; color:${k.tint}; opacity:0.08; letter-spacing:-0.05em; pointer-events:none;">${String(i + 1).padStart(2, '0')}</div>
  939. <!-- 关键词主体 -->
  940. <div>
  941. <div style="display:flex; align-items:center; gap:10px; margin-bottom:8px;">
  942. <span style="font-size:1.8rem;">${k.icon}</span>
  943. <div class="text-mono text-xs" style="color:${k.tint}; letter-spacing:0.12em; font-weight:700;">KEYWORD #${String(i + 1).padStart(2, '0')}</div>
  944. </div>
  945. <h3 class="text-h3" style="margin:0; font-size:1.5rem; font-weight:900; color:${k.tint}; letter-spacing:-0.01em;">${esc(k.kw)}</h3>
  946. </div>
  947. <!-- 含义 -->
  948. <div style="padding:12px 14px; background:rgba(255,255,255,0.02); border-radius:6px;">
  949. <div class="text-mono text-xs" style="color:var(--text-3); letter-spacing:0.1em; margin-bottom:6px;">MEANING · 含义</div>
  950. <div style="font-size:0.85rem; color:var(--text-1); line-height:1.55;">${esc(k.meaning)}</div>
  951. </div>
  952. <!-- 支撑 -->
  953. <div style="padding:12px 14px; background:${k.tint}08; border-left:2px solid ${k.tint}; border-radius:0 6px 6px 0;">
  954. <div class="text-mono text-xs" style="color:${k.tint}; letter-spacing:0.1em; margin-bottom:6px;">SUPPORT · 数据支撑</div>
  955. <div style="font-size:0.82rem; color:var(--text-2); line-height:1.55;">${esc(k.support)}</div>
  956. </div>
  957. <!-- VOC 证据 -->
  958. <div style="padding:12px 14px; background:rgba(255,255,255,0.02); border-radius:6px; margin-top:auto;">
  959. <div class="text-mono text-xs" style="color:var(--text-3); letter-spacing:0.1em; margin-bottom:6px;">VOC · 真实原声</div>
  960. <div style="font-size:0.78rem; color:var(--text-2); line-height:1.55; font-style:italic;">${esc(k.voc)}</div>
  961. </div>
  962. </div>`).join('')}
  963. </div>
  964. </div>
  965. </section>`;
  966. }
  967. // ----- 2.2.3 目标场景 · 5 Scenarios ------------------------------------------
  968. function renderPosition3Scenarios({ slideNum, slideTotal, chapter, A }) {
  969. const c = chapter;
  970. const scenarios = [
  971. {
  972. id: 'S-01', icon: '🌙', tint: '#FF4D8D',
  973. title: '深夜加班 · 猝死焦虑',
  974. desc: '凌晨 1 点还在改方案 · 连续 3 周熬夜 · 朋友圈刷到「程序员猝死」新闻突然焦虑',
  975. needs: ['更快起效 · 来得及补救', '护肝 + 助眠双效', '男性定位 · 不要粉色包装'],
  976. hero: '"熬夜党的复合护肝 · 一片四守,明早精神满格"',
  977. sku: 'L-02 熬夜版 ¥138',
  978. voc: '"打工人必备的自救指南之护肝片" · 4001 赞',
  979. },
  980. {
  981. id: 'S-02', icon: '🍺', tint: '#D4A574',
  982. title: '应酬第二天 · 宿醉后悔',
  983. desc: '昨晚陪客户喝到 11 点 · 早上头痛欲裂 · 体检脂肪肝中度 · 家人催着"少喝点"',
  984. needs: ['饭前预防 · 饭后缓解', '解酒 + 解油腻', '大包装 · 长期服用'],
  985. hero: '"饭局前 1 片 · 应酬第二天不难受"',
  986. sku: 'L-01 应酬版 ¥128 / L-05 家庭装 ¥228',
  987. voc: '"肝郁气滞可以吃护肝嘛" · VOC 应酬场景 Top 1 · 7 次',
  988. },
  989. {
  990. id: 'S-03', icon: '📋', tint: '#F5A623',
  991. title: '体检红字 · 脂肪肝惊吓',
  992. desc: '年度体检 ALT/AST 红字 · 医生说"轻度脂肪肝" · 全家恐慌 · 开始查资料',
  993. needs: ['医学级复合配方', '可追溯临床数据', '3 个月见效承诺'],
  994. hero: '"轻度脂肪肝 90 天干预方案 · 江中复合护肝"',
  995. sku: 'L-01 应酬版(医用版)¥148',
  996. voc: '"我之前体检说重度脂肪肝 · 吃了一瓶半吧 · 去体检说是中度了"',
  997. },
  998. {
  999. id: 'S-04', icon: '🌸', tint: '#8B5CF6',
  1000. title: '经期肝郁 · 易怒失眠',
  1001. desc: '经前一周情绪崩溃 · 乳房胀痛 · 失眠 · 中医说"肝郁气滞" · 不想喝中药',
  1002. needs: ['中医辩证疏肝解郁', '非处方、可长期', '国潮包装、养颜加分'],
  1003. hero: '"肝郁气滞 · 疏肝解郁片 · 养肝安神"',
  1004. sku: 'L-03 疏肝解郁 ¥118',
  1005. voc: '"肝火大,脾气暴躁,肝气郁结,可以吃吗" · 23 赞',
  1006. },
  1007. {
  1008. id: 'S-05', icon: '👶', tint: '#FF8C42',
  1009. title: '特殊期 · "我能吃吗"',
  1010. desc: '孕产期/哺乳期/慢病/用药中 · 不敢乱吃 · 问医生也说不准 · 需要明确说明',
  1011. needs: ['清晰的禁忌标注', '成分白皮书', '专业客服咨询通道'],
  1012. hero: '"成分透明 · 孕产哺乳慎用 · 扫码问药师"',
  1013. sku: '无专款 · 通过一物一码转人工咨询',
  1014. voc: '"有乙肝可以吃水飞蓟保肝片吗" · "哺乳期不能吃"',
  1015. },
  1016. ];
  1017. return `<section class="report-section" id="${c.key}-3" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  1018. <div class="section-inner">
  1019. <div class="section-head rise-in">
  1020. <div class="section-eyebrow" style="color:${c.color};">${c.num}.3 · TARGET SCENARIOS</div>
  1021. <h2 class="text-h1"><span class="headline-anim">目标场景 · 5 个真实消费触发点</span></h2>
  1022. <p class="section-sub">每一个场景都来自 VOC 真实原声 · 对应独立话术 + 独立 SKU 承接 · 场景化营销 > 通用化广告 · 这是打破护肝品类红海的根本路径</p>
  1023. </div>
  1024. <!-- 场景 grid(3+2 布局) -->
  1025. <div class="grid" style="grid-template-columns:repeat(3, 1fr); gap:16px; margin-bottom:16px;">
  1026. ${scenarios.slice(0, 3).map((s) => renderScenarioCard(s)).join('')}
  1027. </div>
  1028. <div class="grid" style="grid-template-columns:repeat(2, 1fr); gap:16px;">
  1029. ${scenarios.slice(3).map((s) => renderScenarioCard(s)).join('')}
  1030. </div>
  1031. <!-- 场景触发密度热力图 -->
  1032. <div class="fade-up" style="margin-top:28px; padding:22px 28px; background:linear-gradient(135deg, ${c.color}08, rgba(255,255,255,0.02)); border:1px solid ${c.color}22; border-radius:var(--radius-md);">
  1033. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:14px;">🔥 SCENARIO INTENSITY · VOC 场景触发热力</div>
  1034. <div style="display:grid; grid-template-columns:repeat(5, 1fr); gap:6px;">
  1035. ${scenarios.map((s) => {
  1036. const intensity = s.id === 'S-01' ? 95 : s.id === 'S-02' ? 85 : s.id === 'S-03' ? 70 : s.id === 'S-04' ? 55 : 30;
  1037. return `<div style="background:${s.tint}${Math.round(intensity * 0.5).toString(16).padStart(2, '0')}; padding:14px 12px; border-radius:8px; border:1px solid ${s.tint}44; text-align:center;">
  1038. <div style="font-size:1.1rem; margin-bottom:6px;">${s.icon}</div>
  1039. <div class="text-mono text-xs" style="color:${s.tint}; letter-spacing:0.08em; font-weight:700;">${s.id} · ${intensity}%</div>
  1040. <div style="font-size:0.7rem; color:var(--text-2); margin-top:4px; line-height:1.35;">${esc(s.title.split(' · ')[0])}</div>
  1041. </div>`;
  1042. }).join('')}
  1043. </div>
  1044. <div style="margin-top:12px; font-size:0.82rem; color:var(--text-2); line-height:1.6;">
  1045. <strong style="color:${c.color};">投入优先级</strong>:S-01 / S-02 / S-03 三大场景占用户决策 85% 以上的触发动机 → 产品开发与营销预算的黄金配比应为 <strong style="color:${c.color};">5:3:2:1:0.5</strong>(熬夜:应酬:体检:情绪:特殊)
  1046. </div>
  1047. </div>
  1048. </div>
  1049. </section>`;
  1050. // 场景卡生成器(内部 helper)
  1051. function renderScenarioCard(s) {
  1052. return `<div class="fade-up" style="background:var(--bg-1); border:1px solid var(--border); border-left:4px solid ${s.tint}; border-radius:var(--radius-md); padding:22px 24px; display:flex; flex-direction:column; gap:14px;">
  1053. <div style="display:flex; justify-content:space-between; align-items:start;">
  1054. <div>
  1055. <div class="text-mono text-xs" style="color:${s.tint}; letter-spacing:0.12em; font-weight:700;">${s.id}</div>
  1056. <h3 class="text-h3" style="margin:4px 0 0; font-size:1.15rem; color:var(--text-1);">${esc(s.title)}</h3>
  1057. </div>
  1058. <div style="font-size:2.2rem; line-height:1;">${s.icon}</div>
  1059. </div>
  1060. <p style="font-size:0.85rem; color:var(--text-2); line-height:1.6; margin:0;">${esc(s.desc)}</p>
  1061. <div>
  1062. <div class="text-mono text-xs" style="color:var(--text-3); letter-spacing:0.1em; margin-bottom:6px;">NEEDS · 诉求点</div>
  1063. <ul style="list-style:none; padding:0; margin:0; display:flex; flex-direction:column; gap:4px;">
  1064. ${s.needs.map((n) => `<li style="font-size:0.8rem; color:var(--text-1); padding-left:14px; position:relative; line-height:1.5;"><span style="position:absolute; left:0; color:${s.tint};">▸</span>${esc(n)}</li>`).join('')}
  1065. </ul>
  1066. </div>
  1067. <div style="padding:12px 14px; background:${s.tint}0F; border-left:2px solid ${s.tint}; border-radius:0 6px 6px 0;">
  1068. <div class="text-mono text-xs" style="color:${s.tint}; letter-spacing:0.1em; margin-bottom:4px;">HERO CLAIM · 沟通重点</div>
  1069. <div style="font-size:0.9rem; color:var(--text-1); line-height:1.5; font-weight:600;">${esc(s.hero)}</div>
  1070. </div>
  1071. <div style="display:flex; justify-content:space-between; align-items:center; padding-top:10px; border-top:1px dashed var(--border); font-size:0.75rem;">
  1072. <span style="color:var(--text-3);">承接 SKU:</span>
  1073. <span style="color:${s.tint}; font-weight:700;">${esc(s.sku)}</span>
  1074. </div>
  1075. <div style="padding:10px 12px; background:rgba(255,255,255,0.02); border-radius:6px;">
  1076. <div class="text-mono text-xs" style="color:var(--text-3); margin-bottom:4px;">VOC 原声</div>
  1077. <div style="font-size:0.76rem; color:var(--text-2); line-height:1.55; font-style:italic;">${esc(s.voc)}</div>
  1078. </div>
  1079. </div>`;
  1080. }
  1081. }
  1082. // ----- 2.2.4 核心利益模型 · 3-Tier Benefit Pyramid ---------------------------
  1083. function renderPosition4Benefits({ slideNum, slideTotal, chapter, A }) {
  1084. const c = chapter;
  1085. const tiers = [
  1086. {
  1087. level: '3', name: 'SOCIAL · 社会利益', icon: '🌟', tint: '#FF4D8D',
  1088. desc: '成为"懂成分的科学养生党" · 给家人买健康是顶梁柱的责任',
  1089. width: 35,
  1090. examples: ['朋友圈晒"我给爸妈买的护肝"', '同事间成分讨论圈', '"懂成分党"身份认同'],
  1091. },
  1092. {
  1093. level: '2', name: 'EMOTIONAL · 情感利益', icon: '💗', tint: '#D4A574',
  1094. desc: '安心感 · 自我补偿合法化 · 被守护的温暖',
  1095. width: 70,
  1096. examples: ['"我给自己最科学的保护"', '熬夜后的"道德许可证"', '"吃了就能放心加班"'],
  1097. },
  1098. {
  1099. level: '1', name: 'FUNCTIONAL · 功能利益', icon: '🛡️', tint: BRAND.JIANG_GREEN,
  1100. desc: '4 重协同护肝 · 成分克数透明 · 场景精准 · 吃得少吃得准',
  1101. width: 100,
  1102. examples: ['水飞蓟 200mg 保肝修复', '姜黄 150mg 抗炎', '蒲公英 100mg 利胆代谢', 'NAC 100mg 抗氧化', '一片多效 · 单瓶 30 天'],
  1103. },
  1104. ];
  1105. const validations = [
  1106. { dim: '4 重协同', perception: '"一片顶 4 瓶"', support: '临床协同效应 +47%', evidence: '每瓶背面成分克数透明表' },
  1107. { dim: '场景分化', perception: '"不同场景不同瓶"', support: 'L-01/02/03/04/05 分化 SKU', evidence: 'VOC 应酬 7 次/熬夜 4 次/情绪 2 次触发' },
  1108. { dim: '江中背书', perception: '"江中的,放心"', support: '45 年 OTC 国民品牌', evidence: '健胃消食片等品牌资产迁移' },
  1109. { dim: '一片多效', perception: '"不用配一堆瓶"', support: '单位剂量高密度设计', evidence: '单片 = 传统 3-4 瓶配方' },
  1110. { dim: '安心感', perception: '"守护感"', support: '品牌 + 成分双背书', evidence: '一物一码 · 独立检测报告' },
  1111. { dim: '自信感', perception: '"我选的很科学"', support: '成分党身份认同', evidence: '成分详情页技术向内容' },
  1112. ];
  1113. return `<section class="report-section" id="${c.key}-4" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  1114. <div class="section-inner">
  1115. <div class="section-head rise-in">
  1116. <div class="section-eyebrow" style="color:${c.color};">${c.num}.4 · CORE BENEFIT MODEL</div>
  1117. <h2 class="text-h1"><span class="headline-anim">核心利益模型 · 3 层需求金字塔</span></h2>
  1118. <p class="section-sub">从功能 → 情感 → 社会的三层利益递进 · 覆盖马斯洛需求层级 · 每一层都有对应的 VOC 感知语言和产品支撑点</p>
  1119. </div>
  1120. <!-- 金字塔可视化 -->
  1121. <div class="fade-up" style="margin-bottom:32px; padding:36px; background:var(--bg-1); border:1px solid var(--border); border-radius:var(--radius-md);">
  1122. <div style="display:flex; flex-direction:column; gap:8px; align-items:center;">
  1123. ${tiers.map((tier) => `
  1124. <div style="width:${tier.width}%; background:linear-gradient(135deg, ${tier.tint}dd, ${tier.tint}88); padding:20px 28px; border-radius:var(--radius-md); text-align:center; position:relative; transition:all .3s; box-shadow:0 8px 24px -6px ${tier.tint}66;">
  1125. <div style="display:flex; justify-content:center; align-items:center; gap:14px; margin-bottom:8px;">
  1126. <span style="font-size:1.8rem;">${tier.icon}</span>
  1127. <div>
  1128. <div class="text-mono text-xs" style="color:#fff; opacity:0.8; letter-spacing:0.15em; margin-bottom:2px;">LAYER ${tier.level}</div>
  1129. <div style="color:#fff; font-weight:800; font-size:1.1rem;">${esc(tier.name)}</div>
  1130. </div>
  1131. </div>
  1132. <div style="color:rgba(255,255,255,0.92); font-size:0.9rem; line-height:1.55; margin-bottom:10px;">${esc(tier.desc)}</div>
  1133. <div style="display:flex; flex-wrap:wrap; justify-content:center; gap:6px;">
  1134. ${tier.examples.map((ex) => `<span style="background:rgba(255,255,255,0.18); color:#fff; font-size:0.72rem; padding:3px 10px; border-radius:999px;">${esc(ex)}</span>`).join('')}
  1135. </div>
  1136. </div>`).join('')}
  1137. </div>
  1138. <!-- 金字塔右侧注释 -->
  1139. <div style="margin-top:20px; display:grid; grid-template-columns:repeat(3, 1fr); gap:16px; text-align:center;">
  1140. <div>
  1141. <div class="text-mono text-xs" style="color:${tiers[2].tint}; letter-spacing:0.12em;">FUNCTIONAL</div>
  1142. <div style="color:var(--text-2); font-size:0.82rem; margin-top:4px;">支撑购买决策的合理化基础</div>
  1143. </div>
  1144. <div>
  1145. <div class="text-mono text-xs" style="color:${tiers[1].tint}; letter-spacing:0.12em;">EMOTIONAL</div>
  1146. <div style="color:var(--text-2); font-size:0.82rem; margin-top:4px;">驱动复购和品牌忠诚的感性钩子</div>
  1147. </div>
  1148. <div>
  1149. <div class="text-mono text-xs" style="color:${tiers[0].tint}; letter-spacing:0.12em;">SOCIAL</div>
  1150. <div style="color:var(--text-2); font-size:0.82rem; margin-top:4px;">引发口碑扩散的自我表达维度</div>
  1151. </div>
  1152. </div>
  1153. </div>
  1154. <!-- 利益验证表 -->
  1155. <h3 class="text-h2 fade-up" style="margin-bottom:14px;">🔬 Benefit Validation · 6 维度利益验证</h3>
  1156. <div class="table-wrap fade-up">
  1157. <table class="data-tbl">
  1158. <thead>
  1159. <tr>
  1160. <th style="width:130px;">利益维度</th>
  1161. <th>消费者感知(VOC 语言)</th>
  1162. <th>产品/传播支撑</th>
  1163. <th>可验证证据</th>
  1164. </tr>
  1165. </thead>
  1166. <tbody>
  1167. ${validations.map((v) => `<tr>
  1168. <td><strong style="color:${c.color};">${esc(v.dim)}</strong></td>
  1169. <td style="font-style:italic; color:var(--text-2);">${esc(v.perception)}</td>
  1170. <td>${esc(v.support)}</td>
  1171. <td style="color:var(--text-1); font-size:0.82rem;">${esc(v.evidence)}</td>
  1172. </tr>`).join('')}
  1173. </tbody>
  1174. </table>
  1175. </div>
  1176. </div>
  1177. </section>`;
  1178. }
  1179. // ----- 2.2.5 品牌个性 · Brand Personality (Archetype + Radar + Voice) --------
  1180. function renderPosition5Personality({ slideNum, slideTotal, chapter, A }) {
  1181. const c = chapter;
  1182. // 品牌个性雷达图(SVG)
  1183. const dims = [
  1184. { name: '专业', score: 5, tint: BRAND.TECH_BLUE },
  1185. { name: '靠谱', score: 5, tint: BRAND.JIANG_GREEN },
  1186. { name: '创新', score: 4, tint: c.color },
  1187. { name: '温暖', score: 4, tint: '#FF8C42' },
  1188. { name: '透明', score: 5, tint: '#8B5CF6' },
  1189. { name: '科学', score: 5, tint: '#0085CA' },
  1190. ];
  1191. const cx = 140, cy = 140, r = 100;
  1192. const radarPts = dims.map((d, i) => {
  1193. const angle = (i / dims.length) * Math.PI * 2 - Math.PI / 2;
  1194. const rr = (d.score / 5) * r;
  1195. return `${(cx + rr * Math.cos(angle)).toFixed(1)},${(cy + rr * Math.sin(angle)).toFixed(1)}`;
  1196. }).join(' ');
  1197. const axisLabels = dims.map((d, i) => {
  1198. const angle = (i / dims.length) * Math.PI * 2 - Math.PI / 2;
  1199. const lr = r + 18;
  1200. return { x: cx + lr * Math.cos(angle), y: cy + lr * Math.sin(angle), text: d.name, tint: d.tint };
  1201. });
  1202. const voice = [
  1203. { tone: '专业而不说教', dont: '"你这种熬夜习惯必须改!"', do_: '"理解,熬夜改不掉。那我们至少把护肝这件事做专业。"' },
  1204. { tone: '温暖而不煽情', dont: '"妈妈,您辛苦了 😭"', do_: '"给家人一份每天可查成分的安心"' },
  1205. { tone: '直接而不炫技', dont: '"含多糖类复合物及 NAC..."', do_: '"水飞蓟 200mg + 姜黄 150mg + 蒲公英 + NAC,每一克都写清楚"' },
  1206. { tone: '科学而不冷漠', dont: '"本品不是药物,不可替代治疗"(冷冰冰免责)', do_: '"成分白皮书扫码看,任何问题药师在线解答"' },
  1207. ];
  1208. return `<section class="report-section" id="${c.key}-5" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  1209. <div class="section-inner">
  1210. <div class="section-head rise-in">
  1211. <div class="section-eyebrow" style="color:${c.color};">${c.num}.5 · BRAND PERSONALITY</div>
  1212. <h2 class="text-h1"><span class="headline-anim">品牌个性 · Caregiver × Sage × Creator</span></h2>
  1213. <p class="section-sub">品牌原型三角架构 · 6 维个性雷达 · 4 条"DO / DON'T"品牌声音规范 · 保证每次用户触达的一致性</p>
  1214. </div>
  1215. <!-- 品牌原型三角 -->
  1216. <div class="grid fade-up" style="grid-template-columns:repeat(3, 1fr); gap:16px; margin-bottom:32px;">
  1217. <div style="padding:24px; background:linear-gradient(135deg, ${BRAND.JIANG_GREEN}22, transparent); border:1px solid ${BRAND.JIANG_GREEN}44; border-radius:var(--radius-md); text-align:center;">
  1218. <div style="font-size:2.8rem; margin-bottom:10px;">🛡️</div>
  1219. <div class="text-mono text-xs" style="color:${BRAND.JIANG_GREEN}; letter-spacing:0.15em; margin-bottom:6px;">ARCHETYPE 1</div>
  1220. <h3 style="margin:0 0 8px; color:var(--text-1); font-size:1.2rem;">The Caregiver · 照顾者</h3>
  1221. <p style="color:var(--text-2); font-size:0.85rem; line-height:1.6; margin:0;">关注、守护、不侵犯边界 · 像"家里的保健品药箱"一样稳稳存在</p>
  1222. </div>
  1223. <div style="padding:24px; background:linear-gradient(135deg, ${BRAND.TECH_BLUE}22, transparent); border:1px solid ${BRAND.TECH_BLUE}44; border-radius:var(--radius-md); text-align:center;">
  1224. <div style="font-size:2.8rem; margin-bottom:10px;">📚</div>
  1225. <div class="text-mono text-xs" style="color:${BRAND.TECH_BLUE}; letter-spacing:0.15em; margin-bottom:6px;">ARCHETYPE 2</div>
  1226. <h3 style="margin:0 0 8px; color:var(--text-1); font-size:1.2rem;">The Sage · 智者</h3>
  1227. <p style="color:var(--text-2); font-size:0.85rem; line-height:1.6; margin:0;">循证医学 · 数据说话 · 拒绝"神化"和"智商税"营销 · 与用户一起理解成分</p>
  1228. </div>
  1229. <div style="padding:24px; background:linear-gradient(135deg, ${c.color}22, transparent); border:1px solid ${c.color}44; border-radius:var(--radius-md); text-align:center;">
  1230. <div style="font-size:2.8rem; margin-bottom:10px;">✨</div>
  1231. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:6px;">ARCHETYPE 3</div>
  1232. <h3 style="margin:0 0 8px; color:var(--text-1); font-size:1.2rem;">The Creator · 创新者</h3>
  1233. <p style="color:var(--text-2); font-size:0.85rem; line-height:1.6; margin:0;">敢做"新一代" · 打破单成分水飞蓟老格局 · 场景化 SKU 开创者</p>
  1234. </div>
  1235. </div>
  1236. <!-- 雷达图 + 品牌声音 双栏 -->
  1237. <div class="grid fade-up" style="grid-template-columns:380px 1fr; gap:24px;">
  1238. <!-- 左:SVG 雷达图 -->
  1239. <div style="background:var(--bg-1); border:1px solid var(--border); border-radius:var(--radius-md); padding:24px; text-align:center;">
  1240. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:14px;">PERSONALITY RADAR · 6 维雷达</div>
  1241. <svg viewBox="0 0 280 280" style="width:100%; max-width:280px; margin:0 auto; display:block;">
  1242. ${[1, 2, 3, 4, 5].map((ring) => `<polygon points="${dims.map((_, i) => {
  1243. const angle = (i / dims.length) * Math.PI * 2 - Math.PI / 2;
  1244. const rr = (ring / 5) * r;
  1245. return `${(cx + rr * Math.cos(angle)).toFixed(1)},${(cy + rr * Math.sin(angle)).toFixed(1)}`;
  1246. }).join(' ')}" fill="none" stroke="rgba(255,255,255,0.06)" stroke-width="1"/>`).join('')}
  1247. ${dims.map((_, i) => {
  1248. const angle = (i / dims.length) * Math.PI * 2 - Math.PI / 2;
  1249. return `<line x1="${cx}" y1="${cy}" x2="${(cx + r * Math.cos(angle)).toFixed(1)}" y2="${(cy + r * Math.sin(angle)).toFixed(1)}" stroke="rgba(255,255,255,0.08)" stroke-width="1"/>`;
  1250. }).join('')}
  1251. <polygon points="${radarPts}" fill="${c.color}44" stroke="${c.color}" stroke-width="2"/>
  1252. ${dims.map((d, i) => {
  1253. const angle = (i / dims.length) * Math.PI * 2 - Math.PI / 2;
  1254. const rr = (d.score / 5) * r;
  1255. return `<circle cx="${(cx + rr * Math.cos(angle)).toFixed(1)}" cy="${(cy + rr * Math.sin(angle)).toFixed(1)}" r="4" fill="${d.tint}"/>`;
  1256. }).join('')}
  1257. ${axisLabels.map((l) => `<text x="${l.x.toFixed(0)}" y="${l.y.toFixed(0)}" text-anchor="middle" dominant-baseline="central" style="fill:${l.tint}; font-family:var(--font-head); font-weight:700; font-size:13px;">${l.text}</text>`).join('')}
  1258. </svg>
  1259. <div style="margin-top:16px; display:grid; grid-template-columns:repeat(2, 1fr); gap:6px; font-size:0.78rem;">
  1260. ${dims.map((d) => `<div style="display:flex; justify-content:space-between; padding:4px 8px; background:rgba(255,255,255,0.02); border-radius:4px;">
  1261. <span style="color:var(--text-2);">${d.name}</span>
  1262. <span class="text-mono" style="color:${d.tint}; font-weight:700;">${d.score}/5</span>
  1263. </div>`).join('')}
  1264. </div>
  1265. </div>
  1266. <!-- 右:品牌声音 DO/DON'T -->
  1267. <div>
  1268. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:14px;">BRAND VOICE · 品牌声音规范</div>
  1269. <div style="display:flex; flex-direction:column; gap:12px;">
  1270. ${voice.map((v, i) => `
  1271. <div style="background:var(--bg-1); border:1px solid var(--border); border-radius:var(--radius-md); overflow:hidden;">
  1272. <div style="padding:10px 16px; background:${c.color}14; font-weight:700; font-size:0.92rem; color:var(--text-1);">
  1273. <span style="color:${c.color}; font-family:var(--font-mono); font-size:0.78rem; margin-right:10px;">#${i + 1}</span>${esc(v.tone)}
  1274. </div>
  1275. <div style="display:grid; grid-template-columns:1fr 1fr;">
  1276. <div style="padding:12px 16px; border-right:1px dashed var(--border);">
  1277. <div class="text-mono text-xs" style="color:var(--rose); letter-spacing:0.12em; margin-bottom:4px;">❌ DON'T</div>
  1278. <div style="font-size:0.82rem; color:var(--text-2); line-height:1.55; font-style:italic;">${esc(v.dont)}</div>
  1279. </div>
  1280. <div style="padding:12px 16px; background:rgba(0,220,130,0.03);">
  1281. <div class="text-mono text-xs" style="color:var(--green); letter-spacing:0.12em; margin-bottom:4px;">✅ DO</div>
  1282. <div style="font-size:0.82rem; color:var(--text-1); line-height:1.55;">${esc(v.do_)}</div>
  1283. </div>
  1284. </div>
  1285. </div>`).join('')}
  1286. </div>
  1287. </div>
  1288. </div>
  1289. </div>
  1290. </section>`;
  1291. }
  1292. // ----- 2.2.6 品牌架构 · Brand Architecture + 5 SKU Matrix --------------------
  1293. function renderPosition6Architecture({ slideNum, slideTotal, chapter, A }) {
  1294. const c = chapter;
  1295. const skus = [
  1296. { id: 'L-01', name: '江中肝纯片·应酬版', tint: BRAND.LIVER_AMBER, icon: '🍺', formula: '水飞蓟 200mg + 姜黄 150mg + 葛根 + B 族', spec: '60 片', price: '¥128', target: '应酬男', priority: 'S' },
  1297. { id: 'L-02', name: '江中肝纯片·熬夜版', tint: '#FF4D8D', icon: '🌙', formula: '水飞蓟 200mg + NAC 100mg + 牛磺酸 + GABA 助眠', spec: '60 片', price: '¥138', target: '熬夜党', priority: 'S+' },
  1298. { id: 'L-03', name: '江中疏肝解郁片', tint: '#8B5CF6', icon: '🌸', formula: '水飞蓟 + 玫瑰 + 柴胡 + 玉米须 + 维 B6', spec: '60 片', price: '¥118', target: '情绪肝女性', priority: 'A' },
  1299. { id: 'L-04', name: '江中护肝泡腾片·柑橘味', tint: '#FF8C42', icon: '🍋', formula: '水飞蓟 + 蒲公英 + 维 C + 维 B 族', spec: '20 片', price: '¥59', target: '年轻尝鲜', priority: 'B' },
  1300. { id: 'L-05', name: '江中肝纯片·家庭装', tint: BRAND.JIANG_GREEN, icon: '🏠', formula: '同 L-01 公式', spec: '120 片', price: '¥228', target: '老客户复购', priority: 'A' },
  1301. ];
  1302. const combos = [
  1303. { scene: '包装首页', combo: '江中 + 肝纯片', reason: '双品牌背书,强化信任锚定' },
  1304. { scene: '广告传播', combo: '江中肝纯片', reason: '借势江中品牌认知' },
  1305. { scene: '终端陈列', combo: '肝纯片®(右下小标江中)', reason: '突出产品名 · 江中提供背书' },
  1306. { scene: '电商平台', combo: '江中牌肝纯片', reason: '便于搜索识别 · 关键词吸引' },
  1307. { scene: '药店 POP', combo: '江中肝纯片·[版本]', reason: '突出场景化分化 SKU' },
  1308. ];
  1309. return `<section class="report-section" id="${c.key}-6" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  1310. <div class="section-inner">
  1311. <div class="section-head rise-in">
  1312. <div class="section-eyebrow" style="color:${c.color};">${c.num}.6 · BRAND ARCHITECTURE</div>
  1313. <h2 class="text-h1"><span class="headline-anim">品牌架构 · 主副品牌 + 5 SKU 矩阵</span></h2>
  1314. <p class="section-sub">江中(主品牌)→ 肝纯片(产品品牌)→ 5 条场景化 SKU 线 · 清晰的层级架构保证品牌资产的可迁移性和 SKU 扩线的灵活性</p>
  1315. </div>
  1316. <!-- 品牌架构树 -->
  1317. <div class="fade-up" style="margin-bottom:32px; padding:36px; background:var(--bg-1); border:1px solid var(--border); border-radius:var(--radius-md);">
  1318. <!-- 主品牌 -->
  1319. <div style="text-align:center; margin-bottom:16px;">
  1320. <div style="display:inline-block; padding:20px 48px; background:linear-gradient(135deg, ${BRAND.JIANG_GREEN}cc, ${BRAND.JIANG_GREEN}); border-radius:var(--radius-md); box-shadow:0 8px 24px -6px ${BRAND.JIANG_GREEN}66;">
  1321. <div class="text-mono text-xs" style="color:rgba(255,255,255,0.7); letter-spacing:0.2em; margin-bottom:4px;">MASTER BRAND</div>
  1322. <div style="font-family:var(--font-head); font-weight:900; font-size:2.4rem; color:#fff; letter-spacing:0.05em;">江中 JIANGZHONG</div>
  1323. <div style="color:rgba(255,255,255,0.85); font-size:0.82rem; margin-top:4px;">家庭健康守护者 · 45 年 OTC 国民品牌</div>
  1324. </div>
  1325. </div>
  1326. <!-- 向下箭头 + 信任背书 -->
  1327. <div style="text-align:center; margin:12px 0;">
  1328. <div style="color:${c.color}; font-size:1.6rem;">↓</div>
  1329. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.2em;">信任背书 · BRAND ENDORSEMENT</div>
  1330. </div>
  1331. <!-- 产品品牌 -->
  1332. <div style="text-align:center; margin-bottom:28px;">
  1333. <div style="display:inline-block; padding:20px 48px; background:linear-gradient(135deg, ${c.color}cc, ${c.color}); border-radius:var(--radius-md); box-shadow:0 8px 24px -6px ${c.color}66;">
  1334. <div class="text-mono text-xs" style="color:rgba(255,255,255,0.7); letter-spacing:0.2em; margin-bottom:4px;">PRODUCT BRAND</div>
  1335. <div style="font-family:var(--font-head); font-weight:900; font-size:2.1rem; color:#fff; letter-spacing:0.04em;">肝纯片®</div>
  1336. <div style="color:rgba(255,255,255,0.85); font-size:0.82rem; margin-top:4px;">新一代复合护肝片 · 一片四守</div>
  1337. </div>
  1338. </div>
  1339. <!-- 向下箭头 + SKU 说明 -->
  1340. <div style="text-align:center; margin-bottom:16px;">
  1341. <div style="color:var(--text-3); font-size:1.4rem;">↓</div>
  1342. <div class="text-mono text-xs" style="color:var(--text-3); letter-spacing:0.2em;">场景化 SKU 分化 · 5 条产品线</div>
  1343. </div>
  1344. <!-- SKU 矩阵 -->
  1345. <div style="display:grid; grid-template-columns:repeat(5, 1fr); gap:10px;">
  1346. ${skus.map((sku) => `
  1347. <div style="padding:14px 12px; background:var(--bg-2); border:1px solid var(--border); border-top:3px solid ${sku.tint}; border-radius:8px; text-align:center; display:flex; flex-direction:column; gap:6px;">
  1348. <div style="font-size:1.6rem; line-height:1;">${sku.icon}</div>
  1349. <div class="text-mono" style="color:${sku.tint}; font-weight:800; font-size:0.85rem; letter-spacing:0.05em;">${esc(sku.id)}</div>
  1350. <div style="color:var(--text-1); font-size:0.8rem; font-weight:700; line-height:1.35;">${esc(sku.name.split('·')[1] || sku.name).trim()}</div>
  1351. <div style="margin-top:auto;">
  1352. <span class="tag" style="background:${sku.tint}22; color:${sku.tint}; border-color:${sku.tint}44; font-size:0.68rem;">PRI · ${sku.priority}</span>
  1353. </div>
  1354. </div>`).join('')}
  1355. </div>
  1356. </div>
  1357. <!-- SKU 详情矩阵表 -->
  1358. <h3 class="text-h2 fade-up" style="margin-bottom:14px;">📋 SKU Matrix · 5 条产品线完整规格</h3>
  1359. <div class="table-wrap fade-up" style="margin-bottom:24px;">
  1360. <table class="data-tbl">
  1361. <thead>
  1362. <tr>
  1363. <th style="width:56px;">ID</th>
  1364. <th>产品名</th>
  1365. <th>核心配方</th>
  1366. <th style="width:80px;">规格</th>
  1367. <th style="width:90px;">售价</th>
  1368. <th style="width:120px;">目标人群</th>
  1369. <th style="width:70px;">优先级</th>
  1370. </tr>
  1371. </thead>
  1372. <tbody>
  1373. ${skus.map((sku) => `<tr>
  1374. <td><strong style="color:${sku.tint};">${esc(sku.id)}</strong></td>
  1375. <td><span style="font-size:1.1rem; margin-right:6px;">${sku.icon}</span><strong>${esc(sku.name)}</strong></td>
  1376. <td style="font-size:0.82rem; color:var(--text-2);">${esc(sku.formula)}</td>
  1377. <td class="tb-num">${esc(sku.spec)}</td>
  1378. <td class="tb-num" style="color:var(--amber);">${esc(sku.price)}</td>
  1379. <td>${esc(sku.target)}</td>
  1380. <td><span class="tag" style="background:${sku.tint}22; color:${sku.tint}; border-color:${sku.tint}44;">${esc(sku.priority)}</span></td>
  1381. </tr>`).join('')}
  1382. </tbody>
  1383. </table>
  1384. </div>
  1385. <!-- 主副品牌组合使用规范 -->
  1386. <h3 class="text-h2 fade-up" style="margin-bottom:14px;">🎨 Brand Combo Guidelines · 主副品牌组合使用规范</h3>
  1387. <div class="table-wrap fade-up">
  1388. <table class="data-tbl">
  1389. <thead>
  1390. <tr>
  1391. <th style="width:140px;">场景</th>
  1392. <th style="width:260px;">品牌组合</th>
  1393. <th>理由</th>
  1394. </tr>
  1395. </thead>
  1396. <tbody>
  1397. ${combos.map((cb) => `<tr>
  1398. <td><strong>${esc(cb.scene)}</strong></td>
  1399. <td style="font-family:var(--font-head); font-weight:700; color:${c.color};">${esc(cb.combo)}</td>
  1400. <td style="color:var(--text-2);">${esc(cb.reason)}</td>
  1401. </tr>`).join('')}
  1402. </tbody>
  1403. </table>
  1404. </div>
  1405. </div>
  1406. </section>`;
  1407. }
  1408. // ============================================================================
  1409. // ============ Chapter 2.3 · 包装 · 5 子章完整内容 ============================
  1410. // ============================================================================
  1411. // ----- 2.3.1 包装策略 · Package Strategy -------------------------------------
  1412. function renderPackage1Strategy({ slideNum, slideTotal, chapter, A }) {
  1413. const c = chapter;
  1414. const principles = [
  1415. { id: '01', name: '品牌一致性', icon: '🎨', tint: BRAND.JIANG_GREEN, req: '延续江中绿主色调 + 品牌字形 · 建立与健胃消食片、乳酸菌等老品相同的家族视觉', target: '品牌资产迁移 · 货架一眼识别' },
  1416. { id: '02', name: '差异化设计', icon: '💡', tint: c.color, req: '琥珀金 + 4 重守护标识 · 明显区隔汤臣倍健蓝/体恒健银等传统护肝片视觉', target: '与传统单成分护肝片拉开差距' },
  1417. { id: '03', name: '信息精准', icon: '🎯', tint: BRAND.TECH_BLUE, req: '主视觉区直接承载「新一代复合护肝」+「一片四守」主 Claim · 3 秒内传递核心定位', target: '用户 3 秒完成决策判断' },
  1418. { id: '04', name: '信任背书', icon: '🏛️', tint: '#8B5CF6', req: '顶部江中 LOGO + 正面「成分克数透明表」印刷 + 右下「一物一码 · 扫码看检测报告」', target: '主动化解信任危机' },
  1419. { id: '05', name: '合规优先', icon: '⚖️', tint: '#FF8C42', req: 'OTC / 保健食品标识 + 药监局批号 + 适应症/禁忌标注 + 孕哺乳慎用 + 置于儿童不易接触处', target: '审核一次过 · 不返工' },
  1420. ];
  1421. return `<section class="report-section" id="${c.key}-1" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  1422. <div class="section-inner">
  1423. <div class="section-head rise-in">
  1424. <div class="section-eyebrow" style="color:${c.color};">${c.num}.1 · PACKAGE STRATEGY</div>
  1425. <h2 class="text-h1"><span class="headline-anim">包装策略 · 5 项核心设计原则</span></h2>
  1426. <p class="section-sub">包装不仅是容器 · 是产品"第一位销售员" · 以「新一代复合护肝 · 一片四守」为定位锚点 · 建立差异化 + 可信任 + 合规三重保障</p>
  1427. </div>
  1428. <!-- Hero 包装定位语 -->
  1429. <div class="fade-up" style="background:linear-gradient(135deg, var(--bg-1) 0%, ${c.color}14 100%); border:1px solid ${c.color}44; border-radius:var(--radius-lg); padding:36px 48px; margin-bottom:32px; display:grid; grid-template-columns: 1fr auto; gap:32px; align-items:center;">
  1430. <div>
  1431. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.2em; margin-bottom:10px;">PACKAGE POSITIONING · 包装定位语</div>
  1432. <h3 style="font-family:var(--font-head); font-weight:900; font-size:clamp(1.6rem, 3vw, 2.4rem); line-height:1.25; color:var(--text-1); margin:0 0 12px;">新一代复合护肝 · 一片四守</h3>
  1433. <p style="color:var(--text-2); font-size:1rem; line-height:1.7; margin:0;">
  1434. 包装必须在货架上 <strong style="color:${c.color};">3 秒内</strong> 完成 3 件事:<br/>
  1435. ① 让用户认出「江中出品」的可信任 · ② 一眼看懂「4 重协同」的复合特征 · ③ 扫描到克数透明表的科学感
  1436. </p>
  1437. </div>
  1438. <div style="text-align:center;">
  1439. <div style="width:120px; height:120px; border-radius:50%; background:linear-gradient(135deg, ${BRAND.JIANG_GREEN}, ${c.color}); display:flex; align-items:center; justify-content:center; box-shadow:0 10px 30px -8px ${c.color}88;">
  1440. <div>
  1441. <div style="font-size:2.5rem;">🛡️</div>
  1442. <div class="text-mono text-xs" style="color:#fff; font-weight:700; letter-spacing:0.12em;">4 SHIELDS</div>
  1443. </div>
  1444. </div>
  1445. </div>
  1446. </div>
  1447. <!-- 5 项设计原则 -->
  1448. <h3 class="text-h2 fade-up" style="margin-bottom:18px;">📐 5 项设计原则 · 执行 Checklist</h3>
  1449. <div style="display:flex; flex-direction:column; gap:12px;">
  1450. ${principles.map((p, i) => `
  1451. <div class="fade-up" style="display:grid; grid-template-columns: 72px 200px 1fr 180px; gap:20px; align-items:center; padding:22px 28px; background:var(--bg-1); border:1px solid var(--border); border-left:4px solid ${p.tint}; border-radius:var(--radius-md); transition:all .3s;">
  1452. <div style="text-align:center;">
  1453. <div style="font-size:2.2rem; line-height:1;">${p.icon}</div>
  1454. <div class="text-mono" style="color:${p.tint}; font-weight:800; font-size:0.72rem; letter-spacing:0.12em; margin-top:4px;">#${p.id}</div>
  1455. </div>
  1456. <div>
  1457. <div class="text-mono text-xs" style="color:${p.tint}; letter-spacing:0.1em; margin-bottom:4px;">PRINCIPLE</div>
  1458. <div style="font-weight:800; font-size:1.1rem; color:var(--text-1);">${esc(p.name)}</div>
  1459. </div>
  1460. <div style="color:var(--text-2); font-size:0.9rem; line-height:1.65;">${esc(p.req)}</div>
  1461. <div style="padding:10px 14px; background:${p.tint}12; border-left:2px solid ${p.tint}; border-radius:0 6px 6px 0;">
  1462. <div class="text-mono text-xs" style="color:${p.tint}; letter-spacing:0.1em; margin-bottom:4px;">TARGET</div>
  1463. <div style="color:var(--text-1); font-size:0.82rem; font-weight:600;">${esc(p.target)}</div>
  1464. </div>
  1465. </div>`).join('')}
  1466. </div>
  1467. <!-- 底部策略声明 -->
  1468. <div class="fade-up" style="margin-top:24px; padding:22px 28px; background:linear-gradient(135deg, rgba(45,156,93,0.06), rgba(212,165,116,0.04)); border:1px dashed ${c.color}44; border-radius:var(--radius-md);">
  1469. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:10px;">💡 STRATEGIC CORE · 策略核心</div>
  1470. <div style="color:var(--text-1); font-size:1rem; line-height:1.75;">
  1471. <strong style="color:${c.color};">差异化 + 信任 + 合规</strong> 三者缺一不可。VOC Top #3「不要吃护肝片」2355 赞指出:用户对传统护肝片信任崩塌 → 包装设计必须<strong style="color:${c.color};">主动破除</strong>(正面印成分克数 + 扫码查检测报告),而非被动防守。
  1472. </div>
  1473. </div>
  1474. </div>
  1475. </section>`;
  1476. }
  1477. // ----- 2.3.2 视觉层级设计 · 4-Layer Visual Hierarchy -------------------------
  1478. function renderPackage2Hierarchy({ slideNum, slideTotal, chapter, A }) {
  1479. const c = chapter;
  1480. const layers = [
  1481. {
  1482. num: '1', name: '视觉焦点层', en: 'Focal Point', tint: c.color, priority: '★★★★★',
  1483. content: ['「肝纯片®」大字(主视觉字)', '副标题「新一代复合护肝片」', '核心视觉:4 色守护盾牌插画', '版本 badge(应酬版/熬夜版/疏肝解郁等)'],
  1484. size: '占据正面 50% 面积',
  1485. rationale: '货架 3 秒决策 · 最大视觉权重承载核心认知',
  1486. },
  1487. {
  1488. num: '2', name: '认知信息层', en: 'Cognition', tint: BRAND.JIANG_GREEN, priority: '★★★★',
  1489. content: ['核心诉求语:「水飞蓟 200mg · 姜黄 150mg · 蒲公英 100mg · NAC 100mg」', '"一片四守" 图标 + 文字组合', '4 种成分插画(可视化协同)', '适用场景 icon(夜/酒杯/花/泡腾)'],
  1490. size: '正面 25% 面积',
  1491. rationale: '用户在 3-10 秒内形成功能认知 · 明确"买它能干嘛"',
  1492. },
  1493. {
  1494. num: '3', name: '信任背书层', en: 'Trust', tint: BRAND.TECH_BLUE, priority: '★★★★',
  1495. content: ['顶部:江中 LOGO + "45 年 OTC 国民品牌" 小字', '右下:一物一码 + "扫码看第三方检测报告"', '底部:成分克数透明表格(主动展示)', 'OTC / 保健食品标识(Z/OTC 印章)'],
  1496. size: '分散在正反面关键位置',
  1497. rationale: '主动化解「不要吃护肝片」信任危机的第一道防线',
  1498. },
  1499. {
  1500. num: '4', name: '合规信息层', en: 'Compliance', tint: '#8B5CF6', priority: '★★',
  1501. content: ['背面:完整说明书摘要', '成分/适应症/用法用量', '禁忌/注意事项/警示语', '批准文号 / 生产商 / 有效期'],
  1502. size: '背面 + 侧面',
  1503. rationale: '监管合规 · 保护用户 · 不可见但必须存在',
  1504. },
  1505. ];
  1506. return `<section class="report-section" id="${c.key}-2" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  1507. <div class="section-inner">
  1508. <div class="section-head rise-in">
  1509. <div class="section-eyebrow" style="color:${c.color};">${c.num}.2 · VISUAL HIERARCHY</div>
  1510. <h2 class="text-h1"><span class="headline-anim">视觉层级设计 · 4 层信息架构</span></h2>
  1511. <p class="section-sub">从 3 秒决策到 3 分钟阅读 · 包装信息必须分级呈现 · 每一层都有独立的视觉权重 / 位置 / 优先级 / 存在理由</p>
  1512. </div>
  1513. <!-- 包装示意图 (SVG) + 4 层分级 -->
  1514. <div class="grid fade-up" style="grid-template-columns: 320px 1fr; gap:32px; margin-bottom:32px; align-items:start;">
  1515. <!-- 左:包装正面示意 SVG -->
  1516. <div style="background:var(--bg-1); border:1px solid var(--border); border-radius:var(--radius-md); padding:20px;">
  1517. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:14px; text-align:center;">PACKAGE FRONT · 包装正面示意</div>
  1518. <svg viewBox="0 0 280 400" style="width:100%; display:block; background:#2D9C5D; border-radius:12px;">
  1519. <!-- 背景渐变 -->
  1520. <defs>
  1521. <linearGradient id="pkg-bg" x1="0" y1="0" x2="0" y2="1">
  1522. <stop offset="0%" stop-color="#2D9C5D"/>
  1523. <stop offset="100%" stop-color="#1a6940"/>
  1524. </linearGradient>
  1525. <linearGradient id="gold" x1="0" y1="0" x2="1" y2="1">
  1526. <stop offset="0%" stop-color="#F5E6C9"/>
  1527. <stop offset="100%" stop-color="#D4A574"/>
  1528. </linearGradient>
  1529. </defs>
  1530. <rect x="0" y="0" width="280" height="400" fill="url(#pkg-bg)"/>
  1531. <!-- Layer 3: Top - brand -->
  1532. <rect x="0" y="0" width="280" height="40" fill="rgba(0,0,0,0.2)"/>
  1533. <text x="140" y="26" text-anchor="middle" style="fill:#fff; font-family:sans-serif; font-weight:700; font-size:14px; letter-spacing:0.2em;">江中 · JIANGZHONG</text>
  1534. <!-- Layer 1: Focal Point -->
  1535. <text x="140" y="110" text-anchor="middle" style="fill:url(#gold); font-family:sans-serif; font-weight:900; font-size:44px; letter-spacing:-0.02em;">肝纯片®</text>
  1536. <text x="140" y="140" text-anchor="middle" style="fill:rgba(255,255,255,0.85); font-family:sans-serif; font-weight:500; font-size:12px; letter-spacing:0.1em;">新一代复合护肝片</text>
  1537. <!-- Shield icon with 4 dots -->
  1538. <g transform="translate(140 190)">
  1539. <path d="M -40 -35 L 40 -35 Q 50 -35 50 -25 L 50 15 Q 50 50 0 60 Q -50 50 -50 15 L -50 -25 Q -50 -35 -40 -35 Z" fill="rgba(255,255,255,0.08)" stroke="url(#gold)" stroke-width="2"/>
  1540. <circle cx="-20" cy="-10" r="8" fill="#D4A574"/>
  1541. <circle cx="20" cy="-10" r="8" fill="#FF8C42"/>
  1542. <circle cx="-20" cy="20" r="8" fill="#8B5CF6"/>
  1543. <circle cx="20" cy="20" r="8" fill="#0085CA"/>
  1544. <text x="0" y="8" text-anchor="middle" style="fill:#fff; font-family:sans-serif; font-weight:800; font-size:16px;">4重</text>
  1545. </g>
  1546. <!-- Layer 2: Cognition -->
  1547. <text x="140" y="290" text-anchor="middle" style="fill:#fff; font-family:sans-serif; font-weight:700; font-size:13px; letter-spacing:0.05em;">水飞蓟 · 姜黄 · 蒲公英 · NAC</text>
  1548. <text x="140" y="310" text-anchor="middle" style="fill:url(#gold); font-family:sans-serif; font-weight:900; font-size:16px; letter-spacing:0.08em;">一片四守</text>
  1549. <!-- Layer 3: Trust - 克数透明 -->
  1550. <rect x="30" y="325" width="220" height="38" fill="rgba(0,0,0,0.3)" rx="4"/>
  1551. <text x="140" y="340" text-anchor="middle" style="fill:rgba(255,255,255,0.7); font-family:monospace; font-size:8px; letter-spacing:0.1em;">成分克数透明表</text>
  1552. <text x="140" y="355" text-anchor="middle" style="fill:#fff; font-family:monospace; font-size:9px;">200+150+100+100 mg/片</text>
  1553. <!-- Layer 3 bottom -->
  1554. <rect x="0" y="375" width="280" height="25" fill="rgba(0,0,0,0.4)"/>
  1555. <text x="16" y="391" style="fill:rgba(255,255,255,0.6); font-family:monospace; font-size:8px;">OTC · 国药准字</text>
  1556. <text x="210" y="391" style="fill:rgba(255,255,255,0.6); font-family:monospace; font-size:8px;">[二维码]</text>
  1557. <rect x="240" y="380" width="18" height="15" fill="rgba(255,255,255,0.2)" rx="2"/>
  1558. </svg>
  1559. <div style="margin-top:14px; display:flex; flex-direction:column; gap:6px; font-size:0.78rem;">
  1560. ${layers.map((l) => `<div style="display:flex; align-items:center; gap:8px; padding:4px 8px; background:rgba(255,255,255,0.02); border-left:2px solid ${l.tint}; border-radius:0 4px 4px 0;">
  1561. <span class="text-mono text-xs" style="color:${l.tint}; font-weight:700; letter-spacing:0.08em;">L${l.num}</span>
  1562. <span style="color:var(--text-2);">${l.name}</span>
  1563. </div>`).join('')}
  1564. </div>
  1565. </div>
  1566. <!-- 右:4 层详细卡片 -->
  1567. <div style="display:flex; flex-direction:column; gap:14px;">
  1568. ${layers.map((l) => `
  1569. <div style="background:var(--bg-1); border:1px solid var(--border); border-left:4px solid ${l.tint}; border-radius:var(--radius-md); padding:22px 26px;">
  1570. <div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:10px;">
  1571. <div style="display:flex; align-items:baseline; gap:14px;">
  1572. <span class="text-mono" style="color:${l.tint}; font-weight:900; font-size:1.6rem; letter-spacing:-0.02em;">L${l.num}</span>
  1573. <div>
  1574. <div class="text-mono text-xs" style="color:${l.tint}; letter-spacing:0.12em;">${esc(l.en)} LAYER</div>
  1575. <div style="font-weight:800; font-size:1.1rem; color:var(--text-1);">${esc(l.name)}</div>
  1576. </div>
  1577. </div>
  1578. <div style="text-align:right;">
  1579. <div style="color:${l.tint}; font-size:0.9rem;">${l.priority}</div>
  1580. <div class="text-mono text-xs" style="color:var(--text-3); margin-top:2px;">${esc(l.size)}</div>
  1581. </div>
  1582. </div>
  1583. <div style="margin-top:10px;">
  1584. <div class="text-mono text-xs" style="color:var(--text-3); letter-spacing:0.12em; margin-bottom:8px;">CONTENT · 内容元素</div>
  1585. <ul style="list-style:none; padding:0; margin:0; display:flex; flex-direction:column; gap:5px;">
  1586. ${l.content.map((x) => `<li style="font-size:0.85rem; color:var(--text-2); padding-left:14px; position:relative; line-height:1.5;"><span style="position:absolute; left:0; color:${l.tint};">·</span>${esc(x)}</li>`).join('')}
  1587. </ul>
  1588. </div>
  1589. <div style="margin-top:12px; padding:10px 14px; background:rgba(255,255,255,0.02); border-radius:6px;">
  1590. <div class="text-mono text-xs" style="color:${l.tint}; letter-spacing:0.1em; margin-bottom:4px;">RATIONALE · 设计理由</div>
  1591. <div style="font-size:0.82rem; color:var(--text-1); line-height:1.55; font-style:italic;">${esc(l.rationale)}</div>
  1592. </div>
  1593. </div>`).join('')}
  1594. </div>
  1595. </div>
  1596. </div>
  1597. </section>`;
  1598. }
  1599. // ----- 2.3.3 关键信息传达 · Key Info Position Matrix -------------------------
  1600. function renderPackage3KeyInfo({ slideNum, slideTotal, chapter, A }) {
  1601. const c = chapter;
  1602. const positions = [
  1603. { pos: '正面顶部', info: '江中品牌标识 + 45 年 OTC 小字', prio: 1, form: '绿底白字 · LOGO 居中' },
  1604. { pos: '正面中央', info: '肝纯片® 大字 + 新一代复合护肝片副标题', prio: 1, form: '琥珀金艺术字 + 白色副标' },
  1605. { pos: '正面中下', info: '4 重守护主视觉(盾牌 + 4 色分子点)', prio: 2, form: '守护图标 + 4 色协同视觉' },
  1606. { pos: '正面底部', info: '"一片四守 · 水飞蓟+姜黄+蒲公英+NAC"', prio: 2, form: '图标 + 文字组合 · 横向排列' },
  1607. { pos: '正面右下', info: '版本 badge(应酬/熬夜/疏肝解郁)', prio: 2, form: '圆形色块 · 按版本不同配色' },
  1608. { pos: '正面底部', info: '成分克数透明表(200+150+100+100mg)', prio: 2, form: '等宽 mono 字体 · 黑色底条' },
  1609. { pos: '正面底部', info: '一物一码 · 扫码看第三方检测报告', prio: 3, form: '二维码 + 扫码提示 · 右下角' },
  1610. { pos: '正面底部', info: 'OTC / 保健食品标识', prio: 3, form: 'Z 图章 / OTC 图章' },
  1611. { pos: '侧面 A', info: '使用图示(分步服用法)', prio: 3, form: '4 步插画 · 简笔画' },
  1612. { pos: '侧面 B', info: '成分含量表格完整版', prio: 3, form: '数据表 · 每成分克数精确' },
  1613. { pos: '背面顶部', info: '说明书摘要(适应症/用法)', prio: 4, form: '分节标题 + 内容块' },
  1614. { pos: '背面中央', info: '禁忌 + 注意事项 + 警示语', prio: 4, form: '加框强调 · 红色警示色' },
  1615. { pos: '背面底部', info: '批号 / 生产日期 / 有效期 / 生产商', prio: 4, form: 'mono 字体 · 小号信息' },
  1616. ];
  1617. const priorities = {
  1618. 1: { label: 'CRITICAL · 货架 3 秒决策', color: '#EF4444' },
  1619. 2: { label: 'IMPORTANT · 10 秒信息摄入', color: c.color },
  1620. 3: { label: 'USEFUL · 购买时辅助判断', color: BRAND.TECH_BLUE },
  1621. 4: { label: 'REQUIRED · 合规必须', color: '#6B6B6B' },
  1622. };
  1623. return `<section class="report-section" id="${c.key}-3" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  1624. <div class="section-inner">
  1625. <div class="section-head rise-in">
  1626. <div class="section-eyebrow" style="color:${c.color};">${c.num}.3 · KEY INFO PLACEMENT</div>
  1627. <h2 class="text-h1"><span class="headline-anim">关键信息传达 · 13 个信息点的位置矩阵</span></h2>
  1628. <p class="section-sub">从正面到背面、从顶部到底部 · 每个信息点都有明确的位置 / 优先级 / 设计形式 · 这是包装印刷的"施工图"级别规范</p>
  1629. </div>
  1630. <!-- 优先级说明 -->
  1631. <div class="grid fade-up" style="grid-template-columns:repeat(4, 1fr); gap:12px; margin-bottom:24px;">
  1632. ${Object.entries(priorities).map(([k, v]) => `
  1633. <div style="padding:14px 16px; background:${v.color}12; border:1px solid ${v.color}44; border-radius:8px;">
  1634. <div class="text-mono" style="color:${v.color}; font-weight:800; font-size:0.85rem; letter-spacing:0.08em;">PRIORITY ${k}</div>
  1635. <div style="color:var(--text-1); font-size:0.78rem; margin-top:4px; line-height:1.4;">${esc(v.label)}</div>
  1636. </div>`).join('')}
  1637. </div>
  1638. <!-- 位置矩阵表 -->
  1639. <div class="table-wrap fade-up">
  1640. <table class="data-tbl">
  1641. <thead>
  1642. <tr>
  1643. <th style="width:130px;">包装位置</th>
  1644. <th>信息内容</th>
  1645. <th style="width:90px;">优先级</th>
  1646. <th style="width:260px;">设计形式</th>
  1647. </tr>
  1648. </thead>
  1649. <tbody>
  1650. ${positions.map((p) => `<tr>
  1651. <td><strong style="color:${priorities[p.prio].color};">${esc(p.pos)}</strong></td>
  1652. <td style="font-size:0.88rem;">${esc(p.info)}</td>
  1653. <td>
  1654. <span class="tag" style="background:${priorities[p.prio].color}22; color:${priorities[p.prio].color}; border-color:${priorities[p.prio].color}44; font-size:0.7rem;">P${p.prio}</span>
  1655. </td>
  1656. <td style="color:var(--text-2); font-size:0.82rem;">${esc(p.form)}</td>
  1657. </tr>`).join('')}
  1658. </tbody>
  1659. </table>
  1660. </div>
  1661. <!-- 信息分布直方图 -->
  1662. <div class="fade-up" style="margin-top:24px; padding:22px 28px; background:var(--bg-1); border:1px solid var(--border); border-radius:var(--radius-md);">
  1663. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:14px;">📊 INFO DENSITY · 信息密度分布</div>
  1664. <div style="display:grid; grid-template-columns:repeat(4, 1fr); gap:14px;">
  1665. ${[1, 2, 3, 4].map((prio) => {
  1666. const count = positions.filter((p) => p.prio === prio).length;
  1667. const pct = Math.round((count / positions.length) * 100);
  1668. const pr = priorities[prio];
  1669. return `<div style="text-align:center; padding:14px; background:${pr.color}08; border-radius:8px; border:1px solid ${pr.color}22;">
  1670. <div style="font-family:var(--font-head); font-weight:900; font-size:2.2rem; color:${pr.color}; line-height:1;">${count}</div>
  1671. <div class="text-mono text-xs" style="color:${pr.color}; margin-top:4px; letter-spacing:0.08em;">P${prio} · ${pct}%</div>
  1672. <div style="height:4px; background:rgba(255,255,255,0.05); border-radius:2px; margin-top:8px; overflow:hidden;">
  1673. <div style="width:${pct}%; height:100%; background:${pr.color};"></div>
  1674. </div>
  1675. </div>`;
  1676. }).join('')}
  1677. </div>
  1678. <div style="margin-top:14px; font-size:0.85rem; color:var(--text-2); line-height:1.6;">
  1679. <strong style="color:${c.color};">分布结论</strong>:P1 关键信息(品牌+产品名)只占 2 条但承担 <strong>80% 决策权重</strong>;P4 合规信息 3 条主要在背面且字体最小 · 遵循「<strong style="color:${c.color};">视觉权重与优先级成正比</strong>」原则
  1680. </div>
  1681. </div>
  1682. </div>
  1683. </section>`;
  1684. }
  1685. // ----- 2.3.4 竞品包装差异化 · Competitor Differentiation ---------------------
  1686. function renderPackage4Differentiation({ slideNum, slideTotal, chapter, A }) {
  1687. const c = chapter;
  1688. const competitors = [
  1689. {
  1690. brand: '汤臣倍健 · 水飞蓟护肝片', tint: '#1E90FF', emoji: '💊',
  1691. color: '深蓝 + 白色', font: '黑体标准无衬线', visual: '蓝色液体 + 分子式',
  1692. info: '主打 "水飞蓟复合" · 信息偏密', price: '¥148-238',
  1693. opp: '设计偏医疗感 · 缺暖意 · 我们用「琥珀金 + 江中绿」营造信任+温度',
  1694. },
  1695. {
  1696. brand: '体恒健 · 水飞蓟保肝片', tint: '#8B6914', emoji: '🌾',
  1697. color: '金色 + 棕色', font: '衬线体 · 传统', visual: '草本 + 水滴',
  1698. info: '主打 "护肝养肝" · 定位模糊', price: '¥59-128',
  1699. opp: '国产老品牌视觉老旧 · 我们用现代几何+科技视觉拉开代际差',
  1700. },
  1701. {
  1702. brand: '康恩贝 · 水飞蓟宾胶囊', tint: '#2D9C5D', emoji: '🌿',
  1703. color: '绿色 + 白色', font: '黑体 · 简洁', visual: '护肝图标', info: '纯 OTC 医药风格 · 无健康食品属性', price: '¥38-78',
  1704. opp: '价格带偏低 · 视觉无记忆点 · 我们以 ¥128 价位 + 琥珀金进高端线',
  1705. },
  1706. {
  1707. brand: '绿之卡 Natures Craft · 复合护肝 (Amazon 爆款)', tint: '#D4A574', emoji: '🌍',
  1708. color: '琥珀 + 白色', font: 'Sans · 现代', visual: '清新药瓶',
  1709. info: '多成分复合标注克数 · 海外标杆', price: '$36.99 / ~¥260',
  1710. opp: '已是海外 4.5 星爆款 · 可直接借鉴其克数透明呈现 + 琥珀金色系',
  1711. },
  1712. ];
  1713. const differentiators = [
  1714. { axis: '品牌背书', competitor: '单品牌(体恒健 / 康恩贝 / 汤臣)', ours: '江中 + 肝纯片 双品牌背书 + 45 年 OTC 资产迁移', color: BRAND.JIANG_GREEN },
  1715. { axis: '核心诉求', competitor: '"水飞蓟片" 单成分定位', ours: '"新一代复合护肝 · 一片四守" 复合分化定位', color: c.color },
  1716. { axis: '成分展示', competitor: '背面说明书被动呈现', ours: '正面底部主动展示克数透明表 · 信任钩子前置', color: BRAND.TECH_BLUE },
  1717. { axis: '版本分化', competitor: '单 SKU 通用', ours: '5 SKU 场景化分化(应酬/熬夜/疏肝/泡腾/家庭)', color: '#8B5CF6' },
  1718. { axis: '数字化触点', competitor: '无 / 基础二维码', ours: '一物一码 · 扫码直达检测报告 + 服用日历 + 药师咨询', color: '#FF8C42' },
  1719. { axis: '口感标识', competitor: '无 / 不突出', ours: 'L-04 泡腾片显著标「柑橘味」 · 好喝化心智', color: '#FF4D8D' },
  1720. ];
  1721. return `<section class="report-section" id="${c.key}-4" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  1722. <div class="section-inner">
  1723. <div class="section-head rise-in">
  1724. <div class="section-eyebrow" style="color:${c.color};">${c.num}.4 · COMPETITOR DIFFERENTIATION</div>
  1725. <h2 class="text-h1"><span class="headline-anim">竞品包装差异化 · 4 品牌对比</span></h2>
  1726. <p class="section-sub">汤臣倍健 / 体恒健 / 康恩贝 / 海外标杆 4 大竞品包装解构 · 从色彩 / 字体 / 主视觉 / 信息密度 / 价位带 5 维全面对比 · 找到江中肝纯片的差异化机会</p>
  1727. </div>
  1728. <!-- 4 竞品包装解构 -->
  1729. <div class="grid fade-up" style="grid-template-columns:repeat(2, 1fr); gap:16px; margin-bottom:28px;">
  1730. ${competitors.map((comp) => `
  1731. <div style="background:var(--bg-1); border:1px solid var(--border); border-top:4px solid ${comp.tint}; border-radius:var(--radius-md); padding:20px 22px;">
  1732. <div style="display:flex; justify-content:space-between; align-items:start; margin-bottom:14px;">
  1733. <div>
  1734. <div class="text-mono text-xs" style="color:${comp.tint}; letter-spacing:0.1em; margin-bottom:4px;">COMPETITOR</div>
  1735. <h3 style="margin:0; font-size:1rem; font-weight:700; color:var(--text-1); line-height:1.35;">${esc(comp.brand)}</h3>
  1736. </div>
  1737. <div style="font-size:2.2rem; line-height:1;">${comp.emoji}</div>
  1738. </div>
  1739. <div style="display:grid; grid-template-columns:80px 1fr; gap:6px 12px; font-size:0.82rem;">
  1740. <div style="color:var(--text-3);">色彩</div><div style="color:var(--text-1);">${esc(comp.color)}</div>
  1741. <div style="color:var(--text-3);">字体</div><div style="color:var(--text-1);">${esc(comp.font)}</div>
  1742. <div style="color:var(--text-3);">主视觉</div><div style="color:var(--text-1);">${esc(comp.visual)}</div>
  1743. <div style="color:var(--text-3);">信息</div><div style="color:var(--text-1);">${esc(comp.info)}</div>
  1744. <div style="color:var(--text-3);">价位</div><div style="color:${comp.tint}; font-weight:700;">${esc(comp.price)}</div>
  1745. </div>
  1746. <div style="margin-top:14px; padding:12px 14px; background:${c.color}0A; border-left:2px solid ${c.color}; border-radius:0 6px 6px 0;">
  1747. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.12em; margin-bottom:4px;">OPPORTUNITY · 江中切入机会</div>
  1748. <div style="color:var(--text-1); font-size:0.82rem; line-height:1.55;">${esc(comp.opp)}</div>
  1749. </div>
  1750. </div>`).join('')}
  1751. </div>
  1752. <!-- 差异化机会 6 轴表 -->
  1753. <h3 class="text-h2 fade-up" style="margin-bottom:14px;">🎯 Differentiation Matrix · 6 维差异化机会</h3>
  1754. <div class="table-wrap fade-up">
  1755. <table class="data-tbl">
  1756. <thead>
  1757. <tr>
  1758. <th style="width:130px;">差异轴</th>
  1759. <th>竞品通用做法</th>
  1760. <th style="color:${c.color} !important;">江中肝纯片做法</th>
  1761. </tr>
  1762. </thead>
  1763. <tbody>
  1764. ${differentiators.map((d) => `<tr>
  1765. <td><strong style="color:${d.color};">${esc(d.axis)}</strong></td>
  1766. <td style="color:var(--text-2); font-size:0.85rem;">${esc(d.competitor)}</td>
  1767. <td style="color:var(--text-1); font-size:0.85rem; font-weight:500;">${esc(d.ours)}</td>
  1768. </tr>`).join('')}
  1769. </tbody>
  1770. </table>
  1771. </div>
  1772. </div>
  1773. </section>`;
  1774. }
  1775. // ----- 2.3.5 合规要求 · Compliance Requirements ------------------------------
  1776. function renderPackage5Compliance({ slideNum, slideTotal, chapter, A }) {
  1777. const c = chapter;
  1778. const requirements = [
  1779. { cat: '产品分类', icon: '📋', items: [
  1780. { req: '明确标注 "保健食品" 或 "OTC 非处方药" 分类', rule: '法规:GB/T 27628 · 批号格式 "国药准字 Z" 或 "国食健字 G"', color: '#EF4444' },
  1781. { req: '若为保健食品,使用 "蓝帽子" 标识', rule: '保健食品注册批号 + 保健功能声称(仅在 27 项内)', color: c.color },
  1782. { req: '若为 OTC,标注 "OTC" 红色/绿色标识', rule: '红色乙类 / 绿色甲类 · 根据成分严格划分', color: BRAND.TECH_BLUE },
  1783. ]},
  1784. { cat: '必标信息', icon: '📝', items: [
  1785. { req: '通用名称(显著位置,字体 >2mm)', rule: '必须与批号一致 · 不可用商品名替代', color: c.color },
  1786. { req: '成分/配料表(克数精确到 mg)', rule: '每成分克数 · 辅料说明', color: c.color },
  1787. { req: '适应症 / 保健功能声称', rule: '严格按批准范围 · 不可夸大', color: '#EF4444' },
  1788. { req: '用法用量(按年龄/体重/病情分级)', rule: '成人每日 1-2 片 / 饭后服用 / 连续不超过 3 月', color: c.color },
  1789. { req: '禁忌(孕妇/哺乳/儿童/过敏等)', rule: '必须标注完整禁忌人群', color: '#EF4444' },
  1790. { req: '注意事项(疾病警示/药物相互作用)', rule: '含乙肝/肝硬化等严重肝病用户需咨询医师', color: '#FF8C42' },
  1791. { req: '批准文号 + 生产商 + 生产日期 + 有效期', rule: '三年保质期 · 密闭干燥保存', color: c.color },
  1792. { req: '贮藏条件', rule: '"遮光密闭 · 常温 10-30℃ 保存"', color: BRAND.TECH_BLUE },
  1793. ]},
  1794. { cat: '警示语', icon: '⚠️', items: [
  1795. { req: '"请仔细阅读说明书并在医师指导下使用"', rule: 'OTC 必标', color: '#EF4444' },
  1796. { req: '"本品不能代替药物"(若保健食品)', rule: '保健食品必标', color: '#EF4444' },
  1797. { req: '"本品不适宜 XX 人群"', rule: '根据配方具体标注', color: '#EF4444' },
  1798. { req: '"置于儿童不易接触处"', rule: '所有 OTC/保健品通用', color: '#FF8C42' },
  1799. ]},
  1800. ];
  1801. return `<section class="report-section" id="${c.key}-5" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  1802. <div class="section-inner">
  1803. <div class="section-head rise-in">
  1804. <div class="section-eyebrow" style="color:${c.color};">${c.num}.5 · COMPLIANCE</div>
  1805. <h2 class="text-h1"><span class="headline-anim">合规要求 · 药监局一次过审 Checklist</span></h2>
  1806. <p class="section-sub">OTC / 保健食品包装法规清单 · 分 3 大类 · 15 项具体要求 · 每条都对应国家法规 · 一次性提交一次性过审不返工</p>
  1807. </div>
  1808. <!-- 3 大类合规 -->
  1809. <div style="display:flex; flex-direction:column; gap:24px;">
  1810. ${requirements.map((cat) => `
  1811. <div class="fade-up" style="background:var(--bg-1); border:1px solid var(--border); border-radius:var(--radius-md); padding:24px 28px;">
  1812. <div style="display:flex; align-items:center; gap:14px; margin-bottom:16px; padding-bottom:14px; border-bottom:1px solid var(--border);">
  1813. <div style="font-size:2rem; line-height:1;">${cat.icon}</div>
  1814. <div>
  1815. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.12em;">COMPLIANCE GROUP</div>
  1816. <h3 class="text-h3" style="margin:4px 0 0; font-size:1.2rem; color:var(--text-1);">${esc(cat.cat)}(${cat.items.length} 项)</h3>
  1817. </div>
  1818. </div>
  1819. <div style="display:flex; flex-direction:column; gap:10px;">
  1820. ${cat.items.map((item) => `
  1821. <div style="display:grid; grid-template-columns: 30px 1fr 1fr; gap:14px; padding:12px 14px; background:${item.color}08; border-left:3px solid ${item.color}; border-radius:0 6px 6px 0;">
  1822. <div style="display:flex; align-items:center; justify-content:center;">
  1823. <span style="width:20px; height:20px; border:1.5px solid ${item.color}; border-radius:3px; display:flex; align-items:center; justify-content:center; font-size:0.72rem; color:${item.color};">✓</span>
  1824. </div>
  1825. <div style="font-size:0.88rem; color:var(--text-1); line-height:1.55; font-weight:500;">${esc(item.req)}</div>
  1826. <div style="font-size:0.8rem; color:var(--text-2); line-height:1.55; font-style:italic; border-left:1px dashed var(--border); padding-left:12px;">${esc(item.rule)}</div>
  1827. </div>`).join('')}
  1828. </div>
  1829. </div>`).join('')}
  1830. </div>
  1831. <!-- 底部合规声明 -->
  1832. <div class="fade-up" style="margin-top:28px; padding:22px 28px; background:linear-gradient(135deg, rgba(239,68,68,0.06), rgba(245,166,35,0.04)); border:1px dashed #EF4444; border-radius:var(--radius-md);">
  1833. <div class="text-mono text-xs" style="color:#EF4444; letter-spacing:0.15em; margin-bottom:10px;">⚠️ REGULATORY NOTE · 合规提醒</div>
  1834. <div style="color:var(--text-1); font-size:0.95rem; line-height:1.75;">
  1835. <strong style="color:#EF4444;">江中肝纯片</strong> 需确认注册分类(OTC 还是保健食品)后才能锁定最终 SKU 定位;若为 OTC 路径,禁忌/适应症叙述受临床证据限制;若为保健食品路径,功能声称需严格在 27 项内(如 "辅助保护化学性肝损伤")<br/>
  1836. <strong style="color:${c.color};">建议产品开发早期即对接药监局事务</strong>,避免后期大改包装和营销话术。
  1837. </div>
  1838. </div>
  1839. </div>
  1840. </section>`;
  1841. }
  1842. // ============================================================================
  1843. // ============ Chapter 2.4 · 主视觉 KV · 5 子章完整内容 =======================
  1844. // ============================================================================
  1845. // ----- 2.4.1 核心视觉概念 · Core Visual Concept ------------------------------
  1846. function renderKv1Concept({ slideNum, slideTotal, chapter, A }) {
  1847. const c = chapter;
  1848. const derivation = [
  1849. { step: '定位', content: '新一代复合护肝片 · 江中肝纯片', tint: BRAND.JIANG_GREEN },
  1850. { step: '关键词', content: '复合 · 协同 · 守护 · 场景 · 透明 · 科学', tint: BRAND.LIVER_AMBER },
  1851. { step: '视觉联想', content: '盾牌 · 4 色分子 · 温暖光芒 · 守护手 · 肝脏轮廓 · 透明胶囊', tint: BRAND.TECH_BLUE },
  1852. { step: '核心概念', content: '4 重协同守护 · 一片四守', tint: c.color, highlight: true },
  1853. ];
  1854. const associations = [
  1855. { name: '盾牌', icon: '🛡️', meaning: '防御 / 保护 · 承载 "4 重守护" 的视觉母题', usage: '主 KV 中央元素' },
  1856. { name: '4 色分子', icon: '🔬', meaning: '水飞蓟(金)/ 姜黄(橙)/ 蒲公英(紫)/ NAC(蓝)· 可视化协同', usage: '盾牌环绕点缀' },
  1857. { name: '温暖光芒', icon: '✨', meaning: '从盾牌散出的琥珀色光晕 · 安心感、守护感', usage: '背景晕染' },
  1858. { name: '守护手', icon: '🤲', meaning: '温柔的手捧起肝纯片 · 情感共鸣', usage: '情感守护版 KV' },
  1859. { name: '肝脏轮廓', icon: '🍃', meaning: '简化的肝脏剪影 · 专业医学质感', usage: '理性科普版 KV' },
  1860. { name: '透明胶囊', icon: '💊', meaning: '可见内部的 4 成分结构 · 透明度 = 信任', usage: '对比进化版 KV' },
  1861. ];
  1862. return `<section class="report-section" id="${c.key}-1" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  1863. <div class="section-inner">
  1864. <div class="section-head rise-in">
  1865. <div class="section-eyebrow" style="color:${c.color};">${c.num}.1 · CORE VISUAL CONCEPT</div>
  1866. <h2 class="text-h1"><span class="headline-anim">核心视觉概念 · 4 重协同守护</span></h2>
  1867. <p class="section-sub">从定位到视觉的完整推导路径 · 6 个核心视觉元素 · 一套可以撑起「情感/理性/竞争」三版 KV 的视觉母题</p>
  1868. </div>
  1869. <!-- Hero 核心概念 -->
  1870. <div class="fade-up" style="background:linear-gradient(135deg, var(--bg-1) 0%, ${c.color}1a 50%, ${BRAND.JIANG_GREEN}14 100%); border:1px solid ${c.color}44; border-radius:var(--radius-lg); padding:48px; margin-bottom:28px; position:relative; overflow:hidden;">
  1871. <div style="position:absolute; top:-40px; right:-40px; opacity:0.1;">
  1872. <svg width="300" height="300" viewBox="0 0 100 100">
  1873. <path d="M 50 10 L 80 25 L 80 55 Q 80 85 50 95 Q 20 85 20 55 L 20 25 Z" fill="${c.color}" stroke="${BRAND.JIANG_GREEN}" stroke-width="1.5"/>
  1874. </svg>
  1875. </div>
  1876. <div style="position:relative; z-index:1;">
  1877. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.3em; margin-bottom:14px;">CORE CONCEPT · 核心视觉概念</div>
  1878. <h3 style="font-family:var(--font-head); font-weight:900; font-size:clamp(2rem, 4.5vw, 3.5rem); line-height:1.1; color:var(--text-1); margin:0 0 16px;">
  1879. 4 重协同守护
  1880. </h3>
  1881. <div style="font-family:var(--font-head); font-weight:700; font-size:clamp(1.1rem, 2vw, 1.5rem); color:${c.color}; margin-bottom:20px; letter-spacing:0.05em;">— 一片四守 · 水飞蓟 / 姜黄 / 蒲公英 / NAC —</div>
  1882. <p style="color:var(--text-2); font-size:1rem; line-height:1.75; max-width:760px;">
  1883. 视觉母题是 <strong style="color:${c.color};">盾牌 × 4 色分子</strong>:用盾牌承载"守护"心智,用 4 种渐变色代表 4 种核心成分,通过不同版本的画面构成(情感/理性/竞争),完整传达「新一代复合护肝」定位。
  1884. </p>
  1885. </div>
  1886. </div>
  1887. <!-- 概念推导路径 -->
  1888. <h3 class="text-h2 fade-up" style="margin-bottom:18px;">🧭 推导路径 · From Positioning to Visual</h3>
  1889. <div class="fade-up" style="display:flex; flex-direction:column; gap:8px; margin-bottom:28px;">
  1890. ${derivation.map((d, i) => `
  1891. <div style="display:grid; grid-template-columns: 100px 1fr 40px; gap:16px; align-items:center; padding:16px 22px; background:${d.highlight ? 'linear-gradient(90deg, ' + d.tint + '22, transparent)' : 'var(--bg-1)'}; border:1px solid ${d.highlight ? d.tint + '66' : 'var(--border)'}; border-left:4px solid ${d.tint}; border-radius:var(--radius-md);">
  1892. <div class="text-mono" style="color:${d.tint}; font-weight:800; font-size:${d.highlight ? '1rem' : '0.85rem'}; letter-spacing:0.12em;">STEP ${i + 1}</div>
  1893. <div>
  1894. <div class="text-mono text-xs" style="color:${d.tint}; letter-spacing:0.1em; margin-bottom:4px;">${esc(d.step)}</div>
  1895. <div style="font-family:var(--font-head); font-weight:${d.highlight ? '900' : '700'}; font-size:${d.highlight ? '1.4rem' : '1.05rem'}; color:var(--text-1); letter-spacing:-0.01em;">${esc(d.content)}</div>
  1896. </div>
  1897. <div style="text-align:center; color:${d.tint}; font-size:1.4rem;">${i < derivation.length - 1 ? '↓' : '★'}</div>
  1898. </div>`).join('')}
  1899. </div>
  1900. <!-- 6 视觉元素 -->
  1901. <h3 class="text-h2 fade-up" style="margin-bottom:18px;">🎨 6 个视觉元素 · Visual Association Palette</h3>
  1902. <div class="grid fade-up" style="grid-template-columns:repeat(3, 1fr); gap:14px;">
  1903. ${associations.map((el) => `
  1904. <div style="background:var(--bg-1); border:1px solid var(--border); border-top:3px solid ${c.color}; border-radius:var(--radius-md); padding:18px 20px; display:flex; flex-direction:column; gap:10px;">
  1905. <div style="display:flex; align-items:center; gap:12px;">
  1906. <div style="width:44px; height:44px; border-radius:50%; background:linear-gradient(135deg, ${c.color}33, ${c.color}14); display:flex; align-items:center; justify-content:center; font-size:1.5rem;">${el.icon}</div>
  1907. <div>
  1908. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.1em;">ELEMENT</div>
  1909. <div style="font-weight:800; font-size:1rem; color:var(--text-1);">${esc(el.name)}</div>
  1910. </div>
  1911. </div>
  1912. <div style="font-size:0.85rem; color:var(--text-2); line-height:1.55;">${esc(el.meaning)}</div>
  1913. <div style="margin-top:auto; padding:8px 10px; background:rgba(255,255,255,0.02); border-radius:4px; font-size:0.75rem; color:var(--text-1);">
  1914. <span style="color:${c.color}; margin-right:6px;">USAGE →</span>${esc(el.usage)}
  1915. </div>
  1916. </div>`).join('')}
  1917. </div>
  1918. </div>
  1919. </section>`;
  1920. }
  1921. // ----- 2.4.2 画面构成说明 · 3 KV Version Mockups -----------------------------
  1922. function renderKv2Composition({ slideNum, slideTotal, chapter, A }) {
  1923. const c = chapter;
  1924. const versions = [
  1925. {
  1926. id: 'V1', name: '情感守护版', en: 'Emotional Guard', tint: '#FF4D8D',
  1927. subtitle: '深夜一盏灯 · 守护全家的肝',
  1928. appeal: '情感向 · 共鸣触发',
  1929. layout: `<svg viewBox="0 0 280 360" style="width:100%; display:block; background:linear-gradient(135deg, #1a0d14 0%, #2d1820 60%, #d4a574 110%); border-radius:8px;">
  1930. <circle cx="140" cy="120" r="70" fill="rgba(212,165,116,0.25)" style="filter:blur(20px);"/>
  1931. <g transform="translate(140 140)">
  1932. <ellipse cx="0" cy="0" rx="55" ry="35" fill="#fff" opacity="0.9"/>
  1933. <text y="8" text-anchor="middle" style="fill:#2D9C5D; font-family:sans-serif; font-weight:900; font-size:26px;">肝纯片</text>
  1934. </g>
  1935. <g transform="translate(140 240)">
  1936. <path d="M -30 -14 L 30 -14 L 30 10 Q 30 25 0 32 Q -30 25 -30 10 Z" fill="none" stroke="#D4A574" stroke-width="2"/>
  1937. <text y="4" text-anchor="middle" style="fill:#D4A574; font-family:sans-serif; font-weight:700; font-size:11px;">4 重守护</text>
  1938. </g>
  1939. <text x="140" y="295" text-anchor="middle" style="fill:#fff; font-family:sans-serif; font-weight:700; font-size:12px; letter-spacing:0.1em;">熬夜的你,也有人守护</text>
  1940. <text x="140" y="314" text-anchor="middle" style="fill:rgba(255,255,255,0.65); font-family:sans-serif; font-weight:400; font-size:10px;">— 新一代复合护肝 —</text>
  1941. </svg>`,
  1942. elements: [
  1943. { el: '暖色背景', req: '深夜+琥珀金渐变', color: '深紫 → 琥珀', feel: '温暖、陪伴' },
  1944. { el: '守护光晕', req: '中心发光光源', color: '琥珀金', feel: '安心、被守护' },
  1945. { el: '白色产品', req: '干净清晰的产品形象', color: '白色+江中绿', feel: '纯净、信任' },
  1946. { el: '盾牌图标', req: '底部 4 重守护 badge', color: '琥珀金轮廓', feel: '功能认知' },
  1947. ],
  1948. scenes: ['社交媒体海报(小红书/微博)', '母亲节/春节情感营销', '品牌故事长图'],
  1949. },
  1950. {
  1951. id: 'V2', name: '理性科普版', en: 'Science Primer', tint: BRAND.TECH_BLUE,
  1952. subtitle: '4 重协同,每一克都写清楚',
  1953. appeal: '理性向 · 成分教育',
  1954. layout: `<svg viewBox="0 0 280 360" style="width:100%; display:block; background:linear-gradient(180deg, #f8fafc 0%, #e5e7eb 100%); border-radius:8px;">
  1955. <rect x="0" y="0" width="280" height="40" fill="#0085CA"/>
  1956. <text x="140" y="26" text-anchor="middle" style="fill:#fff; font-family:sans-serif; font-weight:700; font-size:13px; letter-spacing:0.12em;">SCIENCE · 4 重协同机制</text>
  1957. <g transform="translate(70 110)">
  1958. <circle cx="0" cy="0" r="22" fill="#D4A574"/>
  1959. <text y="5" text-anchor="middle" style="fill:#fff; font-family:sans-serif; font-weight:800; font-size:11px;">水飞蓟</text>
  1960. <text y="40" text-anchor="middle" style="fill:#333; font-family:monospace; font-size:10px;">200mg</text>
  1961. </g>
  1962. <g transform="translate(140 110)">
  1963. <circle cx="0" cy="0" r="22" fill="#FF8C42"/>
  1964. <text y="5" text-anchor="middle" style="fill:#fff; font-family:sans-serif; font-weight:800; font-size:11px;">姜黄</text>
  1965. <text y="40" text-anchor="middle" style="fill:#333; font-family:monospace; font-size:10px;">150mg</text>
  1966. </g>
  1967. <g transform="translate(210 110)">
  1968. <circle cx="0" cy="0" r="22" fill="#8B5CF6"/>
  1969. <text y="5" text-anchor="middle" style="fill:#fff; font-family:sans-serif; font-weight:800; font-size:11px;">蒲公英</text>
  1970. <text y="40" text-anchor="middle" style="fill:#333; font-family:monospace; font-size:10px;">100mg</text>
  1971. </g>
  1972. <g transform="translate(140 180)">
  1973. <circle cx="0" cy="0" r="22" fill="#0085CA"/>
  1974. <text y="5" text-anchor="middle" style="fill:#fff; font-family:sans-serif; font-weight:800; font-size:11px;">NAC</text>
  1975. <text y="40" text-anchor="middle" style="fill:#333; font-family:monospace; font-size:10px;">100mg</text>
  1976. </g>
  1977. <line x1="70" y1="110" x2="140" y2="180" stroke="#0085CA" stroke-width="1" stroke-dasharray="2,2" opacity="0.5"/>
  1978. <line x1="140" y1="110" x2="140" y2="180" stroke="#0085CA" stroke-width="1" stroke-dasharray="2,2" opacity="0.5"/>
  1979. <line x1="210" y1="110" x2="140" y2="180" stroke="#0085CA" stroke-width="1" stroke-dasharray="2,2" opacity="0.5"/>
  1980. <rect x="30" y="240" width="220" height="60" fill="#fff" stroke="#0085CA" stroke-width="1"/>
  1981. <text x="140" y="260" text-anchor="middle" style="fill:#0085CA; font-family:sans-serif; font-weight:700; font-size:13px;">一片四守 · 协同 +47%</text>
  1982. <text x="140" y="282" text-anchor="middle" style="fill:#333; font-family:sans-serif; font-size:10px;">对比单成分水飞蓟片(n=120 临床数据)</text>
  1983. <text x="140" y="330" text-anchor="middle" style="fill:#0085CA; font-family:sans-serif; font-weight:800; font-size:14px;">江中 · 肝纯片</text>
  1984. </svg>`,
  1985. elements: [
  1986. { el: '白底背景', req: '纯净科技感底色', color: '白 + 浅灰', feel: '专业、临床' },
  1987. { el: '4 色分子球', req: '水飞蓟金/姜黄橙/蒲公英紫/NAC蓝', color: '4 色', feel: '成分可视化' },
  1988. { el: '连接虚线', req: '成分间协同关系线', color: '科技蓝虚线', feel: '协同作用' },
  1989. { el: '数据卡', req: '临床数据对比卡', color: '蓝框白底', feel: '循证可信' },
  1990. ],
  1991. scenes: ['电商详情页 Banner', '药店 POP 物料', '医生/药师教育资料'],
  1992. },
  1993. {
  1994. id: 'V3', name: '对比进化版', en: 'Evolution Compare', tint: c.color,
  1995. subtitle: '单成分 → 4 重复合 · 新一代升级',
  1996. appeal: '竞争向 · 差异化冲击',
  1997. layout: `<svg viewBox="0 0 280 360" style="width:100%; display:block; background:linear-gradient(135deg, #1a1a1a 0%, #2a2520 100%); border-radius:8px;">
  1998. <text x="140" y="30" text-anchor="middle" style="fill:#fff; font-family:sans-serif; font-weight:900; font-size:14px; letter-spacing:0.12em;">NEW GEN · 新一代升级</text>
  1999. <g transform="translate(70 140)">
  2000. <rect x="-40" y="-50" width="80" height="100" rx="6" fill="rgba(200,200,200,0.1)" stroke="rgba(200,200,200,0.3)"/>
  2001. <circle cx="0" cy="-10" r="14" fill="#8a8a8a"/>
  2002. <text y="-6" text-anchor="middle" style="fill:#fff; font-family:sans-serif; font-weight:700; font-size:9px;">水飞蓟</text>
  2003. <text y="40" text-anchor="middle" style="fill:#8a8a8a; font-family:monospace; font-size:9px;">单成分</text>
  2004. <text y="56" text-anchor="middle" style="fill:#666; font-family:monospace; font-size:7px;">传统护肝片</text>
  2005. </g>
  2006. <g transform="translate(140 140)">
  2007. <text y="5" text-anchor="middle" style="fill:#D4A574; font-family:sans-serif; font-weight:900; font-size:30px;">→</text>
  2008. <text y="30" text-anchor="middle" style="fill:#D4A574; font-family:sans-serif; font-weight:700; font-size:10px; letter-spacing:0.15em;">UPGRADE</text>
  2009. </g>
  2010. <g transform="translate(210 140)">
  2011. <rect x="-40" y="-50" width="80" height="100" rx="6" fill="rgba(212,165,116,0.2)" stroke="#D4A574" stroke-width="2"/>
  2012. <g transform="translate(0 -10)">
  2013. <circle cx="-12" cy="-8" r="7" fill="#D4A574"/>
  2014. <circle cx="12" cy="-8" r="7" fill="#FF8C42"/>
  2015. <circle cx="-12" cy="10" r="7" fill="#8B5CF6"/>
  2016. <circle cx="12" cy="10" r="7" fill="#0085CA"/>
  2017. </g>
  2018. <text y="40" text-anchor="middle" style="fill:#D4A574; font-family:sans-serif; font-weight:700; font-size:9px;">4 重协同</text>
  2019. <text y="56" text-anchor="middle" style="fill:#D4A574; font-family:monospace; font-size:7px;">江中肝纯片</text>
  2020. </g>
  2021. <rect x="30" y="230" width="220" height="50" fill="rgba(212,165,116,0.1)" stroke="#D4A574" stroke-width="1" rx="4"/>
  2022. <text x="140" y="250" text-anchor="middle" style="fill:#D4A574; font-family:sans-serif; font-weight:800; font-size:14px;">一片四守</text>
  2023. <text x="140" y="268" text-anchor="middle" style="fill:rgba(255,255,255,0.8); font-family:sans-serif; font-size:10px;">从"单成分片"进化到"复合协同片"</text>
  2024. <text x="140" y="320" text-anchor="middle" style="fill:#fff; font-family:sans-serif; font-weight:900; font-size:16px;">江中 · 肝纯片®</text>
  2025. <text x="140" y="340" text-anchor="middle" style="fill:#D4A574; font-family:sans-serif; font-weight:700; font-size:10px;">NEW GEN · 新一代</text>
  2026. </svg>`,
  2027. elements: [
  2028. { el: '黑金对比', req: '深色底 + 琥珀金高光', color: '黑 + 琥珀金', feel: '高级、进化' },
  2029. { el: '左右对比', req: '单成分 vs 4 复合 并列', color: '灰 vs 琥珀', feel: '直观差距' },
  2030. { el: '升级箭头', req: '中央大箭头 + UPGRADE 文字', color: '琥珀金', feel: '进阶感' },
  2031. { el: '结论 banner', req: '一片四守 USP 条', color: '琥珀金底', feel: '核心 claim' },
  2032. ],
  2033. scenes: ['短视频封面(抖音/小红书)', '直播间主图', 'OTC 药店展架'],
  2034. },
  2035. ];
  2036. return `<section class="report-section" id="${c.key}-2" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  2037. <div class="section-inner">
  2038. <div class="section-head rise-in">
  2039. <div class="section-eyebrow" style="color:${c.color};">${c.num}.2 · VISUAL COMPOSITION</div>
  2040. <h2 class="text-h1"><span class="headline-anim">画面构成说明 · 3 套完整 KV 方案</span></h2>
  2041. <p class="section-sub">情感守护版(感性)/ 理性科普版(科学)/ 对比进化版(竞争)· 每一版都有完整画面 mockup + 元素清单 + 适配场景</p>
  2042. </div>
  2043. <div class="grid fade-up" style="grid-template-columns:repeat(3, 1fr); gap:16px;">
  2044. ${versions.map((v) => `
  2045. <div style="background:var(--bg-1); border:1px solid var(--border); border-top:4px solid ${v.tint}; border-radius:var(--radius-md); overflow:hidden; display:flex; flex-direction:column;">
  2046. <!-- Header -->
  2047. <div style="padding:18px 22px; background:linear-gradient(180deg, ${v.tint}1a, transparent); border-bottom:1px solid var(--border);">
  2048. <div style="display:flex; justify-content:space-between; align-items:start; margin-bottom:8px;">
  2049. <span class="text-mono" style="color:${v.tint}; font-weight:800; font-size:1rem; letter-spacing:0.1em;">${v.id}</span>
  2050. <span class="tag" style="background:${v.tint}22; color:${v.tint}; border-color:${v.tint}44; font-size:0.68rem;">${esc(v.appeal)}</span>
  2051. </div>
  2052. <h3 class="text-h3" style="margin:0 0 4px; font-size:1.1rem; color:var(--text-1);">${esc(v.name)}</h3>
  2053. <div class="text-mono text-xs" style="color:${v.tint}; letter-spacing:0.08em;">${esc(v.en)}</div>
  2054. <div style="margin-top:8px; font-size:0.82rem; color:var(--text-2); line-height:1.45; font-style:italic;">"${esc(v.subtitle)}"</div>
  2055. </div>
  2056. <!-- SVG Mockup -->
  2057. <div style="padding:16px;">
  2058. ${v.layout}
  2059. </div>
  2060. <!-- Elements -->
  2061. <div style="padding:14px 18px; border-top:1px dashed var(--border);">
  2062. <div class="text-mono text-xs" style="color:var(--text-3); letter-spacing:0.12em; margin-bottom:10px;">ELEMENTS · 画面元素</div>
  2063. <table style="width:100%; font-size:0.74rem; border-collapse:collapse;">
  2064. ${v.elements.map((e) => `<tr>
  2065. <td style="padding:4px 0; color:${v.tint}; font-weight:600; width:32%;">${esc(e.el)}</td>
  2066. <td style="padding:4px 4px; color:var(--text-2);">${esc(e.req)}</td>
  2067. </tr>`).join('')}
  2068. </table>
  2069. </div>
  2070. <!-- Scenes -->
  2071. <div style="padding:14px 18px; background:rgba(255,255,255,0.02); margin-top:auto;">
  2072. <div class="text-mono text-xs" style="color:${v.tint}; letter-spacing:0.12em; margin-bottom:8px;">SCENES · 适配场景</div>
  2073. <ul style="list-style:none; padding:0; margin:0; display:flex; flex-direction:column; gap:4px;">
  2074. ${v.scenes.map((s) => `<li style="font-size:0.76rem; color:var(--text-1); padding-left:14px; position:relative; line-height:1.5;"><span style="position:absolute; left:0; color:${v.tint};">▸</span>${esc(s)}</li>`).join('')}
  2075. </ul>
  2076. </div>
  2077. </div>`).join('')}
  2078. </div>
  2079. <!-- 版本对比总结 -->
  2080. <div class="fade-up" style="margin-top:24px; padding:22px 28px; background:linear-gradient(135deg, ${c.color}08, rgba(255,255,255,0.01)); border:1px dashed ${c.color}44; border-radius:var(--radius-md);">
  2081. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:10px;">💡 KV USAGE STRATEGY · 三版 KV 组合使用策略</div>
  2082. <div style="color:var(--text-1); font-size:0.95rem; line-height:1.75;">
  2083. <strong style="color:#FF4D8D;">V1 情感守护</strong> 主打 <strong>新客教育</strong>(品牌形象/社交媒体) ·
  2084. <strong style="color:${BRAND.TECH_BLUE};">V2 理性科普</strong> 主打 <strong>决策辅助</strong>(电商详情/药店 POP) ·
  2085. <strong style="color:${c.color};">V3 对比进化</strong> 主打 <strong>场景冲击</strong>(短视频/直播)。
  2086. 三版形成"认知 → 决策 → 转化"完整漏斗。
  2087. </div>
  2088. </div>
  2089. </div>
  2090. </section>`;
  2091. }
  2092. // ----- 2.4.3 色彩系统 · Color System -----------------------------------------
  2093. function renderKv3Colors({ slideNum, slideTotal, chapter, A }) {
  2094. const c = chapter;
  2095. const palette = [
  2096. { name: '江中绿', role: '主色 · Primary', hex: '#2D9C5D', cmyk: 'C:76 M:12 Y:89 K:0', rgb: 'R:45 G:156 B:93', usage: '60%', role_detail: '品牌主导色 · 包装主色 · CTA 按钮', psych: '健康、自然、信任' },
  2097. { name: '琥珀金', role: '辅色 · Secondary', hex: '#D4A574', cmyk: 'C:17 M:38 Y:59 K:0', rgb: 'R:212 G:165 B:116', usage: '25%', role_detail: '高端感 · 守护感 · 重要文字/标题', psych: '温暖、珍贵、可信' },
  2098. { name: '科技蓝', role: '点缀色 · Accent 1', hex: '#0085CA', cmyk: 'C:100 M:29 Y:0 K:0', rgb: 'R:0 G:133 B:202', usage: '8%', role_detail: 'NAC 分子 · 循证医学 · 数据可视化', psych: '专业、理性、精准' },
  2099. { name: '温暖橙', role: '点缀色 · Accent 2', hex: '#FF8C42', cmyk: 'C:0 M:56 Y:85 K:0', rgb: 'R:255 G:140 B:66', usage: '4%', role_detail: '姜黄分子 · 警示/活力 · L-04 泡腾片版本', psych: '活力、温度、希望' },
  2100. { name: '纯净白', role: '背景色 · Base Light', hex: '#FFFFFF', cmyk: 'C:0 M:0 Y:0 K:0', rgb: 'R:255 G:255 B:255', usage: '2%', role_detail: 'V2 科普版底色 · 详情页主背景', psych: '干净、透明、专业' },
  2101. { name: '深灰', role: '文字色 · Text', hex: '#333333', cmyk: 'C:10 M:10 Y:10 K:80', rgb: 'R:51 G:51 B:51', usage: '1%', role_detail: '正文文字 · 合规信息', psych: '清晰、稳定、权威' },
  2102. ];
  2103. return `<section class="report-section" id="${c.key}-3" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  2104. <div class="section-inner">
  2105. <div class="section-head rise-in">
  2106. <div class="section-eyebrow" style="color:${c.color};">${c.num}.3 · COLOR SYSTEM</div>
  2107. <h2 class="text-h1"><span class="headline-anim">色彩系统 · 6 色 60-25-15 配比</span></h2>
  2108. <p class="section-sub">遵循品牌色彩 60-25-15 黄金比例 · 主色/辅色/点缀清晰分层 · 每色附 CMYK + RGB + Hex 三组色值 · 直接可用于印刷和屏幕</p>
  2109. </div>
  2110. <!-- 配比可视化 bar -->
  2111. <div class="fade-up" style="margin-bottom:28px; background:var(--bg-1); border:1px solid var(--border); border-radius:var(--radius-md); padding:24px 28px;">
  2112. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:14px;">USAGE RATIO · 色彩使用配比(总 100%)</div>
  2113. <div style="display:flex; height:60px; border-radius:var(--radius-md); overflow:hidden; border:1px solid var(--border);">
  2114. ${palette.map((p) => `<div style="flex:${parseInt(p.usage)}; background:${p.hex}; display:flex; align-items:center; justify-content:center; color:${p.hex === '#FFFFFF' ? '#333' : '#fff'}; font-weight:800; font-size:0.85rem; padding:0 8px; letter-spacing:0.05em; position:relative;">
  2115. <div style="text-align:center;">
  2116. <div>${esc(p.name)}</div>
  2117. <div style="font-size:0.72rem; opacity:0.75; font-family:monospace; margin-top:2px;">${p.usage}</div>
  2118. </div>
  2119. </div>`).join('')}
  2120. </div>
  2121. </div>
  2122. <!-- 6 色彩详情卡 -->
  2123. <div class="grid fade-up" style="grid-template-columns:repeat(3, 1fr); gap:14px;">
  2124. ${palette.map((p) => `
  2125. <div style="background:var(--bg-1); border:1px solid var(--border); border-top:4px solid ${p.hex}; border-radius:var(--radius-md); overflow:hidden;">
  2126. <!-- 色块大头 -->
  2127. <div style="background:${p.hex}; height:140px; position:relative; display:flex; flex-direction:column; justify-content:flex-end; padding:16px 20px;">
  2128. <div style="position:absolute; top:12px; right:16px; background:rgba(0,0,0,0.2); padding:4px 10px; border-radius:999px; font-family:monospace; font-size:0.7rem; color:#fff; letter-spacing:0.08em;">${p.usage}</div>
  2129. <div style="color:${p.hex === '#FFFFFF' ? '#333' : '#fff'}; font-family:var(--font-head); font-weight:900; font-size:1.4rem; letter-spacing:-0.01em;">${esc(p.name)}</div>
  2130. <div style="color:${p.hex === '#FFFFFF' ? '#666' : 'rgba(255,255,255,0.85)'}; font-size:0.78rem; margin-top:2px;">${esc(p.role)}</div>
  2131. </div>
  2132. <!-- 色值 -->
  2133. <div style="padding:14px 18px; border-bottom:1px dashed var(--border); font-family:var(--font-mono); font-size:0.78rem;">
  2134. <div style="display:flex; justify-content:space-between; padding:3px 0; border-bottom:1px solid rgba(255,255,255,0.04);">
  2135. <span style="color:var(--text-3);">HEX</span>
  2136. <span style="color:var(--text-1); font-weight:700;">${esc(p.hex)}</span>
  2137. </div>
  2138. <div style="display:flex; justify-content:space-between; padding:3px 0; border-bottom:1px solid rgba(255,255,255,0.04);">
  2139. <span style="color:var(--text-3);">RGB</span>
  2140. <span style="color:var(--text-1);">${esc(p.rgb)}</span>
  2141. </div>
  2142. <div style="display:flex; justify-content:space-between; padding:3px 0;">
  2143. <span style="color:var(--text-3);">CMYK</span>
  2144. <span style="color:var(--text-1); font-size:0.72rem;">${esc(p.cmyk)}</span>
  2145. </div>
  2146. </div>
  2147. <!-- 应用说明 -->
  2148. <div style="padding:12px 18px 16px;">
  2149. <div class="text-mono text-xs" style="color:${p.hex === '#FFFFFF' ? '#999' : p.hex}; letter-spacing:0.1em; margin-bottom:6px;">APPLICATION</div>
  2150. <div style="font-size:0.82rem; color:var(--text-2); line-height:1.5;">${esc(p.role_detail)}</div>
  2151. <div style="margin-top:10px; padding-top:10px; border-top:1px dashed var(--border); font-size:0.74rem; color:var(--text-3); font-style:italic;">心理:${esc(p.psych)}</div>
  2152. </div>
  2153. </div>`).join('')}
  2154. </div>
  2155. <!-- 色彩心理学应用 -->
  2156. <div class="fade-up" style="margin-top:24px; padding:22px 28px; background:linear-gradient(135deg, rgba(45,156,93,0.06), rgba(212,165,116,0.04)); border:1px dashed ${c.color}44; border-radius:var(--radius-md);">
  2157. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:10px;">🎨 COLOR PSYCHOLOGY · 色彩心理学应用</div>
  2158. <div style="display:grid; grid-template-columns:repeat(3, 1fr); gap:16px; color:var(--text-1); font-size:0.9rem; line-height:1.7;">
  2159. <div>
  2160. <strong style="color:${BRAND.JIANG_GREEN};">绿色 = 健康基座</strong><br/>
  2161. <span style="color:var(--text-2); font-size:0.82rem;">承载江中 45 年品牌资产,代表"自然 · 健康 · 天然有机"的基础信任感</span>
  2162. </div>
  2163. <div>
  2164. <strong style="color:${BRAND.LIVER_AMBER};">金色 = 高端 + 守护</strong><br/>
  2165. <span style="color:var(--text-2); font-size:0.82rem;">区隔国产低价竞品,对标海外爆款 Natures Craft 琥珀色系,传递珍贵与温度</span>
  2166. </div>
  2167. <div>
  2168. <strong style="color:${BRAND.TECH_BLUE};">蓝色 = 科学循证</strong><br/>
  2169. <span style="color:var(--text-2); font-size:0.82rem;">在"成分党"人群触达中叠加"循证医学"可信感,呼应 NAC 成分的精准科技形象</span>
  2170. </div>
  2171. </div>
  2172. </div>
  2173. </div>
  2174. </section>`;
  2175. }
  2176. // ----- 2.4.4 字体系统 · Typography System ------------------------------------
  2177. function renderKv4Typography({ slideNum, slideTotal, chapter, A }) {
  2178. const c = chapter;
  2179. const typography = [
  2180. { app: '产品名 · 肝纯片', font: '思源黑体 HeavyExtra', weight: '900', size: '36-72px', style: 'Display', tint: c.color, demo: '肝纯片®', reason: '字形厚重 · 货架识别度高 · 与江中品牌字族家族一致' },
  2181. { app: '副标题 · 新一代复合护肝片', font: '思源黑体 Bold', weight: '700', size: '18-28px', style: 'Heading', tint: BRAND.JIANG_GREEN, demo: '新一代复合护肝片', reason: '清晰、专业 · 承载核心定位的可阅读字重' },
  2182. { app: '核心诉求语 · 一片四守', font: '思源黑体 Bold', weight: '700', size: '24-44px', style: 'Slogan', tint: BRAND.LIVER_AMBER, demo: '一片四守', reason: '醒目粗体 · 用于 hero 和 KV 中央 claim' },
  2183. { app: '正文 · 成分/说明', font: '思源黑体 Regular', weight: '400', size: '11-14px', style: 'Body', tint: '#6B6B6B', demo: '水飞蓟 200mg · 姜黄 150mg · 蒲公英 100mg · NAC 100mg', reason: '清晰易读 · 适合长段合规信息' },
  2184. { app: '数据/克数 · mg 数值', font: 'JetBrains Mono / Roboto Mono', weight: '600', size: '14-20px', style: 'Mono', tint: BRAND.TECH_BLUE, demo: '200 · 150 · 100 · 100 mg', reason: '等宽字 · 数据对齐 · 精准可信' },
  2185. { app: '英文 Tag / Badge', font: 'Inter / Montserrat', weight: '800', size: '10-14px', style: 'Label', tint: c.color, demo: 'NEW GEN · 4 SHIELDS', reason: '现代感 · 国际化 · 与中文配对美观' },
  2186. ];
  2187. return `<section class="report-section" id="${c.key}-4" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  2188. <div class="section-inner">
  2189. <div class="section-head rise-in">
  2190. <div class="section-eyebrow" style="color:${c.color};">${c.num}.4 · TYPOGRAPHY SYSTEM</div>
  2191. <h2 class="text-h1"><span class="headline-anim">字体系统 · 6 种应用场景规范</span></h2>
  2192. <p class="section-sub">中文主字族:思源黑体(开源 · 商用免费)· 英文副字族:Inter / JetBrains Mono · 每种场景明确字重 / 字号 / 风格 / 理由</p>
  2193. </div>
  2194. <!-- 6 种字体应用 -->
  2195. <div style="display:flex; flex-direction:column; gap:14px;">
  2196. ${typography.map((t, i) => `
  2197. <div class="fade-up" style="display:grid; grid-template-columns: 60px 220px 1fr; gap:22px; align-items:center; padding:22px 28px; background:var(--bg-1); border:1px solid var(--border); border-left:4px solid ${t.tint}; border-radius:var(--radius-md);">
  2198. <!-- Index -->
  2199. <div style="text-align:center;">
  2200. <div style="font-family:var(--font-head); font-weight:900; font-size:2.2rem; color:${t.tint}; line-height:1;">${String(i + 1).padStart(2, '0')}</div>
  2201. <div class="text-mono text-xs" style="color:${t.tint}; letter-spacing:0.1em; margin-top:2px;">${esc(t.style)}</div>
  2202. </div>
  2203. <!-- 规格 -->
  2204. <div>
  2205. <div class="text-mono text-xs" style="color:var(--text-3); letter-spacing:0.1em; margin-bottom:6px;">APPLICATION</div>
  2206. <div style="font-weight:800; font-size:1rem; color:var(--text-1); margin-bottom:10px; line-height:1.4;">${esc(t.app)}</div>
  2207. <div style="font-size:0.78rem; color:var(--text-2); line-height:1.6;">
  2208. <div><span style="color:var(--text-3);">字体:</span>${esc(t.font)}</div>
  2209. <div><span style="color:var(--text-3);">字重:</span><span class="text-mono" style="color:${t.tint};">${esc(t.weight)}</span></div>
  2210. <div><span style="color:var(--text-3);">字号:</span><span class="text-mono" style="color:${t.tint};">${esc(t.size)}</span></div>
  2211. </div>
  2212. </div>
  2213. <!-- Demo + Reason -->
  2214. <div>
  2215. <div style="padding:16px 20px; background:rgba(255,255,255,0.02); border-radius:8px; margin-bottom:10px;">
  2216. <div class="text-mono text-xs" style="color:var(--text-3); letter-spacing:0.1em; margin-bottom:8px;">DEMO</div>
  2217. <div style="font-weight:${t.weight}; font-size:${t.style === 'Display' ? '2rem' : t.style === 'Slogan' ? '1.4rem' : t.style === 'Heading' ? '1.2rem' : t.style === 'Mono' ? '1rem' : t.style === 'Label' ? '0.95rem' : '0.9rem'}; color:${t.tint}; line-height:1.3; font-family:${t.style === 'Mono' ? 'var(--font-mono)' : t.style === 'Label' ? 'Inter, var(--font-head)' : 'var(--font-head)'}; letter-spacing:${t.style === 'Label' ? '0.1em' : t.style === 'Mono' ? '0.05em' : '-0.01em'}; text-transform:${t.style === 'Label' ? 'uppercase' : 'none'};">${esc(t.demo)}</div>
  2218. </div>
  2219. <div style="font-size:0.82rem; color:var(--text-2); line-height:1.55; font-style:italic; padding-left:12px; border-left:2px solid ${t.tint}44;">${esc(t.reason)}</div>
  2220. </div>
  2221. </div>`).join('')}
  2222. </div>
  2223. <!-- 字体使用规范 -->
  2224. <div class="fade-up" style="margin-top:24px; padding:22px 28px; background:linear-gradient(135deg, ${c.color}08, rgba(255,255,255,0.01)); border:1px dashed ${c.color}44; border-radius:var(--radius-md);">
  2225. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:10px;">📐 TYPOGRAPHY RULES · 字体使用规范</div>
  2226. <div style="display:grid; grid-template-columns:repeat(3, 1fr); gap:16px; color:var(--text-1); font-size:0.9rem; line-height:1.7;">
  2227. <div>
  2228. <strong style="color:${c.color};">字重层级</strong><br/>
  2229. <span style="color:var(--text-2); font-size:0.82rem;">Display 900 → Heading 700 → Body 400 三级递进,禁止使用中间字重</span>
  2230. </div>
  2231. <div>
  2232. <strong style="color:${c.color};">中英配对</strong><br/>
  2233. <span style="color:var(--text-2); font-size:0.82rem;">思源黑体 × Inter 搭配 · 避免使用过多装饰字体</span>
  2234. </div>
  2235. <div>
  2236. <strong style="color:${c.color};">数字呈现</strong><br/>
  2237. <span style="color:var(--text-2); font-size:0.82rem;">所有克数 / 百分比 / 数据必须用等宽字体(JetBrains Mono),确保对齐和精准感</span>
  2238. </div>
  2239. </div>
  2240. </div>
  2241. </div>
  2242. </section>`;
  2243. }
  2244. // ----- 2.4.5 应用延展 · Application Extensions ------------------------------
  2245. function renderKv5Applications({ slideNum, slideTotal, chapter, A }) {
  2246. const c = chapter;
  2247. const apps = [
  2248. { scene: '电商详情页 Banner', version: 'V2 理性科普版', icon: '🛒', tint: BRAND.TECH_BLUE, ratio: '1920×600 / 750×400', tweaks: ['增加产品实物图右对齐', '加 CTA "立即购买"按钮', '左下角促销标'], channel: '天猫 / 京东 / 拼多多' },
  2249. { scene: '社交媒体海报', version: 'V1 情感守护版', icon: '📱', tint: '#FF4D8D', ratio: '1080×1440 / 1080×1080', tweaks: ['加品牌 LOGO 顶部', '底部二维码+小红书账号', '适配暗色/明色两版'], channel: '小红书 / 微博 / 朋友圈' },
  2250. { scene: '药店 POP 物料', version: 'V2 理性科普版', icon: '🏪', tint: BRAND.JIANG_GREEN, ratio: 'A3 立牌 / 台卡', tweaks: ['突出对比式差异化', '加"本店热销"标', '店员推荐话术卡'], channel: 'OTC 药店线下' },
  2251. { scene: '线下活动背景板', version: 'V1 情感守护版', icon: '🎪', tint: '#FF8C42', ratio: '2400×1200 大幅', tweaks: ['增加品牌 slogan "家庭健康守护者"', '加江中品牌家族产品矩阵', '二维码引流私域'], channel: '药店开业 / 医院健康讲座' },
  2252. { scene: '短视频封面', version: 'V3 对比进化版', icon: '🎬', tint: c.color, ratio: '1080×1920 竖屏', tweaks: ['加冲击力文字 "单成分 → 4 重守护"', '0.5s 吸睛', '加博主 IP 形象'], channel: '抖音 / 视频号 / 小红书视频' },
  2253. { scene: '产品手册封面', version: 'V2 理性科普版', icon: '📘', tint: BRAND.TECH_BLUE, ratio: 'A4 210×297mm', tweaks: ['加江中集团完整 LOGO', '加临床数据引用源', '品质承诺声明'], channel: '医生教育 / 药师培训 / 门店摆放' },
  2254. ];
  2255. return `<section class="report-section" id="${c.key}-5" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  2256. <div class="section-inner">
  2257. <div class="section-head rise-in">
  2258. <div class="section-eyebrow" style="color:${c.color};">${c.num}.5 · APPLICATION EXTENSIONS</div>
  2259. <h2 class="text-h1"><span class="headline-anim">应用延展 · 6 大场景适配规范</span></h2>
  2260. <p class="section-sub">3 套 KV 母版 × 6 种应用场景 · 每个场景标注使用版本 / 尺寸 / 调整要点 · 设计团队拿到即可执行</p>
  2261. </div>
  2262. <!-- 6 场景卡片 -->
  2263. <div class="grid fade-up" style="grid-template-columns:repeat(3, 1fr); gap:16px;">
  2264. ${apps.map((app) => `
  2265. <div style="background:var(--bg-1); border:1px solid var(--border); border-top:3px solid ${app.tint}; border-radius:var(--radius-md); padding:22px 24px; display:flex; flex-direction:column; gap:14px;">
  2266. <!-- 场景头 -->
  2267. <div style="display:flex; justify-content:space-between; align-items:start;">
  2268. <div>
  2269. <div class="text-mono text-xs" style="color:${app.tint}; letter-spacing:0.12em; margin-bottom:4px;">APPLICATION</div>
  2270. <h3 class="text-h3" style="margin:0; font-size:1.1rem; color:var(--text-1); line-height:1.4;">${esc(app.scene)}</h3>
  2271. </div>
  2272. <div style="font-size:2.2rem; line-height:1;">${app.icon}</div>
  2273. </div>
  2274. <!-- 使用版本 -->
  2275. <div style="padding:10px 12px; background:${app.tint}12; border-radius:6px; font-size:0.82rem;">
  2276. <span style="color:var(--text-3); margin-right:6px;">使用版本:</span>
  2277. <strong style="color:${app.tint};">${esc(app.version)}</strong>
  2278. </div>
  2279. <!-- 尺寸 -->
  2280. <div style="font-size:0.78rem; padding:8px 12px; background:rgba(255,255,255,0.02); border-radius:4px;">
  2281. <span class="text-mono" style="color:var(--text-3); margin-right:6px;">SIZE:</span>
  2282. <span class="text-mono" style="color:var(--text-1);">${esc(app.ratio)}</span>
  2283. </div>
  2284. <!-- 调整要点 -->
  2285. <div>
  2286. <div class="text-mono text-xs" style="color:var(--text-3); letter-spacing:0.12em; margin-bottom:8px;">TWEAKS · 调整要点</div>
  2287. <ul style="list-style:none; padding:0; margin:0; display:flex; flex-direction:column; gap:4px;">
  2288. ${app.tweaks.map((t) => `<li style="font-size:0.8rem; color:var(--text-1); padding-left:14px; position:relative; line-height:1.5;"><span style="position:absolute; left:0; color:${app.tint};">▸</span>${esc(t)}</li>`).join('')}
  2289. </ul>
  2290. </div>
  2291. <!-- 渠道 -->
  2292. <div style="margin-top:auto; padding-top:10px; border-top:1px dashed var(--border); font-size:0.75rem;">
  2293. <span style="color:var(--text-3);">投放渠道:</span>
  2294. <span style="color:${app.tint}; font-weight:600;">${esc(app.channel)}</span>
  2295. </div>
  2296. </div>`).join('')}
  2297. </div>
  2298. <!-- 资产交付清单 -->
  2299. <h3 class="text-h2 fade-up" style="margin-top:32px; margin-bottom:14px;">📦 Asset Delivery · 设计团队交付清单</h3>
  2300. <div class="fade-up" style="background:var(--bg-1); border:1px solid var(--border); border-radius:var(--radius-md); padding:24px 28px;">
  2301. <div style="display:grid; grid-template-columns:repeat(4, 1fr); gap:16px;">
  2302. <div style="text-align:center; padding:16px; background:${c.color}08; border-radius:8px; border:1px solid ${c.color}22;">
  2303. <div style="font-family:var(--font-head); font-weight:900; font-size:2.4rem; color:${c.color}; line-height:1;">3</div>
  2304. <div class="text-mono text-xs" style="color:${c.color}; margin-top:4px; letter-spacing:0.08em;">KV VERSIONS</div>
  2305. <div style="font-size:0.78rem; color:var(--text-2); margin-top:6px; line-height:1.4;">情感 / 理性 / 对比</div>
  2306. </div>
  2307. <div style="text-align:center; padding:16px; background:${BRAND.JIANG_GREEN}08; border-radius:8px; border:1px solid ${BRAND.JIANG_GREEN}22;">
  2308. <div style="font-family:var(--font-head); font-weight:900; font-size:2.4rem; color:${BRAND.JIANG_GREEN}; line-height:1;">6</div>
  2309. <div class="text-mono text-xs" style="color:${BRAND.JIANG_GREEN}; margin-top:4px; letter-spacing:0.08em;">APPLICATIONS</div>
  2310. <div style="font-size:0.78rem; color:var(--text-2); margin-top:6px; line-height:1.4;">电商 / 社媒 / 药店 / 活动 / 视频 / 手册</div>
  2311. </div>
  2312. <div style="text-align:center; padding:16px; background:${BRAND.TECH_BLUE}08; border-radius:8px; border:1px solid ${BRAND.TECH_BLUE}22;">
  2313. <div style="font-family:var(--font-head); font-weight:900; font-size:2.4rem; color:${BRAND.TECH_BLUE}; line-height:1;">18</div>
  2314. <div class="text-mono text-xs" style="color:${BRAND.TECH_BLUE}; margin-top:4px; letter-spacing:0.08em;">TOTAL FILES</div>
  2315. <div style="font-size:0.78rem; color:var(--text-2); margin-top:6px; line-height:1.4;">3 × 6 场景组合</div>
  2316. </div>
  2317. <div style="text-align:center; padding:16px; background:#8B5CF608; border-radius:8px; border:1px solid #8B5CF622;">
  2318. <div style="font-family:var(--font-head); font-weight:900; font-size:2.4rem; color:#8B5CF6; line-height:1;">5</div>
  2319. <div class="text-mono text-xs" style="color:#8B5CF6; margin-top:4px; letter-spacing:0.08em;">SKU VARIANTS</div>
  2320. <div style="font-size:0.78rem; color:var(--text-2); margin-top:6px; line-height:1.4;">L-01/02/03/04/05 版本色调适配</div>
  2321. </div>
  2322. </div>
  2323. </div>
  2324. </div>
  2325. </section>`;
  2326. }
  2327. // ============================================================================
  2328. // ============ Chapter 2.5 · 价值链 · 3 子章 ==================================
  2329. // ============================================================================
  2330. // (实现见 Batch 6 · 下方 renderValue1/2/3 + renderSynthesis1/2/3)
  2331. // ============================================================================
  2332. // SLIDE_RENDERERS 注册表 · dispatch in buildHTML
  2333. // ============================================================================
  2334. const SLIDE_RENDERERS = {
  2335. 'audience-1': renderAudience1CorePersonas,
  2336. 'audience-2': renderAudience2Influencers,
  2337. 'audience-3': renderAudience3Journey,
  2338. 'audience-4': renderAudience4Insights,
  2339. 'audience-5': renderAudience5Segmentation,
  2340. 'position-1': renderPosition1Statement,
  2341. 'position-2': renderPosition2Interpretation,
  2342. 'position-3': renderPosition3Scenarios,
  2343. 'position-4': renderPosition4Benefits,
  2344. 'position-5': renderPosition5Personality,
  2345. 'position-6': renderPosition6Architecture,
  2346. 'package-1': renderPackage1Strategy,
  2347. 'package-2': renderPackage2Hierarchy,
  2348. 'package-3': renderPackage3KeyInfo,
  2349. 'package-4': renderPackage4Differentiation,
  2350. 'package-5': renderPackage5Compliance,
  2351. 'kv-1': renderKv1Concept,
  2352. 'kv-2': renderKv2Composition,
  2353. 'kv-3': renderKv3Colors,
  2354. 'kv-4': renderKv4Typography,
  2355. 'kv-5': renderKv5Applications,
  2356. // Batch 6 · 2.5 价值链 + 2.6 总结
  2357. 'value-1': renderValue1Canvas,
  2358. 'value-2': renderValue2Chain,
  2359. 'value-3': renderValue3Journey,
  2360. 'synthesis-1': renderSynthesis1Elements,
  2361. 'synthesis-2': renderSynthesis2Inheritance,
  2362. 'synthesis-3': renderSynthesis3NextStage,
  2363. };
  2364. // ============================================================
  2365. // Slide Placeholder · 还未填充的 slide 使用(保持 slide 数量完整)
  2366. // ============================================================
  2367. function renderSubPlaceholder({ slideNum, slideTotal, chapterKey, subIndex, title }) {
  2368. const c = CHAPTERS.find((x) => x.key === chapterKey);
  2369. return `<section class="report-section" id="${chapterKey}-${subIndex}" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  2370. <div class="section-inner">
  2371. <div class="section-head rise-in">
  2372. <div class="section-eyebrow" style="color:${c.color};">${c.num}.${subIndex} · ${c.en}</div>
  2373. <h2 class="text-h1"><span class="headline-anim">${esc(title)}</span></h2>
  2374. <p class="section-sub">本节内容将在后续批次填充 · 已占位保持 slide 结构完整</p>
  2375. </div>
  2376. <div class="fade-up" style="padding:48px; background:var(--bg-1); border:1px dashed ${c.color}44; border-radius:var(--radius-md); text-align:center;">
  2377. <div style="font-size:3rem; margin-bottom:16px;">${c.icon}</div>
  2378. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:8px;">PLACEHOLDER / TO BE FILLED</div>
  2379. <div style="color:var(--text-2); font-size:1rem; line-height:1.7; max-width:600px; margin:0 auto;">
  2380. 此 slide 对应《美佑童-产品复合体》<strong style="color:${c.color};">${c.num}.${subIndex} ${esc(title)}</strong> 子章节<br/>
  2381. 后续批次将按江中肝纯片 VOC 真实数据进行完整填充
  2382. </div>
  2383. </div>
  2384. </div>
  2385. </section>`;
  2386. }
  2387. // ============================================================
  2388. // Slide 36 · Next Steps / 附录
  2389. // ============================================================
  2390. function renderNextSteps({ slideNum, slideTotal }) {
  2391. return `<section class="report-section" id="next" data-tone="amber" data-slide-num="${slideNum}/${slideTotal}">
  2392. <div class="section-inner">
  2393. <div class="section-head rise-in">
  2394. <div class="section-eyebrow">EPILOGUE · 下一步</div>
  2395. <h2 class="text-h1"><span class="headline-anim">From Compound to Launch</span></h2>
  2396. <p class="section-sub">产品复合体方案已完成 · 后续衔接营销复合体 / 海报 AI 提示词 / 渠道铺货</p>
  2397. </div>
  2398. <div class="grid grid-3 fade-up" style="gap:20px; margin-bottom:32px;">
  2399. <div class="card card-accent" style="border-left:4px solid var(--amber);">
  2400. <div class="text-mono text-xs" style="color:var(--amber); letter-spacing:0.12em; margin-bottom:10px;">NEXT · 03</div>
  2401. <h3 class="text-h3" style="margin-bottom:10px;">营销复合体方案</h3>
  2402. <p style="color:var(--text-2); line-height:1.65; font-size:0.9rem;">STP 细分 · 4P 策略 · 传播矩阵 · 媒介预算分配</p>
  2403. </div>
  2404. <div class="card card-accent" style="border-left:4px solid ${BRAND.JIANG_GREEN};">
  2405. <div class="text-mono text-xs" style="color:${BRAND.JIANG_GREEN}; letter-spacing:0.12em; margin-bottom:10px;">NEXT · 04</div>
  2406. <h3 class="text-h3" style="margin-bottom:10px;">海报 AI 提示词</h3>
  2407. <p style="color:var(--text-2); line-height:1.65; font-size:0.9rem;">3 套 KV 视觉参数 · MJ/SD 提示词库 · 电商详情页规范</p>
  2408. </div>
  2409. <div class="card card-accent" style="border-left:4px solid ${BRAND.TECH_BLUE};">
  2410. <div class="text-mono text-xs" style="color:${BRAND.TECH_BLUE}; letter-spacing:0.12em; margin-bottom:10px;">EXEC</div>
  2411. <h3 class="text-h3" style="margin-bottom:10px;">产品立项 PRD</h3>
  2412. <p style="color:var(--text-2); line-height:1.65; font-size:0.9rem;">L-01/02/03 三条 SKU 线配方确认 · 打样周期 · 合规报批</p>
  2413. </div>
  2414. </div>
  2415. <div class="card fade-up" style="background:linear-gradient(135deg, rgba(245,166,35,0.06), rgba(45,156,93,0.04)); border:1px solid rgba(245,166,35,0.2);">
  2416. <div class="text-mono text-xs" style="color:var(--amber); letter-spacing:0.15em; margin-bottom:12px;">APPENDIX · 数据来源</div>
  2417. <div style="display:grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap:16px; color:var(--text-2); font-size:0.9rem; line-height:1.7;">
  2418. <div>
  2419. <strong style="color:var(--amber);">VOC 原始数据</strong><br/>
  2420. <code style="font-size:0.82rem;">data/jiangzhong-liver-voc.json</code> · 4.2 MB
  2421. </div>
  2422. <div>
  2423. <strong style="color:var(--amber);">VOC 分析报告</strong><br/>
  2424. <code style="font-size:0.82rem;">reports/jiangzhong-liver-voc-report.html</code>
  2425. </div>
  2426. <div>
  2427. <strong style="color:var(--amber);">方法论参考</strong><br/>
  2428. <code style="font-size:0.82rem;">E:/文件资料/md文档生成的海报或者策划/2.美佑童-产品复合体.docx</code>
  2429. </div>
  2430. <div>
  2431. <strong style="color:var(--amber);">数据提炼摘要</strong><br/>
  2432. <code style="font-size:0.82rem;">data/voc-summary-for-product-dev.txt</code> · 25.8 KB
  2433. </div>
  2434. </div>
  2435. </div>
  2436. <div class="fade-up" style="margin-top:40px; text-align:center; color:var(--text-3); font-family:var(--font-mono); font-size:0.78rem; letter-spacing:0.2em;">
  2437. JIANGZHONG PRODUCT-DEV · COMPOUND-BODY v1.0 · ${new Date().toISOString().slice(0, 10)}
  2438. </div>
  2439. </div>
  2440. </section>`;
  2441. }
  2442. // ============================================================
  2443. // 主入口 · buildHTML 组装全部 slide
  2444. // ============================================================
  2445. function buildHTML({ product, A, collectedAt }) {
  2446. const product_ = product || '江中肝纯片';
  2447. const ST = String(TOTAL_SLIDES).padStart(2, '0');
  2448. let n = 1;
  2449. // 使用 map-style 的 slide builder,后续批次可以直接替换 renderSubPlaceholder
  2450. const slides = [];
  2451. slides.push(renderCover({ product: product_, A, collectedAt, slideNum: sn(n++), slideTotal: ST }));
  2452. slides.push(renderAgenda({ slideNum: sn(n++), slideTotal: ST }));
  2453. // 每个 chapter:先 divider,再 N 个子 slide
  2454. for (const chapter of CHAPTERS) {
  2455. const subsections = CHAPTER_SUBSECTIONS[chapter.key] || [];
  2456. // Chapter Divider
  2457. slides.push(renderChapterDivider({
  2458. slideNum: sn(n++), slideTotal: ST,
  2459. chapter, subsections,
  2460. heroLine: CHAPTER_HERO_LINES[chapter.key] || '',
  2461. A,
  2462. }));
  2463. // 子 slide 分发:已注册的真实 renderer 优先,否则占位
  2464. subsections.forEach((sub, i) => {
  2465. const subIndex = i + 1;
  2466. const key = `${chapter.key}-${subIndex}`;
  2467. const renderer = SLIDE_RENDERERS[key];
  2468. const args = {
  2469. slideNum: sn(n++), slideTotal: ST,
  2470. chapter, chapterKey: chapter.key,
  2471. subIndex, title: sub,
  2472. A,
  2473. };
  2474. slides.push(renderer ? renderer(args) : renderSubPlaceholder(args));
  2475. });
  2476. }
  2477. // Next Steps
  2478. slides.push(renderNextSteps({ slideNum: sn(n++), slideTotal: ST }));
  2479. return `<!DOCTYPE html>
  2480. <html lang="zh-CN">
  2481. <head>
  2482. <meta charset="UTF-8">
  2483. <meta name="viewport" content="width=device-width,initial-scale=1.0">
  2484. <title>${esc(product_)} · 产品复合体方案</title>
  2485. <script>document.documentElement.classList.add('js');</script>
  2486. <!-- 本地离线字体(同目录 assets/fonts/) · 双击 HTML 即可用,无需网络 -->
  2487. <link href="./assets/fonts/fonts.css" rel="stylesheet">
  2488. <!-- 在线 fallback:本地字体缺失时异步加载(不阻塞首屏) -->
  2489. <link href="https://fonts.loli.net/css2?family=Inter:wght@400;600;700;800;900&family=Noto+Sans+SC:wght@400;500;700;900&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet" media="print" onload="this.media='all'">
  2490. ${STYLES}
  2491. </head>
  2492. <body>
  2493. ${renderNav()}
  2494. <div class="slide-counter" id="slideCounter">
  2495. <span class="now">01</span>
  2496. <span>/</span>
  2497. <span class="total">${ST}</span>
  2498. <span class="bar"></span>
  2499. </div>
  2500. ${renderKbdHint()}
  2501. <div class="progress-line" id="progressLine"></div>
  2502. <main class="deck">
  2503. ${slides.join('\n')}
  2504. </main>
  2505. <footer class="report-footer">
  2506. <div>由 江中产品开发部 · 复合体方案引擎 生成 · 对标《美佑童-产品复合体》5 维方法论</div>
  2507. <div class="meta">DATA / ${esc(collectedAt || '—')} · ${TOTAL_SLIDES} SLIDES · ${CHAPTERS.length} CHAPTERS</div>
  2508. </footer>
  2509. <script>${SCRIPTS}</script>
  2510. </body>
  2511. </html>`;
  2512. }
  2513. module.exports = {
  2514. buildHTML,
  2515. esc,
  2516. fmtNum,
  2517. fmtMoney,
  2518. sn,
  2519. star,
  2520. CHAPTERS,
  2521. CHAPTER_SUBSECTIONS,
  2522. BRAND,
  2523. TOTAL_SLIDES,
  2524. };