UNPKG

tcp-serial-relay

Version:

Modular TCP to Serial relay service with comprehensive logging, monitoring and web dashboard

276 lines (228 loc) 4.26 kB
/* Reset and base styles */ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; line-height: 1.6; color: #333; background-color: #f5f5f5; } /* Layout */ header, footer { background-color: #2c3e50; color: white; padding: 1rem; } header { display: flex; justify-content: space-between; align-items: center; } nav { background-color: #34495e; } nav ul { display: flex; list-style: none; } nav a { display: block; padding: 0.8rem 1.5rem; color: white; text-decoration: none; transition: background-color 0.3s; } nav a:hover, nav a.active { background-color: #1abc9c; } main { max-width: 1200px; margin: 0 auto; padding: 2rem; } footer { text-align: center; margin-top: 2rem; } /* Status indicators */ .status-indicator, #status-indicator { padding: 0.5rem 1rem; border-radius: 4px; font-weight: bold; } .status-healthy, .status-indicator.connected { background-color: #2ecc71; color: white; } .status-warning { background-color: #f39c12; color: white; } .status-stopped, .status-indicator.disconnected { background-color: #e74c3c; color: white; } .status-unknown { background-color: #95a5a6; color: white; } /* Tab content */ .tab-content { display: none; } .tab-content.active { display: block; } /* Status cards */ .status-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 1.5rem; margin-bottom: 2rem; } .status-card { background-color: white; border-radius: 8px; padding: 1.5rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } /* Metrics */ .metrics { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 1.5rem; margin-bottom: 2rem; } .metric { background-color: white; border-radius: 8px; padding: 1.5rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); text-align: center; } .metric h3 { margin-bottom: 0.5rem; color: #7f8c8d; } .metric div { font-size: 1.5rem; font-weight: bold; } /* Service control */ .service-control { display: flex; gap: 1rem; margin-bottom: 2rem; } /* Configuration form */ .config-section { background-color: white; border-radius: 8px; padding: 1.5rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); margin-bottom: 1.5rem; } .form-group { margin-bottom: 1rem; } .form-group label { display: block; margin-bottom: 0.5rem; font-weight: bold; } .form-group input, .form-group select { width: 100%; padding: 0.5rem; border: 1px solid #ddd; border-radius: 4px; } .form-group input[type="checkbox"] { width: auto; } .form-actions { display: flex; gap: 1rem; margin-top: 1.5rem; } /* Logs */ .log-controls { display: flex; align-items: center; gap: 1rem; margin-bottom: 1rem; } .log-container { background-color: white; border-radius: 8px; padding: 1.5rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); overflow-x: auto; } #log-table { width: 100%; border-collapse: collapse; } #log-table th, #log-table td { padding: 0.75rem; text-align: left; border-bottom: 1px solid #ddd; } #log-table th { background-color: #f8f9fa; } .log-level-info { border-left: 4px solid #3498db; } .log-level-warn { border-left: 4px solid #f39c12; } .log-level-error { border-left: 4px solid #e74c3c; } /* Buttons */ button { padding: 0.6rem 1.2rem; background-color: #3498db; color: white; border: none; border-radius: 4px; cursor: pointer; font-weight: bold; transition: background-color 0.3s; } button:hover { background-color: #2980b9; } button[type="submit"] { background-color: #2ecc71; } button[type="submit"]:hover { background-color: #27ae60; } #stop-service { background-color: #e74c3c; } #stop-service:hover { background-color: #c0392b; } #restart-service { background-color: #f39c12; } #restart-service:hover { background-color: #d35400; } /* Responsive adjustments */ @media (max-width: 768px) { nav ul { flex-direction: column; } .status-cards, .metrics { grid-template-columns: 1fr; } .service-control, .form-actions { flex-direction: column; } }