Skip to content

Commit 9599f55

Browse files
committed
Show HTML posters in poster carousel
1 parent 85ed6e3 commit 9599f55

1 file changed

Lines changed: 67 additions & 35 deletions

File tree

templates/poster.html

Lines changed: 67 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -70,37 +70,52 @@
7070
.nav-tab:hover { color: var(--text); }
7171
.nav-tab.active { color: var(--coffee); border-bottom-color: var(--coffee); }
7272

73-
/* ── Slideshow container ── */
73+
/* ── Poster stage ── */
7474
.slideshow-wrap {
7575
flex: 1;
7676
display: flex;
7777
flex-direction: column;
7878
align-items: center;
79-
justify-content: center;
79+
justify-content: flex-start;
8080
position: relative;
81-
padding: 0 3rem;
81+
padding: 1.4rem 3rem 0;
8282
overflow: hidden;
8383
}
8484

8585
.slideshow-stage {
8686
position: relative;
8787
width: 100%;
88-
max-width: 1100px;
88+
max-width: min(1600px, calc((100svh - 190px) * 16 / 9));
8989
flex: 1;
9090
display: flex;
9191
align-items: center;
9292
justify-content: center;
9393
min-height: 0;
9494
}
9595

96-
.slide-img {
97-
max-width: 100%;
98-
max-height: 68vh;
99-
object-fit: contain;
96+
.poster-frame-wrap {
97+
width: 100%;
98+
aspect-ratio: 16 / 9;
99+
background: var(--surface);
100+
border: 1px solid var(--border2);
100101
border-radius: 6px;
101102
box-shadow: 0 4px 20px rgba(0,0,0,0.10);
102-
transition: opacity 0.3s ease;
103-
cursor: default;
103+
overflow: hidden;
104+
}
105+
106+
.poster-frame {
107+
width: 100%;
108+
height: 100%;
109+
border: 0;
110+
display: block;
111+
background: var(--surface);
112+
}
113+
114+
.slide-img {
115+
width: 100%;
116+
height: 100%;
117+
object-fit: contain;
118+
display: block;
104119
}
105120

106121
/* ── Nav arrows ── */
@@ -155,6 +170,16 @@
155170
transition: all 0.15s;
156171
}
157172
.open-poster:hover { background: var(--accent); color: #fff; }
173+
.poster-select {
174+
max-width: min(46vw, 520px);
175+
border: 1px solid var(--border2);
176+
border-radius: 3px;
177+
background: var(--surface);
178+
color: var(--text);
179+
font-family: "JetBrains Mono", monospace;
180+
font-size: 0.72rem;
181+
padding: 0.35rem 0.6rem;
182+
}
158183
.dot {
159184
width: 8px; height: 8px;
160185
border-radius: 50%;
@@ -194,19 +219,18 @@
194219
header { padding: 1rem 1.2rem; }
195220
.nav-tabs { padding: 0 1.2rem; overflow-x: auto; }
196221
.nav-tab { flex: 0 0 auto; }
197-
.slideshow-wrap { padding: 0 0.75rem; justify-content: flex-start; }
198-
.slideshow-stage { align-items: flex-start; padding-top: 0.75rem; }
199-
.arrow { width: 36px; height: 36px; font-size: 1rem; }
200-
.arrow-left { left: 0; }
201-
.arrow-right { right: 0; }
202-
.slide-img {
203-
width: min(100%, 430px);
204-
max-height: calc(100svh - 185px);
205-
aspect-ratio: 9 / 16;
206-
object-fit: contain;
207-
border-radius: 8px;
222+
.slideshow-wrap { padding: 0.8rem 0.75rem 0; justify-content: flex-start; }
223+
.slideshow-stage {
224+
align-items: flex-start;
225+
width: 100%;
226+
max-width: 100%;
227+
flex: 0 0 auto;
208228
}
229+
.arrow { width: 36px; height: 36px; font-size: 1rem; }
230+
.arrow-left { left: 0.25rem; }
231+
.arrow-right { right: 0.25rem; }
209232
.slideshow-bar { padding: 0.8rem 0 1rem; flex-wrap: wrap; }
233+
.poster-select { max-width: 100%; width: 100%; order: 3; }
210234
}
211235
</style>
212236
</head>
@@ -232,11 +256,12 @@
232256
<div class="slideshow-wrap" id="slideshow-wrap" style="display:none;">
233257
<div class="slideshow-stage">
234258
<button class="arrow arrow-left" id="arrow-left" onclick="prevSlide()" title="上一张 (←)"></button>
235-
<img class="slide-img" id="slide-img" src="" alt="poster" />
259+
<div class="poster-frame-wrap" id="poster-frame-wrap"></div>
236260
<button class="arrow arrow-right" id="arrow-right" onclick="nextSlide()" title="下一张 (→)"></button>
237261
</div>
238262
<div class="slideshow-bar">
239263
<span class="slide-counter" id="slide-counter"></span>
264+
<select class="poster-select" id="poster-select" onchange="showSlide(Number(this.value))"></select>
240265
<div class="dots-wrap" id="dots-wrap"></div>
241266
<a class="open-poster" id="open-poster" href="#" target="_self">打开当前海报 →</a>
242267
</div>
@@ -262,16 +287,21 @@
262287
function showSlide(idx) {
263288
if (!images.length) return;
264289
currentIdx = ((idx % images.length) + images.length) % images.length;
265-
const img = document.getElementById('slide-img');
266-
img.src = images[currentIdx].url;
267-
img.alt = images[currentIdx].name;
290+
const current = images[currentIdx];
291+
const wrap = document.getElementById('poster-frame-wrap');
292+
if (current.poster_url) {
293+
wrap.innerHTML = `<iframe class="poster-frame" src="${current.poster_url}" title="${current.name || 'poster'}"></iframe>`;
294+
} else {
295+
wrap.innerHTML = `<img class="slide-img" src="${current.url}" alt="${current.name || 'poster'}">`;
296+
}
268297

269298
// Counter
270299
document.getElementById('slide-counter').textContent =
271300
`${currentIdx + 1} / ${images.length}`;
301+
document.getElementById('poster-select').value = String(currentIdx);
272302
const openLink = document.getElementById('open-poster');
273-
if (images[currentIdx].poster_url) {
274-
openLink.href = images[currentIdx].poster_url;
303+
if (current.poster_url) {
304+
openLink.href = current.poster_url;
275305
openLink.style.display = 'inline-block';
276306
} else {
277307
openLink.style.display = 'none';
@@ -287,6 +317,15 @@
287317
});
288318
}
289319

320+
function renderSelect() {
321+
const select = document.getElementById('poster-select');
322+
select.innerHTML = images.map((img, i) => {
323+
const label = img.arxiv_id ? `arXiv:${img.arxiv_id}` : img.name || `Poster ${i + 1}`;
324+
return `<option value="${i}">${label}</option>`;
325+
}).join('');
326+
select.style.display = images.length > 1 ? 'inline-block' : 'none';
327+
}
328+
290329
function renderDots() {
291330
const wrap = document.getElementById('dots-wrap');
292331
if (images.length <= 1) { wrap.innerHTML = ''; return; }
@@ -330,6 +369,7 @@
330369

331370
document.getElementById('empty-state').style.display = 'none';
332371
document.getElementById('slideshow-wrap').style.display = 'flex';
372+
renderSelect();
333373
renderDots();
334374
showSlide(0);
335375
} catch (e) {
@@ -356,14 +396,6 @@
356396
else prevSlide();
357397
});
358398

359-
// ── Click left/right half of image ──
360-
document.getElementById('slide-img').addEventListener('click', (e) => {
361-
const rect = e.target.getBoundingClientRect();
362-
const x = e.clientX - rect.left;
363-
if (x < rect.width / 2) prevSlide();
364-
else nextSlide();
365-
});
366-
367399
document.addEventListener('DOMContentLoaded', loadPosters);
368400
window.addEventListener('resize', () => showSlide(currentIdx));
369401
</script>

0 commit comments

Comments
 (0)