Renders a skeleton loader, a placeholder for content that is in the process of loading.
It mimics the layout of the actual content, providing a better user experience during loading phases.
Render one of the primitive types in isolation:
<.skeleton type="text_line" />
Combine primitives for complex layouts:
<div class="card-skeleton" aria-busy="true">
<.skeleton type="image" />
<.skeleton type="text-line" />
<.skeleton type="text-line" />
<.skeleton type="text-line" />
<.skeleton type="rectangle" />
</div>
To modify the primitives for your use cases, you can either configure additional modifiers or use CSS properties:
<Doggo.skeleton type="text-line" variant="header" />
<Doggo.skeleton type="image" style="--aspect-ratio: 75%;" />
When using skeleton loaders, apply aria-busy="true"
to the container
element that contains the skeleton layout. For standalone use, add the
attribute directly to the individual skeleton loader.
The easiest way to load data asynchronously and render a skeleton loader is
to use LiveView’s
async operations
and Phoenix.Component.async_result/1
.
Assuming you defined a card skeleton component as described above:
<.async_result :let={puppy} assign={@puppy}>
<:loading><.card_skeleton /></:loading>
<:failed :let={_reason}>There was an error loading the puppy.</:failed>
<!-- Card for loaded content -->
</.async_result>
<.skeleton type="text-line"/> <.skeleton type="text-block"/> <.skeleton type="image"/> <.skeleton type="circle"/> <.skeleton type="rectangle"/> <.skeleton type="square"/>