| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508 |
- <!DOCTYPE html>
- <html lang="zh-CN" data-theme="light">
- <head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width,initial-scale=1">
- <title>登录 · 启动与双重认证</title>
- <style>
- /* ============================================================
- 共赢票据投资者 APP — 深空蓝设计系统 (Deep-Space Blue)
- 双主题:data-theme="light" | "dark",可作用于 :root 或任意容器
- ============================================================ */
- /* ---------- 浅色(默认) ---------- */
- :root,
- [data-theme="light"]{
- --canvas:#E7ECF4; /* 图纸底 */
- --canvas-2:#F4F7FB; /* 图纸卡片 */
- --canvas-line:#D3DCE8;
- --canvas-ink:#0F1B33;
- --canvas-mute:#647591;
- --app-bg:#F6F8FB; /* App 页面底 */
- --surface:#FFFFFF; /* 卡片/导航 */
- --surface-2:#F1F4F9; /* 次级面/表头 */
- --surface-3:#E8EDF5; /* 三级面 */
- --line:#E3E9F1;
- --line-2:#CFD9E7;
- --ink-1:#0F1B33;
- --ink-2:#4C5C78;
- --ink-3:#8A99B2;
- --ink-4:#AEBACD;
- --brand:#1B4FD8;
- --brand-2:#123CAE;
- --brand-weak:#E7EEFF;
- --brand-line:#B9CDFF;
- --on-brand:#FFFFFF;
- --accent:#B4700E; /* 琥珀 强调 */
- --accent-weak:#FDF2DE;
- --accent-line:#EBCD97;
- --rise:#E5484D; /* 涨 / 盈利 */
- --fall:#12A594; /* 跌 / 亏损 */
- --rise-weak:#FDECEC;
- --fall-weak:#E3F7F3;
- --warn:#C2410C;
- --warn-weak:#FEF0E6;
- --danger:#DC2626;
- --danger-weak:#FDEBEB;
- --ok:#0F7B4F;
- --ok-weak:#E4F5EC;
- --shadow-card:0 1px 2px rgba(15,27,51,.05),0 8px 24px rgba(15,27,51,.06);
- --shadow-phone:0 18px 44px rgba(15,27,51,.16),0 2px 6px rgba(15,27,51,.08);
- --shadow-pop:0 12px 40px rgba(15,27,51,.20);
- --scrim:rgba(11,18,34,.42);
- --bezel:#C7D2E2;
- --glow:none;
- }
- /* ---------- 深色 ---------- */
- [data-theme="dark"]{
- --canvas:#060A14;
- --canvas-2:#0E1526;
- --canvas-line:#1E2A44;
- --canvas-ink:#E9EFFA;
- --canvas-mute:#8797B4;
- --app-bg:#0B1020;
- --surface:#131B2E;
- --surface-2:#18223A;
- --surface-3:#1E2A45;
- --line:#232F4B;
- --line-2:#32436A;
- --ink-1:#EAF0FA;
- --ink-2:#A5B4D0;
- --ink-3:#7486A5;
- --ink-4:#54658A;
- --brand:#5B8CFF;
- --brand-2:#7FA6FF;
- --brand-weak:rgba(91,140,255,.16);
- --brand-line:rgba(91,140,255,.42);
- --on-brand:#05122E;
- --accent:#F0A93B;
- --accent-weak:rgba(240,169,59,.15);
- --accent-line:rgba(240,169,59,.42);
- --rise:#FF6B6E;
- --fall:#2FD4B9;
- --rise-weak:rgba(255,107,110,.14);
- --fall-weak:rgba(47,212,185,.14);
- --warn:#F59E42;
- --warn-weak:rgba(245,158,66,.14);
- --danger:#FF6B6E;
- --danger-weak:rgba(255,107,110,.14);
- --ok:#2FD4B9;
- --ok-weak:rgba(47,212,185,.14);
- --shadow-card:0 1px 2px rgba(0,0,0,.4),0 8px 24px rgba(0,0,0,.34);
- --shadow-phone:0 20px 50px rgba(0,0,0,.6),0 0 0 1px rgba(91,140,255,.10);
- --shadow-pop:0 14px 44px rgba(0,0,0,.62);
- --scrim:rgba(2,6,16,.62);
- --bezel:#26324C;
- --glow:0 0 0 1px rgba(91,140,255,.14);
- }
- /* ---------- 基础 ---------- */
- *{box-sizing:border-box;margin:0;padding:0}
- html{-webkit-text-size-adjust:100%}
- body{
- background:var(--canvas);color:var(--canvas-ink);
- font-family:"PingFang SC","Hiragino Sans GB","Microsoft YaHei",system-ui,-apple-system,"Segoe UI",sans-serif;
- -webkit-font-smoothing:antialiased;
- padding:44px 46px 110px;
- transition:background .28s ease,color .28s ease;
- }
- .mono{font-family:"SF Mono",ui-monospace,"JetBrains Mono",Menlo,Consolas,monospace}
- .num{font-variant-numeric:tabular-nums;letter-spacing:.01em}
- /* ---------- 图纸头 ---------- */
- .sheet-head{
- display:flex;flex-wrap:wrap;gap:32px;align-items:flex-end;justify-content:space-between;
- padding-bottom:24px;margin-bottom:44px;border-bottom:1px solid var(--canvas-line);
- }
- .brandmark{display:flex;align-items:center;gap:14px}
- .brandmark .glyph{
- width:44px;height:44px;border-radius:12px;flex:none;position:relative;
- background:linear-gradient(145deg,var(--brand),var(--brand-2));
- box-shadow:0 6px 18px rgba(27,79,216,.28);
- }
- .brandmark .glyph::before{
- content:"";position:absolute;inset:12px 11px;border:1.6px solid rgba(255,255,255,.9);
- border-radius:2px;border-bottom-width:4px;
- }
- .brandmark .glyph::after{
- content:"";position:absolute;right:8px;top:8px;width:7px;height:7px;border-radius:50%;background:var(--accent);
- }
- .sheet-title{font-size:26px;font-weight:650;letter-spacing:.02em;line-height:1.2}
- .sheet-sub{margin-top:6px;font-size:12.5px;color:var(--canvas-mute);letter-spacing:.02em}
- .head-right{display:flex;align-items:center;gap:26px;flex-wrap:wrap}
- .meta{display:flex;gap:26px}
- .meta div{font-size:10.5px;color:var(--canvas-mute);letter-spacing:.1em;text-transform:uppercase}
- .meta b{display:block;margin-top:5px;font-size:12.5px;color:var(--canvas-ink);font-weight:550;letter-spacing:0;text-transform:none}
- /* 换肤开关 */
- .skin{
- display:flex;align-items:center;gap:0;padding:3px;border-radius:9px;
- background:var(--canvas-2);border:1px solid var(--canvas-line);
- }
- .skin button{
- border:0;background:transparent;cursor:pointer;font:inherit;
- padding:7px 13px;border-radius:6px;font-size:12px;color:var(--canvas-mute);
- display:flex;align-items:center;gap:6px;letter-spacing:.04em;transition:.2s;
- }
- .skin button.on{background:var(--brand);color:#fff;box-shadow:0 2px 8px rgba(27,79,216,.3)}
- [data-theme="dark"] .skin button.on{color:#04122F}
- .skin svg{width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
- /* ---------- 章节 ---------- */
- .sec{margin-bottom:60px}
- .sec-head{display:flex;align-items:baseline;gap:14px;margin-bottom:24px}
- .sec-num{
- font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:11px;color:var(--brand);
- letter-spacing:.12em;padding:3px 8px;border:1px solid var(--brand-line);border-radius:5px;background:var(--brand-weak);
- }
- .sec-name{font-size:17px;font-weight:600;letter-spacing:.04em}
- .sec-rule{flex:1;height:1px;background:var(--canvas-line)}
- .sec-note{font-size:12px;color:var(--canvas-mute)}
- /* ---------- 说明卡 ---------- */
- .cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
- .card-x{background:var(--canvas-2);border:1px solid var(--canvas-line);border-radius:12px;padding:18px 20px}
- .card-x h4{font-size:11px;font-weight:600;letter-spacing:.14em;color:var(--canvas-mute);margin-bottom:14px;text-transform:uppercase}
- .kv{display:flex;flex-direction:column;gap:10px}
- .kv .r{display:flex;justify-content:space-between;gap:14px;font-size:12.5px;line-height:1.5}
- .kv .r span{color:var(--canvas-mute)}
- .kv .r b{font-weight:520;text-align:right;font-variant-numeric:tabular-nums}
- .bullets{display:flex;flex-direction:column;gap:9px}
- .bullets li{list-style:none;font-size:12.5px;line-height:1.65;color:var(--canvas-mute);padding-left:14px;position:relative}
- .bullets li::before{content:"";position:absolute;left:0;top:8px;width:6px;height:1.5px;background:var(--brand);border-radius:1px}
- .bullets b{color:var(--canvas-ink);font-weight:560}
- 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}
- /* ---------- 色板 ---------- */
- .pal{display:grid;grid-template-columns:repeat(auto-fill,minmax(168px,1fr));gap:10px}
- .sw{border:1px solid var(--canvas-line);border-radius:10px;overflow:hidden;background:var(--canvas-2)}
- .sw .chip{height:56px;display:flex;align-items:flex-end;justify-content:flex-end;padding:7px 9px}
- .sw .chip i{font-style:normal;font-size:9.5px;color:rgba(255,255,255,.85);font-family:"SF Mono",monospace}
- .sw .lb{padding:9px 11px}
- .sw .lb b{display:block;font-size:12px;font-weight:560}
- .sw .lb em{font-style:normal;display:block;font-size:10.5px;color:var(--canvas-mute);margin-top:3px;font-family:"SF Mono",monospace}
- /* ---------- 表 ---------- */
- 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}
- table.spec th{
- background:var(--surface-2);text-align:left;padding:11px 14px;font-size:10.5px;font-weight:600;
- letter-spacing:.1em;color:var(--canvas-mute);text-transform:uppercase;border-bottom:1px solid var(--canvas-line);
- }
- table.spec td{padding:11px 14px;border-bottom:1px solid var(--canvas-line);color:var(--canvas-mute);line-height:1.6;vertical-align:top}
- table.spec tr:last-child td{border-bottom:0}
- table.spec td b{color:var(--canvas-ink);font-weight:550}
- table.spec td.m{font-family:"SF Mono",ui-monospace,Menlo,monospace;color:var(--canvas-ink);font-size:11.5px}
- /* ---------- 画板 ---------- */
- .frames{display:grid;grid-template-columns:repeat(auto-fit,minmax(390px,390px));gap:52px 36px;justify-content:start}
- .frame{width:390px}
- .frame.w2{grid-column:span 2}
- .phone{
- width:390px;height:844px;border-radius:42px;overflow:hidden;position:relative;
- background:var(--app-bg);border:1px solid var(--bezel);box-shadow:var(--shadow-phone);
- font-size:15px;color:var(--ink-1);transition:background .28s ease,border-color .28s ease;
- isolation:isolate;
- }
- .cap{margin-top:18px;padding-left:13px;border-left:2px solid var(--brand)}
- .cap-num{font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:10.5px;color:var(--brand);letter-spacing:.12em}
- .cap-title{font-size:14.5px;font-weight:600;margin:5px 0 8px;letter-spacing:.02em}
- .cap ul{list-style:none;display:flex;flex-direction:column;gap:6px}
- .cap li{font-size:12px;line-height:1.62;color:var(--canvas-mute);padding-left:12px;position:relative}
- .cap li::before{content:"";position:absolute;left:0;top:8px;width:5px;height:1px;background:var(--canvas-line)}
- .cap li b{color:var(--canvas-ink);font-weight:550}
- .cap code{font-size:11px;background:var(--surface-3)}
- /* ============================================================
- App 内部组件
- ============================================================ */
- .screen{position:absolute;inset:0;display:flex;flex-direction:column;overflow:hidden;background:var(--app-bg)}
- .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)}
- .statusbar .ic{display:flex;gap:6px;align-items:center;opacity:.9}
- .statusbar svg{height:12px;fill:currentColor}
- .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}
- /* 顶栏 */
- .navbar{height:46px;flex:none;display:flex;align-items:center;padding:0 16px;position:relative;background:var(--app-bg)}
- .navbar h2{position:absolute;left:0;right:0;text-align:center;font-size:16.5px;font-weight:600;letter-spacing:.03em}
- .navbar .bk,.navbar .rt{position:relative;z-index:2;color:var(--ink-2);display:flex;align-items:center;gap:5px;font-size:13px}
- .navbar .rt{margin-left:auto;color:var(--brand)}
- .icn{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;flex:none}
- .icn.sm{width:14px;height:14px}
- .icn.lg{width:22px;height:22px}
- .appbar{padding:4px 20px 0;flex:none}
- .appbar h1{font-size:22px;font-weight:650;letter-spacing:.02em;display:flex;align-items:center;gap:9px}
- .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}
- /* 顶栏铃铛 · 未读红点 */
- .bellwrap{position:relative;display:inline-flex;flex:none}
- .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}
- /* 两行顶栏(标题 + 分段控件)的标题行:标题左、铃铛右 */
- .apphd{display:flex;align-items:center;justify-content:space-between}
- /* 分段控件 */
- .seg{display:flex;padding:3px;background:var(--surface-2);border-radius:9px;gap:2px}
- .seg span{flex:1;text-align:center;padding:7px 0;font-size:13.5px;color:var(--ink-3);border-radius:7px;transition:.2s}
- .seg span.on{background:var(--surface);color:var(--ink-1);font-weight:600;box-shadow:var(--shadow-card)}
- [data-theme="dark"] .seg span.on{background:var(--surface-3);color:var(--brand)}
- /* 下划线 tab */
- .tabs{display:flex;gap:24px;padding:0 20px;border-bottom:1px solid var(--line);flex:none;background:var(--app-bg)}
- .tabs span{padding:12px 1px 11px;font-size:14.5px;color:var(--ink-3);position:relative;white-space:nowrap}
- .tabs span.on{color:var(--ink-1);font-weight:600}
- .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)}
- .tabs span .dot{position:absolute;top:9px;right:-7px;width:6px;height:6px;padding:0;font-size:0;border-radius:50%;background:var(--danger)}
- .tabs span em{font-style:normal;color:var(--danger)}
- /* 底部 tabbar */
- .tabbar{height:72px;flex:none;display:flex;background:var(--surface);border-top:1px solid var(--line);padding-bottom:10px}
- .tb{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;font-size:10.5px;color:var(--ink-3)}
- .tb.on{color:var(--brand)}
- .tb .icn{width:21px;height:21px;stroke-width:1.6}
- /* 滚动体 */
- .body{flex:1;overflow:hidden;position:relative}
- .pad{padding:0 16px}
- /* 卡片 */
- .card{background:var(--surface);border-radius:14px;box-shadow:var(--shadow-card);overflow:hidden}
- [data-theme="dark"] .card{border:1px solid var(--line)}
- .card + .card:not(.pos):not(.qc){margin-top:11px}
- .card-hd{display:flex;align-items:center;justify-content:space-between;padding:13px 15px 0}
- .card-hd h3{font-size:14.5px;font-weight:600}
- .card-hd .more{font-size:12px;color:var(--ink-3);display:flex;align-items:center;gap:2px}
- /* 资金看板 */
- .hero{
- margin:10px 16px 0;border-radius:16px;padding:18px 18px 16px;position:relative;overflow:hidden;
- background:linear-gradient(150deg,#1B4FD8 0%,#123CAE 58%,#0C2C86 100%);color:#fff;
- box-shadow:0 12px 30px rgba(18,60,174,.30);
- }
- [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)}
- .hero::after{content:"";position:absolute;right:-40px;top:-52px;width:180px;height:180px;border-radius:50%;background:rgba(255,255,255,.07)}
- [data-theme="dark"] .hero::after{background:rgba(91,140,255,.10)}
- .hero .lb{display:flex;align-items:center;gap:6px;font-size:12.5px;color:rgba(255,255,255,.76)}
- .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}
- .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}
- .hero .amt .eye{opacity:.6}
- .hero .arrow{position:absolute;right:18px;top:20px;opacity:.75}
- .hero .grid3{display:flex;margin-top:16px;padding-top:14px;border-top:1px solid rgba(255,255,255,.16)}
- .hero .grid3 div{flex:1}
- .hero .grid3 span{display:block;font-size:11px;color:rgba(255,255,255,.7)}
- .hero .grid3 b{display:block;margin-top:5px;font-size:14.5px;font-weight:600;font-variant-numeric:tabular-nums}
- /* 币种表 */
- .fxtab{width:100%;border-collapse:collapse;font-size:12.5px}
- .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)}
- .fxtab th:first-child{text-align:left}
- .fxtab td{padding:10px 15px;text-align:right;font-variant-numeric:tabular-nums;color:var(--ink-1);border-top:1px solid var(--line)}
- .fxtab td:first-child{text-align:left;font-family:"SF Mono",monospace;font-size:12px;color:var(--ink-2)}
- /* 快捷入口 */
- .quick{display:flex;gap:11px;margin:11px 16px 0}
- .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}
- [data-theme="dark"] .qk{border:1px solid var(--line)}
- .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}
- .qk b{font-size:13.5px;font-weight:550}
- .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)}
- /* 列表行 */
- .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}
- .row:last-child{border-bottom:0}
- .row .k{color:var(--ink-2);display:flex;align-items:center;gap:7px;flex:none}
- .row .k .icn{color:var(--ink-3)}
- .row .v{color:var(--ink-1);font-variant-numeric:tabular-nums;display:flex;align-items:center;gap:6px;text-align:right}
- .row .v.ph{color:var(--ink-4)}
- .row .v.m{font-family:"SF Mono",monospace;font-size:13.5px}
- .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}
- /* 标签 / 徽标 */
- .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}
- .t-brand{background:var(--brand-weak);color:var(--brand)}
- .t-accent{background:var(--accent-weak);color:var(--accent)}
- .t-rise{background:var(--rise-weak);color:var(--rise)}
- .t-fall{background:var(--fall-weak);color:var(--fall)}
- .t-ok{background:var(--ok-weak);color:var(--ok)}
- .t-warn{background:var(--warn-weak);color:var(--warn)}
- .t-mute{background:var(--surface-3);color:var(--ink-3)}
- .t-solid{background:var(--brand);color:var(--on-brand)}
- .t-danger{background:var(--danger);color:#fff}
- .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}
- .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}
- .corner.due{background:var(--accent)}
- .corner.pend{background:var(--ink-3)}
- /* 状态点 */
- .st{display:inline-flex;align-items:center;gap:5px;font-size:12.5px}
- .st i{width:6px;height:6px;border-radius:50%;flex:none;background:currentColor}
- .st.wait{color:var(--ink-3)}
- .st.live{color:var(--accent)}
- .st.live i{background:transparent;border:1.6px solid currentColor}
- .st.done{color:var(--ok)}
- .st.rej{color:var(--danger)}
- .st.exp{color:var(--ink-4)}
- /* 按钮 */
- .btn{
- height:46px;border-radius:12px;display:flex;align-items:center;justify-content:center;gap:6px;
- background:var(--brand);color:var(--on-brand);font-size:15.5px;font-weight:600;letter-spacing:.06em;
- box-shadow:0 6px 16px rgba(27,79,216,.24);
- }
- [data-theme="dark"] .btn{box-shadow:0 6px 18px rgba(91,140,255,.20)}
- .btn.sm{height:38px;font-size:14px;border-radius:10px;box-shadow:none}
- .btn.off{background:var(--surface-3);color:var(--ink-4);box-shadow:none}
- .btn.ghost{background:transparent;border:1px solid var(--line-2);color:var(--ink-2);box-shadow:none;font-weight:500}
- .btn.danger{background:var(--danger);box-shadow:none;color:#fff}
- .btn.wide{width:100%}
- .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)}
- /* 输入 */
- .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)}
- .field.focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-weak)}
- .field.err{border-color:var(--danger);box-shadow:0 0 0 3px var(--danger-weak)}
- .field .ph{color:var(--ink-4)}
- .field .icn{color:var(--ink-3)}
- .field .unit{margin-left:auto;color:var(--ink-2);font-size:13.5px}
- .lbl{font-size:11.5px;color:var(--ink-3);letter-spacing:.06em;margin-bottom:7px;display:block}
- .errtip{font-size:11.5px;color:var(--danger);margin-top:6px;display:flex;align-items:center;gap:4px}
- /* chips */
- .chips{display:flex;gap:7px;flex-wrap:wrap}
- .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}
- .chip.on{background:var(--brand-weak);border-color:var(--brand-line);color:var(--brand);font-weight:560}
- .chip.dash{border-style:dashed}
- /* 单选 / 复选 */
- .rad{display:inline-flex;align-items:center;gap:6px;font-size:13.5px;color:var(--ink-2)}
- .rad i{width:15px;height:15px;border-radius:50%;border:1.4px solid var(--line-2);position:relative;flex:none}
- .rad.on{color:var(--ink-1)}
- .rad.on i{border-color:var(--brand)}
- .rad.on i::after{content:"";position:absolute;inset:3px;border-radius:50%;background:var(--brand)}
- .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}
- .cb.on{background:var(--brand);border-color:var(--brand);color:var(--on-brand)}
- .cb .icn{width:11px;height:11px;stroke-width:2.6}
- /* 步进器 */
- .stepper{height:38px;border:1px solid var(--line-2);border-radius:10px;display:flex;align-items:center;overflow:hidden;background:var(--surface)}
- .stepper b{width:34px;text-align:center;font-weight:400;font-size:17px;color:var(--ink-3)}
- .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}
- .stepper.err{border-color:var(--danger)}
- .stepper.err i{color:var(--danger)}
- /* 搜索 */
- .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)}
- .search .icn{color:var(--ink-3)}
- .search b{color:var(--ink-1);font-weight:500}
- .sug{background:var(--surface);border-radius:12px;box-shadow:var(--shadow-pop);overflow:hidden;margin-top:6px}
- .sug div{padding:11px 13px;font-size:14px;border-bottom:1px solid var(--line);display:flex;gap:8px}
- .sug div:last-child{border-bottom:0}
- .sug em{font-style:normal;color:var(--brand)}
- .sug span{font-family:"SF Mono",monospace;font-size:12.5px;color:var(--ink-3)}
- /* 弹窗 */
- .scrim{position:absolute;inset:0;background:var(--scrim);z-index:40;display:flex;align-items:center;justify-content:center;padding:0 30px}
- .scrim.bottom{align-items:flex-end;padding:0}
- .dlg{width:100%;background:var(--surface);border-radius:16px;overflow:hidden;box-shadow:var(--shadow-pop)}
- .dlg.sheet{border-radius:18px 18px 0 0;padding-bottom:22px}
- .dlg-hd{padding:18px 18px 0;text-align:center}
- .dlg-hd h3{font-size:16.5px;font-weight:600}
- .dlg-bd{padding:14px 18px 4px;font-size:14px;color:var(--ink-2);line-height:1.65}
- .dlg-ft{display:flex;border-top:1px solid var(--line);margin-top:16px}
- .dlg-ft span{flex:1;text-align:center;padding:14px 0;font-size:15.5px;color:var(--brand);font-weight:550}
- .dlg-ft span:first-child{color:var(--ink-2);border-right:1px solid var(--line)}
- .dlg-ft.single span{color:var(--brand)}
- .dlg-btns{display:flex;gap:11px;padding:16px 18px 0}
- .dlg-btns .btn{flex:1}
- /* toast */
- .toast{
- position:absolute;left:50%;top:47%;transform:translate(-50%,-50%);z-index:50;
- 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;
- }
- [data-theme="dark"] .toast{background:rgba(230,238,250,.94);color:#0B1020}
- /* 提示条 */
- .notice{display:flex;gap:8px;padding:10px 12px;border-radius:10px;font-size:12.5px;line-height:1.6}
- .notice.warn{background:var(--warn-weak);color:var(--warn)}
- .notice.info{background:var(--brand-weak);color:var(--brand)}
- .notice.danger{background:var(--danger-weak);color:var(--danger)}
- .notice .icn{flex:none;margin-top:1px}
- /* 空态 */
- .empty{padding:44px 0;text-align:center;color:var(--ink-4);font-size:13.5px}
- .empty .icn{width:34px;height:34px;stroke-width:1.2;margin-bottom:10px;color:var(--ink-4)}
- /* 分组标题 */
- .gtitle{padding:16px 16px 8px;font-size:12px;color:var(--ink-3);letter-spacing:.06em}
- /* 骨架/遮罩说明用 */
- .dim{opacity:.45}
- /* ============================================================
- 后台隐私遮罩 / 生物解锁
- ============================================================ */
- /* 遮罩:复用启动页视觉,另挂一枚状态胶囊 */
- .splash .maskchip{position:absolute;bottom:100px;display:inline-flex;align-items:center;gap:6px;
- padding:7px 13px;border-radius:16px;background:rgba(255,255,255,.15);color:rgba(255,255,255,.85);
- font-size:12px;letter-spacing:.06em;backdrop-filter:blur(2px)}
- .splash .maskchip .icn{width:13px;height:13px;stroke-width:1.9}
- /* 生物解锁页 */
- .body.unlock{display:flex;flex-direction:column;align-items:center;position:relative}
- .unlock .swacc{position:absolute;top:10px;right:18px;font-size:13px;color:var(--ink-3)}
- .unlock .acc{margin-top:74px;display:flex;flex-direction:column;align-items:center;gap:9px}
- .unlock .avt{width:58px;height:58px;border-radius:19px;background:var(--brand-weak);color:var(--brand);display:flex;align-items:center;justify-content:center}
- .unlock .avt .icn{width:27px;height:27px}
- .unlock .who{font-size:16px;font-weight:600;letter-spacing:.06em;font-family:"SF Mono",ui-monospace,Menlo,monospace}
- .unlock .org{font-size:11.5px;color:var(--ink-3);letter-spacing:.06em}
- .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}
- .unlock .why .icn{width:12px;height:12px}
- .unlock .bio{margin-top:62px;display:flex;flex-direction:column;align-items:center}
- .unlock .bioic{width:92px;height:92px;border-radius:28px;background:var(--brand-weak);color:var(--brand);display:flex;align-items:center;justify-content:center}
- .unlock .bioic .icn{width:46px;height:46px;stroke-width:1.5}
- .unlock .bioic.err{background:var(--danger-weak);color:var(--danger)}
- .unlock .biotx{margin-top:18px;font-size:14.5px;color:var(--ink-2);letter-spacing:.04em}
- .unlock .biotx.err{color:var(--danger);font-weight:600}
- .unlock .biosub{margin-top:7px;font-size:12px;color:var(--ink-4);letter-spacing:.02em}
- .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}
- .unlock .retry .icn{width:13px;height:13px;color:var(--ink-3)}
- .unlock .alt{position:absolute;left:0;right:0;bottom:64px;display:flex;flex-direction:column;align-items:center;gap:15px}
- .unlock .alt .lnk{font-size:14px;color:var(--brand);font-weight:600;letter-spacing:.04em}
- .unlock .alt .lic{font-size:10.5px;color:var(--ink-4);letter-spacing:.12em}
- /* Android 系统生物识别面板 */
- .biosheet{text-align:center;padding:22px 22px 4px}
- .biosheet h3{font-size:17px;font-weight:600}
- .biosheet p{margin-top:8px;font-size:13px;color:var(--ink-2);line-height:1.6}
- .biosheet .fp{width:72px;height:72px;margin:22px auto 6px;color:var(--brand);display:flex;align-items:center;justify-content:center}
- .biosheet .fp .icn{width:60px;height:60px;stroke-width:1.3}
- .biosheet .fp.err{color:var(--danger)}
- .biosheet .bhint{font-size:12.5px;color:var(--ink-3);min-height:18px;letter-spacing:.02em}
- .biosheet .bhint.err{color:var(--danger);font-weight:550}
- /* ============================================================
- 业务组件
- ============================================================ */
- /* 筛选栏 */
- .filterbar{display:flex;gap:8px;padding:10px 16px;background:var(--app-bg);flex:none;align-items:center}
- .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}
- .fb.on{background:var(--brand-weak);color:var(--brand);font-weight:550}
- .fb .icn{width:13px;height:13px}
- .fb.flex{flex:1;min-width:0}
- /* 筛选栏 v2 —— 搜索行 + 条件行(时间在左,筛选入口在右) */
- .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}
- .fsearch .icn{width:16px;height:16px;color:var(--ink-3);flex:none}
- .fsearch b{color:var(--ink-1);font-weight:500}
- .fsearch .clr{margin-left:auto;color:var(--ink-4)}
- .fcond{display:flex;align-items:center;justify-content:space-between;padding:11px 16px;flex:none;background:var(--app-bg)}
- .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}
- .fpill .icn{width:13px;height:13px;color:var(--ink-3)}
- .fpill.on{background:var(--brand-weak);border-color:var(--brand-line);color:var(--brand);font-weight:560}
- .fpill.on .icn{color:var(--brand)}
- .fmore{display:inline-flex;align-items:center;gap:6px;font-size:13.5px;color:var(--ink-2);position:relative;padding-right:2px}
- .fmore .icn{width:15px;height:15px;color:var(--ink-3)}
- .fmore.on{color:var(--brand);font-weight:560}
- .fmore.on .icn{color:var(--brand)}
- .fmore.on::after{content:"";position:absolute;right:-5px;top:-3px;width:6px;height:6px;border-radius:50%;background:var(--danger)}
- /* 筛选面板 —— 底部弹层 */
- .fsheet{padding-bottom:20px}
- .fsheet-hd{display:flex;align-items:center;justify-content:space-between;padding:20px 20px 2px}
- .fsheet-hd b{font-size:17px;font-weight:600;letter-spacing:.02em}
- .fsheet-hd .icn{width:19px;height:19px;color:var(--ink-3)}
- .fsec{padding:16px 20px 0}
- .fsec .lbl{margin-bottom:10px}
- .optgrid{display:grid;grid-template-columns:1fr 1fr;gap:11px}
- .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}
- .opt.on{background:var(--brand-weak);border-color:var(--brand);color:var(--brand);font-weight:600}
- .opt.dis{background:var(--surface-2);border-color:var(--line);color:var(--ink-4)}
- .fline{height:1px;background:var(--line);margin:18px 20px 0}
- /* 自定义区间 · 日期段 + 滚轮 */
- .dtrow{display:flex;gap:11px}
- .dt{flex:1;min-width:0;background:var(--surface);border:1px solid var(--line-2);border-radius:12px;padding:8px 12px 10px}
- .dt em{display:block;font-style:normal;font-size:11px;color:var(--ink-3);letter-spacing:.04em}
- .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}
- .dt.act{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-weak)}
- .dt.act em{color:var(--brand)}
- .dt.err{border-color:var(--danger);box-shadow:0 0 0 3px var(--danger-weak)}
- .wheel{position:relative;margin:14px 20px 0;padding:4px 8px;display:grid;grid-template-columns:repeat(3,1fr);text-align:center}
- .wheel .band{position:absolute;left:6px;right:6px;top:50%;height:40px;transform:translateY(-50%);background:var(--surface-2);border-radius:10px}
- .wcol{position:relative;z-index:1;display:flex;flex-direction:column}
- .wcol span{height:40px;line-height:40px;font-size:14px;color:var(--ink-2);font-variant-numeric:tabular-nums}
- .wcol span.far{color:var(--ink-4);opacity:.5}
- .wcol span.now{color:var(--ink-1);font-size:16px;font-weight:600}
- .fsheet-ft{display:flex;gap:12px;padding:20px 20px 0}
- .fsheet-ft .btn{flex:1.18}
- .fsheet-ft .btn.ghost{flex:.82;background:var(--surface-2);border:0;color:var(--ink-2);font-weight:600}
- /* 持仓卡片 */
- .pos{position:relative;margin:0 16px 11px;padding:13px 0 0}
- .pos-hd{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;padding:0 14px}
- .pos-name{font-size:15.5px;font-weight:600;display:flex;align-items:center;gap:6px}
- .pos-code{font-size:11px;color:var(--ink-3);margin-top:4px;letter-spacing:.02em;font-family:"SF Mono",monospace}
- .pos-val{text-align:right;flex:none}
- .pos-val b{display:block;font-size:18px;font-weight:600;font-variant-numeric:tabular-nums}
- .pos-val span{display:block;font-size:10.5px;color:var(--ink-3);margin-top:3px}
- .pos-pl{display:flex;justify-content:flex-end;gap:9px;padding:6px 14px 0;font-size:12.5px;font-variant-numeric:tabular-nums}
- .up{color:var(--rise)} .down{color:var(--fall)} .flat{color:var(--ink-3)}
- .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)}
- .pos-grid div span{display:block;font-size:10px;color:var(--ink-3);letter-spacing:.02em}
- .pos-grid div b{display:block;margin-top:4px;font-size:12.5px;font-weight:550;font-variant-numeric:tabular-nums;white-space:nowrap}
- .pos-grid div b em{font-style:normal;color:var(--ink-3);font-weight:400;font-size:11px}
- .pos-ops{display:flex;border-top:1px solid var(--line);background:var(--surface-2)}
- .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)}
- .pos-ops span:last-child{border-right:0}
- .pos-ops span.pri{color:var(--brand);font-weight:550}
- .pos-ops span.hot{color:var(--danger);font-weight:550}
- .pos-ops span.off{color:var(--ink-4)}
- /* 冻结列表格(数据模式) */
- .gridtab{display:flex;font-size:12px;overflow:hidden}
- .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)}
- [data-theme="dark"] .gt-fix{box-shadow:4px 0 10px rgba(0,0,0,.35)}
- .gt-scroll{flex:1;overflow:hidden;background:var(--surface)}
- .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}
- .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}
- .gt-fix .gt-r{flex-direction:column;align-items:flex-start;justify-content:center;gap:3px;position:relative;padding-left:14px}
- .gt-fix .gt-h{padding-left:14px}
- /* 表格形式的「新报价」角标:斜切丝带,带 NEW 文案;冻结列左内边距统一 14px 给丝带让位,行内文字不被压 */
- .gt-new{position:absolute;left:0;top:0;width:34px;height:34px;overflow:hidden;z-index:3;pointer-events:none}
- .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}
- .gt-r i{font-style:normal;display:inline-block;text-align:right}
- .gt-h i{display:inline-block;text-align:right}
- /* 询价 / 订单卡片 */
- .qc{margin:0 16px 10px;padding:13px 14px;position:relative}
- .qc-top{display:flex;justify-content:space-between;gap:12px;align-items:flex-start}
- .qc-name{font-size:15px;font-weight:600;display:flex;align-items:center;gap:6px}
- .qc-sub{font-size:11px;color:var(--ink-3);margin-top:4px;font-family:"SF Mono",monospace}
- .qc-r{text-align:right;flex:none}
- .qc-time{font-size:10.5px;color:var(--ink-3);margin-top:5px;font-family:"SF Mono",monospace}
- .qc-meta{display:flex;gap:16px;margin-top:10px;font-size:12.5px;color:var(--ink-2);font-variant-numeric:tabular-nums}
- .qc-meta em{font-style:normal;color:var(--ink-3);font-size:11px;margin-right:4px}
- .qc-open{margin-top:12px;border-top:1px dashed var(--line-2);padding-top:10px}
- .qt{display:grid;grid-template-columns:1.1fr .8fr .8fr .9fr;font-size:12px;font-variant-numeric:tabular-nums;align-items:center}
- .qt.h{color:var(--ink-3);font-size:10.5px;padding-bottom:7px}
- .qt.r{padding:9px 8px;margin:0 -8px;border-radius:8px}
- .qt.r:hover,.qt.r.hl{background:var(--brand-weak)}
- .qt .p{color:var(--brand);font-weight:600}
- .qt .t{color:var(--ink-3);font-size:10.5px;text-align:right}
- /* 「新」标记分工:卡片/行角标表明本单有新报价,行内红点指出具体是哪一条 */
- .qt span:first-child{position:relative;padding-left:12px}
- .qt .newdot{position:absolute;left:0;top:50%;margin:0;transform:translateY(-50%);vertical-align:0}
- .newdot{width:6px;height:6px;border-radius:50%;background:var(--danger);display:inline-block;margin-right:5px;vertical-align:1px}
- /* 时间线(流水) */
- .tl{padding:0 16px}
- .tl-i{display:flex;gap:12px;padding:14px 0;border-bottom:1px solid var(--line)}
- .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)}
- .tl-i .dot.out{background:var(--accent);box-shadow:0 0 0 3px var(--accent-weak)}
- .tl-i .c{flex:1}
- .tl-i .c b{font-size:14.5px;font-weight:550}
- .tl-i .c span{display:block;font-size:11px;color:var(--ink-3);margin-top:4px;font-family:"SF Mono",monospace}
- .tl-i .amt{font-size:15px;font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap}
- /* 设置项列表 */
- .menu{background:var(--surface);border-radius:14px;overflow:hidden;margin:0 16px 12px;box-shadow:var(--shadow-card)}
- [data-theme="dark"] .menu{border:1px solid var(--line)}
- .mi{display:flex;align-items:center;gap:12px;padding:15px 15px;border-bottom:1px solid var(--line);font-size:15px}
- .mi:last-child{border-bottom:0}
- .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}
- .mi .ib.am{background:var(--accent-weak);color:var(--accent)}
- .mi .tx{flex:1}
- .mi .tx em{font-style:normal;display:block;font-size:11.5px;color:var(--ink-3);margin-top:3px}
- .mi .rv{color:var(--ink-3);font-size:13.5px;display:flex;align-items:center;gap:4px}
- /* 开关 */
- .sw2{width:44px;height:26px;border-radius:14px;background:var(--line-2);position:relative;flex:none;transition:.2s}
- .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}
- .sw2.on{background:var(--brand)}
- .sw2.on::after{left:21px}
- /* 数据表(App 内) */
- .dt{width:100%;border-collapse:collapse;font-size:12.5px}
- .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}
- .dt th:first-child{text-align:left}
- .dt td{padding:10px;text-align:right;border-top:1px solid var(--line);font-variant-numeric:tabular-nums}
- .dt td:first-child{text-align:left;color:var(--ink-2)}
- /* 键盘 */
- .kbd{background:var(--surface-2);padding:8px 6px 26px;display:grid;grid-template-columns:repeat(3,1fr);gap:7px}
- .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)}
- [data-theme="dark"] .kbd span{box-shadow:none;border:1px solid var(--line)}
- .kbd span.fn{background:transparent;box-shadow:none;font-size:15px;color:var(--ink-2)}
- .kbd span.ok{background:var(--brand);color:var(--on-brand);font-size:16px}
- /* 对照页专用 */
- .pair{display:grid;grid-template-columns:390px 390px;gap:36px;justify-content:start}
- .pair-lb{display:flex;align-items:center;gap:7px;font-size:11.5px;color:var(--canvas-mute);margin-bottom:12px;letter-spacing:.08em}
- .pair-lb i{width:12px;height:12px;border-radius:3px;border:1px solid var(--canvas-line);flex:none}
- /* 角标占位:有角标的卡片顶部让出空间,避免压住标的名 */
- .pos:has(.corner) .pos-hd{padding-top:15px}
- .qc:has(.corner){padding-top:26px}
- /* ==== v1.3 · 01 专用 BEGIN ==== */
- /* 启动页 / 隐私遮罩(代码 BrandSplash):品牌渐变,Logo 独占正中(与原生启动屏逐像素重合),应用名在 Logo 下 20,持牌信息距底 52 */
- .bsplash{position:absolute;inset:0;background:linear-gradient(160deg,#1B4FD8 0%,#123CAE 55%,#0A2467 100%);color:#fff}
- .phone[data-theme="dark"] .bsplash{background:linear-gradient(160deg,#16244B 0%,#0F1A38 55%,#080D1E 100%)}
- .bsplash .lg{position:absolute;left:50%;top:50%;width:76px;height:76px;margin:-38px 0 0 -38px}
- .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}
- .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)}
- .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}
- .bsplash .mchip .icn{width:13px;height:13px;stroke-width:1.9}
- /* 登录页(代码 SignInScreen) */
- .lgtop{height:40px;display:flex;align-items:center;justify-content:space-between;padding:0 18px 0 20px;flex:none}
- .lgtop .lang{display:flex;align-items:center;gap:6px;font-size:13.5px;color:var(--ink-2)}
- .lgtop .icn{width:18px;height:18px;color:var(--ink-2)}
- .lgtop .hp .icn{width:22px;height:22px;color:var(--ink-3)}
- .lgbody{padding:18px 26px 0}
- .lgbody .mark{width:56px;height:56px;border-radius:16px;display:block}
- .lgbody h1{font-size:25px;font-weight:600;letter-spacing:.02em;margin-top:22px}
- .lgbody .sub{font-size:13.5px;color:var(--ink-3);margin-top:8px}
- .lgbody .fld{margin-top:30px}
- .lgbody .fld+.fld{margin-top:16px}
- .lgbody .field .ph{color:var(--ink-4)}
- .lgbody .field .tr{margin-left:auto;color:var(--ink-3);display:flex}
- .lgbody .field .tr .icn{width:16px;height:16px}
- .lgbody .btn{margin-top:26px}
- .lgfoot{position:absolute;left:0;right:0;bottom:30px;text-align:center;font-size:11px;color:var(--ink-4);line-height:1.7}
- .lgfoot b{font-weight:400;color:var(--ink-2)}
- .lgsug{margin-top:6px;background:var(--surface);border-radius:12px;box-shadow:var(--shadow-pop);overflow:hidden}
- .lgsug div{padding:12px 13px;font-size:14.5px;color:var(--ink-1)}
- /* 安全验证弹窗:6 格验证码 */
- .otp6{display:flex;gap:7px;justify-content:center;padding:14px 14px 0}
- .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)}
- .otp6 b.f{border-color:var(--brand);background:var(--surface)}
- .otp6 b.c{border-color:var(--brand);background:var(--surface);color:var(--ink-4);font-weight:300}
- .otp6.err b{border-color:var(--danger);background:var(--danger-weak);color:var(--danger)}
- .resend{text-align:center;margin-top:14px;font-size:12.5px;color:var(--ink-4)}
- .dlg-hd .dsc b{color:var(--ink-1);font-weight:600}
- /* 锁定页(代码 LockScreen) */
- .lock{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center}
- .lock .swa{position:absolute;top:62px;right:18px;font-size:13px;color:var(--ink-3)}
- .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}
- .lock .av .icn{width:27px;height:27px}
- .lock .acct{margin-top:9px;font-family:var(--font-mono);font-size:16px;font-weight:600;letter-spacing:1px}
- .lock .org{margin-top:9px;font-size:11.5px;color:var(--ink-3);letter-spacing:.7px}
- .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}
- .lock .why .icn{width:12px;height:12px}
- .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}
- .lock .bio .icn{width:46px;height:46px;stroke-width:1.5}
- .lock .bio.bad{background:var(--danger-weak);color:var(--danger)}
- .lock .tip{margin-top:18px;font-size:14.5px;letter-spacing:.6px;color:var(--ink-2)}
- .lock .tip.bad{color:var(--danger);font-weight:600}
- .lock .rem{margin-top:7px;font-size:12px;color:var(--ink-4);letter-spacing:.25px}
- .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)}
- .lock .retry .icn{width:13px;height:13px;color:var(--ink-3)}
- .lock .ft{position:absolute;left:0;right:0;bottom:64px;display:flex;flex-direction:column;align-items:center;gap:15px}
- .lock .ft b{font-size:14px;font-weight:600;color:var(--brand);letter-spacing:.6px}
- .lock .ft span{font-size:10.5px;color:var(--ink-4);letter-spacing:1.3px}
- .lock.faded>*:not(.keep){opacity:.45}
- /* Android BiometricPrompt(系统渲染示意) */
- .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}
- .bprompt h4{font-size:18px;font-weight:600;text-align:center}
- .bprompt .fp{margin-top:26px;width:60px;height:60px;color:var(--brand)}
- .bprompt .bhint{margin-top:16px;font-size:13px;color:var(--ink-3)}
- .bprompt .neg{margin-top:26px;align-self:flex-end;font-size:14.5px;font-weight:600;color:var(--brand);letter-spacing:.04em}
- /* 多机构说明帧 */
- .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}
- [data-theme="dark"] .brandcard{border:1px solid var(--line)}
- .brandcard img{width:64px;height:64px}
- .brandcard span{font-size:12px;color:var(--ink-2)}
- /* ==== v1.3 · 01 专用 END ==== */
- /* ==== v1.3 公共覆盖 BEGIN · 2026-10-14 按代码现状对齐(同一段注入全部图纸,改动从清单目录的 common-v13.css 同步) ==== */
- /* 字体:数值走 Inter(代码 NumText),代码 / 编号走 iOS 的 Menlo(代码 MonoText),正文仍是系统字 */
- @font-face{font-family:"Inter";src:url("assets/fonts/Inter-Regular.subset.otf") format("opentype");font-weight:400}
- @font-face{font-family:"Inter";src:url("assets/fonts/Inter-Medium.subset.otf") format("opentype");font-weight:500}
- @font-face{font-family:"Inter";src:url("assets/fonts/Inter-SemiBold.subset.otf") format("opentype");font-weight:600}
- @font-face{font-family:"Inter";src:url("assets/fonts/Inter-Bold.subset.otf") format("opentype");font-weight:700}
- :root{--font-num:"Inter","PingFang SC","Hiragino Sans GB",system-ui,sans-serif;--font-mono:Menlo,"SF Mono",ui-monospace,monospace}
- .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)}
- .statusbar .num{font-family:inherit}
- .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)}
- /* 底栏:四个 Tab(票据 / 账户 / 消息 / 我的);消息 Tab 只有红点,后端不给条数 */
- .tb .tbi{position:relative;display:inline-flex;flex:none}
- .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)}
- /* 二级页导航栏:iOS 系统导航栏,表面色底、居中 17 / 600 标题、品牌色返回箭头、无分隔线(H5 标题靠左,见 00 规范) */
- .navbar{height:44px;background:var(--surface)}
- .statusbar:has(+ .navbar){background:var(--surface)}
- .navbar h2{font-size:17px;font-weight:600;letter-spacing:0}
- .navbar .bk{color:var(--brand)}
- .navbar .bk .icn{width:22px;height:22px;stroke-width:2.1}
- /* 图注里的身份标记:本期未上线 / v1.3 新增 / 平台限定 */
- .cap-flags{display:inline-flex;gap:6px;margin-left:8px;vertical-align:1px}
- .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)}
- .cap-flag.off{color:var(--accent);border-color:var(--accent-line);background:var(--accent-weak)}
- .cap-flag.new{color:var(--brand);border-color:var(--brand-line);background:var(--brand-weak)}
- .cap-flag.plat{color:var(--ok);border-color:rgba(15,123,79,.35);background:var(--ok-weak)}
- /* 实心底上的文字(角标 / 实心标签 / 危险按钮):浅色白字,深色下底色被提亮、改配近黑字(代码 $onFill / $onDanger) */
- [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}
- /* 表格首列的迷你角标(代码 CornerBadge variant="mini"):9 / 600、左右 4 */
- .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}
- .mb.d{background:var(--danger)} .mb.a{background:var(--accent)} .mb.m{background:var(--ink-3)} .mb.b{background:var(--brand)}
- /* Toast:按内容定宽、最宽 290(代码 maxW 290),单行放得下就不折行;位置 top 76% */
- .toast{width:max-content;max-width:290px}
- /* ---- 通用组件(代码 components/ 的对应件) ---- */
- /* 资金看板右上「>」用 lg 档 */
- .hero .arrow{width:22px;height:22px}
- /* 只读行:InfoRow(无分隔线)/ FieldRow(带分隔线,.frow),左 ink2 右 Inter */
- .irow{display:flex;justify-content:space-between;align-items:center;padding:14px 15px;font-size:14.5px}
- .irow span{color:var(--ink-2)}
- .irow b{font-weight:400;font-family:var(--font-num);font-variant-numeric:tabular-nums}
- .irow b.dg{color:var(--danger)}
- .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}
- .frow>span{color:var(--ink-2);display:flex;align-items:center;gap:6px}
- .frow>b{font-weight:400;font-family:var(--font-num);font-variant-numeric:tabular-nums;text-align:right}
- .frow.hl{background:var(--brand-weak)}
- .frow.hl>span,.frow.hl>b{color:var(--brand)}
- .frow.hl>b{font-weight:600}
- .frow.last,.frow:last-child{border-bottom:0}
- /* 字段说明 ⓘ(代码 IconButton name="info",ink4 14) */
- .xi{width:14px;height:14px;color:var(--ink-4);flex:none}
- /* 弹窗里的证券行(代码在前)与行情行 */
- .secl{display:flex;align-items:center;gap:7px}
- .secl .mono{font-size:12px;color:var(--ink-3)}
- .secl b{font-size:14.5px;font-weight:600}
- .phint{display:flex;gap:14px;margin-top:9px;font-size:12px;color:var(--ink-3)}
- .phint b{font-weight:400;font-family:var(--font-num);font-variant-numeric:tabular-nums}
- .field .num{font-family:var(--font-num)}
- .errtip .icn{width:13px;height:13px}
- .errtip.r{justify-content:flex-end}
- /* 时间片块(代码 TradingWindowDialog) */
- .twin{border-radius:10px;background:var(--surface-2);padding:13px 0;display:flex;flex-direction:column;align-items:center;gap:5px}
- .twin span{font-size:13px;color:var(--ink-3)}
- .twin b{font-size:17px;font-weight:600;font-family:var(--font-num)}
- /* 弹窗标题区(代码 DialogHeading):图标圆 44 + 标题 16.5 / 600 + 说明 14 / ink2 / 行高 23 */
- .dicon{width:44px;height:44px;border-radius:22px;display:flex;align-items:center;justify-content:center;margin:0 auto 6px}
- .dicon.warn{background:var(--warn-weak);color:var(--warn)}
- .dicon.danger{background:var(--danger-weak);color:var(--danger)}
- .dicon.ok{background:var(--ok-weak);color:var(--ok)}
- .dicon.brand{background:var(--brand-weak);color:var(--brand)}
- .dlg-hd .dsc{margin-top:6px;font-size:14px;color:var(--ink-2);line-height:23px}
- .dlg-ft span{font-weight:500}
- .dlg-ft span.off{color:var(--brand);opacity:.4}
- .dlg-ft span.dg{color:var(--danger)}
- /* 底部面板标题行(代码 SheetFrame 的四套头):select 左标题 + 右 × / centered 居中无关闭 / centered-close 居中 + 右 × / filter 左大标题 + 右 × */
- .shd{display:flex;align-items:center;justify-content:space-between;padding:16px 18px 6px}
- .shd b{font-size:15.5px;font-weight:600}
- .shd .icn{color:var(--ink-3)}
- .shd-c{padding:16px 18px 4px;text-align:center;position:relative}
- .shd-c b{font-size:16.5px;font-weight:600}
- .shd-c .icn{position:absolute;right:18px;top:17px;color:var(--ink-3)}
- /* 单选面板的选项行(代码 SelectSheet) */
- .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)}
- .opt-row .icn{width:14px;height:14px;color:var(--brand)}
- .opt-row b{font-weight:400;color:var(--ink-1)}
- .opt-row.sel b{font-weight:600}
- .opt-row:last-child{border-bottom:0}
- /* 叠在另一层弹窗之上的第二层遮罩 */
- .scrim.top2{z-index:45}
- /* 列表尾的文字入口(历史票据 > 等) */
- .listfoot{display:flex;justify-content:center;align-items:center;gap:3px;padding:12px 0;font-size:13px;color:var(--brand)}
- .listfoot .icn{width:13px;height:13px}
- /* 分组标题(代码 Section 的标题:12 / ink3,上 16 下 8) */
- .gtitle{padding:16px 16px 8px}
- /* 转圈(代码 ProgressRing,下拉刷新 / 上拉加载 / 检索在搜共用) */
- @keyframes hh-spin{from{transform:rotate(-90deg)}to{transform:rotate(270deg)}}
- .ring{width:16px;height:16px;position:relative;flex:none;display:inline-block}
- .ring>svg{width:100%;height:100%;transform:rotate(-90deg);display:block}
- .ring .trk{fill:none;stroke:var(--line-2);stroke-width:2.8}
- .ring .bar{fill:none;stroke:var(--brand);stroke-width:2.8;stroke-linecap:round}
- .spin{animation:hh-spin .9s linear infinite}
- .ring.lg{width:24px;height:24px}
- .ring.lg .trk,.ring.lg .bar{stroke-width:2.2}
- /* 空态(代码 EmptyState):整页 120×104 / sm 72×62 / row 30×26 三档,插画取色走 --il-* */
- .emptyslot{flex:1;display:flex;align-items:center;justify-content:center;padding:0 0 204px}
- .emptybox{--il-a:#E7EDF6;--il-b:#D8E0EC;--il-c:#F8FAFE;display:flex;flex-direction:column;align-items:center;text-align:center;padding:0 32px}
- [data-theme="dark"] .emptybox{--il-a:#1F2A45;--il-b:#161F38;--il-c:#28355A}
- .emptybox .illu{width:120px;height:104px;display:block}
- .emptybox .etxt{margin-top:16px;font-size:14px;color:var(--ink-3);letter-spacing:.1em}
- .emptybox .esub{margin-top:8px;font-size:12px;line-height:1.65;color:var(--ink-4);max-width:236px}
- .emptybox .eact{margin-top:20px}
- .emptybox.sm{padding:26px 20px}
- .emptybox.sm .illu{width:72px;height:62px}
- .emptybox.sm .etxt{margin-top:11px;font-size:12.5px;letter-spacing:.08em}
- .emptybox.row{flex-direction:row;align-items:center;justify-content:center;gap:10px;padding:9px 0}
- .emptybox.row .illu{width:30px;height:26px}
- .emptybox.row .etxt{margin-top:0;font-size:12.5px;letter-spacing:.06em}
- /* 状态点「已提交」档(代码 StatusSemantic submitted:未报 / 待报 / 待审批):品牌色空心 */
- .st.sub{color:var(--brand)}
- .st.sub i{background:transparent;border:1.6px solid currentColor}
- /* ---- 持仓卡片(代码 PositionCard)与通用表格(代码 DataTable) ---- */
- /* 持仓卡片:多枚角标并排;有角标时顶部只让到 15;估值后的币种小一号 */
- .pos .corners{position:absolute;left:0;top:0;display:flex;z-index:3}
- .pos .corners .corner{position:static}
- .pos:has(.corners) .pos-hd{padding-top:2px}
- .pos-val b small{font-size:13.5px;font-weight:400;color:var(--ink-2)}
- .pos-code b{font-weight:400;color:var(--accent)}
- /* 信息格五项一行:整行按宽度降档 12.5 / 11.5 / 10.5,最小档仍放不下时成对的值拆成两行(i) */
- .pos-grid.f5{display:flex;flex-wrap:wrap;column-gap:6px;row-gap:10px}
- .pos-grid.f5>div{flex:1 0 auto}
- .pos-grid.f5 div span{font-size:10px;letter-spacing:.02em}
- .pos-grid.f5 div b{font-size:12.5px;font-weight:500}
- .pos-grid.f5 div b em{font-size:11px;font-weight:400}
- .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}
- .pos-grid.f5.s115 div b{font-size:11.5px}.pos-grid.f5.s115 div b em{font-size:10px}
- .pos-grid.f5.s105 div b{font-size:10.5px}.pos-grid.f5.s105 div b em{font-size:9px}
- .pos-ops span.pri,.pos-ops span.hot{font-weight:500}
- /* 表格模式(DataTable):表头 36 / 行 52、单元格 12、列距 14,前两列冻结带右投影 */
- .ptab{background:var(--surface);overflow:hidden}
- .ptab .r{display:flex;align-items:stretch;height:52px;border-bottom:1px solid var(--line);font-size:12px;white-space:nowrap}
- .ptab .r.h{height:36px;background:var(--surface-2);font-size:10.5px;letter-spacing:.02em;color:var(--ink-3)}
- .ptab .fz,.ptab .sc{display:flex;align-items:center;gap:14px;flex:none}
- .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)}
- [data-theme="dark"] .ptab .fz{box-shadow:4px 0 10px rgba(0,0,0,.35)}
- .ptab .r.h .fz{background:var(--surface-2)}
- .ptab .c{flex:none}
- .ptab .c.n{text-align:right;font-family:var(--font-num);font-variant-numeric:tabular-nums}
- .ptab .r.h .c.n{font-family:inherit}
- .ptab .c.n .sub{display:block;font-size:11px;color:var(--ink-3);margin-top:2px}
- .ptab .cat b{display:block;font-size:12px;font-weight:600}
- .ptab .cat b.db{color:var(--accent)}
- .ptab .cat .mbs{display:flex;gap:3px;margin-top:3px}
- .ptab .scd b{display:block;font-size:12px;font-weight:400}
- .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}
- .ptab .scd .cmark{width:13px;height:13px;font-size:8.5px}
- .ptab .opsrow{border-bottom:1px solid var(--line)}
- .ptab .opsrow .pos-ops{border-top:0}
- .ptab .r.sel,.ptab .r.sel .fz{background:var(--brand-weak)}
- .ptab .xrow{background:var(--surface-2);border-bottom:1px solid var(--line)}
- /* ---- 卡片 / 表格切换(代码 ViewModeToggle) ---- */
- .viewtog{display:inline-flex;padding:2px;background:var(--surface-2);border-radius:8px;gap:2px;flex:none;position:relative}
- .viewtog.sep{margin-left:4px}
- .viewtog.sep::before{content:"";position:absolute;left:-7px;top:2px;bottom:2px;width:1px;background:var(--line-2)}
- .viewtog span{width:28px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:6px;color:var(--ink-3)}
- .viewtog span.on{background:var(--surface);color:var(--brand);box-shadow:var(--shadow-card)}
- [data-theme="dark"] .viewtog span.on{background:var(--surface-3)}
- .viewtog .icn{width:15px;height:15px;stroke-width:1.8}
- /* ==== v1.3 公共覆盖 END ==== */
- </style>
- </head>
- <body>
- <svg width="0" height="0" style="position:absolute" aria-hidden="true"><defs>
- <g id="i-back"><polyline points="15 4 7 12 15 20"/></g>
- <g id="i-right"><polyline points="9 4 17 12 9 20"/></g>
- <g id="i-down"><polyline points="5 9 12 16 19 9"/></g>
- <g id="i-up"><polyline points="5 15 12 8 19 15"/></g>
- <g id="i-search"><circle cx="11" cy="11" r="6.5"/><line x1="16" y1="16" x2="21" y2="21"/></g>
- <g id="i-x"><line x1="6" y1="6" x2="18" y2="18"/><line x1="18" y1="6" x2="6" y2="18"/></g>
- <g id="i-check"><polyline points="4 12.5 9.5 18 20 6"/></g>
- <g id="i-plus"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></g>
- <g id="i-minus"><line x1="5" y1="12" x2="19" y2="12"/></g>
- <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>
- <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>
- <g id="i-clock"><circle cx="12" cy="12" r="8.5"/><polyline points="12 7 12 12 15.5 14"/></g>
- <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>
- <g id="i-filter"><path d="M4 6h16l-6.2 7.4V19l-3.6-2v-3.6z"/></g>
- <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>
- <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>
- <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>
- <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>
- <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>
- <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>
- <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>
- <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>
- <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>
- <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>
- <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>
- <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>
- <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>
- <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>
- <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>
- <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>
- <g id="i-fee"><circle cx="12" cy="12" r="8.5"/><path d="M9.5 9h5M9.5 12h5M12 9v8"/></g>
- <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>
- <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>
- <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>
- <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>
- <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>
- <g id="i-sort"><polyline points="7 9 10 6 13 9"/><polyline points="7 15 10 18 13 15"/></g>
- <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>
- <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>
- <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>
- <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>
- <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>
- <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>
- <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>
- </defs></svg>
- <div class="sheet-head">
- <div class="brandmark">
- <div class="glyph"></div>
- <div>
- <div class="sheet-title">登录 · 启动与双重认证</div>
- <div class="sheet-sub">票据投资者 APP / 启动页 · 账号密码登录 · 新设备短信双重认证 · 开户入口管控</div>
- </div>
- </div>
- <div class="head-right">
- <div class="meta">
- <div>模块<b>登录 LOGIN</b></div>
- <div>规格<b>iOS 390 × 844 @3x</b></div>
- <div>主题<b>深空蓝 Light / Dark</b></div>
- <div>版本<b>v1.3 · 2026-10-14</b></div>
- </div>
- <div class="skin" role="group" aria-label="主题切换">
- <button data-set="light" class="on"><svg viewBox="0 0 24 24"><use href="#i-sun"/></svg>浅色</button>
- <button data-set="dark"><svg viewBox="0 0 24 24"><use href="#i-moon"/></svg>深色</button>
- </div>
- </div>
- </div>
- <style>
- .splash{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:20px;
- background:linear-gradient(165deg,#1B4FD8 0%,#123CAE 55%,#0A2467 100%)}
- [data-theme="dark"] .splash{background:linear-gradient(165deg,#16244B 0%,#0F1A38 55%,#080D1E 100%)}
- .splash .logo{width:88px;height:88px;border-radius:24px;background:rgba(255,255,255,.14);position:relative;
- border:1px solid rgba(255,255,255,.24);backdrop-filter:blur(4px)}
- .splash .logo::before{content:"";position:absolute;inset:24px 22px;border:2.4px solid #fff;border-radius:3px;border-bottom-width:7px}
- .splash .logo::after{content:"";position:absolute;right:16px;top:16px;width:12px;height:12px;border-radius:50%;background:var(--accent)}
- .splash h1{color:#fff;font-size:23px;font-weight:600;letter-spacing:.3em;text-indent:.3em}
- .splash .by{position:absolute;bottom:52px;color:rgba(255,255,255,.55);font-size:11.5px;letter-spacing:.14em}
- .icons{display:flex;gap:26px;justify-content:center;padding:26px 0}
- .appicon{text-align:center}
- .appicon i{display:block;width:66px;height:66px;border-radius:16px;position:relative;margin-bottom:9px;
- background:linear-gradient(150deg,#1B4FD8,#0A2467);box-shadow:0 6px 16px rgba(10,36,103,.34)}
- .appicon i::before{content:"";position:absolute;inset:19px 17px;border:2px solid #fff;border-radius:2px;border-bottom-width:5px}
- .appicon i::after{content:"";position:absolute;right:12px;top:12px;width:9px;height:9px;border-radius:50%;background:#F0A93B}
- .appicon.g2 i{background:linear-gradient(150deg,#0B5C43,#053427)}
- .appicon.g3 i{background:linear-gradient(150deg,#7A2231,#3E0F19)}
- .appicon span{font-size:11.5px;color:var(--ink-2)}
- .otp{display:flex;gap:9px;justify-content:center;margin-top:4px}
- .otp b{width:44px;height:52px;border-radius:11px;border:1px solid var(--line-2);background:var(--surface-2);
- display:flex;align-items:center;justify-content:center;font-size:23px;font-weight:600;font-variant-numeric:tabular-nums}
- .otp b.on{border-color:var(--brand);background:var(--brand-weak);color:var(--brand)}
- .otp b.cur{border-color:var(--brand);background:var(--surface);color:var(--ink-1)}
- .otp b.err{border-color:var(--danger);background:var(--danger-weak);color:var(--danger)}
- </style>
- <div class="sec">
- <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>
- <div class="cards">
- <div class="card-x">
- <h4>状态 STATUS</h4>
- <div class="bullets">
- <li><b>受信设备</b>:账密通过直接进首页(票据 → 询价)</li>
- <li><b>新设备</b>:账密通过 → 安全验证弹窗(验证码已下发)</li>
- <li><b>校验失败</b>:后端 <code>msg</code> 原样 Toast(统一「用户名或密码不正确」)</li>
- <li><b>回前台</b>:超过解锁时长 → 开了生物识别进锁定页(B2),否则回登录页</li>
- </div>
- </div>
- <div class="card-x">
- <h4>组件 COMPONENT</h4>
- <div class="bullets">
- <li><b>顶部</b>:左语言入口、右帮助(后台没配问题时隐藏)</li>
- <li><b>账号框</b>:有历史账号时回填最近一次并出下拉</li>
- <li><b>密码框</b>:眼睛切换明文;两格均限 50 字符</li>
- <li><b>验证码</b>:6 格,输满点「确认」才校验,错误就地红字</li>
- </div>
- </div>
- <div class="card-x">
- <h4>约束 RULES</h4>
- <div class="kv">
- <div class="r"><span>验证码</span><b>6 位;单码最多校验 5 次</b></div>
- <div class="r"><span>重新获取</span><b>60 秒冷却,「重新获取(59)」</b></div>
- <div class="r"><span>发送频次</span><b>15 分钟 5 次,超出 429 Toast</b></div>
- <div class="r"><span>手机号脱敏</span><b>后端 phone_mask 原样</b></div>
- <div class="r"><span>申请开户</span><b>本期不渲染</b></div>
- <div class="r"><span>品牌</span><b>机构档案驱动(当前:泓衍票据)</b></div>
- </div>
- </div>
- </div>
- </div>
- <div class="sec">
- <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>
- <div class="frames">
- <!-- ===== L1 启动页 · 品牌标识 ===== -->
- <div class="frame">
- <div class="phone" data-lock data-theme="light">
- <div class="screen">
- <div class="bsplash">
- <img class="lg" src="assets/brand/honmatrix-icon.png" alt="">
- <div class="nm">泓衍票据</div>
-
- <div class="lic">泓衍证券(香港)有限公司 持牌法团</div>
- </div>
- <div class="homebar"></div>
- </div>
- </div>
- <div class="cap">
- <div class="cap-num">L1</div>
- <div class="cap-title">启动页 · 品牌标识</div>
- <ul>
- <li>冷启动首帧与原生启动屏<b>逐像素一致</b>:品牌纯色底 + 正中 Logo(机构 <code>icon.png</code>,76);随后 300ms 淡入渐变、应用名与持牌信息</li>
- <li>Logo 独占屏幕正中,应用名在 Logo 下方 20(与 v1.2「Logo 与应用名整组居中」不同);持牌信息距底 52</li>
- <li>应用名、持牌信息、Logo 都取机构档案(当前机构:泓衍票据);<b>启动页固定浅色主题</b>(深色下也是品牌蓝)</li>
- </ul>
- </div>
- </div>
- <!-- ===== L2 登录 · 默认态 ===== -->
- <div class="frame">
- <div class="phone">
- <div class="screen">
- <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>
- <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>
- <div class="body lgbody">
- <img class="mark" src="assets/brand/honmatrix-icon.png" alt="">
- <h1>欢迎回来</h1>
- <div class="sub">登录后查看您的票据持仓与询价</div>
- <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>
- <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>
- <div class="btn wide off">登录</div>
- </div>
- <div class="lgfoot">登录即代表您已阅读并同意<b>《用户协议》</b>与<b>《隐私政策》</b></div>
- <div class="homebar"></div>
- </div>
- </div>
- <div class="cap">
- <div class="cap-num">L2</div>
- <div class="cap-title">登录 · 默认态</div>
- <ul>
- <li>左上「地球 + 当前语言」进语言弹层(<code>07</code> L4 / L5),右上问号进帮助中心(后台没配问题时不渲染);Logo 用机构图标(56,圆角按 16/56)</li>
- <li>账号 / 密码两格,暗提示「输入账号」「登录密码」;任一为空「登录」置灰;超 50 字符 Toast「最长输入50个字符」</li>
- <li><b>【申请开户】本期不渲染</b>(开户见 L7);底部协议句的两份文档本期点了 Toast「未接入内容」</li>
- </ul>
- </div>
- </div>
- <!-- ===== L3 历史账号 · 下拉 ===== -->
- <div class="frame">
- <div class="phone">
- <div class="screen">
- <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>
- <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>
- <div class="body lgbody">
- <img class="mark" src="assets/brand/honmatrix-icon.png" alt="">
- <h1>欢迎回来</h1>
- <div class="sub">登录后查看您的票据持仓与询价</div>
- <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>
- <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>
- <div class="btn wide off">登录</div>
- </div>
- <div class="lgfoot">登录即代表您已阅读并同意<b>《用户协议》</b>与<b>《隐私政策》</b></div>
- <div class="homebar"></div>
- </div>
- </div>
- <div class="cap">
- <div class="cap-num">L3</div>
- <div class="cap-title">历史账号 · 下拉</div>
- <ul>
- <li>登录成功过的账号记在本机:再次进入回填最近一次,账号框右侧出下拉箭头,展开列出历史账号,点选回填</li>
- <li>密码不缓存;App 内没有清历史账号的入口(登出不清)</li>
- </ul>
- </div>
- </div>
- <!-- ===== L4 登录失败 · Toast ===== -->
- <div class="frame">
- <div class="phone">
- <div class="screen">
- <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>
- <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>
- <div class="body lgbody">
- <img class="mark" src="assets/brand/honmatrix-icon.png" alt="">
- <h1>欢迎回来</h1>
- <div class="sub">登录后查看您的票据持仓与询价</div>
- <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>
- <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>
- <div class="btn wide">登录</div>
- </div>
- <div class="lgfoot">登录即代表您已阅读并同意<b>《用户协议》</b>与<b>《隐私政策》</b></div>
- <div class="toast" style="top:76%">用户名或密码不正确</div>
- <div class="homebar"></div>
- </div>
- </div>
- <div class="cap">
- <div class="cap-num">L4</div>
- <div class="cap-title">登录失败 · Toast</div>
- <ul>
- <li>用户不存在 / 已销户 / 密码错误统一「用户名或密码不正确」(后端 <code>msg</code> 原样),密码框转危险描边</li>
- <li>其他拦截(账户停用等)后端下发文案,客户端原样 Toast</li>
- </ul>
- </div>
- </div>
- <!-- ===== L5 新设备 · 安全验证 ===== -->
- <div class="frame">
- <div class="phone">
- <div class="screen">
- <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>
- <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>
- <div class="body lgbody">
- <img class="mark" src="assets/brand/honmatrix-icon.png" alt="">
- <h1>欢迎回来</h1>
- <div class="sub">登录后查看您的票据持仓与询价</div>
- <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>
- <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>
- <div class="btn wide">登录</div>
- </div>
- <div class="lgfoot">登录即代表您已阅读并同意<b>《用户协议》</b>与<b>《隐私政策》</b></div>
- <div class="scrim">
- <div class="dlg">
- <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>
- <p class="dsc">检测到您使用<b>新设备</b>登录,为确保本人操作,验证码已发送至 <span class="mono" style="color:var(--ink-1)">(+86) 13*******65</span>,请输入验证:</p></div>
- <div class="otp6"><b class="c">|</b><b></b><b></b><b></b><b></b><b></b></div>
-
- <div class="resend">重新获取(58)</div>
- <div class="dlg-btns" style="padding:18px"><span class="btn ghost">取消</span><span class="btn off">确认</span></div>
- </div>
- </div>
- <div class="homebar"></div>
- </div>
- </div>
- <div class="cap">
- <div class="cap-num">L5</div>
- <div class="cap-title">新设备 · 安全验证</div>
- <ul>
- <li>新设备登录时弹出,验证码已自动下发;正文照原型一整段:「检测到您使用<b>新设备</b>登录,为确保本人操作,验证码已发送至 (+86) 13*******65,请输入验证:」</li>
- <li>6 格独立输入位,已填格品牌描边,当前格带光标;输满 6 位「确认」才可点(不自动提交)</li>
- <li>「重新获取(59)」半角括号倒计时,结束后变可点;取消关窗、不建会话</li>
- </ul>
- </div>
- </div>
- <!-- ===== L6 验证异常 · 就地红字 ===== -->
- <div class="frame">
- <div class="phone">
- <div class="screen">
- <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>
- <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>
- <div class="body lgbody">
- <img class="mark" src="assets/brand/honmatrix-icon.png" alt="">
- <h1>欢迎回来</h1>
- <div class="sub">登录后查看您的票据持仓与询价</div>
- <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>
- <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>
- <div class="btn wide">登录</div>
- </div>
- <div class="lgfoot">登录即代表您已阅读并同意<b>《用户协议》</b>与<b>《隐私政策》</b></div>
- <div class="scrim">
- <div class="dlg">
- <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>
- <p class="dsc">检测到您使用<b>新设备</b>登录,为确保本人操作,验证码已发送至 <span class="mono" style="color:var(--ink-1)">(+86) 13*******65</span>,请输入验证:</p></div>
- <div class="otp6 err"><b>8</b><b>3</b><b>1</b><b>2</b><b>7</b><b>4</b></div>
- <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>
- <div class="resend" style="margin-top:10px">重新获取(56)</div>
- <div class="dlg-btns" style="padding:18px"><span class="btn ghost">取消</span><span class="btn off">确认</span></div>
- </div>
- </div>
- <div class="homebar"></div>
- </div>
- </div>
- <div class="cap">
- <div class="cap-num">L6</div>
- <div class="cap-title">验证异常 · 就地红字</div>
- <ul>
- <li>校验失败:图标圆转危险色、6 格红描边红底,下方红字(后端 <code>msg</code>):验证码错误 / 验证码已过期 / 验证码校验次数过多,请重新获取验证码</li>
- <li>改任一格即清除错误态;15 分钟内发送超 5 次后端回 429「获取频繁,请稍后再试!」→ Toast</li>
- </ul>
- </div>
- </div>
- <!-- ===== L7 开户防重 · 拦截弹窗 ===== -->
- <div class="frame">
- <div class="phone">
- <div class="screen">
- <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>
- <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>
- <div class="body lgbody">
- <img class="mark" src="assets/brand/honmatrix-icon.png" alt="">
- <h1>欢迎回来</h1>
- <div class="sub">登录后查看您的票据持仓与询价</div>
- <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>
- <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>
- <div class="btn wide">登录</div>
- </div>
- <div class="lgfoot">登录即代表您已阅读并同意<b>《用户协议》</b>与<b>《隐私政策》</b></div>
- <div class="scrim">
- <div class="dlg">
- <div class="dlg-hd" style="padding-bottom:0"><h3 style="font-size:15px;line-height:1.6;font-weight:500">您已有票据账号ceshi01,可直接前往登录。</h3></div>
-
- <div class="dlg-ft single"><span>我知道了</span></div>
- </div>
- </div>
- <div class="homebar"></div>
- </div>
- </div>
- <div class="cap">
- <div class="cap-num">L7</div>
- <div class="cap-title">开户防重 · 拦截弹窗<span class="cap-flags"><span class="cap-flag off">本期未上线</span></span></div>
- <ul>
- <li>登录页【申请开户】本期不渲染;开放后点入口先做防重检查,命中弹此窗(与开户页前置拦截同一句)</li>
- <li>防重接口本期没有:真实网关占位,入口开放前不可达</li>
- </ul>
- </div>
- </div>
- <!-- ===== L8 多机构定制 · 机构档案 ===== -->
- <div class="frame">
- <div class="phone">
- <div class="screen">
- <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>
- <div class="navbar"><span class="bk"><svg class="icn" viewBox="0 0 24 24"><use href="#i-back"/></svg></span><h2>多机构打包规范</h2></div>
- <div class="body">
- <div class="gtitle">桌面图标与应用名</div>
- <div class="brandcard"><img src="assets/brand/honmatrix-icon.png" alt=""><span>泓衍票据</span></div>
- <div class="gtitle">机构档案 brands/honmatrix/brand.json</div>
- <div class="card" style="margin:0 16px">
- <div class="frow"><span>applicationId</span><b class="m" style="font-family:var(--font-mono);font-size:12px">com.honmatrixi.notes</b></div>
- <div class="frow"><span>应用名(简 / 繁 / 英)</span><b style="font-size:12.5px">泓衍票据 · 泓衍票據 · HONMATRIX Notes</b></div>
- <div class="frow"><span>启动页</span><b style="font-size:12.5px">#1B4FD8 底 · icon.png 76</b></div>
- <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>
- <div class="frow"><span>默认皮肤</span><b>跟随系统</b></div>
- <div class="frow last"><span>自主开户 allowSelfOnboarding</span><b>是(本期入口不渲染)</b></div>
- </div>
- </div>
- <div class="homebar"></div>
- </div>
- </div>
- <div class="cap">
- <div class="cap-num">L8</div>
- <div class="cap-title">多机构定制 · 机构档案</div>
- <ul>
- <li>换机构 = 新增一份机构档案(应用名三语、持牌信息、Logo、品牌色、启动页、打包身份),代码里不出现机构专名</li>
- <li>品牌色在机构调色板里覆盖基线(当前唯一机构 honmatrix 与深空蓝基线同色);Logo 同一张图用于桌面图标、启动页与登录页</li>
- <li>这是规范示意帧,不对应 App 页面</li>
- </ul>
- </div>
- </div>
- </div>
- </div>
- <div class="sec">
- <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>
- <div class="cards">
- <div class="card-x">
- <h4>链路 FLOW</h4>
- <div class="bullets">
- <li><b>失焦即遮罩</b>:与时长无关,回前台立刻撤</li>
- <li><b>离开 ≤ 解锁时长</b>:直接回到原页面</li>
- <li><b>离开 > 解锁时长</b>:开了生物识别 → 锁定页(B2);没开 → 回登录页</li>
- <li><b>解锁时长「从不」</b>:不计时,遮罩照常</li>
- </div>
- </div>
- </div>
- <div class="frames" style="margin-top:28px">
- <!-- ===== B1 后台隐私遮罩 · 多任务截图态 ===== -->
- <div class="frame">
- <div class="phone">
- <div class="screen">
- <div class="bsplash">
- <img class="lg" src="assets/brand/honmatrix-icon.png" alt="">
- <div class="nm">泓衍票据</div>
- <div class="mchip"><svg class="icn" viewBox="0 0 24 24"><use href="#i-lock"/></svg>账户信息已隐藏</div>
- <div class="lic">泓衍证券(香港)有限公司 持牌法团</div>
- </div>
- <div class="homebar"></div>
- </div>
- </div>
- <div class="cap">
- <div class="cap-num">B1</div>
- <div class="cap-title">后台隐私遮罩 · 多任务截图态<span class="cap-flags"><span class="cap-flag plat">仅 APP</span></span></div>
- <ul>
- <li>App 失焦即盖上不透明品牌盖板(不用模糊),视觉复用启动页并加「账户信息已隐藏」胶囊(距底 100);回前台立刻撤</li>
- <li>深色主题下盖板用深色渐变;生产包另开防截屏 / 录屏(Android <code>FLAG_SECURE</code>、iOS 黑屏)</li>
- </ul>
- </div>
- </div>
- <!-- ===== B2 生物解锁 · 待验证 ===== -->
- <div class="frame">
- <div class="phone">
- <div class="screen">
- <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>
- <div class="lock">
- <span class="swa">切换账号</span>
- <div class="av"><svg class="icn" viewBox="0 0 24 24"><use href="#i-user"/></svg></div>
- <div class="acct">cesh****01</div>
- <div class="org">示例销售机构</div>
- <div class="why"><svg class="icn" viewBox="0 0 24 24"><use href="#i-clock"/></svg>离开超过 30 分钟,需重新验证</div>
- <div class="bio"><svg class="icn" viewBox="0 0 24 24"><use href="#i-faceid"/></svg></div>
- <div class="tip">使用面容 ID 解锁</div>
- <div class="ft"><b>使用密码登录</b><span>泓衍证券(香港)有限公司 持牌法团</span></div>
- </div>
- <div class="homebar"></div>
- </div>
- </div>
- <div class="cap">
- <div class="cap-num">B2</div>
- <div class="cap-title">生物解锁 · 待验证<span class="cap-flags"><span class="cap-flag plat">仅 APP</span></span></div>
- <ul>
- <li>离开超过解锁时长且开了生物识别时进入:只露脱敏账号(前 4 后 2)与机构名,不放输入框;进页即自动唤起系统验证,大图标可点重触发</li>
- <li>原因胶囊「离开超过 30 分钟,需重新验证」;底部常驻「使用密码登录」与持牌信息;右上「切换账号」= 完整登出</li>
- </ul>
- </div>
- </div>
- <!-- ===== B3 生物解锁 · 验证失败 ===== -->
- <div class="frame">
- <div class="phone">
- <div class="screen">
- <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>
- <div class="lock">
- <span class="swa">切换账号</span>
- <div class="av"><svg class="icn" viewBox="0 0 24 24"><use href="#i-user"/></svg></div>
- <div class="acct">cesh****01</div>
- <div class="org">示例销售机构</div>
- <div class="why"><svg class="icn" viewBox="0 0 24 24"><use href="#i-clock"/></svg>离开超过 30 分钟,需重新验证</div>
- <div class="bio bad"><svg class="icn" viewBox="0 0 24 24"><use href="#i-faceid"/></svg></div>
- <div class="tip bad">面容 ID 不匹配</div>
- <div class="rem">还可尝试 2 次,用尽后需密码登录</div>
- <div class="retry"><svg class="icn" viewBox="0 0 24 24"><use href="#i-refresh"/></svg>点按重试</div>
- <div class="ft"><b>使用密码登录</b><span>泓衍证券(香港)有限公司 持牌法团</span></div>
- </div>
- <div class="homebar"></div>
- </div>
- </div>
- <div class="cap">
- <div class="cap-num">B3</div>
- <div class="cap-title">生物解锁 · 验证失败<span class="cap-flags"><span class="cap-flag plat">仅 APP</span></span></div>
- <ul>
- <li>只换色不换版:图标底与文案转危险色,报剩余次数「还可尝试 2 次,用尽后需密码登录」,「点按重试」显式触发</li>
- <li>用户取消、系统打断不计失败次数</li>
- </ul>
- </div>
- </div>
- <!-- ===== B4 生物解锁停用 · 回退密码 ===== -->
- <div class="frame">
- <div class="phone">
- <div class="screen">
- <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>
- <div class="lock faded">
- <span class="swa">切换账号</span>
- <div class="av"><svg class="icn" viewBox="0 0 24 24"><use href="#i-user"/></svg></div>
- <div class="acct">cesh****01</div>
- <div class="org">示例销售机构</div>
- <div class="why"><svg class="icn" viewBox="0 0 24 24"><use href="#i-clock"/></svg>离开超过 30 分钟,需重新验证</div>
- <div class="bio bad"><svg class="icn" viewBox="0 0 24 24"><use href="#i-faceid"/></svg></div>
- <div class="tip bad">面容 ID 不匹配</div>
- <div class="rem">还可尝试 2 次,用尽后需密码登录</div>
- <div class="retry"><svg class="icn" viewBox="0 0 24 24"><use href="#i-refresh"/></svg>点按重试</div>
- <div class="ft"><b>使用密码登录</b><span>泓衍证券(香港)有限公司 持牌法团</span></div>
- </div>
- <div class="scrim">
- <div class="dlg">
- <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>
- <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>
- <div class="dlg-ft single"><span>使用密码登录</span></div>
- </div>
- </div>
- <div class="homebar"></div>
- </div>
- </div>
- <div class="cap">
- <div class="cap-num">B4</div>
- <div class="cap-title">生物解锁停用 · 回退密码<span class="cap-flags"><span class="cap-flag plat">仅 APP</span></span></div>
- <ul>
- <li>连续 3 次失败弹出:恢复路径写进正文,单按钮「使用密码登录」直落登录页,遮罩与返回键都关不掉</li>
- <li>只停本次会话、不改设置项;生物特征变更时 Toast「生物识别信息已变更,请重新登录后再开启」</li>
- </ul>
- </div>
- </div>
- <!-- ===== B5 指纹解锁 · Android 系统面板 ===== -->
- <div class="frame">
- <div class="phone">
- <div class="screen">
- <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>
- <div class="lock">
- <span class="swa">切换账号</span>
- <div class="av"><svg class="icn" viewBox="0 0 24 24"><use href="#i-user"/></svg></div>
- <div class="acct">cesh****01</div>
- <div class="org">示例销售机构</div>
- <div class="why"><svg class="icn" viewBox="0 0 24 24"><use href="#i-clock"/></svg>离开超过 30 分钟,需重新验证</div>
- <div class="bio"><svg class="icn" viewBox="0 0 24 24"><use href="#i-touchid"/></svg></div>
- <div class="tip">使用指纹解锁</div>
- <div class="ft"><b>使用密码登录</b><span>泓衍证券(香港)有限公司 持牌法团</span></div>
- </div>
- <div class="scrim bottom" style="z-index:40"></div>
- <div class="bprompt">
- <h4>验证身份以继续访问泓衍票据</h4>
- <svg class="fp icn" viewBox="0 0 24 24"><use href="#i-touchid"/></svg>
- <div class="bhint">请触摸指纹传感器</div>
- <span class="neg">取消</span>
- </div>
- <div class="homebar"></div>
- </div>
- </div>
- <div class="cap">
- <div class="cap-num">B5</div>
- <div class="cap-title">指纹解锁 · Android 系统面板<span class="cap-flags"><span class="cap-flag plat">仅 Android</span></span></div>
- <ul>
- <li>系统 BiometricPrompt 渲染(示意):App 只给标题「验证身份以继续访问泓衍票据」,按钮是系统的「取消」</li>
- <li>取消后留在解锁页,可再点图标唤起,或点「使用密码登录」</li>
- </ul>
- </div>
- </div>
- </div>
- </div>
- <div class="sec" style="margin-bottom:20px">
- <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>
- <table class="spec">
- <tr><th style="width:44px">#</th><th style="width:210px">节点</th><th style="width:190px">分支</th><th>结果与文案</th></tr>
- <tr><td class="m">1</td><td><b>输入账号及密码</b></td><td>超 50 字符</td><td>Toast「最长输入50个字符」</td></tr>
- <tr><td class="m">2</td><td><b>账密校验</b></td><td>不通过</td><td>Toast「用户名或密码不正确」</td></tr>
- <tr><td class="m">3</td><td><b>设备检查</b></td><td>受信设备</td><td class="m" style="color:var(--ok)">登录成功 → 票据 Tab</td></tr>
- <tr><td class="m">4</td><td><b>设备检查</b></td><td>新设备</td><td>弹「安全验证」,验证码已下发</td></tr>
- <tr><td class="m">5</td><td><b>验证码校验</b></td><td>错误 / 过期 / 次数过多</td><td>就地红字:验证码错误 · 验证码已过期 · 验证码校验次数过多,请重新获取验证码</td></tr>
- <tr><td class="m">6</td><td><b>验证通过</b></td><td>—</td><td class="m" style="color:var(--ok)">设备记为受信 → 登录成功</td></tr>
- <tr><td class="m">✕</td><td><b>中途取消</b></td><td>—</td><td>不建会话、设备不入库,下次仍需验证</td></tr>
- </table>
- </div>
- <script>
- (function(){
- var root=document.documentElement,btns=document.querySelectorAll('.skin button');
- document.querySelectorAll('[data-clone]').forEach(function(el){
- var src=document.querySelector(el.getAttribute('data-clone'));
- if(src) el.innerHTML=src.innerHTML;
- });
- function set(t){
- root.setAttribute('data-theme',t);
- btns.forEach(function(b){b.classList.toggle('on',b.dataset.set===t)});
- document.querySelectorAll('.phone:not([data-lock])').forEach(function(p){p.setAttribute('data-theme',t)});
- try{localStorage.setItem('hh-skin',t)}catch(e){}
- }
- btns.forEach(function(b){b.addEventListener('click',function(){set(b.dataset.set)})});
- document.body.setAttribute('data-h',String(document.body.scrollHeight));
- var hash=(location.hash||'').replace('#','');
- var saved=null;try{saved=localStorage.getItem('hh-skin')}catch(e){}
- set(hash==='dark'||hash==='light'?hash:(saved||'light'));
- })();
- </script>
- </body>
- </html>
|