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
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);
|
|
} |