feat: per-source .md sidecar toggles, Picdrop folder-list diagnostic, fast JPEG fullscreen preview + thumb-first, thumbnail backfill

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XNQ8ghPfzAfsyVYd6HgFb6
This commit is contained in:
2026-07-24 07:56:57 +00:00
parent 5f0c33e44b
commit 32f06297a6
12 changed files with 161 additions and 44 deletions
+8 -2
View File
@@ -249,10 +249,13 @@ export default function LibraryApp() {
)}
{saveView && (
<div className="lupe" onClick={() => setSaveView(null)}>
<img className="saveimg" src={`/api/items/${saveView.id}/file`} alt={saveView.filename || ''} onClick={(e) => e.stopPropagation()} />
<div className="savewrap" onClick={(e) => e.stopPropagation()}>
<img className="saveimg blur" src={`/api/items/${saveView.id}/file?thumb=1`} alt="" />
<img className="saveimg full" src={`/api/items/${saveView.id}/file?preview=1`} alt={saveView.filename || ''} />
</div>
<div className="save-fuss" onClick={(e) => e.stopPropagation()}>
<span>📱 iPhone/iPad: lange auf das Bild tippen <b>In Fotos sichern"</b>.</span>
<a className="mini stark" href={`/api/items/${saveView.id}/file?download=1`}>Als Datei herunterladen</a>
<a className="mini stark" href={`/api/items/${saveView.id}/file?download=1`}>Original als Datei (.png)</a>
<button className="mini" onClick={() => setSaveView(null)}>Schließen</button>
</div>
</div>
@@ -309,7 +312,10 @@ function LibStyles() {
.tagmenu button{display:flex;align-items:center;gap:8px;background:none;border:none;text-align:left;padding:7px 9px;cursor:pointer;font-family:inherit;font-size:13px;border-radius:4px;color:var(--ink);}
.tagmenu button:hover{background:var(--paper);}
.tagmenu .flag{font-size:15px;}
.savewrap{position:relative;max-width:94vw;max-height:78vh;display:flex;}
.saveimg{max-width:94vw;max-height:78vh;border-radius:4px;display:block;}
.saveimg.blur{filter:blur(8px);position:absolute;inset:0;width:100%;height:100%;object-fit:contain;}
.saveimg.full{position:relative;z-index:1;}
.save-fuss{display:flex;flex-direction:column;align-items:center;gap:10px;color:#EAEAE3;font-size:13.5px;text-align:center;max-width:90vw;}
.fassung{position:absolute;bottom:6px;right:6px;background:rgba(22,21,15,.7);color:#fff;font-family:var(--font-mono);font-size:9px;padding:2px 7px;border-radius:20px;}
.varianten{display:flex;gap:5px;margin-top:6px;overflow-x:auto;}