Skeleton

Atom

Animated placeholder shown before content loads. Uses animate-pulse bg-surface-sunken. aria-busy="true" ensures accessibility.

Lines

Preview
Code
<%- include('modules/ui/Skeleton', { variant: 'line', width: 'w-full' }) %>
<%- include('modules/ui/Skeleton', { variant: 'line', width: 'w-3/4' }) %>
<%- include('modules/ui/Skeleton', { variant: 'line', width: 'w-1/2' }) %>

Text block

Preview
Code
<%- include('modules/ui/Skeleton', { variant: 'text', lines: 4 }) %>

Card

Preview
Code
<%- include('modules/ui/Skeleton', { variant: 'card' }) %>

Table rows

Preview
Code

  <%- include('modules/ui/Skeleton', { variant: 'tableRow', cols: 4 }) %>
  <%- include('modules/ui/Skeleton', { variant: 'tableRow', cols: 4 }) %>
  <%- include('modules/ui/Skeleton', { variant: 'tableRow', cols: 4 }) %>

Dashboard layout

Preview
Code
<%# Stat cards + table skeleton %>
<% for (var i = 0; i < 3; i++) { %>
<%- include('modules/ui/Skeleton', { variant: 'line', width: 'w-1/2' }) %> <%- include('modules/ui/Skeleton', { variant: 'line', width: 'w-3/4' }) %> <%- include('modules/ui/Skeleton', { variant: 'line', width: 'w-1/3' }) %>
<% } %>
<%- include('modules/ui/Skeleton', { variant: 'tableRow', cols: 4 }) %>

Article layout

Preview
Code
<%# Blog post / article skeleton %>
<%- include('modules/ui/Skeleton', { variant: 'line', width: 'w-1/4' }) %> <%- include('modules/ui/Skeleton', { variant: 'line', width: 'w-full' }) %> <%- include('modules/ui/Skeleton', { variant: 'line', width: 'w-3/4' }) %>
<%- include('modules/ui/Skeleton', { variant: 'avatar', size: 'sm' }) %> <%- include('modules/ui/Skeleton', { variant: 'line', width: 'w-24' }) %>
<%- include('modules/ui/Skeleton', { variant: 'text', lines: 4 }) %>
Source modules/ui/Skeleton.ejs