feat(ui): project details panel + compact/responsive cards; rename Sentinel→Yerin (red); migrate research_notes
- Project card expands to show description + status + dates (was only the research stub) - Cards compacted + responsive (actions wrap on narrow) - Sentinel renamed Yerin everywhere (#/yerin, red 'Sage of the Endless Sword' theme + red sidebar dot) - void1 importer now carries research_notes/last_researched_at (was dropped) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -51,6 +51,24 @@ export function projectCard(p, o) {
|
||||
|
||||
if (open) {
|
||||
const panel = el('div', { class: 'proj-panel' });
|
||||
|
||||
// ---- Details ----
|
||||
panel.appendChild(el('div', { class: 'proj-section-h' }, 'Details'));
|
||||
const det = el('div', { class: 'proj-details' });
|
||||
det.appendChild(p.description
|
||||
? el('div', { class: 'proj-detail-desc' }, p.description)
|
||||
: el('div', { class: 'muted', style: { fontSize: '12px' } }, 'No description yet — Edit to add one.'));
|
||||
const dl = el('dl', { class: 'proj-dl' });
|
||||
const addDL = (k, v) => { if (v) { dl.appendChild(el('dt', {}, k)); dl.appendChild(el('dd', {}, v)); } };
|
||||
addDL('Status', p.status);
|
||||
addDL('Created', p.created_at ? new Date(p.created_at).toLocaleDateString() : null);
|
||||
addDL('Updated', p.updated_at ? `${new Date(p.updated_at).toLocaleDateString()} (${ago(p.updated_at)})` : null);
|
||||
if (p.started_at) addDL('Started', new Date(p.started_at).toLocaleDateString());
|
||||
if (p.completed_at) addDL('Completed', new Date(p.completed_at).toLocaleDateString());
|
||||
det.appendChild(dl);
|
||||
panel.appendChild(det);
|
||||
|
||||
// ---- Eithan research ----
|
||||
panel.appendChild(el('div', { class: 'proj-section-h' }, 'Eithan research' + (p.last_researched_at ? ` · ${ago(p.last_researched_at)}` : '')));
|
||||
if (busy) panel.appendChild(el('div', { class: 'muted' }, "Queued for Eithan — he'll fill this in once the agent ships."));
|
||||
else if (p.research_notes) { const n = el('div', { class: 'md-preview' }); n.innerHTML = renderMarkdown(p.research_notes); panel.appendChild(n); }
|
||||
|
||||
@@ -90,7 +90,7 @@ export function renderSidebar(root) {
|
||||
),
|
||||
el('div', { class: 'sb-section' },
|
||||
el('div', { class: 'sb-title' }, 'Agents'),
|
||||
navItem('Sentinel', '/sentinel', { dot: 'ok' }),
|
||||
navItem('Yerin', '/yerin', { dot: 'yerin' }),
|
||||
navItem('Little Blue', '/little-blue', { dot: 'lb' })
|
||||
),
|
||||
el('div', { class: 'sb-section' },
|
||||
|
||||
Reference in New Issue
Block a user