body { font-family: "Noto Sans", "Noto Sans TC", "Noto Sans SC", system-ui, sans-serif; background: var(--bs-body-bg); }
body.lang-zh-HK { font-family: "Noto Sans TC", "Noto Sans", system-ui, sans-serif; }
body.lang-zh-CN { font-family: "Noto Sans SC", "Noto Sans", system-ui, sans-serif; }

@media (min-width: 992px) {
    .sidebar { min-height: calc(100vh - 56px); position: sticky; top: 56px; align-self: flex-start; }
}
.sidebar .nav-link { color: var(--bs-body-color); }
.sidebar .nav-link.active { background: var(--bs-danger); color: #fff; }

.kpi { border-left: 4px solid var(--bs-danger); }
.kpi .value { font-size: 1.75rem; font-weight: 600; line-height: 1.1; }
.table td, .table th { vertical-align: middle; }
.table-sm .form-control-sm { max-width: 6rem; }
.stock-low { background: rgba(var(--bs-danger-rgb), .18) !important; font-weight: 600; }
.stock-warn { background: rgba(var(--bs-warning-rgb), .22) !important; }
.matrix th, .matrix td { text-align: center; white-space: nowrap; }
.matrix td:first-child, .matrix th:first-child { text-align: left; }
#map { height: calc(100vh - 190px); min-height: 420px; border-radius: .5rem; }
pre.json { max-height: 18rem; white-space: pre-wrap; word-break: break-word; font-size: .8rem; }
.login-card { max-width: 420px; }
