diff --git a/db/init.sql b/db/init.sql index 947bc55..2486c39 100644 --- a/db/init.sql +++ b/db/init.sql @@ -44,3 +44,11 @@ INSERT INTO groups (name) VALUES ('Intermediate'), ('Advanced') ON CONFLICT (name) DO NOTHING; + +CREATE TABLE IF NOT EXISTS project_files ( + id SERIAL PRIMARY KEY, + entry_id INT NOT NULL REFERENCES entries(id) ON DELETE CASCADE, + path VARCHAR(255) NOT NULL, + name VARCHAR(255) NOT NULL, + created_at TIMESTAMPTZ DEFAULT now() +); diff --git a/public/admin.css b/public/admin.css index 49b29c1..3f6f1ca 100644 --- a/public/admin.css +++ b/public/admin.css @@ -45,6 +45,10 @@ body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;b .card .group{color:var(--accent);font-size:.8rem;margin-top:2px} .card .desc{color:var(--muted);font-size:.85rem;margin-top:8px;line-height:1.4;white-space:pre-wrap} .card .time{color:var(--muted);font-size:.75rem;margin-top:8px} +.entry-files{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px} +.entry-files a{display:inline-flex;align-items:center;gap:4px;background:var(--bg);border:1px solid var(--border);color:var(--text);text-decoration:none;border-radius:6px;padding:4px 8px;font-size:.75rem;max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} +.entry-files a:hover{border-color:var(--accent);color:var(--accent)} +.entry-files a::before{content:'📎'} .card .del{background:none;border:none;color:var(--muted);cursor:pointer;font-size:1.1rem;padding:4px;flex-shrink:0} .card .del:hover{color:#ef4444} .card .edit{background:none;border:none;color:var(--muted);cursor:pointer;font-size:1.05rem;padding:4px;flex-shrink:0} diff --git a/public/index.html b/public/index.html index 4a4d2c5..df3dfee 100644 --- a/public/index.html +++ b/public/index.html @@ -21,6 +21,21 @@ h1{font-size:1.5rem;font-weight:600;margin-bottom:8px;letter-spacing:-.02em;text .photo-btns button:hover{border-color:var(--accent)} .photo-btns .cam{background:var(--accent);color:#fff;border-color:var(--accent)} .photo-btns .cam:hover{opacity:.85} +.photo-btns .files-btn p{font-size:.8rem;font-weight:500;margin:0} +.files-btn{width:100%;border-radius:var(--radius);padding:12px 16px;font-size:.9rem;font-weight:600;cursor:pointer;border:1px solid var(--border);background:var(--card);color:var(--text);transition:border .15s,background .15s} +.files-btn:hover{border-color:var(--accent)} +.files-card{width:100%;border:1px dashed var(--border);border-radius:var(--radius);padding:16px;display:flex;flex-direction:column;gap:12px;background:var(--bg)} +.files-card .files-head{display:flex;align-items:center;justify-content:space-between;gap:8px} +.files-card label{font-size:.8rem;font-weight:600;color:var(--text);text-transform:none;letter-spacing:0} +.files-card .files-clear{background:none;border:none;color:#ef4444;font-size:.8rem;cursor:pointer;padding:0;display:none} +.files-card .files-clear.show{display:block} +.files-list{display:flex;flex-direction:column;gap:6px;max-height:180px;overflow-y:auto} +.files-list:empty{display:none} +.files-list .file-row{display:flex;align-items:center;gap:8px;background:var(--card);border:1px solid var(--border);border-radius:8px;padding:8px 10px;font-size:.8rem} +.files-list .file-row .f-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)} +.files-list .file-row .f-size{color:var(--muted);flex-shrink:0} +.files-list .file-row button{background:none;border:none;color:var(--muted);cursor:pointer;font-size:.85rem;padding:0 2px;flex-shrink:0} +.files-list .file-row button:hover{color:#ef4444} .preview-wrap{width:100%;display:flex;flex-direction:column;align-items:center;gap:8px} .preview{max-width:100%;width:100%;aspect-ratio:4/3;object-fit:cover;border-radius:var(--radius);background:var(--card);display:block;border:1px dashed var(--border)} .preview.has-photo{border-style:solid} @@ -82,6 +97,15 @@ nav a:hover{color:var(--text)} +