Files
RustProxy/src/admin/web/css/50-settings.css
T

1187 lines
22 KiB
CSS

/* Settings, certificates, integrations and Docker agent/service management.
* Order is defined in manifest.json; responsive rules are centralized in 70-responsive.css.
*/
.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;
}
.session-user {
margin: 17px 0 12px;
}
.security-note {
margin: 22px 0;
}
.settings-shortcuts {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 12px;
border: 1px solid var(--line);
flex-wrap: wrap;
margin-bottom: 10px;
}
.settings-shortcuts>div {
flex: 1;
min-width: 170px;
}
.acme-card {
margin-bottom: 14px;
}
.acme-card .vh-grid {
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 10px;
}
.settings-tabs {
padding: 8px;
margin-bottom: 12px;
border: 1px solid var(--line);
background: var(--panel);
border-radius: 0;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(128px, 1fr));
width: 100%;
gap: 5px;
}
.settings-tabs button {
padding: 8px 10px;
font-size: 12px;
border: 1px solid transparent;
background: transparent;
border-radius: 0;
width: 100%;
min-width: 0;
white-space: normal;
text-align: center;
}
.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;
width: 100%;
max-width: none;
}
.settings-page>.edit-form+.edit-form {
margin-top: var(--ui-gap);
}
.settings-page>.card {
padding: var(--ui-card);
border-radius: 0;
}
.provider-hint {
padding: 0 18px;
}
.renewal-entry {
display: grid;
grid-template-columns: 1fr 2fr auto;
gap: 8px;
padding: 9px 0;
border-bottom: 1px solid var(--line);
align-items: center;
}
body[data-density=compact] .sidebar nav,
.certificate-coverage {
margin-top: 14px;
}
.certificate-coverage>.small-label {
display: block;
margin-bottom: 7px;
}
.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-body {
padding: 0 0 8px;
}
.certificate-details .entity-details {
margin: 4px 0;
}
.docker-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
margin-bottom: 16px;
--toolbar-control-height: min(var(--button-min-height), var(--ui-field-min-height));
}
.docker-agent-observations,
.docker-agent-settings-list {
display: grid;
gap: 16px;
}
.docker-agent-status-badge {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 88px;
text-align: center;
min-height: 32px;
box-sizing: border-box;
}
.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-error {
display: grid;
gap: 5px;
padding: 12px;
border: 1px solid var(--danger-line);
background: rgba(255, 170, 162, .04);
}
.docker-service-row {
display: grid;
border: 1px solid var(--line);
background: var(--panel2);
min-width: 0;
gap: 8px;
padding: 10px 12px;
}
.docker-service-row.is-unpublished {
opacity: .72;
}
.docker-service-row.is-view-hidden {
border-style: dashed;
opacity: .58;
}
.docker-service-head {
display: grid;
align-items: center;
min-width: 0;
grid-template-columns: auto minmax(260px, 1fr) minmax(300px, 1.25fr);
gap: 12px;
}
.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-route-grid {
display: grid;
gap: 10px;
align-items: start;
grid-template-columns: minmax(190px, 1fr) minmax(250px, 1.35fr) minmax(210px, 1fr) minmax(120px, .65fr);
}
.docker-health-grid>label,
.docker-route-grid>label:not(.check),
.docker-acl-grid>label:not(.check),
.docker-timeout-grid>label {
display: grid;
gap: 5px;
min-width: 0;
}
.stat>span,
.appearance-chart-preview>span,
.docker-health-grid>label>span,
.docker-route-grid>label:not(.check)>span {
color: var(--muted);
font-size: 11px;
}
.docker-health-editor,
.docker-acl-editor,
.docker-protocol-editor,
.docker-timeout-editor {
border-top: 1px solid var(--line);
padding-top: 9px;
}
.docker-health-editor>summary,
.docker-acl-editor>summary,
.docker-protocol-editor>summary,
.docker-timeout-editor>summary {
cursor: pointer;
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
user-select: none;
}
.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 .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-listener-field {
grid-column: 1/-1;
display: grid;
gap: 6px;
min-width: 0;
margin-top: 2px;
padding-top: 4px;
border-top: 1px solid var(--line);
}
.docker-agent-field-label {
font-size: 11px;
color: var(--muted);
min-height: 14px;
line-height: 14px;
}
.docker-agent-listener-choices>label {
min-height: 38px;
}
.docker-agent-grid .mono,
.docker-agent-summary .mono {
font-family: var(--mono);
font-size: 11px;
}
.docker-toolbar input[type=search] {
width: calc(min(280px, 38vw));
box-sizing: border-box;
height: var(--toolbar-control-height);
min-height: var(--toolbar-control-height);
padding-block: 0;
}
#panel-settings .settings-shortcuts {
grid-column: 1/-1;
width: 100%;
}
#panel-settings .settings-filter-row {
grid-column: 1/-1;
display: flex;
align-items: end;
justify-content: space-between;
gap: 12px;
width: 100%;
padding: 8px 10px;
border: 1px solid var(--line);
background: var(--panel);
}
#panel-settings .settings-filter {
display: grid;
gap: 5px;
width: min(520px, 100%);
--toolbar-control-height: min(var(--button-min-height), var(--ui-field-min-height));
}
#panel-settings .settings-filter input,
.file-logs-filter input,
.file-logs-filter select {
width: 100%;
box-sizing: border-box;
height: var(--toolbar-control-height);
min-height: var(--toolbar-control-height);
padding-block: 0;
}
#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-tabs.sub-tabs {
position: static;
top: auto;
}
.docker-live-switch {
align-self: center;
white-space: nowrap;
}
.docker-service-actions {
display: flex;
justify-content: flex-end;
gap: 8px;
padding-top: 10px;
border-top: 1px solid var(--line);
}
.docker-acl-grid {
display: grid;
grid-template-columns: repeat(4, minmax(140px, 1fr));
gap: 10px;
margin-top: 12px;
align-items: start;
}
.docker-timeout-grid {
display: grid;
grid-template-columns: repeat(4, minmax(140px, 1fr));
gap: 10px;
margin-top: 12px;
}
.docker-acl-grid textarea {
width: 100%;
min-height: 86px;
font-family: var(--mono);
align-self: start;
box-sizing: border-box;
}
.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,
.file-logs-workspace {
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;
}
.audit-dialog-card {
border: 0;
padding: 12px;
background: var(--bg);
}
.audit-dialog .table-scroll {
max-height: calc(min(68dvh, 680px));
overflow: auto;
border-top: 1px solid var(--line);
}
.audit-dialog table,
.logs-dialog table {
font: 11px var(--mono);
}
.audit-dialog td {
padding: 7px 8px;
max-width: 440px;
overflow: hidden;
text-overflow: ellipsis;
}
.audit-dialog th {
padding: 7px 8px;
max-width: 440px;
overflow: hidden;
text-overflow: ellipsis;
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-head-actions {
display: flex;
align-items: center;
justify-content: flex-end;
flex-wrap: wrap;
gap: 8px 10px;
min-width: 0;
}
.docker-service-head-actions .docker-runtime {
flex: 1 1 230px;
}
.docker-publish-field {
display: inline-flex;
align-items: center;
gap: 8px;
min-height: 30px;
padding: 0;
color: var(--text);
font-size: 12px;
font-weight: 500;
white-space: nowrap;
cursor: pointer;
}
.docker-publish-field input[type=checkbox].docker-publish {
-webkit-appearance: none;
position: relative;
flex: 0 0 30px;
width: 30px;
height: 16px;
margin: 0;
padding: 0;
border: 1px solid var(--field-line);
border-radius: min(3px, var(--rp-radius-control, 3px));
background: var(--field-bg);
cursor: pointer;
vertical-align: middle;
}
.docker-publish-field .docker-publish::before {
content: "";
position: absolute;
inset: 2px auto 2px 2px;
width: 10px;
background: var(--muted);
border-radius: min(1px, var(--rp-radius-control, 1px));
transition: transform .12s ease;
}
.docker-publish-field .docker-publish:checked {
background: var(--field-bg);
border-color: var(--accent);
}
.docker-publish-field .docker-publish:checked::before {
transform: translateX(14px);
background: var(--accent);
}
.docker-publish-field .docker-publish:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 3px;
}
.docker-publish-field:has(.docker-publish:disabled) {
opacity: .55;
cursor: wait;
}
.docker-publish-field .docker-publish:disabled {
cursor: wait;
}
.docker-service-quick-actions {
display: inline-flex;
align-items: center;
flex-wrap: wrap;
gap: 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;
}
body[data-density=compact] .docker-service-row {
padding: 6px 8px;
gap: 4px;
}
body[data-density=compact] .docker-service-head,
body[data-density=compact] .security-stack {
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-editor {
margin-top: 8px;
padding-top: 6px;
}
.docker-agent-grid>label {
display: grid;
align-content: start;
gap: 6px;
min-width: 0;
margin: 0 !important;
}
.docker-agent-grid>label>span:first-child {
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,
.docker-alias-field>small,
.docker-checkbox-field>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;
margin-top: 0 !important;
}
.docker-agent-heading-actions>.quiet {
min-height: 32px;
box-sizing: border-box;
}
.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-acl-grid .docker-field input:not([type=checkbox]),
.docker-acl-grid .docker-field select,
.docker-route-grid .docker-field input:not([type=checkbox]),
.docker-route-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;
}
.php-origin-errors>.check,
.docker-toolbar .check,
.cache-toolbar-status .check {
margin: 0 !important;
}
.docker-switch-row {
display: grid;
justify-content: start;
align-items: start;
gap: 8px;
min-width: 0;
grid-column: 1/-1;
grid-template-columns: repeat(auto-fit, minmax(min(155px, 100%), 1fr));
overflow-x: visible;
padding-bottom: 0;
}
.docker-preserve-field {
align-self: start;
padding-bottom: 0;
white-space: nowrap;
}
.docker-acl-grid>.docker-field {
align-self: start;
}
.vh-header-row button,
.docker-alias-field>span:first-child,
#panel-tls .renewal-entry:last-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;
}
#panel-tls .certificate-workspace-heading {
align-items: flex-start;
margin-bottom: 12px;
}
#panel-tls .certificate-tabs {
grid-template-columns: repeat(3, minmax(0, 1fr));
margin-bottom: 16px;
}
#panel-tls .certificate-section-intro {
margin: 2px 0 12px;
}
#panel-tls .certificate-safety {
margin: 8px 0 12px;
}
#panel-tls .certificate-library-footer {
display: grid;
gap: 8px;
margin-top: 14px;
padding-top: 12px;
border-top: 1px solid var(--line);
}
#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=complete],
#panel-tls .certificate-operation-card[data-state=ready] {
border-left-color: var(--green);
}
#panel-tls .certificate-operation-card[data-state=failed],
#panel-tls .certificate-operation-card[data-state=unavailable] {
border-left-color: var(--red);
}
#panel-tls .certificate-operation-heading,
#panel-tls .renewal-entry-head {
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-log-path {
margin: 0;
padding: 9px 10px;
border: 1px solid var(--line);
background: var(--bg);
font-family: var(--mono);
overflow-wrap: anywhere;
}
#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-identity {
display: grid;
gap: 3px;
min-width: 0;
}
#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-actions {
justify-content: flex-end;
padding-top: 2px;
}
#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 details.certificate-editor-card>summary {
padding: 0 0 12px;
}
#panel-tls .certificate-editor-card .vh-grid {
gap: 10px 14px;
}
.certificate-api-credentials {
display: grid;
gap: 7px;
margin-top: 10px;
}
.certificate-api-credential-item {
border: 1px solid var(--line);
border-radius: var(--rp-radius-surface, 4px);
background: var(--panel2);
}
.certificate-api-row-actions {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: flex-end;
gap: 4px;
}
.certificate-api-details {
display: grid;
gap: 7px;
padding: 10px 12px;
border-top: 1px solid var(--line);
}
.certificate-api-detail-line {
display: grid;
gap: 4px;
grid-template-columns: minmax(120px, 1fr) minmax(0, 2fr);
overflow-wrap: anywhere;
}
.certificate-api-credential-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 8px 9px;
}
.certificate-api-credential-info {
min-width: 0;
display: grid;
gap: 3px;
}
.appearance-settings-card {
max-width: 980px;
}
.appearance-section {
margin-top: 14px;
padding: 12px;
border: 1px solid var(--line);
background: var(--panel2);
}
.appearance-section-heading {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px;
margin-bottom: 12px;
padding-bottom: 9px;
border-bottom: 1px solid var(--line);
}
.appearance-section-heading h3 {
margin: 2px 0 0;
font-size: 14px;
}
.appearance-settings-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 16px;
align-items: start;
}
.appearance-scale-control>span:first-child {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.appearance-scale-control output {
color: var(--accent);
font-weight: 700;
font-variant-numeric: tabular-nums;
}
.appearance-actions {
display: flex;
justify-content: flex-end;
margin-top: 14px;
padding-top: 12px;
border-top: 1px solid var(--line);
}
.certificate-bulk-list {
display: grid;
gap: 8px;
max-height: 250px;
overflow-y: auto;
margin: 10px 0;
}
.docker-agent-security-hint,
.docker-agent-summary>span,
.docker-fingerprint {
min-width: 0;
max-width: 100%;
overflow-wrap: anywhere;
word-break: break-word;
}
.docker-protocol-options {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 12px;
}
.docker-protocol-options>* {
display: grid;
align-content: center;
min-width: 130px;
flex: 1 1 145px;
border-radius: var(--rp-radius-control, 6px);
border: 1px solid var(--line);
background: var(--panel2);
padding: 8px 12px;
min-height: 49px;
box-sizing: border-box;
}
.docker-protocol-fixed {
gap: 4px;
}
.named-listener-row legend,
html[data-dashboard-density=normal] #panel-overview .stat>span,
.vh-member details,
.acl-picker-no-selection,
.docker-protocol-fixed strong,
.docker-protocol-options .docker-checkbox-field .vh-check {
font-size: 11px;
}
.docker-protocol-options .docker-checkbox-field>span:first-child {
color: var(--text);
font-size: 11px;
}
.docker-agent-grid .docker-agent-fingerprint {
min-width: 0;
width: 100%;
box-sizing: border-box;
}
.docker-backend-ip-settings {
display: grid;
align-content: start;
gap: 12px;
min-width: 0;
}
.docker-service-certificate-bar {
display: flex;
justify-content: flex-start;
min-width: 0;
}
.docker-service-certificate-bar>.check {
margin: 0 !important;
align-items: flex-start;
font-size: 11px;
line-height: 1.35;
overflow-wrap: anywhere;
}
.switch-grid>.check,
.vh-form .vh-grid>.vh-check:not(.vh-enable-control),
.vh-form .vh-www-header .vh-www-toggle,
.docker-protocol-options .check,
.docker-service-head .check,
.docker-switch-row .check {
margin-top: 0 !important;
}
.docker-switch-row .docker-checkbox-field {
min-width: 0;
max-width: none;
}
.refresh-settings-grid>.check {
grid-column: 1/-1;
display: flex;
align-items: center;
gap: 8px;
margin: 0;
min-width: 0;
}
.refresh-settings-grid select {
width: 100%;
min-width: 0;
}