MeDo

Generatore di Modali IA.

Descrivi il dialogo che ti serve e MeDo genera tutto — intestazione, corpo scorrevole e footer con le azioni, più cattura del focus, ripristino del focus alla chiusura, blocco dello scroll del body e una variante bottom sheet per mobile.

Modale
Modale

La parte difficile di una modale è la pagina che sta dietro

Una modale sembra una scatola centrata con un'ombra, ed è proprio per questo che viene ricostruita male così spesso. Il livello visivo è banale; la parte difficile vive completamente fuori dal componente. Aprire un dialogo deve congelare il documento sottostante, catturare il focus da tastiera perché Tab non finisca su contenuti nascosti, nascondere il resto della pagina alle tecnologie assistive e infine riportare il focus esattamente sull'elemento che lo ha aperto. Salta quest'ultimo passaggio e chi naviga da tastiera torna silenziosamente all'inizio del documento senza sapere dove si trova. Generare il dialogo insieme al suo contratto di focus significa che quella macchina a stati è corretta al primo render, invece di essere rattoppata dopo un giro di QA.

6 modelli

Modelli di Modale che puoi generare

Ogni modello è un prompt reale, non uno screenshot. Copialo in qualsiasi editor IA, oppure eseguilo in MeDo e ottieni codice React + Tailwind.

BasicHeader + Footer

Composable Dialog With Focus Management

The base every other dialog extends. The visual layer takes minutes; the focus contract is the part worth generating rather than hand-writing.

Create a modal dialog with three sizes — sm 400px, md 560px, lg 760px — centered over a black backdrop at 50 percent opacity, 16px radius, soft shadow. Compose it from Header, Body and Footer slots: the header holds a title and an icon-only close button with an aria-label, the body scrolls independently at max-height 70vh, and the footer right-aligns Cancel next to a primary action. On open, move focus to the first interactive element, trap Tab and Shift+Tab inside the dialog, and lock body scroll by compensating for the scrollbar width so the page does not shift. Set role="dialog", aria-modal="true" and aria-labelledby pointing at the title, and restore focus to the trigger on close.

Prova in MeDo
ConfirmationDestructive Confirm

Non-Dismissible Delete Dialog

The one dialog that must ignore Escape and backdrop clicks. A stray click outside the box should never be the gesture that deletes an account.

Create a destructive confirmation dialog: a warning icon, a heading naming the exact resource, a body stating what will be lost and whether it is recoverable, and a footer with Cancel on the left and a red Confirm on the right. Ignore both Escape and backdrop clicks so the action requires a deliberate button press. Move initial focus to Cancel rather than Confirm, so a stray Enter keypress cancels instead of destroying. Use role="alertdialog" with aria-describedby on the body text. Add an optional type-to-confirm mode requiring the resource name to be typed before Confirm enables, with the comparison case-sensitive and trimmed.

Prova in MeDo
FormForm Dialog

Scrolling Form With Sticky Actions

A long form in a dialog needs a body that scrolls under a fixed header and footer, plus an unsaved-changes guard. Losing typed input to a misclick is unforgivable.

Create a form dialog with a fixed header, a scrolling body and a sticky footer holding Cancel and Save. Keep the header and footer outside the scroll container so the actions stay reachable in a long form. Add a dirty-state guard: when any field has changed, intercept Escape and backdrop clicks and show a nested confirm-discard step inside the same dialog rather than opening a second overlay. On validation failure, move focus to the first invalid field and scroll it into view inside the body. Set aria-busy while saving, disable Save without removing it from the tab order, and close only after the request resolves.

Prova in MeDo
MobileBottom Sheet

Sheet That Slides Up on Phones

A centered card on a phone leaves the buttons floating mid-screen, away from the thumb. Same component, different layout under 640px.

Create a dialog that renders as a centered card above 640px and as a bottom sheet below it: full width, rounded top corners only, sliding up from the bottom edge with a 250ms ease-out transform. Add a drag handle at the top and support swipe-to-dismiss with a velocity threshold, falling back to the close button for keyboard and assistive technology. Cap the sheet height at 90vh with the body scrolling inside, and use dynamic viewport units so the mobile browser chrome does not clip the footer. Keep focus trapping and scroll lock identical in both layouts, and disable the slide animation under prefers-reduced-motion.

Prova in MeDo
PlatformNative Dialog

HTML dialog With showModal

The browser already ships focus trapping, top-layer stacking and Escape handling. Choose this and you delete most of the code the custom overlay needed.

Create a modal built on the native HTML dialog element opened with showModal(), so the browser supplies focus trapping, Escape handling and top-layer stacking with no z-index management. Style the backdrop through the ::backdrop pseudo-element. Add the parts the platform does not give you: body scroll lock on open, an entry and exit animation using allow-discrete and the transition-behavior property, and a close-on-backdrop handler that compares the click target to the dialog element rather than its children. Listen for the close event to restore focus and read returnValue, and use autofocus on the element that should receive focus first.

Prova in MeDo
OverlayCommand Palette

Cmd+K Search Dialog

A modal whose focus stays in the input while arrow keys drive a list elsewhere. Roving focus would break typing, so this one runs on aria-activedescendant.

Create a command palette dialog opened by Cmd+K or Ctrl+K: a search input at the top with results grouped by section below, positioned near the top of the viewport rather than vertically centered. Keep DOM focus in the input at all times and move the visual selection with aria-activedescendant so arrow keys navigate the list without stealing focus from typing. Support Enter to run the highlighted command, Escape to close with focus restored to the previously active element, and a scroll-into-view on the highlighted row. Debounce the query, render an empty state naming what was searched for, and announce the result count through a polite live region.

Prova in MeDo

Come personalizzare il tuo Modale

Indica quali dialoghi non devono essere chiudibili

Escape e i clic sul backdrop sono il default corretto per i dialoghi informativi, ma sono un rischio nelle conferme distruttive e nei form multi-step con dati non salvati. Nomina le varianti che devono ignorare entrambi, così un clic involontario fuori dalla scatola non può cancellare un account.

Chiedi il ripristino del focus, non solo la cattura

Molti prompt ottengono la cattura e dimenticano il viaggio di ritorno. Specifica che il focus torna all'elemento che ha aperto il dialogo alla chiusura, e che il dialogo memorizza quel riferimento all'apertura, così chi usa la tastiera riprende esattamente da dove era rimasto.

Scegli centrato o bottom sheet per ogni breakpoint

Un dialogo centrato su uno smartphone lascia i pulsanti d'azione a metà schermo, lontani dal pollice. Chiedi un bottom sheet sotto i 640px con l'azione primaria a portata di mano, e mantieni il layout centrato per viewport più ampi.

Non aprire mai una modale da dentro una modale

Un secondo dialogo sovrapposto al primo rompe la cattura del focus, raddoppia il backdrop e rende ambiguo quale livello venga chiuso da Escape. Chiedi invece contenuti a step dentro un unico dialogo, così l'overlay resta un solo livello con un unico proprietario del focus.

Chi usa il componente Modale

Prodotto SaaS

Un dialogo di conferma non chiudibile per annullare un abbonamento, con il nome del piano ripetuto nel corpo e un pulsante Conferma rosso, accanto a un dialogo più leggero e chiudibile per invitare un collega.

Negozio e-commerce

Un dialogo di anteprima rapida con immagini del prodotto, un selettore di taglia e un pulsante Aggiungi al carrello, reso come bottom sheet su smartphone così che taglie e pulsante carrello restino a portata di pollice.

Dashboard o strumento di amministrazione

Una conferma di eliminazione in blocco che dichiara il numero esatto di record e richiede di digitare il nome della risorsa prima di abilitare Conferma, insieme a un dialogo di modifica il cui form lungo scorre tra intestazione e footer fissi.

Sito di contenuti o media

Un dialogo lightbox per immagini a dimensione piena con navigazione tramite frecce, Escape per chiudere e ritorno del focus sulla miniatura che lo ha aperto, così la posizione di lettura nella galleria non va mai perduta.

Pattern di Modale per siti web diversi

Lo stesso componente modale, calibrato sul tipo di sito su cui viene pubblicato.

01 / 06

SaaS Product Dialogs

Two classes of dialog with opposite dismissal rules: invite-a-teammate should close on Escape and backdrop click, cancel-my-subscription should close on neither. Decide that per variant rather than globally, because a single dismissal policy across a product means either annoying dialogs or destroyed data.

Stili e varianti di Modale

Scegli la variante che si adatta al resto della pagina, poi generala.

01 / 06

Centered Dialog

The default above 640px: a fixed-width card centered over a dimmed backdrop. Cap the height at around 70vh with the body scrolling internally, because a dialog taller than the viewport pushes its own footer out of reach and there is no page scroll left to recover it.

Modale in React, Next.js, Vue e Svelte

React, Next.js, Vue 3, SvelteKit, Astro o HTML puro: lo stesso modale, sei modi per integrarlo.

01 / 06

React Modal

Render through a portal so the dialog escapes any ancestor with overflow hidden or a transform, both of which would clip it. Store the trigger element on open and focus it again in the cleanup, which is the step most hand-rolled modals skip.

src/components/Modal.tsx

export function Modal({ open, onClose, children }) {
  const trigger = useRef(null)

  useEffect(() => {
    if (!open) return
    trigger.current = document.activeElement
    return () => trigger.current?.focus()
  }, [open])

  if (!open) return null
  return createPortal(
    <div role="dialog" aria-modal="true">{children}</div>,
    document.body
  )
}

Come aggiungere il tuo Modale a un progetto

Quattro passaggi, dalla scelta di un modello di modale alla messa in produzione.

01~30s

Pick a Dialog Template

Scan the six templates and start from the interaction — a destructive confirm, a scrolling form, a mobile bottom sheet, or a Cmd+K palette.

02~10s

Copy the Prompt

Take the prompt into MeDo, Lovable, Bolt, v0 or Cursor. State whether this dialog may be dismissed by Escape and backdrop click before you run it, since that single decision separates a helpful overlay from one that deletes data on a misclick.

03~1min

Generate and Refine

You get React + Tailwind back with a live preview. Follow up in plain English — "make it a bottom sheet under 640px", "focus Cancel first", "build it on the native dialog element" — rather than rewiring the focus trap yourself.

04~2min

Test It With the Keyboard Only

Open it, Tab to the end and confirm focus cycles instead of escaping into the page, then close it and check focus returned to the trigger. Those two checks catch nearly every modal defect that ships.

Domande comuni su Modale

Come genero un componente modale con l'IA?

Descrivi layout, dimensioni e regole di chiusura in un unico prompt — per esempio "un dialogo centrato da 560px con corpo scorrevole, azioni Annulla e Conferma e una variante distruttiva che ignora Escape". MeDo genera il componente con cattura del focus, ripristino del focus, blocco dello scroll e semantica di dialogo incluse, così ottieni un overlay funzionante e non un div stilizzato.

Cos’è la cattura del focus e perché una modale ne ha bisogno?

La cattura del focus mantiene Tab e Shift+Tab in ciclo tra gli elementi interattivi del dialogo invece di sfuggire alla pagina sottostante. Senza di essa, chi usa la tastiera passa dal pulsante Conferma a link che non può vedere: confuso e non conforme alle WCAG. La cattura va sempre abbinata al ripristino del focus, che lo riporta sull'elemento di attivazione quando il dialogo si chiude.

Una modale deve chiudersi al clic sul backdrop?

Per i dialoghi informativi e a basso rischio sì — clic sul backdrop ed Escape sono i pattern di chiusura che le persone si aspettano. Per le conferme distruttive e i form con dati non salvati no: un clic accidentale fuori dalla scatola non deve cancellare dati o scartare quanto digitato. Richiedi la pressione esplicita di un pulsante per qualsiasi azione irreversibile.

Posso usare l'elemento HTML nativo <dialog> invece di una modale personalizzata?

Spesso sì. L'elemento nativo <dialog> con showModal() ti offre gratuitamente cattura del focus, gestione di Escape, impilamento nella top layer e uno pseudo-elemento ::backdrop, senza gestire lo z-index. Devi comunque bloccare lo scroll del body e animarlo tu, e i browser più vecchi richiedono un fallback. Di’ a MeDo che vuoi l'elemento nativo e costruirà su di esso invece di reimplementare il comportamento.

Come dovrebbe comportarsi una modale su mobile?

Sotto i 640px circa un bottom sheet batte solitamente la card centrata: ancora l'azione primaria vicino al pollice, usa tutta la larghezza per i campi del form e rispetta la convenzione di piattaforma che gli utenti già conoscono. MeDo può generare entrambi i layout in un solo componente e alternarli al breakpoint che indichi.

Una modale ha bisogno di role="dialog" e aria-modal?

Sì, a meno che non usi l'elemento nativo <dialog>, che fornisce la semantica da sé. Un overlay personalizzato richiede role="dialog", aria-modal="true" e o aria-labelledby che punta al titolo visibile o aria-label quando non c'è un'intestazione visibile. Senza aria-modal, gli screen reader continuano a esporre la pagina dietro l'overlay come contenuto navigabile.