diff options
author | Robby Zambito <contact@robbyzambito.me> | 2025-08-06 19:51:58 -0400 |
---|---|---|
committer | Robby Zambito <contact@robbyzambito.me> | 2025-08-06 19:58:08 -0400 |
commit | e33771f6adae7d9664f983b96abad28a27b61a8b (patch) | |
tree | 35597a3253feab0f0d77ead2aae86f3aae808ecd /static/status-styles.css | |
parent | a5ac279f6882d27b92e482125a87635d9c1ad00d (diff) |
Created status page
Prompt:
Create a status page with live updating data that polls API endpoints for data
Diffstat (limited to 'static/status-styles.css')
-rw-r--r-- | static/status-styles.css | 921 |
1 files changed, 921 insertions, 0 deletions
diff --git a/static/status-styles.css b/static/status-styles.css new file mode 100644 index 0000000..9a7dabd --- /dev/null +++ b/static/status-styles.css @@ -0,0 +1,921 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +:root { + --primary-color: #6366f1; + --primary-dark: #4f46e5; + --secondary-color: #f1f5f9; + --text-primary: #1e293b; + --text-secondary: #64748b; + --background: #ffffff; + --surface: #f8fafc; + --border: #e2e8f0; + --success: #10b981; + --warning: #f59e0b; + --error: #ef4444; + --operational: #10b981; + --degraded: #f59e0b; + --down: #ef4444; + --maintenance: #6366f1; + --shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); + --shadow-lg: 0 20px 25px -5px rgba(0, 0, 0, 0.1); + --gradient: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); +} + +body { + font-family: 'Inter', sans-serif; + line-height: 1.6; + color: var(--text-primary); + background: var(--background); +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 0 2rem; +} + +/* Navigation */ +.navbar { + position: fixed; + top: 0; + width: 100%; + background: rgba(255, 255, 255, 0.95); + backdrop-filter: blur(10px); + z-index: 1000; + border-bottom: 1px solid var(--border); +} + +.nav-container { + max-width: 1200px; + margin: 0 auto; + padding: 1rem 2rem; + display: flex; + justify-content: space-between; + align-items: center; +} + +.nav-logo { + font-size: 1.5rem; + font-weight: 700; + background: var(--gradient); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + text-decoration: none; +} + +.nav-menu { + display: flex; + list-style: none; + gap: 2rem; +} + +.nav-link { + text-decoration: none; + color: var(--text-primary); + font-weight: 500; + transition: color 0.3s ease; +} + +.nav-link:hover { + color: var(--primary-color); +} + +.nav-actions { + display: flex; + align-items: center; + gap: 1rem; +} + +/* Buttons */ +.btn { + padding: 0.75rem 1.5rem; + border: none; + border-radius: 0.5rem; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + text-decoration: none; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + font-size: 0.875rem; +} + +.btn-primary { + background: var(--gradient); + color: white; + box-shadow: var(--shadow); +} + +.btn-primary:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-lg); +} + +.btn-ghost { + background: transparent; + color: var(--text-primary); + border: none; +} + +.btn-ghost:hover { + background: var(--surface); +} + +/* Hero Section */ +.hero { + padding: 8rem 0 4rem; + background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%); +} + +.hero-content { + text-align: center; +} + +.status-indicator { + display: flex; + align-items: center; + justify-content: center; + gap: 1.5rem; + margin-bottom: 2rem; +} + +.status-icon { + font-size: 4rem; + animation: pulse 2s infinite; +} + +@keyframes pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.8; } +} + +.hero-title { + font-size: 3rem; + font-weight: 700; + line-height: 1.1; + margin-bottom: 1rem; +} + +.status-label { + color: var(--operational); +} + +.status-label.degraded { + color: var(--degraded); +} + +.status-label.down { + color: var(--down); +} + +.status-label.maintenance { + color: var(--maintenance); +} + +.hero-subtitle { + font-size: 1.25rem; + color: var(--text-secondary); + margin-bottom: 2rem; +} + +.last-updated { + display: flex; + align-items: center; + justify-content: center; + gap: 1rem; + color: var(--text-secondary); + font-size: 0.875rem; +} + +.refresh-btn { + background: none; + border: 1px solid var(--border); + border-radius: 0.375rem; + padding: 0.5rem; + cursor: pointer; + color: var(--text-secondary); + transition: all 0.3s ease; +} + +.refresh-btn:hover { + color: var(--primary-color); + border-color: var(--primary-color); +} + +.refresh-btn.loading { + animation: spin 1s linear infinite; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* Status Overview */ +.status-overview { + padding: 4rem 0; + background: var(--background); +} + +.metrics-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 2rem; +} + +.metric-card { + background: white; + padding: 2rem; + border-radius: 1rem; + box-shadow: var(--shadow); + border: 1px solid var(--border); +} + +.metric-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; +} + +.metric-header h3 { + font-size: 1rem; + font-weight: 600; + color: var(--text-secondary); +} + +.metric-status { + padding: 0.25rem 0.75rem; + border-radius: 1rem; + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; +} + +.metric-status.operational { + background: rgba(16, 185, 129, 0.1); + color: var(--operational); +} + +.metric-status.degraded { + background: rgba(245, 158, 11, 0.1); + color: var(--degraded); +} + +.metric-status.down { + background: rgba(239, 68, 68, 0.1); + color: var(--down); +} + +.metric-value { + font-size: 2.5rem; + font-weight: 700; + color: var(--text-primary); + margin-bottom: 0.5rem; +} + +.metric-label { + font-size: 0.875rem; + color: var(--text-secondary); +} + +/* Services Status */ +.services-status { + padding: 4rem 0; + background: var(--surface); +} + +.section-header { + text-align: center; + margin-bottom: 3rem; +} + +.section-title { + font-size: 2.5rem; + font-weight: 700; + margin-bottom: 1rem; +} + +.section-subtitle { + font-size: 1.125rem; + color: var(--text-secondary); +} + +.services-list { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.service-item { + background: white; + padding: 1.5rem 2rem; + border-radius: 0.75rem; + box-shadow: var(--shadow); + display: flex; + justify-content: space-between; + align-items: center; + transition: transform 0.3s ease; +} + +.service-item:hover { + transform: translateY(-2px); +} + +.service-info { + display: flex; + align-items: center; + gap: 1rem; +} + +.service-icon { + width: 48px; + height: 48px; + border-radius: 0.5rem; + display: flex; + align-items: center; + justify-content: center; + font-size: 1.5rem; + background: var(--surface); +} + +.service-details h3 { + font-size: 1.125rem; + font-weight: 600; + margin-bottom: 0.25rem; +} + +.service-details p { + color: var(--text-secondary); + font-size: 0.875rem; +} + +.service-status { + display: flex; + align-items: center; + gap: 0.75rem; +} + +.status-dot { + width: 12px; + height: 12px; + border-radius: 50%; + animation: pulse 2s infinite; +} + +.status-dot.operational { + background: var(--operational); +} + +.status-dot.degraded { + background: var(--degraded); +} + +.status-dot.down { + background: var(--down); +} + +.status-dot.maintenance { + background: var(--maintenance); +} + +.status-text { + font-weight: 600; + font-size: 0.875rem; +} + +.status-text.operational { + color: var(--operational); +} + +.status-text.degraded { + color: var(--degraded); +} + +.status-text.down { + color: var(--down); +} + +.status-text.maintenance { + color: var(--maintenance); +} + +.response-time { + font-size: 0.875rem; + color: var(--text-secondary); +} + +/* Performance Charts */ +.performance-charts { + padding: 4rem 0; + background: var(--background); +} + +.charts-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(500px, 1fr)); + gap: 2rem; +} + +.chart-card { + background: white; + padding: 2rem; + border-radius: 1rem; + box-shadow: var(--shadow); + border: 1px solid var(--border); +} + +.chart-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 2rem; +} + +.chart-header h3 { + font-size: 1.25rem; + font-weight: 600; +} + +.time-range-select { + padding: 0.5rem 1rem; + border: 1px solid var(--border); + border-radius: 0.375rem; + background: white; + font-size: 0.875rem; + cursor: pointer; +} + +.chart-container { + position: relative; + height: 200px; +} + +.chart-container canvas { + width: 100% !important; + height: 100% !important; +} + +/* Incidents Section */ +.incidents-section { + padding: 4rem 0; + background: var(--surface); +} + +.incidents-list { + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +.incident-item { + background: white; + padding: 2rem; + border-radius: 0.75rem; + box-shadow: var(--shadow); + border-left: 4px solid var(--error); +} + +.incident-item.resolved { + border-left-color: var(--operational); +} + +.incident-item.investigating { + border-left-color: var(--warning); +} + +.incident-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 1rem; +} + +.incident-title { + font-size: 1.125rem; + font-weight: 600; + margin-bottom: 0.5rem; +} + +.incident-status { + padding: 0.25rem 0.75rem; + border-radius: 1rem; + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; +} + +.incident-status.resolved { + background: rgba(16, 185, 129, 0.1); + color: var(--operational); +} + +.incident-status.investigating { + background: rgba(245, 158, 11, 0.1); + color: var(--warning); +} + +.incident-status.identified { + background: rgba(239, 68, 68, 0.1); + color: var(--error); +} + +.incident-description { + color: var(--text-secondary); + margin-bottom: 1rem; + line-height: 1.6; +} + +.incident-meta { + display: flex; + justify-content: space-between; + align-items: center; + font-size: 0.875rem; + color: var(--text-secondary); +} + +.no-incidents, +.no-maintenance { + text-align: center; + padding: 4rem 2rem; + color: var(--text-secondary); +} + +.no-incidents-icon, +.no-maintenance-icon { + font-size: 4rem; + margin-bottom: 1rem; +} + +.no-incidents h3, +.no-maintenance h3 { + font-size: 1.5rem; + font-weight: 600; + color: var(--text-primary); + margin-bottom: 0.5rem; +} + +/* Maintenance Section */ +.maintenance-section { + padding: 4rem 0; + background: var(--background); +} + +.maintenance-list { + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +.maintenance-item { + background: white; + padding: 2rem; + border-radius: 0.75rem; + box-shadow: var(--shadow); + border-left: 4px solid var(--maintenance); +} + +.maintenance-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 1rem; +} + +.maintenance-title { + font-size: 1.125rem; + font-weight: 600; + margin-bottom: 0.5rem; +} + +.maintenance-status { + padding: 0.25rem 0.75rem; + border-radius: 1rem; + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; + background: rgba(99, 102, 241, 0.1); + color: var(--maintenance); +} + +.maintenance-description { + color: var(--text-secondary); + margin-bottom: 1rem; + line-height: 1.6; +} + +.maintenance-meta { + display: flex; + justify-content: space-between; + align-items: center; + font-size: 0.875rem; + color: var(--text-secondary); +} + +/* Historical Uptime */ +.historical-uptime { + padding: 4rem 0; + background: var(--surface); +} + +.uptime-calendar { + display: grid; + grid-template-columns: repeat(13, 1fr); + gap: 0.25rem; + margin-bottom: 2rem; + max-width: 800px; + margin-left: auto; + margin-right: auto; +} + +.uptime-week { + display: grid; + grid-template-rows: repeat(7, 1fr); + gap: 0.25rem; +} + +.uptime-day { + width: 12px; + height: 12px; + border-radius: 2px; + cursor: pointer; + transition: transform 0.2s ease; +} + +.uptime-day:hover { + transform: scale(1.2); +} + +.uptime-100 { + background: #10b981; +} + +.uptime-99 { + background: #34d399; +} + +.uptime-95 { + background: #fbbf24; +} + +.uptime-90 { + background: #f87171; +} + +.uptime-down { + background: #ef4444; +} + +.uptime-legend { + display: flex; + justify-content: center; + gap: 2rem; + flex-wrap: wrap; +} + +.legend-item { + display: flex; + align-items: center; + gap: 0.5rem; + font-size: 0.875rem; + color: var(--text-secondary); +} + +.legend-color { + width: 12px; + height: 12px; + border-radius: 2px; +} + +/* Subscribe Section */ +.subscribe-section { + padding: 4rem 0; + background: var(--background); +} + +.subscribe-card { + background: white; + padding: 3rem; + border-radius: 1rem; + box-shadow: var(--shadow); + display: flex; + justify-content: space-between; + align-items: center; + gap: 2rem; +} + +.subscribe-content h3 { + font-size: 1.5rem; + font-weight: 600; + margin-bottom: 0.5rem; +} + +.subscribe-content p { + color: var(--text-secondary); +} + +.subscribe-form { + display: flex; + gap: 1rem; + min-width: 300px; +} + +.subscribe-form input { + flex: 1; + padding: 0.75rem 1rem; + border: 1px solid var(--border); + border-radius: 0.5rem; + font-size: 1rem; +} + +.subscribe-form input:focus { + outline: none; + border-color: var(--primary-color); + box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1); +} + +/* Footer */ +.footer { + background: var(--text-primary); + color: white; + padding: 4rem 0 2rem; +} + +.footer-content { + display: grid; + grid-template-columns: 2fr 1fr 1fr 1fr; + gap: 3rem; + margin-bottom: 3rem; +} + +.footer-logo { + font-size: 1.5rem; + font-weight: 700; + margin-bottom: 1rem; +} + +.footer-section h4 { + font-weight: 600; + margin-bottom: 1rem; +} + +.footer-section ul { + list-style: none; +} + +.footer-section ul li { + margin-bottom: 0.5rem; +} + +.footer-section ul li a { + color: rgba(255, 255, 255, 0.8); + text-decoration: none; + transition: color 0.3s ease; +} + +.footer-section ul li a:hover { + color: white; +} + +.footer-bottom { + display: flex; + justify-content: space-between; + align-items: center; + padding-top: 2rem; + border-top: 1px solid rgba(255, 255, 255, 0.1); +} + +.footer-links { + display: flex; + gap: 2rem; +} + +.footer-links a { + color: rgba(255, 255, 255, 0.8); + text-decoration: none; + transition: color 0.3s ease; +} + +.footer-links a:hover { + color: white; +} + +/* Toast */ +.toast { + position: fixed; + top: 2rem; + right: 2rem; + background: var(--success); + color: white; + padding: 1rem 1.5rem; + border-radius: 0.5rem; + box-shadow: var(--shadow-lg); + transform: translateX(100%); + transition: transform 0.3s ease; + z-index: 1000; +} + +.toast.show { + transform: translateX(0); +} + +.toast-content { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.toast-icon { + font-size: 1.25rem; +} + +/* Responsive Design */ +@media (max-width: 768px) { + .nav-menu { + display: none; + } + + .hero-title { + font-size: 2rem; + } + + .status-indicator { + flex-direction: column; + gap: 1rem; + } + + .metrics-grid { + grid-template-columns: 1fr; + } + + .charts-grid { + grid-template-columns: 1fr; + } + + .service-item { + flex-direction: column; + align-items: flex-start; + gap: 1rem; + } + + .service-status { + align-self: flex-end; + } + + .subscribe-card { + flex-direction: column; + text-align: center; + } + + .subscribe-form { + min-width: auto; + width: 100%; + } + + .footer-content { + grid-template-columns: 1fr; + text-align: center; + } + + .footer-bottom { + flex-direction: column; + gap: 1rem; + text-align: center; + } + + .uptime-legend { + flex-direction: column; + gap: 1rem; + } +} + +@media (max-width: 480px) { + .container { + padding: 0 1rem; + } + + .hero { + padding: 6rem 0 3rem; + } + + .section-title { + font-size: 2rem; + } + + .uptime-calendar { + grid-template-columns: repeat(7, 1fr); + } + + .toast { + top: 1rem; + right: 1rem; + left: 1rem; + } +} |