You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2151 lines
45 KiB
CSS

/* 全局样式重置 */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
/* 根变量定义 */
:root {
/* 主色调 */
--primary-bg: rgba(12, 42, 73, 0.4);
--secondary-bg: rgba(15, 52, 96, 0.6);
--accent-blue: #00d4ff;
--accent-green: #00ff88;
--accent-purple: #8b5cf6;
/* 文字颜色 */
--text-primary: #ffffff;
--text-secondary: #b0c4de;
--text-muted: #6b7280;
/* 状态颜色 */
--success: #10b981;
--warning: #f59e0b;
--error: #ef4444;
/* 玻璃拟态效果 */
--glass-bg: rgba(255, 255, 255, 0.1);
--glass-border: rgba(255, 255, 255, 0.2);
--glass-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
/* 字体 */
--font-primary: 'Orbitron', monospace;
--font-secondary: 'Inter', sans-serif;
}
/* 基础样式 */
body {
font-family: var(--font-secondary);
background: var(--primary-bg) url('./static/background.png') center/cover fixed;
color: var(--text-primary);
overflow-x: hidden;
min-height: 100vh;
}
/* 顶部导航栏 */
.header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 2rem;
background: var(--glass-bg);
backdrop-filter: blur(10px);
border-bottom: 1px solid var(--glass-border);
box-shadow: var(--glass-shadow);
position: sticky;
top: 0;
z-index: 1000;
}
.header-left .logo {
display: flex;
align-items: center;
gap: 0.5rem;
}
.logo i {
font-size: 2rem;
color: var(--accent-blue);
animation: pulse 2s infinite;
}
.logo-text {
font-family: var(--font-primary);
font-size: 1.5rem;
font-weight: 700;
background: linear-gradient(45deg, var(--accent-blue), var(--accent-green));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.header-center .status-indicator {
display: flex;
align-items: center;
gap: 0.5rem;
}
.status-light {
width: 12px;
height: 12px;
border-radius: 50%;
background: var(--success);
animation: blink 1.5s infinite;
}
.status-light.active {
box-shadow: 0 0 10px var(--success);
}
.header-right {
display: flex;
align-items: center;
gap: 2rem;
}
.time-display {
font-family: var(--font-primary);
font-size: 1.1rem;
color: var(--accent-blue);
}
.user-info {
display: flex;
align-items: center;
gap: 0.5rem;
color: var(--text-secondary);
}
/* 主容器 */
.main-container {
display: flex;
height: calc(100vh - 80px);
}
/* 左侧导航栏 */
.sidebar {
width: 250px;
background: var(--glass-bg);
backdrop-filter: blur(10px);
border-right: 1px solid var(--glass-border);
padding: 2rem 0;
display: flex;
flex-direction: column;
gap: 1rem;
}
.nav-item {
display: flex;
align-items: center;
gap: 1rem;
padding: 1rem 2rem;
cursor: pointer;
transition: all 0.3s ease;
position: relative;
color: var(--text-secondary);
}
.nav-item:hover {
background: rgba(255, 255, 255, 0.05);
color: var(--text-primary);
}
.nav-item.active {
color: var(--accent-blue);
background: rgba(0, 212, 255, 0.1);
}
.nav-item.active .nav-indicator {
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 4px;
background: var(--accent-blue);
box-shadow: 0 0 10px var(--accent-blue);
}
.nav-item i {
font-size: 1.2rem;
width: 20px;
}
/* 主内容区 */
.main-content {
flex: 1;
overflow-y: auto;
padding: 2rem;
}
.module {
display: none;
}
.module.active {
display: block;
}
.module-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 2rem;
}
.module-header h2 {
font-family: var(--font-primary);
font-size: 2rem;
color: var(--text-primary);
}
.module-controls {
display: flex;
gap: 1rem;
align-items: center;
}
/* 按钮样式 */
.btn-primary {
background: linear-gradient(45deg, var(--accent-blue), var(--accent-green));
border: none;
padding: 0.75rem 1.5rem;
border-radius: 8px;
color: white;
font-weight: 600;
cursor: pointer;
transition: all 0.3s ease;
display: flex;
align-items: center;
gap: 0.5rem;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(0, 212, 255, 0.3);
}
.control-select {
background: var(--glass-bg);
border: 1px solid var(--glass-border);
padding: 0.5rem 1rem;
border-radius: 6px;
color: var(--text-primary);
backdrop-filter: blur(10px);
}
/* 数据接收模块样式 */
/* 顶部面板样式 */
.top-panels {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 1.5rem;
margin-bottom: 2rem;
align-items: start;
}
.top-panels .panel-card {
background: var(--glass-bg);
backdrop-filter: blur(10px);
border: 1px solid var(--glass-border);
border-radius: 12px;
padding: 1.5rem;
box-shadow: var(--glass-shadow);
height: fit-content;
}
.reception-layout {
display: flex;
justify-content: center;
align-items: center;
height: calc(100vh - 350px);
}
.earth-container {
display: flex;
justify-content: center;
align-items: center;
}
.earth-model {
width: 400px;
height: 400px;
position: relative;
}
.earth-sphere {
width: 100%;
height: 100%;
border-radius: 50%;
background: radial-gradient(circle at 30% 30%, #1e3a8a, #0f172a);
border: 2px solid var(--accent-blue);
position: relative;
animation: rotate 20s linear infinite;
box-shadow:
0 0 50px rgba(0, 212, 255, 0.3),
inset 0 0 50px rgba(0, 0, 0, 0.5);
}
.data-point {
position: absolute;
width: 12px;
height: 12px;
background: var(--accent-green);
border-radius: 50%;
cursor: pointer;
z-index: 10;
}
.point-pulse {
position: absolute;
top: -4px;
left: -4px;
width: 20px;
height: 20px;
border: 2px solid var(--accent-green);
border-radius: 50%;
animation: pulse-ring 2s infinite;
}
.data-flow {
position: absolute;
width: 2px;
height: 100px;
background: linear-gradient(to bottom, var(--accent-green), transparent);
transform-origin: top;
animation: flow 3s infinite;
}
/* 信息面板样式 */
.info-panel {
display: flex;
flex-direction: column;
gap: 1.5rem;
height: 100%;
overflow-y: auto;
}
.panel-card {
background: var(--glass-bg);
backdrop-filter: blur(10px);
border: 1px solid var(--glass-border);
border-radius: 12px;
padding: 1.5rem;
box-shadow: var(--glass-shadow);
flex-shrink: 0;
}
.panel-card h3 {
font-family: var(--font-primary);
color: var(--accent-blue);
margin-bottom: 1rem;
font-size: 1.1rem;
}
/* 底部数据流面板样式 */
.bottom-data-stream {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: linear-gradient(135deg, rgba(30, 58, 138, 0.95) 0%, rgba(15, 23, 42, 0.95) 100%);
backdrop-filter: blur(20px);
border-top: 1px solid rgba(255, 255, 255, 0.2);
box-shadow: 0 -10px 30px rgba(0, 0, 0, 0.3);
z-index: 1000;
transition: transform 0.3s ease;
}
.bottom-data-stream.collapsed {
transform: translateY(calc(100% - 60px));
}
.stream-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 15px 20px;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
cursor: pointer;
}
.stream-title {
display: flex;
align-items: center;
gap: 10px;
color: var(--accent-blue);
font-weight: 600;
font-size: 1.1rem;
}
.stream-title i {
font-size: 1.2rem;
}
.stream-controls {
display: flex;
align-items: center;
gap: 10px;
}
.stream-toggle {
background: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 6px;
padding: 8px 12px;
color: white;
cursor: pointer;
transition: all 0.3s ease;
}
.stream-toggle:hover {
background: rgba(255, 255, 255, 0.2);
transform: translateY(-1px);
}
.stream-toggle i {
transition: transform 0.3s ease;
}
.bottom-data-stream.collapsed .stream-toggle i {
transform: rotate(180deg);
}
.stream-content {
padding: 20px;
max-height: 200px;
overflow: hidden;
}
/* 横向数据流样式 */
.data-stream.horizontal {
display: flex;
gap: 15px;
overflow-x: auto;
overflow-y: hidden;
padding: 10px 0;
scroll-behavior: smooth;
}
.data-stream.horizontal .stream-item {
flex: 0 0 280px;
min-width: 280px;
height: 120px;
display: flex;
flex-direction: column;
justify-content: space-between;
padding: 16px;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
transition: all 0.3s ease;
cursor: pointer;
position: relative;
overflow: hidden;
}
.data-stream.horizontal .stream-item:hover {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.3);
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);
}
.data-stream.horizontal .stream-device-info {
display: flex;
align-items: center;
gap: 12px;
}
.data-stream.horizontal .stream-device-icon {
width: 40px;
height: 40px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.2rem;
border: 2px solid;
flex-shrink: 0;
}
.data-stream.horizontal .stream-device-details {
flex: 1;
min-width: 0;
}
.data-stream.horizontal .stream-device-name {
font-weight: 600;
color: white;
font-size: 0.95rem;
margin-bottom: 4px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.data-stream.horizontal .stream-parameter {
color: #94a3b8;
font-size: 0.85rem;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.data-stream.horizontal .stream-value-section {
display: flex;
justify-content: space-between;
align-items: flex-end;
margin-top: 12px;
}
.data-stream.horizontal .stream-value {
font-family: 'Courier New', monospace;
font-weight: 700;
font-size: 1.1rem;
}
.data-stream.horizontal .stream-timestamp {
color: #64748b;
font-size: 0.8rem;
font-family: 'Courier New', monospace;
}
/* 横向滚动条样式 */
.data-stream.horizontal::-webkit-scrollbar {
height: 6px;
}
.data-stream.horizontal::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.05);
border-radius: 3px;
}
.data-stream.horizontal::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.2);
border-radius: 3px;
}
.data-stream.horizontal::-webkit-scrollbar-thumb:hover {
background: rgba(255, 255, 255, 0.3);
}
/* 数据流进入动画 - 从左向右移动 */
.data-stream.horizontal .stream-item {
opacity: 0;
transform: translateX(-100px);
animation: slideInFromLeft 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;
}
/* 为新添加的卡片设置延迟动画 */
.data-stream.horizontal .stream-item.new-item {
animation: slideInFromLeft 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;
}
/* 卡片移动动画 - 从左滑入 */
@keyframes slideInFromLeft {
0% {
opacity: 0;
transform: translateX(-100px) scale(0.8);
}
50% {
opacity: 0.7;
transform: translateX(-20px) scale(0.95);
}
100% {
opacity: 1;
transform: translateX(0) scale(1);
}
}
/* 卡片推动效果 - 其他卡片向右移动让位 */
.data-stream.horizontal .stream-item {
transition: transform 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}
.data-stream.horizontal .stream-item.push-right {
transform: translateX(295px);
}
/* 重置推动效果 */
.data-stream.horizontal .stream-item.reset-position {
transform: translateX(0);
}
/* 卡片淡出动画 - 超出限制的卡片 */
.data-stream.horizontal .stream-item.fade-out {
animation: fadeOutRight 0.5s ease-in forwards;
}
@keyframes fadeOutRight {
0% {
opacity: 1;
transform: translateX(0) scale(1);
}
100% {
opacity: 0;
transform: translateX(100px) scale(0.8);
}
}
/* 移除旧的垂直数据流样式 */
.data-stream:not(.horizontal) {
display: none;
}
.stream-item {
display: flex;
align-items: center;
padding: 12px 16px;
background: rgba(255, 255, 255, 0.03);
border-radius: 12px;
border: 1px solid rgba(255, 255, 255, 0.1);
transition: all 0.3s ease;
cursor: pointer;
position: relative;
overflow: hidden;
}
.stream-item::before {
content: '';
position: absolute;
left: 0;
top: 0;
width: 4px;
height: 100%;
background: var(--accent-blue);
transition: all 0.3s ease;
}
.stream-item:hover {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.2);
transform: translateX(4px);
}
.stream-item:hover::before {
width: 6px;
box-shadow: 0 0 10px currentColor;
}
.stream-device-info {
display: flex;
align-items: center;
flex: 1;
gap: 12px;
}
.stream-device-icon {
width: 32px;
height: 32px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
background: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.2);
}
.stream-device-details {
flex: 1;
}
.stream-device-name {
font-weight: 600;
color: var(--text-primary);
font-size: 0.9rem;
margin-bottom: 2px;
}
.stream-parameter {
font-size: 0.8rem;
color: var(--text-secondary);
opacity: 0.8;
}
.stream-value-section {
display: flex;
flex-direction: column;
align-items: flex-end;
gap: 4px;
}
.stream-value {
font-weight: 700;
font-size: 1rem;
font-family: 'Courier New', monospace;
}
.stream-timestamp {
font-size: 0.75rem;
color: var(--text-muted);
font-family: 'Courier New', monospace;
}
/* 设备类型颜色样式 */
.stream-item.device-ctd::before { background: #00ff88; }
.stream-item.device-adcp::before { background: #0088ff; }
.stream-item.device-gravity::before { background: #ff6600; }
.stream-item.device-magnetic::before { background: #ff0066; }
.stream-item.device-wave::before { background: #00ffff; }
.stream-item.device-depth::before { background: #8800ff; }
.stream-item.device-radar::before { background: #ffff00; }
.stream-item.device-multi::before { background: #00ff00; }
.stream-item.device-buoy::before { background: #ff8800; }
.stream-item.device-beidou::before { background: #ff4400; }
.stream-item.device-wind::before { background: #4400ff; }
.stream-item.device-weather::before { background: #88ff00; }
.stream-item.device-sky::before { background: #ff0088; }
.stream-item.device-turbulence::before { background: #0044ff; }
.stream-item.device-lidar::before { background: #ff6600; }
.stream-item.device-visibility::before { background: #66ff00; }
.stream-item.device-cloud::before { background: #00aaff; }
.stream-item.device-navigation::before { background: #aa00ff; }
.stream-item.device-ctd .stream-device-icon { background: rgba(0, 255, 136, 0.2); border-color: #00ff88; }
.stream-item.device-adcp .stream-device-icon { background: rgba(0, 136, 255, 0.2); border-color: #0088ff; }
.stream-item.device-gravity .stream-device-icon { background: rgba(255, 102, 0, 0.2); border-color: #ff6600; }
.stream-item.device-magnetic .stream-device-icon { background: rgba(255, 0, 102, 0.2); border-color: #ff0066; }
.stream-item.device-wave .stream-device-icon { background: rgba(0, 255, 255, 0.2); border-color: #00ffff; }
.stream-item.device-depth .stream-device-icon { background: rgba(136, 0, 255, 0.2); border-color: #8800ff; }
.stream-item.device-radar .stream-device-icon { background: rgba(255, 255, 0, 0.2); border-color: #ffff00; }
.stream-item.device-multi .stream-device-icon { background: rgba(0, 255, 0, 0.2); border-color: #00ff00; }
.stream-item.device-buoy .stream-device-icon { background: rgba(255, 136, 0, 0.2); border-color: #ff8800; }
.stream-item.device-beidou .stream-device-icon { background: rgba(255, 68, 0, 0.2); border-color: #ff4400; }
.stream-item.device-wind .stream-device-icon { background: rgba(68, 0, 255, 0.2); border-color: #4400ff; }
.stream-item.device-weather .stream-device-icon { background: rgba(136, 255, 0, 0.2); border-color: #88ff00; }
.stream-item.device-sky .stream-device-icon { background: rgba(255, 0, 136, 0.2); border-color: #ff0088; }
.stream-item.device-turbulence .stream-device-icon { background: rgba(0, 68, 255, 0.2); border-color: #0044ff; }
.stream-item.device-lidar .stream-device-icon { background: rgba(255, 102, 0, 0.2); border-color: #ff6600; }
.stream-item.device-visibility .stream-device-icon { background: rgba(102, 255, 0, 0.2); border-color: #66ff00; }
.stream-item.device-cloud .stream-device-icon { background: rgba(0, 170, 255, 0.2); border-color: #00aaff; }
.stream-item.device-navigation .stream-device-icon { background: rgba(170, 0, 255, 0.2); border-color: #aa00ff; }
/* 数据流动画效果 */
.stream-item {
opacity: 0;
transform: translateX(-20px);
animation: streamItemEnter 0.4s ease forwards;
}
@keyframes streamItemEnter {
to {
opacity: 1;
transform: translateX(0);
}
}
.stream-item.removing {
animation: streamItemExit 0.3s ease forwards;
}
@keyframes streamItemExit {
to {
opacity: 0;
transform: translateX(20px);
height: 0;
padding: 0;
margin: 0;
}
}
/* 滚动条样式 */
.data-stream::-webkit-scrollbar {
width: 4px;
}
.data-stream::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.05);
border-radius: 2px;
}
.data-stream::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.2);
border-radius: 2px;
}
.data-stream::-webkit-scrollbar-thumb:hover {
background: rgba(255, 255, 255, 0.3);
}
/* 数据流优化样式 */
.stream-item {
display: grid;
grid-template-columns: 20px 1fr 120px 100px;
gap: 10px;
padding: 8px 12px;
margin: 4px 0;
background: rgba(255, 255, 255, 0.05);
border-radius: 6px;
border-left: 3px solid var(--accent-blue);
transition: all 0.3s ease;
align-items: center;
}
.stream-item:hover {
background: rgba(255, 255, 255, 0.1);
transform: translateX(5px);
}
.stream-time {
font-size: 0.8rem;
color: var(--text-secondary);
font-family: 'Courier New', monospace;
}
.stream-device {
font-weight: 500;
color: var(--text-primary);
display: flex;
align-items: center;
gap: 8px;
}
.stream-device::before {
content: '';
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--accent-green);
animation: pulse 2s infinite;
}
.stream-param {
font-size: 0.85rem;
color: var(--accent-blue);
background: rgba(0, 212, 255, 0.1);
padding: 2px 8px;
border-radius: 12px;
text-align: center;
}
.stream-value {
font-weight: bold;
text-align: right;
font-family: 'Courier New', monospace;
}
/* 设备类型图标样式 */
.device-type-icon {
width: 16px;
height: 16px;
margin-right: 6px;
opacity: 0.8;
}
/* 不同设备类型的颜色主题 */
.device-ctd { border-left-color: #00ff88; }
.device-adcp { border-left-color: #0088ff; }
.device-gravity { border-left-color: #ff6600; }
.device-magnetic { border-left-color: #ff0066; }
.device-wave { border-left-color: #00ffff; }
.device-depth { border-left-color: #8800ff; }
.device-radar { border-left-color: #ffff00; }
.device-multi { border-left-color: #00ff00; }
.device-buoy { border-left-color: #ff8800; }
.device-beidou { border-left-color: #ff4400; }
.device-wind { border-left-color: #4400ff; }
.device-weather { border-left-color: #88ff00; }
.device-sky { border-left-color: #ff0088; }
.device-turbulence { border-left-color: #0044ff; }
.device-lidar { border-left-color: #ff6600; }
.device-visibility { border-left-color: #66ff00; }
.device-cloud { border-left-color: #00aaff; }
.device-navigation { border-left-color: #aa00ff; }
/* 处理节点样式优化 */
.pipeline-node {
position: relative;
width: 120px;
height: 80px;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.05));
border: 2px solid rgba(0, 212, 255, 0.3);
border-radius: 12px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
cursor: pointer;
transition: all 0.3s ease;
backdrop-filter: blur(10px);
margin: 0 15px;
}
.pipeline-node:hover {
transform: translateY(-5px) scale(1.05);
border-color: var(--accent-blue);
box-shadow: 0 10px 30px rgba(0, 212, 255, 0.3);
}
.pipeline-node i {
font-size: 1.5rem;
color: var(--accent-blue);
margin-bottom: 8px;
}
.pipeline-node span {
font-size: 0.85rem;
color: var(--text-primary);
text-align: center;
font-weight: 500;
}
.pipeline-node.input-node {
border-color: rgba(16, 185, 129, 0.5);
}
.pipeline-node.input-node i {
color: var(--accent-green);
}
.pipeline-node.process-node {
border-color: rgba(245, 158, 11, 0.5);
}
.pipeline-node.process-node i {
color: #f59e0b;
}
.pipeline-node.compute-node {
border-color: rgba(139, 92, 246, 0.5);
}
.pipeline-node.compute-node i {
color: #8b5cf6;
}
.pipeline-node.output-node {
border-color: rgba(239, 68, 68, 0.5);
}
.pipeline-node.output-node i {
color: #ef4444;
}
.node-pulse {
position: absolute;
top: -2px;
left: -2px;
right: -2px;
bottom: -2px;
border: 2px solid transparent;
border-radius: 12px;
animation: node-pulse 3s infinite;
}
@keyframes node-pulse {
0%, 100% {
border-color: transparent;
transform: scale(1);
}
50% {
border-color: rgba(0, 212, 255, 0.5);
transform: scale(1.05);
}
}
.pipeline-connection {
position: absolute;
height: 2px;
background: linear-gradient(90deg,
transparent,
rgba(0, 212, 255, 0.5),
rgba(0, 212, 255, 0.8),
rgba(0, 212, 255, 0.5),
transparent
);
top: 50%;
transform: translateY(-50%);
animation: data-flow 2s infinite;
}
@keyframes data-flow {
0% {
background-position: -100% 0;
}
100% {
background-position: 100% 0;
}
}
/* 节点详情面板 */
.node-details {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
padding: 20px;
margin-top: 20px;
backdrop-filter: blur(10px);
}
.node-details h4 {
color: var(--accent-blue);
margin-bottom: 15px;
font-size: 1.2rem;
}
.node-details p {
margin-bottom: 10px;
line-height: 1.6;
}
.node-details ul {
margin: 10px 0;
padding-left: 20px;
}
.node-details li {
margin: 5px 0;
color: var(--text-secondary);
}
.node-details strong {
color: var(--accent-blue);
}
/* 资源监控环形进度条 */
.progress-ring {
width: 60px;
height: 60px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
position: relative;
background: conic-gradient(var(--accent-blue) 0deg, rgba(255, 255, 255, 0.1) 0deg);
}
.progress-ring::before {
content: '';
position: absolute;
width: 45px;
height: 45px;
border-radius: 50%;
background: var(--bg-primary);
}
.progress-value {
position: relative;
z-index: 1;
font-size: 0.8rem;
font-weight: bold;
color: var(--text-primary);
}
/* 处理统计卡片 */
.stat-card {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
padding: 15px;
text-align: center;
transition: all 0.3s ease;
}
.stat-card:hover {
background: rgba(255, 255, 255, 0.08);
transform: translateY(-2px);
}
.stat-card.error {
border-color: rgba(239, 68, 68, 0.5);
}
.stat-card.error .stat-number {
color: #ef4444;
}
.stat-number {
font-size: 1.8rem;
font-weight: bold;
color: var(--accent-blue);
display: block;
margin-bottom: 5px;
}
.stat-label {
font-size: 0.9rem;
color: var(--text-secondary);
}
/* 日志样式 */
.log-content {
max-height: 300px;
overflow-y: auto;
padding: 15px;
background: rgba(0, 0, 0, 0.3);
border-radius: 8px;
font-family: 'Courier New', monospace;
font-size: 0.85rem;
}
.log-entry {
margin: 5px 0;
padding: 5px 10px;
border-radius: 4px;
transition: all 0.3s ease;
}
.log-entry.info {
color: var(--text-primary);
border-left: 3px solid var(--accent-blue);
}
.log-entry.warning {
color: #f59e0b;
border-left: 3px solid #f59e0b;
background: rgba(245, 158, 11, 0.1);
}
.log-entry.error {
color: #ef4444;
border-left: 3px solid #ef4444;
background: rgba(239, 68, 68, 0.1);
}
/* 响应式设计 */
@media (max-width: 1200px) {
.reception-layout {
grid-template-columns: 250px 1fr 250px;
}
.processing-layout {
grid-template-columns: 200px 1fr 200px;
}
.visualization-layout {
grid-template-columns: 1fr 300px;
}
}
@media (max-width: 768px) {
.sidebar {
width: 200px;
}
.reception-layout,
.processing-layout {
grid-template-columns: 1fr;
grid-template-rows: auto auto auto;
}
.visualization-layout {
grid-template-columns: 1fr;
grid-template-rows: 1fr auto;
}
.pipeline-flow {
flex-direction: column;
gap: 2rem;
}
.pipeline-connection {
display: none;
}
}
/* 滚动条样式 */
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.1);
border-radius: 4px;
}
::-webkit-scrollbar-thumb {
background: var(--accent-blue);
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--accent-green);
}
/* 设备详情弹窗样式 */
.device-modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.8);
display: flex;
justify-content: center;
align-items: center;
z-index: 1000;
backdrop-filter: blur(10px);
}
.device-modal-content {
background: var(--glass-bg);
border: 1px solid var(--glass-border);
border-radius: 15px;
padding: 2rem;
max-width: 600px;
width: 90%;
max-height: 80vh;
overflow-y: auto;
backdrop-filter: blur(20px);
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
}
.device-modal-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1.5rem;
padding-bottom: 1rem;
border-bottom: 1px solid var(--glass-border);
}
.device-modal-header h3 {
color: var(--accent-blue);
margin: 0;
font-size: 1.5rem;
}
.device-modal-close {
font-size: 2rem;
color: var(--text-secondary);
cursor: pointer;
transition: color 0.3s ease;
}
.device-modal-close:hover {
color: var(--accent-red);
}
.device-info {
margin-bottom: 1.5rem;
}
.device-info p {
margin: 0.5rem 0;
color: var(--text-primary);
}
.device-info strong {
color: var(--accent-green);
}
.status-online {
color: var(--accent-green);
font-weight: bold;
}
.status-offline {
color: var(--accent-red);
font-weight: bold;
}
.device-parameters h4,
.device-stats h4 {
color: var(--accent-blue);
margin: 1rem 0 0.5rem 0;
font-size: 1.2rem;
}
.parameters-grid {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
margin-bottom: 1.5rem;
}
.parameter-tag {
background: linear-gradient(135deg, var(--accent-blue), var(--accent-green));
color: white;
padding: 0.3rem 0.8rem;
border-radius: 20px;
font-size: 0.85rem;
font-weight: 500;
white-space: nowrap;
}
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 1rem;
}
.stat-item {
background: rgba(255, 255, 255, 0.05);
padding: 0.8rem;
border-radius: 8px;
border: 1px solid var(--glass-border);
}
.stat-label {
display: block;
color: var(--text-secondary);
font-size: 0.9rem;
margin-bottom: 0.3rem;
}
.stat-value {
display: block;
color: var(--accent-green);
font-size: 1.1rem;
font-weight: bold;
}
/* 数据流样式优化 */
.stream-item {
display: grid;
grid-template-columns: 20px 1fr 120px 100px;
gap: 10px;
padding: 8px 12px;
margin: 4px 0;
background: rgba(255, 255, 255, 0.05);
border-radius: 6px;
border-left: 3px solid var(--accent-blue);
transition: all 0.3s ease;
align-items: center;
}
.stream-item:hover {
background: rgba(255, 255, 255, 0.1);
transform: translateX(5px);
}
.stream-time {
font-size: 0.8rem;
color: var(--text-secondary);
font-family: 'Courier New', monospace;
}
.stream-device {
font-weight: 500;
color: var(--text-primary);
display: flex;
align-items: center;
gap: 8px;
}
.stream-device::before {
content: '';
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--accent-green);
animation: pulse 2s infinite;
}
.stream-param {
font-size: 0.85rem;
color: var(--accent-blue);
background: rgba(0, 212, 255, 0.1);
padding: 2px 8px;
border-radius: 12px;
text-align: center;
}
.stream-value {
font-weight: bold;
text-align: right;
font-family: 'Courier New', monospace;
}
/* 设备类型图标样式 */
.device-type-icon {
width: 16px;
height: 16px;
margin-right: 6px;
opacity: 0.8;
}
/* 不同设备类型的颜色主题 */
.device-ctd { border-left-color: #00ff88; }
.device-adcp { border-left-color: #0088ff; }
.device-gravity { border-left-color: #ff6600; }
.device-magnetic { border-left-color: #ff0066; }
.device-wave { border-left-color: #00ffff; }
.device-depth { border-left-color: #8800ff; }
.device-radar { border-left-color: #ffff00; }
.device-multi { border-left-color: #00ff00; }
.device-buoy { border-left-color: #ff8800; }
.device-beidou { border-left-color: #ff4400; }
.device-wind { border-left-color: #4400ff; }
.device-weather { border-left-color: #88ff00; }
.device-sky { border-left-color: #ff0088; }
.device-turbulence { border-left-color: #0044ff; }
.device-lidar { border-left-color: #ff6600; }
.device-visibility { border-left-color: #66ff00; }
.device-cloud { border-left-color: #00aaff; }
.device-navigation { border-left-color: #aa00ff; }
/* 处理节点样式优化 */
.pipeline-node {
position: relative;
width: 120px;
height: 80px;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.05));
border: 2px solid rgba(0, 212, 255, 0.3);
border-radius: 12px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
cursor: pointer;
transition: all 0.3s ease;
backdrop-filter: blur(10px);
margin: 0 15px;
}
.pipeline-node:hover {
transform: translateY(-5px) scale(1.05);
border-color: var(--accent-blue);
box-shadow: 0 10px 30px rgba(0, 212, 255, 0.3);
}
.pipeline-node i {
font-size: 1.5rem;
color: var(--accent-blue);
margin-bottom: 8px;
}
.pipeline-node span {
font-size: 0.85rem;
color: var(--text-primary);
text-align: center;
font-weight: 500;
}
.pipeline-node.input-node {
border-color: rgba(16, 185, 129, 0.5);
}
.pipeline-node.input-node i {
color: var(--accent-green);
}
.pipeline-node.process-node {
border-color: rgba(245, 158, 11, 0.5);
}
.pipeline-node.process-node i {
color: #f59e0b;
}
.pipeline-node.compute-node {
border-color: rgba(139, 92, 246, 0.5);
}
.pipeline-node.compute-node i {
color: #8b5cf6;
}
.pipeline-node.output-node {
border-color: rgba(239, 68, 68, 0.5);
}
.pipeline-node.output-node i {
color: #ef4444;
}
.node-pulse {
position: absolute;
top: -2px;
left: -2px;
right: -2px;
bottom: -2px;
border: 2px solid transparent;
border-radius: 12px;
animation: node-pulse 3s infinite;
}
@keyframes node-pulse {
0%, 100% {
border-color: transparent;
transform: scale(1);
}
50% {
border-color: rgba(0, 212, 255, 0.5);
transform: scale(1.05);
}
}
.pipeline-connection {
position: absolute;
height: 2px;
background: linear-gradient(90deg,
transparent,
rgba(0, 212, 255, 0.5),
rgba(0, 212, 255, 0.8),
rgba(0, 212, 255, 0.5),
transparent
);
top: 50%;
transform: translateY(-50%);
animation: data-flow 2s infinite;
}
@keyframes data-flow {
0% {
background-position: -100% 0;
}
100% {
background-position: 100% 0;
}
}
/* 节点详情面板 */
.node-details {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
padding: 20px;
margin-top: 20px;
backdrop-filter: blur(10px);
}
.node-details h4 {
color: var(--accent-blue);
margin-bottom: 15px;
font-size: 1.2rem;
}
.node-details p {
margin-bottom: 10px;
line-height: 1.6;
}
.node-details ul {
margin: 10px 0;
padding-left: 20px;
}
.node-details li {
margin: 5px 0;
color: var(--text-secondary);
}
.node-details strong {
color: var(--accent-blue);
}
/* 资源监控环形进度条 */
.progress-ring {
width: 60px;
height: 60px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
position: relative;
background: conic-gradient(var(--accent-blue) 0deg, rgba(255, 255, 255, 0.1) 0deg);
}
.progress-ring::before {
content: '';
position: absolute;
width: 45px;
height: 45px;
border-radius: 50%;
background: var(--bg-primary);
}
.progress-value {
position: relative;
z-index: 1;
font-size: 0.8rem;
font-weight: bold;
color: var(--text-primary);
}
/* 处理统计卡片 */
.stat-card {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
padding: 15px;
text-align: center;
transition: all 0.3s ease;
}
.stat-card:hover {
background: rgba(255, 255, 255, 0.08);
transform: translateY(-2px);
}
.stat-card.error {
border-color: rgba(239, 68, 68, 0.5);
}
.stat-card.error .stat-number {
color: #ef4444;
}
.stat-number {
font-size: 1.8rem;
font-weight: bold;
color: var(--accent-blue);
display: block;
margin-bottom: 5px;
}
.stat-label {
font-size: 0.9rem;
color: var(--text-secondary);
}
/* 日志样式 */
.log-content {
max-height: 300px;
overflow-y: auto;
padding: 15px;
background: rgba(0, 0, 0, 0.3);
border-radius: 8px;
font-family: 'Courier New', monospace;
font-size: 0.85rem;
}
.log-entry {
margin: 5px 0;
padding: 5px 10px;
border-radius: 4px;
transition: all 0.3s ease;
}
.log-entry.info {
color: var(--text-primary);
border-left: 3px solid var(--accent-blue);
}
.log-entry.warning {
color: #f59e0b;
border-left: 3px solid #f59e0b;
background: rgba(245, 158, 11, 0.1);
}
.log-entry.error {
color: #ef4444;
border-left: 3px solid #ef4444;
background: rgba(239, 68, 68, 0.1);
}
/* 响应式设计 */
@media (max-width: 1200px) {
.reception-layout {
grid-template-columns: 250px 1fr 250px;
}
.processing-layout {
grid-template-columns: 200px 1fr 200px;
}
.visualization-layout {
grid-template-columns: 1fr 300px;
}
}
@media (max-width: 768px) {
.sidebar {
width: 200px;
}
.reception-layout,
.processing-layout {
grid-template-columns: 1fr;
grid-template-rows: auto auto auto;
}
.visualization-layout {
grid-template-columns: 1fr;
grid-template-rows: 1fr auto;
}
.pipeline-flow {
flex-direction: column;
gap: 2rem;
}
.pipeline-connection {
display: none;
}
}
/* 滚动条样式 */
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.1);
border-radius: 4px;
}
::-webkit-scrollbar-thumb {
background: var(--accent-blue);
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--accent-green);
}
/* 设备详情弹窗样式 */
.device-modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.8);
display: flex;
justify-content: center;
align-items: center;
z-index: 1000;
backdrop-filter: blur(10px);
}
.device-modal-content {
background: var(--glass-bg);
border: 1px solid var(--glass-border);
border-radius: 15px;
padding: 2rem;
max-width: 600px;
width: 90%;
max-height: 80vh;
overflow-y: auto;
backdrop-filter: blur(20px);
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
}
.device-modal-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1.5rem;
padding-bottom: 1rem;
border-bottom: 1px solid var(--glass-border);
}
.device-modal-header h3 {
color: var(--accent-blue);
margin: 0;
font-size: 1.5rem;
}
.device-modal-close {
font-size: 2rem;
color: var(--text-secondary);
cursor: pointer;
transition: color 0.3s ease;
}
.device-modal-close:hover {
color: var(--accent-red);
}
.device-info {
margin-bottom: 1.5rem;
}
.device-info p {
margin: 0.5rem 0;
color: var(--text-primary);
}
.device-info strong {
color: var(--accent-green);
}
.status-online {
color: var(--accent-green);
font-weight: bold;
}
.status-offline {
color: var(--accent-red);
font-weight: bold;
}
.device-parameters h4,
.device-stats h4 {
color: var(--accent-blue);
margin: 1rem 0 0.5rem 0;
font-size: 1.2rem;
}
.parameters-grid {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
margin-bottom: 1.5rem;
}
.parameter-tag {
background: linear-gradient(135deg, var(--accent-blue), var(--accent-green));
color: white;
padding: 0.3rem 0.8rem;
border-radius: 20px;
font-size: 0.85rem;
font-weight: 500;
white-space: nowrap;
}
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 1rem;
}
.stat-item {
background: rgba(255, 255, 255, 0.05);
padding: 0.8rem;
border-radius: 8px;
border: 1px solid var(--glass-border);
}
.stat-label {
display: block;
color: var(--text-secondary);
font-size: 0.9rem;
margin-bottom: 0.3rem;
}
.stat-value {
display: block;
color: var(--accent-green);
font-size: 1.1rem;
font-weight: bold;
}
/* 数据流样式优化 */
.stream-item {
display: grid;
grid-template-columns: 20px 1fr 120px 100px;
gap: 10px;
padding: 8px 12px;
margin: 4px 0;
background: rgba(255, 255, 255, 0.05);
border-radius: 6px;
border-left: 3px solid var(--accent-blue);
transition: all 0.3s ease;
align-items: center;
}
.stream-item:hover {
background: rgba(255, 255, 255, 0.1);
transform: translateX(5px);
}
.stream-time {
font-size: 0.8rem;
color: var(--text-secondary);
font-family: 'Courier New', monospace;
}
.stream-device {
font-weight: 500;
color: var(--text-primary);
display: flex;
align-items: center;
gap: 8px;
}
.stream-device::before {
content: '';
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--accent-green);
animation: pulse 2s infinite;
}
.stream-param {
font-size: 0.85rem;
color: var(--accent-blue);
background: rgba(0, 212, 255, 0.1);
padding: 2px 8px;
border-radius: 12px;
text-align: center;
}
.stream-value {
font-weight: bold;
text-align: right;
font-family: 'Courier New', monospace;
}
/* 设备类型图标样式 */
.device-type-icon {
width: 16px;
height: 16px;
margin-right: 6px;
opacity: 0.8;
}
/* 不同设备类型的颜色主题 */
.device-ctd { border-left-color: #00ff88; }
.device-adcp { border-left-color: #0088ff; }
.device-gravity { border-left-color: #ff6600; }
.device-magnetic { border-left-color: #ff0066; }
.device-wave { border-left-color: #00ffff; }
.device-depth { border-left-color: #8800ff; }
.device-radar { border-left-color: #ffff00; }
.device-multi { border-left-color: #00ff00; }
.device-buoy { border-left-color: #ff8800; }
.device-beidou { border-left-color: #ff4400; }
.device-wind { border-left-color: #4400ff; }
.device-weather { border-left-color: #88ff00; }
.device-sky { border-left-color: #ff0088; }
.device-turbulence { border-left-color: #0044ff; }
.device-lidar { border-left-color: #ff6600; }
.device-visibility { border-left-color: #66ff00; }
.device-cloud { border-left-color: #00aaff; }
.device-navigation { border-left-color: #aa00ff; }
/* 处理节点样式优化 */
.pipeline-node {
position: relative;
width: 120px;
height: 80px;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.05));
border: 2px solid rgba(0, 212, 255, 0.3);
border-radius: 12px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
cursor: pointer;
transition: all 0.3s ease;
backdrop-filter: blur(10px);
margin: 0 15px;
}
.pipeline-node:hover {
transform: translateY(-5px) scale(1.05);
border-color: var(--accent-blue);
box-shadow: 0 10px 30px rgba(0, 212, 255, 0.3);
}
.pipeline-node i {
font-size: 1.5rem;
color: var(--accent-blue);
margin-bottom: 8px;
}
.pipeline-node span {
font-size: 0.85rem;
color: var(--text-primary);
text-align: center;
font-weight: 500;
}
.pipeline-node.input-node {
border-color: rgba(16, 185, 129, 0.5);
}
.pipeline-node.input-node i {
color: var(--accent-green);
}
.pipeline-node.process-node {
border-color: rgba(245, 158, 11, 0.5);
}
.pipeline-node.process-node i {
color: #f59e0b;
}
.pipeline-node.compute-node {
border-color: rgba(139, 92, 246, 0.5);
}
.pipeline-node.compute-node i {
color: #8b5cf6;
}
.pipeline-node.output-node {
border-color: rgba(239, 68, 68, 0.5);
}
.pipeline-node.output-node i {
color: #ef4444;
}
.node-pulse {
position: absolute;
top: -2px;
left: -2px;
right: -2px;
bottom: -2px;
border: 2px solid transparent;
border-radius: 12px;
animation: node-pulse 3s infinite;
}
@keyframes node-pulse {
0%, 100% {
border-color: transparent;
transform: scale(1);
}
50% {
border-color: rgba(0, 212, 255, 0.5);
transform: scale(1.05);
}
}
.pipeline-connection {
position: absolute;
height: 2px;
background: linear-gradient(90deg,
transparent,
rgba(0, 212, 255, 0.5),
rgba(0, 212, 255, 0.8),
rgba(0, 212, 255, 0.5),
transparent
);
top: 50%;
transform: translateY(-50%);
animation: data-flow 2s infinite;
}
@keyframes data-flow {
0% {
background-position: -100% 0;
}
100% {
background-position: 100% 0;
}
}
/* 节点详情面板 */
.node-details {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
padding: 20px;
margin-top: 20px;
backdrop-filter: blur(10px);
}
.node-details h4 {
color: var(--accent-blue);
margin-bottom: 15px;
font-size: 1.2rem;
}
.node-details p {
margin-bottom: 10px;
line-height: 1.6;
}
.node-details ul {
margin: 10px 0;
padding-left: 20px;
}
.node-details li {
margin: 5px 0;
color: var(--text-secondary);
}
.node-details strong {
color: var(--accent-blue);
}
/* 资源监控环形进度条 */
.progress-ring {
width: 60px;
height: 60px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
position: relative;
background: conic-gradient(var(--accent-blue) 0deg, rgba(255, 255, 255, 0.1) 0deg);
}
.progress-ring::before {
content: '';
position: absolute;
width: 45px;
height: 45px;
border-radius: 50%;
background: var(--bg-primary);
}
.progress-value {
position: relative;
z-index: 1;
font-size: 0.8rem;
font-weight: bold;
color: var(--text-primary);
}
/* 处理统计卡片 */
.stat-card {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
padding: 15px;
text-align: center;
transition: all 0.3s ease;
}
.stat-card:hover {
background: rgba(255, 255, 255, 0.08);
transform: translateY(-2px);
}
.stat-card.error {
border-color: rgba(239, 68, 68, 0.5);
}
.stat-card.error .stat-number {
color: #ef4444;
}
.stat-number {
font-size: 1.8rem;
font-weight: bold;
color: var(--accent-blue);
display: block;
margin-bottom: 5px;
}
.stat-label {
font-size: 0.9rem;
color: var(--text-secondary);
}
/* 日志样式 */
.log-content {
max-height: 300px;
overflow-y: auto;
padding: 15px;
background: rgba(0, 0, 0, 0.3);
border-radius: 8px;
font-family: 'Courier New', monospace;
font-size: 0.85rem;
}
.log-entry {
margin: 5px 0;
padding: 5px 10px;
border-radius: 4px;
transition: all 0.3s ease;
}
.log-entry.info {
color: var(--text-primary);
border-left: 3px solid var(--accent-blue);
}
.log-entry.warning {
color: #f59e0b;
border-left: 3px solid #f59e0b;
background: rgba(245, 158, 11, 0.1);
}
.log-entry.error {
color: #ef4444;
border-left: 3px solid #ef4444;
background: rgba(239, 68, 68, 0.1);
}