--- title: Custom JS transitions --- While you should generally use CSS for transitions as much as possible, there are some effects that can't be achieved without JavaScript, such as a typewriter effect: ```js function typewriter(node, { speed = 50 }) { const valid = ( node.childNodes.length === 1 && node.childNodes[0].nodeType === 3 ); if (!valid) { throw new Error(`This transition only works on elements with a single text node child`); } const text = node.textContent; const duration = text.length * speed; return { duration, tick: t => { const i = ~~(text.length * t); node.textContent = text.slice(0, i); } }; } ```