+
-
@@ -601,12 +633,16 @@
setInterval(update, 60000);
// combobox
- const trigger = document.querySelector("#combobox-trigger");
- const dropdown = document.querySelector("#combobox-dropdown");
+ const triggers = document.querySelectorAll(".combobox-trigger");
- trigger.addEventListener("click", (e) => {
- trigger.classList.toggle("open");
- dropdown.classList.toggle("open");
+ triggers.forEach((trigger) => {
+ trigger.addEventListener("click", () => {
+ const parent = trigger.parentElement;
+ const dropdown = parent.querySelector(".combobox-dropdown");
+
+ trigger.classList.toggle("open");
+ dropdown.classList.toggle("open");
+ });
});
diff --git a/www/styles.css b/www/styles.css
index e52e962..f399424 100644
--- a/www/styles.css
+++ b/www/styles.css
@@ -62,7 +62,7 @@
}
body {
- background-color: #fcfcfc;
+ background-color: #fafafa;
font-family: "Inter", sans-serif;
height: 100vh;
margin: 0;
@@ -74,7 +74,7 @@ body::before {
content: "";
position: fixed;
inset: 0;
- background-image: linear-gradient(90deg, rgba(0, 0, 0, 0.04) 1px, transparent 1px), linear-gradient(rgba(0, 0, 0, 0.04) 1px, transparent 1px);
+ background-image: linear-gradient(90deg, rgba(0, 0, 0, 0.05) 1px, transparent 1px), linear-gradient(rgba(0, 0, 0, 0.05) 1px, transparent 1px);
background-size: 48px 48px;
background-position: center;
pointer-events: none;
diff --git a/www/themes/color-dark.css b/www/themes/color-dark.css
new file mode 100644
index 0000000..a8dbcd1
--- /dev/null
+++ b/www/themes/color-dark.css
@@ -0,0 +1,146 @@
+/* Colored Dark Mode Theme */
+body {
+ background-color: #0a0f1a;
+ color: #e0e7ff;
+}
+
+/* Grid */
+body::before {
+ background-image: linear-gradient(90deg, rgba(59, 130, 246, 0.08) 1px, transparent 1px),
+ linear-gradient(rgba(59, 130, 246, 0.08) 1px, transparent 1px);
+}
+
+main {
+ background-color: #111827;
+ outline: 1px solid rgba(59, 130, 246, 0.15);
+}
+
+hr {
+ border-bottom: 2px dotted rgba(224, 231, 255, 0.2);
+}
+
+#emoticon {
+ color: #60a5fa;
+}
+
+#overall-status {
+ background-color: #1e40af;
+ color: #e0e7ff;
+}
+
+#pattern {
+ background-image: repeating-linear-gradient(-45deg, #1e40af, #1e40af 10px, transparent 0px, transparent 20px);
+}
+
+#last-updated {
+ color: rgba(224, 231, 255, 0.7);
+}
+
+.service-name {
+ color: #e2e8f0;
+}
+
+.service-name svg {
+ color: rgba(59, 130, 246, 0.4);
+}
+
+.service-name:hover svg {
+ color: rgba(96, 165, 250, 0.9);
+}
+
+/* Tooltip */
+.bars > div:hover .status-bar::after {
+ background-color: #1e293b;
+ color: #f1f5f9;
+ border: 1px solid rgba(38, 89, 172, 0.2);
+}
+
+.status-bar.Online {
+ background-color: #10b981;
+ border-color: #059669;
+}
+
+.status-bar.Unknown {
+ background: radial-gradient(circle at center, #475569 3px, transparent 3px);
+}
+
+.status-bar.Degraded {
+ background-color: #f59e0b;
+ border-color: #d97706;
+ background-image: linear-gradient(
+ 45deg,
+ rgba(0, 0, 0, 0.2) 25%,
+ transparent 25%,
+ transparent 50%,
+ rgba(0, 0, 0, 0.2) 50%,
+ rgba(0, 0, 0, 0.2) 75%,
+ transparent 75%,
+ transparent
+ );
+ background-size: 8px 8px;
+}
+
+.status-bar.Offline {
+ background-color: #dc2626;
+ border-color: #b91c1c;
+}
+
+.status-bar.Offline::before {
+ color: #fef2f2;
+}
+
+.bars-footer {
+ color: rgba(224, 231, 255, 0.6);
+}
+
+.bars-footer hr {
+ border-color: rgba(224, 231, 255, 0.15);
+}
+
+.uptime-percentage {
+ background-color: #111827;
+ color: rgba(96, 165, 250, 0.8);
+}
+
+footer a {
+ color: #60a5fa;
+}
+
+footer a:hover {
+ color: #93c5fd;
+}
+
+/* Combobox */
+.combobox-trigger {
+ color: #e0e7ff;
+ background-color: #1e293b;
+ border: 1px solid rgba(71, 85, 105, 0.6);
+}
+
+.combobox-trigger:hover {
+ background-color: #334155;
+ border-color: rgba(96, 165, 250, 0.5);
+}
+
+.combobox-trigger div {
+ border-left: 1px solid rgba(71, 85, 105, 0.6);
+}
+
+.combobox-dropdown {
+ background-color: #1e293b;
+ border: 1px solid rgba(59, 130, 246, 0.4);
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
+}
+
+.combobox-option {
+ color: #e2e8f0;
+}
+
+.combobox-option.selected {
+ background-color: rgba(59, 130, 246, 0.15);
+}
+
+.combobox-option:hover {
+ background-color: #2563eb;
+ color: white;
+}
diff --git a/www/themes/color.css b/www/themes/color.css
new file mode 100644
index 0000000..98e10de
--- /dev/null
+++ b/www/themes/color.css
@@ -0,0 +1,142 @@
+/* Colored Theme */
+
+body {
+ background-color: rgba(37, 99, 235, 0.04);
+}
+
+body::before {
+ background-image: linear-gradient(90deg, rgba(37, 99, 235, 0.1) 1px, transparent 1px), linear-gradient(rgba(37, 99, 235, 0.1) 1px, transparent 1px);
+}
+
+main {
+ background-color: #f8fafc;
+ outline: 1px solid rgba(37, 99, 235, 0.1);
+}
+
+hr {
+ border-bottom: 2px dotted rgba(15, 23, 42, 0.15);
+}
+
+#emoticon {
+ color: #2563eb;
+}
+
+#overall-status {
+ background-color: #2563eb;
+ color: white;
+}
+
+#pattern {
+ background-image: repeating-linear-gradient(-45deg, #2563eb, #2563eb 10px, transparent 0px, transparent 20px);
+}
+
+#last-updated {
+ color: rgba(15, 23, 42, 0.6);
+}
+
+.service-name {
+ color: #0f172a;
+}
+
+.service-name svg {
+ color: rgba(37, 99, 235, 0.4);
+}
+
+.service-name:hover svg {
+ color: rgba(37, 99, 235, 0.9);
+}
+
+.bars > div:hover .status-bar::after {
+ background-color: #0f172a;
+ color: white;
+}
+
+.status-bar.Online {
+ background-color: #22c55e;
+ border-color: #16a34a;
+}
+
+.bars > div:hover .status-bar.Online {
+ background-color: #16a34a;
+}
+
+.status-bar.Degraded {
+ background-color: #facc15;
+ border-color: #eab308;
+ background-image: linear-gradient(
+ 45deg,
+ rgba(255, 255, 255, 0.4) 25%,
+ transparent 25%,
+ transparent 50%,
+ rgba(255, 255, 255, 0.4) 50%,
+ rgba(255, 255, 255, 0.4) 75%,
+ transparent 75%,
+ transparent
+ );
+ background-size: 8px 8px;
+}
+
+.status-bar.Offline {
+ background-color: #ef4444;
+ border-color: #dc2626;
+}
+
+.status-bar.Offline::before {
+ color: white;
+}
+
+.status-bar.Unknown {
+ background: radial-gradient(circle at center, #94a3b8 3px, transparent 3px);
+}
+
+.bars-footer {
+ color: rgba(15, 23, 42, 0.45);
+}
+
+.bars-footer hr {
+ border-color: rgba(15, 23, 42, 0.15);
+}
+
+.uptime-percentage {
+ background-color: #f8fafc;
+ color: rgba(37, 99, 235, 0.75);
+}
+
+footer a {
+ color: #2563eb;
+}
+
+footer a:hover {
+ color: #1e40af;
+}
+
+.combobox-trigger {
+ background-color: white;
+ border: 1px solid rgba(15, 23, 42, 0.4);
+}
+
+.combobox-trigger:hover {
+ background-color: rgba(37, 99, 235, 0.05);
+}
+
+.combobox-trigger div {
+ border-left: 1px solid rgba(15, 23, 42, 0.4);
+}
+
+.combobox-dropdown {
+ background-color: white;
+ border: 1px solid rgba(15, 23, 42, 0.4);
+}
+
+.combobox-option {
+ color: #0f172a;
+}
+
+.combobox-option.selected {
+ background-color: rgba(37, 99, 235, 0.12);
+}
+
+.combobox-option:hover {
+ background-color: #2563eb;
+ color: white;
+}
diff --git a/www/themes/ctp-frappe.css b/www/themes/ctp-frappe.css
new file mode 100644
index 0000000..e236372
--- /dev/null
+++ b/www/themes/ctp-frappe.css
@@ -0,0 +1,151 @@
+/* Catppuccin Frappé Theme */
+body {
+ background-color: #303446; /* Base */
+ color: #c6d0f5; /* Text */
+}
+
+/* Grid */
+body::before {
+ background-image: linear-gradient(90deg, rgba(140, 170, 238, 0.08) 1px, transparent 1px),
+ linear-gradient(rgba(140, 170, 238, 0.08) 1px, transparent 1px);
+}
+
+main {
+ background-color: #292c3c; /* Mantle */
+ outline: 1px solid rgba(140, 170, 238, 0.12);
+}
+
+hr {
+ border-bottom: 2px dotted rgba(140, 170, 238, 0.4); /* Blue */
+}
+
+#emoticon {
+ color: #8caaee; /* Blue */
+}
+
+#overall-status {
+ background-color: #8caaee; /* Blue */
+ color: #292c3c; /* Mantle */
+}
+
+#pattern {
+ background-image: repeating-linear-gradient(-45deg, #8caaee, #8caaee 10px, transparent 0px, transparent 20px);
+}
+
+#last-updated {
+ color: rgba(165, 173, 206, 0.6); /* Overlay2 */
+}
+
+.service-name {
+ color: #c6d0f5; /* Text */
+}
+
+.service-name svg {
+ color: rgba(140, 170, 238, 0.4); /* Blue faded */
+}
+
+.service-name:hover svg {
+ color: #8caaee; /* Blue */
+}
+
+/* Tooltip */
+.bars > div:hover .status-bar::after {
+ background-color: #292c3c; /* Crust */
+ color: #c6d0f5; /* Text */
+ border: 1px solid rgba(140, 170, 238, 0.3);
+}
+
+.status-bar.Online {
+ background-color: #a6d189; /* Green */
+ border-color: #a6d189; /* Green */
+}
+
+.bars > div:hover .status-bar.Online {
+ background-color: #81c563;
+}
+
+.status-bar.Unknown {
+ background: radial-gradient(circle at center, #414559 3px, transparent 3px); /* Surface0 */
+}
+
+.status-bar.Degraded {
+ background-color: #e5c890; /* Yellow */
+ border-color: #e5c890; /* Yellow */
+ background-image: linear-gradient(
+ 45deg,
+ rgba(35, 38, 52, 0.2) 25%,
+ transparent 25%,
+ transparent 50%,
+ rgba(35, 38, 52, 0.2) 50%,
+ rgba(35, 38, 52, 0.2) 75%,
+ transparent 75%,
+ transparent
+ );
+ background-size: 8px 8px;
+}
+
+.status-bar.Offline {
+ background-color: #e78284; /* Red */
+ border-color: #e78284; /* Red */
+}
+
+.status-bar.Offline::before {
+ color: #292c3c; /* Mantle */
+}
+
+.bars-footer {
+ color: rgba(140, 170, 238, 0.5); /* Blue */
+}
+
+.bars-footer hr {
+ border-color: rgba(140, 170, 238, 0.2); /* Blue */
+}
+
+.uptime-percentage {
+ background-color: #292c3c; /* Mantle */
+ color: rgba(140, 170, 238, 0.85); /* Blue */
+}
+
+footer a {
+ color: #8caaee; /* Blue */
+}
+
+footer a:hover {
+ color: #8caaee; /* Blue */
+ filter: brightness(0.8);
+}
+
+/* Combobox */
+.combobox-trigger {
+ background-color: #232634; /* Crust */
+ color: #c6d0f5; /* Text */
+ border: 1px solid rgba(98, 104, 128, 0.6); /* Overlay1 */
+}
+
+.combobox-trigger:hover {
+ background-color: #292c3c; /* Mantle */
+ border-color: rgba(140, 170, 238, 0.5);
+}
+
+.combobox-trigger div {
+ border-left: 1px solid rgba(98, 104, 128, 0.6);
+}
+
+.combobox-dropdown {
+ background-color: #232634; /* Crust */
+ border: 1px solid rgba(140, 170, 238, 0.4);
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.4);
+}
+
+.combobox-option {
+ color: #c6d0f5; /* Text */
+}
+
+.combobox-option.selected {
+ background-color: rgba(140, 170, 238, 0.15);
+}
+
+.combobox-option:hover {
+ background-color: #8caaee; /* Blue */
+ color: #292c3c; /* Mantle */
+}
diff --git a/www/themes/ctp-latte.css b/www/themes/ctp-latte.css
new file mode 100644
index 0000000..e110f53
--- /dev/null
+++ b/www/themes/ctp-latte.css
@@ -0,0 +1,151 @@
+/* Catppuccin Latte Theme */
+body {
+ background-color: #eff1f5; /* Base */
+ color: #4c4f69; /* Text */
+}
+
+/* Grid */
+body::before {
+ background-image: linear-gradient(90deg, rgba(30, 102, 245, 0.08) 1px, transparent 1px),
+ linear-gradient(rgba(30, 102, 245, 0.08) 1px, transparent 1px);
+}
+
+main {
+ background-color: #e6e9ef; /* Mantle */
+ outline: 1px solid rgba(30, 102, 245, 0.12);
+}
+
+hr {
+ border-bottom: 2px dotted rgba(30, 102, 245, 0.4); /* Blue */
+}
+
+#emoticon {
+ color: #1e66f5; /* Blue */
+}
+
+#overall-status {
+ background-color: #1e66f5; /* Blue */
+ color: #e6e9ef; /* Mantle */
+}
+
+#pattern {
+ background-image: repeating-linear-gradient(-45deg, #1e66f5, #1e66f5 10px, transparent 0px, transparent 20px);
+}
+
+#last-updated {
+ color: rgba(140, 143, 161, 1); /* Overlay2 */
+}
+
+.service-name {
+ color: #4c4f69; /* Text */
+}
+
+.service-name svg {
+ color: rgba(30, 102, 245, 0.4); /* Blue faded */
+}
+
+.service-name:hover svg {
+ color: #1e66f5; /* Blue */
+}
+
+/* Tooltip */
+.bars > div:hover .status-bar::after {
+ background-color: #e6e9ef; /* Mantle */
+ color: #4c4f69; /* Text */
+ border: 1px solid rgba(30, 102, 245, 0.3);
+}
+
+.status-bar.Online {
+ background-color: #40a02b; /* Green */
+ border-color: #40a02b; /* Green */
+}
+
+.bars > div:hover .status-bar.Online {
+ background-color: #357a22;
+}
+
+.status-bar.Unknown {
+ background: radial-gradient(circle at center, #ccd0da 3px, transparent 3px); /* Surface0 */
+}
+
+.status-bar.Degraded {
+ background-color: #df8e1d; /* Yellow */
+ border-color: #df8e1d; /* Yellow */
+ background-image: linear-gradient(
+ 45deg,
+ rgba(230, 233, 239, 0.3) 25%,
+ transparent 25%,
+ transparent 50%,
+ rgba(230, 233, 239, 0.3) 50%,
+ rgba(230, 233, 239, 0.3) 75%,
+ transparent 75%,
+ transparent
+ );
+ background-size: 8px 8px;
+}
+
+.status-bar.Offline {
+ background-color: #d20f39; /* Red */
+ border-color: #d20f39; /* Red */
+}
+
+.status-bar.Offline::before {
+ color: #e6e9ef; /* Mantle */
+}
+
+.bars-footer {
+ color: rgba(30, 102, 245, 0.6); /* Blue */
+}
+
+.bars-footer hr {
+ border-color: rgba(30, 102, 245, 0.2); /* Blue */
+}
+
+.uptime-percentage {
+ background-color: #e6e9ef; /* Mantle */
+ color: rgba(30, 102, 245, 0.85); /* Blue */
+}
+
+footer a {
+ color: #1e66f5; /* Blue */
+}
+
+footer a:hover {
+ color: #1e66f5; /* Blue */
+ filter: brightness(0.8);
+}
+
+/* Combobox */
+.combobox-trigger {
+ background-color: #dce0e8; /* Crust */
+ color: #4c4f69; /* Text */
+ border: 1px solid rgba(156, 160, 176, 0.6); /* Overlay1 */
+}
+
+.combobox-trigger:hover {
+ background-color: #d0d4db;
+ border-color: rgba(30, 102, 245, 0.5);
+}
+
+.combobox-trigger div {
+ border-left: 1px solid rgba(156, 160, 176, 0.6);
+}
+
+.combobox-dropdown {
+ background-color: #dce0e8; /* Crust */
+ border: 1px solid rgba(30, 102, 245, 0.4);
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
+}
+
+.combobox-option {
+ color: #4c4f69; /* Text */
+}
+
+.combobox-option.selected {
+ background-color: rgba(30, 102, 245, 0.15);
+}
+
+.combobox-option:hover {
+ background-color: #1e66f5; /* Blue */
+ color: white;
+}
diff --git a/www/themes/ctp-macchiato.css b/www/themes/ctp-macchiato.css
new file mode 100644
index 0000000..7681ebb
--- /dev/null
+++ b/www/themes/ctp-macchiato.css
@@ -0,0 +1,151 @@
+/* Catppuccin Macchiato Theme */
+body {
+ background-color: #24273a; /* Base */
+ color: #cad3f5; /* Text */
+}
+
+/* Grid */
+body::before {
+ background-image: linear-gradient(90deg, rgba(138, 173, 244, 0.08) 1px, transparent 1px),
+ linear-gradient(rgba(138, 173, 244, 0.08) 1px, transparent 1px);
+}
+
+main {
+ background-color: #1e2030; /* Mantle */
+ outline: 1px solid rgba(138, 173, 244, 0.12);
+}
+
+hr {
+ border-bottom: 2px dotted rgba(138, 173, 244, 0.4); /* Blue */
+}
+
+#emoticon {
+ color: #8aadf4; /* Blue */
+}
+
+#overall-status {
+ background-color: #8aadf4; /* Blue */
+ color: #1e2030; /* Mantle */
+}
+
+#pattern {
+ background-image: repeating-linear-gradient(-45deg, #8aadf4, #8aadf4 10px, transparent 0px, transparent 20px);
+}
+
+#last-updated {
+ color: rgba(165, 173, 203, 0.6); /* Overlay2 */
+}
+
+.service-name {
+ color: #cad3f5; /* Text */
+}
+
+.service-name svg {
+ color: rgba(138, 173, 244, 0.4); /* Blue faded */
+}
+
+.service-name:hover svg {
+ color: #8aadf4; /* Blue */
+}
+
+/* Tooltip */
+.bars > div:hover .status-bar::after {
+ background-color: #1e2030; /* Mantle */
+ color: #cad3f5; /* Text */
+ border: 1px solid rgba(138, 173, 244, 0.3);
+}
+
+.status-bar.Online {
+ background-color: #a6da95; /* Green */
+ border-color: #a6da95; /* Green */
+}
+
+.bars > div:hover .status-bar.Online {
+ background-color: #8bd074;
+}
+
+.status-bar.Unknown {
+ background: radial-gradient(circle at center, #363a4f 3px, transparent 3px); /* Surface0 */
+}
+
+.status-bar.Degraded {
+ background-color: #eed49f; /* Yellow */
+ border-color: #eed49f; /* Yellow */
+ background-image: linear-gradient(
+ 45deg,
+ rgba(30, 32, 48, 0.2) 25%,
+ transparent 25%,
+ transparent 50%,
+ rgba(30, 32, 48, 0.2) 50%,
+ rgba(30, 32, 48, 0.2) 75%,
+ transparent 75%,
+ transparent
+ );
+ background-size: 8px 8px;
+}
+
+.status-bar.Offline {
+ background-color: #ed8796; /* Red */
+ border-color: #ed8796; /* Red */
+}
+
+.status-bar.Offline::before {
+ color: #1e2030; /* Mantle */
+}
+
+.bars-footer {
+ color: rgba(138, 173, 244, 0.5); /* Blue */
+}
+
+.bars-footer hr {
+ border-color: rgba(138, 173, 244, 0.2); /* Blue */
+}
+
+.uptime-percentage {
+ background-color: #1e2030; /* Mantle */
+ color: rgba(138, 173, 244, 0.85); /* Blue */
+}
+
+footer a {
+ color: #8aadf4; /* Blue */
+}
+
+footer a:hover {
+ color: #8aadf4; /* Blue */
+ filter: brightness(0.8);
+}
+
+/* Combobox */
+.combobox-trigger {
+ background-color: #181926; /* Crust */
+ color: #cad3f5; /* Text */
+ border: 1px solid rgba(91, 96, 120, 0.6); /* Overlay1 */
+}
+
+.combobox-trigger:hover {
+ background-color: #1e2030; /* Mantle */
+ border-color: rgba(138, 173, 244, 0.5);
+}
+
+.combobox-trigger div {
+ border-left: 1px solid rgba(91, 96, 120, 0.6);
+}
+
+.combobox-dropdown {
+ background-color: #181926; /* Crust */
+ border: 1px solid rgba(138, 173, 244, 0.4);
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.4);
+}
+
+.combobox-option {
+ color: #cad3f5; /* Text */
+}
+
+.combobox-option.selected {
+ background-color: rgba(138, 173, 244, 0.15);
+}
+
+.combobox-option:hover {
+ background-color: #8aadf4; /* Blue */
+ color: #1e2030; /* Mantle */
+}
diff --git a/www/themes/ctp-mocha.css b/www/themes/ctp-mocha.css
new file mode 100644
index 0000000..e2e6fe0
--- /dev/null
+++ b/www/themes/ctp-mocha.css
@@ -0,0 +1,151 @@
+/* Catppuccin Mocha Theme */
+body {
+ background-color: #1e1e2e; /* Base */
+ color: #cdd6f4; /* Text */
+}
+
+/* Grid */
+body::before {
+ background-image: linear-gradient(90deg, rgba(137, 180, 250, 0.08) 1px, transparent 1px),
+ linear-gradient(rgba(137, 180, 250, 0.08) 1px, transparent 1px);
+}
+
+main {
+ background-color: #181825; /* Mantle */
+ outline: 1px solid rgba(137, 180, 250, 0.12);
+}
+
+hr {
+ border-bottom: 2px dotted rgba(137, 180, 250, 0.4); /* Blue */
+}
+
+#emoticon {
+ color: #89b4fa; /* Blue */
+}
+
+#overall-status {
+ background-color: #89b4fa; /* Blue */
+ color: #181825; /* Mantle */
+}
+
+#pattern {
+ background-image: repeating-linear-gradient(-45deg, #89b4fa, #89b4fa 10px, transparent 0px, transparent 20px);
+}
+
+#last-updated {
+ color: rgba(166, 173, 200, 0.6); /* Overlay2 */
+}
+
+.service-name {
+ color: #cdd6f4; /* Text */
+}
+
+.service-name svg {
+ color: rgba(137, 180, 250, 0.4); /* Blue faded */
+}
+
+.service-name:hover svg {
+ color: #89b4fa; /* Blue */
+}
+
+/* Tooltip */
+.bars > div:hover .status-bar::after {
+ background-color: #181825; /* Mantle */
+ color: #cdd6f4; /* Text */
+ border: 1px solid rgba(137, 180, 250, 0.3);
+}
+
+.status-bar.Online {
+ background-color: #a6e3a1; /* Green */
+ border-color: #a6e3a1; /* Green */
+}
+
+.bars > div:hover .status-bar.Online {
+ background-color: #8ad882;
+}
+
+.status-bar.Unknown {
+ background: radial-gradient(circle at center, #313244 3px, transparent 3px); /* Surface0 */
+}
+
+.status-bar.Degraded {
+ background-color: #f9e2af; /* Yellow */
+ border-color: #f9e2af; /* Yellow */
+ background-image: linear-gradient(
+ 45deg,
+ rgba(24, 24, 37, 0.2) 25%,
+ transparent 25%,
+ transparent 50%,
+ rgba(24, 24, 37, 0.2) 50%,
+ rgba(24, 24, 37, 0.2) 75%,
+ transparent 75%,
+ transparent
+ );
+ background-size: 8px 8px;
+}
+
+.status-bar.Offline {
+ background-color: #f38ba8; /* Red */
+ border-color: #f38ba8; /* Red */
+}
+
+.status-bar.Offline::before {
+ color: #181825; /* Mantle */
+}
+
+.bars-footer {
+ color: rgba(137, 180, 250, 0.5); /* Blue */
+}
+
+.bars-footer hr {
+ border-color: rgba(137, 180, 250, 0.2); /* Blue */
+}
+
+.uptime-percentage {
+ background-color: #181825; /* Mantle */
+ color: rgba(137, 180, 250, 0.85); /* Blue */
+}
+
+footer a {
+ color: #89b4fa; /* Blue */
+}
+
+footer a:hover {
+ color: #89b4fa; /* Blue */
+ filter: brightness(0.8);
+}
+
+/* Combobox */
+.combobox-trigger {
+ background-color: #11111b; /* Crust */
+ color: #cdd6f4; /* Text */
+ border: 1px solid rgba(88, 91, 112, 0.6); /* Overlay1 */
+}
+
+.combobox-trigger:hover {
+ background-color: #181825; /* Mantle */
+ border-color: rgba(137, 180, 250, 0.5);
+}
+
+.combobox-trigger div {
+ border-left: 1px solid rgba(88, 91, 112, 0.6);
+}
+
+.combobox-dropdown {
+ background-color: #11111b; /* Crust */
+ border: 1px solid rgba(137, 180, 250, 0.4);
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.4);
+}
+
+.combobox-option {
+ color: #cdd6f4; /* Text */
+}
+
+.combobox-option.selected {
+ background-color: rgba(137, 180, 250, 0.15);
+}
+
+.combobox-option:hover {
+ background-color: #89b4fa; /* Blue */
+ color: #181825; /* Mantle */
+}
diff --git a/www/themes/inverted.css b/www/themes/inverted.css
new file mode 100644
index 0000000..54871ae
--- /dev/null
+++ b/www/themes/inverted.css
@@ -0,0 +1,4 @@
+/* Dark mode (inverted) theme */
+html {
+ filter: invert();
+}
diff --git a/www/themes/monochrome.css b/www/themes/monochrome.css
new file mode 100644
index 0000000..ee7cb70
--- /dev/null
+++ b/www/themes/monochrome.css
@@ -0,0 +1,130 @@
+/* Default Theme */
+body {
+ background-color: #fcfcfc;
+}
+
+/* Grid */
+body::before {
+ background-image: linear-gradient(90deg, rgba(0, 0, 0, 0.04) 1px, transparent 1px), linear-gradient(rgba(0, 0, 0, 0.04) 1px, transparent 1px);
+}
+
+main {
+ background-color: white;
+ outline: 1px solid rgba(0, 0, 0, 0.04);
+}
+
+hr {
+ border-bottom: 2px dotted rgba(0, 0, 0, 0.1);
+}
+
+#overall-status {
+ background-color: black;
+ color: white;
+}
+
+#pattern {
+ background-image: repeating-linear-gradient(-45deg, #000, #000 10px, transparent 0px, transparent 20px);
+}
+
+#last-updated {
+ color: rgba(0, 0, 0, 0.6);
+}
+
+.service-name {
+ color: black;
+}
+
+.service-name svg {
+ color: rgba(0, 0, 0, 0.2);
+}
+
+.service-name:hover svg {
+ color: rgba(0, 0, 0, 0.8);
+}
+
+.status-bar {
+ background-color: black;
+ border: 1px solid black;
+}
+
+/* Tooltip */
+.bars > div:hover .status-bar::after {
+ background-color: black;
+ color: white;
+}
+
+.bars > div:hover .status-bar.Online {
+ background-color: rgba(0, 0, 0, 0.7);
+}
+
+.status-bar.Unknown {
+ background-color: transparent;
+ background: radial-gradient(circle at center, rgb(235, 235, 235) 3px, transparent 3px);
+}
+
+.status-bar.Degraded {
+ background-image: linear-gradient(to bottom, transparent 30%, white 30%), linear-gradient(to right, transparent 40%, white 40%);
+ background-size: 6px 7px;
+ background-position: 3px 4px;
+}
+
+.status-bar.Offline {
+ background-color: white;
+}
+
+.status-bar.Offline::before {
+ color: black;
+}
+
+.bars-footer {
+ color: rgba(0, 0, 0, 0.4);
+}
+
+.bars-footer hr {
+ border-color: rgba(0, 0, 0, 0.1);
+}
+
+.uptime-percentage {
+ background-color: white;
+ color: rgba(0, 0, 0, 0.5);
+}
+
+footer a {
+ color: rgba(0, 0, 0, 0.3);
+}
+
+footer a:hover {
+ color: black;
+}
+
+/* Combobox */
+.combobox-trigger {
+ background-color: white;
+ border: 1px solid rgba(0, 0, 0, 0.5);
+}
+
+.combobox-trigger:hover {
+ background-color: rgba(0, 0, 0, 0.03);
+}
+
+.combobox-trigger div {
+ border-left: 1px solid rgba(0, 0, 0, 0.5);
+}
+
+.combobox-dropdown {
+ background-color: white;
+ border: 1px solid black;
+}
+
+.combobox-option {
+ color: black;
+}
+
+.combobox-option.selected {
+ background-color: rgba(0, 0, 0, 0.08);
+}
+
+.combobox-option:hover {
+ background-color: black;
+ color: white;
+}