Overlays

Dialog

Finestra modale overlay con supporto a posizionamento configurabile, trascinamento, massimizzazione e slot header/footer. `Modal` è un alias deprecato che punta a questo componente.

Import

import { Dialog } from '@pzeta/vue-components'
// oppure con plugin selettivo:
import { OverlaysPlugin } from '@pzeta/vue-components'
app.use(OverlaysPlugin)

Esempio Base

Props

PropTipoDefaultDescrizione
modelValuebooleanfalseVisibilità del dialog (v-model)
visiblebooleanfalseAlias per modelValue (v-model:visible, compatibilità PrimeVue)
headerstring | nullnullTesto del titolo nell'header
iconstring | nullnullClasse CSS dell'icona nell'header (es. pi pi-info)
modalbooleantrueMostra overlay scuro dietro il dialog
positionDialogPosition'center'Posizione del dialog sullo schermo
sizeDialogSize'medium'Dimensione predefinita del dialog
closablebooleantrueMostra il pulsante di chiusura
closeIconstringClasse CSS icona di chiusura (default dal ConfigPlugin)
dismissableMaskbooleantrueChiude al click sull'overlay
closeOnEscapebooleantrueChiude alla pressione di Escape
blockScrollbooleantrueBlocca lo scroll del body quando aperto
showHeaderbooleantrueMostra la sezione header
draggablebooleanfalsePermette di trascinare il dialog per riposizionarlo
maximizablebooleanfalseMostra pulsante per massimizzare a schermo intero
keepInViewportbooleantrueImpedisce al dialog di uscire dai bordi del viewport durante il drag
responsivebooleantrueAbilita comportamento responsive su schermi piccoli
breakpointsRecord<string, string> | nullnullBreakpoints responsive per larghezza dinamica (es. { '960px': '75vw' })
stylestring | Record<string, string | number> | nullnullStile inline per il container del dialog
contentStylestring | Record<string, string | number> | nullnullStile inline per l'area contenuto
contentClassstring | nullnullClasse CSS aggiuntiva per l'area contenuto

DialogPosition

type DialogPosition =
  | 'center'      // Centro schermo (default)
  | 'top'         // Centro in alto
  | 'bottom'      // Centro in basso
  | 'left'        // Centro a sinistra
  | 'right'       // Centro a destra
  | 'topleft'     // Angolo superiore sinistro
  | 'topright'    // Angolo superiore destro
  | 'bottomleft'  // Angolo inferiore sinistro
  | 'bottomright' // Angolo inferiore destro

DialogSize

type DialogSize = 'small' | 'medium' | 'large' | 'xlarge'
// small: ~300px | medium: ~500px (default) | large: ~800px | xlarge: ~1140px

Emits

EventoPayloadDescrizione
update:modelValuebooleanAggiornamento visibilità per v-model
update:visiblebooleanAggiornamento visibilità per v-model:visible
showDialog reso visibile
hideDialog nascosto
closeEventDialog chiuso tramite pulsante o ESC
maximizeEventDialog massimizzato
unmaximizeEventDialog ripristinato dalla modalità massimizzata
maskClickEventClick sull'overlay esterno

Slot

SlotScopeDescrizione
defaultContenuto principale del dialog
header{ close: () => void }Sostituzione completa dell'header
footerArea footer (tipicamente pulsanti azione)
closeiconIcona personalizzata per il pulsante di chiusura
maximizeicon{ maximized: boolean }Icona personalizzata per il pulsante maximize/restore

Esempi

Dialog con posizione e dimensione

Dialog maximizable e draggable

Dialog senza header (solo close floating)

Compatibilità v-model:visible (pattern PrimeVue)

<Dialog v-model:visible="isOpen" header="Titolo">
  <p>Contenuto</p>
</Dialog>

Alias deprecati

Il componente Modal è un alias backward-compatible che punta a Dialog. I tipi correlati sono anch'essi alias deprecati.

// Deprecato — usare Dialog
import { Modal } from '@pzeta/vue-components'
// Preferire:
import { Dialog } from '@pzeta/vue-components'
// Tipi deprecati
import type { ModalProps, ModalEmits, ModalPosition, ModalSize } from '@pzeta/vue-components'
// Preferire:
import type { DialogProps, DialogEmits, DialogPosition, DialogSize } from '@pzeta/vue-components'

Accessibilità

  • Renderizzato con role="dialog" e aria-modal="true"
  • aria-labelledby collegato automaticamente all'ID del titolo nell'header
  • aria-describedby collegato automaticamente all'ID dell'area contenuto
  • Chiusura tramite tasto Escape (disabilitabile con :close-on-escape="false")
  • Blocco scroll del body quando aperto (disabilitabile con :block-scroll="false")
  • Il componente usa <Teleport to="body"> per garantire corretto z-index e stacking context

TypeScript

import type { DialogProps, DialogEmits, DialogPosition, DialogSize } from '@pzeta/vue-components'