Files
metacrypt/web/static/style.css
Kyle Isom 8215aaccc5 Add grpcserver test coverage
- Add comprehensive test file for internal/grpcserver package
- Cover interceptors, system, engine, policy, and auth handlers
- Cover pbToRule/ruleToPB conversion helpers
- 37 tests total; CA/PKI/ACME and Login/Logout skipped (require live deps)

Co-authored-by: Junie <junie@jetbrains.com>
2026-03-15 13:07:42 -07:00

457 lines
10 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* Metacrypt — Nord dark theme */
/* ===========================
Colour tokens (Nord palette)
=========================== */
:root {
/* Polar Night */
--n0: #2E3440;
--n1: #3B4252;
--n2: #434C5E;
--n3: #4C566A;
/* Snow Storm */
--s0: #D8DEE9;
--s1: #E5E9F0;
--s2: #ECEFF4;
/* Frost */
--f0: #8FBCBB;
--f1: #88C0D0;
--f2: #81A1C1;
--f3: #5E81AC;
/* Aurora */
--red: #BF616A;
--orange: #D08770;
--yellow: #EBCB8B;
--green: #A3BE8C;
--green-dark: #4C7A4A;
--purple: #B48EAD;
}
/* ===========================
Reset
=========================== */
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
html { font-size: 16px; }
/* ===========================
Base
=========================== */
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
background: var(--n0);
color: var(--s0);
line-height: 1.6;
min-height: 100vh;
}
a { color: var(--f1); text-decoration: none; }
a:hover { color: var(--f0); text-decoration: underline; }
p { margin-bottom: 0.875rem; }
h2 { font-size: 1.375rem; font-weight: 600; color: var(--s2); margin-bottom: 0.25rem; }
h3 { font-size: 1.0625rem; font-weight: 600; color: var(--s1); margin: 0; }
code {
font-family: "SF Mono", "Cascadia Code", "Fira Code", Consolas, monospace;
font-size: 0.8125rem;
color: var(--f0);
background: var(--n2);
padding: 0.125rem 0.375rem;
border-radius: 3px;
}
small { font-size: 0.8125rem; color: var(--s0); }
/* ===========================
Top navigation
=========================== */
.topnav {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 2rem;
height: 52px;
background: var(--n1);
border-bottom: 1px solid var(--n3);
position: sticky;
top: 0;
z-index: 100;
}
.topnav-brand {
font-size: 1rem;
font-weight: 700;
color: var(--s2);
text-decoration: none;
letter-spacing: 0.04em;
}
.topnav-brand:hover { color: var(--f1); text-decoration: none; }
.topnav-right {
display: flex;
align-items: center;
gap: 0.75rem;
}
.topnav-user {
font-size: 0.875rem;
color: var(--s1);
}
/* ===========================
Page containers
=========================== */
.page-container {
max-width: 1100px;
margin: 0 auto;
padding: 2rem;
}
.auth-container {
max-width: 420px;
margin: 5rem auto 2rem;
padding: 0 1rem;
}
/* ===========================
Page header
=========================== */
.page-header {
margin-bottom: 1.5rem;
padding-bottom: 1rem;
border-bottom: 1px solid var(--n2);
}
.page-header h2 { margin-bottom: 0; }
.page-meta {
margin-top: 0.375rem;
display: flex;
align-items: center;
gap: 0.75rem;
font-size: 0.8125rem;
color: var(--n3);
}
.page-meta a { color: var(--f2); font-size: 0.8125rem; }
.page-meta a:hover { color: var(--f1); }
/* ===========================
Auth pages
=========================== */
.auth-header {
text-align: center;
margin-bottom: 1.75rem;
}
.auth-header .brand {
font-size: 1.5rem;
font-weight: 700;
color: var(--s2);
letter-spacing: 0.04em;
}
.auth-header .tagline {
font-size: 0.6875rem;
color: var(--f2);
text-transform: uppercase;
letter-spacing: 0.12em;
margin-top: 0.25rem;
}
/* ===========================
Cards
=========================== */
.card {
background: var(--n1);
border: 1px solid var(--n3);
border-radius: 6px;
padding: 1.5rem;
margin-bottom: 1.25rem;
}
.card:last-child { margin-bottom: 0; }
.card-title {
font-size: 0.6875rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.09em;
color: var(--f2);
margin-bottom: 1rem;
padding-bottom: 0.625rem;
border-bottom: 1px solid var(--n2);
}
.card p:last-child { margin-bottom: 0; }
/* ===========================
State chip
=========================== */
.state-chip {
display: inline-flex;
align-items: center;
gap: 0.4rem;
font-size: 0.8125rem;
color: var(--s0);
}
.state-chip::before {
content: '';
width: 7px;
height: 7px;
border-radius: 50%;
background: var(--n3);
flex-shrink: 0;
}
.state-chip.state-unsealed::before {
background: var(--green);
box-shadow: 0 0 5px rgba(163, 190, 140, 0.55);
}
.state-chip.state-sealed::before { background: var(--red); }
/* ===========================
Badges
=========================== */
.badge {
display: inline-block;
padding: 0.125rem 0.5rem;
border-radius: 3px;
font-size: 0.6875rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
background: rgba(94, 129, 172, 0.2);
color: var(--f1);
border: 1px solid rgba(94, 129, 172, 0.35);
}
.badge-danger {
background: rgba(191, 97, 106, 0.15);
color: #e07c82;
border-color: rgba(191, 97, 106, 0.35);
}
/* ===========================
Alerts
=========================== */
.error {
background: rgba(191, 97, 106, 0.12);
color: #e07c82;
border: 1px solid rgba(191, 97, 106, 0.3);
padding: 0.75rem 1rem;
border-radius: 4px;
margin-bottom: 1rem;
font-size: 0.875rem;
}
.success {
background: rgba(163, 190, 140, 0.1);
border: 1px solid rgba(163, 190, 140, 0.3);
border-radius: 4px;
padding: 1rem;
margin-bottom: 1rem;
}
.success p { color: var(--green); }
/* ===========================
Buttons
=========================== */
button, .btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.375rem;
padding: 0.5rem 1.25rem;
font-size: 0.875rem;
font-weight: 600;
font-family: inherit;
border: 1px solid var(--f3);
border-radius: 4px;
cursor: pointer;
text-decoration: none;
white-space: nowrap;
transition: background 0.12s, border-color 0.12s, color 0.12s;
line-height: 1.4;
background: var(--f3);
color: var(--s2);
}
button:hover, .btn:hover {
background: var(--f2);
border-color: var(--f2);
text-decoration: none;
color: var(--s2);
}
.btn-danger {
background: var(--red);
color: var(--s2);
border-color: var(--red);
}
.btn-danger:hover {
background: #a8535b;
border-color: #a8535b;
color: var(--s2);
}
.btn-ghost {
background: transparent;
color: var(--s0);
border-color: var(--n3);
}
.btn-ghost:hover {
background: var(--n2);
color: var(--s1);
border-color: var(--n3);
text-decoration: none;
}
.btn-sm {
padding: 0.3125rem 0.875rem;
font-size: 0.8125rem;
}
/* ===========================
Forms
=========================== */
.form-group { margin-bottom: 1rem; }
.form-group label {
display: block;
font-size: 0.6875rem;
font-weight: 700;
color: var(--s0);
margin-bottom: 0.375rem;
text-transform: uppercase;
letter-spacing: 0.06em;
}
.form-group input,
.form-group select,
.form-group textarea {
width: 100%;
padding: 0.5rem 0.75rem;
background: var(--n0);
border: 1px solid var(--n3);
border-radius: 4px;
color: var(--s1);
font-size: 0.9375rem;
font-family: inherit;
transition: border-color 0.12s, box-shadow 0.12s;
-webkit-appearance: none;
appearance: none;
}
.form-group input:focus,
.form-group select:focus,
.form-group textarea:focus {
outline: none;
border-color: var(--f3);
box-shadow: 0 0 0 3px rgba(94, 129, 172, 0.2);
}
.form-group input::placeholder,
.form-group textarea::placeholder { color: var(--n3); }
.form-group input[type="file"] {
padding: 0.375rem 0.5rem;
font-size: 0.875rem;
color: var(--s0);
cursor: pointer;
border-style: dashed;
}
.form-group select {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2381A1C1' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 0.75rem center;
padding-right: 2.25rem;
cursor: pointer;
}
.form-row { display: flex; gap: 1rem; }
.form-row .form-group { flex: 1; min-width: 0; }
.form-actions { margin-top: 0.25rem; }
.pem-input,
.form-group textarea.pem-input {
font-family: "SF Mono", "Cascadia Code", "Fira Code", Consolas, monospace;
font-size: 0.8125rem;
resize: vertical;
}
/* ===========================
Details / Summary
=========================== */
details { margin: 0.75rem 0; }
details summary {
cursor: pointer;
color: var(--f2);
font-size: 0.875rem;
font-weight: 600;
padding: 0.375rem 0;
user-select: none;
list-style: none;
}
details summary::-webkit-details-marker { display: none; }
details summary::before {
content: '▸ ';
color: var(--n3);
font-size: 0.75rem;
}
details[open] summary::before { content: '▾ '; }
details summary:hover { color: var(--f1); }
details[open] > summary { margin-bottom: 0.75rem; }
details > :not(summary):first-of-type { margin-top: 0.25rem; }
/* ===========================
Tables
=========================== */
.table-wrapper { overflow-x: auto; }
table { width: 100%; border-collapse: collapse; }
th {
text-align: left;
padding: 0.5rem 0.875rem;
font-size: 0.6875rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.07em;
color: var(--f2);
border-bottom: 1px solid var(--n3);
white-space: nowrap;
}
td {
text-align: left;
padding: 0.625rem 0.875rem;
font-size: 0.875rem;
color: var(--s0);
border-bottom: 1px solid var(--n2);
}
tbody tr:last-child td { border-bottom: none; }
tbody tr:hover td { background: rgba(76, 86, 106, 0.25); }
/* Keyvalue table (cert info) */
.kv-table { border-collapse: collapse; width: 100%; }
.kv-table th {
width: 140px;
font-size: 0.75rem;
font-weight: 700;
color: var(--f2);
text-transform: uppercase;
letter-spacing: 0.05em;
padding: 0.375rem 1rem 0.375rem 0;
border-bottom: none;
vertical-align: top;
white-space: nowrap;
}
.kv-table td {
font-size: 0.9375rem;
color: var(--s1);
padding: 0.375rem 0;
border-bottom: none;
}
.kv-table tbody tr:hover td { background: transparent; }
.checkbox-group {
display: flex;
flex-direction: column;
gap: 0.375rem;
margin-top: 0.25rem;
}
.form-group .checkbox-label {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.9375rem;
font-weight: normal;
text-transform: none;
letter-spacing: 0;
color: var(--s1);
cursor: pointer;
}
.form-group .checkbox-label input[type="checkbox"] {
width: 1rem;
height: 1rem;
padding: 0;
cursor: pointer;
flex-shrink: 0;
accent-color: var(--green-dark);
}
.form-group .checkbox-label input[type="checkbox"]:checked {
outline: 2px solid var(--green-dark);
outline-offset: 1px;
}
.form-group .checkbox-label:has(input[type="checkbox"]:checked) {
color: var(--green);
}