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.

4446 lines
88 KiB
CSS

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/* 全局样式 */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', 'Microsoft YaHei', Tahoma, Geneva, Verdana, sans-serif;
line-height: 1.4;
color: #ffffff;
background: linear-gradient(135deg, #0a0e1a 0%, #1a1f2e 50%, #0a0e1a 100%);
background-attachment: fixed;
min-height: 100vh;
overflow: hidden;
}
/* 大屏头部样式 */
.dashboard-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px 40px;
background: linear-gradient(135deg, #1a1f2e 0%, #2a3441 50%, #1a1f2e 100%);
border-bottom: 2px solid #00d4ff;
box-shadow: 0 4px 20px rgba(0,0,0,0.3);
position: relative;
z-index: 100;
}
.dashboard-header::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(0,212,255,0.1), transparent);
animation: shimmer 4s infinite;
}
@keyframes shimmer {
0% { left: -100%; }
100% { left: 100%; }
}
.header-left {
display: flex;
align-items: center;
gap: 20px;
}
.logo {
display: flex;
align-items: center;
justify-content: center;
width: 60px;
height: 60px;
background: linear-gradient(135deg, #00d4ff, #0099cc);
border-radius: 50%;
box-shadow: 0 0 20px rgba(0,212,255,0.5);
}
.logo i {
font-size: 2rem;
color: #ffffff;
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.1); }
}
.main-title {
font-size: 2.5rem;
font-weight: 700;
color: #ffffff;
text-shadow: 0 2px 10px rgba(0,212,255,0.3);
background: linear-gradient(45deg, #00d4ff, #ffffff, #00d4ff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
animation: titleGlow 3s ease-in-out infinite;
}
@keyframes titleGlow {
0%, 100% { text-shadow: 0 2px 10px rgba(0,212,255,0.3); }
50% { text-shadow: 0 2px 20px rgba(0,212,255,0.6); }
}
.header-right {
display: flex;
align-items: center;
gap: 30px;
}
.weather-info {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 20px;
background: rgba(0,212,255,0.1);
border: 1px solid rgba(0,212,255,0.3);
border-radius: 25px;
backdrop-filter: blur(10px);
}
.weather-info i {
font-size: 1.2rem;
color: #00d4ff;
}
.weather-text {
font-size: 1rem;
color: #ffffff;
font-weight: 500;
}
.datetime-info {
text-align: right;
}
.date {
font-size: 1.1rem;
color: #ffffff;
font-weight: 600;
margin-bottom: 5px;
}
.time {
font-size: 1.5rem;
color: #00d4ff;
font-weight: 700;
font-family: 'Courier New', monospace;
text-shadow: 0 0 10px rgba(0,212,255,0.5);
}
/* 大屏主体布局 */
.dashboard-main {
display: flex;
height: calc(100vh - 100px);
gap: 20px;
padding: 20px;
background: transparent;
}
/* 侧边栏通用样式 */
.left-sidebar,
.right-sidebar {
width: 350px;
display: flex;
flex-direction: column;
gap: 20px;
overflow-y: auto;
scrollbar-width: thin;
scrollbar-color: rgba(0,212,255,0.3) transparent;
}
.left-sidebar::-webkit-scrollbar,
.right-sidebar::-webkit-scrollbar {
width: 6px;
}
.left-sidebar::-webkit-scrollbar-track,
.right-sidebar::-webkit-scrollbar-track {
background: transparent;
}
.left-sidebar::-webkit-scrollbar-thumb,
.right-sidebar::-webkit-scrollbar-thumb {
background: rgba(0,212,255,0.3);
border-radius: 3px;
}
/* 数据面板样式 */
.data-panel {
background: linear-gradient(135deg, rgba(26,31,46,0.9) 0%, rgba(42,52,65,0.9) 100%);
border: 1px solid rgba(0,212,255,0.2);
border-radius: 15px;
padding: 20px;
backdrop-filter: blur(10px);
box-shadow: 0 8px 32px rgba(0,0,0,0.3);
position: relative;
overflow: hidden;
}
.data-panel::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 2px;
background: linear-gradient(90deg, transparent, #00d4ff, transparent);
animation: borderScan 3s linear infinite;
}
@keyframes borderScan {
0% { transform: translateX(-100%); }
100% { transform: translateX(100%); }
}
.data-panel h3 {
font-size: 1.2rem;
color: #ffffff;
margin-bottom: 15px;
display: flex;
align-items: center;
gap: 10px;
font-weight: 600;
}
.data-panel h3 i {
color: #00d4ff;
font-size: 1.1rem;
}
/* 状态网格 */
.status-grid {
display: grid;
grid-template-columns: 1fr;
gap: 15px;
}
.status-card {
display: flex;
align-items: center;
gap: 15px;
padding: 15px;
background: rgba(0,0,0,0.3);
border-radius: 10px;
border-left: 4px solid;
transition: all 0.3s ease;
animation: statusPulse 2s ease-in-out infinite;
}
@keyframes statusPulse {
0%, 100% { box-shadow: 0 0 10px rgba(0,0,0,0.3); }
50% { box-shadow: 0 0 20px rgba(0,212,255,0.2); }
}
.status-card.online {
border-left-color: #00ff88;
}
.status-card.warning {
border-left-color: #ffaa00;
}
.status-card.processing {
border-left-color: #00d4ff;
}
.status-card:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(0,212,255,0.2);
}
.status-icon {
width: 50px;
height: 50px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.5rem;
}
.status-card.online .status-icon {
background: linear-gradient(135deg, #00ff88, #00cc66);
color: #ffffff;
}
.status-card.warning .status-icon {
background: linear-gradient(135deg, #ffaa00, #ff8800);
color: #ffffff;
}
.status-card.processing .status-icon {
background: linear-gradient(135deg, #00d4ff, #0099cc);
color: #ffffff;
}
.status-info {
flex: 1;
}
.status-number {
display: block;
font-size: 1.8rem;
font-weight: 700;
color: #ffffff;
margin-bottom: 5px;
}
.status-label {
display: block;
font-size: 0.9rem;
color: #b0c4de;
font-weight: 500;
}
/* 水质监测样式 */
.water-quality {
display: flex;
flex-direction: column;
gap: 12px;
}
.quality-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 15px;
background: rgba(0,0,0,0.2);
border-radius: 8px;
border-left: 3px solid;
transition: all 0.3s ease;
}
.quality-item.excellent {
border-left-color: #00ff88;
}
.quality-item.good {
border-left-color: #00d4ff;
}
.quality-item.warning {
border-left-color: #ffaa00;
}
.quality-item:hover {
background: rgba(0,212,255,0.1);
transform: translateX(5px);
}
.quality-label {
font-size: 0.9rem;
color: #b0c4de;
font-weight: 500;
}
.quality-value {
font-size: 1rem;
color: #ffffff;
font-weight: 600;
margin: 0 10px;
}
.quality-status {
font-size: 0.8rem;
padding: 4px 8px;
border-radius: 12px;
font-weight: 500;
}
.quality-item.excellent .quality-status {
background: rgba(0,255,136,0.2);
color: #00ff88;
}
.quality-item.good .quality-status {
background: rgba(0,212,255,0.2);
color: #00d4ff;
}
.quality-item.warning .quality-status {
background: rgba(255,170,0,0.2);
color: #ffaa00;
}
/* 效率统计样式 */
.efficiency-chart {
margin-bottom: 15px;
text-align: center;
}
.efficiency-stats {
display: flex;
flex-direction: column;
gap: 10px;
}
.stat-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 0;
border-bottom: 1px solid rgba(0,212,255,0.1);
}
.stat-row:last-child {
border-bottom: none;
}
.stat-label {
font-size: 0.9rem;
color: #b0c4de;
font-weight: 500;
}
.stat-value {
font-size: 1.1rem;
color: #00d4ff;
font-weight: 600;
}
/* 地图区域样式 */
.map-section {
flex: 1;
display: flex;
flex-direction: column;
}
.map-container {
flex: 1;
position: relative;
background: linear-gradient(135deg, rgba(26,31,46,0.9) 0%, rgba(42,52,65,0.9) 100%);
border: 1px solid rgba(0,212,255,0.2);
border-radius: 15px;
overflow: hidden;
backdrop-filter: blur(10px);
box-shadow: 0 8px 32px rgba(0,0,0,0.3);
}
.map-view {
width: 100%;
height: 100%;
border-radius: 15px;
}
/* 地图图例 */
.map-legend {
position: absolute;
top: 20px;
left: 20px;
background: rgba(26,31,46,0.95);
border: 1px solid rgba(0,212,255,0.3);
border-radius: 10px;
padding: 15px;
backdrop-filter: blur(10px);
min-width: 180px;
}
.map-legend h4 {
font-size: 1rem;
color: #ffffff;
margin-bottom: 10px;
font-weight: 600;
}
.legend-items {
display: flex;
flex-direction: column;
gap: 8px;
}
.legend-item {
display: flex;
align-items: center;
gap: 10px;
}
.legend-color {
width: 12px;
height: 12px;
border-radius: 50%;
animation: legendPulse 2s ease-in-out infinite;
}
@keyframes legendPulse {
0%, 100% { transform: scale(1); opacity: 1; }
50% { transform: scale(1.2); opacity: 0.8; }
}
.legend-color.clean {
background: #00ff88;
}
.legend-color.warning {
background: #ffaa00;
}
.legend-color.danger {
background: #ff4444;
}
.legend-color.device {
background: #00d4ff;
}
.legend-text {
font-size: 0.9rem;
color: #b0c4de;
font-weight: 500;
}
/* 地图控制按钮 */
.map-controls {
position: absolute;
top: 20px;
right: 20px;
display: flex;
flex-direction: column;
gap: 10px;
}
.control-btn {
width: 40px;
height: 40px;
background: rgba(26,31,46,0.95);
border: 1px solid rgba(0,212,255,0.3);
border-radius: 8px;
color: #00d4ff;
font-size: 1rem;
cursor: pointer;
transition: all 0.3s ease;
backdrop-filter: blur(10px);
display: flex;
align-items: center;
justify-content: center;
}
.control-btn:hover {
background: rgba(0,212,255,0.2);
transform: scale(1.1);
box-shadow: 0 0 15px rgba(0,212,255,0.3);
}
/* 视频监控样式 */
.video-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
}
.video-item {
aspect-ratio: 16/9;
border-radius: 8px;
overflow: hidden;
}
.video-placeholder {
width: 100%;
height: 100%;
background: linear-gradient(135deg, rgba(0,0,0,0.6) 0%, rgba(26,31,46,0.8) 100%);
border: 1px solid rgba(0,212,255,0.2);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 8px;
color: #b0c4de;
font-size: 0.8rem;
position: relative;
overflow: hidden;
transition: all 0.3s ease;
}
.video-placeholder::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(0,212,255,0.1), transparent);
animation: videoScan 3s linear infinite;
}
@keyframes videoScan {
0% { left: -100%; }
100% { left: 100%; }
}
.video-placeholder i {
font-size: 1.5rem;
color: #00d4ff;
animation: videoIconPulse 2s ease-in-out infinite;
}
@keyframes videoIconPulse {
0%, 100% { opacity: 0.7; transform: scale(1); }
50% { opacity: 1; transform: scale(1.1); }
}
.video-placeholder:hover {
border-color: rgba(0,212,255,0.5);
background: linear-gradient(135deg, rgba(0,212,255,0.1) 0%, rgba(26,31,46,0.9) 100%);
}
/* 告警信息样式 */
.alert-list {
display: flex;
flex-direction: column;
gap: 12px;
max-height: 300px;
overflow-y: auto;
}
.alert-item {
display: flex;
gap: 12px;
padding: 12px;
background: rgba(0,0,0,0.2);
border-radius: 8px;
border-left: 3px solid;
transition: all 0.3s ease;
}
.alert-item.high {
border-left-color: #ff4444;
}
.alert-item.medium {
border-left-color: #ffaa00;
}
.alert-item.low {
border-left-color: #00d4ff;
}
.alert-item:hover {
background: rgba(0,212,255,0.05);
transform: translateX(5px);
}
.alert-icon {
width: 30px;
height: 30px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 0.9rem;
flex-shrink: 0;
}
.alert-item.high .alert-icon {
background: rgba(255,68,68,0.2);
color: #ff4444;
}
.alert-item.medium .alert-icon {
background: rgba(255,170,0,0.2);
color: #ffaa00;
}
.alert-item.low .alert-icon {
background: rgba(0,212,255,0.2);
color: #00d4ff;
}
.alert-content {
flex: 1;
display: flex;
flex-direction: column;
gap: 4px;
}
.alert-title {
font-size: 0.9rem;
color: #ffffff;
font-weight: 600;
}
.alert-desc {
font-size: 0.8rem;
color: #b0c4de;
line-height: 1.3;
}
.alert-time {
font-size: 0.7rem;
color: #888;
font-style: italic;
}
/* 环境数据样式 */
.env-data {
display: flex;
flex-direction: column;
gap: 12px;
}
.env-item {
display: flex;
align-items: center;
gap: 12px;
padding: 12px;
background: rgba(0,0,0,0.2);
border-radius: 8px;
transition: all 0.3s ease;
}
.env-item:hover {
background: rgba(0,212,255,0.1);
transform: translateX(5px);
}
.env-icon {
width: 35px;
height: 35px;
border-radius: 50%;
background: linear-gradient(135deg, #00d4ff, #0099cc);
display: flex;
align-items: center;
justify-content: center;
color: #ffffff;
font-size: 1rem;
}
.env-info {
flex: 1;
display: flex;
justify-content: space-between;
align-items: center;
}
.env-label {
font-size: 0.9rem;
color: #b0c4de;
font-weight: 500;
}
.env-value {
font-size: 1.1rem;
color: #ffffff;
font-weight: 600;
}
/* 数据趋势样式 */
.trend-chart {
margin-bottom: 15px;
text-align: center;
background: rgba(0,0,0,0.2);
border-radius: 8px;
padding: 10px;
}
.trend-legend {
display: flex;
justify-content: space-around;
gap: 10px;
}
.legend-item {
display: flex;
align-items: center;
gap: 6px;
font-size: 0.8rem;
color: #b0c4de;
}
.legend-dot {
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
}
.legend-dot.red {
background: #ff4444;
}
.legend-dot.blue {
background: #00d4ff;
}
.legend-dot.green {
background: #00ff88;
}
/* 响应式设计 */
@media (max-width: 1600px) {
.left-sidebar,
.right-sidebar {
width: 300px;
}
.main-title {
font-size: 2rem;
}
}
@media (max-width: 1200px) {
.dashboard-main {
flex-direction: column;
height: auto;
}
.left-sidebar,
.right-sidebar {
width: 100%;
flex-direction: row;
overflow-x: auto;
overflow-y: hidden;
}
.data-panel {
min-width: 300px;
flex-shrink: 0;
}
.map-section {
height: 60vh;
order: -1;
}
}
.nav-menu {
display: flex;
gap: 20px;
}
.nav-btn {
padding: 8px 16px;
border: 1px solid transparent;
background: rgba(255,255,255,0.05);
color: #ffffff;
border-radius: 6px;
cursor: pointer;
transition: all 0.3s ease;
font-size: 0.9rem;
display: flex;
align-items: center;
gap: 0.5rem;
position: relative;
backdrop-filter: blur(10px);
font-weight: 500;
}
.nav-btn::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(45deg, #00d4ff, #0099cc);
border-radius: 6px;
opacity: 0;
transition: opacity 0.3s ease;
z-index: -1;
}
.nav-btn:hover::before,
.nav-btn.active::before {
opacity: 1;
}
.nav-btn:hover,
.nav-btn.active {
color: #ffffff;
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0,212,255,0.3);
}
.user-info {
display: flex;
align-items: center;
gap: 1rem;
}
.time {
font-size: 0.9rem;
color: #ffffff;
padding: 0.5rem 1rem;
background: rgba(74, 144, 226, 0.3);
border-radius: 20px;
text-shadow: 0 1px 2px rgba(0,0,0,0.5);
}
.user-avatar {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 1rem;
background: linear-gradient(135deg, #667eea, #764ba2);
color: white;
border-radius: 20px;
cursor: pointer;
}
/* 主要内容区域 */
.main-content {
/* margin-top: 70px; */
padding: 1rem 0;
background: rgba(15, 20, 25, 0.8);
backdrop-filter: blur(10px);
min-height: calc(100vh - 70px);
}
/* 大屏模式下的主内容区域 */
body.fullscreen-mode .main-content {
margin-top: 0;
padding: 0;
background: transparent;
backdrop-filter: none;
min-height: 100vh;
}
.tab-content {
display: none;
animation: fadeIn 0.4s ease-in-out;
background: rgba(26, 35, 50, 0.6);
border-radius: 12px;
margin: 10px;
padding: 20px;
border: 1px solid rgba(0, 212, 255, 0.2);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
}
/* 大屏模式下的tab内容 */
body.fullscreen-mode .tab-content {
background: transparent;
border-radius: 0;
margin: 0;
padding: 0;
border: none;
box-shadow: none;
}
.tab-content.active {
display: block;
}
/* 监控管理一张图 - 大屏风格 */
.monitor-layout {
display: grid;
grid-template-columns: 1fr 450px;
gap: 1rem;
height: 100vh;
padding: 0;
margin: 0;
background: linear-gradient(135deg, #0a0e1a 0%, #1a2332 50%, #0a0e1a 100%);
}
.map-container {
background: linear-gradient(135deg, rgba(10, 14, 26, 0.95) 0%, rgba(26, 35, 50, 0.9) 100%);
border-radius: 0;
box-shadow: inset 0 0 50px rgba(0, 212, 255, 0.1);
overflow: hidden;
position: relative;
border: 2px solid rgba(0, 212, 255, 0.5);
backdrop-filter: blur(20px);
margin: 0;
}
.map-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1.5rem 2rem;
background: linear-gradient(135deg, #0a0e1a, #1e3c72, #2a5298);
color: white;
border-bottom: 3px solid rgba(0, 212, 255, 0.8);
box-shadow: 0 4px 20px rgba(0, 212, 255, 0.3);
}
.map-header h3 {
display: flex;
align-items: center;
gap: 1rem;
margin: 0;
font-size: 1.8rem;
font-weight: 700;
text-shadow: 0 2px 10px rgba(0, 212, 255, 0.5);
background: linear-gradient(45deg, #00d4ff, #ffffff, #00d4ff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
animation: titleGlow 3s ease-in-out infinite alternate;
}
@keyframes titleGlow {
0% { text-shadow: 0 2px 10px rgba(0, 212, 255, 0.5); }
100% { text-shadow: 0 2px 20px rgba(0, 212, 255, 0.8), 0 0 30px rgba(0, 212, 255, 0.4); }
}
.map-controls {
display: flex;
gap: 0.5rem;
}
.control-btn {
padding: 0.8rem 1.5rem;
border: 2px solid rgba(0, 212, 255, 0.6);
background: linear-gradient(135deg, rgba(0, 212, 255, 0.2), rgba(0, 212, 255, 0.1));
color: #00d4ff;
border-radius: 8px;
cursor: pointer;
transition: all 0.3s ease;
font-size: 1rem;
font-weight: 600;
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
box-shadow: 0 4px 15px rgba(0, 212, 255, 0.3);
}
.control-btn:hover {
background: linear-gradient(135deg, rgba(0, 212, 255, 0.4), rgba(0, 212, 255, 0.2));
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(0, 212, 255, 0.5);
}
.map {
height: calc(100% - 140px);
background: #0a0e1a;
position: relative;
overflow: hidden;
background-image: url('images/river-bg.svg');
background-size: cover;
background-position: center;
background-repeat: no-repeat;
border-radius: 0;
border: 3px solid rgba(0, 212, 255, 0.8);
box-shadow: inset 0 0 100px rgba(0, 212, 255, 0.1), 0 0 50px rgba(0, 212, 255, 0.3);
}
.map::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(45deg, rgba(0, 212, 255, 0.15) 0%, transparent 30%, rgba(0, 212, 255, 0.15) 70%, transparent 100%);
pointer-events: none;
animation: mapScan 4s linear infinite;
}
@keyframes mapScan {
0% { background-position: -100% 0; }
100% { background-position: 100% 0; }
}
.map-legend {
position: absolute;
bottom: 1.5rem;
left: 1.5rem;
background: rgba(10, 14, 26, 0.98);
padding: 1.5rem;
border-radius: 12px;
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.6);
backdrop-filter: blur(25px);
border: 2px solid rgba(0, 212, 255, 0.6);
color: #ffffff;
font-size: 1rem;
}
.legend-item {
display: flex;
align-items: center;
gap: 0.8rem;
margin-bottom: 0.8rem;
font-size: 1rem;
font-weight: 500;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
}
.legend-color {
width: 16px;
height: 16px;
border-radius: 50%;
box-shadow: 0 0 10px currentColor;
animation: legendPulse 2s ease-in-out infinite;
}
@keyframes legendPulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.1); }
}
.legend-color.red { background: #e74c3c; }
.legend-color.blue { background: #3498db; }
.legend-color.green { background: #2ecc71; }
.legend-color.orange { background: #f39c12; }
.legend-color.purple { background: #9b59b6; }
/* 信息面板 - 大屏风格 */
.info-panel {
display: flex;
flex-direction: column;
gap: 1rem;
overflow-y: auto;
padding: 0;
margin: 0;
}
.panel-section {
background: linear-gradient(135deg, rgba(10, 14, 26, 0.95) 0%, rgba(26, 35, 50, 0.9) 100%);
border-radius: 0;
padding: 1.5rem;
box-shadow: inset 0 0 30px rgba(0, 212, 255, 0.1), 0 4px 20px rgba(0, 0, 0, 0.6);
border: 2px solid rgba(0, 212, 255, 0.5);
backdrop-filter: blur(20px);
margin: 0;
}
.panel-section h4 {
display: flex;
align-items: center;
gap: 0.8rem;
margin-bottom: 1.2rem;
color: #ffffff;
font-size: 1.3rem;
font-weight: 700;
text-shadow: 0 2px 8px rgba(0, 212, 255, 0.5);
background: linear-gradient(45deg, #00d4ff, #ffffff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.panel-section h4 i {
font-size: 1.5rem;
color: #00d4ff;
filter: drop-shadow(0 0 8px rgba(0, 212, 255, 0.8));
animation: iconGlow 2s ease-in-out infinite alternate;
}
@keyframes iconGlow {
0% { filter: drop-shadow(0 0 8px rgba(0, 212, 255, 0.8)); }
100% { filter: drop-shadow(0 0 15px rgba(0, 212, 255, 1)); }
}
.status-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1.2rem;
}
.status-card {
display: flex;
align-items: center;
gap: 1rem;
padding: 1.2rem;
background: linear-gradient(135deg, rgba(10, 14, 26, 0.9) 0%, rgba(26, 35, 50, 0.8) 100%);
border-radius: 12px;
transition: all 0.3s ease;
border: 2px solid rgba(0, 212, 255, 0.4);
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
}
.status-card:hover {
transform: translateY(-3px) scale(1.02);
border-color: rgba(0, 212, 255, 0.8);
box-shadow: 0 8px 30px rgba(0, 212, 255, 0.3);
}
.status-icon {
width: 50px;
height: 50px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 1.3rem;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.5);
animation: statusIconPulse 3s ease-in-out infinite;
}
@keyframes statusIconPulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.05); }
}
.status-icon.red { background: linear-gradient(135deg, #e74c3c, #c0392b); }
.status-icon.blue { background: linear-gradient(135deg, #3498db, #2980b9); }
.status-icon.green { background: linear-gradient(135deg, #2ecc71, #27ae60); }
.status-icon.purple { background: linear-gradient(135deg, #9b59b6, #8e44ad); }
.status-info {
display: flex;
flex-direction: column;
}
.status-number {
font-size: 1.8rem;
font-weight: 700;
color: #ffffff;
text-shadow: 0 2px 8px rgba(0, 212, 255, 0.5);
background: linear-gradient(45deg, #00d4ff, #ffffff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.status-label {
font-size: 0.9rem;
color: #b0c4de;
font-weight: 500;
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
}
/* 视频监控 - 大屏风格 */
.video-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1.2rem;
}
.video-item {
aspect-ratio: 16/9;
border-radius: 12px;
overflow: hidden;
position: relative;
border: 2px solid rgba(0, 212, 255, 0.4);
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
transition: all 0.3s ease;
}
.video-item:hover {
border-color: rgba(0, 212, 255, 0.8);
box-shadow: 0 8px 30px rgba(0, 212, 255, 0.3);
transform: scale(1.02);
}
.video-placeholder {
width: 100%;
height: 100%;
background: linear-gradient(135deg, #0a0e1a, #1a2332, #0a0e1a);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: #ffffff;
gap: 0.8rem;
position: relative;
}
.video-placeholder::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(45deg, rgba(0, 212, 255, 0.1) 0%, transparent 50%, rgba(0, 212, 255, 0.1) 100%);
animation: videoScan 3s linear infinite;
}
@keyframes videoScan {
0% { background-position: -100% 0; }
100% { background-position: 100% 0; }
}
.video-placeholder i {
font-size: 2.5rem;
color: #00d4ff;
filter: drop-shadow(0 0 10px rgba(0, 212, 255, 0.8));
animation: videoIconPulse 2s ease-in-out infinite;
z-index: 1;
}
@keyframes videoIconPulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.1); }
}
.video-placeholder span {
font-size: 1rem;
font-weight: 600;
text-shadow: 0 2px 8px rgba(0, 212, 255, 0.5);
z-index: 1;
}
/* 重点区域 - 大屏风格 */
.area-list {
display: flex;
flex-direction: column;
gap: 1rem;
}
.area-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1.2rem;
border-radius: 12px;
border-left: 6px solid;
transition: all 0.3s ease;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
}
.area-item:hover {
transform: translateX(5px);
box-shadow: 0 6px 25px rgba(0, 0, 0, 0.4);
}
.area-item.high {
background: linear-gradient(135deg, rgba(231, 76, 60, 0.2), rgba(231, 76, 60, 0.1));
border-left-color: #e74c3c;
box-shadow: 0 4px 15px rgba(231, 76, 60, 0.3);
}
.area-item.medium {
background: linear-gradient(135deg, rgba(243, 156, 18, 0.2), rgba(243, 156, 18, 0.1));
border-left-color: #f39c12;
box-shadow: 0 4px 15px rgba(243, 156, 18, 0.3);
}
.area-item.low {
background: linear-gradient(135deg, rgba(46, 204, 113, 0.2), rgba(46, 204, 113, 0.1));
border-left-color: #2ecc71;
box-shadow: 0 4px 15px rgba(46, 204, 113, 0.3);
}
.area-name {
font-weight: 600;
font-size: 1.1rem;
color: #ffffff;
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
}
.area-status {
font-size: 0.9rem;
font-weight: 600;
padding: 0.5rem 1rem;
border-radius: 20px;
color: white;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
}
.area-item.high .area-status {
background: linear-gradient(135deg, #e74c3c, #c0392b);
box-shadow: 0 2px 10px rgba(231, 76, 60, 0.4);
}
.area-item.medium .area-status {
background: linear-gradient(135deg, #f39c12, #e67e22);
box-shadow: 0 2px 10px rgba(243, 156, 18, 0.4);
}
.area-item.low .area-status {
background: linear-gradient(135deg, #2ecc71, #27ae60);
box-shadow: 0 2px 10px rgba(46, 204, 113, 0.4);
}
/* 数据统计图表 - 大屏风格 */
.chart-container {
margin-bottom: 1.2rem;
background: linear-gradient(135deg, rgba(10, 14, 26, 0.8), rgba(26, 35, 50, 0.6));
border-radius: 12px;
padding: 1.5rem;
border: 2px solid rgba(0, 212, 255, 0.4);
box-shadow: inset 0 0 20px rgba(0, 212, 255, 0.1), 0 4px 20px rgba(0, 0, 0, 0.4);
backdrop-filter: blur(15px);
}
.chart-stats {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1rem;
}
.stat-item {
text-align: center;
padding: 0.8rem;
background: rgba(26, 35, 50, 0.8);
border-radius: 6px;
border: 1px solid rgba(0, 212, 255, 0.2);
}
.stat-label {
display: block;
font-size: 0.75rem;
color: #b0c4de;
margin-bottom: 0.3rem;
}
.stat-value {
display: block;
font-size: 1.1rem;
font-weight: 600;
color: #ffffff;
text-shadow: 0 1px 2px rgba(0,0,0,0.3);
}
/* 环境监测 */
.env-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
}
.env-card {
display: flex;
align-items: center;
gap: 0.8rem;
padding: 1rem;
background: rgba(15, 20, 25, 0.6);
border-radius: 8px;
border: 1px solid rgba(0, 212, 255, 0.2);
transition: all 0.3s ease;
}
.env-card:hover {
transform: translateY(-2px);
border-color: rgba(0, 212, 255, 0.4);
}
.env-icon {
width: 35px;
height: 35px;
border-radius: 50%;
background: linear-gradient(135deg, #3498db, #2980b9);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 0.9rem;
}
.env-info {
display: flex;
flex-direction: column;
gap: 0.2rem;
}
.env-label {
font-size: 0.75rem;
color: #b0c4de;
}
.env-value {
font-size: 1rem;
font-weight: 600;
color: #ffffff;
}
.env-value.good {
color: #2ecc71;
}
.env-number {
font-size: 0.7rem;
color: #95a5a6;
}
/* 设备运行状态 */
.device-status-list {
display: flex;
flex-direction: column;
gap: 1rem;
}
.device-status-item {
padding: 1rem;
background: rgba(15, 20, 25, 0.6);
border-radius: 8px;
border: 1px solid rgba(0, 212, 255, 0.2);
}
.device-info {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0.8rem;
}
.device-name {
font-weight: 600;
color: #ffffff;
font-size: 0.9rem;
}
.device-location {
font-size: 0.75rem;
color: #b0c4de;
}
.device-metrics {
display: flex;
flex-direction: column;
gap: 0.6rem;
}
.metric {
display: flex;
align-items: center;
gap: 0.8rem;
}
.metric-label {
font-size: 0.75rem;
color: #b0c4de;
min-width: 40px;
}
.progress-bar {
flex: 1;
height: 6px;
background: rgba(255, 255, 255, 0.1);
border-radius: 3px;
overflow: hidden;
}
.progress-fill {
height: 100%;
background: linear-gradient(90deg, #2ecc71, #27ae60);
border-radius: 3px;
transition: width 0.3s ease;
}
.metric-value {
font-size: 0.75rem;
color: #ffffff;
min-width: 35px;
text-align: right;
}
.signal-bars {
display: flex;
gap: 2px;
align-items: end;
}
.bar {
width: 3px;
background: rgba(255, 255, 255, 0.2);
border-radius: 1px;
transition: background-color 0.3s ease;
}
.bar:nth-child(1) { height: 8px; }
.bar:nth-child(2) { height: 10px; }
.bar:nth-child(3) { height: 12px; }
.bar:nth-child(4) { height: 14px; }
.bar:nth-child(5) { height: 16px; }
.bar.active {
background: #2ecc71;
}
.status-indicator {
padding: 0.2rem 0.6rem;
border-radius: 12px;
font-size: 0.7rem;
font-weight: 500;
}
.status-indicator.online {
background: rgba(46, 204, 113, 0.2);
color: #2ecc71;
border: 1px solid rgba(46, 204, 113, 0.3);
}
/* 实时数据趋势 */
.trend-chart-container {
margin-bottom: 1rem;
background: rgba(15, 20, 25, 0.6);
border-radius: 8px;
padding: 1rem;
border: 1px solid rgba(0, 212, 255, 0.2);
}
.trend-legend {
display: flex;
justify-content: space-around;
gap: 0.5rem;
}
.trend-legend .legend-item {
display: flex;
align-items: center;
gap: 0.3rem;
font-size: 0.7rem;
color: #b0c4de;
}
.legend-dot {
width: 8px;
height: 8px;
border-radius: 50%;
}
.legend-dot.red { background: #e74c3c; }
.legend-dot.blue { background: #3498db; }
.legend-dot.green { background: #2ecc71; }
/* 工单系统 */
.workorder-layout {
background: rgba(255, 255, 255, 0.95);
border-radius: 15px;
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
overflow: hidden;
}
.workorder-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1.2rem 1.5rem;
background: linear-gradient(135deg, #3498db, #2980b9);
color: white;
}
.workorder-header h3 {
display: flex;
align-items: center;
gap: 0.5rem;
margin: 0;
}
.workorder-actions {
display: flex;
gap: 1rem;
}
.btn {
padding: 0.8rem 1.5rem;
border: none;
border-radius: 8px;
cursor: pointer;
font-size: 0.9rem;
transition: all 0.3s ease;
display: flex;
align-items: center;
gap: 0.5rem;
}
.btn-primary {
background: linear-gradient(135deg, #2ecc71, #27ae60);
color: white;
}
.btn-secondary {
background: rgba(255, 255, 255, 0.2);
color: white;
border: 1px solid rgba(255, 255, 255, 0.3);
}
.btn:hover {
transform: translateY(-2px);
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
}
/* 工单统计 */
.workorder-stats {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 1rem;
padding: 1.5rem;
background: linear-gradient(135deg, rgba(15, 20, 25, 0.9) 0%, rgba(26, 35, 50, 0.8) 100%);
}
.stat-card {
display: flex;
align-items: center;
gap: 1rem;
padding: 1.2rem;
background: linear-gradient(135deg, rgba(26, 35, 50, 0.9) 0%, rgba(30, 60, 114, 0.8) 100%);
border-radius: 12px;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
transition: all 0.3s ease;
border: 1px solid rgba(0, 212, 255, 0.3);
backdrop-filter: blur(10px);
}
.stat-card:hover {
transform: translateY(-5px);
}
.stat-icon {
width: 60px;
height: 60px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 1.5rem;
}
.stat-icon.pending { background: linear-gradient(135deg, #f39c12, #e67e22); }
.stat-icon.processing { background: linear-gradient(135deg, #3498db, #2980b9); }
.stat-icon.completed { background: linear-gradient(135deg, #2ecc71, #27ae60); }
.stat-icon.rate { background: linear-gradient(135deg, #9b59b6, #8e44ad); }
.stat-info {
display: flex;
flex-direction: column;
}
.stat-number {
font-size: 1.8rem;
font-weight: 600;
color: #ffffff;
text-shadow: 0 1px 2px rgba(0,0,0,0.3);
}
.stat-label {
font-size: 0.85rem;
color: #b0c4de;
}
/* 工单表格 */
.workorder-table {
padding: 0 2rem 2rem;
}
.table-header {
margin-bottom: 1.5rem;
}
.filter-bar {
display: flex;
gap: 1rem;
align-items: center;
}
.filter-select, .search-input {
padding: 0.8rem 1rem;
border: 1px solid #ddd;
border-radius: 8px;
font-size: 0.9rem;
transition: border-color 0.3s ease;
}
.filter-select:focus, .search-input:focus {
outline: none;
border-color: #4a90e2;
}
.search-input {
flex: 1;
max-width: 300px;
}
.workorder-list {
width: 100%;
border-collapse: collapse;
background: rgba(26, 35, 50, 0.8);
border-radius: 8px;
overflow: hidden;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
border: 1px solid rgba(0, 212, 255, 0.2);
}
.workorder-list th,
.workorder-list td {
padding: 0.8rem;
text-align: left;
border-bottom: 1px solid rgba(0, 212, 255, 0.2);
}
.workorder-list th {
background: linear-gradient(135deg, rgba(30, 60, 114, 0.9), rgba(42, 82, 152, 0.9));
font-weight: 600;
color: #ffffff;
text-shadow: 0 1px 2px rgba(0,0,0,0.3);
}
.workorder-list td {
color: #e0e6ed;
}
.workorder-list tr:hover {
background: rgba(0, 212, 255, 0.1);
}
/* 设备管理 */
.device-layout {
background: linear-gradient(135deg, rgba(26, 35, 50, 0.9) 0%, rgba(30, 60, 114, 0.8) 100%);
border-radius: 15px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4);
overflow: hidden;
border: 1px solid rgba(0, 212, 255, 0.3);
backdrop-filter: blur(15px);
}
.device-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1.2rem 1.5rem;
background: linear-gradient(135deg, #1e3c72, #2a5298);
color: white;
border-bottom: 2px solid rgba(0, 212, 255, 0.4);
}
.device-categories {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 0.8rem;
padding: 1.5rem;
background: linear-gradient(135deg, rgba(15, 20, 25, 0.9) 0%, rgba(26, 35, 50, 0.8) 100%);
}
.category-card {
display: flex;
align-items: center;
gap: 0.8rem;
padding: 1rem;
background: linear-gradient(135deg, rgba(26, 35, 50, 0.9) 0%, rgba(30, 60, 114, 0.8) 100%);
border-radius: 12px;
cursor: pointer;
transition: all 0.3s ease;
border: 1px solid rgba(0, 212, 255, 0.3);
backdrop-filter: blur(10px);
color: #e0e6ed;
}
.category-card:hover {
transform: translateY(-3px);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
}
.category-card.active {
border-color: rgba(0, 212, 255, 0.8);
background: linear-gradient(135deg, #1e3c72, #2a5298);
color: white;
box-shadow: 0 4px 16px rgba(0, 212, 255, 0.3);
}
.category-icon {
width: 40px;
height: 40px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
background: rgba(0, 212, 255, 0.2);
color: #00d4ff;
font-size: 1rem;
}
.category-card.active .category-icon {
background: rgba(255, 255, 255, 0.2);
color: white;
}
.category-info {
display: flex;
flex-direction: column;
}
.category-name {
font-weight: 600;
margin-bottom: 0.2rem;
color: #2c3e50;
}
.category-count {
font-size: 0.8rem;
opacity: 0.7;
color: #7f8c8d;
}
.device-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 1.5rem;
padding: 2rem;
}
/* 预警系统 */
.warning-layout {
background: linear-gradient(135deg, rgba(26, 35, 50, 0.9) 0%, rgba(30, 60, 114, 0.8) 100%);
border-radius: 15px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4);
overflow: hidden;
border: 1px solid rgba(0, 212, 255, 0.3);
}
.warning-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1.5rem 2rem;
background: linear-gradient(135deg, #e74c3c, #c0392b);
color: white;
}
.warning-actions {
display: flex;
align-items: center;
gap: 1rem;
}
.warning-overview {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 1rem;
padding: 1.5rem;
background: linear-gradient(135deg, rgba(15, 20, 25, 0.9) 0%, rgba(26, 35, 50, 0.8) 100%);
}
.warning-card {
display: flex;
align-items: center;
gap: 0.8rem;
padding: 1.2rem;
background: linear-gradient(135deg, rgba(26, 35, 50, 0.9) 0%, rgba(30, 60, 114, 0.8) 100%);
border-radius: 12px;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
transition: all 0.3s ease;
border: 1px solid rgba(0, 212, 255, 0.3);
}
.warning-card:hover {
transform: translateY(-5px);
}
.warning-icon {
width: 50px;
height: 50px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 1.2rem;
}
.warning-card.critical .warning-icon { background: linear-gradient(135deg, #e74c3c, #c0392b); }
.warning-card.high .warning-icon { background: linear-gradient(135deg, #f39c12, #e67e22); }
.warning-card.medium .warning-icon { background: linear-gradient(135deg, #f1c40f, #f39c12); }
.warning-card.low .warning-icon { background: linear-gradient(135deg, #3498db, #2980b9); }
.warning-info {
display: flex;
flex-direction: column;
}
.warning-number {
font-size: 1.8rem;
font-weight: 600;
color: #ffffff;
text-shadow: 0 1px 2px rgba(0,0,0,0.3);
}
.warning-label {
font-size: 0.85rem;
color: #b0c4de;
}
.warning-types {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1rem;
padding: 1.5rem;
}
.warning-type-card {
background: linear-gradient(135deg, rgba(26, 35, 50, 0.9) 0%, rgba(30, 60, 114, 0.8) 100%);
border-radius: 12px;
padding: 1.2rem;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
border: 1px solid rgba(0, 212, 255, 0.3);
backdrop-filter: blur(10px);
}
.warning-type-card h4 {
display: flex;
align-items: center;
gap: 0.5rem;
margin-bottom: 1rem;
color: #ffffff;
text-shadow: 0 1px 2px rgba(0,0,0,0.3);
}
/* 统计分析 */
.statistics-layout {
background: linear-gradient(135deg, rgba(26, 35, 50, 0.9) 0%, rgba(30, 60, 114, 0.8) 100%);
border-radius: 15px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4);
overflow: hidden;
border: 1px solid rgba(0, 212, 255, 0.3);
backdrop-filter: blur(15px);
}
.statistics-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1.5rem 2rem;
background: linear-gradient(135deg, #9b59b6, #8e44ad);
color: white;
}
.statistics-actions {
display: flex;
align-items: center;
gap: 1rem;
}
.time-range {
padding: 0.5rem 1rem;
border: 1px solid rgba(255, 255, 255, 0.3);
background: rgba(255, 255, 255, 0.1);
color: white;
border-radius: 6px;
margin-right: 1rem;
}
.kpi-cards {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 1rem;
padding: 1.5rem;
background: linear-gradient(135deg, rgba(15, 20, 25, 0.9) 0%, rgba(26, 35, 50, 0.8) 100%);
}
.kpi-card {
display: flex;
align-items: center;
gap: 0.8rem;
padding: 1.2rem;
background: linear-gradient(135deg, rgba(26, 35, 50, 0.9) 0%, rgba(30, 60, 114, 0.8) 100%);
border-radius: 12px;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
transition: all 0.3s ease;
border: 1px solid rgba(0, 212, 255, 0.3);
backdrop-filter: blur(10px);
}
.kpi-card:hover {
transform: translateY(-5px);
}
.kpi-icon {
width: 50px;
height: 50px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, #9b59b6, #8e44ad);
color: white;
font-size: 1.2rem;
}
.kpi-info {
display: flex;
flex-direction: column;
}
.kpi-number {
font-size: 1.8rem;
font-weight: 600;
color: #ffffff;
text-shadow: 0 1px 2px rgba(0,0,0,0.3);
}
.kpi-label {
font-size: 0.85rem;
color: #b0c4de;
margin-bottom: 0.2rem;
}
.kpi-trend {
font-size: 0.8rem;
font-weight: 600;
}
.kpi-trend.up { color: #2ecc71; }
.kpi-trend.down { color: #e74c3c; }
.charts-container {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 1rem;
padding: 1.5rem;
}
.chart-card {
background: white;
border-radius: 8px;
padding: 1.5rem;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.chart-placeholder {
height: 280px;
background: rgba(15, 20, 25, 0.6);
border-radius: 8px;
border: 1px solid rgba(0, 212, 255, 0.2);
display: flex;
align-items: center;
justify-content: center;
color: #7f8c8d;
}
/* 模态框 */
.modal {
display: none;
position: fixed;
z-index: 2000;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
backdrop-filter: blur(5px);
}
.modal-content {
background-color: white;
margin: 5% auto;
padding: 2rem;
border-radius: 15px;
width: 80%;
max-width: 800px;
position: relative;
animation: slideIn 0.3s ease;
}
.close {
position: absolute;
right: 1rem;
top: 1rem;
font-size: 2rem;
cursor: pointer;
color: #aaa;
transition: color 0.3s ease;
}
.close:hover {
color: #333;
}
/* 动画 */
@keyframes fadeIn {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes slideIn {
from { transform: translateY(-50px); opacity: 0; }
to { transform: translateY(0); opacity: 1; }
}
@keyframes pulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.1); }
}
/* 设备管理样式 */
.device-categories {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1rem;
margin-bottom: 2rem;
}
.category-card {
background: white;
border-radius: 8px;
padding: 1.5rem;
text-align: center;
cursor: pointer;
transition: all 0.3s ease;
border: 2px solid transparent;
}
.category-card:hover {
transform: translateY(-2px);
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
}
.category-card.active {
border-color: #4a90e2;
background: #f8fbff;
}
.category-icon {
font-size: 2rem;
color: #4a90e2;
margin-bottom: 0.5rem;
}
.category-name {
font-weight: 600;
margin-bottom: 0.25rem;
}
.category-count {
color: #666;
font-size: 0.875rem;
}
.device-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 1.5rem;
}
.device-card {
background: linear-gradient(135deg, rgba(30, 60, 114, 0.9) 0%, rgba(42, 82, 152, 0.7) 100%);
border-radius: 10px;
padding: 1.2rem;
box-shadow: 0 6px 24px rgba(0, 0, 0, 0.4);
transition: all 0.3s ease;
border: 1px solid rgba(0, 212, 255, 0.3);
backdrop-filter: blur(15px);
position: relative;
overflow: hidden;
}
.device-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 2px;
background: linear-gradient(90deg, #00d4ff, #0099cc);
}
.device-card:hover {
transform: translateY(-3px);
box-shadow: 0 10px 40px rgba(0, 212, 255, 0.2);
border-color: rgba(0, 212, 255, 0.5);
}
.device-header {
display: flex;
align-items: center;
margin-bottom: 1rem;
}
.device-icon {
width: 40px;
height: 40px;
background: #f0f8ff;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 1rem;
}
.device-icon i {
font-size: 1.25rem;
color: #4a90e2;
}
.device-info {
flex: 1;
}
.device-info h4 {
margin: 0 0 0.25rem 0;
font-size: 1rem;
font-weight: 600;
color: #ffffff;
text-shadow: 0 1px 2px rgba(0,0,0,0.3);
}
.device-model {
color: #b0c4de;
font-size: 0.875rem;
opacity: 0.9;
}
.device-status {
display: flex;
align-items: center;
gap: 0.5rem;
}
.status-indicator {
width: 10px;
height: 10px;
border-radius: 50%;
display: inline-block;
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.7; transform: scale(1.1); }
}
.status-indicator.online {
background: #00ff88;
box-shadow: 0 0 15px rgba(0, 255, 136, 0.6);
}
.status-indicator.offline {
background: #ff4757;
box-shadow: 0 0 15px rgba(255, 71, 87, 0.6);
}
.status-indicator.warning {
background: #ffa502;
box-shadow: 0 0 15px rgba(255, 165, 2, 0.6);
}
.status-indicator.working {
background: #00d4ff;
box-shadow: 0 0 15px rgba(0, 212, 255, 0.6);
}
.status-indicator.idle {
background: #a4b0be;
box-shadow: 0 0 15px rgba(164, 176, 190, 0.6);
}
.status-indicator.flying {
background: #c44569;
box-shadow: 0 0 15px rgba(196, 69, 105, 0.6);
}
.status-indicator.charging {
background: #f1c40f;
}
.status-text {
font-size: 0.875rem;
color: #666;
}
.device-body {
margin-bottom: 1rem;
}
.device-detail {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0.75rem;
}
.detail-label {
font-size: 0.875rem;
color: #b0c4de;
}
.detail-value {
font-size: 0.875rem;
font-weight: 500;
color: #ffffff;
}
.progress {
width: 60px;
height: 4px;
background: #e9ecef;
border-radius: 2px;
overflow: hidden;
margin-left: 0.5rem;
}
.progress-bar {
height: 100%;
background: linear-gradient(90deg, #2ecc71, #27ae60);
transition: width 0.3s ease;
}
.device-actions {
display: flex;
align-items: center;
gap: 1rem;
}
.device-actions .btn {
flex: 1;
padding: 0.5rem;
font-size: 0.875rem;
}
/* 预警系统样式 */
.warning-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 1.5rem;
margin-bottom: 2rem;
}
.warning-card {
background: linear-gradient(135deg, rgba(26, 35, 50, 0.9) 0%, rgba(30, 60, 114, 0.8) 100%);
border-radius: 8px;
padding: 1.5rem;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
border: 1px solid rgba(0, 212, 255, 0.3);
}
.warning-card h3 {
margin: 0 0 1rem 0;
font-size: 1.125rem;
color: #ffffff;
text-shadow: 0 1px 2px rgba(0,0,0,0.3);
}
.weather-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1rem;
}
.weather-item {
text-align: center;
padding: 1rem;
background: rgba(15, 20, 25, 0.6);
border-radius: 6px;
border: 1px solid rgba(0, 212, 255, 0.2);
}
.weather-label {
font-size: 0.875rem;
color: #b0c4de;
margin-bottom: 0.5rem;
}
.weather-value {
font-size: 1.125rem;
font-weight: 600;
color: #ffffff;
text-shadow: 0 1px 2px rgba(0,0,0,0.3);
}
.alert-list {
max-height: 300px;
overflow-y: auto;
}
.alert-item {
display: flex;
align-items: center;
padding: 0.75rem;
border-left: 4px solid #e74c3c;
background: #fff5f5;
border-radius: 4px;
margin-bottom: 0.75rem;
}
.alert-item.medium {
border-left-color: #f39c12;
background: #fffbf0;
}
.alert-item.low {
border-left-color: #f1c40f;
background: #fffef0;
}
.alert-icon {
margin-right: 0.75rem;
font-size: 1.125rem;
}
.alert-content {
flex: 1;
}
.alert-title {
font-weight: 600;
margin-bottom: 0.25rem;
}
.alert-time {
font-size: 0.875rem;
color: #666;
}
/* 统计分析样式 */
.stats-overview {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 20px;
margin-bottom: 30px;
background-image: url('images/chart-bg.svg');
background-size: cover;
background-position: center;
background-repeat: no-repeat;
padding: 20px;
border-radius: 8px;
}
.stat-card {
background: white;
border-radius: 8px;
padding: 1.5rem;
text-align: center;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.stat-value {
font-size: 2rem;
font-weight: 700;
color: #4a90e2;
margin-bottom: 0.5rem;
}
.stat-label {
color: #666;
font-size: 0.875rem;
}
.charts-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
gap: 1.5rem;
}
.chart-card {
background: white;
border-radius: 8px;
padding: 1.5rem;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.chart-card h3,
.chart-card h4 {
margin: 0 0 1rem 0;
font-size: 1.125rem;
color: #333;
font-weight: 600;
}
.chart-container {
position: relative;
height: 300px;
}
/* 响应式设计 */
@media (max-width: 1200px) {
.monitor-layout {
grid-template-columns: 1fr;
grid-template-rows: 1fr auto;
}
.info-panel {
max-height: 400px;
}
.device-categories {
grid-template-columns: repeat(3, 1fr);
}
.charts-container {
grid-template-columns: 1fr;
}
.charts-grid {
grid-template-columns: 1fr;
}
.modal-content {
width: 95%;
margin: 2% auto;
}
.schedule-item {
grid-template-columns: 1fr;
gap: 0.5rem;
text-align: center;
}
.history-item {
grid-template-columns: 1fr;
gap: 0.5rem;
text-align: left;
}
}
/* 模态框样式 */
.modal {
display: none;
position: fixed;
z-index: 2000;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
animation: fadeIn 0.3s ease;
}
.modal-content {
background-color: white;
margin: 5% auto;
padding: 0;
border-radius: 8px;
width: 90%;
max-width: 600px;
max-height: 80vh;
overflow-y: auto;
animation: slideIn 0.3s ease;
}
.modal-header {
padding: 1.5rem;
border-bottom: 1px solid #e9ecef;
display: flex;
justify-content: space-between;
align-items: center;
}
.modal-header h2 {
margin: 0;
font-size: 1.25rem;
}
.close {
background: none;
border: none;
font-size: 1.5rem;
cursor: pointer;
color: #666;
padding: 0;
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 4px;
transition: all 0.2s ease;
}
.close:hover {
background: #f8f9fa;
color: #333;
}
.modal-body {
padding: 1.5rem;
}
.form-group {
margin-bottom: 1rem;
}
.form-group label {
display: block;
margin-bottom: 0.5rem;
font-weight: 500;
color: #333;
}
.form-group input,
.form-group select,
.form-group textarea {
width: 100%;
padding: 0.75rem;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 0.875rem;
transition: border-color 0.2s ease;
box-sizing: border-box;
}
.form-group input:focus,
.form-group select:focus,
.form-group textarea:focus {
outline: none;
border-color: #4a90e2;
box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1);
}
.form-actions {
display: flex;
gap: 0.75rem;
justify-content: flex-end;
margin-top: 1.5rem;
padding-top: 1rem;
border-top: 1px solid #e9ecef;
}
.workorder-details,
.device-details {
display: grid;
gap: 1rem;
}
.detail-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.75rem;
background: #f8f9fa;
border-radius: 4px;
}
.detail-item label {
font-weight: 500;
color: #333;
margin: 0;
}
.detail-item span {
color: #666;
}
/* 通知样式 */
@keyframes slideInRight {
from {
transform: translateX(100%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes slideIn {
from {
transform: translateY(-50px);
opacity: 0;
}
to {
transform: translateY(0);
opacity: 1;
}
}
.notification {
animation: slideInRight 0.3s ease;
}
.notification-content {
display: flex;
align-items: center;
gap: 0.75rem;
}
.notification-close {
background: none;
border: none;
cursor: pointer;
color: #666;
padding: 0.25rem;
border-radius: 4px;
transition: background 0.2s ease;
}
.notification-close:hover {
background: rgba(0, 0, 0, 0.1);
}
/* 自定义地图标记样式 */
.custom-marker {
background: white;
border-radius: 50%;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
display: flex;
align-items: center;
justify-content: center;
border: 2px solid white;
}
.camera-marker {
background: #f0f8ff;
}
.ship-marker {
background: #f0fff0;
}
.drone-marker {
background: #fff0f5;
}
.garbage-marker {
background: #fff8dc;
}
/* 维护计划样式 */
.maintenance-schedule {
max-height: 400px;
overflow-y: auto;
}
.schedule-item {
display: grid;
grid-template-columns: 100px 1fr 100px 80px;
gap: 1rem;
align-items: center;
padding: 1rem;
border: 1px solid #e9ecef;
border-radius: 6px;
margin-bottom: 0.75rem;
}
.schedule-date {
font-weight: 500;
color: #333;
}
.schedule-device {
color: #666;
}
.schedule-type {
font-size: 0.875rem;
color: #666;
}
.schedule-status {
padding: 0.25rem 0.5rem;
border-radius: 12px;
font-size: 0.75rem;
text-align: center;
font-weight: 500;
}
.schedule-status.pending {
background: #fff3cd;
color: #856404;
}
.schedule-status.processing {
background: #cce5ff;
color: #004085;
}
.schedule-status.completed {
background: #d4edda;
color: #155724;
}
/* 预警历史样式 */
.warning-history {
max-height: 400px;
overflow-y: auto;
}
.history-item {
display: grid;
grid-template-columns: 120px 80px 1fr 80px;
gap: 1rem;
align-items: center;
padding: 1rem;
border-radius: 6px;
margin-bottom: 0.75rem;
}
.history-item.critical {
background: #fff5f5;
border-left: 4px solid #e74c3c;
}
.history-item.high {
background: #fffbf0;
border-left: 4px solid #f39c12;
}
.history-item.medium {
background: #fffef0;
border-left: 4px solid #f1c40f;
}
.history-time {
font-size: 0.875rem;
color: #666;
}
.history-type {
font-size: 0.875rem;
font-weight: 500;
color: #333;
}
.history-message {
color: #666;
}
.history-status {
padding: 0.25rem 0.5rem;
border-radius: 12px;
font-size: 0.75rem;
text-align: center;
font-weight: 500;
}
.history-status.resolved {
background: #d4edda;
color: #155724;
}
.history-status.pending {
background: #fff3cd;
color: #856404;
}
/* 设置部分样式 */
.settings-section {
margin-bottom: 1.5rem;
padding-bottom: 1rem;
border-bottom: 1px solid #e9ecef;
}
.settings-section:last-child {
border-bottom: none;
margin-bottom: 0;
}
.settings-section h4 {
margin: 0 0 1rem 0;
color: #333;
font-size: 1rem;
}
@media (max-width: 768px) {
.header-content {
flex-direction: column;
height: auto;
padding: 1rem;
}
.nav-menu {
flex-wrap: wrap;
justify-content: center;
}
.main-content {
margin-top: 120px;
padding: 1rem;
}
.workorder-stats,
.warning-overview,
.kpi-cards {
grid-template-columns: repeat(2, 1fr);
}
.device-categories {
grid-template-columns: 1fr;
}
.warning-types {
grid-template-columns: 1fr;
}
.device-grid {
grid-template-columns: 1fr;
}
.warning-grid {
grid-template-columns: 1fr;
}
.charts-grid {
grid-template-columns: 1fr;
}
}
@media (max-width: 480px) {
.workorder-stats,
.warning-overview,
.kpi-cards {
grid-template-columns: 1fr;
}
.status-grid {
grid-template-columns: 1fr;
}
.video-grid {
grid-template-columns: 1fr;
}
}
/* 滚动条样式 */
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 4px;
}
::-webkit-scrollbar-thumb {
background: linear-gradient(135deg, #4a90e2, #357abd);
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: linear-gradient(135deg, #357abd, #2c5aa0);
}
/* 工具提示 */
.tooltip {
position: relative;
cursor: help;
}
.tooltip::after {
content: attr(data-tooltip);
position: absolute;
bottom: 100%;
left: 50%;
transform: translateX(-50%);
background: rgba(0, 0, 0, 0.8);
color: white;
padding: 0.5rem;
border-radius: 4px;
font-size: 0.8rem;
white-space: nowrap;
opacity: 0;
pointer-events: none;
transition: opacity 0.3s ease;
z-index: 1000;
}
.tooltip:hover::after {
opacity: 1;
}
/* 加载动画 */
.loading {
display: inline-block;
width: 20px;
height: 20px;
border: 3px solid rgba(74, 144, 226, 0.3);
border-radius: 50%;
border-top-color: #4a90e2;
animation: spin 1s ease-in-out infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
/* 状态指示器 */
.status-indicator {
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
margin-right: 0.5rem;
}
.status-indicator.online { background: #2ecc71; }
.status-indicator.offline { background: #e74c3c; }
.status-indicator.warning { background: #f39c12; }
/* 徽章 */
.badge {
display: inline-block;
padding: 0.3rem 0.6rem;
font-size: 0.7rem;
font-weight: 600;
border-radius: 12px;
text-transform: uppercase;
}
.badge.success { background: #2ecc71; color: white; }
.badge.warning { background: #f39c12; color: white; }
.badge.danger { background: #e74c3c; color: white; }
.badge.info { background: #3498db; color: white; }
/* 进度条 */
.progress {
width: 100%;
height: 8px;
background: #ecf0f1;
border-radius: 4px;
overflow: hidden;
}
.progress-bar {
height: 100%;
background: linear-gradient(135deg, #4a90e2, #357abd);
border-radius: 4px;
transition: width 0.3s ease;
}
/* 卡片悬停效果 */
.card-hover {
transition: all 0.3s ease;
}
.card-hover:hover {
transform: translateY(-3px);
box-shadow: 0 10px 40px rgba(0, 212, 255, 0.2);
border-color: rgba(0, 212, 255, 0.5);
}
/* 通用卡片样式 */
.card {
background: linear-gradient(135deg, rgba(30, 60, 114, 0.8) 0%, rgba(42, 82, 152, 0.6) 100%);
border-radius: 10px;
padding: 18px;
box-shadow: 0 6px 24px rgba(0, 0, 0, 0.4);
transition: all 0.3s ease;
border: 1px solid rgba(0, 212, 255, 0.3);
backdrop-filter: blur(15px);
position: relative;
overflow: hidden;
}
.card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 2px;
background: linear-gradient(90deg, #00d4ff, #0099cc, #00d4ff);
background-size: 200% 100%;
animation: gradientMove 3s ease-in-out infinite;
}
@keyframes gradientMove {
0%, 100% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
}
.overview-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 15px;
margin-bottom: 25px;
}
/* 渐变文字 */
.gradient-text {
background: linear-gradient(135deg, #4a90e2, #357abd);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
font-weight: 600;
}
/* 玻璃态效果 */
.glass {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.2);
}
/* 阴影效果 */
.shadow-sm { box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); }
.shadow-md { box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); }
.shadow-lg { box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15); }
.shadow-xl { box-shadow: 0 20px 40px rgba(0, 0, 0, 0.2); }
/* 边框效果 */
.border-gradient {
border: 2px solid;
border-image: linear-gradient(135deg, #4a90e2, #357abd) 1;
}
/* 文字效果 */
.text-shadow {
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
/* 过渡效果 */
.transition-all { transition: all 0.3s ease; }
.transition-transform { transition: transform 0.3s ease; }
.transition-opacity { transition: opacity 0.3s ease; }
/* 隐藏/显示 */
.hidden { display: none !important; }
.invisible { opacity: 0; }
.visible { opacity: 1; }
/* 文本对齐 */
.text-left { text-align: left; }
.text-center { text-align: center; }
.text-right { text-align: right; }
/* 弹性布局 */
.flex { display: flex; }
.flex-col { flex-direction: column; }
.flex-row { flex-direction: row; }
.items-center { align-items: center; }
.justify-center { justify-content: center; }
.justify-between { justify-content: space-between; }
.flex-1 { flex: 1; }
/* 间距 */
.gap-1 { gap: 0.25rem; }
.gap-2 { gap: 0.5rem; }
.gap-3 { gap: 0.75rem; }
.gap-4 { gap: 1rem; }
.gap-5 { gap: 1.25rem; }
.gap-6 { gap: 1.5rem; }
/* 内边距 */
.p-1 { padding: 0.25rem; }
.p-2 { padding: 0.5rem; }
.p-3 { padding: 0.75rem; }
.p-4 { padding: 1rem; }
.p-5 { padding: 1.25rem; }
.p-6 { padding: 1.5rem; }
/* 外边距 */
.m-1 { margin: 0.25rem; }
.m-2 { margin: 0.5rem; }
.m-3 { margin: 0.75rem; }
.m-4 { margin: 1rem; }
.m-5 { margin: 1.25rem; }
.m-6 { margin: 1.5rem; }
/* 圆角 */
.rounded-sm { border-radius: 4px; }
.rounded { border-radius: 8px; }
.rounded-lg { border-radius: 12px; }
.rounded-xl { border-radius: 16px; }
.rounded-full { border-radius: 50%; }
/* 宽度 */
.w-full { width: 100%; }
.w-1\/2 { width: 50%; }
.w-1\/3 { width: 33.333333%; }
.w-2\/3 { width: 66.666667%; }
.w-1\/4 { width: 25%; }
.w-3\/4 { width: 75%; }
/* 高度 */
.h-full { height: 100%; }
.h-screen { height: 100vh; }
.h-auto { height: auto; }
/* 字体大小 */
.text-xs { font-size: 0.75rem; }
.text-sm { font-size: 0.875rem; }
.text-base { font-size: 1rem; }
.text-lg { font-size: 1.125rem; }
.text-xl { font-size: 1.25rem; }
.text-2xl { font-size: 1.5rem; }
.text-3xl { font-size: 1.875rem; }
/* 字体粗细 */
.font-light { font-weight: 300; }
.font-normal { font-weight: 400; }
.font-medium { font-weight: 500; }
.font-semibold { font-weight: 600; }
.font-bold { font-weight: 700; }
/* 颜色 */
.text-primary { color: #4a90e2; }
.text-secondary { color: #7f8c8d; }
.text-success { color: #2ecc71; }
.text-warning { color: #f39c12; }
.text-danger { color: #e74c3c; }
.text-info { color: #3498db; }
.text-dark { color: #2c3e50; }
.text-light { color: #ecf0f1; }
/* 背景颜色 */
.bg-primary { background-color: #4a90e2; }
.bg-secondary { background-color: #7f8c8d; }
.bg-success { background-color: #2ecc71; }
.bg-warning { background-color: #f39c12; }
.bg-danger { background-color: #e74c3c; }
.bg-info { background-color: #3498db; }
.bg-dark { background-color: #2c3e50; }
.bg-light { background-color: #ecf0f1; }
.bg-white { background-color: white; }
.bg-transparent { background-color: transparent; }
/* 位置 */
.relative { position: relative; }
.absolute { position: absolute; }
.fixed { position: fixed; }
.sticky { position: sticky; }
/* 层级 */
.z-10 { z-index: 10; }
.z-20 { z-index: 20; }
.z-30 { z-index: 30; }
.z-40 { z-index: 40; }
.z-50 { z-index: 50; }
/* 溢出 */
.overflow-hidden { overflow: hidden; }
.overflow-auto { overflow: auto; }
.overflow-scroll { overflow: scroll; }
/* 显示 */
.block { display: block; }
.inline { display: inline; }
.inline-block { display: inline-block; }
.grid { display: grid; }
/* 光标 */
.cursor-pointer { cursor: pointer; }
.cursor-default { cursor: default; }
.cursor-not-allowed { cursor: not-allowed; }
/* 选择 */
.select-none { user-select: none; }
.select-text { user-select: text; }
.select-all { user-select: all; }
/* 指针事件 */
.pointer-events-none { pointer-events: none; }
.pointer-events-auto { pointer-events: auto; }
/* 变换 */
.transform { transform: translateZ(0); }
.scale-95 { transform: scale(0.95); }
.scale-100 { transform: scale(1); }
.scale-105 { transform: scale(1.05); }
.scale-110 { transform: scale(1.1); }
/* 旋转 */
.rotate-0 { transform: rotate(0deg); }
.rotate-45 { transform: rotate(45deg); }
.rotate-90 { transform: rotate(90deg); }
.rotate-180 { transform: rotate(180deg); }
/* 透明度 */
.opacity-0 { opacity: 0; }
.opacity-25 { opacity: 0.25; }
.opacity-50 { opacity: 0.5; }
.opacity-75 { opacity: 0.75; }
.opacity-100 { opacity: 1; }
/* 阴影 */
.drop-shadow-sm { filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.05)); }
.drop-shadow { filter: drop-shadow(0 1px 3px rgba(0, 0, 0, 0.1)); }
.drop-shadow-md { filter: drop-shadow(0 4px 6px rgba(0, 0, 0, 0.1)); }
.drop-shadow-lg { filter: drop-shadow(0 10px 15px rgba(0, 0, 0, 0.1)); }
.drop-shadow-xl { filter: drop-shadow(0 20px 25px rgba(0, 0, 0, 0.1)); }
/* 模糊 */
.blur-none { filter: blur(0); }
.blur-sm { filter: blur(4px); }
.blur { filter: blur(8px); }
.blur-md { filter: blur(12px); }
.blur-lg { filter: blur(16px); }
.blur-xl { filter: blur(24px); }
/* 亮度 */
.brightness-50 { filter: brightness(0.5); }
.brightness-75 { filter: brightness(0.75); }
.brightness-100 { filter: brightness(1); }
.brightness-125 { filter: brightness(1.25); }
.brightness-150 { filter: brightness(1.5); }
/* 对比度 */
.contrast-50 { filter: contrast(0.5); }
.contrast-75 { filter: contrast(0.75); }
.contrast-100 { filter: contrast(1); }
.contrast-125 { filter: contrast(1.25); }
.contrast-150 { filter: contrast(1.5); }
/* 饱和度 */
.saturate-0 { filter: saturate(0); }
.saturate-50 { filter: saturate(0.5); }
.saturate-100 { filter: saturate(1); }
.saturate-150 { filter: saturate(1.5); }
.saturate-200 { filter: saturate(2); }
/* 色调 */
.hue-rotate-0 { filter: hue-rotate(0deg); }
.hue-rotate-15 { filter: hue-rotate(15deg); }
.hue-rotate-30 { filter: hue-rotate(30deg); }
.hue-rotate-60 { filter: hue-rotate(60deg); }
.hue-rotate-90 { filter: hue-rotate(90deg); }
.hue-rotate-180 { filter: hue-rotate(180deg); }
/* 反转 */
.invert-0 { filter: invert(0); }
.invert { filter: invert(1); }
/* 深褐色 */
.sepia-0 { filter: sepia(0); }
.sepia { filter: sepia(1); }
/* 灰度 */
.grayscale-0 { filter: grayscale(0); }
.grayscale { filter: grayscale(1); }
/* 背景混合模式 */
.bg-blend-normal { background-blend-mode: normal; }
.bg-blend-multiply { background-blend-mode: multiply; }
.bg-blend-screen { background-blend-mode: screen; }
.bg-blend-overlay { background-blend-mode: overlay; }
.bg-blend-darken { background-blend-mode: darken; }
.bg-blend-lighten { background-blend-mode: lighten; }
.bg-blend-color-dodge { background-blend-mode: color-dodge; }
.bg-blend-color-burn { background-blend-mode: color-burn; }
.bg-blend-hard-light { background-blend-mode: hard-light; }
.bg-blend-soft-light { background-blend-mode: soft-light; }
.bg-blend-difference { background-blend-mode: difference; }
.bg-blend-exclusion { background-blend-mode: exclusion; }
.bg-blend-hue { background-blend-mode: hue; }
.bg-blend-saturation { background-blend-mode: saturation; }
.bg-blend-color { background-blend-mode: color; }
.bg-blend-luminosity { background-blend-mode: luminosity; }
/* 混合模式 */
.mix-blend-normal { mix-blend-mode: normal; }
.mix-blend-multiply { mix-blend-mode: multiply; }
.mix-blend-screen { mix-blend-mode: screen; }
.mix-blend-overlay { mix-blend-mode: overlay; }
.mix-blend-darken { mix-blend-mode: darken; }
.mix-blend-lighten { mix-blend-mode: lighten; }
.mix-blend-color-dodge { mix-blend-mode: color-dodge; }
.mix-blend-color-burn { mix-blend-mode: color-burn; }
.mix-blend-hard-light { mix-blend-mode: hard-light; }
.mix-blend-soft-light { mix-blend-mode: soft-light; }
.mix-blend-difference { mix-blend-mode: difference; }
.mix-blend-exclusion { mix-blend-mode: exclusion; }
.mix-blend-hue { mix-blend-mode: hue; }
.mix-blend-saturation { mix-blend-mode: saturation; }
.mix-blend-color { mix-blend-mode: color; }
.mix-blend-luminosity { mix-blend-mode: luminosity; }
/* 自定义滚动条 */
.custom-scrollbar::-webkit-scrollbar {
width: 6px;
height: 6px;
}
.custom-scrollbar::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 3px;
}
.custom-scrollbar::-webkit-scrollbar-thumb {
background: linear-gradient(135deg, #4a90e2, #357abd);
border-radius: 3px;
}
.custom-scrollbar::-webkit-scrollbar-thumb:hover {
background: linear-gradient(135deg, #357abd, #2c5aa0);
}
/* 自定义选择框 */
.custom-select {
position: relative;
display: inline-block;
}
.custom-select select {
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
background: white;
border: 1px solid #ddd;
border-radius: 8px;
padding: 0.8rem 2.5rem 0.8rem 1rem;
font-size: 0.9rem;
cursor: pointer;
transition: border-color 0.3s ease;
}
.custom-select::after {
content: '▼';
position: absolute;
right: 1rem;
top: 50%;
transform: translateY(-50%);
pointer-events: none;
color: #666;
font-size: 0.8rem;
}
.custom-select select:focus {
outline: none;
border-color: #4a90e2;
}
/* 自定义复选框 */
.custom-checkbox {
position: relative;
display: inline-block;
cursor: pointer;
}
.custom-checkbox input[type="checkbox"] {
opacity: 0;
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
cursor: pointer;
}
.custom-checkbox .checkmark {
display: inline-block;
width: 20px;
height: 20px;
border: 2px solid #ddd;
border-radius: 4px;
position: relative;
transition: all 0.3s ease;
}
.custom-checkbox input[type="checkbox"]:checked + .checkmark {
background: linear-gradient(135deg, #4a90e2, #357abd);
border-color: #4a90e2;
}
.custom-checkbox input[type="checkbox"]:checked + .checkmark::after {
content: '✓';
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
color: white;
font-size: 12px;
font-weight: bold;
}
/* 自定义单选框 */
.custom-radio {
position: relative;
display: inline-block;
cursor: pointer;
}
.custom-radio input[type="radio"] {
opacity: 0;
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
cursor: pointer;
}
.custom-radio .radiomark {
display: inline-block;
width: 20px;
height: 20px;
border: 2px solid #ddd;
border-radius: 50%;
position: relative;
transition: all 0.3s ease;
}
.custom-radio input[type="radio"]:checked + .radiomark {
border-color: #4a90e2;
}
.custom-radio input[type="radio"]:checked + .radiomark::after {
content: '';
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
width: 10px;
height: 10px;
background: linear-gradient(135deg, #4a90e2, #357abd);
border-radius: 50%;
}
/* 自定义开关 */
.custom-switch {
position: relative;
display: inline-block;
width: 50px;
height: 24px;
}
.custom-switch input[type="checkbox"] {
opacity: 0;
width: 0;
height: 0;
}
.custom-switch .slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
transition: 0.3s;
border-radius: 24px;
}
.custom-switch .slider:before {
position: absolute;
content: "";
height: 18px;
width: 18px;
left: 3px;
bottom: 3px;
background-color: white;
transition: 0.3s;
border-radius: 50%;
}
.custom-switch input:checked + .slider {
background: linear-gradient(135deg, #4a90e2, #357abd);
}
.custom-switch input:checked + .slider:before {
transform: translateX(26px);
}
/* 自定义范围滑块 */
.custom-range {
-webkit-appearance: none;
appearance: none;
width: 100%;
height: 6px;
border-radius: 3px;
background: #ddd;
outline: none;
transition: background 0.3s ease;
}
.custom-range::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 20px;
height: 20px;
border-radius: 50%;
background: linear-gradient(135deg, #4a90e2, #357abd);
cursor: pointer;
transition: all 0.3s ease;
}
.custom-range::-webkit-slider-thumb:hover {
transform: scale(1.2);
}
.custom-range::-moz-range-thumb {
width: 20px;
height: 20px;
border-radius: 50%;
background: linear-gradient(135deg, #4a90e2, #357abd);
cursor: pointer;
border: none;
transition: all 0.3s ease;
}
.custom-range::-moz-range-thumb:hover {
transform: scale(1.2);
}
/* 自定义文件上传 */
.custom-file-upload {
position: relative;
display: inline-block;
cursor: pointer;
padding: 0.8rem 1.5rem;
background: linear-gradient(135deg, #4a90e2, #357abd);
color: white;
border-radius: 8px;
transition: all 0.3s ease;
border: none;
font-size: 0.9rem;
}
.custom-file-upload:hover {
transform: translateY(-2px);
box-shadow: 0 4px 15px rgba(74, 144, 226, 0.3);
}
.custom-file-upload input[type="file"] {
position: absolute;
left: -9999px;
}
/* 自定义标签 */
.custom-tag {
display: inline-block;
padding: 0.3rem 0.8rem;
background: rgba(74, 144, 226, 0.1);
color: #4a90e2;
border-radius: 15px;
font-size: 0.8rem;
font-weight: 500;
margin: 0.2rem;
transition: all 0.3s ease;
}
.custom-tag:hover {
background: rgba(74, 144, 226, 0.2);
transform: translateY(-1px);
}
.custom-tag.removable {
padding-right: 2rem;
position: relative;
}
.custom-tag.removable::after {
content: '×';
position: absolute;
right: 0.5rem;
top: 50%;
transform: translateY(-50%);
cursor: pointer;
font-weight: bold;
opacity: 0.7;
transition: opacity 0.3s ease;
}
.custom-tag.removable:hover::after {
opacity: 1;
}
/* 自定义分页 */
.custom-pagination {
display: flex;
align-items: center;
gap: 0.5rem;
justify-content: center;
margin: 2rem 0;
}
.custom-pagination .page-item {
padding: 0.5rem 0.8rem;
border: 1px solid #ddd;
background: white;
color: #666;
border-radius: 6px;
cursor: pointer;
transition: all 0.3s ease;
font-size: 0.9rem;
}
.custom-pagination .page-item:hover {
background: #f8f9fa;
border-color: #4a90e2;
color: #4a90e2;
}
.custom-pagination .page-item.active {
background: linear-gradient(135deg, #4a90e2, #357abd);
border-color: #4a90e2;
color: white;
}
.custom-pagination .page-item.disabled {
opacity: 0.5;
cursor: not-allowed;
pointer-events: none;
}
/* 大屏模式动画效果 */
@keyframes titleGlow {
0%, 100% { text-shadow: 0 0 10px rgba(0, 212, 255, 0.8), 0 0 20px rgba(0, 212, 255, 0.6), 0 0 30px rgba(0, 212, 255, 0.4); }
50% { text-shadow: 0 0 20px rgba(0, 212, 255, 1), 0 0 30px rgba(0, 212, 255, 0.8), 0 0 40px rgba(0, 212, 255, 0.6); }
}
@keyframes mapScan {
0% { transform: translateX(-100%); }
100% { transform: translateX(100vw); }
}
@keyframes legendPulse {
0%, 100% { box-shadow: 0 0 5px rgba(0, 212, 255, 0.5); }
50% { box-shadow: 0 0 15px rgba(0, 212, 255, 0.8), 0 0 25px rgba(0, 212, 255, 0.4); }
}
@keyframes iconGlow {
0%, 100% { text-shadow: 0 0 10px rgba(0, 212, 255, 0.8); }
50% { text-shadow: 0 0 20px rgba(0, 212, 255, 1), 0 0 30px rgba(0, 212, 255, 0.6); }
}
@keyframes statusPulse {
0%, 100% { box-shadow: 0 4px 20px rgba(0, 212, 255, 0.3); }
50% { box-shadow: 0 6px 30px rgba(0, 212, 255, 0.6), 0 0 20px rgba(0, 212, 255, 0.4); }
}
@keyframes videoScan {
0% { transform: translateY(-100%); opacity: 0.3; }
50% { opacity: 0.8; }
100% { transform: translateY(100%); opacity: 0.3; }
}
@keyframes videoIconPulse {
0%, 100% { transform: scale(1); filter: drop-shadow(0 0 10px rgba(0, 212, 255, 0.6)); }
50% { transform: scale(1.1); filter: drop-shadow(0 0 20px rgba(0, 212, 255, 0.9)); }
}
@keyframes dataFlow {
0% { transform: translateX(-100%) scaleX(0); }
50% { transform: translateX(0) scaleX(1); }
100% { transform: translateX(100%) scaleX(0); }
}
@keyframes borderScan {
0% { border-color: rgba(0, 212, 255, 0.3); }
50% { border-color: rgba(0, 212, 255, 1); }
100% { border-color: rgba(0, 212, 255, 0.3); }
}
/* 大屏模式下的特殊效果 */
body.fullscreen-mode .monitor-layout::before {
content: '';
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background:
radial-gradient(circle at 20% 20%, rgba(0, 212, 255, 0.1) 0%, transparent 50%),
radial-gradient(circle at 80% 80%, rgba(116, 75, 162, 0.1) 0%, transparent 50%),
radial-gradient(circle at 40% 60%, rgba(102, 126, 234, 0.1) 0%, transparent 50%);
pointer-events: none;
z-index: 1;
}
body.fullscreen-mode .status-card {
animation: statusPulse 3s ease-in-out infinite;
}
body.fullscreen-mode .legend-color {
animation: legendPulse 2s ease-in-out infinite;
}
body.fullscreen-mode .video-placeholder::before {
animation: videoScan 3s ease-in-out infinite;
}
body.fullscreen-mode .video-placeholder i {
animation: videoIconPulse 2s ease-in-out infinite;
}
body.fullscreen-mode .area-item {
animation: borderScan 4s ease-in-out infinite;
}
/* 自定义面包屑 */
.custom-breadcrumb {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 1rem;
background: rgba(255, 255, 255, 0.1);
border-radius: 8px;
margin-bottom: 1rem;
}
.custom-breadcrumb .breadcrumb-item {
color: #666;
text-decoration: none;
transition: color 0.3s ease;
}
.custom-breadcrumb .breadcrumb-item:hover {
color: #4a90e2;
}
.custom-breadcrumb .breadcrumb-item.active {
color: #2c3e50;
font-weight: 500;
}
.custom-breadcrumb .breadcrumb-separator {
color: #999;
margin: 0 0.5rem;
}
/* 工单系统样式 */
.workorder-layout {
padding: 20px;
max-width: 1400px;
margin: 0 auto;
}
.workorder-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30px;
padding-bottom: 20px;
border-bottom: 2px solid #2a3f5f;
}
.workorder-header h3 {
color: #64b5f6;
font-size: 24px;
margin: 0;
}
.workorder-actions {
display: flex;
gap: 10px;
}
.workorder-stats {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
margin-bottom: 30px;
}
.stat-card {
background: linear-gradient(135deg, #1e3a5f 0%, #2a4a6b 100%);
border: 1px solid #3a5f7f;
border-radius: 12px;
padding: 20px;
display: flex;
align-items: center;
gap: 15px;
transition: all 0.3s ease;
}
.stat-card:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(100, 181, 246, 0.2);
}
.stat-icon {
width: 50px;
height: 50px;
border-radius: 50%;
background: linear-gradient(135deg, #64b5f6, #42a5f5);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 20px;
}
.stat-info {
flex: 1;
}
.stat-number {
font-size: 28px;
font-weight: bold;
color: #64b5f6;
margin-bottom: 5px;
}
.stat-label {
color: #b0bec5;
font-size: 14px;
}
.workorder-table {
background: #1a2332;
border-radius: 12px;
overflow: hidden;
border: 1px solid #2a3f5f;
}
.table-header {
padding: 20px;
background: #2a3f5f;
border-bottom: 1px solid #3a5f7f;
}
.table-controls {
display: flex;
gap: 15px;
align-items: center;
}
.filter-select, .search-input {
padding: 8px 12px;
background: #1a2332;
border: 1px solid #3a5f7f;
border-radius: 6px;
color: #e0e0e0;
font-size: 14px;
}
.search-input {
flex: 1;
max-width: 300px;
}
.workorder-list {
width: 100%;
border-collapse: collapse;
}
.workorder-list th,
.workorder-list td {
padding: 15px;
text-align: left;
border-bottom: 1px solid #2a3f5f;
}
.workorder-list th {
background: #2a3f5f;
color: #64b5f6;
font-weight: 600;
font-size: 14px;
}
.workorder-list td {
color: #e0e0e0;
font-size: 14px;
}
/* 设备管理样式 */
.device-layout {
padding: 20px;
max-width: 1400px;
margin: 0 auto;
}
.device-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30px;
padding-bottom: 20px;
border-bottom: 2px solid #2a3f5f;
}
.device-header h3 {
color: #64b5f6;
font-size: 24px;
margin: 0;
}
.device-actions {
display: flex;
gap: 10px;
}
.device-categories {
display: flex;
gap: 10px;
margin-bottom: 30px;
flex-wrap: wrap;
}
.category-btn {
padding: 10px 20px;
background: #2a3f5f;
border: 1px solid #3a5f7f;
border-radius: 25px;
color: #b0bec5;
cursor: pointer;
transition: all 0.3s ease;
display: flex;
align-items: center;
gap: 8px;
}
.category-btn:hover,
.category-btn.active {
background: linear-gradient(135deg, #64b5f6, #42a5f5);
color: white;
border-color: #64b5f6;
}
.device-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 20px;
}
/* 告警系统样式 */
.warning-layout {
padding: 20px;
max-width: 1400px;
margin: 0 auto;
}
.warning-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30px;
padding-bottom: 20px;
border-bottom: 2px solid #2a3f5f;
}
.warning-header h3 {
color: #64b5f6;
font-size: 24px;
margin: 0;
}
.warning-actions {
display: flex;
gap: 10px;
}
.warning-overview {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 20px;
margin-bottom: 30px;
}
.warning-card {
background: linear-gradient(135deg, #1e3a5f 0%, #2a4a6b 100%);
border-radius: 12px;
padding: 20px;
display: flex;
align-items: center;
gap: 15px;
transition: all 0.3s ease;
border-left: 4px solid;
}
.warning-card.critical {
border-left-color: #f44336;
}
.warning-card.high {
border-left-color: #ff9800;
}
.warning-card.medium {
border-left-color: #ffeb3b;
}
.warning-card.low {
border-left-color: #4caf50;
}
.warning-icon {
width: 40px;
height: 40px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 18px;
}
.warning-card.critical .warning-icon {
background: #f44336;
}
.warning-card.high .warning-icon {
background: #ff9800;
}
.warning-card.medium .warning-icon {
background: #ffeb3b;
color: #333;
}
.warning-card.low .warning-icon {
background: #4caf50;
}
.warning-info {
flex: 1;
}
.warning-number {
font-size: 24px;
font-weight: bold;
color: #e0e0e0;
margin-bottom: 5px;
}
.warning-label {
color: #b0bec5;
font-size: 14px;
}
.warning-types {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
gap: 20px;
}
.warning-type-card {
background: #1a2332;
border: 1px solid #2a3f5f;
border-radius: 12px;
padding: 20px;
}
.warning-type-card h4 {
color: #64b5f6;
margin: 0 0 15px 0;
font-size: 18px;
}
.warning-grid {
display: grid;
gap: 10px;
}
/* 统计分析样式 */
.statistics-layout {
padding: 20px;
max-width: 1400px;
margin: 0 auto;
}
.statistics-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30px;
padding-bottom: 20px;
border-bottom: 2px solid #2a3f5f;
}
.statistics-header h3 {
color: #64b5f6;
font-size: 24px;
margin: 0;
}
.statistics-actions {
display: flex;
gap: 10px;
align-items: center;
}
.time-range-select {
padding: 8px 12px;
background: #2a3f5f;
border: 1px solid #3a5f7f;
border-radius: 6px;
color: #e0e0e0;
font-size: 14px;
}
.kpi-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
margin-bottom: 30px;
}
.kpi-card {
background: linear-gradient(135deg, #1e3a5f 0%, #2a4a6b 100%);
border: 1px solid #3a5f7f;
border-radius: 12px;
padding: 20px;
display: flex;
align-items: center;
gap: 15px;
transition: all 0.3s ease;
}
.kpi-card:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(100, 181, 246, 0.2);
}
.kpi-icon {
width: 50px;
height: 50px;
border-radius: 50%;
background: linear-gradient(135deg, #64b5f6, #42a5f5);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 20px;
}
.kpi-info {
flex: 1;
}
.kpi-value {
font-size: 28px;
font-weight: bold;
color: #64b5f6;
margin-bottom: 5px;
}
.kpi-label {
color: #b0bec5;
font-size: 14px;
margin-bottom: 5px;
}
.kpi-change {
font-size: 12px;
font-weight: 600;
}
.kpi-change.positive {
color: #4caf50;
}
.kpi-change.negative {
color: #f44336;
}
.charts-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
gap: 20px;
}
.chart-card {
background: #1a2332;
border: 1px solid #2a3f5f;
border-radius: 12px;
padding: 20px;
}
.chart-card h4 {
color: #64b5f6;
margin: 0 0 15px 0;
font-size: 18px;
}
.chart-card canvas {
width: 100% !important;
height: 300px !important;
}
/* 通用按钮样式 */
.btn {
padding: 10px 20px;
border: none;
border-radius: 6px;
cursor: pointer;
font-size: 14px;
font-weight: 500;
display: inline-flex;
align-items: center;
gap: 8px;
transition: all 0.3s ease;
text-decoration: none;
}
.btn-primary {
background: linear-gradient(135deg, #64b5f6, #42a5f5);
color: white;
}
.btn-primary:hover {
background: linear-gradient(135deg, #42a5f5, #2196f3);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(100, 181, 246, 0.3);
}
.btn-secondary {
background: #2a3f5f;
color: #b0bec5;
border: 1px solid #3a5f7f;
}
.btn-secondary:hover {
background: #3a5f7f;
color: #e0e0e0;
border-color: #4a6f8f;
}
/* 模态框样式 */
#modalContainer {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.8);
display: none;
align-items: center;
justify-content: center;
z-index: 10000;
}
.modal {
background: #1a2332;
border: 1px solid #2a3f5f;
border-radius: 12px;
padding: 30px;
max-width: 600px;
width: 90%;
max-height: 80vh;
overflow-y: auto;
}
.modal h3 {
color: #64b5f6;
margin: 0 0 20px 0;
font-size: 20px;
}
.modal-close {
position: absolute;
top: 15px;
right: 15px;
background: none;
border: none;
color: #b0bec5;
font-size: 24px;
cursor: pointer;
padding: 5px;
}
.modal-close:hover {
color: #e0e0e0;
}
/* 新增响应式设计 */
@media (max-width: 1200px) {
.charts-container {
grid-template-columns: 1fr;
}
.warning-types {
grid-template-columns: 1fr;
}
}
@media (max-width: 992px) {
.workorder-stats,
.kpi-cards {
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
.device-grid {
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
}
.warning-overview {
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
}
}
@media (max-width: 768px) {
.workorder-header,
.device-header,
.warning-header,
.statistics-header {
flex-direction: column;
gap: 15px;
align-items: flex-start;
}
.workorder-actions,
.device-actions,
.warning-actions,
.statistics-actions {
width: 100%;
justify-content: flex-start;
}
.device-categories {
justify-content: center;
}
.table-controls {
flex-direction: column;
gap: 10px;
}
.search-input {
max-width: 100%;
}
}