quiz-ui
componentquiz-dialogsource: ok · hit
QuizDialog
Modal-embedded funnel wrapper, on Radix Dialog.
npx shadcn add "https://quiz-ui-phi.vercel.app/r/quiz-dialog.json"free
Visual style
playful
Interaction
modal
Tags auto-generated by rules on 9/24/2026 — empty means no evidence, not lack of support.
Dependencies
Bundle weight · lightui-primitives@radix-ui/react-dialog
Registry dependencies
@quiz-ui/quiz-cn
Files1 · source cached 10/8/2026, 5:59:12 PM
components/ui/quiz/quiz-dialog.tsx
"use client";
import * as React from "react";
import * as DialogPrimitive from "@radix-ui/react-dialog";
export interface QuizDialogProps
extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root> {
trigger?: React.ReactNode;
children: React.ReactNode;
/** Applied to Dialog.Content. */
className?: string;
/** Applied to Dialog.Overlay. */
overlayClassName?: string;
closeButtonClassName?: string;
closeButtonLabel?: React.ReactNode;
}
/**
* Fixed/centered positioning on the overlay and content is kept as a
* functional default — without it this isn't a modal, just an
* unpositioned block in the DOM. Everything else (color, shadow,
* radius, close-button glyph) is yours via className.
*/
export function QuizDialog({
trigger,
children,
className,
overlayClassName,
closeButtonClassName,
closeButtonLabel = "✕",
...props
}: QuizDialogProps) {
return (
<DialogPrimitive.Root {...props}>
{trigger ? <DialogPrimitive.Trigger asChild>{trigger}</DialogPrimitive.Trigger> : null}
<DialogPrimitive.Portal>
<DialogPrimitive.Overlay className={`fixed inset-0 z-50 ${overlayClassName ?? ""}`} />
<DialogPrimitive.Content
className={`fixed left-1/2 top-1/2 z-50 -translate-x-1/2 -translate-y-1/2 ${className ?? ""}`}
>
{children}
<DialogPrimitive.Close className={closeButtonClassName} aria-label="Close">
{closeButtonLabel}
</DialogPrimitive.Close>
</DialogPrimitive.Content>
</DialogPrimitive.Portal>
</DialogPrimitive.Root>
);
}