How to do a marquee in BB?

Hey,
Pretty much the question in the title. But if you have any alternative that are easy to integrate it would be great.

All the best,

This is my website: howickcatholic.org.nz - courtesy of Claude :slightly_smiling_face:

If this is what you want, paste the following into a HTML module: -

.scrolling-line { position: fixed; bottom: 0; left: 0; width: 100%; background: #fff8e1; border-top: 2px solid #e6b800; color: black; overflow: hidden; z-index: 9999; padding: 6px 0; } .ticker-track { display: inline-flex; white-space: nowrap; padding: 4px 0; font-size: 1.1em; }
  Welcome to our parish website  ยทยทยทยทยท     ยทยทยทยทยท  Next Alpha programme starts 2 August โ€“ sign up now  ยทยทยทยทยท     ยทยทยทยทยท  Visit the parish Noticeboard  ยทยทยทยทยท     ยทยทยทยทยท  Pope Leo has issued a document about AI โ€“ see Noticeboard.  Also his life story there ยทยทยทยทยท    
 ยทยทยทยทยท
  
</span>
<span class="ticker-copy">
   &nbsp;&nbsp;Welcome to our parish website &nbsp;ยทยทยทยทยท&nbsp;&nbsp;&nbsp;&nbsp;
  <span style="color:red;">ยทยทยทยทยท &nbsp;Next Alpha programme starts 2 August โ€“ sign up now &nbsp;ยทยทยทยทยท&nbsp;&nbsp;&nbsp;&nbsp;</span>
  ยทยทยทยทยท &nbsp;Visit the parish Noticeboard &nbsp;ยทยทยทยทยท&nbsp;&nbsp;&nbsp;&nbsp;
  <span style="color:red;">ยทยทยทยทยท &nbsp;Pope Leo has issued a document about AI โ€“ see Noticeboard.&nbsp;&nbsp; Also his life story there ยทยทยทยทยท&nbsp;&nbsp;&nbsp;&nbsp;</span>
</span>
(function () { const track = document.getElementById('ticker-track'); const copy = track.querySelector('.ticker-copy'); const pauseMs = 2500; const speed = 100;

let offset; // how far weโ€™ve scrolled (px). negative = text still coming in from right
let copyWidth;
let lastTime = null;
let pauseUntil = 0;
let initialized = false;

function init() {
copyWidth = copy.offsetWidth;
const containerWidth = track.parentElement.offsetWidth;
offset = -containerWidth; // start with text just off the right edge
initialized = true;
requestAnimationFrame(step);
}

function step(timestamp) {
if (!initialized) return;
if (!lastTime) lastTime = timestamp;

const now = timestamp;

if (now < pauseUntil) {
  // Still pausing โ€” hold position, keep rAF alive
  lastTime = now;
  requestAnimationFrame(step);
  return;
}

const delta = (now - lastTime) / 1000;
lastTime = now;

const prevOffset = offset;
offset += speed * delta;

// Did we cross zero this frame? (text start arriving at left edge)
if (prevOffset < 0 && offset >= 0) {
  offset = 0;
  pauseUntil = now + pauseMs;
  track.style.transform = 'translateX(0px)';
  requestAnimationFrame(step);
  return;
}

// Seamless loop: once past one full copy, wrap back
if (offset >= copyWidth) {
  const prevWas = offset;
  offset -= copyWidth;
  // If the wrap itself crossed zero, pause
  if (prevWas >= copyWidth && offset >= 0 && offset < speed / 30) {
    offset = 0;
    pauseUntil = now + pauseMs;
    track.style.transform = 'translateX(0px)';
    requestAnimationFrame(step);
    return;
  }
}

track.style.transform = 'translateX(' + (-offset) + 'px)';
requestAnimationFrame(step);

}

setTimeout(init, 300);
})();

Formidable !
Best from France