Przejdź do treści

Popover

Stabilny

Pływający panel przypięty do wyzwalacza, na niewielkie interaktywne treści — ustawienia, szybkie formularze, selektory — który nie blokuje strony.

Instalacja

$ pnpm dlx shadcn@latest add https://www.prfct.dev/r/popover.json

Użycie

import {
  Popover,
  PopoverContent,
  PopoverDescription,
  PopoverHeader,
  PopoverTitle,
  PopoverTrigger,
} from "@/components/ui/popover"
<Popover>
  <PopoverTrigger render={<Button variant="outline" />}>Dimensions</PopoverTrigger>
  <PopoverContent>
    <PopoverHeader>
      <PopoverTitle>Dimensions</PopoverTitle>
      <PopoverDescription>Set the size of the selected frame.</PopoverDescription>
    </PopoverHeader>
    {/* … */}
  </PopoverContent>
</Popover>

Za pozycjonowanie popovera odpowiada Floating UI: popover otwiera się pod wyzwalaczem, przeskakuje na drugą stronę, gdy brakuje miejsca, i nie wychodzi poza obszar widoku. Pojawia się od strony wyzwalacza — to choreografia popup-motion, wspólna dla wszystkich pływających powierzchni prfct.

Przykłady

Szybkie wprowadzanie danych

Popover może zawierać mały formularz. Steruj nim przez openonOpenChange, aby zamykał się po udanym wysłaniu, a potwierdzenie pokaż w powiadomieniu Toast.

PopoverHeader, PopoverTitlePopoverDescription nadają popoverowi tytuł, który nazywa go dla technologii wspomagających. Używaj ich zawsze, gdy treść zawiera więcej niż jedną kontrolkę.

Położenie

side ustawia popover po wybranej stronie wyzwalacza: top, right, bottom (domyślnie) lub left. Jeśli po preferowanej stronie brakuje miejsca, popover przeskakuje na przeciwną.

Wyrównanie

align wyrównuje popover do początku (start), środka (center, domyślnie) lub końca (end) wyzwalacza. Wyrównanie do początku sprawdza się w menu czytanych od lewej do prawej, a do końca — przy wyzwalaczach blisko prawej krawędzi.

Wytyczne

Kiedy używać

  • Do kontrolek działających na jednym elemencie: formatowania, wymiarów, filtrów pojedynczej kolumny.
  • Do szybkiego wprowadzania danych, które nie wymaga pełnego okna dialogowego: notatki, zmiany nazwy, daty.
  • Do wybierania: kolorów, emoji, dat.

Kiedy nie używać

  • Do pokazania zwykłej etykiety tekstowej — użyj Tooltip.
  • Do podglądu linku po najechaniu — użyj Hover Card.
  • Do listy akcji — użyj Dropdown Menu, które zapewnia nawigację strzałkami i wybór przez wpisywanie.
  • Do zadań, które wymagają skupienia i wyraźnego zakończenia — użyj Dialog.

Niech pozostanie mały

Popover to rzut oka, a nie miejsce docelowe. Jeśli jego treść wymaga przewijania, więcej niż kilku kontrolek albo przycisku Zapisz, wyrosła już z popovera. Trzymaj szerokość poniżej ~20 rem, a wysokość — w granicach kilku wierszy.

Czytanie
Zawijaj wiersze
Numery wierszy
Dobrze.Kilka kontrolek, których zmiany obowiązują od razu.
Edytuj profil
Źle.Formularz, który trzeba przewijać i zapisywać, powinien trafić do okna dialogowego lub panelu.

Dostępność

Wyzwalacz to przycisk z aria-expandedaria-haspopup="dialog"; popup to niemodalne okno dialogowe, którego etykietą jest PopoverTitle, jeśli występuje.

KlawiszDziałanie
EnterSpacja
Na wyzwalaczu: otwiera lub zamyka popover.
Tab
Przenosi fokus do popovera, potem przez jego kontrolki i dalej, do reszty strony.
Esc
Zamyka popover i przywraca fokus na wyzwalacz.
  • Domyślnie niemodalny. Strona pozostaje interaktywna; kliknięcie poza popoverem albo przeniesienie fokusu gdzie indziej go zamyka. Przekaż modal, aby uwięzić fokus i zablokować przewijanie, albo modal="trap-focus", aby tylko uwięzić fokus.
  • Nazwij go. Używaj PopoverTitle w każdym popoverze z kontrolkami. Jeśli nie ma widocznego tytułu, dodaj aria-label do PopoverContent.
  • Otwieranie po najechaniu trzeba włączyć. openOnHover na wyzwalaczu sprawia, że popover otwiera się także po najechaniu, ale zawsze otwiera się też po kliknięciu i z klawiatury — nigdy nie rób z najechania jedynej drogi dostępu.

Dokumentacja API

Popover

Komponent główny. Nie renderuje żadnego elementu. Przyjmuje wszystkie propsy Popover.Root z Base UI.

PropTypDomyślnie
open

Czy popover jest otwarty. Aby nim sterować, używaj razem z onOpenChange.

booleanBrak wartości domyślnej
defaultOpen

Czy popover jest otwarty na starcie, gdy jest niekontrolowany.

booleanfalse
onOpenChange

Wywoływana przy otwarciu lub zamknięciu.

(open: boolean, details) => voidBrak wartości domyślnej
modal

true więzi fokus, blokuje przewijanie i interakcję z resztą strony.

boolean | "trap-focus"false
actionsRef

Imperatywny uchwyt do zamknięcia lub odmontowania popovera.

RefObject<{ close, unmount }>Brak wartości domyślnej

PopoverTrigger

Otwiera i zamyka popover. Renderuje <button>; użyj render, aby wyrenderować Button z prfct.

PropTypDomyślnie
openOnHover

Otwiera popover także po najechaniu na wyzwalacz.

booleanfalse
delay

Opóźnienie otwarcia po najechaniu, w ms. Wymaga openOnHover.

number300
closeDelay

Opóźnienie zamknięcia popovera otwartego najechaniem, w ms.

number0

PopoverContent

Renderuje portal, element pozycjonujący i popup.

PropTypDomyślnie
side

Preferowana strona wyzwalacza. Zmienia się na przeciwną, gdy brakuje miejsca.

"top" | "right" | "bottom" | "left" | "inline-start" | "inline-end""bottom"
sideOffset

Odległość od wyzwalacza, w px.

number6
align

Wyrównanie względem wyzwalacza.

"start" | "center" | "end""center"
alignOffset

Przesunięcie wzdłuż osi wyrównania, w px.

number0
initialFocus

Element, który dostaje fokus po otwarciu.

boolean | RefObject | (interaction) => HTMLElement | booleanBrak wartości domyślnej
finalFocus

Element, który dostaje fokus po zamknięciu.

boolean | RefObject | (interaction) => HTMLElement | booleanBrak wartości domyślnej
className

Łączona z klasami popupu. Domyślna szerokość to w-72.

stringBrak wartości domyślnej

PopoverHeader, PopoverTitle, PopoverDescription

PopoverHeader układa tytuł i opis jeden pod drugim. PopoverTitle renderuje <h2>, który jest etykietą popovera; PopoverDescription renderuje <p>, który go opisuje.