Outline
Use `variant="outline"` to create a bordered empty state.
Cloud Storage Empty
Upload files to your cloud storage to access them anywhere.
Icons by @ng-icons/tabler-icons
The component library does not provide icons.
Composable empty states with media, title, description, actions, inputs, avatars, and RTL support.
Preview
You haven't created any projects yet. Get started by creating your first project.
TS
import { FrEmptyModule } from '@frame-ui-ng/components/empty';
import { FrButtonModule } from '@frame-ui-ng/components/button';HTML
<div frEmpty>
<div frEmptyHeader>
<div frEmptyMedia variant="icon">
<ng-icon name="tablerFolderCode" />
</div>
<h3 frEmptyTitle>No data</h3>
<p frEmptyDescription>No data found.</p>
</div>
<div frEmptyContent>
<button frButton type="button">Add data</button>
</div>
</div>Use `variant="outline"` to create a bordered empty state.
Upload files to your cloud storage to access them anywhere.
Use `variant="soft"` or local token overrides to add a subtle background.
You're all caught up. New notifications will appear here.
Use EmptyMedia to display an avatar inside the empty state.
This user is currently offline. You can leave a message or try again later.
Use EmptyMedia to display an avatar group when the empty state refers to people or teams.
Invite your team to collaborate on this project.
Place inputs, search fields, or compact forms inside EmptyContent.
The page you're looking for doesn't exist. Try searching below.
Empty states inherit text direction from their container.
لم تقم بإنشاء أي مشاريع بعد. ابدأ بإنشاء مشروعك الأول.
Inspect the empty state shell, header, media, title, description, and action content.
You haven't created any projects yet. Get started by creating your first project.
Empty tokens style the root layout, media well, copy, and action spacing while leaving nested components like Button, Input, and Avatar to their own token contracts.
SCSS
--frame-empty-padding: 3rem 1.5rem;
--frame-empty-gap: 1.5rem;
--frame-empty-radius: var(--frame-radius-lg);
--frame-empty-border: transparent;
--frame-empty-bg: transparent;
--frame-empty-color: var(--frame-foreground);
--frame-empty-outline-border: var(--frame-border);
--frame-empty-soft-bg: var(--frame-muted);
--frame-empty-header-gap: 0.75rem;
--frame-empty-content-gap: 0.75rem;
--frame-empty-media-size: 3rem;
--frame-empty-media-radius: var(--frame-radius-lg);
--frame-empty-media-bg: var(--frame-muted);
--frame-empty-media-color: var(--frame-muted-foreground);
--frame-empty-media-icon-size: 1.5rem;
--frame-empty-title-color: var(--frame-foreground);
--frame-empty-title-font-size: 1rem;
--frame-empty-title-font-weight: 600;
--frame-empty-description-color: var(--frame-muted-foreground);
--frame-empty-description-font-size: 0.875rem;
--frame-empty-description-max-width: 32rem;