Progress Ring
<sl-progress-ring> | SlProgressRing
Progress rings are used to show the progress of a determinate operation in a circular fashion.
Examples
Basic Progress Ring
<sl-progress-ring value="25"></sl-progress-ring>
sl-progress-ring value="25"
import SlProgressRing from '@teamshares/shoelace/dist/react/progress-ring'; const App = () => <SlProgressRing value="25" />;
Size
Use the --size
custom property to set the diameter of the progress ring.
<sl-progress-ring value="50" style="--size: 200px;"></sl-progress-ring>
sl-progress-ring value="50" style="--size: 200px;"
import SlProgressRing from '@teamshares/shoelace/dist/react/progress-ring'; const App = () => <SlProgressRing value="50" style={{ '--size': '200px' }} />;
Track and Indicator Width
Use the --track-width
and --indicator-width
custom properties to set the width of
the progress ring’s track and indicator.
<sl-progress-ring value="50" style="--track-width: 6px; --indicator-width: 12px;"></sl-progress-ring>
sl-progress-ring value="50" style="--track-width: 6px; --indicator-width: 12px;"
import SlProgressRing from '@teamshares/shoelace/dist/react/progress-ring'; const App = () => <SlProgressRing value="50" style={{ '--track-width': '6px', '--indicator-width': '12px' }} />;
Colors
To change the color, use the --track-color
and --indicator-color
custom
properties.
<sl-progress-ring value="50" style=" --track-color: pink; --indicator-color: deeppink; " ></sl-progress-ring>
sl-progress-ring value="50" style="--track-color: pink; --indicator-color: deeppink;"
import SlProgressRing from '@teamshares/shoelace/dist/react/progress-ring'; const App = () => ( <SlProgressRing value="50" style={{ '--track-color': 'pink', '--indicator-color': 'deeppink' }} /> );
Labels
Use the label
attribute to label the progress ring and tell assistive devices how to announce
it.
<sl-progress-ring value="50" label="Upload progress"></sl-progress-ring>
sl-progress-ring value="50" label="Upload progress"
import SlProgressRing from '@teamshares/shoelace/dist/react/progress-ring'; const App = () => <SlProgressRing value="50" label="Upload progress" />;
Showing Values
Use the default slot to show a label inside the progress ring.
<sl-progress-ring value="50" class="progress-ring-values" style="margin-bottom: .5rem;">50%</sl-progress-ring> <br /> <sl-button circle><sl-icon name="minus" label="Decrease"></sl-icon></sl-button> <sl-button circle><sl-icon name="plus" label="Increase"></sl-icon></sl-button> <script> const progressRing = document.querySelector('.progress-ring-values'); const subtractButton = progressRing.nextElementSibling.nextElementSibling; const addButton = subtractButton.nextElementSibling; addButton.addEventListener('click', () => { const value = Math.min(100, progressRing.value + 10); progressRing.value = value; progressRing.textContent = `${value}%`; }); subtractButton.addEventListener('click', () => { const value = Math.max(0, progressRing.value - 10); progressRing.value = value; progressRing.textContent = `${value}%`; }); </script>
sl-progress-ring.progress-ring-values value="50" style="margin-bottom: .5rem;" 50% br sl-button circle="true" sl-icon name="minus" label="Decrease" sl-button circle="true" sl-icon name="plus" label="Increase" javascript: const progressRing = document.querySelector(.progress-ring-values); const subtractButton = progressRing.nextElementSibling.nextElementSibling; const addButton = subtractButton.nextElementSibling; addButton.addEventListener(click, () => { const value = Math.min(100, progressRing.value + 10); progressRing.value = value; progressRing.textContent = `${value}%`; }); subtractButton.addEventListener(click, () => { const value = Math.max(0, progressRing.value - 10); progressRing.value = value; progressRing.textContent = `${value}%`; });
import { useState } from 'react'; import SlButton from '@teamshares/shoelace/dist/react/button'; import SlIcon from '@teamshares/shoelace/dist/react/icon'; import SlProgressRing from '@teamshares/shoelace/dist/react/progress-ring'; const App = () => { const [value, setValue] = useState(50); function adjustValue(amount) { let newValue = value + amount; if (newValue < 0) newValue = 0; if (newValue > 100) newValue = 100; setValue(newValue); } return ( <> <SlProgressRing value={value} style={{ marginBottom: '.5rem' }}> {value}% </SlProgressRing> <br /> <SlButton circle onClick={() => adjustValue(-10)}> <SlIcon name="minus" label="Decrease" /> </SlButton> <SlButton circle onClick={() => adjustValue(10)}> <SlIcon name="plus" label="Increase" /> </SlButton> </> ); };
Component Props
Property | Default | Details |
---|---|---|
value
|
0
|
The current progress as a percentage, 0 to 100. |
label
|
''
|
A custom label for assistive devices. |
updateComplete
|
A read-only promise that resolves when the component has finished updating. |
Learn more about attributes and properties.
Slots
Name | Details |
---|---|
(default) | A label to show inside the ring. |
Learn more about using slots.
Custom Properties
Name | Details |
---|---|
--size
|
The diameter of the progress ring (cannot be a percentage). |
--track-width
|
The width of the track. |
--track-color
|
The color of the track. |
--indicator-width
|
The width of the indicator. Defaults to the track width. |
--indicator-color
|
The color of the indicator. |
--indicator-transition-duration
|
The duration of the indicator’s transition when the value changes. |
Learn more about customizing CSS custom properties.
CSS Parts
Name | Description |
---|---|
base
|
The component’s base wrapper. |
label
|
The progress ring label. |
Learn more about customizing CSS parts.