Skip to content

Overlay

Every modal dialog, side sheet and alert question. It never loses what someone typed by accident: closing with unsaved input asks first, and nothing closes it while a save runs.

Language
Appearance

Dialog with a form

Rendered while open: type something, then press Esc or Cancel to see the discard question. Save leaves without asking.

import { useState } from 'react';
import { Button, Overlay, OverlayBody, OverlayDescription, OverlayFooter, OverlayHeader, OverlayTitle, TextField } from '@arbol-ai/ui';

const FormDialogExample = () => {
  const [isOpen, setIsOpen] = useState(false);
  return (
    <>
      <Button
        onPress={() => {
          setIsOpen(true);
        }}
      >
        New contact
      </Button>
      {isOpen ? (
        <Overlay
          onClose={() => {
            setIsOpen(false);
          }}
        >
          {(close, leave) => (
            <form
              className="flex min-h-0 flex-1 flex-col"
              onSubmit={(event) => {
                event.preventDefault();
                leave();
              }}
            >
              <OverlayHeader>
                <OverlayTitle>New contact</OverlayTitle>
                <OverlayDescription>They join the contact list and can receive campaigns.</OverlayDescription>
              </OverlayHeader>
              <OverlayBody>
                <TextField autoFocus label="Name" />
                <TextField label="Phone" type="tel" />
              </OverlayBody>
              <OverlayFooter>
                <Button onPress={close} variant="outline">
                  Cancel
                </Button>
                <Button type="submit">Save contact</Button>
              </OverlayFooter>
            </form>
          )}
        </Overlay>
      ) : null}
    </>
  );
};

<FormDialogExample />

Side sheet from a trigger

A record in context, opened by OverlayTrigger; focus returns to the button.

import { Button, Overlay, OverlayBody, OverlayDescription, OverlayFooter, OverlayHeader, OverlayTitle, OverlayTrigger } from '@arbol-ai/ui';

<OverlayTrigger>
  <Button variant="outline">Open appointment</Button>
  <Overlay dirty={false} kind="sheet">
    <OverlayHeader>
      <OverlayTitle>Thursday 10:30, Ana Torres</OverlayTitle>
      <OverlayDescription>General check-up with Dr. Ruiz.</OverlayDescription>
    </OverlayHeader>
    <OverlayBody>
      <p className="text-sm">Confirmed by WhatsApp yesterday at 6:12 pm.</p>
    </OverlayBody>
    <OverlayFooter>
      <Button>Register arrival</Button>
    </OverlayFooter>
  </Overlay>
</OverlayTrigger>

Source

The examples above are src/components/overlay/overlay.examples.tsx, which the library’s tests render too.

Type to search…

↑↓ navigate↵ selectEsc close