 Animation Demo | frame=0000 | RUNNING

  update() advances state; mark_dirty() triggers render()

  Spinner:  ⠋ tick() each update

  Progress: ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░   0%

  Counter:  0


 space: pause/resume | r: reset | q: quit
--- frame ---
 Animation Demo | frame=0001 | RUNNING

  update() advances state; mark_dirty() triggers render()

  Spinner:  ⠙ tick() each update

  Progress: █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░   3%

  Counter:  1


 space: pause/resume | r: reset | q: quit
--- frame ---
 Animation Demo | frame=0002 | RUNNING

  update() advances state; mark_dirty() triggers render()

  Spinner:  ⠹ tick() each update

  Progress: ██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░   6%

  Counter:  2


 space: pause/resume | r: reset | q: quit
--- frame ---
 Animation Demo | frame=0003 | RUNNING

  update() advances state; mark_dirty() triggers render()

  Spinner:  ⠸ tick() each update

  Progress: ████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░   9%

  Counter:  3


 space: pause/resume | r: reset | q: quit
--- frame ---
 Animation Demo | frame=0004 | RUNNING

  update() advances state; mark_dirty() triggers render()

  Spinner:  ⠼ tick() each update

  Progress: █████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  12%

  Counter:  4


 space: pause/resume | r: reset | q: quit
--- frame ---
 Animation Demo | frame=0005 | RUNNING

  update() advances state; mark_dirty() triggers render()

  Spinner:  ⠴ tick() each update

  Progress: ██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  15%

  Counter:  5


 space: pause/resume | r: reset | q: quit
--- frame ---
 Animation Demo | frame=0006 | RUNNING

  update() advances state; mark_dirty() triggers render()

  Spinner:  ⠦ tick() each update

  Progress: ███████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  18%

  Counter:  6


 space: pause/resume | r: reset | q: quit
