Files
goaccess/resources/css/app.css
T
simonchiang 7436bf6e2e v1.10.2 patches: continent persistence, city markers, dynamic map center
C changes:
- gstorage.c: encode continent into root key for --persist --restore survival
- gholder.c: decode continent from root + lat/lng storage
- commons.h: add lat/lng fields to GMetrics struct
- geoip2.c/geoip1.h: extract coordinates from MMDB
- json.c: output lat/lng in geolocation JSON

JS changes:
- Remove cityIndex guard for static HTML city dots
- TopoJSON lat/lng fallback for city coordinates
- updateMap fallback city collection
- Dynamic orthographic center based on visitor count
- Mercator stays at [0,15] for full world view

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-25 11:38:09 +08:00

1760 lines
29 KiB
CSS

/* GLOBAL */
html,
body {
background: linear-gradient(to bottom, #fdfdfd 0%, #e3e3e3 50%, #e9e9e9 100%);
background-attachment: fixed;
color: #1e293b;
overflow-x: hidden;
}
h1 {
font-weight: bold;
letter-spacing: -3px;
margin: 0;
text-transform: lowercase;
}
h3 {
font-size: 21px;
letter-spacing: -1px;
}
.page-header {
border-bottom: 1px solid #e2e8f0;
margin: 2.5rem 0 2rem;
position: relative;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
gap: 0.5rem;
}
.pagination {
margin: 5px 0;
}
.clickable,
.expandable>td {
cursor: pointer;
}
.loading-container {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.spinner {
color: #999;
margin-bottom: 10px;
}
.app-loading-status {
color: #999;
text-align: center;
text-shadow: 1px 1px 0 #FFF;
text-transform: uppercase;
}
.powered {
bottom: 190px;
color: #9E9E9E;
font-size: smaller;
position: absolute;
right: 20px;
transform-origin: 100% 0;
transform: rotate(-90deg);
}
.powered a {
color: #636363;
}
.powered span {
color: #007bc3;
}
.dropdown-header {
color: #007bc3;
padding: 3px 25px;
text-transform: uppercase;
}
hgroup h2,
hgroup small {
text-transform: uppercase;
}
hgroup h2 {
letter-spacing: -1px;
}
/* NAVIGATION - dark base with subtle gradient */
nav {
background: linear-gradient(to bottom,
#1c1c1c 0%,
#171717 50%,
#121212 100%);
border-color: transparent;
height: 100%;
left: -236px;
overflow: hidden;
position: fixed;
top: 0;
width: 300px;
z-index: 2;
transition: left .2s;
}
/* Only apply shadow in light/default mode */
html:not(.dark) nav {
box-shadow: 2px 0 12px rgba(0, 0, 0, 0.4);
}
/* Navigation List */
nav .nav-list {
visibility: hidden;
display: none;
position: absolute;
bottom: 0;
left: 0;
right: -17px;
top: 0;
overflow-y: scroll;
}
/* Show Navigation List on Active */
nav.active .nav-list {
visibility: visible;
display: block;
}
/* Media Query for Large Screens */
@media only screen and (min-width: 993px) {
nav .nav-bars,
nav .nav-gears,
nav .nav-ws-status {
left: 0;
position: fixed;
top: 1.5rem;
transition: opacity .2s;
}
nav .nav-gears {
top: 7.9rem;
}
nav .nav-ws-status {
left: 38px;
top: 12.3rem;
}
nav.active .nav-list {
margin-block-start: 0;
}
}
/* Navigation Header */
nav header {
margin: 40px 20px 30px;
}
nav header a {
color: rgba(240, 240, 240, 0.9);
font-size: 2.7em;
font-weight: 300;
text-transform: uppercase;
}
nav header a:hover {
color: #ffffff;
}
/* Active Navigation */
nav.active {
display: block !important;
left: 0;
opacity: .98;
}
nav.active .nav-bars,
nav.active .nav-gears,
nav.active .nav-ws-status {
opacity: 0;
visibility: hidden;
}
/* Navigation Icons */
nav .nav-bars,
nav .nav-gears,
nav .nav-ws-status {
background: none;
border: none;
color: #bbbbbb;
font-size: 36px;
height: 60px;
width: 60px;
transition: opacity .2s;
}
nav .nav-bars:hover,
nav .nav-gears:hover {
color: #ffffff;
}
/* WebSocket Status */
nav .nav-ws-status,
.nav-ws-status.mini {
color: crimson;
cursor: help;
display: none;
font-size: 12px;
height: 12px;
width: 12px;
}
.nav-ws-status.mini {
top: 14px;
left: 40px;
position: absolute;
}
.nav-ws-status.fa-circle {
color: #5DB56A;
}
/* Navigation List Items */
nav li {
position: relative;
}
nav li .toggle-panel {
cursor: pointer;
opacity: 0;
padding: 9px 20px;
position: absolute;
right: 0;
top: 0;
transition: all .2s;
visibility: hidden;
}
nav li .toggle-panel i {
color: rgba(220, 220, 220, 0.6);
opacity: 0;
}
nav li .toggle-panel.active i {
color: #ffffff;
opacity: 1;
}
/* Show Toggle Panel in Active Navigation */
nav.active li .toggle-panel {
visibility: visible;
opacity: 1;
}
nav.active li:hover .toggle-panel i {
opacity: 1;
}
/* Navigation Links - fixed colors for dark background */
nav li a {
border-left: 3px solid transparent;
color: #bbbbbb;
display: block;
font-size: smaller;
max-width: 235px;
opacity: 0;
overflow: hidden;
padding: 9px 20px;
text-overflow: ellipsis;
text-transform: uppercase;
transition: all .2s;
white-space: nowrap;
}
nav.active li a {
max-width: 90%;
opacity: 1;
}
nav li:hover a,
nav li.active a {
/* subtle blue tint on dark */
border-color: #60a5fa;
color: #e0f0ff;
/* bright readable blue-white */
}
/* Unordered List */
nav ul {
padding-left: 0;
list-style: none;
}
/* Navigation Links */
nav a,
nav a:hover {
text-decoration: none;
}
/* Navigation Section Titles */
nav h3 {
color: #e0e0e0 !important;
font-size: medium;
font-weight: bold;
margin: 20px 25px 10px;
text-transform: uppercase;
}
/* CONTAINER */
@media (min-width: 768px) {
.container {
width: 750px;
}
}
.container-fluid {
margin-left: 75px;
}
@media (min-width: 1120px) {
.container {
width: 970px;
}
}
@media (min-width: 1320px) {
.container {
width: 1170px;
}
}
@media (max-width: 992px) {
.container-fluid {
margin-left: auto;
}
}
@media (max-width: 768px) {
.container-fluid {
padding-left: 5px;
padding-right: 5px;
}
}
/* PANEL STYLES */
#panels {
margin-block-end: 10px;
}
article header {
margin-block-end: 15px;
position: relative;
display: flex;
justify-content: space-between;
gap: 0.5em;
}
article h2 {
font-size: 1.8rem;
margin: 0;
}
article>div {
background: linear-gradient(to bottom, #ffffff, #f8fafc);
border: none;
border-radius: 12px;
margin-top: 16px;
padding: 24px 16px 16px;
box-shadow: 0 4px 10px rgb(0 0 0 / 0%), 0 2px 4px rgba(0, 0, 0, 0.06);
}
hgroup small {
font-size: smaller;
}
/* PANEL TABLES */
article table.table-borderless tbody tr td,
article table.table-borderless tbody tr th,
article table.table-borderless thead tr th {
border: none;
}
article thead th {
text-align: right;
border-bottom-width: 1px;
}
article table .string,
article table .date {
text-align: left;
}
article table .percent {
color: #898989;
}
article table td,
article table th {
white-space: nowrap;
overflow: hidden;
}
article table th.sortable {
cursor: pointer;
}
article table.table-borderless thead>tr.thead-cols th {
font-size: 78%;
text-transform: uppercase;
}
article table .cell-hl {
padding: 2px 3px;
color: #FFF;
border-radius: 5px;
display: block;
text-align: center;
}
article table .span-hl {
padding: 2px 3px;
border-radius: 3px;
color: #000;
}
article table .span-hl.g5 {
background: #e9ecef;
}
article table .cell-hl.b1 {
background: #7F669D;
}
article table .cell-hl.b2 {
background: #BA94D1;
}
article table .cell-hl.b3 {
background: #DEBACE;
}
article table .cell-hl.d1 {
background: #9d9d9d38;
}
article table .cell-hl.d2 {
background: #9d9d9d61;
}
article table .cell-hl.d3 {
background: #9d9d9d9c;
}
article table .cell-hl.d4 {
background: #9d9d9d;
}
article table .span-hl.lgrn {
background: #e6f4ea;
color: #137333;
}
article table .span-hl.lyel {
background: #fff3cd;
color: #d38a10;
}
article table .span-hl.lred {
background: #fce8e6;
color: #c5221f;
}
article table .span-hl.lgry {
background: #898989;
color: #ffffff;
}
article table .span-hl.lblu {
background: #cfe2ff;
color: #052c65;
}
article table .span-hl.lprp {
background: #cdc7ff;
color: #343150;
}
/* thead meta */
article table thead>tr.thead-min th.meta-label,
article table thead>tr.thead-avg th.meta-label,
article table tfoot>tr.tfoot-totals th.meta-label,
article table thead>tr.thead-max th.meta-label {
font-weight: bold;
text-transform: uppercase;
}
article table .thead-min,
article table .thead-avg,
article table .thead-max {
background: #f8fafc;
}
article table .thead-avg {
border-bottom: 2px solid #94a3b8;
}
article table thead>tr.thead-min th,
article table thead>tr.thead-avg th,
article table thead>tr.thead-max th {
font-size: smaller;
font-weight: normal;
padding: 3px 8px 3px 8px;
text-transform: inherit;
}
article table .thead-min th,
article table .thead-avg th,
article table .thead-max th {
padding: 3px;
}
article table tfoot>tr>th {
border-top: 1px dotted #cbd5e1;
padding: 8px;
}
/* thead data */
article table tbody.tbody-data tr td {
border-right: 1px solid #f1f5f9;
font-size: smaller;
}
article table tbody.tbody-data td:last-child {
border-right: none;
}
article table tbody.tbody-data td.row-idx {
font-weight: 700;
}
article table>thead>tr.thead-cols {
border-bottom: 2px solid #cbd5e1;
}
article table tbody.tbody-data tr.shaded {
background-color: #f8fafc;
}
article table tbody.tbody-data tr.child td:nth-child(1),
article table tbody.tbody-data tr.child td:nth-child(2) {
border-right: none;
}
article table.table-hover>tbody>tr:hover {
background-color: rgba(59, 130, 246, 0.05);
}
article .row:nth-child(2):not(.table-wrapper)>.col-md-12 {
padding: 0;
}
/* GENERAL */
.report-title {
margin: 0;
background: #ffffff;
color: #475569;
border-radius: 6px;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08);
bottom: -10px;
font-size: small;
padding: 0 10px;
position: absolute;
right: 0;
z-index: 1;
}
ul[role="list"],
ol[role="list"] {
padding: 0;
list-style: none;
}
#overall h2,
#overall p {
margin: 0;
}
#overall hgroup {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
gap: 0.75em;
margin-block-end: 4px;
}
#overall hgroup p {
font-weight: 400;
text-transform: uppercase;
font-size: 18px;
}
#overall ul {
margin-block-end: 0;
padding: 0;
}
#overall li span {
display: block;
}
#overall li span:first-of-type {
font-size: 85%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 100%;
}
#overall li span:last-of-type {
font-size: 2.5rem;
font-weight: 500;
line-height: 1.1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
#overall li div {
background: #ffffff;
color: rgb(36, 36, 36);
margin-top: 0.5rem;
padding: 0.9rem;
border-radius: 10px;
position: relative;
overflow: hidden;
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.07);
}
#overall li div::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
height: 4px;
}
/* Color variants */
#overall li.black div::before {
background: #0F1214;
}
#overall li.gray div::before {
background: #cbd5e1;
}
#overall li.red div::before {
background: #FF303E;
}
#overall li.blue div::before {
background: #3b82f6;
}
#overall li.green div::before {
background: #229f75;
}
@media (max-width: 767px) {
.powered {
bottom: 10px;
left: 25px;
transform: initial;
}
header hgroup {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
width: 70%
}
}
/* CHARTS */
.chart-wrap {
margin-bottom: 15px;
position: relative;
}
svg {
background-color: transparent;
display: block;
}
.axis path {
fill: transparent;
stroke: black;
shape-rendering: crispEdges;
stroke-width: 1;
}
.grid.y .tick line,
.grid.x .tick line {
shape-rendering: crispEdges;
stroke: #999;
stroke-dasharray: 3 3;
stroke-width: 1;
}
.axis.x .tick line,
.axis.y0 .tick line,
.axis.y1 .tick line,
.grid.y .tick:first-child line {
stroke: black;
stroke-width: 1;
shape-rendering: crispEdges;
}
.bars rect.bar {
shape-rendering: crispEdges;
}
.rects rect {
fill: transparent;
}
.area {
opacity: 0.2;
}
.points {
stroke: transparent;
}
line.indicator {
fill: transparent;
pointer-events: none;
shape-rendering: crispEdges;
stroke: #999;
stroke-width: 1;
display: none;
}
.area0,
.bars.y0 .bar,
.points.y0,
rect.legend.y0 {
fill: #447FB3;
}
.area1,
.bars.y1 .bar,
.points.y1,
rect.legend.y1 {
fill: #FF6854;
}
.line0,
.line1 {
fill: transparent;
stroke-width: 1;
}
.line0 {
stroke: #007BC3;
}
.line1 {
stroke: #FF303E;
}
.axis text,
.axis-label,
text.legend {
font: 10px sans-serif;
}
.axis-label.y0,
.axis-label.y1 {
text-anchor: end;
}
rect.legend {
height: 10px;
width: 10px;
}
.legend {
cursor: pointer;
}
.wrap-text text {
text-anchor: start !important;
}
/* CHART TOOLTIP */
.chart-tooltip-wrap {
left: 0;
pointer-events: none;
position: absolute;
top: 10px;
z-index: 10;
}
.chart-tooltip {
background-color: #ffffff;
border: 1px solid #e2e8f0;
color: #1e293b;
border-radius: 8px;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.12);
}
.chart-tooltip tr {
border: 1px solid #e2e8f0;
}
.chart-tooltip th {
background-color: #f1f5f9;
color: #1e293b;
font-size: 14px;
max-width: 380px;
overflow: hidden;
padding: 2px 5px;
text-align: left;
text-overflow: ellipsis;
white-space: nowrap;
}
.chart-tooltip td {
border-left: 1px dotted #cbd5e1;
font-size: 13px;
padding: 3px 6px;
}
.chart-tooltip td>span {
display: inline-block;
height: 10px;
margin-right: 6px;
width: 10px;
}
.chart-tooltip td.value {
text-align: right;
}
.chart-tooltip .blue {
background-color: #3b82f6;
}
.chart-tooltip .red {
background-color: #FF303E;
}
/* SCROLLBARS */
::-webkit-scrollbar-track,
.table-responsive::-webkit-scrollbar-track {
background-color: #f1f5f9;
}
::-webkit-scrollbar,
.table-responsive::-webkit-scrollbar {
width: 10px;
height: 10px;
background-color: #f1f5f9;
}
::-webkit-scrollbar-thumb,
.table-responsive::-webkit-scrollbar-thumb {
background-color: #cbd5e1;
border-radius: 8px;
}
::-webkit-scrollbar-thumb:hover,
.table-responsive::-webkit-scrollbar-thumb:hover {
background-color: #94a3b8;
}
a,
.nav li a:hover,
.nav li.active a,
.nav li:hover a {
color: #3b82f6;
}
.btn-default {
color: #475569;
background-color: #f1f5f9;
border-color: #cbd5e1;
border-radius: 8px;
transition: all 0.2s ease;
}
.btn-default:hover,
.btn-default:active,
.btn-default.active,
.open>.dropdown-toggle.btn-default {
color: #1e293b;
background-color: #e2e8f0;
border-color: #94a3b8;
transform: translateY(-1px);
}
.pagination>.disabled>a,
.pagination>.disabled>a:hover,
.pagination>.disabled>a:focus {
color: #94a3b8;
}
.pagination>li>a {
background-color: #ffffff;
border: 1px solid #cbd5e1;
color: #475569;
border-radius: 6px;
}
.pagination>li>a:hover,
.pagination>li>a:active,
.pagination>li>a:focus {
color: #3b82f6;
background-color: #f8fafc;
border-color: #94a3b8;
}
.dropdown-menu {
background-color: #ffffff;
border: 1px solid #e2e8f0;
border-radius: 10px;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
}
.dropdown-menu>li>a:hover,
.dropdown-menu>li>a:focus {
color: #1e293b;
background-color: #f1f5f9;
}
.cell-hl.b1,
.progress-bar,
.cell-hl.b2 {
background: linear-gradient(90deg, #3b82f6, #60a5fa);
color: white;
}
.clickable:hover,
.expandable>td:hover,
nav li:hover {
background: rgba(59, 130, 246, 0.06);
}
/* DARK THEME */
.dark h1 {
color: rgba(255, 255, 255, 0.6);
}
.dark hgroup,
.dark h2,
.dark h3,
.dark h4,
.dark h5 {
color: rgba(255, 255, 255, 0.4);
}
.dark .table-responsive {
border: none;
}
.dark article>div>table {
color: #D2D2D2;
}
.dark article table tbody.tbody-data tr td {
border-right: none;
}
.dark article table.table-hover>tbody.tbody-data>tr:hover {
background-color: rgba(255, 255, 255, 0.08) !important;
}
.dark #overall li span:first-of-type {
color: #9e9e9e;
}
.dark #overall li span:last-of-type {
color: #FFF;
}
.dark .dropdown-menu>li>a {
color: #FFF;
}
.dark article>div {
color: #EEE;
border-top: 1px solid rgba(255, 255, 255, 0.15);
}
.dark article table .cell-hl.d1 {
background: #161616;
}
.dark article table .cell-hl.d2 {
background: #3c3c3c;
}
.dark article table .cell-hl.d3 {
background: #5a5a5a;
}
.dark article table .cell-hl.d4 {
background: #7e7e7e;
}
.dark.graticule {
stroke: #DDD;
}
/* DARK CHARTS */
.dark .area {
opacity: 0.1;
}
.dark .line0,
.dark .line1 {
stroke-width: 2;
}
.dark .area0,
.dark .bars.y0 .bar,
.dark rect.legend.y0 {
fill: #007BC3;
}
.dark .area1,
.dark .bars.y1 .bar,
.dark .points.y1,
.dark rect.legend.y1 {
fill: #FF303E;
}
.dark .points.y0 {
fill: #00D4E1;
}
.dark .line0 {
stroke: #007BC3;
}
.dark .line1 {
stroke: #FF303E;
}
.dark .grid.y .tick line,
.dark .grid.x .tick line {
stroke: #44474B;
stroke-dasharray: 1 1;
}
.dark .axis text,
.dark .axis-label,
.dark text.legend {
fill: #9E9E9E;
}
.dark .axis path {
stroke: #999999;
}
.dark .axis.x .tick line,
.dark .axis.y0 .tick line,
.dark .axis.y1 .tick line,
.dark .grid.y .tick:first-child line {
stroke: #3B444C;
}
.dark .chart-tooltip th {
background-color: #1c1c1c;
color: #fff;
}
.dark .chart-tooltip tr {
border: 1px solid #363737;
}
.dark .sphere {
fill: #0076d433;
}
.dark.gray .sphere {
fill: #52646733;
}
.graticule {
stroke: #8f8f8f;
}
/* DARK BLUE THEME */
html.dark.blue,
.dark.blue body {
background: linear-gradient(to bottom, #1e2b43 0%, #172033 50%, #0f172a 100%);
background-attachment: fixed;
/* Keeps gradient stable on scroll */
color: #e2e8f0;
}
.dark.blue .container {
background: transparent;
}
.dark.blue .page-header {
border-bottom: 1px solid #1e293b;
background: transparent;
}
.dark.blue #last-updated {
background-color: transparent;
}
.dark.blue nav {
/* Match the main background gradient for cohesion */
background: linear-gradient(to bottom,
#1e2b43 0%,
#172033 50%,
#0f172a 100%);
border-color: transparent;
/* Remove side border for cleaner look */
box-shadow: none;
/* Rely on gradient for depth */
}
.dark.blue article>div {
background: linear-gradient(to bottom, #1e2b43, #172033);
/* Your preferred card gradient */
border: none;
/* Border removed as requested */
border-radius: 12px;
margin-top: 16px;
padding: 24px 16px 16px;
}
.dark.blue article table tfoot>tr>th {
border-top: 1px dotted #475569;
}
.dark.blue article table .thead-min,
.dark.blue article table .thead-avg,
.dark.blue article table .thead-max {
background: #1e2b43;
}
.dark.blue article table .thead-avg {
border-bottom: 2px solid #64748b;
}
.dark.blue article table>thead>tr.thead-cols {
border-bottom: 2px solid #475569;
}
.dark.blue article table tbody.tbody-data tr.shaded {
background-color: #172033;
}
.dark.blue #overall li.gray div {
border-top: 4px solid #334155;
}
.dark.blue #overall li div {
background: #1e2b43;
border-radius: 10px;
}
.dark.blue .btn-default {
color: #cbd5e1;
background-color: #1e2b43;
border-color: #334155;
border-radius: 8px;
transition: all 0.2s ease;
}
.dark.blue .btn-default:hover,
.dark.blue .btn-default:active,
.dark.blue .btn-default.active,
.dark.blue .open>.dropdown-toggle.btn-default {
color: #e2e8f0;
background-color: #334155;
border-color: #475569;
transform: translateY(-1px);
}
.dark.blue .pagination>.disabled>a,
.dark.blue .pagination>.disabled>a:hover,
.dark.blue .pagination>.disabled>a:focus {
color: #64748b;
}
.dark.blue .pagination>li>a {
background-color: #1e2b43;
border: 1px solid #334155;
color: #cbd5e1;
border-radius: 6px;
}
.dark.blue .pagination>li>a:hover,
.dark.blue .pagination>li>a:active,
.dark.blue .pagination>li>a:focus {
color: #60a5fa;
background-color: #1e2b43;
border-color: #475569;
}
.dark.blue .dropdown-menu>li>a:hover,
.dark.blue .dropdown-menu>li>a:focus {
color: #e2e8f0;
background-color: #334155;
}
.dark.blue .dropdown-menu {
background-color: #1e2b43;
border: 1px solid #334155;
border-radius: 10px;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3);
}
.dark.blue .chart-tooltip {
background-color: #1e2b43;
border: 1px solid #334155;
color: #e2e8f0;
border-radius: 8px;
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4);
}
.dark.blue .chart-tooltip th {
background-color: #334155;
color: #fff;
}
.dark.blue .report-title {
background: #1e2b43;
color: #cbd5e1;
border-radius: 6px;
}
.dark.blue .cell-hl.b1,
.dark.blue .progress-bar,
.dark.blue .cell-hl.b2 {
background: linear-gradient(90deg, #3b82f6, #60a5fa);
}
/* Subtle interactive hover */
.dark.blue .clickable:hover,
.dark.blue .expandable>td:hover,
.dark.blue nav li:hover {
background: rgba(96, 165, 250, 0.09);
}
/* SCROLLBARS - Dark Blue Theme */
html.dark.blue::-webkit-scrollbar-track,
.dark.blue body::-webkit-scrollbar-track,
.dark.blue .table-responsive::-webkit-scrollbar-track {
background-color: #0f172a;
}
html.dark.blue::-webkit-scrollbar,
.dark.blue body::-webkit-scrollbar,
.dark.blue .table-responsive::-webkit-scrollbar {
width: 10px;
height: 10px;
background-color: #0f172a;
}
html.dark.blue::-webkit-scrollbar-thumb,
.dark.blue body::-webkit-scrollbar-thumb,
.dark.blue .table-responsive::-webkit-scrollbar-thumb {
background-color: #334155;
border-radius: 8px;
}
html.dark.blue::-webkit-scrollbar-thumb:hover,
.dark.blue body::-webkit-scrollbar-thumb:hover,
.dark.blue .table-responsive::-webkit-scrollbar-thumb:hover {
background-color: #475569;
}
/* DARK GREY THEME */
html.dark.gray,
.dark.gray body {
background: linear-gradient(to bottom,
#2a2a2a 0%,
#1f1f1f 50%,
#141414 100%);
background-attachment: fixed;
color: #e5e5e5;
}
.dark.gray .container {
background: transparent;
}
.dark.gray .page-header {
border-bottom: 1px solid #2f2f2f;
background: transparent;
}
.dark.gray #last-updated {
background-color: transparent;
}
.dark.gray nav {
background: linear-gradient(to bottom,
#2a2a2a 0%,
#1f1f1f 50%,
#141414 100%);
border-color: transparent;
}
.dark.gray article>div {
background: linear-gradient(to bottom, #2a2a2a, #1f1f1f);
border: none;
border-radius: 12px;
margin-top: 16px;
padding: 24px 16px 16px;
}
.dark.gray article table .thead-min,
.dark.gray article table .thead-avg,
.dark.gray article table .thead-max {
background: #2a2a2a;
}
.dark.gray article table .thead-avg {
border-bottom: 2px solid #555;
}
.dark.gray article table>thead>tr.thead-cols {
border-bottom: 2px solid #444;
}
.dark.gray article table tbody.tbody-data tr.shaded {
background-color: #1a1a1a;
}
.dark.gray #overall li.gray div {
border-top: 4px solid #444;
}
.dark.gray #overall li div {
background: #2a2a2a;
border-radius: 10px;
}
.dark.gray .btn-default {
color: #d1d5db;
background-color: #2a2a2a;
border-color: #444;
border-radius: 8px;
transition: all 0.2s ease;
}
.dark.gray .btn-default:hover,
.dark.gray .btn-default:active,
.dark.gray .btn-default.active,
.dark.gray .open>.dropdown-toggle.btn-default {
color: #f1f5f9;
background-color: #3a3a3a;
border-color: #555;
transform: translateY(-1px);
}
.dark.gray .pagination>li>a {
background-color: #2a2a2a;
border: 1px solid #444;
color: #d1d5db;
border-radius: 6px;
}
.dark.gray .pagination>li>a:hover,
.dark.gray .pagination>li>a:focus {
color: #9ca3af;
background-color: #2a2a2a;
border-color: #555;
}
.dark.gray .dropdown-menu {
background-color: #2a2a2a;
border: 1px solid #444;
border-radius: 10px;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.35);
}
.dark.gray .dropdown-menu>li>a:hover,
.dark.gray .dropdown-menu>li>a:focus {
color: #fff;
background-color: #3a3a3a;
}
.dark.gray .chart-tooltip {
background-color: #2a2a2a;
border: 1px solid #444;
color: #e5e5e5;
border-radius: 8px;
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4);
}
.dark.gray .chart-tooltip th {
background-color: #3a3a3a;
color: #fff;
}
.dark.gray .report-title {
background: #2a2a2a;
color: #d1d5db;
border-radius: 6px;
}
/* SCROLLBARS - Dark Gray Theme */
html.dark.gray::-webkit-scrollbar-track,
.dark.gray body::-webkit-scrollbar-track,
.dark.gray .table-responsive::-webkit-scrollbar-track {
background-color: #141414;
}
html.dark.gray::-webkit-scrollbar,
.dark.gray body::-webkit-scrollbar,
.dark.gray .table-responsive::-webkit-scrollbar {
width: 10px;
height: 10px;
background-color: #141414;
}
html.dark.gray::-webkit-scrollbar-thumb,
.dark.gray body::-webkit-scrollbar-thumb,
.dark.gray .table-responsive::-webkit-scrollbar-thumb {
background-color: #444444;
border-radius: 8px;
}
html.dark.gray::-webkit-scrollbar-thumb:hover,
.dark.gray body::-webkit-scrollbar-thumb:hover,
.dark.gray .table-responsive::-webkit-scrollbar-thumb:hover {
background-color: #5a5a5a;
}
/* subtle hover */
.dark.gray .clickable:hover,
.dark.gray .expandable>td:hover,
.dark.gray nav li:hover {
background: rgba(255, 255, 255, 0.05);
}
/* DARK PURPLE THEME */
html.dark.purple,
.dark.purple body {
background: linear-gradient(to bottom,
#2a2240 0%,
#1e1e2f 50%,
#151523 100%);
background-attachment: fixed;
color: #e6e1ff;
}
.dark.purple .container {
background: transparent;
}
.dark.purple .page-header {
border-bottom: 1px solid #2f2a4a;
background: transparent;
}
.dark.purple #last-updated {
background-color: transparent;
}
.dark.purple nav {
background: linear-gradient(to bottom,
#2a2240 0%,
#1e1e2f 50%,
#151523 100%);
border-color: transparent;
}
.dark.purple article>div {
background: linear-gradient(to bottom, #2a2240, #1e1e2f);
border: none;
border-radius: 12px;
margin-top: 16px;
padding: 24px 16px 16px;
}
.dark.purple article table .thead-min,
.dark.purple article table .thead-avg,
.dark.purple article table .thead-max {
background: #2a2240;
}
.dark.purple article table .thead-avg {
border-bottom: 2px solid #5b4f85;
}
.dark.purple article table>thead>tr.thead-cols {
border-bottom: 2px solid #4b3f72;
}
.dark.purple article table tbody.tbody-data tr.shaded {
background-color: #181824;
}
.dark.purple #overall li div {
background: #2a2240;
border-radius: 10px;
}
.dark.purple .btn-default {
color: #d6ccff;
background-color: #2a2240;
border-color: #4b3f72;
border-radius: 8px;
transition: all 0.2s ease;
}
.dark.purple .btn-default:hover,
.dark.purple .btn-default:active,
.dark.purple .btn-default.active,
.dark.purple .open>.dropdown-toggle.btn-default {
color: #f1edff;
background-color: #3a2f66;
border-color: #5b4f85;
transform: translateY(-1px);
}
.dark.purple .pagination>li>a {
background-color: #2a2240;
border: 1px solid #4b3f72;
color: #d6ccff;
border-radius: 6px;
}
.dark.purple .pagination>li>a:hover,
.dark.purple .pagination>li>a:focus {
color: #c4b5fd;
background-color: #2a2240;
border-color: #5b4f85;
}
.dark.purple .dropdown-menu {
background-color: #2a2240;
border: 1px solid #4b3f72;
border-radius: 10px;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.35);
}
.dark.purple .dropdown-menu>li>a:hover,
.dark.purple .dropdown-menu>li>a:focus {
color: #fff;
background-color: #3a2f66;
}
.dark.purple .chart-tooltip {
background-color: #2a2240;
border: 1px solid #4b3f72;
color: #e6e1ff;
border-radius: 8px;
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4);
}
.dark.purple .chart-tooltip th {
background-color: #3a2f66;
color: #fff;
}
.dark.purple .report-title {
background: #2a2240;
color: #d6ccff;
border-radius: 6px;
}
/* subtle hover */
.dark.purple .clickable:hover,
.dark.purple .expandable>td:hover,
.dark.purple nav li:hover {
background: rgba(208, 72, 182, 0.08);
}
/* SCROLLBARS - Dark Purple Theme */
html.dark.purple::-webkit-scrollbar-track,
.dark.purple body::-webkit-scrollbar-track,
.dark.purple .table-responsive::-webkit-scrollbar-track {
background-color: #151523;
}
html.dark.purple::-webkit-scrollbar,
.dark.purple body::-webkit-scrollbar,
.dark.purple .table-responsive::-webkit-scrollbar {
width: 10px;
height: 10px;
background-color: #151523;
}
html.dark.purple::-webkit-scrollbar-thumb,
.dark.purple body::-webkit-scrollbar-thumb,
.dark.purple .table-responsive::-webkit-scrollbar-thumb {
background-color: #4b3f72;
border-radius: 8px;
}
html.dark.purple::-webkit-scrollbar-thumb:hover,
.dark.purple body::-webkit-scrollbar-thumb:hover,
.dark.purple .table-responsive::-webkit-scrollbar-thumb:hover {
background-color: #5b4f85;
}
/* DARK PURPLE CHART COLORS */
.dark.purple .area0,
.dark.purple .bars.y0 .bar,
.dark.purple rect.legend.y0 {
fill: #007BC3;
}
.dark.purple .area1,
.dark.purple .bars.y1 .bar,
.dark.purple .points.y1,
.dark.purple rect.legend.y1 {
fill: #d048b6;
}
.dark.purple .points.y0 {
fill: #00D4E1;
}
.dark.purple .line0 {
stroke: #007BC3;
}
.dark.purple .line1 {
stroke: #d048b6;
}
/* Grid and axes */
.dark.purple .grid.y .tick line,
.dark.purple .grid.x .tick line {
stroke: #44474B;
stroke-dasharray: 1 1;
}
.dark.purple .axis text,
.dark.purple .axis-label,
.dark.purple text.legend {
fill: #9E9E9E;
}
.dark.purple .axis path {
stroke: #999999;
}
.dark.purple .axis.x .tick line,
.dark.purple .axis.y0 .tick line,
.dark.purple .axis.y1 .tick line,
.dark.purple .grid.y .tick:first-child line {
stroke: #44474B;
}
/* Tooltip header */
.dark.purple .chart-tooltip th {
background-color: #1e1e2f;
}
.country {
fill: #ccc;
stroke: #fff;
stroke-width: 0.5px;
}
.country:hover {
fill: #b3b3b3;
}
.dark .country {
fill: #ccc;
stroke: #222;
stroke-width: 0.5px;
}
.dark .legend-svg text {
fill: #FFF;
}
/* DRAG AND DROP STYLES */
/* Make the drag handle visible and interactive */
.nav-list li .drag-handle {
display: inline-block;
padding: 8px 10px;
margin-right: 5px;
cursor: grab;
color: #999;
transition: color 0.2s;
}
.nav-list li .drag-handle:hover {
color: #333;
}
/* Dark theme adjustments */
.dark .nav-list li .drag-handle:hover {
color: #fff;
}
/* Hide drag handle on overall stats (first item) */
.nav-list li:first-child .drag-handle {
display: none;
}
.nav-list li:first-child {
cursor: default;
}
/* Visual feedback during drag */
.nav-list li.dragging {
opacity: 0.5;
cursor: grabbing;
}
.nav-list li.drag-over {
border-top: 2px solid #4CAF50;
background-color: rgba(76, 175, 80, 0.1);
}
.dark .nav-list li.drag-over {
background-color: rgba(76, 175, 80, 0.2);
}
/* Ensure draggable items have proper spacing */
.nav-list li[draggable="true"] {
position: relative;
transition: background-color 0.2s, border 0.2s;
}
/* Layout adjustments for drag handle */
.nav-list li {
display: flex;
align-items: center;
position: relative;
}
.nav-list li a {
flex: 1;
}
.nav-list li .toggle-panel {
margin-left: auto;
}