Updates galore. Improved folder structure, componentized, and notifications upon completion.

This commit is contained in:
Brian McGonagill 2026-03-17 14:01:35 -05:00
parent b48784e2ad
commit 7e0502ca40
33 changed files with 3565 additions and 728 deletions

View file

@ -1202,7 +1202,107 @@ body {
color: rgba(245,245,242,0.65);
}
/* ── Animations ─────────────────────────────────────────────── */
/* ── Notification opt-in ────────────────────────────────────── */
.notify-group {
display: flex;
flex-direction: column;
gap: var(--space-sm);
flex: 1;
}
.notify-checkbox-row {
display: flex;
align-items: center;
gap: var(--space-sm);
}
.notify-checkbox {
width: 18px;
height: 18px;
min-width: 18px;
min-height: 18px;
cursor: pointer;
accent-color: var(--accent);
flex-shrink: 0;
}
.notify-label {
font-size: 0.9rem;
color: var(--text-primary);
cursor: pointer;
font-weight: 500;
line-height: 1.3;
}
.notify-email-row {
display: flex;
flex-direction: column;
gap: var(--space-xs);
padding-left: 26px; /* indent under checkbox */
animation: slide-down 180ms ease;
}
.notify-email-row[hidden] {
display: none !important;
}
@keyframes slide-down {
from { opacity: 0; transform: translateY(-6px); }
to { opacity: 1; transform: translateY(0); }
}
.notify-email-label {
margin-bottom: 0;
}
.notify-email-input {
max-width: 340px;
}
.notify-divider {
width: 1px;
background: var(--border-base);
align-self: stretch;
margin: 0 var(--space-sm);
flex-shrink: 0;
}
/* Notification send status shown in progress footer */
.notify-status {
font-size: 0.85rem;
display: inline-flex;
align-items: center;
gap: var(--space-xs);
padding: var(--space-xs) var(--space-md);
border-radius: var(--radius-pill);
font-weight: 600;
}
.notify-status[hidden] {
display: none !important;
}
.notify-status.ok {
background: rgba(22, 101, 52, 0.10);
color: var(--text-success);
border: 1px solid rgba(22, 101, 52, 0.25);
}
.notify-status.fail {
background: rgba(185, 28, 28, 0.10);
color: var(--text-danger);
border: 1px solid rgba(185, 28, 28, 0.25);
}
[data-theme="dark"] .notify-status.ok {
background: rgba(134, 239, 172, 0.10);
border-color: rgba(134, 239, 172, 0.25);
}
[data-theme="dark"] .notify-status.fail {
background: rgba(252, 165, 165, 0.10);
border-color: rgba(252, 165, 165, 0.25);
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
@ -1212,6 +1312,60 @@ body {
animation: pulse 1.8s ease infinite;
}
/* ── Stream-lost banner ─────────────────────────────────────── */
.stream-lost-banner {
display: flex;
align-items: center;
gap: var(--space-md);
flex-wrap: wrap;
background: rgba(180, 100, 0, 0.10);
border: 1.5px solid rgba(180, 100, 0, 0.35);
border-radius: var(--radius-md);
padding: var(--space-md) var(--space-lg);
margin-bottom: var(--space-lg);
color: #7a4500;
}
[data-theme="dark"] .stream-lost-banner {
background: rgba(251, 191, 36, 0.10);
border-color: rgba(251, 191, 36, 0.30);
color: #fbbf24;
}
.stream-lost-banner[hidden] {
display: none !important;
}
.banner-icon {
font-size: 1.2rem;
flex-shrink: 0;
}
.banner-text {
flex: 1;
font-size: 0.88rem;
font-weight: 500;
line-height: 1.4;
}
/* Reconnect button sits in the card title row */
.card-title .reconnect-btn {
margin-left: auto;
font-size: 0.78rem;
padding: 5px 12px;
min-height: 32px;
animation: pulse-reconnect 1.8s ease infinite;
}
.reconnect-btn[hidden] {
display: none !important;
}
@keyframes pulse-reconnect {
0%, 100% { border-color: var(--btn-outline-border); }
50% { border-color: var(--accent); color: var(--accent); }
}
/* ── Responsive ─────────────────────────────────────────────── */
@media (max-width: 768px) {
.app-main {
@ -1258,3 +1412,123 @@ body {
[data-theme="dark"] .file-table th {
color: var(--text-primary);
}
/* ── Settings modal ─────────────────────────────────────────── */
.settings-panel {
max-width: 560px;
max-height: 90vh;
display: flex;
flex-direction: column;
}
.settings-body {
flex: 1;
overflow-y: auto;
padding: var(--space-lg) var(--space-xl);
}
.settings-body::-webkit-scrollbar { width: 6px; }
.settings-body::-webkit-scrollbar-track { background: var(--bg-card2); }
.settings-body::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 3px; }
.settings-intro {
font-size: 0.85rem;
color: var(--text-muted);
margin-bottom: var(--space-lg);
line-height: 1.5;
}
.settings-grid {
display: flex;
flex-direction: column;
gap: var(--space-lg);
}
.settings-row-2 {
display: grid;
grid-template-columns: 100px 1fr;
gap: var(--space-md);
}
.settings-divider-above {
border-top: 1px solid var(--border-base);
padding-top: var(--space-lg);
margin-top: var(--space-sm);
}
.settings-save-status {
font-size: 0.82rem;
text-align: center;
min-height: 1.4em;
padding: var(--space-xs) var(--space-xl) var(--space-md);
color: var(--text-muted);
}
.settings-test-result {
min-height: 1.4em;
}
/* Password row with toggle */
.password-row {
display: flex;
gap: var(--space-sm);
align-items: center;
}
.password-row .text-input { flex: 1; }
.btn-icon-inline {
width: 40px;
height: 40px;
min-width: 40px;
min-height: 40px;
border: 1.5px solid var(--border-input);
border-radius: var(--radius-md);
background: var(--bg-input);
color: var(--text-muted);
font-size: 1rem;
cursor: pointer;
display: inline-flex;
align-items: center;
justify-content: center;
transition: background var(--transition-fast), border-color var(--transition-fast);
flex-shrink: 0;
}
.btn-icon-inline:hover {
background: var(--bg-row-alt);
border-color: var(--border-strong);
}
/* Select input to match text-input style */
.select-input {
cursor: pointer;
}
/* Inline button link (used in hint text) */
.btn-link {
background: none;
border: none;
padding: 0;
color: var(--text-link);
font: inherit;
font-size: inherit;
cursor: pointer;
text-decoration: underline;
text-underline-offset: 2px;
}
.btn-link:hover {
color: var(--accent);
}
/* Settings save status colours */
.settings-save-status.ok { color: var(--text-success); }
.settings-save-status.fail { color: var(--text-danger); }
/* SMTP not configured warning on the notify row */
.smtp-warn {
color: var(--accent);
font-size: 0.78rem;
font-weight: 600;
}