Overhaul card-data ingest: filter art cards, segmented cancellable progress
- Exclude Scryfall Art Series cards (layout "art_series") from ingest — they aren't playable cards and were polluting search results. - Replace the coarse per-stage progress text with a byte-accurate, weighted multi-segment progress bar (Index / Card data / Printings / Indexing) that fills as one continuous bar instead of swapping per stage; segment weights are computed from the real download sizes reported by Scryfall's bulk-data index (the download responses themselves are chunked with no Content-Length to rely on). - Add a Cancel button, wired through a new CancelToken checked once per parsed record so cancellation lands almost instantly. - Fix a related correctness bug this surfaced: ingest used to delete the existing reference.db before writing its replacement, so a cancelled or crashed update left the app with no card database at all. It now builds into a temp file and only atomically replaces reference.db on full success. - Split the topbar's single "Choose library…" action into separate "Open Library…" (existing file) and "New Library…" (save-dialog for a new file) buttons. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
104
src/styles.css
104
src/styles.css
@@ -292,14 +292,108 @@ select:focus {
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.progress {
|
||||
color: var(--accent-hover);
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
}
|
||||
.spacer {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
/* Ingest (card-data download/index) progress: one multi-segment bar spanning
|
||||
all stages, below the topbar. */
|
||||
.ingest-bar {
|
||||
padding: 8px 18px 10px;
|
||||
background: var(--bg-elev);
|
||||
border-bottom: 1px solid var(--border-soft);
|
||||
font-size: 12px;
|
||||
}
|
||||
.ingest-bar-head {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
.ingest-bar-message {
|
||||
color: var(--muted);
|
||||
font-family: ui-monospace, "SF Mono", Menlo, monospace;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.ingest-bar-cancel {
|
||||
flex-shrink: 0;
|
||||
padding: 3px 10px;
|
||||
font-size: 11px;
|
||||
color: var(--muted);
|
||||
}
|
||||
.ingest-bar-cancel:hover {
|
||||
color: var(--danger);
|
||||
border-color: var(--danger);
|
||||
}
|
||||
.ingest-bar-dismiss {
|
||||
flex-shrink: 0;
|
||||
background: none;
|
||||
border: none;
|
||||
color: var(--faint);
|
||||
cursor: pointer;
|
||||
padding: 2px 6px;
|
||||
font-size: 13px;
|
||||
}
|
||||
.ingest-bar-dismiss:hover {
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
.ingest-segments {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
}
|
||||
.ingest-segment {
|
||||
min-width: 0;
|
||||
}
|
||||
.ingest-segment-track {
|
||||
height: 6px;
|
||||
border-radius: 999px;
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
overflow: hidden;
|
||||
}
|
||||
.ingest-segment-fill {
|
||||
height: 100%;
|
||||
border-radius: 999px;
|
||||
background: var(--border);
|
||||
transition: width 0.2s ease;
|
||||
}
|
||||
.ingest-segment.active .ingest-segment-fill {
|
||||
background: linear-gradient(90deg, var(--accent-hover), var(--accent));
|
||||
}
|
||||
.ingest-segment-label {
|
||||
display: block;
|
||||
margin-top: 3px;
|
||||
font-size: 10px;
|
||||
color: var(--faint);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.ingest-segment.active .ingest-segment-label {
|
||||
color: var(--accent-hover);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.ingest-bar-done .ingest-segment-fill {
|
||||
background: var(--success);
|
||||
}
|
||||
.ingest-bar-done .ingest-bar-message {
|
||||
color: var(--success);
|
||||
}
|
||||
.ingest-bar-error .ingest-segment-fill {
|
||||
background: var(--danger);
|
||||
}
|
||||
.ingest-bar-error .ingest-bar-message {
|
||||
color: var(--danger);
|
||||
}
|
||||
.ingest-bar-cancelled .ingest-segment-fill {
|
||||
background: var(--warn);
|
||||
}
|
||||
.ingest-bar-cancelled .ingest-bar-message {
|
||||
color: var(--warn);
|
||||
}
|
||||
.content {
|
||||
flex: 1;
|
||||
overflow: auto;
|
||||
|
||||
Reference in New Issue
Block a user