Flyout

A sliding panel that appears from the edge of the screen.

Anatomy

<Flyout.Root>
  <Flyout.Trigger />
  <Flyout.Portal>
    <Flyout.Overlay />
    <Flyout.Content>
      <Flyout.Header>
        <Flyout.Title />
        <Flyout.Description />
        <Flyout.Close />
      </Flyout.Header>
      <Flyout.Body />
      <Flyout.Footer />
    </Flyout.Content>
  </Flyout.Portal>
</Flyout.Root>

Usage

import { Flyout } from '@ivaldi/ui'
<Flyout.Root>
  <Flyout.Trigger asChild>
    <Button>Open Flyout</Button>
  </Flyout.Trigger>
  <Flyout.Portal>
    <Flyout.Overlay />
    <Flyout.Content>
      <Flyout.Header>
        <Flyout.Title>Settings</Flyout.Title>
        <Flyout.Description>
          Manage your account settings and preferences.
        </Flyout.Description>
      </Flyout.Header>
      <Flyout.Body>
        Content goes here
      </Flyout.Body>
      <Flyout.Footer>
        <Button>Save Changes</Button>
      </Flyout.Footer>
    </Flyout.Content>
  </Flyout.Portal>
</Flyout.Root>

Different Sides

<Flyout.Root>
  <Flyout.Trigger asChild>
    <Button>Open Flyout</Button>
  </Flyout.Trigger>
  <Flyout.Portal>
    <Flyout.Overlay />
    <Flyout.Content side="left">
      <Flyout.Header>
        <Flyout.Title>Left Side Panel</Flyout.Title>
      </Flyout.Header>
      <Flyout.Body>
        Content slides in from the left
      </Flyout.Body>
    </Flyout.Content>
  </Flyout.Portal>
</Flyout.Root>

With Blur Effect

<Flyout.Root>
  <Flyout.Trigger asChild>
    <Button>Open Flyout</Button>
  </Flyout.Trigger>
  <Flyout.Portal>
    <Flyout.Overlay blur />
    <Flyout.Content>
      <Flyout.Header>
        <Flyout.Title>Blurred Background</Flyout.Title>
      </Flyout.Header>
      <Flyout.Body>
        The background is blurred
      </Flyout.Body>
    </Flyout.Content>
  </Flyout.Portal>
</Flyout.Root>

With Scroll Area

<Flyout.Root>
  <Flyout.Trigger asChild>
    <Button>Open Flyout</Button>
  </Flyout.Trigger>
  <Flyout.Portal>
    <Flyout.Overlay />
    <Flyout.Content>
      <Flyout.Header>
        <Flyout.Title>Scrollable Content</Flyout.Title>
      </Flyout.Header>
      <ScrollArea className="h-[400px]">
        <Flyout.Body>
          {Array.from({ length: 50 }).map((_, i) => (
            <div key={i} className="py-2">
              Scrollable item {i + 1}
            </div>
          ))}
        </Flyout.Body>
      </ScrollArea>
    </Flyout.Content>
  </Flyout.Portal>
</Flyout.Root>

With Form

<Flyout.Root>
  <Flyout.Trigger asChild>
    <Button>Edit Profile</Button>
  </Flyout.Trigger>
  <Flyout.Portal>
    <Flyout.Overlay />
    <Flyout.Content>
      <Flyout.Header>
        <Flyout.Title>Edit Profile</Flyout.Title>
        <Flyout.Description>
          Make changes to your profile.
        </Flyout.Description>
      </Flyout.Header>
      <Flyout.Body>
        <form className="space-y-4">
          <div>
            <Label>Name</Label>
            <Input />
          </div>
          <div>
            <Label>Email</Label>
            <Input type="email" />
          </div>
          <div>
            <Label>Bio</Label>
            <Textarea />
          </div>
        </form>
      </Flyout.Body>
      <Flyout.Footer className="flex justify-end gap-2">
        <Flyout.Close asChild>
          <Button variant="ghost">Cancel</Button>
        </Flyout.Close>
        <Button type="submit">Save Changes</Button>
      </Flyout.Footer>
    </Flyout.Content>
  </Flyout.Portal>
</Flyout.Root>

Flyout.Composed Props

PropTypeDefault
triggerReactNode—
titleReactNode—
descriptionReactNode—
footerReactNode—
blurboolean—
sideany—
classNamestring—
childrenReactNode—
openboolean—
defaultOpenboolean—
onOpenChangefunction—
modalboolean—

Flyout.Root Props

PropTypeDefault
childrenReactNode—
openboolean—
defaultOpenboolean—
onOpenChangefunction—
modalboolean—

Flyout.Close Props

PropTypeDefault
typeenum—
classNamestring—
childrenReactNode—
asChildboolean—

Flyout.Content Props

PropTypeDefault
innerClassNamestring—
forceMounttrue—
classNamestring—
childrenReactNode—
asChildboolean—
onEscapeKeyDownfunction—
onPointerDownOutsidefunction—
onFocusOutsidefunction—
onInteractOutsidefunction—
onOpenAutoFocusfunction—
onCloseAutoFocusfunction—

Flyout.Description Props

PropTypeDefault
classNamestring—
childrenReactNode—
asChildboolean—

Flyout.Overlay Props

PropTypeDefault

Flyout.Portal Props

PropTypeDefault
childrenReactNode—
containerElement | DocumentFragment—
forceMounttrue—

Flyout.Title Props

PropTypeDefault
classNamestring—
childrenReactNode—
asChildboolean—

Flyout.Trigger Props

PropTypeDefault
typeenum—
classNamestring—
childrenReactNode—
asChildboolean—