OVERSCANUI KIT
no button at all a worn bezel with weight channels do not converge zero depth instrumented, full of smoke a field of real characters a camera looking out additive, so no shadow hairlines, no new shader no raster, so no scanlines

The line vocabulary moves a mask across the text; this one makes the units arrive. Each character is delayed by --ov-char, its own index. Two traps it has to avoid: splitting a string into spans breaks its accessible name, so the real string is kept in a clipped copy rather than one hidden with visibility or display, both of which remove it from the tree and are how react-bits ended up announcing nothing. And splitting by character is not splitting by glyph, so the split is by grapheme and Thai keeps its marks on their bases. Reload to replay.

demo/text.html, from this page
import 'overscan'
import 'overscan/overscan.css'

<ov-text
  effect="cascade"
  text="REACTOR ONLINE"
></ov-text>
terminal
cascadeunits arrive one at a time, delayed by --ov-char
decodescrambles, then settles left to right on the real character
jitterperpetual, and first to go under reduced motion
cascadeThai. split by grapheme, so the marks stay on their base
variation: effect="decode" text="SECTOR 4 NOMINAL"
import 'overscan'
import 'overscan/overscan.css'

<ov-text
  effect="decode"
  text="SECTOR 4 NOMINAL"
></ov-text>
industrial
cascadeunits arrive one at a time, delayed by --ov-char
decodescrambles, then settles left to right on the real character
jitterperpetual, and first to go under reduced motion
cascadeThai. split by grapheme, so the marks stay on their base
variation: effect="jitter" text="PRESSURE LOSS"
import 'overscan'
import 'overscan/overscan.css'

<ov-text
  effect="jitter"
  text="PRESSURE LOSS"
></ov-text>
cyber
cascadeunits arrive one at a time, delayed by --ov-char
decodescrambles, then settles left to right on the real character
jitterperpetual, and first to go under reduced motion
cascadeThai. split by grapheme, so the marks stay on their base
variation: text="เขต 4 ปกติ"
import 'overscan'
import 'overscan/overscan.css'

<ov-text
  effect="cascade"
  text="เขต 4 ปกติ"
></ov-text>
antiseptic
cascadeunits arrive one at a time, delayed by --ov-char
decodescrambles, then settles left to right on the real character
jitterperpetual, and first to go under reduced motion
cascadeThai. split by grapheme, so the marks stay on their base
esper
cascadeunits arrive one at a time, delayed by --ov-char
decodescrambles, then settles left to right on the real character
jitterperpetual, and first to go under reduced motion
cascadeThai. split by grapheme, so the marks stay on their base
neo
cascadeunits arrive one at a time, delayed by --ov-char
decodescrambles, then settles left to right on the real character
jitterperpetual, and first to go under reduced motion
cascadeThai. split by grapheme, so the marks stay on their base
machina
cascadeunits arrive one at a time, delayed by --ov-char
decodescrambles, then settles left to right on the real character
jitterperpetual, and first to go under reduced motion
cascadeThai. split by grapheme, so the marks stay on their base
holo
cascadeunits arrive one at a time, delayed by --ov-char
decodescrambles, then settles left to right on the real character
jitterperpetual, and first to go under reduced motion
cascadeThai. split by grapheme, so the marks stay on their base
aegis
cascadeunits arrive one at a time, delayed by --ov-char
decodescrambles, then settles left to right on the real character
jitterperpetual, and first to go under reduced motion
cascadeThai. split by grapheme, so the marks stay on their base
vector
cascadeunits arrive one at a time, delayed by --ov-char
decodescrambles, then settles left to right on the real character
jitterperpetual, and first to go under reduced motion
cascadeThai. split by grapheme, so the marks stay on their base