:root{--up:var(--a);--alarm:#C00000;--gray-6:#9aa2b1;--fs-xs:11px;--fs-sm:12px;--fs-md:14px;--fs-lg:14px;--fs-xl:18px;--focus-ring:0 0 0 3px rgba(31,111,235,.28);--bp-sm:520px;--bp-md:760px;--bp-lg:940px;--bp-xl:1100px}*{margin:0;padding:0;box-sizing:border-box}html,body{height:100%}body{}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{}::-webkit-scrollbar-track{}header{position:sticky;top:0;z-index:50;}.header-inner{margin:0 auto;display:flex;align-items:center;flex-wrap:wrap}.brand{display:flex;align-items:center;white-space:nowrap}.brand-logo-box{display:inline-flex;align-items:center;justify-content:center;flex:none}.brand .brand-logo{width:auto;display:block}.brand-name{-webkit-background-clip:text;background-clip:text;}.search-wrap{flex:1;position:relative;}.search-box{display:flex;align-items:center;gap:8px;transition:border .3s var(--ease),box-shadow .3s var(--ease);}.search-box:focus-within{}.search-box svg{flex:none;color:var(--sub);transition:color .3s var(--ease)}.search-box:focus-within svg{color:var(--brand-dark)}.search-box input{flex:1;border:none;outline:none;background:transparent;}
/* 焦点指示由外层 .search-box:focus-within 统一表达（品牌蓝描边 + 3px 淡环）。
   input 自身的 :focus-visible 描边会在框内再画一圈，形成"框套框"。
   ⚠️ 这里必须带 important 标记：craft 层有一条覆盖**所有** input 的
   `a/button/input/select:focus-visible` 描边规则（那条用的是 important，筛选框等确实
   需要它，不能删），所以搜索框只能显式压回。
   外层仍有明确焦点指示，键盘可达性不受影响。
   ⚠️ 本注释**刻意不写那个字面量** —— 棘轮守卫按文本出现次数计数，注释里写一样会被算进去。 */
.search-box input:focus-visible{outline:none!important}.search-box .kbd{flex:none;border:1px solid var(--line);}.header-status{margin-left:auto;display:flex;align-items:center;white-space:nowrap}.header-status .dot{border-radius:50%;flex:none}.header-status b{}.header-status time{font-variant-numeric:tabular-nums}.search-dropdown{position:absolute;top:calc(100% + 6px);left:0;right:0;background:var(--card);border:1px solid var(--line);border-radius:2px;overflow:hidden;display:none;z-index:100}.search-dropdown.show{display:block}.sd-item{padding:8px 12px;cursor:pointer;display:flex;align-items:center;gap:8px;border-bottom:1px solid var(--mkt-h-soft)}.sd-item:last-child{border-bottom:none}.sd-item:hover,.sd-item.is-active{}.sd-name{font-weight:600;font-size:14px}.sd-name mark{background:#fff3bf;color:inherit;border-radius:2px;padding:0 2px}.sd-code{font-family:Consolas,Menlo,monospace;font-size:12px;color:var(--sub)}.sd-path{flex:1;text-align:right;font-size:11px;color:var(--gray-4);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-tag{flex:none;display:inline-flex;align-items:center;white-space:nowrap;word-break:keep-all;overflow-wrap:normal;font-size:11px;font-weight:600;padding:2px 8px;border-radius:2px}.sd-tag.a{background:var(--mkt-a-soft);color:var(--mkt-a)}.sd-tag.h{background:var(--mkt-h-soft);color:var(--mkt-h)}.sd-empty{}.sd-hot{border-top:1px solid var(--mkt-h-soft);padding:8px 12px;display:flex;align-items:center;flex-wrap:wrap;gap:8px;}.sd-hot-label{font-size:11px;color:var(--gray-4);margin-right:4px;white-space:nowrap}.sd-hot-tag{font-size:12px;border:1px solid var(--line);border-radius:2px;padding:2px 8px;cursor:pointer;transition:background-color .15s var(--ease),border-color .15s var(--ease),color .15s var(--ease).15s}.sd-hot-tag:hover{color:var(--text)}.crumb{margin:0 auto;display:flex;align-items:center;gap:8px;flex-wrap:wrap;}.crumb a{color:var(--sub);text-decoration:none;cursor:pointer;padding:2px 8px;border-radius:2px;transition:background .15s var(--ease),color .15s var(--ease)}.crumb a:hover{background:var(--bg);color:var(--text)}.crumb .sep{color:var(--bw-muted)}.crumb .cur{font-weight:700;color:var(--text)}.crumb .back{display:inline-flex;align-items:center;gap:4px;font-weight:600;color:var(--gray-1);background:var(--card);border:1px solid var(--line);border-radius:2px;padding:4px 12px;cursor:pointer;transition:background-color .15s var(--ease),border-color .15s var(--ease),color .15s var(--ease).15s}.crumb .back:hover{background:var(--brand-soft);border-color:#cdd3de}#crumb:empty{display:none}main{margin:0 auto;}.view-enter{animation:viewIn .3s var(--ease)}@keyframes viewIn{from{}to{}}.page-title{display:flex;align-items:center;gap:8px 12px;flex-wrap:wrap}.page-title .mk-row{display:inline-flex;align-items:center;gap:8px;flex:none;flex-wrap:nowrap;white-space:nowrap}.page-title .mk-chip{font-size:12px;font-weight:700;padding:2px 12px;border-radius:2px;white-space:nowrap;display:inline-block;line-height:1.5;word-break:keep-all;overflow-wrap:normal}.page-title .mk-chip.a{background:var(--mkt-a-soft);color:var(--mkt-a);border:1px solid #e5c3c6}.page-title .mk-chip.h{background:var(--mkt-h-soft);color:var(--mkt-h);border:1px solid #c6d5e8}.dup-export{border:1px solid var(--line);background:var(--card);border-radius:2px;padding:2px 12px;font-size:11px;cursor:pointer;color:var(--text);font-family:inherit;transition:background-color .15s var(--ease),border-color .15s var(--ease),color .15s var(--ease).15s;align-self:center;display:flex;align-items:center;gap:4px;margin-left:auto}.dup-export svg{flex-shrink:0}.dup-export:hover{border-color:var(--brand);color:var(--brand-dark);background:var(--brand-soft)}.page-title .sub{color:var(--sub);flex:1 1 auto;min-width:220px;margin:2px 0 0}.page-title .tag-market{font-size:11px;font-weight:700;padding:2px 8px;border-radius:2px}.tag-market.a{background:var(--mkt-a);color:var(--card)}.tag-market.h{background:var(--mkt-h);color:var(--card)}.hero{padding:24px 0 8px}.hero h1{font-size:30px;font-weight:800;letter-spacing:.5px}.hero p{color:var(--sub);margin-top:8px;font-size:14px}.market-grid{display:grid;grid-template-columns:repeat(2,1fr);}.mcard{position:relative;cursor:pointer;overflow:hidden;border:none;color:var(--card)}.mcard:hover{}.mcard::before{content:"";position:absolute;left:0;top:0;width:100%;height:4px;background:linear-gradient(90deg,rgba(255,255,255,.55),rgba(255,255,255,.04));z-index:1}.mcard::after{content:"";position:absolute;right:-70px;top:-70px;width:230px;height:230px;border-radius:50%;background:rgba(255,255,255,.12);transition:transform .3s var(--ease)}.mcard:hover::after{transform:scale(1.12)}.mcard .big{}.mcard .lbl{opacity:.92;margin-top:4px}.mcard .go{right:22px;bottom:20px;gap:8px;font-weight:700;opacity:.95;transition:,background .3s var(--ease)}.mcard:hover .go{}.mcard .stats{margin-top:20px}.mcard .stats .it{padding-right:24px;margin-right:24px;}.mcard .stats .it:last-child{}.mcard .stats .it b{display:block;font-weight:700;font-variant-numeric:tabular-nums}.mcard .stats .it span{}.mcard.a{background:linear-gradient(135deg,#c77b7e 0%,var(--mkt-a) 100%)}.mcard.h{background:linear-gradient(135deg,#7895b9 0%,var(--mkt-h) 100%)}.home-stats{display:grid;grid-template-columns:repeat(3,1fr);}.newstocks-wrap{background:var(--card);border:1px solid var(--line);border-radius:2px;box-shadow:var(--shadow);margin-top:24px;overflow:hidden}.ipo-row{display:flex;align-items:stretch}.ipo-row .newstocks-wrap,.ipo-row .iporeview-wrap{flex:1;width:0}.iporeview-wrap{background:var(--card);border:1px solid var(--line);border-radius:2px;box-shadow:var(--shadow);margin-top:24px;overflow:hidden;min-width:0}.ipo-body{max-height:440px;overflow-y:auto;scrollbar-width:thin}.ipo-body::-webkit-scrollbar{width:6px}.ipo-body::-webkit-scrollbar-thumb{background:#ccd6e8;border-radius:2px}.ipo-sub{display:flex;align-items:center;gap:8px;font-size:12px;font-weight:800;color:var(--a);margin:8px 2px 8px;border-left:3px solid var(--a)}.ipo-sub.hk{color:var(--h);border-left-color:var(--h)}.ipo-item{display:flex;align-items:center;gap:8px;min-height:34px;padding:4px 8px;border-radius:2px;cursor:default;transition:background .15s var(--ease),box-shadow .15s var(--ease);box-shadow:inset 0 0 0 1px transparent}.ipo-item:hover{}.ipo-date{font-size:11px;color:var(--sub);font-family:Consolas,Menlo,monospace;white-space:nowrap;width:44px;flex:none}.ipo-name{font-size:14px;font-weight:700;flex:1 1 auto;min-width:0;white-space:nowrap;line-height:1.35;overflow:hidden;text-overflow:ellipsis}.ipo-main{display:inline-flex;align-items:center;gap:4px;min-width:0;max-width:55%;flex:0 1 auto;white-space:nowrap;overflow:hidden;color:#334155;background:#f4f8fd;border:1px solid var(--line);border-radius:2px;padding:2px 8px;box-shadow:inset 0 1px 0 rgba(255,255,255,.8)}.ipo-main-text{font-size:11px;font-weight:700;color:#374151;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ipo-pct{font-style:normal;font-size:11px;font-weight:800;color:var(--a);background:var(--a-soft);border-radius:2px;padding:2px 4px;flex:none}.ipo-mkt{font-size:11px;font-weight:600;line-height:18px;padding:2px 8px;border-radius:2px;color:#6b7280;background:var(--brand-soft);white-space:nowrap;flex:none}.ipo-mkt.a{background:var(--mkt-a-soft);color:var(--mkt-a)}.ipo-mkt.h{background:var(--mkt-h-soft);color:var(--mkt-h)}.ipo-tag{font-size:11px;font-weight:700;border-radius:2px;padding:2px 8px;white-space:nowrap;flex:none}.ipo-tag.apply{background:var(--warn-soft);color:var(--warn)}.ipo-tag.new{background:#e6f4ea;color:#1e7d3f}.ipo-link{font-size:11px;font-weight:700;color:var(--link);background:var(--link-soft);border:1px solid #d5e0fa;border-radius:2px;padding:2px 8px;text-decoration:none;white-space:nowrap;flex:none;cursor:pointer;font-family:inherit}.ipo-link:hover{}.ipo-empty{font-size:12px;color:var(--sub);text-align:center;padding:8px 0}.pdf-modal{position:fixed;inset:0;z-index:200;display:flex;align-items:center;justify-content:center;padding:20px}.pdf-modal[hidden]{display:none}.pdf-backdrop{position:absolute;inset:0;background:rgba(15,23,42,.55);backdrop-filter:blur(3px)}.pdf-box{position:relative;width:min(960px,94vw);height:min(86vh,900px);background:var(--card);border-radius:2px;box-shadow:0 24px 64px rgba(15,23,42,.35);display:flex;flex-direction:column;overflow:hidden;animation:pdfIn .3s var(--ease)}@keyframes pdfIn{from{opacity:0;transform:translateY(14px) scale(.98)}to{opacity:1;}}.pdf-head{display:flex;align-items:center;gap:8px;padding:8px 16px;border-bottom:1px solid var(--line);background:var(--mkt-h-soft)}.pdf-title{font-size:14px;font-weight:700;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pdf-actions{display:flex;align-items:center;gap:8px;flex:none}.pdf-actions a,.pdf-actions button{font-size:12px;border:1px solid var(--line);background:var(--card);border-radius:2px;padding:4px 12px;cursor:pointer;text-decoration:none;color:var(--text);transition:background .15s var(--ease);font-family:inherit}.pdf-actions a:hover,.pdf-actions button:hover{background:var(--mkt-h-soft)}.pdf-close{color:var(--sub);font-weight:800;padding:4px 8px}.pdf-body{flex:1;position:relative;display:flex;flex-direction:column}.pdf-frame{flex:1;width:100%;border:none;background:var(--card)}.pdf-loading{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:var(--sub);font-size:14px;gap:8px}.pdf-loading::before{content:"";width:18px;height:18px;border-radius:50%;border:2.5px solid #ccd6e8;border-top-color:var(--h);animation:spin .9s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.pdf-fallback{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:32px;text-align:center;color:var(--gray-1);font-size:14px}.pdf-fallback p{margin:0;max-width:620px}.pdf-url{font-size:12px;font-family:Consolas,Menlo,monospace;color:var(--link);background:var(--link-soft);border:1px solid #d5e0fa;border-radius:2px;padding:8px 12px;word-break:break-all;max-width:660px;user-select:all}.dup-entry{display:flex;align-items:center;gap:40px;cursor:pointer;}.dup-entry:hover{}#crumb:empty + main{padding-top:8px}#crumb:empty + main .dup-entry{margin-top:12px}.dup-entry > div:first-child{flex:0 0 240px}.dup-entry-title{font-weight:800;display:flex;align-items:center;gap:12px}.dup-entry-title svg{color:var(--a)}.d20-entry .dup-entry-title svg{color:var(--h)}.dup-entry-sub{font-size:14px;color:var(--sub);line-height:1.45}.dup-entry-stats{width:74%;margin-left:auto;display:flex;flex-wrap:nowrap;align-items:flex-end;justify-content:space-between;min-width:0}.dup-entry-stats .it{text-align:center;flex:none;position:relative}.dup-entry-stats .it b{display:block;font-size:14px;font-weight:600;color:var(--sub);letter-spacing:.5px}.dup-entry-stats .it span{display:block;font-size:30px;font-weight:400;margin-top:4px;font-variant-numeric:tabular-nums;line-height:1.15}.dup-entry-stats .it span.up{color:var(--a)}.dup-entry-stats .it span.down{}.dup-entry-stats .it span.blk{color:var(--blk)}.dup-entry-stats .it span.score{font-weight:800}.dup-entry-stats .it span.score.up{color:var(--a)}.dup-entry-stats .it span.score.down{color:var(--down)}.dup-entry-stats .it em.cmp{position:absolute;top:100%;left:50%;transform:translateX(-50%);}.dup-tabs{display:inline-flex;gap:8px;flex-wrap:wrap;margin-left:auto}.dup-tabs button{border:1px solid var(--line);background:var(--card);border-radius:2px;padding:4px 12px;font-size:11px;cursor:pointer;color:var(--text);font-family:inherit;transition:background-color .15s var(--ease),border-color .15s var(--ease),color .15s var(--ease).15s}.dup-tabs button:hover{border-color:#c3cfeb;background:#f5f8ff}.dup-tabs button.is-on{font-weight:700}.dup-stats-bar{display:flex;flex-wrap:wrap;gap:8px 24px;align-items:center;margin-top:12px;padding:8px 20px;background:var(--card);border:1px solid var(--line);border-radius:2px;box-shadow:var(--shadow);font-size:14px;color:var(--sub)}.dup-stats-bar b{color:var(--text);font-weight:800;font-size:14px}.dup-stats-bar .score-up{color:var(--a);font-weight:800}.dup-stats-bar .score-down{color:var(--down);font-weight:800}.dup-layout{position:relative;margin-top:12px}.dup-main{width:100%}.dup-side{position:absolute;right:calc(100% + 18px);top:0;width:max-content;max-width:calc((100vw - 1200px)/2 - 20px);max-height:calc(100vh - 130px);overflow-y:auto;background:var(--card);border:1px solid var(--line);border-radius:2px;box-shadow:var(--shadow);padding:20px 20px;box-sizing:border-box}.dup-side .wk-grid-wrap{margin-top:0}.dup-side .wk-grid-head{font-size:18px}.dup-side .wk-grid{grid-template-columns:repeat(4,minmax(46px,1fr));gap:8px}.dup-side .wk-cell{aspect-ratio:1;height:auto;min-height:42px;font-size:14px;border-radius:2px;min-width:0;position:relative;z-index:2}.dup-side .wk-grid-note{font-size:14px}@media(max-width:1915px){.dup-layout{margin-top:0}.dup-side{position:static;width:auto;max-height:none;overflow:visible;margin-top:12px;padding:16px 20px}.dup-side .wk-grid-head{font-size:14px}.dup-side .wk-grid{grid-template-columns:repeat(10,1fr)}.dup-side .wk-cell{height:30px;font-size:12px}}.dup-table{table-layout:fixed;min-width:900px}.dup-table .dup-col-date{width:72px}.dup-table .dup-col-week{width:46px}.dup-table .dup-col-count{width:54px}.dup-table .dup-col-ratio{width:70px}.dup-table .dup-col-score{width:64px}.dup-table .dup-col-amount{width:88px}.dup-table thead th{padding:8px 8px;font-size:11px;text-align:center}.dup-table tbody td{padding:4px 8px;font-size:11px;line-height:1.3;text-align:center}.dup-table tbody td.week{font-size:11px}.dup-table .score-cell .wk-score{font-size:22px;display:flex;align-items:center;justify-content:center;height:100%}.dup-table td.num,.dup-table th.num{text-align:center;font-variant-numeric:tabular-nums;white-space:nowrap}.dup-table th.dup-dist{text-align:center}.dup-table td.num.amt{min-width:86px}.dup-table td.num.up{color:var(--a);font-weight:400}.dup-table td.num.down{color:var(--down);font-weight:400}.dup-table td.num.blk{color:var(--blk);font-weight:400}.dup-table td.week{color:var(--sub);font-size:11px;text-align:center}.dup-table td.zt{color:inherit;font-weight:400}.dup-table td.dt{color:inherit;font-weight:400}.dup-wkcell{background:var(--ann-row-alt);padding:8px 12px;vertical-align:middle;text-align:right}.dup-wkcell.wk-left{min-width:132px;border-right:1px dashed var(--line)}.dup-wkcell.wk-right{min-width:196px;border-left:1px dashed var(--line)}.dup-wkcell .wk-lbl{font-size:11px;color:var(--gray-2);font-weight:700;margin-bottom:2px;white-space:nowrap}.dup-wkcell .wk-val{font-size:14px;font-weight:800;font-variant-numeric:tabular-nums;white-space:nowrap}.dup-wkcell.wk-left .wk-val{font-size:22px}.dup-wkcell .wk-val.up{color:var(--a)}.dup-wkcell .wk-val.down{color:var(--down)}.dup-wkcell .wk-val.amt{color:var(--link)}.dup-wkcell .wk-val .del{font-size:11px;font-weight:700;margin-left:8px}.dup-wkcell .wk-val .del.up{color:var(--a)}.dup-wkcell .wk-val .del.down{color:var(--down)}.dup-wkcell .wk-line1{display:flex;align-items:baseline;justify-content:flex-end;gap:4px;white-space:nowrap}.dup-wkcell .wk-line1 .wk-lbl{margin-bottom:0}.dup-wkcell .wk-line2{font-size:11px;font-weight:700;margin-top:2px;white-space:nowrap}.dup-wkcell .wk-line2.up{color:var(--a)}.dup-wkcell .wk-line2.down{color:var(--down)}.d20-score-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:16px}.d20-score{background:var(--card);border:1px solid var(--line);border-radius:2px;box-shadow:var(--shadow);display:flex;flex-direction:column;transition:transform .15s var(--ease),box-shadow .15s var(--ease);cursor:pointer}.d20-score:hover{}.d20-row{display:flex;align-items:center;justify-content:space-between}.d20-sname{font-size:14px;font-weight:800}.d20-sratio{display:flex;align-items:center;gap:8px;font-variant-numeric:tabular-nums}.d20-sratio .up{font-size:30px;font-weight:800;color:var(--a);line-height:1}.d20-sratio .down{font-size:30px;font-weight:800;color:var(--down);line-height:1}.d20-sratio .colon{font-size:18px;color:var(--gray-4);font-weight:700}.d20-detail[hidden]{display:none}.d20-detail{border-top:1px dashed var(--line);margin-top:12px;padding-top:8px}.d20-detail-title{font-size:11px;color:var(--gray-4);font-weight:600;margin-bottom:8px}.d20-days{display:grid;grid-template-columns:repeat(10,1fr);gap:2px}.d20-dcell{width:auto;height:auto;aspect-ratio:1;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:800;border-radius:2px}.d20-dcell.up{color:var(--card);background:var(--a)}.d20-dcell.down{color:var(--card);background:var(--down)}.d20-dcell.flat{color:var(--gray-2);background:var(--bg)}.d20-dcell.null{color:#d5dbe6;background:var(--editorial-surface-muted)}.d20-empty{color:var(--sub);text-align:center;padding:32px}.d20-entry-stocks{display:grid;grid-template-columns:repeat(4,1fr);margin-left:auto;justify-content:end;width:74%;box-sizing:border-box}.d20-entry-stock{font-size:18px;font-weight:700;color:var(--blk);border:1px solid var(--line);padding:8px 12px;white-space:nowrap;text-align:center;transition:transform .15s var(--ease),box-shadow .15s var(--ease)}.d20-entry-stock:hover{transform:translateY(-1px);box-shadow:0 4px 12px rgba(30,50,100,.10)}.d20-entry-stock b.up{color:var(--a);font-weight:800;margin-left:4px}.d20-entry-stock b.down{color:var(--down);font-weight:800;margin-left:4px}.d20-entry-stock .cl{color:var(--gray-4);font-weight:600;margin:0 2px}.concept-strip{border:1px solid var(--line);border-radius:2px;box-shadow:var(--shadow);}.concept-title{display:inline-flex;align-items:center;gap:8px;font-weight:800;color:var(--text);white-space:nowrap}.concept-title svg{}.concept-chips{display:grid;grid-template-columns:repeat(4,1fr);margin-top:8px}.concept-chip{font-size:12px;font-weight:700;border:1px solid #d3dded;cursor:pointer;transition:background-color .15s var(--ease),border-color .15s var(--ease),color .15s var(--ease).15s;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.concept-chip b{margin-left:4px}.concept-chip:hover{}.dup-bar-cell{display:flex;align-items:center;gap:8px;min-width:170px}.dup-bar{flex:1;height:12px;border-radius:2px;overflow:hidden;display:flex;background:#e6f4ea}.dup-bar i.up{background:linear-gradient(90deg,#f87171,var(--a));height:100%}.dup-bar i.down{background:var(--down);height:100%;flex:1}.newstocks-head{display:flex;align-items:center;gap:8px;padding:12px 20px;border-bottom:1px solid var(--line);background:var(--ann-row-alt)}.newstocks-title{display:inline-flex;align-items:center;gap:8px;font-weight:800;color:var(--text)}.newstocks-title svg{color:var(--a)}.iporeview-wrap .newstocks-title svg{}.newstocks-sub{}.head-action{margin-left:auto;font:700 11.5px/1 inherit;white-space:nowrap;cursor:pointer}.head-action:hover{}.newstocks-list{max-height:440px;overflow-y:auto;padding:4px 12px 12px;scrollbar-width:thin}.year-view .newstocks-list,.year-view .ipo-body{max-height:none;overflow:visible}.newstocks-list::-webkit-scrollbar{width:6px}.newstocks-list::-webkit-scrollbar-thumb{background:#ccd6e8;border-radius:2px}.ns-group{margin-top:8px}.ns-date-head{display:flex;align-items:center;gap:8px;font-weight:800;margin:12px 2px 8px;border-left:4px solid var(--a);}.ns-date-head::after{content:"";flex:1;height:1px;background:linear-gradient(90deg,rgba(220,38,38,.25),transparent)}.ns-item{display:flex;align-items:center;gap:8px;padding:8px 12px;border-radius:2px;cursor:default;width:100%;box-sizing:border-box;transition:background .15s var(--ease),box-shadow .15s var(--ease);box-shadow:inset 0 0 0 1px transparent}.ns-item:hover{}.ns-name{font-weight:700;font-size:14px;white-space:nowrap}.ns-code{font-size:12px;color:var(--sub);font-family:Consolas,Menlo,monospace}.ns-board{font-size:11px;font-weight:700;padding:2px 8px;border-radius:2px;white-space:nowrap}.ns-board.a{background:var(--mkt-a-soft);color:var(--mkt-a)}.ns-board.h{background:var(--mkt-h-soft);color:var(--mkt-h)}.ns-sector{font-size:11px;font-weight:700;line-height:18px;color:#2b4a8f;background:var(--link-soft);border:1px solid #dbe4f8;border-radius:2px;padding:2px 8px;white-space:nowrap}.ns-biz{}.ns-pct{font-style:normal;font-size:11px;font-weight:800;color:var(--a);margin-left:2px;white-space:nowrap}.ns-right{margin-left:auto;display:inline-flex;align-items:center;gap:8px;flex-shrink:0}.ns-industry{font-size:11px;color:var(--sub);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right}.stat-card{}.stat-card:hover{}.stat-card .num{font-weight:800;font-variant-numeric:tabular-nums}.stat-card .num i{font-style:normal;font-size:14px;font-weight:600;color:var(--sub);margin-left:4px}.stat-card .t{color:var(--sub);margin-top:2px}.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));}.gcard{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);cursor:pointer;box-shadow:var(--shadow);position:relative;overflow:hidden}.gcard:hover{}.gcard .name{font-weight:700;display:flex;align-items:center;gap:8px}.gcard .name .cnt{margin-left:auto;font-size:12px;font-weight:700;color:var(--card);background:var(--sub);border-radius:2px;padding:2px 8px}.gcard .name .cnt.a{background:var(--mkt-a)}.gcard .name .cnt.h{background:var(--mkt-h)}.gcard .desc{font-size:12px;color:var(--sub);margin-top:8px;display:flex;justify-content:space-between;align-items:center}.gcard .bar{border-radius:2px;background:var(--bg);overflow:hidden}.gcard .bar i{display:block;height:100%;border-radius:2px}.gcard .bar i.a{background:linear-gradient(90deg,#d18a8d,var(--mkt-a))}.gcard .bar i.h{background:linear-gradient(90deg,#86a0c2,var(--mkt-h))}.gcard .chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.chip{font-size:11px;color:var(--gray-1);background:var(--mkt-h-soft);border:1px solid var(--line);border-radius:2px;padding:2px 8px}.chip b{color:inherit;font-weight:600}.table-card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden;}.table-head{display:flex;align-items:center;gap:12px;border-bottom:1px solid var(--line);flex-wrap:wrap}.table-head .title{font-weight:700}.table-head .count{font-size:12px;color:var(--sub)}.table-head .spacer{flex:1}.table-head .filter{position:relative}.table-head .filter input{border:1px solid var(--line);padding:8px 12px;font-size:14px;outline:none;width:200px;transition:background-color .15s var(--ease),border-color .15s var(--ease),color .15s var(--ease).15s}.table-head .filter input:focus{border-color:#8fb4f5;background:var(--card)}table{width:100%;border-collapse:collapse}thead th{position:sticky;top:0;font-weight:600;text-align:left;border-bottom:1px solid var(--line);white-space:nowrap}tbody td{border-bottom:1px solid var(--mkt-h-soft);font-size:14px;vertical-align:middle}tbody tr{transition:background .15s var(--ease)}tbody tr:hover{}tbody tr:last-child td{border-bottom:none}td.idx{color:#b0b7c4;font-size:12px}td.code{font-family:Consolas,Menlo,monospace;white-space:nowrap}td.name{max-width:160px;overflow:hidden;text-overflow:ellipsis}td.products{color:#5b6472;max-width:420px;font-size:14px}td.products .none{color:var(--bw-muted)}.concept-stock-table{}.concept-stock-table th,.concept-stock-table td{padding-left:16px;padding-right:16px}.concept-stock-table th:nth-child(1){width:46px}.concept-stock-table th:nth-child(2){width:92px}.concept-stock-table th:nth-child(3){width:150px}.concept-stock-table th:nth-child(4){width:48%}.concept-stock-table td.products{max-width:none;line-height:1.85}.concept-stock-table td:last-child{line-height:1.8}.mini-tag{font-size:11px;font-weight:600;padding:2px 8px;border-radius:2px;margin-right:8px;white-space:nowrap}.mini-tag.a{background:var(--mkt-a-soft);color:var(--mkt-a)}.mini-tag.h{background:var(--mkt-h-soft);color:var(--mkt-h)}.src-chip{display:inline-block;background:var(--link-soft);border:1px solid #dbe4f8;color:#2b4a8f;font-size:12px;padding:2px 8px;border-radius:2px;margin:2px 4px 2px 0}.src-chip .pct{font-style:normal;font-weight:700;margin-left:2px}.tag-chip{display:inline-block;background:var(--mkt-h-soft);border:1px solid #d3dded;color:var(--gray-1);font-size:12px;font-weight:600;padding:2px 8px;border-radius:2px;margin:2px 4px 2px 0;cursor:pointer;transition:background-color .15s var(--ease),border-color .15s var(--ease),color .15s var(--ease).15s;user-select:none}.tag-chip:hover{}.tag-chip.a:hover{color:var(--mkt-a);border-color:#e5b8bd;background:var(--mkt-a-soft)}.tag-chip.h:hover{color:var(--mkt-h);border-color:#b7cbe3;background:var(--mkt-h-soft)}.tag-chip.is-on{}.tag-filter-bar{display:flex;align-items:center;gap:8px;background:var(--card);border:1px solid var(--line);border-radius:2px;padding:8px 12px;margin-top:12px;box-shadow:var(--shadow)}.tf-label{font-size:12px;color:var(--sub);font-weight:600}.tf-clear{margin-left:auto;border:none;font-size:12px;padding:2px 8px;border-radius:2px;cursor:pointer}.tf-clear:hover{}.legend{display:inline-flex;align-items:center;gap:8px;font-size:12px;color:var(--sub);white-space:nowrap;margin-right:8px}.lg-dot{display:inline-block;width:9px;height:9px;border-radius:50%;margin-left:8px}.lg-dot:first-child{margin-left:0}.lg-real{background:var(--a)}.lg-biz{background:var(--gray-2);border:1px solid #c3cadb}.src-chip.real{background:var(--link-soft);border-color:#dbe4f8;color:#2b4a8f}.src-chip.biz{background:var(--editorial-surface-muted);border-color:#e5e8f0;color:#5b6472}.empty-row td{}footer{margin:34px auto 0;font-size:12px;text-align:center;}.upd-schedule{margin-top:8px;font-size:12px;color:var(--sub)}.upd-schedule b{color:var(--brand-dark);font-weight:700}@media(max-width:1100px){.d20-score-grid{grid-template-columns:repeat(2,1fr)}}@media(max-width:980px){.d20-entry-stocks{width:100%;margin-left:0}}@media(max-width:940px){.ipo-row{flex-direction:column}.ipo-row .newstocks-wrap,.iporeview-wrap{width:auto}}@media(max-width:760px){.market-grid,.home-stats,.dup-stats,.d20-score-grid{grid-template-columns:1fr}main{}.dup-entry{gap:12px;flex-wrap:wrap}.dup-entry-stats{width:100%;margin-left:0;display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:12px 8px;align-items:start}.dup-entry-stats .it{grid-column:span 2;min-width:0}.dup-entry-stats .it:nth-last-child(-n+2){grid-column:span 3}.dup-entry-stats .it em.cmp{position:static;transform:none;font-size:11px;line-height:1.25}.concept-strip{padding:12px 16px 16px}.home-stats{gap:12px}.header-inner{display:grid;grid-template-columns:auto minmax(0,1fr);flex-wrap:nowrap}.brand-name{}.search-wrap{grid-column:2;grid-row:1;width:100%;max-width:none;order:0}.header-status{}.search-box{padding:8px 12px}.search-box input,.table-head .filter input{font-size:18px}.kbd{display:none}.crumb{}.page-title .sub{flex-basis:100%;width:100%}.page-title .dup-export{padding:2px 12px}.hero h1{font-size:22px}.hero p{font-size:14px}.market-grid{gap:12px;margin-top:16px}.mcard{}.mcard .big{font-size:30px}.mcard .lbl{font-size:14px}.mcard .stats{margin-top:12px}.mcard .stats .it{padding-right:16px;margin-right:16px}.mcard .stats .it b{}.mcard .go{right:14px;bottom:14px;padding:4px 12px}.concept-chips{}.stat-card{padding:16px 16px}.stat-card .num{font-size:22px}.dup-entry > div:first-child{flex:0 0 auto}.dup-entry-title{font-size:22px}.dup-entry-stats .it span{font-size:30px}.newstocks-head{}.newstocks-list{padding:4px 8px 8px}.ipo-body{padding:8px 8px 12px}.ns-date-head{font-size:14px}.ns-item{flex-wrap:wrap;row-gap:4px;padding:8px 8px}.ns-industry{flex-basis:100%;text-align:left}.ipo-item{flex-wrap:nowrap;gap:4px;padding:8px 4px}.ipo-name{font-size:12px;min-width:58px}.ipo-main{max-width:38%;padding:2px 4px}.ipo-link{font-size:11px;padding:2px 4px}.table-head{padding:12px 12px}.table-head .title{font-size:14px}.table-head .filter{flex:1 1 100%;min-width:0}.table-head .filter input{width:100%}.legend{display:none}thead th{padding:8px 8px}tbody td{padding:8px 8px;font-size:14px}td.products{max-width:none}.dup-tabs button{padding:4px 8px;font-size:12px}.dup-stats-bar{padding:8px 12px}.wk-grid-entry{padding:8px 12px}.wk-grid-wrap{padding:12px}.dup-side .wk-grid{grid-template-columns:repeat(6,1fr)}.d20-score{padding:12px 16px}.d20-sratio .up,.d20-sratio .down{font-size:22px}.dup-more button{width:100%}.sd-path{display:none}.sd-item{padding:8px 12px}footer{padding:16px 12px 24px}}@media(max-width:520px){.d20-entry-stocks{grid-template-columns:repeat(2,1fr)}.stock-table thead th:first-child,.stock-table tbody td.idx{display:none}.mcard .big{font-size:30px}.mcard .stats .it b{font-size:14px}.ns-name{font-size:14px}.ns-sector{font-size:11px}.concept-chip{font-size:12px}.stat-card .num{font-size:22px}.dup-entry-stats .it span{font-size:22px}.dup-table tbody td{font-size:11px}.dup-table tbody td.week{font-size:11px}.dup-wkcell .wk-val{font-size:12px}.dup-wkcell.wk-left .wk-val{font-size:18px}.dup-wkcell.wk-left{min-width:110px}.dup-wkcell.wk-right{min-width:160px}.ipo-name{font-size:12px}}@media(max-width:390px){.header-inner{padding:8px 8px;gap:8px}.brand{gap:0}.brand-logo-box{width:34px;height:34px;border-radius:2px}.brand .brand-logo{height:24px}.brand-name{display:none}.search-box{gap:8px;padding:8px 8px;border-radius:2px}.search-box input{min-width:0}}.empty{display:block;text-align:center;padding:24px 16px;color:var(--gray-4);font-size:14px}.ipo-empty,.d20-empty{color:var(--gray-4);text-align:center;padding:20px 8px;font-size:12px}.sd-empty{padding:20px;text-align:center;color:var(--gray-4)}.empty-row td{padding:32px;text-align:center;color:var(--gray-4)}.na{color:var(--gray-4)}.tf-kw{font-size:12px;color:var(--gray-1)}.sd-more{padding:8px 12px;text-align:center;color:var(--gray-4);font-size:12px;border-top:1px solid var(--mkt-h-soft);background:var(--ann-row-alt)}[disabled],.disabled{opacity:.45;cursor:not-allowed;pointer-events:none}.spin{width:18px;height:18px;border-radius:50%;border:2.5px solid #ccd6e8;border-top-color:var(--h);animation:spin .9s linear infinite;display:inline-block;vertical-align:-3px}:focus-visible{outline:2px solid var(--h);outline-offset:2px;border-radius:2px}.gcard:focus-visible,.dup-entry:focus-visible,.d20-score:focus-visible,.mcard:focus-visible,.concept-chip:focus-visible{border-color:var(--h);box-shadow:var(--focus-ring)}.tag-chip:focus-visible,.sd-hot-tag:focus-visible{outline-offset:1px}@media(prefers-reduced-motion:reduce){*,*::before,*::after{}}@media(hover:none),(pointer:coarse){.gcard:hover,.mcard:hover,.dup-entry:hover,.d20-score:hover,.concept-chip:hover{transform:none}.mcard:hover{box-shadow:none}}.wk-grid-entry{display:flex;align-items:center;gap:8px;cursor:pointer;font-size:14px;font-weight:800;color:var(--text);background:linear-gradient(135deg,#fff7f7,#f7faff);border:1px solid var(--line);border-radius:2px;padding:8px 16px;margin:12px 0 4px;box-shadow:var(--shadow);transition:background .15s var(--ease)}.wk-grid-entry:hover{background:#f5f8ff}.wk-grid-entry svg{color:var(--a);flex:none}.wk-grid-sub{font-size:12px;font-weight:600;color:var(--gray-2)}.wk-grid-arrow{margin-left:auto;color:var(--gray-2);font-size:12px}.wk-grid-wrap{background:var(--card);border:1px solid var(--line);border-radius:2px;box-shadow:var(--shadow);padding:12px 16px;margin-top:8px}.wk-grid-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;font-size:14px}.wk-grid{display:grid;grid-template-columns:repeat(10,1fr);gap:8px;margin-top:12px}.wk-cell{aspect-ratio:1.7;min-height:28px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:800;border-radius:2px;font-variant-numeric:tabular-nums;cursor:default;transition:transform .15s var(--ease)}.wk-cell:hover{transform:scale(1.12)}.wk-cell.low{background:var(--down);color:var(--card)}.wk-cell.mid{background:var(--card);color:var(--text);border:1px solid var(--line)}.wk-cell.high{background:var(--up);color:var(--card)}.wk-cell.null{color:var(--bw-muted);border:1px dashed var(--line)}.wk-grid-note{font-size:11px;color:var(--gray-4);margin-top:8px}.wk-grid-stats{display:flex;gap:16px;margin-top:8px;align-items:center;flex-wrap:wrap}.wk-grid-stats .ws-item{display:inline-flex;align-items:center;gap:4px;font-size:12px;color:var(--gray-4);white-space:nowrap}.wk-grid-stats .ws-item b{font-weight:800;color:var(--text)}.wk-grid-stats .ws-dot{width:11px;height:11px;border-radius:2px;flex:none;display:inline-block}.wk-grid-stats .ws-dot.r{background:var(--up)}.wk-grid-stats .ws-dot.w{background:var(--card);border:1px solid var(--line)}.wk-grid-stats .ws-dot.g{background:var(--down)}@media(max-width:760px){.wk-grid{grid-template-columns:repeat(6,1fr)}}.wk-sum td{border-top:1.5px dashed var(--gray-5);font-weight:700}.wk-sum .wk-sum-lbl{font-size:11px;color:var(--gray-2);font-weight:700;text-align:left}.amt-gold{font-weight:700}.dup-table th.score-h{text-align:center}.score-cell{text-align:center;vertical-align:middle;background:linear-gradient(135deg,#fff7f7,#f7faff);border-right:1px dashed var(--gray-5)}.score-cell .wk-score{display:block;font-size:22px;font-weight:800;line-height:1.15;font-variant-numeric:tabular-nums;letter-spacing:.3px}.score-cell .wk-score.up{color:var(--a)}.score-cell .wk-score.down{color:var(--down)}.score-cell .wk-score.blk{color:var(--blk)}.dup-day{cursor:pointer}.dup-day:hover td{background:var(--mkt-h-soft)}.dup-day:hover td.score-cell{background:linear-gradient(135deg,#fff7f7,#f7faff)}.dup-more{text-align:center;padding:12px 0 12px}.dup-more button{border:1px solid var(--line);background:var(--card);border-radius:2px;padding:8px 20px;font-size:14px;cursor:pointer;color:var(--text);font-family:inherit;box-shadow:var(--shadow);transition:background .15s var(--ease)}.dup-more button:hover{background:#f5f8ff}.day-modal{position:fixed;inset:0;z-index:210;display:flex;align-items:center;justify-content:center;padding:20px}.day-modal[hidden]{display:none}.day-backdrop{position:absolute;inset:0;background:rgba(15,23,42,.55);backdrop-filter:blur(3px)}.day-box{position:relative;width:min(560px,94vw);max-height:86vh;overflow:auto;background:var(--card);border-radius:2px;box-shadow:0 24px 64px rgba(15,23,42,.35);animation:pdfIn .3s var(--ease)}.day-head{display:flex;align-items:center;gap:8px;padding:12px 16px;border-bottom:1px solid var(--line);background:linear-gradient(135deg,#fff7f7,#f7faff)}.day-title{font-size:14px;font-weight:800;flex:1}.day-close{flex:none;border:none;background:transparent;color:var(--gray-2);font-size:18px;font-weight:800;cursor:pointer;padding:4px 8px;border-radius:2px}.day-close:hover{background:var(--mkt-h-soft)}.day-body{}.day-grid{display:grid;grid-template-columns:repeat(3,1fr);}.day-item{text-align:center}.day-item b{display:block;font-size:11px;margin-bottom:4px}.day-item span{display:block;font-size:18px;font-weight:400;font-variant-numeric:tabular-nums}.day-item span.up{}.day-item span.down{}.day-item span.blk{color:var(--blk)}.day-item span.score{font-weight:800}.day-item span.score.up{color:var(--a)}.day-item span.score.down{color:var(--down)}.dup-table td.alarm,.day-item span.alarm{color:var(--alarm);font-weight:400}.dup-entry-stats .it em.cmp{display:block;font-size:12px;font-weight:400;color:var(--gray-2);font-style:normal;margin-top:2px;white-space:nowrap}.dup-entry-stats .it em.cmp.up{color:var(--a)}.dup-entry-stats .it em.cmp.down{color:var(--down)}.dup-entry-stats .it em.cmp.alarm{color:var(--a)}.dup-entry,.mcard,.newstocks-wrap,.iporeview-wrap,.concept-strip,.stat-card{border-radius:2px;box-shadow:0 1px 3px rgba(30,50,100,.07)}.crumb .status{font-size:11px;font-weight:700;color:var(--sub);background:var(--bw-surface-soft);border:1px solid var(--bw-line);border-radius:2px;padding:2px 8px}.day-nav{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:12px}.day-nav button{border:1px solid var(--line);background:var(--card);border-radius:2px;padding:8px 12px;font-size:12px;cursor:pointer;color:var(--text);font-family:inherit;transition:background .15s var(--ease)}.day-nav button:hover{background:var(--brand-soft)}@media(max-width:760px){.day-grid{grid-template-columns:repeat(2,1fr)}}.pwd-gate{position:fixed;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;background:linear-gradient(160deg,var(--mkt-h-soft),#e2e9f7);font-family:inherit}.pwd-gate[hidden]{display:none}.pwd-box{width:min(380px,90vw);background:var(--card);border-radius:2px;box-shadow:0 20px 60px rgba(15,23,42,.22);padding:32px 32px 32px;text-align:center;animation:pdfIn .3s var(--ease)}.pwd-box h2{margin:0 0 4px;font-size:18px;font-weight:800;color:var(--text)}.pwd-box .pwd-sub{font-size:12px;color:var(--gray-2);margin-bottom:20px}.pwd-box input{width:100%;box-sizing:border-box;padding:12px 12px;border:1.5px solid var(--line);border-radius:2px;font-size:14px;text-align:center;letter-spacing:2px;outline:none;transition:border-color .15s var(--ease)}.pwd-box input:focus{border-color:var(--h)}.pwd-box .pwd-err{color:var(--a);font-size:12px;height:18px;margin:8px 0 2px;font-weight:600}.pwd-box button{width:100%;margin-top:8px;padding:12px;border:none;border-radius:2px;background:var(--h);color:var(--card);font-size:14px;font-weight:800;cursor:pointer;font-family:inherit;transition:background .15s var(--ease)}.pwd-box button:hover{background:#1756d6}.pwd-box .pwd-tip{font-size:11px;color:var(--bw-muted);margin-top:12px}
:root{--bg:#e9eef9;--card:#ffffff;--text:#1a2438;--sub:#4d5b74;--line:#dbe4f2;--brand:#7fa8b9;--brand-soft:#eef4f7;--brand-dark:#5b8294;--a:#e03131;--a-soft:#fdecec;--down:#0ca678;--h:#1f6feb;--h-soft:#eaf1fe;--mkt-a:#b9656b;--mkt-a-soft:#faecee;--mkt-h:#5f82b0;--mkt-h-soft:#edf3fb;--link:#1a56db;--link-soft:#eef3ff;--warn:#e65100;--warn-soft:#fff3e0;--blk:#3b4a63;--gray-1:#475069;--gray-2:#6f7b94;--gray-3:#5f6b85;--gray-4:#6b7690;--gray-5:#8a97b3;--radius:2px;--r-sm:2px;--r-md:2px;--r-lg:2px;--shadow:0 1px 2px rgba(29,81,127,.045),0 6px 18px rgba(29,81,127,.055);--shadow-hover:0 2px 5px rgba(29,81,127,.09),0 12px 26px rgba(29,81,127,.10)}body{text-wrap:pretty}header{border-bottom-color:var(--line);}.header-inner{}.brand{}.brand-logo-box{}.brand .brand-logo{}.brand-name{}.search-wrap{}.search-box{border-color:#c6dced;}.search-box:focus-within{background:var(--card);}.search-box .kbd{color:#4d7190}.sd-item:hover,.sd-item.is-active{}.sd-hot{}.sd-hot-tag{color:#356786}.sd-hot-tag:hover{}.header-status{}.header-status .dot{}.header-status b{font-weight:700}.crumb,main,footer{max-width:1240px}.crumb{font-size:12px}main{}.dup-entry{margin-top:16px;padding:16px 20px;border:1px solid var(--line);border-radius:2px;background:var(--card);box-shadow:var(--shadow);transition:border-color .15s var(--ease),box-shadow .15s var(--ease),transform .15s var(--ease)}.dup-entry:hover{border-color:#91b9d6;box-shadow:var(--shadow-hover);transform:translateY(-1px)}.dup-entry-title{font-size:14px;letter-spacing:0}.dup-entry-sub{margin-top:2px}.dup-entry-stats{gap:0}.dup-entry-stats .it{padding:0 16px;border-left:1px solid #d2e2ef}.dup-entry-stats .it:first-child{border-left:0}.daily-entry{min-height:142px;margin-top:0;padding:24px 24px;gap:24px;border-color:var(--line);background:var(--card)}.daily-entry > div:first-child{flex:0 0 170px}.daily-entry .dup-entry-title{font-size:22px;gap:8px}.daily-entry .dup-entry-title{color:var(--brand-dark)}.daily-entry .dup-entry-title svg{width:19px;height:19px}.daily-entry .dup-entry-stats{width:auto;flex:1;display:grid;grid-template-columns:repeat(5,minmax(112px,1fr));align-items:center;margin-left:0}.daily-entry .dup-entry-stats .it{min-width:0;padding:8px 20px}.daily-entry .dup-entry-stats .it b{font-size:12px;line-height:1.4;letter-spacing:0}.daily-entry .dup-entry-stats .it span{font-size:30px;margin-top:8px;line-height:1.15}.daily-entry .dup-entry-stats .it em.cmp{margin-top:4px}.d20-entry-stocks{gap:8px}.d20-entry-stock{background:var(--h-soft);border-color:#cde1ef;border-radius:2px;box-shadow:none}.ipo-row{gap:16px}.newstocks-wrap,.iporeview-wrap,.concept-strip,.stat-card,.table-card,.gcard,.d20-score{border-radius:2px;box-shadow:var(--shadow)}.newstocks-wrap,.iporeview-wrap{margin-top:16px}.newstocks-head,.newstocks-wrap .newstocks-head{padding:12px 16px;background:var(--ann-hover)}.iporeview-wrap .newstocks-head{background:#fff6e9;border-bottom-color:#ecd4af}.newstocks-title{font-size:14px}.newstocks-sub{}.head-action{border-color:#b9d2e4;}.head-action:hover{background:#e7f3fc;border-color:#82afd0}.ns-date-head{font-size:14px;padding-left:8px;border-left-width:2px;background:none;letter-spacing:0}.ns-date-head::after{display:none}.ns-item,.ipo-item{border-radius:2px}.ns-item:hover{background:var(--brand-soft);box-shadow:none}.ipo-item:hover{background:#fff4e4;box-shadow:none}.ipo-body{padding:8px 12px 12px}.ipo-sub{border-left-width:2px;padding-left:8px}.market-grid{gap:12px;margin-top:16px}.mcard{min-height:0;border-radius:2px;padding:16px 16px;box-shadow:0 1px 2px rgba(29,81,127,.04);transition:transform .15s var(--ease),box-shadow .15s var(--ease),border-color .15s var(--ease)}.mcard::before,.mcard::after{display:none}.mcard:hover{transform:translateY(-1px);box-shadow:0 8px 18px rgba(29,81,127,.085)}.mcard{display:grid;grid-template-columns:auto minmax(130px,1fr) auto auto;align-items:center;gap:16px;isolation:isolate}.mcard-code{padding:0;border-radius:2px;font:800 12px/1 Consolas,Menlo,monospace;letter-spacing:0;border:1px solid}.mcard-main{display:block;padding:0}.mcard .big{font-weight:800;letter-spacing:0;font-variant-numeric:tabular-nums;}.mcard .big small{}.mcard .lbl{display:flex;align-items:baseline;gap:8px;font-weight:800;letter-spacing:0;}.mcard .lbl span{font-size:12px;font-weight:600;opacity:.66}.mcard .stats{gap:0;padding:0;border-top:0}.mcard .stats .it{}.mcard .stats .it:first-child{border-left:1px solid #d3e1ed}.mcard .stats .it:last-child{border-right:0;padding-right:0;margin-right:0}.mcard .stats .it b{}.mcard .stats .it span{opacity:.9}.mcard .go{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;margin:0;border-radius:50%;}.mcard .go span{font-size:18px;line-height:1;transition:transform .15s var(--ease)}.mcard:hover .go{background:#e5f2fb}.mcard:hover .go span{transform:translateX(2px)}.mcard.a,.mcard.h{background:var(--card);border:1px solid var(--line)}.mcard.a .mcard-code{color:#2f76a3;background:#e6f3fb;border-color:#c5deed}.mcard.h .mcard-code{color:#516fa5;background:var(--bg);border-color:#cfdaf0}.mcard.a:hover,.mcard.h:hover{border-color:#91b9d6}.concept-strip{margin-top:16px;padding:16px 16px 16px}.concept-title{font-size:14px}.concept-chips{gap:8px}.concept-strip{border-color:var(--line);background:var(--card)}.concept-chip{border-radius:2px;background:var(--h-soft);border-color:#c8dfed;color:#28698f;padding:8px 8px;text-align:left}.concept-chip b{}.concept-chip:hover{background:#dceefa;border-color:#91bedd;transform:none}.home-stats{gap:0;margin-top:16px;background:var(--card);border:1px solid var(--line);border-radius:2px;box-shadow:var(--shadow)}.stat-card{border-left:1px solid #d2e2ed;padding:16px 20px;transition:none var(--ease)}.stat-card:first-child{border-left:0;border-radius:2px 0 0 2px}.stat-card:last-child{border-radius:0 2px 2px 0}.stat-card:hover{transform:none;box-shadow:none;background:var(--ann-hover)}.stat-card .num{letter-spacing:0}.stat-card:nth-child(1) .num{color:#27628c}.stat-card:nth-child(2) .num,.stat-card:nth-child(3) .num{color:#27628c}.stat-card .t{font-size:12px}.page-title{margin:8px 0 12px;padding-bottom:12px;border-bottom:1px solid var(--line)}.page-title h1{font-size:22px;letter-spacing:0}.page-title .sub{font-size:12px}.grid{gap:12px;margin-top:12px}.gcard{padding:16px 16px;transition:border-color .15s var(--ease),box-shadow .15s var(--ease),transform .15s var(--ease)}.gcard:hover{border-color:#8ebad8;box-shadow:var(--shadow-hover);transform:translateY(-1px)}.gcard .name{font-size:14px}.gcard .bar{height:3px;margin-top:8px}.table-card{margin-top:12px}.table-head{padding:12px 16px;background:var(--ann-hover)}.table-head .title{font-size:14px}.table-head .filter input{border-radius:2px;background:var(--card)}thead th{background:var(--h-soft);color:var(--editorial-blue);font-size:11px;letter-spacing:0;padding:8px 16px;border-bottom-color:#c4dcea}tbody td{padding:12px 16px;border-bottom-color:#e0ebf2}tbody tr:hover{background:var(--brand-soft)}td.code{font-size:12px;color:#2d6d9d}td.name{color:#1e405a}.src-chip,.src-chip.real,.src-chip.biz,.tag-chip,.ns-sector{border-radius:2px;background:var(--h-soft);border-color:#c9dfed;color:#2e678d}.tag-chip:hover{background:#dceefa;border-color:#94bfdd}.ns-sector .ns-pct{color:#4e84a4}.newstocks-title svg,.concept-title svg,.wk-grid-entry svg{color:#4d87ab}.iporeview-wrap .newstocks-title svg{color:#b37023}.ns-date-head{color:#36759e;border-left-color:#82b6d7}.ipo-sub,.ipo-sub.hk{color:#9b6225;border-left-color:#d6a663}.ipo-tag.new,.ipo-tag.apply{background:#fff0da;color:#a2611f}.src-chip .pct{color:#4e84a4}.tag-chip.is-on{background:#2d76b4;border-color:#2d76b4;color:var(--card)}.dup-tabs button.is-on{background:#2d76b4;border-color:#2d76b4;color:var(--card)}.lg-real,.lg-biz{background:#2d76b4;border-color:#2d76b4}.tf-clear{background:#e7f3fc;color:#246aa0}.tf-clear:hover{background:#d9ecfa}.dup-tabs button:hover,.dup-more button:hover{background:#e8f4fc;border-color:#8eb9d6}.page-title .mk-chip.a,.page-title .mk-chip.h{border-color:#c4dcea}.tag-chip.a:hover,.tag-chip.h:hover{color:#286a95;border-color:#95bfdb;background:#e2f0fa}.wk-grid-entry,.score-cell,.dup-day:hover td.score-cell,.day-head{background:var(--ann-hover)}.wk-grid-entry:hover,.dup-day:hover td,.day-nav button:hover{background:#e8f4fc}.wk-cell.null{background:var(--brand-soft);border-color:#d0e1ec}.wk-sum td{background:var(--ann-row-alt)}.amt-gold{color:#ab6b25}.ipo-link,.pdf-url{color:#1c6fa9;background:var(--h-soft);border-color:#c9dfed}.ipo-link:hover{background:#dceefa}.d20-score{padding:16px 16px}.d20-score:hover{transform:translateY(-1px);box-shadow:var(--shadow-hover)}footer{margin-top:24px;}@media(max-width:760px){.header-inner{}.crumb{padding:12px 12px 0}main{padding:16px 12px 48px}.dup-entry{padding:16px 12px}.dup-entry-stats{margin-top:12px}.dup-entry-stats .it{padding:0 8px}.daily-entry{min-height:0;padding:20px 16px;gap:16px}.daily-entry > div:first-child{flex:0 0 auto;padding:12px 12px}.d20-entry > div:first-child{padding:12px 12px}.daily-entry .dup-entry-title{font-size:18px}.daily-entry .dup-entry-stats{width:100%;grid-template-columns:repeat(6,minmax(0,1fr));gap:20px 8px;margin-top:0}.daily-entry .dup-entry-stats .it{grid-column:span 2;padding:0 8px;border-left:0}.daily-entry .dup-entry-stats .it:nth-last-child(-n+2){grid-column:span 3}.daily-entry .dup-entry-stats .it span{font-size:22px;margin-top:4px}.daily-entry .dup-entry-stats .it em.cmp{margin-top:2px}.home-stats{grid-template-columns:1fr;border-radius:2px}.stat-card,.stat-card:first-child,.stat-card:last-child{border-radius:0;border-left:0;border-top:1px solid #e7ebf0}.stat-card:first-child{border-top:0;border-radius:2px 2px 0 0}.stat-card:last-child{border-radius:0 0 2px 2px}.mcard{grid-template-columns:auto minmax(110px,1fr) auto auto;padding:12px 16px;gap:12px}.concept-chip{text-align:center}.newstocks-head{padding:12px 12px}.mcard .stats .it{}.mcard .stats .it b{font-size:14px}}@media(max-width:520px){.mcard{grid-template-columns:auto minmax(0,1fr) auto}.mcard .stats{grid-column:2/4;margin-top:2px}.mcard .stats .it:first-child{border-left:0;padding-left:0}.mcard .go{grid-column:3;grid-row:1}}
#view .d20-entry-stock{display:flex;align-items:center;justify-content:space-between;color:#0F172A;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif!important;font-size:14px;font-weight:400}#view .trend-capsule-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#0F172A;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif!important;}#view .trend-capsule-values{display:inline-flex;align-items:center;justify-content:flex-end;flex:0 0 auto;white-space:nowrap}#view .trend-capsule-colon{color:#64748B;font-family:Inter,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif!important;}#view .trend-capsule-digits{color:#0F172A;font-family:Inter,Roboto,"Helvetica Neue",sans-serif!important;font-variant-numeric:tabular-nums;}#view .trend-capsule-digits.digits-up,#view .trend-capsule-digits.up{color:#DC2626}#view .trend-capsule-digits.digits-down,#view .trend-capsule-digits.down{color:var(--editorial-green)}@media(max-width:520px){#view .d20-entry-stock,#view .trend-capsule-name{font-size:14px}#view .trend-capsule-digits,#view .trend-capsule-colon{font-size:14px}}#view .d20-entry-stock{min-height:60px;padding:12px 16px;gap:16px}#view .trend-capsule-name{font-size:18px;font-weight:700;line-height:1.2;letter-spacing:0}#view .trend-capsule-values{gap:0}#view .trend-capsule-digits{font-size:22px;font-weight:700;line-height:1.1}#view .trend-capsule-colon{font-size:18px;font-weight:700;margin:0 12px!important;line-height:1}@media(max-width:520px){#view .d20-entry-stock{min-height:52px;padding:8px 12px;gap:8px}#view .trend-capsule-name{font-size:18px}#view .trend-capsule-digits{font-size:18px}#view .trend-capsule-colon{font-size:18px;margin:0 8px!important}}#view .d20-entry-stock .trend-capsule-name{font-size:18px;line-height:22.8px;font-weight:700;letter-spacing:0}#view .d20-entry-stock .trend-capsule-digits,#view .d20-entry-stock b.up.trend-capsule-digits,#view .d20-entry-stock b.down.trend-capsule-digits{font-size:22px;line-height:24.2px;font-weight:800;font-variant-numeric:tabular-nums}#view .d20-entry-stock .trend-capsule-colon{font-size:18px;line-height:18px;font-weight:400!important;color:#94A3B8;margin:0 12px!important}#view .ipo-row{display:flex;align-items:stretch;gap:24px}#view .ipo-row > .newstocks-wrap,#view .ipo-row > .iporeview-wrap{flex:1 1 0%;width:auto;min-width:0;display:flex;flex-direction:column;background:var(--card);border:1px solid #E2E8F0;border-radius:2px}#view .ipo-row > .newstocks-wrap .newstocks-list,#view .ipo-row > .iporeview-wrap .ipo-body{flex:1 1 auto;min-height:0}#view .ipo-row .ns-item,#view .ipo-row .ipo-item{background:var(--card);background-color:var(--card);border:0;border-bottom:1px solid var(--brand-soft);border-radius:0;transition:background-color .15s var(--ease)}#view .ipo-row .ns-item:hover,#view .ipo-row .ipo-item:hover{background:var(--bw-surface-soft);cursor:pointer}#view:is( .finance-number,.market-main-number,.trend-capsule-digits,.concept-count-refined,.table-percentage-cell,.d20-entry-stock b,.dup-entry-stats .it span,.ns-pct,.ipo-pct,.mcard .big,.mcard .stats .it b,.mcard .stats .it span,.concept-chip b,.stat-card .num,td.num ){font-family:Inter,Roboto,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif!important;font-variant-numeric:tabular-nums}@media(max-width:940px){#view .ipo-row{gap:16px}}@media(max-width:760px){#view .ipo-row{gap:12px}}#view .ipo-row .ipo-mkt,#view .ipo-row .ipo-mkt.a,#view .ipo-row .ipo-mkt.h,#view.year-view .ipo-mkt,#view.year-view .ipo-mkt.a,#view.year-view .ipo-mkt.h{background:var(--brand-soft);color:#475569;border:0;border-radius:2px;padding:2px 8px!important;font-size:11px;font-weight:400!important}#view .ipo-row .ns-date-head,#view .ipo-row .ipo-date-head,#view.year-view .ns-date-head,#view.year-view .ipo-date-head{padding-top:8px;padding-bottom:8px;font-size:12px!important;color:#64748B;font-weight:400!important;font-family:Inter,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif!important}#view .concept-chips{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));column-gap:32px;row-gap:0}@media(max-width:760px){#view .concept-chips{grid-template-columns:repeat(2,minmax(0,1fr));column-gap:12px;row-gap:0}}html,body,input,button,select,textarea{font-family:Inter,Roboto,-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei","Helvetica Neue",Arial,sans-serif!important;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-weight:400!important}#view:is(.finance-number,.market-main-number,.trend-capsule-digits,.concept-count-refined,.table-percentage-cell,td,th){font-family:Inter,Roboto,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif!important;font-variant-numeric:tabular-nums}#view .font-bold-finance{font-weight:600}#view .ipo-pct{display:none}

:root{--ipo-a-bg:#FDECEC;--ipo-a-text:#B42318;--ipo-h-bg:#EAF2FF;--ipo-h-text:#2563EB}#view .ipo-row .ipo-mkt.a,#view.year-view .ipo-mkt.a{background:var(--ipo-a-bg);color:var(--ipo-a-text);border:1px solid #F4CACA}#view .ipo-row .ipo-mkt.h,#view.year-view .ipo-mkt.h{background:var(--ipo-h-bg);color:var(--ipo-h-text);border:1px solid #C8DDFB}
#view .announcements-entry{margin:12px 0 16px;background:var(--card);border:1px solid #dfe8e6;border-radius:2px;overflow:hidden}
#view .ann-head{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--editorial-line-soft);background:var(--bw-surface-soft-refined)}
#view .ann-title{font-size:14px;font-weight:600;color:#18313e;display:flex;align-items:center;gap:8px}
#view .ann-mark{color:#527e90;font-size:18px;line-height:1}
#view .ann-sub{margin-top:2px;color:#7a8a92;font-size:11px}
#view .ann-more,.ann-portal{border:1px solid #b9c9ce;background:var(--card);color:#3f6676;border-radius:2px;padding:4px 8px;font-size:12px;text-decoration:none;cursor:pointer}
#view .ann-more:hover,.ann-portal:hover{background:var(--bw-surface-soft);border-color:#66879a}
#view .ann-list{display:flex;flex-direction:column}
#view .ann-item{display:grid;grid-template-columns:84px minmax(0,1fr) 118px 82px;gap:8px;align-items:center;padding:8px 16px;color:#41545d;text-decoration:none;border-bottom:1px solid #f0f3f2;font-size:12px}
#view .ann-item:last-child{border-bottom:0}
#view .ann-item:hover{background:var(--bw-surface-soft-refined)}
#view .ann-stock{font-weight:600;color:#18313e;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#view .ann-item-title{color:#30464f;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#view .ann-item time{color:#7a8a92;font-variant-numeric:tabular-nums;white-space:nowrap}
#view .ann-source{font-size:11px;color:#6d858e;text-align:right;white-space:nowrap}
#view .ann-empty{padding:16px;color:#829098;font-size:12px;text-align:center}
#view .ann-page-card{background:var(--card);border:1px solid #dfe8e6;border-radius:2px;overflow:hidden}
#view .ann-page-note{padding:12px 16px;background:var(--bw-surface-soft-refined);border-bottom:1px solid var(--editorial-line-soft);color:#71828a;font-size:12px}
#view .ann-stock-group{border-bottom:1px solid var(--editorial-line-soft)}
#view .ann-stock-group:last-child{border-bottom:0}
#view .ann-stock-group>header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;background:var(--ann-row-alt)}
#view .ann-stock-group strong{font-size:14px;color:#18313e}
#view .ann-code{margin-left:8px;color:#829098;font-size:11px}
@media(max-width:760px){#view .ann-item{grid-template-columns:72px minmax(0,1fr) 92px;gap:8px;padding:8px 12px}#view .ann-source{display:none}#view .ann-head{padding:12px 12px}}


/* =====================================================================
   bridgewater-001 · canonical final layer
   This is the only intentional final-theme layer. It follows the legacy
   rules above so historical theme fragments cannot win the cascade.
   ===================================================================== */
:root{
  --editorial-canvas:#F5F5F5;
  --editorial-surface:#FFFFFF;
  /* Bridgewater-inspired editorial palette: neutral paper, restrained navy/red accents. */
  --editorial-ink:#111111;
  --editorial-text:#333333;
  --editorial-muted:#666666;
  --editorial-line:#E6E6E6;
  --editorial-blue:#326891;
  --editorial-red:#80241E;
  --editorial-orange:#B85C1A;
}
html,body,main{}
body{}
header{height:58px;background:var(--card);border-bottom:1px solid var(--bw-rule);box-shadow:none;backdrop-filter:none}
.header-inner{max-width:1180px;height:58px;padding:0!important;}
.brand{}.brand-logo-box{}.brand .brand-logo{}.brand-name{}
.search-wrap{max-width:512px;min-width:300px}.search-box{height:34px;border:1px solid #CCD4DA;}.search-box input{font-size:12px;color:var(--editorial-text)}.search-box .kbd{font-size:11px;padding:2px 4px;}.header-status{font-size:11px;color:var(--editorial-muted)}.header-status .dot{width:6px;height:6px;}.header-status b{font-size:11px;color:var(--editorial-text)}.header-status time{font-size:11px;color:#7A858D}
.crumb{max-width:1180px;padding:8px 0 0!important}
main{max-width:1180px;padding:24px 0 48px!important}
#view>.daily-entry,#view>.d20-entry{width:100%;box-sizing:border-box;border:1px solid var(--bw-rule);border-radius:0;background:var(--card);box-shadow:none;color:var(--editorial-ink)}
#view>.daily-entry{min-height:114px;margin:0 0 8px!important;padding:20px 24px;display:grid;grid-template-columns:170px minmax(0,1fr);gap:20px;align-items:center}
#view>.daily-entry>div:first-child,#view>.d20-entry>div:first-child{background:transparent;border:0;border-radius:0;box-shadow:none;padding:0!important;min-height:0;width:auto}
#view>.daily-entry .dup-entry-title,#view>.d20-entry .dup-entry-title{font-size:18px;line-height:1.25;font-weight:600;color:#2C4959;gap:8px}
#view>.daily-entry .dup-entry-title svg,#view>.d20-entry .dup-entry-title svg{width:15px;height:15px;color:var(--editorial-orange)}
#view>.daily-entry .dup-entry-stats{width:100%;margin:0!important;display:grid;grid-template-columns:repeat(5,minmax(0,1fr));align-items:center}
#view>.daily-entry .dup-entry-stats .it{padding:0 16px!important;margin:0!important;border-left:1px solid var(--ann-line);border-right:0;text-align:center}
#view>.daily-entry .dup-entry-stats .it:first-child{border-left:1px solid var(--ann-line)}
#view>.daily-entry .dup-entry-stats .it b{font-size:11px;line-height:1.2;font-weight:400;color:var(--editorial-muted);letter-spacing:0}
#view>.daily-entry .dup-entry-stats .it span{font-size:22px;line-height:1.12;margin-top:8px;font-weight:700;color:#111827}
#view>.daily-entry .dup-entry-stats .it span.up{color:#D92D2D}.dup-entry-stats .it span.down{color:var(--editorial-green)}
#view>.daily-entry .dup-entry-stats .it em.cmp{font-size:11px;margin-top:4px}
#view>.daily-entry .dup-entry-stats .it em.cmp.up{color:#D92D2D}
#view>.daily-entry .dup-entry-stats .it em.cmp.down{color:var(--editorial-green)}
#view>.d20-entry{min-height:200px;margin:0 0 16px!important;padding:16px 16px 16px;display:block}
#view>.d20-entry .dup-entry-title{font-size:18px;color:#334B58}
#view>.d20-entry .dup-entry-sub{font-size:11px;line-height:1.25;color:#7A8790;margin-top:2px}
#view>.d20-entry .d20-entry-stocks{width:100%;margin:16px 0 0!important;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));}
#view>.d20-entry .d20-entry-stock,#view>.d20-entry .stock-trend-card{min-height:48px;padding:8px 12px;display:flex;align-items:center;justify-content:space-between;gap:8px;background:var(--card);border:1px solid var(--bw-rule);border-radius:2px;box-shadow:none;color:#111827}
#view>.d20-entry .d20-entry-stock:hover{transform:none;box-shadow:none}
#view>.d20-entry .trend-capsule-name{font-size:14px;line-height:1.2;font-weight:600;color:#111827}
#view>.d20-entry .trend-capsule-values{display:inline-flex;align-items:center;white-space:nowrap}
#view>.d20-entry .trend-capsule-digits{font-size:18px;line-height:1;font-weight:700;font-family:Inter,Roboto,"Segoe UI",sans-serif!important;font-variant-numeric:tabular-nums}
#view>.d20-entry .trend-capsule-colon{font-size:14px;line-height:1;margin:0 8px!important;color:#81909A}
#view>.d20-entry .trend-capsule-digits.digits-up{color:#D92D2D}#view>.d20-entry .trend-capsule-digits.digits-down{color:var(--editorial-green)}
#view>.announcements-entry{margin:0 0 16px!important;border:1px solid var(--bw-rule);border-radius:0;background:var(--card);box-shadow:none}
#view>.announcements-entry .ann-head{border-bottom:1px solid var(--editorial-line-faint)}
#view>.announcements-entry .ann-title{font-size:14px;color:#334B58}.ann-sub{font-size:11px;color:#7A8790}.ann-item{padding:8px 12px;font-size:11px}
#view>.ipo-row{width:100%;display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;align-items:stretch}
#view>.ipo-row>.newstocks-wrap,#view>.ipo-row>.iporeview-wrap{width:auto;min-width:0;margin:0!important;border:1px solid var(--bw-rule);border-radius:0;background:var(--card);box-shadow:none}
#view>.ipo-row .newstocks-head,#view>.ipo-row .newstocks-wrap .newstocks-head,#view>.ipo-row .iporeview-wrap .newstocks-head{min-height:52px;padding:12px 12px!important;background:#F0F2F3;border-top:2px solid var(--editorial-blue);border-bottom:1px solid var(--bw-rule)}
#view>.ipo-row>.iporeview-wrap .newstocks-head{}
#view>.ipo-row .newstocks-title{font-size:14px;color:#334B58}.newstocks-sub{font-size:11px;color:#7A8790}.head-action{font-size:11px;border-radius:0;padding:2px 8px;background:var(--card);border:1px solid #CCD4DA;color:#334B58}
#view>.ipo-row .ns-item,#view>.ipo-row .ipo-item{border-bottom:1px solid var(--editorial-line-soft);border-radius:0;background:var(--card)}.ns-item:hover,.ipo-item:hover{background:#FAFBFB}
#view>.ipo-row .ns-name,#view>.ipo-row .ipo-name{font-size:12px;font-weight:600;}.ns-code,.ipo-date{font-size:11px;color:#82909A}.ns-sector,.ipo-main{font-size:11px;border-radius:0;background:#F5F6F6;border-color:#E2E6E8}.ipo-mkt{border-radius:0;font-size:11px;padding:2px 4px}
#view>.market-grid{width:100%;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;margin-top:16px}
#view>.market-grid .mcard{display:flex;align-items:center;border:1px solid var(--bw-rule);border-top:0;border-radius:0;background:var(--card);box-shadow:none;color:#111827;transform:none}
#view>.market-grid .mcard.a{border-left:1px solid #B65A52}#view>.market-grid .mcard.h{border-left:1px solid #668BA4}
#view>.market-grid .mcard::before,#view>.market-grid .mcard::after{display:none}.mcard-code{width:34px;height:34px;display:flex;align-items:center;justify-content:center;background:var(--bw-line-soft);color:#55707E;font-size:11px;font-weight:600}.mcard-main{min-width:180px}.mcard .lbl{font-size:11px;margin:0!important;color:var(--bw-icon-muted)}.mcard .lbl span{margin-left:4px;color:#87929A}.mcard .big{font-size:22px;line-height:1;margin-top:4px;color:#111827;text-shadow:none}.mcard .big small{font-size:11px;font-weight:400;color:var(--bw-icon-muted);margin-left:2px}.mcard .stats{margin:0 0 0 auto!important;display:flex}.mcard .stats .it{padding:0 16px!important;margin:0!important;border-left:1px solid var(--ann-line);border-right:0}.mcard .stats .it b{font-size:14px;color:#9A443A}.mcard .stats .it span{font-size:11px;color:#7A8790}.mcard .go{position:static;margin-left:8px;padding:0!important;background:transparent;border:0;color:#334B58;font-size:18px}
#view>.concept-strip{width:100%;margin-top:16px;padding:12px 12px 12px;border:1px solid var(--bw-rule);border-top:2px solid var(--editorial-red);border-radius:0;background:var(--card);box-shadow:none}
#view>.concept-strip .concept-title{font-size:14px;font-weight:600;color:#334B58}.concept-title svg{color:var(--editorial-orange)}
#view>.concept-strip .concept-chips{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));}
#view>.concept-strip .concept-chip{display:flex;align-items:center;justify-content:space-between;}.concept-chip span:first-child{font-size:11px;color:#445761}.concept-chip b{font-size:11px;font-family:Inter,Roboto,sans-serif!important;font-variant-numeric:tabular-nums;color:#9A443A;font-weight:400}
#view>.ipo-row .ipo-sub{border-left:1px solid var(--editorial-blue);padding-left:8px}
#view>.ipo-row .ipo-sub.hk{border-left-color:var(--editorial-orange)}
#view>.home-stats{}.stat-card{border:1px solid var(--bw-rule);border-radius:0;box-shadow:none;background:var(--card)}.stat-card .num{font-size:22px;color:#111827}
footer{max-width:1180px;padding:16px 0!important;background:var(--editorial-canvas);border-top:1px solid var(--bw-rule);color:#7A8790;box-shadow:none}
@media(max-width:940px){.header-inner{padding:0 16px!important}.crumb,main{}#view>.daily-entry{}.daily-entry .dup-entry-stats{}.mcard-main{}.mcard .stats .it{}}
@media(max-width:760px){#view>.ipo-row{}.search-wrap{}.header-status{}#view>.d20-entry .d20-entry-stocks{}.concept-chips{}.market-grid{}}

/* bridgewater-editorial-v1 layout polish: 4/8px rhythm, clear focus,
   balanced intermediate breakpoints, and no mobile horizontal overflow. */
body{line-height:1.5!important;overflow-x:hidden}
#view>.daily-entry{margin-bottom:12px}
#view>.concept-strip .concept-chips{}
#view>.daily-entry,#view>.d20-entry,#view>.announcements-entry,#view>.ipo-row .head-action,#view>.market-grid .mcard,#view>.concept-strip .concept-chip{touch-action:manipulation}
#view>.daily-entry:focus-visible,#view>.d20-entry:focus-visible,#view>.announcements-entry:focus-within,#view>.market-grid .mcard:focus-visible,#view>.concept-strip .concept-chip:focus-visible{outline:2px solid var(--editorial-blue);outline-offset:3px}
#view>.ipo-row .head-action{min-height:30px}
@media(max-width:1100px){main,.crumb,.header-inner,footer{max-width:100%;padding-left:20px;padding-right:20px}.search-wrap{max-width:460px}.mcard-main{min-width:140px}}
@media(max-width:940px){.header-inner{padding-left:16px;padding-right:16px}.crumb,main{padding-left:16px;padding-right:16px}#view>.daily-entry{grid-template-columns:1fr;gap:12px}.daily-entry .dup-entry-stats{grid-template-columns:repeat(5,minmax(0,1fr))}.mcard-main{min-width:0}.mcard .stats .it{padding:0 8px!important}}
@media(max-width:760px){#view>.ipo-row{grid-template-columns:1fr}.search-wrap{min-width:0}.header-status{display:none}#view>.d20-entry .d20-entry-stocks{grid-template-columns:repeat(2,minmax(0,1fr))}.concept-chips{grid-template-columns:repeat(2,minmax(0,1fr));column-gap:12px;row-gap:8px}.market-grid{grid-template-columns:1fr}.mcard{min-height:78px}.mcard .stats .it{padding:0 8px!important}.ann-item{grid-template-columns:72px minmax(0,1fr) 92px}}
@media(max-width:520px){#view>.daily-entry{padding:16px}.daily-entry .dup-entry-stats{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 4px}.daily-entry .dup-entry-stats .it{border-left:0;padding:0 4px!important}.daily-entry .dup-entry-stats .it span{font-size:22px}.d20-entry{padding:16px 12px 12px}.d20-entry .d20-entry-stocks{gap:8px}.d20-entry .d20-entry-stock{min-height:46px;padding:8px 8px}.d20-entry .trend-capsule-name{font-size:14px}.d20-entry .trend-capsule-digits{font-size:14px}.d20-entry .trend-capsule-colon{font-size:14px;margin:0 4px!important}.concept-strip{padding-left:8px;padding-right:8px}.concept-strip .concept-chips{column-gap:8px}.concept-strip .concept-chip{padding-left:8px;padding-right:8px}.ann-item{grid-template-columns:64px minmax(0,1fr)}.ann-item time,.ann-source{display:none}}

/* Small structural rules retained from the maintained IPO/table layout. */
.ns-identity{display:inline-flex;align-items:center;gap:8px;min-width:0;white-space:nowrap}
.ns-biz{display:inline-flex;align-items:center;gap:2px;min-width:0;white-space:nowrap}
.newstocks-wrap .ns-biz{display:inline-flex!important;align-items:center;gap:2px}
#view .ipo-row .ns-item{grid-template-columns:minmax(0,1.15fr) minmax(0,1fr)}
td.name{font-weight:700;white-space:nowrap}
.concept-stock-table{table-layout:fixed}
.ipo-date-head{display:flex;align-items:center;gap:8px;color:var(--editorial-muted);font-size:12px;padding:8px 0 8px;border-bottom:1px solid var(--editorial-line-faint)}

/* -------------------------------------------------------------------------
   Bridgewater editorial palette refinement
   Keep the existing layout and data intact; only harmonise semantic colors.
   ------------------------------------------------------------------------- */
:root{
  --bg:var(--editorial-canvas);
  --card:var(--editorial-surface);
  --text:var(--editorial-ink);
  --sub:var(--editorial-muted);
  --line:var(--editorial-line);
  /* Keep the established finance up/down colors unchanged. */
  --a:#e03131;
  --up:var(--a);
  --down:#0ca678;
  --h:var(--editorial-blue);
  --a-soft:#F7E9E7;
  --h-soft:#EAF2F7;
  --mkt-a:var(--editorial-red);
  --mkt-a-soft:#F7E9E7;
  --mkt-h:var(--editorial-blue);
  --mkt-h-soft:#EAF2F7;
  --brand:var(--editorial-blue);
  --brand-dark:var(--editorial-blue);
  --brand-soft:#EAF2F7;
  --link:var(--editorial-blue);
  --warn:var(--editorial-orange);
  --alarm:#C00000;
  --blk:#3b4a63;
  --gray-1:#333333;
  --gray-2:#666666;
  --gray-3:#666666;
  --gray-4:#777777;
}

/* Shared text, borders and controls use one neutral scale. */
header{border-bottom-color:var(--editorial-line)}
.brand-name{}
.brand-logo-box,.search-box .kbd{background:var(--editorial-canvas)}
.search-box,.search-box .kbd,.dup-export,.head-action,.stat-card,.dup-entry,
.newstocks-wrap,.iporeview-wrap,.pdf-actions a,.pdf-actions button,
.day-nav button{border-color:var(--editorial-line)}
.search-box input,.dup-export,.head-action,.pdf-actions a,.pdf-actions button,
.day-nav button{color:var(--editorial-text)}
.header-status,.header-status b,.header-status time,.page-title .sub,
.newstocks-sub,.ns-code,.ipo-date,.ipo-empty,.ann-sub,.ann-item time,
footer{color:var(--editorial-muted)}
.header-status .dot{background:var(--editorial-blue)}

/* Headings and accents follow the restrained navy/red/orange hierarchy. */
#view>.daily-entry .dup-entry-title,#view>.d20-entry .dup-entry-title,
#view>.announcements-entry .ann-title,#view>.ipo-row .newstocks-title,
#view>.concept-strip .concept-title{color:var(--editorial-blue)}
#view>.daily-entry .dup-entry-title svg,#view>.d20-entry .dup-entry-title svg,
#view>.concept-strip .concept-title svg{color:var(--editorial-orange)}
#view>.daily-entry .dup-entry-stats .it b,
#view>.d20-entry .dup-entry-sub,.newstocks-sub,.ann-sub{color:var(--editorial-muted)}
#view>.market-grid .mcard .big,
#view>.stat-card .num{color:var(--editorial-ink)}
/* Tables and concepts stay paper-white with fine neutral dividers. */
#view>.ipo-row .newstocks-head,
#view>.ipo-row .newstocks-wrap .newstocks-head,
#view>.ipo-row .iporeview-wrap .newstocks-head{background:var(--editorial-canvas);border-bottom-color:var(--editorial-line)}
#view>.ipo-row .newstocks-head{border-top-color:var(--editorial-blue)}
#view>.ipo-row>.iporeview-wrap .newstocks-head{border-top-color:var(--editorial-orange)}
#view>.ipo-row .ns-item,#view>.ipo-row .ipo-item{}
#view>.ipo-row .ns-item:hover,#view>.ipo-row .ipo-item:hover{background:var(--bw-surface-soft)}
#view>.ipo-row .ns-name,#view>.ipo-row .ipo-name{color:var(--editorial-ink)}
#view>.ipo-row .ns-sector,#view>.ipo-row .ipo-main{background:var(--editorial-canvas);border-color:var(--editorial-line);}
#view>.concept-strip{border-color:var(--editorial-line);border-top-color:var(--editorial-red)}
#view>.concept-strip .concept-chip{color:var(--editorial-text)}
#view>.concept-strip .concept-chip span:first-child{color:var(--editorial-text)}
#view>.concept-strip .concept-chip b{color:var(--editorial-red)}

/* Market cards: neutral surface with a single, low-noise identity accent. */
#view>.market-grid .mcard{border-color:var(--editorial-line)}
#view>.market-grid .mcard.a{border-left-color:var(--editorial-red)}
#view>.market-grid .mcard.h{border-left-color:var(--editorial-blue)}
#view>.market-grid .mcard-code{color:var(--editorial-blue)}
#view>.market-grid .mcard .lbl,#view>.market-grid .mcard .lbl span,
#view>.market-grid .mcard .stats .it span{color:var(--editorial-muted)}
#view>.market-grid .mcard .stats .it{border-left-color:var(--editorial-line)}
#view>.market-grid .mcard .stats .it b{color:var(--editorial-red)}
#view>.market-grid .mcard .go{color:var(--editorial-ink)}

/* Preserve keyboard visibility while using the same navy focus color. */
#view>.daily-entry:focus-visible,#view>.d20-entry:focus-visible,
#view>.market-grid .mcard:focus-visible,#view>.concept-strip .concept-chip:focus-visible{outline-color:var(--editorial-blue)}

/* -------------------------------------------------------------------------
   bridgewater-editorial-v1 · layout and rhythm polish
   Structural selectors only; data rendering and navigation remain untouched.
   ------------------------------------------------------------------------- */
:root{
  --editorial-gap:16px;
  --editorial-radius:2px;
}

/* Homepage sections share one vertical rhythm and the existing 1180px grid. */
#view:has(> .daily-entry){display:flex!important;flex-direction:column;gap:var(--editorial-gap)}
#view:has(> .daily-entry)> .daily-entry,
#view:has(> .daily-entry)> .d20-entry,
#view:has(> .daily-entry)> .announcements-entry,
#view:has(> .daily-entry)> .ipo-row,
#view:has(> .daily-entry)> .market-grid,
#view:has(> .daily-entry)> .concept-strip,
#view:has(> .daily-entry)> .home-stats{margin-top:0!important;margin-bottom:0!important}

/* One compact corner rule for cards and their controls. */
#view>.daily-entry,#view>.d20-entry,#view>.announcements-entry,
#view>.ipo-row>.newstocks-wrap,#view>.ipo-row>.iporeview-wrap,
#view>.market-grid .mcard,#view>.concept-strip,#view>.home-stats,
#view>.home-stats .stat-card,.head-action,.ann-more,.ann-portal,
#view>.d20-entry .d20-entry-stock{border-radius:var(--editorial-radius)}
#view>.daily-entry,#view>.d20-entry,#view>.announcements-entry,
#view>.ipo-row>.newstocks-wrap,#view>.ipo-row>.iporeview-wrap,
#view>.market-grid .mcard,#view>.concept-strip,#view>.home-stats,
#view>.home-stats .stat-card{border-color:var(--editorial-line)}

/* Titles read as section labels; the data remains the visual priority. */
#view>.page-title{margin:0 0 16px!important;padding-bottom:12px!important;border-bottom:1px solid var(--editorial-line)}
#view>.page-title h1{font-size:22px;line-height:1.25;letter-spacing:0}
#view>.page-title .sub{font-size:11px;}

/* 20-day panel: clearer title-to-grid separation and measured density. */
#view>.d20-entry{padding:16px 20px 20px!important;background:var(--editorial-surface)}
#view>.d20-entry .d20-entry-stocks{margin-top:16px;gap:8px}
#view>.d20-entry .d20-entry-stock{background:var(--bw-surface-soft);border-color:var(--editorial-line)}
#view>.d20-entry .d20-entry-stock:hover{background:var(--editorial-canvas);border-color:#C9D5DC}

/* Announcement list uses a stable four-column reading line. */
#view>.announcements-entry{border-top:2px solid var(--editorial-blue)}
#view>.announcements-entry .ann-head{background:var(--editorial-canvas);border-bottom-color:var(--editorial-line);padding:8px 16px}
#view>.announcements-entry .ann-item{grid-template-columns:112px minmax(0,1fr) 118px 88px;gap:12px;padding:8px 16px;border-bottom-color:var(--editorial-line);color:var(--editorial-text)}
#view>.announcements-entry .ann-item:hover{background:var(--bw-surface-soft)}
#view>.announcements-entry .ann-stock{color:var(--editorial-ink)}
#view>.announcements-entry .ann-item-title{color:var(--editorial-text)}

/* Date groups become quiet full-width dividers instead of colored tabs. */
#view .ns-date-head,#view .ipo-date-head{display:flex!important;align-items:center;gap:8px;margin:12px 2px 8px!important;padding:8px 0!important;border:0;border-bottom:1px solid var(--editorial-line);background:transparent;color:var(--editorial-muted);font-size:11px!important;font-weight:600!important;letter-spacing:.04em}
#view .ns-date-head::after,#view .ipo-date-head::after{content:"";display:block;flex:1;height:1px;background:var(--editorial-line)}
#view .ns-group:first-child .ns-date-head,#view .ipo-group:first-child .ipo-date-head{margin-top:4px}

/* Keep the two IPO panes aligned while preserving their existing markup. */
#view>.ipo-row{gap:16px}
#view>.ipo-row .ns-item,#view>.ipo-row .ipo-item{min-height:35px;padding:8px 8px;gap:8px;border-bottom-color:var(--editorial-line)}
#view>.ipo-row .ns-biz{justify-content:flex-end;min-width:0}
#view>.ipo-row .newstocks-list .ns-item>.ns-biz{margin-left:auto}
#view>.ipo-row .ns-sector,#view>.ipo-row .ipo-main{font-size:11px;color:var(--editorial-text)}
#view>.ipo-row .ns-pct{color:var(--editorial-red);font-variant-numeric:tabular-nums}
#view>.ipo-row .ipo-mkt{background:var(--editorial-canvas);color:var(--editorial-muted);border:1px solid var(--editorial-line);border-radius:var(--editorial-radius)}

/* Market summary cards sit on the same edges as the tables above. */
#view>.market-grid{gap:16px;margin-top:0!important}
#view>.market-grid .mcard{gap:12px;transition:border-color .15s var(--ease),background-color .15s var(--ease),transform .15s var(--ease)}
#view>.market-grid .mcard:hover{background:var(--bw-surface-soft);border-color:#C9D5DC;transform:translateY(-1px);box-shadow:0 4px 12px rgba(17,17,17,.05)}
#view>.market-grid .mcard-code{width:38px;height:38px;border:1px solid var(--editorial-line);border-radius:var(--editorial-radius);background:var(--editorial-canvas)}
#view>.market-grid .mcard .stats .it{padding:0 12px!important}
#view>.market-grid .mcard .go{width:30px;height:30px;border:1px solid var(--editorial-line);border-radius:50%;background:var(--editorial-canvas)}
#view>.market-grid .mcard:hover .go{}

/* Concepts and totals use the same paper surface and divider weight. */
#view>.concept-strip{padding:16px 16px 16px!important}
#view>.concept-strip .concept-chips{column-gap:24px;row-gap:4px;margin-top:8px}
#view>.concept-strip .concept-chip{min-height:32px;padding:8px 4px;border-bottom:1px solid var(--editorial-line)}
#view>.concept-strip .concept-chip:hover{}
#view>.home-stats{gap:16px;margin-top:0!important;background:transparent;border:0;box-shadow:none}
#view>.home-stats .stat-card{padding:16px 16px;background:var(--editorial-surface)}

@media(max-width:760px){
  #view>.announcements-entry .ann-item{grid-template-columns:84px minmax(0,1fr) 92px;gap:8px;padding:8px 12px}
  #view>.announcements-entry .ann-source{display:none}
  #view>.d20-entry .d20-entry-stocks{gap:8px}
  #view>.market-grid{}
  #view>.concept-strip .concept-chips{column-gap:12px}
  #view>.home-stats{gap:0}
}

/* Announcement titles get the reading width; detail rows show up to two lines. */
#view>.announcements-entry .ann-item-title,
#view>.ann-page-card .ann-item-title{white-space:normal;overflow:hidden;display:-webkit-box!important;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-height:1.45!important;text-overflow:ellipsis}
#view>.announcements-entry .ann-item{min-height:42px}
#view>.ann-page-card .ann-item{grid-template-columns:minmax(0,1fr) 128px 92px;gap:12px;padding:8px 16px;align-items:start}
#view>.ann-page-card .ann-item time,#view>.ann-page-card .ann-source{padding-top:2px}
@media(max-width:760px){
  #view>.ann-page-card .ann-item{grid-template-columns:minmax(0,1fr) 92px;gap:8px;padding:8px 12px!important}
  #view>.ann-page-card .ann-source{display:none}
}

/* Homepage simplification: one neutral surface system, accents only for meaning. */
#view:has(> .daily-entry)> .daily-entry,
#view:has(> .daily-entry)> .d20-entry,
#view:has(> .daily-entry)> .announcements-entry,
#view:has(> .daily-entry)> .ipo-row>.newstocks-wrap,
#view:has(> .daily-entry)> .ipo-row>.iporeview-wrap,
#view:has(> .daily-entry)> .concept-strip,
#view:has(> .daily-entry)> .home-stats .stat-card{box-shadow:none;background:var(--editorial-surface);border-color:var(--editorial-line)}
#view:has(> .daily-entry)> .announcements-entry{border-top:1px solid var(--editorial-line)}
#view:has(> .daily-entry)> .ipo-row .newstocks-head,
#view:has(> .daily-entry)> .ipo-row .newstocks-wrap .newstocks-head,
#view:has(> .daily-entry)> .ipo-row .iporeview-wrap .newstocks-head{border-top:1px solid var(--editorial-line);background:var(--editorial-canvas)}
#view:has(> .daily-entry)> .concept-strip{border-top:1px solid var(--editorial-line)}
#view:has(> .daily-entry)> .daily-entry .dup-entry-title,
#view:has(> .daily-entry)> .d20-entry .dup-entry-title,
#view:has(> .daily-entry)> .announcements-entry .ann-title,
#view:has(> .daily-entry)> .ipo-row .newstocks-title,
#view:has(> .daily-entry)> .concept-strip .concept-title{color:var(--editorial-ink)}
#view:has(> .daily-entry)> .d20-entry .d20-entry-stock{}
#view:has(> .daily-entry)> .d20-entry .d20-entry-stock:hover{}

/* Explicit homepage semantic colors: down values remain green. */
#view:has(> .daily-entry) .dup-entry-stats .it span.down,
#view:has(> .daily-entry) .dup-entry-stats .it span.score.down,
#view:has(> .daily-entry) .dup-stats-bar .score-down,
#view:has(> .daily-entry) .trend-capsule-digits.digits-down,
#view:has(> .daily-entry) .trend-capsule-digits.down,
#view:has(> .daily-entry) .d20-entry .trend-capsule-digits.digits-down,
#view:has(> .daily-entry) .d20-entry .trend-capsule-digits.down{color:var(--editorial-green)}

/* -------------------------------------------------------------------------
   bridgewater-editorial-v1 · shared card language
   Keep homepage behavior and data intact while making the market surfaces
   read as one system: paper-white surfaces, hairline dividers, quiet type,
   and color reserved for finance meaning.
   ------------------------------------------------------------------------- */
:root{
  --bw-surface:#FFFFFF;
  --bw-surface-soft:#EFF3F3;
  --bw-line:#E6E6E6;
  --bw-line-soft:#F1F3F4;
  --bw-ink:#111111;
  --bw-muted:#666666;
  --bw-blue:#326891;
  --bw-red:#80241E;
  --bw-orange:#B85C1A;
  --bw-radius:2px;
}

/* One physical card rule for the homepage's information groups. */
#view:has(> .daily-entry) > .d20-entry,
#view:has(> .daily-entry) > .ipo-row > .newstocks-wrap,
#view:has(> .daily-entry) > .ipo-row > .iporeview-wrap,
#view:has(> .daily-entry) > .market-grid .mcard,
#view:has(> .daily-entry) > .concept-strip,
#view:has(> .daily-entry) > .home-stats{
  background:var(--bw-surface);
  border:1px solid var(--bw-line);
  border-radius:var(--bw-radius);
  box-shadow:none;
}

/* 20-day panel: neutral section header + calm, evenly weighted entries. */
#view:has(> .daily-entry) > .d20-entry{
  padding:0 16px 16px!important;
}
#view:has(> .daily-entry) > .d20-entry > div:first-child{
  padding:16px 0 12px!important;
  border-bottom:1px solid var(--bw-line);
}
#view:has(> .daily-entry) > .d20-entry .dup-entry-title{
  color:var(--bw-ink);
  font-size:18px;
  font-weight:600;
}
#view:has(> .daily-entry) > .d20-entry .dup-entry-title svg{color:var(--bw-blue)}
#view:has(> .daily-entry) > .d20-entry .dup-entry-sub{
  color:var(--bw-muted);
  font-size:11px;
}
#view:has(> .daily-entry) > .d20-entry .d20-entry-stocks{
  margin-top:12px;
  gap:8px;
}
#view:has(> .daily-entry) > .d20-entry .d20-entry-stock{
  min-height:48px;
  padding:8px 12px;
  background:var(--bw-surface);
  border:1px solid var(--bw-line);
  border-radius:var(--bw-radius);
  box-shadow:none;
}
#view:has(> .daily-entry) > .d20-entry .d20-entry-stock:hover{
  background:var(--bw-surface-soft);
  border-color:#C7D2D8;
}
#view:has(> .daily-entry) > .d20-entry .trend-capsule-name{
  color:var(--bw-ink);
  font-size:14px;
  font-weight:600;
}
#view:has(> .daily-entry) > .d20-entry .trend-capsule-colon{
  color:var(--editorial-muted);
  margin:0 8px!important;
}
#view:has(> .daily-entry) > .d20-entry .trend-capsule-digits{
  
  
}
#view:has(> .daily-entry) > .d20-entry .trend-capsule-digits.digits-up{color:var(--editorial-red)}
#view:has(> .daily-entry) > .d20-entry .trend-capsule-digits.digits-down{color:var(--editorial-green)}

/* Daily new stocks / latest IPO: identical shell and header rhythm. */
#view:has(> .daily-entry) > .ipo-row{gap:16px}
#view:has(> .daily-entry) > .ipo-row > .newstocks-wrap,
#view:has(> .daily-entry) > .ipo-row > .iporeview-wrap{overflow:hidden}
#view:has(> .daily-entry) > .ipo-row .newstocks-head{
  min-height:52px;
  padding:12px 12px!important;
  background:var(--bw-surface-soft);
  border-top:0;
  border-bottom:1px solid var(--bw-line);
}
/* 两张并排卡的表头必须同样无上边框。注意特异性：
   上面那条设置 border-top:1px 的规则里，新股用的是「.ipo-row .newstocks-wrap .newstocks-head」
   三类写法，而这里原来只有「.ipo-row .newstocks-head」两类 —— 特异性不够，压不住，
   于是只有每日新股长出一条上边框、最新IPO没有。下面补成同等三类写法。 */
#view:has(> .daily-entry) > .ipo-row .newstocks-wrap .newstocks-head,
#view:has(> .daily-entry) > .ipo-row .iporeview-wrap .newstocks-head{border-top:0;background:var(--bw-surface-soft)}
#view:has(> .daily-entry) > .ipo-row .newstocks-title{
  color:var(--bw-ink);
  font-size:14px;
  font-weight:600;
}
#view:has(> .daily-entry) > .ipo-row .newstocks-title svg{color:var(--bw-blue)}
#view:has(> .daily-entry) > .ipo-row .iporeview-wrap .newstocks-title svg{color:var(--bw-orange)}
#view:has(> .daily-entry) > .ipo-row .newstocks-sub{color:var(--bw-muted)}
#view:has(> .daily-entry) > .ipo-row .head-action{
  color:var(--bw-blue);
  background:var(--bw-surface);
  border:1px solid var(--bw-line);
  border-radius:var(--bw-radius);
}
#view:has(> .daily-entry) > .ipo-row .head-action:hover{background:var(--editorial-surface-muted);border-color:#B8C9D2}
#view:has(> .daily-entry) > .ipo-row .ns-date-head,
#view:has(> .daily-entry) > .ipo-row .ipo-date-head{
  color:var(--bw-muted);
  border-bottom-color:var(--bw-line);
}
#view:has(> .daily-entry) > .ipo-row .ns-item,
#view:has(> .daily-entry) > .ipo-row .ipo-item{
  min-height:35px;
  padding:8px 8px;
  background:var(--bw-surface);
  border-bottom:1px solid var(--bw-line-soft);
  border-radius:0;
}
#view:has(> .daily-entry) > .ipo-row .ns-item:hover,
#view:has(> .daily-entry) > .ipo-row .ipo-item:hover{background:var(--bw-surface-soft)}
#view:has(> .daily-entry) > .ipo-row .ns-name,
#view:has(> .daily-entry) > .ipo-row .ipo-name{color:var(--bw-ink)}
#view:has(> .daily-entry) > .ipo-row .ns-sector,
#view:has(> .daily-entry) > .ipo-row .ipo-main{
  background:var(--editorial-canvas);
  border-color:var(--bw-line);
  color:#4B555B;
}
#view:has(> .daily-entry) > .ipo-row .ipo-mkt{
  background:#F5F6F6;
  color:#59636A;
  border:1px solid var(--bw-line);
  border-radius:var(--bw-radius);
}
#view:has(> .daily-entry) > .ipo-row .ipo-mkt.a{color:var(--bw-red)}
#view:has(> .daily-entry) > .ipo-row .ipo-mkt.h{color:var(--bw-blue)}

/* A/H market cards: same shell; only the identity mark carries color. */
#view:has(> .daily-entry) > .market-grid{gap:16px;margin-top:0!important}
#view:has(> .daily-entry) > .market-grid .mcard{
  min-height:76px;
  padding:16px 16px!important;
  color:var(--bw-ink);
  transition:background-color .15s var(--ease),border-color .15s var(--ease);
}
#view:has(> .daily-entry) > .market-grid .mcard:hover{background:var(--bw-surface-soft);border-color:#C7D2D8;transform:none;box-shadow:none}
#view:has(> .daily-entry) > .market-grid .mcard-code{
  width:38px;height:38px;
  border:1px solid var(--bw-line);
  border-radius:var(--bw-radius);
  background:#F5F6F6;
  color:#59636A;
}
#view:has(> .daily-entry) > .market-grid .mcard.a .mcard-code{color:var(--bw-red)}
#view:has(> .daily-entry) > .market-grid .mcard.h .mcard-code{color:var(--bw-blue)}
#view:has(> .daily-entry) > .market-grid .mcard .lbl{color:var(--bw-ink);font-size:14px!important}
#view:has(> .daily-entry) > .market-grid .mcard .lbl span{color:var(--bw-muted)}
#view:has(> .daily-entry) > .market-grid .mcard .big{color:var(--bw-ink);font-size:22px}
#view:has(> .daily-entry) > .market-grid .mcard .stats .it{border-left-color:var(--bw-line)}
#view:has(> .daily-entry) > .market-grid .mcard .stats .it b{color:var(--bw-ink);font-size:14px}
#view:has(> .daily-entry) > .market-grid .mcard .stats .it span{color:var(--bw-muted)}
#view:has(> .daily-entry) > .market-grid .mcard .go{
  width:30px;height:30px;
  border:1px solid var(--bw-line);
  border-radius:50%;
  background:var(--bw-surface-soft);
  color:var(--bw-ink);
}
#view:has(> .daily-entry) > .market-grid .mcard:hover .go{background:var(--bw-surface)}

/* Full-market statistics: use the same paper/card grammar as the homepage. */
#view > .page-title + .grid,
#view > .page-title + .tag-filter-bar + .table-card,
#view > .page-title + .table-card{
  margin-top:12px!important;
}
#view > .page-title + .grid{
  gap:16px;
}
#view > .page-title + .grid .gcard{
  padding:16px 16px;
  background:var(--bw-surface);
  border:1px solid var(--bw-line);
  border-radius:var(--bw-radius);
  box-shadow:none;
  transition:background-color .15s var(--ease),border-color .15s var(--ease);
}
#view > .page-title + .grid .gcard:hover{
  background:var(--bw-surface-soft);
  border-color:#C7D2D8;
  transform:none;
  box-shadow:none;
}
#view > .page-title + .grid .gcard .name{color:var(--bw-ink);font-size:14px;font-weight:600}
#view > .page-title + .grid .gcard .name .cnt{
  color:var(--bw-ink);
  background:#F5F6F6;
  border:1px solid var(--bw-line);
  border-radius:var(--bw-radius);
  padding:2px 8px;
}
#view > .page-title + .grid .gcard .name .cnt.a{color:var(--bw-red)}
#view > .page-title + .grid .gcard .name .cnt.h{color:var(--bw-blue)}
#view > .page-title + .grid .gcard .desc{color:var(--bw-muted);margin-top:8px}
#view > .page-title + .grid .gcard .bar{height:3px;margin-top:12px;background:var(--editorial-line-soft);border-radius:0}
#view > .page-title + .grid .gcard .bar i{border-radius:0}
#view > .page-title + .grid .gcard .bar i.a{background:var(--bw-red)}
#view > .page-title + .grid .gcard .bar i.h{background:var(--bw-blue)}
#view > .page-title + .grid .gcard .chips{gap:4px;margin-top:12px}
#view > .page-title + .grid .gcard .chip{
  color:#59636A;
  background:var(--editorial-canvas);
  border:1px solid var(--bw-line);
  border-radius:var(--bw-radius);
  padding:2px 8px;
}
#view > .page-title + .grid .gcard .chip b{color:var(--bw-ink);font-variant-numeric:tabular-nums}

#view > .page-title + .tag-filter-bar + .table-card,
#view > .page-title + .table-card{
  background:var(--bw-surface);
  border:1px solid var(--bw-line);
  border-radius:var(--bw-radius);
  box-shadow:none;
  overflow:hidden;
}
#view > .page-title + .tag-filter-bar + .table-card .table-head,
#view > .page-title + .table-card .table-head{
  padding:12px 16px;
  background:var(--bw-surface-soft);
  border-bottom:1px solid var(--bw-line);
}
#view > .page-title + .tag-filter-bar + .table-card .table-head .title,
#view > .page-title + .table-card .table-head .title{color:var(--bw-ink);font-size:14px;font-weight:600}
#view > .page-title + .tag-filter-bar + .table-card .table-head .count,
#view > .page-title + .table-card .table-head .count{color:var(--bw-muted)}
#view > .page-title + .tag-filter-bar + .table-card .table-head .filter input,
#view > .page-title + .table-card .table-head .filter input{
  background:var(--bw-surface);
  border:1px solid var(--bw-line);
  border-radius:var(--bw-radius);
}
#view > .page-title + .tag-filter-bar + .table-card thead th,
#view > .page-title + .table-card thead th{
  background:var(--bw-surface-soft);
  color:var(--bw-muted);
  border-bottom:1px solid var(--bw-line);
  font-weight:600;
}
#view > .page-title + .tag-filter-bar + .table-card tbody td,
#view > .page-title + .table-card tbody td{border-bottom:1px solid var(--bw-line-soft);color:var(--bw-ink)}
#view > .page-title + .tag-filter-bar + .table-card tbody tr:hover,
#view > .page-title + .table-card tbody tr:hover{background:var(--bw-surface-soft)}
#view > .page-title + .tag-filter-bar + .table-card td.code,
#view > .page-title + .table-card td.code{color:var(--bw-muted)}
#view > .page-title + .tag-filter-bar + .table-card td.name,
#view > .page-title + .table-card td.name{color:var(--bw-ink);font-weight:600}
#view > .page-title + .tag-filter-bar + .table-card .src-chip,
#view > .page-title + .table-card .src-chip,
#view > .page-title + .tag-filter-bar + .table-card .tag-chip,
#view > .page-title + .table-card .tag-chip{
  background:var(--editorial-canvas);
  border:1px solid var(--bw-line);
  border-radius:var(--bw-radius);
  color:#59636A;
}
#view > .page-title + .tag-filter-bar + .table-card .src-chip .pct,
#view > .page-title + .table-card .src-chip .pct{color:var(--bw-red)}
#view > .page-title .tag-market{
  background:#F5F6F6;
  color:var(--bw-muted);
  border:1px solid var(--bw-line);
  border-radius:var(--bw-radius);
}
#view > .page-title .tag-market.a{}
#view > .page-title .tag-market.h{}

@media(max-width:760px){
  #view:has(> .daily-entry) > .d20-entry{padding:0 12px 12px!important}
  #view:has(> .daily-entry) > .d20-entry .d20-entry-stocks{gap:8px}
  #view:has(> .daily-entry) > .market-grid{gap:8px}
  #view > .page-title + .grid{gap:8px}
}

/* Latest IPO follows the daily-new-stock reading line: date is carried by
   the group divider only, while market/name stay on the left and business /
   prospectus controls stay on the right.  Market labels reuse the exact
   daily-new-stock semantic palette (A-share red, HK blue). */
#view:has(> .daily-entry) > .ipo-row > .iporeview-wrap .ipo-date{
  display:none!important;
}
#view:has(> .daily-entry) > .ipo-row > .iporeview-wrap .ipo-item{
  display:flex;
  align-items:center;
  gap:8px;
}
#view:has(> .daily-entry) > .ipo-row > .iporeview-wrap .ipo-name{
  flex:1 1 auto;
  min-width:0;
}
#view:has(> .daily-entry) > .ipo-row > .iporeview-wrap .ipo-main{
  margin-left:auto;
}
#view:has(> .daily-entry) > .ipo-row > .iporeview-wrap .ipo-mkt{
  border:0;
  border-radius:2px;
  padding:2px 8px!important;
  font-size:11px;
  font-weight:700!important;
}
#view:has(> .daily-entry) > .ipo-row > .iporeview-wrap .ipo-mkt.a{
  background:var(--a-soft);
  color:var(--bw-red);
}
#view:has(> .daily-entry) > .ipo-row > .iporeview-wrap .ipo-mkt.h{
  background:var(--h-soft);
  color:var(--bw-blue);
}

/* The archived IPO view uses the same market-tag component. */
#view.year-view .ipo-mkt{
  border:0;
  border-radius:2px;
  padding:2px 8px!important;
  font-size:11px!important;
  font-weight:700!important;
}
#view.year-view .ipo-mkt.a{background:var(--a-soft);color:var(--bw-red)}
#view.year-view .ipo-mkt.h{background:var(--h-soft);color:var(--bw-blue)}

/* 20-day change values: standard market red/green with a restrained,
   measurement-oriented typeface (no rounded/cartoon weight). */
#view:has(> .daily-entry) > .d20-entry .trend-capsule-name{
  font-family:"Helvetica Neue",Arial,"PingFang SC","Microsoft YaHei",sans-serif!important;
  font-weight:600!important;
}
#view:has(> .daily-entry) > .d20-entry .trend-capsule-digits{
  font-family:"Roboto Mono","SFMono-Regular","Cascadia Mono","Segoe UI Mono",monospace!important;
  font-size:18px;
  font-weight:600;
  font-variant-numeric:tabular-nums;
  letter-spacing:-.015em;
}
#view:has(> .daily-entry) > .d20-entry .d20-entry-stock b.trend-capsule-digits,
#view:has(> .daily-entry) > .d20-entry .d20-entry-stock b.up.trend-capsule-digits,
#view:has(> .daily-entry) > .d20-entry .d20-entry-stock b.down.trend-capsule-digits{font-weight:600}
#view:has(> .daily-entry) > .d20-entry .trend-capsule-digits.digits-up,
#view:has(> .daily-entry) > .d20-entry .trend-capsule-digits.up{color:#D92D2D}
#view:has(> .daily-entry) > .d20-entry .trend-capsule-digits.digits-down,
#view:has(> .daily-entry) > .d20-entry .trend-capsule-digits.down{color:var(--editorial-green)}

/* ========================================================================
   bridgewater-editorial-v1 · all clickable surfaces
   The homepage and every detail route share one quiet editorial grammar:
   white paper, hairline rules, 2px corners, restrained type, and semantic
   red/green only where the data requires it.  This layer is intentionally
   last so legacy route-specific rules cannot reintroduce the old card world.
   ======================================================================== */

/* Shared detail shell and section heading rhythm. */
#view > .dup-layout,
#view > .d20-score-grid,
#view > .ann-page-card,
#view > .table-card,
#view > .tag-filter-bar + .table-card {
  width:100%;
  box-sizing:border-box;
}

/* Daily up/down detail: sidebar and table are two calm columns on wide
   screens, then collapse naturally without horizontal overflow. */
#view > .dup-layout{
  display:grid!important;
  grid-template-columns:minmax(220px,280px) minmax(0,1fr);
  gap:16px;
  align-items:start;
  margin-top:0!important;
}
#view > .dup-layout .dup-side{
  
  
  
  
  
  
  
  
  
  
  border-radius:0;
  
}
#view > .dup-layout .dup-stats-bar,
#view > .dup-layout .wk-grid-wrap,
#view > .dup-layout .dup-main .table-card{
  margin:0!important;
  background:var(--bw-surface);
  border:1px solid var(--bw-line);
  border-radius:var(--bw-radius);
  box-shadow:none;
}
#view > .dup-layout .dup-stats-bar{
  display:flex;
  flex-direction:column;
  align-items:flex-start;
  gap:8px;
  padding:12px 16px;
  color:var(--bw-muted);
  font-size:12px;
  line-height:1.35;
}
#view > .dup-layout .dup-stats-bar b{color:var(--bw-ink);font-size:14px}
#view > .dup-layout .dup-stats-bar .score-up{color:var(--bw-red)}
#view > .dup-layout .dup-stats-bar .score-down{color:var(--editorial-green)}
#view > .dup-layout .wk-grid-wrap{margin-top:8px!important;padding:12px 16px}
#view > .dup-layout .wk-grid-head{font-size:14px;color:var(--bw-ink);font-weight:600}
#view > .dup-layout .wk-grid{gap:4px;margin-top:8px}
#view > .dup-layout .wk-cell{border-radius:2px;min-height:28px;font-size:11px}
#view > .dup-layout .wk-grid-note,
#view > .dup-layout .wk-grid-stats .ws-item{color:var(--bw-muted)}
#view > .dup-layout .dup-main .table-card{overflow:hidden}
#view > .dup-layout .dup-main{overflow:hidden}
#view > .dup-layout .dup-side > .dup-stats-bar,
#view > .dup-layout .dup-side > .wk-grid-wrap{min-width:0}
#view > .dup-layout .table-head{
  padding:12px 16px;
  background:var(--bw-surface-soft);
  border-bottom:1px solid var(--bw-line);
}
#view > .dup-layout .table-head .title{color:var(--bw-ink);font-weight:600;font-size:14px}
#view > .dup-layout .table-head .count{color:var(--bw-muted);font-size:11px}
#view > .dup-layout .table-head input{border-radius:var(--bw-radius);border-color:var(--bw-line);background:var(--card)}
#view > .dup-layout .dup-table{background:var(--card)}
#view > .dup-layout .dup-table thead th{background:var(--bw-surface-soft);color:var(--bw-muted);border-bottom:1px solid var(--bw-line)}
#view > .dup-layout .dup-table tbody td{background:var(--card);border-bottom:1px solid var(--bw-line-soft);color:var(--bw-ink)}
#view > .dup-layout .dup-table tbody tr:hover td{background:var(--bw-surface-soft)}
#view > .dup-layout .dup-table td.num.up,
#view > .dup-layout .dup-table .wk-score.up{color:var(--bw-red)}
#view > .dup-layout .dup-table td.num.down,
#view > .dup-layout .dup-table .wk-score.down{}
#view > .dup-layout .dup-more{padding:12px 0!important}
#view > .dup-layout .dup-more button{
  border:1px solid var(--bw-line);
  border-radius:var(--bw-radius);
  box-shadow:none;
  color:var(--bw-ink);
  background:var(--card);
}
#view > .dup-layout .dup-more button:hover{background:var(--bw-surface-soft);border-color:#C7D2D8}

/* 20-day detail cards use the exact same shell as homepage trend cells. */
#view > .d20-score-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;margin-top:0!important}
#view > .d20-score-grid .d20-score{
  min-width:0;
  padding:16px 16px;
  background:var(--bw-surface);
  border:1px solid var(--bw-line);
  border-radius:var(--bw-radius);
  box-shadow:none;
  transition:background-color .15s var(--ease),border-color .15s var(--ease);
}
#view > .d20-score-grid .d20-score:hover{transform:none;background:var(--bw-surface-soft);border-color:#C7D2D8;box-shadow:none}
#view > .d20-score-grid .d20-sname{font-size:14px;font-weight:600;color:var(--bw-ink)}
#view > .d20-score-grid .d20-sratio{gap:8px;font-family:"Roboto Mono","SFMono-Regular","Cascadia Mono",monospace!important;font-variant-numeric:tabular-nums}
#view > .d20-score-grid .d20-sratio .up{font-size:22px;color:var(--bw-red);font-weight:600}
#view > .d20-score-grid .d20-sratio .down{font-size:22px;color:var(--editorial-green);font-weight:600}
#view > .d20-score-grid .d20-sratio .colon{color:var(--editorial-muted)}
#view > .d20-score-grid .d20-detail{margin-top:12px;padding-top:8px;border-top:1px solid var(--bw-line)}
#view > .d20-score-grid .d20-detail-title{color:var(--bw-muted);font-size:11px;font-weight:400}
#view > .d20-score-grid .d20-days{gap:2px}
#view > .d20-score-grid .d20-dcell{border-radius:2px;font-size:11px}
#view > .d20-score-grid .d20-dcell.up{}
#view > .d20-score-grid .d20-dcell.down{}
#view > .d20-score-grid .d20-dcell.flat{background:var(--editorial-canvas);color:var(--bw-muted);border:1px solid var(--bw-line)}
#view > .d20-score-grid .d20-dcell.null{background:var(--bw-surface-soft);color:#B5BDC2;border:1px dashed var(--bw-line)}

/* Full announcement page: the same reading line as IPO tables. */
#view > .ann-page-card{
  background:var(--bw-surface);
  border:1px solid var(--bw-line);
  border-radius:var(--bw-radius);
  box-shadow:none;
  overflow:hidden;
}
#view > .ann-page-card .ann-page-note{}
#view > .ann-page-card .ann-stock-group{border-bottom:1px solid var(--bw-line)}
#view > .ann-page-card .ann-stock-group > header{}
#view > .ann-page-card .ann-stock-group strong{font-size:14px;font-weight:600}
#view > .ann-page-card .ann-code{}
#view > .ann-page-card .ann-portal{box-shadow:none}
#view > .ann-page-card .ann-portal:hover{}
#view > .ann-page-card .ann-item{grid-template-columns:minmax(0,1fr) 128px 92px;gap:12px;color:var(--bw-text)}
#view > .ann-page-card .ann-item:hover{}
#view > .ann-page-card .ann-item-title{}
#view > .ann-page-card .ann-item time{}
#view > .ann-page-card .ann-source{}

/* Concept and market stock lists: table grammar and market chips are shared. */
#view > .table-card,
#view > .tag-filter-bar + .table-card{
  margin-top:0!important;
  background:var(--bw-surface);
  border:1px solid var(--bw-line);
  border-radius:var(--bw-radius);
  box-shadow:none;
  overflow:hidden;
}
#view > .table-card .table-head,
#view > .tag-filter-bar + .table-card .table-head{padding:12px 16px;background:var(--bw-surface-soft);border-bottom:1px solid var(--bw-line)}
#view > .table-card .table-head .title,
#view > .tag-filter-bar + .table-card .table-head .title{font-size:14px;font-weight:600;color:var(--bw-ink)}
#view > .table-card .table-head .count,
#view > .tag-filter-bar + .table-card .table-head .count{font-size:11px;color:var(--bw-muted)}
#view > .table-card .table-head input,
#view > .tag-filter-bar + .table-card .table-head input{border:1px solid var(--bw-line);border-radius:var(--bw-radius);background:var(--card);color:var(--bw-ink)}
#view > .table-card thead th,
#view > .tag-filter-bar + .table-card thead th{background:var(--bw-surface-soft);color:var(--bw-muted);border-bottom:1px solid var(--bw-line);font-size:11px;font-weight:600}
#view > .table-card tbody td,
#view > .tag-filter-bar + .table-card tbody td{background:var(--card);color:var(--bw-ink);border-bottom:1px solid var(--bw-line-soft)}
#view > .table-card tbody tr:hover td,
#view > .tag-filter-bar + .table-card tbody tr:hover td{background:var(--bw-surface-soft)}
#view > .table-card td.code,
#view > .tag-filter-bar + .table-card td.code{color:var(--bw-muted)}
#view > .table-card td.name,
#view > .tag-filter-bar + .table-card td.name{}
#view > .table-card .src-chip,
#view > .table-card .tag-chip,
#view > .tag-filter-bar + .table-card .src-chip,
#view > .tag-filter-bar + .table-card .tag-chip{
  border:1px solid var(--bw-line);
  border-radius:var(--bw-radius);
  background:var(--editorial-canvas);
  color:var(--bw-muted);
}
#view > .table-card .tag-chip.a,
#view > .tag-filter-bar + .table-card .tag-chip.a{color:var(--bw-red)}
#view > .table-card .tag-chip.h,
#view > .tag-filter-bar + .table-card .tag-chip.h{color:var(--bw-blue)}
#view > .table-card .tag-chip:hover,
#view > .tag-filter-bar + .table-card .tag-chip:hover{background:var(--bw-surface-soft);border-color:#C7D2D8}
#view > .tag-filter-bar{
  display:flex;align-items:center;gap:8px;
  margin:0 0 8px!important;padding:8px 12px;
  background:var(--bw-surface-soft);border:1px solid var(--bw-line);border-radius:var(--bw-radius);
  color:var(--bw-muted);font-size:11px;
}
#view > .tag-filter-bar .tag-chip{background:var(--card);border:1px solid var(--bw-line);color:var(--bw-blue);border-radius:var(--bw-radius)}
#view > .tag-filter-bar .tf-clear{margin-left:auto;border:1px solid var(--bw-line);border-radius:var(--bw-radius);background:var(--card);color:var(--bw-muted)}

/* Date and PDF dialogs are part of the same interaction surface. */
.pdf-box,.day-box{
  border:1px solid var(--bw-line);
  border-radius:var(--bw-radius);
  box-shadow:0 18px 44px rgba(17,17,17,.16);
}
.pdf-head,.day-head{background:var(--bw-surface-soft);border-bottom:1px solid var(--bw-line);padding:12px 16px}
.pdf-title,.day-title{color:var(--bw-ink);font-size:14px;font-weight:600}
.pdf-actions a,.pdf-actions button,.day-nav button{border:1px solid var(--bw-line);border-radius:var(--bw-radius);background:var(--card);color:var(--bw-ink);box-shadow:none}
.pdf-actions a:hover,.pdf-actions button:hover,.day-nav button:hover{background:var(--bw-surface-soft);border-color:#C7D2D8}
.pdf-body{background:var(--editorial-canvas)}
.day-body{padding:12px 16px 16px;background:var(--card)}
.day-grid{gap:8px}
.day-item{background:var(--card);border:1px solid var(--bw-line);border-radius:var(--bw-radius);padding:8px 12px}
.day-item b{color:var(--bw-muted);font-weight:400}
.day-item span.up{color:var(--bw-red)}.day-item span.down{color:var(--editorial-green)}

@media(max-width:940px){
  #view > .dup-layout{}
  #view > .dup-layout .dup-side{display:grid;grid-template-columns:1fr 1fr;gap:8px;min-width:0}
  #view > .dup-layout .dup-side > *{min-width:0;width:100%}
  #view > .dup-layout .wk-grid-wrap{margin-top:0!important;overflow:hidden}
  #view > .dup-layout .wk-grid{width:100%;min-width:0}
}
@media(max-width:760px){
  #view > .dup-layout .dup-side{grid-template-columns:1fr}
  #view > .d20-score-grid{grid-template-columns:1fr 1fr;gap:8px}
  #view > .ann-page-card .ann-item{grid-template-columns:minmax(0,1fr) 92px;gap:8px;}
  #view > .ann-page-card .ann-source{display:none}
  #view > .ann-page-card .ann-stock-group > header{}
}
@media(max-width:520px){
  #view > .d20-score-grid{grid-template-columns:1fr}
  #view > .table-card .table-head,#view > .tag-filter-bar + .table-card .table-head{padding:12px 12px}
  #view > .ann-page-card .ann-item time{font-size:11px}
}

/* Daily detail summary is a non-blocking companion, never a table column.
   On wide canvases it floats just outside the reading column; on compact
   screens the data table stays first and full-width instead of being pushed
   below a large weekly panel. */
#view > .dup-layout{
  display:block!important;
  position:relative;
}
#view > .dup-layout .dup-main{}
#view > .dup-layout .dup-side{
  
}
@media(min-width:1500px){
  #view > .dup-layout .dup-side{
    display:block!important;
    
    left:calc(100% + 16px);
    top:0;
    
    max-height:calc(100vh - 180px);
    overflow:auto;
    
    padding:0!important;
    background:transparent;
    border:0;
    box-shadow:none;
  }
}

/* Final placement: keep the companion summary on the left, preserving the
   original compact 4-column weekly grid while the table remains its own
   independent surface. */
#view > .dup-layout{
  display:grid!important;
  grid-template-columns:280px minmax(0,1fr);
  gap:16px;
  align-items:start;
}
#view > .dup-layout .dup-side{
  
  
  
  
  
  
  
  
  
  
  
  
}
#view > .dup-layout .dup-side .wk-grid{grid-template-columns:repeat(4,minmax(0,1fr))}
#view > .dup-layout .dup-side .wk-grid-wrap{width:100%;min-width:0}
@media(max-width:940px){
  #view > .dup-layout{grid-template-columns:1fr}
  #view > .dup-layout .dup-side{width:100%}
  #view > .dup-layout .dup-side .wk-grid{grid-template-columns:repeat(4,minmax(0,1fr))}
}

/* Weekly summary is a companion panel, never a column in the data table. */
#view > .dup-layout{
  display:block!important;
  position:relative;
  grid-template-columns:none;
}
#view > .dup-layout .dup-main{width:100%;min-width:0}
#view > .dup-layout .dup-side{
  display:block!important;
  position:static;
  width:100%;
  min-width:0;
  max-width:none;
  max-height:none;
  overflow:visible;
  margin:0 0 16px!important;
  padding:0!important;
  background:transparent;
  border:0;
  box-shadow:none;
}
@media(min-width:1500px){
  #view > .dup-layout .dup-side{
    position:fixed;
    width:290px;
    margin:0!important;
    z-index:20;
  }
}

/* Standard market colors for the涨跌明细 table. Keep these values scoped to
   the table so the editorial palette of the remaining surfaces is unchanged. */
#view > .dup-layout .dup-table td.num.up,
#view > .dup-layout .dup-table .wk-score.up{color:#DC2626}
#view > .dup-layout .dup-table td.num.down,
#view > .dup-layout .dup-table .wk-score.down{color:var(--editorial-green)}

/* 涨跌明细：提高字号与字形清晰度，同时保持紧凑的表格密度。 */
#view > .dup-layout .dup-table{
  font-family:Inter,Roboto,"PingFang SC","Microsoft YaHei",sans-serif!important;
}
#view > .dup-layout .dup-table thead th{
  font-size:12px;
  font-weight:600!important;
  line-height:1.35;
}
#view > .dup-layout .dup-table tbody td{
  font-size:12px;
  line-height:1.45;
}
#view > .dup-layout .dup-table tbody td.code{
  font-size:12px;
  font-variant-numeric:tabular-nums;
}
#view > .dup-layout .dup-table tbody td.week{
  font-size:11px!important;
}
#view > .dup-layout .dup-table tbody td.num{
  font-family:Inter,Roboto,"Segoe UI",sans-serif!important;
  font-variant-numeric:tabular-nums;
}

/* 午环比 / 日环比：绝对值超过 10% 时使用醒目的深红预警色。 */
#view > .dup-layout .dup-table tbody td.alarm{
  color:var(--editorial-red);
  font-weight:600!important;
}

/* 20日涨跌模块统一使用标准金融红绿（首页摘要 + 详情卡片）。 */
#view > .d20-entry .trend-capsule-digits.digits-up,
#view > .d20-entry .trend-capsule-digits.up,
#view > .d20-score-grid .d20-sratio .up{
  color:#DC2626;
}
#view > .d20-score-grid .d20-dcell.up{
  color:var(--card);
  background:#DC2626;
}
#view > .d20-entry .trend-capsule-digits.digits-down,
#view > .d20-entry .trend-capsule-digits.down,
#view > .d20-score-grid .d20-sratio .down{
  color:var(--editorial-green);
}
#view > .d20-score-grid .d20-dcell.down{
  color:var(--card);
  background:var(--editorial-green);
}

/* -------------------------------------------------------------------------
   bridgewater-editorial-v1 · restrained visual polish
   Visual-only refinement: a quieter paper canvas, a slightly clearer type
   scale, and one shared interaction language across every existing surface.
   No DOM, data, route, or interaction behavior is changed here.
   ------------------------------------------------------------------------- */
:root{
  --editorial-canvas:#F7F8F8;
  --editorial-surface:#FFFFFF;
  --editorial-surface-soft:#EFF3F3;
  --editorial-line:#CBD7D9;
  --editorial-line-soft:#EEF2F2;
  --editorial-ink:#1F2933;
  --editorial-text:#36434D;
  --editorial-muted:#5C6873;
  --editorial-blue:#2F627B;
  --editorial-orange:#A96832;
}

html,body,main{
  
  color:var(--editorial-ink);
}
body{
  font-family:"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",Arial,sans-serif!important;
  font-size:14px;
  line-height:1.5;
  letter-spacing:0;
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
}

/* Shared reading line: headings and metadata now use the same vertical
   cadence on the homepage and all detail routes. */
#view:has(> .daily-entry){gap:16px}
#view>.page-title{
  margin-bottom:16px;
  padding-bottom:12px;
  border-bottom-color:var(--editorial-line);
}
#view>.page-title h1{color:var(--editorial-ink);font-weight:700!important}
#view>.page-title .sub{color:var(--editorial-muted)}

/* Keep surfaces paper-flat, but give rules enough contrast to preserve
   alignment without bringing back heavy grey blocks. */
#view:has(> .daily-entry)> .daily-entry,
#view:has(> .daily-entry)> .d20-entry,
#view:has(> .daily-entry)> .announcements-entry,
#view:has(> .daily-entry)> .ipo-row>.newstocks-wrap,
#view:has(> .daily-entry)> .ipo-row>.iporeview-wrap,
#view:has(> .daily-entry)> .market-grid .mcard,
#view:has(> .daily-entry)> .concept-strip,
#view:has(> .daily-entry)> .home-stats .stat-card,
#view>.table-card,
#view>.tag-filter-bar + .table-card,
#view>.ann-page-card{
  background:var(--editorial-surface);
  border-color:var(--editorial-line);
  box-shadow:none;
}

/* Section headers share one calm tint and one hairline divider. */
#view>.announcements-entry .ann-head,
#view>.ipo-row .newstocks-head,
#view>.table-card .table-head,
#view>.tag-filter-bar + .table-card .table-head,
#view>.ann-page-card .ann-page-note{
  background:var(--editorial-surface-soft);
  border-bottom-color:var(--editorial-line);
}
#view>.announcements-entry .ann-title,
#view>.ipo-row .newstocks-title,
#view>.table-card .table-head .title,
#view>.tag-filter-bar + .table-card .table-head .title,
#view>.ann-page-card .ann-stock-group strong{color:var(--editorial-ink)}

/* Metadata stays quiet; values remain semantic red/green and retain their
   existing sizes. */
#view>.announcements-entry .ann-sub,
#view>.announcements-entry .ann-item time,
#view>.ipo-row .newstocks-sub,
#view>.ipo-row .ns-code,
#view>.ipo-row .ipo-date,
#view>.table-card .table-head .count,
#view>.tag-filter-bar + .table-card .table-head .count,
footer{color:var(--editorial-muted)}

/* Neutral controls with a single, keyboard-visible focus treatment. */
:where(button,a,input,select,textarea):focus-visible{
  outline:2px solid #6A8795;
  outline-offset:2px;
}
.search-box:focus-within{border-color:var(--brand);box-shadow:0 0 0 3px rgba(47,98,123,.10)}
.head-action,.dup-export,.ann-more,.ann-portal,.pdf-actions a,.pdf-actions button,.day-nav button{
  border-color:var(--editorial-line);
  background:var(--card);
  color:var(--editorial-text);
}
.head-action:hover,.dup-export:hover,.ann-more:hover,.ann-portal:hover,
.pdf-actions a:hover,.pdf-actions button:hover,.day-nav button:hover{
  background:var(--editorial-surface-soft);
  border-color:#BACAD0;
}

/* Tables and announcement rows use the same low-contrast rhythm. */
#view>.announcements-entry .ann-item,
#view>.ann-page-card .ann-item,
#view>.table-card tbody td,
#view>.tag-filter-bar + .table-card tbody td,
#view>.ipo-row .ns-item,
#view>.ipo-row .ipo-item{border-bottom-color:var(--editorial-line-soft)}
#view>.announcements-entry .ann-item:hover,
#view>.ann-page-card .ann-item:hover,
#view>.table-card tbody tr:hover td,
#view>.tag-filter-bar + .table-card tbody tr:hover td,
#view>.ipo-row .ns-item:hover,
#view>.ipo-row .ipo-item:hover{background:var(--ann-row-alt)}

/* Reduce only decorative roundness; content density and responsive breakpoints
   remain unchanged. */
#view>.market-grid .mcard-code,
#view>.market-grid .mcard .go,
#view>.ipo-row .ipo-mkt,
#view>.table-card .tag-chip,
#view>.table-card .src-chip,
#view>.tag-filter-bar .tag-chip{border-radius:2px}

/* Date/market subheads are already separated by a full-width rule; remove
   the legacy colored side tab so no section relies on a second accent cue. */
#view>.ipo-row .ipo-sub{border-left:0;padding-left:0!important}

@media(max-width:760px){
  #view:has(> .daily-entry){}
  #view>.page-title{margin-bottom:12px!important;padding-bottom:8px!important}
}

/* Homepage focus pass: make the two market-change summaries easier to scan
   at a glance.  The existing grid and click targets stay exactly the same;
   only the visual scale and breathing room of their values increase. */
#view:has(> .daily-entry)> .daily-entry .dup-entry-title{
  font-size:18px!important;
}
#view:has(> .daily-entry)> .daily-entry .dup-entry-stats .it span{
  
  
  
}
#view:has(> .daily-entry)> .daily-entry .dup-entry-stats .it b{
  
}
#view:has(> .daily-entry)> .d20-entry .dup-entry-title{
  
}
#view:has(> .daily-entry)> .d20-entry .d20-entry-stock{
  
  padding-top:12px;
  padding-bottom:12px;
}
#view:has(> .daily-entry)> .d20-entry .trend-capsule-name{
  
}
#view:has(> .daily-entry)> .d20-entry .trend-capsule-digits{
  
  
}
#view:has(> .daily-entry)> .d20-entry .trend-capsule-colon{
  
}

@media(max-width:760px){
  #view:has(> .daily-entry)> .daily-entry .dup-entry-stats .it span{}
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stock{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-name{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-digits{}
}
@media(max-width:520px){
  #view:has(> .daily-entry)> .daily-entry .dup-entry-stats .it span{}
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stock{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-name{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-digits{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-colon{}
}

/* The market card itself remains the click target; the decorative arrow is
   removed so the two cards read as clean, balanced information blocks. */
#view:has(> .daily-entry)> .market-grid .mcard .go{
  display:none!important;
}
#view:has(> .daily-entry)> .market-grid .mcard{
  padding-right:20px!important;
}
#view:has(> .daily-entry)> .market-grid .mcard .stats{
  margin-left:auto;
}
@media(max-width:760px){
  #view:has(> .daily-entry)> .market-grid .mcard{padding-right:16px!important}
}

/* Scale the two homepage summaries as complete surfaces, not just as larger
   type: a little more canvas and breathing room makes the hierarchy visible
   while preserving the existing full-width composition. */
#view:has(> .daily-entry)> .daily-entry{
  min-height:132px;
  padding:24px 24px!important;
  gap:24px;
}
#view:has(> .daily-entry)> .daily-entry .dup-entry-stats .it{
  padding-top:4px;
  padding-bottom:4px;
}
#view:has(> .daily-entry)> .d20-entry{
  min-height:228px;
  padding:20px 24px 24px;
}
#view:has(> .daily-entry)> .d20-entry .d20-entry-stocks{
  
  
}
#view:has(> .daily-entry)> .d20-entry .d20-entry-stock{
  
  
}

@media(max-width:940px){
  #view:has(> .daily-entry)> .daily-entry{}
}
@media(max-width:760px){
  #view:has(> .daily-entry)> .daily-entry{}
  #view:has(> .daily-entry)> .d20-entry{}
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stocks{}
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stock{}
}
@media(max-width:520px){
  #view:has(> .daily-entry)> .daily-entry{}
  #view:has(> .daily-entry)> .d20-entry{}
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stocks{}
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stock{}
}

/* Final type scale for the 20-day rows: the labels and paired values in the
   screenshot become the primary scan target, without changing their grid. */
#view:has(> .daily-entry)> .d20-entry .d20-entry-stock{
  min-height:62px;
}
#view:has(> .daily-entry)> .d20-entry .trend-capsule-name{
  
  
  
}
#view:has(> .daily-entry)> .d20-entry .trend-capsule-digits{
  
  
  
}
#view:has(> .daily-entry)> .d20-entry .trend-capsule-colon{
  
  
  
}
@media(max-width:760px){
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stock{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-name{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-digits{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-colon{}
}
@media(max-width:520px){
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stock{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-name{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-digits{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-colon{}
}

/* Extra emphasis pass for the 20-day panel.  This is intentionally a small
   step beyond the previous scale so the component stays legible at common
   desktop widths while remaining compact on phones. */
#view:has(> .daily-entry)> .d20-entry{
  min-height:246px;
  padding:24px 24px 24px!important;
}
#view:has(> .daily-entry)> .d20-entry .d20-entry-stocks{
  
  
}
#view:has(> .daily-entry)> .d20-entry .d20-entry-stock{
  
  
}
#view:has(> .daily-entry)> .d20-entry .trend-capsule-name{}
#view:has(> .daily-entry)> .d20-entry .trend-capsule-digits{}
#view:has(> .daily-entry)> .d20-entry .trend-capsule-colon{margin:0 8px!important}
@media(max-width:760px){
  #view:has(> .daily-entry)> .d20-entry{min-height:0;}
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stocks{}
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stock{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-name{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-digits{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-colon{}
}
@media(max-width:520px){
  #view:has(> .daily-entry)> .d20-entry{}
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stocks{margin-top:16px;}
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stock{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-name{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-digits{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-colon{}
}

/* Match the daily-change panel to the enlarged 20-day treatment. */
#view:has(> .daily-entry)> .daily-entry{
  min-height:154px;
  padding:24px 32px!important;
  gap:32px;
}
#view:has(> .daily-entry)> .daily-entry .dup-entry-title{font-size:22px}
#view:has(> .daily-entry)> .daily-entry .dup-entry-stats .it{
  padding:8px 20px!important;
}
#view:has(> .daily-entry)> .daily-entry .dup-entry-stats .it b{font-size:12px!important}
#view:has(> .daily-entry)> .daily-entry .dup-entry-stats .it span{
  font-size:30px!important;
  line-height:1.08!important;
  margin-top:8px!important;
}
@media(max-width:940px){
  #view:has(> .daily-entry)> .daily-entry{min-height:154px;padding:24px 24px}
}
@media(max-width:760px){
  #view:has(> .daily-entry)> .daily-entry{min-height:0;gap:20px}
  #view:has(> .daily-entry)> .daily-entry .dup-entry-stats .it{padding:4px 12px}
  #view:has(> .daily-entry)> .daily-entry .dup-entry-stats .it span{font-size:30px!important}
}
@media(max-width:520px){
  #view:has(> .daily-entry)> .daily-entry{}
  #view:has(> .daily-entry)> .daily-entry .dup-entry-stats .it{padding:4px 8px}
  #view:has(> .daily-entry)> .daily-entry .dup-entry-stats .it span{font-size:30px!important}
}

/* bridgewater editorial icon polish: one quiet SVG system across headings,
   actions and dialogs. Icons remain decorative; labels and click targets stay
   exactly as before. */
:root{
  --bw-icon-ink:#326891;
  --bw-icon-muted:#687780;
  --bw-icon-size:17px;
}
.ui-icon{
  display:inline-block;
  width:var(--bw-icon-size);
  height:var(--bw-icon-size);
  flex:0 0 var(--bw-icon-size);
  overflow:visible;
  vertical-align:-0.2em;
}
.dup-entry-title,.newstocks-title,.concept-title,.ann-title{
  display:inline-flex!important;
  align-items:center;
}
#view .dup-entry-title>svg.ui-icon,
#view .newstocks-title>svg.ui-icon,
#view .concept-title>svg.ui-icon,
#view .ann-title>svg.ui-icon{
  width:20px;
  height:20px;
  flex-basis:20px;
  padding:2px!important;
  border:1px solid var(--bw-line);
  border-radius:2px;
  background:var(--bw-surface-soft);
  color:var(--bw-icon-ink);
  vertical-align:middle;
}
.ann-title>.ann-mark-icon{color:var(--bw-icon-ink)}
.dup-export,.ann-more,.head-action,.ann-portal,.back,
.pdf-actions a,.pdf-actions button,.day-nav button,.tf-clear{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  gap:8px;
}
.dup-export>.ui-icon,.ann-more>.inline-icon{width:15px;height:15px;flex-basis:15px;vertical-align:middle}
.search-icon{width:16px;height:16px;flex-basis:16px;vertical-align:middle}
.back>.ui-icon{width:15px;height:15px;flex-basis:15px}
.pdf-close,.day-close{
  min-width:32px;
  min-height:30px;
  padding:4px 8px;
  display:inline-flex;
  align-items:center;
  justify-content:center;
}
.close-icon{width:16px;height:16px;flex-basis:16px}
.day-nav button>.nav-icon{width:14px;height:14px;flex-basis:14px}
.ui-icon-x{
  position:relative;
  width:13px;
  height:13px;
  flex:0 0 13px;
  display:inline-block;
  vertical-align:middle;
}
.ui-icon-x i{
  position:absolute;
  left:6px;
  top:1px;
  width:1px;
  height:11px;
  display:block;
  background:currentColor;
  transform:rotate(45deg);
  transform-origin:center;
}
.ui-icon-x i+ i{transform:rotate(-45deg)}
@media(max-width:520px){
  #view .dup-entry-title>svg.ui-icon,#view .newstocks-title>svg.ui-icon,
  #view .concept-title>svg.ui-icon,#view .ann-title>svg.ui-icon{width:18px;height:18px;flex-basis:18px;padding:2px!important}
}

/* 20-day summary scale v6: keep the section label compact and move the
   visual emphasis to the stock/value capsules shown beneath it. */
#view:has(> .daily-entry)> .d20-entry{
  min-height:0;
  padding:0 16px 16px!important;
}
#view:has(> .daily-entry)> .d20-entry > div:first-child{
  padding:8px 0 8px!important;
}
#view:has(> .daily-entry)> .d20-entry .dup-entry-title{
  font-size:14px;
  line-height:1.2!important;
  gap:8px;
}
#view:has(> .daily-entry)> .d20-entry .dup-entry-sub{
  margin-top:2px;
  font-size:11px;
  line-height:1.2!important;
}
#view:has(> .daily-entry)> .d20-entry .d20-entry-stocks{
  margin-top:12px;
  
}
#view:has(> .daily-entry)> .d20-entry .d20-entry-stock{
  min-height:80px;
  padding:16px 16px;
}
#view:has(> .daily-entry)> .d20-entry .trend-capsule-name{
  
  
  
}
#view:has(> .daily-entry)> .d20-entry .trend-capsule-digits{
  
  
  
}
#view:has(> .daily-entry)> .d20-entry .trend-capsule-colon{
  
  
  
  
}
@media(max-width:760px){
  #view:has(> .daily-entry)> .d20-entry{padding:0 16px 16px!important}
  #view:has(> .daily-entry)> .d20-entry > div:first-child{padding:8px 0 8px!important}
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stocks{margin-top:8px!important;gap:8px}
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stock{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-name{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-digits{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-colon{}
}
@media(max-width:520px){
  #view:has(> .daily-entry)> .d20-entry{padding:0 12px 12px!important}
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stock{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-name{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-digits{}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-colon{}
}

/* Full-market toolbar polish: export and year filters share one compact
   control language, with the active year carrying the editorial blue accent. */
#view > .page-title .tag-market.a{
  min-height:30px;
  display:inline-flex!important;
  align-items:center;
  padding:4px 12px!important;
  background:var(--bw-surface-soft);
  border:1px solid var(--bw-line);
  border-left:1px solid var(--bw-line);
  border-radius:2px;
  color:var(--bw-red);
  font-size:11px!important;
  font-weight:600!important;
  line-height:1!important;
}
#view > .page-title .dup-export,
#view > .page-title .dup-tabs button{
  height:30px;
  min-height:30px;
  border:1px solid var(--bw-line);
  border-radius:2px;
  background:var(--bw-surface);
  color:var(--bw-muted);
  font-size:11px;
  font-weight:400;
  line-height:1;
  box-shadow:none;
  transition:background-color .15s var(--ease),border-color .15s var(--ease),color .15s var(--ease);
}
#view > .page-title .dup-export{
  padding:4px 12px!important;
  gap:8px;
  margin-left:0!important;
}
#view > .page-title .dup-export .ui-icon{color:var(--bw-blue)}
#view > .page-title .dup-tabs{
  display:inline-flex;
  align-items:center;
  gap:8px;
  margin-left:auto;
}
#view > .page-title .dup-tabs button{padding:4px 12px!important;cursor:pointer}
#view > .page-title .dup-export:hover,
#view > .page-title .dup-tabs button:hover{
  background:var(--bw-surface-soft);
  border-color:#BACAD0;
  color:var(--bw-ink);
}
#view > .page-title .dup-tabs button.is-on{
  background:var(--bw-blue);
  border-color:var(--bw-blue);
  color:var(--card);
  font-weight:600!important;
}
@media(max-width:760px){
  #view > .page-title .dup-tabs{margin-left:0!important;width:100%;justify-content:flex-start}
  #view > .page-title .dup-tabs button{flex:0 0 auto}
}

/* Flat title icons: remove the isolated badge treatment so the daily-change
   mark sits naturally with the editorial headings and the rest of the UI. */
#view .dup-entry-title>svg.ui-icon,
#view .newstocks-title>svg.ui-icon,
#view .concept-title>svg.ui-icon,
#view .ann-title>svg.ui-icon{
  width:18px;
  height:18px;
  flex-basis:18px;
  padding:0!important;
  border:0;
  border-radius:0;
  background:transparent;
  color:var(--bw-blue);
}
#view .ipo-row>.iporeview-wrap .newstocks-title>svg.ui-icon{color:var(--bw-orange)}

/* Unified market tags v1: metadata chips share the editorial control rhythm.
   Remove the isolated red side bar and keep market semantics in restrained
   text/border tones so every page title reads as one coherent system. */
#view > .page-title .tag-market,
#view > .page-title .tag-market.a,
#view > .page-title .tag-market.h{
  display:inline-flex!important;
  align-items:center;
  min-height:24px;
  height:24px;
  padding:2px 8px!important;
  border:1px solid var(--bw-line);
  border-left:1px solid var(--bw-line);
  border-radius:2px;
  background:var(--bw-surface-soft);
  color:var(--bw-muted);
  font-size:11px!important;
  font-weight:600!important;
  line-height:1!important;
  letter-spacing:0;
}
#view > .page-title .tag-market.a{color:var(--bw-red)}
#view > .page-title .tag-market.h{color:var(--bw-blue)}

/* Announcement signal: corporate actions and periodic reports are easy to
   scan in deep red, including titles from Traditional-Chinese HK feeds. */
#view .announcements-entry .ann-item-title--signal,
#view .ann-page-card .ann-item-title--signal{
  color:var(--ann-red);
  font-weight:600!important;
}

/* 20-day ratio scale v2 (supersedes 20-day ratio scale v1): enlarge the key
   red/green counts so they use the available card width more directly, while
   preserving the existing grid. */
#view > .d20-score-grid .d20-sratio{
  align-items:baseline;
  gap:8px;
  flex-shrink:0;
  white-space:nowrap;
}
#view > .d20-score-grid .d20-sratio .up,
#view > .d20-score-grid .d20-sratio .down{
  font-size:30px!important;
  line-height:1;
  font-weight:700!important;
  letter-spacing:-.01em;
}
#view > .d20-score-grid .d20-sratio .colon{
  font-size:30px;
  line-height:1;
  font-weight:400;
}
@media(max-width:760px){
  #view > .d20-score-grid .d20-sratio .up,
  #view > .d20-score-grid .d20-sratio .down{font-size:30px!important}
  #view > .d20-score-grid .d20-sratio .colon{font-size:22px}
}
@media(max-width:520px){
  #view > .d20-score-grid .d20-sratio .up,
  #view > .d20-score-grid .d20-sratio .down{font-size:30px!important}
  #view > .d20-score-grid .d20-sratio .colon{font-size:22px}
}

/* -------------------------------------------------------------------------
   bridgewater-editorial-v1 · overall visual harmony pass
   A final, low-risk calibration layer for every route.  It standardises the
   reading rhythm, control geometry and focus/hover feedback without changing
   markup, data, dates or navigation behavior.
   ------------------------------------------------------------------------- */
:root{
  --editorial-line-strong:#CCD7DA;
  --editorial-hover:#F1F5F5;
  --editorial-focus:#5B8091;
  --editorial-control-radius:2px;
}

/* One quiet page rhythm: headings, tables and cards share the same baseline. */
#view > .page-title{
  min-height:36px;
  align-items:center;
  column-gap:8px;
  row-gap:8px;
}
#view > .page-title h1{
  font-size:22px;
  line-height:1.2!important;
  letter-spacing:-.01em;
}
#view > .page-title .sub{
  line-height:1.35;
  letter-spacing:.005em;
}
#view > .page-title .tag-market,
#view > .page-title .dup-export,
#view > .page-title .dup-tabs button{
  border-radius:var(--editorial-control-radius);
}

/* Surface headers read as one family across homepage and detail routes. */
#view > .announcements-entry .ann-head,
#view > .ann-page-card .ann-page-note,
#view > .ipo-row .newstocks-head,
#view > .table-card .table-head,
#view > .tag-filter-bar + .table-card .table-head,
#view > .dup-layout .table-head{
  display:flex!important;
  align-items:center;
  gap:8px;
  min-height:48px;
  box-shadow:none;
}
#view > .announcements-entry .ann-title,
#view > .ipo-row .newstocks-title,
#view > .table-card .table-head .title,
#view > .tag-filter-bar + .table-card .table-head .title,
#view > .dup-layout .table-head .title{
  
  letter-spacing:-.005em;
}

/* Keep long announcement titles legible while preserving the five-item list. */
#view > .announcements-entry .ann-item,
#view > .ann-page-card .ann-item{
  min-height:44px;
  align-items:center;
  transition:background-color .15s var(--ease);
}
#view > .announcements-entry .ann-item-title,
#view > .ann-page-card .ann-item-title{
  
  text-wrap:pretty;
}

/* Hairline table rhythm and a single neutral hover treatment. */
#view > .table-card tbody tr,
#view > .tag-filter-bar + .table-card tbody tr,
#view > .dup-layout .dup-table tbody tr,
#view > .ipo-row .ns-item,
#view > .ipo-row .ipo-item{
  transition:background-color .15s var(--ease);
}
#view > .table-card tbody tr:hover td,
#view > .tag-filter-bar + .table-card tbody tr:hover td,
#view > .dup-layout .dup-table tbody tr:hover td{
  background:var(--editorial-hover);
}
#view > .table-card td,
#view > .tag-filter-bar + .table-card td,
#view > .dup-layout .dup-table td{
  vertical-align:middle;
}

/* Search and utility surfaces no longer use a separate rounded visual system. */
.search-dropdown,
.sd-hot,
.sd-hot-tag,
.sd-tag,
.crumb a,
.crumb .back{
  border-radius:var(--editorial-control-radius);
}
.search-dropdown{border-color:var(--editorial-line);box-shadow:0 14px 30px rgba(31,55,65,.12)}
.sd-item:hover,.sd-item.is-active{background:var(--editorial-hover)}
.sd-hot{background:var(--editorial-surface-soft);border-top-color:var(--editorial-line)}
.sd-hot-tag{background:var(--card);border-color:var(--editorial-line)}
.sd-hot-tag:hover{background:var(--editorial-hover);border-color:var(--editorial-line-strong)}

/* Icons use one optical weight and baseline; color remains semantic. */
#view .ui-icon,
header .ui-icon,
.pdf-box .ui-icon,
.day-box .ui-icon{
  stroke-width:1.7;
}
#view .head-action,
#view .dup-export,
#view .ann-more,
#view .ann-portal,
#view .ipo-link,
#view .tag-chip,
#view .src-chip,
#view .tf-clear,
.pdf-actions a,
.pdf-actions button,
.day-nav button{
  border-radius:var(--editorial-control-radius);
  transition:background-color .15s var(--ease),border-color .15s var(--ease),color .15s var(--ease),transform .15s var(--ease);
}
#view .head-action:active,
#view .dup-export:active,
#view .ann-more:active,
#view .ann-portal:active,
#view .ipo-link:active,
.pdf-actions a:active,
.pdf-actions button:active,
.day-nav button:active{
  transform:translateY(1px);
}

/* Footer and empty states sit on the same muted baseline as metadata. */
footer{line-height:1.45!important;font-size:11px!important;letter-spacing:.005em}
#view .ipo-empty,
#view .empty,
#view .none{line-height:1.5;color:var(--editorial-muted)}

@media(max-width:760px){
  #view > .page-title{min-height:32px}
  #view > .page-title h1{font-size:22px}
  #view > .announcements-entry .ann-head,
  #view > .ann-page-card .ann-page-note,
  #view > .ipo-row .newstocks-head,
  #view > .table-card .table-head,
  #view > .tag-filter-bar + .table-card .table-head,
  #view > .dup-layout .table-head{min-height:44px}
}
@media(max-width:520px){
  #view > .page-title h1{font-size:22px}
  #view > .announcements-entry .ann-item,
  #view > .ann-page-card .ann-item{min-height:42px}
}

/* Homepage 20-day summary scale v7: the homepage uses d20-entry capsules
   rather than the detail grid above. Keep its four-column structure intact,
   but give the stock names and paired counts enough scale to read at a glance. */
#view:has(> .daily-entry)> .d20-entry .d20-entry-stock{
  min-height:74px;
  padding:12px 12px!important;
  gap:8px;
}
#view:has(> .daily-entry)> .d20-entry .trend-capsule-name{
  min-width:0;
  font-size:22px!important;
  line-height:1.15!important;
  font-weight:600;
}
#view:has(> .daily-entry)> .d20-entry .trend-capsule-values{
  flex-shrink:0;
  white-space:nowrap;
}
#view:has(> .daily-entry)> .d20-entry .trend-capsule-digits{
  font-size:30px;
  line-height:1;
  font-weight:700;
}
#view:has(> .daily-entry)> .d20-entry .d20-entry-stock b.up.trend-capsule-digits,
#view:has(> .daily-entry)> .d20-entry .d20-entry-stock b.down.trend-capsule-digits{
  font-size:30px;
  line-height:1;
  font-weight:700!important;
}
#view:has(> .daily-entry)> .d20-entry .trend-capsule-colon{
  font-size:22px!important;
  line-height:1;
  margin-left:8px;
  margin-right:8px;
}
@media(max-width:760px){
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stock{
    min-height:68px;
    padding:12px 12px!important;
  }
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-name{font-size:18px}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-digits{font-size:30px}
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stock b.up.trend-capsule-digits,
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stock b.down.trend-capsule-digits{font-size:30px}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-colon{font-size:22px!important;margin:0 8px!important}
}
@media(max-width:520px){
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stock{
    min-height:62px;
    padding:12px 12px!important;
  }
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-name{font-size:18px}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-digits{font-size:22px}
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stock b.up.trend-capsule-digits,
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stock b.down.trend-capsule-digits{font-size:22px!important}
  #view:has(> .daily-entry)> .d20-entry .trend-capsule-colon{font-size:18px!important;margin:0 8px!important}
}

/* Site harmony v1: one restrained treatment for section headers, controls and
   concept rows across the homepage and every internal route. This is visual
   only; existing structure, interaction and content remain unchanged. */
#view>.announcements-entry .ann-head,
#view>.ipo-row .newstocks-head,
#view>.table-card .table-head,
#view>.tag-filter-bar + .table-card .table-head,
#view>.ann-page-card .ann-page-note{
  background:var(--editorial-surface-soft);
  border-bottom:1px solid var(--editorial-line);
}
#view:has(> .daily-entry)> .ipo-row > .newstocks-wrap .newstocks-head,
#view:has(> .daily-entry)> .ipo-row > .iporeview-wrap .newstocks-head{
  background:var(--editorial-surface-soft);
  border-bottom:1px solid var(--editorial-line);
}
#view>.announcements-entry .ann-head,
#view>.ipo-row .newstocks-head,
#view>.table-card .table-head,
#view>.tag-filter-bar + .table-card .table-head{
  min-height:52px;
  padding:12px 16px!important;
}
#view>.concept-strip .concept-chip{
  
  border:1px solid var(--editorial-line-soft);
  
  border-radius:2px;
}
#view>.concept-strip .concept-chip:hover{
  background:var(--editorial-surface-muted);
  border-color:var(--editorial-line-strong);
}
#view>.announcements-entry .ann-more,
#view>.ipo-row .head-action,
#view>.table-card .table-head .filter input,
#view>.tag-filter-bar .tag-chip,
#view>.tag-filter-bar .tf-clear{
  border-radius:2px;
}

/* Year archive shells use the same near-square editorial corners as the
   homepage cards.  The archive markup and data stay untouched; this scoped
   rule only removes the legacy rounded container treatment and shadow. */
#view.year-view > .newstocks-wrap,
#view.year-view > .iporeview-wrap{
  border-radius:var(--bw-radius);
  box-shadow:none;
}

/* Final visual consistency pass: all archive headers, market badges, section
   labels and action affordances share the same quiet editorial grammar. */
#view.year-view > .newstocks-wrap .newstocks-head,
#view.year-view > .iporeview-wrap .newstocks-head{
  background:var(--bw-surface-soft);
  border-top:0;
  border-bottom:1px solid var(--bw-line);
}
#view .ns-board,
#view .ipo-mkt{
  border-radius:2px;
  padding:2px 8px;
  font-size:11px;
  line-height:1.2;
}
#view:has(> .daily-entry) > .d20-entry .dup-entry-title,
#view:has(> .daily-entry) > .announcements-entry .ann-title,
#view:has(> .daily-entry) > .ipo-row .newstocks-title,
#view:has(> .daily-entry) > .concept-strip .concept-title{
  font-size:14px;
  font-weight:600;
  color:var(--bw-ink);
}
#view > .page-title h1{color:var(--bw-ink)}
#view > .market-grid .mcard .go{
  
  
  
}
#view > .ann-page-card .ann-stock-group > header{
  
  
}

/* Final consistency closure: remove the last route-specific rounded pills and
   row corners that escaped the shared editorial grammar.  These selectors
   intentionally match the higher-specificity homepage/archive rules above so
   an older component rule cannot reintroduce a different shape later. */
:root{
  --bw-line:var(--editorial-line);
  --bw-line-soft:var(--editorial-line-soft);
}
#view:has(> .daily-entry) > .home-stats,
#view:has(> .daily-entry) > .daily-entry,
#view:has(> .daily-entry) > .d20-entry,
#view:has(> .daily-entry) > .announcements-entry,
#view:has(> .daily-entry) > .ipo-row > .newstocks-wrap,
#view:has(> .daily-entry) > .ipo-row > .iporeview-wrap,
#view:has(> .daily-entry) > .market-grid .mcard,
#view:has(> .daily-entry) > .concept-strip,
#view > .table-card,
#view > .tag-filter-bar + .table-card,
#view > .ann-page-card,
#view.year-view > .newstocks-wrap,
#view.year-view > .iporeview-wrap{
  border-color:var(--editorial-line);
}

/* Rows are separated by hairlines, never by rounded capsules, on both the
   rolling homepage lists and the full-year archives. */
#view .ns-item,
#view .ipo-item{
  border-radius:0;
}

/* Market labels and prospectus actions use the same compact 3px control shape
   in homepage, archive and concept surfaces. */
#view .ipo-mkt,
#view .ipo-link,
#view .mk-chip{
  border-radius:2px;
}
#view:has(> .daily-entry) > .ipo-row > .iporeview-wrap .ipo-mkt,
#view.year-view .ipo-mkt{
  border-radius:2px;
}

/* Final cascade closure: the canonical visual language wins after every
   historical compatibility layer, including route-specific mobile rules. */
#view > .page-title,
#view > .announcements-entry,
#view > .ann-page-card,
#view > .table-card,
#view > .tag-filter-bar,
#view > .ipo-row > .newstocks-wrap,
#view > .ipo-row > .iporeview-wrap,
#view.year-view > .newstocks-wrap,
#view.year-view > .iporeview-wrap{
  border-radius:var(--editorial-control-radius);
}
#view > .page-title{border-bottom-color:var(--editorial-line)}
#view > .announcements-entry,
#view > .ann-page-card,
#view > .table-card,
#view > .tag-filter-bar,
#view > .ipo-row > .newstocks-wrap,
#view > .ipo-row > .iporeview-wrap,
#view.year-view > .newstocks-wrap,
#view.year-view > .iporeview-wrap{
  border-color:var(--editorial-line);
  box-shadow:none;
}
#view > .announcements-entry .ann-item-title,
#view > .ann-page-card .ann-item-title,
#view > .table-card tbody td,
#view > .tag-filter-bar + .table-card tbody td,
#view > .dup-layout .dup-table tbody td{
  text-rendering:optimizeLegibility;
}

@media(prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.01ms;
    animation-iteration-count:1;
    scroll-behavior:auto;
    transition-duration:.01ms;
  }
}

/* Browser-surface finish: native affordances inherit the same editorial
   neutrals instead of reverting to the legacy blue-gray defaults. */
html{
  scrollbar-color:#B7C4C8 var(--editorial-canvas);
  scrollbar-width:thin;
}
::-webkit-scrollbar-thumb{
  background:#B7C4C8;
  border:2px solid var(--editorial-canvas);
  border-radius:2px;
}
::-webkit-scrollbar-track{background:var(--editorial-canvas)}
::selection{
  background:#DDEAF0;
  color:var(--editorial-ink);
}
input,textarea{caret-color:var(--editorial-blue)}
input::placeholder,textarea::placeholder{color:var(--bw-muted);opacity:1}

/* Keep the same optical corner on secondary row-level controls and links. */
#view .ns-sector,
#view .ipo-main,
#view .ipo-link,
#view .src-chip,
#view .tag-chip,
#view .chip,
#view .gcard .cnt{
  border-radius:var(--editorial-control-radius);
}

/* Bottom summary cards: the grid is spacing only.  Keeping a border on both
   the wrapper and each child created the stray connecting lines in between. */
#view:has(> .daily-entry) > .home-stats{
  border:0;
  border-radius:0;
  background:transparent;
}
#view:has(> .daily-entry) > .home-stats .stat-card{
  border:1px solid var(--editorial-line);
  border-radius:var(--editorial-control-radius);
  background:var(--editorial-surface);
}
@media(max-width:760px){
  #view:has(> .daily-entry) > .home-stats{gap:8px}
}

/* Announcement archive: separate each stock into a quiet inset group so
   adjacent rows do not visually merge into one long list. */
#view > .ann-page-card .ann-stock-group{
  margin:12px 12px 12px!important;
  border:1px solid var(--editorial-line);
  border-radius:var(--editorial-control-radius);
  background:var(--editorial-surface);
  overflow:hidden;
}
#view > .ann-page-card .ann-stock-group > header{
  
  
  
}
@media(max-width:760px){
  #view > .ann-page-card .ann-stock-group{}
  #view > .ann-page-card .ann-stock-group > header{}
}

/* IPO market labels: A股 and 港股 use the same optical footprint.  A Latin
   glyph (A) is narrower than the Chinese glyphs, so content-driven widths made
   otherwise identical labels look misaligned. */
#view .ipo-mkt,
#view .ns-board{
  display:inline-flex!important;
  align-items:center;
  justify-content:center;
  width:40px;
  min-width:40px;
  padding-left:0!important;
  padding-right:0!important;
  box-sizing:border-box;
}

/* Daily change title icon: use the same restrained deep red as upward market
   movement, while leaving the 20-day title icon's blue navigation cue intact. */
#view:has(> .daily-entry) > .daily-entry .dup-entry-title svg{
  color:var(--bw-red);
}

/* bridgewater-001 · title icon harmony v1
   Keep the six homepage section marks in one optical family: a quiet
   near-square frame, identical 22px footprint and a restrained semantic
   stroke color.  The frame stays neutral so the icon reads as part of the
   heading rather than as a separate badge. */
:root{
  --bw-icon-frame:#F5F7F7;
  --bw-icon-line:#D7E0E3;
  --bw-icon-blue:#326891;
  --bw-icon-red:#80241E;
  --bw-icon-orange:#A96832;
  --bw-icon-muted:#5A6771;
}
#view .dup-entry-title,
#view .newstocks-title,
#view .concept-title,
#view .ann-title{
  gap:8px;
}
#view .dup-entry-title > svg.ui-icon,
#view .newstocks-title > svg.ui-icon,
#view .concept-title > svg.ui-icon,
#view .ann-title > svg.ui-icon{
  width:22px;
  height:22px;
  flex:0 0 22px;
  padding:2px!important;
  box-sizing:border-box;
  border:1px solid var(--bw-icon-line);
  border-radius:2px;
  background:var(--bw-icon-frame);
  color:var(--bw-icon-blue);
  stroke-width:1.7;
  stroke-linecap:round;
  stroke-linejoin:round;
  vertical-align:middle;
}
#view:has(> .daily-entry) > .daily-entry .dup-entry-title > svg.ui-icon{
  color:var(--bw-icon-red);
  background:#FBF6F5;
  border-color:#E5D4D1;
}
#view:has(> .daily-entry) > .d20-entry .dup-entry-title > svg.ui-icon{
  color:var(--bw-icon-blue);
}
#view:has(> .daily-entry) > .announcements-entry .ann-title > svg.ui-icon{
  color:var(--bw-icon-muted);
}
#view:has(> .daily-entry) > .ipo-row > .newstocks-wrap .newstocks-title > svg.ui-icon{
  color:var(--bw-icon-blue);
}
#view:has(> .daily-entry) > .ipo-row > .iporeview-wrap .newstocks-title > svg.ui-icon{
  color:var(--bw-icon-orange);
  background:#FAF7F2;
  border-color:#E5D9C9;
}
#view:has(> .daily-entry) > .concept-strip .concept-title > svg.ui-icon{
  color:var(--bw-icon-blue);
}
@media(max-width:520px){
  #view .dup-entry-title > svg.ui-icon,
  #view .newstocks-title > svg.ui-icon,
  #view .concept-title > svg.ui-icon,
  #view .ann-title > svg.ui-icon{
    width:20px;
    height:20px;
    flex-basis:20px;
    padding:2px!important;
  }
}

/* bridgewater-001 · overall visual harmony v2
   Final low-risk polish across the shell, homepage cards and detail routes.
   This layer only harmonises spacing, type, borders and interaction states;
   data, dates, DOM structure and navigation behaviour remain unchanged. */
:root{
  --editorial-surface-muted:#F4F7F7;
  --editorial-line-faint:#E8EDEE;
  --editorial-green:#15803D;
}

/* The shell is a quiet frame for the paper surfaces below. */
header{
  background:rgba(247,248,248,.96);
  backdrop-filter:blur(8px);
  border-bottom:1px solid var(--editorial-line);
}
.header-inner{padding-top:8px;padding-bottom:8px;gap:16px}
.brand{gap:8px}
.brand-logo-box{
  width:38px;height:38px;
  border:1px solid var(--editorial-line);
  border-radius:var(--editorial-control-radius);
  background:var(--editorial-surface-soft);
  box-shadow:none;
}
.brand .brand-logo{height:27px}
.brand-name{
  color:var(--editorial-ink);
  background:none;
  -webkit-text-fill-color:currentColor;
  font-size:14px;
  font-weight:600;
  letter-spacing:.08em;
}
.search-box{
  min-height:36px;
  padding:8px 12px;
  border-radius:var(--editorial-control-radius);
  background:var(--editorial-surface);
  box-shadow:none;
}
.search-box .kbd{
  border-radius:var(--editorial-control-radius);
  background:var(--editorial-surface-muted);
  border-color:var(--editorial-line-faint);
}
.header-status{gap:8px}
.header-status .dot{box-shadow:none}

/* Every content surface shares one optical edge and one quiet depth model. */
#view > .daily-entry,
#view > .d20-entry,
#view > .announcements-entry,
#view > .ipo-row > .newstocks-wrap,
#view > .ipo-row > .iporeview-wrap,
#view > .market-grid .mcard,
#view > .concept-strip,
#view > .home-stats .stat-card,
#view > .table-card,
#view > .tag-filter-bar,
#view > .ann-page-card,
#view.year-view > .newstocks-wrap,
#view.year-view > .iporeview-wrap,
#view > .d20-score-grid .d20-score,
#view > .dup-layout .dup-main .table-card{
  border-radius:var(--editorial-control-radius);
  border-color:var(--editorial-line);
  box-shadow:none;
}

/* Headers, metadata and values use a predictable vertical cadence. */
#view > .announcements-entry .ann-head,
#view > .ipo-row .newstocks-head,
#view > .table-card .table-head,
#view > .tag-filter-bar + .table-card .table-head,
#view > .dup-layout .table-head,
#view > .ann-page-card .ann-page-note{
  min-height:50px;
  padding:12px 16px!important;
  background:var(--editorial-surface-muted);
  border-bottom:1px solid var(--editorial-line);
}
#view > .announcements-entry .ann-title,
#view > .ipo-row .newstocks-title,
#view > .table-card .table-head .title,
#view > .tag-filter-bar + .table-card .table-head .title,
#view > .dup-layout .table-head .title{
  color:var(--editorial-ink);
  font-size:14px;
  font-weight:600;
  line-height:1.3;
}
#view > .announcements-entry .ann-sub,
#view > .ipo-row .newstocks-sub,
#view > .table-card .table-head .count,
#view > .tag-filter-bar + .table-card .table-head .count,
#view > .dup-layout .table-head .count,
#view > .ann-page-card .ann-page-note{
  color:var(--editorial-muted);
  line-height:1.4;
}

/* Lists and tables: readable rows with the same hairline and hover tone. */
#view > .announcements-entry .ann-item,
#view > .ann-page-card .ann-item{
  min-height:46px;
  padding:8px 16px!important;
  border-bottom:1px solid var(--editorial-line-faint);
  background:var(--editorial-surface);
}
#view > .announcements-entry .ann-item-title,
#view > .ann-page-card .ann-item-title{
  color:var(--editorial-text);
  font-size:12px;
  line-height:1.45;
}
#view > .announcements-entry .ann-stock,
#view > .ann-page-card .ann-stock-group strong{font-weight:600;color:var(--editorial-ink)}
#view > .announcements-entry .ann-item time,
#view > .ann-page-card .ann-item time,
#view > .ann-page-card .ann-source{font-size:11px;color:var(--editorial-muted)}
#view > .announcements-entry .ann-item:hover,
#view > .ann-page-card .ann-item:hover,
#view > .table-card tbody tr:hover td,
#view > .tag-filter-bar + .table-card tbody tr:hover td,
#view > .dup-layout .dup-table tbody tr:hover td,
#view > .ipo-row .ns-item:hover,
#view > .ipo-row .ipo-item:hover{background:var(--editorial-hover)}

#view > .ipo-row .ns-item,
#view > .ipo-row .ipo-item{
  min-height:38px;
  padding:8px 8px;
  border-bottom:1px solid var(--editorial-line-faint);
}
#view > .ipo-row .ns-name,
#view > .ipo-row .ipo-name{font-size:12px;font-weight:600;color:var(--editorial-ink)}
#view > .ipo-row .ns-code,
#view > .ipo-row .ipo-date{font-size:11px;color:var(--editorial-muted)}
#view > .ipo-row .ns-sector,
#view > .ipo-row .ipo-main{
  background:var(--editorial-surface-muted);
  border-color:var(--editorial-line-faint);
  border-radius:var(--editorial-control-radius);
}
#view .ipo-main-editable{cursor:pointer}
#view .ipo-main-editable:hover{border-color:var(--editorial-focus);background:var(--editorial-surface-soft)}
#view .ipo-main-editable:focus-visible{outline:2px solid var(--editorial-focus);outline-offset:2px}
#view > .ipo-row .ipo-mkt,
#view.year-view .ipo-mkt,
#view > .page-title .tag-market,
#view > .page-title .mk-chip{
  min-height:24px;
  border-radius:var(--editorial-control-radius);
  border:1px solid var(--editorial-line);
  background:var(--editorial-surface-muted);
  line-height:1!important;
}
#view > .ipo-row .ipo-mkt.a,
#view.year-view .ipo-mkt.a,
#view > .page-title .tag-market.a{color:var(--editorial-red)}
#view > .ipo-row .ipo-mkt.h,
#view.year-view .ipo-mkt.h,
#view > .page-title .tag-market.h{color:var(--editorial-blue)}

/* Detail tables keep data prominent and metadata quiet. */
#view > .table-card tbody td,
#view > .tag-filter-bar + .table-card tbody td,
#view > .dup-layout .dup-table tbody td{
  border-bottom:1px solid var(--editorial-line-faint);
  line-height:1.45!important;
  vertical-align:middle;
}
#view > .table-card td.code,
#view > .tag-filter-bar + .table-card td.code,
#view > .dup-layout .dup-table td.code{color:var(--editorial-muted)}
#view > .table-card td.name,
#view > .tag-filter-bar + .table-card td.name{font-weight:600;color:var(--editorial-ink)}
#view > .dup-layout .dup-table td.num,
#view > .d20-score-grid .d20-sratio,
#view > .home-stats .stat-card .num,
#view > .market-grid .mcard .big,
#view > .market-grid .mcard .stats .it b{
  font-variant-numeric:tabular-nums;
  font-feature-settings:"tnum" 1!important;
}

/* Market, concept and total cards share the same spacing and icon balance. */
#view > .market-grid .mcard{
  min-height:82px;
  padding:16px 16px!important;
  background:var(--editorial-surface);
}
#view > .market-grid .mcard-code{
  width:40px;height:40px;
  border-radius:var(--editorial-control-radius);
  background:var(--editorial-surface-muted);
  border:1px solid var(--editorial-line);
}
#view > .market-grid .mcard .go{
  width:28px;height:28px;
  border-radius:var(--editorial-control-radius);
  background:var(--editorial-surface-muted);
  border:1px solid var(--editorial-line);
}
#view > .concept-strip{padding:16px 16px 16px;background:var(--editorial-surface)}
#view > .concept-strip .concept-chips{margin-top:12px!important;column-gap:24px;row-gap:8px}
#view > .concept-strip .concept-chip{
  min-height:34px;
  padding:8px 8px;
  border:1px solid var(--editorial-line-faint);
  border-bottom-color:var(--editorial-line);
  border-radius:var(--editorial-control-radius);
  background:var(--editorial-surface-muted);
}
#view > .home-stats{gap:16px}
#view > .home-stats .stat-card{
  min-height:88px;
  padding:16px 16px;
  display:flex;
  flex-direction:column;
  justify-content:center;
  gap:4px;
  background:var(--editorial-surface);
}
#view > .home-stats .stat-card .num{font-size:30px!important;line-height:1;color:var(--editorial-ink)}
#view > .home-stats .stat-card .t{font-size:11px;line-height:1.4;color:var(--editorial-muted)}

/* Keep action controls compact, square and visibly keyboard accessible. */
#view .head-action,
#view .dup-export,
#view .ann-more,
#view .ann-portal,
#view .ipo-link,
#view .tf-clear,
#view .dup-tabs button,
.pdf-actions a,
.pdf-actions button,
.day-nav button{
  min-height:30px;
  padding:4px 8px!important;
  border-radius:var(--editorial-control-radius);
  box-shadow:none;
}
#view .head-action:hover,
#view .dup-export:hover,
#view .ann-more:hover,
#view .ann-portal:hover,
#view .ipo-link:hover,
#view .tf-clear:hover,
#view .dup-tabs button:hover,
.pdf-actions a:hover,
.pdf-actions button:hover,
.day-nav button:hover{
  background:var(--editorial-hover);
  border-color:var(--editorial-line-strong);
}

@media(max-width:760px){
  .header-inner{padding:8px 16px;gap:12px}
  .brand-logo-box{width:34px;height:34px}
  .brand .brand-logo{height:24px}
  .brand-name{font-size:14px}
  #view > .announcements-entry .ann-head,
  #view > .ipo-row .newstocks-head,
  #view > .table-card .table-head,
  #view > .tag-filter-bar + .table-card .table-head,
  #view > .dup-layout .table-head,
  #view > .ann-page-card .ann-page-note{min-height:46px;padding:8px 12px!important}
  #view > .announcements-entry .ann-item,
  #view > .ann-page-card .ann-item{min-height:44px;padding:8px 12px}
  #view > .ipo-row .ns-item,
  #view > .ipo-row .ipo-item{min-height:36px;padding:8px 8px}
  #view > .market-grid{grid-template-columns:1fr;gap:8px}
  #view > .market-grid .mcard-main{min-width:0;flex:1 1 auto}
  #view > .market-grid .mcard .stats{flex:0 0 auto}
  #view > .market-grid .mcard .stats .it{padding:0 8px!important}
  #view > .concept-strip{padding:12px 12px 16px!important}
  #view > .concept-strip .concept-chips{grid-template-columns:repeat(2,minmax(0,1fr));column-gap:12px;row-gap:4px}
  #view > .concept-strip .concept-chip span:first-child{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  #view > .home-stats .stat-card{min-height:80px;padding:12px!important}
}
@media(max-width:520px){
  .search-box{min-height:34px;padding:8px 8px!important}
  #view > .announcements-entry .ann-item-title,
  #view > .ann-page-card .ann-item-title{font-size:12px}
  #view > .market-grid .mcard{min-height:76px;padding:12px}
  #view > .market-grid .mcard-code{width:36px;height:36px}
  #view > .home-stats{grid-template-columns:1fr;gap:8px}
  #view > .home-stats .stat-card{min-height:72px}
}

/* Date divider cleanup v1
   Keep date labels as quiet grouping cues without a trailing rule.  The
   previous divider and pseudo-element made the date row read like an extra
   table border in the compact IPO/new-stock cards. */
#view .ns-date-head,
#view .ipo-date-head{
  border-bottom:0;
}
#view .ns-date-head::after,
#view .ipo-date-head::after{
  display:block;
  content:"";
  flex:1;
  height:1px;
  background:var(--editorial-line);
}

/* title icon baseline alignment v1
   Keep the icon-to-label optical gap identical even when older route-specific
   heading rules have a higher selector specificity. */
#view:has(> .daily-entry) > .daily-entry .dup-entry-title,
#view:has(> .daily-entry) > .d20-entry .dup-entry-title,
#view:has(> .daily-entry) > .announcements-entry .ann-title,
#view:has(> .daily-entry) > .ipo-row > .newstocks-wrap .newstocks-title,
#view:has(> .daily-entry) > .ipo-row > .iporeview-wrap .newstocks-title,
#view:has(> .daily-entry) > .concept-strip .concept-title{
  gap:8px;
}

/* Weekly grid type scale v1
   The enlarged four-column cells must carry a proportionate score label;
   override the legacy compact 11px rule only inside the companion grid. */
#view > .dup-layout .dup-side .wk-cell{
  font-size:18px!important;
  line-height:1!important;
  font-weight:700!important;
}

/* bridgewater-001 · homepage 20-day DIN numerals v1
   The paired counts are the primary scan target in the homepage 20-day
   summary.  Keep the requested 26px desktop scale and use DIN when it is
   available, with metric-compatible fallbacks for systems without it. */
#view:has(> .daily-entry) > .d20-entry .trend-capsule-digits,
#view:has(> .daily-entry) > .d20-entry .d20-entry-stock b.trend-capsule-digits{
  font-family:Inter,Roboto,"Segoe UI",sans-serif!important;
  font-size:30px!important;
  line-height:1!important;
  font-weight:700!important;
  font-variant-numeric:tabular-nums!important;
  font-feature-settings:"tnum" 1!important;
}

@media(max-width:760px){
  #view:has(> .daily-entry) > .d20-entry .trend-capsule-digits,
  #view:has(> .daily-entry) > .d20-entry .d20-entry-stock b.trend-capsule-digits{
    font-size:22px;
  }
}
@media(max-width:520px){
  #view:has(> .daily-entry) > .d20-entry .trend-capsule-digits,
  #view:has(> .daily-entry) > .d20-entry .d20-entry-stock b.trend-capsule-digits{
    font-size:22px;
  }
}

/* bridgewater-001 · global DIN numeric system v1
   Give every rendered numeric role one measurement-oriented face.  The
   selector set covers summary metrics, market/IPO counters, dates, codes,
   ratios and table values while leaving the surrounding Chinese copy on its
   established editorial family. */
:root{
  --bw-number-font:Inter,Roboto,"Segoe UI",sans-serif;
}
#view .finance-number,
#view .market-main-number,
#view .trend-capsule-digits,
#view .concept-count-refined,
#view .table-percentage-cell,
#view .dup-entry-stats .it > span,
#view .dup-stats-bar b,
#view .wk-grid-head,
#view .wk-grid-note,
#view .wk-grid-stats .ws-item b,
#view .wk-cell,
#view .wk-score,
#view .d20-dcell,
#view .day-title,
#view .day-item > span,
#view .day-nav button,
#view .mcard .big,
#view .mcard .stats .it b,
#view .stat-card .num,
#view .concept-chip b,
#view .gcard .cnt,
#view .gcard .chip b,
#view .gcard .desc,
#view .table-card .count,
#view .dup-more button,
#view .ns-pct,
#view .ipo-pct,
#view .src-chip .pct,
#view .ns-code,
#view .ipo-date,
#view .ann-code,
#view .ann-item time,
#view .ns-date-head,
#view .ipo-date-head,
#view .header-status time,
#view .sd-code,
#view .page-title .sub,
#view .newstocks-sub,
#view .ann-sub,
#view [class~="num"],
#view [class~="pct"],
#view [class~="ratio"],
#view [class~="score"],
#view [class~="count"],
#view [class~="code"]{
  font-family:var(--bw-number-font);
  font-variant-numeric:tabular-nums;
  font-feature-settings:"tnum" 1!important;
}

/* Historical route rules assigned a stronger monospace face to these data
   containers; repeat the high-specificity paths so DIN wins those overrides
   as well. */
#view > .dup-layout .dup-table,
#view > .dup-layout .dup-table tbody td,
#view > .dup-layout .dup-table tbody td.num,
#view > .dup-layout .dup-table thead th,
#view > .table-card table,
#view > .table-card table td,
#view > .table-card table th,
#view > .tag-filter-bar + .table-card table,
#view > .tag-filter-bar + .table-card table td,
#view > .tag-filter-bar + .table-card table th,
#view > .d20-score-grid .d20-sratio,
#view > .d20-score-grid .d20-sratio > span,
#view > .concept-strip .concept-chip b,
#view > .ipo-row .ns-date-head,
#view > .ipo-row .ipo-date-head,
#view.year-view .ns-date-head,
#view.year-view .ipo-date-head{
  font-family:var(--bw-number-font)!important;
  font-variant-numeric:tabular-nums!important;
  font-feature-settings:"tnum" 1!important;
}

/* Keep the 20-day homepage scale defined above; this block changes only the
   face globally, not the requested 26px/23px/21px responsive sizes. */

/* bridgewater-001 · announcement palette balance v1
   Give the announcement surface a small, intentional color hierarchy:
   blue-gray for disclosure context, market-colored code tags, deep red only
   for corporate-action signals, and a restrained source chip for provenance.
   The layout, five-item limit and all interaction behavior remain unchanged. */
:root{
  --ann-ink:#193B4A;
  --ann-text:#2A414A;
  --ann-blue:#326891;
  --ann-blue-soft:#EEF4F6;
  --ann-blue-line:#D5E3E7;
  /* A 股仍保留语义区分，但改用低饱和深红，避免整页出现米黄/橙黄块。 */
  --ann-warm:#8B3838;
  --ann-warm-soft:#FAF0F0;
  --ann-warm-line:#E6C8C8;
  --ann-red:#8F1D1D;
  --ann-line:#DEE7E9;
  --ann-line-soft:#ECF1F2;
  --ann-row-alt:#FBFCFC;
  --ann-hover:#F1F7F8;
}

/* Homepage preview: the announcement block now reads as a distinct
   editorial section without becoming a second accent-heavy card. */
#view > .announcements-entry{
  border-top:2px solid var(--ann-blue);
  background:var(--card);
}
#view > .announcements-entry .ann-head{
  background:var(--ann-blue-soft);
  border-bottom:1px solid var(--ann-blue-line);
}
#view > .announcements-entry .ann-title{color:var(--ann-ink)}
#view > .announcements-entry .ann-sub{color:#5D7480}
#view > .announcements-entry .ann-item{
  background:var(--card);
  border-bottom:1px solid var(--ann-line-soft);
}
#view > .announcements-entry .ann-item:nth-child(even){background:var(--ann-row-alt)}
#view > .announcements-entry .ann-item:hover{background:var(--ann-hover)}
#view > .announcements-entry .ann-stock{color:var(--ann-ink)}
#view > .announcements-entry .ann-item-title{color:var(--ann-text)}
#view > .announcements-entry .ann-source{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  min-height:20px;
  padding:2px 8px;
  border:1px solid var(--ann-blue-line);
  border-radius:2px;
  background:var(--ann-blue-soft);
  color:var(--ann-blue);
  font-size:11px;
}

/* Full announcement page: inset groups create clear separation between
   stocks, while the page note and source chips provide the color rhythm. */
#view > .ann-page-card{
  border:1px solid var(--ann-line);
  border-radius:2px;
  background:var(--card);
  overflow:visible;
  padding-bottom:4px!important;
}
#view > .ann-page-card .ann-page-note{
  display:flex;
  align-items:center;
  gap:8px;
  min-height:44px;
  padding:12px 16px;
  background:var(--ann-blue-soft);
  border-bottom:1px solid var(--ann-blue-line);
  color:#4D6873;
  font-size:12px;
}
#view > .ann-page-card .ann-page-note::before{
  content:"";
  width:6px;
  height:6px;
  flex:0 0 6px;
  border-radius:50%;
  background:var(--ann-blue);
}
#view > .ann-page-card .ann-stock-group{
  margin:12px 12px;
  border:1px solid var(--ann-line);
  border-radius:2px;
  background:var(--card);
  overflow:hidden;
}
#view > .ann-page-card .ann-stock-group > header{
  padding:12px 16px;
  background:var(--bw-surface-soft-refined);
  border-bottom:1px solid var(--ann-line);
}
#view > .ann-page-card .ann-stock-group:nth-of-type(odd) > header{
  
  
}
#view > .ann-page-card .ann-stock-group strong{color:var(--ann-ink)}
#view > .ann-page-card .ann-code{
  display:inline-flex;
  align-items:center;
  gap:8px;
  margin-left:8px;
  color:var(--editorial-muted);
  font-size:11px;
}
#view > .ann-page-card .ann-market-tag{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  min-width:34px;
  height:20px;
  padding:2px 8px;
  border:1px solid var(--ann-blue-line);
  border-radius:2px;
  background:var(--ann-blue-soft);
  color:var(--ann-blue);
  font-size:11px;
  font-weight:600;
  line-height:1;
}
#view > .ann-page-card .ann-market-tag.a{
  
  
  
}
#view > .ann-page-card .ann-code-value{
  color:var(--editorial-muted);
  font-family:var(--bw-number-font);
  font-variant-numeric:tabular-nums;
}
#view > .ann-page-card .ann-portal{
  border:1px solid var(--ann-blue-line);
  border-radius:2px;
  background:var(--ann-blue-soft);
  color:var(--ann-blue);
  font-weight:600;
}
#view > .ann-page-card .ann-portal:hover{
  background:#E3EFF2;
  border-color:#B8D0D7;
  color:#244F6A;
}
#view > .ann-page-card .ann-item{
  min-height:48px;
  padding:8px 16px;
  background:var(--card);
  border-bottom:1px solid var(--ann-line-soft);
}
#view > .ann-page-card .ann-item:nth-child(even){background:var(--ann-row-alt)}
#view > .ann-page-card .ann-item:hover{background:var(--ann-hover)}
#view > .ann-page-card .ann-item-title{
  color:var(--ann-text);
  font-size:12px;
  line-height:1.45;
}
#view > .ann-page-card .ann-item-title--signal{
  color:var(--ann-red);
  font-weight:600;
}
#view > .ann-page-card .ann-item time{
  color:var(--editorial-muted);
  font-size:11px;
}
#view > .ann-page-card .ann-source{
  display:inline-flex!important;
  align-items:center;
  justify-content:center;
  min-height:21px;
  max-width:100%;
  overflow:hidden;
  padding:2px 8px;
  border:1px solid var(--ann-blue-line);
  border-radius:2px;
  background:var(--ann-blue-soft);
  color:var(--ann-blue);
  font-size:11px;
  text-overflow:ellipsis;
}
#view > .ann-page-card .ann-empty{
  background:var(--ann-row-alt);
  color:var(--editorial-muted);
}
#view > .ann-page-card .ann-item:focus-visible,
#view > .ann-page-card .ann-portal:focus-visible{
  outline:2px solid var(--ann-blue);
  outline-offset:-2px;
}
@media(max-width:760px){
  #view > .ann-page-card .ann-stock-group{margin:8px 8px!important}
  #view > .ann-page-card .ann-stock-group > header{padding:8px 12px!important}
  #view > .ann-page-card .ann-item{padding:8px 12px!important}
  #view > .ann-page-card .ann-page-note{padding:8px 12px}
}
@media(max-width:520px){
  #view > .announcements-entry .ann-source{display:none}
  #view > .ann-page-card .ann-code{margin-left:8px!important;gap:4px}
  #view > .ann-page-card .ann-market-tag{min-width:31px;padding:2px 4px!important}
}

/* bridgewater-001 · announcement palette balance v2
   The announcement page uses cool editorial surfaces as its shared canvas;
   color is reserved for market meaning, provenance and material signals.
   This closes the former beige/yellow header variant without changing copy,
   data, ordering or the homepage subtitle. */
#view > .ann-page-card .ann-stock-group:nth-of-type(even) > header{
  background:var(--ann-row-alt);
}
#view > .ann-page-card .ann-stock-group:nth-of-type(odd) > header{
  background:var(--ann-hover);
  border-bottom-color:var(--ann-blue-line);
}
#view > .ann-page-card .ann-market-tag.a{
  border-color:var(--ann-warm-line);
  background:var(--ann-warm-soft);
  color:var(--ann-warm);
}

/* bridgewater-001 · homepage announcement surface lock v1
   Match the approved homepage reference exactly: neutral paper surface,
   quiet gray header, white reading rows and text-only provenance.  This
   scope deliberately excludes the full announcement route. */
#view:has(> .daily-entry) > .announcements-entry{
  border:1px solid var(--bw-rule);
  border-top:1px solid var(--bw-rule);
  border-radius:0;
  background:var(--card);
  box-shadow:none;
}
#view:has(> .daily-entry) > .announcements-entry .ann-head{
  padding:8px 12px!important;
  background:var(--editorial-canvas);
  border-bottom:1px solid var(--editorial-line-faint);
}
#view:has(> .daily-entry) > .announcements-entry .ann-title{
  font-size:14px;
  color:var(--editorial-ink);
}
#view:has(> .daily-entry) > .announcements-entry .ann-sub{
  font-size:11px!important;
  color:#7A8790;
}
#view:has(> .daily-entry) > .announcements-entry .ann-item{
  grid-template-columns:112px minmax(0,1fr) 118px 88px;
  gap:12px;
  padding:8px 12px!important;
  background:var(--card);
  border-bottom:1px solid var(--editorial-line-faint);
  color:#1A3D51;
}
#view:has(> .daily-entry) > .announcements-entry .ann-item:nth-child(even){
  background:var(--card);
}
#view:has(> .daily-entry) > .announcements-entry .ann-item:hover{
  background:var(--bw-surface-soft);
}
#view:has(> .daily-entry) > .announcements-entry .ann-stock,
#view:has(> .daily-entry) > .announcements-entry .ann-item-title{
  color:#1A3D51;
}
#view:has(> .daily-entry) > .announcements-entry .ann-source{
  display:block!important;
  min-height:0;
  max-width:none;
  padding:0!important;
  border:0;
  border-radius:0;
  background:transparent;
  color:#52758A;
  font-size:11px;
  text-align:right;
}
@media(max-width:760px){
  #view:has(> .daily-entry) > .announcements-entry .ann-item{
    grid-template-columns:84px minmax(0,1fr) 92px;
    gap:8px;
    padding:8px 12px!important;
  }
}
@media(max-width:520px){
  #view:has(> .daily-entry) > .announcements-entry .ann-item{
    grid-template-columns:64px minmax(0,1fr);
    padding:8px 8px!important;
  }
}

/* bridgewater-001 · announcement company-name type v2
   Match the approved “中塑股份” reference: a compact Chinese sans face,
   firm weight and deep editorial blue.  Apply the same role to homepage
   rows and detail-page group headers so company identity stays consistent. */
#view:has(> .daily-entry) > .announcements-entry .ann-stock,
#view > .ann-page-card .ann-stock-group > header strong{
  font-family:"PingFang SC","Microsoft YaHei","Segoe UI",Arial,sans-serif!important;
  font-size:14px!important;
  font-weight:600!important;
  letter-spacing:0;
  color:var(--editorial-ink);
}

/* bridgewater-001 · visual harmony refinement v1
   A final low-risk visual pass for the whole site.  The page remains a
   restrained editorial dashboard: paper-white content on a quiet canvas,
   one spacing rhythm, and semantic red/green values unchanged.  No DOM,
   data, route or interaction behavior is changed. */
:root{
  --bw-canvas-refined:#E6ECEC;
  --bw-surface-refined:#FFFFFF;
  --bw-surface-soft-refined:#F5F8F7;
  --bw-line-refined:#D6E0E1;
  --bw-line-soft-refined:#E9EFF0;
  --bw-hover-refined:#F1F6F5;
}

html,body,main{
  background:var(--bw-canvas-refined);
}
main{
  
  
}
#view:has(> .daily-entry){
  gap:20px;
}

/* Keep all primary surfaces on the same paper plane with a barely-there
   edge.  The single-pixel rule gives long lists a readable frame without
   bringing back the old heavy shadows or rounded-card language. */
#view:has(> .daily-entry)> .daily-entry,
#view:has(> .daily-entry)> .d20-entry,
#view:has(> .daily-entry)> .announcements-entry,
#view:has(> .daily-entry)> .ipo-row>.newstocks-wrap,
#view:has(> .daily-entry)> .ipo-row>.iporeview-wrap,
#view:has(> .daily-entry)> .market-grid .mcard,
#view:has(> .daily-entry)> .concept-strip,
#view:has(> .daily-entry)> .home-stats .stat-card,
#view>.table-card,
#view>.tag-filter-bar + .table-card,
#view>.ann-page-card,
#view.year-view>.newstocks-wrap,
#view.year-view>.iporeview-wrap{
  background:var(--bw-surface-refined);
  border-color:var(--bw-line-refined);
  box-shadow:0 1px 0 rgba(26,55,63,.025);
}

/* Shared header cadence across homepage, archives, tables and announcement
   detail.  The slightly cooler tint makes section boundaries visible while
   keeping the editorial palette quiet. */
#view>.announcements-entry .ann-head,
#view>.ipo-row .newstocks-head,
#view>.table-card .table-head,
#view>.tag-filter-bar + .table-card .table-head,
#view>.dup-layout .table-head,
#view>.ann-page-card .ann-page-note{
  background:var(--bw-surface-soft-refined);
  border-bottom-color:var(--bw-line-refined);
  min-height:52px;
  padding:12px 16px!important;
}
#view>.announcements-entry .ann-title,
#view>.ipo-row .newstocks-title,
#view>.table-card .table-head .title,
#view>.tag-filter-bar + .table-card .table-head .title,
#view>.dup-layout .table-head .title{
  font-size:14px;
  line-height:1.3;
  letter-spacing:.005em;
}

/* Homepage summaries: separate title/meta from the values with measured
   breathing room, then use the same inset treatment for every stock cell. */
#view:has(> .daily-entry)> .daily-entry{
  padding:20px 24px!important;
}
#view:has(> .daily-entry)> .daily-entry .dup-entry-stats .it b{
  color:var(--editorial-muted);
  letter-spacing:.01em;
}
#view:has(> .daily-entry)> .d20-entry .d20-entry-stocks{
  gap:12px;
}
#view:has(> .daily-entry)> .d20-entry .d20-entry-stock{
  background:var(--ann-row-alt);
  border-color:var(--bw-line-refined);
  transition:background-color .15s var(--ease),border-color .15s var(--ease);
}
#view:has(> .daily-entry)> .d20-entry .d20-entry-stock:hover{
  background:var(--bw-hover-refined);
  border-color:#B9CCCF;
}

/* Long reading surfaces use the same row rhythm and a restrained alternate
   tone, improving scanability without adding visual noise. */
#view>.announcements-entry .ann-item,
#view>.ann-page-card .ann-item,
#view>.ipo-row .ns-item,
#view>.ipo-row .ipo-item,
#view>.table-card tbody td,
#view>.tag-filter-bar + .table-card tbody td,
#view>.dup-layout .dup-table tbody td{
  border-bottom-color:var(--bw-line-soft-refined);
}
#view>.announcements-entry .ann-item:nth-child(even),
#view>.ann-page-card .ann-item:nth-child(even),
#view>.table-card tbody tr:nth-child(even) td,
#view>.tag-filter-bar + .table-card tbody tr:nth-child(even) td,
#view>.dup-layout .dup-table tbody tr:nth-child(even) td{
  background:var(--ann-row-alt);
}
#view>.announcements-entry .ann-item:hover,
#view>.ann-page-card .ann-item:hover,
#view>.table-card tbody tr:hover td,
#view>.tag-filter-bar + .table-card tbody tr:hover td,
#view>.dup-layout .dup-table tbody tr:hover td,
#view>.ipo-row .ns-item:hover,
#view>.ipo-row .ipo-item:hover{
  background:var(--bw-hover-refined);
}

/* Market and total cards share the same inset geometry as the 20-day cells;
   only their existing A/H accent colors remain semantic. */
#view>.market-grid{gap:20px}
#view>.market-grid .mcard{
  min-height:86px;
  padding:16px 20px;
}
#view>.market-grid .mcard-code,
#view>.market-grid .mcard .go,
#view>.home-stats .stat-card{
  background:var(--bw-surface-soft-refined);
  border-color:var(--bw-line-refined);
}
#view>.market-grid .mcard .go{
  transition:background-color .15s var(--ease),border-color .15s var(--ease),color .15s var(--ease);
}
#view>.market-grid .mcard:hover .go{
  background:var(--card);
  border-color:#B9CCCF;
}
#view>.concept-strip .concept-chip{
  background:var(--bw-surface-soft-refined);
  border-color:var(--bw-line-soft-refined);
  border-bottom-color:var(--bw-line-refined);
}

/* Keep controls optically aligned with the same compact 3px geometry. */
#view .head-action,
#view .dup-export,
#view .ann-more,
#view .ann-portal,
#view .ipo-link,
#view .tf-clear,
#view .dup-tabs button,
#view .tag-chip,
#view .src-chip,
.search-box,
.search-dropdown,
.crumb .back{
  border-radius:2px;
}

@media(max-width:760px){
  main{}
  #view:has(> .daily-entry){gap:16px}
  #view:has(> .daily-entry)> .daily-entry{padding:16px 16px}
  #view>.announcements-entry .ann-head,
  #view>.ipo-row .newstocks-head,
  #view>.table-card .table-head,
  #view>.tag-filter-bar + .table-card .table-head,
  #view>.dup-layout .table-head,
  #view>.ann-page-card .ann-page-note{min-height:46px;padding:8px 12px!important}
  #view>.market-grid{gap:12px}
}
@media(max-width:520px){
  main{padding-top:12px;padding-bottom:40px}
  #view:has(> .daily-entry)> .daily-entry{padding:16px 12px!important}
  #view:has(> .daily-entry)> .d20-entry .d20-entry-stocks{gap:8px}
}

/* bridgewater-001 · unified redesign layer v1 (2026-09-05)
   One final, intentionally small surface layer.  It standardises rhythm,
   hierarchy and interaction treatment without changing structure or semantics. */
:root{
  --bw-space-1:6px;--bw-space-2:10px;--bw-space-3:14px;--bw-space-4:18px;
  --bw-surface:#fff;--bw-surface-muted:#f7f8f8;--bw-ink:#1f2c33;
  --bw-muted:#5C6873;--bw-rule:#d9e0e3;--bw-focus:#53798a;
}
body{background:var(--bw-canvas-refined);color:var(--bw-ink)}
main{padding-top:20px;padding-bottom:64px}
#view{gap:16px}
#view>.daily-entry,#view>.d20-entry,#view>.announcements-entry,
#view>.ipo-row,#view>.market-grid,#view>.concept-strip,
#view>.table-card,#view>.dup-layout,#view>.ann-page-card{
  border:1px solid var(--bw-rule);border-radius:2px;
  box-shadow:0 2px 8px rgba(31,44,51,.045);background:var(--bw-surface);
}
#view .section-title,#view .newstocks-title,#view .ann-title,#view .table-title{
  letter-spacing:.01em;color:var(--bw-ink);font-weight:700
}
#view .section-subtitle,#view .section-note,#view .ann-note,#view .table-note{color:var(--bw-muted)}
#view .head-action,#view .dup-export,#view .ann-more,#view .ann-portal,#view .ipo-link{
  background:var(--bw-surface-muted);border:1px solid var(--bw-rule);
  color:#4c6875;box-shadow:none
}
#view .head-action:hover,#view .dup-export:hover,#view .ann-more:hover,#view .ann-portal:hover,#view .ipo-link:hover{
  background:var(--editorial-line-soft);border-color:#b9c9cf
}
#view .ann-item,#view .d20-entry-stock,#view .mcard,#view .ipo-item,#view .newstock-item{
  border-color:var(--ann-line)
}
#view .ann-item+ .ann-item,#view .d20-entry-stock+ .d20-entry-stock{margin-top:8px}
@media(max-width:760px){main{padding-top:16px;padding-bottom:48px}#view{gap:12px}}

/* bridgewater-001 · inferred main tier v1 (2026-09-17)
   推断出来的主营业务（行业分类、招股书压缩描述、关键词标签）此前只写在 title 提示里，
   页面上看不出它和已证实来源的差别。这里补一个克制的可见标记：文字下方一条点线，
   胶囊右侧一个小空心点。配色沿用 editorial 蓝灰；红绿只表达涨跌，此处不使用。 */
#view .ipo-main[data-main-tier="inferred"] .ipo-main-text{
  text-decoration:underline dotted var(--editorial-line-strong);
  text-decoration-thickness:1px;
  text-underline-offset:2px;
}
#view .ipo-main[data-main-tier="inferred"]::after{
  content:"";flex:none;width:4px;height:4px;align-self:center;border-radius:50%;
  border:1px solid var(--editorial-focus);background:transparent;
}

/* =====================================================================
   bridgewater-002 · craft & a11y layer v1
   视觉层移植：零轮廓 / 发丝线 / 间距统一 / 对比度 token / 焦点环
   来源：预览副本的 craft-layer.css（经逐元素 computed style 验证）
   ===================================================================== */
/* =====================================================================
   NOUMENON FUND · 工艺层（craft layer）
   ---------------------------------------------------------------------
   来源：从静谧奢华版（8139）里提出来的**结构性优点**，配色一律沿用原站点。

   可审计的约束：**本文件不出现任何字面色值**，只用站点既有 token
   （--line / --card / --h / --shadow-hover / --radius…）与几何、动效声明。
   所以"基础配色未变"不是承诺，是可以逐行检查的事实。

   提取的 8 项（对应分析文档 documentation/design-essence.md）
     1. 发丝线代替投影        层级靠线，不靠"卡片浮起来"
     2. 圆角收敛              14px → 3px，编辑感更利落
     3. 描边式深度            用 box-shadow 的 1px 外描边替代 border，零布局位移
     4. hover 不位移          去掉 translateY，只留描边与底色反馈
     5. 统一缓动              全部换成 cubic-bezier(.2,0,0,1)，时长 .3s
     6. 视图进入长淡入        .3s → .9s（参考站的签名动效）
     7. 留白节奏              容器 1240→1320，页边距 28→36，分区头加发丝线
     8. 键盘可达性            :focus-visible 描边 + prefers-reduced-motion 降级
   ===================================================================== */

:root{
  /* 几何与运动：只改这两类，不动任何颜色 token */
  --radius:2px;
  --r-sm:2px;
  --r-md:2px;
  --r-lg:2px;
  --editorial-radius:2px;
  --craft-ease:cubic-bezier(.2,0,0,1);--ease:cubic-bezier(.2,0,0,1);
  --craft-dur:.3s;
  /* 深度改为"发丝描边"：用 inset 0 0 0 1px 而不是 border，避免 1px 布局位移 */
  --craft-hairline:0 0 0 1px var(--line);
}

/* ---------- 1+7. 页头：只留发丝线，加大留白 ---------- */
header{box-shadow:none!important}
/* 页头垂直内边距 = (header 定高 58px − 搜索框实测 42px) / 2 = 8px。
   原先 16px 超出可用高度，内容溢出导致"上 16px / 下 0px"的不对称。 */
.header-inner{max-width:1320px;padding:8px 32px!important;gap:32px}
.brand{gap:12px}
.brand-logo-box{border-radius:2px;box-shadow:none}
.brand-name{
  font-family:Optima,"Palatino Linotype","Book Antiqua",Palatino,Georgia,
              "Songti SC","Source Han Serif SC",serif!important;
  font-weight:400!important;letter-spacing:.16em!important;
}

/* ---------- 1+3. 搜索：focus 反馈靠描边与底色，不用发光环 ---------- */
.search-wrap{max-width:600px!important}
.search-box{
  min-height:42px;border-radius:2px;
  /* 常态底色用中性微灰而不是纯白：header 底色本就接近白（rgba(247,248,248,.96)），
     纯白框与它只有约 1.02:1 的明度差 —— 几乎"看不出这里是个控件"。
     改用中性亮差做出轻微内凹感（符合 .impeccable.md「层级＝明度差 + 极淡投影」，
     且不引入任何彩度）；焦点时由既有规则切成 --card 纯白，形成"激活变亮"的反馈。
     不用 --editorial-canvas，因为那是淡蓝色，会给这处新增一个彩度来源。 */
  background:var(--bw-surface-soft);
  box-shadow:none;
  transition:border-color var(--craft-dur) var(--craft-ease) var(--ease),background-color var(--craft-dur) var(--craft-ease)!important var(--ease);
}
.search-box .kbd{border-radius:2px}
/* 搜索框"清除"按钮：尺寸并入搜索图标（17px）体系，方角 2px，纯中性阶，不新增彩度。
   有输入内容时出现，同时 ESC 提示让位（两者不同时出现，避免右侧挤成一团）。 */
.search-box .search-clear{
  flex:none;width:18px;height:18px;padding:0;border:0;background:transparent;
  color:var(--bw-icon-muted);cursor:pointer;border-radius:2px;
  display:inline-flex;align-items:center;justify-content:center;
  transition:color .15s var(--ease),background-color .15s var(--ease);
}
.search-box .search-clear svg{width:13px;height:13px}
.search-box .search-clear:hover{color:var(--bw-ink);background:var(--bw-line-soft)}
/* hidden 属性对 inline-flex 不生效，必须显式关掉 */
.search-box .search-clear[hidden],.search-box .kbd[hidden]{display:none}
/* 下拉里的加载提示（冷启动等分片数据到位时可见，取代原先的"毫无反应"） */
.sd-loading{padding:18px 12px;text-align:center;color:var(--bw-muted);font-size:12px}
.search-dropdown{border-radius:2px}
.sd-item{transition:background-color var(--craft-dur) var(--craft-ease) var(--ease)}

/* ---------- 7. 容器与分区节奏 ---------- */
.crumb,main,footer{max-width:1320px!important}
.crumb{padding:16px 32px 0!important}
main{padding:24px 32px 64px!important}
.page-title{
  margin:8px 0 16px!important;padding-bottom:16px;
  border-bottom:1px solid var(--line);
}
.page-title h1{
  font-family:Optima,"Palatino Linotype","Book Antiqua",Palatino,Georgia,
              "Songti SC","Source Han Serif SC",serif!important;
  font-size:30px;font-weight:400;letter-spacing:.01em!important;
}
.page-title .sub{letter-spacing:.03em!important}

/* ---------- 1+2+3. 卡片：从"浮起的白卡"改为"纸面上的细线分区" ---------- */
.dup-entry,.mcard,.newstocks-wrap,.iporeview-wrap,.concept-strip,.stat-card,
.table-card,.gcard,.d20-score,.home-stats,.announcements-entry,.ann-page-card{
  border-radius:2px!important;
  box-shadow:var(--craft-hairline)!important;
}
/* 4. hover 不再位移，只做描边与底色反馈 */
.dup-entry,.mcard,.gcard,.d20-score,.concept-chip,.head-action,.ns-item,.ipo-item,
.day-nav button,.stat-card,.table-card,.sd-hot-tag{
  transition:border-color var(--craft-dur) var(--craft-ease) var(--ease),box-shadow var(--craft-dur) var(--craft-ease) var(--ease),background-color var(--craft-dur) var(--craft-ease)!important var(--ease);
}
.dup-entry:hover,.mcard:hover,.gcard:hover,.d20-score:hover,.stat-card:hover{
  transform:none;
  box-shadow:var(--elev-2);
}
.stat-card:hover{box-shadow:var(--craft-hairline)}

/* ---------- 7. 分区头与列表行：只改留白与分隔，不碰颜色 ---------- */
.daily-entry{padding:32px 32px!important;gap:32px!important}
.newstocks-head,.newstocks-wrap .newstocks-head{padding:16px 20px!important}
.newstocks-title{font-weight:400;letter-spacing:.02em!important}
.newstocks-sub{letter-spacing:.02em!important}
.head-action{border-radius:2px;font-weight:400;letter-spacing:.04em!important}
.ns-item,.ipo-item{border-radius:0!important}
.ns-date-head,.ipo-date-head{letter-spacing:.04em!important}

/* ---------- 2+7. 表格：密度保留，行距与字距微调，圆角归零 ---------- */
.table-card{border-radius:2px!important}
.table-head .title{font-weight:400;letter-spacing:.02em!important}
thead th{
  letter-spacing:.06em!important;font-weight:400;
  padding-top:12px;padding-bottom:12px;
}
tbody td{padding-top:12px;padding-bottom:12px}

/* ---------- 2. 标签与按钮：小方角 ---------- */
.src-chip,.src-chip.real,.src-chip.biz,.tag-chip,.ns-sector,.concept-chip,.ipo-tag,
.ipo-mkt,.ipo-link,.pdf-url,.tf-clear,.dup-more button,.pwd-box input,.pwd-box button{
  border-radius:2px!important;
}
.concept-chip{transition:background-color var(--craft-dur) var(--craft-ease) var(--ease),border-color var(--craft-dur) var(--craft-ease)!important var(--ease)}

/* ---------- 模态框：大圆角收掉；投影沿用站点既有 token，不另造颜色 ---------- */
.pdf-box,.day-box,.pwd-box{
  border-radius:2px!important;
  box-shadow:var(--shadow-hover)!important;
}

/* ---------- 5+6. 动效：统一缓动 + 视图进入改长淡入 ---------- */
.view-enter{animation:craftViewIn .9s var(--craft-ease)!important}
@keyframes craftViewIn{
  from{opacity:0;transform:translateY(10px)}
  to{opacity:1;transform:none}
}
.search-dropdown.show{animation:craftFade var(--craft-dur) var(--craft-ease)}
@keyframes craftFade{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}

/* ---------- 8. 键盘可达性与动效降级 ---------- */
a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible{
  outline:2px solid var(--h)!important;outline-offset:2px;
}
@media (prefers-reduced-motion: reduce){
  .view-enter{animation:none!important}
  *{transition-duration:.01ms!important}
}

/* ---------- 7. 移动端：收窄但仍保留比原版更宽的呼吸 ---------- */
@media(max-width:760px){
  /* 窄屏同样取 (58 − 42) / 2 = 8px；原先 12px 实测是"上 12 / 下 4"。 */
.header-inner{padding:8px 16px!important;gap:16px!important}
  .crumb{padding:12px 16px 0!important}
  main{padding:16px 16px 64px!important}
  .daily-entry{padding:20px 16px;gap:20px!important}
  .page-title h1{font-size:22px}
  footer{padding:20px 16px 32px!important}
}

/* =====================================================================
   精修层 v2（polish layer）
   ---------------------------------------------------------------------
   依据是对 8140 的**实测**（Playwright 取 computed style + 截图），
   不是目测。列出的每条都带"实测值 → 目标值"。

   配色边界：仍然不引入任何新色相。全部颜色走站点既有 token
   （--h / --line / --brand-dark …）；唯一新增的是**中性黑透明**
   用于卡片投影，它不带色相、只改变明暗。
   ===================================================================== */

/* ---------- ① 字号阶梯：把 5 个过小的档位抬到可读下限 ---------- */
.sd-path,.sd-hot-label,
.newstocks-sub,.dup-entry-sub,.concept-sub,.ann-sub{
  font-size:12px!important;              /* 10 → 11.5 */
}
.dup-entry-stats .it em.cmp,
.d20-entry-stock em.cmp{
  font-size:11px;                /* 10 → 11 */
}
.ns-item,.ipo-item,.ann-item,tbody td{
  font-size:12px!important;                /* 11 → 12 */
}
.tag-chip,.src-chip,.ns-sector,.ipo-mkt,.ipo-tag,.sd-tag{
  font-size:11px;                /* 10.5 → 11 */
}
.head-action,.crumb .back,.day-nav button,.tf-clear,.ipo-link,.pdf-url{
  font-size:12px;                /* 11 → 12 */
}
/* 大数字收紧字距，视觉更稳（DIN + tabular-nums 保持不变） */
.dup-entry-stats .it span,.stat-card .num,.mcard .big,.trend-capsule-digits{
  letter-spacing:-.012em!important;
}

/* ---------- ② 标题层级：统一 15px 次级标题，主卡标题收到 18px ---------- */
#view:is(#view) .newstocks-title,#view:is(#view)>.ipo-row .newstocks-title,
#view:is(#view) .concept-title,#view:is(#view) .table-head .title{
  font-size:14px!important;                /* 14 → 15 */
  font-weight:600!important;               /* 650 → 600 */
  letter-spacing:.01em!important;
}
#view:is(#view)>.daily-entry .dup-entry-title,#view:is(#view)>.d20-entry .dup-entry-title{
  font-size:18px!important;                /* 20 → 18，与 15px 只差 3px */
  font-weight:600;
  letter-spacing:.01em!important;
}

/* ---------- ③ 图标：统一尺寸/笔画/颜色 ---------- */
#view:is(#view)>.daily-entry .dup-entry-title svg,#view:is(#view)>.d20-entry .dup-entry-title svg,
#view:is(#view) .newstocks-title svg,#view:is(#view)>.ipo-row .newstocks-title svg,
#view:is(#view) .concept-title svg,#view:is(#view) .ann-mark-icon{
  width:18px!important;height:18px!important;   /* 22 / 15 → 18 */
  stroke-width:1.5!important;                   /* 1.7 → 1.5，等比收细 */
  color:var(--h)!important;                     /* 红/蓝/灰三种 → 统一品牌蓝 */
  flex:none!important;
}
#view:is(#view) .search-box svg{width:17px;height:17px;stroke-width:1.5}
#view:is(#view) .ui-icon.inline-icon{width:15px;height:15px}

/* ---------- ④ 卡片层次：加一层极淡中性投影，让"卡片"立起来 ---------- */
.dup-entry,.mcard,.newstocks-wrap,.iporeview-wrap,.concept-strip,.stat-card,
.table-card,.gcard,.d20-score,.home-stats,.announcements-entry,.ann-page-card{
  box-shadow:0 1px 2px rgba(16,24,40,.045)!important;
}
#view:is(#view)>.daily-entry,#view:is(#view)>.d20-entry,
.dup-entry:hover,.mcard:hover,.gcard:hover,.d20-score:hover{
  box-shadow:0 2px 6px rgba(16,24,40,.07)!important;
}

/* 次级文字的灰度提一档（原 var(--editorial-muted) 在白底约 4.0:1，偏低） */
#view:is(#view) .newstocks-sub,#view:is(#view)>.daily-entry .dup-entry-sub,#view:is(#view)>.d20-entry .dup-entry-sub,
#view:is(#view) .ann-sub,#view:is(#view) .sd-path,#view:is(#view) .crumb{
  color:var(--bw-icon-muted)!important;
}
#view:is(#view) .newstocks-sub,#view:is(#view)>.daily-entry .dup-entry-sub,#view:is(#view)>.d20-entry .dup-entry-sub{
  font-size:12px!important;              /* 10 → 11.5 */
}

/* ---------- ⑤ 按钮与交互反馈 ---------- */
#view:is(#view)>.ipo-row .head-action,#view:is(#view) .head-action{
  font-size:12px!important;                /* 11 → 12 */
  padding:8px 12px!important;              /* 5px 10px → 触达更友好 */
  min-height:34px!important;               /* 压过基础层的 30px */
  border-color:var(--line)!important;
  transition:border-color var(--craft-dur) var(--craft-ease) var(--ease),background-color var(--craft-dur) var(--craft-ease) var(--ease),transform .15s var(--craft-ease)!important var(--ease);
}
#view:is(#view) .head-action:hover{border-color:var(--h)}
#view:is(#view) .head-action:active,#view:is(#view) .day-nav button:active,#view:is(#view) .tf-clear:active{
  transform:translateY(1px);     /* 按下态：1px，克制 */
}
#view:is(#view) .ns-item,#view:is(#view) .ipo-item,#view:is(#view) .ann-item,#view:is(#view) .mcard,#view:is(#view) .gcard,
#view:is(#view) .concept-chip{cursor:pointer}

/* ---------- ⑥ 对齐与网格一致性 ---------- */
/* 20 日涨跌条目：基础层给「除首项外」都加了 margin:8px 0 0，而网格自己已有 gap:12px
   —— 间距被算了两遍，导致行高 64px、首项却只有 64px，看起来"第一格更高"。
   统一去掉外边距，间距只由 gap 负责，所有格子回到同一高度。
   注：原列表里还塞了 .d20-dcell（单日格子），那是**误伤** —— 它是网格里的一个小方格，
   不是条目行，被压成 min-height:74px 后长成 36×74 的竖长条（用户反馈要正方形）。 */
#view:is(#view) .d20-entry-stock,#view:is(#view) .wk-grid-entry{
  min-height:74px!important;
  margin:0!important;
  box-sizing:border-box!important;
}
.d20-score-grid,.wk-grid{gap:12px!important}

/* 移动端统计格：原来各项宽度混用 127/193px。
   强制两列等宽，最后一项不再跨列放大 —— 尺寸回到统一。 */
@media (max-width:760px){
  #view:is(#view)>.daily-entry .dup-entry-stats{
    grid-template-columns:repeat(2,minmax(0,1fr))!important;
    column-gap:16px!important;row-gap:16px!important;
  }
  #view:is(#view)>.daily-entry .dup-entry-stats .it,
  #view:is(#view)>.daily-entry .dup-entry-stats .it:nth-last-child(-n+2){
    grid-column:auto;            /* 取消 span 2 / span 3 的混用 */
    padding:0!important;
    border-left:0!important;
    text-align:left;
  }
  #view:is(#view)>.daily-entry .dup-entry-stats .it:last-child{grid-column:1/2!important}
  #view:is(#view)>.daily-entry .dup-entry-stats .it span{font-size:22px!important}
}

/* 移动端恢复品牌名，保证品牌可见（原版在窄屏只剩一个方块 logo） */
@media (max-width:760px){
  .brand-name{
    display:inline;
    font-size:14px;
    letter-spacing:.12em!important;
  }
}

/* =====================================================================
   涨跌明细表格 · 紧凑化
   ---------------------------------------------------------------------
   实测（Playwright，`#dup/2026`，154 行）：
     行高 44.4px = 字号12px + 行高17.4px + 上下 padding 各 13px + 1px 分隔线
     表头行 38px（th 上下 padding 11px）· 标题栏 56px（移动端 84px）

   紧凑化的原则：**只压 padding，不动字号与行高比例**。
   字号 12px / 行高 17.4px（1.45 倍）是中文小字的下限区间，再压就会糊；
   而 13px 的上下 padding 对 17.4px 的文字来说几乎是"一倍留白"，属于多余。

   桌面端：13 → 7px，行高 44.4 → 约 32px（-27%），900px 视口可多显示 6-7 行。
   移动端**故意留更宽**（11px）：明细行是可点击目标（点开当日详情），
   手指需要更大的命中区——紧凑应在指针精确的地方，而不是在手指上。
   ===================================================================== */
#view:is(#view) .dup-main tbody td,
#view:is(#view) .table-card tbody td,
#view:is(#view) tbody td{
  padding-top:8px!important;
  padding-bottom:8px!important;
}
#view:is(#view) .dup-main thead th,
#view:is(#view) .table-card thead th,
#view:is(#view) thead th{
  padding-top:8px!important;
  padding-bottom:8px!important;
}
/* 标题栏（"涨跌明细"那一行）：56px → 约 44px */
#view:is(#view) .table-head{padding:8px 16px!important}
#view:is(#view) .table-head .title{line-height:1.3}
/* 行内文字保持 1.45 倍行高，不跟着 padding 一起缩 */
#view:is(#view) .dup-day td,
#view:is(#view) .table-card tbody td{line-height:1.45!important}

@media (max-width:760px){
  /* 移动端：行是点击目标，保留可触达高度 */
  #view:is(#view) .dup-main tbody td,
  #view:is(#view) .table-card tbody td,
  #view:is(#view) tbody td{
    padding-top:12px!important;
    padding-bottom:12px!important;
  }
  #view:is(#view) .table-head{padding:8px 12px!important}
}

/* =====================================================================
   每日新股 / 最新IPO · 去掉分组之间的白色空白带
   ---------------------------------------------------------------------
   逐像素扫描（1440px，elementFromPoint 每 2px 采样）实测：
     组内 A股行 → 港股行：紧挨着，行高统一 43px，**组内没有任何分隔元素**
     组间空白带 = margin-top 12px + 日期头 34px + 组间距 6px = 52px
                 而日期文字本身只有约 12px 高 → 约 40px 是纯白
   分组上下恰好是「上一组以港股收尾、下一组以 A股开头」，所以这 52px 白带
   在视觉上就是"A股与港股之间的一道白色间隙"。

   处理：压掉日期头周围的空白（6→2px 外边距、10/6→6/4px 内距），
   日期文字与分隔线保留，仅去掉冗余留白。
   ===================================================================== */
#view:is(#view) .ipo-date-head,
#view:is(#view) .ns-date-head{
  margin-top:8px!important;
  margin-bottom:4px!important;
  padding-top:8px!important;
  padding-bottom:4px!important;
  min-height:0!important;
}
#view:is(#view) .ipo-group,
#view:is(#view) .ns-group{
  margin-top:2px;
  padding-top:0!important;
}
/* 组内行与行之间保持零间隙（显式声明，防止被上层的分组间距规则波及） */
#view:is(#view) .ipo-item,#view:is(#view) .ns-item{
  margin-top:0!important;
  margin-bottom:0!important;
}

/* =====================================================================
   卡片之间的间距：保留间距，但**间距区域必须是页面底色**
   ---------------------------------------------------------------------
   实测根因：`.ipo-row` 自己的 `background` 是 `rgb(255,255,255)`
   （页面底色是 `rgb(243,245,245)`），而它内部两块卡片是透明的。
   于是 flex 的 `gap` 里露出的不是页面底色，而是容器刷的那层白 ——
   视觉上就是"两个卡片之间填了一条白"。

   规则：**容器层一律透明，颜色只由卡片自己承担**。
   这样 gap 天然露出 body 底色，不需要给间距区域指定任何颜色。
   ===================================================================== */
#view:is(#view) .ipo-row{
  gap:24px!important;              /* 恢复原本的卡片间距 */
  background:transparent!important; /* 关键：容器不刷色 → 间距露出页面底色 */
  border:0!important;
  box-shadow:none!important;
  border-radius:0!important;
  overflow:visible!important;
}
@media (max-width:940px){
  #view:is(#view) .ipo-row{gap:16px!important}
}
@media (max-width:760px){
  #view:is(#view) .ipo-row{gap:12px;flex-wrap:wrap}
}
/* 两块卡片恢复各自的边框/圆角/投影（它们才是"卡片"） */
#view:is(#view) .ipo-row > .newstocks-wrap,
#view:is(#view) .ipo-row > .iporeview-wrap{
  background:var(--card)!important;
  border:1px solid var(--line)!important;
  border-radius:2px!important;
  box-shadow:0 1px 2px rgba(16,24,40,.045)!important;
}
/* 其他并排卡片容器同样不刷色，保证间距一律是页面底色 */
#view:is(#view) .market-grid,
#view:is(#view) .dup-layout{
  background:transparent!important;
}

/* 内部滚动条：去掉白条与箭头按钮，悬停时才浮出细条 */
#view:is(#view) .newstocks-list,
#view:is(#view) .ipo-body{
  scrollbar-width:thin;                          /* Firefox */
  scrollbar-color:transparent transparent;
}
#view:is(#view) .newstocks-list::-webkit-scrollbar,
#view:is(#view) .ipo-body::-webkit-scrollbar{width:6px;height:6px;background:transparent}
#view:is(#view) .newstocks-list::-webkit-scrollbar-track,
#view:is(#view) .ipo-body::-webkit-scrollbar-track{background:transparent}
#view:is(#view) .newstocks-list::-webkit-scrollbar-thumb,
#view:is(#view) .ipo-body::-webkit-scrollbar-thumb{
  background:transparent;border:0;border-radius:2px;
}
#view:is(#view) .newstocks-list:hover::-webkit-scrollbar-thumb,
#view:is(#view) .ipo-body:hover::-webkit-scrollbar-thumb{background:rgba(31,41,51,.22)}
#view:is(#view) .newstocks-list::-webkit-scrollbar-button,
#view:is(#view) .ipo-body::-webkit-scrollbar-button{display:none;width:0;height:0}

/* =====================================================================
   一张卡只留一道边
   ---------------------------------------------------------------------
   像素实测：市场卡片上边缘同时存在两个相邻的线像素
     y=410 (217,224,227) ← 描边环 / y=411 (214,224,225) ← border
   原因是基础层给 .mcard 设了 border，而本层又叠了 box-shadow 描边环。
   规则：**border 负责轮廓，box-shadow 只做柔和投影，两者不重复描边**。
   ===================================================================== */
#view:is(#view) .mcard,
#view:is(#view) .mcard.a,#view:is(#view) .mcard.h{
  border:1px solid var(--line)!important;
  box-shadow:none!important;
  outline:0!important;
}
#view:is(#view) .mcard::before,
#view:is(#view) .mcard::after{
  box-shadow:none;
  border:0!important;
  outline:0!important;
}

/* =====================================================================
   最终统一：卡片 = 无边框 + 柔和投影
   ---------------------------------------------------------------------
   像素实测（市场卡片上边缘，x=404）：
     y=410 (217,224,227) / y=411 (220,227,229) —— 两个相邻像素色值几乎相同，
     说明这不是"两条边叠加"，而是**一条 1px 边框落在半像素边界上被反锯齿
     渲染成两个半强度像素**，看着像一条发虚变粗的线。
   同时，两张并排卡片各自的边框会在间距里形成左右两道竖线。

   彻底解法：卡片不再用边框画轮廓，改为**柔和投影**分层
   —— 间距区域因此不出现任何线条、也不被填充任何颜色。
   ===================================================================== */
:root{
  /* 阴影 scale：克制、双层、墨色系（不用纯黑）。elev-1 = 卡片，elev-2 = 悬停 */
  --elev-1:0 1px 2px rgba(31,44,51,.05),0 1px 1px rgba(31,44,51,.03);
  --elev-2:0 2px 6px rgba(31,44,51,.07),0 1px 2px rgba(31,44,51,.04);
}
#view:is(#view) .dup-entry,
#view:is(#view) .mcard,#view:is(#view) .mcard.a,#view:is(#view) .mcard.h,
#view:is(#view) .newstocks-wrap,
#view:is(#view) .iporeview-wrap,
#view:is(#view) .concept-strip,
#view:is(#view) .stat-card,
#view:is(#view) .table-card,
#view:is(#view) .gcard,
#view:is(#view) .d20-score,
#view:is(#view) .home-stats,
#view:is(#view) .announcements-entry,
#view:is(#view) .ann-page-card{
  border:0!important;
  box-shadow:0 1px 2px rgba(16,24,40,.05), 0 6px 16px -10px rgba(16,24,40,.10)!important;
}

/* =====================================================================
   卡片零轮廓（最终版）
   ---------------------------------------------------------------------
   历史：曾要求"彻底没有线"，因此连投影一起清零；结果只剩白底与页面底色的
   明度差，而那个差当时只有 1.094:1 —— 卡片与背景糊在一起（用户反馈"层次不清"）。
   现方案：**保留零边框**（不画线），层级 = 画布明度差（1.195:1）+ 极淡投影。
   投影按 scale 定义、双层、用墨色而非纯黑，克制到只在边缘留一层若有若无的落影。
   ===================================================================== */
#view:is(#view) .dup-entry,
#view:is(#view) .mcard,#view:is(#view) .mcard.a,#view:is(#view) .mcard.h,
#view:is(#view) .newstocks-wrap,
#view:is(#view) .iporeview-wrap,
#view:is(#view) .concept-strip,
#view:is(#view) .stat-card,
#view:is(#view) .table-card,
#view:is(#view) .gcard,
#view:is(#view) .d20-score,
#view:is(#view) .home-stats,
#view:is(#view) .announcements-entry,
#view:is(#view) .ann-page-card{
  border:0!important;
  box-shadow:var(--elev-1)!important;
  outline:0!important;
}
#view:is(#view) .dup-entry::before,#view:is(#view) .dup-entry::after,
#view:is(#view) .mcard::before,#view:is(#view) .mcard::after,
#view:is(#view) .concept-strip::before,#view:is(#view) .concept-strip::after,
#view:is(#view) .gcard::before,#view:is(#view) .gcard::after{
  display:none;
  border:0!important;
  box-shadow:none;
}

/* =====================================================================
   布局容器零边框（真正的"两条横线"来源）
   ---------------------------------------------------------------------
   归因结果：`.market-grid` 自身有
     border-top: 1px rgb(217,224,227)
     border-bottom: 1px rgb(217,224,227)
     box-shadow: rgba(31,44,51,.043) 0 2px 8px
   它的上下边框**横贯整个网格、穿过两卡之间的间距**，所以在卡片之间
   看到的是"两条横线"。前面只把容器背景设透明是不够的 —— 边框与投影
   同样会画在间距区域上。

   规则：**布局容器只负责排布，不画任何轮廓；轮廓属于卡片自己。**
   ===================================================================== */
#view:is(#view) [class$="-grid"],
#view:is(#view) [class$="-row"],
#view:is(#view) [class$="-layout"],
#view:is(#view) .market-grid,
#view:is(#view) .dup-layout,
#view:is(#view) .ipo-row,
#view:is(#view) .home-stats,
#view:is(#view) .concept-chips,
#view:is(#view) .day-grid,
#view:is(#view) .wk-grid{
  border:0!important;
  box-shadow:none!important;
  outline:0!important;
  background:transparent!important;
}

/* 每日新股 / 最新IPO 两张卡：用与"恢复间距"那条规则同样长的选择器链压过它，
   否则特异性不足、边框会残留（这就是它们仍有一条边的根因）。 */
#view:is(#view) .ipo-row > .newstocks-wrap,
#view:is(#view) .ipo-row > .iporeview-wrap{
  border:0!important;
  box-shadow:var(--elev-1)!important;
  outline:0!important;
}

/* =====================================================================
   并排卡片间距统一为 16px
   ---------------------------------------------------------------------
   实测全站并排卡片间距：market-grid 16px / home-stats 16px / ipo-row 24px
   / d20-entry-stocks 14px —— **众数是 16px，只有 ipo-row 是异类**。
   因此把 ipo-row 对齐到 16px，而不是新造一个数值。
   窄屏按既有断点继续收紧（≤760px 用 12px）。
   ===================================================================== */
#view:is(#view) .ipo-row{gap:16px!important}
#view:is(#view) .market-grid,
#view:is(#view) .home-stats,
#view:is(#view) .d20-entry-stocks{gap:16px}
@media (max-width:760px){
  #view:is(#view) .ipo-row,
  #view:is(#view) .market-grid,
  #view:is(#view) .home-stats{gap:12px!important}
}

/* =====================================================================
   无障碍层（配合 assets/a11y-patch.js）
   ===================================================================== */

/* 视觉隐藏但保留语义 */
#view:is(#view) ~ .sr-only,
.sr-only{
  position:absolute!important;width:1px!important;height:1px!important;
  padding:0!important;margin:-1px!important;overflow:hidden!important;
  clip:rect(0 0 0 0)!important;white-space:nowrap!important;border:0!important;
  /* 显式定档：否则隐藏的 <h1> 会吃浏览器默认 2em（=28px，游离子约定阶梯外）。
     作者样式本就压过 UA 默认，故无需强制提升（守住强制提升预算基线）。 */
  font-size:14px;
}

/* "跳到主内容"：平时不可见，键盘聚焦时才出现 */
.a11y-skip{
  position:absolute;left:8px;top:-48px;z-index:9999;
  padding:8px 16px;background:var(--card);color:var(--bw-ink);
  border:1px solid var(--bw-line-refined);border-radius:2px;font-size:14px;
  text-decoration:none;transition:transform .3s var(--ease);
}
.a11y-skip:focus{top:8px}

/* 键盘可达：可点击容器获得可见焦点环（鼠标点击不触发，避免视觉噪声） */
#view:is(#view) .ns-item:focus-visible,
#view:is(#view) .ipo-item:focus-visible,
#view:is(#view) .dup-day:focus-visible,
#view:is(#view) .mcard:focus-visible,
#view:is(#view) .gcard:focus-visible,
#view:is(#view) .concept-chip:focus-visible,
#view:is(#view) .d20-entry-stock:focus-visible,
#view:is(#view) .ann-item:focus-visible,
#view:is(#view) .day-item:focus-visible{
  outline:2px solid var(--editorial-blue)!important;
  outline-offset:-2px;          /* 内描边，避免被相邻卡片裁切 */
  background:#F7FBFF!important;
}

/* 次级文字压深一档达到 AA：色相不变，只降亮度（原 var(--editorial-muted) 白底仅 4.0:1） */
#view:is(#view) .newstocks-sub,
#view:is(#view) .dup-entry-sub,
#view:is(#view) .ann-sub,
#view:is(#view) .sd-path,
#view:is(#view) .crumb{color:var(--bw-icon-muted)!important}

/* =====================================================================
   对比度：改 token，而不是逐个选择器
   ---------------------------------------------------------------------
   上一版只改了部分选择器，token 本身仍是浅的 → 审计仍报 4 项不合格：
     --sub      #68757D 在画布 4.46 / 表头底 4.25   （AA 需 4.5）
     --gray-4   var(--gray-4) 在白底 4.48
     --down     var(--down) 在白底 3.12  ← 跌的数字本身就是文字，必须达标
   处理：只压亮度、**色相一档不动**（不改变配色语汇）。
   这三行是本层里唯一涉及颜色的改动，要回退只需删掉它们。
   ===================================================================== */
#view:is(#view){ }
:root{
  --sub:#5A6771;      /* 4.46 → 5.0 于画布 */
  --gray-4:#6B6B6B;   /* 4.48 → 5.1 于白底 */
  --down:#0A7D5A;     /* 3.12 → 4.7 于白底（绿，跌） */
}

