* { margin: 0; padding: 0; box-sizing: border-box; } /* 覆盖父级main-content的margin-top,让test页面完全控制布局 */ .main-content:has(.test-container) { margin-top: 60px !important; /* 只保留导航栏高度的margin */ padding: 0 !important; /* 移除main的padding */ } /* 覆盖container-fluid的padding */ .container-fluid:has(.test-container) { padding: 0 !important; /* 移除container-fluid的padding */ } /* 只针对包含test-container的#pageContent */ #pageContent:has(.test-container) { margin: 0; padding: 0; width: 100%; height: calc(100vh - 60px); /* 全屏减去导航栏高度 */ } .test-container { max-width: 100%; margin: 0; padding: 0; height: 100%; /* 填充父容器高度 */ overflow: hidden; display: flex; background-color: #f5f5f5; } /* ============================================================================ */ /* 动态侧边栏布局样式 */ /* ============================================================================ */ /* 左侧区域 */ .left-section { display: flex; flex-shrink: 0; } /* 左侧图标栏 */ .left-icon-bar { width: 48px; background-color: white; border-right: 1px solid #e9ecef; display: flex; flex-direction: column; align-items: center; justify-content: space-between; padding: 10px 0; } /* 左侧内容面板 */ .left-sidebar { width: 0; background-color: white; color: #404040; overflow: hidden; position: relative; display: flex; flex-direction: column; border-right: 1px solid #e9ecef; } .left-sidebar.open { width: 320px; } /* 右侧区域 */ .right-section { display: flex; flex-shrink: 0; flex-direction: row-reverse; } /* 右侧图标栏 */ .right-icon-bar { width: 48px; background-color: white; border-left: 1px solid #e9ecef; display: flex; flex-direction: column; align-items: center; justify-content: space-between; padding: 10px 0; } /* 右侧内容面板 */ .right-sidebar { width: 0; background-color: white; color: #404040; overflow: hidden; position: relative; display: flex; flex-direction: column; border-left: 1px solid #e9ecef; } .right-sidebar.open { width: 320px; } /* 图标分组 */ .icon-group-top, .icon-group-bottom { display: flex; flex-direction: column; align-items: center; gap: 8px; } /* 图标按钮样式 */ .icon-btn { width: 36px; height: 36px; background-color: #f8f9fa; border: none; border-radius: 4px; cursor: grab; display: flex; align-items: center; justify-content: center; color: #6c757d; font-size: 18px; transition: all 0.2s; user-select: none; } .icon-btn:hover { background-color: #e9ecef; color: #495057; } .icon-btn.active { background-color: #6666FF; color: white; box-shadow: 0 0 0 2px rgba(102, 102, 255, 0.3); } .icon-btn.dragging { opacity: 0.5; cursor: grabbing; } /* 拖动时的幽灵图标 */ .drag-ghost { position: fixed; width: 36px; height: 36px; background-color: #6666FF; border: 2px solid #8888FF; border-radius: 4px; display: flex; align-items: center; justify-content: center; color: white; font-size: 18px; pointer-events: none; z-index: 10000; opacity: 0.9; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); transform: translate(-50%, -50%); } /* 拖动占位符 */ .drop-indicator { width: 36px; height: 4px; background-color: #6666FF; border-radius: 2px; margin: 4px 0; opacity: 0.8; animation: pulseIndicator 1s ease-in-out infinite; } @keyframes pulseIndicator { 0%, 100% { opacity: 0.8; } 50% { opacity: 0.4; } } /* 主内容区域 */ .main-content { flex: 1; display: flex; flex-direction: column; overflow: hidden; min-width: 0; padding: 0; margin: 0; } /* 侧边栏上下内容区域 */ .sidebar-content-top, .sidebar-content-bottom { padding: 15px; overflow-y: auto; overflow-x: hidden; min-width: 320px; flex: 1; display: none; position: relative; isolation: isolate; } /* 侧边栏面板样式 */ .sidebar-panel { width: 100%; height: 100%; } /* 当区域有内容时显示 */ .sidebar-content-top.active, .sidebar-content-bottom.active { display: block; } /* 当只有一个区域激活时占据全部空间 */ .sidebar-content-top.active.full-height, .sidebar-content-bottom.active.full-height { flex: 1; } /* 当两个区域都激活时按比例分配 */ .sidebar-content-top.active:not(.full-height), .sidebar-content-bottom.active:not(.full-height) { flex: 0 0 auto; } /* 拖动手柄 */ .resize-handle { width: 4px; background-color: transparent; cursor: col-resize; position: absolute; top: 0; bottom: 0; z-index: 100; transition: background-color 0.2s; pointer-events: auto; } .resize-handle:hover, .resize-handle.dragging { background-color: #6666FF; } .left-sidebar .resize-handle { right: 0; } .right-sidebar .resize-handle { left: 0; } /* 垂直拖动手柄 (上下分区之间) */ .vertical-resize-handle { height: 4px; background-color: #e9ecef; cursor: row-resize; position: relative; z-index: 100; transition: background-color 0.2s; display: none; flex-shrink: 0; border-top: 1px solid #dee2e6; border-bottom: 1px solid #f8f9fa; pointer-events: auto; } .vertical-resize-handle.active { display: block; } .vertical-resize-handle:hover, .vertical-resize-handle.dragging { background-color: #6666FF; border-top: 1px solid #5555DD; border-bottom: 1px solid #7777FF; } /* 滚动条美化 */ .sidebar-content-top::-webkit-scrollbar, .sidebar-content-bottom::-webkit-scrollbar { width: 8px; } .sidebar-content-top::-webkit-scrollbar-track, .sidebar-content-bottom::-webkit-scrollbar-track { background: #f1f1f1; } .sidebar-content-top::-webkit-scrollbar-thumb, .sidebar-content-bottom::-webkit-scrollbar-thumb { background: #c1c1c1; border-radius: 4px; } .sidebar-content-top::-webkit-scrollbar-thumb:hover, .sidebar-content-bottom::-webkit-scrollbar-thumb:hover { background: #a1a1a1; } .control-panel { background: white; border-radius: 6px; padding: 16px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); border: 1px solid #e9ecef; } .control-section { margin-bottom: 16px; } .control-section:last-child { margin-bottom: 0; } .section-title { font-size: 13px; font-weight: 600; color: #404040; margin-bottom: 10px; padding-bottom: 4px; border-bottom: 1px solid #dee2e6; text-transform: uppercase; letter-spacing: 0.5px; } .control-group { margin-bottom: 12px; } .control-group:last-child { margin-bottom: 0; } .control-group label { display: block; margin-bottom: 4px; font-weight: 500; color: #404040; font-size: 12px; } .heatmap-controls label { margin-right: 8px; font-size: 12px; font-weight: 500; color: #404040; } .control-group select, .control-group input { width: 100%; padding: 8px; border: 1px solid #ced4da; border-radius: 4px; font-size: 12px; transition: border-color 0.2s ease; background: white; } .control-group select:focus, .control-group input:focus { outline: none; border-color: #6666FF; box-shadow: 0 0 0 2px rgba(102, 102, 255, 0.1); } .control-group select.required-empty, .control-group input.required-empty { border-color: #dc3545; box-shadow: 0 0 0 2px rgba(220, 53, 69, 0.1); } .required-error { color: #dc3545; font-size: 11px; margin-top: 4px; display: none; } .dual-input-group { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; } .btn { width: 100%; padding: 8px 12px; border: none; border-radius: 4px; font-size: 12px; font-weight: 500; cursor: pointer; transition: all 0.2s ease; text-transform: none; } .btn:disabled { opacity: 0.6; cursor: not-allowed; } .btn-primary { background: #6666FF; color: white; } .btn-primary:hover:not(:disabled) { background: #5553FF; } .btn-secondary { background: #6c757d; color: white; } .btn-secondary:hover:not(:disabled) { background: #5c636a; } .btn-success { background: #198754; color: white; } .btn-success:hover:not(:disabled) { background: #157347; } .heatmap-main { background: white; border-radius: 6px; padding: 12px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); border: 1px solid #e9ecef; display: flex; flex-direction: column; flex: 1; margin: 0; } .heatmap-controls { display: flex; justify-content: flex-start; align-items: center; margin-bottom: 10px; padding-bottom: 8px; border-bottom: 1px solid #e9ecef; flex-shrink: 0; } .colorscheme-selector { display: flex; gap: 6px; align-items: center; } .colorscheme-btn { width: 28px; height: 18px; border: 2px solid #dee2e6; border-radius: 3px; cursor: pointer; transition: all 0.2s ease; } .colorscheme-btn.active { border-color: #6666FF; transform: scale(1.05); } .colorscheme-btn.viridis { background: linear-gradient(to right, #440154, #21908c, #fde725); } .colorscheme-btn.plasma { background: linear-gradient(to right, #ff0000, #bbbbbb, #0000ff); } .colorscheme-btn.hot { background: linear-gradient(to right, #000000, #ff0000, #ffff00, #ffffff); } .colorscheme-btn.cividis { background: linear-gradient(to right, #00204c, #646464, #fde725); } .colorscheme-btn.YlGnBu { background: linear-gradient(to right, #154fc8, #41b6c4, #f7fcb9); } .heatmap-container { flex: 1; position: relative; min-height: 0; width: 100%; /* 移除 height: 100%; 避免与 flex: 1 冲突,导致高度无法缩小 */ } #heatmap { width: 100%; /* 移除 height: 100%; Plotly 会通过 JS 动态设置准确的高度 */ position: absolute; top: 0; left: 0; right: 0; bottom: 0; } .range-slider-container { margin: 6px 0; position: relative; padding: 6px 0; /* 为滑块上下溢出留出空间 */ } .range-slider { position: relative; height: 4px; background: #ffffff; border-radius: 2px; } .range-slider-track { position: absolute; height: 4px; background: #6666FF; border-radius: 2px; top: 6px; /* 与滑槽对齐 */ left: 0; pointer-events: none; /* 不阻挡滑块交互 */ } .range-slider input[type="range"] { position: absolute; width: 100%; height: 4px; background: transparent; -webkit-appearance: none; appearance: none; pointer-events: none; top: 0; /* 对齐到滑槽 */ } .range-slider input[type="range"]::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; height: 16px; width: 16px; border-radius: 50%; background: #6666FF; cursor: pointer; pointer-events: all; border: 2px solid white; box-shadow: 0 1px 3px rgba(0,0,0,0.2); } .range-slider input[type="range"]::-moz-range-thumb { height: 16px; width: 16px; border-radius: 50%; background: #6666FF; cursor: pointer; pointer-events: all; border: 2px solid white; box-shadow: 0 1px 3px rgba(0,0,0,0.2); } .range-values { display: flex; justify-content: space-between; margin-top: 4px; font-size: 11px; color: #6c757d; } .topk-control { margin: 8px 0; } .topk-slider-container { margin: 6px 0; } .topk-slider { width: 100%; height: 4px; background: #e9ecef; border-radius: 2px; -webkit-appearance: none; appearance: none; } .topk-slider::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; height: 16px; width: 16px; border-radius: 50%; background: #6666FF; cursor: pointer; border: 2px solid white; box-shadow: 0 1px 3px rgba(0,0,0,0.2); } .topk-slider::-moz-range-thumb { height: 16px; width: 16px; border-radius: 50%; background: #6666FF; cursor: pointer; border: 2px solid white; box-shadow: 0 1px 3px rgba(0,0,0,0.2); } .topk-axis-selector { display: flex; gap: 4px; margin-top: 6px; } .axis-btn { flex: 1; padding: 6px 8px; border: 1px solid #ced4da; background: white; border-radius: 4px; font-size: 11px; cursor: pointer; transition: all 0.2s ease; } .axis-btn.active { background: #6666FF; color: white; border-color: #6666FF; } .axis-btn:hover:not(.active) { background: #f8f9fa; border-color: #6666FF; color: #6666FF; } .topk-info { display: flex; justify-content: space-between; align-items: center; margin-top: 4px; font-size: 11px; color: #6c757d; } .loading-h { display: flex; flex-direction: column; justify-content: center; align-items: center; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 10; background: rgba(255, 255, 255, 0.9); padding: 20px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); text-align: center; /* 添加这行确保文本居中 */ } .loading-h .spinner { border: 3px solid #f3f4f6; border-top: 3px solid #6666FF; border-radius: 50%; width: 40px; height: 40px; animation: spin 1s linear infinite; margin: 0 auto 16px auto; /* 修改这行,确保旋转圈水平居中 */ } .loading-h p { margin: 0; color: #6666FF; font-size: 14px; font-weight: 500; white-space: nowrap; text-align: center; /* 添加这行确保文本居中 */ } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } /* 右上角临时消息动画 */ @keyframes slideIn { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } @keyframes slideOut { from { transform: translateX(0); opacity: 1; } to { transform: translateX(100%); opacity: 0; } } /* 右上角临时消息样式 */ .temp-message { position: fixed; top: 80px; right: 20px; z-index: 10000; min-width: 250px; max-width: 400px; padding: 12px 16px; border-radius: 6px; font-size: 14px; font-weight: 500; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); backdrop-filter: blur(8px); animation: slideIn 0.3s ease; } /* 不同类型的临时消息颜色 */ .temp-message.error { background: #fee2e2; border: 1px solid #ef4444; color: #991b1b; } .temp-message.success { background: linear-gradient(135deg, rgba(170, 169, 255, 0.2), rgba(181, 213, 255, 0.2)); border: 1px solid #AAA9FF; color: #404040; } .temp-message.warning { background: #fef3c7; border: 1px solid #f59e0b; color: #92400e; } .temp-message.info { background: #cff4fc; border: 1px solid #0dcaf0; color: #055160; } /* 旧的message样式(保留以防某处还在使用) */ .message { padding: 10px; border-radius: 4px; margin: 6px 0; display: none; font-size: 12px; } .error { color: #721c24; background: #f8d7da; border: 1px solid #f5c6cb; } .success { color: #155724; background: #d4edda; border: 1px solid #c3e6cb; } .warning { color: #856404; background: #fff3cd; border: 1px solid #ffeaa7; } .info { color: #055160; background: #cff4fc; border: 1px solid #b6effb; } .stats-grid { display: flex; flex-direction: column; gap: 6px; margin-top: 12px; } .stats-grid .stat-item { display: flex; align-items: center; gap: 8px; padding: 6px 10px; background: white; border: 1px solid #e9ecef; border-radius: 4px; box-shadow: 0 1px 2px rgba(0,0,0,0.05); font-size: 12px; } .stat-item .icon { flex-shrink: 0; width: 16px; height: 16px; display: flex; align-items: center; justify-content: center; font-size: 14px; color: #666; } .stat-item .label { flex: 1; font-size: 12px; color: #495057; font-weight: 500; } .stat-item .value { flex-shrink: 0; font-size: 13px; font-weight: 600; color: #333; } .topk-btn { width: 24px; height: 24px; border: 1px solid #ced4da; background: white; border-radius: 3px; font-size: 14px; font-weight: bold; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all 0.2s ease; color: #495057; } /* 相似度范围输入框样式 */ .similarity-input { height: 24px; padding: 0 6px; border: 1px solid #ced4da; border-radius: 3px; font-size: 12px; text-align: center; transition: border-color 0.2s ease; background: white; } .similarity-input:focus { outline: none; border-color: #6666FF; box-shadow: 0 0 0 2px rgba(102, 102, 255, 0.1); } /* 隐藏number input的spinner按钮 */ .similarity-input::-webkit-inner-spin-button, .similarity-input::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; } .similarity-input[type=number] { -moz-appearance: textfield; } .topk-btn:hover { background: #f8f9fa; border-color: #6666FF; color: #6666FF; } .topk-btn:active { background: #e9ecef; } .topk-btn:disabled { opacity: 0.5; cursor: not-allowed; background: #f8f9fa; } /* 响应式设计 */ @media (max-width: 1200px) { .left-sidebar.open, .right-sidebar.open { width: 280px; } .sidebar-content-top, .sidebar-content-bottom { min-width: 280px; } .icon-btn { width: 32px; height: 32px; font-size: 16px; } .left-icon-bar, .right-icon-bar { width: 40px; } } @media (max-width: 768px) { /* 移动端调整父容器margin */ #pageContent:has(.test-container) { margin: -1rem; /* 移动端padding通常更小 */ width: calc(100% + 2rem); } .test-container { flex-direction: column; height: calc(100vh - 60px); /* 确保移动端也正确减去导航栏高度 */ } .left-section, .right-section { width: 100%; } .left-sidebar.open, .right-sidebar.open { width: 100%; max-width: 100%; position: fixed; top: 60px; bottom: 0; z-index: 1000; background: white; } .left-sidebar { left: 48px; } .right-sidebar { right: 48px; } .main-content { order: -1; } .heatmap-main { margin: 10px; } .icon-btn { width: 30px; height: 30px; font-size: 14px; } .left-icon-bar, .right-icon-bar { width: 36px; } } .export-control { margin-top: 12px; } .btn-export { background: #6666FF; color: white; width: 100%; } .btn-export:hover:not(:disabled) { background: #5553FF; } .btn-export:disabled { background: #6c757d; cursor: not-allowed; } /* Collection多选相关样式 */ .collection-container { display: flex; flex-direction: column; gap: 6px; } .collection-select-row { display: flex; gap: 6px; align-items: center; } .collection-select-row select { flex: 1; padding: 8px; border: 1px solid #ced4da; border-radius: 4px; font-size: 12px; transition: border-color 0.2s ease; background: white; } .collection-select-row select:focus { outline: none; border-color: #6666FF; box-shadow: 0 0 0 2px rgba(102, 102, 255, 0.1); } .btn-add-collection, .btn-remove-collection { width: 32px; height: 32px; min-width: 32px; flex-shrink: 0; border: 1px solid #ced4da; background: white; border-radius: 4px; font-size: 16px; font-weight: bold; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all 0.2s ease; color: #495057; padding: 0; } .btn-add-collection:hover { background: #6666FF; border-color: #6666FF; color: white; } .btn-remove-collection { color: #dc3545; border-color: #dc3545; } .btn-remove-collection:hover { background: #dc3545; border-color: #dc3545; color: white; } .btn-add-collection:active, .btn-remove-collection:active { transform: scale(0.95); } /* 矩阵按钮表格样式 */ .matrix-button-table-container { overflow-x: auto; margin: 8px 0; } .matrix-button-table { width: 100%; border-collapse: collapse; font-size: 11px; } .matrix-button-table th, .matrix-button-table td { border: 1px solid #dee2e6; padding: 4px; text-align: center; vertical-align: middle; } .matrix-button-table th { background: #f8f9fa; font-weight: 600; color: #495057; white-space: nowrap; } .matrix-button-table th:first-child { background: white; border: none; } .matrix-button-table td:first-child { background: #f8f9fa; font-weight: 600; color: #495057; white-space: nowrap; } .matrix-selection-btn { width: 100%; min-width: 60px; height: 32px; border: 2px solid #dee2e6; background: white; border-radius: 4px; font-size: 10px; cursor: pointer; transition: all 0.2s ease; color: #495057; padding: 4px; display: flex; align-items: center; justify-content: center; } .matrix-selection-btn:hover { background: #f8f9fa; border-color: #6666FF; } .matrix-selection-btn.selected { background: #6666FF; color: white; border-color: #6666FF; font-weight: 600; } .matrix-selection-btn.selected-secondary { background: #dc3545; color: white; border-color: #dc3545; font-weight: 600; } .matrix-selection-btn.difference { background: linear-gradient(135deg, #6666FF 50%, #dc3545 50%); color: white; border-color: #6666FF; font-weight: 600; } .matrix-selection-info { margin-top: 8px; padding: 8px; background: #f8f9fa; border-radius: 4px; font-size: 11px; } .info-text { color: #495057; line-height: 1.4; } /* ============================================================================ */ /* 筛选器标签页样式 */ /* ============================================================================ */ .filter-tabs-header { margin-bottom: 12px; padding-bottom: 8px; border-bottom: 1px solid #e9ecef; } .filter-tabs-info { font-size: 11px; color: #6c757d; margin-bottom: 8px; padding: 6px 8px; background: #f8f9fa; border-radius: 4px; border-left: 3px solid #0d6efd; } .filter-tabs-buttons { display: flex; gap: 4px; } .filter-tab-btn { flex: 1; padding: 6px 12px; border: 1px solid #dee2e6; border-radius: 4px; background: white; cursor: pointer; font-size: 12px; transition: all 0.2s; } .filter-tab-btn:hover { background: #f8f9fa; } .filter-tab-btn.active { background: #3b82f6; color: white; border-color: #3b82f6; } /* 减数图标签特殊颜色 */ .filter-tab-btn#subtractFilterTab.active { background: #ef4444; border-color: #ef4444; } /* ============================================================================ */ /* 新架构:竖排图表列表样式 */ /* ============================================================================ */ .section-subtitle { font-size: 11px; color: #6c757d; margin-bottom: 12px; line-height: 1.4; padding: 6px 8px; background: #f8f9fa; border-radius: 4px; border-left: 3px solid #0d6efd; } .matrix-list-container { max-height: 400px; overflow-y: auto; border: 1px solid #e9ecef; border-radius: 6px; background: #fafbfc; } .matrix-list-item { background: white; border-bottom: 1px solid #e9ecef; border-left: 3px solid #dee2e6; /* 默认边框颜色 */ padding: 6px 12px; /* 上下6px 左右12px */ transition: all 0.2s ease; } .matrix-item-header { display: flex; justify-content: space-between; align-items: center; gap: 10px; } .matrix-item-left { display: flex; align-items: center; gap: 10px; flex: 1; min-width: 0; /* 允许flex子元素缩小 */ } .matrix-list-item:last-child { border-bottom: none; } .matrix-list-item:hover { background: #f8f9fa; } /* 边框颜色状态 */ .matrix-list-item.border-primary2 { border-left-color: #28a745; /* 绿色 - 主数据源/被减数 */ } .matrix-list-item.border-subtract { border-left-color: #dc3545; /* 红色 - 减数 */ } .matrix-list-item.border-exclusive { border-left-color: #6666FF; /* 紫色 - 独占模式 */ } /* 状态图标(在名称左侧) */ .matrix-item-badge { width: 20px; height: 20px; min-width: 20px; display: flex; align-items: center; justify-content: center; font-size: 17px; /* 14px * 1.2 ≈ 17px */ flex-shrink: 0; } .matrix-item-badge.badge-none { color: #9ca3af; /* 灰色 - 无状态 */ } .matrix-item-badge.badge-circle { color: #28a745; /* 绿色 - 主数据源 */ } .matrix-item-badge.badge-plus { color: #28a745; /* 绿色 - 被减数 */ } .matrix-item-badge.badge-minus { color: #dc3545; /* 红色 - 减数 */ } .matrix-item-badge.badge-crosshair { color: #6666FF; /* 紫色 - 独占模式 */ } .matrix-item-title { font-size: 12px; font-weight: 600; color: #212529; margin-bottom: 0px; /* 移除底部margin,从8px改为0px */ cursor: default; display: flex; flex-direction: column; gap: 0px; /* 减少行间距,从2px改为0px */ max-width: 180px; /* 为右侧按钮留出空间 */ } .matrix-item-title .collection-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; text-align: center; } .matrix-item-title .vs-text { font-size: 10px; color: #6c757d; font-weight: 400; text-align: center; } .matrix-item-status { font-size: 11px; color: #6c757d; margin-bottom: 10px; padding: 4px 8px; border-radius: 3px; display: inline-block; background: #e9ecef; } .matrix-item-status.status-primary { background: #d1e7dd; color: #0f5132; font-weight: 500; } .matrix-item-status.status-subtract { background: #f8d7da; color: #842029; font-weight: 500; } .matrix-item-status.status-exclusive { background: #fff3cd; color: #664d03; font-weight: 600; } .matrix-item-buttons { display: flex; gap: 4px; /* 按钮之间使用较小的间距 */ flex-shrink: 0; align-items: center; } .matrix-control-btn { width: 28px; height: 28px; min-width: 28px; padding: 0; font-size: 19px; /* 16px * 1.2 ≈ 19px */ border: none; border-radius: 4px; background: transparent; color: #404040; /* 深灰色 - 未激活状态 */ cursor: pointer; transition: all 0.2s ease; display: flex; align-items: center; justify-content: center; } .matrix-control-btn:hover { background: #f3f4f6; transform: scale(1.1); } /* 应用数据按钮 - 眼睛图标 */ .matrix-control-btn.btn-apply-data.active { color: #28a745; /* 绿色 */ } /* 应用筛选器按钮 - 筛选图标 */ .matrix-control-btn.btn-apply-filter.active { color: #3b82f6; /* 蓝色 */ } /* 独占模式按钮 - 准星图标 */ .matrix-control-btn.btn-exclusive.active { color: #6666FF; /* 紫色 */ animation: pulse 2s infinite; } @keyframes pulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(96, 96, 255, 0.4); } 50% { box-shadow: 0 0 0 4px rgba(96, 96, 255, 0); } } .matrix-control-btn:active { transform: scale(0.95); } .matrix-control-btn:disabled { opacity: 0.3; cursor: not-allowed; } /* Plotly 热力图悬停提示框透明度 */ .js-plotly-plot .hoverlayer .hovertext { background: rgba(255, 255, 255, 0.5) !important; backdrop-filter: blur(4px); } .js-plotly-plot .hoverlayer .hovertext path { fill: rgba(255, 255, 255, 0.5) !important; /*stroke: #6666FF !important;*/ } /* 面板标题栏样式 */ .panel-title-wrapper { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; padding-bottom: 10px; border-bottom: 2px solid #6666FF; } .panel-title { font-size: 14px; font-weight: 600; color: #404040; margin: 0; } /* 标题行图标按钮样式 */ .title-icon-btn { width: 28px; height: 28px; min-width: 28px; padding: 0; border: 1px solid #dee2e6; border-radius: 4px; background: white; color: #6c757d; font-size: 16px; cursor: pointer; transition: all 0.2s ease; display: flex; align-items: center; justify-content: center; flex-shrink: 0; } .title-icon-btn:hover { background: #6666FF; border-color: #6666FF; color: white; transform: scale(1.05); } .title-icon-btn:active { transform: scale(0.95); }