base.css 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599
  1. /* ============================================================
  2. * lib/theme/base.css · 全局基础层
  3. * reset + 全屏 .screen 容器 + 通用演绎类(暗/浅由 tokens.css 驱动)
  4. * 纪律:本文件不出现十六进制色值,只用 var(--...)。
  5. * ============================================================ */
  6. /* ---------- Reset ---------- */
  7. *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
  8. html, body { height: 100%; }
  9. body {
  10. font-family: var(--font-body);
  11. background: var(--bg-0);
  12. color: var(--text-2);
  13. overflow: hidden; /* 屏内定位,不滚动页面 */
  14. -webkit-font-smoothing: antialiased;
  15. line-height: 1.6;
  16. }
  17. h1,h2,h3,h4 { font-family: var(--font-display); font-weight: var(--font-display-weight); color: var(--text-1); line-height: 1.25; }
  18. img, video { max-width: 100%; display: block; }
  19. a { color: var(--brand-1); text-decoration: none; }
  20. button { font-family: inherit; cursor: pointer; }
  21. /* ---------- 屏幕容器(16:9 / 16:10 全屏) ---------- */
  22. .screen {
  23. width: 100vw;
  24. height: var(--screen-h);
  25. overflow: hidden;
  26. position: relative;
  27. display: flex;
  28. align-items: center;
  29. justify-content: center;
  30. background: var(--bg-0);
  31. }
  32. .screen[data-tl] > .s-wrap { visibility: hidden; } /* 初始隐藏,时间线表演(deck 取消) */
  33. .screen[data-tl].in > .s-wrap { visibility: visible; }
  34. .s-wrap {
  35. width: 82%;
  36. max-width: 1720px;
  37. height: 88%;
  38. position: relative; /* 插画/飘浮物定位锚点(absolute 元素贴内容容器而非叠放屏) */
  39. display: flex;
  40. flex-direction: column;
  41. justify-content: center;
  42. gap: clamp(14px, 2.2vh, 28px);
  43. }
  44. /* ---------- 屏内基础元素 ---------- */
  45. .s-tag {
  46. font-family: var(--font-mono);
  47. font-size: clamp(12px, 1.2vw, 16px);
  48. letter-spacing: .14em;
  49. color: var(--brand-1);
  50. text-transform: uppercase;
  51. }
  52. .s-title { font-size: clamp(30px, 3.6vw, 52px); }
  53. .s-sub { font-size: clamp(16px, 1.5vw, 22px); color: var(--text-3); max-width: 78%; }
  54. .s-body { flex: 1; display: flex; flex-direction: column; justify-content: center; gap: clamp(12px, 1.8vh, 22px); }
  55. /* ---------- 双栏编导布局:内容列 + 插画列(插画参与布局,天然不重叠) ---------- */
  56. .s-split { flex: 1; min-height: 0; display: flex; flex-direction: row; align-items: center; gap: clamp(20px, 3vw, 44px); }
  57. .s-split > .s-main { flex: 1; min-width: 0; display: flex; flex-direction: column; justify-content: center; gap: clamp(12px, 1.8vh, 22px); }
  58. .s-split > .s-side { flex: none; width: clamp(190px, 24vw, 360px); display: flex; align-items: center; justify-content: center; }
  59. .s-split > .s-side svg.ill, .s-split > .s-side .ill { position: static; width: 100%; height: auto; }
  60. /* 窄屏(16:10 或小窗)时插画列收窄、靠边,避免挤压正文 */
  61. .s-split > .s-side.wide { width: clamp(240px, 30vw, 460px); }
  62. .s-split > .s-side.narrow { width: clamp(150px, 18vw, 280px); }
  63. @media (max-width: 1100px) { .s-split { gap: 16px; } .s-split > .s-side { width: clamp(150px, 20vw, 260px); } }
  64. /* 插画列内部:可叠加角标 / 说明文字(.s-cap 图注) */
  65. .s-side .s-cap { position: absolute; left: 0; right: 0; bottom: -24px; text-align: center; font-family: var(--font-mono); font-size: clamp(11px, 1vw, 14px); color: var(--text-4); }
  66. .s-foot {
  67. font-family: var(--font-mono);
  68. font-size: clamp(12px, 1.1vw, 15px);
  69. color: var(--text-4);
  70. letter-spacing: .06em;
  71. text-align: right;
  72. }
  73. /* 素材屏底部来源标注(放 .s-main 内,紧贴卡片下方) */
  74. .s-foot-note {
  75. font-family: var(--font-mono);
  76. font-size: clamp(10px, .9vw, 12px);
  77. color: var(--text-4);
  78. margin-top: 6px;
  79. }
  80. /* ---------- 通用卡片 / 网格 / 标签 ---------- */
  81. .card {
  82. background: var(--bg-2);
  83. border: 1px solid var(--border-subtle);
  84. border-radius: var(--radius-card);
  85. padding: clamp(16px, 2vw, 28px);
  86. box-shadow: var(--shadow-card);
  87. }
  88. .card.gold { border-color: var(--border-strong); }
  89. .card.warn { border-color: var(--border-focus); }
  90. .card.hi { box-shadow: var(--shadow-glow); }
  91. .grid { display: grid; gap: clamp(14px, 1.6vw, 22px); }
  92. .grid.cols-2 { grid-template-columns: repeat(2, 1fr); }
  93. .grid.cols-3 { grid-template-columns: repeat(3, 1fr); }
  94. .grid.cols-4 { grid-template-columns: repeat(4, 1fr); }
  95. .tag {
  96. display: inline-flex; align-items: center; gap: 6px;
  97. font-family: var(--font-mono);
  98. font-size: clamp(11px, 1vw, 14px);
  99. color: var(--brand-1);
  100. border: 1px solid var(--border-strong);
  101. background: var(--bg-2);
  102. border-radius: var(--radius-sm);
  103. padding: 2px 10px;
  104. white-space: nowrap;
  105. }
  106. .tag.ok { color: var(--brand-ok); border-color: rgba(127,209,160,.4); }
  107. .tag.brand-2 { color: var(--brand-2); border-color: rgba(175,138,232,.4); }
  108. .notice {
  109. font-size: clamp(15px, 1.4vw, 19px);
  110. color: var(--text-2);
  111. border-left: 3px solid var(--brand-1);
  112. padding: 6px 0 6px 16px;
  113. background: var(--bg-2);
  114. }
  115. .notice.warn { border-left-color: var(--brand-3); color: var(--brand-3); font-weight: 600; }
  116. /* ---------- 模型图例(显化思维模型:符号 / 颜色含义) ----------
  117. 用法:模型图下方放 `.model-legend`,内放 `.model-legend .li`(`.sw` 色块 / `.ln` 线 / `.sym` 符号 + 文字)。
  118. 图例是「让模型可读」的最小契约:观众先看懂符号,再读图。 */
  119. .model-legend {
  120. display: flex; flex-wrap: wrap; gap: clamp(6px, .8vw, 10px) clamp(14px, 2vw, 28px);
  121. align-items: center; justify-content: center;
  122. padding: clamp(8px, 1.2vh, 12px) clamp(14px, 1.6vw, 22px);
  123. background: var(--bg-1); border: 1px solid var(--border-subtle);
  124. border-radius: var(--radius-sm);
  125. font-family: var(--font-mono); font-size: clamp(11px, 1vw, 14px);
  126. color: var(--text-3);
  127. }
  128. .model-legend .li { display: inline-flex; align-items: center; gap: 7px; white-space: nowrap; }
  129. .model-legend .li b { color: var(--text-2); font-weight: 600; }
  130. .model-legend .sw { width: 15px; height: 15px; border-radius: 3px; flex: none; border: 1px solid var(--border-subtle); }
  131. .model-legend .sw.gold { background: var(--brand-1); }
  132. .model-legend .sw.purple { background: var(--brand-2); }
  133. .model-legend .sw.red { background: var(--brand-3); }
  134. .model-legend .sw.green { background: var(--brand-ok); }
  135. .model-legend .sw.gray { background: var(--bg-3); border-color: var(--border-subtle); }
  136. .model-legend .sw.line { background: transparent; border: 1.5px solid var(--brand-1); }
  137. .model-legend .sw.dash { background: transparent; border: 1.5px dashed var(--brand-3); }
  138. .model-legend .ln { width: 20px; height: 0; border-top: 3px solid var(--brand-2); flex: none; }
  139. .model-legend .ln.red { border-color: var(--brand-3); }
  140. .model-legend .ln.gold { border-color: var(--brand-1); }
  141. .model-legend .ln.dash { border-top-style: dashed; }
  142. .model-legend .sym { font-size: clamp(13px, 1.1vw, 16px); color: var(--brand-1-hi); font-weight: 700; flex: none; line-height: 1; }
  143. .model-legend .sym.red { color: var(--brand-3); }
  144. /* 模型标签:模型图上方的「点名」小标签(编号 + 模型名) */
  145. .model-tag {
  146. display: inline-flex; align-items: center; gap: 8px;
  147. font-family: var(--font-mono); font-size: clamp(11px, 1vw, 14px);
  148. color: var(--brand-1); letter-spacing: .12em;
  149. border: 1px solid var(--border-strong); border-radius: var(--radius-sm);
  150. padding: 4px 12px; margin-bottom: 4px;
  151. }
  152. .model-tag .no { color: var(--brand-2); }
  153. .model-tag.green { color: var(--brand-ok); border-color: rgba(127,209,160,.4); }
  154. /* ---------- 思维模型卡(显化思维模型:点名屏) ----------
  155. 结构:.model-map(grid) > .mm-item(card) > .mm-n(模型名) + .mm-t(核心判断) + .mm-d(展开)。
  156. 层式模型化:编号模型名(mono)+ 核心判断(display 大字)+ 展开(正文),品牌强调色描边,暗/浅双主题。 */
  157. .model-map {
  158. display: grid; gap: clamp(12px, 1.6vw, 20px); width: 100%;
  159. }
  160. .model-map.cols { grid-template-columns: 1fr 1fr; }
  161. .mm-item {
  162. position: relative;
  163. background: linear-gradient(180deg, var(--bg-2), var(--bg-1));
  164. border: 1px solid var(--border-subtle);
  165. border-left: 4px solid var(--brand-2);
  166. border-radius: var(--radius-card);
  167. padding: clamp(14px, 1.8vw, 24px) clamp(16px, 2vw, 28px);
  168. box-shadow: var(--shadow-card);
  169. }
  170. .mm-item.hot { border-color: var(--border-strong); border-left-color: var(--brand-1); }
  171. .mm-item.warn { border-left-color: var(--brand-3); }
  172. .mm-item.ok { border-left-color: var(--brand-ok); }
  173. .mm-item .mm-n {
  174. font-family: var(--font-mono); font-size: clamp(11px, 1vw, 14px);
  175. color: var(--brand-2); letter-spacing: .12em; font-weight: 700;
  176. }
  177. .mm-item.hot .mm-n { color: var(--brand-1); }
  178. .mm-item .mm-t {
  179. font-family: var(--font-display); font-weight: var(--font-display-weight);
  180. font-size: clamp(17px, 1.9vw, 26px); color: var(--text-1);
  181. margin: 6px 0 8px; line-height: 1.35;
  182. }
  183. .mm-item .mm-d { font-size: clamp(13px, 1.25vw, 17px); color: var(--text-2); line-height: 1.75; }
  184. .mm-item .mm-d b { color: var(--brand-1); font-weight: 600; }
  185. .mm-item .mm-d .hl { color: var(--brand-1-hi); }
  186. /* ---------- 数据速览(stat-band) ---------- */
  187. .stat-band { display: flex; gap: clamp(20px, 3vw, 48px); align-items: stretch; }
  188. .stat {
  189. flex: 1; min-width: 0;
  190. background: var(--bg-2);
  191. border: 1px solid var(--border-subtle);
  192. border-radius: var(--radius-card);
  193. padding: clamp(14px, 1.8vw, 24px);
  194. }
  195. .stat .num {
  196. font-family: var(--font-mono);
  197. font-size: clamp(34px, 4.6vw, 68px);
  198. font-weight: 800;
  199. color: var(--brand-1);
  200. line-height: 1.1;
  201. font-variant-numeric: tabular-nums;
  202. }
  203. .stat .num.hero { color: var(--text-1); }
  204. .stat .label { margin-top: 6px; font-size: clamp(12px, 1.1vw, 15px); color: var(--text-3); }
  205. .stat .src { margin-top: 2px; font-size: clamp(10px, .9vw, 12px); color: var(--text-4); }
  206. /* ---------- 链路 / 流程(chain) ---------- */
  207. .chain { display: flex; align-items: stretch; gap: clamp(10px, 1.2vw, 18px); }
  208. .chain .node {
  209. flex: 1; text-align: center;
  210. border: 1px solid var(--border-subtle);
  211. border-radius: var(--radius-card);
  212. padding: clamp(12px, 1.6vw, 22px);
  213. background: var(--bg-2);
  214. position: relative;
  215. }
  216. .chain .node .k { font-family: var(--font-mono); font-size: clamp(10px, .95vw, 13px); color: var(--text-4); letter-spacing: .12em; }
  217. .chain .node .v { font-size: clamp(14px, 1.3vw, 18px); color: var(--text-1); font-weight: 600; margin-top: 4px; }
  218. .chain .node.on { border-color: var(--border-strong); box-shadow: var(--shadow-glow); }
  219. .chain .node.wall { border-color: rgba(255,0,0,.45); }
  220. .chain .arrow {
  221. display: flex; align-items: center; color: var(--brand-1-hi);
  222. font-size: clamp(16px, 1.5vw, 22px); font-weight: 700;
  223. }
  224. /* ---------- 左右对比(duel) ---------- */
  225. .duel { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(16px, 2.2vw, 32px); align-items: stretch; }
  226. .duel .side {
  227. border-radius: var(--radius-card);
  228. padding: clamp(16px, 2vw, 28px);
  229. border: 1px solid var(--border-subtle);
  230. background: var(--bg-2);
  231. }
  232. .duel .side.bad { border-color: rgba(255,0,0,.45); }
  233. .duel .side.good { border-color: var(--border-strong); box-shadow: var(--shadow-glow); }
  234. .duel .side h3 { font-size: clamp(16px, 1.5vw, 22px); margin-bottom: 10px; }
  235. .duel .side.bad h3 { color: var(--brand-3); }
  236. .duel .side.good h3 { color: var(--brand-1); }
  237. .duel .side .vs { font-family: var(--font-mono); color: var(--text-4); font-size: clamp(12px, 1vw, 14px); letter-spacing: .1em; }
  238. /* ---------- 金句(quote-line) ---------- */
  239. .quote-line {
  240. font-family: var(--font-display);
  241. font-size: clamp(24px, 2.8vw, 40px);
  242. font-weight: var(--font-display-weight);
  243. color: var(--text-1);
  244. line-height: 1.4;
  245. }
  246. .quote-line .hl { background: var(--gradient-text); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; }
  247. .quote-line .src { display: block; margin-top: 10px; font-family: var(--font-mono); font-size: clamp(11px, 1vw, 14px); color: var(--text-4); -webkit-text-fill-color: var(--text-4); }
  248. /* ---------- 诚实边界(truth-table) ---------- */
  249. .truth-table { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(16px, 2vw, 28px); }
  250. .truth-table .col { border-radius: var(--radius-card); padding: clamp(16px, 2vw, 26px); background: var(--bg-2); border: 1px solid var(--border-subtle); }
  251. .truth-table .col.confirmed { border-color: rgba(127,209,160,.4); }
  252. .truth-table .col.pending { border-color: rgba(175,138,232,.4); }
  253. .truth-table .col h3 { font-size: clamp(15px, 1.4vw, 20px); margin-bottom: 10px; }
  254. .truth-table .confirmed h3 { color: var(--brand-ok); }
  255. .truth-table .pending h3 { color: var(--brand-2); }
  256. .truth-table li { list-style: none; padding: 4px 0 4px 18px; position: relative; font-size: clamp(13px, 1.2vw, 17px); color: var(--text-2); }
  257. .truth-table li::before { content: attr(data-mark); position: absolute; left: 0; font-family: var(--font-mono); }
  258. /* ---------- 步骤带(chip-steps) ---------- */
  259. .chip-steps { display: flex; gap: clamp(8px, .9vw, 14px); flex-wrap: wrap; }
  260. .chip {
  261. font-family: var(--font-mono);
  262. font-size: clamp(13px, 1.2vw, 17px);
  263. padding: 8px 18px;
  264. border-radius: var(--radius-pill);
  265. border: 1px solid var(--border-subtle);
  266. background: var(--bg-2);
  267. color: var(--text-2);
  268. }
  269. .chip.on { border-color: var(--border-strong); color: var(--brand-1); box-shadow: var(--shadow-glow); }
  270. .chip.warn { border-color: rgba(255,0,0,.45); color: var(--brand-3); }
  271. .chip .n { opacity: .6; margin-right: 6px; }
  272. /* ---------- 业务三环(loop3) ---------- */
  273. .loop3 { display: flex; justify-content: center; align-items: center; gap: clamp(18px, 2.4vw, 34px); }
  274. .loop3 .ring {
  275. width: clamp(120px, 15vw, 210px); height: clamp(120px, 15vw, 210px);
  276. border-radius: 50%;
  277. border: 2px dashed var(--border-subtle);
  278. display: flex; flex-direction: column; align-items: center; justify-content: center;
  279. gap: 4px; text-align: center; padding: 10px;
  280. background: var(--bg-2);
  281. }
  282. .loop3 .ring.on { border-color: var(--border-strong); border-style: solid; box-shadow: var(--shadow-glow); }
  283. .loop3 .ring .t { font-size: clamp(14px, 1.3vw, 18px); color: var(--text-1); font-weight: 700; }
  284. .loop3 .ring .d { font-size: clamp(10px, .95vw, 13px); color: var(--text-3); }
  285. .loop3 .loop-arrow { font-size: clamp(18px, 1.8vw, 26px); color: var(--brand-1-hi); font-weight: 700; }
  286. /* ---------- 反转序列(reversal) ---------- */
  287. .reversal { display: flex; flex-direction: column; gap: clamp(10px, 1.4vh, 16px); }
  288. .reversal .rv {
  289. display: flex; align-items: baseline; gap: 14px;
  290. border: 1px solid var(--border-subtle);
  291. border-left: 3px solid var(--brand-2);
  292. border-radius: var(--radius-card);
  293. padding: clamp(10px, 1.4vw, 16px) clamp(16px, 1.8vw, 24px);
  294. background: var(--bg-2);
  295. }
  296. .reversal .rv.on { border-left-color: var(--brand-1); }
  297. .reversal .rv .n { font-family: var(--font-mono); color: var(--brand-2); font-size: clamp(14px, 1.3vw, 18px); font-weight: 700; }
  298. .reversal .rv.on .n { color: var(--brand-1); }
  299. .reversal .rv .t { font-size: clamp(14px, 1.3vw, 18px); color: var(--text-2); }
  300. /* ---------- 目录卡(toccard) ---------- */
  301. .toccard-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(14px, 1.6vw, 22px); }
  302. .toccard {
  303. display: block;
  304. background: var(--bg-2);
  305. border: 1px solid var(--border-subtle);
  306. border-radius: var(--radius-card);
  307. padding: clamp(16px, 1.8vw, 24px);
  308. color: var(--text-2);
  309. transition: transform .3s var(--ease-out), border-color .3s, box-shadow .3s;
  310. }
  311. .toccard:hover { transform: translateY(-4px); border-color: var(--border-strong); box-shadow: var(--shadow-glow); }
  312. .toccard .no { font-family: var(--font-mono); color: var(--brand-1); font-size: clamp(11px, 1vw, 14px); letter-spacing: .12em; }
  313. .toccard .ti { font-size: clamp(16px, 1.5vw, 21px); font-family: var(--font-display); color: var(--text-1); font-weight: var(--font-display-weight); margin: 6px 0 4px; }
  314. .toccard .de { font-size: clamp(12px, 1.1vw, 15px); color: var(--text-3); }
  315. /* ---------- 画像对拍(profile-match) ---------- */
  316. .match { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(16px, 2vw, 28px); }
  317. .match .col { border-radius: var(--radius-card); border: 1px solid var(--border-subtle); background: var(--bg-2); padding: clamp(16px, 1.8vw, 24px); }
  318. .match .col h3 { font-size: clamp(15px, 1.4vw, 20px); margin-bottom: 12px; }
  319. .match .col.worker h3 { color: var(--brand-1); }
  320. .match .col.job h3 { color: var(--brand-2); }
  321. .match .col .tags { display: flex; flex-wrap: wrap; gap: 8px; }
  322. .match .col .tags .tag { opacity: .55; }
  323. .match .col .tags .tag.on { opacity: 1; }
  324. /* ---------- 通用演绎类 · 增补(卡片/对比/引文/数据) ---------- */
  325. .card.ok { border-color: var(--border-ok); }
  326. .card.danger{ border-color: var(--border-danger); }
  327. .card .k {
  328. font-family: var(--font-mono);
  329. font-size: clamp(11px, .95vw, 13px);
  330. letter-spacing: .14em;
  331. color: var(--brand-1);
  332. margin-bottom: 8px;
  333. text-transform: uppercase;
  334. }
  335. .card .k.red { color: var(--brand-3); }
  336. .card .k.gold { color: var(--brand-1-hi); }
  337. .card .k.green { color: var(--brand-ok); }
  338. .card .k.purple{ color: var(--brand-2); }
  339. .s-tag.red { color: var(--brand-3); }
  340. .s-tag.purple{ color: var(--brand-2); }
  341. .hl { background: var(--gradient-text); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; }
  342. .red { color: var(--brand-3); }
  343. .green { color: var(--brand-ok); }
  344. /* ---------- 金句卡(quote) ---------- */
  345. .quote {
  346. border-left: 3px solid var(--brand-1);
  347. background: var(--bg-2);
  348. padding: clamp(14px, 1.8vw, 22px) clamp(18px, 2vw, 28px);
  349. border-radius: var(--radius-card);
  350. }
  351. .quote p {
  352. font-family: var(--font-display);
  353. font-size: clamp(18px, 1.9vw, 26px);
  354. color: var(--text-1);
  355. line-height: 1.5;
  356. font-weight: var(--font-display-weight);
  357. }
  358. .quote p b { color: var(--brand-1); }
  359. .quote .q-src {
  360. display: block;
  361. margin-top: 10px;
  362. font-family: var(--font-mono);
  363. font-size: clamp(11px, 1vw, 14px);
  364. color: var(--text-4);
  365. }
  366. /* ---------- 左右分栏(split) ---------- */
  367. .split { display: grid; grid-template-columns: 1.1fr 1fr; gap: clamp(18px, 2.2vw, 32px); align-items: center; }
  368. .split > * { min-width: 0; }
  369. /* ---------- 编号步骤带(steps) ---------- */
  370. .steps { display: flex; gap: clamp(8px, .9vw, 14px); align-items: stretch; flex-wrap: wrap; }
  371. .step {
  372. flex: 1; min-width: 150px;
  373. border: 1px solid var(--border-subtle);
  374. background: var(--bg-2);
  375. border-radius: var(--radius-card);
  376. padding: clamp(12px, 1.4vw, 18px);
  377. position: relative;
  378. }
  379. .step .s-n { font-family: var(--font-mono); font-size: clamp(11px, 1vw, 14px); color: var(--brand-1); }
  380. .step .s-n.red { color: var(--brand-3); }
  381. .step .s-t { font-size: clamp(14px, 1.3vw, 18px); color: var(--text-1); font-weight: 600; margin: 4px 0 4px; }
  382. .step p { font-size: clamp(11px, 1vw, 14px); color: var(--text-3); }
  383. .step::after {
  384. content: '→';
  385. position: absolute; right: -9px; top: 50%;
  386. transform: translateY(-50%);
  387. color: var(--brand-1-hi);
  388. font-family: var(--font-mono);
  389. z-index: 2;
  390. }
  391. .step:last-child::after { content: ''; }
  392. /* ---------- 前后对比(ba) ---------- */
  393. .ba { display: grid; grid-template-columns: 1fr 46px 1fr; align-items: stretch; }
  394. .ba-box {
  395. border: 1px solid var(--border-subtle);
  396. background: var(--bg-2);
  397. border-radius: var(--radius-card);
  398. padding: clamp(14px, 1.6vw, 22px);
  399. }
  400. .ba-before { border-color: var(--border-danger); }
  401. .ba-after { border-color: var(--border-strong); box-shadow: var(--shadow-glow); }
  402. .ba-arrow { display: flex; align-items: center; justify-content: center; font-size: clamp(18px, 1.8vw, 26px); color: var(--brand-1-hi); }
  403. .ba-box .bh { font-family: var(--font-mono); font-size: clamp(10px, .95vw, 13px); letter-spacing: .12em; margin-bottom: 8px; color: var(--brand-3); }
  404. .ba-after .bh { color: var(--brand-1); }
  405. .ba-box .bv { font-size: clamp(13px, 1.2vw, 17px); font-weight: 600; color: var(--text-1); line-height: 1.55; }
  406. .ba-box .bv b { color: var(--brand-1); }
  407. /* ---------- 业务三环 · 方块变体(loop3.l3) ---------- */
  408. .loop3 .l3 {
  409. width: clamp(150px, 18vw, 260px);
  410. border: 1px solid var(--border-subtle);
  411. background: var(--bg-2);
  412. border-radius: var(--radius-card);
  413. padding: clamp(14px, 1.8vw, 22px);
  414. text-align: center;
  415. }
  416. .loop3 .l3.on { border-color: var(--border-strong); box-shadow: var(--shadow-glow); }
  417. .loop3 .l3-k { font-family: var(--font-mono); font-size: clamp(10px, .9vw, 13px); color: var(--brand-2); letter-spacing: .12em; }
  418. .loop3 .l3.on .l3-k { color: var(--brand-1); }
  419. .loop3 .l3-t { font-size: clamp(15px, 1.4vw, 20px); color: var(--text-1); font-weight: 700; margin: 4px 0; }
  420. .loop3 .l3 p { font-size: clamp(11px, 1vw, 14px); color: var(--text-3); }
  421. /* ---------- 反转序列 · 正文变体 ---------- */
  422. .reversal .rv .d { font-size: clamp(12px, 1.1vw, 15px); color: var(--text-3); margin-top: 2px; }
  423. /* ---------- 翻车版 vs 人味版(rw) ---------- */
  424. .rw { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(12px, 1.4vw, 18px); }
  425. .rw-box { border: 1px solid var(--border-subtle); border-radius: var(--radius-card); padding: clamp(14px, 1.6vw, 20px); }
  426. .rw-o { border-color: var(--border-danger); }
  427. .rw-n { border-color: var(--border-ok); }
  428. .rw-h { font-family: var(--font-mono); font-size: clamp(10px, .95vw, 13px); letter-spacing: .1em; margin-bottom: 8px; color: var(--brand-3); }
  429. .rw-n .rw-h { color: var(--brand-ok); }
  430. .rw-t { font-size: clamp(13px, 1.2vw, 17px); line-height: 1.7; color: var(--text-1); }
  431. .rw-t b { color: var(--brand-1); }
  432. .rw-d { font-size: clamp(11px, 1vw, 14px); color: var(--text-4); margin-top: 8px; font-family: var(--font-mono); }
  433. /* ---------- KPI 数字条(kpis) ---------- */
  434. .kpis { display: grid; grid-template-columns: repeat(4, 1fr); gap: clamp(10px, 1.2vw, 16px); }
  435. .kpi {
  436. border: 1px solid var(--border-subtle);
  437. background: var(--bg-2);
  438. border-radius: var(--radius-card);
  439. padding: clamp(12px, 1.4vw, 18px);
  440. text-align: center;
  441. }
  442. .kpi .kp-v { font-family: var(--font-mono); font-weight: 900; font-size: clamp(20px, 2.4vw, 34px); color: var(--brand-1); line-height: 1.1; font-variant-numeric: tabular-nums; }
  443. .kpi .kp-v.up { color: var(--brand-ok); }
  444. .kpi .kp-v.down { color: var(--brand-3); }
  445. .kpi .kp-l { font-family: var(--font-mono); font-size: clamp(10px, .9vw, 12px); color: var(--text-3); margin-top: 6px; }
  446. .kpi .kp-s { font-size: clamp(10px, .9vw, 12px); color: var(--text-4); margin-top: 2px; }
  447. /* ---------- 小标签行(vtag) ---------- */
  448. .vtag {
  449. display: inline-flex; align-items: center; gap: 8px;
  450. margin-bottom: 10px;
  451. font-family: var(--font-mono);
  452. font-size: clamp(10px, .95vw, 13px);
  453. color: var(--brand-1);
  454. letter-spacing: .12em;
  455. }
  456. .vtag::before { content: ''; width: 26px; height: 1px; background: var(--brand-1); }
  457. /* ---------- 顶栏(主题按钮 / 章节 tab,deck 渲染) ---------- */
  458. .deck-topbar {
  459. position: fixed; top: 0; left: 0; right: 0; z-index: 50;
  460. display: flex; align-items: center; justify-content: space-between; gap: 14px;
  461. padding: 10px 22px;
  462. pointer-events: none;
  463. }
  464. .deck-left { display: flex; align-items: center; flex-shrink: 0; }
  465. .deck-tabs {
  466. display: flex; gap: 6px; overflow-x: auto; pointer-events: auto;
  467. flex: 1 1 auto; min-width: 0;
  468. /* 两侧预留位:右 = 品牌 logo,左 = 主题按钮;并隐藏 x 滚动条 */
  469. padding-left: clamp(12px, 1.5vw, 32px);
  470. padding-right: clamp(56px, 6vw, 120px);
  471. scrollbar-width: none;
  472. }
  473. .deck-tabs::-webkit-scrollbar { display: none; }
  474. .deck-tab {
  475. font-family: var(--font-mono);
  476. font-size: 12px;
  477. padding: 4px 12px;
  478. border-radius: var(--radius-pill);
  479. border: 1px solid transparent;
  480. color: var(--text-3);
  481. background: transparent;
  482. white-space: nowrap;
  483. }
  484. .deck-tab.cur { color: var(--brand-1); border-color: var(--border-strong); background: var(--bg-2); }
  485. .theme-toggle {
  486. pointer-events: auto;
  487. display: inline-flex; align-items: center; justify-content: center;
  488. width: 34px; height: 30px; padding: 0;
  489. color: var(--text-3);
  490. border: 1px solid var(--border-subtle);
  491. border-radius: var(--radius-pill);
  492. background: var(--glass-bg);
  493. backdrop-filter: blur(var(--glass-blur));
  494. cursor: pointer;
  495. }
  496. .theme-toggle:hover { color: var(--brand-1); border-color: var(--border-strong); }
  497. .theme-toggle svg { flex-shrink: 0; }
  498. .deck-right { display: flex; align-items: center; gap: 10px; flex-shrink: 0; }
  499. /* 右上角品牌 logo(960×105 横条,theme.js 随主题切换暗/浅两图) */
  500. .hd-logo {
  501. height: clamp(20px, 2.4vh, 30px);
  502. width: auto;
  503. aspect-ratio: 960 / 105;
  504. object-fit: contain;
  505. flex-shrink: 0;
  506. }
  507. /* ---------- 底部进度条(deck 渲染) ---------- */
  508. .deck-bottom {
  509. position: fixed; bottom: 0; left: 0; right: 0; z-index: 50;
  510. display: flex; align-items: center; gap: 16px;
  511. padding: 10px 22px;
  512. pointer-events: none;
  513. }
  514. .deck-progress {
  515. flex: 1; height: 3px; border-radius: 2px;
  516. background: var(--bg-2); overflow: hidden;
  517. }
  518. .deck-progress .bar {
  519. height: 100%; width: 0%;
  520. background: var(--brand-1);
  521. transition: width .4s var(--ease-out);
  522. }
  523. .deck-pos { font-family: var(--font-mono); font-size: 12px; color: var(--text-4); font-variant-numeric: tabular-nums; }
  524. .deck-pagename { font-family: var(--font-mono); font-size: 12px; color: var(--text-3); }
  525. /* ---------- 水平柱状(bar-row)渠道价 / 对比 ---------- */
  526. .bar-row { display: grid; grid-template-columns: 130px 1fr 96px; gap: clamp(8px, .9vw, 14px); align-items: center; }
  527. .bar-l { font-family: var(--font-mono); font-size: clamp(11px, 1vw, 14px); color: var(--text-3); text-align: right; }
  528. .bar-track { height: clamp(14px, 2vh, 20px); background: var(--bg-2); border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); overflow: hidden; }
  529. .bar { height: 100%; width: 0%; background: var(--gradient-brand); border-radius: var(--radius-sm); }
  530. .bar.on { background: var(--brand-1-hi); }
  531. .bar-v { font-family: var(--font-mono); font-size: clamp(11px, 1vw, 14px); color: var(--brand-1); font-variant-numeric: tabular-nums; }
  532. /* ---------- 环形仪表(gauge)线上化率 ---------- */
  533. .gauge-wrap { display: flex; flex-direction: column; align-items: center; gap: clamp(12px, 1.6vh, 18px); margin: 6px 0; }
  534. .gauge {
  535. width: clamp(150px, 18vw, 240px); height: clamp(150px, 18vw, 240px);
  536. border-radius: 50%;
  537. display: flex; align-items: center; justify-content: center;
  538. position: relative;
  539. background:
  540. radial-gradient(closest-side, var(--bg-0) 79%, transparent 80% 99%),
  541. conic-gradient(var(--brand-1) var(--g, 13%), var(--bg-2) 0);
  542. }
  543. .gauge-num { font-family: var(--font-mono); font-size: clamp(34px, 4.6vw, 64px); font-weight: 800; color: var(--brand-1); font-variant-numeric: tabular-nums; }
  544. .gauge-tags { display: flex; gap: 8px; flex-wrap: wrap; justify-content: center; }
  545. /* ---------- 多镜头转场(frames,同屏多幕推进) ---------- */
  546. .frames { flex: 1; display: flex; flex-direction: column; justify-content: center; }
  547. .frames .frame { display: flex; flex-direction: column; justify-content: center; gap: clamp(12px, 1.8vh, 22px); }
  548. /* ---------- 辅助 ---------- */
  549. .mono { font-family: var(--font-mono); font-variant-numeric: tabular-nums; }
  550. .big { font-size: clamp(40px, 6vw, 88px); }
  551. .gold { color: var(--brand-1); }
  552. .center { text-align: center; }
  553. .flex { display: flex; align-items: center; gap: 14px; }
  554. .between { justify-content: space-between; }
  555. .wrap { flex-wrap: wrap; }
  556. .mt { margin-top: 16px; }