/* block-v3-published.css — v3 区块编辑器发布的 .b-* 文章样式（自包含，由 article.html 引入）
   字体/变量/块样式抽取自 block-editor-v3.html，选择器 .canvas-frame 已适配为 .b-article。 */
.b-article{margin:0;width:100%}
.container-block{margin:0;padding:0}

@font-face{font-family:'YS-Optima';src:url('https://jianshisheji.cn/fonts/yinjispace-Optima.woff2') format('woff2');font-display:swap}
@font-face{font-family:'YS-Deng';src:url('https://jianshisheji.cn/fonts/yinjispace-Deng.subset.woff2') format('woff2'), url('https://jianshisheji.cn/fonts/yinjispace-Deng.woff2') format('woff2');font-display:swap}
@font-face{font-family:'YS-AdobeTextPro';src:url('https://jianshisheji.cn/fonts/yinjispace-AdobeTextPro.woff2') format('woff2');font-display:swap}
@font-face{font-family:'YS-Futura';src:url('https://jianshisheji.cn/fonts/yinjispace-Futura.woff2') format('woff2');font-display:swap}
@font-face{font-family:'YS-NowarCnC';src:url('https://jianshisheji.cn/fonts/yinjispace-NowarCnC.woff2') format('woff2');font-display:swap}
@font-face{font-family:'YS-NowarCnCUI';src:url('https://jianshisheji.cn/fonts/yinjispace-NowarCnCUI.subset.woff2') format('woff2'), url('https://jianshisheji.cn/fonts/yinjispace-NowarCnCUI.woff2') format('woff2');font-display:swap}
@font-face{font-family:'YS-verlagbook';src:url('https://jianshisheji.cn/fonts/yinjispace-verlagbook.woff2') format('woff2');font-display:swap}
@font-face{font-family:'Barlow';src:url('https://jianshisheji.cn/fonts/Barlow-Medium.ttf') format('truetype');font-display:swap}
@font-face{font-family:'Muli';src:url('https://jianshisheji.cn/fonts/Muli-ExtraLight.ttf') format('truetype');font-display:swap}
@font-face{font-family:'Cabin';src:url('https://jianshisheji.cn/fonts/Cabin-Italic.ttf') format('truetype');font-display:swap}
@font-face{font-family:'Milky Han Term CL';src:url('https://jianshisheji.cn/fonts/MilkyTermCL-ExtraLight.woff2') format('woff2'), url('https://jianshisheji.cn/fonts/MilkyTermCL-ExtraLight.ttf') format('truetype');font-display:swap}
@font-face{font-family:'Swei Ax Sans CJK JP';src:url('https://jianshisheji.cn/fonts/SweiAxSansCJKjp-Thin.woff2') format('woff2'), url('https://jianshisheji.cn/fonts/SweiAxSansCJKjp-Thin.ttf') format('truetype');font-display:swap}
@font-face{font-family:'Taipei Sans TC Beta';src:url('https://jianshisheji.cn/fonts/TaipeiSansTCBeta-Light.woff2') format('woff2'), url('https://jianshisheji.cn/fonts/TaipeiSansTCBeta-Light.ttf') format('truetype');font-display:swap}
@font-face{font-family:'Milky Han Mono CN';src:url('https://jianshisheji.cn/fonts/MilkyMonoCn-ExtraLight.woff2') format('woff2'), url('https://jianshisheji.cn/fonts/MilkyMonoCn-ExtraLight.ttf') format('truetype');font-display:swap}
@font-face{font-family:'SourceHanSansXL';src:url('https://jianshisheji.cn/fonts/SourceHanSansCN-ExtraLight.woff2') format('woff2'), url('https://jianshisheji.cn/fonts/SourceHanSansCN-ExtraLight.otf') format('opentype');font-display:swap}
@font-face{font-family:'SourceHanSansM';src:url('https://jianshisheji.cn/fonts/SourceHanSansCN-Medium.woff2') format('woff2'), url('https://jianshisheji.cn/fonts/SourceHanSansCN-Medium.ttf') format('truetype');font-display:swap}
@font-face{font-family:'SourceHanSansB';src:url('https://jianshisheji.cn/fonts/SourceHanSansCN-Bold.woff2') format('woff2'), url('https://jianshisheji.cn/fonts/SourceHanSansCN-Bold.otf') format('opentype');font-display:swap}
@font-face{font-family:'SourceHanSansN';src:url('https://jianshisheji.cn/fonts/SourceHanSansCN-Normal.woff2') format('woff2'), url('https://jianshisheji.cn/fonts/SourceHanSansCN-Normal.otf') format('opentype');font-display:swap}
:root{
  --gold:#c9a96e;--gold-soft:#e8d6aa;--ink:#111827;--ink-soft:#4b5563;--line:#d1d5db;
  --bg:#0f1115;--panel:#1a1d24;--panel-2:#252932;--text:#e6e6e6;--text-soft:#9aa0a6;--danger:#ef4444;
  --paper:#FFFDFA;--body:#747474;--cn-color:#474747;--en-color:#747474;
  --serif:'YS-Optima','YS-Deng','YS-AdobeTextPro','YS-Futura',system-ui,sans-serif;
  --cn:'PingFang SC','Microsoft YaHei',system-ui,sans-serif;
  --yscn:'YS-Deng','YS-NowarCnC','YS-NowarCnCUI','PingFang SC','Microsoft YaHei',sans-serif;
  --scene-bg:#FFFDFA;--scene-ink:#474747;--scene-muted:#747474;--scene-line:#e5e5e5;
}
*,*::before,*::after{box-sizing:border-box}
/* 注意：本文件注入 article.html，不得设置全局 html/body 背景/颜色，避免覆盖站点主题 */
html,body{margin:0;padding:0;-webkit-font-smoothing:antialiased}
button,input,textarea,select{font-family:inherit}
button{cursor:pointer}

/* ===== 顶部工具栏 ===== */
.topbar{position:sticky;top:0;z-index:100;height:56px;padding:0 20px;background:var(--panel);display:flex;align-items:center;gap:10px}
.topbar .brand{font-family:var(--serif);font-size:14px;letter-spacing:2px;color:var(--gold);font-weight:700;margin-right:6px;text-transform:uppercase;white-space:nowrap}
.topbar .sep{width:1px;height:24px;background:#2d3139}
.topbar button{height:32px;padding:0 12px;border-radius:6px;background:var(--panel-2);color:var(--text);border:1px solid #2d3139;font-size:12px;letter-spacing:0.5px;transition:all .15s}
.topbar button:hover{background:#2d3139;border-color:var(--gold)}
.topbar button.primary{background:var(--gold);color:var(--ink);border-color:var(--gold);font-weight:600}
.topbar button.primary:hover{background:var(--gold-soft);color:var(--ink)}
.topbar .spacer{flex:1}
.topbar .tabs{display:flex;gap:0;background:var(--panel-2);border-radius:6px;overflow:hidden}
.topbar .tabs button{background:transparent;border:none;border-radius:0;height:32px;padding:0 14px;color:var(--text-soft)}
.topbar .tabs button.active{background:var(--gold);color:var(--ink);font-weight:600}

/* ===== 主体三栏布局 ===== */
.main{display:grid;grid-template-columns:220px 1fr 300px;height:calc(100vh - 56px)}

/* ===== 左侧块列表 ===== */
.leftbar{background:var(--panel);border-right:1px solid #2d3139;overflow:hidden;padding:14px 10px;display:flex;flex-direction:column}
.leftbar h4{margin:0 0 10px;font-size:11px;letter-spacing:2px;color:var(--text-soft);text-transform:uppercase;font-weight:600;flex-shrink:0}
.leftbar .block-list{display:flex;flex-direction:column;gap:5px;flex:1;min-height:0;overflow-y:auto;padding-right:4px;position:relative;z-index:1}
.leftbar .block-item{padding:9px 10px;background:var(--panel-2);border-radius:6px;border:1px solid transparent;cursor:pointer;display:flex;align-items:center;gap:8px;font-size:12px;transition:all .15s}
.leftbar .block-item:hover{background:#2d3139;border-color:var(--gold-soft)}
.leftbar .block-item.active{border-color:var(--gold);background:#2d3139}
.leftbar .block-item .num{font-size:10px;color:var(--text-soft);min-width:18px}
.leftbar .block-item .label{flex:1;font-weight:500}
.leftbar .block-item .actions{display:flex;gap:2px}
.leftbar .block-item .actions button{width:22px;height:22px;padding:0;background:transparent;border:none;color:var(--text-soft);font-size:13px;line-height:1;border-radius:4px}
.leftbar .block-item .actions button:hover{color:var(--gold);background:rgba(255,255,255,.05)}
.leftbar .empty{padding:18px 10px;text-align:center;color:var(--text-soft);font-size:12px}
.leftbar .add-row{display:flex;flex-direction:column;gap:5px;margin-top:0;padding:12px 0 0;border-top:1px solid #2d3139;max-height:none;overflow-y:visible;flex-shrink:0;position:relative;z-index:2;background:var(--panel);box-shadow:0 -6px 12px rgba(0,0,0,.25)}
.leftbar .add-row button{height:32px;background:var(--panel-2);border:1px solid #2d3139;color:var(--gold);font-size:12px;border-radius:6px;text-align:left;padding:0 10px}
.leftbar .add-row button:hover{background:var(--gold);color:var(--ink);border-color:var(--gold)}

/* ===== 中间画布 ===== */
.canvas-area{overflow-y:auto;background:#0a0c10;padding:24px;display:flex;justify-content:center}
.b-article{width:100%;background:var(--scene-bg);color:var(--scene-ink);box-shadow:0 0 40px rgba(0,0,0,.5);min-height:200px;transition:background .25s,color .25s;--ink:var(--scene-ink);--ink-soft:var(--scene-muted);--cn-color:var(--scene-ink);--en-color:var(--scene-muted)}
.b-article[data-scene="dark"]{--scene-bg:#141414;--scene-ink:#ffffff;--scene-muted:#b8b8b8;--scene-line:#333}
.b-article.mobile-mode{max-width:375px;width:375px;flex-shrink:0;--pad:20px}
/* 发布页（article.html）内的 .b-article：去掉编辑器画布的悬浮卡片阴影，避免重黑边 */
.article-content .b-article{box-shadow:none}

/* ===== 右侧属性面板 ===== */
.rightbar{background:var(--panel);border-left:1px solid #2d3139;overflow-y:auto;padding:14px}
.rightbar h4{margin:0 0 10px;font-size:11px;letter-spacing:2px;color:var(--text-soft);text-transform:uppercase;font-weight:600}
.rightbar .field{margin-bottom:12px}
.rightbar .field label{display:block;font-size:11px;color:var(--text-soft);margin-bottom:5px;letter-spacing:.5px}
.rightbar .field input,.rightbar .field textarea,.rightbar .field select{width:100%;padding:7px 9px;background:var(--panel-2);border:1px solid #2d3139;color:var(--text);border-radius:4px;font-size:12px}
.rightbar .field input:focus,.rightbar .field textarea:focus,.rightbar .field select:focus{outline:none;border-color:var(--gold)}
.rightbar .field textarea{min-height:54px;resize:vertical;font-family:var(--cn)}
.rightbar .field-row{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.rightbar .field-row-3{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}
.rightbar .field-row-4{display:grid;grid-template-columns:repeat(4,1fr);gap:6px}
.rightbar .hint{font-size:10px;color:var(--text-soft);margin-top:4px;line-height:1.5}
.rightbar .empty-state{padding:28px 12px;text-align:center;color:var(--text-soft);font-size:12px;line-height:1.6}
.rightbar .empty-state svg{margin-bottom:10px;opacity:.3}
.rightbar .field-group-title{font-size:10px;color:var(--gold);letter-spacing:1px;text-transform:uppercase;margin:16px 0 8px;padding-top:10px;border-top:1px solid #2d3139}
.rightbar .chk-label{display:flex;align-items:center;gap:6px;cursor:pointer;font-size:12px;color:var(--text);margin-top:4px}
.rightbar .chk-label input{width:auto;margin:0}
.rightbar .seg-box{padding:10px;background:var(--panel-2);border:1px solid #2d3139;border-radius:6px;margin-bottom:10px}
.rightbar .seg-box .seg-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}
.rightbar .seg-box .seg-head b{font-size:12px;color:var(--gold)}
.rightbar .seg-box .seg-head button{background:transparent;border:none;color:var(--text-soft);font-size:12px;padding:2px 4px;border-radius:4px}
.rightbar .seg-box .seg-head button:hover{color:var(--danger);background:rgba(255,255,255,.05)}

/* ===== 项目信息弹窗 ===== */
.modal{position:fixed;inset:0;background:rgba(0,0,0,.6);display:none;align-items:center;justify-content:center;z-index:1000;backdrop-filter:blur(4px)}
.modal.is-open{display:flex}
.modal .modal-dialog{background:#fff;color:var(--ink);width:min(960px,92vw);max-height:90vh;border-radius:8px;display:grid;grid-template-columns:1fr 360px;overflow:hidden;box-shadow:0 20px 60px rgba(0,0,0,.4)}
.modal .modal-header{grid-column:1 / -1;padding:16px 22px;border-bottom:1px solid #e5e7eb;display:flex;align-items:center;justify-content:space-between;font-family:var(--serif);font-size:18px;letter-spacing:1px;font-weight:700}
.modal .modal-header .close{width:32px;height:32px;border-radius:50%;border:none;background:transparent;font-size:22px;cursor:pointer;color:var(--ink-soft)}
.modal .modal-header .close:hover{background:transparent}
.modal .form-area{padding:20px 22px;overflow-y:auto;max-height:calc(90vh - 60px)}
.modal .form-row{margin-bottom:14px}
.modal .form-row label{display:block;font-size:12px;color:var(--ink-soft);margin-bottom:5px;letter-spacing:.3px;font-weight:500}
.modal .form-row label .req{color:var(--danger);margin-left:2px}
.modal .form-row input,.modal .form-row select,.modal .form-row textarea{width:100%;padding:9px 11px;border:1px solid var(--line);border-radius:6px;font-size:13px;background:#fff;color:var(--ink);font-family:var(--cn)}
.modal .form-row input:focus,.modal .form-row select:focus,.modal .form-row textarea:focus{outline:none;border-color:var(--gold);box-shadow:0 0 0 3px rgba(201,169,110,.15)}
.modal .form-row textarea{min-height:54px;resize:vertical}
.modal .form-row .file-row{display:flex;gap:8px;align-items:center}
.modal .form-row .file-row input{flex:1}
.modal .form-row .file-row .upload-btn{padding:8px 12px;background:var(--ink);color:#fff;border:none;border-radius:6px;font-size:12px;cursor:pointer;white-space:nowrap;font-family:var(--cn)}
.modal .form-row .file-row .upload-btn:hover{background:#374151}
.modal .form-row .two-col{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.modal .form-row .checkbox-row{display:flex;align-items:center;gap:8px;padding:9px 11px;border:1px solid var(--line);border-radius:6px;cursor:pointer}
.modal .form-row .checkbox-row input{width:auto;margin:0}
.modal .form-row .checkbox-row span{font-size:13px;color:var(--ink)}
.modal .preview-area{padding:20px;background:#f9fafb;border-left:1px solid #e5e7eb;overflow-y:auto;max-height:calc(90vh - 60px)}
.modal .preview-area h5{margin:0 0 14px;font-size:12px;color:var(--ink-soft);letter-spacing:2px;text-transform:uppercase;font-weight:600}
.modal .preview-card{background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 4px 12px rgba(0,0,0,.08);margin-bottom:18px}
.modal .preview-card .cover{width:100%;height:200px;background:#e5e7eb;background-size:cover;background-position:center;display:flex;align-items:center;justify-content:center;color:var(--text-soft);font-size:12px}
.modal .preview-card .body{padding:14px 16px}
.modal .preview-card .body .cat{font-size:10px;color:var(--gold);letter-spacing:1.5px;text-transform:uppercase;font-weight:600;margin-bottom:4px}
.modal .preview-card .body .title{font-family:var(--serif);font-size:18px;font-weight:700;color:var(--ink);line-height:1.3;margin-bottom:6px}
.modal .preview-card .body .sub{font-size:12px;color:var(--ink-soft);line-height:1.5}
.modal .preview-area .share-options{margin-top:18px;padding:14px;background:#fff;border-radius:6px;border:1px solid #e5e7eb}
.modal .preview-area .share-options h6{margin:0 0 10px;font-size:11px;color:var(--ink-soft);letter-spacing:1.5px;text-transform:uppercase}
.modal .preview-area .share-options .toggle{display:flex;align-items:center;justify-content:space-between;padding:7px 0;border-bottom:1px solid #f3f4f6;font-size:12px}
.modal .preview-area .share-options .toggle:last-child{border-bottom:none}
.modal .preview-area .share-options .switch{width:36px;height:20px;background:#d1d5db;border-radius:10px;position:relative;cursor:pointer;transition:background .2s}
.modal .preview-area .share-options .switch.on{background:var(--gold)}
.modal .preview-area .share-options .switch::after{content:'';position:absolute;top:2px;left:2px;width:16px;height:16px;background:#fff;border-radius:50%;transition:transform .2s}
.modal .preview-area .share-options .switch.on::after{transform:translateX(16px)}
.modal .modal-footer{grid-column:1 / -1;padding:12px 22px;border-top:1px solid #e5e7eb;background:#f9fafb;display:flex;justify-content:flex-end;gap:10px}
.modal .modal-footer button{padding:9px 18px;border-radius:6px;border:1px solid var(--line);background:#fff;font-size:13px;color:var(--ink-soft);cursor:pointer;font-family:var(--cn)}
.modal .modal-footer button:hover{background:transparent}
.modal .modal-footer button.primary{background:var(--ink);color:#fff;border-color:var(--ink)}
.modal .modal-footer button.primary:hover{background:#374151}

/* ===== 块渲染（公共） ===== */
.b-article{--pad:60px;--b-pad-top:80px;--b-pad-bottom:0}
.b-article.mobile-mode{--pad:20px}
.b-block{padding:var(--b-pad-top) var(--pad) var(--b-pad-bottom);background:var(--scene-bg);color:var(--scene-ink);transition:background .25s,color .25s}
/* 自由布局：子元素为绝对定位，padding 变小会让所有图错位；锁定 60px 不动 */
.b-article .b-free{padding:60px}
.b-block[data-bg="light"]{background:#fffdfa}
.b-block[data-bg="dark"]{background:#e7e4da}
.b-article[data-scene="dark"] .b-block[data-bg="light"]{background:#141414}
.b-article[data-scene="dark"] .b-block[data-bg="dark"]{background:#131313}
.b-article[data-scene="dark"] .b-block:not([data-bg]){background:#141414}

/* clearfix：阻止内部段落 margin 溢出到块外形成间隙 */
.b-block::before,.b-block::after{content:"";display:table}
.b-block::after{clear:both}
/* 双栏块：.b-block 与 .b-split 共用 grid 容器，clearfix 伪元素会被 grid 当作额外 item 产生隐式行并触发 row gap，导致图片底边无法贴金线 */
.b-split::before,.b-split::after,.b-split2::before,.b-split2::after,.b-splitWide::before,.b-splitWide::after{content:none;display:none}
.b-block-selected{outline:2px dashed var(--gold);outline-offset:-2px;cursor:pointer}
.b-block-hover{outline:1px dashed rgba(201,169,110,.4);outline-offset:-1px}
.tag-line{display:inline-block;font-family:var(--serif);font-size:11px;color:#111827;letter-spacing:2px;text-transform:uppercase;font-weight:700;margin:0 0 18px}
/* ===== 深色场景：颜色联动 ===== */
.b-article[data-scene="dark"] .tag-line,
.b-article[data-scene="dark"] .b-h2 h2,
.b-article[data-scene="dark"] .b-text h2,
.b-article[data-scene="dark"] .b-split h2{color:var(--gold) !important}
.b-article[data-scene="dark"] .b-text .para-cn,
.b-article[data-scene="dark"] .b-split .para-cn,
.b-article[data-scene="dark"] .b-split2 .para-cn,
.b-article[data-scene="dark"] .b-splitWide .para-cn,
.b-article[data-scene="dark"] .b-custom .seg-text .para-cn{color:#ffffff !important}
.b-article[data-scene="dark"] .b-text .para,
.b-article[data-scene="dark"] .b-split .para,
.b-article[data-scene="dark"] .b-split2 .para,
.b-article[data-scene="dark"] .b-splitWide .para,
.b-article[data-scene="dark"] .b-gallery .caption,
.b-article[data-scene="dark"] .b-gallery .item-caption,
.b-article[data-scene="dark"] .b-big .item-caption,
.b-article[data-scene="dark"] .b-custom .item-caption,
.b-article[data-scene="dark"] .b-free .item-caption,
.b-article[data-scene="dark"] .b-fullimg .caption,
.b-article[data-scene="dark"] .b-custom .seg-text,
.b-article[data-scene="dark"] .b-custom .seg-text .para-en{color:#dfdfdf !important}
.b-article[data-scene="dark"]{--cn-color:#ffffff;--en-color:#e8e8e8;--ink:#ffffff;--ink-soft:#d0d0d0;--body:#e8e8e8}
.b-article[data-scene="dark"] .tag-line,
.b-article[data-scene="dark"] .b-h2 h2{text-shadow:0 1px 6px rgba(0,0,0,.45)}

/* Hero */
.b-hero{position:relative;min-height:100vh;width:100%;display:flex;align-items:flex-end;overflow:hidden;background:#000;padding:0}
.b-hero > .bg{position:absolute;inset:0;background-size:cover;background-position:center}
.b-hero > .scrim{position:absolute;inset:0;background:transparent}
.b-hero > .caption{position:absolute;left:0;right:0;bottom:0;padding:0 7% 60px;max-width:600px;color:#fff;z-index:2}
.b-hero .cap-title{font-family:var(--serif);font-size:16px;font-weight:700;letter-spacing:2.5px;line-height:1.5;color:#fff;text-transform:uppercase;margin:0 0 14px}
.b-hero .cap-sub{font-family:var(--cn);font-size:12px;color:#fff;line-height:2;letter-spacing:1px;margin:0 0 22px}
.b-hero .cap-tags{font-family:var(--serif);font-size:10px;letter-spacing:2px;color:rgba(255,255,255,.7);text-transform:uppercase;display:flex;gap:10px;flex-wrap:wrap}
.b-hero .cap-tags span{margin:0;padding:0;border-left:none}
.b-hero .cap-tags span:not(:last-child):after{content:"|";margin-left:10px;color:rgba(255,255,255,.4)}

/* Split */
.b-split{display:grid;grid-template-columns:1fr 1fr;grid-template-areas:'text img';gap:var(--gap);align-items:start}
.b-split.swapped{grid-template-areas:'img text'}
.b-split > .col-text{grid-area:text;display:flex;flex-direction:column;justify-content:flex-start}
.b-split > .col-img{grid-area:img;position:relative;width:100%;background:transparent;overflow:hidden}
.b-split > .col-img div.img-fill{display:block;position:absolute;inset:0;background-size:cover;background-position:center}
.b-split .para{font-family:var(--serif);font-size:14px;font-weight:400;color:var(--ink);line-height:1.85;margin:0 0 14px}

/* Split2 左文右双图 */
.b-split2{display:grid;grid-template-columns:calc((2 * 100% - 5 * var(--gap) + 2 * var(--img-gap)) / 5) calc((3 * 100% - 2 * var(--img-gap)) / 5);grid-template-areas:'text imgs';gap:var(--gap);align-items:start}
.b-split2.swapped{grid-template-areas:'imgs text';grid-template-columns:calc((3 * 100% - 2 * var(--img-gap)) / 5) calc((2 * 100% - 5 * var(--gap) + 2 * var(--img-gap)) / 5)}
.b-split2 > .col-text{grid-area:text;display:flex;flex-direction:column;justify-content:flex-start}
.b-split2 > .col-imgs{grid-area:imgs;display:grid;grid-template-columns:1fr 1fr;gap:var(--img-gap);align-items:stretch}
.b-split2 > .col-imgs .img-wrap{position:relative;width:100%;background:transparent;overflow:hidden;aspect-ratio:var(--aspect)}
.b-split2 > .col-imgs div.img-fill{display:block;position:absolute;inset:0;background-size:cover;background-position:center}
.b-split2 .para{font-family:var(--serif);font-size:14px;font-weight:400;color:var(--ink);line-height:1.85;margin:0 0 14px}

/* SplitWide 宽文窄图 */
.b-splitWide{--img-gap:16px;display:grid;grid-template-columns:calc((7 * 100% - 10 * var(--gap) + 7 * var(--img-gap)) / 10) calc((3 * 100% - 7 * var(--img-gap)) / 10);grid-template-areas:'text img';gap:var(--gap);align-items:start}
.b-splitWide.swapped{grid-template-areas:'img text';grid-template-columns:calc((3 * 100% - 7 * var(--img-gap)) / 10) calc((7 * 100% - 10 * var(--gap) + 7 * var(--img-gap)) / 10)}
.b-splitWide > .col-text{grid-area:text;display:grid;grid-template-columns:120px 1fr;gap:200px;align-content:start}
.b-splitWide > .col-text .credits{grid-column:1;font-family:var(--serif);font-size:10px;letter-spacing:1px;text-transform:uppercase;color:var(--ink);line-height:1.6}
.b-splitWide > .col-text .credits .credit-row{display:flex;flex-direction:column;margin-bottom:12px}
.b-splitWide > .col-text .credits .credit-label{font-weight:700;color:var(--ink)}
.b-splitWide > .col-text .credits .credit-value{font-weight:400;color:var(--scene-muted)}
.b-splitWide > .col-text .text-main{grid-column:2}
.b-splitWide > .col-img{grid-area:img;position:relative;width:100%;background:transparent;overflow:hidden;aspect-ratio:var(--aspect)}
.b-splitWide > .col-img div.img-fill{display:block;position:absolute;inset:0;background-size:cover;background-position:center}
.b-splitWide .para{font-family:var(--serif);font-size:14px;font-weight:400;color:var(--ink);line-height:1.85;margin:0 0 14px}
.b-block :last-child{margin-bottom:0 !important}

/* Text */
.b-text{display:flow-root}
.b-text .para{font-family:var(--serif);font-size:14px;font-weight:400;color:var(--ink);line-height:1.85;margin:0 0 14px}

/* Gallery */
.b-gallery .grid{display:grid;grid-template-columns:repeat(var(--cols),1fr);gap:var(--gap)}
.b-gallery .item{position:relative}
.b-gallery .item .img-wrap{position:relative;width:100%;overflow:hidden;background:transparent;aspect-ratio:var(--aspect)}
.b-gallery .item .img-wrap div.img-fill{display:block;position:absolute;inset:0;background-size:cover;background-position:center}
.b-gallery .item-caption{padding:10px 0 0;font-size:12px;color:var(--scene-muted);text-align:left;line-height:1.5}

/* Fullimg */
.b-fullimg{position:relative;min-height:100vh;width:100%;padding:0;overflow:hidden;display:flex;align-items:flex-end}
.b-fullimg .img-ratio{position:absolute;inset:0;width:100%;height:100%;background:transparent;overflow:hidden}
.b-fullimg .img-ratio div.img-fill{display:block;position:absolute;inset:0;background-size:cover;background-position:center}
.b-fullimg .caption{position:relative;z-index:2;width:100%;padding:24px 60px;font-size:12px;color:#fff;letter-spacing:.5px;text-align:left;background:none}

/* H2 */
.b-h2{text-align:center}
.b-h2 h2{font-family:var(--serif);font-size:24px;color:var(--ink);letter-spacing:1px;margin:0;font-weight:400}

/* Custom columns */
.b-custom .custom-grid{display:grid;grid-template-columns:repeat(var(--cols),1fr);gap:var(--gap)}
.b-custom .seg{grid-column:span var(--span)}
.b-custom .seg-img{position:relative;width:100%;background:transparent;overflow:hidden;aspect-ratio:var(--aspect)}
.b-custom .seg-img div.img-fill{display:block;position:absolute;inset:0;background-size:cover;background-position:center}
.b-custom .seg-video{position:relative;width:100%;background:#000;overflow:hidden;aspect-ratio:var(--aspect)}
.b-custom .seg-video-frame,.b-custom .seg-video-file{position:absolute;inset:0;width:100%;height:100%;border:0}
.b-custom .seg-video-file{object-fit:cover;background:#000}
.b-custom .seg-video-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#888;font-size:13px;background:#f3f4f6}
.b-custom .seg-text{font-family:var(--serif);font-size:14px;line-height:1.8;color:var(--ink)}
.b-custom .item-caption{padding:10px 0 0;font-size:12px;color:var(--scene-muted);text-align:left;line-height:1.5}

/* Big images */
.b-big .big-grid{display:grid;grid-template-columns:repeat(var(--n),1fr);gap:var(--gap)}
.b-big .item{position:relative}
.b-big .item .img-wrap{position:relative;width:100%;overflow:hidden;background:transparent;aspect-ratio:var(--aspect)}
.b-big .item .img-wrap div.img-fill{display:block;position:absolute;inset:0;background-size:cover;background-position:center}
.b-big .item-caption{padding:10px 0 0;font-size:12px;color:var(--scene-muted);text-align:left;line-height:1.5}
/* Free layout */
.b-free{position:relative;width:100%;min-height:600px;background:var(--scene-bg)}
.b-free .free-item{position:absolute;background:transparent;overflow:hidden;cursor:move;user-select:none;display:flex;flex-direction:column}
.b-free .free-item div.img-fill{display:block;position:absolute;inset:0;background-size:cover;background-position:center}
.b-free .free-item .free-img{position:relative;flex:1;min-height:0}
.b-free .free-item.text{background:transparent;align-items:center;justify-content:center;padding:12px}
.b-free .free-item.text .free-text{font-family:var(--cn);font-size:16px;line-height:1.6;color:var(--scene-ink);text-align:center;word-break:break-word}
.b-free .free-item .resize-handle{position:absolute;right:0;bottom:0;width:18px;height:18px;background:var(--gold);cursor:nwse-resize;opacity:.8;z-index:10}
.b-free .free-item .resize-handle:hover{opacity:1}
.b-free .free-item.selected{outline:2px dashed var(--gold);outline-offset:-2px}
.b-free .snap-guide{position:absolute;background:var(--gold);z-index:100;pointer-events:none;box-shadow:0 0 0 1px rgba(0,0,0,.2)}
.b-free .snap-guide.v{width:2px;top:0;bottom:0}
.b-free .snap-guide.h{height:2px;left:0;right:0}
.b-free .item-caption{padding:10px 0 0;font-size:12px;color:var(--scene-muted);text-align:left;line-height:1.5}

/* ===== 文章页全宽（Hero / fullimg 突破 1280 容器满屏） ===== */
.article-content{overflow-x:clip}
.article-content .b-hero,
.article-content .b-fullimg{
  position:relative;
  width:100vw;
  max-width:100vw;
  margin-left:calc(50% - 50vw);
  margin-right:calc(50% - 50vw);
}
/* hero 从屏幕顶部开始铺，navbar 浮在 hero 之上（透明背景），hero 高度 +navbar 让首屏仍占满 100vh */
.article-content .b-hero{
  margin-top:calc(-1 * var(--navbar-height,72px));
  min-height:calc(100vh + var(--navbar-height,72px));
}
/* Hero caption 重新受 1280 约束居中（防止在超宽屏跑到边上） */
.article-content .b-hero > .caption{max-width:min(1280px,calc(100vw - 12%));width:100%;left:0;right:0;padding-left:7%;padding-right:7%;box-sizing:border-box}
.article-content .b-fullimg .caption{max-width:min(1280px,calc(100vw - 80px));padding-left:60px;box-sizing:border-box}

/* ===== 移动端（编辑器预览 + 真实 H5） ===== */
@media (max-width:768px){
  .b-article{--pad:20px;--b-pad-top:30px;--b-pad-bottom:0}
  .b-block:not(.b-hero){padding-top:30px !important;padding-bottom:0 !important}
  /* 全宽 Hero/fullimg 在手机端保留 100vw 突破 */
  .article-content .b-hero,
  .article-content .b-fullimg{width:100vw;margin-left:calc(50% - 50vw);margin-right:calc(50% - 50vw)}
  .article-content .b-hero > .caption{padding:0 20px 32px;max-width:none;width:100%;box-sizing:border-box}
  .article-content .b-fullimg .caption{padding:20px 20px 32px}

  .b-hero{min-height:100dvh}
  .b-hero > .caption{padding:0 20px 32px;max-width:none}
  .b-hero .cap-title{font-size:14px;letter-spacing:2px}
  .b-hero .cap-sub{font-size:11px;line-height:1.9}

  /* v267: 双栏图文手机端 —— 改 flex 列 + .col-text 用 display:contents 打散，
     使「置顶段落」排在图上方、「置底段落」排在图下方（置底段落 = .col-text-spacer 之后的兄弟段落）。
     ⚠ 用兄弟选择器而非 JS 打标：已发布的旧文章 contentHtml 快照里也带这个 spacer，可立刻生效、无需重发。 */
  .b-split{display:flex;flex-direction:column;gap:0}
  .b-split.swapped{grid-template-areas:'text' 'img'}
  .b-split > .col-text{padding:0;max-width:none;margin:0;display:contents !important}
  .b-split > .col-img{order:2;aspect-ratio:4/3 !important;margin-top:16px}
  /* v268: 带自定义显示区域的图 —— 锁定桌面比例（容器比例一变，构图百分比语义会偏） */
  .b-split > .col-img[data-focus]{aspect-ratio:var(--focus-ar) !important}
  .b-split .para{font-size:14px}
  .b-split > .col-text > .col-text-spacer{display:none}
  .b-split > .col-text > .col-text-spacer ~ .para{order:3;margin-top:30px}
  .b-split > .col-text > .col-text-spacer ~ .para ~ .para{margin-top:0}

  .b-split2{grid-template-columns:1fr;grid-template-areas:'text' 'imgs';gap:30px !important}
  .b-split2.swapped{grid-template-areas:'text' 'imgs'}
  .b-split2 > .col-text{padding:0;max-width:none;margin:0}
  .b-split2 > .col-imgs{grid-template-columns:1fr;gap:30px !important}
  .b-split2 > .col-imgs .img-wrap{aspect-ratio:4/3 !important}
  .b-split2 .para{font-size:14px}
  /* v269: 删掉 v267 加的 .b-split-v4 段落分置规则 —— 双栏图文 V4 有自己的手机端逻辑：
     第一个 V4 文字在图上、其余 V4 文字在图下（v235o 段 + article.html 运行时打标 .b-split-v4-first）。 */

  .b-splitWide{grid-template-columns:1fr;grid-template-areas:'text' 'img';gap:30px !important}
  .b-splitWide.swapped{grid-template-areas:'text' 'img'}
  .b-splitWide > .col-text{padding:0;max-width:none;margin:0;display:flex;flex-direction:column;gap:0}
  .b-splitWide > .col-text .credits{grid-column:auto;margin-bottom:20px}
  .b-splitWide > .col-text .text-main{grid-column:auto;width:100%}
  .b-splitWide > .col-text .credits .credit-row{display:flex;flex-direction:column;margin-bottom:12px}
  .b-splitWide > .col-img{aspect-ratio:4/3 !important}
  .b-splitWide .para{font-size:14px}

  .b-gallery .grid{grid-template-columns:1fr;gap:30px !important}

  .b-fullimg .img-ratio{aspect-ratio:4/3 !important}

  .b-h2 h2{font-size:20px}

  .b-custom .custom-grid{grid-template-columns:1fr;gap:30px !important;row-gap:30px !important;column-gap:30px !important}
  .b-custom .seg-img{aspect-ratio:var(--m-aspect,var(--aspect))}
.b-custom .seg-video{aspect-ratio:var(--m-aspect,var(--aspect))}
  .b-custom .seg{grid-column:span 1}

  .b-big.n-1 .big-grid,.b-big.n-2 .big-grid,.b-big.n-3 .big-grid,.b-big.n-4 .big-grid{grid-template-columns:1fr;gap:30px !important}
}
/* 自由布局块在真实手机端改为纵向堆叠（编辑器预览用 .mobile-mode，发布页用 @media） */
@media(max-width:768px){
  .b-free{min-height:auto !important}
  .b-free .free-item{position:static !important;left:auto !important;top:auto !important;width:100% !important;height:auto;margin:0 0 30px !important;aspect-ratio:4/5}
  .b-free .free-item.text{aspect-ratio:auto !important}
  .b-free .free-item .free-img{position:relative;width:100%;aspect-ratio:4/5;overflow:hidden;background:transparent;flex:none}
  .b-free .free-item .free-img .img-fill{position:absolute;inset:0}
  .b-free .free-item .resize-handle{display:none}
}
/* 文章块背景跟随站点日/夜模式（前台 <html data-theme> 实时切换） */
html[data-theme="dark"] .article-content .b-article{
  --scene-bg:#141414;--scene-ink:#ffffff;--scene-muted:#b8b8b8;--scene-line:#333;
}
html[data-theme="dark"] .article-content .b-article .b-block[data-bg="light"]{background:#141414}
html[data-theme="dark"] .article-content .b-article .b-block[data-bg="dark"]{background:#131313}
html[data-theme="dark"] .article-content .b-article .b-block:not([data-bg]){background:#141414}
html[data-theme="dark"] .article-content .b-article .tag-line,
html[data-theme="dark"] .article-content .b-article .b-h2 h2,
html[data-theme="dark"] .article-content .b-article .b-split h2{color:var(--gold,#c9a86a) !important}
html[data-theme="dark"] .article-content .b-article .b-text .para-cn,
html[data-theme="dark"] .article-content .b-article .b-split .para-cn,
html[data-theme="dark"] .article-content .b-article .b-split2 .para-cn,
html[data-theme="dark"] .article-content .b-article .b-splitWide .para-cn,
html[data-theme="dark"] .article-content .b-article .b-custom .seg-text .para-cn{color:#ffffff}
html[data-theme="dark"] .article-content .b-article .b-text .para,
html[data-theme="dark"] .article-content .b-article .b-split .para,
html[data-theme="dark"] .article-content .b-article .b-split2 .para,
html[data-theme="dark"] .article-content .b-article .b-splitWide .para,
html[data-theme="dark"] .article-content .b-article .b-gallery .caption,
html[data-theme="dark"] .article-content .b-article .b-gallery .item-caption,
html[data-theme="dark"] .article-content .b-article .b-big .item-caption,
html[data-theme="dark"] .article-content .b-article .b-custom .item-caption{color:#d8d8d8}
/* Hero caption entrance animation */
@keyframes heroFadeUp{from{opacity:0;transform:translateY(24px)}to{opacity:1;transform:translateY(0)}}
.b-hero .caption > *{animation:heroFadeUp .8s ease both}
.b-hero .caption > *:nth-child(1){animation-delay:.1s}
.b-hero .caption > *:nth-child(2){animation-delay:.25s}
.b-hero .caption > *:nth-child(3){animation-delay:.4s}

/* 文章区块滚动渐入：复用全站 .reveal，但 .b-block 自带 transition 会覆盖 .reveal 的过渡导致无动画。
   这里用更高优先级（.b-block.reveal 双类）把 opacity/transform/transition 接管回来，与全站 1.5s 淡入上浮统一 */
.b-block.reveal {
  opacity: 0;
  transform: translateY(40px);
  transition: opacity 1.5s cubic-bezier(0.16, 1, 0.3, 1),
              transform 1.5s cubic-bezier(0.16, 1, 0.3, 1);
}

/* ===== v235p (2026-09-19) 英文两端对齐：与双栏图文 / 文字块口径一致（中文 left、英文 justify）=====
   存量 splitV4 / fixedText 的 enParaStyle.align 还是 'left'（这两个块类型是后加的，没吃到 v17 的
   paraStyle→cn/enParaStyle 迁移），旧文章重新发布前 inline 仍是 left。
   这里兜底让**已发布的旧文章立刻生效**；段落级显式对齐（data-palign）优先，不覆盖。 */
.b-split-v4 .para-en:not([data-palign]),
.b-fixedtext .para-en:not([data-palign]){text-align:justify !important}

/* ===== v235o (2026-09-18) 手机端专属：双栏图文 V4 / 浮动文字 V4 / V4 图说 =====
   仅 ≤768px 生效，桌面端（>768px）完全不受影响。放在文件末尾：同特异性时靠源顺序胜出。 */
@media(max-width:768px){
  /* --- 双栏图文 V4 单列：改用 flex column（不用 grid）——
     ⚠ grid 下那只空的 .col-text 仍占一个 track，仍吃掉一个 30px gap，
       导致「图底 → 下一图顶」变成 60px（其他图块是 30px，老板反馈偏大）。
       flex + 空列 display:none → 块间距回归 30px，与其它图块一致。 */
  .b-split2.b-split-v4{display:flex !important;flex-direction:column;gap:30px !important}
  /* ⚠ 变成 flex item 后 .col-imgs/.col-text 的 width 由 stretch 变成 max-content：
     图片未加载时没有内在宽高 → 宽度塌成 0（连带整块只剩 30px padding）。必须显式 width:100%。 */
  .b-split2.b-split-v4 > .col-imgs,
  .b-split2.b-split-v4 > .col-text{width:100% !important}
  /* 没有段落文字的图片块：空列不占位（否则多出一个 30px 间隙） */
  .b-split2.b-split-v4 > .col-text:empty{display:none !important}
  /* 默认（除第一个外）：DOM 顺序本来就是 图在前/文在后 → 图片在上、文字在下 */
  /* 第一个 V4（article.html 运行时打标 .b-split-v4-first）：文字在上、图片在下 */
  .b-split2.b-split-v4.b-split-v4-first > .col-text{order:-1}
  /* 双图布局保持左右并排（不塌单列），图间距沿用编辑器的 imgGap；两图按各自真实比例，顶对齐 */
  .b-split2.b-split-v4 > .col-imgs{grid-template-columns:1fr 1fr !important;gap:var(--img-gap,16px) !important;align-items:start}
  /* V4 图框：手机端放开 aspect-ratio/overflow，让「图 + 图说」自然纵向撑开
     —— 否则 .img-wrap 被 4/3 固定高度 + overflow:hidden 夹住（图说会被裁、图也会被裁）。 */
  .b-split2.b-split-v4 > .col-imgs .img-wrap{aspect-ratio:auto !important;height:auto !important;min-height:0 !important;overflow:visible !important}
  /* 图片本体：固定宽度（满内容宽 335px）+ 按图片真实比例显示，不再裁切。
     ① 新文章是 <img class="img-fill">：有内在宽高比，解除 aspect-ratio 约束 + height:auto 即真实比例。
     ② 老文章是 <div class="img-fill"> 背景图（v184 之前）：没有内在比例，
        沿用自身 inline aspect-ratio（编辑器上传时烤进去的，即该图真实比例）→ 这里不写 !important，
        让 inline 优先；若连 inline 都没有，兜底 var(--aspect, 4/3)。
     ⚠ 只写 img 会漏掉老文章的 div（absolute 不撑高 → 图框塌成 0 高）。
     ⚠ 之前统一写 aspect-ratio:4/3 !important 会把所有图裁成 4:3 —— 老板验收要求「按真实比例」。 */
  /* ⚠ 关键写法 `aspect-ratio: auto 4/3`（两值语法）：
       图片**已加载**→ 有内在比例，用真实比例（不裁切，这就是老板要的效果）；
       图片**未加载**（loading="lazy" 屏外）→ 没有内在比例，退化用 4/3 占位预留高度。
       如果写成 `aspect-ratio:auto`，未加载的 img 会塌成 0 高（整页布局塌陷 + 滚动跳动）。
       写成 `aspect-ratio:4/3` 则永远 4:3 —— 就是被吐槽的「被裁剪」。 */
  .b-split-v4 .img-wrap > img.img-fill{position:relative !important;inset:auto !important;width:100% !important;height:auto !important;min-height:0 !important;max-height:none !important;aspect-ratio:auto 4/3 !important;display:block}
  .b-split-v4 .img-wrap > div.img-fill{position:relative !important;inset:auto !important;width:100% !important;height:auto !important;min-height:0 !important;max-height:none !important;aspect-ratio:var(--aspect,4/3);display:block}
  /* 图说：常显在图片下方（DOM 顺序本就在图后），12px（比正文 14px 小 2 号）；空图说不占位。
     ⚠ 必须 !important：article.html 的内联 <style>（在 link 之后）里有一条同特异性的
        .b-split-v4 .img-caption{position:absolute...}，不加 !important 会被它压掉。 */
  .b-split-v4 .img-caption{position:static !important;top:auto !important;right:auto !important;bottom:auto !important;left:auto !important;height:auto !important;max-height:none !important;padding:10px 0 0 !important;font-size:12px !important;line-height:1.5 !important;letter-spacing:0 !important;text-align:left !important;z-index:auto !important}
  .b-split-v4 .img-caption:empty{display:none !important}
  /* 没勾「图说样式」(data-imgcap-show="0") 的：手机端直接不占位，避免留出空白间隙 */
  .b-split-v4 .img-caption[data-imgcap-show="0"]{display:none !important}
  .b-split-v4 .img-caption[data-imgcap-show="1"]{display:block !important}

  /* --- 浮动文字 V4：取消悬浮（fixed/absolute 一律压成流内块），位置=DOM 顺序=序号顺序，观感同文字块 --- */
  .b-fixedtext{position:static !important;inset:auto !important;width:auto !important;max-width:none !important;z-index:auto !important}
  /* 段落：与文字块 .b-text .para（14px / 1.85 / 下间距 14px）保持一致 */
  .b-fixedtext .para{line-height:1.85 !important;margin:0 0 14px !important}
  /* 空浮动文字（没写内容）：手机端不留 30px 空白 */
  .b-fixedtext:empty{display:none !important}
}
.b-block.reveal--visible {
  opacity: 1;
  transform: translateY(0);
  transition: opacity 1.5s cubic-bezier(0.16, 1, 0.3, 1),
              transform 1.5s cubic-bezier(0.16, 1, 0.3, 1);
}
/* v184：img 元素用 object-fit 渲染，避免 background-image 在小尺寸下的混叠噪点 */
img.img-fill{position:absolute;inset:0;display:block;width:100%;height:100% !important;min-height:100%;object-fit:cover;object-position:center;vertical-align:bottom;margin:0}

/* ===== v259: 对比图块（方案对比） ===== */
.b-plancompare .pc-stage{position:relative;width:100%;aspect-ratio:var(--pc-aspect,3/2);background:#fffdfa;overflow:hidden;user-select:none;-webkit-user-select:none;touch-action:none;cursor:default}
.b-plancompare .pc-single,.b-plancompare .pc-dual{position:absolute;inset:0}
.b-plancompare .pc-dual{display:none}
.b-plancompare .pc-half{position:absolute;top:0;bottom:0;width:calc(50% - 8px);overflow:hidden;background:#fffdfa}
.b-plancompare .pc-half.pc-dl{left:0}.b-plancompare .pc-half.pc-dr{right:0}
.b-plancompare .pc-clip{position:absolute;inset:0;overflow:hidden}
.b-plancompare .pc-layer{position:absolute;inset:0;background-size:cover;background-position:center;background-repeat:no-repeat;display:none;transform-origin:0 0}
.b-plancompare .pc-layer.pc-show{display:block}
.b-plancompare .pc-handle{position:absolute;top:0;bottom:0;width:0;left:50%;display:none;cursor:ew-resize;z-index:5}
.b-plancompare .pc-handle i{position:absolute;top:0;bottom:0;left:-1.5px;width:3px;background:#fff;box-shadow:0 0 0 .5px rgba(0,0,0,.35),0 0 10px rgba(0,0,0,.22)}
.b-plancompare .pc-handle b{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:36px;height:36px;border-radius:50%;background:#fff;color:#23221f;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:500;box-shadow:0 1px 8px rgba(0,0,0,.28);font-style:normal}
.b-plancompare .pc-modes{position:absolute;top:14px;left:14px;z-index:6}
.b-plancompare .pc-choices{position:absolute;top:14px;right:14px;z-index:6}
.b-plancompare .pc-seg{display:inline-flex;flex-direction:column;background:rgba(255,255,255,.94);box-shadow:0 1px 4px rgba(0,0,0,.12);overflow:hidden}
.b-plancompare .pc-modes .pc-seg{flex-direction:row}
.b-plancompare .pc-btn{font:inherit;font-size:12px;line-height:1.4;padding:4px 10px;border:0;background:transparent;color:#23221f;cursor:pointer;white-space:nowrap;-webkit-tap-highlight-color:transparent}
.b-plancompare .pc-modes .pc-btn+.pc-btn{border-left:1px solid rgba(0,0,0,.08)}
.b-plancompare .pc-choices .pc-btn+.pc-btn{border-top:1px solid rgba(0,0,0,.08)}
.b-plancompare .pc-btn.on{background:#23221f;color:#fff}
.b-plancompare .pc-stage[data-mode="slider"] .pc-handle{display:block}
.b-plancompare .pc-stage[data-mode="side"] .pc-dual{display:block}
.b-plancompare .pc-stage[data-mode="side"] .pc-single{display:none}
.b-plancompare .pc-layer .img-fill{background-size:cover;background-position:center}

/* ===== v261: 对比图块 —— 图说 / 显示尺寸（居中/靠左）/ 并排防变形 ===== */
.b-plancompare .pc-cap{position:absolute;left:0;right:0;bottom:0;z-index:4;display:flex;flex-direction:column;gap:2px;padding:22px 16px 8px;background:linear-gradient(180deg,rgba(0,0,0,0),rgba(0,0,0,.42));pointer-events:none}
.b-plancompare .pc-cap:empty{display:none}
.b-plancompare .pc-cap-cn,.b-plancompare .pc-cap-en{display:block;font-size:12px;line-height:1.5;letter-spacing:.5px;color:#fff;text-align:left}
/* 靠左显示：宽度 = 双栏图文 V4 单图（col-imgs 总宽），左对齐；改比例宽度不变高度跟随 */
.b-plancompare.pc-displeft > .pc-stage{width:calc((3 * 100% - 32px) / 5);margin-right:auto}
/* v262: 靠左显示 + 段落 → b-split2 网格（文字 38% / 图 62%），图宽与裸靠左一致 */
.b-plancompare.pc-displeft .col-imgs .pc-stage{width:100%;margin-right:0}
.b-plancompare.pc-displeft .col-text-spacer{flex:1 1 auto;min-height:24px}
/* 并排同步：两半幅用 contain 完整显示，杜绝横向压缩变形 */
.b-plancompare .pc-half .pc-layer{background-size:contain}
@media (max-width:768px){
  .b-plancompare.pc-displeft .pc-stage{width:100%}
  .b-plancompare .pc-cap{padding:16px 12px 6px}
  /* v262: 靠左显示+段落 手机上下堆叠 */
  .b-plancompare.pc-displeft .b-split2{display:flex;flex-direction:column;gap:30px !important}
  .b-plancompare.pc-displeft .b-split2 > .col-text,
  .b-plancompare.pc-displeft .b-split2 > .col-imgs{width:100% !important}
}

/* ===== v269 (2026-09-22) 手机端图片：定宽度 + 高度按图片实际比例（不再锁 4/3）=====
   老板口径：「手机端显示不是定比例的，而是定宽度，高度根据实际图片的比例来显示；
   如果新加的功能的图片确定了显示图片的位置，则按照定好的位置和比例在手机上显示。」
   ① <img class="img-fill">：有内在比例 → aspect-ratio:auto 4/3（未加载时兜底 4/3，防整页塌陷）→ 加载后即真实比例。
   ② 老文章 <div class="img-fill"> 背景图：无内在比例 → 用自身 inline aspect-ratio（编辑器上传时烤进去的真实比例），无则 4/3。
   ③ 带「显示区域」的图（容器 [data-focus]）→ 锁定桌面设定比例 --focus-ar，背景图 absolute 铺满，
      inline 的 background-size/background-position 原样生效 = 手机上也按设定好的位置显示。
   ⚠ 范围只有四个布局（双栏图文 / 左文右双图 / 宽文窄图 / 自定义列块）；
     gallery / fullimg / big / free / planCompare 与双栏图文 V4 都不动（V4 走 v235o 自己的规则）。 */
@media (max-width:768px){
  .b-split > .col-img:not([data-focus]),
  .b-splitWide > .col-img:not([data-focus]),
  .b-split2:not(.b-split-v4) > .col-imgs .img-wrap:not([data-focus]),
  .b-custom .seg-img:not([data-focus]){aspect-ratio:auto !important;height:auto !important;min-height:0 !important}

  .b-split > .col-img:not([data-focus]) > img.img-fill,
  .b-splitWide > .col-img:not([data-focus]) > img.img-fill,
  .b-split2:not(.b-split-v4) > .col-imgs .img-wrap:not([data-focus]) > img.img-fill,
  .b-custom .seg-img:not([data-focus]) > img.img-fill{position:relative !important;inset:auto !important;width:100% !important;height:auto !important;min-height:0 !important;max-height:none !important;aspect-ratio:auto 4/3 !important;display:block}

  .b-split > .col-img:not([data-focus]) > div.img-fill,
  .b-splitWide > .col-img:not([data-focus]) > div.img-fill,
  .b-split2:not(.b-split-v4) > .col-imgs .img-wrap:not([data-focus]) > div.img-fill,
  .b-custom .seg-img:not([data-focus]) > div.img-fill{position:relative !important;inset:auto !important;width:100% !important;height:auto !important;min-height:0 !important;max-height:none !important;aspect-ratio:var(--aspect,4/3);display:block}

  .b-split > .col-img[data-focus],
  .b-splitWide > .col-img[data-focus],
  .b-split2:not(.b-split-v4) > .col-imgs .img-wrap[data-focus],
  .b-custom .seg-img[data-focus]{aspect-ratio:var(--focus-ar,4/3) !important}
}

/* ===== v271: 左文右双图 / 宽文窄图 / 文字块 段落升级为「双栏图文 V4 同款」 =====
   每段可选置顶/置底：置顶段在前，置底段由 .col-text-spacer（flex:1）推到文字列底部。
   split2 的 .col-text 本就是 flex 列，spacer 直接生效；
   splitWide 的 .text-main 原是 block 且 .col-text 网格 align-content:start，需放开为 stretch + flex 列；
   text 块无锚点高度，分组仅保序（spacer 不产生视觉位移）。 */
.b-splitWide > .col-text{align-content:stretch}
.b-splitWide > .col-text > .text-main{display:flex;flex-direction:column}
@media (max-width:768px){
  /* 手机端堆叠布局没有多余高度，spacer 的 min-height 会凭空多出 24px 间隙 → 隐藏，段落按原顺序排 */
  .b-split2 > .col-text > .col-text-spacer,
  .b-splitWide .text-main > .col-text-spacer,
  .b-text > .col-text-spacer{display:none}
}

/* ===== v272: 左文右双图 / 宽文窄图 手机端 —— 与双栏图文（v267）同款：
   置顶段落排在图上方、置底段落排在图下方。
   做法一致：容器改 flex 列 + 文字列 display:contents 打散 + 图 order:2 + spacer 后的兄弟段 order:3。
   ⛔ 排除 .b-split-v4：双栏图文 V4 有自己的手机端逻辑（第一个文字在图上、其余在图下，v235o）。
   ⚠ 用兄弟选择器而非 JS 打标：已发布的旧文章 contentHtml 快照里也带 spacer，可立刻生效、无需重发。 */
@media (max-width:768px){
  .b-split2:not(.b-split-v4){display:flex;flex-direction:column;gap:0}
  .b-split2:not(.b-split-v4) > .col-text{padding:0;max-width:none;margin:0;display:contents !important}
  .b-split2:not(.b-split-v4) > .col-imgs{order:2;margin-top:16px;grid-template-columns:1fr;gap:30px !important}
  .b-split2:not(.b-split-v4) .para{font-size:14px}
  .b-split2:not(.b-split-v4) > .col-text > .col-text-spacer{display:none}
  .b-split2:not(.b-split-v4) > .col-text > .col-text-spacer ~ .para{order:3;margin-top:30px}
  .b-split2:not(.b-split-v4) > .col-text > .col-text-spacer ~ .para ~ .para{margin-top:0}

  .b-splitWide{display:flex;flex-direction:column;gap:0}
  .b-splitWide > .col-text{padding:0;max-width:none;margin:0;display:contents !important}
  /* v271 桌面规则把 text-main 设为 flex 列；手机端打散，para/spacer 直接成为 .b-splitWide 的 flex item */
  .b-splitWide > .col-text > .text-main{display:contents !important;width:100%}
  .b-splitWide > .col-text > .credits{grid-column:auto;margin-bottom:20px}
  .b-splitWide > .col-text > .credits .credit-row{display:flex;flex-direction:column;margin-bottom:12px}
  .b-splitWide > .col-img{order:2;margin-top:16px}
  .b-splitWide .para{font-size:14px}
  .b-splitWide .col-text-spacer{display:none}
  .b-splitWide .col-text-spacer ~ .para{order:3;margin-top:30px}
  .b-splitWide .col-text-spacer ~ .para ~ .para{margin-top:0}
}

/* ============================================================
   v277 (2026-09-28)：裁剪图（articles/media/crops/）前台上下露浅灰边
   ------------------------------------------------------------
   现象：BLOCK EDITOR v3 里用「裁剪」上传的图，前台文章页图片上下边缘出现一条浅灰边；
        同一张图在后台/编辑器里显示正常。
   根因（线上实测：文章 amsor44uy68 / block#5 custom / 1920 视口）：
     · 编辑器按槽位 --aspect 裁图，并把「当时画布下的像素高度」烤进 inline（height:519px）；
     · 前台容器宽度由 grid span 重新分配（实测 1070.61px）→ 实际比例 2.0628 ≠ 图片比例 2.1028；
     · inline 的 background-size:100% auto 在 no-repeat 下 tile 只有 1070.6x509.1，
       比容器矮 9.87px → 上下各露 4.93px 的 rgb(237,237,237) 底色 = 老板看到的灰边
       （375 视口同图露 0.59px，量级小但同源）。
   修复：cover = 取 max(w/imgW, h/imgH) 缩放，tile 两轴恒 >= 容器 → 永不露底。
        实测改后 tile=1091.4x519.0（正好铺满，左右各裁约 10.4px，肉眼无感）。
   ⚠ 必须 !important：inline 的 background 简写优先级高于普通 CSS 规则（本文件里
      .b-custom .seg-img div.img-fill{background-size:cover} 等原有兜底就是被 inline 压掉的）。
   ⚠ 只限定裁剪图：普通图 background-size 可能是老板手动调的 118%~236%（focus 构图），
      绝不能被 cover 覆盖，否则手动构图全废。裁剪图不允许调焦点（focusControlField 对
      crop:1 返回空），所以这里强制 cover 不会破坏任何可调项。
   ⚠ 旧文章免重发：本规则只认 inline style 里的 /crops/ 路径，已发布文章立即生效。
   ============================================================ */
.img-fill[style*="/crops/"]{background-size:cover !important}
