# Getting Started
`loaders` gives you three main building blocks: `ProgressBar` for measured work,
`Spinner` for indeterminate work, and `MultiProgress` for several bars rendered as one
terminal block.
## Add the Dependency
```toml
[dependencies]
loaders = "0.0.0"
```
## First Progress Bar
```rust
use loaders::ProgressBar;
fn main() {
let pb = ProgressBar::new(3);
for _ in 0..3 {
pb.inc(1);
}
pb.finish_with_message("done");
}
```
## First Spinner
```rust
use loaders::{Spinner, spinner::frames::DOTS};
use std::time::Duration;
fn main() {
let spinner = Spinner::new_with_interval(&DOTS, Duration::from_millis(80));
spinner.start_with_message("connecting");
spinner.stop_with_message("connected");
}
```
## Iterator Usage
```rust
use loaders::ProgressIterator;
fn main() {
let sum: u64 = (0..100u64).progress().sum();
println!("{sum}");
}
```
## Which Type Should I Use?
Use `ProgressBar` when there is a count, byte total, or step count. Use `Spinner`
when work is happening but a total is unknown. Use `MultiProgress` when multiple
threads or phases should be visible together.
## Draw Targets and Hidden Bars
Progress output defaults to stderr. `DrawTarget::hidden()` suppresses terminal output and
is the recommended target in tests. Non-TTY streams receive newline snapshots instead of
ANSI cursor movement, which keeps pipes and logs readable. CI and `NO_COLOR` environments
avoid color escape sequences.