You haven't created any projects yet. Get started by creating your first project.
Empty
Empty state for searches, lists and dashboards — media slot, title, muted description and action in a centered column.
INSTALL
1pnpm dlx @sayagodev/mo add emptyOr import the files from the package (no copy):
1import "@sayagodev/mo/css/empty.css";EXAMPLES
You haven't created any projects yet. Get started by creating your first project.
1<div data-empty>2 <div data-empty-header>3 <div data-empty-media data-variant="icon">4 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">5 <path d="m10 13-2 2 2 2" />6 <path d="m14 17 2-2-2-2" />7 <path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z" />8 </svg>9 </div>10 <div data-empty-title>No projects yet</div>11 <p data-empty-description>You haven't created any projects yet. Get started by creating your first project.</p>12 </div>13 <div data-empty-content>14 <div class="hstack justify-center gap-2">15 <button type="button">Create Project</button>16 <button type="button" class="outline">Import Project</button>17 </div>18 </div>19</div>20
Upload files to your cloud storage to access them anywhere.
1<div data-empty data-variant="outline">2 <div data-empty-header>3 <div data-empty-media data-variant="icon">4 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">5 <path d="M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z" />6 </svg>7 </div>8 <div data-empty-title>Cloud Storage Empty</div>9 <p data-empty-description>Upload files to your cloud storage to access them anywhere.</p>10 </div>11 <div data-empty-content>12 <button type="button" class="outline small">Upload Files</button>13 </div>14</div>15
1<article class="card">2 <div data-empty>3 <div data-empty-header>4 <div data-empty-media data-variant="icon">5 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">6 <path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z" />7 </svg>8 </div>9 <div data-empty-title>No projects yet</div>10 <p data-empty-description>You haven't created any projects yet. Get started by creating your first project.</p>11 </div>12 <div data-empty-content>13 <div class="hstack justify-center gap-2">14 <button type="button">Create project</button>15 <button type="button" class="outline">Import project</button>16 </div>17 <button type="button" class="link small text-lighter">18 Learn more19 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">20 <path d="M7 7h10v10" />21 <path d="M7 17 17 7" />22 </svg>23 </button>24 </div>25 </div>26</article>27
This user is currently offline. You can leave a message to notify them or try again later.
1<div data-empty>2 <div data-empty-header>3 <div data-empty-media>4 <figure data-variant="avatar" class="large">5 <img src="https://avatar.vercel.sh/shadcn1" alt="@shadcn" />6 </figure>7 </div>8 <div data-empty-title>User Offline</div>9 <p data-empty-description>This user is currently offline. You can leave a message to notify them or try again later.</p>10 </div>11 <div data-empty-content>12 <button type="button" class="small">Leave Message</button>13 </div>14</div>15
Invite your team to collaborate on this project.
1<div data-empty>2 <div data-empty-header>3 <div data-empty-media>4 <figure data-variant="avatar" role="group" class="large">5 <figure data-variant="avatar">6 <img src="https://avatar.vercel.sh/shadcn" alt="@shadcn" />7 <span>CN</span>8 </figure>9 <figure data-variant="avatar">10 <img src="https://avatar.vercel.sh/maxleiter" alt="@maxleiter" />11 <span>ML</span>12 </figure>13 <figure data-variant="avatar">14 <img src="https://avatar.vercel.sh/evilrabbit" alt="@evilrabbit" />15 <span>ER</span>16 </figure>17 </figure>18 </div>19 <div data-empty-title>No Team Members</div>20 <p data-empty-description>Invite your team to collaborate on this project.</p>21 </div>22 <div data-empty-content>23 <button type="button" class="small">24 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">25 <path d="M5 12h14" />26 <path d="M12 5v14" />27 </svg>28 Invite Members29 </button>30 </div>31</div>32
The page you're looking for doesn't exist. Try searching for what you need below.
Need help? Contact support
1<div data-empty>2 <div data-empty-header>3 <div data-empty-title>404 - Not Found</div>4 <p data-empty-description>The page you're looking for doesn't exist. Try searching for what you need below.</p>5 </div>6 <div data-empty-content>7 <div data-input-group>8 <span data-addon>9 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">10 <circle cx="11" cy="11" r="8" />11 <path d="m21 21-4.3-4.3" />12 </svg>13 </span>14 <input type="search" placeholder="Try searching for pages..." aria-label="Search pages" />15 <span data-addon><kbd>/</kbd></span>16 </div>17 <p data-empty-description>Need help? <a href="#">Contact support</a></p>18 </div>19</div>20
You're all caught up. New notifications will appear here.
1<div data-empty data-variant="muted">2 <div data-empty-header>3 <div data-empty-media data-variant="icon">4 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">5 <path d="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9" />6 <path d="M10.3 21a1.94 1.94 0 0 0 3.4 0" />7 </svg>8 </div>9 <div data-empty-title>No Notifications</div>10 <p data-empty-description>You're all caught up. New notifications will appear here.</p>11 </div>12 <div data-empty-content>13 <button type="button" class="outline">14 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">15 <path d="M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" />16 <path d="M3 3v5h5" />17 <path d="M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16" />18 <path d="M16 16h5v5" />19 </svg>20 Refresh21 </button>22 </div>23</div>24
USAGE
1<div data-empty>2 <div data-empty-header>3 <div data-empty-media data-variant="icon">4 <svg … />5 </div>6 <div data-empty-title>No projects yet</div>7 <p data-empty-description>Get started by creating your first project.</p>8 </div>9 <div data-empty-content>10 <button type="button">Create project</button>11 </div>12</div>
API
FILES
src/css/empty.cssmo add emptyTHEMING · PLAYGROUND
This is the exact component from the examples above, wearing a completely different theme. Edit the tokens and --mo-* hooks in the editor — autocomplete knows them all — and the preview obeys in real time. Your CSS always wins.
--foreground--muted--muted-foreground--primary--radius--mo-empty-border-color--mo-empty-border-width--mo-empty-content-max-width--mo-empty-gap--mo-empty-header-max-width--mo-empty-media-icon-radius--mo-empty-media-icon-size--mo-empty-media-icon-svg-size--mo-empty-media-image-size--mo-empty-padding--mo-empty-padding-md--mo-empty-radiusPreview
Your CSS
Try it: type --mo- for the component hooks, or edit any value — the preview obeys in real time.