Sheet

Side panel drawers that slide in from any edge — with backdrop blur, focus trap, and smooth animations.

This component requires softui.js for interactive behavior.

Default (Right)

<div class="sui-sheet-backdrop" id="mySheet" role="dialog" aria-modal="true">
  <div class="sui-sheet sui-sheet-right">
    <div class="sui-sheet-header">
      <h3>Sheet Title</h3>
      <button class="sui-sheet-close" aria-label="Close"></button>
    </div>
    <div class="sui-sheet-body">
      <p>Sheet content here.</p>
    </div>
    <div class="sui-sheet-footer">
      <button class="sui-btn sui-btn-sm" onclick="SoftUI.sheet('#mySheet').close()">Cancel</button>
      <button class="sui-btn sui-btn-primary sui-btn-sm">Save</button>
    </div>
  </div>
</div>

<script>
  SoftUI.sheet('#mySheet').open();
  SoftUI.sheet('#mySheet').close();
</script>

Left Sheet

<div class="sui-sheet-backdrop" id="navSheet" role="dialog" aria-modal="true">
  <div class="sui-sheet sui-sheet-left">
    <div class="sui-sheet-header">
      <h3>Navigation</h3>
      <button class="sui-sheet-close" aria-label="Close"></button>
    </div>
    <div class="sui-sheet-body">
      <a href="#">Dashboard</a>
      <a href="#">Analytics</a>
      <a href="#">Customers</a>
      <a href="#">Settings</a>
      <a href="#">Help</a>
    </div>
  </div>
</div>

Top & Bottom

<!-- Top sheet -->
<div class="sui-sheet-backdrop" id="topSheet" role="dialog" aria-modal="true">
  <div class="sui-sheet sui-sheet-top sui-sheet-sm">
    <div class="sui-sheet-header">
      <h3>Announcement</h3>
      <button class="sui-sheet-close" aria-label="Close"></button>
    </div>
    <div class="sui-sheet-body">
      <p>This sheet slides down from the top. Great for announcements, notification panels, or search interfaces.</p>
    </div>
  </div>
</div>

<!-- Bottom sheet -->
<div class="sui-sheet-backdrop" id="bottomSheet" role="dialog" aria-modal="true">
  <div class="sui-sheet sui-sheet-bottom sui-sheet-sm">
    <div class="sui-sheet-header">
      <h3>Quick Actions</h3>
      <button class="sui-sheet-close" aria-label="Close"></button>
    </div>
    <div class="sui-sheet-body">
      <div style="display:flex;gap:10px;flex-wrap:wrap;">
        <button class="sui-btn sui-btn-primary sui-btn-sm">Share</button>
        <button class="sui-btn sui-btn-success sui-btn-sm">Download</button>
        <button class="sui-btn sui-btn-info sui-btn-sm">Print</button>
        <button class="sui-btn sui-btn-danger sui-btn-sm">Delete</button>
      </div>
    </div>
  </div>
</div>

Size Variants

<!-- Small (280px) -->
<div class="sui-sheet-backdrop" id="smSheet" role="dialog" aria-modal="true">
  <div class="sui-sheet sui-sheet-right sui-sheet-sm">
    <div class="sui-sheet-header">
      <h3>Small Sheet</h3>
      <button class="sui-sheet-close" aria-label="Close"></button>
    </div>
    <div class="sui-sheet-body">
      <p>This is a small (280px) right-side sheet.</p>
    </div>
    <div class="sui-sheet-footer">
      <button class="sui-btn sui-btn-sm" onclick="SoftUI.sheet('#smSheet').close()">Close</button>
    </div>
  </div>
</div>

<!-- Default (320px) -->
<div class="sui-sheet-backdrop" id="defaultSheet" role="dialog" aria-modal="true">
  <div class="sui-sheet sui-sheet-right">
    <div class="sui-sheet-header">
      <h3>Sheet Title</h3>
      <button class="sui-sheet-close" aria-label="Close"></button>
    </div>
    <div class="sui-sheet-body">
      <p>Default 320px sheet content.</p>
    </div>
    <div class="sui-sheet-footer">
      <button class="sui-btn sui-btn-sm" onclick="SoftUI.sheet('#defaultSheet').close()">Cancel</button>
      <button class="sui-btn sui-btn-primary sui-btn-sm">Save</button>
    </div>
  </div>
</div>

<!-- Large (480px) -->
<div class="sui-sheet-backdrop" id="lgSheet" role="dialog" aria-modal="true">
  <div class="sui-sheet sui-sheet-right sui-sheet-lg">
    <div class="sui-sheet-header">
      <h3>Large Sheet</h3>
      <button class="sui-sheet-close" aria-label="Close"></button>
    </div>
    <div class="sui-sheet-body">
      <p>This is a large (480px) right-side sheet. Great for forms, detail views, or complex content.</p>
    </div>
    <div class="sui-sheet-footer">
      <button class="sui-btn sui-btn-sm" onclick="SoftUI.sheet('#lgSheet').close()">Cancel</button>
      <button class="sui-btn sui-btn-primary sui-btn-sm">Save Changes</button>
    </div>
  </div>
</div>

<!-- Full width -->
<div class="sui-sheet-backdrop" id="fullSheet" role="dialog" aria-modal="true">
  <div class="sui-sheet sui-sheet-right sui-sheet-full">
    <div class="sui-sheet-header">
      <h3>Full Sheet</h3>
      <button class="sui-sheet-close" aria-label="Close"></button>
    </div>
    <div class="sui-sheet-body">
      <p>Full-width sheet content.</p>
    </div>
  </div>
</div>

Sheet with Form

<div class="sui-sheet-backdrop" id="editSheet">
  <div class="sui-sheet sui-sheet-right sui-sheet-lg">
    <div class="sui-sheet-header">
      <h3>Edit Profile</h3>
      <button class="sui-sheet-close" aria-label="Close"></button>
    </div>
    <div class="sui-sheet-body">
      <div class="sui-form-group">
        <label class="sui-label">Full Name</label>
        <input type="text" class="sui-input" placeholder="John Doe">
      </div>
      <div class="sui-form-group">
        <label class="sui-label">Email</label>
        <input type="email" class="sui-input">
      </div>
      <div class="sui-form-group">
        <label class="sui-label">Bio</label>
        <textarea class="sui-input sui-textarea" rows="4"></textarea>
      </div>
    </div>
    <div class="sui-sheet-footer">
      <button class="sui-btn sui-btn-sm">Cancel</button>
      <button class="sui-btn sui-btn-primary sui-btn-sm">Update</button>
    </div>
  </div>
</div>

Static Backdrop

<!-- Add sui-sheet-static to the backdrop -->
<div class="sui-sheet-backdrop sui-sheet-static" id="staticSheet">
  <div class="sui-sheet sui-sheet-right">
    <div class="sui-sheet-header">
      <h3>Static Backdrop</h3>
      <button class="sui-sheet-close" aria-label="Close"></button>
    </div>
    <div class="sui-sheet-body">
      <p>Clicking outside won't close this sheet.</p>
    </div>
  </div>
</div>

Drawer

A mobile-first bottom panel with a drag handle. Swipe down to dismiss. Add data-snap="25,50,85" for height snap points (percentages of viewport).

<!-- Basic Drawer -->
<div class="sui-sheet-backdrop sui-drawer" id="myDrawer">
  <div class="sui-sheet sui-sheet-bottom">
    <div class="sui-drawer-handle"></div>
    <div class="sui-sheet-header">
      <h3>Drawer</h3>
      <button class="sui-sheet-close" aria-label="Close"></button>
    </div>
    <div class="sui-sheet-body">
      <p style="margin-bottom:16px;">This is a bottom drawer. Drag the handle down to dismiss it, or click outside.</p>
      <div class="sui-form-group" style="margin-bottom:12px;">
        <label class="sui-label">Quick Note</label>
        <textarea class="sui-input sui-textarea" rows="3" placeholder="Write something..."></textarea>
      </div>
      <button class="sui-btn sui-btn-primary sui-btn-block">Save</button>
    </div>
  </div>
</div>

<!-- With snap points (25%, 50%, 85% of viewport) -->
<div class="sui-sheet-backdrop sui-drawer" data-snap="25,50,85" id="snapDrawer">
  <div class="sui-sheet sui-sheet-bottom">
    <div class="sui-drawer-handle"></div>
    <div class="sui-sheet-header">
      <h3>Snap Points</h3>
      <button class="sui-sheet-close" aria-label="Close"></button>
    </div>
    <div class="sui-sheet-body">
      <p style="margin-bottom:16px;">Drag the handle to snap to 25%, 50%, or 85% of the viewport height. Drag below 25% to dismiss.</p>
      <div class="sui-alert sui-alert-info" style="margin-bottom:12px;">Try dragging up and down — it snaps to the nearest point.</div>
      <ul style="color:var(--sui-text-muted);font-size:14px;padding-left:20px;">
        <li style="margin-bottom:8px;">25% — Peek view</li>
        <li style="margin-bottom:8px;">50% — Half screen</li>
        <li>85% — Full content</li>
      </ul>
    </div>
  </div>
</div>

SoftUI.sheet('#myDrawer').open();
SoftUI.sheet('#myDrawer').close();

Drawer

This is a bottom drawer. Drag the handle down to dismiss it, or click outside.

Snap Points

Drag the handle to snap to 25%, 50%, or 85% of the viewport height. Drag below 25% to dismiss.

Try dragging up and down — it snaps to the nearest point.
  • 25% — Peek view
  • 50% — Half screen
  • 85% — Full content

Delete this item?

This action cannot be undone. This will permanently delete the item and remove all associated data.