YaVendio Registry
Components

YA Dialog

A modal dialog component for displaying content that requires user attention or interaction

The YaDialog is a modal window component in the YaVendio Design System. It overlays the main content and requires user interaction before returning to the application. Perfect for forms, confirmations, alerts, and any content that needs focused attention.

Quick Start

pnpm dlx shadcn@latest add @yavendio/ya-dialog
npx shadcn@latest add @yavendio/ya-dialog
yarn dlx shadcn@latest add @yavendio/ya-dialog
import {
  YaDialog,
  YaDialogTrigger,
  YaDialogContent,
  YaDialogHeader,
  YaDialogTitle,
  YaDialogDescription,
  YaDialogBody,
  YaDialogFooter,
  YaDialogClose,
} from '@/components/ui/ya-dialog'

export default function Example() {
  return (
    <YaDialog>
      <YaDialogTrigger asChild>
        <button>Open Dialog</button>
      </YaDialogTrigger>
      <YaDialogContent>
        <YaDialogHeader>
          <YaDialogTitle>Dialog Title</YaDialogTitle>
          <YaDialogDescription>
            Dialog description goes here.
          </YaDialogDescription>
        </YaDialogHeader>
        <YaDialogBody>
          Your content here
        </YaDialogBody>
        <YaDialogFooter>
          <YaDialogClose asChild>
            <button>Close</button>
          </YaDialogClose>
        </YaDialogFooter>
      </YaDialogContent>
    </YaDialog>
  )
}

Basic Usage

<YaDialog>
  <YaDialogTrigger asChild>
    <YaButton variant="primary">Open Dialog</YaButton>
  </YaDialogTrigger>
  <YaDialogContent>
    <YaDialogHeader>
      <YaDialogTitle>Edit profile</YaDialogTitle>
      <YaDialogDescription>
        Make changes to your profile here. Click save when you're done.
      </YaDialogDescription>
    </YaDialogHeader>
    <YaDialogBody>
      <YaInput label="Name" placeholder="Enter your name" />
      <YaInput label="Username" placeholder="Enter your username" />
    </YaDialogBody>
    <YaDialogFooter>
      <YaDialogClose asChild>
        <YaButton variant="tertiary">Cancel</YaButton>
      </YaDialogClose>
      <YaDialogClose asChild>
        <YaButton variant="secondary">Save</YaButton>
      </YaDialogClose>
    </YaDialogFooter>
  </YaDialogContent>
</YaDialog>

Sizes

YaDialog supports multiple sizes to accommodate different content needs:

SizeMax WidthUsage
sm400pxSimple confirmations, alerts
default520pxStandard forms, most dialogs
lg720pxComplex forms, data tables
xl900pxRich content, dashboards
full100vw - 2remFull-width content
<YaDialogContent size="sm">...</YaDialogContent>
<YaDialogContent size="default">...</YaDialogContent>
<YaDialogContent size="lg">...</YaDialogContent>

With Form

A common pattern for dialogs with form inputs:

<YaDialog>
  <YaDialogTrigger asChild>
    <YaButton variant="primary">Edit Profile</YaButton>
  </YaDialogTrigger>
  <YaDialogContent>
    <YaDialogHeader>
      <YaDialogTitle>Edit profile</YaDialogTitle>
      <YaDialogDescription>
        Make changes to your profile here. Click save when you're done.
      </YaDialogDescription>
    </YaDialogHeader>
    <YaDialogBody>
      <YaInput label="Name" orientation="horizontal" placeholder="Enter your name" className="flex-1" />
      <YaInput label="Username" orientation="horizontal" placeholder="Enter your username" className="flex-1" />
    </YaDialogBody>
    <YaDialogFooter>
      <YaDialogClose asChild>
        <YaButton variant="tertiary">Cancel</YaButton>
      </YaDialogClose>
      <YaDialogClose asChild>
        <YaButton variant="secondary">Save</YaButton>
      </YaDialogClose>
    </YaDialogFooter>
  </YaDialogContent>
</YaDialog>

Without Close Button

Hide the X button for controlled closing behavior:

<YaDialogContent showCloseButton={false}>
  <YaDialogHeader>
    <YaDialogTitle>Custom Close Behavior</YaDialogTitle>
    <YaDialogDescription>
      This dialog has no X button. Use the footer buttons to close.
    </YaDialogDescription>
  </YaDialogHeader>
  <YaDialogBody>
    <p>Useful when you want to control how users dismiss the dialog.</p>
  </YaDialogBody>
  <YaDialogFooter>
    <YaDialogClose asChild>
      <YaButton variant="tertiary">Cancel</YaButton>
    </YaDialogClose>
    <YaDialogClose asChild>
      <YaButton variant="primary">Confirm</YaButton>
    </YaDialogClose>
  </YaDialogFooter>
</YaDialogContent>

Controlled State

Control the dialog programmatically:

Dialog is closed

'use client'

import { useState } from 'react'

export default function ControlledDialog() {
  const [open, setOpen] = useState(false)

  return (
    <>
      <YaButton onClick={() => setOpen(true)}>Open Dialog</YaButton>
      
      <YaDialog open={open} onOpenChange={setOpen}>
        <YaDialogContent>
          <YaDialogHeader>
            <YaDialogTitle>Controlled Dialog</YaDialogTitle>
            <YaDialogDescription>
              This dialog is controlled via external state.
            </YaDialogDescription>
          </YaDialogHeader>
          <YaDialogBody>
            <p>You can programmatically open or close this dialog.</p>
          </YaDialogBody>
          <YaDialogFooter>
            <YaButton variant="secondary" onClick={() => setOpen(false)}>
              Close
            </YaButton>
          </YaDialogFooter>
        </YaDialogContent>
      </YaDialog>
    </>
  )
}

Confirmation Dialog

A destructive confirmation pattern:

<YaDialog>
  <YaDialogTrigger asChild>
    <YaButton variant="primary" destructive>Delete Item</YaButton>
  </YaDialogTrigger>
  <YaDialogContent size="sm">
    <YaDialogHeader>
      <YaDialogTitle>Are you sure?</YaDialogTitle>
      <YaDialogDescription>
        This action cannot be undone. This will permanently delete the item
        and remove its data from our servers.
      </YaDialogDescription>
    </YaDialogHeader>
    <YaDialogFooter>
      <YaDialogClose asChild>
        <YaButton variant="tertiary">Cancel</YaButton>
      </YaDialogClose>
      <YaDialogClose asChild>
        <YaButton variant="primary" destructive>Delete</YaButton>
      </YaDialogClose>
    </YaDialogFooter>
  </YaDialogContent>
</YaDialog>

Custom Content

Add any custom content to the dialog body:

<YaDialogBody>
  <div className="border border-dashed border-primary rounded-lg p-6 flex items-center justify-center">
    <span className="text-sm text-muted-foreground italic">
      Place your content here
    </span>
  </div>
</YaDialogBody>

For simple notifications or success dialogs:

<YaDialogFooter>
  <YaDialogClose asChild>
    <YaButton variant="secondary">Done</YaButton>
  </YaDialogClose>
</YaDialogFooter>

Newsletter Subscription

A dialog for collecting email subscriptions:

<YaDialog>
  <YaDialogTrigger asChild>
    <YaButton variant="primary">Subscribe</YaButton>
  </YaDialogTrigger>
  <YaDialogContent>
    <YaDialogHeader>
      <YaDialogTitle>Subscribe to our newsletter</YaDialogTitle>
      <YaDialogDescription>
        Enter your email to receive updates, tips, and exclusive content directly in your inbox.
      </YaDialogDescription>
    </YaDialogHeader>
    <YaDialogBody>
      <div className="flex gap-2">
        <YaInput 
          type="email"
          name="email"
          placeholder="you@example.com"
          aria-label="Email address"
          className="flex-1"
        />
        <YaButton variant="primary">Subscribe</YaButton>
      </div>
    </YaDialogBody>
    <YaDialogFooter>
      <YaDialogClose asChild>
        <YaButton variant="tertiary">Close</YaButton>
      </YaDialogClose>
    </YaDialogFooter>
  </YaDialogContent>
</YaDialog>

Props

YaDialog

PropTypeDefaultDescription
openboolean-Controlled open state
onOpenChange(open: boolean) => void-Callback when open state changes
defaultOpenbooleanfalseInitial open state (uncontrolled)
modalbooleantrueWhether to render as modal

YaDialogContent

PropTypeDefaultDescription
size'sm' | 'default' | 'lg' | 'xl' | 'full''default'Dialog width
showCloseButtonbooleantrueShow the X close button
classNamestring-Additional classes

YaDialogHeader

PropTypeDefaultDescription
classNamestring-Additional classes

YaDialogTitle

PropTypeDefaultDescription
classNamestring-Additional classes

YaDialogDescription

PropTypeDefaultDescription
classNamestring-Additional classes

YaDialogBody

PropTypeDefaultDescription
classNamestring-Additional classes

YaDialogFooter

PropTypeDefaultDescription
classNamestring-Additional classes

YaDialogClose

Wraps any element to make it a close trigger. Use asChild to compose with your own button.

PropTypeDefaultDescription
asChildbooleanfalseMerge props onto child

Accessibility

Best Practices

DoDon't
Use dialogs for focused tasksUse for simple notifications (use toast)
Keep dialog content conciseNest dialogs within dialogs
Provide clear action buttonsLeave users without a way to close
Use appropriate sizesForce users to scroll excessively
Use size="sm" for confirmationsUse full-width for simple forms

TypeScript

import { type VariantProps } from 'class-variance-authority'
import { yaDialogContentVariants } from '@/components/ui/ya-dialog'

type DialogSize = VariantProps<typeof yaDialogContentVariants>['size']

On this page