diff --git a/src/client/components/charts/LatencySparkline.tsx b/src/client/components/charts/LatencySparkline.tsx index 80205fa..2871ee8 100644 --- a/src/client/components/charts/LatencySparkline.tsx +++ b/src/client/components/charts/LatencySparkline.tsx @@ -50,7 +50,7 @@ export function LatencySparkline({ checks }: { checks: Check[] }) { new Date((payload[0].payload as LatencyDatum).t).toLocaleString()} /> } diff --git a/src/client/components/charts/UptimeBar.tsx b/src/client/components/charts/UptimeBar.tsx index e7bad96..82beff5 100644 --- a/src/client/components/charts/UptimeBar.tsx +++ b/src/client/components/charts/UptimeBar.tsx @@ -99,7 +99,7 @@ export function UptimeBar({ checks }: { checks: Check[] }) { formatBucketTime(payload[0].payload as UptimeDatum)} diff --git a/src/client/styles.css b/src/client/styles.css index 2ad8574..53a1926 100644 --- a/src/client/styles.css +++ b/src/client/styles.css @@ -5,6 +5,7 @@ @import './styles/LoginPage.css'; @import './styles/StatusPage.css'; @import './styles/DashboardPage.css'; +@import './styles/MonitorDetailPage.css'; @custom-variant dark (&:is(.dark *)); @@ -406,9 +407,6 @@ button { animation: spin 900ms linear infinite; } -.detail-main { - padding-top: 34px; -} .back-link { display: inline-flex; align-items: center; @@ -427,246 +425,6 @@ button { width: 15px; height: 15px; } -.detail-hero { - display: flex; - align-items: flex-end; - justify-content: space-between; - gap: 32px; - margin-top: 34px; - padding-bottom: 36px; - border-bottom: 1px solid #e7e7e7; -} -.detail-title { - display: flex; - align-items: center; - gap: 18px; - min-width: 0; -} -.status-orb { - flex: 0 0 auto; - width: 16px; - height: 16px; - border: 4px solid #f2d4d4; - border-radius: 50%; - background: #c74f4f; - box-shadow: 0 0 0 8px #fff; -} -.status-orb.online { - border-color: #c5f1df; - background: var(--primary-deep); -} -.status-orb.pending { - border-color: #f6e2c8; - background: #d8892f; -} -.status-orb.checking { - border-color: #eee5bd; - background: #c6aa38; -} -.detail-title h1 { - margin: 0; - overflow: hidden; - font-size: 40px; - font-weight: 500; - line-height: 1.1; - letter-spacing: -1.5px; - text-overflow: ellipsis; - white-space: nowrap; -} -.detail-title a { - display: inline-flex; - align-items: center; - gap: 6px; - max-width: min(70vw, 680px); - margin-top: 9px; - overflow: hidden; - font: - 400 13px/1.4 'IBM Plex Mono', - monospace; - color: var(--muted); - text-overflow: ellipsis; - white-space: nowrap; -} -.detail-title a:hover { - color: var(--primary-deep); -} -.detail-title a svg { - flex: 0 0 auto; - width: 13px; - height: 13px; -} -.detail-actions { - display: flex; - align-items: center; - gap: 18px; -} -.muted-alert { - display: inline-flex; - align-items: center; - gap: 6px; - font-size: 12px; - color: var(--muted); -} -.muted-alert svg { - width: 14px; - height: 14px; -} -.sla-grid { - display: grid; - grid-template-columns: repeat(5, 1fr); - gap: 12px; - margin-top: 24px; -} -.sla-card { - min-width: 0; - padding: 20px; - border: 1px solid #e3e3e3; - border-radius: 8px; - background: #fff; -} -.sla-card p { - margin: 0 0 17px; - font-size: 12px; - color: var(--muted); -} -.sla-card strong { - display: block; - font: - 500 23px/1 'IBM Plex Mono', - monospace; - letter-spacing: -1px; -} -.sla-card span { - display: block; - margin-top: 11px; - overflow: hidden; - font-size: 11px; - color: var(--faint); - text-overflow: ellipsis; - white-space: nowrap; -} -.sla-card.incident-summary { - background: #fafafa; -} -.sla-card.incident-summary.has-incident { - border-color: #e8c3c3; - background: #fff8f8; -} -.sla-card.incident-summary.has-incident strong { - color: #a83e3e; -} -.detail-grid { - display: grid; - grid-template-columns: minmax(0, 1.55fr) minmax(300px, 0.75fr); - gap: 16px; - margin-top: 16px; -} -.detail-grid.lower-grid { - align-items: stretch; -} -.lower-grid > .data-panel { - height: 100%; -} -.data-panel { - overflow: hidden; - border: 1px solid #dedede; - border-radius: 8px; - background: #fff; -} -.data-panel-heading { - display: flex; - align-items: center; - justify-content: space-between; - gap: 20px; - min-height: 82px; - padding: 18px 22px; - border-bottom: 1px solid #ededed; -} -.data-panel-heading .overline { - margin-bottom: 5px; -} -.data-panel-heading h2 { - margin: 0; - font-size: 18px; - font-weight: 500; -} -.data-panel-heading > span { - font: - 400 11px/1.4 'IBM Plex Mono', - monospace; - color: var(--faint); -} -.configuration-panel { - margin-top: 16px; -} -.config-list { - margin: 0; -} -.config-row { - display: flex; - align-items: center; - justify-content: space-between; - gap: 20px; - padding: 14px 22px; - border-bottom: 1px solid #f0f0f0; -} -.config-row:last-child { - border-bottom: 0; -} -.config-row dt { - font-size: 12px; - color: var(--muted); -} -.config-row dd { - margin: 0; - font: - 400 13px/1.4 'IBM Plex Mono', - monospace; - color: var(--ink); -} -.config-row .config-row-actions { - display: flex; - align-items: center; - gap: 10px; -} -.config-row-actions .row-action { - font-family: 'DM Sans', 'Helvetica Neue', sans-serif; -} -.config-danger { - display: flex; - align-items: center; - justify-content: space-between; - gap: 16px; - padding: 16px 22px; - border-top: 1px solid #ededed; - background: #fdfafa; -} -.config-danger p { - margin: 0; - font-size: 12px; - color: var(--muted); -} -.chart-panel { - min-height: 330px; -} -.sparkline-wrap { - position: relative; - height: 245px; - padding: 26px 24px 24px; - background: linear-gradient(180deg, #fdfefe, #fff); -} -.chart-scale { - position: absolute; - inset: 19px 22px 20px auto; - display: flex; - flex-direction: column; - justify-content: space-between; - pointer-events: none; - font: - 400 9px/1 'IBM Plex Mono', - monospace; - color: #aaa; -} .table-empty { display: grid; min-height: 150px; @@ -676,141 +434,11 @@ button { color: var(--muted); text-align: center; } -.uptime-panel { - min-height: 330px; -} -.uptime-bar { - height: 148px; - padding: 24px 22px 18px; - background: linear-gradient(180deg, #fcfefd 0%, #fff 100%); -} -.uptime-legend { - display: flex; - justify-content: space-between; - padding: 14px 22px 0; - border-top: 1px solid #f0f0f0; - font-size: 10px; - color: #999; -} -.uptime-legend span { - display: inline-flex; - align-items: center; - gap: 5px; -} -.uptime-legend i { - width: 6px; - height: 6px; - border-radius: 50%; - background: var(--primary-deep); -} -.uptime-legend i.legend-down { - margin-left: 5px; - background: var(--chart-down); -} -.uptime-legend i.legend-degraded { - margin-left: 5px; - background: var(--chart-degraded); -} -.data-table-wrap { - overflow-x: auto; -} -.recent-checks-panel { - display: flex; - min-height: 0; - flex-direction: column; -} .incidents-panel { display: flex; min-height: 0; flex-direction: column; } -.recent-checks-scroll, -.incident-list { - max-height: clamp(320px, 52vh, 556px); - overflow: auto; - overscroll-behavior: contain; - scrollbar-color: #b8c7c0 #f4f6f5; - scrollbar-gutter: stable; - scrollbar-width: thin; -} -.recent-checks-scroll:focus-visible, -.incident-list:focus-visible { - outline: 2px solid rgb(36 180 126 / 0.45); - outline-offset: -2px; -} -.recent-checks-scroll::-webkit-scrollbar, -.incident-list::-webkit-scrollbar { - width: 9px; - height: 9px; -} -.recent-checks-scroll::-webkit-scrollbar-track, -.incident-list::-webkit-scrollbar-track { - background: #f4f6f5; -} -.recent-checks-scroll::-webkit-scrollbar-thumb, -.incident-list::-webkit-scrollbar-thumb { - border: 2px solid #f4f6f5; - border-radius: 999px; - background: #b8c7c0; -} -.recent-checks-scroll::-webkit-scrollbar-thumb:hover, -.incident-list::-webkit-scrollbar-thumb:hover { - background: #91a69d; -} -.incident-list { - min-height: 0; -} -.incident-list article { - display: flex; - gap: 13px; - padding: 18px 20px; -} -.incident-list article > div { - min-width: 0; -} -.incident-list article + article { - border-top: 1px solid #ededed; -} -.incident-list article > span { - display: grid; - flex: 0 0 auto; - width: 30px; - height: 30px; - place-items: center; - border-radius: 50%; - color: #16885b; - background: #eaf9f2; -} -.incident-list article.open > span { - color: #aa4141; - background: #fff0f0; -} -.incident-list article svg { - width: 15px; - height: 15px; -} -.incident-list strong { - font-size: 13px; - font-weight: 500; -} -.incident-list p { - margin: 4px 0 6px; - overflow-wrap: anywhere; - font-size: 12px; - line-height: 1.45; - color: var(--muted); -} -.incident-list small { - font: - 400 10px/1.4 'IBM Plex Mono', - monospace; - color: #aaa; -} -.incident-list .incident-raw { - display: block; - margin: -1px 0 5px; - overflow-wrap: anywhere; -} .settings-main { width: min(760px, calc(100% - 48px)); margin: 0 auto; @@ -1532,13 +1160,6 @@ button { .form-actions.compact-actions { grid-column: span 2; } - .sla-grid { - grid-template-columns: repeat(3, 1fr); - } - .detail-grid, - .detail-grid.lower-grid { - grid-template-columns: 1fr; - } } @media (max-width: 760px) { @@ -1566,29 +1187,6 @@ button { .form-actions button { flex: 1; } - .detail-hero { - align-items: flex-start; - flex-direction: column; - } - .detail-actions { - flex-wrap: wrap; - } - .config-row { - flex-wrap: wrap; - } - .config-danger { - align-items: flex-start; - flex-direction: column; - } - .detail-title h1 { - font-size: 34px; - } - .sla-grid { - grid-template-columns: repeat(2, 1fr); - } - .sla-card.incident-summary { - grid-column: 1 / -1; - } .settings-main { width: min(100% - 32px, 760px); } @@ -1674,21 +1272,6 @@ button { .row-action-icon { width: 40px; } - .detail-title { - align-items: flex-start; - } - .status-orb { - margin-top: 11px; - } - .sla-grid { - grid-template-columns: 1fr; - } - .sla-card.incident-summary { - grid-column: auto; - } - .data-panel-heading { - padding: 16px; - } .settings-heading h1 { font-size: 34px; } @@ -1750,17 +1333,6 @@ button { } } -.incident-detail-link { - display: inline-flex; - align-items: center; - gap: 10px; - border: 0; - padding: 0; - background: transparent; - color: inherit; - cursor: pointer; -} - @media (max-width: 640px) { .panel-heading { grid-template-columns: 1fr; diff --git a/src/client/styles/MonitorDetailPage.css b/src/client/styles/MonitorDetailPage.css new file mode 100644 index 0000000..7c66978 --- /dev/null +++ b/src/client/styles/MonitorDetailPage.css @@ -0,0 +1,879 @@ +/* ========================================================================== + Monitor Detail + ========================================================================== */ + +.detail-main { + padding-top: 34px; +} + +.detail-hero { + display: flex; + align-items: flex-end; + justify-content: space-between; + gap: 32px; + margin-top: 34px; + padding-bottom: 36px; + border-bottom: 1px solid #e7e7e7; +} + +.detail-title { + display: flex; + align-items: center; + gap: 18px; + min-width: 0; +} + +.status-orb { + flex: 0 0 auto; + width: 16px; + height: 16px; + border: 4px solid #f2d4d4; + border-radius: 50%; + background: #c74f4f; + box-shadow: 0 0 0 8px #fff; +} + +.status-orb.online { + border-color: #c5f1df; + background: var(--primary-deep); +} + +.status-orb.pending { + border-color: #f6e2c8; + background: #d8892f; +} + +.status-orb.checking { + border-color: #eee5bd; + background: #c6aa38; +} + +.detail-title h1 { + margin: 0; + overflow: hidden; + font-size: 40px; + font-weight: 500; + line-height: 1.1; + letter-spacing: -1.5px; + text-overflow: ellipsis; + white-space: nowrap; +} + +.detail-title a { + display: inline-flex; + align-items: center; + gap: 6px; + max-width: min(70vw, 680px); + margin-top: 9px; + overflow: hidden; + font: + 400 13px/1.4 'IBM Plex Mono', + monospace; + color: var(--muted); + text-overflow: ellipsis; + white-space: nowrap; +} + +.detail-title a:hover { + color: var(--primary-deep); +} + +.detail-title a svg { + flex: 0 0 auto; + width: 13px; + height: 13px; +} + +.detail-actions { + display: flex; + align-items: center; + gap: 18px; +} + +.muted-alert { + display: inline-flex; + align-items: center; + gap: 6px; + font-size: 12px; + color: var(--muted); +} + +.muted-alert svg { + width: 14px; + height: 14px; +} + +.sla-grid { + display: grid; + grid-template-columns: repeat(5, 1fr); + gap: 12px; + margin-top: 24px; +} + +.sla-card { + min-width: 0; + padding: 20px; + border: 1px solid #e3e3e3; + border-radius: 8px; + background: #fff; +} + +.sla-card p { + margin: 0 0 17px; + font-size: 12px; + color: var(--muted); +} + +.sla-card strong { + display: block; + font: + 500 23px/1 'IBM Plex Mono', + monospace; + letter-spacing: -1px; +} + +.sla-card span { + display: block; + margin-top: 11px; + overflow: hidden; + font-size: 11px; + color: var(--faint); + text-overflow: ellipsis; + white-space: nowrap; +} + +.sla-card.incident-summary { + background: #fafafa; +} + +.sla-card.incident-summary.has-incident { + border-color: #e8c3c3; + background: #fff8f8; +} + +.sla-card.incident-summary.has-incident strong { + color: #a83e3e; +} + +.detail-grid { + display: grid; + grid-template-columns: minmax(0, 1.55fr) minmax(300px, 0.75fr); + gap: 16px; + margin-top: 16px; +} + +.detail-grid.lower-grid { + align-items: stretch; +} + +.lower-grid > .data-panel { + height: 100%; +} + +.data-panel { + overflow: hidden; + border: 1px solid #dedede; + border-radius: 8px; + background: #fff; +} + +.data-panel-heading { + display: flex; + align-items: center; + justify-content: space-between; + gap: 20px; + min-height: 82px; + padding: 18px 22px; + border-bottom: 1px solid #ededed; +} + +.data-panel-heading .overline { + margin-bottom: 5px; +} + +.data-panel-heading h2 { + margin: 0; + font-size: 18px; + font-weight: 500; +} + +.data-panel-heading > span { + font: + 400 11px/1.4 'IBM Plex Mono', + monospace; + color: var(--faint); +} + +.configuration-panel { + margin-top: 16px; +} + +.config-list { + margin: 0; +} + +.config-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 20px; + padding: 14px 22px; + border-bottom: 1px solid #f0f0f0; +} + +.config-row:last-child { + border-bottom: 0; +} + +.config-row dt { + font-size: 12px; + color: var(--muted); +} + +.config-row dd { + margin: 0; + font: + 400 13px/1.4 'IBM Plex Mono', + monospace; + color: var(--ink); +} + +.config-row .config-row-actions { + display: flex; + align-items: center; + gap: 10px; +} + +.config-row-actions .row-action { + font-family: 'DM Sans', 'Helvetica Neue', sans-serif; +} + +.config-danger { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + padding: 16px 22px; + border-top: 1px solid #ededed; + background: #fdfafa; +} + +.config-danger p { + margin: 0; + font-size: 12px; + color: var(--muted); +} + +.chart-panel, +.uptime-panel { + min-height: 330px; +} + +.sparkline-wrap { + position: relative; + height: 245px; + padding: 26px 24px 24px; + background: linear-gradient(180deg, #fdfefe, #fff); +} + +.chart-scale { + position: absolute; + inset: 19px 22px 20px auto; + display: flex; + flex-direction: column; + justify-content: space-between; + pointer-events: none; + font: + 400 9px/1 'IBM Plex Mono', + monospace; + color: #aaa; +} + +.uptime-bar { + height: 148px; + padding: 24px 22px 18px; + background: linear-gradient(180deg, #fcfefd 0%, #fff 100%); +} + +.uptime-legend { + display: flex; + justify-content: space-between; + padding: 14px 22px 0; + border-top: 1px solid #f0f0f0; + font-size: 10px; + color: #999; +} + +.uptime-legend span { + display: inline-flex; + align-items: center; + gap: 5px; +} + +.uptime-legend i { + width: 6px; + height: 6px; + border-radius: 50%; + background: var(--primary-deep); +} + +.uptime-legend i.legend-down { + margin-left: 5px; + background: var(--chart-down); +} + +.uptime-legend i.legend-degraded { + margin-left: 5px; + background: var(--chart-degraded); +} + +.data-table-wrap { + overflow-x: auto; +} + +.recent-checks-panel { + display: flex; + min-height: 0; + flex-direction: column; +} + +.recent-checks-scroll, +.incident-list { + max-height: clamp(320px, 52vh, 556px); + overflow: auto; + overscroll-behavior: contain; + scrollbar-color: #b8c7c0 #f4f6f5; + scrollbar-gutter: stable; + scrollbar-width: thin; +} + +.recent-checks-scroll:focus-visible, +.incident-list:focus-visible { + outline: 2px solid rgb(36 180 126 / 0.45); + outline-offset: -2px; +} + +.recent-checks-scroll::-webkit-scrollbar, +.incident-list::-webkit-scrollbar { + width: 9px; + height: 9px; +} + +.recent-checks-scroll::-webkit-scrollbar-track, +.incident-list::-webkit-scrollbar-track { + background: #f4f6f5; +} + +.recent-checks-scroll::-webkit-scrollbar-thumb, +.incident-list::-webkit-scrollbar-thumb { + border: 2px solid #f4f6f5; + border-radius: 999px; + background: #b8c7c0; +} + +.recent-checks-scroll::-webkit-scrollbar-thumb:hover, +.incident-list::-webkit-scrollbar-thumb:hover { + background: #91a69d; +} + +.incident-list { + min-height: 0; +} + +.incident-list article { + display: flex; + gap: 13px; + padding: 18px 20px; +} + +.incident-list article > div { + min-width: 0; +} + +.incident-list article + article { + border-top: 1px solid #ededed; +} + +.incident-list article > span { + display: grid; + flex: 0 0 auto; + width: 30px; + height: 30px; + place-items: center; + border-radius: 50%; + color: #16885b; + background: #eaf9f2; +} + +.incident-list article.open > span { + color: #aa4141; + background: #fff0f0; +} + +.incident-list article svg { + width: 15px; + height: 15px; +} + +.incident-list strong { + font-size: 13px; + font-weight: 500; +} + +.incident-list p { + margin: 4px 0 6px; + overflow-wrap: anywhere; + font-size: 12px; + line-height: 1.45; + color: var(--muted); +} + +.incident-list small { + font: + 400 10px/1.4 'IBM Plex Mono', + monospace; + color: #aaa; +} + +.incident-list .incident-raw { + display: block; + margin: -1px 0 5px; + overflow-wrap: anywhere; +} + +.incident-detail-link { + display: inline-flex; + align-items: center; + gap: 10px; + padding: 0; + border: 0; + color: inherit; + background: transparent; + cursor: pointer; +} + +@media (max-width: 1000px) { + .sla-grid { + grid-template-columns: repeat(3, 1fr); + } + + .detail-grid, + .detail-grid.lower-grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 760px) { + .detail-hero { + align-items: flex-start; + flex-direction: column; + } + + .detail-actions { + flex-wrap: wrap; + } + + .config-row { + flex-wrap: wrap; + } + + .config-danger { + align-items: flex-start; + flex-direction: column; + } + + .detail-title h1 { + font-size: 34px; + } + + .sla-grid { + grid-template-columns: repeat(2, 1fr); + } + + .sla-card.incident-summary { + grid-column: 1 / -1; + } +} + +@media (max-width: 520px) { + .detail-title { + align-items: flex-start; + } + + .status-orb { + margin-top: 11px; + } + + .sla-grid { + grid-template-columns: 1fr; + } + + .sla-card.incident-summary { + grid-column: auto; + } + + .data-panel-heading { + padding: 16px; + } +} + +/* Dark operations console. */ + +.dark .detail-main { + position: relative; + isolation: isolate; +} + +.dark .detail-main::before { + position: absolute; + z-index: -1; + top: -110px; + left: 50%; + width: min(920px, 92vw); + height: 430px; + background: + radial-gradient(circle at 35% 20%, rgb(62 207 142 / 0.075), transparent 45%), + linear-gradient(90deg, rgb(255 255 255 / 0.018) 1px, transparent 1px), linear-gradient(rgb(255 255 255 / 0.018) 1px, transparent 1px); + background-size: + auto, + 44px 44px, + 44px 44px; + content: ''; + mask-image: linear-gradient(to bottom, #000 0%, transparent 82%); + pointer-events: none; + transform: translateX(-50%); +} + +.dark .back-link { + color: #858d9a; + transition: color 160ms ease; +} + +.dark .back-link:hover { + color: #f3f4f6; +} + +.dark .back-link svg { + color: #4ade80; +} + +.dark .detail-hero { + border-bottom-color: rgb(255 255 255 / 0.09); +} + +.dark .detail-title h1 { + color: #f8fafc; + text-shadow: 0 1px 18px rgb(0 0 0 / 0.22); +} + +.dark .detail-title a { + color: #929aa7; +} + +.dark .detail-title a:hover { + color: #4ade80; +} + +.dark .status-orb { + border-color: rgb(248 113 113 / 0.24); + background: #f87171; + box-shadow: + 0 0 0 8px #090b0d, + 0 0 22px rgb(248 113 113 / 0.32); +} + +.dark .status-orb.online { + border-color: rgb(62 207 142 / 0.22); + background: #3ecf8e; + box-shadow: + 0 0 0 8px #090b0d, + 0 0 24px rgb(62 207 142 / 0.38); +} + +.dark .status-orb.pending { + border-color: rgb(245 158 11 / 0.24); + background: #f0a440; + box-shadow: + 0 0 0 8px #090b0d, + 0 0 22px rgb(245 158 11 / 0.28); +} + +.dark .status-orb.checking { + border-color: rgb(250 204 21 / 0.22); + background: #e6c94b; + box-shadow: + 0 0 0 8px #090b0d, + 0 0 22px rgb(250 204 21 / 0.25); +} + +.dark .muted-alert { + color: #929aa7; +} + +.dark .sla-card { + position: relative; + border-color: rgb(255 255 255 / 0.085); + background: linear-gradient(145deg, #13161b 0%, #0f1115 100%); + box-shadow: + 0 10px 26px rgb(0 0 0 / 0.22), + inset 0 1px rgb(255 255 255 / 0.035); + transition: + border-color 180ms ease, + transform 180ms ease, + box-shadow 180ms ease; +} + +.dark .sla-card::before { + position: absolute; + top: -1px; + left: 20px; + width: 34px; + height: 1px; + background: rgb(62 207 142 / 0.65); + content: ''; +} + +.dark .sla-card p { + color: #929aa7; +} + +.dark .sla-card strong { + color: #f4f7f6; +} + +.dark .sla-card span { + color: #737c89; +} + +.dark .sla-card.incident-summary { + background: linear-gradient(145deg, #15171b 0%, #101216 100%); +} + +.dark .sla-card.incident-summary::before { + background: rgb(148 163 184 / 0.48); +} + +.dark .sla-card.incident-summary.has-incident { + border-color: rgb(248 113 113 / 0.3); + background: linear-gradient(145deg, rgb(73 28 31 / 0.58), #151114 100%); +} + +.dark .sla-card.incident-summary.has-incident::before { + background: #f87171; +} + +.dark .sla-card.incident-summary.has-incident strong { + color: #fca5a5; +} + +@media (hover: hover) { + .dark .sla-card:hover { + border-color: rgb(62 207 142 / 0.24); + box-shadow: + 0 14px 34px rgb(0 0 0 / 0.3), + 0 0 0 1px rgb(62 207 142 / 0.035), + inset 0 1px rgb(255 255 255 / 0.05); + transform: translateY(-2px); + } +} + +.dark .data-panel { + border-color: rgb(255 255 255 / 0.085); + background: #101216; + box-shadow: + 0 16px 38px rgb(0 0 0 / 0.27), + inset 0 1px rgb(255 255 255 / 0.03); +} + +.dark .data-panel-heading { + border-bottom-color: rgb(255 255 255 / 0.075); + background: linear-gradient(180deg, rgb(255 255 255 / 0.022), transparent); +} + +.dark .data-panel-heading h2 { + color: #f3f5f7; +} + +.dark .data-panel-heading > span { + color: #7e8794; +} + +.dark .sparkline-wrap, +.dark .uptime-bar { + background: linear-gradient(180deg, rgb(62 207 142 / 0.025), transparent 55%), #0d0f13; +} + +.dark .sparkline-wrap .recharts-cartesian-grid line { + stroke: rgb(255 255 255 / 0.075); +} + +.dark .chart-scale { + color: #68717e; +} + +.dark .monitor-chart-tooltip { + border-color: rgb(255 255 255 / 0.12); + color: #e5e7eb; + background: rgb(19 22 27 / 0.96); + box-shadow: + 0 16px 40px rgb(0 0 0 / 0.55), + inset 0 1px rgb(255 255 255 / 0.045); +} + +.dark .uptime-legend { + border-top-color: rgb(255 255 255 / 0.065); + color: #747d89; + background: #0f1115; +} + +.dark .recent-checks-scroll, +.dark .incident-list { + scrollbar-color: #3c4650 #0c0e11; +} + +.dark .recent-checks-scroll::-webkit-scrollbar-track, +.dark .incident-list::-webkit-scrollbar-track { + background: #0c0e11; +} + +.dark .recent-checks-scroll::-webkit-scrollbar-thumb, +.dark .incident-list::-webkit-scrollbar-thumb { + border-color: #0c0e11; + background: #3c4650; +} + +.dark .recent-checks-scroll::-webkit-scrollbar-thumb:hover, +.dark .incident-list::-webkit-scrollbar-thumb:hover { + background: #53606b; +} + +.dark .recent-checks-panel [data-slot='table-row'] { + transition: background-color 140ms ease; +} + +.dark .recent-checks-panel [data-slot='table-body'] [data-slot='table-row']:hover { + background: rgb(255 255 255 / 0.022); +} + +.dark .recent-checks-panel code { + color: #c7ced7; +} + +.dark .incident-list article + article { + border-top-color: rgb(255 255 255 / 0.065); +} + +.dark .incident-list article { + transition: background-color 140ms ease; +} + +.dark .incident-list article:hover { + background: rgb(255 255 255 / 0.022); +} + +.dark .incident-list article > span { + color: #4ade80; + background: rgb(62 207 142 / 0.105); + box-shadow: inset 0 0 0 1px rgb(62 207 142 / 0.12); +} + +.dark .incident-list article.open > span { + color: #f87171; + background: rgb(248 113 113 / 0.1); + box-shadow: inset 0 0 0 1px rgb(248 113 113 / 0.14); +} + +.dark .incident-list strong { + color: #e8ebef; +} + +.dark .incident-detail-link:hover strong { + color: #4ade80; +} + +.dark .incident-list p { + color: #9ca3af; +} + +.dark .incident-list small { + color: #747d89; +} + +.dark .config-row { + border-bottom-color: rgb(255 255 255 / 0.065); + transition: background-color 140ms ease; +} + +.dark .config-row:hover { + background: rgb(255 255 255 / 0.018); +} + +.dark .config-row dt { + color: #929aa7; +} + +.dark .config-row dd { + color: #e5e7eb; +} + +.dark .config-row-actions > span { + color: #4ade80; +} + +.dark .config-danger { + border-top-color: rgb(248 113 113 / 0.14); + background: linear-gradient(90deg, rgb(127 29 29 / 0.11), transparent 52%), #111215; +} + +.dark .config-danger p { + color: #929aa7; +} + +.dark .detail-hero, +.dark .sla-grid, +.dark .detail-grid, +.dark .configuration-panel { + animation: monitor-detail-enter 420ms both cubic-bezier(0.22, 1, 0.36, 1); +} + +.dark .sla-grid { + animation-delay: 45ms; +} + +.dark .detail-grid { + animation-delay: 90ms; +} + +.dark .detail-grid.lower-grid { + animation-delay: 135ms; +} + +.dark .configuration-panel { + animation-delay: 180ms; +} + +@keyframes monitor-detail-enter { + from { + opacity: 0; + transform: translateY(8px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@media (max-width: 520px) { + .dark .detail-main::before { + top: -80px; + height: 330px; + background-size: + auto, + 34px 34px, + 34px 34px; + } + + .dark .sla-card { + padding: 18px; + } +}