01_登录模块_启动与认证.html 105 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508
  1. <!DOCTYPE html>
  2. <html lang="zh-CN" data-theme="light">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width,initial-scale=1">
  6. <title>登录 · 启动与双重认证</title>
  7. <style>
  8. /* ============================================================
  9. 共赢票据投资者 APP — 深空蓝设计系统 (Deep-Space Blue)
  10. 双主题:data-theme="light" | "dark",可作用于 :root 或任意容器
  11. ============================================================ */
  12. /* ---------- 浅色(默认) ---------- */
  13. :root,
  14. [data-theme="light"]{
  15. --canvas:#E7ECF4; /* 图纸底 */
  16. --canvas-2:#F4F7FB; /* 图纸卡片 */
  17. --canvas-line:#D3DCE8;
  18. --canvas-ink:#0F1B33;
  19. --canvas-mute:#647591;
  20. --app-bg:#F6F8FB; /* App 页面底 */
  21. --surface:#FFFFFF; /* 卡片/导航 */
  22. --surface-2:#F1F4F9; /* 次级面/表头 */
  23. --surface-3:#E8EDF5; /* 三级面 */
  24. --line:#E3E9F1;
  25. --line-2:#CFD9E7;
  26. --ink-1:#0F1B33;
  27. --ink-2:#4C5C78;
  28. --ink-3:#8A99B2;
  29. --ink-4:#AEBACD;
  30. --brand:#1B4FD8;
  31. --brand-2:#123CAE;
  32. --brand-weak:#E7EEFF;
  33. --brand-line:#B9CDFF;
  34. --on-brand:#FFFFFF;
  35. --accent:#B4700E; /* 琥珀 强调 */
  36. --accent-weak:#FDF2DE;
  37. --accent-line:#EBCD97;
  38. --rise:#E5484D; /* 涨 / 盈利 */
  39. --fall:#12A594; /* 跌 / 亏损 */
  40. --rise-weak:#FDECEC;
  41. --fall-weak:#E3F7F3;
  42. --warn:#C2410C;
  43. --warn-weak:#FEF0E6;
  44. --danger:#DC2626;
  45. --danger-weak:#FDEBEB;
  46. --ok:#0F7B4F;
  47. --ok-weak:#E4F5EC;
  48. --shadow-card:0 1px 2px rgba(15,27,51,.05),0 8px 24px rgba(15,27,51,.06);
  49. --shadow-phone:0 18px 44px rgba(15,27,51,.16),0 2px 6px rgba(15,27,51,.08);
  50. --shadow-pop:0 12px 40px rgba(15,27,51,.20);
  51. --scrim:rgba(11,18,34,.42);
  52. --bezel:#C7D2E2;
  53. --glow:none;
  54. }
  55. /* ---------- 深色 ---------- */
  56. [data-theme="dark"]{
  57. --canvas:#060A14;
  58. --canvas-2:#0E1526;
  59. --canvas-line:#1E2A44;
  60. --canvas-ink:#E9EFFA;
  61. --canvas-mute:#8797B4;
  62. --app-bg:#0B1020;
  63. --surface:#131B2E;
  64. --surface-2:#18223A;
  65. --surface-3:#1E2A45;
  66. --line:#232F4B;
  67. --line-2:#32436A;
  68. --ink-1:#EAF0FA;
  69. --ink-2:#A5B4D0;
  70. --ink-3:#7486A5;
  71. --ink-4:#54658A;
  72. --brand:#5B8CFF;
  73. --brand-2:#7FA6FF;
  74. --brand-weak:rgba(91,140,255,.16);
  75. --brand-line:rgba(91,140,255,.42);
  76. --on-brand:#05122E;
  77. --accent:#F0A93B;
  78. --accent-weak:rgba(240,169,59,.15);
  79. --accent-line:rgba(240,169,59,.42);
  80. --rise:#FF6B6E;
  81. --fall:#2FD4B9;
  82. --rise-weak:rgba(255,107,110,.14);
  83. --fall-weak:rgba(47,212,185,.14);
  84. --warn:#F59E42;
  85. --warn-weak:rgba(245,158,66,.14);
  86. --danger:#FF6B6E;
  87. --danger-weak:rgba(255,107,110,.14);
  88. --ok:#2FD4B9;
  89. --ok-weak:rgba(47,212,185,.14);
  90. --shadow-card:0 1px 2px rgba(0,0,0,.4),0 8px 24px rgba(0,0,0,.34);
  91. --shadow-phone:0 20px 50px rgba(0,0,0,.6),0 0 0 1px rgba(91,140,255,.10);
  92. --shadow-pop:0 14px 44px rgba(0,0,0,.62);
  93. --scrim:rgba(2,6,16,.62);
  94. --bezel:#26324C;
  95. --glow:0 0 0 1px rgba(91,140,255,.14);
  96. }
  97. /* ---------- 基础 ---------- */
  98. *{box-sizing:border-box;margin:0;padding:0}
  99. html{-webkit-text-size-adjust:100%}
  100. body{
  101. background:var(--canvas);color:var(--canvas-ink);
  102. font-family:"PingFang SC","Hiragino Sans GB","Microsoft YaHei",system-ui,-apple-system,"Segoe UI",sans-serif;
  103. -webkit-font-smoothing:antialiased;
  104. padding:44px 46px 110px;
  105. transition:background .28s ease,color .28s ease;
  106. }
  107. .mono{font-family:"SF Mono",ui-monospace,"JetBrains Mono",Menlo,Consolas,monospace}
  108. .num{font-variant-numeric:tabular-nums;letter-spacing:.01em}
  109. /* ---------- 图纸头 ---------- */
  110. .sheet-head{
  111. display:flex;flex-wrap:wrap;gap:32px;align-items:flex-end;justify-content:space-between;
  112. padding-bottom:24px;margin-bottom:44px;border-bottom:1px solid var(--canvas-line);
  113. }
  114. .brandmark{display:flex;align-items:center;gap:14px}
  115. .brandmark .glyph{
  116. width:44px;height:44px;border-radius:12px;flex:none;position:relative;
  117. background:linear-gradient(145deg,var(--brand),var(--brand-2));
  118. box-shadow:0 6px 18px rgba(27,79,216,.28);
  119. }
  120. .brandmark .glyph::before{
  121. content:"";position:absolute;inset:12px 11px;border:1.6px solid rgba(255,255,255,.9);
  122. border-radius:2px;border-bottom-width:4px;
  123. }
  124. .brandmark .glyph::after{
  125. content:"";position:absolute;right:8px;top:8px;width:7px;height:7px;border-radius:50%;background:var(--accent);
  126. }
  127. .sheet-title{font-size:26px;font-weight:650;letter-spacing:.02em;line-height:1.2}
  128. .sheet-sub{margin-top:6px;font-size:12.5px;color:var(--canvas-mute);letter-spacing:.02em}
  129. .head-right{display:flex;align-items:center;gap:26px;flex-wrap:wrap}
  130. .meta{display:flex;gap:26px}
  131. .meta div{font-size:10.5px;color:var(--canvas-mute);letter-spacing:.1em;text-transform:uppercase}
  132. .meta b{display:block;margin-top:5px;font-size:12.5px;color:var(--canvas-ink);font-weight:550;letter-spacing:0;text-transform:none}
  133. /* 换肤开关 */
  134. .skin{
  135. display:flex;align-items:center;gap:0;padding:3px;border-radius:9px;
  136. background:var(--canvas-2);border:1px solid var(--canvas-line);
  137. }
  138. .skin button{
  139. border:0;background:transparent;cursor:pointer;font:inherit;
  140. padding:7px 13px;border-radius:6px;font-size:12px;color:var(--canvas-mute);
  141. display:flex;align-items:center;gap:6px;letter-spacing:.04em;transition:.2s;
  142. }
  143. .skin button.on{background:var(--brand);color:#fff;box-shadow:0 2px 8px rgba(27,79,216,.3)}
  144. [data-theme="dark"] .skin button.on{color:#04122F}
  145. .skin svg{width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
  146. /* ---------- 章节 ---------- */
  147. .sec{margin-bottom:60px}
  148. .sec-head{display:flex;align-items:baseline;gap:14px;margin-bottom:24px}
  149. .sec-num{
  150. font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:11px;color:var(--brand);
  151. letter-spacing:.12em;padding:3px 8px;border:1px solid var(--brand-line);border-radius:5px;background:var(--brand-weak);
  152. }
  153. .sec-name{font-size:17px;font-weight:600;letter-spacing:.04em}
  154. .sec-rule{flex:1;height:1px;background:var(--canvas-line)}
  155. .sec-note{font-size:12px;color:var(--canvas-mute)}
  156. /* ---------- 说明卡 ---------- */
  157. .cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
  158. .card-x{background:var(--canvas-2);border:1px solid var(--canvas-line);border-radius:12px;padding:18px 20px}
  159. .card-x h4{font-size:11px;font-weight:600;letter-spacing:.14em;color:var(--canvas-mute);margin-bottom:14px;text-transform:uppercase}
  160. .kv{display:flex;flex-direction:column;gap:10px}
  161. .kv .r{display:flex;justify-content:space-between;gap:14px;font-size:12.5px;line-height:1.5}
  162. .kv .r span{color:var(--canvas-mute)}
  163. .kv .r b{font-weight:520;text-align:right;font-variant-numeric:tabular-nums}
  164. .bullets{display:flex;flex-direction:column;gap:9px}
  165. .bullets li{list-style:none;font-size:12.5px;line-height:1.65;color:var(--canvas-mute);padding-left:14px;position:relative}
  166. .bullets li::before{content:"";position:absolute;left:0;top:8px;width:6px;height:1.5px;background:var(--brand);border-radius:1px}
  167. .bullets b{color:var(--canvas-ink);font-weight:560}
  168. code{font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:11.5px;background:var(--surface-3);color:var(--canvas-ink);padding:1px 5px;border-radius:4px}
  169. /* ---------- 色板 ---------- */
  170. .pal{display:grid;grid-template-columns:repeat(auto-fill,minmax(168px,1fr));gap:10px}
  171. .sw{border:1px solid var(--canvas-line);border-radius:10px;overflow:hidden;background:var(--canvas-2)}
  172. .sw .chip{height:56px;display:flex;align-items:flex-end;justify-content:flex-end;padding:7px 9px}
  173. .sw .chip i{font-style:normal;font-size:9.5px;color:rgba(255,255,255,.85);font-family:"SF Mono",monospace}
  174. .sw .lb{padding:9px 11px}
  175. .sw .lb b{display:block;font-size:12px;font-weight:560}
  176. .sw .lb em{font-style:normal;display:block;font-size:10.5px;color:var(--canvas-mute);margin-top:3px;font-family:"SF Mono",monospace}
  177. /* ---------- 表 ---------- */
  178. table.spec{width:100%;border-collapse:collapse;font-size:12.5px;background:var(--canvas-2);border:1px solid var(--canvas-line);border-radius:12px;overflow:hidden}
  179. table.spec th{
  180. background:var(--surface-2);text-align:left;padding:11px 14px;font-size:10.5px;font-weight:600;
  181. letter-spacing:.1em;color:var(--canvas-mute);text-transform:uppercase;border-bottom:1px solid var(--canvas-line);
  182. }
  183. table.spec td{padding:11px 14px;border-bottom:1px solid var(--canvas-line);color:var(--canvas-mute);line-height:1.6;vertical-align:top}
  184. table.spec tr:last-child td{border-bottom:0}
  185. table.spec td b{color:var(--canvas-ink);font-weight:550}
  186. table.spec td.m{font-family:"SF Mono",ui-monospace,Menlo,monospace;color:var(--canvas-ink);font-size:11.5px}
  187. /* ---------- 画板 ---------- */
  188. .frames{display:grid;grid-template-columns:repeat(auto-fit,minmax(390px,390px));gap:52px 36px;justify-content:start}
  189. .frame{width:390px}
  190. .frame.w2{grid-column:span 2}
  191. .phone{
  192. width:390px;height:844px;border-radius:42px;overflow:hidden;position:relative;
  193. background:var(--app-bg);border:1px solid var(--bezel);box-shadow:var(--shadow-phone);
  194. font-size:15px;color:var(--ink-1);transition:background .28s ease,border-color .28s ease;
  195. isolation:isolate;
  196. }
  197. .cap{margin-top:18px;padding-left:13px;border-left:2px solid var(--brand)}
  198. .cap-num{font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:10.5px;color:var(--brand);letter-spacing:.12em}
  199. .cap-title{font-size:14.5px;font-weight:600;margin:5px 0 8px;letter-spacing:.02em}
  200. .cap ul{list-style:none;display:flex;flex-direction:column;gap:6px}
  201. .cap li{font-size:12px;line-height:1.62;color:var(--canvas-mute);padding-left:12px;position:relative}
  202. .cap li::before{content:"";position:absolute;left:0;top:8px;width:5px;height:1px;background:var(--canvas-line)}
  203. .cap li b{color:var(--canvas-ink);font-weight:550}
  204. .cap code{font-size:11px;background:var(--surface-3)}
  205. /* ============================================================
  206. App 内部组件
  207. ============================================================ */
  208. .screen{position:absolute;inset:0;display:flex;flex-direction:column;overflow:hidden;background:var(--app-bg)}
  209. .statusbar{height:52px;flex:none;display:flex;align-items:flex-end;justify-content:space-between;padding:0 24px 6px;font-size:14.5px;font-weight:600;color:var(--ink-1)}
  210. .statusbar .ic{display:flex;gap:6px;align-items:center;opacity:.9}
  211. .statusbar svg{height:12px;fill:currentColor}
  212. .homebar{position:absolute;left:50%;bottom:8px;transform:translateX(-50%);width:132px;height:5px;border-radius:3px;background:var(--ink-1);opacity:.26;z-index:60}
  213. /* 顶栏 */
  214. .navbar{height:46px;flex:none;display:flex;align-items:center;padding:0 16px;position:relative;background:var(--app-bg)}
  215. .navbar h2{position:absolute;left:0;right:0;text-align:center;font-size:16.5px;font-weight:600;letter-spacing:.03em}
  216. .navbar .bk,.navbar .rt{position:relative;z-index:2;color:var(--ink-2);display:flex;align-items:center;gap:5px;font-size:13px}
  217. .navbar .rt{margin-left:auto;color:var(--brand)}
  218. .icn{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;flex:none}
  219. .icn.sm{width:14px;height:14px}
  220. .icn.lg{width:22px;height:22px}
  221. .appbar{padding:4px 20px 0;flex:none}
  222. .appbar h1{font-size:22px;font-weight:650;letter-spacing:.02em;display:flex;align-items:center;gap:9px}
  223. .appbar h1 .tiny{font-size:11px;font-weight:500;color:var(--ink-3);letter-spacing:.1em;padding:3px 7px;border:1px solid var(--line-2);border-radius:5px}
  224. /* 顶栏铃铛 · 未读红点 */
  225. .bellwrap{position:relative;display:inline-flex;flex:none}
  226. .bellwrap .rd{position:absolute;top:-1px;right:0;width:8px;height:8px;border-radius:50%;background:var(--danger);box-shadow:0 0 0 2px var(--app-bg);font-style:normal}
  227. /* 两行顶栏(标题 + 分段控件)的标题行:标题左、铃铛右 */
  228. .apphd{display:flex;align-items:center;justify-content:space-between}
  229. /* 分段控件 */
  230. .seg{display:flex;padding:3px;background:var(--surface-2);border-radius:9px;gap:2px}
  231. .seg span{flex:1;text-align:center;padding:7px 0;font-size:13.5px;color:var(--ink-3);border-radius:7px;transition:.2s}
  232. .seg span.on{background:var(--surface);color:var(--ink-1);font-weight:600;box-shadow:var(--shadow-card)}
  233. [data-theme="dark"] .seg span.on{background:var(--surface-3);color:var(--brand)}
  234. /* 下划线 tab */
  235. .tabs{display:flex;gap:24px;padding:0 20px;border-bottom:1px solid var(--line);flex:none;background:var(--app-bg)}
  236. .tabs span{padding:12px 1px 11px;font-size:14.5px;color:var(--ink-3);position:relative;white-space:nowrap}
  237. .tabs span.on{color:var(--ink-1);font-weight:600}
  238. .tabs span.on::after{content:"";position:absolute;left:50%;transform:translateX(-50%);bottom:-1px;width:22px;height:2.5px;border-radius:2px;background:var(--brand)}
  239. .tabs span .dot{position:absolute;top:9px;right:-7px;width:6px;height:6px;padding:0;font-size:0;border-radius:50%;background:var(--danger)}
  240. .tabs span em{font-style:normal;color:var(--danger)}
  241. /* 底部 tabbar */
  242. .tabbar{height:72px;flex:none;display:flex;background:var(--surface);border-top:1px solid var(--line);padding-bottom:10px}
  243. .tb{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;font-size:10.5px;color:var(--ink-3)}
  244. .tb.on{color:var(--brand)}
  245. .tb .icn{width:21px;height:21px;stroke-width:1.6}
  246. /* 滚动体 */
  247. .body{flex:1;overflow:hidden;position:relative}
  248. .pad{padding:0 16px}
  249. /* 卡片 */
  250. .card{background:var(--surface);border-radius:14px;box-shadow:var(--shadow-card);overflow:hidden}
  251. [data-theme="dark"] .card{border:1px solid var(--line)}
  252. .card + .card:not(.pos):not(.qc){margin-top:11px}
  253. .card-hd{display:flex;align-items:center;justify-content:space-between;padding:13px 15px 0}
  254. .card-hd h3{font-size:14.5px;font-weight:600}
  255. .card-hd .more{font-size:12px;color:var(--ink-3);display:flex;align-items:center;gap:2px}
  256. /* 资金看板 */
  257. .hero{
  258. margin:10px 16px 0;border-radius:16px;padding:18px 18px 16px;position:relative;overflow:hidden;
  259. background:linear-gradient(150deg,#1B4FD8 0%,#123CAE 58%,#0C2C86 100%);color:#fff;
  260. box-shadow:0 12px 30px rgba(18,60,174,.30);
  261. }
  262. [data-theme="dark"] .hero{background:linear-gradient(150deg,#1A2C5C 0%,#132347 55%,#101B39 100%);box-shadow:0 12px 30px rgba(0,0,0,.5);border:1px solid rgba(91,140,255,.24)}
  263. .hero::after{content:"";position:absolute;right:-40px;top:-52px;width:180px;height:180px;border-radius:50%;background:rgba(255,255,255,.07)}
  264. [data-theme="dark"] .hero::after{background:rgba(91,140,255,.10)}
  265. .hero .lb{display:flex;align-items:center;gap:6px;font-size:12.5px;color:rgba(255,255,255,.76)}
  266. .hero .lb .cur{display:flex;align-items:center;gap:3px;padding:2px 6px;border-radius:5px;background:rgba(255,255,255,.14);font-size:11.5px}
  267. .hero .amt{margin-top:7px;font-size:33px;font-weight:600;letter-spacing:.01em;font-variant-numeric:tabular-nums;display:flex;align-items:baseline;gap:8px}
  268. .hero .amt .eye{opacity:.6}
  269. .hero .arrow{position:absolute;right:18px;top:20px;opacity:.75}
  270. .hero .grid3{display:flex;margin-top:16px;padding-top:14px;border-top:1px solid rgba(255,255,255,.16)}
  271. .hero .grid3 div{flex:1}
  272. .hero .grid3 span{display:block;font-size:11px;color:rgba(255,255,255,.7)}
  273. .hero .grid3 b{display:block;margin-top:5px;font-size:14.5px;font-weight:600;font-variant-numeric:tabular-nums}
  274. /* 币种表 */
  275. .fxtab{width:100%;border-collapse:collapse;font-size:12.5px}
  276. .fxtab th{padding:9px 15px;font-size:10.5px;font-weight:500;color:var(--ink-3);letter-spacing:.06em;text-align:right;background:var(--surface-2)}
  277. .fxtab th:first-child{text-align:left}
  278. .fxtab td{padding:10px 15px;text-align:right;font-variant-numeric:tabular-nums;color:var(--ink-1);border-top:1px solid var(--line)}
  279. .fxtab td:first-child{text-align:left;font-family:"SF Mono",monospace;font-size:12px;color:var(--ink-2)}
  280. /* 快捷入口 */
  281. .quick{display:flex;gap:11px;margin:11px 16px 0}
  282. .qk{flex:1;background:var(--surface);border-radius:13px;padding:13px 12px;display:flex;align-items:center;gap:10px;box-shadow:var(--shadow-card);position:relative}
  283. [data-theme="dark"] .qk{border:1px solid var(--line)}
  284. .qk .ib{width:32px;height:32px;border-radius:9px;background:var(--brand-weak);color:var(--brand);display:flex;align-items:center;justify-content:center;flex:none}
  285. .qk b{font-size:13.5px;font-weight:550}
  286. .qk .rd{position:absolute;top:9px;right:9px;width:7px;height:7px;border-radius:50%;background:var(--danger);box-shadow:0 0 0 2px var(--surface)}
  287. /* 列表行 */
  288. .row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 15px;border-bottom:1px solid var(--line);font-size:14.5px}
  289. .row:last-child{border-bottom:0}
  290. .row .k{color:var(--ink-2);display:flex;align-items:center;gap:7px;flex:none}
  291. .row .k .icn{color:var(--ink-3)}
  292. .row .v{color:var(--ink-1);font-variant-numeric:tabular-nums;display:flex;align-items:center;gap:6px;text-align:right}
  293. .row .v.ph{color:var(--ink-4)}
  294. .row .v.m{font-family:"SF Mono",monospace;font-size:13.5px}
  295. .hint{width:13px;height:13px;border-radius:50%;border:1px solid var(--ink-4);color:var(--ink-3);font-size:8.5px;display:inline-flex;align-items:center;justify-content:center;font-style:normal;flex:none}
  296. /* 标签 / 徽标 */
  297. .tag{font-size:10.5px;padding:2px 6px;border-radius:4px;letter-spacing:.02em;font-weight:520;display:inline-flex;align-items:center;gap:3px;flex:none}
  298. .t-brand{background:var(--brand-weak);color:var(--brand)}
  299. .t-accent{background:var(--accent-weak);color:var(--accent)}
  300. .t-rise{background:var(--rise-weak);color:var(--rise)}
  301. .t-fall{background:var(--fall-weak);color:var(--fall)}
  302. .t-ok{background:var(--ok-weak);color:var(--ok)}
  303. .t-warn{background:var(--warn-weak);color:var(--warn)}
  304. .t-mute{background:var(--surface-3);color:var(--ink-3)}
  305. .t-solid{background:var(--brand);color:var(--on-brand)}
  306. .t-danger{background:var(--danger);color:#fff}
  307. .cmark{width:14px;height:14px;border-radius:50%;background:var(--brand);color:var(--on-brand);font-size:9px;display:inline-flex;align-items:center;justify-content:center;font-weight:600;flex:none;font-style:normal}
  308. .corner{position:absolute;left:0;top:0;padding:2px 9px 2px 7px;font-size:9.5px;color:#fff;background:var(--danger);border-radius:12px 0 12px 0;letter-spacing:.04em;z-index:3}
  309. .corner.due{background:var(--accent)}
  310. .corner.pend{background:var(--ink-3)}
  311. /* 状态点 */
  312. .st{display:inline-flex;align-items:center;gap:5px;font-size:12.5px}
  313. .st i{width:6px;height:6px;border-radius:50%;flex:none;background:currentColor}
  314. .st.wait{color:var(--ink-3)}
  315. .st.live{color:var(--accent)}
  316. .st.live i{background:transparent;border:1.6px solid currentColor}
  317. .st.done{color:var(--ok)}
  318. .st.rej{color:var(--danger)}
  319. .st.exp{color:var(--ink-4)}
  320. /* 按钮 */
  321. .btn{
  322. height:46px;border-radius:12px;display:flex;align-items:center;justify-content:center;gap:6px;
  323. background:var(--brand);color:var(--on-brand);font-size:15.5px;font-weight:600;letter-spacing:.06em;
  324. box-shadow:0 6px 16px rgba(27,79,216,.24);
  325. }
  326. [data-theme="dark"] .btn{box-shadow:0 6px 18px rgba(91,140,255,.20)}
  327. .btn.sm{height:38px;font-size:14px;border-radius:10px;box-shadow:none}
  328. .btn.off{background:var(--surface-3);color:var(--ink-4);box-shadow:none}
  329. .btn.ghost{background:transparent;border:1px solid var(--line-2);color:var(--ink-2);box-shadow:none;font-weight:500}
  330. .btn.danger{background:var(--danger);box-shadow:none;color:#fff}
  331. .btn.wide{width:100%}
  332. .iconbtn{width:46px;height:46px;border-radius:12px;border:1px solid var(--line-2);display:flex;align-items:center;justify-content:center;color:var(--ink-2);flex:none;background:var(--surface)}
  333. /* 输入 */
  334. .field{background:var(--surface);border:1px solid var(--line-2);border-radius:11px;height:44px;display:flex;align-items:center;gap:9px;padding:0 13px;font-size:14.5px;color:var(--ink-1)}
  335. .field.focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-weak)}
  336. .field.err{border-color:var(--danger);box-shadow:0 0 0 3px var(--danger-weak)}
  337. .field .ph{color:var(--ink-4)}
  338. .field .icn{color:var(--ink-3)}
  339. .field .unit{margin-left:auto;color:var(--ink-2);font-size:13.5px}
  340. .lbl{font-size:11.5px;color:var(--ink-3);letter-spacing:.06em;margin-bottom:7px;display:block}
  341. .errtip{font-size:11.5px;color:var(--danger);margin-top:6px;display:flex;align-items:center;gap:4px}
  342. /* chips */
  343. .chips{display:flex;gap:7px;flex-wrap:wrap}
  344. .chip{height:32px;padding:0 12px;border-radius:9px;border:1px solid var(--line-2);background:var(--surface);color:var(--ink-2);font-size:13px;display:flex;align-items:center;font-variant-numeric:tabular-nums}
  345. .chip.on{background:var(--brand-weak);border-color:var(--brand-line);color:var(--brand);font-weight:560}
  346. .chip.dash{border-style:dashed}
  347. /* 单选 / 复选 */
  348. .rad{display:inline-flex;align-items:center;gap:6px;font-size:13.5px;color:var(--ink-2)}
  349. .rad i{width:15px;height:15px;border-radius:50%;border:1.4px solid var(--line-2);position:relative;flex:none}
  350. .rad.on{color:var(--ink-1)}
  351. .rad.on i{border-color:var(--brand)}
  352. .rad.on i::after{content:"";position:absolute;inset:3px;border-radius:50%;background:var(--brand)}
  353. .cb{width:16px;height:16px;border-radius:4.5px;border:1.4px solid var(--line-2);flex:none;display:flex;align-items:center;justify-content:center;color:transparent}
  354. .cb.on{background:var(--brand);border-color:var(--brand);color:var(--on-brand)}
  355. .cb .icn{width:11px;height:11px;stroke-width:2.6}
  356. /* 步进器 */
  357. .stepper{height:38px;border:1px solid var(--line-2);border-radius:10px;display:flex;align-items:center;overflow:hidden;background:var(--surface)}
  358. .stepper b{width:34px;text-align:center;font-weight:400;font-size:17px;color:var(--ink-3)}
  359. .stepper i{flex:1;text-align:center;font-style:normal;font-variant-numeric:tabular-nums;font-size:15px;border-left:1px solid var(--line);border-right:1px solid var(--line);line-height:36px}
  360. .stepper.err{border-color:var(--danger)}
  361. .stepper.err i{color:var(--danger)}
  362. /* 搜索 */
  363. .search{height:38px;border-radius:10px;background:var(--surface-2);display:flex;align-items:center;gap:8px;padding:0 12px;font-size:14px;color:var(--ink-4)}
  364. .search .icn{color:var(--ink-3)}
  365. .search b{color:var(--ink-1);font-weight:500}
  366. .sug{background:var(--surface);border-radius:12px;box-shadow:var(--shadow-pop);overflow:hidden;margin-top:6px}
  367. .sug div{padding:11px 13px;font-size:14px;border-bottom:1px solid var(--line);display:flex;gap:8px}
  368. .sug div:last-child{border-bottom:0}
  369. .sug em{font-style:normal;color:var(--brand)}
  370. .sug span{font-family:"SF Mono",monospace;font-size:12.5px;color:var(--ink-3)}
  371. /* 弹窗 */
  372. .scrim{position:absolute;inset:0;background:var(--scrim);z-index:40;display:flex;align-items:center;justify-content:center;padding:0 30px}
  373. .scrim.bottom{align-items:flex-end;padding:0}
  374. .dlg{width:100%;background:var(--surface);border-radius:16px;overflow:hidden;box-shadow:var(--shadow-pop)}
  375. .dlg.sheet{border-radius:18px 18px 0 0;padding-bottom:22px}
  376. .dlg-hd{padding:18px 18px 0;text-align:center}
  377. .dlg-hd h3{font-size:16.5px;font-weight:600}
  378. .dlg-bd{padding:14px 18px 4px;font-size:14px;color:var(--ink-2);line-height:1.65}
  379. .dlg-ft{display:flex;border-top:1px solid var(--line);margin-top:16px}
  380. .dlg-ft span{flex:1;text-align:center;padding:14px 0;font-size:15.5px;color:var(--brand);font-weight:550}
  381. .dlg-ft span:first-child{color:var(--ink-2);border-right:1px solid var(--line)}
  382. .dlg-ft.single span{color:var(--brand)}
  383. .dlg-btns{display:flex;gap:11px;padding:16px 18px 0}
  384. .dlg-btns .btn{flex:1}
  385. /* toast */
  386. .toast{
  387. position:absolute;left:50%;top:47%;transform:translate(-50%,-50%);z-index:50;
  388. background:rgba(15,25,45,.90);color:#fff;padding:12px 20px;border-radius:11px;font-size:14px;max-width:290px;text-align:center;line-height:1.55;
  389. }
  390. [data-theme="dark"] .toast{background:rgba(230,238,250,.94);color:#0B1020}
  391. /* 提示条 */
  392. .notice{display:flex;gap:8px;padding:10px 12px;border-radius:10px;font-size:12.5px;line-height:1.6}
  393. .notice.warn{background:var(--warn-weak);color:var(--warn)}
  394. .notice.info{background:var(--brand-weak);color:var(--brand)}
  395. .notice.danger{background:var(--danger-weak);color:var(--danger)}
  396. .notice .icn{flex:none;margin-top:1px}
  397. /* 空态 */
  398. .empty{padding:44px 0;text-align:center;color:var(--ink-4);font-size:13.5px}
  399. .empty .icn{width:34px;height:34px;stroke-width:1.2;margin-bottom:10px;color:var(--ink-4)}
  400. /* 分组标题 */
  401. .gtitle{padding:16px 16px 8px;font-size:12px;color:var(--ink-3);letter-spacing:.06em}
  402. /* 骨架/遮罩说明用 */
  403. .dim{opacity:.45}
  404. /* ============================================================
  405. 后台隐私遮罩 / 生物解锁
  406. ============================================================ */
  407. /* 遮罩:复用启动页视觉,另挂一枚状态胶囊 */
  408. .splash .maskchip{position:absolute;bottom:100px;display:inline-flex;align-items:center;gap:6px;
  409. padding:7px 13px;border-radius:16px;background:rgba(255,255,255,.15);color:rgba(255,255,255,.85);
  410. font-size:12px;letter-spacing:.06em;backdrop-filter:blur(2px)}
  411. .splash .maskchip .icn{width:13px;height:13px;stroke-width:1.9}
  412. /* 生物解锁页 */
  413. .body.unlock{display:flex;flex-direction:column;align-items:center;position:relative}
  414. .unlock .swacc{position:absolute;top:10px;right:18px;font-size:13px;color:var(--ink-3)}
  415. .unlock .acc{margin-top:74px;display:flex;flex-direction:column;align-items:center;gap:9px}
  416. .unlock .avt{width:58px;height:58px;border-radius:19px;background:var(--brand-weak);color:var(--brand);display:flex;align-items:center;justify-content:center}
  417. .unlock .avt .icn{width:27px;height:27px}
  418. .unlock .who{font-size:16px;font-weight:600;letter-spacing:.06em;font-family:"SF Mono",ui-monospace,Menlo,monospace}
  419. .unlock .org{font-size:11.5px;color:var(--ink-3);letter-spacing:.06em}
  420. .unlock .why{margin-top:14px;display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:14px;background:var(--surface-2);color:var(--ink-3);font-size:11.5px;letter-spacing:.04em}
  421. .unlock .why .icn{width:12px;height:12px}
  422. .unlock .bio{margin-top:62px;display:flex;flex-direction:column;align-items:center}
  423. .unlock .bioic{width:92px;height:92px;border-radius:28px;background:var(--brand-weak);color:var(--brand);display:flex;align-items:center;justify-content:center}
  424. .unlock .bioic .icn{width:46px;height:46px;stroke-width:1.5}
  425. .unlock .bioic.err{background:var(--danger-weak);color:var(--danger)}
  426. .unlock .biotx{margin-top:18px;font-size:14.5px;color:var(--ink-2);letter-spacing:.04em}
  427. .unlock .biotx.err{color:var(--danger);font-weight:600}
  428. .unlock .biosub{margin-top:7px;font-size:12px;color:var(--ink-4);letter-spacing:.02em}
  429. .unlock .retry{margin-top:16px;height:34px;padding:0 18px;border-radius:17px;border:1px solid var(--line-2);color:var(--ink-2);font-size:13px;display:inline-flex;align-items:center;gap:6px}
  430. .unlock .retry .icn{width:13px;height:13px;color:var(--ink-3)}
  431. .unlock .alt{position:absolute;left:0;right:0;bottom:64px;display:flex;flex-direction:column;align-items:center;gap:15px}
  432. .unlock .alt .lnk{font-size:14px;color:var(--brand);font-weight:600;letter-spacing:.04em}
  433. .unlock .alt .lic{font-size:10.5px;color:var(--ink-4);letter-spacing:.12em}
  434. /* Android 系统生物识别面板 */
  435. .biosheet{text-align:center;padding:22px 22px 4px}
  436. .biosheet h3{font-size:17px;font-weight:600}
  437. .biosheet p{margin-top:8px;font-size:13px;color:var(--ink-2);line-height:1.6}
  438. .biosheet .fp{width:72px;height:72px;margin:22px auto 6px;color:var(--brand);display:flex;align-items:center;justify-content:center}
  439. .biosheet .fp .icn{width:60px;height:60px;stroke-width:1.3}
  440. .biosheet .fp.err{color:var(--danger)}
  441. .biosheet .bhint{font-size:12.5px;color:var(--ink-3);min-height:18px;letter-spacing:.02em}
  442. .biosheet .bhint.err{color:var(--danger);font-weight:550}
  443. /* ============================================================
  444. 业务组件
  445. ============================================================ */
  446. /* 筛选栏 */
  447. .filterbar{display:flex;gap:8px;padding:10px 16px;background:var(--app-bg);flex:none;align-items:center}
  448. .fb{height:34px;padding:0 11px;border-radius:9px;background:var(--surface-2);color:var(--ink-2);font-size:13px;display:flex;align-items:center;gap:5px;white-space:nowrap}
  449. .fb.on{background:var(--brand-weak);color:var(--brand);font-weight:550}
  450. .fb .icn{width:13px;height:13px}
  451. .fb.flex{flex:1;min-width:0}
  452. /* 筛选栏 v2 —— 搜索行 + 条件行(时间在左,筛选入口在右) */
  453. .fsearch{margin:10px 16px 0;height:40px;border-radius:12px;background:var(--surface-2);display:flex;align-items:center;gap:9px;padding:0 13px;font-size:14px;color:var(--ink-4);flex:none}
  454. .fsearch .icn{width:16px;height:16px;color:var(--ink-3);flex:none}
  455. .fsearch b{color:var(--ink-1);font-weight:500}
  456. .fsearch .clr{margin-left:auto;color:var(--ink-4)}
  457. .fcond{display:flex;align-items:center;justify-content:space-between;padding:11px 16px;flex:none;background:var(--app-bg)}
  458. .fpill{height:34px;padding:0 14px;border-radius:17px;border:1px solid var(--line-2);background:var(--surface);color:var(--ink-2);font-size:13.5px;display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
  459. .fpill .icn{width:13px;height:13px;color:var(--ink-3)}
  460. .fpill.on{background:var(--brand-weak);border-color:var(--brand-line);color:var(--brand);font-weight:560}
  461. .fpill.on .icn{color:var(--brand)}
  462. .fmore{display:inline-flex;align-items:center;gap:6px;font-size:13.5px;color:var(--ink-2);position:relative;padding-right:2px}
  463. .fmore .icn{width:15px;height:15px;color:var(--ink-3)}
  464. .fmore.on{color:var(--brand);font-weight:560}
  465. .fmore.on .icn{color:var(--brand)}
  466. .fmore.on::after{content:"";position:absolute;right:-5px;top:-3px;width:6px;height:6px;border-radius:50%;background:var(--danger)}
  467. /* 筛选面板 —— 底部弹层 */
  468. .fsheet{padding-bottom:20px}
  469. .fsheet-hd{display:flex;align-items:center;justify-content:space-between;padding:20px 20px 2px}
  470. .fsheet-hd b{font-size:17px;font-weight:600;letter-spacing:.02em}
  471. .fsheet-hd .icn{width:19px;height:19px;color:var(--ink-3)}
  472. .fsec{padding:16px 20px 0}
  473. .fsec .lbl{margin-bottom:10px}
  474. .optgrid{display:grid;grid-template-columns:1fr 1fr;gap:11px}
  475. .opt{height:42px;border-radius:21px;border:1px solid var(--line-2);background:var(--surface);color:var(--ink-2);font-size:14px;display:flex;align-items:center;justify-content:center;white-space:nowrap;padding:0 10px}
  476. .opt.on{background:var(--brand-weak);border-color:var(--brand);color:var(--brand);font-weight:600}
  477. .opt.dis{background:var(--surface-2);border-color:var(--line);color:var(--ink-4)}
  478. .fline{height:1px;background:var(--line);margin:18px 20px 0}
  479. /* 自定义区间 · 日期段 + 滚轮 */
  480. .dtrow{display:flex;gap:11px}
  481. .dt{flex:1;min-width:0;background:var(--surface);border:1px solid var(--line-2);border-radius:12px;padding:8px 12px 10px}
  482. .dt em{display:block;font-style:normal;font-size:11px;color:var(--ink-3);letter-spacing:.04em}
  483. .dt b{display:block;margin-top:3px;font-size:16px;font-weight:600;color:var(--ink-1);font-variant-numeric:tabular-nums;font-family:"SF Mono",ui-monospace,Menlo,monospace}
  484. .dt.act{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-weak)}
  485. .dt.act em{color:var(--brand)}
  486. .dt.err{border-color:var(--danger);box-shadow:0 0 0 3px var(--danger-weak)}
  487. .wheel{position:relative;margin:14px 20px 0;padding:4px 8px;display:grid;grid-template-columns:repeat(3,1fr);text-align:center}
  488. .wheel .band{position:absolute;left:6px;right:6px;top:50%;height:40px;transform:translateY(-50%);background:var(--surface-2);border-radius:10px}
  489. .wcol{position:relative;z-index:1;display:flex;flex-direction:column}
  490. .wcol span{height:40px;line-height:40px;font-size:14px;color:var(--ink-2);font-variant-numeric:tabular-nums}
  491. .wcol span.far{color:var(--ink-4);opacity:.5}
  492. .wcol span.now{color:var(--ink-1);font-size:16px;font-weight:600}
  493. .fsheet-ft{display:flex;gap:12px;padding:20px 20px 0}
  494. .fsheet-ft .btn{flex:1.18}
  495. .fsheet-ft .btn.ghost{flex:.82;background:var(--surface-2);border:0;color:var(--ink-2);font-weight:600}
  496. /* 持仓卡片 */
  497. .pos{position:relative;margin:0 16px 11px;padding:13px 0 0}
  498. .pos-hd{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;padding:0 14px}
  499. .pos-name{font-size:15.5px;font-weight:600;display:flex;align-items:center;gap:6px}
  500. .pos-code{font-size:11px;color:var(--ink-3);margin-top:4px;letter-spacing:.02em;font-family:"SF Mono",monospace}
  501. .pos-val{text-align:right;flex:none}
  502. .pos-val b{display:block;font-size:18px;font-weight:600;font-variant-numeric:tabular-nums}
  503. .pos-val span{display:block;font-size:10.5px;color:var(--ink-3);margin-top:3px}
  504. .pos-pl{display:flex;justify-content:flex-end;gap:9px;padding:6px 14px 0;font-size:12.5px;font-variant-numeric:tabular-nums}
  505. .up{color:var(--rise)} .down{color:var(--fall)} .flat{color:var(--ink-3)}
  506. .pos-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px 6px;padding:12px 14px 13px;margin-top:10px;border-top:1px solid var(--line)}
  507. .pos-grid div span{display:block;font-size:10px;color:var(--ink-3);letter-spacing:.02em}
  508. .pos-grid div b{display:block;margin-top:4px;font-size:12.5px;font-weight:550;font-variant-numeric:tabular-nums;white-space:nowrap}
  509. .pos-grid div b em{font-style:normal;color:var(--ink-3);font-weight:400;font-size:11px}
  510. .pos-ops{display:flex;border-top:1px solid var(--line);background:var(--surface-2)}
  511. .pos-ops span{flex:1;text-align:center;padding:11px 0;font-size:13.5px;color:var(--ink-2);border-right:1px solid var(--line)}
  512. .pos-ops span:last-child{border-right:0}
  513. .pos-ops span.pri{color:var(--brand);font-weight:550}
  514. .pos-ops span.hot{color:var(--danger);font-weight:550}
  515. .pos-ops span.off{color:var(--ink-4)}
  516. /* 冻结列表格(数据模式) */
  517. .gridtab{display:flex;font-size:12px;overflow:hidden}
  518. .gt-fix{flex:none;width:118px;border-right:1px solid var(--line-2);background:var(--surface);position:relative;z-index:2;box-shadow:4px 0 10px rgba(15,27,51,.06)}
  519. [data-theme="dark"] .gt-fix{box-shadow:4px 0 10px rgba(0,0,0,.35)}
  520. .gt-scroll{flex:1;overflow:hidden;background:var(--surface)}
  521. .gt-h{height:36px;display:flex;align-items:center;background:var(--surface-2);color:var(--ink-3);font-size:10.5px;letter-spacing:.02em;padding:0 10px;border-bottom:1px solid var(--line);white-space:nowrap;gap:14px}
  522. .gt-r{height:52px;display:flex;align-items:center;padding:0 10px;border-bottom:1px solid var(--line);white-space:nowrap;gap:14px;font-variant-numeric:tabular-nums}
  523. .gt-fix .gt-r{flex-direction:column;align-items:flex-start;justify-content:center;gap:3px;position:relative;padding-left:14px}
  524. .gt-fix .gt-h{padding-left:14px}
  525. /* 表格形式的「新报价」角标:斜切丝带,带 NEW 文案;冻结列左内边距统一 14px 给丝带让位,行内文字不被压 */
  526. .gt-new{position:absolute;left:0;top:0;width:34px;height:34px;overflow:hidden;z-index:3;pointer-events:none}
  527. .gt-new::before{content:"NEW";position:absolute;left:-17px;top:1px;width:48px;padding:1px 0;transform:rotate(-45deg);background:var(--danger);color:#fff;font-size:7.5px;font-weight:600;font-style:normal;letter-spacing:.04em;text-align:center;line-height:1.35}
  528. .gt-r i{font-style:normal;display:inline-block;text-align:right}
  529. .gt-h i{display:inline-block;text-align:right}
  530. /* 询价 / 订单卡片 */
  531. .qc{margin:0 16px 10px;padding:13px 14px;position:relative}
  532. .qc-top{display:flex;justify-content:space-between;gap:12px;align-items:flex-start}
  533. .qc-name{font-size:15px;font-weight:600;display:flex;align-items:center;gap:6px}
  534. .qc-sub{font-size:11px;color:var(--ink-3);margin-top:4px;font-family:"SF Mono",monospace}
  535. .qc-r{text-align:right;flex:none}
  536. .qc-time{font-size:10.5px;color:var(--ink-3);margin-top:5px;font-family:"SF Mono",monospace}
  537. .qc-meta{display:flex;gap:16px;margin-top:10px;font-size:12.5px;color:var(--ink-2);font-variant-numeric:tabular-nums}
  538. .qc-meta em{font-style:normal;color:var(--ink-3);font-size:11px;margin-right:4px}
  539. .qc-open{margin-top:12px;border-top:1px dashed var(--line-2);padding-top:10px}
  540. .qt{display:grid;grid-template-columns:1.1fr .8fr .8fr .9fr;font-size:12px;font-variant-numeric:tabular-nums;align-items:center}
  541. .qt.h{color:var(--ink-3);font-size:10.5px;padding-bottom:7px}
  542. .qt.r{padding:9px 8px;margin:0 -8px;border-radius:8px}
  543. .qt.r:hover,.qt.r.hl{background:var(--brand-weak)}
  544. .qt .p{color:var(--brand);font-weight:600}
  545. .qt .t{color:var(--ink-3);font-size:10.5px;text-align:right}
  546. /* 「新」标记分工:卡片/行角标表明本单有新报价,行内红点指出具体是哪一条 */
  547. .qt span:first-child{position:relative;padding-left:12px}
  548. .qt .newdot{position:absolute;left:0;top:50%;margin:0;transform:translateY(-50%);vertical-align:0}
  549. .newdot{width:6px;height:6px;border-radius:50%;background:var(--danger);display:inline-block;margin-right:5px;vertical-align:1px}
  550. /* 时间线(流水) */
  551. .tl{padding:0 16px}
  552. .tl-i{display:flex;gap:12px;padding:14px 0;border-bottom:1px solid var(--line)}
  553. .tl-i .dot{width:9px;height:9px;border-radius:50%;background:var(--brand);flex:none;margin-top:5px;box-shadow:0 0 0 3px var(--brand-weak)}
  554. .tl-i .dot.out{background:var(--accent);box-shadow:0 0 0 3px var(--accent-weak)}
  555. .tl-i .c{flex:1}
  556. .tl-i .c b{font-size:14.5px;font-weight:550}
  557. .tl-i .c span{display:block;font-size:11px;color:var(--ink-3);margin-top:4px;font-family:"SF Mono",monospace}
  558. .tl-i .amt{font-size:15px;font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap}
  559. /* 设置项列表 */
  560. .menu{background:var(--surface);border-radius:14px;overflow:hidden;margin:0 16px 12px;box-shadow:var(--shadow-card)}
  561. [data-theme="dark"] .menu{border:1px solid var(--line)}
  562. .mi{display:flex;align-items:center;gap:12px;padding:15px 15px;border-bottom:1px solid var(--line);font-size:15px}
  563. .mi:last-child{border-bottom:0}
  564. .mi .ib{width:30px;height:30px;border-radius:9px;background:var(--brand-weak);color:var(--brand);display:flex;align-items:center;justify-content:center;flex:none}
  565. .mi .ib.am{background:var(--accent-weak);color:var(--accent)}
  566. .mi .tx{flex:1}
  567. .mi .tx em{font-style:normal;display:block;font-size:11.5px;color:var(--ink-3);margin-top:3px}
  568. .mi .rv{color:var(--ink-3);font-size:13.5px;display:flex;align-items:center;gap:4px}
  569. /* 开关 */
  570. .sw2{width:44px;height:26px;border-radius:14px;background:var(--line-2);position:relative;flex:none;transition:.2s}
  571. .sw2::after{content:"";position:absolute;top:3px;left:3px;width:20px;height:20px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25);transition:.2s}
  572. .sw2.on{background:var(--brand)}
  573. .sw2.on::after{left:21px}
  574. /* 数据表(App 内) */
  575. .dt{width:100%;border-collapse:collapse;font-size:12.5px}
  576. .dt th{background:var(--surface-2);color:var(--ink-3);font-size:10.5px;font-weight:500;padding:9px 10px;text-align:right;letter-spacing:.02em}
  577. .dt th:first-child{text-align:left}
  578. .dt td{padding:10px;text-align:right;border-top:1px solid var(--line);font-variant-numeric:tabular-nums}
  579. .dt td:first-child{text-align:left;color:var(--ink-2)}
  580. /* 键盘 */
  581. .kbd{background:var(--surface-2);padding:8px 6px 26px;display:grid;grid-template-columns:repeat(3,1fr);gap:7px}
  582. .kbd span{height:44px;border-radius:8px;background:var(--surface);display:flex;align-items:center;justify-content:center;font-size:21px;font-weight:500;box-shadow:0 1px 2px rgba(15,27,51,.10)}
  583. [data-theme="dark"] .kbd span{box-shadow:none;border:1px solid var(--line)}
  584. .kbd span.fn{background:transparent;box-shadow:none;font-size:15px;color:var(--ink-2)}
  585. .kbd span.ok{background:var(--brand);color:var(--on-brand);font-size:16px}
  586. /* 对照页专用 */
  587. .pair{display:grid;grid-template-columns:390px 390px;gap:36px;justify-content:start}
  588. .pair-lb{display:flex;align-items:center;gap:7px;font-size:11.5px;color:var(--canvas-mute);margin-bottom:12px;letter-spacing:.08em}
  589. .pair-lb i{width:12px;height:12px;border-radius:3px;border:1px solid var(--canvas-line);flex:none}
  590. /* 角标占位:有角标的卡片顶部让出空间,避免压住标的名 */
  591. .pos:has(.corner) .pos-hd{padding-top:15px}
  592. .qc:has(.corner){padding-top:26px}
  593. /* ==== v1.3 · 01 专用 BEGIN ==== */
  594. /* 启动页 / 隐私遮罩(代码 BrandSplash):品牌渐变,Logo 独占正中(与原生启动屏逐像素重合),应用名在 Logo 下 20,持牌信息距底 52 */
  595. .bsplash{position:absolute;inset:0;background:linear-gradient(160deg,#1B4FD8 0%,#123CAE 55%,#0A2467 100%);color:#fff}
  596. .phone[data-theme="dark"] .bsplash{background:linear-gradient(160deg,#16244B 0%,#0F1A38 55%,#080D1E 100%)}
  597. .bsplash .lg{position:absolute;left:50%;top:50%;width:76px;height:76px;margin:-38px 0 0 -38px}
  598. .bsplash .nm{position:absolute;left:0;right:0;top:50%;margin-top:58px;text-align:center;font-size:23px;font-weight:600;letter-spacing:6.9px}
  599. .bsplash .lic{position:absolute;left:0;right:0;bottom:52px;text-align:center;font-size:11.5px;letter-spacing:1.6px;color:rgba(255,255,255,.55)}
  600. .bsplash .mchip{position:absolute;left:50%;bottom:100px;transform:translateX(-50%);display:flex;align-items:center;gap:6px;padding:7px 13px;border-radius:16px;background:rgba(255,255,255,.16);color:rgba(255,255,255,.85);font-size:12px;letter-spacing:.7px;white-space:nowrap}
  601. .bsplash .mchip .icn{width:13px;height:13px;stroke-width:1.9}
  602. /* 登录页(代码 SignInScreen) */
  603. .lgtop{height:40px;display:flex;align-items:center;justify-content:space-between;padding:0 18px 0 20px;flex:none}
  604. .lgtop .lang{display:flex;align-items:center;gap:6px;font-size:13.5px;color:var(--ink-2)}
  605. .lgtop .icn{width:18px;height:18px;color:var(--ink-2)}
  606. .lgtop .hp .icn{width:22px;height:22px;color:var(--ink-3)}
  607. .lgbody{padding:18px 26px 0}
  608. .lgbody .mark{width:56px;height:56px;border-radius:16px;display:block}
  609. .lgbody h1{font-size:25px;font-weight:600;letter-spacing:.02em;margin-top:22px}
  610. .lgbody .sub{font-size:13.5px;color:var(--ink-3);margin-top:8px}
  611. .lgbody .fld{margin-top:30px}
  612. .lgbody .fld+.fld{margin-top:16px}
  613. .lgbody .field .ph{color:var(--ink-4)}
  614. .lgbody .field .tr{margin-left:auto;color:var(--ink-3);display:flex}
  615. .lgbody .field .tr .icn{width:16px;height:16px}
  616. .lgbody .btn{margin-top:26px}
  617. .lgfoot{position:absolute;left:0;right:0;bottom:30px;text-align:center;font-size:11px;color:var(--ink-4);line-height:1.7}
  618. .lgfoot b{font-weight:400;color:var(--ink-2)}
  619. .lgsug{margin-top:6px;background:var(--surface);border-radius:12px;box-shadow:var(--shadow-pop);overflow:hidden}
  620. .lgsug div{padding:12px 13px;font-size:14.5px;color:var(--ink-1)}
  621. /* 安全验证弹窗:6 格验证码 */
  622. .otp6{display:flex;gap:7px;justify-content:center;padding:14px 14px 0}
  623. .otp6 b{width:44px;height:52px;border-radius:10px;border:1px solid var(--line-2);background:var(--surface-2);display:flex;align-items:center;justify-content:center;font-size:22px;font-weight:500;color:var(--brand);font-family:var(--font-num)}
  624. .otp6 b.f{border-color:var(--brand);background:var(--surface)}
  625. .otp6 b.c{border-color:var(--brand);background:var(--surface);color:var(--ink-4);font-weight:300}
  626. .otp6.err b{border-color:var(--danger);background:var(--danger-weak);color:var(--danger)}
  627. .resend{text-align:center;margin-top:14px;font-size:12.5px;color:var(--ink-4)}
  628. .dlg-hd .dsc b{color:var(--ink-1);font-weight:600}
  629. /* 锁定页(代码 LockScreen) */
  630. .lock{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center}
  631. .lock .swa{position:absolute;top:62px;right:18px;font-size:13px;color:var(--ink-3)}
  632. .lock .av{margin-top:126px;width:58px;height:58px;border-radius:19px;background:var(--brand-weak);color:var(--brand);display:flex;align-items:center;justify-content:center}
  633. .lock .av .icn{width:27px;height:27px}
  634. .lock .acct{margin-top:9px;font-family:var(--font-mono);font-size:16px;font-weight:600;letter-spacing:1px}
  635. .lock .org{margin-top:9px;font-size:11.5px;color:var(--ink-3);letter-spacing:.7px}
  636. .lock .why{margin-top:14px;display:flex;align-items:center;gap:6px;padding:6px 12px;border-radius:14px;background:var(--surface-2);font-size:11.5px;color:var(--ink-3);letter-spacing:.5px}
  637. .lock .why .icn{width:12px;height:12px}
  638. .lock .bio{margin-top:62px;width:92px;height:92px;border-radius:28px;background:var(--brand-weak);color:var(--brand);display:flex;align-items:center;justify-content:center}
  639. .lock .bio .icn{width:46px;height:46px;stroke-width:1.5}
  640. .lock .bio.bad{background:var(--danger-weak);color:var(--danger)}
  641. .lock .tip{margin-top:18px;font-size:14.5px;letter-spacing:.6px;color:var(--ink-2)}
  642. .lock .tip.bad{color:var(--danger);font-weight:600}
  643. .lock .rem{margin-top:7px;font-size:12px;color:var(--ink-4);letter-spacing:.25px}
  644. .lock .retry{margin-top:16px;height:34px;padding:0 18px;border-radius:17px;border:1px solid var(--line-2);display:flex;align-items:center;gap:6px;font-size:13px;color:var(--ink-2)}
  645. .lock .retry .icn{width:13px;height:13px;color:var(--ink-3)}
  646. .lock .ft{position:absolute;left:0;right:0;bottom:64px;display:flex;flex-direction:column;align-items:center;gap:15px}
  647. .lock .ft b{font-size:14px;font-weight:600;color:var(--brand);letter-spacing:.6px}
  648. .lock .ft span{font-size:10.5px;color:var(--ink-4);letter-spacing:1.3px}
  649. .lock.faded>*:not(.keep){opacity:.45}
  650. /* Android BiometricPrompt(系统渲染示意) */
  651. .bprompt{position:absolute;left:0;right:0;bottom:0;background:var(--surface);border-radius:24px 24px 0 0;padding:26px 24px 30px;display:flex;flex-direction:column;align-items:center;z-index:41}
  652. .bprompt h4{font-size:18px;font-weight:600;text-align:center}
  653. .bprompt .fp{margin-top:26px;width:60px;height:60px;color:var(--brand)}
  654. .bprompt .bhint{margin-top:16px;font-size:13px;color:var(--ink-3)}
  655. .bprompt .neg{margin-top:26px;align-self:flex-end;font-size:14.5px;font-weight:600;color:var(--brand);letter-spacing:.04em}
  656. /* 多机构说明帧 */
  657. .brandcard{margin:0 16px;background:var(--surface);border-radius:14px;box-shadow:var(--shadow-card);padding:18px 0 14px;display:flex;flex-direction:column;align-items:center;gap:8px}
  658. [data-theme="dark"] .brandcard{border:1px solid var(--line)}
  659. .brandcard img{width:64px;height:64px}
  660. .brandcard span{font-size:12px;color:var(--ink-2)}
  661. /* ==== v1.3 · 01 专用 END ==== */
  662. /* ==== v1.3 公共覆盖 BEGIN · 2026-10-14 按代码现状对齐(同一段注入全部图纸,改动从清单目录的 common-v13.css 同步) ==== */
  663. /* 字体:数值走 Inter(代码 NumText),代码 / 编号走 iOS 的 Menlo(代码 MonoText),正文仍是系统字 */
  664. @font-face{font-family:"Inter";src:url("assets/fonts/Inter-Regular.subset.otf") format("opentype");font-weight:400}
  665. @font-face{font-family:"Inter";src:url("assets/fonts/Inter-Medium.subset.otf") format("opentype");font-weight:500}
  666. @font-face{font-family:"Inter";src:url("assets/fonts/Inter-SemiBold.subset.otf") format("opentype");font-weight:600}
  667. @font-face{font-family:"Inter";src:url("assets/fonts/Inter-Bold.subset.otf") format("opentype");font-weight:700}
  668. :root{--font-num:"Inter","PingFang SC","Hiragino Sans GB",system-ui,sans-serif;--font-mono:Menlo,"SF Mono",ui-monospace,monospace}
  669. .phone .num,.hero .amt,.hero .grid3 b,.fxtab td,.pos-val b,.pos-pl,.pos-grid div b,.qt,.gt-r,.stepper i,.kbd span,.tl-i .amt{font-family:var(--font-num)}
  670. .statusbar .num{font-family:inherit}
  671. .phone .mono,.pos-code,.qc-sub,.qc-time,.fxtab td:first-child,.sug span,.tl-i .c span,.row .v.m{font-family:var(--font-mono)}
  672. /* 底栏:四个 Tab(票据 / 账户 / 消息 / 我的);消息 Tab 只有红点,后端不给条数 */
  673. .tb .tbi{position:relative;display:inline-flex;flex:none}
  674. .tb .tbi .rdot{position:absolute;top:-2px;left:14px;width:8px;height:8px;border-radius:50%;background:var(--danger);box-shadow:0 0 0 2px var(--surface)}
  675. /* 二级页导航栏:iOS 系统导航栏,表面色底、居中 17 / 600 标题、品牌色返回箭头、无分隔线(H5 标题靠左,见 00 规范) */
  676. .navbar{height:44px;background:var(--surface)}
  677. .statusbar:has(+ .navbar){background:var(--surface)}
  678. .navbar h2{font-size:17px;font-weight:600;letter-spacing:0}
  679. .navbar .bk{color:var(--brand)}
  680. .navbar .bk .icn{width:22px;height:22px;stroke-width:2.1}
  681. /* 图注里的身份标记:本期未上线 / v1.3 新增 / 平台限定 */
  682. .cap-flags{display:inline-flex;gap:6px;margin-left:8px;vertical-align:1px}
  683. .cap-flag{font-family:"PingFang SC",system-ui,sans-serif;font-size:10px;letter-spacing:.04em;padding:1px 6px;border-radius:4px;border:1px solid var(--canvas-line);color:var(--canvas-mute);background:var(--canvas-2)}
  684. .cap-flag.off{color:var(--accent);border-color:var(--accent-line);background:var(--accent-weak)}
  685. .cap-flag.new{color:var(--brand);border-color:var(--brand-line);background:var(--brand-weak)}
  686. .cap-flag.plat{color:var(--ok);border-color:rgba(15,123,79,.35);background:var(--ok-weak)}
  687. /* 实心底上的文字(角标 / 实心标签 / 危险按钮):浅色白字,深色下底色被提亮、改配近黑字(代码 $onFill / $onDanger) */
  688. [data-theme="dark"] .corner,[data-theme="dark"] .t-danger,[data-theme="dark"] .btn.danger,[data-theme="dark"] .mb,[data-theme="dark"] .gt-new::before{color:#05122E}
  689. /* 表格首列的迷你角标(代码 CornerBadge variant="mini"):9 / 600、左右 4 */
  690. .mb{display:inline-flex;align-items:center;font-size:9px;font-weight:600;line-height:12px;padding:1px 4px;border-radius:4px;color:#fff;background:var(--ink-3);white-space:nowrap}
  691. .mb.d{background:var(--danger)} .mb.a{background:var(--accent)} .mb.m{background:var(--ink-3)} .mb.b{background:var(--brand)}
  692. /* Toast:按内容定宽、最宽 290(代码 maxW 290),单行放得下就不折行;位置 top 76% */
  693. .toast{width:max-content;max-width:290px}
  694. /* ---- 通用组件(代码 components/ 的对应件) ---- */
  695. /* 资金看板右上「>」用 lg 档 */
  696. .hero .arrow{width:22px;height:22px}
  697. /* 只读行:InfoRow(无分隔线)/ FieldRow(带分隔线,.frow),左 ink2 右 Inter */
  698. .irow{display:flex;justify-content:space-between;align-items:center;padding:14px 15px;font-size:14.5px}
  699. .irow span{color:var(--ink-2)}
  700. .irow b{font-weight:400;font-family:var(--font-num);font-variant-numeric:tabular-nums}
  701. .irow b.dg{color:var(--danger)}
  702. .frow{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:14px 15px;border-bottom:1px solid var(--line);font-size:14.5px}
  703. .frow>span{color:var(--ink-2);display:flex;align-items:center;gap:6px}
  704. .frow>b{font-weight:400;font-family:var(--font-num);font-variant-numeric:tabular-nums;text-align:right}
  705. .frow.hl{background:var(--brand-weak)}
  706. .frow.hl>span,.frow.hl>b{color:var(--brand)}
  707. .frow.hl>b{font-weight:600}
  708. .frow.last,.frow:last-child{border-bottom:0}
  709. /* 字段说明 ⓘ(代码 IconButton name="info",ink4 14) */
  710. .xi{width:14px;height:14px;color:var(--ink-4);flex:none}
  711. /* 弹窗里的证券行(代码在前)与行情行 */
  712. .secl{display:flex;align-items:center;gap:7px}
  713. .secl .mono{font-size:12px;color:var(--ink-3)}
  714. .secl b{font-size:14.5px;font-weight:600}
  715. .phint{display:flex;gap:14px;margin-top:9px;font-size:12px;color:var(--ink-3)}
  716. .phint b{font-weight:400;font-family:var(--font-num);font-variant-numeric:tabular-nums}
  717. .field .num{font-family:var(--font-num)}
  718. .errtip .icn{width:13px;height:13px}
  719. .errtip.r{justify-content:flex-end}
  720. /* 时间片块(代码 TradingWindowDialog) */
  721. .twin{border-radius:10px;background:var(--surface-2);padding:13px 0;display:flex;flex-direction:column;align-items:center;gap:5px}
  722. .twin span{font-size:13px;color:var(--ink-3)}
  723. .twin b{font-size:17px;font-weight:600;font-family:var(--font-num)}
  724. /* 弹窗标题区(代码 DialogHeading):图标圆 44 + 标题 16.5 / 600 + 说明 14 / ink2 / 行高 23 */
  725. .dicon{width:44px;height:44px;border-radius:22px;display:flex;align-items:center;justify-content:center;margin:0 auto 6px}
  726. .dicon.warn{background:var(--warn-weak);color:var(--warn)}
  727. .dicon.danger{background:var(--danger-weak);color:var(--danger)}
  728. .dicon.ok{background:var(--ok-weak);color:var(--ok)}
  729. .dicon.brand{background:var(--brand-weak);color:var(--brand)}
  730. .dlg-hd .dsc{margin-top:6px;font-size:14px;color:var(--ink-2);line-height:23px}
  731. .dlg-ft span{font-weight:500}
  732. .dlg-ft span.off{color:var(--brand);opacity:.4}
  733. .dlg-ft span.dg{color:var(--danger)}
  734. /* 底部面板标题行(代码 SheetFrame 的四套头):select 左标题 + 右 × / centered 居中无关闭 / centered-close 居中 + 右 × / filter 左大标题 + 右 × */
  735. .shd{display:flex;align-items:center;justify-content:space-between;padding:16px 18px 6px}
  736. .shd b{font-size:15.5px;font-weight:600}
  737. .shd .icn{color:var(--ink-3)}
  738. .shd-c{padding:16px 18px 4px;text-align:center;position:relative}
  739. .shd-c b{font-size:16.5px;font-weight:600}
  740. .shd-c .icn{position:absolute;right:18px;top:17px;color:var(--ink-3)}
  741. /* 单选面板的选项行(代码 SelectSheet) */
  742. .opt-row{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid var(--line);font-size:14.5px;color:var(--ink-2)}
  743. .opt-row .icn{width:14px;height:14px;color:var(--brand)}
  744. .opt-row b{font-weight:400;color:var(--ink-1)}
  745. .opt-row.sel b{font-weight:600}
  746. .opt-row:last-child{border-bottom:0}
  747. /* 叠在另一层弹窗之上的第二层遮罩 */
  748. .scrim.top2{z-index:45}
  749. /* 列表尾的文字入口(历史票据 > 等) */
  750. .listfoot{display:flex;justify-content:center;align-items:center;gap:3px;padding:12px 0;font-size:13px;color:var(--brand)}
  751. .listfoot .icn{width:13px;height:13px}
  752. /* 分组标题(代码 Section 的标题:12 / ink3,上 16 下 8) */
  753. .gtitle{padding:16px 16px 8px}
  754. /* 转圈(代码 ProgressRing,下拉刷新 / 上拉加载 / 检索在搜共用) */
  755. @keyframes hh-spin{from{transform:rotate(-90deg)}to{transform:rotate(270deg)}}
  756. .ring{width:16px;height:16px;position:relative;flex:none;display:inline-block}
  757. .ring>svg{width:100%;height:100%;transform:rotate(-90deg);display:block}
  758. .ring .trk{fill:none;stroke:var(--line-2);stroke-width:2.8}
  759. .ring .bar{fill:none;stroke:var(--brand);stroke-width:2.8;stroke-linecap:round}
  760. .spin{animation:hh-spin .9s linear infinite}
  761. .ring.lg{width:24px;height:24px}
  762. .ring.lg .trk,.ring.lg .bar{stroke-width:2.2}
  763. /* 空态(代码 EmptyState):整页 120×104 / sm 72×62 / row 30×26 三档,插画取色走 --il-* */
  764. .emptyslot{flex:1;display:flex;align-items:center;justify-content:center;padding:0 0 204px}
  765. .emptybox{--il-a:#E7EDF6;--il-b:#D8E0EC;--il-c:#F8FAFE;display:flex;flex-direction:column;align-items:center;text-align:center;padding:0 32px}
  766. [data-theme="dark"] .emptybox{--il-a:#1F2A45;--il-b:#161F38;--il-c:#28355A}
  767. .emptybox .illu{width:120px;height:104px;display:block}
  768. .emptybox .etxt{margin-top:16px;font-size:14px;color:var(--ink-3);letter-spacing:.1em}
  769. .emptybox .esub{margin-top:8px;font-size:12px;line-height:1.65;color:var(--ink-4);max-width:236px}
  770. .emptybox .eact{margin-top:20px}
  771. .emptybox.sm{padding:26px 20px}
  772. .emptybox.sm .illu{width:72px;height:62px}
  773. .emptybox.sm .etxt{margin-top:11px;font-size:12.5px;letter-spacing:.08em}
  774. .emptybox.row{flex-direction:row;align-items:center;justify-content:center;gap:10px;padding:9px 0}
  775. .emptybox.row .illu{width:30px;height:26px}
  776. .emptybox.row .etxt{margin-top:0;font-size:12.5px;letter-spacing:.06em}
  777. /* 状态点「已提交」档(代码 StatusSemantic submitted:未报 / 待报 / 待审批):品牌色空心 */
  778. .st.sub{color:var(--brand)}
  779. .st.sub i{background:transparent;border:1.6px solid currentColor}
  780. /* ---- 持仓卡片(代码 PositionCard)与通用表格(代码 DataTable) ---- */
  781. /* 持仓卡片:多枚角标并排;有角标时顶部只让到 15;估值后的币种小一号 */
  782. .pos .corners{position:absolute;left:0;top:0;display:flex;z-index:3}
  783. .pos .corners .corner{position:static}
  784. .pos:has(.corners) .pos-hd{padding-top:2px}
  785. .pos-val b small{font-size:13.5px;font-weight:400;color:var(--ink-2)}
  786. .pos-code b{font-weight:400;color:var(--accent)}
  787. /* 信息格五项一行:整行按宽度降档 12.5 / 11.5 / 10.5,最小档仍放不下时成对的值拆成两行(i) */
  788. .pos-grid.f5{display:flex;flex-wrap:wrap;column-gap:6px;row-gap:10px}
  789. .pos-grid.f5>div{flex:1 0 auto}
  790. .pos-grid.f5 div span{font-size:10px;letter-spacing:.02em}
  791. .pos-grid.f5 div b{font-size:12.5px;font-weight:500}
  792. .pos-grid.f5 div b em{font-size:11px;font-weight:400}
  793. .pos-grid.f5 div i{display:block;font-style:normal;font-size:11px;color:var(--ink-3);font-family:var(--font-num);font-variant-numeric:tabular-nums;white-space:nowrap}
  794. .pos-grid.f5.s115 div b{font-size:11.5px}.pos-grid.f5.s115 div b em{font-size:10px}
  795. .pos-grid.f5.s105 div b{font-size:10.5px}.pos-grid.f5.s105 div b em{font-size:9px}
  796. .pos-ops span.pri,.pos-ops span.hot{font-weight:500}
  797. /* 表格模式(DataTable):表头 36 / 行 52、单元格 12、列距 14,前两列冻结带右投影 */
  798. .ptab{background:var(--surface);overflow:hidden}
  799. .ptab .r{display:flex;align-items:stretch;height:52px;border-bottom:1px solid var(--line);font-size:12px;white-space:nowrap}
  800. .ptab .r.h{height:36px;background:var(--surface-2);font-size:10.5px;letter-spacing:.02em;color:var(--ink-3)}
  801. .ptab .fz,.ptab .sc{display:flex;align-items:center;gap:14px;flex:none}
  802. .ptab .fz{padding:0 14px 0 10px;background:var(--surface);position:relative;z-index:2;box-shadow:4px 0 10px rgba(15,27,51,.06)}
  803. [data-theme="dark"] .ptab .fz{box-shadow:4px 0 10px rgba(0,0,0,.35)}
  804. .ptab .r.h .fz{background:var(--surface-2)}
  805. .ptab .c{flex:none}
  806. .ptab .c.n{text-align:right;font-family:var(--font-num);font-variant-numeric:tabular-nums}
  807. .ptab .r.h .c.n{font-family:inherit}
  808. .ptab .c.n .sub{display:block;font-size:11px;color:var(--ink-3);margin-top:2px}
  809. .ptab .cat b{display:block;font-size:12px;font-weight:600}
  810. .ptab .cat b.db{color:var(--accent)}
  811. .ptab .cat .mbs{display:flex;gap:3px;margin-top:3px}
  812. .ptab .scd b{display:block;font-size:12px;font-weight:400}
  813. .ptab .scd span{display:flex;align-items:center;gap:4px;font-family:var(--font-mono);font-size:11px;color:var(--ink-3);margin-top:3px}
  814. .ptab .scd .cmark{width:13px;height:13px;font-size:8.5px}
  815. .ptab .opsrow{border-bottom:1px solid var(--line)}
  816. .ptab .opsrow .pos-ops{border-top:0}
  817. .ptab .r.sel,.ptab .r.sel .fz{background:var(--brand-weak)}
  818. .ptab .xrow{background:var(--surface-2);border-bottom:1px solid var(--line)}
  819. /* ---- 卡片 / 表格切换(代码 ViewModeToggle) ---- */
  820. .viewtog{display:inline-flex;padding:2px;background:var(--surface-2);border-radius:8px;gap:2px;flex:none;position:relative}
  821. .viewtog.sep{margin-left:4px}
  822. .viewtog.sep::before{content:"";position:absolute;left:-7px;top:2px;bottom:2px;width:1px;background:var(--line-2)}
  823. .viewtog span{width:28px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:6px;color:var(--ink-3)}
  824. .viewtog span.on{background:var(--surface);color:var(--brand);box-shadow:var(--shadow-card)}
  825. [data-theme="dark"] .viewtog span.on{background:var(--surface-3)}
  826. .viewtog .icn{width:15px;height:15px;stroke-width:1.8}
  827. /* ==== v1.3 公共覆盖 END ==== */
  828. </style>
  829. </head>
  830. <body>
  831. <svg width="0" height="0" style="position:absolute" aria-hidden="true"><defs>
  832. <g id="i-back"><polyline points="15 4 7 12 15 20"/></g>
  833. <g id="i-right"><polyline points="9 4 17 12 9 20"/></g>
  834. <g id="i-down"><polyline points="5 9 12 16 19 9"/></g>
  835. <g id="i-up"><polyline points="5 15 12 8 19 15"/></g>
  836. <g id="i-search"><circle cx="11" cy="11" r="6.5"/><line x1="16" y1="16" x2="21" y2="21"/></g>
  837. <g id="i-x"><line x1="6" y1="6" x2="18" y2="18"/><line x1="18" y1="6" x2="6" y2="18"/></g>
  838. <g id="i-check"><polyline points="4 12.5 9.5 18 20 6"/></g>
  839. <g id="i-plus"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></g>
  840. <g id="i-minus"><line x1="5" y1="12" x2="19" y2="12"/></g>
  841. <g id="i-eye"><path d="M2 12s3.6-6.5 10-6.5S22 12 22 12s-3.6 6.5-10 6.5S2 12 2 12z"/><circle cx="12" cy="12" r="2.6"/></g>
  842. <g id="i-eyeoff"><path d="M4 5l16 14"/><path d="M9.5 6.2A9.7 9.7 0 0 1 12 5.5c6.4 0 10 6.5 10 6.5a17 17 0 0 1-3.3 4"/><path d="M6.2 8.3A16.6 16.6 0 0 0 2 12s3.6 6.5 10 6.5a10 10 0 0 0 3.3-.55"/></g>
  843. <g id="i-clock"><circle cx="12" cy="12" r="8.5"/><polyline points="12 7 12 12 15.5 14"/></g>
  844. <g id="i-history"><path d="M3.5 12a8.5 8.5 0 1 0 2.6-6.1"/><polyline points="3 4 3 9 8 9"/><polyline points="12 7.5 12 12 15.5 14"/></g>
  845. <g id="i-filter"><path d="M4 6h16l-6.2 7.4V19l-3.6-2v-3.6z"/></g>
  846. <g id="i-calendar"><rect x="3.5" y="5" width="17" height="15.5" rx="2.5"/><line x1="3.5" y1="9.5" x2="20.5" y2="9.5"/><line x1="8" y1="3" x2="8" y2="6.5"/><line x1="16" y1="3" x2="16" y2="6.5"/></g>
  847. <g id="i-note"><path d="M6 3h8l4.5 4.5V21H6z"/><polyline points="14 3 14 8 18.5 8"/><line x1="9" y1="13" x2="15" y2="13"/><line x1="9" y1="17" x2="13" y2="17"/></g>
  848. <g id="i-wallet"><rect x="3" y="6" width="18" height="14" rx="3"/><path d="M3 10h18"/><circle cx="16.5" cy="15" r="1.3" fill="currentColor" stroke="none"/></g>
  849. <g id="i-user"><circle cx="12" cy="8.5" r="3.8"/><path d="M4.5 20.5a7.5 7.5 0 0 1 15 0"/></g>
  850. <g id="i-transfer"><polyline points="7 7 4 10 7 13"/><path d="M4 10h12a4 4 0 0 1 0 8h-3"/><polyline points="17 17 20 14 17 11" opacity="0"/></g>
  851. <g id="i-swap"><polyline points="8 5 4.5 8.5 8 12"/><line x1="4.5" y1="8.5" x2="19" y2="8.5"/><polyline points="16 19 19.5 15.5 16 12"/><line x1="19.5" y1="15.5" x2="5" y2="15.5"/></g>
  852. <g id="i-refresh"><path d="M20 12a8 8 0 1 1-2.4-5.7"/><polyline points="20 4 20 9 15 9"/></g>
  853. <g id="i-help"><circle cx="12" cy="12" r="8.6"/><path d="M9.6 9.6a2.5 2.5 0 1 1 3.2 2.4c-.6.2-.9.7-.9 1.4v.5"/><circle cx="11.9" cy="16.6" r=".9" fill="currentColor" stroke="none"/></g>
  854. <g id="i-info"><circle cx="12" cy="12" r="8.6"/><line x1="12" y1="11" x2="12" y2="16.5"/><circle cx="12" cy="7.8" r=".9" fill="currentColor" stroke="none"/></g>
  855. <g id="i-alert"><path d="M12 4.5 21 19.5H3z"/><line x1="12" y1="10" x2="12" y2="14.5"/><circle cx="12" cy="17" r=".9" fill="currentColor" stroke="none"/></g>
  856. <g id="i-lock"><rect x="5" y="10.5" width="14" height="10" rx="2.5"/><path d="M8.2 10.5V8a3.8 3.8 0 0 1 7.6 0v2.5"/></g>
  857. <g id="i-key"><circle cx="8" cy="14" r="4"/><path d="M11 11.5 20 3"/><line x1="17" y1="6" x2="19" y2="8"/></g>
  858. <g id="i-shield"><path d="M12 3.5 19 6v6c0 4.2-2.9 7.2-7 8.5-4.1-1.3-7-4.3-7-8.5V6z"/><polyline points="9 12 11.3 14.3 15.3 10.3"/></g>
  859. <g id="i-font"><path d="M4 19 10 5l6 14"/><line x1="6.2" y1="14.5" x2="13.8" y2="14.5"/><path d="M17 19l3-8 3 8" transform="scale(.72) translate(6.5 5)"/></g>
  860. <g id="i-doc"><rect x="4.5" y="3.5" width="15" height="17" rx="2.5"/><line x1="8" y1="9" x2="16" y2="9"/><line x1="8" y1="13" x2="16" y2="13"/><line x1="8" y1="17" x2="12.5" y2="17"/></g>
  861. <g id="i-logout"><path d="M14 5H6.5A2.5 2.5 0 0 0 4 7.5v9A2.5 2.5 0 0 0 6.5 19H14"/><polyline points="16.5 8 20.5 12 16.5 16"/><line x1="20.5" y1="12" x2="10" y2="12"/></g>
  862. <g id="i-fee"><circle cx="12" cy="12" r="8.5"/><path d="M9.5 9h5M9.5 12h5M12 9v8"/></g>
  863. <g id="i-theme"><circle cx="12" cy="12" r="7.5"/><path d="M12 4.5v15a7.5 7.5 0 0 0 0-15z" fill="currentColor" stroke="none"/></g>
  864. <g id="i-sun"><circle cx="12" cy="12" r="4.2"/><line x1="12" y1="2.5" x2="12" y2="5"/><line x1="12" y1="19" x2="12" y2="21.5"/><line x1="2.5" y1="12" x2="5" y2="12"/><line x1="19" y1="12" x2="21.5" y2="12"/><line x1="5.4" y1="5.4" x2="7.1" y2="7.1"/><line x1="16.9" y1="16.9" x2="18.6" y2="18.6"/><line x1="5.4" y1="18.6" x2="7.1" y2="16.9"/><line x1="16.9" y1="7.1" x2="18.6" y2="5.4"/></g>
  865. <g id="i-moon"><path d="M20 14.2A8.4 8.4 0 0 1 9.8 4 8.6 8.6 0 1 0 20 14.2z"/></g>
  866. <g id="i-bell"><path d="M18 16V11a6 6 0 1 0-12 0v5l-1.6 2.5h15.2z"/><path d="M9.8 21a2.4 2.4 0 0 0 4.4 0"/></g>
  867. <g id="i-list"><line x1="4" y1="7" x2="20" y2="7"/><line x1="4" y1="12" x2="20" y2="12"/><line x1="4" y1="17" x2="20" y2="17"/></g>
  868. <g id="i-sort"><polyline points="7 9 10 6 13 9"/><polyline points="7 15 10 18 13 15"/></g>
  869. <g id="i-trend"><polyline points="3 16 9 10 13 14 21 6"/><polyline points="15.5 6 21 6 21 11.5"/></g>
  870. <g id="i-img"><rect x="3.5" y="5" width="17" height="14" rx="2.5"/><circle cx="9" cy="10" r="1.6"/><polyline points="5 17 10 12 13.5 15.5 16.5 13 19.5 16"/></g>
  871. <g id="i-upload"><path d="M12 16V5"/><polyline points="7.5 9.5 12 5 16.5 9.5"/><path d="M4 15v3.5A2.5 2.5 0 0 0 6.5 21h11a2.5 2.5 0 0 0 2.5-2.5V15"/></g>
  872. <g id="i-faceid"><path d="M4 9.2V6.6A2.6 2.6 0 0 1 6.6 4H9.2"/><path d="M14.8 4h2.6A2.6 2.6 0 0 1 20 6.6v2.6"/><path d="M20 14.8v2.6a2.6 2.6 0 0 1-2.6 2.6h-2.6"/><path d="M9.2 20H6.6A2.6 2.6 0 0 1 4 17.4v-2.6"/><line x1="9.1" y1="9.6" x2="9.1" y2="11.2"/><line x1="14.9" y1="9.6" x2="14.9" y2="11.2"/><path d="M12 9.4v3.9a.9.9 0 0 1-.9.9h-.5"/><path d="M9.3 15.9c1.7 1.4 3.7 1.4 5.4 0"/></g>
  873. <g id="i-touchid"><path d="M2.9 9.9A9.7 9.7 0 0 1 12 3.2a9.7 9.7 0 0 1 9.1 6.7"/><path d="M5.9 13.1a6.1 6.1 0 0 1 12.2 0v1.3"/><path d="M9 13.1a3 3 0 0 1 6 0v2.6a7.4 7.4 0 0 1-.5 2.7"/><path d="M12 13v3.9a10 10 0 0 1-.9 4.1"/><path d="M6 17.9A9.6 9.6 0 0 1 5.9 16.4"/><path d="M18 16.5a11.6 11.6 0 0 1-.6 3.2"/></g>
  874. <g id="i-face"><rect x="4" y="4" width="16" height="16" rx="4"/><circle cx="9.3" cy="10.5" r=".9" fill="currentColor" stroke="none"/><circle cx="14.7" cy="10.5" r=".9" fill="currentColor" stroke="none"/><path d="M9 15c1.8 1.5 4.2 1.5 6 0"/></g>
  875. <g id="i-globe"><circle cx="12" cy="12" r="8.6"/><ellipse cx="12" cy="12" rx="4.1" ry="8.6"/><line x1="3.6" y1="9" x2="20.4" y2="9"/><line x1="3.6" y1="15" x2="20.4" y2="15"/></g>
  876. </defs></svg>
  877. <div class="sheet-head">
  878. <div class="brandmark">
  879. <div class="glyph"></div>
  880. <div>
  881. <div class="sheet-title">登录 · 启动与双重认证</div>
  882. <div class="sheet-sub">票据投资者 APP / 启动页 · 账号密码登录 · 新设备短信双重认证 · 开户入口管控</div>
  883. </div>
  884. </div>
  885. <div class="head-right">
  886. <div class="meta">
  887. <div>模块<b>登录 LOGIN</b></div>
  888. <div>规格<b>iOS 390 &times; 844 @3x</b></div>
  889. <div>主题<b>深空蓝 Light / Dark</b></div>
  890. <div>版本<b>v1.3 · 2026-10-14</b></div>
  891. </div>
  892. <div class="skin" role="group" aria-label="主题切换">
  893. <button data-set="light" class="on"><svg viewBox="0 0 24 24"><use href="#i-sun"/></svg>浅色</button>
  894. <button data-set="dark"><svg viewBox="0 0 24 24"><use href="#i-moon"/></svg>深色</button>
  895. </div>
  896. </div>
  897. </div>
  898. <style>
  899. .splash{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:20px;
  900. background:linear-gradient(165deg,#1B4FD8 0%,#123CAE 55%,#0A2467 100%)}
  901. [data-theme="dark"] .splash{background:linear-gradient(165deg,#16244B 0%,#0F1A38 55%,#080D1E 100%)}
  902. .splash .logo{width:88px;height:88px;border-radius:24px;background:rgba(255,255,255,.14);position:relative;
  903. border:1px solid rgba(255,255,255,.24);backdrop-filter:blur(4px)}
  904. .splash .logo::before{content:"";position:absolute;inset:24px 22px;border:2.4px solid #fff;border-radius:3px;border-bottom-width:7px}
  905. .splash .logo::after{content:"";position:absolute;right:16px;top:16px;width:12px;height:12px;border-radius:50%;background:var(--accent)}
  906. .splash h1{color:#fff;font-size:23px;font-weight:600;letter-spacing:.3em;text-indent:.3em}
  907. .splash .by{position:absolute;bottom:52px;color:rgba(255,255,255,.55);font-size:11.5px;letter-spacing:.14em}
  908. .icons{display:flex;gap:26px;justify-content:center;padding:26px 0}
  909. .appicon{text-align:center}
  910. .appicon i{display:block;width:66px;height:66px;border-radius:16px;position:relative;margin-bottom:9px;
  911. background:linear-gradient(150deg,#1B4FD8,#0A2467);box-shadow:0 6px 16px rgba(10,36,103,.34)}
  912. .appicon i::before{content:"";position:absolute;inset:19px 17px;border:2px solid #fff;border-radius:2px;border-bottom-width:5px}
  913. .appicon i::after{content:"";position:absolute;right:12px;top:12px;width:9px;height:9px;border-radius:50%;background:#F0A93B}
  914. .appicon.g2 i{background:linear-gradient(150deg,#0B5C43,#053427)}
  915. .appicon.g3 i{background:linear-gradient(150deg,#7A2231,#3E0F19)}
  916. .appicon span{font-size:11.5px;color:var(--ink-2)}
  917. .otp{display:flex;gap:9px;justify-content:center;margin-top:4px}
  918. .otp b{width:44px;height:52px;border-radius:11px;border:1px solid var(--line-2);background:var(--surface-2);
  919. display:flex;align-items:center;justify-content:center;font-size:23px;font-weight:600;font-variant-numeric:tabular-nums}
  920. .otp b.on{border-color:var(--brand);background:var(--brand-weak);color:var(--brand)}
  921. .otp b.cur{border-color:var(--brand);background:var(--surface);color:var(--ink-1)}
  922. .otp b.err{border-color:var(--danger);background:var(--danger-weak);color:var(--danger)}
  923. </style>
  924. <div class="sec">
  925. <div class="sec-head"><span class="sec-num">01</span><span class="sec-name">状态 · 组件 · 约束</span><span class="sec-rule"></span><span class="sec-note">v1.3 按代码现状重画;登录是唯一入口</span></div>
  926. <div class="cards">
  927. <div class="card-x">
  928. <h4>状态 STATUS</h4>
  929. <div class="bullets">
  930. <li><b>受信设备</b>:账密通过直接进首页(票据 → 询价)</li>
  931. <li><b>新设备</b>:账密通过 → 安全验证弹窗(验证码已下发)</li>
  932. <li><b>校验失败</b>:后端 <code>msg</code> 原样 Toast(统一「用户名或密码不正确」)</li>
  933. <li><b>回前台</b>:超过解锁时长 → 开了生物识别进锁定页(B2),否则回登录页</li>
  934. </div>
  935. </div>
  936. <div class="card-x">
  937. <h4>组件 COMPONENT</h4>
  938. <div class="bullets">
  939. <li><b>顶部</b>:左语言入口、右帮助(后台没配问题时隐藏)</li>
  940. <li><b>账号框</b>:有历史账号时回填最近一次并出下拉</li>
  941. <li><b>密码框</b>:眼睛切换明文;两格均限 50 字符</li>
  942. <li><b>验证码</b>:6 格,输满点「确认」才校验,错误就地红字</li>
  943. </div>
  944. </div>
  945. <div class="card-x">
  946. <h4>约束 RULES</h4>
  947. <div class="kv">
  948. <div class="r"><span>验证码</span><b>6 位;单码最多校验 5 次</b></div>
  949. <div class="r"><span>重新获取</span><b>60 秒冷却,「重新获取(59)」</b></div>
  950. <div class="r"><span>发送频次</span><b>15 分钟 5 次,超出 429 Toast</b></div>
  951. <div class="r"><span>手机号脱敏</span><b>后端 phone_mask 原样</b></div>
  952. <div class="r"><span>申请开户</span><b>本期不渲染</b></div>
  953. <div class="r"><span>品牌</span><b>机构档案驱动(当前:泓衍票据)</b></div>
  954. </div>
  955. </div>
  956. </div>
  957. </div>
  958. <div class="sec">
  959. <div class="sec-head"><span class="sec-num">02</span><span class="sec-name">界面与状态</span><span class="sec-rule"></span><span class="sec-note">8 帧(L7 本期未上线)· 点右上角「深色 / 浅色」实时换肤</span></div>
  960. <div class="frames">
  961. <!-- ===== L1 启动页 · 品牌标识 ===== -->
  962. <div class="frame">
  963. <div class="phone" data-lock data-theme="light">
  964. <div class="screen">
  965. <div class="bsplash">
  966. <img class="lg" src="assets/brand/honmatrix-icon.png" alt="">
  967. <div class="nm">泓衍票据</div>
  968. <div class="lic">泓衍证券(香港)有限公司 持牌法团</div>
  969. </div>
  970. <div class="homebar"></div>
  971. </div>
  972. </div>
  973. <div class="cap">
  974. <div class="cap-num">L1</div>
  975. <div class="cap-title">启动页 · 品牌标识</div>
  976. <ul>
  977. <li>冷启动首帧与原生启动屏<b>逐像素一致</b>:品牌纯色底 + 正中 Logo(机构 <code>icon.png</code>,76);随后 300ms 淡入渐变、应用名与持牌信息</li>
  978. <li>Logo 独占屏幕正中,应用名在 Logo 下方 20(与 v1.2「Logo 与应用名整组居中」不同);持牌信息距底 52</li>
  979. <li>应用名、持牌信息、Logo 都取机构档案(当前机构:泓衍票据);<b>启动页固定浅色主题</b>(深色下也是品牌蓝)</li>
  980. </ul>
  981. </div>
  982. </div>
  983. <!-- ===== L2 登录 · 默认态 ===== -->
  984. <div class="frame">
  985. <div class="phone">
  986. <div class="screen">
  987. <div class="statusbar"><span class="num">9:41</span><span class="ic"><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><rect x="1" y="14" width="3.4" height="6" rx="1"/><rect x="6.4" y="10" width="3.4" height="10" rx="1"/><rect x="11.8" y="6" width="3.4" height="14" rx="1"/><rect x="17.2" y="3" width="3.4" height="17" rx="1" opacity=".35"/></svg><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><path d="M12 19.5 2 9a14 14 0 0 1 20 0z" opacity=".95"/></svg><svg class="icn" viewBox="0 0 30 24" style="fill:none;stroke:currentColor;stroke-width:1.5;width:24px"><rect x="1.5" y="7" width="21" height="11" rx="3"/><rect x="3.6" y="9.1" width="14" height="6.8" rx="1.6" fill="currentColor" stroke="none"/><path d="M24.5 11v6a3.2 3.2 0 0 0 0-6z" fill="currentColor" stroke="none"/></svg></span></div>
  988. <div class="lgtop"><span class="lang"><svg class="icn" viewBox="0 0 24 24"><use href="#i-globe"/></svg>简体中文</span><span class="hp"><svg class="icn" viewBox="0 0 24 24"><use href="#i-help"/></svg></span></div>
  989. <div class="body lgbody">
  990. <img class="mark" src="assets/brand/honmatrix-icon.png" alt="">
  991. <h1>欢迎回来</h1>
  992. <div class="sub">登录后查看您的票据持仓与询价</div>
  993. <div class="fld"><span class="lbl">账号</span><div class="field"><svg class="icn sm" viewBox="0 0 24 24"><use href="#i-user"/></svg><span class="ph">输入账号</span></div></div>
  994. <div class="fld"><span class="lbl">密码</span><div class="field"><svg class="icn sm" viewBox="0 0 24 24"><use href="#i-lock"/></svg><span class="ph">登录密码</span><span class="tr"><svg class="icn" viewBox="0 0 24 24"><use href="#i-eyeoff"/></svg></span></div></div>
  995. <div class="btn wide off">登录</div>
  996. </div>
  997. <div class="lgfoot">登录即代表您已阅读并同意<b>《用户协议》</b>与<b>《隐私政策》</b></div>
  998. <div class="homebar"></div>
  999. </div>
  1000. </div>
  1001. <div class="cap">
  1002. <div class="cap-num">L2</div>
  1003. <div class="cap-title">登录 · 默认态</div>
  1004. <ul>
  1005. <li>左上「地球 + 当前语言」进语言弹层(<code>07</code> L4 / L5),右上问号进帮助中心(后台没配问题时不渲染);Logo 用机构图标(56,圆角按 16/56)</li>
  1006. <li>账号 / 密码两格,暗提示「输入账号」「登录密码」;任一为空「登录」置灰;超 50 字符 Toast「最长输入50个字符」</li>
  1007. <li><b>【申请开户】本期不渲染</b>(开户见 L7);底部协议句的两份文档本期点了 Toast「未接入内容」</li>
  1008. </ul>
  1009. </div>
  1010. </div>
  1011. <!-- ===== L3 历史账号 · 下拉 ===== -->
  1012. <div class="frame">
  1013. <div class="phone">
  1014. <div class="screen">
  1015. <div class="statusbar"><span class="num">9:41</span><span class="ic"><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><rect x="1" y="14" width="3.4" height="6" rx="1"/><rect x="6.4" y="10" width="3.4" height="10" rx="1"/><rect x="11.8" y="6" width="3.4" height="14" rx="1"/><rect x="17.2" y="3" width="3.4" height="17" rx="1" opacity=".35"/></svg><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><path d="M12 19.5 2 9a14 14 0 0 1 20 0z" opacity=".95"/></svg><svg class="icn" viewBox="0 0 30 24" style="fill:none;stroke:currentColor;stroke-width:1.5;width:24px"><rect x="1.5" y="7" width="21" height="11" rx="3"/><rect x="3.6" y="9.1" width="14" height="6.8" rx="1.6" fill="currentColor" stroke="none"/><path d="M24.5 11v6a3.2 3.2 0 0 0 0-6z" fill="currentColor" stroke="none"/></svg></span></div>
  1016. <div class="lgtop"><span class="lang"><svg class="icn" viewBox="0 0 24 24"><use href="#i-globe"/></svg>简体中文</span><span class="hp"><svg class="icn" viewBox="0 0 24 24"><use href="#i-help"/></svg></span></div>
  1017. <div class="body lgbody">
  1018. <img class="mark" src="assets/brand/honmatrix-icon.png" alt="">
  1019. <h1>欢迎回来</h1>
  1020. <div class="sub">登录后查看您的票据持仓与询价</div>
  1021. <div class="fld"><span class="lbl">账号</span><div class="field focus"><svg class="icn sm" viewBox="0 0 24 24"><use href="#i-user"/></svg><span>ceshi01</span><span class="tr"><svg class="icn" viewBox="0 0 24 24"><use href="#i-up"/></svg></span></div><div class="lgsug"><div>ceshi01</div></div></div>
  1022. <div class="fld"><span class="lbl">密码</span><div class="field"><svg class="icn sm" viewBox="0 0 24 24"><use href="#i-lock"/></svg><span class="ph">登录密码</span><span class="tr"><svg class="icn" viewBox="0 0 24 24"><use href="#i-eyeoff"/></svg></span></div></div>
  1023. <div class="btn wide off">登录</div>
  1024. </div>
  1025. <div class="lgfoot">登录即代表您已阅读并同意<b>《用户协议》</b>与<b>《隐私政策》</b></div>
  1026. <div class="homebar"></div>
  1027. </div>
  1028. </div>
  1029. <div class="cap">
  1030. <div class="cap-num">L3</div>
  1031. <div class="cap-title">历史账号 · 下拉</div>
  1032. <ul>
  1033. <li>登录成功过的账号记在本机:再次进入回填最近一次,账号框右侧出下拉箭头,展开列出历史账号,点选回填</li>
  1034. <li>密码不缓存;App 内没有清历史账号的入口(登出不清)</li>
  1035. </ul>
  1036. </div>
  1037. </div>
  1038. <!-- ===== L4 登录失败 · Toast ===== -->
  1039. <div class="frame">
  1040. <div class="phone">
  1041. <div class="screen">
  1042. <div class="statusbar"><span class="num">9:41</span><span class="ic"><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><rect x="1" y="14" width="3.4" height="6" rx="1"/><rect x="6.4" y="10" width="3.4" height="10" rx="1"/><rect x="11.8" y="6" width="3.4" height="14" rx="1"/><rect x="17.2" y="3" width="3.4" height="17" rx="1" opacity=".35"/></svg><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><path d="M12 19.5 2 9a14 14 0 0 1 20 0z" opacity=".95"/></svg><svg class="icn" viewBox="0 0 30 24" style="fill:none;stroke:currentColor;stroke-width:1.5;width:24px"><rect x="1.5" y="7" width="21" height="11" rx="3"/><rect x="3.6" y="9.1" width="14" height="6.8" rx="1.6" fill="currentColor" stroke="none"/><path d="M24.5 11v6a3.2 3.2 0 0 0 0-6z" fill="currentColor" stroke="none"/></svg></span></div>
  1043. <div class="lgtop"><span class="lang"><svg class="icn" viewBox="0 0 24 24"><use href="#i-globe"/></svg>简体中文</span><span class="hp"><svg class="icn" viewBox="0 0 24 24"><use href="#i-help"/></svg></span></div>
  1044. <div class="body lgbody">
  1045. <img class="mark" src="assets/brand/honmatrix-icon.png" alt="">
  1046. <h1>欢迎回来</h1>
  1047. <div class="sub">登录后查看您的票据持仓与询价</div>
  1048. <div class="fld"><span class="lbl">账号</span><div class="field"><svg class="icn sm" viewBox="0 0 24 24"><use href="#i-user"/></svg><span>ceshi01</span></div></div>
  1049. <div class="fld"><span class="lbl">密码</span><div class="field err"><svg class="icn sm" viewBox="0 0 24 24"><use href="#i-lock"/></svg><span style="letter-spacing:.3em">•••••••••</span><span class="tr"><svg class="icn" viewBox="0 0 24 24"><use href="#i-eyeoff"/></svg></span></div></div>
  1050. <div class="btn wide">登录</div>
  1051. </div>
  1052. <div class="lgfoot">登录即代表您已阅读并同意<b>《用户协议》</b>与<b>《隐私政策》</b></div>
  1053. <div class="toast" style="top:76%">用户名或密码不正确</div>
  1054. <div class="homebar"></div>
  1055. </div>
  1056. </div>
  1057. <div class="cap">
  1058. <div class="cap-num">L4</div>
  1059. <div class="cap-title">登录失败 · Toast</div>
  1060. <ul>
  1061. <li>用户不存在 / 已销户 / 密码错误统一「用户名或密码不正确」(后端 <code>msg</code> 原样),密码框转危险描边</li>
  1062. <li>其他拦截(账户停用等)后端下发文案,客户端原样 Toast</li>
  1063. </ul>
  1064. </div>
  1065. </div>
  1066. <!-- ===== L5 新设备 · 安全验证 ===== -->
  1067. <div class="frame">
  1068. <div class="phone">
  1069. <div class="screen">
  1070. <div class="statusbar"><span class="num">9:41</span><span class="ic"><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><rect x="1" y="14" width="3.4" height="6" rx="1"/><rect x="6.4" y="10" width="3.4" height="10" rx="1"/><rect x="11.8" y="6" width="3.4" height="14" rx="1"/><rect x="17.2" y="3" width="3.4" height="17" rx="1" opacity=".35"/></svg><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><path d="M12 19.5 2 9a14 14 0 0 1 20 0z" opacity=".95"/></svg><svg class="icn" viewBox="0 0 30 24" style="fill:none;stroke:currentColor;stroke-width:1.5;width:24px"><rect x="1.5" y="7" width="21" height="11" rx="3"/><rect x="3.6" y="9.1" width="14" height="6.8" rx="1.6" fill="currentColor" stroke="none"/><path d="M24.5 11v6a3.2 3.2 0 0 0 0-6z" fill="currentColor" stroke="none"/></svg></span></div>
  1071. <div class="lgtop"><span class="lang"><svg class="icn" viewBox="0 0 24 24"><use href="#i-globe"/></svg>简体中文</span><span class="hp"><svg class="icn" viewBox="0 0 24 24"><use href="#i-help"/></svg></span></div>
  1072. <div class="body lgbody">
  1073. <img class="mark" src="assets/brand/honmatrix-icon.png" alt="">
  1074. <h1>欢迎回来</h1>
  1075. <div class="sub">登录后查看您的票据持仓与询价</div>
  1076. <div class="fld"><span class="lbl">账号</span><div class="field"><svg class="icn sm" viewBox="0 0 24 24"><use href="#i-user"/></svg><span>ceshi02</span></div></div>
  1077. <div class="fld"><span class="lbl">密码</span><div class="field"><svg class="icn sm" viewBox="0 0 24 24"><use href="#i-lock"/></svg><span style="letter-spacing:.3em">•••••••</span><span class="tr"><svg class="icn" viewBox="0 0 24 24"><use href="#i-eyeoff"/></svg></span></div></div>
  1078. <div class="btn wide">登录</div>
  1079. </div>
  1080. <div class="lgfoot">登录即代表您已阅读并同意<b>《用户协议》</b>与<b>《隐私政策》</b></div>
  1081. <div class="scrim">
  1082. <div class="dlg">
  1083. <div class="dlg-hd" style="padding-top:22px"><div class="dicon brand"><svg class="icn lg" viewBox="0 0 24 24"><use href="#i-shield"/></svg></div><h3>安全验证</h3>
  1084. <p class="dsc">检测到您使用<b>新设备</b>登录,为确保本人操作,验证码已发送至 <span class="mono" style="color:var(--ink-1)">(+86) 13*******65</span>,请输入验证:</p></div>
  1085. <div class="otp6"><b class="c">|</b><b></b><b></b><b></b><b></b><b></b></div>
  1086. <div class="resend">重新获取(58)</div>
  1087. <div class="dlg-btns" style="padding:18px"><span class="btn ghost">取消</span><span class="btn off">确认</span></div>
  1088. </div>
  1089. </div>
  1090. <div class="homebar"></div>
  1091. </div>
  1092. </div>
  1093. <div class="cap">
  1094. <div class="cap-num">L5</div>
  1095. <div class="cap-title">新设备 · 安全验证</div>
  1096. <ul>
  1097. <li>新设备登录时弹出,验证码已自动下发;正文照原型一整段:「检测到您使用<b>新设备</b>登录,为确保本人操作,验证码已发送至 (+86) 13*******65,请输入验证:」</li>
  1098. <li>6 格独立输入位,已填格品牌描边,当前格带光标;输满 6 位「确认」才可点(不自动提交)</li>
  1099. <li>「重新获取(59)」半角括号倒计时,结束后变可点;取消关窗、不建会话</li>
  1100. </ul>
  1101. </div>
  1102. </div>
  1103. <!-- ===== L6 验证异常 · 就地红字 ===== -->
  1104. <div class="frame">
  1105. <div class="phone">
  1106. <div class="screen">
  1107. <div class="statusbar"><span class="num">9:41</span><span class="ic"><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><rect x="1" y="14" width="3.4" height="6" rx="1"/><rect x="6.4" y="10" width="3.4" height="10" rx="1"/><rect x="11.8" y="6" width="3.4" height="14" rx="1"/><rect x="17.2" y="3" width="3.4" height="17" rx="1" opacity=".35"/></svg><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><path d="M12 19.5 2 9a14 14 0 0 1 20 0z" opacity=".95"/></svg><svg class="icn" viewBox="0 0 30 24" style="fill:none;stroke:currentColor;stroke-width:1.5;width:24px"><rect x="1.5" y="7" width="21" height="11" rx="3"/><rect x="3.6" y="9.1" width="14" height="6.8" rx="1.6" fill="currentColor" stroke="none"/><path d="M24.5 11v6a3.2 3.2 0 0 0 0-6z" fill="currentColor" stroke="none"/></svg></span></div>
  1108. <div class="lgtop"><span class="lang"><svg class="icn" viewBox="0 0 24 24"><use href="#i-globe"/></svg>简体中文</span><span class="hp"><svg class="icn" viewBox="0 0 24 24"><use href="#i-help"/></svg></span></div>
  1109. <div class="body lgbody">
  1110. <img class="mark" src="assets/brand/honmatrix-icon.png" alt="">
  1111. <h1>欢迎回来</h1>
  1112. <div class="sub">登录后查看您的票据持仓与询价</div>
  1113. <div class="fld"><span class="lbl">账号</span><div class="field"><svg class="icn sm" viewBox="0 0 24 24"><use href="#i-user"/></svg><span>ceshi02</span></div></div>
  1114. <div class="fld"><span class="lbl">密码</span><div class="field"><svg class="icn sm" viewBox="0 0 24 24"><use href="#i-lock"/></svg><span style="letter-spacing:.3em">•••••••</span><span class="tr"><svg class="icn" viewBox="0 0 24 24"><use href="#i-eyeoff"/></svg></span></div></div>
  1115. <div class="btn wide">登录</div>
  1116. </div>
  1117. <div class="lgfoot">登录即代表您已阅读并同意<b>《用户协议》</b>与<b>《隐私政策》</b></div>
  1118. <div class="scrim">
  1119. <div class="dlg">
  1120. <div class="dlg-hd" style="padding-top:22px"><div class="dicon danger"><svg class="icn lg" viewBox="0 0 24 24"><use href="#i-shield"/></svg></div><h3>安全验证</h3>
  1121. <p class="dsc">检测到您使用<b>新设备</b>登录,为确保本人操作,验证码已发送至 <span class="mono" style="color:var(--ink-1)">(+86) 13*******65</span>,请输入验证:</p></div>
  1122. <div class="otp6 err"><b>8</b><b>3</b><b>1</b><b>2</b><b>7</b><b>4</b></div>
  1123. <div class="errtip" style="justify-content:center;margin-top:12px"><svg class="icn sm" viewBox="0 0 24 24"><use href="#i-alert"/></svg>验证码错误</div>
  1124. <div class="resend" style="margin-top:10px">重新获取(56)</div>
  1125. <div class="dlg-btns" style="padding:18px"><span class="btn ghost">取消</span><span class="btn off">确认</span></div>
  1126. </div>
  1127. </div>
  1128. <div class="homebar"></div>
  1129. </div>
  1130. </div>
  1131. <div class="cap">
  1132. <div class="cap-num">L6</div>
  1133. <div class="cap-title">验证异常 · 就地红字</div>
  1134. <ul>
  1135. <li>校验失败:图标圆转危险色、6 格红描边红底,下方红字(后端 <code>msg</code>):验证码错误 / 验证码已过期 / 验证码校验次数过多,请重新获取验证码</li>
  1136. <li>改任一格即清除错误态;15 分钟内发送超 5 次后端回 429「获取频繁,请稍后再试!」→ Toast</li>
  1137. </ul>
  1138. </div>
  1139. </div>
  1140. <!-- ===== L7 开户防重 · 拦截弹窗 ===== -->
  1141. <div class="frame">
  1142. <div class="phone">
  1143. <div class="screen">
  1144. <div class="statusbar"><span class="num">9:41</span><span class="ic"><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><rect x="1" y="14" width="3.4" height="6" rx="1"/><rect x="6.4" y="10" width="3.4" height="10" rx="1"/><rect x="11.8" y="6" width="3.4" height="14" rx="1"/><rect x="17.2" y="3" width="3.4" height="17" rx="1" opacity=".35"/></svg><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><path d="M12 19.5 2 9a14 14 0 0 1 20 0z" opacity=".95"/></svg><svg class="icn" viewBox="0 0 30 24" style="fill:none;stroke:currentColor;stroke-width:1.5;width:24px"><rect x="1.5" y="7" width="21" height="11" rx="3"/><rect x="3.6" y="9.1" width="14" height="6.8" rx="1.6" fill="currentColor" stroke="none"/><path d="M24.5 11v6a3.2 3.2 0 0 0 0-6z" fill="currentColor" stroke="none"/></svg></span></div>
  1145. <div class="lgtop"><span class="lang"><svg class="icn" viewBox="0 0 24 24"><use href="#i-globe"/></svg>简体中文</span><span class="hp"><svg class="icn" viewBox="0 0 24 24"><use href="#i-help"/></svg></span></div>
  1146. <div class="body lgbody">
  1147. <img class="mark" src="assets/brand/honmatrix-icon.png" alt="">
  1148. <h1>欢迎回来</h1>
  1149. <div class="sub">登录后查看您的票据持仓与询价</div>
  1150. <div class="fld"><span class="lbl">账号</span><div class="field"><svg class="icn sm" viewBox="0 0 24 24"><use href="#i-user"/></svg><span>ceshi01</span></div></div>
  1151. <div class="fld"><span class="lbl">密码</span><div class="field"><svg class="icn sm" viewBox="0 0 24 24"><use href="#i-lock"/></svg><span style="letter-spacing:.3em">•••••••</span><span class="tr"><svg class="icn" viewBox="0 0 24 24"><use href="#i-eyeoff"/></svg></span></div></div>
  1152. <div class="btn wide">登录</div>
  1153. </div>
  1154. <div class="lgfoot">登录即代表您已阅读并同意<b>《用户协议》</b>与<b>《隐私政策》</b></div>
  1155. <div class="scrim">
  1156. <div class="dlg">
  1157. <div class="dlg-hd" style="padding-bottom:0"><h3 style="font-size:15px;line-height:1.6;font-weight:500">您已有票据账号ceshi01,可直接前往登录。</h3></div>
  1158. <div class="dlg-ft single"><span>我知道了</span></div>
  1159. </div>
  1160. </div>
  1161. <div class="homebar"></div>
  1162. </div>
  1163. </div>
  1164. <div class="cap">
  1165. <div class="cap-num">L7</div>
  1166. <div class="cap-title">开户防重 · 拦截弹窗<span class="cap-flags"><span class="cap-flag off">本期未上线</span></span></div>
  1167. <ul>
  1168. <li>登录页【申请开户】本期不渲染;开放后点入口先做防重检查,命中弹此窗(与开户页前置拦截同一句)</li>
  1169. <li>防重接口本期没有:真实网关占位,入口开放前不可达</li>
  1170. </ul>
  1171. </div>
  1172. </div>
  1173. <!-- ===== L8 多机构定制 · 机构档案 ===== -->
  1174. <div class="frame">
  1175. <div class="phone">
  1176. <div class="screen">
  1177. <div class="statusbar"><span class="num">9:41</span><span class="ic"><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><rect x="1" y="14" width="3.4" height="6" rx="1"/><rect x="6.4" y="10" width="3.4" height="10" rx="1"/><rect x="11.8" y="6" width="3.4" height="14" rx="1"/><rect x="17.2" y="3" width="3.4" height="17" rx="1" opacity=".35"/></svg><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><path d="M12 19.5 2 9a14 14 0 0 1 20 0z" opacity=".95"/></svg><svg class="icn" viewBox="0 0 30 24" style="fill:none;stroke:currentColor;stroke-width:1.5;width:24px"><rect x="1.5" y="7" width="21" height="11" rx="3"/><rect x="3.6" y="9.1" width="14" height="6.8" rx="1.6" fill="currentColor" stroke="none"/><path d="M24.5 11v6a3.2 3.2 0 0 0 0-6z" fill="currentColor" stroke="none"/></svg></span></div>
  1178. <div class="navbar"><span class="bk"><svg class="icn" viewBox="0 0 24 24"><use href="#i-back"/></svg></span><h2>多机构打包规范</h2></div>
  1179. <div class="body">
  1180. <div class="gtitle">桌面图标与应用名</div>
  1181. <div class="brandcard"><img src="assets/brand/honmatrix-icon.png" alt=""><span>泓衍票据</span></div>
  1182. <div class="gtitle">机构档案 brands/honmatrix/brand.json</div>
  1183. <div class="card" style="margin:0 16px">
  1184. <div class="frow"><span>applicationId</span><b class="m" style="font-family:var(--font-mono);font-size:12px">com.honmatrixi.notes</b></div>
  1185. <div class="frow"><span>应用名(简 / 繁 / 英)</span><b style="font-size:12.5px">泓衍票据 · 泓衍票據 · HONMATRIX Notes</b></div>
  1186. <div class="frow"><span>启动页</span><b style="font-size:12.5px">#1B4FD8 底 · icon.png 76</b></div>
  1187. <div class="frow"><span>品牌色 brandColor</span><b><span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:#1B4FD8;margin-right:6px"></span>#1B4FD8</b></div>
  1188. <div class="frow"><span>默认皮肤</span><b>跟随系统</b></div>
  1189. <div class="frow last"><span>自主开户 allowSelfOnboarding</span><b>是(本期入口不渲染)</b></div>
  1190. </div>
  1191. </div>
  1192. <div class="homebar"></div>
  1193. </div>
  1194. </div>
  1195. <div class="cap">
  1196. <div class="cap-num">L8</div>
  1197. <div class="cap-title">多机构定制 · 机构档案</div>
  1198. <ul>
  1199. <li>换机构 = 新增一份机构档案(应用名三语、持牌信息、Logo、品牌色、启动页、打包身份),代码里不出现机构专名</li>
  1200. <li>品牌色在机构调色板里覆盖基线(当前唯一机构 honmatrix 与深空蓝基线同色);Logo 同一张图用于桌面图标、启动页与登录页</li>
  1201. <li>这是规范示意帧,不对应 App 页面</li>
  1202. </ul>
  1203. </div>
  1204. </div>
  1205. </div>
  1206. </div>
  1207. <div class="sec">
  1208. <div class="sec-head"><span class="sec-num">03</span><span class="sec-name">后台隐私遮罩 · 生物解锁</span><span class="sec-rule"></span><span class="sec-note">5 帧 · 仅原生</span></div>
  1209. <div class="cards">
  1210. <div class="card-x">
  1211. <h4>链路 FLOW</h4>
  1212. <div class="bullets">
  1213. <li><b>失焦即遮罩</b>:与时长无关,回前台立刻撤</li>
  1214. <li><b>离开 ≤ 解锁时长</b>:直接回到原页面</li>
  1215. <li><b>离开 &gt; 解锁时长</b>:开了生物识别 → 锁定页(B2);没开 → 回登录页</li>
  1216. <li><b>解锁时长「从不」</b>:不计时,遮罩照常</li>
  1217. </div>
  1218. </div>
  1219. </div>
  1220. <div class="frames" style="margin-top:28px">
  1221. <!-- ===== B1 后台隐私遮罩 · 多任务截图态 ===== -->
  1222. <div class="frame">
  1223. <div class="phone">
  1224. <div class="screen">
  1225. <div class="bsplash">
  1226. <img class="lg" src="assets/brand/honmatrix-icon.png" alt="">
  1227. <div class="nm">泓衍票据</div>
  1228. <div class="mchip"><svg class="icn" viewBox="0 0 24 24"><use href="#i-lock"/></svg>账户信息已隐藏</div>
  1229. <div class="lic">泓衍证券(香港)有限公司 持牌法团</div>
  1230. </div>
  1231. <div class="homebar"></div>
  1232. </div>
  1233. </div>
  1234. <div class="cap">
  1235. <div class="cap-num">B1</div>
  1236. <div class="cap-title">后台隐私遮罩 · 多任务截图态<span class="cap-flags"><span class="cap-flag plat">仅 APP</span></span></div>
  1237. <ul>
  1238. <li>App 失焦即盖上不透明品牌盖板(不用模糊),视觉复用启动页并加「账户信息已隐藏」胶囊(距底 100);回前台立刻撤</li>
  1239. <li>深色主题下盖板用深色渐变;生产包另开防截屏 / 录屏(Android <code>FLAG_SECURE</code>、iOS 黑屏)</li>
  1240. </ul>
  1241. </div>
  1242. </div>
  1243. <!-- ===== B2 生物解锁 · 待验证 ===== -->
  1244. <div class="frame">
  1245. <div class="phone">
  1246. <div class="screen">
  1247. <div class="statusbar"><span class="num">9:41</span><span class="ic"><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><rect x="1" y="14" width="3.4" height="6" rx="1"/><rect x="6.4" y="10" width="3.4" height="10" rx="1"/><rect x="11.8" y="6" width="3.4" height="14" rx="1"/><rect x="17.2" y="3" width="3.4" height="17" rx="1" opacity=".35"/></svg><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><path d="M12 19.5 2 9a14 14 0 0 1 20 0z" opacity=".95"/></svg><svg class="icn" viewBox="0 0 30 24" style="fill:none;stroke:currentColor;stroke-width:1.5;width:24px"><rect x="1.5" y="7" width="21" height="11" rx="3"/><rect x="3.6" y="9.1" width="14" height="6.8" rx="1.6" fill="currentColor" stroke="none"/><path d="M24.5 11v6a3.2 3.2 0 0 0 0-6z" fill="currentColor" stroke="none"/></svg></span></div>
  1248. <div class="lock">
  1249. <span class="swa">切换账号</span>
  1250. <div class="av"><svg class="icn" viewBox="0 0 24 24"><use href="#i-user"/></svg></div>
  1251. <div class="acct">cesh****01</div>
  1252. <div class="org">示例销售机构</div>
  1253. <div class="why"><svg class="icn" viewBox="0 0 24 24"><use href="#i-clock"/></svg>离开超过 30 分钟,需重新验证</div>
  1254. <div class="bio"><svg class="icn" viewBox="0 0 24 24"><use href="#i-faceid"/></svg></div>
  1255. <div class="tip">使用面容 ID 解锁</div>
  1256. <div class="ft"><b>使用密码登录</b><span>泓衍证券(香港)有限公司 持牌法团</span></div>
  1257. </div>
  1258. <div class="homebar"></div>
  1259. </div>
  1260. </div>
  1261. <div class="cap">
  1262. <div class="cap-num">B2</div>
  1263. <div class="cap-title">生物解锁 · 待验证<span class="cap-flags"><span class="cap-flag plat">仅 APP</span></span></div>
  1264. <ul>
  1265. <li>离开超过解锁时长且开了生物识别时进入:只露脱敏账号(前 4 后 2)与机构名,不放输入框;进页即自动唤起系统验证,大图标可点重触发</li>
  1266. <li>原因胶囊「离开超过 30 分钟,需重新验证」;底部常驻「使用密码登录」与持牌信息;右上「切换账号」= 完整登出</li>
  1267. </ul>
  1268. </div>
  1269. </div>
  1270. <!-- ===== B3 生物解锁 · 验证失败 ===== -->
  1271. <div class="frame">
  1272. <div class="phone">
  1273. <div class="screen">
  1274. <div class="statusbar"><span class="num">9:41</span><span class="ic"><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><rect x="1" y="14" width="3.4" height="6" rx="1"/><rect x="6.4" y="10" width="3.4" height="10" rx="1"/><rect x="11.8" y="6" width="3.4" height="14" rx="1"/><rect x="17.2" y="3" width="3.4" height="17" rx="1" opacity=".35"/></svg><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><path d="M12 19.5 2 9a14 14 0 0 1 20 0z" opacity=".95"/></svg><svg class="icn" viewBox="0 0 30 24" style="fill:none;stroke:currentColor;stroke-width:1.5;width:24px"><rect x="1.5" y="7" width="21" height="11" rx="3"/><rect x="3.6" y="9.1" width="14" height="6.8" rx="1.6" fill="currentColor" stroke="none"/><path d="M24.5 11v6a3.2 3.2 0 0 0 0-6z" fill="currentColor" stroke="none"/></svg></span></div>
  1275. <div class="lock">
  1276. <span class="swa">切换账号</span>
  1277. <div class="av"><svg class="icn" viewBox="0 0 24 24"><use href="#i-user"/></svg></div>
  1278. <div class="acct">cesh****01</div>
  1279. <div class="org">示例销售机构</div>
  1280. <div class="why"><svg class="icn" viewBox="0 0 24 24"><use href="#i-clock"/></svg>离开超过 30 分钟,需重新验证</div>
  1281. <div class="bio bad"><svg class="icn" viewBox="0 0 24 24"><use href="#i-faceid"/></svg></div>
  1282. <div class="tip bad">面容 ID 不匹配</div>
  1283. <div class="rem">还可尝试 2 次,用尽后需密码登录</div>
  1284. <div class="retry"><svg class="icn" viewBox="0 0 24 24"><use href="#i-refresh"/></svg>点按重试</div>
  1285. <div class="ft"><b>使用密码登录</b><span>泓衍证券(香港)有限公司 持牌法团</span></div>
  1286. </div>
  1287. <div class="homebar"></div>
  1288. </div>
  1289. </div>
  1290. <div class="cap">
  1291. <div class="cap-num">B3</div>
  1292. <div class="cap-title">生物解锁 · 验证失败<span class="cap-flags"><span class="cap-flag plat">仅 APP</span></span></div>
  1293. <ul>
  1294. <li>只换色不换版:图标底与文案转危险色,报剩余次数「还可尝试 2 次,用尽后需密码登录」,「点按重试」显式触发</li>
  1295. <li>用户取消、系统打断不计失败次数</li>
  1296. </ul>
  1297. </div>
  1298. </div>
  1299. <!-- ===== B4 生物解锁停用 · 回退密码 ===== -->
  1300. <div class="frame">
  1301. <div class="phone">
  1302. <div class="screen">
  1303. <div class="statusbar"><span class="num">9:41</span><span class="ic"><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><rect x="1" y="14" width="3.4" height="6" rx="1"/><rect x="6.4" y="10" width="3.4" height="10" rx="1"/><rect x="11.8" y="6" width="3.4" height="14" rx="1"/><rect x="17.2" y="3" width="3.4" height="17" rx="1" opacity=".35"/></svg><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><path d="M12 19.5 2 9a14 14 0 0 1 20 0z" opacity=".95"/></svg><svg class="icn" viewBox="0 0 30 24" style="fill:none;stroke:currentColor;stroke-width:1.5;width:24px"><rect x="1.5" y="7" width="21" height="11" rx="3"/><rect x="3.6" y="9.1" width="14" height="6.8" rx="1.6" fill="currentColor" stroke="none"/><path d="M24.5 11v6a3.2 3.2 0 0 0 0-6z" fill="currentColor" stroke="none"/></svg></span></div>
  1304. <div class="lock faded">
  1305. <span class="swa">切换账号</span>
  1306. <div class="av"><svg class="icn" viewBox="0 0 24 24"><use href="#i-user"/></svg></div>
  1307. <div class="acct">cesh****01</div>
  1308. <div class="org">示例销售机构</div>
  1309. <div class="why"><svg class="icn" viewBox="0 0 24 24"><use href="#i-clock"/></svg>离开超过 30 分钟,需重新验证</div>
  1310. <div class="bio bad"><svg class="icn" viewBox="0 0 24 24"><use href="#i-faceid"/></svg></div>
  1311. <div class="tip bad">面容 ID 不匹配</div>
  1312. <div class="rem">还可尝试 2 次,用尽后需密码登录</div>
  1313. <div class="retry"><svg class="icn" viewBox="0 0 24 24"><use href="#i-refresh"/></svg>点按重试</div>
  1314. <div class="ft"><b>使用密码登录</b><span>泓衍证券(香港)有限公司 持牌法团</span></div>
  1315. </div>
  1316. <div class="scrim">
  1317. <div class="dlg">
  1318. <div class="dlg-hd" style="padding-top:22px"><div class="dicon danger"><svg class="icn lg" viewBox="0 0 24 24"><use href="#i-shield"/></svg></div><h3>面容 ID 已暂停</h3></div>
  1319. <div style="padding:12px 18px 0"><p style="text-align:center;font-size:13.5px;line-height:22px;color:var(--ink-2)">连续 3 次验证失败,本次请使用账号密码登录。登录成功后可在<b style="color:var(--ink-1);font-weight:600">「我的 - 登录解锁设置」</b>重新开启。</p></div>
  1320. <div class="dlg-ft single"><span>使用密码登录</span></div>
  1321. </div>
  1322. </div>
  1323. <div class="homebar"></div>
  1324. </div>
  1325. </div>
  1326. <div class="cap">
  1327. <div class="cap-num">B4</div>
  1328. <div class="cap-title">生物解锁停用 · 回退密码<span class="cap-flags"><span class="cap-flag plat">仅 APP</span></span></div>
  1329. <ul>
  1330. <li>连续 3 次失败弹出:恢复路径写进正文,单按钮「使用密码登录」直落登录页,遮罩与返回键都关不掉</li>
  1331. <li>只停本次会话、不改设置项;生物特征变更时 Toast「生物识别信息已变更,请重新登录后再开启」</li>
  1332. </ul>
  1333. </div>
  1334. </div>
  1335. <!-- ===== B5 指纹解锁 · Android 系统面板 ===== -->
  1336. <div class="frame">
  1337. <div class="phone">
  1338. <div class="screen">
  1339. <div class="statusbar"><span class="num">9:41</span><span class="ic"><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><rect x="1" y="14" width="3.4" height="6" rx="1"/><rect x="6.4" y="10" width="3.4" height="10" rx="1"/><rect x="11.8" y="6" width="3.4" height="14" rx="1"/><rect x="17.2" y="3" width="3.4" height="17" rx="1" opacity=".35"/></svg><svg class="icn sm" viewBox="0 0 24 24" style="fill:currentColor;stroke:none"><path d="M12 19.5 2 9a14 14 0 0 1 20 0z" opacity=".95"/></svg><svg class="icn" viewBox="0 0 30 24" style="fill:none;stroke:currentColor;stroke-width:1.5;width:24px"><rect x="1.5" y="7" width="21" height="11" rx="3"/><rect x="3.6" y="9.1" width="14" height="6.8" rx="1.6" fill="currentColor" stroke="none"/><path d="M24.5 11v6a3.2 3.2 0 0 0 0-6z" fill="currentColor" stroke="none"/></svg></span></div>
  1340. <div class="lock">
  1341. <span class="swa">切换账号</span>
  1342. <div class="av"><svg class="icn" viewBox="0 0 24 24"><use href="#i-user"/></svg></div>
  1343. <div class="acct">cesh****01</div>
  1344. <div class="org">示例销售机构</div>
  1345. <div class="why"><svg class="icn" viewBox="0 0 24 24"><use href="#i-clock"/></svg>离开超过 30 分钟,需重新验证</div>
  1346. <div class="bio"><svg class="icn" viewBox="0 0 24 24"><use href="#i-touchid"/></svg></div>
  1347. <div class="tip">使用指纹解锁</div>
  1348. <div class="ft"><b>使用密码登录</b><span>泓衍证券(香港)有限公司 持牌法团</span></div>
  1349. </div>
  1350. <div class="scrim bottom" style="z-index:40"></div>
  1351. <div class="bprompt">
  1352. <h4>验证身份以继续访问泓衍票据</h4>
  1353. <svg class="fp icn" viewBox="0 0 24 24"><use href="#i-touchid"/></svg>
  1354. <div class="bhint">请触摸指纹传感器</div>
  1355. <span class="neg">取消</span>
  1356. </div>
  1357. <div class="homebar"></div>
  1358. </div>
  1359. </div>
  1360. <div class="cap">
  1361. <div class="cap-num">B5</div>
  1362. <div class="cap-title">指纹解锁 · Android 系统面板<span class="cap-flags"><span class="cap-flag plat">仅 Android</span></span></div>
  1363. <ul>
  1364. <li>系统 BiometricPrompt 渲染(示意):App 只给标题「验证身份以继续访问泓衍票据」,按钮是系统的「取消」</li>
  1365. <li>取消后留在解锁页,可再点图标唤起,或点「使用密码登录」</li>
  1366. </ul>
  1367. </div>
  1368. </div>
  1369. </div>
  1370. </div>
  1371. <div class="sec" style="margin-bottom:20px">
  1372. <div class="sec-head"><span class="sec-num">04</span><span class="sec-name">登录与新设备认证流程</span><span class="sec-rule"></span><span class="sec-note">文案以后端 msg 为准</span></div>
  1373. <table class="spec">
  1374. <tr><th style="width:44px">#</th><th style="width:210px">节点</th><th style="width:190px">分支</th><th>结果与文案</th></tr>
  1375. <tr><td class="m">1</td><td><b>输入账号及密码</b></td><td>超 50 字符</td><td>Toast「最长输入50个字符」</td></tr>
  1376. <tr><td class="m">2</td><td><b>账密校验</b></td><td>不通过</td><td>Toast「用户名或密码不正确」</td></tr>
  1377. <tr><td class="m">3</td><td><b>设备检查</b></td><td>受信设备</td><td class="m" style="color:var(--ok)">登录成功 → 票据 Tab</td></tr>
  1378. <tr><td class="m">4</td><td><b>设备检查</b></td><td>新设备</td><td>弹「安全验证」,验证码已下发</td></tr>
  1379. <tr><td class="m">5</td><td><b>验证码校验</b></td><td>错误 / 过期 / 次数过多</td><td>就地红字:验证码错误 · 验证码已过期 · 验证码校验次数过多,请重新获取验证码</td></tr>
  1380. <tr><td class="m">6</td><td><b>验证通过</b></td><td>—</td><td class="m" style="color:var(--ok)">设备记为受信 → 登录成功</td></tr>
  1381. <tr><td class="m">✕</td><td><b>中途取消</b></td><td>—</td><td>不建会话、设备不入库,下次仍需验证</td></tr>
  1382. </table>
  1383. </div>
  1384. <script>
  1385. (function(){
  1386. var root=document.documentElement,btns=document.querySelectorAll('.skin button');
  1387. document.querySelectorAll('[data-clone]').forEach(function(el){
  1388. var src=document.querySelector(el.getAttribute('data-clone'));
  1389. if(src) el.innerHTML=src.innerHTML;
  1390. });
  1391. function set(t){
  1392. root.setAttribute('data-theme',t);
  1393. btns.forEach(function(b){b.classList.toggle('on',b.dataset.set===t)});
  1394. document.querySelectorAll('.phone:not([data-lock])').forEach(function(p){p.setAttribute('data-theme',t)});
  1395. try{localStorage.setItem('hh-skin',t)}catch(e){}
  1396. }
  1397. btns.forEach(function(b){b.addEventListener('click',function(){set(b.dataset.set)})});
  1398. document.body.setAttribute('data-h',String(document.body.scrollHeight));
  1399. var hash=(location.hash||'').replace('#','');
  1400. var saved=null;try{saved=localStorage.getItem('hh-skin')}catch(e){}
  1401. set(hash==='dark'||hash==='light'?hash:(saved||'light'));
  1402. })();
  1403. </script>
  1404. </body>
  1405. </html>