Scrolling text: vertical direction option (up / down) in addition to horizontal

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
lucianoandClaude Opus 4.8 committed 2026-06-19 17:01:40 +02:00
1 parent 50b4223100
commit 4604b42f8f
4 files changed
+42 -1

No files matched your search

+6
View File
@@ -252,6 +252,12 @@
<option value="middle">Centro</option>
</select>
</div>
<label>Direzione</label>
<select id="ticker-dir">
<option value="h">➡️ Orizzontale</option>
<option value="vup">⬆️ Verticale (su)</option>
<option value="vdown">⬇️ Verticale (giù)</option>
</select>
<label>Velocità testo <span id="ticker-speed-val">1.0×</span></label>
<input type="range" id="ticker-speed" min="0.2" max="4" step="0.1" value="1" />
<label>Carattere</label>
+1
View File
@@ -525,6 +525,7 @@ $('#video-blend').addEventListener('change', (e) => send({ type: 'videoBlend', v
$('#ticker-text').addEventListener('input', (e) => send({ type: 'tickerText', text: e.target.value.replace(/\s*\n\s*/g, ' · ') }));
$('#ticker-on').addEventListener('change', (e) => send({ type: 'tickerOn', on: e.target.checked }));
$('#ticker-pos').addEventListener('change', (e) => send({ type: 'tickerPos', pos: e.target.value }));
$('#ticker-dir').addEventListener('change', (e) => send({ type: 'tickerDir', value: e.target.value }));
$('#ticker-speed').addEventListener('input', (e) => {
const m = parseFloat(e.target.value);
$('#ticker-speed-val').textContent = m.toFixed(1) + '×';
+5
View File
@@ -247,6 +247,7 @@ function setTickerText(t) { const h = buildLetters(t); tickCopies.forEach(c => c
function setTickerSpeed(m) { tickerTrack.style.setProperty('--ticker-dur', (18 / m) + 's'); }
function tickerLetters() { return tickerTrack.querySelectorAll('.tl'); }
ticker.classList.add('pos-bottom');
ticker.classList.add('dir-h');
setTickerSpeed(1);
function hideHint() { $('#drop-hint').classList.add('hidden'); }
@@ -382,6 +383,10 @@ djv.onControl(async (m) => {
ticker.classList.add('pos-' + m.pos);
break;
case 'tickerSpeed': setTickerSpeed(m.mult); break;
case 'tickerDir':
ticker.classList.remove('dir-h', 'dir-vup', 'dir-vdown');
ticker.classList.add('dir-' + m.value);
break;
case 'tickerFont': tickerTrack.style.fontFamily = m.value; break;
case 'tickerSize': tickerTrack.style.fontSize = m.value + 'vh'; break;
case 'tickerWeight': tickerTrack.style.fontWeight = m.on ? '800' : '400'; break;
+30 -1
View File
@@ -484,9 +484,38 @@ body.output { cursor: none; background: #000; }
font-weight: 800;
color: #fff;
text-transform: uppercase;
animation: ticker-scroll var(--ticker-dur, 18s) linear infinite;
}
.tick-copy { display: inline-flex; padding: 0 2vw; }
/* Horizontal scroll (default) */
#ticker.dir-h #ticker-track {
animation: ticker-scroll var(--ticker-dur, 18s) linear infinite;
}
/* Vertical scroll: full-height column, the two copies stacked and scrolling */
#ticker.dir-vup, #ticker.dir-vdown {
top: 0 !important;
bottom: 0 !important;
height: 100vh;
padding: 0;
background: none;
transform: none !important;
}
#ticker.dir-vup.show, #ticker.dir-vdown.show {
display: flex;
align-items: flex-start;
justify-content: center;
}
#ticker.dir-vup #ticker-track, #ticker.dir-vdown #ticker-track {
flex-direction: column;
align-items: center;
white-space: nowrap;
}
#ticker.dir-vup .tick-copy, #ticker.dir-vdown .tick-copy { padding: 32vh 0; }
#ticker.dir-vup #ticker-track { animation: ticker-scroll-vup var(--ticker-dur, 18s) linear infinite; }
#ticker.dir-vdown #ticker-track { animation: ticker-scroll-vdown var(--ticker-dur, 18s) linear infinite; }
@keyframes ticker-scroll-vup { from { transform: translateY(0); } to { transform: translateY(-50%); } }
@keyframes ticker-scroll-vdown { from { transform: translateY(-50%); } to { transform: translateY(0); } }
.tl {
display: inline-block;
white-space: pre;