1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//! Animated spinner frames for the TUI loader (issue #187).
//!
//! Pure state — no I/O, no `App` dependency. The event loop advances it
//! from the same 200 ms poll cadence that drives the confirm-countdown
//! tick (`src/tui/state/confirm.rs`), and the renderer reads
//! [`Spinner::glyph`] for the current frame. Patterned on the `Spinner`
//! component from [`ratatui-cheese`](https://github.com/shashanktomar/ratatui-cheese)
//! (the braille "dot" cycle).
//!
//! Honest scope: the animation only advances while the event loop keeps
//! ticking. That is the case during the armed confirm countdown (the
//! 200 ms poll re-enters every tick), so the loader animates there. A
//! blocking `gh` shell-out does not yield to the loop, so it cannot
//! animate mid-call without moving the work off-thread — out of scope
//! for this polish pass.
/// Braille "dot" spinner frames — the default loader animation.
pub const DOT_FRAMES: & = &;
/// A frame cursor over a spinner animation. `Default` starts at frame 0.