Displays a progress bar
Note: The progress bar component automatically rounds the progress display value to the nearest character width
| 1 |
<div is-="progress" style="--progress-value:50;">50%</div> |
| 2 |
<div is-="progress" style="--progress-value:25;">25%</div> |
Import
@import '@webtui/css/components/progress.css';
Usage
Unfortunately, due to gecko-based browsers not supporting modern attr() usage, you have to use CSS variables for controlling the progress value.
<div is-="progress" style="--progress-value: 50;">50%</div>
<div is-="progress" style="--progress-value: 2; --progress-max: 5;">2/5</div>
To dynamically update the progress value with JavaScript:
document
.getElementById('my-progress-element')
.style.setProperty('--progress-max', '100')
document
.getElementById('my-progress-element')
.style.setProperty('--progress-value', '50')
Examples
Color
| 1 |
<div is-="progress" style="--progress-value:50;--progress-max:100" id="red">50%</div> |
| 2 |
<div is-="progress" style="--progress-value:40;--progress-max:100" id="green">40%</div> |
| 3 |
<div is-="progress" style="--progress-value:30;--progress-max:100" id="blue">30%</div> |
| 4 |
<div is-="progress" style="--progress-value:20;--progress-max:100; --progress-value-background: orange">20%</div> |
| 1 |
|
| 2 |
#red { |
| 3 |
--progress-value-background: red; |
| 4 |
--progress-empty-background: grey; |
| 5 |
} |
| 6 |
#green { |
| 7 |
--progress-value-background: green; |
| 8 |
--progress-empty-background: white; |
| 9 |
} |
| 10 |
#blue { |
| 11 |
--progress-value-background: blue; |
| 12 |
} |
| 13 |
|
Text content
| 1 |
<div is-="progress" style="--progress-value:75;" id="one">75%</div> |
| 2 |
<div is-="progress" style="--progress-value:50;" id="two">50%</div> |
| 3 |
<div is-="progress" style="--progress-value:25;" id="three">50%</div> |
| 1 |
|
| 2 |
#one { |
| 3 |
--progress-value-background: transparent; |
| 4 |
--progress-value-color: var(--foreground0); |
| 5 |
--progress-value-content: '========================'; |
| 6 |
--progress-empty-background: transparent; |
| 7 |
--progress-empty-color: var(--foreground0); |
| 8 |
--progress-empty-content: ''; |
| 9 |
max-width: 24ch; |
| 10 |
} |
| 11 |
#two { |
| 12 |
--progress-value-background: transparent; |
| 13 |
--progress-value-color: var(--foreground0); |
| 14 |
--progress-value-content: '########################'; |
| 15 |
--progress-empty-background: transparent; |
| 16 |
--progress-empty-color: var(--foreground0); |
| 17 |
--progress-empty-content: '........................'; |
| 18 |
max-width: 24ch; |
| 19 |
} |
| 20 |
#three { |
| 21 |
--progress-value-background: transparent; |
| 22 |
--progress-value-color: var(--foreground0); |
| 23 |
--progress-value-content: '████████████████████████'; |
| 24 |
--progress-empty-background: transparent; |
| 25 |
--progress-empty-color: var(--foreground0); |
| 26 |
--progress-empty-content: ''; |
| 27 |
max-width: 24ch; |
| 28 |
} |
| 29 |
|
Hybrid
| 1 |
<div is-="progress" style="--progress-value:25;" id="one">25%</div> |
| 2 |
<div is-="progress" style="--progress-value:50;" id="two">50%</div> |
| 3 |
<div is-="progress" style="--progress-value:75;" id="three">75%</div> |
| 1 |
|
| 2 |
#one { |
| 3 |
--progress-value-background: var(--background2); |
| 4 |
--progress-value-color: var(--foreground0); |
| 5 |
--progress-value-content: 'OOOOOOOOOOOOOOOOOOOOOOOO'; |
| 6 |
--progress-empty-background: var(--background1); |
| 7 |
--progress-empty-color: var(--foreground0); |
| 8 |
--progress-empty-content: '........................'; |
| 9 |
max-width: 24ch; |
| 10 |
} |
| 11 |
#two { |
| 12 |
--progress-value-background: red; |
| 13 |
--progress-value-color: var(--foreground0); |
| 14 |
--progress-value-content: '()()()()()()()()()()()()'; |
| 15 |
--progress-empty-background: transparent; |
| 16 |
--progress-empty-color: var(--foreground0); |
| 17 |
--progress-empty-content: ''; |
| 18 |
max-width: 24ch; |
| 19 |
} |
| 20 |
#three { |
| 21 |
--progress-value-background: var(--foreground2); |
| 22 |
--progress-value-color: var(--foreground0); |
| 23 |
--progress-value-content: '>>>>>>>>>>>>>>>>>>>>>>>>'; |
| 24 |
--progress-empty-background: var(--background2); |
| 25 |
--progress-empty-color: var(--foreground0); |
| 26 |
--progress-empty-content: '------------------------'; |
| 27 |
max-width: 24ch; |
| 28 |
} |
| 29 |
|
Reference
Properties
--progress-value: The current progress value (defaults to 0). Typically this is dynamically set by JavaScript
--progress-max: The maximum progress value (defaults to 100)
--progress-value-background: The background color of the progress value bar
--progress-value-color: The text color of the progress value bar
--progress-value-content: The text content of the progress value bar
--progress-empty-background: The background color of the remaining empty space in the progress bar
--progress-empty-color: The text color of the remaining empty space in the progress bar
--progress-empty-content: The text content of the remaining empty space in the progress bar
Important: Since CSS doesn’t have a way to arbitrarily repeat text a number of times, you will have to repeat a character an arbitrary amount of times for --progress-value-content or --progress-empty-content
progress {
--progress-value: 50;
--progress-max: 100;
--progress-value-background: var(--background2);
--progress-value-color: var(--foreground0);
--progress-value-content: '[#######################';
--progress-empty-background: var(--background1);
--progress-empty-color: var(--foreground0);
--progress-empty-content: '.......................]';
}
Extending
To extend the Progress stylesheet, define a CSS rule on the components layer
@layer components {
[is-~='progress'] {
&[variant='yarn'] {
--progress-value-content: '[#######################';
--progress-empty-content: '.......................]';
}
&[variant='npm'] {
--progress-value-content: '[████████████████████';
--progress-empty-content: '░░░░░░░░░░░░░░░░░░░░]';
}
/* ... */
}
}
Scope
[is-~='progress'] {
/* ... */
}