Skip to main content

Skeleton

Skeleton component can be used directly in your components in place of content that is loading. This tool has the ability to customize loading state of you component. You can read more about Skeleton on the official documentation repository.

Basic Usage

For convenient customization of the loading component, width and height properties are available, you can also set the number of columns in the displayed Skeleton.

() => {
const [isChecked, setChecked] = useState(true);
const handleChange = e => setChecked(e.target.checked);

const exampleTitle = 'Example title';
const exampleDescription = 'Lorem Ipsum is simply dummy text of the printing and typesetting industry. ' +
'Lorem Ipsum has been the industry\'s standard dummy text ever since the 1500s, when an unknown ' +
'printer took a galley of type and scrambled it to make a type specimen book. It has survived not ' +
'only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.';

return (
<>
<Form.Checkbox
className="mb-3"
checked={isChecked}
onChange={handleChange}
>
Show loading state
</Form.Checkbox>
<h3>{isChecked ? <Skeleton /> : exampleTitle}</h3>
{isChecked ? <Skeleton count={4} /> : exampleDescription}
</>
)}

With image

Skeleton is convenient to use with images, including those in a circle format.

() => {
const [isChecked, setChecked] = useState(true);
const handleChange = e => setChecked(e.target.checked);

return (
<>
<Form.Checkbox
className="mb-3"
checked={isChecked}
onChange={handleChange}
>
Show loading state
</Form.Checkbox>
<div>
{isChecked ?
<Skeleton
circle
width={200}
height={200}
/>
: <Image
alt="some image"
roundedCircle
src="https://picsum.photos/200/200/"
/>}
</div>
</>
)}

With custom theme

Skeleton Theme allows you to customize the styles of your nested components in a flexible way. Settings will be passed on to the rest of the Skeleton components in the hierarchy.

() => {
const [isChecked, setChecked] = useState(true);
const handleChange = e => setChecked(e.target.checked);

const exampleTitle = 'Example title with color theme';
const exampleDescription = 'Lorem Ipsum is simply dummy text of the printing and typesetting industry. ' +
'Lorem Ipsum has been the industry\'s standard dummy text ever since the 1500s, when an unknown ' +
'printer took a galley of type and scrambled it to make a type specimen book. It has survived not ' +
'only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.';

return (
<>
<Form.Checkbox
className="mb-3"
checked={isChecked}
onChange={handleChange}
>
Show loading state
</Form.Checkbox>
<SkeletonTheme
baseColor="lightgrey"
highlightColor="darkslategrey"
duration={5}
direction="rtl"
>
<h3>
{isChecked ? <Skeleton /> : exampleTitle}
</h3>
<div>
{isChecked ? <Skeleton count={4} /> : exampleDescription}
</div>
</SkeletonTheme>
</>
)}

With custom wrapper

By wrapping the Skeleton in a container, you can flexibly customize the elements of the skeleton.

() => {
const [isChecked, setChecked] = useState(true);
const handleChange = e => setChecked(e.target.checked);

const exampleTitle = 'Example title with custom wrapper';
const exampleDescription = 'Lorem Ipsum is simply dummy text of the printing and typesetting industry. ' +
'Lorem Ipsum has been the industry\'s standard dummy text ever since the 1500s, when an unknown ' +
'printer took a galley of type and scrambled it to make a type specimen book. It has survived not ' +
'only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.';

const customWrapper = ({ children }) => {
return (
<div
style={{
border: '1px solid #ccc',
display: 'block',
padding: '0.5rem',
marginBottom: '0.2rem',
}}
>
{children}
</div>
)
}

return (
<>
<Form.Checkbox
className="mb-3"
checked={isChecked}
onChange={handleChange}
>
Show loading state
</Form.Checkbox>
<h3>{isChecked ? <Skeleton wrapper={customWrapper} /> : exampleTitle}</h3>
<div>{isChecked ? <Skeleton wrapper={customWrapper} count={3} /> : exampleDescription}</div>
</>
)}