1
Fork 0
mirror of https://github.com/thegeneralist01/archivr synced 2026-07-22 03:05:32 +02:00
archivr/frontend/src/styles.css
TheGeneralist 8a90259a76
feat: uBlock Origin Lite integration for ad-blocking during WebPage captures
- singlefile.rs: when ARCHIVR_UBLOCK=true and ARCHIVR_UBLOCK_EXT is set,
  archivr owns Chrome's lifecycle (--headless=new, --remote-debugging-port,
  --load-extension); single-file connects via --browser-server instead of
  launching its own Chrome. Falls back to old behaviour with ublock_skipped=true
  when the ext path is missing or invalid.
- capture.rs: thread ublock_skipped through CaptureResult
- database.rs: add notes_json TEXT column to capture_jobs (DDL + idempotent
  ALTER TABLE migration); update_capture_job_status gains notes_json param
- archive.rs: expose notes_json in CaptureJobSummary
- routes.rs: store {"ublock_skipped":true} in notes_json on completed captures
- ToastStack.jsx: warning toast variant (toast--warning) with Details expander
  and Ignore button
- CaptureDialog.jsx: fire warning toast when poll result has ublock_skipped
- App.jsx: sessionStorage-backed Ignore suppression for ublock warnings
- styles.css: .toast--warning (amber left border) + .toast-warning-detail
- flake.nix: ublockLite derivation fetches uBOLite_2026.705.2152.chromium.zip
  (pinned SHA256) from uBlockOrigin/uBOL-home; sets ARCHIVR_UBLOCK_EXT in both
  archivr and archivr-server wrappers

Env vars:
  ARCHIVR_UBLOCK=true (default) — enable uBlock during WebPage captures
  ARCHIVR_UBLOCK_EXT — path to unpacked uBOL extension dir (set by Nix)
2026-07-07 17:18:55 +02:00

1760 lines
46 KiB
CSS
Raw 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.

@import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@500;600&family=Spectral:wght@500;600&display=swap');
:root {
color-scheme: light;
--ink: #20251f;
--muted: #6b6f66;
--muted-2: #8a8d83;
--paper: #f5f0e7;
--paper-2: #e9e1d2;
--paper-3: #fffaf0;
--line: #d2c6b5;
--line-soft: #e5dccd;
--accent: #8d3f30;
--accent-2: #b78342;
--link: #245f72;
--top: #141d18;
--field: #fffdf7;
--r: 3px;
--r2: 6px;
--r3: 10px;
--sans: "Helvetica Neue", Helvetica, Arial, sans-serif;
--serif: "Spectral", Georgia, "Times New Roman", serif;
--display: "Cormorant Garamond", Georgia, serif;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
min-height: 100vh;
background: var(--paper);
color: var(--ink);
font-family: var(--sans);
font-size: 14px;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
}
button,
input,
select {
font: inherit;
}
/* ── Refined scrollbars ──────────────────────────────────────────────────── */
.workspace,
.context-rail {
scrollbar-width: thin;
scrollbar-color: var(--line) transparent;
}
.workspace::-webkit-scrollbar,
.context-rail::-webkit-scrollbar { width: 11px; height: 11px; }
.workspace::-webkit-scrollbar-track,
.context-rail::-webkit-scrollbar-track { background: transparent; }
.workspace::-webkit-scrollbar-thumb,
.context-rail::-webkit-scrollbar-thumb {
background: var(--line);
border-radius: 999px;
border: 3px solid transparent;
background-clip: padding-box;
}
.workspace::-webkit-scrollbar-thumb:hover,
.context-rail::-webkit-scrollbar-thumb:hover {
background: var(--muted-2);
background-clip: padding-box;
border: 3px solid transparent;
}
/* ── Topbar ──────────────────────────────────────────────────────────────── */
.topbar {
height: 58px;
display: grid;
grid-template-columns: auto auto 1fr auto auto;
align-items: center;
gap: 26px;
padding: 0 22px;
background: var(--top);
color: #efe6d6;
border-bottom: 3px solid var(--accent);
}
.brand {
font-family: var(--display);
font-weight: 600;
font-size: 30px;
line-height: 1;
letter-spacing: 0.01em;
color: #f4ead8;
}
/* Archive switcher */
.switcher {
position: relative;
display: inline-flex;
align-items: center;
}
.switcher select {
appearance: none;
-webkit-appearance: none;
border: 1px solid rgba(247, 238, 223, 0.20);
background: rgba(247, 238, 223, 0.06);
color: #f1e8d8;
font-family: var(--sans);
font-weight: 550;
font-size: 13.5px;
letter-spacing: 0.04em;
padding: 8px 32px 8px 15px;
cursor: pointer;
border-radius: 6px;
transition: background .15s ease, border-color .15s ease;
}
.switcher select:hover {
background: rgba(247, 238, 223, 0.11);
border-color: rgba(247, 238, 223, 0.34);
}
.switcher::after {
content: "";
position: absolute;
right: 15px;
top: 50%;
width: 6px; height: 6px;
margin-top: -5px;
border-right: 1.2px solid #b6ab98;
border-bottom: 1.2px solid #b6ab98;
transform: rotate(45deg);
pointer-events: none;
}
.nav { display: flex; gap: 22px; justify-content: flex-end; min-width: 0; }
.nav-link {
border: 0;
background: transparent;
color: #cdc1ad;
cursor: pointer;
padding: 6px 0;
font-size: 12.5px;
font-weight: 600;
letter-spacing: 0.1em;
text-transform: uppercase;
position: relative;
}
.nav-link:hover { color: #f4ead8; }
.nav-link.is-active { color: #f4ead8; }
.nav-link.is-active::after {
content: "";
position: absolute;
left: 0; right: 0; bottom: -2px;
height: 1px;
background: var(--accent-2);
}
/* Capture button */
.capture-button {
display: inline-flex;
align-items: center;
gap: 8px;
position: relative;
overflow: hidden;
border: 0;
background: linear-gradient(180deg, color-mix(in srgb, var(--accent) 88%, #fff) 0%, var(--accent) 55%);
color: #f7eddd;
padding: 10px 18px;
cursor: pointer;
font-size: 12px;
font-weight: 600;
letter-spacing: 0.15em;
text-transform: uppercase;
border-radius: var(--r);
box-shadow: inset 0 1px 0 rgba(255, 245, 230, 0.16), 0 1px 2px rgba(20, 29, 24, 0.30);
transition: filter .18s ease, box-shadow .18s ease;
}
.capture-button:hover {
filter: brightness(0.93);
box-shadow: inset 0 1px 0 rgba(255, 245, 230, 0.12), 0 2px 6px rgba(20, 29, 24, 0.34);
}
.capture-button::before {
content: "";
position: absolute;
top: 0; bottom: 0; left: 0;
width: 45%;
background: linear-gradient(100deg, transparent 0%, rgba(255, 246, 232, 0.45) 50%, transparent 100%);
transform: translateX(-180%) skewX(-18deg);
pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
.capture-button:hover::before { animation: cap-sheen 0.7s ease; }
}
@keyframes cap-sheen {
from { transform: translateX(-180%) skewX(-18deg); }
to { transform: translateX(340%) skewX(-18deg); }
}
/* ── App shell ───────────────────────────────────────────────────────────── */
.app-shell {
height: calc(100vh - 58px);
display: grid;
grid-template-columns: minmax(0, 1fr) 340px;
}
.workspace { min-width: 0; overflow: auto; display: flex; flex-direction: column; }
/* ── View toggle ─────────────────────────────────────────────────────────── */
.view { display: none; }
.view.is-active { display: block; }
/* ── Search toolbar ──────────────────────────────────────────────────────── */
.toolbar {
position: sticky;
top: 0;
z-index: 3;
display: flex;
align-items: center;
gap: 16px;
padding: 12px 22px;
background: color-mix(in srgb, var(--paper) 88%, white);
border-bottom: 1px solid var(--line-soft);
}
.search-field {
position: relative;
flex: 1 1 auto;
min-width: 0;
display: flex;
align-items: center;
height: 42px;
background: var(--field);
border: 1px solid var(--line);
border-radius: 20px;
transition: border-color .15s ease, box-shadow .15s ease;
}
.search-field:focus-within {
border-color: var(--accent);
box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 14%, transparent);
}
.search-field .ico { display: grid; place-items: center; width: 46px; height: 100%; color: var(--muted-2); flex-shrink: 0; }
.search-field .ico svg { width: 16px; height: 16px; }
.search-input {
flex: 1; min-width: 0; height: 100%;
border: 0; background: transparent; color: var(--ink);
padding: 0 6px 0 0; font-size: 14px; letter-spacing: 0.01em; outline: none;
}
.search-input::placeholder { color: var(--muted-2); }
.search-field .kbd {
margin-right: 12px;
display: inline-flex; align-items: center;
padding: 3px 7px;
font-size: 11px; color: var(--muted);
background: var(--paper-2);
border: 1px solid var(--line-soft);
border-radius: var(--r);
flex-shrink: 0;
}
.result-count {
flex-shrink: 0;
font-size: 13px;
color: var(--muted);
letter-spacing: 0.02em;
white-space: nowrap;
}
.result-count b { color: var(--ink); font-weight: 600; font-variant-numeric: tabular-nums; }
/* Tag filter badge */
.tag-filter-badge {
display: inline-flex;
align-items: center;
gap: 4px;
background: var(--accent);
color: #fff;
border: 0;
border-radius: var(--r);
font-size: 12px;
padding: 2px 8px;
cursor: pointer;
margin-left: 8px;
}
.tag-filter-badge:hover { opacity: 0.85; }
/* ── Entry table ─────────────────────────────────────────────────────────── */
.entry-table { width: 100%; font-size: 12.5px; }
.entry-header-row {
display: flex;
align-items: stretch;
position: sticky;
top: 67px;
z-index: 2;
background: color-mix(in srgb, var(--paper) 92%, white);
border-bottom: 1px solid var(--line-soft);
color: var(--muted);
font-size: 10.5px;
text-transform: uppercase;
letter-spacing: 0.08em;
}
.entry-header-row > div { padding: 9px 10px; flex-shrink: 0; font-weight: 600; display: flex; align-items: center; }
#entries-body > div {
display: flex;
align-items: center;
cursor: default;
border-bottom: 1px solid var(--line-soft);
}
#entries-body > div > div { padding: 7px 10px; flex-shrink: 0; overflow: hidden; }
#entries-body > div:nth-child(even) { background: #f2ede5; }
#entries-body > div:nth-child(odd) { background: var(--paper-3); }
#entries-body > div.is-selected {
background: #eee2d2;
outline: 2px solid var(--accent);
outline-offset: -2px;
}
.col-added { width: 162px; color: var(--muted); }
.col-title { flex: 1 1 0; min-width: 0; overflow: hidden; display: flex; align-items: center; gap: 0.42em; }
.col-type { width: 116px; }
.col-size { width: 100px; display: flex; flex-direction: column; justify-content: center; gap: 1px; }
.size-total { font-variant-numeric: tabular-nums; }
.size-cached-pct {
font-size: 10px;
color: var(--muted);
opacity: 0.8;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.col-url { flex: 0 0 30%; min-width: 0; overflow: hidden; }
.entry-header-row > div:first-child,
#entries-body > div > div:first-child { padding-left: 22px; }
.entry-header-row > div:last-child,
#entries-body > div > div:last-child { padding-right: 22px; }
.entry-title { color: var(--link); font-weight: 700; min-width: 0; }
.entry-header-row > div { padding: 9px 10px; flex-shrink: 0; font-weight: 600; }
.source-icon { display: flex; align-items: center; justify-content: center; width: 1.05em; height: 1.05em; flex-shrink: 0; }
.source-icon > * { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; }
.source-icon svg { width: 100%; height: 100%; }
.url-cell { color: #555b55; white-space: nowrap; text-overflow: ellipsis; word-break: break-all; }
#entries-body .url-cell:hover,
#entries-body .is-selected .url-cell { overflow: visible; white-space: normal; }
.type-pill { display: inline-block; padding: 2px 6px; background: #d8e3df; color: #275a5f; border: 1px solid #bfd0ca; border-radius: var(--r); }
/* ── Runs view (table) ───────────────────────────────────────────────────── */
#runs-view .entry-table {
border-collapse: collapse;
table-layout: auto;
}
#runs-view .entry-table th {
position: sticky;
top: 0;
z-index: 1;
text-align: left;
padding: 10px;
background: color-mix(in srgb, var(--paper) 92%, white);
color: var(--muted);
border-bottom: 1px solid var(--line-soft);
font-size: 10.5px;
text-transform: uppercase;
letter-spacing: 0.08em;
}
#runs-view .entry-table td {
padding: 10px;
border-bottom: 1px solid var(--line-soft);
vertical-align: top;
}
#runs-view .entry-table tr:nth-child(even) td { background: #f2ede5; }
#runs-view .entry-table tr:nth-child(odd) td { background: var(--paper-3); }
/* ── Context rail ────────────────────────────────────────────────────────── */
.context-rail {
border-left: 1px solid var(--line);
background: var(--paper);
padding: 20px 20px 32px;
overflow: auto;
}
.rail-eyebrow {
font-size: 10.5px;
font-weight: 600;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--muted-2);
margin-bottom: 16px;
}
.rail-title {
display: block;
font-family: var(--sans);
font-weight: 700;
font-size: 15.5px;
line-height: 1.4;
color: var(--ink);
margin: 0 0 16px;
word-break: break-word;
}
/* original-url tile */
.url-tile {
display: flex;
align-items: center;
gap: 9px;
padding: 10px 12px;
background: var(--paper-3);
border: 1px solid var(--line);
border-radius: var(--r3);
margin-bottom: 20px;
text-decoration: none;
}
.url-tile:hover { background: var(--field); border-color: var(--accent); }
.url-tile .ico { color: var(--ink); flex-shrink: 0; display: grid; place-items: center; }
.url-tile .ico svg { width: 15px; height: 15px; }
.url-tile .u-text {
min-width: 0; flex: 1;
font-size: 12.5px; color: var(--link);
font-family: ui-monospace, "SF Mono", Menlo, monospace;
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.url-tile .ext { color: var(--muted-2); flex-shrink: 0; }
.url-tile .ext svg { width: 13px; height: 13px; display: block; }
/* metadata ledger */
.meta-list { margin-bottom: 24px; border-top: 1px solid var(--line-soft); }
.meta-item {
display: grid;
grid-template-columns: 92px 1fr;
gap: 14px;
align-items: baseline;
padding: 9px 0;
border-bottom: 1px solid var(--line-soft);
}
.meta-k {
font-size: 10.5px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--muted-2);
}
.meta-v { font-size: 13.5px; color: var(--ink); word-break: break-word; line-height: 1.4; }
.meta-v.mono { font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: 12px; color: var(--muted); }
.rail-section { margin-bottom: 24px; }
.rail-section-heading {
display: flex; align-items: baseline; gap: 8px;
font-size: 10.5px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.12em;
color: var(--muted-2);
margin-bottom: 9px;
padding-bottom: 8px;
border-bottom: 1px solid var(--line);
}
.rail-section-heading .num { color: var(--muted-2); font-weight: 600; }
/* artifacts */
.artifact-list { list-style: none; margin: 0; padding: 0; }
.artifact-link {
display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
padding: 7px 2px;
border-bottom: 1px solid var(--line-soft);
text-decoration: none;
}
.artifact-link:last-child { border-bottom: 0; }
.artifact-name { font-size: 13px; color: var(--link); min-width: 0; word-break: break-word; }
.artifact-link:hover .artifact-name { text-decoration: underline; }
.artifact-size { font-size: 11.5px; color: var(--muted-2); flex-shrink: 0; font-variant-numeric: tabular-nums; }
/* tags */
.tags-wrap { display: flex; flex-wrap: wrap; gap: 7px; margin: 0 0 12px; }
.tag-pill {
display: inline-flex; align-items: center; gap: 7px;
background: var(--paper-2);
border: 1px solid var(--line);
border-radius: var(--r);
font-size: 12px; padding: 4px 7px 4px 10px;
color: var(--ink);
}
.tag-pill .remove {
border: 0; background: transparent; cursor: pointer;
color: var(--muted-2); width: 15px; height: 15px;
display: grid; place-items: center; font-size: 13px; line-height: 1;
}
.tag-pill .remove:hover { color: var(--accent); }
.tags-empty { font-size: 13px; color: var(--muted); margin: 0 0 11px; }
.tag-input-wrap {
display: flex; align-items: center; gap: 8px;
background: var(--field);
border: 1px solid var(--line);
border-radius: var(--r2);
padding: 2px 2px 2px 11px;
transition: border-color .15s ease, box-shadow .15s ease;
}
.tag-input-wrap:focus-within {
border-color: var(--accent);
box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 12%, transparent);
}
.tag-input-wrap .hash { color: var(--muted-2); font-size: 13px; }
.tag-input {
flex: 1; min-width: 0; border: 0; background: transparent;
color: var(--ink); font-size: 13px; padding: 6px 0; outline: none;
font-family: ui-monospace, "SF Mono", Menlo, monospace;
}
.tag-add-btn {
border: 0; background: var(--ink); color: var(--paper-3);
padding: 6px 13px; font-size: 11.5px; letter-spacing: 0.06em;
text-transform: uppercase; border-radius: var(--r);
cursor: pointer; white-space: nowrap;
}
.tag-add-btn:hover { background: #2c332b; }
/* collections in rail */
.coll-row {
display: flex; align-items: center; justify-content: space-between; gap: 12px;
padding: 9px 13px;
background: var(--field);
border: 1px solid var(--line);
border-radius: var(--r2);
margin-bottom: 6px;
transition: border-color .15s ease;
}
.coll-row:hover { border-color: var(--accent); }
.coll-name { font-size: 13px; color: var(--ink); font-weight: 500; }
.vis-badge {
display: inline-flex; align-items: center; gap: 6px;
font-size: 11px; color: var(--muted);
background: var(--paper-2); border: 1px solid var(--line-soft);
border-radius: 999px; padding: 3px 10px;
}
.vis-badge::before {
content: ""; width: 6px; height: 6px; border-radius: 50%;
background: var(--accent-2);
}
/* ── Rail delete zone ───────────────────────────────────────────────────── */
.rail-delete-zone {
margin-top: 24px;
padding-top: 20px;
border-top: 1px solid var(--line-soft);
}
.rail-delete-btn {
width: 100%;
padding: 8px 14px;
background: none;
border: 1px solid color-mix(in srgb, var(--accent) 45%, transparent);
color: var(--accent);
border-radius: var(--r);
cursor: pointer;
font-size: 12.5px;
font-weight: 600;
letter-spacing: 0.04em;
text-transform: uppercase;
transition: background 0.15s ease, border-color 0.15s ease;
}
.rail-delete-btn:hover {
background: color-mix(in srgb, var(--accent) 8%, transparent);
border-color: var(--accent);
}
/* ── Capture dialog ──────────────────────────────────────────────────────── */
.capture-dialog {
border: 1px solid var(--line);
background: var(--paper);
padding: 0;
width: min(540px, calc(100vw - 32px));
border-radius: var(--r3);
box-shadow: 0 20px 60px rgba(20, 29, 24, 0.28);
}
.capture-dialog::backdrop {
background: rgba(20, 29, 24, 0.45);
}
.capture-dialog-inner {
padding: 28px;
}
.capture-dialog-title {
margin: 0;
font-size: 22px;
font-family: var(--display);
font-weight: 600;
}
.capture-label {
display: block;
font-size: 11px;
font-weight: 600;
margin-bottom: 6px;
color: var(--muted-2);
text-transform: uppercase;
letter-spacing: 0.06em;
}
.capture-input {
width: 100%;
height: 44px;
border: 1px solid var(--line);
background: var(--field);
color: var(--ink);
padding: 0 14px;
font-size: 15px;
margin-bottom: 10px;
border-radius: var(--r2);
outline: none;
transition: border-color .15s ease, box-shadow .15s ease;
}
.capture-input:focus {
border-color: var(--accent);
box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 14%, transparent);
}
.form-field .capture-input { margin-bottom: 0; }
.capture-error {
color: var(--accent);
font-size: 13px;
margin-bottom: 10px;
min-height: 18px;
}
.capture-actions {
display: flex;
gap: 10px;
justify-content: flex-end;
margin-top: 16px;
}
.capture-cancel {
border: 1px solid var(--line);
background: none;
color: var(--ink);
padding: 8px 18px;
border-radius: var(--r);
cursor: pointer;
}
.capture-cancel:hover { background: var(--paper-2); }
.capture-submit {
border: 0;
background: var(--ink);
color: var(--paper);
padding: 8px 20px;
border-radius: var(--r);
cursor: pointer;
font-weight: 600;
}
.capture-submit:hover { opacity: 0.85; }
.capture-submit:disabled { opacity: 0.45; cursor: default; }
/* ── Capture dialog: header + multi-row ─────────────────────────────────── */
.capture-dialog-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20px;
}
.capture-dialog-close {
flex-shrink: 0;
background: none;
border: 0;
cursor: pointer;
color: var(--muted);
width: 28px;
height: 28px;
display: grid;
place-items: center;
border-radius: var(--r);
padding: 0;
}
.capture-dialog-close svg { width: 14px; height: 14px; }
.capture-dialog-close:hover { background: var(--paper-2); color: var(--ink); }
.capture-rows {
display: flex;
flex-direction: column;
gap: 8px;
margin-bottom: 8px;
}
.capture-row {
display: flex;
flex-direction: column;
gap: 3px;
}
.capture-row-main {
display: flex;
align-items: center;
gap: 8px;
}
/* No bottom-margin on inputs inside rows; gap handles spacing */
.capture-row-main .capture-input { margin-bottom: 0; }
/* Quality selector shown for yt-dlp sources */
.capture-quality {
flex-shrink: 0;
height: 32px;
padding: 0 6px;
border: 1px solid var(--line);
border-radius: var(--r);
background: var(--paper);
color: var(--ink);
font-size: 12px;
cursor: pointer;
outline: none;
transition: border-color .15s;
}
.capture-quality:hover { border-color: var(--accent-2); }
.capture-quality:focus { border-color: var(--accent); }
.capture-quality:disabled { opacity: 0.5; cursor: default; }
/* Probing state: ellipsis shown while yt-dlp metadata is in flight */
.capture-quality-probing {
flex-shrink: 0;
font-size: 12px;
color: var(--muted);
padding: 0 4px;
letter-spacing: .05em;
}
/* "No video detected" note */
.capture-quality-hint {
flex-shrink: 0;
font-size: 12px;
color: var(--muted);
font-style: italic;
}
/* Status dot */
.cap-dot {
flex-shrink: 0;
width: 20px;
height: 20px;
border-radius: 50%;
display: grid;
place-items: center;
font-size: 10px;
font-weight: 700;
line-height: 1;
}
.cap-dot--idle { background: var(--paper-2); }
.cap-dot--running { background: #fdefd8; color: #8a4f10; }
.cap-dot--ok { background: #d8eddf; color: #235c35; }
.cap-dot--err { background: #f5ddd8; color: #8d3f30; }
/* Spinner inside the running dot */
.cap-spinner {
display: block;
width: 10px;
height: 10px;
border: 2px solid currentColor;
border-top-color: transparent;
border-radius: 50%;
animation: cap-spin 0.7s linear infinite;
}
@keyframes cap-spin { to { transform: rotate(360deg); } }
/* Per-row action buttons (remove / retry) */
.capture-row-action {
flex-shrink: 0;
background: none;
border: 0;
cursor: pointer;
color: var(--muted);
width: 28px;
height: 28px;
display: grid;
place-items: center;
border-radius: var(--r);
padding: 0;
}
.capture-row-action svg { width: 12px; height: 12px; }
.capture-row-action:hover { color: var(--accent); background: var(--paper-2); }
.capture-row-remove:hover { color: var(--accent); }
/* Inline error under a failed row */
.capture-row-error {
margin: 0;
padding-left: 28px; /* align past the status dot */
font-size: 12px;
color: var(--accent);
line-height: 1.45;
}
/* Add-another button */
.capture-add-row {
display: flex;
align-items: center;
gap: 7px;
width: 100%;
background: none;
border: 1px dashed var(--line);
border-radius: var(--r);
color: var(--muted);
font-size: 13px;
cursor: pointer;
padding: 7px 12px;
margin-top: 4px;
margin-bottom: 18px;
transition: border-color .15s, color .15s, background .15s;
}
.capture-add-row svg { width: 13px; height: 13px; flex-shrink: 0; }
.capture-add-row:hover { border-color: var(--accent-2); color: var(--ink); background: var(--paper-2); }
/* ── Toast stack ─────────────────────────────────────────────────────────── */
.toast-stack {
position: fixed;
bottom: 24px;
right: 24px;
z-index: 9000;
display: flex;
flex-direction: column;
gap: 10px;
width: 340px;
max-width: calc(100vw - 32px);
pointer-events: none;
}
.toast {
pointer-events: auto;
background: var(--paper);
border: 1px solid var(--line);
border-radius: var(--r2);
box-shadow: 0 6px 24px rgba(20, 29, 24, 0.18), 0 1px 4px rgba(20, 29, 24, 0.1);
overflow: hidden;
animation: toast-slide-in 0.22s cubic-bezier(.22,.68,0,1.2);
}
@keyframes toast-slide-in {
from { opacity: 0; transform: translateY(10px) scale(0.97); }
to { opacity: 1; transform: translateY(0) scale(1); }
}
.toast--error { border-left: 3px solid var(--accent); }
.toast--warning { border-left: 3px solid #e8a000; }
.toast-top {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 12px 12px 12px 14px;
}
.toast-icon {
flex-shrink: 0;
font-size: 13px;
font-weight: 700;
color: var(--accent);
margin-top: 2px;
}
.toast-body {
flex: 1;
min-width: 0;
}
.toast-headline {
display: block;
font-size: 13.5px;
font-weight: 600;
color: var(--ink);
line-height: 1.3;
}
.toast-locator {
display: block;
font-size: 12px;
color: var(--muted);
margin-top: 2px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.toast-btns {
display: flex;
align-items: center;
gap: 6px;
flex-shrink: 0;
}
.toast-view-btn {
background: none;
border: 1px solid var(--line);
color: var(--link);
font-size: 12px;
cursor: pointer;
padding: 3px 9px;
border-radius: var(--r);
white-space: nowrap;
}
.toast-view-btn:hover { background: var(--paper-2); border-color: var(--link); }
.toast-dismiss {
background: none;
border: 0;
cursor: pointer;
color: var(--muted);
font-size: 20px;
line-height: 1;
width: 24px;
height: 24px;
display: grid;
place-items: center;
border-radius: var(--r);
padding: 0;
}
.toast-dismiss:hover { color: var(--ink); background: var(--paper-2); }
.toast-error-detail {
margin: 0;
padding: 10px 14px 12px;
font-family: ui-monospace, "SF Mono", Menlo, monospace;
font-size: 11.5px;
line-height: 1.55;
color: var(--muted);
background: var(--paper-2);
border-top: 1px solid var(--line);
white-space: pre-wrap;
word-break: break-word;
max-height: 200px;
overflow-y: auto;
}
.toast-warning-detail {
margin: 0;
padding: 10px 14px 12px;
font-size: 12px;
line-height: 1.55;
color: var(--muted);
background: var(--paper-2);
border-top: 1px solid var(--line);
white-space: pre-wrap;
word-break: break-word;
}
.toast-ignore-btn { color: var(--muted); }
/* ── Utility ─────────────────────────────────────────────────────────────── */
.muted { color: var(--muted); }
/* ── Admin view ──────────────────────────────────────────────────────────── */
.admin-view {
padding: 22px;
}
.admin-list {
display: grid;
gap: 10px;
max-width: 780px;
}
.admin-archive {
border: 1px solid var(--line);
background: var(--paper-3);
padding: 12px;
border-radius: var(--r2);
}
/* ── Tag tree ────────────────────────────────────────────────────────────── */
.tag-tree {
padding: 20px 22px;
max-width: 320px;
}
.tag-tree-header {
display: flex;
align-items: baseline;
gap: 10px;
margin-bottom: 14px;
border-bottom: 1px solid var(--line-soft);
padding-bottom: 10px;
}
.tag-tree-title {
font-size: 11px;
font-weight: 700;
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.07em;
}
.tag-tree-active {
font-size: 12px;
color: var(--muted-2);
font-style: italic;
}
.tag-tree-list {
list-style: none;
margin: 0;
padding: 0;
}
.tag-children {
padding-left: 16px;
}
.tag-node-btn {
border: 0;
background: transparent;
color: var(--link);
cursor: pointer;
padding: 3px 0;
text-align: left;
font-size: 13px;
display: block;
width: 100%;
}
.tag-node-btn:hover { text-decoration: underline; }
.tag-node-btn.is-active { font-weight: 600; color: var(--ink); }
/* tag-node-row: flex row containing the name button + delete × */
.tag-node-row {
display: flex;
align-items: center;
gap: 4px;
}
.tag-node-row .tag-node-btn {
flex: 1 1 0;
min-width: 0;
display: flex;
align-items: center;
gap: 4px;
width: auto;
}
/* constrain the edit pencil so it doesn't inherit unconstrained SVG dimensions */
.tag-node-btn .edit-icon {
width: 0.75em;
height: 0.75em;
flex-shrink: 0;
vertical-align: -0.1em;
opacity: 0.35;
}
.tag-node-btn:hover .edit-icon { opacity: 0.65; }
/* delete × button next to tag name — small, unobtrusive */
.tag-node-delete {
flex-shrink: 0;
border: 0;
background: transparent;
color: var(--muted-2);
cursor: pointer;
padding: 0 3px;
font-size: 14px;
line-height: 1;
opacity: 0;
}
.tag-node-row:hover .tag-node-delete { opacity: 1; }
.tag-node-delete:hover { color: var(--accent); }
/* rename input inside the tag list */
.tag-rename-input {
font-size: 13px;
flex: 1 1 0;
min-width: 0;
padding: 2px 5px;
border: 1px solid var(--accent);
border-radius: var(--r);
background: var(--field);
color: var(--ink);
outline: none;
}
/* ── Collections page (sidebar layout) ──────────────────────────────────── */
.collections-view {
padding: 24px;
}
.collections-heading {
margin: 0 0 16px;
font-size: 22px;
font-family: var(--display);
font-weight: 600;
}
.collections-error {
color: var(--accent);
font-size: 13px;
margin-bottom: 8px;
}
.coll-dismiss {
background: none;
border: none;
cursor: pointer;
color: var(--accent);
font-size: 16px;
line-height: 1;
padding: 0 4px;
}
.collections-layout {
display: grid;
grid-template-columns: 220px 1fr;
gap: 0;
border: 1px solid var(--line);
border-radius: var(--r2);
min-height: 340px;
}
.collections-sidebar {
border-right: 1px solid var(--line);
overflow-y: auto;
}
/* Sidebar list rows — renamed from .coll-row to avoid conflict with rail card */
.coll-sidebar-row {
display: flex;
flex-direction: column;
width: 100%;
padding: 10px 14px;
border: none;
border-bottom: 1px solid var(--line-soft);
background: none;
cursor: pointer;
text-align: left;
gap: 2px;
}
.coll-sidebar-row:hover { background: var(--paper-2); }
.coll-sidebar-row.is-active {
background: var(--paper-2);
border-left: 3px solid var(--accent);
}
.coll-row-name {
font-size: 14px;
font-weight: 600;
color: var(--ink);
}
.coll-row-meta {
font-size: 11px;
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.04em;
}
.coll-detail {
padding: 20px 24px;
display: flex;
flex-direction: column;
gap: 16px;
}
.coll-detail--empty {
justify-content: center;
align-items: center;
}
.coll-detail-header {
display: flex;
align-items: center;
gap: 12px;
}
.coll-detail-name {
margin: 0;
font-size: 18px;
font-family: var(--display);
font-weight: 600;
flex: 1;
}
.coll-detail-name--editable { cursor: pointer; }
.coll-detail-name--editable:hover { color: var(--link); }
.coll-edit-hint { font-size: 14px; opacity: 0.5; margin-left: 4px; }
.coll-rename-input {
flex: 1;
font-size: 16px;
font-family: var(--display);
border: 1px solid var(--line);
padding: 4px 8px;
background: var(--field);
color: var(--ink);
border-radius: var(--r);
}
.coll-delete-btn {
border: 1px solid var(--accent);
background: none;
color: var(--accent);
padding: 5px 12px;
font-size: 13px;
cursor: pointer;
border-radius: var(--r);
}
.coll-delete-btn:hover { background: var(--accent); color: var(--paper); }
.coll-detail-vis {
display: flex;
align-items: center;
gap: 10px;
}
.coll-vis-label {
font-size: 13px;
font-weight: 600;
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.04em;
white-space: nowrap;
}
.coll-vis-select {
border: 1px solid var(--line);
background: var(--paper-3);
color: var(--ink);
padding: 4px 8px;
font-size: 13px;
border-radius: var(--r);
}
.coll-section-heading {
font-size: 11px;
font-weight: 700;
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.06em;
margin-bottom: 8px;
}
.coll-entries-section { flex: 1; }
.coll-entries-list {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
gap: 2px;
}
.coll-entry-row {
display: flex;
align-items: center;
gap: 10px;
padding: 7px 0;
border-bottom: 1px solid var(--line-soft);
}
.coll-entry-info {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 2px;
}
.coll-entry-title {
font-size: 14px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.coll-entry-kind {
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.04em;
}
.coll-entry-actions {
display: flex;
align-items: center;
gap: 6px;
flex-shrink: 0;
}
.coll-entry-vis-select {
border: 1px solid var(--line);
background: var(--paper-3);
color: var(--ink);
padding: 3px 6px;
font-size: 12px;
border-radius: var(--r);
}
.coll-entry-remove {
border: none;
background: none;
cursor: pointer;
color: var(--muted);
font-size: 18px;
line-height: 1;
padding: 0 4px;
}
.coll-entry-remove:hover { color: var(--accent); }
.coll-add-entry-form {
border-top: 1px solid var(--line-soft);
padding-top: 12px;
}
.coll-add-entry-row {
display: flex;
gap: 8px;
align-items: center;
}
.coll-add-entry-input {
flex: 1;
border: 1px solid var(--line);
background: var(--paper-3);
color: var(--ink);
padding: 6px 10px;
font-size: 13px;
min-width: 0;
border-radius: var(--r);
}
.coll-add-btn {
border: none;
background: var(--ink);
color: var(--paper);
padding: 6px 14px;
font-size: 13px;
font-weight: 600;
cursor: pointer;
white-space: nowrap;
border-radius: var(--r);
}
.coll-add-btn:hover { opacity: 0.85; }
.coll-add-btn:disabled { opacity: 0.45; cursor: default; }
/* old override — superseded by coll-create-details section below */
/* ── Auth loading state ─────────────────────────────────────────────────── */
.auth-loading {
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
color: var(--muted);
font-size: 15px;
background: var(--paper);
}
/* ── User menu (topbar right) ───────────────────────────────────────────── */
.user-menu {
display: flex;
align-items: center;
gap: 14px;
padding-left: 6px;
flex-shrink: 0;
}
.user-name {
font-size: 12.5px;
color: var(--muted-2);
letter-spacing: 0.01em;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 140px;
}
.logout-btn {
border: 1px solid rgba(255,255,255,0.18);
background: transparent;
color: #c8bfb0;
font-size: 12px;
padding: 4px 11px;
border-radius: var(--r);
cursor: pointer;
white-space: nowrap;
transition: background 0.15s, color 0.15s;
}
.logout-btn:hover { background: rgba(255,255,255,0.1); color: var(--paper); }
.logout-btn:disabled { opacity: 0.5; cursor: default; }
/* ── Login / Setup pages ─────────────────────────────────────────────────── */
.login-page,
.setup-page {
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background: var(--paper);
}
.login-card,
.setup-card {
width: 100%;
max-width: 360px;
padding: 40px 36px 44px;
background: var(--paper-3);
border: 1px solid var(--line);
border-radius: var(--r3);
box-shadow: 0 2px 20px rgba(20,29,24,0.07);
}
.login-brand,
.setup-brand {
font-family: var(--display);
font-size: 32px;
font-weight: 600;
color: var(--ink);
letter-spacing: -0.01em;
margin: 0 0 6px;
}
.login-tagline,
.setup-tagline {
font-size: 13px;
color: var(--muted);
margin: 0 0 28px;
}
.login-field,
.setup-field {
display: flex;
flex-direction: column;
gap: 5px;
margin-bottom: 14px;
}
.login-label,
.setup-label {
font-size: 11.5px;
font-weight: 600;
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.06em;
}
.login-input,
.setup-input {
width: 100%;
border: 1px solid var(--line);
background: var(--field);
color: var(--ink);
padding: 9px 11px;
font-size: 14px;
border-radius: var(--r2);
outline: none;
transition: border-color 0.15s;
}
.login-input:focus,
.setup-input:focus { border-color: var(--accent); }
.login-error,
.setup-error {
font-size: 13px;
color: var(--accent);
margin: 4px 0 8px;
}
.login-submit,
.setup-submit {
width: 100%;
margin-top: 8px;
border: none;
background: var(--top);
color: var(--paper);
font-size: 14px;
font-weight: 600;
padding: 11px 16px;
border-radius: var(--r2);
cursor: pointer;
letter-spacing: 0.02em;
transition: opacity 0.15s;
}
.login-submit:hover,
.setup-submit:hover { opacity: 0.85; }
.login-submit:disabled,
.setup-submit:disabled { opacity: 0.45; cursor: default; }
/* ── Shared sub-view tabs ────────────────────────────────────────────────── */
.view-tabs {
display: flex;
gap: 2px;
margin-bottom: 22px;
border-bottom: 1px solid var(--line-soft);
padding-bottom: 0;
}
.view-tab {
border: none;
background: none;
color: var(--muted);
font-size: 13px;
font-weight: 600;
padding: 7px 14px;
cursor: pointer;
border-bottom: 2px solid transparent;
margin-bottom: -1px;
letter-spacing: 0.02em;
transition: color 0.12s;
text-transform: uppercase;
letter-spacing: 0.06em;
font-size: 11.5px;
}
.view-tab:hover { color: var(--ink); }
.view-tab.is-active { color: var(--ink); border-bottom-color: var(--accent); }
/* ── Shared form elements ────────────────────────────────────────────────── */
.form-section { margin-bottom: 32px; }
.form-section h2 {
font-size: 14px;
font-weight: 700;
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.06em;
margin: 0 0 14px;
}
.form-row { display: flex; gap: 8px; margin-bottom: 10px; }
.form-field {
display: flex;
flex-direction: column;
gap: 5px;
margin-bottom: 12px;
}
.form-label {
font-size: 11.5px;
font-weight: 600;
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.05em;
}
.field-input {
border: 1px solid var(--line);
background: var(--field);
color: var(--ink);
padding: 8px 10px;
font-size: 13.5px;
border-radius: var(--r);
outline: none;
transition: border-color 0.15s;
min-width: 0;
}
.field-input:focus { border-color: var(--accent); }
.field-input--flex { flex: 1; }
.form-msg { font-size: 13px; margin: 6px 0; }
.form-msg--ok { color: var(--link); }
.form-msg--err { color: var(--accent); }
.btn-primary {
border: none;
background: var(--top);
color: var(--paper);
font-size: 13px;
font-weight: 600;
padding: 8px 16px;
border-radius: var(--r);
cursor: pointer;
white-space: nowrap;
}
.btn-primary:hover { opacity: 0.85; }
.btn-primary:disabled { opacity: 0.45; cursor: default; }
.btn-ghost {
border: 1px solid var(--line);
background: none;
color: var(--ink);
font-size: 13px;
padding: 7px 14px;
border-radius: var(--r);
cursor: pointer;
}
.btn-ghost:hover { background: var(--paper-2); }
.btn-danger {
border: 1px solid var(--accent);
background: none;
color: var(--accent);
font-size: 13px;
padding: 7px 14px;
border-radius: var(--r);
cursor: pointer;
}
.btn-danger:hover { background: var(--accent); color: var(--paper); }
/* ── Admin view overrides ────────────────────────────────────────────────── */
.admin-view h1 { font-family: var(--display); font-weight: 600; font-size: 26px; margin: 0 0 20px; }
.admin-table {
width: 100%;
border-collapse: collapse;
font-size: 13px;
margin-bottom: 28px;
}
.admin-table th {
text-align: left;
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.07em;
color: var(--muted);
padding: 8px 10px;
border-bottom: 1px solid var(--line);
background: var(--paper-2);
}
.admin-table th:first-child { padding-left: 16px; }
.admin-table td {
padding: 9px 10px;
border-bottom: 1px solid var(--line-soft);
color: var(--ink);
vertical-align: middle;
}
.admin-table td:first-child { padding-left: 16px; }
.admin-table tr:hover td { background: var(--paper-2); }
.admin-row-disabled td { opacity: 0.45; }
.admin-section { margin-bottom: 36px; max-width: 860px; }
.admin-section h2 {
font-size: 14px;
font-weight: 700;
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.06em;
margin: 0 0 14px;
}
.admin-section h3 {
font-size: 13px;
font-weight: 700;
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.05em;
margin: 22px 0 10px;
}
.admin-form { display: flex; flex-direction: column; gap: 8px; max-width: 480px; }
.admin-input {
border: 1px solid var(--line);
background: var(--field);
color: var(--ink);
padding: 8px 10px;
font-size: 13.5px;
border-radius: var(--r);
outline: none;
transition: border-color 0.15s;
}
.admin-input:focus { border-color: var(--accent); }
.admin-action-btn {
border: 1px solid var(--line);
background: none;
color: var(--ink);
font-size: 12px;
padding: 4px 10px;
border-radius: var(--r);
cursor: pointer;
white-space: nowrap;
}
.admin-action-btn:hover { border-color: var(--accent); color: var(--accent); }
.status-badge {
display: inline-block;
padding: 2px 8px;
border-radius: var(--r);
font-size: 11.5px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.04em;
}
.status-active { background: #d8eddf; color: #235c35; border: 1px solid #b4d9be; }
.status-disabled { background: #ede8e0; color: var(--muted); border: 1px solid var(--line); }
/* ── Runs view improvements ──────────────────────────────────────────────── */
.run-status {
display: inline-block;
padding: 2px 8px;
border-radius: var(--r);
font-size: 11.5px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.04em;
}
.run-status--completed { background: #d8eddf; color: #235c35; border: 1px solid #b4d9be; }
.run-status--failed { background: #f5ddd8; color: #8d3f30; border: 1px solid #e0b8b0; }
.run-status--in-progress { background: #fdefd8; color: #8a4f10; border: 1px solid #f0cfa0; }
/* Clickable failed run rows and expandable error detail */
.run-row--failed { cursor: pointer; }
.run-row--failed:hover td { background: #fdf0ed !important; }
.run-expand-hint {
margin-left: 6px;
font-size: 10px;
color: var(--accent);
vertical-align: middle;
}
.run-error-row td {
padding: 0 !important;
background: var(--paper-2) !important;
}
.run-error-detail {
margin: 0;
padding: 10px 16px 12px;
font-family: ui-monospace, "SF Mono", Menlo, monospace;
font-size: 11.5px;
line-height: 1.55;
color: var(--muted);
white-space: pre-wrap;
word-break: break-word;
max-height: 220px;
overflow-y: auto;
}
/* ── Token created banner ────────────────────────────────────────────────── */
.token-banner {
background: #d8eddf;
border: 1px solid #b4d9be;
padding: 12px 14px;
margin-bottom: 16px;
font-size: 13px;
border-radius: var(--r2);
}
.token-banner code {
word-break: break-all;
display: block;
margin-top: 6px;
padding: 6px 8px;
background: var(--field);
border: 1px solid var(--line);
border-radius: var(--r);
font-size: 12px;
font-family: ui-monospace, "SF Mono", Menlo, monospace;
}
.token-dismiss {
margin-top: 8px;
font-size: 12px;
border: 1px solid var(--line);
background: none;
cursor: pointer;
padding: 3px 8px;
border-radius: var(--r);
color: var(--muted);
}
.token-dismiss:hover { background: var(--paper-2); }
.token-row {
display: flex;
align-items: center;
justify-content: space-between;
border: 1px solid var(--line);
background: var(--paper-3);
padding: 10px 12px;
border-radius: var(--r);
margin-bottom: 6px;
}
.token-row-info strong { font-size: 14px; display: block; }
.token-row-info .muted { font-size: 12px; margin-top: 2px; }
.token-create-row { display: flex; gap: 8px; margin-bottom: 16px; }
/* ── Instance settings checkboxes ───────────────────────────────────────── */
.checkbox-row {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 12px;
cursor: pointer;
font-size: 14px;
}
.checkbox-row input[type=checkbox] { width: 15px; height: 15px; accent-color: var(--accent); }
/* ── Collections create details ─────────────────────────────────────────── */
.coll-create-details {
margin-top: 16px;
}
.coll-create-details summary {
font-weight: 600;
cursor: pointer;
font-size: 13px;
color: var(--link);
list-style: none;
display: flex;
align-items: center;
gap: 6px;
padding: 8px 12px;
border: 1px solid var(--line-soft);
border-radius: var(--r2);
background: var(--paper-3);
width: fit-content;
}
.coll-create-details summary:hover { background: var(--paper-2); }
.coll-create-details[open] summary { border-bottom-left-radius: 0; border-bottom-right-radius: 0; }
.coll-create-form {
border: 1px solid var(--line-soft);
border-top: none;
padding: 14px;
border-radius: 0 0 var(--r2) var(--r2);
background: var(--paper-3);
display: flex;
flex-direction: column;
gap: 10px;
max-width: 440px;
}
/* ── Responsive ──────────────────────────────────────────────────────────── */
@media (max-width: 900px) {
.topbar {
grid-template-columns: 1fr auto;
height: auto;
min-height: 58px;
padding: 12px;
}
.switcher,
.nav {
grid-column: 1 / -1;
}
.nav {
justify-content: flex-start;
overflow-x: auto;
}
.app-shell {
height: auto;
grid-template-columns: 1fr;
}
.context-rail {
border-left: 0;
border-top: 1px solid var(--line);
}
.entry-table { min-width: 860px; }
}
/* Inline title edit in ContextRail */
.rail-title--editable {
cursor: pointer;
}
.rail-title--editable:hover {
opacity: 0.75;
}
.rail-title--editable .edit-icon {
display: inline-block;
width: 0.75em;
height: 0.75em;
margin-left: 0.35em;
vertical-align: middle;
opacity: 0;
transition: opacity 0.1s;
flex-shrink: 0;
}
.rail-title--editable:hover .edit-icon {
opacity: 0.5;
}
.rail-title-input {
width: 100%;
font: inherit;
font-size: inherit;
font-weight: 600;
background: transparent;
border: none;
border-bottom: 1px solid currentColor;
color: inherit;
padding: 0;
margin: 0 0 8px;
outline: none;
}