 Search
components/accordion: Accordion components/button: Button components/badge: Badge components/checkbox: Checkbox components/dialog: Dialog components/input: Input components/popover: Popover components/pre: Pre components/progress: Progress components/radio: Radio components/range: Range components/separator: Separator components/spinner: Spinner components/switch: Switch components/table: Table components/textarea: Textarea components/typography: Typography components/tooltip: Tooltip components/view: View plugins/plugin-nf: Nerd Font Plugin plugins/theme-catppuccin: Catppuccin Theme plugins/theme-gruvbox: Gruvbox Theme plugins/theme-everforest: Everforest Theme plugins/theme-nord: Nord Theme plugins/theme-vitesse: Vitesse Theme start/ascii-boxes: ASCII Boxes start/changelog: Changelog start/plugins: Plugins start/plugins: ## Official Plugins start/plugins: ### Themes start/plugins: ## Community Plugins start/intro: Introduction start/intro: ## Features contributing/contributing: Contributing contributing/contributing: ## Local Development contributing/contributing: ## Issues contributing/contributing: ## Pull Requests contributing/style-guide: Style Guide contributing/style-guide: ## CSS Units contributing/style-guide: ## Selectors contributing/style-guide: ## Documentation plugins/plugin-dev: Developing Plugins plugins/plugin-dev: ### Style Layers start/tuis-vs-guis: TUIs vs GUIs start/tuis-vs-guis: ## Monospace Fonts start/tuis-vs-guis: ## Character Cells installation/vite: Vite installation/nextjs: Next.js start/theming: Theming start/theming: ## CSS Variables start/theming: ### Font Styles start/theming: ### Colors start/theming: ### Light & Dark start/theming: ## Theme Plugins start/theming: ### Using Multiple Theme Accents start/installation: Installation start/installation: ## Installation start/installation: ## Using CSS start/installation: ## Using ESM start/installation: ## Using a CDN start/installation: ## Full Library Import start/installation: ### CSS start/installation: ### ESM start/installation: ### CDN installation/astro: Astro installation/astro: ## Scoping installation/astro: ### Frontmatter Imports installation/astro: ### <style> tag installation/astro: ### Full Library Import

Progress

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'] {
    /* ... */
}