From 7f08dc1a0d27be44d08aa3228ece70fcd5a694bd Mon Sep 17 00:00:00 2001 From: th Date: Sat, 11 Apr 2026 22:00:16 +0200 Subject: [PATCH] list view: single column with date / bucket / tags, larger title MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drops the multi-column compact list in favour of a one-row-per-card layout. Each row: color dot · optional cal/fav icon · title (flex-grows + ellipsis) · up-to-4 tag chips with overflow indicator · bucket name + folder icon · right-aligned date column. Date column picks (in order): due_date → leading YYYY-MM-DD in the title → updated_at/created_at. Termin/geburtstag tags are filtered out of the chip list since they're already represented by the icon + dot. Title font goes from 11px → 14px so the list reads more like a real list than a label cloud. Rows have 8px vertical padding, hover background, and a thin bottom-border. Whole grid is capped at 1100px and centered. chore: bump version to 0.9.4 Co-Authored-By: Claude Opus 4.6 (1M context) --- config.php | 2 +- public/css/style.css | 60 ++++++++++++++++++++++++++++++++++---- public/js/modules/board.js | 21 +++++++++++-- 3 files changed, 73 insertions(+), 10 deletions(-) diff --git a/config.php b/config.php index 4b587d2..e2a345a 100644 --- a/config.php +++ b/config.php @@ -1,7 +1,7 @@ ` + cards.map(c => { + board.innerHTML = `
` + cards.map(c => { const tags = parseTags(c); const isTermin = tags.includes('termin') || tags.includes('geburtstag'); let calCfg = null; @@ -532,10 +531,26 @@ export function renderBoard() { const dotColor = calCfg?.color || c.color; const icon = isTermin ? (calCfg?.icon || 'calendar-dots') : (isFavorite(c.id) ? 'star' : null); const iconColor = isTermin ? dotColor : (isFavorite(c.id) ? '#fbbf24' : 'var(--t-dim)'); + // Date column: due_date if set, else date prefix in title, else updated/created + const dateStr = c.due_date + || ((c.title || '').match(/^\d{4}-\d{2}-\d{2}/)?.[0]) + || (c.updated_at || c.created_at || '').substring(0, 10); + // Tag chips (excluding termin/geburtstag — those are already + // represented by the icon + dot on the left) + const visibleTags = tags.filter(t => t !== 'termin' && t !== 'geburtstag'); + const tagsHtml = visibleTags.length + ? `${visibleTags.slice(0, 4).map(t => `#${esc(t)}`).join('')}${visibleTags.length > 4 ? `+${visibleTags.length - 4}` : ''}` + : ''; + const bucketHtml = c.bucket_name + ? `${esc(c.bucket_name)}` + : ''; return `
${icon ? `` : ''} ${esc(c.title)} + ${tagsHtml} + ${bucketHtml} + ${dateStr}
`; }).join('') + '
';