/* player/player.css —— 玩家版样式；布局编辑器未来只改 CSS 变量/layout 数据 */
:root{
  /* 300/1600 = 18.75%，与布局编辑器逻辑画布一致；运行时会被 layout 覆盖 */
  --player-sidebar-width:18.75%;
  --player-design-w:1600px;
  --player-design-h:800px;
  --player-sidebar-bg:#1a1a1a;
  --player-sidebar-border:#333;
  --player-bg:#111;
  --player-text:#fff;
  --player-panel:#1e1e1e;
  --player-btn-bg:#2e2e2e;
  --player-btn-border:#555;
  --player-accent:#0078d4;
  --player-danger:#c0392b;
  --player-info-min-width:400px;
  --player-info-max-width:640px;
  --player-info-max-height:62vh;
}


*{box-sizing:border-box;margin:0;padding:0}
html,body{width:100%;height:100%;overflow:hidden;background:var(--player-bg);color:var(--player-text);font-family:sans-serif}
body{display:flex}

.btn{cursor:pointer;padding:6px 12px;border-radius:4px;border:1px solid var(--player-btn-border);background:var(--player-btn-bg);color:#fff;font-size:13px;transition:background .15s}
.btn:hover{background:#3a3a3a}
.btn.danger{border-color:var(--player-danger);color:#e74c3c}
.btn.danger:hover{background:var(--player-danger);color:#fff}
.btn-tiny{padding:6px 10px;font-size:12px;border-radius:3px;border:1px solid var(--player-btn-border);background:var(--player-btn-bg);color:#fff;cursor:pointer}
.btn-tiny:hover{background:#3a3a3a}

/* 侧栏宽度默认按设计稿 300/1600；运行时由 player-layout 写成百分比，与按钮 % 坐标对齐 */
#preview-sidebar{
  width:var(--player-sidebar-width, 18.75%);
  min-width:var(--player-sidebar-width, 18.75%);
  max-width:var(--player-sidebar-width, 18.75%);
  flex:0 0 var(--player-sidebar-width, 18.75%);
  height:100%;
  background:var(--player-sidebar-bg);
  border-right:1px solid var(--player-sidebar-border);
  display:flex;
  flex-direction:column;
  overflow:hidden;
  z-index:500;
  box-sizing:border-box;
}
#preview-sidebar-header{padding:12px 14px 8px;font-size:14px;font-weight:700;color:#ddd;border-bottom:1px solid var(--player-sidebar-border);flex-shrink:0}

/* 多版面切换 Tab */
#preview-canvas-tabs{
  display:none;
  flex-shrink:0;
  gap:6px;
  padding:8px 10px;
  border-bottom:1px solid var(--player-sidebar-border);
  overflow-x:auto;
  overflow-y:hidden;
  scrollbar-width:thin;
  scrollbar-color:rgba(255,255,255,.25) transparent;
  background:#161616;
}
#preview-canvas-tabs.has-tabs{display:flex}
#preview-canvas-tabs .canvas-tab{
  flex:0 0 auto;
  max-width:140px;
  padding:6px 10px;
  border-radius:999px;
  border:1px solid #444;
  background:#242424;
  color:#ccc;
  font-size:12px;
  line-height:1.2;
  cursor:pointer;
  white-space:nowrap;
  overflow:hidden;
  text-overflow:ellipsis;
  user-select:none;
}
/* 多版面切换 Tab —— 默认永久隐藏；版面切换只走布局按钮 action=switchCanvas */
#preview-canvas-tabs,
#preview-canvas-tabs.has-tabs{
  display:none !important;
}
#preview-canvas-tabs .canvas-tab{ display:none !important; }


/* ── 玩家工具箱（搜索等） ── */
.player-tools-panel{
  flex-shrink:0;
  padding:8px 10px;
  border-bottom:1px solid var(--player-sidebar-border);
  background:#161616;
}
.player-tools-search input[type="search"]{
  width:100%;
  box-sizing:border-box;
  padding:8px 10px;
  border-radius:6px;
  border:1px solid #444;
  background:#242424;
  color:#eee;
  font-size:13px;
  outline:none;
}
.player-tools-search input[type="search"]::placeholder{color:#777}
.player-tools-search input[type="search"]:focus{
  border-color:var(--player-accent);
  box-shadow:0 0 0 2px rgba(0,120,212,.25);
}
/* 去掉 webkit search 清除按钮过大的问题（可选） */
.player-tools-search input[type="search"]::-webkit-search-cancel-button{
  -webkit-appearance:none;
  height:14px;width:14px;
  background:linear-gradient(45deg,transparent 40%,#888 41%,#888 59%,transparent 60%),
             linear-gradient(-45deg,transparent 40%,#888 41%,#888 59%,transparent 60%);
  cursor:pointer;
}
.player-tools-search-hint{
  min-height:0;
  margin-top:6px;
  font-size:11px;
  line-height:1.35;
  color:#8ab4f8;
  word-break:break-word;
}
.player-tools-search-hint:empty{display:none;margin-top:0}
.player-tools-search-hint.is-error{color:#e74c3c}


/* ── 进度存档 ── */
.player-tools-save{
  margin-top:8px;
  padding-top:8px;
  border-top:1px solid #333;
}
.player-tools-save-actions{
  display:flex;
  flex-wrap:wrap;
  gap:6px;
}
.player-tools-save-actions .btn{
  flex:1 1 auto;
  min-width:96px;
  padding:6px 8px;
  font-size:12px;
  text-align:center;
}
.player-tools-save-assoc{
  margin-top:6px;
  font-size:11px;
  line-height:1.4;
  color:#8ab4f8;
  word-break:break-word;
}
.player-tools-save-assoc.is-muted{
  color:#888;
}
.player-tools-save-hint{
  min-height:0;
  margin-top:4px;
  font-size:11px;
  line-height:1.35;
  color:#9aa0a6;
  word-break:break-word;
}
.player-tools-save-hint:empty{display:none;margin-top:0}
.player-tools-save-hint.is-error{color:#e74c3c}


/* ── 游戏存档检测（GBA 等） ── */
.player-tools-savecheck{
  margin-top:8px;
  padding-top:8px;
  border-top:1px solid #333;
}
.player-tools-savecheck-title{
  font-size:12px;
  font-weight:700;
  color:#ddd;
  margin-bottom:6px;
}
.player-tools-savecheck-status{
  font-size:11px;
  line-height:1.4;
  color:#8ab4f8;
  margin-bottom:4px;
  word-break:break-word;
}
.player-tools-savecheck-status.is-muted{color:#888}
.player-tools-savecheck-progress{
  font-size:11px;
  line-height:1.4;
  color:#f9e2af;
  margin-bottom:4px;
}
.player-tools-savecheck-progress:empty{display:none}
.player-tools-savecheck-actions{
  display:flex;
  flex-wrap:wrap;
  gap:6px;
  margin-bottom:6px;
}
.player-tools-savecheck-actions .btn{
  flex:1 1 auto;
  min-width:88px;
  padding:6px 8px;
  font-size:12px;
  text-align:center;
}
.player-tools-savecheck select{
  width:100%;
  box-sizing:border-box;
  margin-bottom:6px;
  padding:6px 8px;
  border-radius:6px;
  border:1px solid #444;
  background:#242424;
  color:#eee;
  font-size:12px;
  outline:none;
}
.player-tools-savecheck select:disabled{
  opacity:.55;
  cursor:not-allowed;
}
.player-tools-savecheck-filters{
  display:flex;
  flex-wrap:wrap;
  gap:6px;
}
.player-tools-savecheck-filters .btn{
  flex:1 1 auto;
  min-width:72px;
  padding:6px 8px;
  font-size:11px;
  text-align:center;
}
.player-tools-savecheck-filters .btn.is-active{
  background:var(--player-accent);
  border-color:var(--player-accent);
  color:#fff;
}
.player-tools-savecheck-hint{
  min-height:0;
  margin-top:6px;
  font-size:11px;
  line-height:1.35;
  color:#9aa0a6;
  word-break:break-word;
}
.player-tools-savecheck-hint:empty{display:none;margin-top:0}
.player-tools-savecheck-hint.is-error{color:#e74c3c}






/* 搜索命中行高亮 */
.preview-tree-item.marker.search-hit{
  outline:1px solid var(--player-accent);
  background:#1a3350 !important;
  color:#fff;
}



#preview-sidebar-actions{display:flex;flex-wrap:wrap;gap:6px;padding:10px 12px;border-bottom:1px solid var(--player-sidebar-border);flex-shrink:0}
#preview-sidebar-actions .btn{flex:1 1 auto;min-width:86px;padding:6px 8px;font-size:12px;text-align:center}
#preview-tree{flex:1;overflow-y:auto;padding:8px 10px 16px;display:flex;flex-direction:column;gap:4px}

.preview-tree-item{display:flex;align-items:center;gap:6px;padding:7px 8px;border-radius:4px;background:#252525;font-size:13px;color:#ccc;user-select:none}
.preview-tree-item:hover{background:#2e2e2e}
.preview-tree-item.folder{font-weight:700;color:#ddd}
.preview-tree-item.group{color:#ccc}
.preview-tree-item.marker{color:#aaa;font-size:12px;padding-left:6px;gap:4px}
.preview-tree-item .pt-main{flex:1;min-width:0;display:flex;align-items:center;gap:4px;flex-wrap:wrap;overflow:hidden}
.preview-tree-item.marker .pt-main{gap:0}
.preview-tree-item .pt-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:default}
.preview-tree-item .pt-name.wrap-name{white-space:normal;overflow:visible;text-overflow:unset}
.preview-tree-item.marker .pt-name{cursor:pointer;flex:1;min-width:0;text-align:left}
.preview-tree-item.marker .pt-name:hover{color:#fff;text-decoration:underline}
.preview-tree-item .pt-count{flex-shrink:0;color:#8ab4f8;font-size:12px;font-variant-numeric:tabular-nums;margin-left:auto}
.preview-tree-item .pt-collapse{width:14px;flex-shrink:0;cursor:pointer;color:#888;transition:transform .15s}
.preview-tree-item .pt-collapse.collapsed{transform:rotate(-90deg)}
.preview-tree-children{margin-left:12px;border-left:1px solid #333;padding-left:8px;display:flex;flex-direction:column;gap:4px}
/* 横屏：树结构层级内退减少40% */
body.player-orientation-landscape .preview-tree-children { margin-left: 7px; padding-left: 5px; }
.preview-tree-children.collapsed{display:none}
.preview-section-title{font-size:12px;color:#777;padding:8px 4px 4px}

.preview-vis{position:relative;width:18px;height:18px;flex-shrink:0;margin-left:auto;cursor:pointer}
.preview-vis input{position:absolute;opacity:0;inset:0;margin:0;cursor:pointer;z-index:1}
.preview-vis .box{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border:1px solid #666;border-radius:3px;background:#1e1e1e;color:#e74c3c;font-size:13px;line-height:1;font-weight:700}
.preview-vis.vis-hide input:checked + .box{border-color:#c0392b;background:#2a1515}
.preview-vis.vis-hide input:checked + .box::after{content:'×'}
.preview-vis.vis-status.status-0 .box{border-color:#666;background:#1e1e1e;color:transparent}
.preview-vis.vis-status.status-0 .box::after{content:''}
.preview-vis.vis-status.status-2 .box{border-color:#2ecc71;background:#15301f;color:#2ecc71}
.preview-vis.vis-status.status-2 .box::after{content:'✓'}
.preview-vis.vis-status.status-1 .box{border-color:#c0392b;background:#2a1515;color:#e74c3c}
.preview-vis.vis-status.status-1 .box::after{content:'×'}
.preview-vis input:focus-visible + .box{outline:1px solid var(--player-accent)}

#map-container{flex:1;position:relative;background:#000;min-width:0}
#map{width:100%;height:100%;background:#111}
.leaflet-container{background:#111!important}

#player-info-modal{display:none;position:fixed;z-index:2100;left:0;top:0;width:0;height:0;overflow:visible;background:transparent;pointer-events:none}
#player-info-modal.show{display:block}



#player-info-modal .player-info-content{
  position:relative;pointer-events:auto;background:var(--player-panel);
  padding:16px 16px 14px;border-radius:10px;
  max-width:min(var(--player-info-max-width),92vw);width:max-content;
  min-width:var(--player-info-min-width);
  overflow:visible;
  border:1px solid #444;box-shadow:0 10px 32px rgba(0,0,0,.55);--arrow-left:50%;
  /* 弹出动画：默认从底部（标记上方气泡）缩放；具体 origin 由 JS 设成标记圆心 */
  transform-origin:50% 100%;
  will-change:transform,opacity;
}

#player-info-modal .player-info-scroll{
  max-height:min(var(--player-info-max-height),530px);
  overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;
  scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.28) transparent;
}

/* 打开后、动画开始前：先压成小点，避免先闪一帧完整窗体 */
#player-info-modal.show .player-info-content.bubble-pop-pending{
  opacity:0;
  transform:scale(.12);
}

/* 从标记圆心缩放弹出（类似 macOS 窗口） */
#player-info-modal .player-info-content.bubble-pop-enter{
  animation:player-info-pop .34s cubic-bezier(.16,1.15,.28,1) both;
}

/* 动画结束稳态：明确落到正常尺寸，避免去掉 animation 时闪一帧 */
#player-info-modal .player-info-content.bubble-pop-ready{
  opacity:1;
  transform:none;
}

/* 减少动画偏好 */
@media (prefers-reduced-motion:reduce){
  #player-info-modal.show .player-info-content.bubble-pop-pending{
    opacity:1;
    transform:none;
  }
  #player-info-modal .player-info-content.bubble-pop-enter{animation:none}
}

@keyframes player-info-pop{
  0%{
    opacity:1;
    transform:scale(.12);
  }
  62%{
    opacity:1;
    transform:scale(1.045);
  }
  100%{
    opacity:1;
    transform:scale(1);
  }
}


#player-info-modal .player-info-scroll::-webkit-scrollbar{width:8px;height:8px}
#player-info-modal .player-info-scroll::-webkit-scrollbar-thumb{background-color:rgba(255,255,255,.28);border-radius:999px;border:2px solid transparent;background-clip:content-box;min-height:28px}
#player-info-modal .player-info-content::after{content:'';position:absolute;left:var(--arrow-left,50%);bottom:-8px;transform:translateX(-50%);border:8px solid transparent;border-top-color:var(--player-panel);border-bottom-width:0;filter:drop-shadow(0 1px 0 #444)}
#player-info-modal .player-info-content.bubble-below::after{bottom:auto;top:-8px;border-top-color:transparent;border-bottom-color:var(--player-panel);border-top-width:0;border-bottom-width:8px}
.close-btn{position:absolute;top:6px;right:10px;cursor:pointer;font-size:22px;color:#aaa;z-index:1;line-height:1}
#player-info-name{font-size:18px;font-weight:700;line-height:1.3;color:#fff;margin:0 24px 10px 0;word-break:break-word}
#player-info-desc{font-size:13px;line-height:1.55;color:#d0d0d0;white-space:pre-wrap;word-break:break-word;margin-bottom:10px}
#player-info-desc:empty{display:none}
#player-info-images{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}
#player-info-images:empty{display:none}
#player-info-images img{max-width:220px;max-height:180px;width:auto;height:auto;object-fit:contain;border:1px solid #555;border-radius:6px;background:#151515;cursor:zoom-in;display:block}
#player-info-status-row{display:flex;align-items:center;gap:8px;margin-bottom:8px;font-size:13px;color:#cfcfcf}
#player-info-status{flex:1;max-width:200px;background:#2a2a2a;border:1px solid #555;color:#fff;padding:5px 8px;border-radius:4px;font-size:12px;cursor:pointer}
#player-info-teleport{margin-top:2px;padding-top:8px;border-top:1px solid #333;display:none}
#player-info-teleport.show{display:block}
#player-info-teleport-actions{display:flex;flex-direction:column;gap:10px}
.player-teleport-item{display:flex;flex-direction:column;align-items:flex-start;gap:4px}
.player-teleport-desc{font-size:12px;line-height:1.45;color:#9aa0a6;white-space:pre-wrap;word-break:break-word;padding:0 2px;max-width:100%}
.player-teleport-desc:empty{display:none}

#image-lightbox{display:none;position:fixed;inset:0;z-index:2200;background:rgba(0,0,0,.88);justify-content:center;align-items:center;padding:24px}
#image-lightbox.show{display:flex}
#image-lightbox img{max-width:min(92vw,1200px);max-height:88vh;width:auto;height:auto;object-fit:contain;border-radius:6px;box-shadow:0 10px 40px rgba(0,0,0,.5);background:#111}

#player-boot-error{position:fixed;inset:0;z-index:9999;display:none;align-items:center;justify-content:center;background:rgba(0,0,0,.82);padding:24px}
#player-boot-error.show{display:flex}
#player-boot-error .box{max-width:520px;background:#1e1e1e;border:1px solid #c0392b;border-radius:10px;padding:18px 16px;color:#eee}

@media (max-width:720px){
  /* 不要再把侧栏改回固定 px，否则会和按钮的整窗 % 坐标错位 */
  :root{--player-info-min-width:280px}
  #player-info-images img{max-width:100%}
}


/* =========================================================
 * 布局运行时（player-layout.js）
 * 自定义按钮 / 功能锚点 / 图片 / 公告 —— 全局浮层，不被侧栏裁切
 * ========================================================= */
:root{
  --player-info-bg: var(--player-panel);
  --player-info-text: var(--player-text);
  --player-info-border-color:#444;
  --player-info-border-width:1px;
  --player-info-bg-image:none;
}

#player-info-modal .player-info-content{
  background: var(--player-info-bg, var(--player-panel));
  color: var(--player-info-text, var(--player-text));
  border-color: var(--player-info-border-color, #444);
  border-width: var(--player-info-border-width, 1px);
  background-image: var(--player-info-bg-image, none);
  background-size: cover;
  background-position: center;
}
#player-info-name{color:var(--player-info-text, #fff)}
#player-info-desc{color:var(--player-info-text, #d0d0d0); opacity:.92}

/* 允许侧栏内原生块被布局系统挪到浮层 */
#preview-sidebar{overflow:visible}

/* ── 自定义布局：隐藏默认侧栏控件（仅显示布局编辑器摆放的模块） ── */
body.player-layout-custom #preview-sidebar-header,
body.player-layout-custom #preview-sidebar-actions,
body.player-layout-custom .player-tools-panel,
body.player-layout-custom #preview-canvas-tabs {
  display: none !important;
}
body.player-layout-custom #preview-tree:not(.is-layout-mounted) {
  display: none !important;
}
/* 侧栏在自定义模式下可只作色条/留白；无内容时不占交互 */
body.player-layout-custom #preview-sidebar {
  overflow: visible;
}




.player-layout-overlay{
  position:fixed;
  left:0;
  top:0;
  right:auto;
  bottom:auto;
  z-index:1200;
  pointer-events:none;
  overflow:visible;
  transform-origin:0 0;
}


.player-layout-overlay .pl-button,
.player-layout-overlay .pl-feature,
.player-layout-overlay .pl-image,
.player-layout-overlay .pl-announcement,
.player-layout-overlay .player-layout-savecheck-pop{
  pointer-events:auto;
}

.pl-button{
  position:absolute;
  display:flex;
  align-items:center;
  justify-content:center;
  border-style:solid;
  border-radius:8px;
  cursor:pointer;
  overflow:hidden;
  padding:0 8px;
  font-weight:600;
  font-size:13px;
  line-height:1.1;
  /* 默认无阴影；由 player-layout.js 按底色 alpha 写入 */
  box-shadow:none;
  z-index:5;
}

.pl-button .pl-button-label{
  position:relative;
  z-index:1;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  max-width:100%;
  pointer-events:none;
}
.pl-corner{
  position:absolute;
  width:13px;
  height:13px;
  background-repeat:no-repeat;
  background-size:contain;
  background-position:center;
  pointer-events:none;
  z-index:2;
}
.pl-corner.c-tl{left:0;top:0;transform:none}
.pl-corner.c-tr{right:0;top:0;transform:scaleX(-1)}
.pl-corner.c-bl{left:0;bottom:0;transform:scaleY(-1)}
.pl-corner.c-br{right:0;bottom:0;transform:scale(-1)}

.pl-feature{
  position:absolute;
  border-radius:8px;
  overflow:auto;
  z-index:4;
  /* 默认无阴影；由 player-layout.js 按底色 alpha 写入 */
  box-shadow:none;
  padding:6px;
  display:flex;
  flex-direction:column;
  min-height:0;
  box-sizing:border-box;
}

/* 竖屏标记模块：脱离 overlay，viewport 直接定位，右边锁死 */
.pl-feature-portrait-tree{
  position:fixed !important;
  z-index:500;
  pointer-events:auto;
  min-height:0;
  box-sizing:border-box;
}
.pl-feature-portrait-tree .is-layout-mounted,
.pl-feature-portrait-tree .player-tools-search,
.pl-feature-portrait-tree .player-tools-save,
.pl-feature-portrait-tree .player-tools-savecheck,
.pl-feature-portrait-tree #preview-tree{
  width:100%;
  height:100%;
  min-height:0;
  flex:1 1 auto;
}
.pl-feature-portrait-tree #preview-tree{
  overflow:auto;
  display:flex;
  flex-direction:column;
  gap:4px;
  padding:4px 2px 8px;
  box-sizing:border-box;
}
/* 竖屏标记模块内容按面积自适应缩放（基准值已缩小35%） */
.pl-feature-portrait-tree #preview-tree{
  font-size: calc(8.45px * var(--tree-scale, 1));
}
.pl-feature-portrait-tree .preview-tree-item{
  padding: calc(4.55px * var(--tree-scale, 1)) calc(5.2px * var(--tree-scale, 1));
  gap: calc(2.6px * var(--tree-scale, 1));
}
.pl-feature-portrait-tree .preview-tree-item .pt-name{
  font-size: calc(8.45px * var(--tree-scale, 1));
}
.pl-feature-portrait-tree .preview-tree-item.marker{
  font-size: calc(7.8px * var(--tree-scale, 1));
}
.pl-feature-portrait-tree .preview-tree-item .pt-count{
  font-size: calc(7.8px * var(--tree-scale, 1));
}
.pl-feature-portrait-tree .preview-tree-item .pt-collapse{
  width: calc(9.1px * var(--tree-scale, 1));
  font-size: calc(8.45px * var(--tree-scale, 1));
}
.pl-feature-portrait-tree .preview-tree-children{
  margin-left: calc(7.8px * var(--tree-scale, 1));
  padding-left: calc(5.2px * var(--tree-scale, 1));
  gap: calc(2.6px * var(--tree-scale, 1));
}
.pl-feature-portrait-tree .preview-tree-item .pt-folder-emoji{
  font-size: calc(14.92px * var(--tree-scale, 1));
}
.pl-feature-portrait-tree .preview-tree-item .pt-folder-icon{
  width: calc(22.1px * var(--tree-scale, 1));
  height: calc(22.1px * var(--tree-scale, 1));
}
.pl-feature-portrait-tree .preview-section-title{
  font-size: calc(7.8px * var(--tree-scale, 1));
  padding: calc(5.2px * var(--tree-scale, 1)) calc(2.6px * var(--tree-scale, 1)) calc(2.6px * var(--tree-scale, 1));
}
.pl-feature-portrait-tree .preview-vis{
  width: calc(9.95px * var(--tree-scale, 1));
  height: calc(9.95px * var(--tree-scale, 1));
  flex-shrink:0;
}
.pl-feature-portrait-tree .preview-vis .box{
  width: calc(9.95px * var(--tree-scale, 1));
  height: calc(9.95px * var(--tree-scale, 1));
  font-size: calc(7.18px * var(--tree-scale, 1));
  line-height: calc(9.95px * var(--tree-scale, 1));
}
/* 竖屏标记模块：文件夹卡片宽度压缩，实现双列展示 */
body.player-orientation-portrait .pl-feature-portrait-tree #preview-tree.tree-drilldown.tree-drilldown-root .preview-tree-drill-level > .preview-tree-item.folder,
body.player-orientation-portrait .pl-feature-portrait-tree #preview-tree.tree-drilldown.tree-drilldown-root .preview-tree-drill-level > .preview-tree-item.group{
  min-width:0;
  max-width:calc(50% - 4px);
  flex:1 1 auto;
}

/* 竖屏：标记信息弹窗缩小35% */
body.player-orientation-portrait #player-info-modal .player-info-content {
  max-width: min(calc(var(--player-info-max-width, 520px) * 0.65), 60vw);
  min-width: calc(var(--player-info-min-width, 280px) * 0.65);
  padding: 10px 10px 9px;
  font-size: 0.87em;
}
body.player-orientation-portrait #player-info-modal .player-info-scroll {
  max-height: min(calc(var(--player-info-max-height, 56vh) * 0.65), 345px);
}

/* 竖屏标记模块：完整颜色系统 */
.pl-feature-portrait-tree{
  --pl-tree-item-bg: #252525;
  --pl-tree-item-hover-bg: #2e2e2e;
  --pl-tree-item-color: #ccc;
  --pl-tree-folder-color: #ddd;
  --pl-tree-group-color: #ccc;
  --pl-tree-marker-color: #aaa;
  --pl-tree-count-color: #8ab4f8;
  --pl-tree-muted-color: #888;
  --pl-tree-border-color: #333;
  --pl-tree-section-color: #777;
  --pl-tree-check-border: #666;
  --pl-tree-check-bg: #1e1e1e;
  --pl-tree-check-done: #2ecc71;
  --pl-tree-check-hide: #e74c3c;
  --pl-tree-scroll-thumb: rgba(255,255,255,.28);
  --pl-tree-scroll-track: transparent;
  --pl-tree-scroll-width: 8px;
}
.pl-feature-portrait-tree .preview-tree-item{
  background: var(--pl-tree-item-bg) !important;
  color: var(--pl-tree-item-color) !important;
}
.pl-feature-portrait-tree .preview-tree-item:hover{
  background: var(--pl-tree-item-hover-bg) !important;
}
.pl-feature-portrait-tree .preview-tree-item.folder{
  color: var(--pl-tree-folder-color) !important;
}
.pl-feature-portrait-tree .preview-tree-item.group{
  color: var(--pl-tree-group-color) !important;
}
.pl-feature-portrait-tree .preview-tree-item.marker{
  color: var(--pl-tree-marker-color) !important;
}
.pl-feature-portrait-tree .preview-tree-item .pt-count{
  color: var(--pl-tree-count-color) !important;
}
.pl-feature-portrait-tree .preview-tree-item .pt-collapse{
  color: var(--pl-tree-muted-color) !important;
}
.pl-feature-portrait-tree .preview-tree-children{
  border-left-color: var(--pl-tree-border-color) !important;
}
.pl-feature-portrait-tree .preview-section-title{
  color: var(--pl-tree-section-color) !important;
}
.pl-feature-portrait-tree .preview-vis .box{
  border-color: var(--pl-tree-check-border) !important;
  background: var(--pl-tree-check-bg) !important;
}
.pl-feature-portrait-tree .preview-vis.vis-status.status-2 .box{
  border-color: var(--pl-tree-check-done) !important;
  background: color-mix(in srgb, var(--pl-tree-check-done) 18%, #111) !important;
  color: var(--pl-tree-check-done) !important;
}
.pl-feature-portrait-tree .preview-vis.vis-status.status-1 .box,
.pl-feature-portrait-tree .preview-vis.vis-hide input:checked + .box{
  border-color: var(--pl-tree-check-hide) !important;
  background: color-mix(in srgb, var(--pl-tree-check-hide) 18%, #111) !important;
  color: var(--pl-tree-check-hide) !important;
}
.pl-feature-portrait-tree .preview-tree-item.marker.search-hit{
  outline-color: var(--player-accent) !important;
  background: color-mix(in srgb, var(--player-accent) 28%, #111) !important;
}
.pl-feature-portrait-tree #preview-tree{
  scrollbar-width: thin;
  scrollbar-color: var(--pl-tree-scroll-thumb) var(--pl-tree-scroll-track);
}

.pl-feature .btn,
.pl-feature button.btn{
  background: var(--pl-feature-btn-bg, var(--player-btn-bg));
}
.pl-feature .is-layout-mounted,
.pl-feature .player-tools-search,
.pl-feature .player-tools-save,
.pl-feature .player-tools-savecheck,
.pl-feature #preview-tree{
  width:100%;
  height:100%;
  min-height:0;
  flex:1 1 auto;
}
.pl-feature #preview-tree{
  overflow:auto;
  display:flex;
  flex-direction:column;
  gap:4px;
  padding:4px 2px 8px;
  box-sizing:border-box;
}

/* ── 标记列表：可由 layout.featureModules 写入 CSS 变量 ── */
.pl-feature[data-type="markerTree"]{
  --pl-tree-item-bg: #252525;
  --pl-tree-item-hover-bg: #2e2e2e;
  --pl-tree-item-color: #ccc;
  --pl-tree-folder-color: #ddd;
  --pl-tree-group-color: #ccc;
  --pl-tree-marker-color: #aaa;
  --pl-tree-count-color: #8ab4f8;
  --pl-tree-muted-color: #888;
  --pl-tree-border-color: #333;
  --pl-tree-section-color: #777;
  --pl-tree-check-border: #666;
  --pl-tree-check-bg: #1e1e1e;
  --pl-tree-check-done: #2ecc71;
  --pl-tree-check-hide: #e74c3c;
  --pl-tree-scroll-thumb: rgba(255,255,255,.28);
  --pl-tree-scroll-track: transparent;
  --pl-tree-scroll-width: 8px;
}
.pl-feature[data-type="markerTree"] .preview-tree-item{
  background: var(--pl-tree-item-bg) !important;
  color: var(--pl-tree-item-color) !important;
}
.pl-feature[data-type="markerTree"] .preview-tree-item:hover{
  background: var(--pl-tree-item-hover-bg) !important;
}
.pl-feature[data-type="markerTree"] .preview-tree-item.folder{
  color: var(--pl-tree-folder-color) !important;
}
.pl-feature[data-type="markerTree"] .preview-tree-item.group{
  color: var(--pl-tree-group-color) !important;
}
.pl-feature[data-type="markerTree"] .preview-tree-item.marker{
  color: var(--pl-tree-marker-color) !important;
}
.pl-feature[data-type="markerTree"] .preview-tree-item .pt-count{
  color: var(--pl-tree-count-color) !important;
}
.pl-feature[data-type="markerTree"] .preview-tree-item .pt-collapse{
  color: var(--pl-tree-muted-color) !important;
}
.pl-feature[data-type="markerTree"] .preview-tree-children{
  border-left-color: var(--pl-tree-border-color) !important;
}
.pl-feature[data-type="markerTree"] .preview-section-title{
  color: var(--pl-tree-section-color) !important;
}
.pl-feature[data-type="markerTree"] .preview-vis .box{
  border-color: var(--pl-tree-check-border) !important;
  background: var(--pl-tree-check-bg) !important;
}
.pl-feature[data-type="markerTree"] .preview-vis.vis-status.status-2 .box{
  border-color: var(--pl-tree-check-done) !important;
  background: color-mix(in srgb, var(--pl-tree-check-done) 18%, #111) !important;
  color: var(--pl-tree-check-done) !important;
}
.pl-feature[data-type="markerTree"] .preview-vis.vis-status.status-1 .box,
.pl-feature[data-type="markerTree"] .preview-vis.vis-hide input:checked + .box{
  border-color: var(--pl-tree-check-hide) !important;
  background: color-mix(in srgb, var(--pl-tree-check-hide) 18%, #111) !important;
  color: var(--pl-tree-check-hide) !important;
}
.pl-feature[data-type="markerTree"] .preview-tree-item.marker.search-hit{
  outline-color: var(--player-accent) !important;
  background: color-mix(in srgb, var(--player-accent) 28%, #111) !important;
}

/* 文件夹自定义图标 */
.preview-tree-item .pt-folder-icon{
  width: 26px;
  height: 26px;
  object-fit: contain;
  flex-shrink: 0;
  display: block;
  margin-right: 2px;
}
.preview-tree-item .pt-folder-emoji{
  flex-shrink: 0;
  line-height: 1;
  margin-right: 2px;
  font-size: 27px;
}

/* 标记列表滚动条（Firefox + WebKit） */
.pl-feature[data-type="markerTree"] #preview-tree{
  scrollbar-width: thin;
  scrollbar-color: var(--pl-tree-scroll-thumb) var(--pl-tree-scroll-track);
}
.pl-feature[data-type="markerTree"] #preview-tree::-webkit-scrollbar{
  width: var(--pl-tree-scroll-width);
  height: var(--pl-tree-scroll-width);
}
.pl-feature[data-type="markerTree"] #preview-tree::-webkit-scrollbar-track{
  background: var(--pl-tree-scroll-track);
  border-radius: 999px;
}
.pl-feature[data-type="markerTree"] #preview-tree::-webkit-scrollbar-thumb{
  background-color: var(--pl-tree-scroll-thumb);
  border-radius: 999px;
  border: 2px solid transparent;
  background-clip: content-box;
  min-height: 28px;
}


/* 存档区被挪走后：隐藏内部“保存/读取”按钮，只留状态说明（按钮改由布局按钮承担） */
.pl-feature[data-type="saveStatus"] .player-tools-save-actions{display:none}

.pl-image{
  position:absolute;
  z-index:3;
  overflow:hidden;
  pointer-events:none;
}
.pl-image img{
  width:100%;
  height:100%;
  object-fit:contain;
  display:block;
  user-select:none;
  -webkit-user-drag:none;
}

/* 旧卡片式公告样式已废弃：以文件末尾「纯图公告」为准 */
.pl-announcement{
  position:absolute;
  z-index:50;
  overflow:visible;
  border-radius:0;
  box-shadow:none;
  background:transparent;
  border:none;
}
.pl-announcement img{
  width:100%;
  height:auto;
  object-fit:contain;
  display:block;
  user-select:none;
  -webkit-user-drag:none;
}

.pl-ann-close{
  position:absolute;
  top:6px;
  right:6px;
  width:28px;
  height:28px;
  border:0;
  border-radius:50%;
  background:rgba(0,0,0,.55);
  color:#fff;
  font-size:20px;
  line-height:28px;
  cursor:pointer;
  z-index:2;
}
.pl-ann-close:hover{background:rgba(0,0,0,.75)}

/* 游戏存档检查：从按钮正上方弹出 */
.player-layout-savecheck-pop{
  position:absolute;
  z-index:60;
  background:var(--player-panel, #1e1e1e);
  border:1px solid #444;
  border-radius:10px;
  box-shadow:0 12px 36px rgba(0,0,0,.45);
  overflow:hidden;
  max-height:70vh;
  display:flex;
  flex-direction:column;
}
.player-layout-savecheck-pop-head{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:8px;
  padding:8px 10px;
  border-bottom:1px solid #333;
  font-size:12px;
  font-weight:700;
  color:#ddd;
  flex-shrink:0;
}
.player-layout-savecheck-pop .player-tools-savecheck{
  margin:0;
  padding:10px;
  border-top:0;
  overflow:auto;
}
.player-tools-savecheck.is-layout-floating{
  display:block !important;
}

/* 原生块被挂载到布局容器后的复位 */
.is-layout-mounted{
  margin:0 !important;
  border:0 !important;
  background:transparent !important;
  padding:0 !important;
}

/* ── 全局固定底图（不随地图移动） ── */
.player-layout-wallpaper{
  position:fixed;
  inset:0;
  z-index:0;
  pointer-events:none;
  background-repeat:no-repeat;
  background-position:center;
  background-size:cover;
}
/* 有底图时让地图区域透出底图（侧栏仍可有自己的底色） */
body.has-wallpaper{
  background:transparent;
}
body.has-wallpaper #map-container,
body.has-wallpaper #map,
body.has-wallpaper .leaflet-container{
  background:transparent !important;
}
/* 保证主 UI 叠在底图之上 */
body.has-wallpaper #preview-sidebar,
body.has-wallpaper #map-container,
body.has-wallpaper .player-layout-overlay{
  position:relative;
  z-index:1;
}
body.has-wallpaper .player-layout-overlay{
  position:fixed;
  z-index:1200;
}

/* =========================================================
 * 等比例缩放 + 竖屏 / 上边栏 / 公告纯图 / 标记树钻取
 * ========================================================= */

/* 布局浮层：按设计稿像素建立坐标系，再从页面左上角统一 scale */
.player-layout-overlay{
  position:fixed;
  left:0;
  top:0;
  right:auto;
  bottom:auto;
  inset:auto;
  z-index:1200;
  pointer-events:none;
  overflow:visible;
  transform-origin:0 0;
}

/* BR 锚点浮层：从右下角缩放 */
.player-layout-overlay-br{
  position:fixed;
  right:0;
  bottom:0;
  left:auto;
  top:auto;
  z-index:1200;
  pointer-events:none;
  overflow:visible;
  transform-origin:100% 100%;
}
.player-layout-overlay-br .pl-button,
.player-layout-overlay-br .pl-feature,
.player-layout-overlay-br .pl-image,
.player-layout-overlay-br .pl-announcement,
.player-layout-overlay-br .player-layout-savecheck-pop{
  pointer-events:auto;
}

.player-layout-overlay .pl-button,
.player-layout-overlay .pl-feature,
.player-layout-overlay .pl-image,
.player-layout-overlay .pl-announcement,
.player-layout-overlay .player-layout-savecheck-pop{
  pointer-events:auto;
}

/* 子元素在设计画布内用 % 定位；随 overlay 一起被统一缩放 */
.pl-button,
.pl-feature,
.pl-image,
.pl-announcement{
  position:absolute;
  right:auto;
  bottom:auto;
  transform:none;
  transform-origin:0 0;
  box-sizing:border-box;
}

/* 公告：纯图 + 关闭钮，不裁切 */
.pl-announcement{
  z-index:50;
  overflow:visible;
  border-radius:0;
  box-shadow:none;
  background:transparent;
  border:none;
  padding:0;
  line-height:0;
  height:auto !important;
}
.pl-announcement img{
  width:100%;
  height:auto;
  max-width:none;
  object-fit:contain;
  display:block;
  user-select:none;
  -webkit-user-drag:none;
  pointer-events:none;
}
.pl-ann-close{
  position:absolute;
  top:4px;
  right:4px;
  width:28px;
  height:28px;
  border:0;
  border-radius:50%;
  background:rgba(0,0,0,.55);
  color:#fff;
  font-size:20px;
  line-height:28px;
  cursor:pointer;
  z-index:2;
  padding:0;
  pointer-events:auto;
}
.pl-ann-close:hover{background:rgba(0,0,0,.75)}

/* 按钮/模块恢复常规内部排版（不再用 per-item scale-inner） */
.pl-button{
  display:flex;
  align-items:center;
  justify-content:center;
  border-style:solid;
  border-radius:8px;
  cursor:pointer;
  overflow:hidden;
  padding:0 8px;
  font-weight:600;
  font-size:10.5px; /* 13px * 0.81，横屏缩小19% */
  line-height:1.1;
  box-shadow:none;
  z-index:5;
}
/* 竖屏：按钮字号放大15% */
body.player-orientation-portrait .pl-button { font-size: 14.95px; } /* 13px * 1.15 */
.pl-button .pl-button-label{
  position:relative;
  z-index:1;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  max-width:100%;
  pointer-events:none;
}

.pl-feature{
  border-radius:8px;
  overflow:auto;
  z-index:4;
  box-shadow:none;
  padding:6px;
  display:flex;
  flex-direction:column;
  min-height:0;
  box-sizing:border-box;
}
/* 横屏：功能模块内文字缩小19%（13px * 0.81） */
body.player-orientation-landscape .pl-feature .preview-tree-item { font-size: 10.5px; }
body.player-orientation-landscape .pl-feature .preview-section-title { font-size: 9.7px; }
body.player-orientation-landscape .pl-feature .preview-tree-item .pt-count { font-size: 9.7px; }
body.player-orientation-landscape .pl-feature .preview-vis .box { font-size: 10.5px; }
body.player-orientation-landscape .pl-feature .pt-collapse { font-size: 9.7px; }
body.player-orientation-landscape .pl-feature .btn { font-size: 10.5px; }
.pl-feature .is-layout-mounted,
.pl-feature .player-tools-search,
.pl-feature .player-tools-save,
.pl-feature .player-tools-savecheck,
.pl-feature #preview-tree{
  width:100%;
  height:100%;
  min-height:0;
  flex:1 1 auto;
}
.pl-feature #preview-tree{
  overflow:auto;
  display:flex;
  flex-direction:column;
  gap:4px;
  padding:4px 2px 8px;
  box-sizing:border-box;
}

.pl-image{
  z-index:3;
  overflow:hidden;
  pointer-events:none;
}
.pl-image img{
  width:100%;
  height:100%;
  object-fit:contain;
  display:block;
  user-select:none;
  -webkit-user-drag:none;
}

/* 兼容旧的 scale-inner（若残留也不破坏） */
.pl-scale-inner{
  box-sizing:border-box;
  width:100%;
  height:100%;
  transform:none !important;
}

/* ── 上边栏（竖屏） ── */
body.player-sidebar-top{
  flex-direction:column !important;
}
body.player-sidebar-top #preview-sidebar{
  width:100% !important;
  min-width:100% !important;
  max-width:100% !important;
  flex:0 0 auto !important;
  height:var(--player-sidebar-thickness, 10%);
  min-height:var(--player-sidebar-thickness, 10%);
  max-height:var(--player-sidebar-thickness, 10%);
  border-right:none !important;
  border-bottom:1px solid var(--player-sidebar-border);
  flex-direction:row;
  overflow:hidden;
}
body.player-sidebar-top #map-container{
  flex:1 1 auto;
  min-height:0;
  width:100%;
}
body.player-sidebar-top #preview-sidebar-header{
  border-bottom:none;
  border-right:1px solid var(--player-sidebar-border);
  display:flex;
  align-items:center;
  white-space:nowrap;
}
body.player-sidebar-top #preview-sidebar-actions{
  border-bottom:none;
  align-items:center;
}
body.player-sidebar-top #preview-tree{
  flex-direction:row;
  flex-wrap:nowrap;
  overflow-x:auto;
  overflow-y:hidden;
}

/* ── 竖屏标记树：顶层横排 + 钻取导航 ── */
body.player-orientation-portrait #preview-tree.tree-orient-horizontal,
body.player-orientation-portrait .pl-feature[data-type="markerTree"] #preview-tree.tree-orient-horizontal{
  display:flex !important;
  flex-direction:row !important;
  flex-wrap:wrap !important;
  align-items:flex-start !important;
  align-content:flex-start !important;
  gap:8px !important;
  overflow:auto !important;
}

/* 钻取时：当前层条目横排；进入后列表可纵向 */
body.player-orientation-portrait #preview-tree.tree-drilldown{
  display:flex !important;
  flex-direction:column !important;
  flex-wrap:nowrap !important;
  gap:6px !important;
  overflow:auto !important;
}
body.player-orientation-portrait #preview-tree.tree-drilldown.tree-drilldown-root{
  flex-direction:row !important;
  flex-wrap:wrap !important;
  align-content:flex-start !important;
}
body.player-orientation-portrait #preview-tree.tree-drilldown .preview-tree-drill-back{
  flex:0 0 auto;
  width:100%;
  display:flex;
  align-items:center;
  gap:8px;
  padding:8px 10px;
  border-radius:6px;
  border:1px solid var(--pl-tree-border-color, #444);
  background:rgba(0,0,0,.25);
  color:#ddd;
  font-size:13px;
  font-weight:700;
  cursor:pointer;
  user-select:none;
}
body.player-orientation-portrait #preview-tree.tree-drilldown .preview-tree-drill-back:hover{
  background:rgba(255,255,255,.08);
}
body.player-orientation-portrait #preview-tree.tree-drilldown .preview-tree-drill-back .drill-back-arrow{
  color:#8ab4f8;
  font-size:14px;
}
body.player-orientation-portrait #preview-tree.tree-drilldown .preview-tree-drill-crumb{
  flex:1;
  min-width:0;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  font-weight:600;
}
body.player-orientation-portrait #preview-tree.tree-drilldown .preview-tree-drill-level{
  display:flex;
  flex-direction:row;
  flex-wrap:wrap;
  align-content:flex-start;
  gap:8px;
  width:100%;
  min-height:0;
}
/* 进入分组后标记列表更像文件列表（纵向） */
body.player-orientation-portrait #preview-tree.tree-drilldown.tree-drilldown-markers .preview-tree-drill-level{
  flex-direction:column !important;
  flex-wrap:nowrap !important;
}
body.player-orientation-portrait #preview-tree.tree-drilldown .preview-tree-drill-level > .preview-tree-item{
  flex:0 0 auto;
  min-width:120px;
  max-width:100%;
}
body.player-orientation-portrait #preview-tree.tree-drilldown.tree-drilldown-root .preview-tree-drill-level > .preview-tree-item.folder,
body.player-orientation-portrait #preview-tree.tree-drilldown.tree-drilldown-root .preview-tree-drill-level > .preview-tree-item.group{
  min-width:132px;
  max-width:46%;
}
body.player-orientation-portrait #preview-tree.tree-drilldown.tree-drilldown-markers .preview-tree-drill-level > .preview-tree-item{
  min-width:0;
  width:100%;
  max-width:none;
}

/* 钻取模式下隐藏原始 children 容器（由 JS 抽当前层节点展示） */
body.player-orientation-portrait #preview-tree.tree-drilldown .preview-tree-children,
body.player-orientation-portrait #preview-tree.tree-drilldown .preview-tree-orient-wrap{
  display:none !important;
}

/* 可进入的文件夹/分组：指针提示 */
body.player-orientation-portrait #preview-tree.tree-drilldown .preview-tree-item.folder .pt-main,
body.player-orientation-portrait #preview-tree.tree-drilldown .preview-tree-item.group .pt-main{
  cursor:pointer;
}
body.player-orientation-portrait #preview-tree.tree-drilldown .preview-tree-item.folder:hover,
body.player-orientation-portrait #preview-tree.tree-drilldown .preview-tree-item.group:hover{
  filter:brightness(1.06);
}

/* 自定义 UI + 上边栏时侧栏可只作色条 */
body.player-layout-custom.player-sidebar-top #preview-sidebar{
  overflow:visible;
}
