ComponentsSheet

Sheet

component

A slide-in panel from an edge — a longer flow than a dialog holds.

Filters
Slide out to refine the list.
Backdrop is click-to-dismiss

Composes: Card · Button

Recipe CSS

This is the exact CSS your kit ships for Sheet — token-driven, so it re-themes with every knob. Get it (and the rest) from the configurator's Use kit panel.

/* === Sheet / Drawer ===
   Side-pull panel. Demo here is a static slice — real app slides in.
   --sheet-w sets the width; default 280px reads sensibly in a card. */
.sheet-frame {
  position: relative;
  height: 220px;
  border: 1px solid var(--k-border);
  border-radius: var(--k-radius-md);
  background: var(--k-surface-sunken);
  overflow: hidden;
}
.sheet-frame__backdrop {
  position: absolute;
  inset: 0;
  background: var(--k-scrim);
}
.sheet {
  --sheet-w: 280px;
  position: absolute;
  top: 0;
  right: 0;
  height: 100%;
  width: var(--sheet-w);
  /* Never wider than the viewport — a 360px sheet must not overflow a 320px phone. */
  max-width: 100vw;
  background: var(--k-surface-overlay, var(--k-surface-raised));
  border-left: var(--k-divider);
  box-shadow: var(--k-shadow-lg);
  display: flex;
  flex-direction: column;
  /* Slow + emphasized-decelerate — large surface, expressive enter */
  animation: sheet-in var(--k-dur-slow, 320ms) var(--k-ease-out, cubic-bezier(.05,.7,.1,1));
}
.sheet--left { right: auto; left: 0; border-left: 0; border-right: var(--k-divider); animation-name: sheet-in-left; }
.sheet__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: var(--k-space, 16px);
  border-bottom: var(--k-divider);
}
/* .sheet__title — folded into the shared panel-heading rule (see .card__title). */
.sheet__body {
  padding: var(--k-space, 16px);
  flex: 1;
  font-size: var(--k-type-small);
  color: var(--k-fg);
  overflow: auto;
  /* Stack form rows vertically so checkboxes don't run together as inline labels */
  display: flex;
  flex-direction: column;
  gap: var(--k-s-10);
}
.sheet__foot { padding: var(--k-space, 16px); border-top: var(--k-divider); display: flex; gap: var(--k-gap, var(--k-s-8)); justify-content: flex-end; }
@keyframes sheet-in { from { transform: translateX(100%); } to { transform: translateX(0); } }
@keyframes sheet-in-left { from { transform: translateX(-100%); } to { transform: translateX(0); } }