Files
ucvl-home-vision/frontend/src/theme.css
T

1966 lines
41 KiB
CSS

/* Vue + Bootstrap visual system. Domain-specific video and genealogy geometry stays intact. */
:root {
--bs-primary: #28624f;
--bs-primary-rgb: 40, 98, 79;
--bs-body-color: #263f36;
--bs-body-bg: #f4f6f4;
--bs-border-color: #dde4df;
--bs-border-radius: 0.65rem;
--ui-surface: #fff;
--ui-muted: #67776d;
--ui-line: #dfe6e1;
--ui-sidebar: #193c32;
--ui-accent: #28624f;
--ui-bg: #f4f6f4;
--ink: #263f36;
--muted: #67776d;
--paper: #fff;
--line: #dfe6e1;
--green: #28624f;
--green-dark: #193c32;
--cream: #f4f6f4;
}
html,
body {
min-width: 320px;
margin: 0;
background: var(--ui-bg) !important;
color: var(--ink);
font-family: Inter, "Segoe UI", "Microsoft YaHei", system-ui, sans-serif;
font-size: 14px;
line-height: 1.65;
}
body {
display: block !important;
background-image: none !important;
}
body::before,
body::after {
display: none !important;
}
#app {
min-height: 100vh;
display: grid;
grid-template-columns: 232px minmax(0, 1fr);
}
*,
*::before,
*::after {
box-sizing: border-box;
}
[hidden] {
display: none !important;
}
button,
input,
select,
textarea {
font: inherit;
}
button,
a,
input,
select,
textarea {
touch-action: manipulation;
}
button {
letter-spacing: 0 !important;
}
.app-icon {
width: 20px;
height: 20px;
flex: 0 0 20px;
vertical-align: middle;
}
.btn .app-icon {
width: 17px;
height: 17px;
}
.sidebar {
width: 232px !important;
position: fixed !important;
inset: 0 auto 0 0;
z-index: 20;
background: var(--ui-sidebar) !important;
color: #e6f0eb;
padding: 28px 18px 20px !important;
display: flex;
flex-direction: column;
height: 100dvh;
overflow: auto;
border: 0 !important;
box-shadow: none !important;
}
.brand {
padding: 0 6px 24px !important;
gap: 12px;
text-decoration: none;
color: #fff !important;
border-bottom: 1px solid #ffffff14 !important;
margin: 0 0 24px !important;
display: flex;
align-items: center;
}
.brand-icon {
width: 42px !important;
height: 42px !important;
object-fit: contain;
border-radius: 10px;
}
.brand > span > span {
font-size: 22px !important;
line-height: 1.2;
letter-spacing: 2px;
}
.brand small {
font-size: 11px !important;
letter-spacing: 1px;
color: #acc4b8 !important;
margin-top: 6px;
display: block;
}
.nav-label {
font-size: 10px !important;
letter-spacing: 2px;
padding: 0 12px;
margin-bottom: 12px;
color: #95b5a6 !important;
}
.sidebar nav {
display: flex !important;
flex-direction: column !important;
gap: 5px;
}
.sidebar nav button {
display: flex;
gap: 12px;
align-items: center;
text-align: left;
width: 100%;
color: #c0d6c9 !important;
background: transparent !important;
border: 0 !important;
box-shadow: none !important;
border-radius: 8px !important;
min-height: 44px;
padding: 10px 13px !important;
font-size: 13px !important;
white-space: normal;
}
.sidebar nav button:hover {
background: #ffffff0d !important;
color: #fff !important;
}
.sidebar nav button.active {
background: #ffffffed !important;
color: #234c3d !important;
font-weight: 600;
}
.sidebar nav .app-icon {
opacity: 0.85;
}
#scope-navigation {
border: 0 !important;
padding: 18px 0 10px !important;
margin: 7px 0 !important;
box-shadow:
0 -1px #ffffff14,
0 1px #ffffff14;
}
#scope-nav-name {
max-width: 185px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin: 0 0 12px;
}
.side-note {
margin-top: auto;
padding: 36px 12px 16px;
font-size: 10px;
color: #9abbab;
}
.side-note p {
display: none;
}
.sidebar #current-user {
color: #c1d3c8 !important;
border-top: 1px solid #ffffff18;
padding-top: 14px;
font-size: 11px;
margin: 0 0 8px;
}
.sidebar > #account-password,
.sidebar > #logout {
border-color: #ffffff20 !important;
color: #c1d3c8 !important;
background: transparent !important;
font-size: 11px;
min-height: 32px;
padding: 5px;
margin: 4px 0;
}
.mobile-nav-toggle {
display: none;
}
#app > main {
grid-column: 2;
margin: 0 !important;
padding: 28px 34px 20px !important;
width: 100%;
min-width: 0;
max-width: 1800px;
min-height: 100vh;
background: none !important;
}
main > header {
padding: 0 0 24px !important;
margin: 0 0 24px !important;
border-bottom: 1px solid var(--ui-line) !important;
display: flex;
align-items: center;
justify-content: space-between;
gap: 20px;
min-height: 0 !important;
background: none !important;
position: relative;
}
main > header::after,
main > header::before {
display: none !important;
}
.eyebrow {
font-size: 10px;
letter-spacing: 2px;
color: var(--ui-muted) !important;
margin-bottom: 7px;
}
h1,
#page-title {
font-family: inherit !important;
font-size: 26px !important;
font-weight: 650 !important;
line-height: 1.35;
letter-spacing: -0.5px !important;
margin: 0 0 7px !important;
}
h2 {
font-size: 19px !important;
font-weight: 600 !important;
line-height: 1.45;
letter-spacing: 0 !important;
margin: 0 0 5px !important;
}
h3 {
font-size: 16px !important;
line-height: 1.5;
font-weight: 600 !important;
letter-spacing: 0 !important;
}
h2,
h3,
h4 {
font-family: inherit !important;
}
#page-note {
font-size: 12px !important;
color: var(--ui-muted);
margin: 0 !important;
}
.header-status {
align-items: flex-end;
gap: 8px;
font-size: 10px !important;
white-space: nowrap;
}
#service-status {
font-size: 10px;
}
#clock {
color: var(--ui-muted);
background: none !important;
padding: 0 !important;
}
#clock::before {
display: none !important;
}
.btn {
border-radius: 7px !important;
min-height: 36px;
padding: 7px 13px;
font-size: 12px;
font-weight: 500;
box-shadow: none;
line-height: 1.65;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 5px;
white-space: normal;
}
.btn-primary {
--bs-btn-bg: var(--ui-accent);
--bs-btn-border-color: var(--ui-accent);
--bs-btn-hover-bg: #1d4d3c;
--bs-btn-hover-border-color: #1d4d3c;
--bs-btn-disabled-bg: #80988d;
--bs-btn-disabled-border-color: #80988d;
--bs-btn-active-bg: #1d4d3c;
--bs-btn-active-border-color: #1d4d3c;
color: #fff !important;
}
.btn-outline-secondary {
--bs-btn-color: #54685d;
--bs-btn-border-color: #d8e1da;
--bs-btn-hover-bg: #edf3ee;
--bs-btn-hover-border-color: #bacdc0;
--bs-btn-hover-color: #264d3b;
--bs-btn-active-bg: #e0ece4;
--bs-btn-active-border-color: #a7c0ae;
--bs-btn-active-color: #254e3b;
--bs-btn-disabled-color: #9faea4;
--bs-btn-disabled-border-color: #e0e5e2;
background: transparent;
}
.btn-sm {
min-height: 30px;
padding: 4px 9px;
font-size: 11px;
}
.btn-link {
color: var(--ui-accent);
text-decoration: none;
background: transparent;
border: 0;
}
.btn-link:hover {
text-decoration: underline;
}
.btn:focus-visible,
.form-control:focus,
.form-select:focus {
box-shadow: 0 0 0 3px #28744c1c !important;
outline: 0 !important;
border-color: #679b79;
}
.btn-group > .btn {
border-radius: 0 !important;
}
.btn-group > .btn:first-child {
border-radius: 7px 0 0 7px !important;
}
.btn-group > .btn:last-child {
border-radius: 0 7px 7px 0 !important;
}
.form-control,
.form-select {
color: var(--ink);
background-color: var(--ui-surface);
border: 1px solid var(--ui-line);
border-radius: 7px !important;
font-size: 13px;
padding: 9px 12px;
min-height: 40px;
max-width: 100%;
box-shadow: none;
}
.form-select {
padding-right: 32px;
}
.form-check-input {
width: 16px;
height: 16px;
min-height: 0;
margin: 0 6px 0 0;
vertical-align: middle;
flex: 0 0 16px;
}
.form-check-input:checked {
background-color: var(--ui-accent);
border-color: var(--ui-accent);
}
label {
font-size: 12px;
color: #617367;
gap: 7px;
}
.form-grid {
gap: 16px 20px !important;
}
.form-grid label {
min-width: 0;
}
.form-grid .full {
grid-column: 1/-1;
}
textarea.form-control {
min-height: 100px;
}
input[type="file"] {
font-size: 12px;
padding: 8px;
overflow: hidden;
}
input[type="range"] {
max-width: 100%;
}
fieldset {
border: 1px solid var(--ui-line) !important;
border-radius: 9px;
padding: 14px !important;
}
legend {
float: none;
width: auto;
padding: 0 6px;
font-size: 12px;
}
.description,
.hint {
font-size: 12px !important;
line-height: 1.8 !important;
color: var(--ui-muted) !important;
}
p {
overflow-wrap: anywhere;
}
code {
color: #3b6755;
font-size: 12px;
}
.table {
font-size: 12px;
--bs-table-bg: transparent;
}
.table td,
.table th {
padding: 12px !important;
border-color: var(--ui-line);
}
.table-wrap {
overflow: auto;
border-radius: 8px;
border: 1px solid var(--ui-line);
}
.panel,
.site-card,
.card,
.camera-card,
.person-card {
background: var(--ui-surface) !important;
border: 1px solid var(--ui-line) !important;
border-radius: 11px !important;
box-shadow: 0 3px 12px #193c3204 !important;
overflow: hidden;
}
.panel {
padding: 22px !important;
margin-bottom: 18px;
}
.site-card {
padding: 22px !important;
}
.card-body {
padding: 20px;
}
.card-footer {
background: transparent;
border-top: 1px solid var(--ui-line);
padding: 12px 18px;
}
.section-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
margin-bottom: 18px !important;
}
.section-head h2 small,
.section-head h3 small {
display: none;
}
.badge {
font-size: 10px;
line-height: 1.4;
font-weight: 500 !important;
letter-spacing: 0 !important;
background: #edf4ee !important;
color: #3c7056 !important;
border: 1px solid #d6e6d9 !important;
border-radius: 5px !important;
padding: 5px 8px !important;
}
.badge.off {
background: #f7eeea !important;
border-color: #ecd9d0 !important;
color: #a66044 !important;
}
.count-pill {
display: inline-block;
padding: 2px 7px;
background: #e6ede8;
color: #4b705b;
border-radius: 5px;
font-size: 11px;
vertical-align: middle;
margin-left: 7px;
}
.group-title {
font-size: 13px !important;
color: #6a7c70;
margin: 24px 0 12px !important;
display: flex;
gap: 5px;
align-items: center;
}
.site-heading {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.household-context {
padding: 12px 16px !important;
border-radius: 9px !important;
background: #eaf0eb !important;
border: 1px solid var(--ui-line);
gap: 12px;
display: flex;
align-items: center;
flex-wrap: wrap;
margin-bottom: 18px !important;
}
.household-context label {
display: flex;
align-items: center;
gap: 10px;
margin: 0;
}
.household-context select {
width: auto;
max-width: 260px;
min-height: 34px;
padding-top: 6px;
padding-bottom: 6px;
}
.household-context span {
font-size: 11px;
color: var(--ui-muted);
}
#scope-back {
margin-left: auto;
}
.device-context {
border-radius: 9px;
background: #eaf0eb !important;
padding: 16px !important;
margin-bottom: 18px;
}
.device-context p {
font-size: 12px;
margin: 0 0 10px;
}
.device-context .btn.active {
background: var(--ui-accent) !important;
color: white !important;
}
.filter-row {
display: flex;
align-items: center;
gap: 12px;
flex-wrap: wrap;
margin: 0 0 18px;
padding: 0 !important;
font-size: 12px;
}
.filter-row label {
display: flex;
align-items: center;
gap: 8px;
margin: 0;
}
.filter-row select {
width: 180px;
}
.filter-row > button {
margin-left: auto;
}
.metrics {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 14px;
margin: 0 0 22px !important;
padding: 0 !important;
background: none !important;
border: 0 !important;
}
.metrics > div {
background: var(--ui-surface);
border: 1px solid var(--ui-line);
border-radius: 9px;
padding: 14px 18px !important;
display: flex;
justify-content: space-between;
align-items: center;
border-right: 1px solid var(--ui-line) !important;
}
.metrics span {
font-size: 11px;
color: var(--ui-muted);
}
.metrics strong {
font-family: inherit;
font-size: 23px !important;
font-weight: 600;
color: var(--ui-accent);
}
.home-toolbar {
display: flex;
gap: 16px;
flex-wrap: wrap;
align-items: center;
padding: 13px 0;
margin: 0 0 7px;
border-top: 1px solid var(--ui-line);
border-bottom: 1px solid var(--ui-line);
}
.home-layout-controls {
display: flex;
align-items: center;
gap: 10px;
flex-wrap: wrap;
margin-left: auto;
}
.home-layout-controls label {
display: flex;
align-items: center;
gap: 7px;
margin: 0;
}
.home-layout-controls select {
width: 80px !important;
min-height: 34px;
padding-top: 5px;
padding-bottom: 5px;
}
.home-layout-controls > .form-select {
width: 80px !important;
}
.inline-check {
white-space: nowrap;
font-size: 11px;
}
#home-layout-status {
margin-bottom: 18px;
font-size: 11px !important;
}
.home-card-grid {
display: grid !important;
grid-template-columns: repeat(var(--home-columns, 2), minmax(0, 1fr));
gap: 20px !important;
}
.home-city-group {
display: block;
}
.home-card {
padding: 0 !important;
margin: 0 !important;
min-width: 0;
align-self: start;
}
.home-cover {
position: relative;
height: 178px !important;
min-height: 178px !important;
background: linear-gradient(135deg, #567d65, #203e36) !important;
overflow: hidden;
}
.home-cover img {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
}
.cover-shade {
position: absolute;
inset: 0;
background: linear-gradient(180deg, #132e2430 10%, #0e261ccc 100%);
}
.home-cover-content {
position: relative;
z-index: 1;
height: 100%;
padding: 17px 20px !important;
display: flex;
flex-direction: column;
justify-content: space-between;
background: none !important;
}
.home-cover-content h3 {
font-family: inherit !important;
font-size: 21px !important;
color: #fff !important;
margin: 0 0 6px !important;
letter-spacing: 0;
}
.home-cover-content .badge {
background: #ffffffd9 !important;
color: #244d3a !important;
border-color: transparent !important;
font-size: 10px;
}
.home-location {
font-size: 11px !important;
color: #e8f0eb !important;
line-height: 1.6;
margin: 0 !important;
}
.cover-edit {
color: #fff !important;
background: #213e3670 !important;
border: 1px solid #ffffff60 !important;
backdrop-filter: blur(8px);
}
.home-summary {
font-size: 12px;
color: var(--ui-muted);
margin-bottom: 15px;
min-height: 20px;
}
.home-numbers {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
padding: 0 0 17px;
border-bottom: 1px solid var(--ui-line);
margin-bottom: 13px;
}
.home-numbers span {
display: flex;
align-items: baseline;
gap: 7px;
color: var(--ui-muted);
font-size: 11px;
}
.home-numbers b {
font-size: 21px;
font-weight: 600;
color: var(--ink);
}
.compact-details {
margin: 0 !important;
display: grid;
gap: 7px !important;
font-size: 12px;
}
.compact-details > div {
display: grid;
grid-template-columns: 100px minmax(0, 1fr);
gap: 12px !important;
padding: 0 !important;
}
.compact-details dt {
font-weight: 400;
color: var(--ui-muted);
}
.compact-details dd {
margin: 0;
overflow-wrap: anywhere;
color: var(--ink);
}
.home-card-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 17px;
padding-top: 14px;
border-top: 1px solid var(--ui-line);
}
.home-card-actions .btn-primary {
flex: 1;
}
.home-order-actions {
display: flex;
align-items: center;
gap: 5px;
margin-bottom: 12px;
}
.home-order-actions span {
font-size: 10px;
flex: 1;
}
.home-pagination {
display: flex;
justify-content: flex-end;
align-items: center;
gap: 10px;
margin: 22px 0;
}
.home-pagination span {
margin-right: auto;
font-size: 11px;
color: var(--ui-muted);
}
.device-card-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(min(100%, 330px), 1fr));
gap: 18px;
}
.device-card {
min-width: 0;
}
.device-card-heading {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 15px;
}
.device-symbol {
width: 42px;
height: 42px;
border-radius: 10px;
background: #eaf2ec;
color: var(--ui-accent);
display: grid;
place-items: center;
}
.device-symbol .app-icon {
width: 23px;
height: 23px;
}
.device-card-heading h3 {
margin: 0 !important;
font-size: 16px !important;
}
.device-title {
padding: 0 !important;
border: 0 !important;
background: none !important;
text-align: left !important;
min-height: 0 !important;
color: var(--ink) !important;
font-weight: 600 !important;
font-size: 16px !important;
box-shadow: none !important;
}
.device-title:hover {
color: var(--ui-accent) !important;
text-decoration: underline;
}
.device-location {
font-size: 11px;
color: var(--ui-muted);
margin-bottom: 15px;
}
.device-card-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.device-tags {
display: flex;
flex-wrap: wrap;
gap: 5px;
margin: 12px 0 0;
}
.device-tags span {
background: #edf1ee;
font-size: 10px;
color: #667e6d;
padding: 2px 8px;
border-radius: 4px;
}
.device-view-controls {
display: flex;
flex-wrap: wrap;
gap: 12px;
}
.device-view-controls label {
display: flex;
align-items: center;
gap: 9px;
}
.group-custom {
font-size: 12px;
}
.group-step {
max-width: 100%;
}
.group-step select {
max-width: 200px;
}
.view-presets {
display: flex;
gap: 6px;
flex-wrap: wrap;
}
#device-count {
font-size: 11px !important;
}
.device-group:first-child > .group-title {
margin-top: 4px !important;
}
#asset-list .empty {
min-height: 160px;
}
.device-tags + .network-status-block {
margin-top: 12px;
}
.network-status-block {
padding-top: 12px;
margin-top: 14px;
border-top: 1px solid var(--ui-line);
font-size: 11px;
}
.network-status-title {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
margin-bottom: 6px;
}
.network-status-title > span {
font-weight: 600;
}
.status-dot {
width: 7px;
height: 7px;
border-radius: 50%;
background: #b4b9b5;
display: inline-block;
margin-right: 6px;
}
.status-dot.online {
background: #37a06a;
box-shadow: 0 0 0 3px #38a16a12;
}
.network-target {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 7px;
margin: 4px 0;
}
.network-target > span:first-child {
width: 65px;
color: var(--ui-muted);
}
.network-target code {
font-size: 11px;
}
.network-target > span:last-child {
margin-left: auto;
font-size: 10px;
}
.network-status-block p {
margin: 6px 0;
font-size: 11px !important;
}
.management-links {
display: flex;
gap: 6px;
flex-wrap: wrap;
margin: 9px 0;
}
.network-check-time {
font-size: 10px;
color: #8b9c90;
line-height: 1.5;
display: block;
}
.network-platform {
display: flex;
align-items: center;
gap: 15px;
background: #edf3ee;
border: 1px solid #d6e4d9;
padding: 20px;
border-radius: 10px;
margin-bottom: 16px;
}
.network-platform > .app-icon {
width: 32px;
height: 32px;
flex-basis: 32px;
color: var(--ui-accent);
}
.network-platform h3 {
margin: 0 0 3px !important;
font-size: 18px !important;
}
.network-platform p {
margin: 0;
font-size: 11px;
color: var(--ui-muted);
}
.platform-place-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(min(100%, 260px), 1fr));
gap: 18px;
}
.platform-place-node {
display: flex !important;
flex-direction: column;
align-items: flex-start !important;
text-align: left !important;
padding: 20px !important;
gap: 9px;
border: 1px solid var(--ui-line) !important;
position: relative;
color: var(--ink) !important;
}
.platform-place-node:hover {
border-color: #81ad90 !important;
box-shadow: 0 4px 16px #2d4b3610 !important;
}
.platform-place-node h3 {
font-size: 17px !important;
margin: 3px 0;
}
.platform-place-node p,
.platform-place-node small {
font-size: 11px;
color: var(--ui-muted);
margin: 0;
}
.network-open {
padding-top: 12px;
margin-top: auto;
color: var(--ui-accent);
font-size: 11px;
}
.network-node {
margin: 0 0 14px calc(var(--depth) * 22px);
overflow: visible !important;
position: relative;
}
.network-node.nested::before {
position: absolute;
content: "";
border-left: 2px solid #c1d3c6;
border-bottom: 2px solid #c1d3c6;
width: 15px;
left: -17px;
top: -15px;
height: 50px;
border-bottom-left-radius: 6px;
}
.network-node .card-body {
padding: 18px;
}
.network-node .device-card-heading {
margin-bottom: 9px;
}
.network-facts {
display: flex;
flex-wrap: wrap;
gap: 8px 24px;
font-size: 11px;
color: var(--ui-muted);
}
.network-facts b {
font-weight: 500;
color: var(--ink);
margin-left: 7px;
overflow-wrap: anywhere;
}
.network-map {
overflow: hidden;
}
.network-map .network-platform {
max-width: none;
}
.network-overview {
margin-top: 18px;
}
.scope-intro {
padding: 0 !important;
margin-bottom: 24px !important;
}
.scope-intro h2 {
font-size: 24px !important;
}
.scope-intro p {
font-size: 13px !important;
color: var(--ui-muted);
}
.steward-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
gap: 18px;
}
.steward-tile {
padding: 22px !important;
min-height: 160px !important;
background: var(--ui-surface) !important;
border: 1px solid var(--ui-line) !important;
border-radius: 10px !important;
text-align: left !important;
display: flex;
align-items: flex-start !important;
flex-direction: column;
justify-content: flex-start !important;
gap: 10px;
color: var(--ink) !important;
box-shadow: none !important;
}
.steward-tile::before {
display: none !important;
}
.steward-tile:hover {
border-color: #8caf99 !important;
background: #f9fcf9 !important;
transform: translateY(-1px);
}
.steward-tile strong {
font-family: inherit !important;
font-size: 19px !important;
font-weight: 600 !important;
}
.steward-tile span {
font-size: 12px !important;
}
.steward-tile small {
font-size: 11px !important;
color: var(--ui-muted);
line-height: 1.8;
}
.camera-meta {
padding: 16px !important;
}
.camera-meta strong {
font-size: 14px !important;
}
.camera-meta p {
font-size: 11px !important;
margin: 4px 0 !important;
}
.camera-actions {
padding: 0 16px 16px;
display: flex;
flex-wrap: wrap;
gap: 7px;
}
.camera-card {
background: var(--ui-surface) !important;
}
.live-grid {
gap: 18px;
}
.video-panel {
background: #152720 !important;
}
.video-error {
font-size: 12px;
}
.video-empty {
color: #9bad9f;
}
.wall-toolbar {
padding: 12px !important;
border-radius: 9px;
gap: 10px;
}
.wall-toolbar label {
font-size: 11px;
}
.wall-toolbar select {
width: auto;
}
#live-stage:fullscreen {
background: #101c17;
}
.wall-fullscreen .camera-card {
border-color: #284336 !important;
}
.playback-panel {
background: var(--ui-surface) !important;
}
.settings-sections {
display: flex;
gap: 7px;
flex-wrap: wrap;
margin-bottom: 20px;
}
.settings-sections .btn[aria-pressed="true"] {
background: var(--ui-accent) !important;
color: white !important;
}
.journal-card {
max-width: 100% !important;
background: var(--ui-surface) !important;
border-radius: 11px !important;
padding: 22px !important;
border: 1px solid var(--ui-line) !important;
}
.journal-attachments {
gap: 14px;
}
.journal-attachments img {
border-radius: 8px;
}
.journal-media-library {
max-width: 100%;
}
.journal-pager {
font-size: 12px;
}
.family-toolbar {
flex-wrap: wrap;
}
.family-card,
.person-card {
padding: 16px;
}
.family-detail h2 {
font-size: 20px !important;
}
dialog {
max-width: min(900px, calc(100vw - 32px)) !important;
width: 800px;
padding: 26px !important;
border: 1px solid var(--ui-line) !important;
border-radius: 14px !important;
background: var(--ui-surface) !important;
color: var(--ink) !important;
box-shadow: 0 24px 80px #0f2d3d38 !important;
max-height: calc(100dvh - 48px);
overflow: auto;
margin: auto !important;
}
dialog::backdrop {
background: #10291e70;
backdrop-filter: blur(3px);
}
dialog h2 {
font-size: 21px !important;
}
dialog .dialog-heading,
dialog > header,
dialog form > header {
padding: 0 0 18px !important;
margin: 0 0 20px !important;
border-bottom: 1px solid var(--ui-line);
display: flex;
align-items: center;
justify-content: space-between;
gap: 15px;
background: none;
}
dialog form > .form-grid {
margin-top: 5px;
}
dialog footer,
dialog .dialog-actions {
padding: 18px 0 0 !important;
margin: 20px 0 0 !important;
border-top: 1px solid var(--ui-line);
display: flex;
justify-content: flex-end;
gap: 10px;
}
#auth-dialog {
width: 420px !important;
padding: 32px !important;
}
#auth-dialog h2 {
font-size: 25px !important;
}
#auth-dialog p {
font-size: 12px;
}
#auth-form {
display: grid;
gap: 15px;
}
#auth-form label {
margin: 0;
}
.form-error {
font-size: 12px;
color: #b15a3c;
min-height: 0;
}
#toast {
position: fixed;
bottom: 24px;
right: 24px;
z-index: 200;
background: #234c39 !important;
color: #fff !important;
padding: 12px 20px !important;
border-radius: 9px !important;
font-size: 13px !important;
box-shadow: 0 6px 22px #193c3226;
max-width: calc(100vw - 32px);
}
main > footer {
padding: 22px 0 0 !important;
margin: 30px 0 0 !important;
border-top: 1px solid var(--ui-line);
font-size: 10px !important;
color: var(--ui-muted);
}
.empty {
border: 1px dashed #cfdbd2;
background: #f8faf8;
border-radius: 9px;
color: var(--ui-muted);
text-align: center;
padding: 40px 20px !important;
}
.empty h3 {
margin-top: 10px;
}
.empty p {
font-size: 12px;
}
.banner {
padding: 12px 16px;
border-radius: 8px;
font-size: 12px;
}
html[data-theme="clean"] {
--ui-bg: #f4f6f9;
--ui-accent: #31655b;
--ui-surface: #fff;
}
html[data-theme="ink"] {
--ui-bg: #14221e;
--ui-surface: #1c2e26;
--ui-line: #334a3e;
--ui-muted: #a5baad;
--ink: #e1ece5;
--bs-body-color: #e1ece5;
--bs-border-color: #334a3e;
--ui-accent: #397359;
--bs-secondary-color: #a5baad;
}
html[data-theme="ink"] .form-control,
html[data-theme="ink"] .form-select {
background-color: #20352a;
color: #e1ece5;
}
html[data-theme="ink"] .network-platform,
html[data-theme="ink"] .household-context,
html[data-theme="ink"] .device-context,
html[data-theme="ink"] .empty {
background: #213d2d !important;
}
html[data-theme="ink"] .description,
html[data-theme="ink"] label {
color: #a5baad !important;
}
html[data-theme="ink"] .btn-outline-secondary {
color: #b9cec0;
border-color: #476152;
}
html[data-density="compact"] #app > main {
padding: 20px 25px !important;
}
html[data-density="compact"] .panel,
html[data-density="compact"] .card-body {
padding: 15px !important;
}
html[data-density="compact"] .home-cover {
height: 150px !important;
min-height: 150px !important;
}
html[data-layout="top"] #app {
display: block;
}
html[data-layout="top"] .sidebar {
position: relative !important;
width: 100% !important;
height: auto;
padding: 12px 24px !important;
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-items: center;
gap: 12px;
}
html[data-layout="top"] .sidebar .brand {
padding: 0 15px 0 0 !important;
margin: 0 !important;
border: 0 !important;
}
html[data-layout="top"] .sidebar > .nav-label,
html[data-layout="top"] .side-note,
html[data-layout="top"] #current-user,
html[data-layout="top"] #scope-nav-name {
display: none;
}
html[data-layout="top"] .sidebar nav {
flex-direction: row !important;
flex: 1;
flex-wrap: wrap;
}
html[data-layout="top"] #scope-navigation {
display: flex;
padding: 0 !important;
margin: 0 !important;
box-shadow: none;
}
html[data-layout="top"] .sidebar nav button {
width: auto !important;
padding: 8px 10px !important;
}
html[data-layout="top"] #app > main {
margin: auto !important;
max-width: 1800px;
}
@media (min-width: 1500px) {
.home-card-grid[style] {
gap: 22px;
}
}
@media (max-width: 1200px) {
#app > main {
padding: 24px !important;
}
#app {
grid-template-columns: 210px minmax(0, 1fr);
}
.sidebar {
width: 210px !important;
padding: 24px 14px !important;
}
.home-toolbar {
align-items: flex-start;
}
.home-layout-controls {
margin-left: 0;
}
.home-card-grid {
grid-template-columns: repeat(
min(var(--home-columns, 2), 2),
minmax(0, 1fr)
);
}
.metrics > div {
padding: 12px !important;
}
.metrics strong {
font-size: 19px !important;
}
.compact-details > div {
grid-template-columns: 90px minmax(0, 1fr);
}
}
@media (max-width: 767px) {
html,
body {
font-size: 14px;
}
#app {
display: block !important;
}
.sidebar,
html[data-layout="top"] .sidebar {
position: relative !important;
width: 100% !important;
height: auto !important;
padding: 13px 16px !important;
display: grid !important;
grid-template-columns: 1fr auto !important;
overflow: visible !important;
}
.brand,
html[data-layout="top"] .sidebar .brand {
padding: 0 !important;
margin: 0 !important;
border: 0 !important;
gap: 10px;
}
.brand-icon {
width: 34px !important;
height: 34px !important;
}
.brand > span > span {
font-size: 19px !important;
}
.brand small {
font-size: 9px !important;
margin-top: 2px;
}
.sidebar > .nav-label,
.side-note,
#current-user,
.sidebar > #account-password,
.sidebar > #logout {
display: none !important;
}
.mobile-nav-toggle {
display: flex !important;
color: #e8f1ec !important;
border: 1px solid #ffffff30 !important;
background: transparent !important;
font-size: 12px;
min-height: 36px;
}
.sidebar nav,
html[data-layout="top"] .sidebar nav {
display: none !important;
grid-column: 1/-1;
}
.sidebar.mobile-open nav,
html[data-layout="top"] .sidebar.mobile-open nav {
display: flex !important;
flex-direction: column !important;
margin-top: 15px;
}
.sidebar.mobile-open > #account-password,
.sidebar.mobile-open > #logout {
display: block !important;
}
.sidebar.mobile-open > #current-user {
display: block !important;
grid-column: 1/-1;
}
.sidebar.mobile-open > #account-password {
grid-column: 1;
}
.sidebar.mobile-open > #logout {
grid-column: 2;
}
html[data-layout="top"] #scope-navigation {
display: block;
}
.sidebar nav button {
width: 100% !important;
}
.sidebar #scope-navigation {
padding: 14px 0 !important;
}
#app > main,
html[data-density="compact"] #app > main {
padding: 20px 15px !important;
min-height: calc(100vh - 65px);
width: 100% !important;
}
main > header {
gap: 12px;
align-items: flex-start;
margin-bottom: 20px !important;
padding-bottom: 18px !important;
}
#page-title {
font-size: 22px !important;
}
#page-note {
font-size: 11px !important;
}
.eyebrow {
font-size: 9px;
margin-bottom: 5px;
letter-spacing: 1px;
}
.header-status {
font-size: 9px !important;
gap: 5px;
max-width: 100px;
white-space: normal;
text-align: right;
}
#service-status {
font-size: 9px !important;
padding: 4px 6px !important;
}
#clock {
font-size: 9px;
}
.section-head {
gap: 12px;
align-items: flex-start;
flex-wrap: wrap;
}
.section-head > .btn {
margin-left: 0;
font-size: 11px;
}
h2 {
font-size: 17px !important;
}
.home-toolbar {
gap: 13px;
}
.home-layout-controls {
gap: 9px;
width: 100%;
font-size: 11px;
}
.home-layout-controls .form-select {
min-height: 32px;
font-size: 11px;
}
.home-layout-controls .btn {
font-size: 11px;
min-height: 32px;
}
.home-card-grid {
grid-template-columns: minmax(0, 1fr) !important;
gap: 17px !important;
}
.home-cover {
height: 170px !important;
min-height: 170px !important;
}
.home-cover-content {
padding: 16px 18px !important;
}
.card-body {
padding: 17px;
}
.home-numbers b {
font-size: 21px;
}
.home-pagination {
flex-wrap: wrap;
}
.home-pagination span {
width: 100%;
}
.home-pagination .btn {
flex: 1;
}
.household-context {
padding: 10px !important;
gap: 9px;
}
.household-context label {
width: 100%;
}
.household-context select {
max-width: none;
flex: 1;
min-width: 0;
}
#household-context-note {
display: none;
}
#scope-back {
width: 100%;
margin: 0;
}
.metrics {
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 10px;
}
.metrics > div {
padding: 11px 13px !important;
}
.metrics strong {
font-size: 20px !important;
}
.filter-row {
gap: 9px;
}
.filter-row label {
flex: 1;
min-width: 0;
}
.filter-row select {
width: 100%;
min-width: 0;
}
#filter-caption {
display: none;
}
.filter-row > button {
font-size: 11px;
}
.panel {
padding: 17px !important;
}
.form-grid {
grid-template-columns: minmax(0, 1fr) !important;
gap: 14px !important;
}
.form-grid > * {
min-width: 0;
grid-column: auto;
}
.form-grid .full {
grid-column: 1;
}
.site-grid,
.steward-grid,
.platform-place-grid,
.device-card-grid {
grid-template-columns: minmax(0, 1fr) !important;
}
.device-view-controls {
display: flex;
flex-direction: column;
align-items: stretch;
}
.device-view-controls label {
width: 100%;
}
.device-view-controls input,
.device-view-controls select {
width: 100%;
min-width: 0;
}
.network-node {
margin-left: calc(min(var(--depth), 2) * 12px);
}
.network-node.nested::before {
left: -10px;
width: 8px;
}
.network-node .card-body {
padding: 14px;
}
.network-facts {
display: grid;
gap: 6px;
}
.network-platform {
padding: 16px;
}
.network-platform h3 {
font-size: 16px !important;
}
.network-target {
font-size: 10px;
}
.network-target code {
font-size: 10px;
word-break: break-all;
}
.management-links a {
max-width: 100%;
font-size: 10px;
}
.network-node .device-card-heading h3 {
font-size: 14px !important;
}
.network-node .device-title {
font-size: 14px !important;
}
.device-context [role="group"] {
display: flex;
flex-wrap: wrap;
gap: 7px;
}
.device-context .btn {
flex: 1;
min-width: 100px;
font-size: 11px;
}
.steward-tile {
min-height: 145px !important;
}
.steward-tile strong {
font-size: 18px !important;
}
.journal-card {
padding: 17px !important;
}
.journal-attachments {
grid-template-columns: minmax(0, 1fr) !important;
}
.journal-attachments audio,
.journal-attachments video {
width: 100%;
max-width: 100%;
}
.journal-upload-controls {
display: flex;
flex-wrap: wrap;
}
.journal-upload-controls > * {
max-width: 100%;
}
.settings-sections {
gap: 6px;
}
.settings-sections .btn {
flex: 1;
min-width: calc(50% - 6px);
font-size: 11px;
}
dialog {
max-width: calc(100vw - 20px) !important;
padding: 20px !important;
max-height: calc(100dvh - 20px);
border-radius: 12px !important;
}
dialog h2 {
font-size: 19px !important;
}
dialog .dialog-heading {
padding-bottom: 14px !important;
margin-bottom: 16px !important;
}
dialog .dialog-heading .btn {
min-width: 54px;
}
#auth-dialog {
padding: 25px !important;
}
.brand-image-grid {
grid-template-columns: 1fr !important;
}
#toast {
bottom: 16px;
right: 16px;
font-size: 12px !important;
}
.wall-toolbar {
gap: 7px;
}
.wall-toolbar label {
width: auto;
}
.table-wrap {
max-width: 100%;
}
main > footer {
font-size: 9px !important;
gap: 10px;
flex-wrap: wrap;
}
.network-node .device-card-heading > .btn {
font-size: 10px;
min-height: 28px;
padding: 3px 7px;
}
html[data-layout="top"] .sidebar.mobile-open nav button {
width: 100% !important;
}
}
@media (min-width: 768px) {
.sidebar > .mobile-nav-toggle {
display: none !important;
}
}
.sidebar nav button {
justify-content: flex-start !important;
}
.sidebar nav button.active::after {
display: none !important;
}
.section-head > div:first-child {
display: block;
}
.inline-check .form-check-input {
width: 16px !important;
height: 16px !important;
min-height: 0 !important;
padding: 0 !important;
}
.form-check-input {
padding: 0 !important;
}
.dialog-footer {
display: flex;
justify-content: flex-end;
gap: 10px;
margin-top: 20px;
padding-top: 18px;
border-top: 1px solid var(--ui-line);
}
html[data-font="serif"] #page-title,
html[data-font="serif"] .scope-intro h2 {
font-family: "Noto Serif SC", "Songti SC", "SimSun", serif !important;
font-weight: 600 !important;
}
.live-help { margin: 10px 0; color: var(--ui-muted); font-size: 13px; }
.live-help summary { cursor: pointer; padding: 8px 0; }
.live-help p { margin: 8px 0; }
#page-live.wall-expanded { position: fixed; inset: 0; z-index: 10000; margin: 0; }
#page-live:is(:fullscreen,.wall-expanded) > .live-help { display: none; }
#page-live:is(:fullscreen,.wall-expanded) .live-grid[data-visible-count="1"] {
grid-template-columns: minmax(0,1fr); grid-template-rows: minmax(0,1fr);
}
.leadership-member-actions .btn { white-space: normal; }
#leadership-grant { align-items: flex-start; padding: 14px; }
#leadership-grant span { line-height: 1.7; }
@media (max-width: 767px) {
#app > main { padding-bottom: max(20px,env(safe-area-inset-bottom)) !important; }
main[data-page="live"] > header { margin-bottom: 12px !important; padding-bottom: 12px !important; }
main[data-page="live"] > header .eyebrow,
main[data-page="live"] #page-note,
main[data-page="live"] > .metrics { display: none !important; }
main[data-page="live"] .household-context { margin-bottom: 12px; flex-wrap: nowrap; }
main[data-page="live"] .household-context label { flex: 1; width: auto; font-size: 0; }
main[data-page="live"] .household-context select { font-size: 16px; width: 100%; }
main[data-page="live"] #scope-back { width: auto; min-width: 82px; }
main[data-page="live"] > .filter-row { margin: 12px 0; }
#page-live:not([hidden]) { display: flex; flex-direction: column; }
#page-live > .section-head { order: 0; margin: 6px 0 12px; }
#page-live > .live-grid { order: 1; }
#page-live > .wall-toolbar { order: 2; }
#page-live > .live-help { order: 3; }
#page-live:not(:fullscreen):not(.wall-expanded) .live-grid[data-layout="auto"] { grid-template-columns: minmax(0,1fr); }
.camera-actions { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); padding: 0 12px 12px; }
.camera-actions .btn { min-height: 44px; white-space: normal; font-size: 13px; }
.camera-meta { padding: 12px; }
.camera-meta strong { font-size: 15px !important; }
.wall-toolbar .wall-paging { flex: 1; justify-content: space-between; }
.wall-toolbar .btn { min-width: 44px; min-height: 44px; }
#page-live:is(:fullscreen,.wall-expanded) { padding: max(8px,env(safe-area-inset-top)) max(8px,env(safe-area-inset-right)) max(8px,env(safe-area-inset-bottom)) max(8px,env(safe-area-inset-left)); }
#page-live:is(:fullscreen,.wall-expanded) > .wall-toolbar { order: 0; }
#page-live:is(:fullscreen,.wall-expanded) .live-grid[data-layout="auto"] { grid-template-columns: repeat(2,minmax(0,1fr)); }
#page-live:is(:fullscreen,.wall-expanded) .live-grid[data-visible-count="1"] { grid-template-columns: minmax(0,1fr); grid-template-rows: minmax(0,1fr); }
#page-live:is(:fullscreen,.wall-expanded) .camera-actions { display: none; }
.network-target { display: grid; grid-template-columns: 76px minmax(0,1fr) auto; font-size: 12px; gap: 8px; }
.network-target code { font-size: 13px !important; }
.network-check-time { font-size: 12px; line-height: 1.7; }
.management-links { display: grid; grid-template-columns: minmax(0,1fr); }
.management-links .btn { min-height: 44px !important; font-size: 13px !important; white-space: normal; }
dialog .description,dialog label { font-size: 14px !important; }
dialog .dialog-footer { position: sticky; bottom: -20px; background: var(--ui-surface); padding: 14px 0; margin-bottom: -10px; }
dialog .dialog-footer .btn { flex: 1; min-height: 44px; white-space: normal; }
.leadership-member-actions .btn { flex: 1; min-width: 120px; }
#leadership-grant { display: flex; gap: 10px; }
#leadership-grant[hidden] { display: none; }
}
html[data-backdrop="mountains"] #app > main {
background-image:
linear-gradient(150deg, transparent 70%, #8ba58f08 70%, transparent 85%),
linear-gradient(170deg, transparent 60%, #8ba58f06 60%, transparent 90%) !important;
background-size: 100% 360px !important;
background-repeat: no-repeat !important;
}
@media (max-width: 767px) {
.form-control,
.form-select {
font-size: 16px !important;
min-height: 44px;
}
.btn {
min-height: 42px;
font-size: 13px;
}
.home-layout-controls .form-select {
font-size: 14px !important;
min-height: 40px;
}
.home-layout-controls .btn,
.network-status-title .btn,
.management-links .btn {
min-height: 40px;
font-size: 12px;
}
.network-target code {
font-size: 12px;
}
.mobile-nav-toggle {
min-height: 42px;
}
.device-card-actions .btn {
min-height: 42px;
font-size: 12px;
}
}