Components

Skeleton

Placeholder loaders for content, grids, and tables.

Three skeleton loaders: UiBaseSkeleton (a single shimmer block), UiGridSkeleton (card grid), and UiTableSkeleton (table rows).

Base skeleton

<template>
  <UiBaseSkeleton width="100%" height="1.25rem" />
  <UiBaseSkeleton variant="thumbnail" size="lg" />
  <UiBaseSkeleton width="64px" height="64px" rounded />
</template>

Grid skeleton

<template>
  <UiGridSkeleton :skeleton-grid-items="8" card-variant="pane" />
</template>

Table skeleton

UiTableSkeleton renders a <tbody>, so place it inside a table. UiDatatable renders one for you while is-loading is set.

<template>
  <table class="table">
    <UiTableSkeleton :skeleton-rows="8" :skeleton-cols="5" />
  </table>
</template>

UiBaseSkeleton props

PropTypeDefaultDescription
size'sm' | 'md' | 'lg''md'Size token.
variant'default' | 'thumbnail' | 'ai-generation' | 'shimmer''default'Visual style.
width / heightstring | number—Explicit dimensions. Numbers are pixels.
roundedbooleanfalseFully rounded.
customClassstring | string[] | null—Extra classes.
skeletonStylesStyleValue—Inline styles, merged with width / height.
rolestring'status'ARIA role.
ariaLabelstring'Loading content'Accessible name.
ariaLive'off' | 'polite' | 'assertive''polite'Live-region politeness.

UiGridSkeleton props

PropTypeDefaultDescription
skeletonGridItemsnumber12Number of placeholder cards.
gridLayoutClassesstring | string[]—Grid layout classes.
cardVariantstring'pane'Card surface.
showFooterbooleantrueRender a card footer skeleton.
rolestring'status'ARIA role.
ariaLabelstring'Loading content grid'Accessible name.
ariaLive'off' | 'polite' | 'assertive''polite'Live-region politeness.

UiTableSkeleton props

PropTypeDefaultDescription
skeletonRowsnumber12Placeholder rows.
skeletonColsnumber5Placeholder columns.
isExpanded / skeletonColExpandedboolean / numberfalse / 7When expanded, renders skeletonColExpanded columns instead of skeletonCols.
customClassstring | string[] | null—Extra classes.
skeletonStylesStyleValue—Inline styles for the <tbody>.
rolestring'status'ARIA role.
ariaLabelstring'Loading table data'Accessible name.
ariaLive'off' | 'polite' | 'assertive''polite'Live-region politeness.
UiDatatable uses these automatically via its is-loading prop — see Datatable.

CSS variables

Set these on :root or on a wrapper. The shimmer highlight follows the color, and the AI-generation skeleton keeps its larger corners.

VariableDefaultControls
--cffy-skeleton-color--cffy-muted-a10Placeholder color (and shimmer)
--cffy-skeleton-radius--cffy-radius-mdPlaceholder corners
Copyright © 2026