Files
RustProxy/src/admin/web/style.css
T
2026-10-05 17:05:06 +02:00

8281 lines
136 KiB
CSS

:root {
color-scheme: dark;
--bg: #131615;
--panel: #1b1f1d;
--panel2: #202622;
--line: #323a34;
--muted: #a0aaa0;
--text: #edf0e9;
--accent: #f69b74;
--green: #bdd293;
--red: #ffaaa2;
--sidebar-bg: #101310;
--brand-secondary: #cfe0ac;
--nav-active-bg: #242b23;
--nav-hover-bg: #20251f;
--text-subtle: #879082;
--separator: #596454;
--border-hover: #89917c;
--field-bg: #131813;
--field-line: #47523f;
--placeholder: #778070;
--row-line: #2b332c;
--outline-line: #717b67;
--chart-grid: #333c33;
--code-bg: #101810;
--code-alt-bg: #101922;
--code-alt-text: #d3e4ec;
--nav-selected-bg: #34412a;
--accent-ink: #221810;
--accent-hover: #ffb090;
--selected-ink: #10251e;
--notice-text: #c9b99c;
--notice-line: #554833;
--notice-bg: #29251c;
--pill-line: #6d5a45;
--pill-live-line: #576847;
--toast-bg: #d0dfb4;
--toast-text: #1c2818;
--toast-line: #ebf2de;
--toast-error-bg: #ffd2bd;
--toast-error-line: #ff9f7a;
--toast-error-text: #42241b;
--danger-line: #644a47;
--danger-line-strong: #79514e;
--warn-line: #786647;
--blue: #8ebcff;
--transform-chart: #d7adff;
--backdrop: rgb(0 0 0 / .68);
--backdrop-soft: #070d12b8;
--shadow-mid: #0006;
--shadow-strong: #0009;
--neutral-soft: rgba(127, 127, 127, .05);
--scrollbar-track: #151a16;
--scrollbar-thumb: #4f5d50;
--scrollbar-thumb-hover: #6b7b69;
--mono: ui-monospace, SFMono-Regular, Consolas, monospace;
--sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif
}
html[data-theme="light"] {
color-scheme: light;
--bg: #f4f6f2;
--panel: #ffffff;
--panel2: #edf1eb;
--line: #cbd3c7;
--muted: #5e685f;
--text: #1d241f;
--accent: #b85b38;
--green: #5f783f;
--red: #b64a43;
--sidebar-bg: #eef2ec;
--brand-secondary: #6b8249;
--nav-active-bg: #e1e8dc;
--nav-hover-bg: #e8ede6;
--text-subtle: #687369;
--separator: #9ba69b;
--border-hover: #839083;
--field-bg: #ffffff;
--field-line: #b7c1b5;
--placeholder: #7a867b;
--row-line: #e0e5dd;
--outline-line: #98a497;
--chart-grid: #d4dbd1;
--code-bg: #edf3e9;
--code-alt-bg: #eef3f6;
--code-alt-text: #2d4049;
--nav-selected-bg: #e1e9db;
--accent-ink: #ffffff;
--accent-hover: #a84f30;
--selected-ink: #ffffff;
--notice-text: #685b45;
--notice-line: #d4c2a5;
--notice-bg: #fff9ef;
--pill-line: #cbb28f;
--pill-live-line: #a8ba8d;
--danger-line: #d7a29d;
--danger-line-strong: #c98f89;
--warn-line: #c6b27e;
--blue: #4f77a9;
--transform-chart: #7d4fa3;
--shadow-mid: rgb(31 39 33 / .16);
--shadow-strong: rgb(31 39 33 / .26);
--neutral-soft: rgba(70, 78, 72, .05);
--scrollbar-track: #e7ece4;
--scrollbar-thumb: #a9b5a6;
--scrollbar-thumb-hover: #879684
}
* {
box-sizing: border-box;
scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);
scrollbar-width: thin
}
*::-webkit-scrollbar {
width: 10px;
height: 10px
}
*::-webkit-scrollbar-track {
background: var(--scrollbar-track)
}
*::-webkit-scrollbar-thumb {
background: var(--scrollbar-thumb);
border: 2px solid var(--scrollbar-track);
border-radius: 999px
}
*::-webkit-scrollbar-thumb:hover {
background: var(--scrollbar-thumb-hover)
}
*::-webkit-scrollbar-corner {
background: var(--scrollbar-track)
}
html.app-loading {
background: var(--bg)
}
html.app-loading body {
visibility: hidden
}
body {
margin: 0;
background: var(--bg);
color: var(--text);
font-family: var(--sans);
font-size: 14px;
line-height: 1.5
}
button,
input,
select,
textarea {
font: inherit
}
button,
a,
input,
textarea,
select {
-webkit-tap-highlight-color: transparent
}
button,
a {
touch-action: manipulation
}
button {
cursor: pointer
}
button:disabled {
opacity: .5;
cursor: wait
}
[hidden] {
display: none !important
}
a {
color: inherit;
text-decoration: none
}
h1,
h2,
h3,
p {
margin: 0
}
button:focus-visible,
a:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 4px
}
button {
border: 0
}
h2 {
font-size: 20px;
letter-spacing: -.5px
}
h3 {
font-size: 17px;
margin-bottom: 16px
}
.shell {
display: grid;
grid-template-columns: 218px minmax(0, 1fr);
min-height: 100vh
}
.sidebar {
position: sticky;
top: 0;
height: 100vh;
background: var(--sidebar-bg);
border-right: 1px solid var(--line);
padding: 34px 22px;
display: flex;
flex-direction: column
}
.brand {
display: flex;
gap: 12px;
align-items: center;
font-weight: 780;
letter-spacing: 2px;
font-size: 17px;
line-height: 1.1
}
.brand-mark {
font: 700 33px var(--mono);
letter-spacing: -5px;
width: 63px;
height: 61px;
border: 1px solid var(--accent);
color: var(--accent);
display: grid;
place-content: center;
position: relative
}
.brand-mark span {
position: absolute;
font-size: 22px;
left: 29px;
top: 19px;
color: var(--brand-secondary)
}
.edition {
font: 9px/1.6 var(--mono);
color: var(--muted);
letter-spacing: 1px;
margin: 22px 0 52px
}
.edition span {
display: block;
color: var(--accent);
margin-top: 5px
}
nav {
display: flex;
flex-direction: column;
gap: 9px
}
.nav {
display: flex;
align-items: center;
gap: 13px;
text-align: left;
padding: 13px 12px;
background: transparent;
color: var(--muted);
border-left: 2px solid transparent
}
.nav span {
font: 11px var(--mono);
opacity: .65
}
.nav b {
font-weight: 530
}
.nav.active {
background: var(--nav-active-bg);
color: var(--green);
border-left-color: var(--green)
}
.nav:hover {
background: var(--nav-hover-bg)
}
.sidebar-bottom {
margin-top: auto;
padding-top: 32px
}
.small-label {
font: 10px var(--mono);
letter-spacing: 1.6px;
color: var(--muted)
}
.sidebar-bottom p {
font-size: 11px;
line-height: 1.9;
color: var(--text-subtle);
margin: 13px 0 26px
}
.local-tag {
font: 9px var(--mono);
color: var(--green);
display: flex;
gap: 8px;
align-items: center
}
.local-tag i,
.signal {
display: inline-block;
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--green)
}
main {
min-width: 0;
padding: 0 44px;
max-width: 1700px;
width: 100%;
margin: auto
}
.topbar {
height: 86px;
border-bottom: 1px solid var(--line);
display: flex;
justify-content: space-between;
align-items: center;
gap: 14px
}
.breadcrumb {
font: 10px var(--mono);
color: var(--muted);
letter-spacing: 1px
}
.breadcrumb span {
margin: 0 13px;
color: var(--separator)
}
.breadcrumb b {
font-weight: 400;
color: var(--text)
}
.top-actions {
display: flex;
gap: 12px;
align-items: center
}
.version {
font: 10px var(--mono);
color: var(--muted)
}
.quiet {
background: transparent;
color: var(--muted);
border: 1px solid var(--line);
padding: 8px 13px;
border-radius: 3px
}
.quiet:hover {
color: var(--text);
border-color: var(--border-hover)
}
.primary {
background: var(--accent);
color: var(--accent-ink);
border: 1px solid var(--accent);
font-weight: 650;
border-radius: 3px;
padding: 11px 18px;
white-space: nowrap
}
.primary:hover {
background: var(--accent-hover)
}
.outline {
display: inline-flex;
justify-content: center;
align-items: center;
border: 1px solid var(--outline-line);
background: transparent;
color: var(--text);
border-radius: 3px;
padding: 10px 16px;
font-size: 12px;
white-space: nowrap
}
.outline:hover {
border-color: var(--accent)
}
.eyebrow {
font: 10px var(--mono);
letter-spacing: 2px;
color: var(--green);
display: flex;
gap: 8px;
align-items: center;
margin-bottom: 16px
}
h1 {
font-size: clamp(32px, 3.6vw, 52px);
line-height: 1.1;
font-weight: 520;
letter-spacing: -2px
}
.lead {
font-size: 13px;
line-height: 1.7;
color: var(--muted);
margin-top: 15px;
max-width: 690px
}
.page-intro {
padding: 38px 0 28px;
display: flex;
justify-content: space-between;
align-items: center;
gap: 25px
}
.notice {
display: flex;
gap: 13px;
padding: 12px 15px;
font-size: 11px;
line-height: 1.65;
color: var(--notice-text);
border: 1px solid var(--notice-line);
background: var(--notice-bg);
margin-bottom: 25px;
border-radius: 3px
}
.notice b {
font-family: var(--mono);
color: var(--accent)
}
.stats-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 15px;
margin-bottom: 21px
}
.stat {
padding: 21px 22px;
border: 1px solid var(--line);
background: var(--panel);
position: relative
}
.stat:first-child {
border-top: 2px solid var(--accent)
}
.stat>span {
color: var(--muted);
font-size: 12px
}
.stat strong {
display: block;
font-family: var(--mono);
font-size: clamp(24px, 2.8vw, 36px);
font-weight: 450;
letter-spacing: -1px;
margin: 10px 0 8px
}
.stat small {
color: var(--muted);
font-size: 10px
}
.stat:first-child small {
color: var(--green)
}
.overview-grid {
display: grid;
grid-template-columns: minmax(0, 1.8fr) minmax(255px, 1fr);
gap: 21px;
margin-bottom: 23px
}
.card {
border: 1px solid var(--line);
background: var(--panel);
padding: 23px;
min-width: 0
}
.card-heading {
display: flex;
align-items: center;
justify-content: space-between;
gap: 15px;
margin-bottom: 20px
}
.card-heading .small-label {
display: block;
margin-bottom: 8px
}
.pill {
padding: 4px 8px;
border: 1px solid var(--pill-line);
color: var(--accent);
font: 9px var(--mono);
letter-spacing: 1px
}
.pill.live {
border-color: var(--pill-live-line);
color: var(--green)
}
#traffic-chart {
width: 100%;
height: 144px;
margin: 8px 0 5px
}
.chart-grid {
stroke: var(--chart-grid);
stroke-width: 1;
fill: none;
stroke-dasharray: 2 5
}
#sparkline {
stroke: var(--accent);
stroke-width: 2;
fill: none;
vector-effect: non-scaling-stroke
}
.chart-footer {
display: flex;
justify-content: space-between;
color: var(--muted);
font: 9px var(--mono);
gap: 10px
}
.runtime-card dl {
margin: 18px 0 0
}
.runtime-card dl div {
display: flex;
justify-content: space-between;
gap: 12px;
margin-top: 13px;
padding-bottom: 11px;
border-bottom: 1px solid var(--line)
}
.runtime-card dl div:last-child {
border-bottom: 0;
padding-bottom: 0
}
.runtime-card dt {
color: var(--muted);
font-size: 11px
}
.runtime-card dd {
font: 12px var(--mono);
margin: 0
}
.table-scroll {
overflow: auto
}
table {
width: 100%;
border-collapse: collapse;
text-align: left;
font-size: 11px;
white-space: nowrap
}
th {
font: 10px var(--mono);
color: var(--muted);
font-weight: 400;
padding: 9px 12px 12px;
border-bottom: 1px solid var(--line)
}
td {
padding: 12px;
border-bottom: 1px solid var(--row-line);
font-family: var(--mono);
max-width: 260px;
overflow: hidden;
text-overflow: ellipsis
}
td:first-child {
color: var(--muted)
}
.status-good {
color: var(--green)
}
.status-error {
color: var(--red)
}
.meta,
.fine {
font-size: 11px;
line-height: 1.7;
color: var(--muted)
}
.empty {
padding: 26px 4px;
color: var(--muted);
font-size: 12px
}
.section-heading {
display: flex;
justify-content: space-between;
align-items: center;
gap: 10px;
margin: 25px 0 17px
}
.section-heading h2 {
margin-top: 7px
}
.config-columns {
display: grid;
grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr);
gap: 20px
}
.entity {
padding: 17px 0;
border-bottom: 1px solid var(--line)
}
.entity:first-child {
padding-top: 0
}
.entity:last-child {
border-bottom: 0;
padding-bottom: 0
}
.entity-top {
display: flex;
justify-content: space-between;
align-items: center;
gap: 12px
}
.entity-title {
font-weight: 650;
font-size: 14px
}
.entity-details {
font: 11px/1.8 var(--mono);
color: var(--muted);
margin: 10px 0;
overflow-wrap: anywhere
}
.entity-actions {
display: flex;
gap: 8px;
flex-wrap: wrap
}
.entity-actions button {
padding: 5px 9px;
font-size: 10px
}
.entity small {
font: 9px var(--mono);
color: var(--green)
}
.edit-form label,
.login-card label {
display: block;
color: var(--muted);
font-size: 11px;
margin: 16px 0 7px
}
input:not([type="checkbox"]):not([type="radio"]),
select,
textarea {
display: block;
width: 100%;
background: var(--field-bg);
border: 1px solid var(--field-line);
border-radius: 3px;
padding: 11px 12px;
color: var(--text);
font-size: 12px;
min-width: 0
}
input:not([type="checkbox"]):not([type="radio"]):focus,
select:focus,
textarea:focus {
outline: 1px solid var(--green);
border-color: var(--green)
}
input::placeholder {
color: var(--placeholder)
}
input[type="checkbox"],
input[type="radio"] {
display: inline-block;
width: 15px;
height: 15px;
min-width: 15px;
min-height: 15px;
padding: 0;
margin: 0;
accent-color: var(--green);
vertical-align: middle
}
input.field-invalid,
select.field-invalid,
textarea.field-invalid {
border-color: var(--red) !important;
outline: 1px solid rgb(255 170 162 / .72);
}
.listener-choices.field-invalid,
.host-chip-editor.field-invalid {
border-color: var(--red) !important;
box-shadow: 0 0 0 1px rgb(255 170 162 / .38);
}
.settings-tabs button.has-unsaved::after {
content: "";
display: inline-block;
width: 6px;
height: 6px;
margin-left: 7px;
border-radius: 50%;
background: currentColor;
vertical-align: middle;
opacity: .78;
}
button.is-saving {
cursor: progress;
}
.check {
display: flex !important;
align-items: center;
gap: 9px;
margin-top: 13px !important
}
.form-actions {
display: flex;
align-items: center;
gap: 13px;
flex-wrap: wrap;
margin-top: 20px
}
#config-editor {
font: 12px/1.7 var(--mono);
resize: vertical;
min-height: 330px;
margin-top: 16px;
tab-size: 2;
white-space: pre
}
#settings-page-manual-config>p {
margin-top: 20px
}
.page-footer {
display: flex;
justify-content: space-between;
gap: 15px;
padding: 30px 0;
margin-top: 30px;
border-top: 1px solid var(--line);
font: 9px var(--mono);
color: var(--muted);
letter-spacing: .5px
}
.page-footer b {
color: var(--accent);
font-weight: 400;
margin-left: 9px
}
.page-footer .footer-update {
color: var(--green);
text-decoration: underline;
text-underline-offset: 2px
}
.page-footer .footer-update:hover {
color: var(--text)
}
.login-section {
padding: 62px 0 40px;
max-width: 720px
}
.login-section h1 {
font-size: clamp(42px, 5vw, 68px);
letter-spacing: -3px;
max-width: 640px
}
.login-section .lead {
font-size: 15px;
max-width: 570px
}
.login-card {
margin-top: 32px;
max-width: 470px;
background: var(--panel);
border: 1px solid var(--line);
padding: 27px
}
.login-card>p {
font-size: 12px;
color: var(--muted);
line-height: 1.7
}
.command {
display: block;
padding: 12px 15px;
background: var(--code-bg);
border-left: 2px solid var(--green);
font-size: 13px;
color: var(--green);
margin: 15px 0 20px
}
.login-card .primary {
width: 100%;
margin-top: 18px
}
.login-card .fine {
font-size: 10px;
margin-top: 16px
}
.login-footer {
font: 9px var(--mono);
letter-spacing: 1.7px;
color: var(--muted);
margin-top: 30px;
line-height: 2
}
.login-footer span {
margin: 0 11px;
color: var(--accent)
}
.toast {
position: fixed;
bottom: 26px;
right: 26px;
max-width: min(580px, calc(100vw - 40px));
background: var(--toast-bg);
color: var(--toast-text);
border: 1px solid var(--toast-line);
padding: 14px 20px;
font-size: 13px;
z-index: 50;
box-shadow: 0 6px 35px var(--shadow-mid);
white-space: pre-wrap;
overflow-wrap: anywhere
}
.toast.error {
background: var(--toast-error-bg);
border-color: var(--toast-error-line);
color: var(--toast-error-text)
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0
}
@media(min-width:1600px) {
main {
padding: 0 58px
}
}
@media(max-width:1150px) {
.shell {
grid-template-columns: 184px minmax(0, 1fr)
}
.sidebar {
padding: 29px 17px
}
main {
padding: 0 25px
}
.stats-grid {
gap: 10px
}
.stat {
padding: 18px 15px
}
.card {
padding: 20px
}
.overview-grid {
grid-template-columns: minmax(0, 1.5fr) minmax(210px, 1fr)
}
}
@media(max-width:850px) {
.shell {
display: block
}
.sidebar {
position: static;
height: auto;
flex-direction: row;
align-items: center;
padding: 16px 22px;
border-right: 0;
border-bottom: 1px solid var(--line);
gap: 24px
}
.brand {
font-size: 11px;
letter-spacing: 1px;
gap: 9px
}
.brand-mark {
width: 39px;
height: 38px;
font-size: 24px;
letter-spacing: -4px
}
.brand-mark span {
font-size: 15px;
left: 18px;
top: 12px
}
.edition,
.sidebar-bottom {
display: none
}
nav {
flex-direction: row;
margin-left: auto;
gap: 5px
}
.nav {
padding: 9px 12px;
gap: 7px;
font-size: 11px;
border-left: 0;
border-bottom: 2px solid transparent
}
.nav.active {
border-bottom-color: var(--green)
}
.topbar {
height: 65px
}
.page-intro {
padding-top: 29px
}
h1 {
font-size: 36px
}
.stats-grid {
grid-template-columns: repeat(2, minmax(0, 1fr))
}
.overview-grid {
grid-template-columns: 1fr 1fr
}
.config-columns {
grid-template-columns: 1fr 1fr
}
.login-section {
padding-top: 42px
}
}
@media(max-width:600px) {
main {
padding: 0 17px
}
.sidebar {
padding: 13px 15px;
gap: 10px
}
.nav {
padding: 9px 7px;
font-size: 10px
}
.nav span {
display: none
}
.brand {
font-size: 10px
}
.brand-mark {
width: 33px;
height: 33px;
font-size: 21px
}
.brand-mark span {
left: 15px;
top: 11px
}
.topbar {
height: 58px
}
.breadcrumb {
font-size: 8px;
letter-spacing: .4px
}
.breadcrumb span {
margin: 0 5px
}
.top-actions {
gap: 6px
}
.version {
display: none
}
.quiet {
font-size: 11px;
padding: 7px 9px
}
.page-intro {
display: block;
padding-top: 25px
}
.page-intro .outline {
margin-top: 19px
}
.eyebrow {
font-size: 9px;
letter-spacing: 1.2px
}
h1 {
font-size: 34px;
letter-spacing: -1.4px
}
.lead {
font-size: 12px
}
.notice {
font-size: 10px
}
.stats-grid {
gap: 10px
}
.stat strong {
font-size: 30px
}
.overview-grid,
.config-columns {
grid-template-columns: 1fr;
gap: 16px
}
.card {
padding: 17px
}
.card-heading {
gap: 10px
}
.card-heading h2 {
font-size: 18px
}
.meta {
font-size: 9px;
max-width: 106px;
text-align: right
}
.section-heading h2 {
font-size: 20px
}
.chart-footer {
font-size: 8px
}
.page-footer {
font-size: 8px;
flex-wrap: wrap
}
.login-section h1 {
font-size: 47px;
letter-spacing: -2px
}
.login-card {
padding: 20px
}
.login-footer {
font-size: 8px
}
.login-footer span {
margin: 0 5px
}
.toast {
right: 17px;
bottom: 17px
}
#config-editor {
font-size: 11px
}
}
@media(prefers-reduced-motion:reduce) {
* {
scroll-behavior: auto !important
}
}
.brand-mark {
display: flex;
align-items: center;
justify-content: center;
letter-spacing: -3px
}
.brand-mark span {
position: static
}
.brand {
letter-spacing: -.6px;
font-size: 17px;
gap: 8px
}
.brand-mark {
flex-shrink: 0;
width: 47px;
height: 47px;
font-size: 29px
}
.route-advanced {
margin-top: 20px;
border-top: 1px solid var(--line);
padding-top: 13px
}
.route-advanced summary {
cursor: pointer;
color: var(--green);
font-size: 12px
}
.route-advanced textarea,
#policy-rules {
font: 11px/1.6 var(--mono);
resize: vertical
}
.route-advanced .fine {
margin-top: 8px
}
.session-user {
margin: 17px 0 12px
}
.security-note {
margin: 22px 0
}
.audit-card {
margin-top: 24px
}
.entity-details {
white-space: pre-wrap
}
.login-card {
max-width: 510px
}
.signal.status-error {
background: var(--red)
}
@media(max-width:850px) {
.brand {
font-size: 14px
}
.brand-mark {
width: 34px;
height: 34px;
font-size: 22px
}
.sidebar {
gap: 10px
}
.nav {
padding: 9px 8px
}
}
@media(max-width:600px) {
.sidebar {
flex-wrap: wrap
}
.brand {
font-size: 16px
}
.sidebar nav {
width: 100%;
justify-content: space-between;
margin-top: 5px
}
.nav {
font-size: 11px;
padding: 10px 9px;
flex: 1;
justify-content: center
}
.sidebar {
padding: 12px 16px
}
.login-section {
padding-top: 28px
}
.login-section h1 {
font-size: 40px
}
.login-card .primary {
white-space: normal
}
.security-note {
overflow-wrap: anywhere
}
}
@media(max-width:360px) {
.nav {
font-size: 10px;
padding: 8px 4px
}
.sidebar {
padding-left: 12px;
padding-right: 12px
}
}
.transport-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 12px;
margin: 0 0 22px
}
.transport-grid>div {
display: flex;
flex-direction: column;
gap: 8px;
padding: 16px;
border: 1px solid var(--line, #d8dfdb);
border-radius: 10px;
min-width: 0
}
.transport-grid span {
font-size: 12px;
opacity: .7
}
.transport-grid b {
font-size: 18px;
overflow-wrap: anywhere
}
.transport-grid .transport-meta {
display: flex;
flex-wrap: wrap;
gap: 4px 10px;
margin-top: 1px
}
.transport-grid .transport-meta small,
.transport-grid .transport-footer small {
font-size: 9px;
opacity: .7;
white-space: nowrap
}
.transport-grid .transport-meta span,
.transport-grid .transport-footer span {
font-size: inherit;
opacity: 1
}
.transport-grid .transport-meta strong,
.transport-grid .transport-footer strong {
font-size: 10px;
font-weight: 700
}
.transport-grid .transport-footer {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
margin-top: auto
}
.transport-details {
margin-top: 14px
}
.transport-details>label {
display: block;
margin-top: 14px
}
.transport-details>select,
.transport-details>textarea {
width: 100%
}
.command {
white-space: normal;
overflow-wrap: anywhere
}
#panel-tls .section-heading {
flex-wrap: wrap;
gap: 12px
}
@media(max-width:600px) {
.sidebar nav {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 4px
}
.sidebar nav .nav {
min-width: 0;
justify-content: center;
padding: 9px 5px
}
.transport-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px
}
.transport-grid>div {
padding: 12px
}
.transport-grid b {
font-size: 16px
}
}
main {
padding: 0 24px;
max-width: none
}
.topbar {
height: 58px
}
.sidebar {
padding-top: 24px;
padding-bottom: 22px
}
.edition {
margin: 17px 0 28px
}
.nav {
padding: 9px 10px
}
nav {
gap: 5px
}
.top-actions {
gap: 8px
}
.language-select {
width: auto;
max-width: 160px;
padding: 6px 9px;
font-size: 11px
}
.page-intro {
padding: 21px 0 16px;
gap: 16px
}
.page-intro h1 {
font-size: 29px;
letter-spacing: -1px
}
.page-intro .eyebrow {
margin-bottom: 8px;
font-size: 9px
}
.page-intro .lead {
margin-top: 7px;
font-size: 12px
}
.notice {
padding: 8px 11px;
margin-bottom: 14px;
font-size: 10px
}
.stats-grid {
grid-template-columns: repeat(6, minmax(0, 1fr));
gap: 10px;
margin-bottom: 12px
}
.stat {
padding: 12px 13px
}
.stat>span {
font-size: 11px
}
.stat strong {
font-size: 25px;
margin: 5px 0 3px;
line-height: 1.3
}
.stat small {
font-size: 9px
}
.transport-grid {
margin-bottom: 12px !important;
gap: 10px
}
.transport-grid>div {
padding: 9px 12px !important
}
.overview-grid {
grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr) minmax(190px, .85fr);
gap: 12px;
margin-bottom: 12px
}
.card {
padding: 15px
}
h2 {
font-size: 17px
}
h3 {
font-size: 14px;
margin-bottom: 10px
}
.card-heading {
margin-bottom: 10px;
gap: 10px
}
.card-heading .small-label {
margin-bottom: 5px
}
.small-label {
font-size: 9px;
letter-spacing: 1.2px
}
#traffic-chart {
height: 107px;
margin: 3px 0
}
.runtime-card dl {
margin: 8px 0 0
}
.runtime-card dl div {
margin-top: 7px;
padding-bottom: 6px
}
.runtime-card dt {
font-size: 10px
}
.runtime-card dd {
font-size: 11px
}
.system-card h2 {
font: 23px var(--mono)
}
.system-card h2 small {
font: 10px var(--mono);
color: var(--muted)
}
#system-chart {
display: block;
width: 100%;
height: 65px
}
#system-sparkline {
fill: none;
stroke: var(--green);
stroke-width: 2;
vector-effect: non-scaling-stroke
}
.memory-line {
display: flex;
justify-content: space-between;
gap: 8px;
font-size: 9px;
color: var(--muted);
margin-top: 4px
}
.memory-line b {
font-weight: 400;
font-family: var(--mono)
}
progress {
display: block;
width: 100%;
height: 5px;
accent-color: var(--green);
margin: 6px 0 9px
}
.diagnostics-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 12px;
margin-bottom: 12px
}
.mini-heading {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px
}
.mini-heading h3 {
font-size: 12px;
margin: 0
}
.mini-metrics {
margin: 8px 0 0
}
.mini-metrics div {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 10px;
margin-top: 6px
}
.mini-metrics dt {
font-size: 10px;
color: var(--muted)
}
.mini-metrics dd {
font: 10px var(--mono);
margin: 0;
text-align: end;
overflow-wrap: anywhere
}
.mini-live-chart-stack {
display: grid;
gap: 8px;
margin-top: 10px
}
.mini-live-chart {
min-width: 0;
margin-top: 10px;
border-top: 1px solid var(--line);
padding-top: 8px
}
.mini-live-chart-stack .mini-live-chart {
margin-top: 0
}
.mini-live-chart-head {
display: flex;
justify-content: space-between;
align-items: baseline;
gap: 8px;
margin-bottom: 5px;
color: var(--muted);
font: 10px var(--mono)
}
.mini-live-chart-head b {
color: var(--text);
font-weight: 600;
text-align: right
}
.mini-live-chart-actions {
display: inline-flex;
align-items: center;
justify-content: flex-end;
gap: 7px;
min-width: 0
}
.mini-live-chart svg {
display: block;
width: 100%;
height: 60px;
overflow: visible
}
.diagnostic-line {
fill: none;
stroke: var(--accent);
stroke-width: 2;
vector-effect: non-scaling-stroke
}
.network-tx-line {
stroke: var(--muted)
}
.cache-hit-line {
stroke: var(--green)
}
.cache-miss-line {
stroke: var(--accent)
}
.cache-bypass-line {
stroke: var(--muted)
}
.process-rss-line {
stroke: var(--green)
}
.mini-chart-legend {
display: flex;
justify-content: flex-end;
gap: 10px;
margin-top: 3px;
font: 9px var(--mono);
color: var(--muted)
}
.mini-chart-legend span::before {
content: "";
display: inline-block;
width: 12px;
height: 2px;
margin-right: 4px;
vertical-align: middle;
background: currentColor
}
.cache-hit-key {
color: var(--green)
}
.cache-miss-key {
color: var(--accent)
}
.cache-bypass-key {
color: var(--muted)
}
.log-column-picker {
position: relative;
font-size: 10px
}
.log-column-picker>summary {
list-style: none;
cursor: pointer;
user-select: none;
padding: 6px 9px;
border: 1px solid var(--line);
border-radius: 4px;
min-height: 30px;
display: flex;
align-items: center
}
.log-column-picker>summary::-webkit-details-marker {
display: none
}
.log-column-picker[open]>summary {
border-color: var(--green)
}
.log-column-options {
position: absolute;
z-index: 80;
inset-inline-end: 0;
top: calc(100% + 4px);
width: min(190px, calc(100vw - 24px));
overflow: visible;
padding: 4px;
display: grid;
grid-template-columns: minmax(0, 1fr);
gap: 1px;
background: var(--panel2);
border: 1px solid var(--line);
border-radius: 5px;
box-shadow: 0 10px 26px var(--shadow-mid)
}
.log-column-option {
min-width: 0;
min-height: 22px;
margin: 0 !important;
padding: 3px 5px;
gap: 7px;
border-radius: 3px;
font-size: 10px;
line-height: 1.2;
white-space: nowrap
}
.log-column-option:hover {
background: var(--panel)
}
@media(max-height:620px) {
.log-column-options {
top: auto;
bottom: calc(100% + 4px);
width: min(360px, calc(100vw - 24px));
grid-template-columns: repeat(2, minmax(0, 1fr))
}
}
.logs-card .table-scroll {
max-height: 260px
}
.logs-card th {
position: sticky;
top: 0;
background: var(--panel)
}
th {
padding: 7px 8px
}
td {
padding: 8px
}
.page-footer {
padding: 16px 0;
margin-top: 18px
}
.config-columns,
.settings-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 14px;
align-items: start
}
.settings-grid>.card {
height: 100%
}
.edit-form label {
margin: 10px 0 5px
}
.edit-form input:not([type="checkbox"]):not([type="radio"]),
.edit-form select,
.edit-form textarea {
padding: 8px 10px
}
.edit-form .check {
margin-top: 9px !important
}
.form-actions {
gap: 9px;
margin-top: 13px
}
.primary {
padding: 9px 14px;
font-size: 12px
}
.quiet {
padding: 7px 10px
}
.outline {
padding: 8px 12px
}
.entity {
padding: 12px 0
}
.entity-details {
margin: 6px 0;
line-height: 1.6
}
.entity-actions {
gap: 6px
}
.entity-title {
font-size: 13px
}
.section-heading {
margin: 16px 0 12px
}
.section-heading h2 {
margin-top: 4px
}
.subheading {
margin-top: 17px;
margin-bottom: 7px !important
}
.field-grid,
.switch-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 0 12px
}
.pending-note {
font-size: 11px;
color: var(--accent);
padding: 9px 0
}
.header-rule {
display: grid;
grid-template-columns: 86px minmax(90px, 1fr) minmax(80px, 1.2fr) auto;
gap: 6px;
margin: 8px 0
}
.header-rule input,
.header-rule select {
padding: 7px !important;
font-size: 11px
}
.header-rule button {
font-size: 10px;
padding: 6px
}
.header-rules {
margin-bottom: 9px
}
.edit-form>.fine {
margin-top: 8px
}
.empty {
padding: 17px 3px
}
.login-section {
padding-top: 40px
}
.login-card {
margin-top: 23px
}
.chart-footer {
line-height: 1.5
}
.fine,
.meta {
overflow-wrap: anywhere
}
.mini-metrics dd,
.chart-footer>span {
min-width: 0
}
.cache-status-good {
color: var(--green)
}
[dir="rtl"] .nav {
text-align: right;
border-left: 0;
border-right: 2px solid transparent
}
[dir="rtl"] .nav.active {
border-right-color: var(--green)
}
[dir="rtl"] table {
text-align: right
}
[dir="rtl"] .entity-details,
[dir="rtl"] input[type="url"],
[dir="rtl"] #config-editor {
direction: ltr;
text-align: left
}
@media(min-width:1800px) {
.settings-grid {
grid-template-columns: repeat(2, minmax(0, 1fr))
}
.overview-grid {
grid-template-columns: 1.6fr 1.1fr 1fr
}
}
@media(max-width:1200px) {
main {
padding: 0 18px
}
.stats-grid {
grid-template-columns: repeat(3, minmax(0, 1fr))
}
.overview-grid {
grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr)
}
.runtime-card {
grid-column: 1/-1
}
.runtime-card dl {
display: flex;
flex-wrap: wrap;
gap: 18px;
margin-top: 4px
}
.runtime-card dl div {
border: 0;
padding: 0;
flex: 1;
min-width: 90px
}
.diagnostics-grid {
gap: 10px
}
.header-rule {
grid-template-columns: 80px 1fr auto
}
.header-rule .header-value {
grid-column: 2;
grid-row: 2
}
.header-rule button {
grid-column: 3;
grid-row: 1/3
}
}
@media(max-width:850px) {
.sidebar {
padding: 13px 18px;
gap: 18px
}
.sidebar nav {
flex-wrap: wrap;
gap: 4px
}
.nav {
padding: 8px
}
.page-intro {
padding-top: 18px
}
.settings-grid,
.config-columns {
gap: 12px
}
.diagnostics-grid {
grid-template-columns: repeat(2, minmax(0, 1fr))
}
.diagnostics-grid>.card:last-child {
grid-column: 1/-1
}
.topbar {
height: 54px
}
}
@media(max-width:620px) {
main {
padding: 0 12px
}
.sidebar {
align-items: flex-start;
flex-direction: column;
gap: 12px
}
.sidebar nav {
width: 100%;
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr))
}
.nav {
padding: 8px 7px;
min-width: 0
}
.nav b {
font-size: 11px
}
.nav span {
display: none
}
.top-actions {
gap: 5px
}
.breadcrumb {
font-size: 9px;
letter-spacing: 0
}
.breadcrumb span {
margin: 0 5px
}
.topbar .version {
display: none
}
.language-select {
max-width: 110px;
font-size: 10px
}
.page-intro h1 {
font-size: 25px
}
.page-intro {
align-items: flex-start
}
.page-intro .lead {
font-size: 11px
}
.page-intro .outline {
font-size: 10px;
padding: 7px;
white-space: normal;
max-width: 95px
}
.page-intro .eyebrow {
letter-spacing: .5px;
font-size: 8px
}
.notice {
font-size: 10px;
gap: 8px
}
.stats-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px
}
.stat {
padding: 10px
}
.stat strong {
font-size: 24px
}
.overview-grid,
.diagnostics-grid,
.settings-grid,
.config-columns {
grid-template-columns: minmax(0, 1fr)
}
.runtime-card,
.diagnostics-grid>.card:last-child {
grid-column: auto
}
.runtime-card dl {
display: block
}
.runtime-card dl div {
margin-top: 8px
}
.logs-card>.card-heading {
align-items: flex-start;
flex-direction: column
}
.log-tools {
width: 100%
}
.log-tools input:not([type="checkbox"]):not([type="radio"]) {
flex: 1;
min-width: 95px;
width: 95px
}
.log-tools select {
width: 95px
}
.log-tools button {
white-space: normal;
max-width: 85px
}
.card {
padding: 13px
}
.page-footer {
flex-direction: column;
gap: 7px
}
.field-grid {
gap: 0 9px
}
.header-rule {
grid-template-columns: 76px minmax(0, 1fr) auto
}
.header-rule button {
max-width: 65px;
overflow-wrap: anywhere
}
.switch-grid {
grid-template-columns: minmax(0, 1fr)
}
.form-actions {
gap: 8px
}
.primary,
.outline {
white-space: normal
}
.settings-grid h2 {
font-size: 16px
}
.mini-metrics {
margin-top: 9px
}
.memory-line {
font-size: 10px
}
.login-section {
padding-top: 25px
}
.login-card {
padding: 18px
}
.topbar {
gap: 7px
}
.breadcrumb b {
display: none
}
}
.vhost-layout {
display: grid;
grid-template-columns: minmax(220px, .7fr) minmax(0, 2fr);
gap: 12px;
align-items: start
}
.vh-form,
.vhost-layout>.card {
min-width: 0
}
.vh-group {
border: 1px solid var(--line);
border-radius: 6px;
margin: 0 0 10px;
padding: 10px;
min-width: 0
}
.vh-group legend,
.vh-group>summary {
font-size: 12px;
font-weight: 600;
padding: 0 5px;
color: var(--text)
}
.vh-group>summary {
cursor: pointer;
margin-bottom: 6px
}
.vh-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 8px;
align-items: start
}
.vh-field {
display: flex;
flex-direction: column;
gap: 4px;
min-width: 0;
margin: 0;
font-size: 11px;
color: var(--muted)
}
.vh-field input,
.vh-field select,
.vh-field textarea {
width: 100%;
min-width: 0;
max-width: 100%;
padding: 6px 7px;
font-size: 12px;
margin: 0;
box-sizing: border-box
}
.vh-field textarea {
resize: vertical;
font-family: var(--mono)
}
.vh-check {
font-size: 11px;
min-height: 28px;
margin: 0;
align-items: center;
gap: 6px
}
.vh-check input {
flex: 0 0 auto
}
.vh-enable-control {
display: grid !important;
grid-template-columns: auto minmax(0, 1fr) auto;
grid-template-rows: auto auto;
align-items: center;
gap: 2px 10px;
margin-top: 5px !important;
padding: 11px 12px;
border: 1px solid var(--pill-live-line);
background: var(--panel2);
box-shadow: inset 3px 0 0 var(--green)
}
.vh-enable-control>input {
grid-column: 1;
grid-row: 1/3;
width: 18px;
height: 18px;
accent-color: var(--green)
}
.vh-enable-control>span {
grid-column: 2;
grid-row: 1;
color: var(--text);
font-size: 12px;
font-weight: 700
}
.vh-enable-hint {
grid-column: 2;
grid-row: 2;
color: var(--muted);
font-size: 10px
}
.vh-enable-state {
grid-column: 3;
grid-row: 1/3;
padding: 3px 7px;
border: 1px solid var(--pill-live-line);
color: var(--green);
font: 600 10px var(--mono);
text-transform: uppercase;
letter-spacing: .04em
}
.vh-enable-control.is-disabled {
border-color: var(--danger-line-strong);
box-shadow: inset 3px 0 0 var(--red)
}
.vh-enable-control.is-disabled .vh-enable-state {
border-color: var(--danger-line);
color: var(--red)
}
.vh-wide {
grid-column: 1/-1;
min-width: 0
}
.vh-frontends,
.vh-members {
display: grid;
gap: 8px
}
.vh-row {
padding: 8px;
border: 1px solid var(--line);
border-radius: 5px;
min-width: 0;
background: var(--bg)
}
.vh-frontend {
display: grid;
grid-template-columns: minmax(140px, 1fr) auto minmax(120px, 1fr) auto;
align-items: center;
gap: 8px
}
.vh-member>.quiet {
margin-top: 6px
}
.vh-member details {
font-size: 11px
}
.vh-member details>summary {
cursor: pointer;
color: var(--muted);
padding: 3px 0
}
.vh-migration {
margin-top: 16px;
padding-top: 12px;
border-top: 1px solid var(--line);
display: grid;
gap: 6px
}
.vh-migration label {
font-size: 11px
}
.vh-migration select {
width: 100%;
min-width: 0
}
.pool-card {
margin-bottom: 12px
}
.backend-card-heading {
align-items: flex-start;
gap: 10px
}
.backend-table-tools {
display: flex;
align-items: center;
justify-content: flex-end;
flex-wrap: wrap;
gap: 7px;
margin-left: auto
}
#pool-search {
width: min(250px, 30vw);
min-width: 170px
}
.backend-sort-control {
display: flex;
align-items: center;
gap: 6px;
color: var(--muted);
font-size: 11px
}
.backend-sort-control select {
width: auto;
min-width: 120px
}
.backend-sort-direction {
min-width: 48px
}
.backend-column-picker {
position: relative
}
.backend-column-picker>summary {
list-style: none;
cursor: pointer;
user-select: none
}
.backend-column-picker>summary::-webkit-details-marker {
display: none
}
.backend-column-options {
position: absolute;
z-index: 20;
top: calc(100% + 6px);
right: 0;
display: grid;
grid-template-columns: repeat(2, minmax(145px, 1fr));
gap: 1px 12px;
min-width: 330px;
max-height: 330px;
overflow: auto;
padding: 10px 12px 12px;
border: 1px solid var(--line);
background: var(--panel);
box-shadow: 0 12px 28px var(--shadow-strong)
}
.backend-column-options .check {
margin-top: 4px !important;
font-size: 11px
}
.pool-card .fine {
margin: 0 0 8px
}
.pool-table {
font-size: 11px;
width: 100%;
min-width: 640px
}
.pool-table th,
.pool-table td {
padding: 7px 9px;
white-space: nowrap
}
.pool-table td:nth-child(n+4) {
font-variant-numeric: tabular-nums;
text-align: right
}
.pool-table th:nth-child(n+4) {
text-align: right
}
.pool-table td:first-child,
.pool-table td:nth-child(2) {
max-width: 200px;
overflow: hidden;
text-overflow: ellipsis
}
.vhost-layout .entity-details {
overflow-wrap: anywhere
}
.vh-form .form-actions {
position: sticky;
bottom: 0;
background: var(--panel);
padding: 10px 0 6px;
z-index: 2
}
.vh-form input:disabled {
opacity: .5
}
@media(max-width:1150px) {
.vhost-layout {
grid-template-columns: minmax(190px, .6fr) minmax(0, 1.6fr)
}
.vh-grid {
grid-template-columns: repeat(2, minmax(0, 1fr))
}
.vh-frontend {
grid-template-columns: minmax(0, 1fr) auto
}
.vh-frontend .vh-field {
grid-column: 1/-1
}
}
@media(max-width:800px) {
.vhost-layout {
grid-template-columns: minmax(0, 1fr)
}
.vh-form .form-actions {
position: static
}
.vh-group {
padding: 8px
}
.pool-table {
min-width: 620px
}
}
@media(max-width:420px) {
.vh-grid {
grid-template-columns: minmax(0, 1fr)
}
.vh-frontend {
grid-template-columns: minmax(0, 1fr)
}
.vh-group {
padding: 6px
}
.vh-form .form-actions {
flex-wrap: wrap
}
.vh-field input,
.vh-field select,
.vh-field textarea {
font-size: 12px
}
}
body {
--ui-gap: 5px;
--ui-card: 8px;
--ui-font: 12px;
--ui-control: 27px;
font-size: var(--ui-font)
}
body[data-density="dense"] {
--ui-gap: 4px;
--ui-card: 7px;
--ui-font: 11.5px;
--ui-control: 25px
}
body[data-density="comfortable"] {
--ui-gap: 13px;
--ui-card: 17px;
--ui-font: 14px;
--ui-control: 36px
}
.shell {
grid-template-columns: 182px minmax(0, 1fr)
}
main {
padding: 0 16px
}
.sidebar {
padding: 20px 13px
}
.sidebar nav {
margin-top: 22px
}
.nav {
padding: 9px 10px
}
.topbar {
height: 48px
}
.page-intro {
padding: 13px 0 11px;
gap: 12px
}
.page-intro h1 {
font-size: 25px;
letter-spacing: -.7px
}
.page-intro .eyebrow {
margin-bottom: 4px
}
.page-intro .lead {
font-size: 11px;
margin-top: 4px
}
.notice {
margin-bottom: var(--ui-gap);
padding: 5px 9px
}
.card {
padding: var(--ui-card)
}
.card-heading {
margin-bottom: 8px
}
.card-heading h2 {
font-size: 16px
}
.card-heading .small-label {
font-size: 8px;
margin-bottom: 3px
}
.overview-grid,
.diagnostics-grid,
.settings-grid,
.config-columns {
gap: var(--ui-gap);
margin-bottom: var(--ui-gap)
}
.stats-grid,
.stats,
.metrics-grid {
gap: var(--ui-gap);
margin-bottom: var(--ui-gap)
}
.stat {
padding: 11px
}
.stat-value {
font-size: 25px
}
.stat p,
.stat small {
font-size: 10px
}
.transport-grid {
gap: var(--ui-gap);
margin-bottom: var(--ui-gap) !important
}
.transport-grid>div {
padding: 6px 10px !important;
gap: 3px;
border-radius: 4px
}
.transport-grid span {
font-size: 10px
}
.transport-grid b {
font-size: 14px
}
.activity-card svg {
height: 105px
}
.system-card svg {
height: 80px
}
.mini-metrics div {
margin-top: 4px
}
.runtime-card dl div {
margin-top: 5px;
padding-bottom: 4px
}
.pool-card {
margin-bottom: var(--ui-gap)
}
.pool-table th,
.pool-table td {
padding: 5px 7px
}
.pool-card>.fine {
font-size: 10px
}
.pool-card .table-scroll {
max-height: 205px
}
.page-footer {
padding: 12px 0;
margin-top: 8px
}
.edit-form label {
margin-top: 9px
}
.edit-form input:not([type="checkbox"]):not([type="radio"]),
.edit-form select,
.edit-form textarea,
input:not([type="checkbox"]):not([type="radio"]),
select,
textarea {
padding: 6px 8px;
font-size: 12px;
min-height: var(--ui-control)
}
button,
.primary,
.outline,
.quiet {
padding: 6px 10px;
font-size: 11px;
min-height: var(--ui-control)
}
.check {
font-size: 11px
}
.settings-shortcuts {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 12px;
border: 1px solid var(--line);
margin-bottom: var(--ui-gap);
flex-wrap: wrap
}
.settings-shortcuts>div {
flex: 1;
min-width: 170px
}
.ui-preference-control {
display: flex;
align-items: center;
gap: 8px;
font-size: 11px
}
.ui-preference-control select {
width: auto
}
.vhost-layout {
display: block
}
.vhost-row {
display: grid;
grid-template-columns: minmax(120px, 1fr) minmax(130px, 1.3fr) minmax(100px, 1fr);
gap: 3px 14px;
align-items: center;
padding: 11px
}
.vhost-row .entity-details {
margin: 0;
font-size: 11px
}
.vhost-row .entity-actions {
grid-column: 1/-1;
display: flex;
justify-content: flex-end;
gap: 5px;
margin-top: 3px
}
.vh-health-summary {
grid-column: 1/-1;
color: var(--muted);
font: 10px var(--mono);
overflow-wrap: anywhere
}
.vh-migration {
max-width: 570px
}
.vhost-dialog,
.logs-dialog,
.audit-dialog {
color: var(--text);
background: var(--bg);
border: 1px solid var(--line);
padding: 0;
max-width: calc(100vw - 24px);
max-height: calc(100dvh - 28px);
box-shadow: 0 18px 70px var(--shadow-strong);
border-radius: 7px
}
.vhost-dialog {
width: 960px;
overflow: auto
}
.vhost-dialog::backdrop,
.logs-dialog::backdrop,
.audit-dialog::backdrop {
background: var(--shadow-strong);
backdrop-filter: blur(2px)
}
.vhost-dialog .vh-form {
border: 0;
padding: 14px
}
.vh-form>.card-heading {
margin-bottom: 5px;
position: sticky;
top: -14px;
z-index: 3;
background: var(--panel);
padding: 9px 0
}
.vh-form>.card-heading h2 {
flex: 1
}
.vh-live-summary {
font: 10px var(--mono);
line-height: 1.7;
overflow-wrap: anywhere;
color: var(--muted);
margin: 5px 0
}
.vh-tabs {
display: flex;
flex-direction: row;
margin-inline-start: 0;
gap: 3px;
flex-wrap: wrap;
position: sticky;
top: 29px;
z-index: 2;
background: var(--panel);
padding: 5px 0 8px;
border-bottom: 1px solid var(--line);
margin-bottom: 9px
}
.vh-tabs button {
width: auto;
flex: 0 1 auto;
font-size: 10px;
padding: 6px 9px
}
.vh-tabs button.active {
color: var(--text);
background: var(--nav-selected-bg);
border-color: var(--green)
}
.vh-group {
margin: 8px 0;
padding: 9px
}
.vh-group[hidden] {
display: none
}
.vh-grid {
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 7px
}
.vh-pages-grid {
display: block
}
.vh-group legend,
.vh-group>summary {
font-size: 11px
}
.vh-form .form-actions {
position: sticky;
bottom: -14px;
background: var(--panel);
padding: 10px 0;
border-top: 1px solid var(--line);
z-index: 2
}
.vh-header-row {
display: grid;
grid-template-columns: 88px minmax(110px, 1fr) minmax(140px, 2fr) auto;
gap: 5px;
align-items: end;
margin: 6px 0
}
.vh-header-row label span {
font-size: 10px
}
.vh-header-row button {
margin-bottom: 0
}
.vh-header-rows+h3 {
margin-top: 10px
}
.page-editor {
display: grid;
grid-template-columns: minmax(105px, .9fr) minmax(115px, 1fr) minmax(105px, 1fr);
gap: 6px;
align-items: center;
padding: 7px 0;
border-bottom: 1px solid var(--line)
}
.page-label {
font-size: 11px;
font-weight: 500
}
.page-source {
grid-column: 1/-1
}
.page-source input {
font-size: 11px;
margin: 6px 0
}
.page-source textarea {
font: 11px var(--mono);
min-height: 100px
}
.page-source[hidden] {
display: none
}
.pages-errors {
margin: 12px 0
}
.pages-errors>summary {
font-size: 12px;
cursor: pointer
}
.logs-dialog {
width: 1180px;
overflow: visible
}
.logs-dialog .logs-card {
border: 0;
padding: 0 12px;
background: var(--bg)
}
.window-heading {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 12px;
border-bottom: 1px solid var(--line)
}
.window-heading h2 {
font-size: 16px
}
.window-tools {
margin-inline-start: auto;
display: flex;
gap: 5px
}
.logs-dialog .logs-card>.card-heading {
display: block;
padding: 8px 0;
margin: 0
}
.logs-dialog .logs-card>.card-heading>div:first-child {
display: none
}
.log-tools {
display: flex;
align-items: center;
gap: 6px;
flex-wrap: wrap;
width: 100%
}
.log-tools select,
.log-tools input:not([type="checkbox"]):not([type="radio"]) {
width: auto;
max-width: 180px;
min-height: 30px;
font-size: 11px
}
.log-tools input:not([type="checkbox"]):not([type="radio"]) {
flex: 1;
min-width: 110px
}
.log-tools button {
font-size: 10px;
padding: 6px 9px
}
.logs-dialog .table-scroll {
max-height: min(60dvh, 580px);
overflow: auto;
border-top: 1px solid var(--line)
}
.logs-dialog table {
font: 11px var(--mono)
}
.logs-dialog th,
.logs-dialog td {
padding: 6px 7px;
max-width: 360px;
overflow: hidden;
text-overflow: ellipsis
}
.logs-dialog th {
position: sticky;
top: 0;
background: var(--panel)
}
.log-footnote {
padding: 8px 12px;
font-size: 10px
}
.logs-dialog.docked {
position: fixed;
inset: auto 12px 10px auto;
margin: 0;
width: min(1180px, calc(100vw - 24px));
max-height: 46dvh;
z-index: 20
}
.logs-dialog.docked .table-scroll {
max-height: calc(46dvh - 160px)
}
#toast {
z-index: 1000
}
@media(min-width:1400px) {
.overview-grid {
grid-template-columns: 1.55fr 1fr .85fr
}
.settings-grid {
grid-template-columns: repeat(2, minmax(0, 1fr))
}
}
@media(max-width:1000px) {
.shell {
grid-template-columns: 166px minmax(0, 1fr)
}
.sidebar {
padding: 18px 10px
}
.overview-grid {
grid-template-columns: 1.3fr 1fr
}
.runtime-card {
grid-column: 1/-1
}
.runtime-card dl {
display: flex;
gap: 12px
}
.vh-grid {
grid-template-columns: repeat(2, minmax(0, 1fr))
}
}
@media(max-width:850px) {
.shell {
display: block
}
.sidebar {
height: auto;
position: static;
flex-direction: row;
flex-wrap: wrap;
padding: 10px 12px
}
.sidebar nav {
margin-top: 0;
display: flex;
flex-wrap: wrap;
gap: 2px
}
.nav {
padding: 7px
}
.edition,
.sidebar-bottom {
display: none
}
.topbar {
height: 46px
}
.vhost-dialog {
max-width: calc(100vw - 12px)
}
}
@media(max-width:620px) {
main {
padding: 0 10px
}
.top-actions {
gap: 4px
}
.topbar .breadcrumb {
font-size: 8px
}
.top-actions .quiet {
padding: 5px;
font-size: 10px
}
.page-intro h1 {
font-size: 23px
}
.overview-grid,
.diagnostics-grid,
.settings-grid,
.config-columns {
grid-template-columns: minmax(0, 1fr)
}
.runtime-card,
.diagnostics-grid>.card:last-child {
grid-column: auto
}
.runtime-card dl {
display: block
}
.sidebar nav {
width: 100%;
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr))
}
.nav b {
font-size: 10px
}
.vhost-row {
grid-template-columns: 1fr 1fr
}
.vhost-row .entity-actions {
justify-content: flex-start;
flex-wrap: wrap
}
.vh-grid {
grid-template-columns: repeat(2, minmax(0, 1fr))
}
.vh-header-row {
grid-template-columns: 85px 1fr
}
.vh-header-row>:nth-child(3) {
grid-column: 1/-1
}
.vhost-dialog .vh-form {
padding: 9px
}
.vh-form>.card-heading {
top: -9px
}
.vh-tabs {
top: 29px
}
.window-heading {
flex-wrap: wrap;
gap: 5px
}
.window-heading h2 {
font-size: 14px
}
.window-tools {
margin-inline-start: 0
}
.logs-dialog .table-scroll {
max-height: 50dvh
}
.log-tools select {
max-width: 140px;
flex: 1
}
.logs-dialog.docked {
max-height: 55dvh
}
.logs-dialog.docked .table-scroll {
max-height: calc(55dvh - 230px)
}
.settings-shortcuts {
align-items: flex-start
}
.ui-preference-control {
flex-wrap: wrap
}
.page-editor {
grid-template-columns: 1fr 1fr
}
.page-label {
grid-column: 1/-1
}
.page-source {
grid-column: 1/-1
}
}
@media(max-width:380px) {
.vh-grid {
grid-template-columns: minmax(0, 1fr)
}
.vhost-row {
grid-template-columns: minmax(0, 1fr)
}
.sidebar nav {
grid-template-columns: repeat(3, minmax(0, 1fr))
}
.topbar .breadcrumb {
display: none
}
.topbar {
justify-content: flex-end
}
.vh-tabs button {
font-size: 10px;
padding: 5px 7px
}
}
main {
margin: 0 auto
}
.stat strong {
font-size: clamp(20px, 1.8vw, 26px);
margin: 4px 0
}
body[data-density="dense"] .stat strong {
font-size: 22px;
margin: 2px 0
}
#toast[popover] {
position: fixed;
inset: auto 18px 18px auto;
margin: 0;
width: max-content;
max-width: min(520px, calc(100vw - 28px));
padding: 12px 16px;
color: var(--text);
background: var(--panel);
border: 1px solid var(--green);
border-radius: 6px;
box-shadow: 0 10px 40px var(--shadow-strong);
overflow-wrap: anywhere
}
#toast[popover].error {
border-color: #d57867
}
#toast[popover]::backdrop {
display: none
}
.named-listener-row {
border: 1px solid var(--line);
padding: 10px;
margin: 10px 0;
min-width: 0
}
.named-listener-row legend {
font-size: 11px
}
.named-listener-row .vh-grid {
grid-template-columns: repeat(2, minmax(0, 1fr))
}
.h3-editor {
grid-column: 1/-1;
min-width: 0
}
.h3-editor>label {
margin-top: 4px
}
.h3-editor details {
padding: 7px 0
}
.h3-editor summary {
font-size: 11px;
cursor: pointer
}
.h3-editor .vh-grid {
margin-top: 7px
}
.h3-editor .fine {
margin-top: 7px
}
.vh-frontend {
flex-wrap: wrap;
display: grid;
grid-template-columns: 2fr 1fr 1fr auto
}
.vh-frontend>.h3-editor {
grid-row: 2;
grid-column: 1/-1
}
.vh-frontend>button {
grid-column: 4;
grid-row: 1
}
.listener-choices {
display: flex;
flex-wrap: wrap;
gap: 7px
}
.listener-choices>.fine {
flex-basis: 100%
}
.listener-choices>label {
border: 1px solid var(--line);
padding: 7px;
border-radius: 4px;
font-size: 11px
}
.certificate-editors {
min-width: 0;
display: grid;
align-content: start;
gap: 12px
}
.certificate-editors input[type="file"] {
max-width: 100%
}
.certificate-editors summary {
cursor: pointer;
font-size: 12px
}
.transport-grid {
grid-template-columns: repeat(5, minmax(0, 1fr))
}
@media(max-width:620px) {
.vh-frontend {
grid-template-columns: 1fr 1fr
}
.vh-frontend>label:first-child {
grid-column: 1/-1
}
.vh-frontend>.h3-editor {
grid-row: auto
}
.vh-frontend>button {
grid-column: auto;
grid-row: auto
}
.transport-grid {
grid-template-columns: repeat(2, minmax(0, 1fr))
}
.named-listener-row .vh-grid {
grid-template-columns: 1fr
}
.h3-editor .vh-grid {
grid-template-columns: 1fr 1fr
}
}
.settings-grid>.card {
height: auto
}
#named-listener-rows {
overflow: visible
}
.cache-toolbar {
display: flex;
align-items: center;
gap: 10px;
flex-wrap: wrap;
padding: 12px
}
.cache-toolbar label {
margin: 0;
display: flex;
gap: 7px;
align-items: center
}
.cache-toolbar select {
max-width: 300px;
min-width: 130px;
margin: 0
}
.cache-domain-filter {
display: flex;
align-items: center;
gap: 7px;
margin: 0;
color: var(--muted);
font-size: 11px
}
.cache-domain-filter select {
width: auto;
min-width: 150px;
padding: 7px 28px 7px 9px;
margin: 0
}
.cache-stats .stat {
min-width: 0
}
.cache-stats strong {
font-size: 22px
}
.cache-stats progress {
width: 100%;
height: 5px;
margin: 6px 0
}
.cache-table {
font-size: 12px
}
.cache-table td {
max-width: 260px;
overflow-wrap: anywhere;
vertical-align: top
}
.cache-reasons {
min-width: 190px
}
.cache-reason {
display: inline-block;
border: 1px solid var(--line);
border-radius: 4px;
padding: 2px 5px;
margin: 1px 4px 2px 0;
font-size: 10px
}
.acme-card {
margin-bottom: 14px
}
.acme-card .vh-grid {
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 10px
}
.acme-card label {
margin: 0
}
.acme-result {
margin-top: 10px;
overflow-wrap: anywhere
}
@media(max-width:1000px) {
.acme-card .vh-grid {
grid-template-columns: repeat(2, minmax(0, 1fr))
}
}
@media(max-width:620px) {
.acme-card .vh-grid {
grid-template-columns: minmax(0, 1fr)
}
.cache-toolbar>* {
max-width: 100%
}
.cache-toolbar label {
flex-wrap: wrap
}
.cache-toolbar select {
max-width: 100%
}
.cache-stats strong {
font-size: 19px
}
}
#cache-domain-scroll {
max-height: 260px;
overflow: auto;
scrollbar-gutter: stable
}
#cache-object-scroll {
max-height: min(49vh, 520px);
overflow: auto;
scrollbar-gutter: stable
}
#panel-cache thead th {
position: sticky;
top: 0;
background: var(--panel);
z-index: 1
}
#panel-cache .cache-table .cache-reasons {
white-space: normal;
min-width: 210px;
max-width: 300px
}
#panel-cache .cache-copy-cell {
cursor: copy
}
.settings-tabs {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(132px, 1fr));
gap: 4px;
width: 100%;
padding: 8px;
margin-bottom: 12px;
border: 1px solid var(--line);
border-radius: 12px;
background: var(--panel)
}
.settings-tabs button {
width: 100%;
min-width: 0;
padding: 8px 10px;
font-size: 12px;
white-space: normal;
text-align: center;
border: 1px solid transparent;
background: transparent;
border-radius: 8px
}
.settings-tabs button[aria-selected="true"] {
background: var(--accent);
color: var(--selected-ink);
border-color: var(--accent);
font-weight: 700
}
.settings-pages {
min-width: 0
}
.settings-page {
width: 100%;
max-width: none
}
.settings-page[hidden] {
display: none !important
}
.settings-page>.edit-form {
width: 100%;
max-width: none
}
.settings-page>.edit-form+.edit-form {
margin-top: var(--ui-gap)
}
.settings-page>.card {
padding: var(--ui-card)
}
.settings-page .security-grid {
align-items: start
}
.certificate-dialog {
width: min(820px, calc(100vw - 28px));
max-height: 90dvh;
padding: 0;
border: 1px solid var(--line);
border-radius: 14px;
background: var(--bg);
color: var(--text);
overflow: auto
}
.certificate-dialog::backdrop {
background: var(--backdrop-soft);
backdrop-filter: blur(5px)
}
.certificate-dialog>.window-heading {
position: sticky;
top: 0;
z-index: 2;
background: var(--bg);
padding: 14px 18px;
border-bottom: 1px solid var(--line)
}
.certificate-dialog .provider-picker {
display: grid;
gap: 6px;
padding: 14px 18px 0;
font-size: 12px;
font-weight: 600
}
.provider-hint {
padding: 0 18px
}
.certificate-dialog .card {
border: 0;
box-shadow: none;
margin: 0;
padding: 16px 18px
}
.certificate-dialog [hidden] {
display: none !important
}
.certificate-dialog .acme-card {
max-width: none
}
.certificate-dialog .vh-grid {
gap: 10px 14px
}
.certificate-dialog .vh-grid label {
min-width: 0
}
.acme-result {
display: flex;
align-items: center;
gap: 12px;
justify-content: space-between;
margin-bottom: 12px
}
.acme-result p {
margin: 0;
overflow-wrap: anywhere
}
.metrics-example,
.metrics-preview {
font: 11px/1.55 ui-monospace, SFMono-Regular, monospace;
max-width: 100%;
overflow: auto;
white-space: pre;
padding: 12px;
background: var(--code-alt-bg);
border-radius: 8px;
color: var(--code-alt-text)
}
.metrics-preview {
max-height: 360px
}
.settings-shortcuts {
margin-bottom: 10px
}
@media(max-width:680px) {
.settings-tabs {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr))
}
.settings-tabs button {
white-space: normal;
text-align: start;
font-size: 11px
}
.certificate-dialog {
width: calc(100vw - 16px);
max-height: 94dvh
}
.acme-result {
align-items: start;
flex-direction: column
}
.settings-page>.card {
padding: var(--ui-card)
}
}
#certificate-dialog .dialog-head button:last-child {
margin-inline-start: auto
}
dialog.vhost-dialog,
dialog.logs-dialog,
dialog.audit-dialog,
dialog.certificate-dialog,
dialog.config-history-dialog {
border-radius: 0;
background: var(--bg);
color: var(--text);
border: 1px solid var(--line);
padding: 0;
box-shadow: 0 18px 70px var(--shadow-strong)
}
dialog::backdrop {
background: var(--shadow-strong) !important;
backdrop-filter: blur(2px) !important
}
dialog .card,
dialog .vh-form,
dialog .window-heading {
border-radius: 0
}
.settings-tabs,
.settings-tabs button,
.settings-page>.card {
border-radius: 0
}
.certificate-dialog>.window-heading {
padding: 10px 12px
}
.certificate-dialog .provider-picker {
padding: 10px 12px 0
}
.certificate-provider-hint {
padding: 0 12px
}
.certificate-dialog .card {
padding: 12px
}
.cache-operation-dialog>.card {
border: 0;
padding: 14px
}
.cache-operation-dialog .cache-dialog-heading {
margin-bottom: 12px;
padding: 9px 0
}
.cache-operation-dialog .cache-dialog-heading>div:first-child {
min-width: 0
}
.cache-operation-dialog .cache-dialog-heading button {
margin-inline-start: auto;
flex: 0 0 auto
}
.vh-location {
border: 1px solid var(--line);
background: var(--panel);
min-width: 0
}
.vh-locations {
display: grid;
gap: 9px
}
.location-toolbar,
.location-header-toolbar,
.location-actions {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 7px
}
.location-toolbar {
justify-content: space-between;
margin-bottom: 8px
}
.location-toolbar-bottom {
justify-content: flex-start;
margin: 9px 0 0
}
.location-summary {
cursor: pointer;
padding: 10px 12px;
font: 600 11px/1.45 var(--mono);
overflow-wrap: anywhere;
color: var(--text)
}
.location-summary:hover {
background: var(--panel-strong)
}
.location-body {
border-top: 1px solid var(--line);
padding: 12px
}
.location-section {
border: 1px solid var(--line);
min-width: 0
}
.location-section>summary {
cursor: pointer;
padding: 9px 10px;
color: var(--muted);
font: 600 10px var(--mono);
letter-spacing: .35px
}
.location-section>div {
border-top: 1px solid var(--line);
padding: 10px
}
.location-header-toolbar {
justify-content: flex-start
}
.location-actions {
justify-content: flex-end;
padding-top: 4px
}
.location-return-box {
padding-top: 3px
}
#location-help-dialog {
width: min(760px, calc(100vw - 28px));
max-height: min(82vh, 760px)
}
#location-help-body {
display: grid;
gap: 8px;
padding: 14px 16px 18px;
overflow: auto
}
#location-help-body p {
margin: 0;
line-height: 1.55
}
.acl-rule,
.basic-user {
display: grid;
grid-template-columns: minmax(100px, 1fr) minmax(140px, 1fr) auto;
align-items: end;
gap: 7px;
margin-block: 5px
}
.basic-user {
grid-template-columns: 1fr 1fr auto auto
}
.basic-user .fine {
align-self: center;
font-size: 10px
}
.renewal-entry {
display: grid;
grid-template-columns: 1fr 2fr auto;
gap: 8px;
padding: 9px 0;
border-bottom: 1px solid var(--line);
align-items: center
}
.renewal-actions {
display: flex;
flex-wrap: wrap;
gap: 5px
}
.renewal-entry .fine {
grid-column: 1/-1
}
@media(max-width:640px) {
.basic-user,
.acl-rule {
grid-template-columns: 1fr 1fr
}
.renewal-entry {
grid-template-columns: 1fr
}
.renewal-entry .fine {
grid-column: auto
}
}
#toast[popover] {
border-radius: 0;
pointer-events: none
}
.app-confirm-dialog {
width: min(520px, calc(100vw - 28px));
max-width: none;
padding: 0;
border: 1px solid var(--line);
border-radius: 4px;
background: var(--panel);
color: var(--text)
}
.app-confirm-dialog::backdrop {
background: var(--backdrop);
backdrop-filter: blur(2px)
}
.app-confirm-card {
margin: 0;
border: 0;
padding: 18px
}
.app-confirm-message {
margin-top: 14px;
color: var(--text);
white-space: pre-line;
overflow-wrap: anywhere
}
.app-confirm-actions {
justify-content: flex-end;
margin-top: 18px
}
.app-confirm-danger {
border-color: var(--red);
color: var(--red)
}
.app-confirm-danger:hover {
border-color: var(--red);
background: rgb(255 170 162 / .08)
}
#panel-tls>.config-columns {
display: block;
margin-top: 12px
}
#certificate-list {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
gap: 10px
}
#certificate-list>.entity {
border: 1px solid var(--line);
padding: 12px;
min-width: 0
}
.certificate-card-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 10px
}
.certificate-card-identity {
min-width: 0
}
.certificate-state-pills {
margin-top: 8px
}
.certificate-card .pill {
color: var(--accent)
}
.certificate-coverage {
margin-top: 14px
}
.certificate-coverage>.small-label {
display: block;
margin-bottom: 7px
}
.certificate-domain-pills {
margin-top: 0
}
.certificate-domain-pills .pill {
max-width: 100%;
overflow-wrap: anywhere
}
.certificate-coverage-unknown {
color: var(--muted) !important;
font: 10px/1.5 var(--mono) !important
}
.certificate-details {
margin-top: 12px;
border-top: 1px solid var(--line);
border-bottom: 1px solid var(--line)
}
.certificate-details summary {
cursor: pointer;
padding: 9px 0;
color: var(--muted);
font: 10px var(--mono);
letter-spacing: .7px
}
.certificate-details summary:hover {
color: var(--text)
}
.certificate-details-body {
padding: 0 0 8px
}
.certificate-details .entity-details {
margin: 4px 0
}
.certificate-card>.entity-actions {
margin-top: 10px
}
.auth-page.auth-loading .auth-top,
.auth-page.auth-loading .auth-main {
visibility: hidden
}
.auth-page {
min-height: 100vh
}
.auth-top {
display: flex;
align-items: center;
justify-content: space-between;
padding: 18px 24px;
border-bottom: 1px solid var(--line)
}
.auth-main {
max-width: 560px;
margin: auto;
padding: 28px 20px
}
.auth-main .login-section {
padding: 0;
max-width: none
}
.auth-main .login-card {
width: 100%;
max-width: none
}
.auth-main h1 {
font-size: 1.65rem;
margin-bottom: 18px
}
.login-section #auth-message:empty {
display: none
}
.login-section #auth-message {
margin-top: 14px;
padding: 11px 12px;
border: 1px solid var(--line);
background: var(--panel2);
color: var(--text);
font-size: 12px;
line-height: 1.5;
overflow-wrap: anywhere
}
.login-section #auth-message.error {
border-color: rgb(255 170 162 / .58);
background: rgb(255 170 162 / .07);
color: var(--red)
}
.location-header-editor {
min-width: 0
}
.location-header-editor h3 {
font-size: 12px;
margin: 8px 0
}
.location-header-editor .vh-header-row {
grid-template-columns: 100px minmax(120px, 1fr) minmax(120px, 1.3fr) auto
}
@media(max-width:650px) {
.location-header-editor .vh-header-row {
grid-template-columns: 1fr 1fr
}
.location-toolbar,
.location-actions {
align-items: stretch
}
.location-toolbar>button,
.location-actions>button {
flex: 1 1 150px
}
.auth-top {
padding: 14px
}
.auth-main {
padding: 22px 14px
}
}
.location-header-direction {
border: 1px solid var(--line);
background: var(--panel2);
padding: 10px;
min-width: 0
}
.location-header-direction-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px;
margin-bottom: 8px
}
.location-header-direction-head h3,
.location-header-direction-head p {
margin: 0
}
.location-header-direction-head p {
max-width: 56ch;
text-align: right
}
.vh-header-empty {
margin: 8px 0;
padding: 9px 10px;
border: 1px dashed var(--line)
}
.location-header-editor .vh-header-rows {
display: grid;
gap: 8px
}
.location-header-editor .vh-header-row {
display: block;
border: 1px solid var(--line);
background: var(--panel);
padding: 9px
}
.vh-header-rule-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
margin-bottom: 8px
}
.vh-header-rule-title {
font: 600 10px var(--mono);
color: var(--muted);
text-transform: uppercase;
letter-spacing: .45px
}
.vh-header-rule-fields {
display: grid;
grid-template-columns: minmax(100px, .55fr) minmax(140px, 1fr) minmax(180px, 1.35fr);
align-items: end;
gap: 8px
}
.vh-header-row.is-remove .vh-header-rule-fields {
grid-template-columns: minmax(100px, .55fr) minmax(140px, 1fr) minmax(180px, 1.35fr)
}
.location-add-header {
margin-top: 8px
}
.location-preview {
border: 1px solid var(--line);
background: var(--panel2);
padding: 11px 12px
}
.location-preview h4 {
margin: 0 0 8px;
font-size: 12px
}
.location-preview-disabled {
margin: 0 0 8px;
color: var(--red)
}
.location-preview-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 7px 14px;
margin: 0
}
.location-preview-grid>div {
min-width: 0
}
.location-preview-grid dt {
color: var(--muted);
font: 10px var(--mono);
margin-bottom: 2px
}
.location-preview-grid dd {
margin: 0;
font-size: 11px;
overflow-wrap: anywhere
}
.location-doc-intro {
padding: 10px 12px;
border: 1px solid var(--line);
background: var(--panel2)
}
.location-doc-section {
border-top: 1px solid var(--line);
padding-top: 10px
}
.location-doc-section h3 {
margin: 0 0 7px;
font-size: 12px
}
.location-doc-section p+p {
margin-top: 7px !important
}
.location-doc-examples p {
font-family: var(--mono);
font-size: 10px;
padding: 8px 9px;
background: var(--panel2);
border-left: 2px solid var(--accent)
}
@media(max-width:650px) {
.location-header-direction-head {
display: block
}
.location-header-direction-head p {
text-align: left;
margin-top: 5px
}
.vh-header-rule-fields,
.vh-header-row.is-remove .vh-header-rule-fields,
.location-preview-grid {
grid-template-columns: 1fr
}
}
.settings-tabs {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(128px, 1fr));
width: 100%;
gap: 5px
}
.settings-tabs button {
width: 100%;
min-width: 0;
white-space: normal;
text-align: center
}
.settings-pages,
.settings-page,
.settings-page>.edit-form {
width: 100%;
max-width: none
}
.logging-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 12px;
margin: 14px 0
}
.traffic-chart-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 12px;
margin: 14px 0
}
.traffic-chart-card {
min-width: 0
}
.traffic-donut-layout {
display: grid;
grid-template-columns: 148px minmax(0, 1fr);
gap: 14px;
align-items: center
}
.traffic-donut {
position: relative;
width: 148px;
aspect-ratio: 1;
border-radius: 50%;
background: var(--panel2);
box-shadow: inset 0 0 0 1px var(--line)
}
.traffic-donut::before {
content: "";
position: absolute;
inset: 23%;
border-radius: 50%;
background: var(--panel);
box-shadow: 0 0 0 1px var(--line)
}
.traffic-donut>span {
position: absolute;
inset: 0;
z-index: 1;
display: grid;
place-items: center;
font: 700 16px var(--mono)
}
.traffic-chart-legend {
display: grid;
gap: 6px;
padding: 0;
margin: 0;
list-style: none;
min-width: 0
}
.traffic-chart-legend li {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
min-width: 0;
font-size: 11px
}
.traffic-chart-legend li>span {
display: flex;
align-items: center;
gap: 7px;
min-width: 0
}
.traffic-chart-swatch {
width: 9px;
height: 9px;
border-radius: 50%;
flex: 0 0 auto
}
.traffic-chart-label {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap
}
.traffic-chart-legend b {
font: 700 10px var(--mono);
flex: 0 0 auto
}
#panel-traffic .traffic-tabs {
margin: 12px 0 14px
}
#panel-traffic [data-traffic-page] {
min-width: 0
}
.traffic-wide-chart {
grid-column: span 2
}
.traffic-bar-chart {
display: grid;
gap: 8px;
min-width: 0
}
.traffic-bar-row {
display: grid;
grid-template-columns: minmax(120px, 1.5fr) minmax(120px, 3fr) minmax(72px, auto);
gap: 10px;
align-items: center;
min-width: 0
}
.traffic-bar-label {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font: 11px var(--mono)
}
.traffic-bar-track {
height: 10px;
border-radius: 999px;
background: var(--panel2);
box-shadow: inset 0 0 0 1px var(--line);
overflow: hidden
}
.traffic-bar-fill {
display: block;
height: 100%;
min-width: 2px;
border-radius: inherit;
background: var(--accent)
}
.traffic-bar-value {
text-align: right;
font: 700 10px var(--mono)
}
@media(max-width:1100px) {
.traffic-wide-chart {
grid-column: span 1
}
}
@media(max-width:650px) {
.traffic-bar-row {
grid-template-columns: minmax(88px, 1.2fr) minmax(90px, 2fr) minmax(60px, auto);
gap: 7px
}
}
.logging-grid label {
min-width: 0
}
#settings-page-logging>.edit-form {
width: 100%;
max-width: none
}
.logging-settings-subform {
margin: 0;
min-width: 0
}
@media(max-width:1100px) {
.traffic-chart-grid {
grid-template-columns: repeat(2, minmax(0, 1fr))
}
}
@media(max-width:720px) {
.traffic-chart-grid,
.logging-grid {
grid-template-columns: 1fr
}
.traffic-donut-layout {
grid-template-columns: 120px minmax(0, 1fr)
}
.traffic-donut {
width: 120px
}
}
#vhost-list,
#web-service-list {
display: grid;
gap: 10px
}
#panel-vhosts .card-heading,
#panel-web-server .card-heading {
flex-wrap: wrap
}
.vhost-list-tools {
display: flex;
align-items: center;
gap: 8px;
margin-left: auto
}
#vhost-search,
#web-service-search {
width: min(260px, 32vw);
min-width: 180px
}
.vhost-card {
border: 1px solid var(--line);
background: var(--panel);
padding: 14px;
min-width: 0
}
.vhost-card-head {
display: flex;
justify-content: space-between;
gap: 14px;
align-items: flex-start
}
.vhost-card-identity {
min-width: 0
}
.vhost-title-line,
.vhost-policy-pills {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 8px
}
.vhost-hosts {
margin-top: 4px;
font: 11px/1.45 var(--mono);
color: var(--muted);
overflow-wrap: anywhere
}
.vhost-detail-strip {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 1px;
margin-top: 12px;
border: 1px solid var(--line)
}
.vhost-detail {
min-width: 0;
padding: 9px 10px;
background: var(--bg)
}
.vhost-detail span,
.vhost-detail b {
display: block
}
.vhost-detail b {
margin-top: 3px;
font-size: 11px;
font-weight: 600;
overflow-wrap: anywhere
}
.vhost-live-grid {
display: grid;
grid-template-columns: repeat(6, minmax(0, 1fr));
gap: 8px;
margin-top: 10px
}
.vhost-live-metric {
min-width: 0;
padding: 9px 10px;
border: 1px solid var(--line)
}
.vhost-live-metric span {
display: block;
color: var(--muted);
font-size: 10px;
text-transform: uppercase;
letter-spacing: .04em
}
.vhost-live-metric strong {
display: block;
margin-top: 4px;
font: 600 13px var(--mono);
overflow-wrap: anywhere
}
.vhost-card .vh-health-summary {
margin: 9px 0 0;
grid-column: auto
}
.vhost-policy-pills {
margin-top: 8px
}
.vhost-quick-toggle.is-enable {
border-color: var(--pill-live-line);
color: var(--green)
}
.vhost-quick-toggle.is-disable {
border-color: var(--danger-line);
color: var(--red)
}
@media(max-width:980px) {
.logging-grid {
grid-template-columns: 1fr
}
.vhost-live-grid {
grid-template-columns: repeat(3, minmax(0, 1fr))
}
}
@media(max-width:640px) {
.settings-tabs {
grid-template-columns: repeat(2, minmax(0, 1fr))
}
.vhost-card-head {
flex-direction: column
}
#panel-vhosts .card-heading {
align-items: stretch;
flex-direction: column
}
.vhost-list-tools {
width: 100%;
margin-left: 0
}
#vhost-search {
flex: 1 1 auto;
width: auto;
min-width: 0
}
.backend-card-heading {
align-items: stretch;
flex-direction: column
}
.backend-table-tools {
width: 100%;
justify-content: flex-start;
margin-left: 0
}
#pool-search {
flex: 1 1 100%;
width: 100%;
min-width: 0
}
.backend-column-options {
right: auto;
left: 0;
grid-template-columns: 1fr;
min-width: min(290px, 82vw)
}
.vhost-card-head .entity-actions {
width: 100%;
justify-content: flex-start
}
.vhost-live-grid {
grid-template-columns: repeat(2, minmax(0, 1fr))
}
}
.acl-profile-layout {
display: grid;
grid-template-columns: minmax(0, 1.15fr) minmax(320px, .85fr);
gap: 14px;
align-items: start
}
.acl-profile-layout>.card,
.logging-grid>.card {
border-radius: 0
}
.host-chip-field>span:first-child {
display: block;
color: var(--muted);
font-size: 11px;
margin-bottom: 7px
}
.host-chip-editor {
min-height: 43px;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 6px;
padding: 6px;
border: 1px solid var(--field-line);
background: var(--field-bg)
}
.host-chip-editor:focus-within {
outline: 1px solid var(--green);
border-color: var(--green)
}
.host-chip-editor input {
flex: 1 1 210px;
width: auto;
min-width: 180px;
border: 0;
outline: 0;
padding: 5px 6px;
background: transparent
}
.host-chip {
display: inline-flex;
align-items: center;
gap: 5px;
padding: 4px 5px 4px 8px;
border: 1px solid var(--line);
background: var(--panel);
font: 10px var(--mono)
}
.host-chip button {
border: 0;
background: transparent;
color: var(--muted);
padding: 0 3px;
font-size: 15px;
line-height: 1
}
.host-chip button:hover {
color: var(--red)
}
.vhost-chart {
margin-top: 9px;
border: 1px solid var(--line);
background: var(--bg)
}
.vhost-chart-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
padding: 7px 10px 0
}
.vhost-chart svg {
display: block;
width: 100%;
height: 54px
}
.vhost-chart-line {
fill: none;
stroke: var(--accent);
stroke-width: 2;
vector-effect: non-scaling-stroke
}
.logging-format-actions {
display: grid;
grid-template-columns: minmax(220px, 1fr) auto;
gap: 14px;
align-items: end
}
.logging-builder-action {
display: grid;
gap: 7px;
justify-items: stretch;
min-width: 180px
}
.logging-builder-action .small-label {
text-align: right
}
.logging-builder-action button {
width: 100%
}
.logging-builder-layout {
display: grid;
grid-template-columns: minmax(0, 1.55fr) minmax(260px, .85fr);
gap: 14px;
min-height: 0
}
.logging-builder-layout>section {
min-width: 0;
border: 1px solid var(--line);
padding: 12px;
background: var(--bg)
}
.logging-preview pre {
margin: 0;
max-height: 420px;
overflow: auto
}
@media(max-width:900px) {
.acl-profile-layout,
.logging-builder-layout,
.logging-format-actions {
grid-template-columns: 1fr
}
.logging-builder-action .small-label {
text-align: left
}
}
.acl-profile-rules-editor {
margin-block: 10px 4px
}
.acl-profile-rules-heading {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
margin-bottom: 6px
}
.acl-profile-rules-heading>span {
color: var(--muted);
font-size: 11px
}
.acl-profile-rule-rows:empty::before {
content: "—";
display: block;
color: var(--muted);
padding: 8px 0
}
.acl-profile-rule {
grid-template-columns: minmax(120px, .65fr) minmax(180px, 1.35fr) auto;
padding: 6px 0;
border-bottom: 1px solid var(--line)
}
.acl-profile-rule label>span {
display: block;
color: var(--muted);
font-size: 10px;
margin-bottom: 4px
}
.acl-profile-bulk {
margin-top: 9px;
border-top: 1px solid var(--line);
padding-top: 8px
}
.acl-profile-bulk>summary {
cursor: pointer;
color: var(--muted)
}
.pool-vhost-disabled {
opacity: .55;
background: var(--neutral-soft)
}
.pool-vhost-disabled td {
color: var(--muted)
}
@media(max-width:640px) {
.acl-profile-rule {
grid-template-columns: 1fr
}
}
#stream-list {
display: grid;
gap: 10px
}
#panel-streams .card-heading {
flex-wrap: wrap
}
#stream-search {
width: min(260px, 32vw);
min-width: 180px
}
.stream-page-actions {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 8px 12px;
margin: 0 0 10px
}
.stream-card .vhost-hosts {
text-transform: none
}
.stream-live-grid {
grid-template-columns: repeat(6, minmax(0, 1fr))
}
.stream-chart-rx,
.stream-chart-tx {
fill: none;
stroke-width: 2;
vector-effect: non-scaling-stroke
}
.stream-chart-rx {
stroke: var(--accent)
}
.stream-chart-tx {
stroke: var(--green)
}
.stream-chart-legend {
display: flex;
justify-content: flex-end;
flex-wrap: wrap;
gap: 12px;
padding: 0 10px 7px;
color: var(--muted);
font: 10px var(--mono)
}
.stream-socket-editor input[hidden] {
display: none
}
.listener-address-chip-editor {
min-height: 52px
}
@media(max-width:980px) {
.stream-live-grid {
grid-template-columns: repeat(3, minmax(0, 1fr))
}
}
@media(max-width:640px) {
#panel-streams .card-heading {
align-items: stretch;
flex-direction: column
}
#panel-streams .vhost-list-tools {
width: 100%;
margin-left: 0
}
#stream-search {
flex: 1 1 auto;
width: auto;
min-width: 0
}
.stream-live-grid {
grid-template-columns: repeat(2, minmax(0, 1fr))
}
}
.redirect-listeners {
display: grid;
gap: .55rem;
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr))
}
.redirect-listeners .check {
margin: 0
}
.redirect-rules {
display: grid;
gap: 1rem
}
.redirect-rule {
border: 1px solid var(--line);
border-radius: 12px;
padding: 1rem;
margin: 0;
min-width: 0
}
.redirect-rule legend {
padding: 0 .4rem;
font-weight: 700
}
.redirect-card .vhost-detail-strip {
grid-template-columns: repeat(3, minmax(0, 1fr))
}
@media(max-width:760px) {
.redirect-card .vhost-detail-strip {
grid-template-columns: 1fr
}
.redirect-rule .vh-grid {
grid-template-columns: 1fr
}
}
.vh-tabs {
flex-wrap: nowrap;
overflow-x: auto;
overscroll-behavior-x: contain;
scrollbar-width: thin
}
.vh-tabs button {
white-space: nowrap
}
.protocol-toggle-row {
display: flex;
flex-wrap: wrap;
gap: 8px 18px;
align-items: center;
min-width: 0
}
.protocol-toggle-row .check,
.protocol-toggle-row .vh-check {
margin: 0;
min-width: min(280px, 100%)
}
.listener-choices {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
gap: 8px
}
.listener-choices>.fine {
grid-column: 1/-1;
margin: 0 0 2px
}
.listener-choices>label {
display: flex;
min-height: 44px;
align-items: center;
margin: 0
}
.vh-members {
gap: 12px
}
.vh-backend-card {
padding: 0;
overflow: hidden;
background: var(--panel)
}
.vh-backend-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 10px 12px;
border-bottom: 1px solid var(--line)
}
.vh-backend-identity {
display: grid;
gap: 2px;
min-width: 0
}
.vh-backend-title {
font-size: 13px
}
.vh-backend-endpoint {
overflow-wrap: anywhere
}
.vh-backend-main {
padding: 12px
}
.vh-backend-switches {
display: flex;
flex-wrap: wrap;
gap: 6px 16px;
padding-top: 2px
}
.vh-backend-switches .vh-check {
margin: 0;
min-height: 26px
}
.vh-backend-connection {
padding-top: 8px;
border-top: 1px dashed var(--line)
}
.vh-backend-advanced {
margin: 0 12px 10px;
padding-top: 8px;
border-top: 1px solid var(--line)
}
.vh-backend-advanced>summary,
.auth-advanced>summary {
cursor: pointer;
color: var(--muted);
font-size: 11px;
font-weight: 600;
padding: 4px 0 8px
}
.vh-backend-actions {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 8px 12px;
padding: 0 12px 12px
}
.vh-backend-actions .fine {
flex: 1 1 320px;
margin: 0
}
.vh-local-risk-gate {
border: 1px solid var(--line);
border-radius: 5px;
padding: 8px
}
.vh-local-risk-gate .fine {
margin: 5px 0 0
}
.auth-subcard {
border: 1px solid var(--line);
border-radius: 6px;
padding: 10px;
display: grid;
gap: 8px
}
.auth-subcard>h3 {
margin: 0;
font-size: 12px
}
.auth-ip-card {
margin-top: 2px
}
.auth-advanced {
border-top: 1px solid var(--line);
padding-top: 4px
}
.vh-cache-options[hidden] {
display: none
}
#redirect-listeners>.listener-choices {
width: 100%
}
@media(max-width:760px) {
.protocol-toggle-row {
display: grid;
grid-template-columns: 1fr
}
.protocol-toggle-row .check,
.protocol-toggle-row .vh-check {
min-width: 0
}
.listener-choices {
grid-template-columns: 1fr
}
.vh-backend-head {
align-items: flex-start
}
}
.docker-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
margin-bottom: 16px;
}
.toolbar-actions {
display: flex;
gap: 8px;
flex-wrap: wrap;
justify-content: flex-end;
}
.docker-agent-observations,
.docker-agent-settings-list {
display: grid;
gap: 16px;
}
.docker-agent-card,
.docker-agent-settings {
min-width: 0;
}
.docker-agent-heading-actions {
align-items: center;
}
.docker-agent-status-badge {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 88px;
text-align: center;
}
.docker-agent-summary {
display: flex;
flex-wrap: wrap;
gap: 7px 18px;
margin: 8px 0 16px;
padding: 10px 12px;
border: 1px solid var(--line);
background: var(--panel2);
font-size: 12px;
color: var(--muted);
}
.docker-agent-security {
display: flex;
align-items: center;
gap: 10px;
padding: 9px 11px;
margin: 4px 0 10px;
border-left: 2px solid var(--line);
background: var(--panel2);
min-width: 0;
}
.docker-agent-security .fine {
overflow-wrap: anywhere;
}
.docker-agent-error {
display: grid;
gap: 5px;
padding: 12px;
border: 1px solid var(--danger-line);
background: rgba(255, 170, 162, .04);
}
.docker-service-list {
display: grid;
gap: 10px;
}
.docker-service-row {
display: grid;
gap: 12px;
padding: 13px;
border: 1px solid var(--line);
background: var(--panel2);
min-width: 0;
}
.docker-service-row.is-unpublished {
opacity: .72;
}
.docker-service-row.is-view-hidden {
border-style: dashed;
opacity: .58;
}
.docker-service-head {
display: grid;
grid-template-columns: auto minmax(220px, 1fr) minmax(300px, 1.25fr);
align-items: center;
gap: 14px;
min-width: 0;
}
.docker-service-meta {
display: grid;
gap: 2px;
min-width: 0;
}
.docker-service-meta span {
color: var(--muted);
font-size: 12px;
overflow-wrap: anywhere;
}
.docker-runtime {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 10px;
min-width: 0;
text-align: right;
}
.docker-runtime .fine {
overflow-wrap: anywhere;
}
.docker-route-grid {
display: grid;
grid-template-columns: minmax(190px, 1.1fr) minmax(190px, 1fr) minmax(210px, 1fr) 100px auto;
align-items: end;
gap: 10px;
}
.docker-route-grid>label:not(.check),
.docker-health-grid>label {
display: grid;
gap: 5px;
min-width: 0;
}
.docker-route-grid>label:not(.check)>span,
.docker-health-grid>label>span {
color: var(--muted);
font-size: 11px;
}
.docker-route-grid input:not([type="checkbox"]),
.docker-route-grid select,
.docker-health-grid input:not([type="checkbox"]),
.docker-health-grid select {
min-width: 0;
width: 100%;
}
.docker-preserve-field {
align-self: center;
padding-bottom: 9px;
white-space: nowrap;
}
.docker-health-editor {
border-top: 1px solid var(--line);
padding-top: 9px;
}
.docker-health-editor>summary {
cursor: pointer;
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
user-select: none;
}
.docker-health-editor>summary::marker {
color: var(--muted);
}
.docker-health-grid {
display: grid;
grid-template-columns: repeat(5, minmax(120px, 1fr));
gap: 10px;
margin-top: 12px;
}
.docker-passive-health-editor .docker-health-grid {
grid-template-columns: repeat(4, minmax(180px, 1fr));
align-items: start;
}
.docker-passive-health-editor .docker-checkbox-field {
min-width: 0;
}
.docker-passive-health-editor .docker-checkbox-field .vh-check {
width: max-content;
max-width: 100%;
}
.docker-passive-health-editor .docker-checkbox-field input[type="checkbox"] {
width: auto;
}
.docker-passive-health-editor .docker-passive-5xx-warning,
.docker-passive-health-editor .docker-passive-slow-warning {
grid-column: span 2;
margin: 0;
min-width: 0;
}
.docker-agent-grid {
margin-top: 10px;
}
.docker-agent-listener-field {
grid-column: 1/-1;
display: grid;
gap: 6px;
min-width: 0;
}
.docker-agent-field-label {
font-size: 11px;
color: var(--muted);
}
.docker-agent-listener-choices {
margin: 0;
}
.docker-agent-listener-choices>label {
min-height: 38px;
}
.docker-agent-grid .mono,
.docker-agent-summary .mono {
font-family: var(--mono);
font-size: 11px;
}
.pill.warn {
border-color: var(--warn-line);
color: var(--accent);
}
.pill.danger {
border-color: var(--danger-line-strong);
color: var(--red);
}
.docker-toolbar input[type="search"] {
width: min(280px, 38vw);
}
.cache-toolbar-status {
margin-left: auto;
display: flex;
align-items: center;
gap: 12px;
white-space: nowrap;
}
@media (max-width: 1320px) {
.docker-service-head {
grid-template-columns: auto 1fr;
}
.docker-runtime {
grid-column: 2;
justify-content: flex-start;
text-align: left;
flex-wrap: wrap;
}
.docker-route-grid {
grid-template-columns: 1fr 1fr 1fr;
}
.docker-preserve-field {
padding-bottom: 0;
}
.docker-health-grid {
grid-template-columns: repeat(3, minmax(130px, 1fr));
}
.docker-passive-health-editor .docker-health-grid {
grid-template-columns: repeat(2, minmax(180px, 1fr));
}
}
@media (max-width: 760px) {
.docker-service-head {
grid-template-columns: 1fr;
align-items: stretch;
}
.docker-runtime {
grid-column: auto;
justify-content: flex-start;
text-align: left;
}
.docker-route-grid,
.docker-health-grid {
grid-template-columns: 1fr;
}
.docker-passive-health-editor .docker-health-grid {
grid-template-columns: 1fr;
}
.docker-passive-health-editor .docker-passive-5xx-warning,
.docker-passive-health-editor .docker-passive-slow-warning {
grid-column: auto;
}
.docker-toolbar {
align-items: flex-start;
flex-direction: column;
}
.docker-agent-security {
align-items: flex-start;
flex-direction: column;
}
.docker-toolbar input[type="search"] {
width: 100%;
}
.cache-toolbar-status {
margin-left: 0;
width: 100%;
justify-content: flex-start;
}
}
#panel-settings:not([hidden]) {
display: grid;
grid-template-columns: minmax(180px, 220px) minmax(0, 1fr);
gap: 12px;
align-items: start
}
#panel-settings .settings-shortcuts {
grid-column: 1 / -1;
width: 100%
}
#panel-settings .settings-tabs {
display: flex;
flex-direction: column;
position: sticky;
top: 12px;
margin: 0;
gap: 2px
}
#panel-settings .settings-tabs button {
width: 100%;
text-align: left;
white-space: normal
}
#panel-settings .settings-pages {
min-width: 0
}
@media (max-width: 900px) {
#panel-settings:not([hidden]) {
display: block;
}
#panel-settings .settings-shortcuts {
margin-bottom: 10px;
}
#panel-settings .settings-tabs {
display: flex;
flex-direction: row;
position: static;
overflow-x: auto;
overscroll-behavior-inline: contain;
scrollbar-width: thin;
margin-bottom: 12px
}
#panel-settings .settings-tabs button {
flex: 0 0 auto;
width: auto;
min-width: 120px;
white-space: nowrap;
text-align: center
}
}
.docker-live-switch {
align-self: center;
white-space: nowrap;
}
.docker-service-row.is-dirty {
border-color: var(--accent);
box-shadow: inset 3px 0 0 var(--accent);
}
.docker-service-actions {
display: flex;
justify-content: flex-end;
gap: 8px;
}
.docker-acl-editor,
.docker-timeout-editor {
border-top: 1px solid var(--line);
padding-top: 9px;
}
.docker-acl-editor>summary,
.docker-timeout-editor>summary {
cursor: pointer;
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
user-select: none;
}
.docker-acl-grid,
.docker-timeout-grid {
display: grid;
grid-template-columns: repeat(4, minmax(140px, 1fr));
gap: 10px;
margin-top: 12px;
}
.docker-acl-grid>label:not(.check),
.docker-timeout-grid>label {
display: grid;
gap: 5px;
min-width: 0;
}
.docker-acl-grid textarea {
width: 100%;
min-height: 86px;
font-family: var(--mono);
}
@media (max-width: 1000px) {
.docker-acl-grid,
.docker-timeout-grid {
grid-template-columns: 1fr 1fr;
}
}
@media (max-width: 760px) {
.docker-acl-grid,
.docker-timeout-grid {
grid-template-columns: 1fr;
}
.docker-service-actions {
justify-content: stretch;
}
.docker-service-actions button {
width: 100%;
}
}
.security-page-heading {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 18px;
margin-bottom: 14px;
}
.security-page-heading h2 {
margin: 3px 0 4px;
}
.security-page-heading p {
margin: 0;
max-width: 760px;
}
.security-stack {
display: grid;
gap: 14px;
}
.security-account-card .session-user {
margin: 4px 0 0;
}
.security-account-card .security-note {
margin: 10px 0 14px;
}
.security-editor {
border-top: 1px solid var(--line);
margin-top: 14px;
padding-top: 10px;
}
.security-editor>summary {
cursor: pointer;
display: flex;
justify-content: space-between;
align-items: center;
gap: 14px;
user-select: none;
}
.security-editor>summary>span {
font-weight: 700;
}
.security-inline-form {
margin-top: 14px;
padding: 0;
border: 0;
background: transparent;
}
.security-policy-card #host-policy-list {
display: grid;
gap: 8px;
}
.audit-dialog {
width: min(1040px, calc(100vw - 24px));
max-height: calc(100dvh - 28px);
overflow: hidden;
}
.audit-dialog-card {
border: 0;
padding: 12px;
background: var(--bg);
}
.audit-dialog .table-scroll {
max-height: min(68dvh, 680px);
overflow: auto;
border-top: 1px solid var(--line);
}
.audit-dialog table {
font: 11px var(--mono);
}
.audit-dialog th,
.audit-dialog td {
padding: 7px 8px;
max-width: 440px;
overflow: hidden;
text-overflow: ellipsis;
}
.audit-dialog th {
position: sticky;
top: 0;
background: var(--panel);
}
.docker-agent-overview {
display: flex;
flex-wrap: wrap;
gap: 7px 18px;
margin: 8px 0 10px;
color: var(--muted);
font-size: 12px;
}
.docker-agent-details {
margin: 0 0 12px;
border-top: 1px solid var(--line);
padding-top: 8px;
}
.docker-agent-details>summary {
cursor: pointer;
color: var(--muted);
font-size: 11px;
user-select: none;
}
.docker-agent-details .docker-agent-summary {
margin: 9px 0 0;
}
.docker-service-row {
gap: 8px;
padding: 10px 12px;
}
.docker-service-head {
grid-template-columns: auto minmax(260px, 1fr) minmax(300px, 1.25fr);
gap: 12px;
}
.docker-service-head-actions {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 10px;
min-width: 0;
}
.docker-service-head-actions .docker-runtime {
flex: 1 1 auto;
}
.docker-service-head-actions .docker-view-toggle {
flex: 0 0 auto;
}
.docker-service-editor {
border-top: 1px solid var(--line);
padding-top: 8px;
}
.docker-service-editor>summary {
cursor: pointer;
display: flex;
align-items: center;
justify-content: space-between;
gap: 14px;
user-select: none;
}
.docker-service-editor>summary>span {
font-weight: 700;
font-size: 12px;
}
.docker-service-editor .docker-config-hint {
text-align: right;
overflow-wrap: anywhere;
}
.docker-service-editor[open]>summary {
margin-bottom: 12px;
}
.docker-service-actions {
padding-top: 10px;
border-top: 1px solid var(--line);
}
@media (max-width: 1320px) {
.docker-service-head {
grid-template-columns: auto 1fr;
}
.docker-service-head-actions {
grid-column: 2;
justify-content: flex-start;
flex-wrap: wrap;
}
}
@media (max-width: 760px) {
.security-page-heading {
flex-direction: column;
}
.security-page-heading>button {
width: 100%;
}
.security-editor>summary,
.docker-service-editor>summary {
align-items: flex-start;
flex-direction: column;
}
.docker-service-head {
grid-template-columns: 1fr;
}
.docker-service-head-actions {
grid-column: auto;
align-items: flex-start;
flex-direction: column;
}
.docker-service-editor .docker-config-hint {
text-align: left;
}
}
.traffic-line {
fill: none;
vector-effect: non-scaling-stroke;
}
.traffic-line-total {
stroke: var(--muted);
stroke-width: 1.25;
opacity: .72;
}
.traffic-line-h1 {
stroke: var(--accent);
stroke-width: 2;
}
.traffic-line-h2 {
stroke: var(--green);
stroke-width: 2;
}
.traffic-line-h3 {
stroke: var(--blue);
stroke-width: 2;
}
.traffic-line-transform {
stroke: var(--transform-chart);
stroke-width: 2.4;
stroke-dasharray: 5 3;
}
.traffic-protocol-legend {
display: flex;
flex-wrap: wrap;
gap: 7px 16px;
margin: 2px 0 7px;
color: var(--muted);
font: 9px var(--mono);
}
.traffic-protocol-legend span {
display: inline-flex;
align-items: center;
gap: 5px;
}
.traffic-protocol-legend i {
width: 12px;
height: 2px;
display: inline-block;
background: var(--muted);
}
.traffic-protocol-legend .legend-h1 i {
background: var(--accent);
}
.traffic-protocol-legend .legend-h2 i {
background: var(--green);
}
.traffic-protocol-legend .legend-h3 i {
background: var(--blue);
}
.traffic-protocol-legend .legend-transform i {
background: var(--transform-chart);
}
.traffic-protocol-legend b {
color: var(--text);
font-weight: 600;
}
body[data-density="compact"] {
--ui-gap: 2px;
--ui-card: 5px;
--ui-font: 10.75px;
--ui-control: 22px;
line-height: 1.32;
}
body[data-density="compact"] .shell {
grid-template-columns: 164px minmax(0, 1fr);
}
body[data-density="compact"] main {
padding: 0 10px;
}
body[data-density="compact"] .sidebar {
padding: 14px 9px;
}
body[data-density="compact"] .sidebar nav {
margin-top: 14px;
}
body[data-density="compact"] .nav {
padding: 6px 7px;
}
body[data-density="compact"] .topbar {
height: 42px;
}
body[data-density="compact"] .page-intro {
padding: 7px 0 6px;
gap: 7px;
}
body[data-density="compact"] .page-intro h1 {
font-size: 20px;
}
body[data-density="compact"] .page-intro .lead {
font-size: 10px;
margin-top: 2px;
}
body[data-density="compact"] .card-heading {
margin-bottom: 5px;
}
body[data-density="compact"] .card-heading h2 {
font-size: 14px;
}
body[data-density="compact"] .stat {
padding: 6px 7px;
}
body[data-density="compact"] .stat strong {
font-size: 18px;
margin: 1px 0;
}
body[data-density="compact"] .stat p,
body[data-density="compact"] .stat small {
font-size: 9px;
}
body[data-density="compact"] .transport-grid>div {
padding: 4px 7px !important;
}
body[data-density="compact"] .transport-grid span {
font-size: 9px;
}
body[data-density="compact"] .transport-grid b {
font-size: 12px;
}
body[data-density="compact"] .activity-card svg {
height: 84px;
}
body[data-density="compact"] .system-card svg {
height: 66px;
}
body[data-density="compact"] .runtime-card dl {
margin-top: 4px;
}
body[data-density="compact"] .runtime-card dl div {
margin-top: 2px;
padding-bottom: 2px;
}
body[data-density="compact"] .mini-metrics div {
margin-top: 2px;
}
body[data-density="compact"] .pool-table th,
body[data-density="compact"] .pool-table td {
padding: 3px 5px;
font-size: 10px;
}
body[data-density="compact"] .pool-card .table-scroll {
max-height: 170px;
}
body[data-density="compact"] input:not([type="checkbox"]):not([type="radio"]),
body[data-density="compact"] select,
body[data-density="compact"] textarea,
body[data-density="compact"] button,
body[data-density="compact"] .primary,
body[data-density="compact"] .outline,
body[data-density="compact"] .quiet {
padding: 3px 7px;
font-size: 10px;
}
body[data-density="compact"] .vhost-row {
padding: 6px 7px;
gap: 1px 9px;
}
body[data-density="compact"] .docker-service-row {
padding: 6px 8px;
gap: 4px;
}
body[data-density="compact"] .docker-service-head {
gap: 7px;
}
body[data-density="compact"] .docker-agent-overview {
gap: 4px 12px;
margin: 4px 0 6px;
font-size: 10px;
}
body[data-density="compact"] .docker-agent-details {
margin-bottom: 6px;
padding-top: 5px;
}
body[data-density="compact"] .docker-service-editor {
padding-top: 5px;
}
body[data-density="compact"] .docker-service-editor[open]>summary {
margin-bottom: 7px;
}
body[data-density="compact"] .security-stack {
gap: 7px;
}
body[data-density="compact"] .security-editor {
margin-top: 8px;
padding-top: 6px;
}
body[data-density="compact"] .page-footer {
padding: 7px 0;
margin-top: 4px;
}
#sparkline.traffic-line-total {
stroke: var(--muted);
stroke-width: 1.25;
opacity: .72;
}
#sparkline-h1.traffic-line-h1 {
stroke: var(--accent);
}
#sparkline-h2.traffic-line-h2 {
stroke: var(--green);
}
#sparkline-h3.traffic-line-h3 {
stroke: var(--blue);
}
.docker-open-app {
white-space: nowrap;
}
@media (max-width: 850px) {
body[data-density="compact"] .sidebar nav {
margin-top: 0;
}
body[data-density="compact"] .sidebar {
padding: 8px 9px;
}
body[data-density="compact"] .topbar {
height: 42px;
}
}
.metric-explainer {
margin: 8px 0 2px;
line-height: 1.45
}
.network-interface-charts {
display: grid;
gap: 8px;
max-height: 260px;
overflow: auto;
padding-right: 2px
}
.network-interface-row {
min-width: 0;
padding: 7px 8px;
border: 1px solid var(--line);
border-radius: 5px;
background: var(--panel2)
}
.network-interface-row-head {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 10px;
margin-bottom: 3px
}
.network-interface-row-head b {
min-width: 0;
overflow-wrap: anywhere;
color: var(--text);
font-size: 10px
}
.network-interface-row-head .fine {
flex: 0 0 auto;
text-align: right;
white-space: nowrap
}
.network-interface-row svg {
display: block;
width: 100%;
height: 48px;
overflow: visible
}
.network-interface-empty {
margin: 0;
padding: 8px 0
}
.docker-agent-grid>label {
display: grid;
align-content: start;
gap: 6px;
min-width: 0;
margin: 0 !important
}
.docker-agent-grid>label>span:first-child,
.docker-agent-field-label {
min-height: 14px;
line-height: 14px
}
.docker-agent-grid input:not([type="checkbox"]),
.docker-agent-grid select {
width: 100%;
min-width: 0;
min-height: 38px;
margin: 0;
box-sizing: border-box
}
.docker-agent-grid>label>small {
margin: 0;
line-height: 1.35
}
.docker-agent-heading-actions {
display: flex;
align-items: center;
gap: 9px
}
.docker-agent-heading-actions .check {
margin: 0 !important;
min-height: 32px
}
.docker-agent-heading-actions>.quiet,
.docker-agent-status-badge {
min-height: 32px;
box-sizing: border-box
}
.docker-agent-listener-field {
margin-top: 2px;
padding-top: 4px;
border-top: 1px solid var(--line)
}
#docker-agent-add {
display: inline-flex;
margin-top: 14px
}
#docker-agents-form>.form-actions {
justify-content: flex-start;
margin-top: 16px;
padding-top: 14px;
border-top: 1px solid var(--line)
}
@media (max-width: 760px) {
.network-interface-row-head {
align-items: flex-start;
flex-direction: column;
gap: 2px
}
.network-interface-row-head .fine {
white-space: normal;
text-align: left
}
.docker-agent-heading-actions {
flex-wrap: wrap;
justify-content: flex-start
}
#docker-agents-form>.form-actions {
justify-content: flex-start
}
}
.network-interface-charts {
gap: 8px;
padding-right: 0
}
.network-interface-row {
min-width: 0;
padding: 0;
border: 0;
border-radius: 0;
background: transparent
}
.network-interface-row+.network-interface-row {
border-top: 1px solid var(--line);
padding-top: 8px
}
.network-interface-row-head {
margin-bottom: 5px
}
.network-interface-row-head b {
color: var(--text);
font: 600 10px var(--mono)
}
.network-interface-row-head .fine {
flex: 0 0 auto;
text-align: right;
white-space: nowrap;
font: 10px var(--mono)
}
.network-interface-row svg {
display: block;
width: 100%;
height: 60px;
overflow: visible
}
.docker-route-grid {
align-items: start
}
.docker-field {
display: grid;
align-content: start;
gap: 5px;
min-width: 0;
margin: 0 !important
}
.docker-field>span:first-child {
min-height: 14px;
line-height: 14px;
color: var(--muted);
font-size: 11px
}
.docker-route-grid .docker-field input:not([type="checkbox"]),
.docker-route-grid .docker-field select,
.docker-acl-grid .docker-field input:not([type="checkbox"]),
.docker-acl-grid .docker-field select {
width: 100%;
min-width: 0;
min-height: 38px;
height: 38px;
align-self: start;
box-sizing: border-box
}
.docker-checkbox-field .vh-check {
min-height: 28px;
margin: 0 !important;
align-items: center
}
.check>span {
display: inline-flex;
align-items: center;
min-height: 15px;
line-height: 1.25
}
.check input[type="checkbox"] {
flex: 0 0 auto;
align-self: center;
transform: translateY(-1px)
}
.cache-toolbar-status .check,
.docker-toolbar .check {
margin: 0 !important
}
.docker-switch-row {
grid-column: span 3;
display: grid;
grid-template-columns: repeat(5, minmax(110px, 160px));
justify-content: start;
align-items: start;
gap: 8px;
min-width: 0;
overflow-x: auto;
padding-bottom: 2px
}
.transform-diagnostics {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.transform-reason-list {
display: flex;
flex-wrap: wrap;
gap: 7px;
}
.cache-transform-badge {
display: inline-flex;
align-items: center;
margin-left: 6px;
padding: 1px 5px;
border: 1px solid var(--pill-line);
border-radius: 3px;
color: var(--accent);
font: 9px var(--mono);
text-transform: uppercase;
letter-spacing: .35px;
}
.docker-switch-row .docker-checkbox-field {
min-width: 110px;
max-width: 160px
}
.docker-preserve-field {
align-self: start;
padding-bottom: 0;
white-space: nowrap
}
.docker-acl-grid {
align-items: start
}
.docker-acl-grid>.docker-field {
align-self: start
}
.docker-acl-grid textarea {
align-self: start;
box-sizing: border-box
}
@media (max-width: 760px) {
.network-interface-row-head {
align-items: flex-start;
flex-direction: column;
gap: 2px
}
.network-interface-row-head .fine {
white-space: normal;
text-align: left
}
}
.docker-route-grid {
grid-template-columns: minmax(190px, 1fr) minmax(250px, 1.35fr) minmax(210px, 1fr) minmax(120px, .65fr)
}
.docker-alias-field {
grid-column: span 2
}
.docker-alias-field>span:first-child {
margin-bottom: 0
}
.docker-alias-editor {
min-height: 38px;
padding: 3px 5px;
gap: 4px;
box-sizing: border-box
}
.docker-route-grid .docker-alias-editor input:not([type="checkbox"]) {
flex: 1 1 180px;
width: auto;
min-width: 150px;
min-height: 30px;
height: 30px;
padding: 2px 4px
}
.docker-alias-field>small,
.docker-checkbox-field>small {
margin: 0;
line-height: 1.35
}
@media (max-width: 1320px) {
.docker-route-grid {
grid-template-columns: 1fr 1fr
}
.docker-alias-field,
.docker-switch-row {
grid-column: 1 / -1
}
}
@media (max-width: 760px) {
.docker-route-grid {
grid-template-columns: 1fr
}
.docker-alias-field {
grid-column: auto
}
.transform-diagnostics {
grid-template-columns: 1fr;
}
}
#panel-tls .certificate-workspace-heading {
align-items: flex-start;
margin-bottom: 12px
}
#panel-tls .certificate-workspace-heading>div,
#panel-tls .certificate-subheading>div {
min-width: 0
}
#panel-tls .certificate-workspace-heading p,
#panel-tls .certificate-subheading p,
#panel-tls .certificate-section-intro p {
margin: 5px 0 0
}
#panel-tls .certificate-tabs {
grid-template-columns: repeat(3, minmax(0, 1fr));
margin-bottom: 16px
}
#panel-tls .certificate-page[hidden] {
display: none !important
}
#panel-tls .certificate-section-intro {
margin: 2px 0 12px
}
#panel-tls .certificate-section-intro h3,
#panel-tls .certificate-subheading h3 {
margin: 0
}
#panel-tls .certificate-safety {
margin: 8px 0 12px
}
#panel-tls .certificate-inventory-card {
padding: 14px
}
#panel-tls .certificate-library-footer {
display: grid;
gap: 8px;
margin-top: 14px;
padding-top: 12px;
border-top: 1px solid var(--line)
}
#panel-tls .certificate-library-footer p {
margin: 0
}
#panel-tls .certificate-operation-card {
display: grid;
gap: 10px;
margin-bottom: 12px;
border-left: 3px solid var(--line)
}
#panel-tls .certificate-operation-card[data-state="running"] {
border-left-color: var(--accent)
}
#panel-tls .certificate-operation-card[data-state="ready"],
#panel-tls .certificate-operation-card[data-state="complete"] {
border-left-color: var(--green)
}
#panel-tls .certificate-operation-card[data-state="failed"] {
border-left-color: var(--red)
}
#panel-tls .certificate-operation-heading {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px
}
#panel-tls .certificate-operation-heading>div {
display: grid;
gap: 6px;
min-width: 0
}
#panel-tls .certificate-operation-heading strong {
overflow-wrap: anywhere
}
#panel-tls .certificate-operation-card[data-state="failed"] .certificate-operation-heading strong,
#panel-tls .certificate-operation-card[data-state="failed"] .pill {
color: var(--red)
}
#panel-tls .certificate-operation-card[data-state="ready"] .pill,
#panel-tls .certificate-operation-card[data-state="complete"] .pill {
color: var(--green)
}
#panel-tls .certificate-log-path {
margin: 0;
padding: 9px 10px;
border: 1px solid var(--line);
background: var(--bg);
font-family: var(--mono);
overflow-wrap: anywhere
}
#panel-tls .certificate-renewal-card {
padding: 12px
}
#panel-tls .renewal-entry {
display: grid;
grid-template-columns: 1fr;
gap: 10px;
padding: 13px;
margin-bottom: 10px;
border: 1px solid var(--line);
background: var(--bg);
align-items: stretch
}
#panel-tls .renewal-entry:last-child {
margin-bottom: 0
}
#panel-tls .renewal-entry[data-state="failed"] {
border-left: 3px solid var(--red)
}
#panel-tls .renewal-entry-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px
}
#panel-tls .renewal-entry-identity {
display: grid;
gap: 3px;
min-width: 0
}
#panel-tls .renewal-entry-identity strong {
overflow-wrap: anywhere
}
#panel-tls .renewal-entry .fine {
grid-column: auto;
margin: 0
}
#panel-tls .renewal-meta {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 8px
}
#panel-tls .renewal-meta-item {
display: grid;
gap: 5px;
padding: 9px;
border: 1px solid var(--line)
}
#panel-tls .renewal-meta-item strong {
font-size: 12px;
font-weight: 600;
overflow-wrap: anywhere
}
#panel-tls .renewal-message {
padding-top: 2px
}
#panel-tls .renewal-actions {
justify-content: flex-end;
padding-top: 2px
}
#panel-tls .certificate-generator-card {
padding: 14px
}
#panel-tls .certificate-generator-card>.provider-picker {
display: grid;
gap: 6px;
font-size: 12px;
font-weight: 600
}
#panel-tls .certificate-generator-card>.provider-hint {
padding: 0;
margin: 7px 0 12px
}
#panel-tls .certificate-editor-card {
max-width: none;
margin: 0;
padding: 14px 0 0;
border: 0;
border-top: 1px solid var(--line);
box-shadow: none
}
#panel-tls .certificate-editor-card[hidden] {
display: none !important
}
#panel-tls details.certificate-editor-card>summary {
padding: 0 0 12px
}
#panel-tls .certificate-editor-card .vh-grid {
gap: 10px 14px
}
@media(max-width:700px) {
#panel-tls .certificate-workspace-heading,
#panel-tls .certificate-subheading,
#panel-tls .certificate-operation-heading,
#panel-tls .renewal-entry-head {
align-items: stretch;
flex-direction: column
}
#panel-tls .certificate-workspace-heading>button,
#panel-tls .certificate-subheading>button {
width: 100%
}
#panel-tls .certificate-tabs {
grid-template-columns: 1fr
}
#panel-tls .renewal-meta {
grid-template-columns: 1fr
}
#panel-tls .renewal-actions {
justify-content: stretch
}
#panel-tls .renewal-actions button {
flex: 1 1 100%
}
}
.operation-message:empty {
display: none;
}
.operation-message {
margin: 14px 0 0;
padding: 11px 12px;
border: 1px solid var(--line);
background: var(--panel2);
color: var(--text);
font-size: 12px;
line-height: 1.5;
overflow-wrap: anywhere;
}
.operation-message.error {
border-color: rgb(255 170 162 / .58);
background: rgb(255 170 162 / .07);
color: var(--red);
}
.cache-toolbar-message {
flex-basis: 100%;
margin-top: 0;
}
.cache-operation-dialog {
width: min(920px, calc(100vw - 32px));
}
.cache-operation-dialog .card {
margin: 0;
}
.stat-with-action {
padding-right: 116px;
}
.stat-corner-action {
position: absolute;
top: 10px;
right: 10px;
margin: 0;
}
.stat-chart strong {
margin-bottom: 3px;
}
.stat-chart svg {
display: block;
width: 100%;
height: 26px;
margin-top: 2px;
}
.stat-chart .stat-chart-legend {
display: flex;
flex-wrap: nowrap;
gap: 6px 10px;
margin-top: 2px;
white-space: nowrap;
}
.stat-chart .stat-chart-legend span {
display: inline-flex;
align-items: center;
gap: 5px;
}
.stat-chart .stat-chart-legend i {
width: 8px;
height: 8px;
border-radius: 999px;
display: inline-block;
background: currentColor;
}
.stat-chart .stat-chart-legend b {
font-family: var(--mono);
font-weight: 500;
}
.proto-h1-line {
stroke: var(--traffic-h1);
fill: none;
stroke-width: 2;
}
.proto-h2-line {
stroke: var(--traffic-h2);
fill: none;
stroke-width: 2;
}
.proto-h3-line {
stroke: var(--traffic-h3);
fill: none;
stroke-width: 2;
}
.stat-chart .chart-grid {
opacity: .28;
}
.function-live-chart {
width: 100%;
padding: 0;
overflow: hidden
}
.function-live-chart-summary {
display: flex;
align-items: center;
gap: 12px;
min-height: 52px;
padding: 13px 15px;
cursor: pointer;
list-style: none;
user-select: none
}
.function-live-chart-summary::-webkit-details-marker {
display: none
}
.function-live-chart-summary::before {
content: "▸";
flex: 0 0 auto;
color: var(--muted);
font: 12px var(--mono)
}
.function-live-chart[open]>.function-live-chart-summary::before {
content: "▾"
}
.function-live-chart-heading {
display: grid;
gap: 3px;
min-width: 0;
flex: 1 1 auto
}
.function-live-chart-heading strong {
font-size: 13px;
font-weight: 650
}
.function-live-chart-heading small {
color: var(--muted);
font: 9px var(--mono)
}
.function-live-chart-summary>b {
flex: 0 0 auto;
color: var(--text);
font: 11px var(--mono);
font-weight: 650;
white-space: nowrap
}
.function-live-chart-body {
border-top: 1px solid var(--line);
padding: 14px 15px 12px
}
.function-live-chart svg {
display: block;
width: 100%;
height: clamp(180px, 22vw, 270px);
overflow: visible
}
.function-live-line {
fill: none;
stroke-width: 2.2;
vector-effect: non-scaling-stroke
}
.transform-applied-line,
.transform-applied-key {
stroke: var(--transform-chart);
color: var(--transform-chart)
}
.transform-cache-line,
.transform-cache-key {
stroke: var(--green);
color: var(--green)
}
.transform-skipped-line,
.transform-skipped-key {
stroke: var(--muted);
color: var(--muted)
}
.transform-error-line,
.transform-error-key {
stroke: var(--red);
color: var(--red)
}
.function-live-chart-footer {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px 18px;
margin-top: 8px
}
.function-live-chart-samples {
display: inline-flex;
align-items: center;
gap: 7px;
color: var(--muted);
font: 9px var(--mono);
white-space: nowrap
}
.function-live-chart-samples select {
min-width: 116px;
padding: 5px 25px 5px 8px;
font: 10px var(--mono)
}
.function-live-chart-legend {
display: flex;
flex-wrap: wrap;
justify-content: flex-end;
gap: 7px 16px;
color: var(--muted);
font: 9px var(--mono)
}
.function-live-chart-legend span {
display: inline-flex;
align-items: center;
gap: 5px
}
.function-live-chart-legend i {
display: inline-block;
width: 14px;
height: 2px;
background: currentColor
}
.function-live-chart-legend b {
color: var(--text);
font-weight: 650
}
@media (max-width: 760px) {
.function-live-chart-summary {
align-items: flex-start
}
.function-live-chart-heading small {
white-space: normal
}
.function-live-chart svg {
height: 190px
}
.function-live-chart-footer {
align-items: flex-start;
flex-direction: column
}
.function-live-chart-legend {
justify-content: flex-start
}
}
.runtime-information-card {
margin-top: 12px;
}
.runtime-information-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 12px;
}
.runtime-information-grid>div {
min-width: 0;
display: grid;
gap: 5px;
}
.runtime-information-grid code {
overflow-wrap: anywhere;
white-space: normal;
}
.payload-split {
display: flex !important;
align-items: center;
gap: 10px;
font: 9px var(--mono) !important;
}
.payload-split span {
display: inline-flex;
align-items: center;
gap: 3px;
white-space: nowrap;
}
.payload-split b,
.connection-legend b,
.connection-card .chart-footer b {
color: var(--text);
font-weight: 650;
}
.connection-card h2 {
display: flex;
align-items: baseline;
gap: 6px;
}
.connection-card h2 small {
color: var(--muted);
font: 9px var(--mono);
font-weight: 400;
}
.connection-card svg {
display: block;
width: 100%;
height: 100px;
overflow: visible;
}
.connection-open-line,
.connection-exchange-line {
fill: none;
vector-effect: non-scaling-stroke;
stroke-width: 2;
}
.connection-open-line {
stroke: var(--accent);
}
.connection-exchange-line {
stroke: var(--green);
}
.connection-legend {
display: flex;
flex-wrap: wrap;
gap: 7px 14px;
margin: 4px 0 8px;
color: var(--muted);
font: 9px var(--mono);
}
.connection-legend span {
display: inline-flex;
align-items: center;
gap: 5px;
}
.connection-legend i {
display: inline-block;
width: 14px;
height: 2px;
background: currentColor;
}
.connection-open-key {
color: var(--accent) !important;
}
.connection-exchange-key {
color: var(--green) !important;
}
.connection-legend span span {
color: var(--muted);
}
.network-interface-row-head {
align-items: center;
}
.network-interface-head-actions {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 7px;
min-width: 0;
}
.network-interface-hide {
min-height: 24px;
padding: 3px 7px;
font: 9px var(--mono);
}
.network-interface-hidden {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 6px;
padding-top: 8px;
border-top: 1px solid var(--line);
color: var(--muted);
font: 9px var(--mono);
}
.network-interface-hidden .quiet {
min-height: 24px;
padding: 3px 7px;
font: 9px var(--mono);
}
.certificate-api-credentials {
display: grid;
gap: 7px;
margin-top: 10px;
}
.certificate-api-credential-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 8px 9px;
border: 1px solid var(--line);
border-radius: 4px;
background: var(--panel2);
}
.certificate-api-credential-info {
min-width: 0;
display: grid;
gap: 3px;
}
.certificate-api-credential-info code,
.certificate-api-credential-info small {
overflow-wrap: anywhere;
}
@media (max-width: 760px) {
.certificate-api-credential-row,
.network-interface-row-head {
align-items: flex-start;
}
.certificate-api-credential-row {
flex-direction: column;
}
}
.cache-memory-sizing {
margin: 12px 0;
padding: 12px;
border: 1px solid var(--line);
border-radius: 0px;
background: var(--panel2);
}
.cache-memory-sizing .card-heading {
margin-bottom: 6px;
}
.cache-memory-sizing .form-actions {
flex-wrap: wrap;
}
#cache-memory-warning {
color: var(--notice-text);
font-weight: 600;
}
.mini-heading-actions {
display: inline-flex;
align-items: center;
justify-content: flex-end;
gap: 7px;
min-width: 0;
}
.metric-info {
position: relative;
}
.metric-info>summary {
width: 18px;
height: 18px;
display: inline-grid;
place-items: center;
list-style: none;
cursor: pointer;
border: 1px solid var(--line);
border-radius: 50%;
color: var(--muted);
background: var(--panel2);
font: 700 10px var(--mono);
user-select: none;
}
.metric-info>summary::-webkit-details-marker {
display: none;
}
.metric-info>summary:hover,
.metric-info>summary:focus-visible,
.metric-info[open]>summary {
color: var(--text);
border-color: var(--border-hover);
outline: none;
}
.metric-info-popover {
position: absolute;
z-index: 40;
top: calc(100% + 7px);
right: 0;
width: min(360px, calc(100vw - 44px));
padding: 10px 11px;
border: 1px solid var(--line);
border-radius: 6px;
background: var(--panel2);
box-shadow: 0 12px 30px var(--shadow-mid);
}
.metric-info-popover .fine {
margin: 0;
line-height: 1.5;
}
.cache-hot-line,
.cache-transient-total-line {
stroke: var(--accent);
}
.cache-fill-line {
stroke: var(--green);
}
.cache-queue-line,
.cache-cold-line {
stroke: var(--blue);
}
.cache-io-line {
stroke: var(--transform-chart);
}
.cache-transient-total-key {
color: var(--accent);
}
.cache-fill-key {
color: var(--green);
}
.cache-queue-key {
color: var(--blue);
}
.cache-io-key {
color: var(--transform-chart);
}
.web-service-pages {
min-width: 0;
}
.web-service-page[hidden] {
display: none !important;
}
#web-service-dialog .web-service-page {
padding-top: 2px;
}
.manual-config-tools {
display: flex;
flex-wrap: wrap;
gap: 8px;
align-items: center;
}
.config-history-dialog {
width: min(1180px, calc(100vw - 24px));
max-width: calc(100vw - 24px);
max-height: calc(100dvh - 28px);
overflow: hidden;
}
.config-history-layout {
display: grid;
grid-template-columns: minmax(380px, .95fr) minmax(420px, 1.05fr);
gap: 10px;
padding: 10px;
max-height: calc(100dvh - 90px);
}
.config-history-browser,
.config-history-detail {
min-width: 0;
overflow: auto;
}
.config-history-months {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 10px;
}
.config-history-month {
border: 1px solid var(--line);
padding: 9px;
background: var(--panel);
}
.config-history-month h4 {
margin: 0 0 8px;
font-size: 12px;
}
.config-history-weekdays,
.config-history-days {
display: grid;
grid-template-columns: repeat(7, 1fr);
gap: 3px;
}
.config-history-weekdays span {
color: var(--muted);
font: 9px var(--mono);
text-align: center;
padding: 2px 0;
}
.config-history-day {
min-height: 34px;
padding: 4px;
border: 1px solid transparent;
background: transparent;
color: var(--muted);
font: 10px var(--mono);
text-align: left;
}
button.config-history-day.has-revisions {
cursor: pointer;
color: var(--text);
border-color: var(--line-strong, var(--line));
background: var(--surface, var(--bg));
}
button.config-history-day.has-revisions:hover,
button.config-history-day.is-selected {
border-color: var(--accent);
color: var(--accent);
}
.config-history-day-count {
display: block;
margin-top: 3px;
font-size: 8px;
color: var(--muted);
}
.config-history-detail-head {
display: flex;
justify-content: space-between;
gap: 10px;
align-items: flex-start;
margin-bottom: 8px;
}
.config-history-detail-head h3 {
margin: 3px 0 0;
}
.config-history-detail-actions {
display: flex;
flex-direction: column;
gap: 7px;
align-items: flex-end;
text-align: right;
}
.config-history-detail-actions button {
white-space: nowrap;
}
.config-history-revisions {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-bottom: 10px;
}
.config-history-revision {
font: 10px var(--mono);
}
.config-history-revision.active {
border-color: var(--accent);
color: var(--accent);
}
.config-history-diff {
display: grid;
gap: 8px;
}
.config-history-change {
border: 1px solid var(--line);
padding: 8px;
background: var(--panel);
}
.config-history-change-path {
display: block;
margin-bottom: 6px;
font: 10px var(--mono);
overflow-wrap: anywhere;
}
.config-history-change-values {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 6px;
}
.config-history-change pre {
margin: 3px 0 0;
max-height: 160px;
overflow: auto;
white-space: pre-wrap;
overflow-wrap: anywhere;
font: 10px var(--mono);
}
@media (max-width: 860px) {
.config-history-layout {
grid-template-columns: 1fr;
overflow: auto;
}
.config-history-browser,
.config-history-detail {
overflow: visible;
}
.config-history-change-values {
grid-template-columns: 1fr;
}
.config-history-detail-head {
flex-direction: column;
}
.config-history-detail-actions {
align-items: flex-start;
text-align: left;
}
}
.mobile-menu-toggle {
display: none;
}
@media(max-width:850px) {
.sidebar {
position: sticky;
top: 0;
z-index: 60;
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
align-items: center;
gap: 10px 12px;
padding: 10px 12px;
}
.sidebar .brand {
min-width: 0;
}
.mobile-menu-toggle {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 9px;
min-height: 36px;
padding: 7px 10px;
border: 1px solid var(--line);
background: transparent;
color: var(--muted);
font: 600 11px var(--mono);
}
.mobile-menu-toggle:hover,
.mobile-menu-toggle[aria-expanded="true"] {
color: var(--text);
border-color: var(--border-hover);
background: var(--nav-active-bg);
}
.mobile-menu-icon {
display: block;
flex: 0 0 auto;
width: 15px;
height: 1px;
background: currentColor;
box-shadow: 0 -5px currentColor, 0 5px currentColor;
}
.sidebar .main-navigation {
grid-column: 1 / -1;
display: none;
width: 100%;
margin: 0;
padding-top: 10px;
border-top: 1px solid var(--line);
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 4px;
}
.sidebar.mobile-nav-open .main-navigation {
display: grid;
}
.sidebar .main-navigation .nav {
width: 100%;
min-width: 0;
justify-content: flex-start;
gap: 8px;
padding: 9px 10px;
border: 1px solid transparent;
border-left: 2px solid transparent;
text-align: left;
}
.sidebar .main-navigation .nav.active {
border-color: var(--line);
border-left-color: var(--green);
background: var(--nav-active-bg);
}
}
@media(max-width:600px) {
.sidebar .main-navigation .nav span {
display: none;
}
}
.about-dialog {
width: min(560px, calc(100vw - 24px));
overflow: hidden;
}
.about-dialog .window-heading button {
margin-inline-start: auto;
}
.about-card {
display: grid;
gap: 16px;
margin: 0;
padding: 18px;
border: 0;
box-shadow: none;
}
.about-product {
display: flex;
align-items: center;
gap: 12px;
}
.about-product>div {
display: grid;
gap: 4px;
}
.about-product strong {
font: 600 16px var(--mono);
}
.about-meta {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 1px;
margin: 0;
border: 1px solid var(--line);
background: var(--line);
}
.about-meta>div {
min-width: 0;
padding: 10px 12px;
background: var(--panel);
}
.about-meta dt {
margin-bottom: 5px;
color: var(--muted);
font: 9px var(--mono);
letter-spacing: .8px;
text-transform: uppercase;
}
.about-meta dd {
margin: 0;
overflow-wrap: anywhere;
}
.about-card>p {
margin: 0;
color: var(--muted);
line-height: 1.65;
}
.about-repository {
justify-content: space-between;
gap: 12px;
width: 100%;
white-space: normal;
text-align: left;
}
.about-repository span:last-child {
color: var(--muted);
font: 10px var(--mono);
overflow-wrap: anywhere;
}
@media(max-width:620px) {
.topbar {
height: auto;
min-height: 46px;
padding: 7px 0;
}
.topbar .breadcrumb {
display: none;
}
.top-actions {
width: 100%;
flex-wrap: wrap;
justify-content: flex-end;
}
.about-meta {
grid-template-columns: 1fr;
}
.about-repository {
align-items: flex-start;
flex-direction: column;
}
}
.file-logs-workspace {
display: grid;
gap: 14px;
}
.file-logs-filter {
display: grid;
grid-template-columns: repeat(7, minmax(120px, 1fr));
gap: 10px;
align-items: end;
}
.file-logs-filter label {
min-width: 0;
}
.file-logs-filter .file-log-search {
grid-column: span 2;
}
.file-logs-table {
max-height: 52vh;
}
.file-logs-table tbody tr {
cursor: pointer;
}
.file-logs-table td {
max-width: 340px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.file-logs-pager {
display: flex;
justify-content: flex-end;
gap: 8px;
}
.file-log-detail-card pre {
max-height: 32vh;
overflow: auto;
white-space: pre-wrap;
overflow-wrap: anywhere;
}
.file-logs-launcher {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
}
.file-log-inventory {
overflow-wrap: anywhere;
}
@media (max-width: 1100px) {
.file-logs-filter {
grid-template-columns: repeat(3, minmax(140px, 1fr));
}
}
@media (max-width: 700px) {
.file-logs-filter {
grid-template-columns: 1fr;
}
.file-logs-filter .file-log-search {
grid-column: auto;
}
.file-logs-launcher {
align-items: stretch;
flex-direction: column;
}
}