362 lines
9.6 KiB
CSS
362 lines
9.6 KiB
CSS
/* vibedns management interface
|
|
*
|
|
* A thin layer on top of Bootstrap 5: an app shell with a fixed sidebar,
|
|
* a small set of component styles, and colour tokens that follow Bootstrap's
|
|
* own light/dark switch so the whole UI flips with one attribute.
|
|
*/
|
|
|
|
:root {
|
|
--app-sidebar-width: 248px;
|
|
--app-navbar-height: 56px;
|
|
--app-brand: #1b6ec2;
|
|
--app-brand-dark: #14508c;
|
|
--app-sidebar-bg: #ffffff;
|
|
--app-sidebar-border: var(--bs-border-color);
|
|
--app-sidebar-link: #495057;
|
|
--app-sidebar-link-hover-bg: #f1f3f5;
|
|
--app-sidebar-active-bg: #e7f1fb;
|
|
--app-sidebar-active-color: var(--app-brand-dark);
|
|
--app-body-bg: #f6f8fa;
|
|
--app-card-shadow: 0 1px 2px rgba(16, 24, 40, .06), 0 1px 3px rgba(16, 24, 40, .08);
|
|
}
|
|
|
|
[data-bs-theme="dark"] {
|
|
--app-brand: #4c9be8;
|
|
--app-brand-dark: #7cb8f0;
|
|
--app-sidebar-bg: #17191d;
|
|
--app-sidebar-border: #2b2f36;
|
|
--app-sidebar-link: #adb5bd;
|
|
--app-sidebar-link-hover-bg: #22252b;
|
|
--app-sidebar-active-bg: #1d2b3a;
|
|
--app-sidebar-active-color: #8fc3f5;
|
|
--app-body-bg: #101214;
|
|
--app-card-shadow: 0 1px 2px rgba(0, 0, 0, .4);
|
|
}
|
|
|
|
body {
|
|
background-color: var(--app-body-bg);
|
|
font-size: .9375rem;
|
|
}
|
|
|
|
.skip-link {
|
|
position: absolute;
|
|
top: .5rem;
|
|
left: .5rem;
|
|
z-index: 2000;
|
|
background: var(--bs-body-bg);
|
|
padding: .5rem .75rem;
|
|
border-radius: .375rem;
|
|
}
|
|
|
|
/* --- Shell ------------------------------------------------------------ */
|
|
|
|
.app-navbar {
|
|
background: linear-gradient(90deg, var(--app-brand-dark), var(--app-brand));
|
|
min-height: var(--app-navbar-height);
|
|
box-shadow: 0 1px 3px rgba(16, 24, 40, .15);
|
|
z-index: 1030;
|
|
}
|
|
|
|
.app-navbar .navbar-brand {
|
|
color: #fff;
|
|
font-weight: 600;
|
|
letter-spacing: .01em;
|
|
}
|
|
|
|
.app-navbar .navbar-brand:hover { color: #fff; }
|
|
|
|
.status-dot {
|
|
width: .55rem;
|
|
height: .55rem;
|
|
border-radius: 50%;
|
|
background: #adb5bd;
|
|
display: inline-block;
|
|
}
|
|
|
|
.status-dot.status-up {
|
|
background: #2fb344;
|
|
box-shadow: 0 0 0 3px rgba(47, 179, 68, .25);
|
|
}
|
|
|
|
.status-dot.status-down {
|
|
background: #d63939;
|
|
box-shadow: 0 0 0 3px rgba(214, 57, 57, .25);
|
|
}
|
|
|
|
.app-shell { display: flex; align-items: flex-start; }
|
|
|
|
.app-sidebar {
|
|
width: var(--app-sidebar-width);
|
|
flex: 0 0 var(--app-sidebar-width);
|
|
position: sticky;
|
|
top: var(--app-navbar-height);
|
|
height: calc(100vh - var(--app-navbar-height));
|
|
overflow-y: auto;
|
|
background: var(--app-sidebar-bg);
|
|
border-right: 1px solid var(--app-sidebar-border);
|
|
}
|
|
|
|
.app-main { flex: 1 1 auto; min-width: 0; }
|
|
|
|
.app-offcanvas { width: var(--app-sidebar-width); }
|
|
|
|
.sidebar-nav { padding: .75rem .5rem 2rem; }
|
|
|
|
.sidebar-heading {
|
|
font-size: .6875rem;
|
|
font-weight: 700;
|
|
text-transform: uppercase;
|
|
letter-spacing: .06em;
|
|
color: var(--bs-secondary-color);
|
|
padding: 1rem .75rem .35rem;
|
|
}
|
|
|
|
.sidebar-link {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: .625rem;
|
|
padding: .5rem .75rem;
|
|
margin-bottom: .0625rem;
|
|
border-radius: .375rem;
|
|
color: var(--app-sidebar-link);
|
|
text-decoration: none;
|
|
font-weight: 500;
|
|
transition: background-color .12s ease, color .12s ease;
|
|
}
|
|
|
|
.sidebar-link i { font-size: 1rem; width: 1.25rem; text-align: center; flex: none; }
|
|
|
|
.sidebar-link:hover {
|
|
background: var(--app-sidebar-link-hover-bg);
|
|
color: var(--bs-body-color);
|
|
}
|
|
|
|
.sidebar-link.active {
|
|
background: var(--app-sidebar-active-bg);
|
|
color: var(--app-sidebar-active-color);
|
|
font-weight: 600;
|
|
}
|
|
|
|
/* --- Typography and cards --------------------------------------------- */
|
|
|
|
.page-title {
|
|
font-size: 1.5rem;
|
|
font-weight: 600;
|
|
margin-bottom: .125rem;
|
|
}
|
|
|
|
.card {
|
|
border-color: var(--bs-border-color);
|
|
box-shadow: var(--app-card-shadow);
|
|
}
|
|
|
|
.card-header {
|
|
background: transparent;
|
|
border-bottom-color: var(--bs-border-color);
|
|
font-weight: 600;
|
|
padding-block: .75rem;
|
|
}
|
|
|
|
.stat-card .card-body { padding: 1rem 1.125rem; }
|
|
|
|
.stat-label {
|
|
font-size: .75rem;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
letter-spacing: .04em;
|
|
color: var(--bs-secondary-color);
|
|
}
|
|
|
|
.stat-value {
|
|
font-size: 1.75rem;
|
|
font-weight: 600;
|
|
line-height: 1.2;
|
|
margin-top: .25rem;
|
|
font-variant-numeric: tabular-nums;
|
|
}
|
|
|
|
.stat-sub { font-size: .8125rem; color: var(--bs-secondary-color); margin-top: .125rem; }
|
|
|
|
.stat-icon { font-size: 1.125rem; color: var(--bs-secondary-color); opacity: .75; }
|
|
|
|
/* --- Tables ------------------------------------------------------------ */
|
|
|
|
.table { --bs-table-bg: transparent; margin-bottom: 0; }
|
|
|
|
.table > thead > tr > th {
|
|
font-size: .75rem;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
letter-spacing: .04em;
|
|
color: var(--bs-secondary-color);
|
|
border-bottom-width: 1px;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.table > tbody > tr > td { vertical-align: middle; }
|
|
|
|
.table-hover > tbody > tr:hover > * { --bs-table-accent-bg: var(--app-sidebar-link-hover-bg); }
|
|
|
|
.table-compact > :not(caption) > * > * { padding: .5rem .625rem; }
|
|
|
|
.mono {
|
|
font-family: var(--bs-font-monospace);
|
|
font-size: .8125rem;
|
|
}
|
|
|
|
.truncate-cell {
|
|
max-width: 26rem;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.row-actions { white-space: nowrap; text-align: right; }
|
|
|
|
.row-actions .btn { --bs-btn-padding-y: .1875rem; --bs-btn-padding-x: .4375rem; }
|
|
|
|
/* Disabled rows read as inactive without disappearing. */
|
|
tr.is-disabled > td:not(.row-actions) { opacity: .55; }
|
|
|
|
/* --- Record type chips ------------------------------------------------- */
|
|
|
|
.type-chip {
|
|
display: inline-block;
|
|
min-width: 3.75rem;
|
|
text-align: center;
|
|
padding: .1875rem .4375rem;
|
|
border-radius: .25rem;
|
|
font-size: .75rem;
|
|
font-weight: 600;
|
|
font-family: var(--bs-font-monospace);
|
|
border: 1px solid transparent;
|
|
}
|
|
|
|
.type-addr { background: #e7f1fb; color: #14508c; border-color: #c9e0f7; }
|
|
.type-alias { background: #f3e8fd; color: #6b21a8; border-color: #e4d0fb; }
|
|
.type-service { background: #e6f7f1; color: #0f6b52; border-color: #c5ecdf; }
|
|
.type-auth { background: #fef3e2; color: #92500e; border-color: #fbe0b8; }
|
|
.type-text { background: #eef0f2; color: #41474d; border-color: #dde1e5; }
|
|
.type-sec { background: #fde8ec; color: #9b1c33; border-color: #f8ccd6; }
|
|
.type-ptr { background: #e8f4fd; color: #0b5d7a; border-color: #cbe6f6; }
|
|
.type-other { background: #eef0f2; color: #41474d; border-color: #dde1e5; }
|
|
|
|
[data-bs-theme="dark"] .type-addr { background: #12283d; color: #8fc3f5; border-color: #1d3d5c; }
|
|
[data-bs-theme="dark"] .type-alias { background: #2a1a3d; color: #cba6f7; border-color: #3d2757; }
|
|
[data-bs-theme="dark"] .type-service { background: #12302a; color: #7ad4b3; border-color: #1c4a3f; }
|
|
[data-bs-theme="dark"] .type-auth { background: #362508; color: #f0c674; border-color: #4d360f; }
|
|
[data-bs-theme="dark"] .type-text { background: #22252b; color: #adb5bd; border-color: #32363d; }
|
|
[data-bs-theme="dark"] .type-sec { background: #3a151f; color: #f2a1b2; border-color: #55202e; }
|
|
[data-bs-theme="dark"] .type-ptr { background: #102b36; color: #86cfe8; border-color: #1a4252; }
|
|
[data-bs-theme="dark"] .type-other { background: #22252b; color: #adb5bd; border-color: #32363d; }
|
|
|
|
/* --- Empty states ------------------------------------------------------ */
|
|
|
|
.empty-state { color: var(--bs-secondary-color); }
|
|
|
|
.empty-icon {
|
|
font-size: 2.75rem;
|
|
color: var(--bs-secondary-color);
|
|
opacity: .45;
|
|
}
|
|
|
|
/* --- Forms ------------------------------------------------------------- */
|
|
|
|
.form-label { font-weight: 500; margin-bottom: .3125rem; }
|
|
|
|
.form-text { font-size: .8125rem; }
|
|
|
|
.settings-nav .nav-link {
|
|
--bs-nav-pills-border-radius: .375rem;
|
|
padding: .375rem .75rem;
|
|
font-size: .875rem;
|
|
font-weight: 500;
|
|
color: var(--bs-body-color);
|
|
}
|
|
|
|
.settings-nav .nav-link:not(.active):hover { background: var(--app-sidebar-link-hover-bg); }
|
|
|
|
.form-section + .form-section { margin-top: 1.5rem; padding-top: 1.5rem; border-top: 1px solid var(--bs-border-color); }
|
|
|
|
.form-section-title { font-size: .9375rem; font-weight: 600; margin-bottom: .875rem; }
|
|
|
|
textarea.list-input {
|
|
font-family: var(--bs-font-monospace);
|
|
font-size: .8125rem;
|
|
min-height: 7.5rem;
|
|
}
|
|
|
|
/* Sticky action bar for long settings forms. */
|
|
.form-actions {
|
|
position: sticky;
|
|
bottom: 0;
|
|
background: var(--bs-body-bg);
|
|
border-top: 1px solid var(--bs-border-color);
|
|
padding: .875rem 1.125rem;
|
|
margin: 1.5rem -1.125rem -1.125rem;
|
|
border-radius: 0 0 var(--bs-card-border-radius) var(--bs-card-border-radius);
|
|
}
|
|
|
|
/* --- Charts ------------------------------------------------------------ */
|
|
|
|
.chart-wrap { position: relative; height: 260px; }
|
|
|
|
.chart-wrap-sm { position: relative; height: 200px; }
|
|
|
|
/* --- Misc -------------------------------------------------------------- */
|
|
|
|
.bulk-bar {
|
|
display: none;
|
|
align-items: center;
|
|
gap: .75rem;
|
|
padding: .625rem .875rem;
|
|
background: var(--app-sidebar-active-bg);
|
|
border: 1px solid var(--bs-border-color);
|
|
border-radius: .375rem;
|
|
margin-bottom: .75rem;
|
|
}
|
|
|
|
.bulk-bar.is-visible { display: flex; }
|
|
|
|
.token-secret {
|
|
font-family: var(--bs-font-monospace);
|
|
font-size: .875rem;
|
|
word-break: break-all;
|
|
background: var(--bs-tertiary-bg);
|
|
padding: .625rem .75rem;
|
|
border-radius: .375rem;
|
|
border: 1px solid var(--bs-border-color);
|
|
}
|
|
|
|
.answer-block {
|
|
font-family: var(--bs-font-monospace);
|
|
font-size: .8125rem;
|
|
white-space: pre-wrap;
|
|
word-break: break-all;
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.progress-thin { height: .375rem; }
|
|
|
|
.list-meta { display: flex; flex-wrap: wrap; gap: 1.25rem; }
|
|
|
|
.list-meta > div { min-width: 7rem; }
|
|
|
|
.list-meta dt {
|
|
font-size: .75rem;
|
|
text-transform: uppercase;
|
|
letter-spacing: .04em;
|
|
color: var(--bs-secondary-color);
|
|
font-weight: 600;
|
|
}
|
|
|
|
.list-meta dd { font-size: 1.125rem; font-weight: 600; margin-bottom: 0; }
|
|
|
|
@media (max-width: 991.98px) {
|
|
.app-sidebar { display: none; }
|
|
}
|
|
|
|
@media print {
|
|
.app-sidebar, .app-navbar, .toast-container, .row-actions { display: none !important; }
|
|
}
|