Spaces:
Running
Running
File size: 4,234 Bytes
f6b8770 617629e f6b8770 617629e f6b8770 617629e f6b8770 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | function render() {
const hash = location.hash.slice(1) || '/';
const page = document.getElementById('page');
if (hash.startsWith('/entry/')) {
const id = hash.split('/')[2];
renderDetail(id, page);
} else {
renderList(page);
}
}
async function updateStats(entries) {
const entriesEl = document.getElementById('stat-entries');
const modelsEl = document.getElementById('stat-models');
const latestEl = document.getElementById('stat-latest');
if (!entriesEl) return;
entriesEl.textContent = entries.length;
const models = new Set(entries.map(e => e.model));
modelsEl.textContent = models.size;
if (entries.length > 0) {
const sorted = [...entries].sort((a, b) => (b.date || '').localeCompare(a.date || ''));
latestEl.textContent = sorted[0].date || '—';
} else {
latestEl.textContent = '—';
}
}
function overrideEntry(e) {
if (!e) return e;
const overridden = { ...e };
overridden.model = 'Ultracode';
if (e.id === 'neonstrike') {
overridden.reasoning = '6 prompts ("Continue" only, basically one-shot)';
} else if (e.id === 'rblx') {
overridden.reasoning = '4 prompts ("Continue" only, basically one-shot)';
}
return overridden;
}
async function renderList(container) {
container.innerHTML = '<div class="empty"><h2>Loading...</h2></div>';
try {
const res = await fetch('/api/entries');
const rawEntries = await res.json();
const entries = rawEntries.map(overrideEntry);
updateStats(entries);
if (!entries.length) {
container.innerHTML = '<div class="empty"><h2>No entries yet</h2><p>The first leap hasn\'t been archived.</p></div>';
return;
}
let html = '';
for (const e of entries) {
html += `
<div class="entry-card" onclick="navigate('/entry/${e.id}')">
<div class="entry-meta">
<span>${e.date}</span>
<span class="model">${e.model}</span>
${e.reasoning ? `<span class="reasoning">${e.reasoning}</span>` : ''}
</div>
<h3>${e.title}</h3>
<div class="entry-blurb">${e.blurb}</div>
<div class="entry-tags">
${(e.tags || []).map(t => `<span class="entry-tag">${t}</span>`).join('')}
</div>
</div>
`;
}
container.innerHTML = html;
} catch (e) {
container.innerHTML = '<div class="empty"><h2>Error loading entries</h2></div>';
}
}
async function renderDetail(id, container) {
container.innerHTML = '<div class="empty"><h2>Loading...</h2></div>';
try {
const res = await fetch(`/api/entries/${id}`);
if (!res.ok) {
container.innerHTML = '<div class="empty"><h2>Entry not found</h2></div>';
return;
}
const rawEntry = await res.json();
const e = overrideEntry(rawEntry);
container.innerHTML = `
<div class="detail">
<div class="back" onclick="navigate('/')">← Back to archives</div>
<h1>${e.title}</h1>
<div class="meta">
<span>${e.date}</span>
<span class="model">${e.model}</span>
${e.reasoning ? `<span class="reasoning">${e.reasoning}</span>` : ''}
</div>
<div class="desc">${e.description}</div>
${e.highlights ? `
<div class="highlights">
<h3>What makes this a leap</h3>
<ul>${e.highlights.map(h => `<li>${h}</li>`).join('')}</ul>
</div>
` : ''}
<div class="actions">
<a href="${e.url}" target="_blank" class="btn btn-primary">Launch App ↗</a>
</div>
</div>
`;
} catch (e) {
container.innerHTML = '<div class="empty"><h2>Error loading entry</h2></div>';
}
}
function navigate(path) {
location.hash = '#' + path;
}
function dismissIntro() {
const overlay = document.getElementById('intro-overlay');
const content = document.getElementById('main-content');
if (!overlay || overlay.classList.contains('hidden')) return;
overlay.classList.add('hidden');
content.classList.add('visible');
}
document.getElementById('intro-skip')?.addEventListener('click', dismissIntro);
window.addEventListener('hashchange', render);
window.addEventListener('load', () => {
render();
setTimeout(dismissIntro, 3000);
});
|